New upstream version 4.4

This commit is contained in:
nyanmisaka
2021-04-27 12:39:27 +08:00
parent cec5a97aac
commit ce5a5b71cb
1941 changed files with 106954 additions and 65480 deletions
+6 -2
View File
@@ -10,12 +10,16 @@
<barryjzhao@tencent.com> <jun.zhao@intel.com> <barryjzhao@tencent.com> <jun.zhao@intel.com>
<josh@itanimul.li> <joshdk@obe.tv> <josh@itanimul.li> <joshdk@obe.tv>
<michael@niedermayer.cc> <michaelni@gmx.at> <michael@niedermayer.cc> <michaelni@gmx.at>
<linjie.fu@intel.com> <fulinjie@zju.edu.cn> <linjie.justin.fu@gmail.com> <linjie.fu@intel.com>
<linjie.justin.fu@gmail.com> <fulinjie@zju.edu.cn>
<ceffmpeg@gmail.com> <cehoyos@ag.or.at> <ceffmpeg@gmail.com> <cehoyos@ag.or.at>
<ceffmpeg@gmail.com> <cehoyos@rainbow.studorg.tuwien.ac.at> <ceffmpeg@gmail.com> <cehoyos@rainbow.studorg.tuwien.ac.at>
<ffmpeg@gyani.pro> <gyandoshi@gmail.com> <ffmpeg@gyani.pro> <gyandoshi@gmail.com>
<atomnuker@gmail.com> <rpehlivanov@obe.tv> <atomnuker@gmail.com> <rpehlivanov@obe.tv>
<zhong.li@intel.com> <zhongli_dev@126.com> <lizhong1008@gmail.com> <zhong.li@intel.com>
<lizhong1008@gmail.com> <zhongli_dev@126.com>
<andreas.rheinhardt@gmail.com> <andreas.rheinhardt@googlemail.com> <andreas.rheinhardt@gmail.com> <andreas.rheinhardt@googlemail.com>
rcombs <rcombs@rcombs.me> <rodger.combs@gmail.com> rcombs <rcombs@rcombs.me> <rodger.combs@gmail.com>
<thilo.borgmann@mail.de> <thilo.borgmann@googlemail.com> <thilo.borgmann@mail.de> <thilo.borgmann@googlemail.com>
<liuqi05@kuaishou.com> <lq@chinaffmpeg.org>
<ruiling.song83@gmail.com> <ruiling.song@intel.com>
+82 -295
View File
@@ -1,303 +1,90 @@
Entries are sorted chronologically from oldest to youngest within each release, Entries are sorted chronologically from oldest to youngest within each release,
releases are sorted from youngest to oldest. releases are sorted from youngest to oldest.
version 4.3.2: version <next>:
avcodec/hapdec: Change compressed_offset to unsigned 32bit - AudioToolbox output device
avformat/rmdec: Check codec_length without overflow - MacCaption demuxer
avformat/mov: Check element count in mov_metadata_hmmt() - PGX decoder
avcodec/vp8: Move end check into MB loop in vp78_decode_mv_mb_modes() - chromanr video filter
avcodec/fits: Check gcount and pcount being non negative - VDPAU accelerated HEVC 10/12bit decoding
avformat/nutdec: Check timebase count against main header length - ADPCM IMA Ubisoft APM encoder
avformat/electronicarts: Clear partial_packet on error - Rayman 2 APM muxer
avformat/r3d: Check samples before computing duration - AV1 encoding support SVT-AV1
avcodec/pnm_parser: Check av_image_get_buffer_size() for failure - Cineform HD encoder
avformat/wavdec: Consider AV_INPUT_BUFFER_PADDING_SIZE in set_spdif() - ADPCM Argonaut Games encoder
avformat/rmdec: Check remaining space in debug av_log() loop - Argonaut Games ASF muxer
avformat/flvdec: Treat high ts byte as unsigned - AV1 Low overhead bitstream format demuxer
avformat/samidec: Sanity check pts - RPZA video encoder
avcodec/jpeg2000dec: Check atom_size in jp2_find_codestream() - ADPCM IMA MOFLEX decoder
avformat/avidec: Use 64bit in get_duration() - MobiClip FastAudio decoder
avformat/mov: Check for duplicate st3d - MobiClip video decoder
avformat/mvdec: Check for EOF in read_index() - MOFLEX demuxer
avcodec/jpeglsdec: Fix k=16 in ls_get_code_regular() - MODS demuxer
avformat/id3v2: Check the return from avio_get_str() - PhotoCD decoder
avcodec/hevc_sei: Check payload size in decode_nal_sei_message() - MCA demuxer
libavutil/eval: Remove CONFIG_TRAPV special handling - AV1 decoder (Hardware acceleration used only)
avformat/wtvdec: Check len in parse_chunks() to avoid overflow - SVS demuxer
avformat/asfdec_f: Add an additional check for the extradata size - Argonaut Games BRP demuxer
avformat/3dostr: Check sample_rate - DAT demuxer
avformat/4xm: Make audio_frame_count 64bit - aax demuxer
avformat/mov: Use av_mul_q() to avoid integer overflows - IPU decoder, parser and demuxer
avcodec/vp9dsp_template: Fix integer overflows in itxfm_wrapper - Intel QSV-accelerated AV1 decoding
avformat/rmdec: Reorder operations to avoid overflow - Argonaut Games Video decoder
avcodec/mxpegdec: fix SOF counting - libwavpack encoder removed
avcodec/rscc: Check inflated_buf size whan it is used - ACE demuxer
avformat/mvdec: Sanity check SAMPLE_WIDTH - AVS3 demuxer
avcodec/nvenc: fix timestamp offset ticks logic - AVS3 video decoder via libuavs3d
avformat/rmdec: Fix codecdata_length overflow check - Cintel RAW decoder
avcodec/simple_idct: Fix undefined integer overflow in idct4row() - VDPAU accelerated VP9 10/12bit decoding
avformat/wavdec: Check block_align vs. channels before combining them - afreqshift and aphaseshift filters
avformat/tta: Use 64bit intermediate for index - High Voltage Software ADPCM encoder
avformat/soxdec: Check channels to be positive - LEGO Racers ALP (.tun & .pcm) muxer
avformat/smacker: Check for too small pts_inc - AV1 VAAPI decoder
avformat/sbgdec: Use av_sat_add64() in str_to_time() - adenorm filter
avcodec/cscd: Check output len in zlib as in lzo - ADPCM IMA AMV encoder
avcodec/vp3: Check input amount in theora_decode_header() - AMV muxer
avformat/wavdec: Check avio_get_str16le() for failure - NVDEC AV1 hwaccel
avformat/flvdec: Check for EOF in amf_skip_tag() - DXVA2/D3D11VA hardware accelerated AV1 decoding
avformat/aiffdec: Check size before subtraction in get_aiff_header() - speechnorm filter
avformat/electronicarts: More chunk_size checks - SpeedHQ encoder
avcodec/cfhd: check peak.offset - asupercut filter
avformat/tedcaptionsdec: Check for overflow in parse_int() - asubcut filter
avformat/nuv: Check channels - Microsoft Paint (MSP) version 2 decoder
avcodec/siren: Increase noise category 5 and 6 - Microsoft Paint (MSP) demuxer
avformat/mpc8: Check size before implicitly converting to int - AV1 monochrome encoding support via libaom >= 2.0.1
avformat/nutdec: Fix integer overflow in count computation - asuperpass and asuperstop filter
avformat/mvi: Use 64bit for testing dimensions - shufflepixels filter
avformat/utils: Check dts in update_initial_timestamps() more - tmidequalizer filter
avformat/mpsubdec: Use av_sat_add/sub64() in fracval handling - estdif filter
avformat/flvdec: Check for avio_read() failure in amf_get_string() - epx filter
avformat/flvdec: Check for nesting depth in amf_skip_tag() - Dolby E parser
avformat/flvdec: Check for nesting depth in amf_parse_object() - shear filter
avformat/asfdec_o: Check for EOF in asf_read_marker() - kirsch filter
avformat/flvdec: Use av_sat_add64() for pts computation - colortemperature filter
avformat/utils: Check dts - (1<<pts_wrap_bits) overflow - colorcontrast filter
avformat/bfi: Check chunk_header - PFM encoder
avformat/ads: Check size - colorcorrect filter
avformat/iff: Check block align also for ID_MAUD - binka demuxer
avcodec/utils: Check for integer overflow in get_audio_frame_duration() for ADPCM_DTK - XBM parser
avformat/fitsdec: Better size checks - xbm_pipe demuxer
avformat/mxfdec: Fix integer overflow in next position in mxf_read_local_tags() - colorize filter
avformat/avidec: dv does not support palettes - CRI parser
avformat/dhav: Break out of infinite dhav search loop - aexciter audio filter
libavformat/utils: consider avio_size() failure in ffio_limit() - exposure video filter
avformat/nistspheredec: Check bits_per_coded_sample and channels - monochrome video filter
avformat/asfdec_o: Check size vs. offset in detect_unknown_subobject() - setts bitstream filter
avformat/utils: check for integer overflow in av_get_frame_filename2() - vif video filter
avutil/timecode: Avoid undefined behavior with large framenum - OpenEXR image encoder
avformat/mov: Check a.size before computing next_root_atom - Simbiosis IMX decoder
avformat/sbgdec: Reduce the amount of floating point in str_to_time() - Simbiosis IMX demuxer
avformat/mxfdec: Free all types for both Descriptors - Digital Pictures SGA demuxer and decoders
uavformat/rsd: check for EOF in extradata - TTML subtitle encoder and muxer
avcodec/wmaprodec: Check packet size - identity video filter
avformat/dhav: Check position for overflow - msad video filter
avcodec/rasc: Check frame before clearing - gophers protocol
avformat/vividas: Check number of audio channels - RIST protocol via librist
avcodec/alsdec: Fix integer overflow with quant_cof
avformat/mpegts: Fix argument type for av_log
avformat/cafdec: clip sample rate
avcodec/ffv1dec: Fix off by 1 error with quant tables
avformat/mpegts: Increase pcr_incr width to 64bit
avcodec/utils: Check bitrate for overflow in get_bit_rate()
avformat/mov: Check if hoov is at the end
avcodec/hevc_ps: check scaling_list_dc_coef
avformat/iff: Check data_size
avformat/matroskadec: Sanity check codec_id/track type
avformat/rpl: Check the number of streams
avformat/vividas: Check sample_rate
avformat/vividas: Make len signed
avcodec/h264idct_template: Fix integer overflow in ff_h264_chroma422_dc_dequant_idct()
avformat/dsfdec: Check block_align more completely
avformat/mpc8: Check remaining space in mpc8_parse_seektable()
avformat/id3v2: Sanity check tlen before alloc and uncompress
avformat/vqf: Check len for COMM chunks
avformat/mov: Avoid overflow in end computation in mov_read_custom()
avcodec/hevc_cabac: Limit value in coeff_abs_level_remaining_decode() tighter
avformat/cafdec: Check the return code from av_add_index_entry()
avformat/cafdec: Check for EOF in index read loop
avformat/cafdec: Check that bytes_per_packet and frames_per_packet are non negative
avformat/mpc8: correct integer overflow in mpc8_parse_seektable()
avformat/mpc8: correct 32bit timestamp truncation
avcodec/exr: Check ymin vs. h
avformat/avs: Use 64bit for the avio_tell() output
avformat/wavdec: More complete size check in find_guid()
avcodec/mv30: Use unsigned in idct_1d()
avformat/iff: Check size before skip
avformat/rmdec: Check for EOF in index packet reading
avcodec/vp3dsp: Use unsigned constant to avoid undefined integer overflow in ff_vp3dsp_set_bounding_values()
avformat/icodec: Check for zero streams and stream creation failure
avformat/icodec: Factor failure code out in read_header()
avformat/bintext: Check width
avformat/sbgdec: Check that end is not before start
avformat/lvfdec: Check stream_index before use
avformat/au: cleanup on EOF return in au_read_annotation()
avformat/mpegts: Limit copied data to space
avformat/bintext: Check width in idf_read_header()
avformat/iff: check size against INT64_MAX
avformat/vividas: improve extradata packing checks in track_header()
avformat/paf: Check for EOF in read_table()
avformat/gxf: Check pkt_len
avformat/aiffdec: Check packet size
avformat/concatdec: use av_strstart()
avformat/wavdec: Refuse to read chunks bigger than the filesize in w64_read_header()
avformat/rsd: Check size and start before computing duration
avformat/vividas: better check of current_sb_entry
avformat/iff: More completely check body_size
avformat/vividas use avpriv_set_pts_info()
avformat/xwma: Check for EOF in dpds_table read code
avcodec/utils: Check sample rate before use for AV_CODEC_ID_BINKAUDIO_DCT in get_audio_frame_duration()
avcodec/dirac_parser: do not offset AV_NOPTS_OFFSET
avformat/rmdec: Make expected_len 64bit
avformat/pcm: Check block_align
avformat/lrcdec: Clip timestamps
avutil/mathematics: Use av_sat_add64() for the last addition in av_add_stable()
avformat/electronicarts: Check for EOF in each iteration of the loop in ea_read_packet()
avformat/ifv: Check that total frames do not overflow
avcodec/vp9dsp_template: Fix some overflows in iadst8_1d()
avcodec/fits: Check bscale
avformat/nistspheredec: Check bps
avformat/jacosubdec: Use 64bit inside get_shift()
avformat/genh: Check block_align
avformat/mvi: Check count for overflow
avcodec/magicyuv: Check slice size before reading flags and pred
avformat/asfdec_f: Check for negative ext_len
avformat/bethsoftvid: Check image dimensions before use
avformat/genh: Check block_align for how it will be used in SDX2_DPCM
avformat/au: Check for EOF in au_read_annotation()
avformat/vividas: Check for zero v_size
avformat/segafilm: Do not assume AV_CODEC_ID_NONE is 0
avformat/segafilm: Check that there is a stream
avformat/wtvdec: Check dir_length
avformat/ffmetadec: finalize AVBPrint on errors
avcodec/decode/ff_get_buffer: Check for overflow in FFALIGN()
avcodec/exr: Check limits to avoid overflow in delta computation
avformat/boadec: Check that channels and block_align are set
avformat/asfdec_f: Check name_len for overflow
avcodec/h264idct_template: Fix integer overflow in ff_h264_chroma422_dc_dequant_idct()
avformat/sbgdec: Check for timestamp overflow in parse_time_sequence()
avcodec/aacdec_fixed: Limit index in vector_pow43()
avformat/kvag: Fix integer overflow in bitrate computation
avcodec/h264_slice: fix undefined integer overflow with POC in error concealment
avformat/rmdec: sanity check coded_framesize
avformat/flvdec: Check for EOF in amf_parse_object()
avcodec/mv30: Fix multiple integer overflows
avcodec/smacker: Check remaining bits in SMK_BLK_FULL
avcodec/cook: Check subpacket index against max
avcodec/utils: Check for overflow with ATRAC* in get_audio_frame_duration()
avcodec/hevcpred_template: Fix diagonal chroma availability in 4:2:2 edge case in intra_pred
avformat/icodec: Change order of operations to avoid NULL dereference
avcodec/exr: Fix overflow with many blocks
avcodec/vp9dsp_template: Fix integer overflows in idct16_1d()
avcodec/ansi: Check initial dimensions
avcodec/hevcdec: Check slice_cb_qp_offset / slice_cr_qp_offset
avcodec/sonic: Check for overread
avformat/subviewerdec: fail on AV_NOPTS_VALUE
avcodec/exr: Check line size for overflow
avcodec/exr: Check xdelta, ydelta
avcodec/celp_filters: Avoid invalid negation in ff_celp_lp_synthesis_filter()
avcodec/takdsp: Fix negative shift in decorrelate_sf()
avcodec/dxtory: Fix negative stride shift in dx2_decode_slice_420()
avformat/asfdec_f: Change order or operations slightly
avformat/dxa: Use av_rescale() for duration computation
avcodec/vc1_block: Fix integer overflow in ac value
avcodec/mv30: Fix several integer overflows in idct_1d()
avformat/iff: Check data_size not overflowing int64
avcodec/dxtory: Fix negative shift in dx2_decode_slice_410()
avcodec/sonic: Check channels before deallocating
avformat/vividas: Check for EOF in first loop in track_header()
avformat/wvdec: Check rate for overflow
avcodec/ansi: Check nb_args for overflow
avformat/wc3movie: Cleanup on wc3_read_header() failure
avformat/wc3movie: Move wc3_read_close() up
avcodec/tiff: Fix default white level
avcodec/diracdsp: Fix integer anomaly in dequant_subband_*
avutil/fixed_dsp: Fix integer overflows in butterflies_fixed_c()
avcodec/mv30: Check remaining mask in decode_inter()
avcodec/wmalosslessdec: Check remaining space before padding and channel residue
avformat/cdg: Fix integer overflow in duration computation
avcodec/mpc: Fix multiple numerical overflows in ff_mpc_dequantize_and_synth()
avcodec/agm: Fix off by 1 error in decode_inter_plane()
avformat/electronicarts: Check if there are any streams
avcodec/ffwavesynth: Fix integer overflow in wavesynth_synth_sample / WS_SINE
avcodec/vp9dsp_template: Fix integer overflow in iadst8_1d()
avformat/avidec: Fix io_fsize overflow
avcodec/cfhd: Check transform type
avcodec/tiff: Check jpeg context against jpeg frame parameters
avcodec/tiff: Restrict tag order based on specification
avcodec/tiff: Avoid abort with DNG RAW TIFF with YA8
avcodec/tiff: Check the linearization table size
avformat/siff: Reject audio packets without audio stream
avformat/mpeg: Check avio_read() return value in get_pts()
avcodec/tiff: Check bpp/bppcount for 0
avcodec/snowdec: Sanity check hcoeff
avformat/mov: Check comp_brand_size
avformat/ape: Error out in case of EOF in the header
avcodec/alac: Check decorr_shift to avoid invalid shift
avcodec/tdsc: Fix tile checks
opusdec: do not fail when LBRR frames are present
configure: update copyright year
avfilter/vf_framerate: fix infinite loop with 1-frame input
avformat/url: Change () position in ff_make_absolute_url()
avformat/mpegts: make sure mpegts_read_header always stops at the first pmt
avformat/alp: fix handling of TUN files
avformat/argo_asf: fix handling of v1.1 files
swscale/x86/yuv2rgb: fix crashes when loading alpha from unaligned buffers
lavf/url: fix relative url parsing when the query string or fragment has a colon
avformat/libsrt: fix cleanups on failed libsrt_open() and libsrt_setup()
avcodec/cuviddec: backport extradata fixes
avcodec/cuviddec: handle arbitrarily sized extradata
lavf/srt: fix build fail when used the libsrt 1.4.1
avformat/libsrt: close listen fd in listener mode
lavf/url: rewrite ff_make_absolute_url() using ff_url_decompose().
lavf/url: add ff_url_decompose().
avcodec/cbs_av1: fix setting FrameWidth in frame_size_with_refs()
avcodec/cbs_av1: use a more appropiate AV1ReferenceFrameState pointer variable name
avcodec/cbs_av1: fix handling reference frames on show_existing_frame frames
avcodec/cbs_av1: infer frame_type in show_existing_frame frames earlier
avcodec/cbs_av1: add OrderHint to CodedBitstreamAV1Context
avcodec/cbs_av1: infer frame_type when parsing a show_existing_frame frame
cbs_av1: Fix test for presence of buffer_removal_time element
avcodec/cbs_av1: fix storage size for render_{width,height}_minus_1
lavc: Lower MediaFoundation audio encoder priority.
x86/yuv2rgb: fix crashes when storing data on unaligned buffers
checkasm/vf_blend: use the correct depth parameters to initialize the blend modes
x86/vf_blend: fix warnings about trailing empty parameters
x86/h264_deblock: fix warning about trailing empty parameter
avutil/x86inc: fix warnings when assembling with Nasm 2.15
version 4.3.1:
avcodec/tiff: Check input space in dng_decode_jpeg()
avcodec/mjpeg_parser: Adjust size rejection threshold
avcodec/cbs_jpeg: Fix uninitialized end index in cbs_jpeg_split_fragment()
avformat/sdp: Fix potential write beyond end of buffer
avformat/mm: Check for existence of audio stream
avformat/mov: Fix unaligned read of uint32_t and endian-dependance in mov_read_default
avcodec/apedec: Fix undefined integer overflow with 24bit
avcodec/loco: Fix integer overflow with large values from loco_get_rice()
avformat/smjpegdec: Check the existence of referred streams
avcodec/tiff: Check frame parameters before blit for DNG
avcodec/mjpegdec: Limit bayer to single plane outputting format
avcodec/pnmdec: Fix misaligned reads
avcodec/mv30: Fix integer overflows in idct2_1d()
avcodec/hcadec: Check total_band_count against imdct_in size
avcodec/scpr3: Fix out of array access with dectab
avcodec/tiff: Do not overrun the array ends in dng_blit()
avcodec/dstdec: Replace AC overread check by sample rate check
dnn_backend_native: Add overflow check for length calculation.
avcodec/h264_metadata_bsf: Fix invalid av_freep
avcodec/cbs_h265: set default VUI parameters when vui_parameters_present_flag is false
avcodec/av1_parser: initialize avctx->pix_fmt
avcodec/av1_parser: add missing parsing for RGB pixel format signaling
avcodec/av1_parser: set context values outside the OBU parsing loop
avutil/avsscanf: Add () to avoid integer overflow in scanexp()
avformat/utils: reorder duration computation to avoid overflow
avcodec/pngdec: Check for fctl after idat
avformat/hls: Pass a copy of the URL for probing
avutil/common: Fix integer overflow in av_ceil_log2_c()
avcodec/wmalosslessdec: fix overflow with pred in revert_cdlms
avformat/mvdec: Fix integer overflow with billions of channels
avformat/microdvddec: skip malformed lines without frame number.
dnn_backend_native: check operand index
dnn_backend_native.c: refine code for fail case
avformat/mov: fix memleaks
libavformat/mov: Fix memleaks when demuxing DV audio
avcodec/cbs_av1: Fix writing uvlc numbers >= INT_MAX
avformat/avc, mxfenc: Avoid allocation of H264 SPS structure, fix memleak
avcodec/bitstream: Don't check for undefined behaviour after it happened
avformat/aviobuf: Also return truncated buffer in avio_get_dyn_buf()
avformat/aviobuf: Don't check for overflow after it happened
version 4.3: version 4.3:
- v360 filter - v360 filter
- Intel QSV-accelerated MJPEG decoding - Intel QSV-accelerated MJPEG decoding
+11 -5
View File
@@ -55,9 +55,9 @@ fate.ffmpeg.org Timothy Gu
Trac bug tracker Alexander Strasser, Michael Niedermayer, Carl Eugen Hoyos Trac bug tracker Alexander Strasser, Michael Niedermayer, Carl Eugen Hoyos
Patchwork Andriy Gelman Patchwork Andriy Gelman
mailing lists Baptiste Coudurier mailing lists Baptiste Coudurier
Twitter Lou Logan, Reynaldo H. Verdejo Pinochet Twitter Reynaldo H. Verdejo Pinochet
Launchpad Timothy Gu Launchpad Timothy Gu
ffmpeg-security Andreas Cadhalpun, Carl Eugen Hoyos, Clément Bœsch, Michael Niedermayer, Reimar Doeffinger, Rodger Combs, wm4 ffmpeg-security Andreas Cadhalpun, Carl Eugen Hoyos, Clément Bœsch, Michael Niedermayer, Reimar Doeffinger, rcombs, wm4
libavutil libavutil
@@ -144,7 +144,7 @@ Codecs:
ass* Aurelien Jacobs ass* Aurelien Jacobs
asv* Michael Niedermayer asv* Michael Niedermayer
atrac3plus* Maxim Poliakovski atrac3plus* Maxim Poliakovski
audiotoolbox* Rodger Combs audiotoolbox* rcombs
avs2* Huiwen Ren avs2* Huiwen Ren
bgmc.c, bgmc.h Thilo Borgmann bgmc.c, bgmc.h Thilo Borgmann
binkaudio.c Peter Ross binkaudio.c Peter Ross
@@ -235,7 +235,6 @@ Codecs:
rv10.c Michael Niedermayer rv10.c Michael Niedermayer
s3tc* Ivo van Poorten s3tc* Ivo van Poorten
smc.c Mike Melanson smc.c Mike Melanson
smvjpegdec.c Ash Hughes
snow* Michael Niedermayer, Loren Merritt snow* Michael Niedermayer, Loren Merritt
sonic.c Alex Beregszaszi sonic.c Alex Beregszaszi
speedhq.c Steinar H. Gunderson speedhq.c Steinar H. Gunderson
@@ -393,7 +392,12 @@ Muxers/Demuxers:
afc.c Paul B Mahol afc.c Paul B Mahol
aiffdec.c Baptiste Coudurier, Matthieu Bouron aiffdec.c Baptiste Coudurier, Matthieu Bouron
aiffenc.c Baptiste Coudurier, Matthieu Bouron aiffenc.c Baptiste Coudurier, Matthieu Bouron
alp.c Zane van Iperen
amvenc.c Zane van Iperen
apm.c Zane van Iperen
apngdec.c Benoit Fouet apngdec.c Benoit Fouet
argo_asf.c Zane van Iperen
argo_brp.c Zane van Iperen
ass* Aurelien Jacobs ass* Aurelien Jacobs
astdec.c Paul B Mahol astdec.c Paul B Mahol
astenc.c James Almer astenc.c James Almer
@@ -431,6 +435,7 @@ Muxers/Demuxers:
ircam* Paul B Mahol ircam* Paul B Mahol
iss.c Stefan Gehrer iss.c Stefan Gehrer
jvdec.c Peter Ross jvdec.c Peter Ross
kvag.c Zane van Iperen
libmodplug.c Clément Bœsch libmodplug.c Clément Bœsch
libopenmpt.c Josh de Kock libopenmpt.c Josh de Kock
lmlm4.c Ivo van Poorten lmlm4.c Ivo van Poorten
@@ -463,6 +468,7 @@ Muxers/Demuxers:
oggparse*.c David Conrad oggparse*.c David Conrad
oma.c Maxim Poliakovski oma.c Maxim Poliakovski
paf.c Paul B Mahol paf.c Paul B Mahol
pp_bnk.c Zane van Iperen
psxstr.c Mike Melanson psxstr.c Mike Melanson
pva.c Ivo van Poorten pva.c Ivo van Poorten
pvfdec.c Paul B Mahol pvfdec.c Paul B Mahol
@@ -607,7 +613,6 @@ Jaikrishnan Menon 61A1 F09F 01C9 2D45 78E1 C862 25DC 8831 AF70 D368
James Almer 7751 2E8C FD94 A169 57E6 9A7A 1463 01AD 7376 59E0 James Almer 7751 2E8C FD94 A169 57E6 9A7A 1463 01AD 7376 59E0
Jean Delvare 7CA6 9F44 60F1 BDC4 1FD2 C858 A552 6B9B B3CD 4E6A Jean Delvare 7CA6 9F44 60F1 BDC4 1FD2 C858 A552 6B9B B3CD 4E6A
Loren Merritt ABD9 08F4 C920 3F65 D8BE 35D7 1540 DAA7 060F 56DE Loren Merritt ABD9 08F4 C920 3F65 D8BE 35D7 1540 DAA7 060F 56DE
Lou Logan (llogan) 7D68 DC73 CBEF EABB 671A B6CF 621C 2E28 82F8 DC3A
Lynne FE50 139C 6805 72CA FD52 1F8D A2FE A5F0 3F03 4464 Lynne FE50 139C 6805 72CA FD52 1F8D A2FE A5F0 3F03 4464
Michael Niedermayer 9FF2 128B 147E F673 0BAD F133 611E C787 040B 0FAB Michael Niedermayer 9FF2 128B 147E F673 0BAD F133 611E C787 040B 0FAB
Nicolas George 24CE 01CE 9ACC 5CEB 74D8 8D9D B063 D997 36E5 4C93 Nicolas George 24CE 01CE 9ACC 5CEB 74D8 8D9D B063 D997 36E5 4C93
@@ -629,3 +634,4 @@ Tiancheng "Timothy" Gu 9456 AFC0 814A 8139 E994 8351 7FE6 B095 B582 B0D4
Tim Nicholson 38CF DB09 3ED0 F607 8B67 6CED 0C0B FC44 8B0B FC83 Tim Nicholson 38CF DB09 3ED0 F607 8B67 6CED 0C0B FC44 8B0B FC83
Tomas Härdin (thardin) A79D 4E3D F38F 763F 91F5 8B33 A01E 8AE0 41BB 2551 Tomas Härdin (thardin) A79D 4E3D F38F 763F 91F5 8B33 A01E 8AE0 41BB 2551
Wei Gao 4269 7741 857A 0E60 9EC5 08D2 4744 4EFA 62C1 87B9 Wei Gao 4269 7741 857A 0E60 9EC5 08D2 4744 4EFA 62C1 87B9
Zane van Iperen (zane) 61AE D40F 368B 6F26 9DAE 3892 6861 6B2D 8AC4 DCC5
+11 -1
View File
@@ -53,13 +53,23 @@ target_dec_%_fuzzer$(EXESUF): target_dec_%_fuzzer.o $(FF_DEP_LIBS)
tools/target_bsf_%_fuzzer$(EXESUF): tools/target_bsf_%_fuzzer.o $(FF_DEP_LIBS) tools/target_bsf_%_fuzzer$(EXESUF): tools/target_bsf_%_fuzzer.o $(FF_DEP_LIBS)
$(LD) $(LDFLAGS) $(LDEXEFLAGS) $(LD_O) $^ $(ELIBS) $(FF_EXTRALIBS) $(LIBFUZZER_PATH) $(LD) $(LDFLAGS) $(LDEXEFLAGS) $(LD_O) $^ $(ELIBS) $(FF_EXTRALIBS) $(LIBFUZZER_PATH)
target_dem_%_fuzzer$(EXESUF): target_dem_%_fuzzer.o $(FF_DEP_LIBS)
$(LD) $(LDFLAGS) $(LDEXEFLAGS) $(LD_O) $^ $(ELIBS) $(FF_EXTRALIBS) $(LIBFUZZER_PATH)
tools/target_dem_fuzzer$(EXESUF): tools/target_dem_fuzzer.o $(FF_DEP_LIBS) tools/target_dem_fuzzer$(EXESUF): tools/target_dem_fuzzer.o $(FF_DEP_LIBS)
$(LD) $(LDFLAGS) $(LDEXEFLAGS) $(LD_O) $^ $(ELIBS) $(FF_EXTRALIBS) $(LIBFUZZER_PATH) $(LD) $(LDFLAGS) $(LDEXEFLAGS) $(LD_O) $^ $(ELIBS) $(FF_EXTRALIBS) $(LIBFUZZER_PATH)
tools/target_io_dem_fuzzer$(EXESUF): tools/target_io_dem_fuzzer.o $(FF_DEP_LIBS)
$(LD) $(LDFLAGS) $(LDEXEFLAGS) $(LD_O) $^ $(ELIBS) $(FF_EXTRALIBS) $(LIBFUZZER_PATH)
tools/enum_options$(EXESUF): ELIBS = $(FF_EXTRALIBS)
tools/enum_options$(EXESUF): $(FF_DEP_LIBS)
tools/sofa2wavs$(EXESUF): ELIBS = $(FF_EXTRALIBS) tools/sofa2wavs$(EXESUF): ELIBS = $(FF_EXTRALIBS)
tools/uncoded_frame$(EXESUF): $(FF_DEP_LIBS) tools/uncoded_frame$(EXESUF): $(FF_DEP_LIBS)
tools/uncoded_frame$(EXESUF): ELIBS = $(FF_EXTRALIBS) tools/uncoded_frame$(EXESUF): ELIBS = $(FF_EXTRALIBS)
tools/target_dec_%_fuzzer$(EXESUF): $(FF_DEP_LIBS) tools/target_dec_%_fuzzer$(EXESUF): $(FF_DEP_LIBS)
tools/target_dem_%_fuzzer$(EXESUF): $(FF_DEP_LIBS)
CONFIGURABLE_COMPONENTS = \ CONFIGURABLE_COMPONENTS = \
$(wildcard $(FFLIBS:%=$(SRC_PATH)/lib%/all*.c)) \ $(wildcard $(FFLIBS:%=$(SRC_PATH)/lib%/all*.c)) \
@@ -100,7 +110,7 @@ include $(SRC_PATH)/fftools/Makefile
include $(SRC_PATH)/doc/Makefile include $(SRC_PATH)/doc/Makefile
include $(SRC_PATH)/doc/examples/Makefile include $(SRC_PATH)/doc/examples/Makefile
libavcodec/utils.o libavformat/utils.o libavdevice/avdevice.o libavfilter/avfilter.o libavutil/utils.o libpostproc/postprocess.o libswresample/swresample.o libswscale/utils.o : libavutil/ffversion.h libavcodec/avcodec.o libavformat/utils.o libavdevice/avdevice.o libavfilter/avfilter.o libavutil/utils.o libpostproc/postprocess.o libswresample/swresample.o libswscale/utils.o : libavutil/ffversion.h
$(PROGS): %$(PROGSSUF)$(EXESUF): %$(PROGSSUF)_g$(EXESUF) $(PROGS): %$(PROGSSUF)$(EXESUF): %$(PROGSSUF)_g$(EXESUF)
ifeq ($(STRIPTYPE),direct) ifeq ($(STRIPTYPE),direct)
+1 -1
View File
@@ -1 +1 @@
4.3.2 4.4
+3 -3
View File
@@ -1,10 +1,10 @@
┌────────────────────────────────────┐ ┌────────────────────────────────────┐
│ RELEASE NOTES for FFmpeg 4.3 "4:3" │ │ RELEASE NOTES for FFmpeg 4.4 "Rao" │
└────────────────────────────────────┘ └────────────────────────────────────┘
The FFmpeg Project proudly presents FFmpeg 4.3 "4:3", about 10 The FFmpeg Project proudly presents FFmpeg 4.4 "Rao", about 10
months after the release of FFmpeg 4.2. months after the release of FFmpeg 4.3.
A complete Changelog is available at the root of the project, and the A complete Changelog is available at the root of the project, and the
complete Git history on https://git.ffmpeg.org/gitweb/ffmpeg.git complete Git history on https://git.ffmpeg.org/gitweb/ffmpeg.git
+1 -1
View File
@@ -1 +1 @@
4.3.2 4.4
+66 -9
View File
@@ -1,7 +1,7 @@
/* /*
* Minimum CUDA compatibility definitions header * Minimum CUDA compatibility definitions header
* *
* Copyright (c) 2019 Rodger Combs * Copyright (c) 2019 rcombs
* *
* This file is part of FFmpeg. * This file is part of FFmpeg.
* *
@@ -49,6 +49,16 @@ typedef struct __device_builtin__ __align__(4) ushort2
unsigned short x, y; unsigned short x, y;
} ushort2; } ushort2;
typedef struct __device_builtin__ __align__(8) float2
{
float x, y;
} float2;
typedef struct __device_builtin__ __align__(8) int2
{
int x, y;
} int2;
typedef struct __device_builtin__ uint3 typedef struct __device_builtin__ uint3
{ {
unsigned int x, y, z; unsigned int x, y, z;
@@ -56,11 +66,6 @@ typedef struct __device_builtin__ uint3
typedef struct uint3 dim3; typedef struct uint3 dim3;
typedef struct __device_builtin__ __align__(8) int2
{
int x, y;
} int2;
typedef struct __device_builtin__ __align__(4) uchar4 typedef struct __device_builtin__ __align__(4) uchar4
{ {
unsigned char x, y, z, w; unsigned char x, y, z, w;
@@ -68,7 +73,7 @@ typedef struct __device_builtin__ __align__(4) uchar4
typedef struct __device_builtin__ __align__(8) ushort4 typedef struct __device_builtin__ __align__(8) ushort4
{ {
unsigned char x, y, z, w; unsigned short x, y, z, w;
} ushort4; } ushort4;
typedef struct __device_builtin__ __align__(16) int4 typedef struct __device_builtin__ __align__(16) int4
@@ -76,6 +81,11 @@ typedef struct __device_builtin__ __align__(16) int4
int x, y, z, w; int x, y, z, w;
} int4; } int4;
typedef struct __device_builtin__ __align__(16) float4
{
float x, y, z, w;
} float4;
// Accessors for special registers // Accessors for special registers
#define GETCOMP(reg, comp) \ #define GETCOMP(reg, comp) \
asm("mov.u32 %0, %%" #reg "." #comp ";" : "=r"(tmp)); \ asm("mov.u32 %0, %%" #reg "." #comp ";" : "=r"(tmp)); \
@@ -100,24 +110,31 @@ GET(getThreadIdx, tid)
#define threadIdx (getThreadIdx()) #define threadIdx (getThreadIdx())
// Basic initializers (simple macros rather than inline functions) // Basic initializers (simple macros rather than inline functions)
#define make_int2(a, b) ((int2){.x = a, .y = b})
#define make_uchar2(a, b) ((uchar2){.x = a, .y = b}) #define make_uchar2(a, b) ((uchar2){.x = a, .y = b})
#define make_ushort2(a, b) ((ushort2){.x = a, .y = b}) #define make_ushort2(a, b) ((ushort2){.x = a, .y = b})
#define make_float2(a, b) ((float2){.x = a, .y = b})
#define make_int4(a, b, c, d) ((int4){.x = a, .y = b, .z = c, .w = d})
#define make_uchar4(a, b, c, d) ((uchar4){.x = a, .y = b, .z = c, .w = d}) #define make_uchar4(a, b, c, d) ((uchar4){.x = a, .y = b, .z = c, .w = d})
#define make_ushort4(a, b, c, d) ((ushort4){.x = a, .y = b, .z = c, .w = d}) #define make_ushort4(a, b, c, d) ((ushort4){.x = a, .y = b, .z = c, .w = d})
#define make_float4(a, b, c, d) ((float4){.x = a, .y = b, .z = c, .w = d})
// Conversions from the tex instruction's 4-register output to various types // Conversions from the tex instruction's 4-register output to various types
#define TEX2D(type, ret) static inline __device__ void conv(type* out, unsigned a, unsigned b, unsigned c, unsigned d) {*out = (ret);} #define TEX2D(type, ret) static inline __device__ void conv(type* out, unsigned a, unsigned b, unsigned c, unsigned d) {*out = (ret);}
TEX2D(unsigned char, a & 0xFF) TEX2D(unsigned char, a & 0xFF)
TEX2D(unsigned short, a & 0xFFFF) TEX2D(unsigned short, a & 0xFFFF)
TEX2D(float, a)
TEX2D(uchar2, make_uchar2(a & 0xFF, b & 0xFF)) TEX2D(uchar2, make_uchar2(a & 0xFF, b & 0xFF))
TEX2D(ushort2, make_ushort2(a & 0xFFFF, b & 0xFFFF)) TEX2D(ushort2, make_ushort2(a & 0xFFFF, b & 0xFFFF))
TEX2D(float2, make_float2(a, b))
TEX2D(uchar4, make_uchar4(a & 0xFF, b & 0xFF, c & 0xFF, d & 0xFF)) TEX2D(uchar4, make_uchar4(a & 0xFF, b & 0xFF, c & 0xFF, d & 0xFF))
TEX2D(ushort4, make_ushort4(a & 0xFFFF, b & 0xFFFF, c & 0xFFFF, d & 0xFFFF)) TEX2D(ushort4, make_ushort4(a & 0xFFFF, b & 0xFFFF, c & 0xFFFF, d & 0xFFFF))
TEX2D(float4, make_float4(a, b, c, d))
// Template calling tex instruction and converting the output to the selected type // Template calling tex instruction and converting the output to the selected type
template <class T> template<typename T>
static inline __device__ T tex2D(cudaTextureObject_t texObject, float x, float y) inline __device__ T tex2D(cudaTextureObject_t texObject, float x, float y)
{ {
T ret; T ret;
unsigned ret1, ret2, ret3, ret4; unsigned ret1, ret2, ret3, ret4;
@@ -128,4 +145,44 @@ static inline __device__ T tex2D(cudaTextureObject_t texObject, float x, float y
return ret; return ret;
} }
template<>
inline __device__ float4 tex2D<float4>(cudaTextureObject_t texObject, float x, float y)
{
float4 ret;
asm("tex.2d.v4.f32.f32 {%0, %1, %2, %3}, [%4, {%5, %6}];" :
"=r"(ret.x), "=r"(ret.y), "=r"(ret.z), "=r"(ret.w) :
"l"(texObject), "f"(x), "f"(y));
return ret;
}
template<>
inline __device__ float tex2D<float>(cudaTextureObject_t texObject, float x, float y)
{
return tex2D<float4>(texObject, x, y).x;
}
template<>
inline __device__ float2 tex2D<float2>(cudaTextureObject_t texObject, float x, float y)
{
float4 ret = tex2D<float4>(texObject, x, y);
return make_float2(ret.x, ret.y);
}
// Math helper functions
static inline __device__ float floorf(float a) { return __builtin_floorf(a); }
static inline __device__ float floor(float a) { return __builtin_floorf(a); }
static inline __device__ double floor(double a) { return __builtin_floor(a); }
static inline __device__ float ceilf(float a) { return __builtin_ceilf(a); }
static inline __device__ float ceil(float a) { return __builtin_ceilf(a); }
static inline __device__ double ceil(double a) { return __builtin_ceil(a); }
static inline __device__ float truncf(float a) { return __builtin_truncf(a); }
static inline __device__ float trunc(float a) { return __builtin_truncf(a); }
static inline __device__ double trunc(double a) { return __builtin_trunc(a); }
static inline __device__ float fabsf(float a) { return __builtin_fabsf(a); }
static inline __device__ float fabs(float a) { return __builtin_fabsf(a); }
static inline __device__ double fabs(double a) { return __builtin_fabs(a); }
static inline __device__ float __sinf(float a) { return __nvvm_sin_approx_f(a); }
static inline __device__ float __cosf(float a) { return __nvvm_cos_approx_f(a); }
#endif /* COMPAT_CUDA_CUDA_RUNTIME_H */ #endif /* COMPAT_CUDA_CUDA_RUNTIME_H */
Vendored
+188 -116
View File
@@ -190,9 +190,9 @@ External library support:
Using any of the following switches will allow FFmpeg to link to the Using any of the following switches will allow FFmpeg to link to the
corresponding external library. All the components depending on that library corresponding external library. All the components depending on that library
will become enabled, if all their other dependencies are met and they are not will become enabled, if all their other dependencies are met and they are not
explicitly disabled. E.g. --enable-libwavpack will enable linking to explicitly disabled. E.g. --enable-libopus will enable linking to
libwavpack and allow the libwavpack encoder to be built, unless it is libopus and allow the libopus encoder to be built, unless it is
specifically disabled with --disable-encoder=libwavpack. specifically disabled with --disable-encoder=libopus.
Note that only the system libraries are auto-detected. All the other external Note that only the system libraries are auto-detected. All the other external
libraries must be explicitly enabled. libraries must be explicitly enabled.
@@ -253,10 +253,13 @@ External library support:
--enable-libopenh264 enable H.264 encoding via OpenH264 [no] --enable-libopenh264 enable H.264 encoding via OpenH264 [no]
--enable-libopenjpeg enable JPEG 2000 de/encoding via OpenJPEG [no] --enable-libopenjpeg enable JPEG 2000 de/encoding via OpenJPEG [no]
--enable-libopenmpt enable decoding tracked files via libopenmpt [no] --enable-libopenmpt enable decoding tracked files via libopenmpt [no]
--enable-libopenvino enable OpenVINO as a DNN module backend
for DNN based filters like dnn_processing [no]
--enable-libopus enable Opus de/encoding via libopus [no] --enable-libopus enable Opus de/encoding via libopus [no]
--enable-libpulse enable Pulseaudio input via libpulse [no] --enable-libpulse enable Pulseaudio input via libpulse [no]
--enable-librabbitmq enable RabbitMQ library [no] --enable-librabbitmq enable RabbitMQ library [no]
--enable-librav1e enable AV1 encoding via rav1e [no] --enable-librav1e enable AV1 encoding via rav1e [no]
--enable-librist enable RIST via librist [no]
--enable-librsvg enable SVG rasterization via librsvg [no] --enable-librsvg enable SVG rasterization via librsvg [no]
--enable-librubberband enable rubberband needed for rubberband filter [no] --enable-librubberband enable rubberband needed for rubberband filter [no]
--enable-librtmp enable RTMP[E] support via librtmp [no] --enable-librtmp enable RTMP[E] support via librtmp [no]
@@ -267,6 +270,7 @@ External library support:
--enable-libspeex enable Speex de/encoding via libspeex [no] --enable-libspeex enable Speex de/encoding via libspeex [no]
--enable-libsrt enable Haivision SRT protocol via libsrt [no] --enable-libsrt enable Haivision SRT protocol via libsrt [no]
--enable-libssh enable SFTP protocol via libssh [no] --enable-libssh enable SFTP protocol via libssh [no]
--enable-libsvtav1 enable AV1 encoding via SVT [no]
--enable-libtensorflow enable TensorFlow as a DNN module backend --enable-libtensorflow enable TensorFlow as a DNN module backend
for DNN based filters like sr [no] for DNN based filters like sr [no]
--enable-libtesseract enable Tesseract, needed for ocr filter [no] --enable-libtesseract enable Tesseract, needed for ocr filter [no]
@@ -274,6 +278,7 @@ External library support:
--enable-libtls enable LibreSSL (via libtls), needed for https support --enable-libtls enable LibreSSL (via libtls), needed for https support
if openssl, gnutls or mbedtls is not used [no] if openssl, gnutls or mbedtls is not used [no]
--enable-libtwolame enable MP2 encoding via libtwolame [no] --enable-libtwolame enable MP2 encoding via libtwolame [no]
--enable-libuavs3d enable AVS3 decoding via libuavs3d [no]
--enable-libv4l2 enable libv4l2/v4l-utils [no] --enable-libv4l2 enable libv4l2/v4l-utils [no]
--enable-libvidstab enable video stabilization using vid.stab [no] --enable-libvidstab enable video stabilization using vid.stab [no]
--enable-libvmaf enable vmaf filter via libvmaf [no] --enable-libvmaf enable vmaf filter via libvmaf [no]
@@ -281,7 +286,6 @@ External library support:
--enable-libvorbis enable Vorbis en/decoding via libvorbis, --enable-libvorbis enable Vorbis en/decoding via libvorbis,
native implementation exists [no] native implementation exists [no]
--enable-libvpx enable VP8 and VP9 de/encoding via libvpx [no] --enable-libvpx enable VP8 and VP9 de/encoding via libvpx [no]
--enable-libwavpack enable wavpack encoding via libwavpack [no]
--enable-libwebp enable WebP encoding via libwebp [no] --enable-libwebp enable WebP encoding via libwebp [no]
--enable-libx264 enable H.264 encoding via x264 [no] --enable-libx264 enable H.264 encoding via x264 [no]
--enable-libx265 enable HEVC encoding via x265 [no] --enable-libx265 enable HEVC encoding via x265 [no]
@@ -1741,7 +1745,6 @@ EXTERNAL_LIBRARY_VERSION3_LIST="
liblensfun liblensfun
libopencore_amrnb libopencore_amrnb
libopencore_amrwb libopencore_amrwb
libvmaf
libvo_amrwbenc libvo_amrwbenc
mbedtls mbedtls
rkmpp rkmpp
@@ -1790,10 +1793,12 @@ EXTERNAL_LIBRARY_LIST="
libopenh264 libopenh264
libopenjpeg libopenjpeg
libopenmpt libopenmpt
libopenvino
libopus libopus
libpulse libpulse
librabbitmq librabbitmq
librav1e librav1e
librist
librsvg librsvg
librtmp librtmp
libshine libshine
@@ -1803,14 +1808,16 @@ EXTERNAL_LIBRARY_LIST="
libspeex libspeex
libsrt libsrt
libssh libssh
libsvtav1
libtensorflow libtensorflow
libtesseract libtesseract
libtheora libtheora
libtwolame libtwolame
libuavs3d
libv4l2 libv4l2
libvmaf
libvorbis libvorbis
libvpx libvpx
libwavpack
libwebp libwebp
libxml2 libxml2
libzimg libzimg
@@ -2120,6 +2127,7 @@ HEADERS_LIST="
ES2_gl_h ES2_gl_h
gsm_h gsm_h
io_h io_h
linux_dma_buf_h
linux_perf_event_h linux_perf_event_h
machine_ioctl_bt848_h machine_ioctl_bt848_h
machine_ioctl_meteor_h machine_ioctl_meteor_h
@@ -2282,6 +2290,7 @@ TOOLCHAIN_FEATURES="
TYPES_LIST=" TYPES_LIST="
kCMVideoCodecType_HEVC kCMVideoCodecType_HEVC
kCMVideoCodecType_HEVCWithAlpha
kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange
kCVImageBufferTransferFunction_SMPTE_ST_2084_PQ kCVImageBufferTransferFunction_SMPTE_ST_2084_PQ
kCVImageBufferTransferFunction_ITU_R_2100_HLG kCVImageBufferTransferFunction_ITU_R_2100_HLG
@@ -2320,6 +2329,7 @@ HAVE_LIST="
$THREADS_LIST $THREADS_LIST
$TOOLCHAIN_FEATURES $TOOLCHAIN_FEATURES
$TYPES_LIST $TYPES_LIST
libdrm_getfb2
makeinfo makeinfo
makeinfo_html makeinfo_html
opencl_d3d11 opencl_d3d11
@@ -2338,6 +2348,7 @@ CONFIG_EXTRA="
aandcttables aandcttables
ac3dsp ac3dsp
adts_header adts_header
atsc_a53
audio_frame_queue audio_frame_queue
audiodsp audiodsp
blockdsp blockdsp
@@ -2551,7 +2562,7 @@ mips64r6_deps="mips"
mipsfpu_deps="mips" mipsfpu_deps="mips"
mipsdsp_deps="mips" mipsdsp_deps="mips"
mipsdspr2_deps="mips" mipsdspr2_deps="mips"
mmi_deps="mips" mmi_deps_any="loongson2 loongson3"
msa_deps="mipsfpu" msa_deps="mipsfpu"
msa2_deps="msa" msa2_deps="msa"
@@ -2620,14 +2631,15 @@ cbs_mpeg2_select="cbs"
cbs_vp9_select="cbs" cbs_vp9_select="cbs"
dct_select="rdft" dct_select="rdft"
dirac_parse_select="golomb" dirac_parse_select="golomb"
dnn_suggest="libtensorflow" dnn_suggest="libtensorflow libopenvino"
dnn_deps="swscale"
error_resilience_select="me_cmp" error_resilience_select="me_cmp"
faandct_deps="faan" faandct_deps="faan"
faandct_select="fdctdsp" faandct_select="fdctdsp"
faanidct_deps="faan" faanidct_deps="faan"
faanidct_select="idctdsp" faanidct_select="idctdsp"
h264dsp_select="startcode" h264dsp_select="startcode"
hevcparse_select="golomb" hevcparse_select="atsc_a53 golomb"
frame_thread_encoder_deps="encoders threads" frame_thread_encoder_deps="encoders threads"
intrax8_select="blockdsp idctdsp" intrax8_select="blockdsp idctdsp"
mdct_select="fft" mdct_select="fft"
@@ -2643,7 +2655,7 @@ rdft_select="fft"
# decoders / encoders # decoders / encoders
aac_decoder_select="adts_header mdct15 mdct sinewin" aac_decoder_select="adts_header mdct15 mdct sinewin"
aac_fixed_decoder_select="adts_header mdct sinewin" aac_fixed_decoder_select="adts_header mdct"
aac_encoder_select="audio_frame_queue iirfilter lpc mdct sinewin" aac_encoder_select="audio_frame_queue iirfilter lpc mdct sinewin"
aac_latm_decoder_select="aac_decoder aac_latm_parser" aac_latm_decoder_select="aac_decoder aac_latm_parser"
ac3_decoder_select="ac3_parser ac3dsp bswapdsp fmtconvert mdct" ac3_decoder_select="ac3_parser ac3dsp bswapdsp fmtconvert mdct"
@@ -2678,7 +2690,7 @@ atrac3al_decoder_select="mdct"
atrac3p_decoder_select="mdct sinewin" atrac3p_decoder_select="mdct sinewin"
atrac3pal_decoder_select="mdct sinewin" atrac3pal_decoder_select="mdct sinewin"
atrac9_decoder_select="mdct" atrac9_decoder_select="mdct"
avrn_decoder_select="exif jpegtables" av1_decoder_select="cbs_av1"
bink_decoder_select="blockdsp hpeldsp" bink_decoder_select="blockdsp hpeldsp"
binkaudio_dct_decoder_select="mdct rdft dct sinewin wma_freqs" binkaudio_dct_decoder_select="mdct rdft dct sinewin wma_freqs"
binkaudio_rdft_decoder_select="mdct rdft sinewin wma_freqs" binkaudio_rdft_decoder_select="mdct rdft sinewin wma_freqs"
@@ -2706,6 +2718,7 @@ eamad_decoder_select="aandcttables blockdsp bswapdsp idctdsp mpegvideo"
eatgq_decoder_select="aandcttables" eatgq_decoder_select="aandcttables"
eatqi_decoder_select="aandcttables blockdsp bswapdsp idctdsp" eatqi_decoder_select="aandcttables blockdsp bswapdsp idctdsp"
exr_decoder_deps="zlib" exr_decoder_deps="zlib"
exr_encoder_deps="zlib"
ffv1_decoder_select="rangecoder" ffv1_decoder_select="rangecoder"
ffv1_encoder_select="rangecoder" ffv1_encoder_select="rangecoder"
ffvhuff_decoder_select="huffyuv_decoder" ffvhuff_decoder_select="huffyuv_decoder"
@@ -2731,12 +2744,12 @@ h263_encoder_select="h263dsp mpegvideoenc"
h263i_decoder_select="h263_decoder" h263i_decoder_select="h263_decoder"
h263p_decoder_select="h263_decoder" h263p_decoder_select="h263_decoder"
h263p_encoder_select="h263_encoder" h263p_encoder_select="h263_encoder"
h264_decoder_select="cabac golomb h264chroma h264dsp h264parse h264pred h264qpel videodsp" h264_decoder_select="atsc_a53 cabac golomb h264chroma h264dsp h264parse h264pred h264qpel videodsp"
h264_decoder_suggest="error_resilience" h264_decoder_suggest="error_resilience"
hap_decoder_select="snappy texturedsp" hap_decoder_select="snappy texturedsp"
hap_encoder_deps="libsnappy" hap_encoder_deps="libsnappy"
hap_encoder_select="texturedspenc" hap_encoder_select="texturedspenc"
hevc_decoder_select="bswapdsp cabac golomb hevcparse videodsp" hevc_decoder_select="atsc_a53 bswapdsp cabac golomb hevcparse videodsp"
huffyuv_decoder_select="bswapdsp huffyuvdsp llviddsp" huffyuv_decoder_select="bswapdsp huffyuvdsp llviddsp"
huffyuv_encoder_select="bswapdsp huffman huffyuvencdsp llvidencdsp" huffyuv_encoder_select="bswapdsp huffman huffyuvencdsp llvidencdsp"
hymt_decoder_select="huffyuv_decoder" hymt_decoder_select="huffyuv_decoder"
@@ -2751,7 +2764,7 @@ interplay_video_decoder_select="hpeldsp"
jpegls_decoder_select="mjpeg_decoder" jpegls_decoder_select="mjpeg_decoder"
jv_decoder_select="blockdsp" jv_decoder_select="blockdsp"
lagarith_decoder_select="llviddsp" lagarith_decoder_select="llviddsp"
ljpeg_encoder_select="idctdsp jpegtables mpegvideoenc" ljpeg_encoder_select="idctdsp jpegtables"
lscr_decoder_deps="zlib" lscr_decoder_deps="zlib"
magicyuv_decoder_select="llviddsp" magicyuv_decoder_select="llviddsp"
magicyuv_encoder_select="llvidencdsp" magicyuv_encoder_select="llvidencdsp"
@@ -2763,6 +2776,7 @@ mjpeg_encoder_select="jpegtables mpegvideoenc"
mjpegb_decoder_select="mjpeg_decoder" mjpegb_decoder_select="mjpeg_decoder"
mlp_decoder_select="mlp_parser" mlp_decoder_select="mlp_parser"
mlp_encoder_select="lpc audio_frame_queue" mlp_encoder_select="lpc audio_frame_queue"
mobiclip_decoder_select="bswapdsp golomb"
motionpixels_decoder_select="bswapdsp" motionpixels_decoder_select="bswapdsp"
mp1_decoder_select="mpegaudio" mp1_decoder_select="mpegaudio"
mp1float_decoder_select="mpegaudio" mp1float_decoder_select="mpegaudio"
@@ -2791,7 +2805,7 @@ msmpeg4v2_encoder_select="h263_encoder"
msmpeg4v3_decoder_select="h263_decoder" msmpeg4v3_decoder_select="h263_decoder"
msmpeg4v3_encoder_select="h263_encoder" msmpeg4v3_encoder_select="h263_encoder"
mss2_decoder_select="mpegvideo qpeldsp vc1_decoder" mss2_decoder_select="mpegvideo qpeldsp vc1_decoder"
mts2_decoder_select="mss34dsp" mts2_decoder_select="jpegtables mss34dsp"
mv30_decoder_select="aandcttables blockdsp" mv30_decoder_select="aandcttables blockdsp"
mvha_decoder_deps="zlib" mvha_decoder_deps="zlib"
mvha_decoder_select="llviddsp" mvha_decoder_select="llviddsp"
@@ -2828,6 +2842,7 @@ rv40_decoder_select="golomb h264pred h264qpel mpegvideo rv34dsp"
screenpresso_decoder_deps="zlib" screenpresso_decoder_deps="zlib"
shorten_decoder_select="bswapdsp" shorten_decoder_select="bswapdsp"
sipr_decoder_select="lsp" sipr_decoder_select="lsp"
smvjpeg_decoder_select="mjpeg_decoder"
snow_decoder_select="dwt h264qpel hpeldsp me_cmp rangecoder videodsp" snow_decoder_select="dwt h264qpel hpeldsp me_cmp rangecoder videodsp"
snow_encoder_select="dwt h264qpel hpeldsp me_cmp mpegvideoenc rangecoder" snow_encoder_select="dwt h264qpel hpeldsp me_cmp mpegvideoenc rangecoder"
sonic_decoder_select="golomb rangecoder" sonic_decoder_select="golomb rangecoder"
@@ -2835,6 +2850,7 @@ sonic_encoder_select="golomb rangecoder"
sonic_ls_encoder_select="golomb rangecoder" sonic_ls_encoder_select="golomb rangecoder"
sp5x_decoder_select="mjpeg_decoder" sp5x_decoder_select="mjpeg_decoder"
speedhq_decoder_select="mpegvideo" speedhq_decoder_select="mpegvideo"
speedhq_encoder_select="mpegvideoenc"
srgc_decoder_deps="zlib" srgc_decoder_deps="zlib"
svq1_decoder_select="hpeldsp" svq1_decoder_select="hpeldsp"
svq1_encoder_select="hpeldsp me_cmp mpegvideoenc" svq1_encoder_select="hpeldsp me_cmp mpegvideoenc"
@@ -2908,6 +2924,16 @@ videotoolbox_hwaccel_deps="videotoolbox pthreads"
videotoolbox_hwaccel_extralibs="-framework QuartzCore" videotoolbox_hwaccel_extralibs="-framework QuartzCore"
xvmc_deps="X11_extensions_XvMClib_h" xvmc_deps="X11_extensions_XvMClib_h"
av1_d3d11va_hwaccel_deps="d3d11va DXVA_PicParams_AV1"
av1_d3d11va_hwaccel_select="av1_decoder"
av1_d3d11va2_hwaccel_deps="d3d11va DXVA_PicParams_AV1"
av1_d3d11va2_hwaccel_select="av1_decoder"
av1_dxva2_hwaccel_deps="dxva2 DXVA_PicParams_AV1"
av1_dxva2_hwaccel_select="av1_decoder"
av1_nvdec_hwaccel_deps="nvdec CUVIDAV1PICPARAMS"
av1_nvdec_hwaccel_select="av1_decoder"
av1_vaapi_hwaccel_deps="vaapi VADecPictureParameterBufferAV1_bit_depth_idx"
av1_vaapi_hwaccel_select="av1_decoder"
h263_vaapi_hwaccel_deps="vaapi" h263_vaapi_hwaccel_deps="vaapi"
h263_vaapi_hwaccel_select="h263_decoder" h263_vaapi_hwaccel_select="h263_decoder"
h263_videotoolbox_hwaccel_deps="videotoolbox" h263_videotoolbox_hwaccel_deps="videotoolbox"
@@ -3042,6 +3068,7 @@ nvenc_encoder_deps="nvenc"
aac_mf_encoder_deps="mediafoundation" aac_mf_encoder_deps="mediafoundation"
ac3_mf_encoder_deps="mediafoundation" ac3_mf_encoder_deps="mediafoundation"
av1_cuvid_decoder_deps="cuvid CUVIDAV1PICPARAMS"
h263_v4l2m2m_decoder_deps="v4l2_m2m h263_v4l2_m2m" h263_v4l2m2m_decoder_deps="v4l2_m2m h263_v4l2_m2m"
h263_v4l2m2m_encoder_deps="v4l2_m2m h263_v4l2_m2m" h263_v4l2m2m_encoder_deps="v4l2_m2m h263_v4l2_m2m"
h264_amf_encoder_deps="amf" h264_amf_encoder_deps="amf"
@@ -3053,9 +3080,10 @@ h264_mediacodec_decoder_select="h264_mp4toannexb_bsf h264_parser"
h264_mf_encoder_deps="mediafoundation" h264_mf_encoder_deps="mediafoundation"
h264_mmal_decoder_deps="mmal" h264_mmal_decoder_deps="mmal"
h264_nvenc_encoder_deps="nvenc" h264_nvenc_encoder_deps="nvenc"
h264_nvenc_encoder_select="atsc_a53"
h264_omx_encoder_deps="omx" h264_omx_encoder_deps="omx"
h264_qsv_decoder_select="h264_mp4toannexb_bsf qsvdec" h264_qsv_decoder_select="h264_mp4toannexb_bsf qsvdec"
h264_qsv_encoder_select="qsvenc" h264_qsv_encoder_select="atsc_a53 qsvenc"
h264_rkmpp_decoder_deps="rkmpp" h264_rkmpp_decoder_deps="rkmpp"
h264_rkmpp_decoder_select="h264_mp4toannexb_bsf" h264_rkmpp_decoder_select="h264_mp4toannexb_bsf"
h264_vaapi_encoder_select="cbs_h264 vaapi_encode" h264_vaapi_encoder_select="cbs_h264 vaapi_encode"
@@ -3069,6 +3097,7 @@ hevc_mediacodec_decoder_deps="mediacodec"
hevc_mediacodec_decoder_select="hevc_mp4toannexb_bsf hevc_parser" hevc_mediacodec_decoder_select="hevc_mp4toannexb_bsf hevc_parser"
hevc_mf_encoder_deps="mediafoundation" hevc_mf_encoder_deps="mediafoundation"
hevc_nvenc_encoder_deps="nvenc" hevc_nvenc_encoder_deps="nvenc"
hevc_nvenc_encoder_select="atsc_a53"
hevc_qsv_decoder_select="hevc_mp4toannexb_bsf qsvdec" hevc_qsv_decoder_select="hevc_mp4toannexb_bsf qsvdec"
hevc_qsv_encoder_select="hevcparse qsvenc" hevc_qsv_encoder_select="hevcparse qsvenc"
hevc_rkmpp_decoder_deps="rkmpp" hevc_rkmpp_decoder_deps="rkmpp"
@@ -3128,11 +3157,12 @@ vp9_qsv_encoder_deps="libmfx MFX_CODEC_VP9"
vp9_qsv_encoder_select="qsvenc" vp9_qsv_encoder_select="qsvenc"
vp9_v4l2m2m_decoder_deps="v4l2_m2m vp9_v4l2_m2m" vp9_v4l2m2m_decoder_deps="v4l2_m2m vp9_v4l2_m2m"
wmv3_crystalhd_decoder_select="crystalhd" wmv3_crystalhd_decoder_select="crystalhd"
av1_qsv_decoder_select="qsvdec"
# parsers # parsers
aac_parser_select="adts_header" aac_parser_select="adts_header"
av1_parser_select="cbs_av1" av1_parser_select="cbs_av1"
h264_parser_select="golomb h264dsp h264parse" h264_parser_select="atsc_a53 golomb h264dsp h264parse"
hevc_parser_select="hevcparse" hevc_parser_select="hevcparse"
mpegaudio_parser_select="mpegaudioheader" mpegaudio_parser_select="mpegaudioheader"
mpegvideo_parser_select="mpegvideo" mpegvideo_parser_select="mpegvideo"
@@ -3193,9 +3223,9 @@ pcm_mulaw_at_encoder_deps="audiotoolbox"
pcm_mulaw_at_encoder_select="audio_frame_queue" pcm_mulaw_at_encoder_select="audio_frame_queue"
chromaprint_muxer_deps="chromaprint" chromaprint_muxer_deps="chromaprint"
h264_videotoolbox_encoder_deps="pthreads" h264_videotoolbox_encoder_deps="pthreads"
h264_videotoolbox_encoder_select="videotoolbox_encoder" h264_videotoolbox_encoder_select="atsc_a53 videotoolbox_encoder"
hevc_videotoolbox_encoder_deps="pthreads" hevc_videotoolbox_encoder_deps="pthreads"
hevc_videotoolbox_encoder_select="videotoolbox_encoder" hevc_videotoolbox_encoder_select="atsc_a53 videotoolbox_encoder"
libaom_av1_decoder_deps="libaom" libaom_av1_decoder_deps="libaom"
libaom_av1_encoder_deps="libaom" libaom_av1_encoder_deps="libaom"
libaom_av1_encoder_select="extract_extradata_bsf" libaom_av1_encoder_select="extract_extradata_bsf"
@@ -3204,6 +3234,7 @@ libcelt_decoder_deps="libcelt"
libcodec2_decoder_deps="libcodec2" libcodec2_decoder_deps="libcodec2"
libcodec2_encoder_deps="libcodec2" libcodec2_encoder_deps="libcodec2"
libdav1d_decoder_deps="libdav1d" libdav1d_decoder_deps="libdav1d"
libdav1d_decoder_select="atsc_a53"
libdavs2_decoder_deps="libdavs2" libdavs2_decoder_deps="libdavs2"
libfdk_aac_decoder_deps="libfdk_aac" libfdk_aac_decoder_deps="libfdk_aac"
libfdk_aac_encoder_deps="libfdk_aac" libfdk_aac_encoder_deps="libfdk_aac"
@@ -3240,8 +3271,10 @@ libshine_encoder_select="audio_frame_queue"
libspeex_decoder_deps="libspeex" libspeex_decoder_deps="libspeex"
libspeex_encoder_deps="libspeex" libspeex_encoder_deps="libspeex"
libspeex_encoder_select="audio_frame_queue" libspeex_encoder_select="audio_frame_queue"
libsvtav1_encoder_deps="libsvtav1"
libtheora_encoder_deps="libtheora" libtheora_encoder_deps="libtheora"
libtwolame_encoder_deps="libtwolame" libtwolame_encoder_deps="libtwolame"
libuavs3d_decoder_deps="libuavs3d"
libvo_amrwbenc_encoder_deps="libvo_amrwbenc" libvo_amrwbenc_encoder_deps="libvo_amrwbenc"
libvorbis_decoder_deps="libvorbis" libvorbis_decoder_deps="libvorbis"
libvorbis_encoder_deps="libvorbis libvorbisenc" libvorbis_encoder_deps="libvorbis libvorbisenc"
@@ -3250,12 +3283,11 @@ libvpx_vp8_decoder_deps="libvpx"
libvpx_vp8_encoder_deps="libvpx" libvpx_vp8_encoder_deps="libvpx"
libvpx_vp9_decoder_deps="libvpx" libvpx_vp9_decoder_deps="libvpx"
libvpx_vp9_encoder_deps="libvpx" libvpx_vp9_encoder_deps="libvpx"
libwavpack_encoder_deps="libwavpack"
libwavpack_encoder_select="audio_frame_queue"
libwebp_encoder_deps="libwebp" libwebp_encoder_deps="libwebp"
libwebp_anim_encoder_deps="libwebp" libwebp_anim_encoder_deps="libwebp"
libx262_encoder_deps="libx262" libx262_encoder_deps="libx262"
libx264_encoder_deps="libx264" libx264_encoder_deps="libx264"
libx264_encoder_select="atsc_a53"
libx264rgb_encoder_deps="libx264 x264_csp_bgr" libx264rgb_encoder_deps="libx264 x264_csp_bgr"
libx264rgb_encoder_select="libx264_encoder" libx264rgb_encoder_select="libx264_encoder"
libx265_encoder_deps="libx265" libx265_encoder_deps="libx265"
@@ -3277,9 +3309,9 @@ asf_o_demuxer_select="riffdec"
asf_muxer_select="riffenc" asf_muxer_select="riffenc"
asf_stream_muxer_select="asf_muxer" asf_stream_muxer_select="asf_muxer"
av1_demuxer_select="av1_frame_merge_bsf av1_parser" av1_demuxer_select="av1_frame_merge_bsf av1_parser"
avi_demuxer_select="iso_media riffdec exif" avi_demuxer_select="riffdec exif"
avi_muxer_select="riffenc" avi_muxer_select="riffenc"
caf_demuxer_select="iso_media riffdec" caf_demuxer_select="iso_media"
caf_muxer_select="iso_media" caf_muxer_select="iso_media"
dash_muxer_select="mp4_muxer" dash_muxer_select="mp4_muxer"
dash_demuxer_deps="libxml2" dash_demuxer_deps="libxml2"
@@ -3305,9 +3337,9 @@ ismv_muxer_select="mov_muxer"
ivf_muxer_select="av1_metadata_bsf vp9_superframe_bsf" ivf_muxer_select="av1_metadata_bsf vp9_superframe_bsf"
latm_muxer_select="aac_adtstoasc_bsf" latm_muxer_select="aac_adtstoasc_bsf"
matroska_audio_muxer_select="matroska_muxer" matroska_audio_muxer_select="matroska_muxer"
matroska_demuxer_select="iso_media riffdec" matroska_demuxer_select="riffdec"
matroska_demuxer_suggest="bzlib lzo zlib" matroska_demuxer_suggest="bzlib lzo zlib"
matroska_muxer_select="iso_media riffenc vp9_superframe_bsf aac_adtstoasc_bsf" matroska_muxer_select="riffenc vp9_superframe_bsf aac_adtstoasc_bsf"
mlp_demuxer_select="mlp_parser" mlp_demuxer_select="mlp_parser"
mmf_muxer_select="riffenc" mmf_muxer_select="riffenc"
mov_demuxer_select="iso_media riffdec" mov_demuxer_select="iso_media riffdec"
@@ -3317,13 +3349,14 @@ mp3_demuxer_select="mpegaudio_parser"
mp3_muxer_select="mpegaudioheader" mp3_muxer_select="mpegaudioheader"
mp4_muxer_select="mov_muxer" mp4_muxer_select="mov_muxer"
mpegts_demuxer_select="iso_media" mpegts_demuxer_select="iso_media"
mpegts_muxer_select="adts_muxer latm_muxer h264_mp4toannexb_bsf hevc_mp4toannexb_bsf" mpegts_muxer_select="ac3_parser adts_muxer latm_muxer h264_mp4toannexb_bsf hevc_mp4toannexb_bsf"
mpegtsraw_demuxer_select="mpegts_demuxer" mpegtsraw_demuxer_select="mpegts_demuxer"
mxf_muxer_select="golomb pcm_rechunk_bsf" mxf_muxer_select="golomb pcm_rechunk_bsf"
mxf_d10_muxer_select="mxf_muxer" mxf_d10_muxer_select="mxf_muxer"
mxf_opatom_muxer_select="mxf_muxer" mxf_opatom_muxer_select="mxf_muxer"
nut_muxer_select="riffenc" nut_muxer_select="riffenc"
nuv_demuxer_select="riffdec" nuv_demuxer_select="riffdec"
obu_demuxer_select="av1_frame_merge_bsf av1_parser"
oga_muxer_select="ogg_muxer" oga_muxer_select="ogg_muxer"
ogg_demuxer_select="dirac_parse" ogg_demuxer_select="dirac_parse"
ogv_muxer_select="ogg_muxer" ogv_muxer_select="ogg_muxer"
@@ -3331,6 +3364,7 @@ opus_muxer_select="ogg_muxer"
psp_muxer_select="mov_muxer" psp_muxer_select="mov_muxer"
rtp_demuxer_select="sdp_demuxer" rtp_demuxer_select="sdp_demuxer"
rtp_muxer_select="golomb jpegtables" rtp_muxer_select="golomb jpegtables"
rtp_mpegts_muxer_select="mpegts_muxer rtp_muxer"
rtpdec_select="asf_demuxer jpegtables mov_demuxer mpegts_demuxer rm_demuxer rtp_protocol srtp" rtpdec_select="asf_demuxer jpegtables mov_demuxer mpegts_demuxer rm_demuxer rtp_protocol srtp"
rtsp_demuxer_select="http_protocol rtpdec" rtsp_demuxer_select="http_protocol rtpdec"
rtsp_muxer_select="rtp_muxer http_protocol rtp_protocol rtpenc_chain" rtsp_muxer_select="rtp_muxer http_protocol rtp_protocol rtpenc_chain"
@@ -3352,7 +3386,7 @@ w64_muxer_select="wav_muxer"
wav_demuxer_select="riffdec" wav_demuxer_select="riffdec"
wav_muxer_select="riffenc" wav_muxer_select="riffenc"
webm_chunk_muxer_select="webm_muxer" webm_chunk_muxer_select="webm_muxer"
webm_muxer_select="iso_media riffenc" webm_muxer_select="riffenc"
webm_dash_manifest_demuxer_select="matroska_demuxer" webm_dash_manifest_demuxer_select="matroska_demuxer"
wtv_demuxer_select="mpegts_demuxer riffdec" wtv_demuxer_select="mpegts_demuxer riffdec"
wtv_muxer_select="mpegts_muxer riffenc" wtv_muxer_select="mpegts_muxer riffenc"
@@ -3367,6 +3401,8 @@ alsa_outdev_deps="alsa"
avfoundation_indev_deps="avfoundation corevideo coremedia pthreads" avfoundation_indev_deps="avfoundation corevideo coremedia pthreads"
avfoundation_indev_suggest="coregraphics applicationservices" avfoundation_indev_suggest="coregraphics applicationservices"
avfoundation_indev_extralibs="-framework Foundation" avfoundation_indev_extralibs="-framework Foundation"
audiotoolbox_outdev_deps="audiotoolbox pthreads"
audiotoolbox_outdev_extralibs="-framework AudioToolbox -framework CoreAudio"
bktr_indev_deps_any="dev_bktr_ioctl_bt848_h machine_ioctl_bt848_h dev_video_bktr_ioctl_bt848_h dev_ic_bt8xx_h" bktr_indev_deps_any="dev_bktr_ioctl_bt848_h machine_ioctl_bt848_h dev_video_bktr_ioctl_bt848_h dev_ic_bt8xx_h"
caca_outdev_deps="libcaca" caca_outdev_deps="libcaca"
decklink_deps_any="libdl LoadLibrary" decklink_deps_any="libdl LoadLibrary"
@@ -3417,7 +3453,8 @@ ffrtmpcrypt_protocol_select="tcp_protocol"
ffrtmphttp_protocol_conflict="librtmp_protocol" ffrtmphttp_protocol_conflict="librtmp_protocol"
ffrtmphttp_protocol_select="http_protocol" ffrtmphttp_protocol_select="http_protocol"
ftp_protocol_select="tcp_protocol" ftp_protocol_select="tcp_protocol"
gopher_protocol_select="network" gopher_protocol_select="tcp_protocol"
gophers_protocol_select="tls_protocol"
http_protocol_select="tcp_protocol" http_protocol_select="tcp_protocol"
http_protocol_suggest="zlib" http_protocol_suggest="zlib"
httpproxy_protocol_select="tcp_protocol" httpproxy_protocol_select="tcp_protocol"
@@ -3458,6 +3495,8 @@ unix_protocol_select="network"
# external library protocols # external library protocols
libamqp_protocol_deps="librabbitmq" libamqp_protocol_deps="librabbitmq"
libamqp_protocol_select="network" libamqp_protocol_select="network"
librist_protocol_deps="librist"
librist_protocol_select="network"
librtmp_protocol_deps="librtmp" librtmp_protocol_deps="librtmp"
librtmpe_protocol_deps="librtmp" librtmpe_protocol_deps="librtmp"
librtmps_protocol_deps="librtmp" librtmps_protocol_deps="librtmp"
@@ -3480,6 +3519,7 @@ afir_filter_deps="avcodec"
afir_filter_select="rdft" afir_filter_select="rdft"
amovie_filter_deps="avcodec avformat" amovie_filter_deps="avcodec avformat"
aresample_filter_deps="swresample" aresample_filter_deps="swresample"
asoftclip_filter_deps="swresample"
asr_filter_deps="pocketsphinx" asr_filter_deps="pocketsphinx"
ass_filter_deps="libass" ass_filter_deps="libass"
atempo_filter_deps="avcodec" atempo_filter_deps="avcodec"
@@ -3515,7 +3555,6 @@ derain_filter_select="dnn"
deshake_filter_select="pixelutils" deshake_filter_select="pixelutils"
deshake_opencl_filter_deps="opencl" deshake_opencl_filter_deps="opencl"
dilation_opencl_filter_deps="opencl" dilation_opencl_filter_deps="opencl"
dnn_processing_filter_deps="swscale"
dnn_processing_filter_select="dnn" dnn_processing_filter_select="dnn"
drawtext_filter_deps="libfreetype" drawtext_filter_deps="libfreetype"
drawtext_filter_suggest="libfontconfig libfribidi" drawtext_filter_suggest="libfontconfig libfribidi"
@@ -4236,7 +4275,7 @@ case "$toolchain" in
ld_default="$source_path/compat/windows/mslink" ld_default="$source_path/compat/windows/mslink"
nm_default="dumpbin.exe -symbols" nm_default="dumpbin.exe -symbols"
ar_default="lib.exe" ar_default="lib.exe"
case "$arch" in case "${arch:-$arch_default}" in
aarch64|arm64) aarch64|arm64)
as_default="armasm64.exe" as_default="armasm64.exe"
;; ;;
@@ -5000,8 +5039,6 @@ elif enabled bfin; then
elif enabled mips; then elif enabled mips; then
cpuflags="-march=$cpu"
if [ "$cpu" != "generic" ]; then if [ "$cpu" != "generic" ]; then
disable mips32r2 disable mips32r2
disable mips32r5 disable mips32r5
@@ -5010,81 +5047,40 @@ elif enabled mips; then
disable mips64r6 disable mips64r6
disable loongson2 disable loongson2
disable loongson3 disable loongson3
disable mipsdsp
disable mipsdspr2
cpuflags="-march=$cpu"
case $cpu in case $cpu in
24kc|24kf*|24kec|34kc|1004kc|24kef*|34kf*|1004kf*|74kc|74kf) # General ISA levels
mips1|mips3)
;;
mips32r2)
enable mips32r2 enable mips32r2
disable msa
;; ;;
p5600|i6400|p6600) mips32r5)
disable mipsdsp enable mips32r2
disable mipsdspr2 enable mips32r5
;; ;;
loongson*) mips64r2|mips64r5)
enable loongson2 enable mips64r2
enable loongson3 enable loongson3
enable local_aligned
enable simd_align_16
enable fast_64bit
enable fast_clz
enable fast_cmov
enable fast_unaligned
disable aligned_stack
disable mipsdsp
disable mipsdspr2
# When gcc version less than 5.3.0, add -fno-expensive-optimizations flag.
if [ $cc == gcc ]; then
gcc_version=$(gcc -dumpversion)
if [ "$(echo "$gcc_version 5.3.0" | tr " " "\n" | sort -rV | head -n 1)" == "$gcc_version" ]; then
expensive_optimization_flag=""
else
expensive_optimization_flag="-fno-expensive-optimizations"
fi
fi
case $cpu in
loongson3*)
cpuflags="-march=loongson3a -mhard-float $expensive_optimization_flag"
;;
loongson2e)
cpuflags="-march=loongson2e -mhard-float $expensive_optimization_flag"
;;
loongson2f)
cpuflags="-march=loongson2f -mhard-float $expensive_optimization_flag"
;;
esac
;; ;;
*) # Cores from MIPS(MTI)
# Unknown CPU. Disable everything.
warn "unknown CPU. Disabling all MIPS optimizations."
disable mipsfpu
disable mipsdsp
disable mipsdspr2
disable msa
disable mmi
;;
esac
case $cpu in
24kc) 24kc)
disable mipsfpu disable mipsfpu
disable mipsdsp enable mips32r2
disable mipsdspr2
;; ;;
24kf*) 24kf*|24kec|34kc|74Kc|1004kc)
disable mipsdsp enable mips32r2
disable mipsdspr2
;;
24kec|34kc|1004kc)
disable mipsfpu
disable mipsdspr2
;; ;;
24kef*|34kf*|1004kf*) 24kef*|34kf*|1004kf*)
disable mipsdspr2 enable mipsdsp
;; enable mips32r2
74kc)
disable mipsfpu
;; ;;
p5600) p5600)
enable mips32r2
enable mips32r5 enable mips32r5
check_cflags "-mtune=p5600" && check_cflags "-msched-weight -mload-store-pairs -funroll-loops" check_cflags "-mtune=p5600" && check_cflags "-msched-weight -mload-store-pairs -funroll-loops"
;; ;;
@@ -5096,9 +5092,51 @@ elif enabled mips; then
enable mips64r6 enable mips64r6
check_cflags "-mtune=p6600 -mabi=64" && check_cflags "-msched-weight -mload-store-pairs -funroll-loops" && check_ldflags "-mabi=64" check_cflags "-mtune=p6600 -mabi=64" && check_cflags "-msched-weight -mload-store-pairs -funroll-loops" && check_ldflags "-mabi=64"
;; ;;
# Cores from Loongson
loongson2e|loongson2f|loongson3*)
enable local_aligned
enable simd_align_16
enable fast_64bit
enable fast_clz
enable fast_cmov
enable fast_unaligned
disable aligned_stack
# When gcc version less than 5.3.0, add -fno-expensive-optimizations flag.
if test "$cc_type" = "gcc"; then
case $gcc_basever in
2|2.*|3.*|4.*|5.0|5.1|5.2)
expensive_optimization_flag="-fno-expensive-optimizations"
;;
*)
expensive_optimization_flag=""
;;
esac
fi
case $cpu in
loongson3*)
enable loongson3
cpuflags="-march=loongson3a -mhard-float $expensive_optimization_flag"
;;
loongson2e)
enable loongson2
cpuflags="-march=loongson2e -mhard-float $expensive_optimization_flag"
;;
loongson2f)
enable loongson2
cpuflags="-march=loongson2f -mhard-float $expensive_optimization_flag"
;;
esac
;;
*)
warn "unknown MIPS CPU"
;;
esac esac
else else
# We do not disable anything. Is up to the user to disable the unwanted features. disable mipsdsp
disable mipsdspr2
# Disable DSP stuff for generic CPU, it can't be detected at runtime.
warn 'generic cpu selected' warn 'generic cpu selected'
fi fi
@@ -5845,28 +5883,42 @@ EOF
elif enabled mips; then elif enabled mips; then
enabled loongson2 && check_inline_asm loongson2 '"dmult.g $8, $9, $10"' # Check toolchain ISA level
enabled loongson3 && check_inline_asm loongson3 '"gsldxc1 $f0, 0($2, $3)"'
enabled mmi && check_inline_asm mmi '"punpcklhw $f0, $f0, $f0"'
# Enable minimum ISA based on selected options
if enabled mips64; then if enabled mips64; then
enabled mips64r6 && check_inline_asm_flags mips64r6 '"dlsa $0, $0, $0, 1"' '-mips64r6' enabled mips64r6 && check_inline_asm mips64r6 '"dlsa $0, $0, $0, 1"' &&
enabled mips64r2 && check_inline_asm_flags mips64r2 '"dext $0, $0, 0, 1"' '-mips64r2' disable mips64r2
disabled mips64r6 && disabled mips64r2 && check_inline_asm_flags mips64r1 '"daddi $0, $0, 0"' '-mips64'
enabled mips64r2 && check_inline_asm mips64r2 '"dext $0, $0, 0, 1"'
disable mips32r6 && disable mips32r5 && disable mips32r2
else else
enabled mips32r6 && check_inline_asm_flags mips32r6 '"aui $0, $0, 0"' '-mips32r6' enabled mips32r6 && check_inline_asm mips32r6 '"aui $0, $0, 0"' &&
enabled mips32r5 && check_inline_asm_flags mips32r5 '"eretnc"' '-mips32r5' disable mips32r5 && disable mips32r2
enabled mips32r2 && check_inline_asm_flags mips32r2 '"ext $0, $0, 0, 1"' '-mips32r2'
disabled mips32r6 && disabled mips32r5 && disabled mips32r2 && check_inline_asm_flags mips32r1 '"addi $0, $0, 0"' '-mips32' enabled mips32r5 && check_inline_asm mips32r5 '"eretnc"'
enabled mips32r2 && check_inline_asm mips32r2 '"ext $0, $0, 0, 1"'
disable mips64r6 && disable mips64r5 && disable mips64r2
fi fi
enabled mipsfpu && check_inline_asm_flags mipsfpu '"cvt.d.l $f0, $f2"' '-mhard-float' enabled mipsfpu && check_inline_asm mipsfpu '"cvt.d.l $f0, $f2"'
enabled mipsfpu && (enabled mips32r5 || enabled mips32r6 || enabled mips64r6) && check_inline_asm_flags mipsfpu '"cvt.d.l $f0, $f1"' '-mfp64' enabled mipsfpu && (enabled mips32r5 || enabled mips32r6 || enabled mips64r6) && check_inline_asm_flags mipsfpu '"cvt.d.l $f0, $f1"' '-mfp64'
enabled mipsfpu && enabled msa && check_inline_asm_flags msa '"addvi.b $w0, $w1, 1"' '-mmsa' && check_headers msa.h || disable msa
enabled mipsdsp && check_inline_asm_flags mipsdsp '"addu.qb $t0, $t1, $t2"' '-mdsp' enabled mipsdsp && check_inline_asm_flags mipsdsp '"addu.qb $t0, $t1, $t2"' '-mdsp'
enabled mipsdspr2 && check_inline_asm_flags mipsdspr2 '"absq_s.qb $t0, $t1"' '-mdspr2' enabled mipsdspr2 && check_inline_asm_flags mipsdspr2 '"absq_s.qb $t0, $t1"' '-mdspr2'
enabled msa && enabled msa2 && check_inline_asm_flags msa2 '"nxbits.any.b $w0, $w0"' '-mmsa2' && check_headers msa2.h || disable msa2
# MSA and MSA2 can be detected at runtime so we supply extra flags here
enabled mipsfpu && enabled msa && check_inline_asm msa '"addvi.b $w0, $w1, 1"' '-mmsa' && append MSAFLAGS '-mmsa'
enabled msa && enabled msa2 && check_inline_asm msa2 '"nxbits.any.b $w0, $w0"' '-mmsa2' && append MSAFLAGS '-mmsa2'
# loongson2 have no switch cflag so we can only probe toolchain ability
enabled loongson2 && check_inline_asm loongson2 '"dmult.g $8, $9, $10"' && disable loongson3
# loongson3 is paired with MMI
enabled loongson3 && check_inline_asm loongson3 '"gsldxc1 $f0, 0($2, $3)"' '-mloongson-ext' && append MMIFLAGS '-mloongson-ext'
# MMI can be detected at runtime too
enabled mmi && check_inline_asm mmi '"punpcklhw $f0, $f0, $f0"' '-mloongson-mmi' && append MMIFLAGS '-mloongson-mmi'
if enabled bigendian && enabled msa; then if enabled bigendian && enabled msa; then
disable msa disable msa
@@ -6108,6 +6160,9 @@ check_headers dxgidebug.h
check_headers dxva.h check_headers dxva.h
check_headers dxva2api.h -D_WIN32_WINNT=0x0600 check_headers dxva2api.h -D_WIN32_WINNT=0x0600
check_headers io.h check_headers io.h
enabled libdrm &&
check_headers linux/dma-buf.h
check_headers linux/perf_event.h check_headers linux/perf_event.h
check_headers libcrystalhd/libcrystalhd_if.h check_headers libcrystalhd/libcrystalhd_if.h
check_headers malloc.h check_headers malloc.h
@@ -6152,6 +6207,7 @@ enabled videotoolbox && check_apple_framework VideoToolbox
check_apple_framework CoreFoundation check_apple_framework CoreFoundation
check_apple_framework CoreMedia check_apple_framework CoreMedia
check_apple_framework CoreVideo check_apple_framework CoreVideo
check_apple_framework CoreAudio
enabled avfoundation && { enabled avfoundation && {
disable coregraphics applicationservices disable coregraphics applicationservices
@@ -6161,6 +6217,7 @@ enabled avfoundation && {
enabled videotoolbox && { enabled videotoolbox && {
check_lib coreservices CoreServices/CoreServices.h UTGetOSTypeFromString "-framework CoreServices" check_lib coreservices CoreServices/CoreServices.h UTGetOSTypeFromString "-framework CoreServices"
check_func_headers CoreMedia/CMFormatDescription.h kCMVideoCodecType_HEVC "-framework CoreMedia" check_func_headers CoreMedia/CMFormatDescription.h kCMVideoCodecType_HEVC "-framework CoreMedia"
check_func_headers CoreMedia/CMFormatDescription.h kCMVideoCodecType_HEVCWithAlpha "-framework CoreMedia"
check_func_headers CoreVideo/CVPixelBuffer.h kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange "-framework CoreVideo" check_func_headers CoreVideo/CVPixelBuffer.h kCVPixelFormatType_420YpCbCr10BiPlanarVideoRange "-framework CoreVideo"
check_func_headers CoreVideo/CVImageBuffer.h kCVImageBufferTransferFunction_SMPTE_ST_2084_PQ "-framework CoreVideo" check_func_headers CoreVideo/CVImageBuffer.h kCVImageBufferTransferFunction_SMPTE_ST_2084_PQ "-framework CoreVideo"
check_func_headers CoreVideo/CVImageBuffer.h kCVImageBufferTransferFunction_ITU_R_2100_HLG "-framework CoreVideo" check_func_headers CoreVideo/CVImageBuffer.h kCVImageBufferTransferFunction_ITU_R_2100_HLG "-framework CoreVideo"
@@ -6169,6 +6226,7 @@ enabled videotoolbox && {
check_struct "sys/time.h sys/resource.h" "struct rusage" ru_maxrss check_struct "sys/time.h sys/resource.h" "struct rusage" ru_maxrss
check_type "windows.h dxva.h" "DXVA_PicParams_AV1" -DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP -D_CRT_BUILD_DESKTOP_APP=0
check_type "windows.h dxva.h" "DXVA_PicParams_HEVC" -DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP -D_CRT_BUILD_DESKTOP_APP=0 check_type "windows.h dxva.h" "DXVA_PicParams_HEVC" -DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP -D_CRT_BUILD_DESKTOP_APP=0
check_type "windows.h dxva.h" "DXVA_PicParams_VP9" -DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP -D_CRT_BUILD_DESKTOP_APP=0 check_type "windows.h dxva.h" "DXVA_PicParams_VP9" -DWINAPI_FAMILY=WINAPI_FAMILY_DESKTOP_APP -D_CRT_BUILD_DESKTOP_APP=0
check_type "windows.h d3d11.h" "ID3D11VideoDecoder" check_type "windows.h d3d11.h" "ID3D11VideoDecoder"
@@ -6192,7 +6250,7 @@ fi
if enabled cuda_nvcc; then if enabled cuda_nvcc; then
nvccflags="$nvccflags -ptx" nvccflags="$nvccflags -ptx"
else else
nvccflags="$nvccflags -S -nocudalib -nocudainc --cuda-device-only -include ${source_link}/compat/cuda/cuda_runtime.h" nvccflags="$nvccflags -S -nocudalib -nocudainc --cuda-device-only -Wno-c++11-narrowing -include ${source_link}/compat/cuda/cuda_runtime.h"
check_nvcc cuda_llvm check_nvcc cuda_llvm
fi fi
@@ -6275,7 +6333,7 @@ enabled avisynth && require_headers "avisynth/avisynth_c.h"
enabled cuda_nvcc && { check_nvcc cuda_nvcc || die "ERROR: failed checking for nvcc."; } enabled cuda_nvcc && { check_nvcc cuda_nvcc || die "ERROR: failed checking for nvcc."; }
enabled chromaprint && require chromaprint chromaprint.h chromaprint_get_version -lchromaprint enabled chromaprint && require chromaprint chromaprint.h chromaprint_get_version -lchromaprint
enabled decklink && { require_headers DeckLinkAPI.h && enabled decklink && { require_headers DeckLinkAPI.h &&
{ test_cpp_condition DeckLinkAPIVersion.h "BLACKMAGIC_DECKLINK_API_VERSION >= 0x0a090500" || die "ERROR: Decklink API version must be >= 10.9.5."; } } { test_cpp_condition DeckLinkAPIVersion.h "BLACKMAGIC_DECKLINK_API_VERSION >= 0x0a0a0000" || die "ERROR: Decklink API version must be >= 10.10"; } }
enabled frei0r && require_headers "frei0r.h dlfcn.h" enabled frei0r && require_headers "frei0r.h dlfcn.h"
enabled gmp && require gmp gmp.h mpz_export -lgmp enabled gmp && require gmp gmp.h mpz_export -lgmp
enabled gnutls && require_pkg_config gnutls gnutls gnutls/gnutls.h gnutls_global_init enabled gnutls && require_pkg_config gnutls gnutls gnutls/gnutls.h gnutls_global_init
@@ -6295,7 +6353,7 @@ enabled libcelt && require libcelt celt/celt.h celt_decode -lcelt0 &&
die "ERROR: libcelt must be installed and version must be >= 0.11.0."; } die "ERROR: libcelt must be installed and version must be >= 0.11.0."; }
enabled libcaca && require_pkg_config libcaca caca caca.h caca_create_canvas enabled libcaca && require_pkg_config libcaca caca caca.h caca_create_canvas
enabled libcodec2 && require libcodec2 codec2/codec2.h codec2_create -lcodec2 enabled libcodec2 && require libcodec2 codec2/codec2.h codec2_create -lcodec2
enabled libdav1d && require_pkg_config libdav1d "dav1d >= 0.4.0" "dav1d/dav1d.h" dav1d_version enabled libdav1d && require_pkg_config libdav1d "dav1d >= 0.5.0" "dav1d/dav1d.h" dav1d_version
enabled libdavs2 && require_pkg_config libdavs2 "davs2 >= 1.6.0" davs2.h davs2_decoder_open enabled libdavs2 && require_pkg_config libdavs2 "davs2 >= 1.6.0" davs2.h davs2_decoder_open
enabled libdc1394 && require_pkg_config libdc1394 libdc1394-2 dc1394/dc1394.h dc1394_new enabled libdc1394 && require_pkg_config libdc1394 libdc1394-2 dc1394/dc1394.h dc1394_new
enabled libdrm && require_pkg_config libdrm libdrm xf86drm.h drmGetVersion enabled libdrm && require_pkg_config libdrm libdrm xf86drm.h drmGetVersion
@@ -6308,7 +6366,7 @@ enabled fontconfig && enable libfontconfig
enabled libfontconfig && require_pkg_config libfontconfig fontconfig "fontconfig/fontconfig.h" FcInit enabled libfontconfig && require_pkg_config libfontconfig fontconfig "fontconfig/fontconfig.h" FcInit
enabled libfreetype && require_pkg_config libfreetype freetype2 "ft2build.h FT_FREETYPE_H" FT_Init_FreeType enabled libfreetype && require_pkg_config libfreetype freetype2 "ft2build.h FT_FREETYPE_H" FT_Init_FreeType
enabled libfribidi && require_pkg_config libfribidi fribidi fribidi.h fribidi_version_info enabled libfribidi && require_pkg_config libfribidi fribidi fribidi.h fribidi_version_info
enabled libglslang && require_cpp libglslang glslang/SPIRV/GlslangToSpv.h "glslang::TIntermediate*" -lglslang -lOSDependent -lHLSL -lOGLCompiler -lSPVRemapper -lSPIRV -lSPIRV-Tools-opt -lSPIRV-Tools -lpthread -lstdc++ enabled libglslang && require_cpp libglslang glslang/SPIRV/GlslangToSpv.h "glslang::TIntermediate*" -lglslang -lMachineIndependent -lOSDependent -lHLSL -lOGLCompiler -lGenericCodeGen -lSPVRemapper -lSPIRV -lSPIRV-Tools-opt -lSPIRV-Tools -lpthread -lstdc++
enabled libgme && { check_pkg_config libgme libgme gme/gme.h gme_new_emu || enabled libgme && { check_pkg_config libgme libgme gme/gme.h gme_new_emu ||
require libgme gme/gme.h gme_new_emu -lgme -lstdc++; } require libgme gme/gme.h gme_new_emu -lgme -lstdc++; }
enabled libgsm && { for gsm_hdr in "gsm.h" "gsm/gsm.h"; do enabled libgsm && { for gsm_hdr in "gsm.h" "gsm/gsm.h"; do
@@ -6347,6 +6405,7 @@ enabled libopenh264 && require_pkg_config libopenh264 openh264 wels/codec_
enabled libopenjpeg && { check_pkg_config libopenjpeg "libopenjp2 >= 2.1.0" openjpeg.h opj_version || enabled libopenjpeg && { check_pkg_config libopenjpeg "libopenjp2 >= 2.1.0" openjpeg.h opj_version ||
{ require_pkg_config libopenjpeg "libopenjp2 >= 2.1.0" openjpeg.h opj_version -DOPJ_STATIC && add_cppflags -DOPJ_STATIC; } } { require_pkg_config libopenjpeg "libopenjp2 >= 2.1.0" openjpeg.h opj_version -DOPJ_STATIC && add_cppflags -DOPJ_STATIC; } }
enabled libopenmpt && require_pkg_config libopenmpt "libopenmpt >= 0.2.6557" libopenmpt/libopenmpt.h openmpt_module_create -lstdc++ && append libopenmpt_extralibs "-lstdc++" enabled libopenmpt && require_pkg_config libopenmpt "libopenmpt >= 0.2.6557" libopenmpt/libopenmpt.h openmpt_module_create -lstdc++ && append libopenmpt_extralibs "-lstdc++"
enabled libopenvino && require libopenvino c_api/ie_c_api.h ie_c_api_version -linference_engine_c_api
enabled libopus && { enabled libopus && {
enabled libopus_decoder && { enabled libopus_decoder && {
require_pkg_config libopus opus opus_multistream.h opus_multistream_decoder_create require_pkg_config libopus opus opus_multistream.h opus_multistream_decoder_create
@@ -6357,7 +6416,8 @@ enabled libopus && {
} }
enabled libpulse && require_pkg_config libpulse libpulse pulse/pulseaudio.h pa_context_new enabled libpulse && require_pkg_config libpulse libpulse pulse/pulseaudio.h pa_context_new
enabled librabbitmq && require_pkg_config librabbitmq "librabbitmq >= 0.7.1" amqp.h amqp_new_connection enabled librabbitmq && require_pkg_config librabbitmq "librabbitmq >= 0.7.1" amqp.h amqp_new_connection
enabled librav1e && require_pkg_config librav1e "rav1e >= 0.1.0" rav1e.h rav1e_context_new enabled librav1e && require_pkg_config librav1e "rav1e >= 0.4.0" rav1e.h rav1e_context_new
enabled librist && require_pkg_config librist "librist >= 0.2" librist/librist.h rist_receiver_create
enabled librsvg && require_pkg_config librsvg librsvg-2.0 librsvg-2.0/librsvg/rsvg.h rsvg_handle_render_cairo enabled librsvg && require_pkg_config librsvg librsvg-2.0 librsvg-2.0/librsvg/rsvg.h rsvg_handle_render_cairo
enabled librtmp && require_pkg_config librtmp librtmp librtmp/rtmp.h RTMP_Socket enabled librtmp && require_pkg_config librtmp librtmp librtmp/rtmp.h RTMP_Socket
enabled librubberband && require_pkg_config librubberband "rubberband >= 1.8.1" rubberband/rubberband-c.h rubberband_new -lstdc++ && append librubberband_extralibs "-lstdc++" enabled librubberband && require_pkg_config librubberband "rubberband >= 1.8.1" rubberband/rubberband-c.h rubberband_new -lstdc++ && append librubberband_extralibs "-lstdc++"
@@ -6369,6 +6429,7 @@ enabled libsoxr && require libsoxr soxr.h soxr_create -lsoxr
enabled libssh && require_pkg_config libssh libssh libssh/sftp.h sftp_init enabled libssh && require_pkg_config libssh libssh libssh/sftp.h sftp_init
enabled libspeex && require_pkg_config libspeex speex speex/speex.h speex_decoder_init enabled libspeex && require_pkg_config libspeex speex speex/speex.h speex_decoder_init
enabled libsrt && require_pkg_config libsrt "srt >= 1.3.0" srt/srt.h srt_socket enabled libsrt && require_pkg_config libsrt "srt >= 1.3.0" srt/srt.h srt_socket
enabled libsvtav1 && require_pkg_config libsvtav1 "SvtAv1Enc >= 0.8.4" EbSvtAv1Enc.h svt_av1_enc_init_handle
enabled libtensorflow && require libtensorflow tensorflow/c/c_api.h TF_Version -ltensorflow enabled libtensorflow && require libtensorflow tensorflow/c/c_api.h TF_Version -ltensorflow
enabled libtesseract && require_pkg_config libtesseract tesseract tesseract/capi.h TessBaseAPICreate enabled libtesseract && require_pkg_config libtesseract tesseract tesseract/capi.h TessBaseAPICreate
enabled libtheora && require libtheora theora/theoraenc.h th_info_init -ltheoraenc -ltheoradec -logg enabled libtheora && require libtheora theora/theoraenc.h th_info_init -ltheoraenc -ltheoradec -logg
@@ -6376,9 +6437,10 @@ enabled libtls && require_pkg_config libtls libtls tls.h tls_configur
enabled libtwolame && require libtwolame twolame.h twolame_init -ltwolame && enabled libtwolame && require libtwolame twolame.h twolame_init -ltwolame &&
{ check_lib libtwolame twolame.h twolame_encode_buffer_float32_interleaved -ltwolame || { check_lib libtwolame twolame.h twolame_encode_buffer_float32_interleaved -ltwolame ||
die "ERROR: libtwolame must be installed and version must be >= 0.3.10"; } die "ERROR: libtwolame must be installed and version must be >= 0.3.10"; }
enabled libuavs3d && require_pkg_config libuavs3d "uavs3d >= 1.1.41" uavs3d.h uavs3d_decode
enabled libv4l2 && require_pkg_config libv4l2 libv4l2 libv4l2.h v4l2_ioctl enabled libv4l2 && require_pkg_config libv4l2 libv4l2 libv4l2.h v4l2_ioctl
enabled libvidstab && require_pkg_config libvidstab "vidstab >= 0.98" vid.stab/libvidstab.h vsMotionDetectInit enabled libvidstab && require_pkg_config libvidstab "vidstab >= 0.98" vid.stab/libvidstab.h vsMotionDetectInit
enabled libvmaf && require_pkg_config libvmaf "libvmaf >= 1.3.9" libvmaf.h compute_vmaf enabled libvmaf && require_pkg_config libvmaf "libvmaf >= 1.5.2" libvmaf.h compute_vmaf
enabled libvo_amrwbenc && require libvo_amrwbenc vo-amrwbenc/enc_if.h E_IF_init -lvo-amrwbenc enabled libvo_amrwbenc && require libvo_amrwbenc vo-amrwbenc/enc_if.h E_IF_init -lvo-amrwbenc
enabled libvorbis && require_pkg_config libvorbis vorbis vorbis/codec.h vorbis_info_init && enabled libvorbis && require_pkg_config libvorbis vorbis vorbis/codec.h vorbis_info_init &&
require_pkg_config libvorbisenc vorbisenc vorbis/vorbisenc.h vorbis_encode_init require_pkg_config libvorbisenc vorbisenc vorbis/vorbisenc.h vorbis_encode_init
@@ -6405,7 +6467,6 @@ enabled libvpx && {
fi fi
} }
enabled libwavpack && require libwavpack wavpack/wavpack.h WavpackOpenFileOutput -lwavpack
enabled libwebp && { enabled libwebp && {
enabled libwebp_encoder && require_pkg_config libwebp "libwebp >= 0.2.0" webp/encode.h WebPGetEncoderVersion enabled libwebp_encoder && require_pkg_config libwebp "libwebp >= 0.2.0" webp/encode.h WebPGetEncoderVersion
enabled libwebp_anim_encoder && check_pkg_config libwebp_anim_encoder "libwebpmux >= 0.4.0" webp/mux.h WebPAnimEncoderOptionsInit; } enabled libwebp_anim_encoder && check_pkg_config libwebp_anim_encoder "libwebpmux >= 0.4.0" webp/mux.h WebPAnimEncoderOptionsInit; }
@@ -6624,6 +6685,9 @@ test_cpp <<EOF && enable uwp && d3d11va_extralibs="-ldxgi -ld3d11"
#endif #endif
EOF EOF
enabled libdrm &&
check_pkg_config libdrm_getfb2 libdrm "xf86drmMode.h" drmModeGetFB2
enabled vaapi && enabled vaapi &&
check_pkg_config vaapi "libva >= 0.35.0" "va/va.h" vaInitialize check_pkg_config vaapi "libva >= 0.35.0" "va/va.h" vaInitialize
@@ -6638,6 +6702,7 @@ if enabled vaapi; then
check_type "va/va.h va/va_dec_hevc.h" "VAPictureParameterBufferHEVC" check_type "va/va.h va/va_dec_hevc.h" "VAPictureParameterBufferHEVC"
check_struct "va/va.h" "VADecPictureParameterBufferVP9" bit_depth check_struct "va/va.h" "VADecPictureParameterBufferVP9" bit_depth
check_struct "va/va.h" "VADecPictureParameterBufferAV1" bit_depth_idx
check_type "va/va.h va/va_vpp.h" "VAProcFilterParameterBufferHDRToneMapping" check_type "va/va.h va/va_vpp.h" "VAProcFilterParameterBufferHDRToneMapping"
check_struct "va/va.h va/va_vpp.h" "VAProcPipelineCaps" rotation_flags check_struct "va/va.h va/va_vpp.h" "VAProcPipelineCaps" rotation_flags
check_type "va/va.h va/va_enc_hevc.h" "VAEncPictureParameterBufferHEVC" check_type "va/va.h va/va_enc_hevc.h" "VAEncPictureParameterBufferHEVC"
@@ -6713,6 +6778,10 @@ void f(void) { struct { const GUID guid; } s[] = { { NV_ENC_PRESET_HQ_GUID } };
int main(void) { return 0; } int main(void) { return 0; }
EOF EOF
if enabled_any nvdec cuvid; then
check_type "ffnvcodec/dynlink_cuda.h ffnvcodec/dynlink_cuviddec.h" "CUVIDAV1PICPARAMS"
fi
enabled amf && enabled amf &&
check_cpp_condition amf "AMF/core/Version.h" \ check_cpp_condition amf "AMF/core/Version.h" \
"(AMF_VERSION_MAJOR << 48 | AMF_VERSION_MINOR << 32 | AMF_VERSION_RELEASE << 16 | AMF_VERSION_BUILD_NUM) >= 0x0001000400090000" "(AMF_VERSION_MAJOR << 48 | AMF_VERSION_MINOR << 32 | AMF_VERSION_RELEASE << 16 | AMF_VERSION_BUILD_NUM) >= 0x0001000400090000"
@@ -7440,6 +7509,8 @@ LDSOFLAGS=$LDSOFLAGS
SHFLAGS=$(echo $($ldflags_filter $SHFLAGS)) SHFLAGS=$(echo $($ldflags_filter $SHFLAGS))
ASMSTRIPFLAGS=$ASMSTRIPFLAGS ASMSTRIPFLAGS=$ASMSTRIPFLAGS
X86ASMFLAGS=$X86ASMFLAGS X86ASMFLAGS=$X86ASMFLAGS
MSAFLAGS=$MSAFLAGS
MMIFLAGS=$MMIFLAGS
BUILDSUF=$build_suffix BUILDSUF=$build_suffix
PROGSSUF=$progs_suffix PROGSSUF=$progs_suffix
FULLNAME=$FULLNAME FULLNAME=$FULLNAME
@@ -7517,6 +7588,7 @@ cat > $TMPH <<EOF
#define FFMPEG_DATADIR "$(eval c_escape $datadir)" #define FFMPEG_DATADIR "$(eval c_escape $datadir)"
#define AVCONV_DATADIR "$(eval c_escape $datadir)" #define AVCONV_DATADIR "$(eval c_escape $datadir)"
#define CC_IDENT "$(c_escape ${cc_ident:-Unknown compiler})" #define CC_IDENT "$(c_escape ${cc_ident:-Unknown compiler})"
#define OS_NAME $target_os
#define av_restrict $restrict_keyword #define av_restrict $restrict_keyword
#define EXTERN_PREFIX "${extern_prefix}" #define EXTERN_PREFIX "${extern_prefix}"
#define EXTERN_ASM ${extern_prefix} #define EXTERN_ASM ${extern_prefix}
+128
View File
@@ -15,6 +15,134 @@ libavutil: 2017-10-21
API changes, most recent first: API changes, most recent first:
-------- 8< --------- FFmpeg 4.4 was cut here -------- 8< ---------
2021-03-19 - e8c0bca6bd - lavu 56.69.100 - adler32.h
Added a typedef for the type of the Adler-32 checksums
used by av_adler32_update(). It will be changed to uint32_t
at the next major bump.
The type of the parameter for the length of the input buffer
will also be changed to size_t at the next major bump.
2021-03-19 - e318438f2f - lavf 58.75.100 - avformat.h
AVChapter.id will be changed from int to int64_t
on the next major version bump.
2021-03-17 - f7db77bd87 - lavc 58.133.100 - codec.h
Deprecated av_init_packet(). Once removed, sizeof(AVPacket) will
no longer be a part of the public ABI.
Deprecated AVPacketList.
2021-03-16 - 7d09579190 - lavc 58.132.100 - codec.h
Add AV_CODEC_CAP_OTHER_THREADS as a new name for
AV_CODEC_CAP_AUTO_THREADS. AV_CODEC_CAP_AUTO_THREADS
is now deprecated.
2021-03-12 - 6e7e3a3820 - lavc 58.131.100 - avcodec.h codec.h
Add a get_encode_buffer callback to AVCodecContext, similar to
get_buffer2 but for encoders.
Add avcodec_default_get_encode_buffer().
Add AV_GET_ENCODE_BUFFER_FLAG_REF.
Encoders may now be flagged as AV_CODEC_CAP_DR1 capable.
2021-03-10 - 42e68fe015 - lavf 58.72.100 - avformat.h
Change AVBufferRef related AVStream function and struct size
parameter and fields type to size_t at next major bump.
2021-03-10 - d79e0fe65c - lavc 58.130.100 - packet.h
Change AVBufferRef related AVPacket function and struct size
parameter and fields type to size_t at next major bump.
2021-03-10 - 14040a1d91 - lavu 56.68.100 - buffer.h frame.h
Change AVBufferRef and relevant AVFrame function and struct size
parameter and fields type to size_t at next major bump.
2021-03-04 - a0eec776b6 - lavc 58.128.101 - avcodec.h
Enable err_recognition to be set for encoders.
2021-03-03 - 2ff40b98ec - lavf 58.70.100 - avformat.h
Deprecate AVFMT_FLAG_PRIV_OPT. It will do nothing
as soon as av_demuxer_open() is removed.
2021-02-27 - dd9227e48f - lavc 58.126.100 - avcodec.h
Deprecated avcodec_get_frame_class().
2021-02-21 - 5ca40d6d94 - lavu 56.66.100 - tx.h
Add enum AVTXFlags and AVTXFlags.AV_TX_INPLACE
2021-02-14 - 4f49ca7bbc - lavd 58.12.100 - avdevice.h
Deprecated avdevice_capabilities_create() and
avdevice_capabilities_free().
2021-02-10 - 1bda9bb68a - lavu 56.65.100 - common.h
Add FFABS64U()
2021-01-26 - 5dd9567080 - lavu 56.64.100 - common.h
Add FFABSU()
2021-01-25 - 56709ca8aa - lavc 58.119.100 - avcodec.h
Deprecate AVCodecContext.debug_mv, FF_DEBUG_VIS_MV_P_FOR, FF_DEBUG_VIS_MV_B_FOR,
FF_DEBUG_VIS_MV_B_BACK
2021-01-11 - ebdd33086a - lavc 58.116.100 - avcodec.h
Add FF_PROFILE_VVC_MAIN_10 and FF_PROFILE_VVC_MAIN_10_444.
2020-01-01 - baecaa16c1 - lavu 56.63.100 - video_enc_params.h
Add AV_VIDEO_ENC_PARAMS_MPEG2
2020-12-03 - eca12f4d5a - lavu 56.62.100 - timecode.h
Add av_timecode_init_from_components.
2020-11-27 - a83098ab03 - lavc 58.114.100 - avcodec.h
Deprecate AVCodecContext.thread_safe_callbacks. Starting with
LIBAVCODEC_VERSION_MAJOR=60, user callbacks must always be
thread-safe when frame threading is used.
2020-11-25 - d243dd540a - lavc 58.113.100 - avcodec.h
Adds a new flag AV_CODEC_EXPORT_DATA_FILM_GRAIN for export_side_data.
2020-11-25 - 4f9ee87253 - lavu 56.61.100 - film_grain_params.h
Adds a new API for extracting codec film grain parameters as side data.
Adds a new AVFrameSideDataType entry AV_FRAME_DATA_FILM_GRAIN_PARAMS for it.
2020-10-28 - f95d9510ff - lavf 58.64.100 - avformat.h
Add AVSTREAM_EVENT_FLAG_NEW_PACKETS.
2020-09-28 - 68918d3b7f - lavu 56.60.100 - buffer.h
Add a av_buffer_replace() convenience function.
2020-09-13 - 837b6eb90e - lavu 56.59.100 - timecode.h
Add av_timecode_make_smpte_tc_string2.
2020-08-21 - 06f2651204 - lavu 56.58.100 - avstring.h
Deprecate av_d2str(). Use av_asprintf() instead.
2020-08-04 - 34de0abbe7 - lavu 56.58.100 - channel_layout.h
Add AV_CH_LAYOUT_22POINT2 together with its newly required pieces:
AV_CH_TOP_SIDE_LEFT, AV_CH_TOP_SIDE_RIGHT, AV_CH_BOTTOM_FRONT_CENTER,
AV_CH_BOTTOM_FRONT_LEFT, AV_CH_BOTTOM_FRONT_RIGHT.
2020-07-23 - 84655b7101 - lavu 56.57.100 - cpu.h
Add AV_CPU_FLAG_MMI and AV_CPU_FLAG_MSA.
2020-07-22 - 3a8e927176 - lavu 56.56.100 - imgutils.h
Add av_image_fill_plane_sizes().
2020-07-15 - 448a9aaa78 - lavc 58.96.100 - packet.h
Add AV_PKT_DATA_S12M_TIMECODE.
2020-06-12 - b09fb030c1 - lavu 56.55.100 - pixdesc.h
Add AV_PIX_FMT_X2RGB10.
2020-06-11 - bc8ab084fb - lavu 56.54.100 - frame.h
Add AV_FRAME_DATA_SEI_UNREGISTERED.
2020-06-10 - 1b4a98b029 - lavu 56.53.100 - log.h opt.h
Add av_opt_child_class_iterate() and AVClass.child_class_iterate().
Deprecate av_opt_child_class_next() and AVClass.child_class_next().
-------- 8< --------- FFmpeg 4.3 was cut here -------- 8< ---------
2020-06-05 - ec39c2276a - lavu 56.50.100 - buffer.h 2020-06-05 - ec39c2276a - lavu 56.50.100 - buffer.h
Passing NULL as alloc argument to av_buffer_pool_init2() is now allowed. Passing NULL as alloc argument to av_buffer_pool_init2() is now allowed.
+1 -1
View File
@@ -38,7 +38,7 @@ PROJECT_NAME = FFmpeg
# could be handy for archiving the generated documentation or if some version # could be handy for archiving the generated documentation or if some version
# control system is used. # control system is used.
PROJECT_NUMBER = 4.3.2 PROJECT_NUMBER = 4.4
# Using the PROJECT_BRIEF tag one can provide an optional one line description # Using the PROJECT_BRIEF tag one can provide an optional one line description
# for a project that appears at the top of each page and should give viewer a # for a project that appears at the top of each page and should give viewer a
+57
View File
@@ -675,6 +675,63 @@ Remove extradata from all frames.
@end table @end table
@end table @end table
@section setts
Set PTS and DTS in packets.
It accepts the following parameters:
@table @option
@item ts
@item pts
@item dts
Set expressions for PTS, DTS or both.
@end table
The expressions are evaluated through the eval API and can contain the following
constants:
@table @option
@item N
The count of the input packet. Starting from 0.
@item TS
The demux timestamp in input in case of @code{ts} or @code{dts} option or presentation
timestamp in case of @code{pts} option.
@item POS
The original position in the file of the packet, or undefined if undefined
for the current packet
@item DTS
The demux timestamp in input.
@item PTS
The presentation timestamp in input.
@item STARTDTS
The DTS of the first packet.
@item STARTPTS
The PTS of the first packet.
@item PREV_INDTS
The previous input DTS.
@item PREV_INPTS
The previous input PTS.
@item PREV_OUTDTS
The previous output DTS.
@item PREV_OUTPTS
The previous output PTS.
@item TB
The timebase of stream packet belongs.
@item SR
The sample rate of stream packet belongs.
@end table
@anchor{text2movsub} @anchor{text2movsub}
@section text2movsub @section text2movsub
+13 -121
View File
@@ -50,8 +50,6 @@ Use internal 2pass ratecontrol in first pass mode.
Use internal 2pass ratecontrol in second pass mode. Use internal 2pass ratecontrol in second pass mode.
@item gray @item gray
Only decode/encode grayscale. Only decode/encode grayscale.
@item emu_edge
Do not draw edges.
@item psnr @item psnr
Set error[?] variables during encoding. Set error[?] variables during encoding.
@item truncated @item truncated
@@ -72,10 +70,6 @@ This ensures that file and data checksums are reproducible and match between
platforms. Its primary use is for regression testing. platforms. Its primary use is for regression testing.
@item aic @item aic
Apply H263 advanced intra coding / mpeg4 ac prediction. Apply H263 advanced intra coding / mpeg4 ac prediction.
@item cbp
Deprecated, use mpegvideo private options instead.
@item qprd
Deprecated, use mpegvideo private options instead.
@item ilme @item ilme
Apply interlaced motion estimation. Apply interlaced motion estimation.
@item cgop @item cgop
@@ -84,40 +78,6 @@ Use closed gop.
Output even potentially corrupted frames. Output even potentially corrupted frames.
@end table @end table
@item me_method @var{integer} (@emph{encoding,video})
Set motion estimation method.
Possible values:
@table @samp
@item zero
zero motion estimation (fastest)
@item full
full motion estimation (slowest)
@item epzs
EPZS motion estimation (default)
@item esa
esa motion estimation (alias for full)
@item tesa
tesa motion estimation
@item dia
dia motion estimation (alias for epzs)
@item log
log motion estimation
@item phods
phods motion estimation
@item x1
X1 motion estimation
@item hex
hex motion estimation
@item umh
umh motion estimation
@item iter
iter motion estimation
@end table
@item extradata_size @var{integer}
Set extradata size.
@item time_base @var{rational number} @item time_base @var{rational number}
Set codec time base. Set codec time base.
@@ -184,9 +144,6 @@ Default value is 0.
@item b_qfactor @var{float} (@emph{encoding,video}) @item b_qfactor @var{float} (@emph{encoding,video})
Set qp factor between P and B frames. Set qp factor between P and B frames.
@item rc_strategy @var{integer} (@emph{encoding,video})
Set ratecontrol method.
@item b_strategy @var{integer} (@emph{encoding,video}) @item b_strategy @var{integer} (@emph{encoding,video})
Set strategy to choose between I/P/B-frames. Set strategy to choose between I/P/B-frames.
@@ -210,8 +167,6 @@ Possible values:
@table @samp @table @samp
@item autodetect @item autodetect
@item old_msmpeg4
some old lavc generated msmpeg4v3 files (no autodetection)
@item xvid_ilace @item xvid_ilace
Xvid interlacing bug (autodetected if fourcc==XVIX) Xvid interlacing bug (autodetected if fourcc==XVIX)
@item ump4 @item ump4
@@ -220,8 +175,6 @@ Xvid interlacing bug (autodetected if fourcc==XVIX)
padding bug (autodetected) padding bug (autodetected)
@item amv @item amv
@item ac_vlc
illegal vlc bug (autodetected per fourcc)
@item qpel_chroma @item qpel_chroma
@item std_qpel @item std_qpel
@@ -242,14 +195,6 @@ Workaround various bugs in microsoft broken decoders.
trancated frames trancated frames
@end table @end table
@item lelim @var{integer} (@emph{encoding,video})
Set single coefficient elimination threshold for luminance (negative
values also consider DC coefficient).
@item celim @var{integer} (@emph{encoding,video})
Set single coefficient elimination threshold for chrominance (negative
values also consider dc coefficient)
@item strict @var{integer} (@emph{decoding/encoding,audio,video}) @item strict @var{integer} (@emph{decoding/encoding,audio,video})
Specify how strictly to follow the standards. Specify how strictly to follow the standards.
@@ -306,26 +251,8 @@ consider things that a sane encoder should not do as an error
@item mpeg_quant @var{integer} (@emph{encoding,video}) @item mpeg_quant @var{integer} (@emph{encoding,video})
Use MPEG quantizers instead of H.263. Use MPEG quantizers instead of H.263.
@item qsquish @var{float} (@emph{encoding,video})
How to keep quantizer between qmin and qmax (0 = clip, 1 = use
differentiable function).
@item rc_qmod_amp @var{float} (@emph{encoding,video})
Set experimental quantizer modulation.
@item rc_qmod_freq @var{integer} (@emph{encoding,video})
Set experimental quantizer modulation.
@item rc_override_count @var{integer} @item rc_override_count @var{integer}
@item rc_eq @var{string} (@emph{encoding,video})
Set rate control equation. When computing the expression, besides the
standard functions defined in the section 'Expression Evaluation', the
following functions are available: bits2qp(bits), qp2bits(qp). Also
the following constants are available: iTex pTex tex mv fCode iCount
mcVar var isI isP isB avgQP qComp avgIITex avgPITex avgPPTex avgBPTex
avgTex.
@item maxrate @var{integer} (@emph{encoding,audio,video}) @item maxrate @var{integer} (@emph{encoding,audio,video})
Set max bitrate tolerance (in bits/s). Requires bufsize to be set. Set max bitrate tolerance (in bits/s). Requires bufsize to be set.
@@ -336,18 +263,12 @@ encode. It is of little use elsewise.
@item bufsize @var{integer} (@emph{encoding,audio,video}) @item bufsize @var{integer} (@emph{encoding,audio,video})
Set ratecontrol buffer size (in bits). Set ratecontrol buffer size (in bits).
@item rc_buf_aggressivity @var{float} (@emph{encoding,video})
Currently useless.
@item i_qfactor @var{float} (@emph{encoding,video}) @item i_qfactor @var{float} (@emph{encoding,video})
Set QP factor between P and I frames. Set QP factor between P and I frames.
@item i_qoffset @var{float} (@emph{encoding,video}) @item i_qoffset @var{float} (@emph{encoding,video})
Set QP offset between P and I frames. Set QP offset between P and I frames.
@item rc_init_cplx @var{float} (@emph{encoding,video})
Set initial complexity for 1-pass encoding.
@item dct @var{integer} (@emph{encoding,video}) @item dct @var{integer} (@emph{encoding,video})
Set DCT algorithm. Set DCT algorithm.
@@ -412,11 +333,7 @@ Automatically pick a IDCT compatible with the simple one
@item simpleneon @item simpleneon
@item simplealpha @item xvid
@item ipp
@item xvidmmx
@item faani @item faani
floating point AAN IDCT floating point AAN IDCT
@@ -714,19 +631,9 @@ Set diamond type & size for motion estimation pre-pass.
@item subq @var{integer} (@emph{encoding,video}) @item subq @var{integer} (@emph{encoding,video})
Set sub pel motion estimation quality. Set sub pel motion estimation quality.
@item dtg_active_format @var{integer}
@item me_range @var{integer} (@emph{encoding,video}) @item me_range @var{integer} (@emph{encoding,video})
Set limit motion vectors range (1023 for DivX player). Set limit motion vectors range (1023 for DivX player).
@item ibias @var{integer} (@emph{encoding,video})
Set intra quant bias.
@item pbias @var{integer} (@emph{encoding,video})
Set inter quant bias.
@item color_table_id @var{integer}
@item global_quality @var{integer} (@emph{encoding,audio,video}) @item global_quality @var{integer} (@emph{encoding,audio,video})
@item coder @var{integer} (@emph{encoding,video}) @item coder @var{integer} (@emph{encoding,video})
@@ -741,8 +648,6 @@ arithmetic coder
raw (no encoding) raw (no encoding)
@item rle @item rle
run-length coder run-length coder
@item deflate
deflate-based coder
@end table @end table
@item context @var{integer} (@emph{encoding,video}) @item context @var{integer} (@emph{encoding,video})
@@ -763,17 +668,9 @@ use fewest bits
use best rate distortion use best rate distortion
@end table @end table
@item stream_codec_tag @var{integer}
@item sc_threshold @var{integer} (@emph{encoding,video}) @item sc_threshold @var{integer} (@emph{encoding,video})
Set scene change threshold. Set scene change threshold.
@item lmin @var{integer} (@emph{encoding,video})
Set min lagrange factor (VBR).
@item lmax @var{integer} (@emph{encoding,video})
Set max lagrange factor (VBR).
@item nr @var{integer} (@emph{encoding,video}) @item nr @var{integer} (@emph{encoding,video})
Set noise reduction. Set noise reduction.
@@ -816,13 +713,14 @@ for codecs that support it. See also @file{doc/examples/export_mvs.c}.
@item prft @item prft
Export encoder Producer Reference Time into packet side-data (see @code{AV_PKT_DATA_PRFT}) Export encoder Producer Reference Time into packet side-data (see @code{AV_PKT_DATA_PRFT})
for codecs that support it. for codecs that support it.
@item venc_params
Export video encoding parameters through frame side data (see @code{AV_FRAME_DATA_VIDEO_ENC_PARAMS})
for codecs that support it. At present, those are H.264 and VP9.
@item film_grain
Export film grain parameters through frame side data (see @code{AV_FRAME_DATA_FILM_GRAIN_PARAMS}).
Supported at present by AV1 decoders.
@end table @end table
@item error @var{integer} (@emph{encoding,video})
@item qns @var{integer} (@emph{encoding,video})
Deprecated, use mpegvideo private options instead.
@item threads @var{integer} (@emph{decoding/encoding,video}) @item threads @var{integer} (@emph{decoding/encoding,video})
Set the number of threads to be used, in case the selected codec Set the number of threads to be used, in case the selected codec
implementation supports multi-threading. implementation supports multi-threading.
@@ -835,12 +733,6 @@ automatically select the number of threads to set
Default value is @samp{auto}. Default value is @samp{auto}.
@item me_threshold @var{integer} (@emph{encoding,video})
Set motion estimation threshold.
@item mb_threshold @var{integer} (@emph{encoding,video})
Set macroblock threshold.
@item dc @var{integer} (@emph{encoding,video}) @item dc @var{integer} (@emph{encoding,video})
Set intra_dc_precision. Set intra_dc_precision.
@@ -918,9 +810,6 @@ noise preserving sum of squared differences
@end table @end table
@item border_mask @var{float} (@emph{encoding,video})
Increase the quantizer for macroblocks close to borders.
@item mblmin @var{integer} (@emph{encoding,video}) @item mblmin @var{integer} (@emph{encoding,video})
Set min macroblock lagrange factor (VBR). Set min macroblock lagrange factor (VBR).
@@ -994,9 +883,6 @@ Adjust sensitivity of b_frame_strategy 1.
@item timecode_frame_start @var{integer} (@emph{encoding,video}) @item timecode_frame_start @var{integer} (@emph{encoding,video})
Set GOP timecode frame start number, in non drop frame format. Set GOP timecode frame start number, in non drop frame format.
@item request_channels @var{integer} (@emph{decoding,audio})
Set desired number of audio channels.
@item bits_per_raw_sample @var{integer} @item bits_per_raw_sample @var{integer}
@item channel_layout @var{integer} (@emph{decoding/encoding,audio}) @item channel_layout @var{integer} (@emph{decoding/encoding,audio})
@@ -1110,6 +996,12 @@ BT.2020 NCL
BT.2020 CL BT.2020 CL
@item smpte2085 @item smpte2085
SMPTE 2085 SMPTE 2085
@item chroma-derived-nc
Chroma-derived NCL
@item chroma-derived-c
Chroma-derived CL
@item ictcp
ICtCp
@end table @end table
@item color_range @var{integer} (@emph{decoding/encoding,video}) @item color_range @var{integer} (@emph{decoding/encoding,video})
+35 -1
View File
@@ -25,6 +25,19 @@ enabled decoders.
A description of some of the currently available video decoders A description of some of the currently available video decoders
follows. follows.
@section av1
AOMedia Video 1 (AV1) decoder.
@subsection Options
@table @option
@item operating_point
Select an operating point of a scalable AV1 bitstream (0 - 31). Default is 0.
@end table
@section rawvideo @section rawvideo
Raw video decoder. Raw video decoder.
@@ -88,6 +101,27 @@ This decoder allows libavcodec to decode AVS2 streams with davs2 library.
@c man end VIDEO DECODERS @c man end VIDEO DECODERS
@section libuavs3d
AVS3-P2/IEEE1857.10 video decoder.
libuavs3d allows libavcodec to decode AVS3 streams.
Requires the presence of the libuavs3d headers and library during configuration.
You need to explicitly configure the build with @code{--enable-libuavs3d}.
@subsection Options
The following option is supported by the libuavs3d wrapper.
@table @option
@item frame_threads
Set amount of frame threads to use during decoding. The default value is 0 (autodetect).
@end table
@c man end VIDEO DECODERS
@chapter Audio Decoders @chapter Audio Decoders
@c man begin AUDIO DECODERS @c man begin AUDIO DECODERS
@@ -107,7 +141,7 @@ the undocumented RealAudio 3 (a.k.a. dnet).
@item -drc_scale @var{value} @item -drc_scale @var{value}
Dynamic Range Scale Factor. The factor to apply to dynamic range values Dynamic Range Scale Factor. The factor to apply to dynamic range values
from the AC-3 stream. This factor is applied exponentially. from the AC-3 stream. This factor is applied exponentially. The default value is 1.
There are 3 notable scale factor ranges: There are 3 notable scale factor ranges:
@table @option @table @option
@item drc_scale == 0 @item drc_scale == 0
+79
View File
@@ -0,0 +1,79 @@
# FFmpeg project
## Organisation
The FFmpeg project is organized through a community working on global consensus.
Decisions are taken by the ensemble of active members, through voting and
are aided by two committees.
## General Assembly
The ensemble of active members is called the General Assembly (GA).
The General Assembly is sovereign and legitimate for all its decisions
regarding the FFmpeg project.
The General Assembly is made up of active contributors.
Contributors are considered "active contributors" if they have pushed more
than 20 patches in the last 36 months in the main FFmpeg repository, or
if they have been voted in by the GA.
Additional members are added to the General Assembly through a vote after
proposal by a member of the General Assembly.
They are part of the GA for two years, after which they need a confirmation by
the GA.
## Voting
Voting is done using a ranked voting system, currently running on https://vote.ffmpeg.org/ .
Majority vote means more than 50% of the expressed ballots.
## Technical Committee
The Technical Committee (TC) is here to arbitrate and make decisions when
technical conflicts occur in the project.
They will consider the merits of all the positions, judge them and make a
decision.
The TC resolves technical conflicts but is not a technical steering committee.
Decisions by the TC are binding for all the contributors.
Decisions made by the TC can be re-opened after 1 year or by a majority vote
of the General Assembly, requested by one of the member of the GA.
The TC is elected by the General Assembly for a duration of 1 year, and
is composed of 5 members.
Members can be re-elected if they wish. A majority vote in the General Assembly
can trigger a new election of the TC.
The members of the TC can be elected from outside of the GA.
Candidates for election can either be suggested or self-nominated.
The conflict resolution process is detailed in the [resolution process](resolution_process.md) document.
## Community committee
The Community Committee (CC) is here to arbitrage and make decisions when
inter-personal conflicts occur in the project. It will decide quickly and
take actions, for the sake of the project.
The CC can remove privileges of offending members, including removal of
commit access and temporary ban from the community.
Decisions made by the CC can be re-opened after 1 year or by a majority vote
of the General Assembly. Indefinite bans from the community must be confirmed
by the General Assembly, in a majority vote.
The CC is elected by the General Assembly for a duration of 1 year, and is
composed of 5 members.
Members can be re-elected if they wish. A majority vote in the General Assembly
can trigger a new election of the CC.
The members of the CC can be elected from outside of the GA.
Candidates for election can either be suggested or self-nominated.
The CC is governed by and responsible for enforcing the Code of Conduct.
+91
View File
@@ -0,0 +1,91 @@
# Technical Committee
_This document only makes sense with the rules from [the community document](community)_.
The Technical Committee (**TC**) is here to arbitrate and make decisions when
technical conflicts occur in the project.
The TC main role is to resolve technical conflicts.
It is therefore not a technical steering committee, but it is understood that
some decisions might impact the future of the project.
# Process
## Seizing
The TC can take possession of any technical matter that it sees fit.
To involve the TC in a matter, email tc@ or CC them on an ongoing discussion.
As members of TC are developers, they also can email tc@ to raise an issue.
## Announcement
The TC, once seized, must announce itself on the main mailing list, with a _[TC]_ tag.
The TC has 2 modes of operation: a RFC one and an internal one.
If the TC thinks it needs the input from the larger community, the TC can call
for a RFC. Else, it can decide by itself.
If the disagreement involves a member of the TC, that member should recuse
themselves from the decision.
The decision to use a RFC process or an internal discussion is a discretionary
decision of the TC.
The TC can also reject a seizure for a few reasons such as:
the matter was not discussed enough previously; it lacks expertise to reach a
beneficial decision on the matter; or the matter is too trivial.
### RFC call
In the RFC mode, one person from the TC posts on the mailing list the
technical question and will request input from the community.
The mail will have the following specification:
* a precise title
* a specific tag [TC RFC]
* a top-level email
* contain a precise question that does not exceed 100 words and that is answerable by developers
* may have an extra description, or a link to a previous discussion, if deemed necessary,
* contain a precise end date for the answers.
The answers from the community must be on the main mailing list and must have
the following specification:
* keep the tag and the title unchanged
* limited to 400 words
* a first-level, answering directly to the main email
* answering to the question.
Further replies to answers are permitted, as long as they conform to the
community standards of politeness, they are limited to 100 words, and are not
nested more than once. (max-depth=2)
After the end-date, mails on the thread will be ignored.
Violations of those rules will be escalated through the Community Committee.
After all the emails are in, the TC has 96 hours to give its final decision.
Exceptionally, the TC can request an extra delay, that will be notified on the
mailing list.
### Within TC
In the internal case, the TC has 96 hours to give its final decision.
Exceptionally, the TC can request an extra delay.
## Decisions
The decisions from the TC will be sent on the mailing list, with the _[TC]_ tag.
Internally, the TC should take decisions with a majority, or using
ranked-choice voting.
The decision from the TC should be published with a summary of the reasons that
lead to this decision.
The decisions from the TC are final, until the matters are reopened after
no less than one year.
+305 -64
View File
@@ -151,10 +151,9 @@ the undocumented RealAudio 3 (a.k.a. dnet).
The @var{ac3} encoder uses floating-point math, while the @var{ac3_fixed} The @var{ac3} encoder uses floating-point math, while the @var{ac3_fixed}
encoder only uses fixed-point integer math. This does not mean that one is encoder only uses fixed-point integer math. This does not mean that one is
always faster, just that one or the other may be better suited to a always faster, just that one or the other may be better suited to a
particular system. The floating-point encoder will generally produce better particular system. The @var{ac3_fixed} encoder is not the default codec for
quality audio for a given bitrate. The @var{ac3_fixed} encoder is not the any of the output formats, so it must be specified explicitly using the option
default codec for any of the output formats, so it must be specified explicitly @code{-acodec ac3_fixed} in order to use it.
using the option @code{-acodec ac3_fixed} in order to use it.
@subsection AC-3 Metadata @subsection AC-3 Metadata
@@ -953,6 +952,11 @@ The default is 20ms.
@item packet_loss (@emph{expect-loss}) @item packet_loss (@emph{expect-loss})
Set expected packet loss percentage. The default is 0. Set expected packet loss percentage. The default is 0.
@item fec (@emph{n/a})
Enable inband forward error correction. @option{packet_loss} must be non-zero
to take advantage - frequency of FEC 'side-data' is proportional to expected packet loss.
Default is disabled.
@item application (N.A.) @item application (N.A.)
Set intended application type. Valid options are listed below: Set intended application type. Valid options are listed below:
@@ -1180,53 +1184,6 @@ transient response is a higher bitrate.
@end table @end table
@anchor{libwavpack}
@section libwavpack
A wrapper providing WavPack encoding through libwavpack.
Only lossless mode using 32-bit integer samples is supported currently.
Requires the presence of the libwavpack headers and library during
configuration. You need to explicitly configure the build with
@code{--enable-libwavpack}.
Note that a libavcodec-native encoder for the WavPack codec exists so users can
encode audios with this codec without using this encoder. See @ref{wavpackenc}.
@subsection Options
@command{wavpack} command line utility's corresponding options are listed in
parentheses, if any.
@table @option
@item frame_size (@emph{--blocksize})
Default is 32768.
@item compression_level
Set speed vs. compression tradeoff. Acceptable arguments are listed below:
@table @samp
@item 0 (@emph{-f})
Fast mode.
@item 1
Normal (default) settings.
@item 2 (@emph{-h})
High quality.
@item 3 (@emph{-hh})
Very high quality.
@item 4-8 (@emph{-hh -x}@var{EXTRAPROC})
Same as @samp{3}, but with extra processing enabled.
@samp{4} is the same as @option{-x2} and @samp{8} is the same as @option{-x6}.
@end table
@end table
@anchor{mjpegenc} @anchor{mjpegenc}
@section mjpeg @section mjpeg
@@ -1253,11 +1210,6 @@ Compute and use optimal huffman tables.
WavPack lossless audio encoder. WavPack lossless audio encoder.
This is a libavcodec-native WavPack encoder. There is also an encoder based on
libwavpack, but there is virtually no reason to use that encoder.
See also @ref{libwavpack}.
@subsection Options @subsection Options
The equivalent options for @command{wavpack} command line utility are listed in The equivalent options for @command{wavpack} command line utility are listed in
@@ -1278,7 +1230,6 @@ For the complete formula of calculating default, see
@file{libavcodec/wavpackenc.c}. @file{libavcodec/wavpackenc.c}.
@item compression_level (@emph{-f}, @emph{-h}, @emph{-hh}, and @emph{-x}) @item compression_level (@emph{-f}, @emph{-h}, @emph{-hh}, and @emph{-x})
This option's syntax is consistent with @ref{libwavpack}'s.
@end table @end table
@subsubsection Private options @subsubsection Private options
@@ -1317,6 +1268,44 @@ disabled
A description of some of the currently available video encoders A description of some of the currently available video encoders
follows. follows.
@section GIF
GIF image/animation encoder.
@subsection Options
@table @option
@item gifflags @var{integer}
Sets the flags used for GIF encoding.
@table @option
@item offsetting
Enables picture offsetting.
Default is enabled.
@item transdiff
Enables transparency detection between frames.
Default is enabled.
@end table
@item gifimage @var{integer}
Enables encoding one full GIF image per frame, rather than an animated GIF.
Default value is @option{0}.
@item global_palette @var{integer}
Writes a palette to the global GIF header where feasible.
If disabled, every frame will always have a palette written, even if there
is a global palette supplied.
Default value is @option{1}.
@end table
@section Hap @section Hap
Vidvox Hap video encoder. Vidvox Hap video encoder.
@@ -1365,10 +1354,58 @@ can be selected with @code{-pred 1}.
@subsection Options @subsection Options
@table @option @table @option
@item format @item format @var{integer}
Can be set to either @code{j2k} or @code{jp2} (the default) that Can be set to either @code{j2k} or @code{jp2} (the default) that
makes it possible to store non-rgb pix_fmts. makes it possible to store non-rgb pix_fmts.
@item tile_width @var{integer}
Sets tile width. Range is 1 to 1073741824. Default is 256.
@item tile_height @var{integer}
Sets tile height. Range is 1 to 1073741824. Default is 256.
@item pred @var{integer}
Allows setting the discrete wavelet transform (DWT) type
@table @option
@item dwt97int (Lossy)
@item dwt53 (Lossless)
@end table
Default is @code{dwt97int}
@item sop @var{boolean}
Enable this to add SOP marker at the start of each packet. Disabled by default.
@item eph @var{boolean}
Enable this to add EPH marker at the end of each packet header. Disabled by default.
@item prog @var{integer}
Sets the progression order to be used by the encoder.
Possible values are:
@table @option
@item lrcp
@item rlcp
@item rpcl
@item pcrl
@item cprl
@end table
Set to @code{lrcp} by default.
@item layer_rates @var{string}
By default, when this option is not used, compression is done using the quality metric.
This option allows for compression using compression ratio. The compression ratio for each
level could be specified. The compression ratio of a layer @code{l} species the what ratio of
total file size is contained in the first @code{l} layers.
Example usage:
@example
ffmpeg -i input.bmp -c:v jpeg2000 -layer_rates "100,10,1" output.j2k
@end example
This would compress the image to contain 3 layers, where the data contained in the
first layer would be compressed by 1000 times, compressed by 100 in the first two layers,
and shall contain all data while using all 3 layers.
@end table @end table
@section librav1e @section librav1e
@@ -1599,6 +1636,165 @@ Enable the use of global motion for block prediction. Default is true.
Enable block copy mode for intra block prediction. This mode is Enable block copy mode for intra block prediction. This mode is
useful for screen content. Default is true. useful for screen content. Default is true.
@item enable-rect-partitions (@emph{boolean}) (Requires libaom >= v2.0.0)
Enable rectangular partitions. Default is true.
@item enable-1to4-partitions (@emph{boolean}) (Requires libaom >= v2.0.0)
Enable 1:4/4:1 partitions. Default is true.
@item enable-ab-partitions (@emph{boolean}) (Requires libaom >= v2.0.0)
Enable AB shape partitions. Default is true.
@item enable-angle-delta (@emph{boolean}) (Requires libaom >= v2.0.0)
Enable angle delta intra prediction. Default is true.
@item enable-cfl-intra (@emph{boolean}) (Requires libaom >= v2.0.0)
Enable chroma predicted from luma intra prediction. Default is true.
@item enable-filter-intra (@emph{boolean}) (Requires libaom >= v2.0.0)
Enable filter intra predictor. Default is true.
@item enable-intra-edge-filter (@emph{boolean}) (Requires libaom >= v2.0.0)
Enable intra edge filter. Default is true.
@item enable-smooth-intra (@emph{boolean}) (Requires libaom >= v2.0.0)
Enable smooth intra prediction mode. Default is true.
@item enable-paeth-intra (@emph{boolean}) (Requires libaom >= v2.0.0)
Enable paeth predictor in intra prediction. Default is true.
@item enable-palette (@emph{boolean}) (Requires libaom >= v2.0.0)
Enable palette prediction mode. Default is true.
@item enable-flip-idtx (@emph{boolean}) (Requires libaom >= v2.0.0)
Enable extended transform type, including FLIPADST_DCT, DCT_FLIPADST,
FLIPADST_FLIPADST, ADST_FLIPADST, FLIPADST_ADST, IDTX, V_DCT, H_DCT,
V_ADST, H_ADST, V_FLIPADST, H_FLIPADST. Default is true.
@item enable-tx64 (@emph{boolean}) (Requires libaom >= v2.0.0)
Enable 64-pt transform. Default is true.
@item reduced-tx-type-set (@emph{boolean}) (Requires libaom >= v2.0.0)
Use reduced set of transform types. Default is false.
@item use-intra-dct-only (@emph{boolean}) (Requires libaom >= v2.0.0)
Use DCT only for INTRA modes. Default is false.
@item use-inter-dct-only (@emph{boolean}) (Requires libaom >= v2.0.0)
Use DCT only for INTER modes. Default is false.
@item use-intra-default-tx-only (@emph{boolean}) (Requires libaom >= v2.0.0)
Use Default-transform only for INTRA modes. Default is false.
@item enable-ref-frame-mvs (@emph{boolean}) (Requires libaom >= v2.0.0)
Enable temporal mv prediction. Default is true.
@item enable-reduced-reference-set (@emph{boolean}) (Requires libaom >= v2.0.0)
Use reduced set of single and compound references. Default is false.
@item enable-obmc (@emph{boolean}) (Requires libaom >= v2.0.0)
Enable obmc. Default is true.
@item enable-dual-filter (@emph{boolean}) (Requires libaom >= v2.0.0)
Enable dual filter. Default is true.
@item enable-diff-wtd-comp (@emph{boolean}) (Requires libaom >= v2.0.0)
Enable difference-weighted compound. Default is true.
@item enable-dist-wtd-comp (@emph{boolean}) (Requires libaom >= v2.0.0)
Enable distance-weighted compound. Default is true.
@item enable-onesided-comp (@emph{boolean}) (Requires libaom >= v2.0.0)
Enable one sided compound. Default is true.
@item enable-interinter-wedge (@emph{boolean}) (Requires libaom >= v2.0.0)
Enable interinter wedge compound. Default is true.
@item enable-interintra-wedge (@emph{boolean}) (Requires libaom >= v2.0.0)
Enable interintra wedge compound. Default is true.
@item enable-masked-comp (@emph{boolean}) (Requires libaom >= v2.0.0)
Enable masked compound. Default is true.
@item enable-interintra-comp (@emph{boolean}) (Requires libaom >= v2.0.0)
Enable interintra compound. Default is true.
@item enable-smooth-interintra (@emph{boolean}) (Requires libaom >= v2.0.0)
Enable smooth interintra mode. Default is true.
@item aom-params
Set libaom options using a list of @var{key}=@var{value} pairs separated
by ":". For a list of supported options, see @command{aomenc --help} under the
section "AV1 Specific Options".
For example to specify libaom encoding options with @option{-aom-params}:
@example
ffmpeg -i input -c:v libaom-av1 -b:v 500K -aom-params tune=psnr:enable-tpl-model=1 output.mp4
@end example
@end table
@section libsvtav1
SVT-AV1 encoder wrapper.
Requires the presence of the SVT-AV1 headers and library during configuration.
You need to explicitly configure the build with @code{--enable-libsvtav1}.
@subsection Options
@table @option
@item profile
Set the encoding profile.
@item level
Set the operating point level.
@item tier
Set the operating point tier.
@item rc
Set the rate control mode to use.
Possible modes:
@table @option
@item cqp
Constant quantizer: use fixed values of qindex (dependent on the frame type)
throughout the stream. This mode is the default.
@item vbr
Variable bitrate: use a target bitrate for the whole stream.
@item cvbr
Constrained variable bitrate: use a target bitrate for each GOP.
@end table
@item qmax
Set the maximum quantizer to use when using a bitrate mode.
@item qmin
Set the minimum quantizer to use when using a bitrate mode.
@item qp
Set the quantizer used in cqp rate control mode (0-63).
@item sc_detection
Enable scene change detection.
@item la_depth
Set number of frames to look ahead (0-120).
@item preset
Set the quality-speed tradeoff, in the range 0 to 8. Higher values are
faster but lower quality. Defaults to 8 (highest speed).
@item tile_rows
Set log2 of the number of rows of tiles to use (0-6).
@item tile_columns
Set log2 of the number of columns of tiles to use (0-4).
@end table @end table
@section libkvazaar @section libkvazaar
@@ -1981,6 +2177,38 @@ midpoint is passed in rather than calculated for a specific clip or chunk.
The valid range is [0, 10000]. 0 (default) uses standard VBR. The valid range is [0, 10000]. 0 (default) uses standard VBR.
@item enable-tpl @var{boolean} @item enable-tpl @var{boolean}
Enable temporal dependency model. Enable temporal dependency model.
@item ref-frame-config
Using per-frame metadata, set members of the structure @code{vpx_svc_ref_frame_config_t} in @code{vpx/vp8cx.h} to fine-control referencing schemes and frame buffer management.
@*Use a :-separated list of key=value pairs.
For example,
@example
av_dict_set(&av_frame->metadata, "ref-frame-config", \
"rfc_update_buffer_slot=7:rfc_lst_fb_idx=0:rfc_gld_fb_idx=1:rfc_alt_fb_idx=2:rfc_reference_last=0:rfc_reference_golden=0:rfc_reference_alt_ref=0");
@end example
@table @option
@item rfc_update_buffer_slot
Indicates the buffer slot number to update
@item rfc_update_last
Indicates whether to update the LAST frame
@item rfc_update_golden
Indicates whether to update GOLDEN frame
@item rfc_update_alt_ref
Indicates whether to update ALT_REF frame
@item rfc_lst_fb_idx
LAST frame buffer index
@item rfc_gld_fb_idx
GOLDEN frame buffer index
@item rfc_alt_fb_idx
ALT_REF frame buffer index
@item rfc_reference_last
Indicates whether to reference LAST frame
@item rfc_reference_golden
Indicates whether to reference GOLDEN frame
@item rfc_reference_alt_ref
Indicates whether to reference ALT_REF frame
@item rfc_reference_duration
Indicates frame duration
@end table
@end table @end table
@end table @end table
@@ -2077,9 +2305,7 @@ pixel formats as input instead of YUV.
@subsection Supported Pixel Formats @subsection Supported Pixel Formats
x264 supports 8- to 10-bit color spaces. The exact bit depth is controlled at x264 supports 8- to 10-bit color spaces. The exact bit depth is controlled at
x264's configure time. FFmpeg only supports one bit depth in one particular x264's configure time.
build. In other words, it is not possible to build one FFmpeg with multiple
versions of x264 with different bit depths.
@subsection Options @subsection Options
@@ -2740,20 +2966,30 @@ MPEG-2 video encoder.
@subsection Options @subsection Options
@table @option @table @option
@item profile @var{integer} @item profile
Select the mpeg2 profile to encode: Select the mpeg2 profile to encode:
@table @samp @table @samp
@item 422 @item 422
@item main @item high
@item ss @item ss
Spatially Scalable Spatially Scalable
@item snr @item snr
SNR Scalable SNR Scalable
@item high @item main
@item simple @item simple
@end table @end table
@item level
Select the mpeg2 level to encode:
@table @samp
@item high
@item high1440
@item main
@item low
@end table
@item seq_disp_ext @var{integer} @item seq_disp_ext @var{integer}
Specifies if the encoder should write a sequence_display_extension to the Specifies if the encoder should write a sequence_display_extension to the
output. output.
@@ -3115,6 +3351,11 @@ Include HDR metadata if the input frames have it
messages). messages).
@end table @end table
@item tiles
Set the number of tiles to encode the input video with, as columns x rows.
Larger numbers allow greater parallelism in both encoding and decoding, but
may decrease coding efficiency.
@end table @end table
@item mjpeg_vaapi @item mjpeg_vaapi
+1 -1
View File
@@ -41,7 +41,7 @@ static void pgm_save(unsigned char *buf, int wrap, int xsize, int ysize,
FILE *f; FILE *f;
int i; int i;
f = fopen(filename,"w"); f = fopen(filename,"wb");
fprintf(f, "P5\n%d %d\n%d\n", xsize, ysize, 255); fprintf(f, "P5\n%d %d\n%d\n", xsize, ysize, 255);
for (i = 0; i < ysize; i++) for (i = 0; i < ysize; i++)
fwrite(buf + i * wrap, 1, xsize, f); fwrite(buf + i * wrap, 1, xsize, f);
+14 -11
View File
@@ -51,7 +51,7 @@ static int video_dst_bufsize;
static int video_stream_idx = -1, audio_stream_idx = -1; static int video_stream_idx = -1, audio_stream_idx = -1;
static AVFrame *frame = NULL; static AVFrame *frame = NULL;
static AVPacket pkt; static AVPacket *pkt = NULL;
static int video_frame_count = 0; static int video_frame_count = 0;
static int audio_frame_count = 0; static int audio_frame_count = 0;
@@ -303,10 +303,12 @@ int main (int argc, char **argv)
goto end; goto end;
} }
/* initialize packet, set data to NULL, let the demuxer fill it */ pkt = av_packet_alloc();
av_init_packet(&pkt); if (!pkt) {
pkt.data = NULL; fprintf(stderr, "Could not allocate packet\n");
pkt.size = 0; ret = AVERROR(ENOMEM);
goto end;
}
if (video_stream) if (video_stream)
printf("Demuxing video from file '%s' into '%s'\n", src_filename, video_dst_filename); printf("Demuxing video from file '%s' into '%s'\n", src_filename, video_dst_filename);
@@ -314,14 +316,14 @@ int main (int argc, char **argv)
printf("Demuxing audio from file '%s' into '%s'\n", src_filename, audio_dst_filename); printf("Demuxing audio from file '%s' into '%s'\n", src_filename, audio_dst_filename);
/* read frames from the file */ /* read frames from the file */
while (av_read_frame(fmt_ctx, &pkt) >= 0) { while (av_read_frame(fmt_ctx, pkt) >= 0) {
// check if the packet belongs to a stream we are interested in, otherwise // check if the packet belongs to a stream we are interested in, otherwise
// skip it // skip it
if (pkt.stream_index == video_stream_idx) if (pkt->stream_index == video_stream_idx)
ret = decode_packet(video_dec_ctx, &pkt); ret = decode_packet(video_dec_ctx, pkt);
else if (pkt.stream_index == audio_stream_idx) else if (pkt->stream_index == audio_stream_idx)
ret = decode_packet(audio_dec_ctx, &pkt); ret = decode_packet(audio_dec_ctx, pkt);
av_packet_unref(&pkt); av_packet_unref(pkt);
if (ret < 0) if (ret < 0)
break; break;
} }
@@ -372,6 +374,7 @@ end:
fclose(video_dst_file); fclose(video_dst_file);
if (audio_dst_file) if (audio_dst_file)
fclose(audio_dst_file); fclose(audio_dst_file);
av_packet_free(&pkt);
av_frame_free(&frame); av_frame_free(&frame);
av_free(video_dst_data[0]); av_free(video_dst_data[0]);
+1 -1
View File
@@ -223,7 +223,7 @@ int main(int argc, char *argv[])
} }
/* open the file to dump raw data */ /* open the file to dump raw data */
output_file = fopen(argv[3], "w+"); output_file = fopen(argv[3], "w+b");
/* actual decoding and dump the raw data */ /* actual decoding and dump the raw data */
while (ret >= 0) { while (ret >= 0) {
+22 -23
View File
@@ -200,7 +200,7 @@ static void add_stream(OutputStream *ost, AVFormatContext *oc,
* the motion of the chroma plane does not match the luma plane. */ * the motion of the chroma plane does not match the luma plane. */
c->mb_decision = 2; c->mb_decision = 2;
} }
break; break;
default: default:
break; break;
@@ -284,25 +284,25 @@ static void open_audio(AVFormatContext *oc, AVCodec *codec, OutputStream *ost, A
} }
/* create resampler context */ /* create resampler context */
ost->swr_ctx = swr_alloc(); ost->swr_ctx = swr_alloc();
if (!ost->swr_ctx) { if (!ost->swr_ctx) {
fprintf(stderr, "Could not allocate resampler context\n"); fprintf(stderr, "Could not allocate resampler context\n");
exit(1); exit(1);
} }
/* set options */ /* set options */
av_opt_set_int (ost->swr_ctx, "in_channel_count", c->channels, 0); av_opt_set_int (ost->swr_ctx, "in_channel_count", c->channels, 0);
av_opt_set_int (ost->swr_ctx, "in_sample_rate", c->sample_rate, 0); av_opt_set_int (ost->swr_ctx, "in_sample_rate", c->sample_rate, 0);
av_opt_set_sample_fmt(ost->swr_ctx, "in_sample_fmt", AV_SAMPLE_FMT_S16, 0); av_opt_set_sample_fmt(ost->swr_ctx, "in_sample_fmt", AV_SAMPLE_FMT_S16, 0);
av_opt_set_int (ost->swr_ctx, "out_channel_count", c->channels, 0); av_opt_set_int (ost->swr_ctx, "out_channel_count", c->channels, 0);
av_opt_set_int (ost->swr_ctx, "out_sample_rate", c->sample_rate, 0); av_opt_set_int (ost->swr_ctx, "out_sample_rate", c->sample_rate, 0);
av_opt_set_sample_fmt(ost->swr_ctx, "out_sample_fmt", c->sample_fmt, 0); av_opt_set_sample_fmt(ost->swr_ctx, "out_sample_fmt", c->sample_fmt, 0);
/* initialize the resampling context */ /* initialize the resampling context */
if ((ret = swr_init(ost->swr_ctx)) < 0) { if ((ret = swr_init(ost->swr_ctx)) < 0) {
fprintf(stderr, "Failed to initialize the resampling context\n"); fprintf(stderr, "Failed to initialize the resampling context\n");
exit(1); exit(1);
} }
} }
/* Prepare a 16 bit dummy audio frame of 'frame_size' samples and /* Prepare a 16 bit dummy audio frame of 'frame_size' samples and
@@ -349,10 +349,10 @@ static int write_audio_frame(AVFormatContext *oc, OutputStream *ost)
if (frame) { if (frame) {
/* convert samples from native format to destination codec format, using the resampler */ /* convert samples from native format to destination codec format, using the resampler */
/* compute destination number of samples */ /* compute destination number of samples */
dst_nb_samples = av_rescale_rnd(swr_get_delay(ost->swr_ctx, c->sample_rate) + frame->nb_samples, dst_nb_samples = av_rescale_rnd(swr_get_delay(ost->swr_ctx, c->sample_rate) + frame->nb_samples,
c->sample_rate, c->sample_rate, AV_ROUND_UP); c->sample_rate, c->sample_rate, AV_ROUND_UP);
av_assert0(dst_nb_samples == frame->nb_samples); av_assert0(dst_nb_samples == frame->nb_samples);
/* when we pass a frame to the encoder, it may keep a reference to it /* when we pass a frame to the encoder, it may keep a reference to it
* internally; * internally;
@@ -519,7 +519,6 @@ static AVFrame *get_video_frame(OutputStream *ost)
static int write_video_frame(AVFormatContext *oc, OutputStream *ost) static int write_video_frame(AVFormatContext *oc, OutputStream *ost)
{ {
return write_frame(oc, ost->enc, ost->st, get_video_frame(ost)); return write_frame(oc, ost->enc, ost->st, get_video_frame(ost));
} }
static void close_stream(AVFormatContext *oc, OutputStream *ost) static void close_stream(AVFormatContext *oc, OutputStream *ost)
+27 -19
View File
@@ -245,14 +245,16 @@ cleanup:
/** /**
* Initialize one data packet for reading or writing. * Initialize one data packet for reading or writing.
* @param packet Packet to be initialized * @param[out] packet Packet to be initialized
* @return Error code (0 if successful)
*/ */
static void init_packet(AVPacket *packet) static int init_packet(AVPacket **packet)
{ {
av_init_packet(packet); if (!(*packet = av_packet_alloc())) {
/* Set the packet data and size so that it is recognized as being empty. */ fprintf(stderr, "Could not allocate packet\n");
packet->data = NULL; return AVERROR(ENOMEM);
packet->size = 0; }
return 0;
} }
/** /**
@@ -371,28 +373,31 @@ static int decode_audio_frame(AVFrame *frame,
int *data_present, int *finished) int *data_present, int *finished)
{ {
/* Packet used for temporary storage. */ /* Packet used for temporary storage. */
AVPacket input_packet; AVPacket *input_packet;
int error; int error;
init_packet(&input_packet);
error = init_packet(&input_packet);
if (error < 0)
return error;
/* Read one audio frame from the input file into a temporary packet. */ /* Read one audio frame from the input file into a temporary packet. */
if ((error = av_read_frame(input_format_context, &input_packet)) < 0) { if ((error = av_read_frame(input_format_context, input_packet)) < 0) {
/* If we are at the end of the file, flush the decoder below. */ /* If we are at the end of the file, flush the decoder below. */
if (error == AVERROR_EOF) if (error == AVERROR_EOF)
*finished = 1; *finished = 1;
else { else {
fprintf(stderr, "Could not read frame (error '%s')\n", fprintf(stderr, "Could not read frame (error '%s')\n",
av_err2str(error)); av_err2str(error));
return error; goto cleanup;
} }
} }
/* Send the audio frame stored in the temporary packet to the decoder. /* Send the audio frame stored in the temporary packet to the decoder.
* The input audio stream decoder is used to do this. */ * The input audio stream decoder is used to do this. */
if ((error = avcodec_send_packet(input_codec_context, &input_packet)) < 0) { if ((error = avcodec_send_packet(input_codec_context, input_packet)) < 0) {
fprintf(stderr, "Could not send packet for decoding (error '%s')\n", fprintf(stderr, "Could not send packet for decoding (error '%s')\n",
av_err2str(error)); av_err2str(error));
return error; goto cleanup;
} }
/* Receive one frame from the decoder. */ /* Receive one frame from the decoder. */
@@ -418,7 +423,7 @@ static int decode_audio_frame(AVFrame *frame,
} }
cleanup: cleanup:
av_packet_unref(&input_packet); av_packet_free(&input_packet);
return error; return error;
} }
@@ -661,9 +666,12 @@ static int encode_audio_frame(AVFrame *frame,
int *data_present) int *data_present)
{ {
/* Packet used for temporary storage. */ /* Packet used for temporary storage. */
AVPacket output_packet; AVPacket *output_packet;
int error; int error;
init_packet(&output_packet);
error = init_packet(&output_packet);
if (error < 0)
return error;
/* Set a timestamp based on the sample rate for the container. */ /* Set a timestamp based on the sample rate for the container. */
if (frame) { if (frame) {
@@ -681,11 +689,11 @@ static int encode_audio_frame(AVFrame *frame,
} else if (error < 0) { } else if (error < 0) {
fprintf(stderr, "Could not send packet for encoding (error '%s')\n", fprintf(stderr, "Could not send packet for encoding (error '%s')\n",
av_err2str(error)); av_err2str(error));
return error; goto cleanup;
} }
/* Receive one encoded frame from the encoder. */ /* Receive one encoded frame from the encoder. */
error = avcodec_receive_packet(output_codec_context, &output_packet); error = avcodec_receive_packet(output_codec_context, output_packet);
/* If the encoder asks for more data to be able to provide an /* If the encoder asks for more data to be able to provide an
* encoded frame, return indicating that no data is present. */ * encoded frame, return indicating that no data is present. */
if (error == AVERROR(EAGAIN)) { if (error == AVERROR(EAGAIN)) {
@@ -706,14 +714,14 @@ static int encode_audio_frame(AVFrame *frame,
/* Write one audio frame from the temporary packet to the output file. */ /* Write one audio frame from the temporary packet to the output file. */
if (*data_present && if (*data_present &&
(error = av_write_frame(output_format_context, &output_packet)) < 0) { (error = av_write_frame(output_format_context, output_packet)) < 0) {
fprintf(stderr, "Could not write frame (error '%s')\n", fprintf(stderr, "Could not write frame (error '%s')\n",
av_err2str(error)); av_err2str(error));
goto cleanup; goto cleanup;
} }
cleanup: cleanup:
av_packet_unref(&output_packet); av_packet_free(&output_packet);
return error; return error;
} }
+82 -81
View File
@@ -41,12 +41,17 @@ typedef struct FilteringContext {
AVFilterContext *buffersink_ctx; AVFilterContext *buffersink_ctx;
AVFilterContext *buffersrc_ctx; AVFilterContext *buffersrc_ctx;
AVFilterGraph *filter_graph; AVFilterGraph *filter_graph;
AVPacket *enc_pkt;
AVFrame *filtered_frame;
} FilteringContext; } FilteringContext;
static FilteringContext *filter_ctx; static FilteringContext *filter_ctx;
typedef struct StreamContext { typedef struct StreamContext {
AVCodecContext *dec_ctx; AVCodecContext *dec_ctx;
AVCodecContext *enc_ctx; AVCodecContext *enc_ctx;
AVFrame *dec_frame;
} StreamContext; } StreamContext;
static StreamContext *stream_ctx; static StreamContext *stream_ctx;
@@ -102,6 +107,10 @@ static int open_input_file(const char *filename)
} }
} }
stream_ctx[i].dec_ctx = codec_ctx; stream_ctx[i].dec_ctx = codec_ctx;
stream_ctx[i].dec_frame = av_frame_alloc();
if (!stream_ctx[i].dec_frame)
return AVERROR(ENOMEM);
} }
av_dump_format(ifmt_ctx, 0, filename, 0); av_dump_format(ifmt_ctx, 0, filename, 0);
@@ -398,54 +407,63 @@ static int init_filters(void)
stream_ctx[i].enc_ctx, filter_spec); stream_ctx[i].enc_ctx, filter_spec);
if (ret) if (ret)
return ret; return ret;
filter_ctx[i].enc_pkt = av_packet_alloc();
if (!filter_ctx[i].enc_pkt)
return AVERROR(ENOMEM);
filter_ctx[i].filtered_frame = av_frame_alloc();
if (!filter_ctx[i].filtered_frame)
return AVERROR(ENOMEM);
} }
return 0; return 0;
} }
static int encode_write_frame(AVFrame *filt_frame, unsigned int stream_index, int *got_frame) { static int encode_write_frame(unsigned int stream_index, int flush)
{
StreamContext *stream = &stream_ctx[stream_index];
FilteringContext *filter = &filter_ctx[stream_index];
AVFrame *filt_frame = flush ? NULL : filter->filtered_frame;
AVPacket *enc_pkt = filter->enc_pkt;
int ret; int ret;
int got_frame_local;
AVPacket enc_pkt;
int (*enc_func)(AVCodecContext *, AVPacket *, const AVFrame *, int *) =
(ifmt_ctx->streams[stream_index]->codecpar->codec_type ==
AVMEDIA_TYPE_VIDEO) ? avcodec_encode_video2 : avcodec_encode_audio2;
if (!got_frame)
got_frame = &got_frame_local;
av_log(NULL, AV_LOG_INFO, "Encoding frame\n"); av_log(NULL, AV_LOG_INFO, "Encoding frame\n");
/* encode filtered frame */ /* encode filtered frame */
enc_pkt.data = NULL; av_packet_unref(enc_pkt);
enc_pkt.size = 0;
av_init_packet(&enc_pkt); ret = avcodec_send_frame(stream->enc_ctx, filt_frame);
ret = enc_func(stream_ctx[stream_index].enc_ctx, &enc_pkt,
filt_frame, got_frame);
av_frame_free(&filt_frame);
if (ret < 0) if (ret < 0)
return ret; return ret;
if (!(*got_frame))
return 0;
/* prepare packet for muxing */ while (ret >= 0) {
enc_pkt.stream_index = stream_index; ret = avcodec_receive_packet(stream->enc_ctx, enc_pkt);
av_packet_rescale_ts(&enc_pkt,
stream_ctx[stream_index].enc_ctx->time_base, if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
ofmt_ctx->streams[stream_index]->time_base); return 0;
/* prepare packet for muxing */
enc_pkt->stream_index = stream_index;
av_packet_rescale_ts(enc_pkt,
stream->enc_ctx->time_base,
ofmt_ctx->streams[stream_index]->time_base);
av_log(NULL, AV_LOG_DEBUG, "Muxing frame\n");
/* mux encoded frame */
ret = av_interleaved_write_frame(ofmt_ctx, enc_pkt);
}
av_log(NULL, AV_LOG_DEBUG, "Muxing frame\n");
/* mux encoded frame */
ret = av_interleaved_write_frame(ofmt_ctx, &enc_pkt);
return ret; return ret;
} }
static int filter_encode_write_frame(AVFrame *frame, unsigned int stream_index) static int filter_encode_write_frame(AVFrame *frame, unsigned int stream_index)
{ {
FilteringContext *filter = &filter_ctx[stream_index];
int ret; int ret;
AVFrame *filt_frame;
av_log(NULL, AV_LOG_INFO, "Pushing decoded frame to filters\n"); av_log(NULL, AV_LOG_INFO, "Pushing decoded frame to filters\n");
/* push the decoded frame into the filtergraph */ /* push the decoded frame into the filtergraph */
ret = av_buffersrc_add_frame_flags(filter_ctx[stream_index].buffersrc_ctx, ret = av_buffersrc_add_frame_flags(filter->buffersrc_ctx,
frame, 0); frame, 0);
if (ret < 0) { if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Error while feeding the filtergraph\n"); av_log(NULL, AV_LOG_ERROR, "Error while feeding the filtergraph\n");
@@ -454,14 +472,9 @@ static int filter_encode_write_frame(AVFrame *frame, unsigned int stream_index)
/* pull filtered frames from the filtergraph */ /* pull filtered frames from the filtergraph */
while (1) { while (1) {
filt_frame = av_frame_alloc();
if (!filt_frame) {
ret = AVERROR(ENOMEM);
break;
}
av_log(NULL, AV_LOG_INFO, "Pulling filtered frame from filters\n"); av_log(NULL, AV_LOG_INFO, "Pulling filtered frame from filters\n");
ret = av_buffersink_get_frame(filter_ctx[stream_index].buffersink_ctx, ret = av_buffersink_get_frame(filter->buffersink_ctx,
filt_frame); filter->filtered_frame);
if (ret < 0) { if (ret < 0) {
/* if no more frames for output - returns AVERROR(EAGAIN) /* if no more frames for output - returns AVERROR(EAGAIN)
* if flushed and no more frames for output - returns AVERROR_EOF * if flushed and no more frames for output - returns AVERROR_EOF
@@ -469,12 +482,12 @@ static int filter_encode_write_frame(AVFrame *frame, unsigned int stream_index)
*/ */
if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
ret = 0; ret = 0;
av_frame_free(&filt_frame);
break; break;
} }
filt_frame->pict_type = AV_PICTURE_TYPE_NONE; filter->filtered_frame->pict_type = AV_PICTURE_TYPE_NONE;
ret = encode_write_frame(filt_frame, stream_index, NULL); ret = encode_write_frame(stream_index, 0);
av_frame_unref(filter->filtered_frame);
if (ret < 0) if (ret < 0)
break; break;
} }
@@ -484,34 +497,20 @@ static int filter_encode_write_frame(AVFrame *frame, unsigned int stream_index)
static int flush_encoder(unsigned int stream_index) static int flush_encoder(unsigned int stream_index)
{ {
int ret;
int got_frame;
if (!(stream_ctx[stream_index].enc_ctx->codec->capabilities & if (!(stream_ctx[stream_index].enc_ctx->codec->capabilities &
AV_CODEC_CAP_DELAY)) AV_CODEC_CAP_DELAY))
return 0; return 0;
while (1) { av_log(NULL, AV_LOG_INFO, "Flushing stream #%u encoder\n", stream_index);
av_log(NULL, AV_LOG_INFO, "Flushing stream #%u encoder\n", stream_index); return encode_write_frame(stream_index, 1);
ret = encode_write_frame(NULL, stream_index, &got_frame);
if (ret < 0)
break;
if (!got_frame)
return 0;
}
return ret;
} }
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
int ret; int ret;
AVPacket packet = { .data = NULL, .size = 0 }; AVPacket *packet = NULL;
AVFrame *frame = NULL;
enum AVMediaType type;
unsigned int stream_index; unsigned int stream_index;
unsigned int i; unsigned int i;
int got_frame;
int (*dec_func)(AVCodecContext *, AVFrame *, int *, const AVPacket *);
if (argc != 3) { if (argc != 3) {
av_log(NULL, AV_LOG_ERROR, "Usage: %s <input file> <output file>\n", argv[0]); av_log(NULL, AV_LOG_ERROR, "Usage: %s <input file> <output file>\n", argv[0]);
@@ -524,56 +523,54 @@ int main(int argc, char **argv)
goto end; goto end;
if ((ret = init_filters()) < 0) if ((ret = init_filters()) < 0)
goto end; goto end;
if (!(packet = av_packet_alloc()))
goto end;
/* read all packets */ /* read all packets */
while (1) { while (1) {
if ((ret = av_read_frame(ifmt_ctx, &packet)) < 0) if ((ret = av_read_frame(ifmt_ctx, packet)) < 0)
break; break;
stream_index = packet.stream_index; stream_index = packet->stream_index;
type = ifmt_ctx->streams[packet.stream_index]->codecpar->codec_type;
av_log(NULL, AV_LOG_DEBUG, "Demuxer gave frame of stream_index %u\n", av_log(NULL, AV_LOG_DEBUG, "Demuxer gave frame of stream_index %u\n",
stream_index); stream_index);
if (filter_ctx[stream_index].filter_graph) { if (filter_ctx[stream_index].filter_graph) {
StreamContext *stream = &stream_ctx[stream_index];
av_log(NULL, AV_LOG_DEBUG, "Going to reencode&filter the frame\n"); av_log(NULL, AV_LOG_DEBUG, "Going to reencode&filter the frame\n");
frame = av_frame_alloc();
if (!frame) { av_packet_rescale_ts(packet,
ret = AVERROR(ENOMEM);
break;
}
av_packet_rescale_ts(&packet,
ifmt_ctx->streams[stream_index]->time_base, ifmt_ctx->streams[stream_index]->time_base,
stream_ctx[stream_index].dec_ctx->time_base); stream->dec_ctx->time_base);
dec_func = (type == AVMEDIA_TYPE_VIDEO) ? avcodec_decode_video2 : ret = avcodec_send_packet(stream->dec_ctx, packet);
avcodec_decode_audio4;
ret = dec_func(stream_ctx[stream_index].dec_ctx, frame,
&got_frame, &packet);
if (ret < 0) { if (ret < 0) {
av_frame_free(&frame);
av_log(NULL, AV_LOG_ERROR, "Decoding failed\n"); av_log(NULL, AV_LOG_ERROR, "Decoding failed\n");
break; break;
} }
if (got_frame) { while (ret >= 0) {
frame->pts = frame->best_effort_timestamp; ret = avcodec_receive_frame(stream->dec_ctx, stream->dec_frame);
ret = filter_encode_write_frame(frame, stream_index); if (ret == AVERROR_EOF || ret == AVERROR(EAGAIN))
av_frame_free(&frame); break;
else if (ret < 0)
goto end;
stream->dec_frame->pts = stream->dec_frame->best_effort_timestamp;
ret = filter_encode_write_frame(stream->dec_frame, stream_index);
if (ret < 0) if (ret < 0)
goto end; goto end;
} else {
av_frame_free(&frame);
} }
} else { } else {
/* remux this frame without reencoding */ /* remux this frame without reencoding */
av_packet_rescale_ts(&packet, av_packet_rescale_ts(packet,
ifmt_ctx->streams[stream_index]->time_base, ifmt_ctx->streams[stream_index]->time_base,
ofmt_ctx->streams[stream_index]->time_base); ofmt_ctx->streams[stream_index]->time_base);
ret = av_interleaved_write_frame(ofmt_ctx, &packet); ret = av_interleaved_write_frame(ofmt_ctx, packet);
if (ret < 0) if (ret < 0)
goto end; goto end;
} }
av_packet_unref(&packet); av_packet_unref(packet);
} }
/* flush filters and encoders */ /* flush filters and encoders */
@@ -597,14 +594,18 @@ int main(int argc, char **argv)
av_write_trailer(ofmt_ctx); av_write_trailer(ofmt_ctx);
end: end:
av_packet_unref(&packet); av_packet_free(&packet);
av_frame_free(&frame);
for (i = 0; i < ifmt_ctx->nb_streams; i++) { for (i = 0; i < ifmt_ctx->nb_streams; i++) {
avcodec_free_context(&stream_ctx[i].dec_ctx); avcodec_free_context(&stream_ctx[i].dec_ctx);
if (ofmt_ctx && ofmt_ctx->nb_streams > i && ofmt_ctx->streams[i] && stream_ctx[i].enc_ctx) if (ofmt_ctx && ofmt_ctx->nb_streams > i && ofmt_ctx->streams[i] && stream_ctx[i].enc_ctx)
avcodec_free_context(&stream_ctx[i].enc_ctx); avcodec_free_context(&stream_ctx[i].enc_ctx);
if (filter_ctx && filter_ctx[i].filter_graph) if (filter_ctx && filter_ctx[i].filter_graph) {
avfilter_graph_free(&filter_ctx[i].filter_graph); avfilter_graph_free(&filter_ctx[i].filter_graph);
av_packet_free(&filter_ctx[i].enc_pkt);
av_frame_free(&filter_ctx[i].filtered_frame);
}
av_frame_free(&stream_ctx[i].dec_frame);
} }
av_free(filter_ctx); av_free(filter_ctx);
av_free(stream_ctx); av_free(stream_ctx);
+8 -8
View File
@@ -74,27 +74,27 @@ static int set_hwframe_ctx(AVCodecContext *ctx, AVBufferRef *hw_device_ctx)
static int encode_write(AVCodecContext *avctx, AVFrame *frame, FILE *fout) static int encode_write(AVCodecContext *avctx, AVFrame *frame, FILE *fout)
{ {
int ret = 0; int ret = 0;
AVPacket enc_pkt; AVPacket *enc_pkt;
av_init_packet(&enc_pkt); if (!(enc_pkt = av_packet_alloc()))
enc_pkt.data = NULL; return AVERROR(ENOMEM);
enc_pkt.size = 0;
if ((ret = avcodec_send_frame(avctx, frame)) < 0) { if ((ret = avcodec_send_frame(avctx, frame)) < 0) {
fprintf(stderr, "Error code: %s\n", av_err2str(ret)); fprintf(stderr, "Error code: %s\n", av_err2str(ret));
goto end; goto end;
} }
while (1) { while (1) {
ret = avcodec_receive_packet(avctx, &enc_pkt); ret = avcodec_receive_packet(avctx, enc_pkt);
if (ret) if (ret)
break; break;
enc_pkt.stream_index = 0; enc_pkt->stream_index = 0;
ret = fwrite(enc_pkt.data, enc_pkt.size, 1, fout); ret = fwrite(enc_pkt->data, enc_pkt->size, 1, fout);
av_packet_unref(&enc_pkt); av_packet_unref(enc_pkt);
} }
end: end:
av_packet_free(&enc_pkt);
ret = ((ret == AVERROR(EAGAIN)) ? 0 : -1); ret = ((ret == AVERROR(EAGAIN)) ? 0 : -1);
return ret; return ret;
} }
+22 -20
View File
@@ -109,28 +109,25 @@ static int open_input_file(const char *filename)
return ret; return ret;
} }
static int encode_write(AVFrame *frame) static int encode_write(AVPacket *enc_pkt, AVFrame *frame)
{ {
int ret = 0; int ret = 0;
AVPacket enc_pkt;
av_init_packet(&enc_pkt); av_packet_unref(enc_pkt);
enc_pkt.data = NULL;
enc_pkt.size = 0;
if ((ret = avcodec_send_frame(encoder_ctx, frame)) < 0) { if ((ret = avcodec_send_frame(encoder_ctx, frame)) < 0) {
fprintf(stderr, "Error during encoding. Error code: %s\n", av_err2str(ret)); fprintf(stderr, "Error during encoding. Error code: %s\n", av_err2str(ret));
goto end; goto end;
} }
while (1) { while (1) {
ret = avcodec_receive_packet(encoder_ctx, &enc_pkt); ret = avcodec_receive_packet(encoder_ctx, enc_pkt);
if (ret) if (ret)
break; break;
enc_pkt.stream_index = 0; enc_pkt->stream_index = 0;
av_packet_rescale_ts(&enc_pkt, ifmt_ctx->streams[video_stream]->time_base, av_packet_rescale_ts(enc_pkt, ifmt_ctx->streams[video_stream]->time_base,
ofmt_ctx->streams[0]->time_base); ofmt_ctx->streams[0]->time_base);
ret = av_interleaved_write_frame(ofmt_ctx, &enc_pkt); ret = av_interleaved_write_frame(ofmt_ctx, enc_pkt);
if (ret < 0) { if (ret < 0) {
fprintf(stderr, "Error during writing data to output file. " fprintf(stderr, "Error during writing data to output file. "
"Error code: %s\n", av_err2str(ret)); "Error code: %s\n", av_err2str(ret));
@@ -216,7 +213,7 @@ static int dec_enc(AVPacket *pkt, AVCodec *enc_codec)
initialized = 1; initialized = 1;
} }
if ((ret = encode_write(frame)) < 0) if ((ret = encode_write(pkt, frame)) < 0)
fprintf(stderr, "Error during encoding and writing.\n"); fprintf(stderr, "Error during encoding and writing.\n");
fail: fail:
@@ -230,7 +227,7 @@ fail:
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
int ret = 0; int ret = 0;
AVPacket dec_pkt; AVPacket *dec_pkt;
AVCodec *enc_codec; AVCodec *enc_codec;
if (argc != 4) { if (argc != 4) {
@@ -246,6 +243,12 @@ int main(int argc, char **argv)
return -1; return -1;
} }
dec_pkt = av_packet_alloc();
if (!dec_pkt) {
fprintf(stderr, "Failed to allocate decode packet\n");
goto end;
}
if ((ret = open_input_file(argv[1])) < 0) if ((ret = open_input_file(argv[1])) < 0)
goto end; goto end;
@@ -275,23 +278,21 @@ int main(int argc, char **argv)
/* read all packets and only transcoding video */ /* read all packets and only transcoding video */
while (ret >= 0) { while (ret >= 0) {
if ((ret = av_read_frame(ifmt_ctx, &dec_pkt)) < 0) if ((ret = av_read_frame(ifmt_ctx, dec_pkt)) < 0)
break; break;
if (video_stream == dec_pkt.stream_index) if (video_stream == dec_pkt->stream_index)
ret = dec_enc(&dec_pkt, enc_codec); ret = dec_enc(dec_pkt, enc_codec);
av_packet_unref(&dec_pkt); av_packet_unref(dec_pkt);
} }
/* flush decoder */ /* flush decoder */
dec_pkt.data = NULL; av_packet_unref(dec_pkt);
dec_pkt.size = 0; ret = dec_enc(dec_pkt, enc_codec);
ret = dec_enc(&dec_pkt, enc_codec);
av_packet_unref(&dec_pkt);
/* flush encoder */ /* flush encoder */
ret = encode_write(NULL); ret = encode_write(dec_pkt, NULL);
/* write the trailer for output stream */ /* write the trailer for output stream */
av_write_trailer(ofmt_ctx); av_write_trailer(ofmt_ctx);
@@ -302,5 +303,6 @@ end:
avcodec_free_context(&decoder_ctx); avcodec_free_context(&decoder_ctx);
avcodec_free_context(&encoder_ctx); avcodec_free_context(&encoder_ctx);
av_buffer_unref(&hw_device_ctx); av_buffer_unref(&hw_device_ctx);
av_packet_free(&dec_pkt);
return ret; return ret;
} }
+174 -25
View File
@@ -617,6 +617,102 @@ they do not conflict with the standard, as in:
ffmpeg -i myfile.avi -target vcd -bf 2 /tmp/vcd.mpg ffmpeg -i myfile.avi -target vcd -bf 2 /tmp/vcd.mpg
@end example @end example
The parameters set for each target are as follows.
@strong{VCD}
@example
@var{pal}:
-f vcd -muxrate 1411200 -muxpreload 0.44 -packetsize 2324
-s 352x288 -r 25
-codec:v mpeg1video -g 15 -b:v 1150k -maxrate:v 1150v -minrate:v 1150k -bufsize:v 327680
-ar 44100 -ac 2
-codec:a mp2 -b:a 224k
@var{ntsc}:
-f vcd -muxrate 1411200 -muxpreload 0.44 -packetsize 2324
-s 352x240 -r 30000/1001
-codec:v mpeg1video -g 18 -b:v 1150k -maxrate:v 1150v -minrate:v 1150k -bufsize:v 327680
-ar 44100 -ac 2
-codec:a mp2 -b:a 224k
@var{film}:
-f vcd -muxrate 1411200 -muxpreload 0.44 -packetsize 2324
-s 352x240 -r 24000/1001
-codec:v mpeg1video -g 18 -b:v 1150k -maxrate:v 1150v -minrate:v 1150k -bufsize:v 327680
-ar 44100 -ac 2
-codec:a mp2 -b:a 224k
@end example
@strong{SVCD}
@example
@var{pal}:
-f svcd -packetsize 2324
-s 480x576 -pix_fmt yuv420p -r 25
-codec:v mpeg2video -g 15 -b:v 2040k -maxrate:v 2516k -minrate:v 0 -bufsize:v 1835008 -scan_offset 1
-ar 44100
-codec:a mp2 -b:a 224k
@var{ntsc}:
-f svcd -packetsize 2324
-s 480x480 -pix_fmt yuv420p -r 30000/1001
-codec:v mpeg2video -g 18 -b:v 2040k -maxrate:v 2516k -minrate:v 0 -bufsize:v 1835008 -scan_offset 1
-ar 44100
-codec:a mp2 -b:a 224k
@var{film}:
-f svcd -packetsize 2324
-s 480x480 -pix_fmt yuv420p -r 24000/1001
-codec:v mpeg2video -g 18 -b:v 2040k -maxrate:v 2516k -minrate:v 0 -bufsize:v 1835008 -scan_offset 1
-ar 44100
-codec:a mp2 -b:a 224k
@end example
@strong{DVD}
@example
@var{pal}:
-f dvd -muxrate 10080k -packetsize 2048
-s 720x576 -pix_fmt yuv420p -r 25
-codec:v mpeg2video -g 15 -b:v 6000k -maxrate:v 9000k -minrate:v 0 -bufsize:v 1835008
-ar 48000
-codec:a ac3 -b:a 448k
@var{ntsc}:
-f dvd -muxrate 10080k -packetsize 2048
-s 720x480 -pix_fmt yuv420p -r 30000/1001
-codec:v mpeg2video -g 18 -b:v 6000k -maxrate:v 9000k -minrate:v 0 -bufsize:v 1835008
-ar 48000
-codec:a ac3 -b:a 448k
@var{film}:
-f dvd -muxrate 10080k -packetsize 2048
-s 720x480 -pix_fmt yuv420p -r 24000/1001
-codec:v mpeg2video -g 18 -b:v 6000k -maxrate:v 9000k -minrate:v 0 -bufsize:v 1835008
-ar 48000
-codec:a ac3 -b:a 448k
@end example
@strong{DV}
@example
@var{pal}:
-f dv
-s 720x576 -pix_fmt yuv420p -r 25
-ar 48000 -ac 2
@var{ntsc}:
-f dv
-s 720x480 -pix_fmt yuv411p -r 30000/1001
-ar 48000 -ac 2
@var{film}:
-f dv
-s 720x480 -pix_fmt yuv411p -r 24000/1001
-ar 48000 -ac 2
@end example
The @code{dv50} target is identical to the @code{dv} target except that the pixel format set is @code{yuv422p} for all three standards.
Any user-set value for a parameter above will override the target preset value. In that case, the output may
not comply with the target standard.
@item -dn (@emph{input/output}) @item -dn (@emph{input/output})
As an input option, blocks all data streams of a file from being filtered or As an input option, blocks all data streams of a file from being filtered or
being automatically selected or mapped for any output. See @code{-discard} being automatically selected or mapped for any output. See @code{-discard}
@@ -675,14 +771,19 @@ Specify the preset for matching stream(s).
Print encoding progress/statistics. It is on by default, to explicitly Print encoding progress/statistics. It is on by default, to explicitly
disable it you need to specify @code{-nostats}. disable it you need to specify @code{-nostats}.
@item -stats_period @var{time} (@emph{global})
Set period at which encoding progress/statistics are updated. Default is 0.5 seconds.
@item -progress @var{url} (@emph{global}) @item -progress @var{url} (@emph{global})
Send program-friendly progress information to @var{url}. Send program-friendly progress information to @var{url}.
Progress information is written approximately every second and at the end of Progress information is written periodically and at the end of
the encoding process. It is made of "@var{key}=@var{value}" lines. @var{key} the encoding process. It is made of "@var{key}=@var{value}" lines. @var{key}
consists of only alphanumeric characters. The last key of a sequence of consists of only alphanumeric characters. The last key of a sequence of
progress information is always "progress". progress information is always "progress".
The update period is set using @code{-stats_period}.
@anchor{stdin option} @anchor{stdin option}
@item -stdin @item -stdin
Enable interaction on standard input. On by default unless standard input is Enable interaction on standard input. On by default unless standard input is
@@ -734,10 +835,6 @@ ffmpeg -dump_attachment:t "" -i INPUT
Technical note -- attachments are implemented as codec extradata, so this Technical note -- attachments are implemented as codec extradata, so this
option can actually be used to extract extradata from any stream, not just option can actually be used to extract extradata from any stream, not just
attachments. attachments.
@item -noautorotate
Disable automatically rotating video based on file metadata.
@end table @end table
@section Video Options @section Video Options
@@ -758,6 +855,13 @@ If in doubt use @option{-framerate} instead of the input option @option{-r}.
As an output option, duplicate or drop input frames to achieve constant output As an output option, duplicate or drop input frames to achieve constant output
frame rate @var{fps}. frame rate @var{fps}.
@item -fpsmax[:@var{stream_specifier}] @var{fps} (@emph{output,per-stream})
Set maximum frame rate (Hz value, fraction or abbreviation).
Clamps output frame rate when output framerate is auto-set and is higher than this value.
Useful in batch processing or when input framerate is wrongly detected as very high.
It cannot be set together with @code{-r}. It is ignored during streamcopy.
@item -s[:@var{stream_specifier}] @var{size} (@emph{input/output,per-stream}) @item -s[:@var{stream_specifier}] @var{size} (@emph{input/output,per-stream})
Set frame size. Set frame size.
@@ -819,6 +923,18 @@ Create the filtergraph specified by @var{filtergraph} and use it to
filter the stream. filter the stream.
This is an alias for @code{-filter:v}, see the @ref{filter_option,,-filter option}. This is an alias for @code{-filter:v}, see the @ref{filter_option,,-filter option}.
@item -autorotate
Automatically rotate the video according to file metadata. Enabled by
default, use @option{-noautorotate} to disable it.
@item -autoscale
Automatically scale the video according to the resolution of first frame.
Enabled by default, use @option{-noautoscale} to disable it. When autoscale is
disabled, all output frames of filter graph might not be in the same resolution
and may be inadequate for some encoder/muxer. Therefore, it is not recommended
to disable it unless you really know what you are doing.
Disable autoscale at your own risk.
@end table @end table
@section Advanced Video options @section Advanced Video options
@@ -848,8 +964,8 @@ factor if negative.
Force interlacing support in encoder (MPEG-2 and MPEG-4 only). Force interlacing support in encoder (MPEG-2 and MPEG-4 only).
Use this option if your input file is interlaced and you want Use this option if your input file is interlaced and you want
to keep the interlaced format for minimum losses. to keep the interlaced format for minimum losses.
The alternative is to deinterlace the input stream with The alternative is to deinterlace the input stream by use of a filter
@option{-deinterlace}, but deinterlacing introduces losses. such as @code{yadif} or @code{bwdif}, but deinterlacing introduces losses.
@item -psnr @item -psnr
Calculate PSNR of compressed frames. Calculate PSNR of compressed frames.
@item -vstats @item -vstats
@@ -1492,6 +1608,17 @@ is enabled.
This option has been deprecated. Use the @code{aresample} audio filter instead. This option has been deprecated. Use the @code{aresample} audio filter instead.
@item -adrift_threshold @var{time}
Set the minimum difference between timestamps and audio data (in seconds) to trigger
adding/dropping samples to make it match the timestamps. This option effectively is
a threshold to select between hard (add/drop) and soft (squeeze/stretch) compensation.
@code{-async} must be set to a positive value.
@item -apad @var{parameters} (@emph{output,per-stream})
Pad the output audio stream(s). This is the same as applying @code{-af apad}.
Argument is a string of filter parameters composed the same as with the @code{apad} filter.
@code{-shortest} must be set for this output for the option to take effect.
@item -copyts @item -copyts
Do not process input timestamps, but keep their values without trying Do not process input timestamps, but keep their values without trying
to sanitize them. In particular, do not remove the initial start time to sanitize them. In particular, do not remove the initial start time
@@ -1646,6 +1773,22 @@ graph will be added to the output file automatically, so we can simply write
ffmpeg -i video.mkv -i image.png -filter_complex 'overlay' out.mkv ffmpeg -i video.mkv -i image.png -filter_complex 'overlay' out.mkv
@end example @end example
As a special exception, you can use a bitmap subtitle stream as input: it
will be converted into a video with the same size as the largest video in
the file, or 720x576 if no video is present. Note that this is an
experimental and temporary solution. It will be removed once libavfilter has
proper support for subtitles.
For example, to hardcode subtitles on top of a DVB-T recording stored in
MPEG-TS format, delaying the subtitles by 1 second:
@example
ffmpeg -i input.ts -filter_complex \
'[#0x2ef] setpts=PTS+1/TB [sub] ; [#0x2d0] [sub] overlay' \
-sn -map '#0x2dc' output.mkv
@end example
(0x2d0, 0x2dc and 0x2ef are the MPEG-TS PIDs of respectively the video,
audio and subtitles streams; 0:0, 0:3 and 0:7 would have worked too)
To generate 5 seconds of pure red video using lavfi @code{color} source: To generate 5 seconds of pure red video using lavfi @code{color} source:
@example @example
ffmpeg -filter_complex 'color=c=red' -t 5 out.mkv ffmpeg -filter_complex 'color=c=red' -t 5 out.mkv
@@ -1681,8 +1824,9 @@ not start from timestamp 0, such as transport streams.
@item -thread_queue_size @var{size} (@emph{input}) @item -thread_queue_size @var{size} (@emph{input})
This option sets the maximum number of queued packets when reading from the This option sets the maximum number of queued packets when reading from the
file or device. With low latency / high rate live streams, packets may be file or device. With low latency / high rate live streams, packets may be
discarded if they are not read in a timely manner; raising this value can discarded if they are not read in a timely manner; setting this value can
avoid it. force ffmpeg to use a separate input thread and read packets as soon as they
arrive. By default ffmpeg only do this if multiple inputs are specified.
@item -sdp_file @var{file} (@emph{global}) @item -sdp_file @var{file} (@emph{global})
Print sdp information for an output stream to @var{file}. Print sdp information for an output stream to @var{file}.
@@ -1725,6 +1869,11 @@ No packets were passed to the muxer, the output is empty.
No packets were passed to the muxer in some of the output streams. No packets were passed to the muxer in some of the output streams.
@end table @end table
@item -max_error_rate (@emph{global})
Set fraction of decoding frame failures across all inputs which when crossed
ffmpeg will return exit code 69. Crossing this threshold does not terminate
processing. Range is a floating-point number between 0 to 1. Default is 2/3.
@item -xerror (@emph{global}) @item -xerror (@emph{global})
Stop and exit on error Stop and exit on error
@@ -1737,24 +1886,23 @@ this buffer, in packets, for the matching output stream.
The default value of this option should be high enough for most uses, so only The default value of this option should be high enough for most uses, so only
touch this option if you are sure that you need it. touch this option if you are sure that you need it.
@item -muxing_queue_data_threshold @var{bytes} (@emph{output,per-stream})
This is a minimum threshold until which the muxing queue size is not taken into
account. Defaults to 50 megabytes per stream, and is based on the overall size
of packets passed to the muxer.
@item -auto_conversion_filters (@emph{global})
Enable automatically inserting format conversion filters in all filter
graphs, including those defined by @option{-vf}, @option{-af},
@option{-filter_complex} and @option{-lavfi}. If filter format negotiation
requires a conversion, the initialization of the filters will fail.
Conversions can still be performed by inserting the relevant conversion
filter (scale, aresample) in the graph.
On by default, to explicitly disable it you need to specify
@code{-noauto_conversion_filters}.
@end table @end table
As a special exception, you can use a bitmap subtitle stream as input: it
will be converted into a video with the same size as the largest video in
the file, or 720x576 if no video is present. Note that this is an
experimental and temporary solution. It will be removed once libavfilter has
proper support for subtitles.
For example, to hardcode subtitles on top of a DVB-T recording stored in
MPEG-TS format, delaying the subtitles by 1 second:
@example
ffmpeg -i input.ts -filter_complex \
'[#0x2ef] setpts=PTS+1/TB [sub] ; [#0x2d0] [sub] overlay' \
-sn -map '#0x2dc' output.mkv
@end example
(0x2d0, 0x2dc and 0x2ef are the MPEG-TS PIDs of respectively the video,
audio and subtitles streams; 0:0, 0:3 and 0:7 would have worked too)
@section Preset files @section Preset files
A preset file contains a sequence of @var{option}=@var{value} pairs, A preset file contains a sequence of @var{option}=@var{value} pairs,
one for each line, specifying a sequence of options which would be one for each line, specifying a sequence of options which would be
@@ -2031,6 +2179,7 @@ ffmpeg -i src.ext -lmax 21*QP2LAMBDA dst.ext
@ifset config-avfilter @ifset config-avfilter
@include filters.texi @include filters.texi
@end ifset @end ifset
@include general_contents.texi
@end ifset @end ifset
@chapter See Also @chapter See Also
+1
View File
@@ -295,6 +295,7 @@ Toggle full screen.
@ifset config-avfilter @ifset config-avfilter
@include filters.texi @include filters.texi
@end ifset @end ifset
@include general_contents.texi
@end ifset @end ifset
@chapter See Also @chapter See Also
+1
View File
@@ -642,6 +642,7 @@ DV, GXF and AVI timecodes are available in format metadata
@ifset config-avfilter @ifset config-avfilter
@include filters.texi @include filters.texi
@end ifset @end ifset
@include general_contents.texi
@end ifset @end ifset
@chapter See Also @chapter See Also
-5
View File
@@ -61,8 +61,6 @@
<xsd:attribute name="dts_time" type="xsd:float" /> <xsd:attribute name="dts_time" type="xsd:float" />
<xsd:attribute name="duration" type="xsd:long" /> <xsd:attribute name="duration" type="xsd:long" />
<xsd:attribute name="duration_time" type="xsd:float" /> <xsd:attribute name="duration_time" type="xsd:float" />
<xsd:attribute name="convergence_duration" type="xsd:long" />
<xsd:attribute name="convergence_duration_time" type="xsd:float" />
<xsd:attribute name="size" type="xsd:long" use="required" /> <xsd:attribute name="size" type="xsd:long" use="required" />
<xsd:attribute name="pos" type="xsd:long" /> <xsd:attribute name="pos" type="xsd:long" />
<xsd:attribute name="flags" type="xsd:string" use="required" /> <xsd:attribute name="flags" type="xsd:string" use="required" />
@@ -215,7 +213,6 @@
<xsd:attribute name="codec_long_name" type="xsd:string" /> <xsd:attribute name="codec_long_name" type="xsd:string" />
<xsd:attribute name="profile" type="xsd:string" /> <xsd:attribute name="profile" type="xsd:string" />
<xsd:attribute name="codec_type" type="xsd:string" /> <xsd:attribute name="codec_type" type="xsd:string" />
<xsd:attribute name="codec_time_base" type="xsd:string" use="required"/>
<xsd:attribute name="codec_tag" type="xsd:string" use="required"/> <xsd:attribute name="codec_tag" type="xsd:string" use="required"/>
<xsd:attribute name="codec_tag_string" type="xsd:string" use="required"/> <xsd:attribute name="codec_tag_string" type="xsd:string" use="required"/>
<xsd:attribute name="extradata" type="xsd:string" /> <xsd:attribute name="extradata" type="xsd:string" />
@@ -238,7 +235,6 @@
<xsd:attribute name="color_primaries" type="xsd:string"/> <xsd:attribute name="color_primaries" type="xsd:string"/>
<xsd:attribute name="chroma_location" type="xsd:string"/> <xsd:attribute name="chroma_location" type="xsd:string"/>
<xsd:attribute name="field_order" type="xsd:string"/> <xsd:attribute name="field_order" type="xsd:string"/>
<xsd:attribute name="timecode" type="xsd:string"/>
<xsd:attribute name="refs" type="xsd:int"/> <xsd:attribute name="refs" type="xsd:int"/>
<!-- audio attributes --> <!-- audio attributes -->
@@ -358,7 +354,6 @@
<xsd:attribute name="hwaccel" type="xsd:int" use="required"/> <xsd:attribute name="hwaccel" type="xsd:int" use="required"/>
<xsd:attribute name="planar" type="xsd:int" use="required"/> <xsd:attribute name="planar" type="xsd:int" use="required"/>
<xsd:attribute name="rgb" type="xsd:int" use="required"/> <xsd:attribute name="rgb" type="xsd:int" use="required"/>
<xsd:attribute name="pseudopal" type="xsd:int" use="required"/>
<xsd:attribute name="alpha" type="xsd:int" use="required"/> <xsd:attribute name="alpha" type="xsd:int" use="required"/>
</xsd:complexType> </xsd:complexType>
+15 -2
View File
@@ -107,17 +107,24 @@ Print detailed information about the muxer named @var{muxer_name}. Use the
@option{-formats} option to get a list of all muxers and demuxers. @option{-formats} option to get a list of all muxers and demuxers.
@item filter=@var{filter_name} @item filter=@var{filter_name}
Print detailed information about the filter name @var{filter_name}. Use the Print detailed information about the filter named @var{filter_name}. Use the
@option{-filters} option to get a list of all filters. @option{-filters} option to get a list of all filters.
@item bsf=@var{bitstream_filter_name} @item bsf=@var{bitstream_filter_name}
Print detailed information about the bitstream filter name @var{bitstream_filter_name}. Print detailed information about the bitstream filter named @var{bitstream_filter_name}.
Use the @option{-bsfs} option to get a list of all bitstream filters. Use the @option{-bsfs} option to get a list of all bitstream filters.
@item protocol=@var{protocol_name}
Print detailed information about the protocol named @var{protocol_name}.
Use the @option{-protocols} option to get a list of all protocols.
@end table @end table
@item -version @item -version
Show version. Show version.
@item -buildconf
Show the build configuration, one option per line.
@item -formats @item -formats
Show available formats (including devices). Show available formats (including devices).
@@ -345,6 +352,12 @@ Possible flags for this option are:
@item k8 @item k8
@end table @end table
@end table @end table
@item -max_alloc @var{bytes}
Set the maximum size limit for allocating a block on the heap by ffmpeg's
family of malloc functions. Exercise @strong{extreme caution} when using
this option. Don't use if you do not understand the full consequence of doing so.
Default is INT_MAX.
@end table @end table
@section AVOptions @section AVOptions
+1630 -77
View File
File diff suppressed because it is too large Load Diff
+1 -1400
View File
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+56 -5
View File
@@ -296,16 +296,31 @@ supports it.
Set the pixel format of the captured video. Set the pixel format of the captured video.
Available values are: Available values are:
@table @samp @table @samp
@item auto
This is the default which means 8-bit YUV 422 or 8-bit ARGB if format
autodetection is used, 8-bit YUV 422 otherwise.
@item uyvy422 @item uyvy422
8-bit YUV 422.
@item yuv422p10 @item yuv422p10
10-bit YUV 422.
@item argb @item argb
8-bit RGB.
@item bgra @item bgra
8-bit RGB.
@item rgb10 @item rgb10
10-bit RGB.
@end table @end table
@item teletext_lines @item teletext_lines
@@ -335,8 +350,13 @@ Defaults to @samp{unset}.
@item timecode_format @item timecode_format
Timecode type to include in the frame and video stream metadata. Must be Timecode type to include in the frame and video stream metadata. Must be
@samp{none}, @samp{rp188vitc}, @samp{rp188vitc2}, @samp{rp188ltc}, @samp{none}, @samp{rp188vitc}, @samp{rp188vitc2}, @samp{rp188ltc},
@samp{rp188any}, @samp{vitc}, @samp{vitc2}, or @samp{serial}. Defaults to @samp{rp188hfr}, @samp{rp188any}, @samp{vitc}, @samp{vitc2}, or @samp{serial}.
@samp{none} (not included). Defaults to @samp{none} (not included).
In order to properly support 50/60 fps timecodes, the ordering of the queried
timecode types for @samp{rp188any} is HFR, VITC1, VITC2 and LTC for >30 fps
content. Note that this is slightly different to the ordering used by the
DeckLink API, which is HFR, VITC1, LTC, VITC2.
@item video_input @item video_input
Sets the video input source. Must be @samp{unset}, @samp{sdi}, @samp{hdmi}, Sets the video input source. Must be @samp{unset}, @samp{sdi}, @samp{hdmi},
@@ -398,6 +418,12 @@ are dropped till a frame with timecode is received.
Option @var{timecode_format} must be specified. Option @var{timecode_format} must be specified.
Defaults to @option{false}. Defaults to @option{false}.
@item enable_klv(@emph{bool})
If set to @option{true}, extracts KLV data from VANC and outputs KLV packets.
KLV VANC packets are joined based on MID and PSC fields and aggregated into
one KLV packet.
Defaults to @option{false}.
@end table @end table
@subsection Examples @subsection Examples
@@ -883,11 +909,15 @@ If you don't understand what all of that means, you probably don't want this. L
DRM device to capture on. Defaults to @option{/dev/dri/card0}. DRM device to capture on. Defaults to @option{/dev/dri/card0}.
@item format @item format
Pixel format of the framebuffer. Defaults to @option{bgr0}. Pixel format of the framebuffer. This can be autodetected if you are running Linux 5.7
or later, but needs to be provided for earlier versions. Defaults to @option{bgr0},
which is the most common format used by the Linux console and Xorg X server.
@item format_modifier @item format_modifier
Format modifier to signal on output frames. This is necessary to import correctly into Format modifier to signal on output frames. This is necessary to import correctly into
some APIs, but can't be autodetected. See the libdrm documentation for possible values. some APIs. It can be autodetected if you are running Linux 5.7 or later, but will need
to be provided explicitly when needed in earlier versions. See the libdrm documentation
for possible values.
@item crtc_id @item crtc_id
KMS CRTC ID to define the capture source. The first active plane on the given CRTC KMS CRTC ID to define the capture source. The first active plane on the given CRTC
@@ -1478,6 +1508,14 @@ ffmpeg -f x11grab -framerate 25 -video_size cif -i :0.0+10,20 out.mpg
@subsection Options @subsection Options
@table @option @table @option
@item select_region
Specify whether to select the grabbing area graphically using the pointer.
A value of @code{1} prompts the user to select the grabbing area graphically
by clicking and dragging. A single click with no dragging will select the
whole screen. A region with zero width or height will also select the whole
screen. This option overwrites the @var{video_size}, @var{grab_x}, and
@var{grab_y} options. Default value is @code{0}.
@item draw_mouse @item draw_mouse
Specify whether to draw the mouse pointer. A value of @code{0} specifies Specify whether to draw the mouse pointer. A value of @code{0} specifies
not to draw the pointer. Default value is @code{1}. not to draw the pointer. Default value is @code{1}.
@@ -1526,8 +1564,21 @@ With @var{follow_mouse}:
ffmpeg -f x11grab -follow_mouse centered -show_region 1 -framerate 25 -video_size cif -i :0.0 out.mpg ffmpeg -f x11grab -follow_mouse centered -show_region 1 -framerate 25 -video_size cif -i :0.0 out.mpg
@end example @end example
@item window_id
Grab this window, instead of the whole screen. Default value is 0, which maps to
the whole screen (root window).
The id of a window can be found using the @command{xwininfo} program, possibly with options -tree and
-root.
If the window is later enlarged, the new area is not recorded. Video ends when
the window is closed, unmapped (i.e., iconified) or shrunk beyond the video
size (which defaults to the initial window size).
This option disables options @option{follow_mouse} and @option{select_region}.
@item video_size @item video_size
Set the video frame size. Default is the full desktop. Set the video frame size. Default is the full desktop or window.
@item grab_x @item grab_x
@item grab_y @item grab_y
+1 -2
View File
@@ -20,8 +20,7 @@ Slice threading -
Frame threading - Frame threading -
* Restrictions with slice threading also apply. * Restrictions with slice threading also apply.
* For best performance, the client should set thread_safe_callbacks if it * Custom get_buffer2() and get_format() callbacks must be thread-safe.
provides a thread-safe get_buffer() callback.
* There is one frame of delay added for every thread beyond the first one. * There is one frame of delay added for every thread beyond the first one.
Clients must be able to handle this; the pkt_dts and pkt_pts fields in Clients must be able to handle this; the pkt_dts and pkt_pts fields in
AVFrame will work as usual. AVFrame will work as usual.
+47 -7
View File
@@ -89,6 +89,12 @@ specific scenarios, e.g. when merging multiple audio streams into one for
compatibility with software that only supports a single audio stream in AVI compatibility with software that only supports a single audio stream in AVI
(see @ref{amerge,,the "amerge" section in the ffmpeg-filters manual,ffmpeg-filters}). (see @ref{amerge,,the "amerge" section in the ffmpeg-filters manual,ffmpeg-filters}).
@item flipped_raw_rgb
If set to true, store positive height for raw RGB bitmaps, which indicates
bitmap is stored bottom-up. Note that this option does not flip the bitmap
which has to be done manually beforehand, e.g. by using the vflip filter.
Default is @var{false} and indicates bitmap is stored top down.
@end table @end table
@anchor{chromaprint} @anchor{chromaprint}
@@ -236,6 +242,8 @@ This is a deprecated option to set the segment length in microseconds, use @var{
@item seg_duration @var{duration} @item seg_duration @var{duration}
Set the segment length in seconds (fractional value can be set). The value is Set the segment length in seconds (fractional value can be set). The value is
treated as average segment duration when @var{use_template} is enabled and treated as average segment duration when @var{use_template} is enabled and
@var{use_timeline} is disabled and as minimum segment duration for all the other
use cases.
@item frag_duration @var{duration} @item frag_duration @var{duration}
Set the length in seconds of fragments within segments (fractional value can be set). Set the length in seconds of fragments within segments (fractional value can be set).
@item frag_type @var{type} @item frag_type @var{type}
@@ -267,8 +275,10 @@ Override User-Agent field in HTTP header. Applicable only for HTTP output.
@item http_persistent @var{http_persistent} @item http_persistent @var{http_persistent}
Use persistent HTTP connections. Applicable only for HTTP output. Use persistent HTTP connections. Applicable only for HTTP output.
@item hls_playlist @var{hls_playlist} @item hls_playlist @var{hls_playlist}
Generate HLS playlist files as well. The master playlist is generated with the filename master.m3u8. Generate HLS playlist files as well. The master playlist is generated with the filename @var{hls_master_name}.
One media playlist file is generated for each stream with filenames media_0.m3u8, media_1.m3u8, etc. One media playlist file is generated for each stream with filenames media_0.m3u8, media_1.m3u8, etc.
@item hls_master_name @var{file_name}
HLS master playlist name. Default is "master.m3u8".
@item streaming @var{streaming} @item streaming @var{streaming}
Enable (1) or disable (0) chunk streaming mode of output. In chunk streaming Enable (1) or disable (0) chunk streaming mode of output. In chunk streaming
mode, each frame will be a moof fragment which forms a chunk. mode, each frame will be a moof fragment which forms a chunk.
@@ -364,6 +374,10 @@ adjusting playback latency and buffer occupancy during normal playback by client
Set the maximum playback rate indicated as appropriate for the purposes of automatically Set the maximum playback rate indicated as appropriate for the purposes of automatically
adjusting playback latency and buffer occupancy during normal playback by clients. adjusting playback latency and buffer occupancy during normal playback by clients.
@item update_period @var{update_period}
Set the mpd update period ,for dynamic content.
The unit is second.
@end table @end table
@anchor{framecrc} @anchor{framecrc}
@@ -597,14 +611,21 @@ segmentation.
This muxer supports the following options: This muxer supports the following options:
@table @option @table @option
@item hls_init_time @var{seconds} @item hls_init_time @var{duration}
Set the initial target segment length in seconds. Default value is @var{0}. Set the initial target segment length. Default value is @var{0}.
@var{duration} must be a time duration specification,
see @ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}.
Segment will be cut on the next key frame after this time has passed on the first m3u8 list. Segment will be cut on the next key frame after this time has passed on the first m3u8 list.
After the initial playlist is filled @command{ffmpeg} will cut segments After the initial playlist is filled @command{ffmpeg} will cut segments
at duration equal to @code{hls_time} at duration equal to @code{hls_time}
@item hls_time @var{seconds} @item hls_time @var{duration}
Set the target segment length in seconds. Default value is 2. Set the target segment length. Default value is 2.
@var{duration} must be a time duration specification,
see @ref{time duration syntax,,the Time duration section in the ffmpeg-utils(1) manual,ffmpeg-utils}.
Segment will be cut on the next key frame after this time has passed. Segment will be cut on the next key frame after this time has passed.
@item hls_list_size @var{size} @item hls_list_size @var{size}
@@ -819,7 +840,7 @@ When enabled every segment generated is encrypted and the encryption key
is saved as @var{playlist name}.key. is saved as @var{playlist name}.key.
@item -hls_enc_key @var{key} @item -hls_enc_key @var{key}
Hex-coded 16byte key to encrypt the segments, by default it 16-octet key to encrypt the segments, by default it
is randomly generated. is randomly generated.
@item -hls_enc_key_url @var{keyurl} @item -hls_enc_key_url @var{keyurl}
@@ -827,7 +848,7 @@ If set, @var{keyurl} is prepended instead of @var{baseurl} to the key filename
in the playlist. in the playlist.
@item -hls_enc_iv @var{iv} @item -hls_enc_iv @var{iv}
Hex-coded 16byte initialization vector for every segment instead 16-octet initialization vector for every segment instead
of the autogenerated ones. of the autogenerated ones.
@item hls_segment_type @var{flags} @item hls_segment_type @var{flags}
@@ -847,6 +868,13 @@ fmp4 files may be used in HLS version 7 and above.
@item hls_fmp4_init_filename @var{filename} @item hls_fmp4_init_filename @var{filename}
Set filename to the fragment files header file, default filename is @file{init.mp4}. Set filename to the fragment files header file, default filename is @file{init.mp4}.
Use @code{-strftime 1} on @var{filename} to expand the segment filename with localtime.
@example
ffmpeg -i in.nut -hls_segment_type fmp4 -strftime 1 -hls_fmp4_init_filename "%s_init.mp4" out.m3u8
@end example
This will produce init like this
@file{1602678741_init.mp4}
@item hls_fmp4_init_resend @item hls_fmp4_init_resend
Resend init file after m3u8 file refresh every time, default is @var{0}. Resend init file after m3u8 file refresh every time, default is @var{0}.
@@ -1407,6 +1435,13 @@ disposition default exists, no subtitle track will be marked as default.
In this mode the FlagDefault is set if and only if the AV_DISPOSITION_DEFAULT In this mode the FlagDefault is set if and only if the AV_DISPOSITION_DEFAULT
flag is set in the disposition of the corresponding stream. flag is set in the disposition of the corresponding stream.
@end table @end table
@item flipped_raw_rgb
If set to true, store positive height for raw RGB bitmaps, which indicates
bitmap is stored bottom-up. Note that this option does not flip the bitmap
which has to be done manually beforehand, e.g. by using the vflip filter.
Default is @var{false} and indicates bitmap is stored top down.
@end table @end table
@anchor{md5} @anchor{md5}
@@ -2275,6 +2310,11 @@ certain (usually permanent) errors the recovery is not attempted even when
Specify whether to wait for the keyframe after recovering from Specify whether to wait for the keyframe after recovering from
queue overflow or failure. This option is set to 0 (false) by default. queue overflow or failure. This option is set to 0 (false) by default.
@item timeshift @var{duration}
Buffer the specified amount of packets and delay writing the output. Note that
@var{queue_size} must be big enough to store the packets for timeshift. At the
end of the input the fifo buffer is flushed at realtime speed.
@end table @end table
@subsection Examples @subsection Examples
+46
View File
@@ -38,6 +38,52 @@ ffmpeg -i INPUT -f alsa hw:1,7
@end example @end example
@end itemize @end itemize
@section AudioToolbox
AudioToolbox output device.
Allows native output to CoreAudio devices on OSX.
The output filename can be empty (or @code{-}) to refer to the default system output device or a number that refers to the device index as shown using: @code{-list_devices true}.
Alternatively, the audio input device can be chosen by index using the
@option{
-audio_device_index <INDEX>
}
, overriding any device name or index given in the input filename.
All available devices can be enumerated by using @option{-list_devices true}, listing
all device names, UIDs and corresponding indices.
@subsection Options
AudioToolbox supports the following options:
@table @option
@item -audio_device_index <INDEX>
Specify the audio device by its index. Overrides anything given in the output filename.
@end table
@subsection Examples
@itemize
@item
Print the list of supported devices and output a sine wave to the default device:
@example
$ ffmpeg -f lavfi -i sine=r=44100 -f audiotoolbox -list_devices true -
@end example
@item
Output a sine wave to the device with the index 2, overriding any output filename:
@example
$ ffmpeg -f lavfi -i sine=r=44100 -f audiotoolbox -audio_device_index 2 -
@end example
@end itemize
@section caca @section caca
CACA output device. CACA output device.
+116 -10
View File
@@ -63,16 +63,17 @@ After starting the broker, an FFmpeg client may stream data to the broker using
the command: the command:
@example @example
ffmpeg -re -i input -f mpegts amqp://[[user]:[password]@@]hostname[:port] ffmpeg -re -i input -f mpegts amqp://[[user]:[password]@@]hostname[:port][/vhost]
@end example @end example
Where hostname and port (default is 5672) is the address of the broker. The Where hostname and port (default is 5672) is the address of the broker. The
client may also set a user/password for authentication. The default for both client may also set a user/password for authentication. The default for both
fields is "guest". fields is "guest". Name of virtual host on broker can be set with vhost. The
default value is "/".
Muliple subscribers may stream from the broker using the command: Muliple subscribers may stream from the broker using the command:
@example @example
ffplay amqp://[[user]:[password]@@]hostname[:port] ffplay amqp://[[user]:[password]@@]hostname[:port][/vhost]
@end example @end example
In RabbitMQ all data published to the broker flows through a specific exchange, In RabbitMQ all data published to the broker flows through a specific exchange,
@@ -109,6 +110,21 @@ the received message may be truncated causing decoding errors.
The timeout in seconds during the initial connection to the broker. The The timeout in seconds during the initial connection to the broker. The
default value is rw_timeout, or 5 seconds if rw_timeout is not set. default value is rw_timeout, or 5 seconds if rw_timeout is not set.
@item delivery_mode @var{mode}
Sets the delivery mode of each message sent to broker.
The following values are accepted:
@table @samp
@item persistent
Delivery mode set to "persistent" (2). This is the default value.
Messages may be written to the broker's disk depending on its setup.
@item non-persistent
Delivery mode set to "non-persistent" (1).
Messages will stay in broker's memory unless the broker is under memory
pressure.
@end table
@end table @end table
@section async @section async
@@ -159,6 +175,16 @@ Caching wrapper for input stream.
Cache the input stream to temporary file. It brings seeking capability to live streams. Cache the input stream to temporary file. It brings seeking capability to live streams.
The accepted options are:
@table @option
@item read_ahead_limit
Amount in bytes that may be read ahead when seeking isn't supported. Range is -1 to INT_MAX.
-1 for unlimited. Default is 65536.
@end table
URL Syntax is
@example @example
cache:@var{URL} cache:@var{URL}
@end example @end example
@@ -315,6 +341,12 @@ operation. ff* tools may produce incomplete content due to server limitations.
Gopher protocol. Gopher protocol.
@section gophers
Gophers protocol.
The Gopher protocol with TLS encapsulation.
@section hls @section hls
Read Apple HTTP Live Streaming compliant segmented stream as Read Apple HTTP Live Streaming compliant segmented stream as
@@ -377,11 +409,6 @@ string describing the libavformat build. ("Lavf/<version>")
@item user-agent @item user-agent
This is a deprecated option, you can use user_agent instead it. This is a deprecated option, you can use user_agent instead it.
@item timeout
Set timeout in microseconds of socket I/O operations used by the underlying low level
operation. By default it is set to -1, which means that the timeout is
not specified.
@item reconnect_at_eof @item reconnect_at_eof
If set then eof is treated like an error and causes reconnection, this is useful If set then eof is treated like an error and causes reconnection, this is useful
for live / endless streams. for live / endless streams.
@@ -389,6 +416,13 @@ for live / endless streams.
@item reconnect_streamed @item reconnect_streamed
If set then even streamed/non seekable streams will be reconnected on errors. If set then even streamed/non seekable streams will be reconnected on errors.
@item reconnect_on_network_error
Reconnect automatically in case of TCP/TLS errors during connect.
@item reconnect_on_http_error
A comma separated list of HTTP status codes to reconnect on. The list can
include specific status codes (e.g. '503') or the strings '4xx' / '5xx'.
@item reconnect_delay_max @item reconnect_delay_max
Sets the maximum delay in seconds after which to give up reconnecting Sets the maximum delay in seconds after which to give up reconnecting
@@ -466,6 +500,28 @@ Send an Expect: 100-continue header for POST. If set to 1 it will send, if set
to 0 it won't, if set to -1 it will try to send if it is applicable. Default to 0 it won't, if set to -1 it will try to send if it is applicable. Default
value is -1. value is -1.
@item auth_type
Set HTTP authentication type. No option for Digest, since this method requires
getting nonce parameters from the server first and can't be used straight away like
Basic.
@table @option
@item none
Choose the HTTP authentication type automatically. This is the default.
@item basic
Choose the HTTP basic authentication.
Basic authentication sends a Base64-encoded string that contains a user name and password
for the client. Base64 is not a form of encryption and should be considered the same as
sending the user name and password in clear text (Base64 is a reversible encoding).
If a resource needs to be protected, strongly consider using an authentication scheme
other than basic authentication. HTTPS/TLS should be used with basic authentication.
Without these additional security enhancements, basic authentication should not be used
to protect sensitive or valuable information.
@end table
@end table @end table
@subsection HTTP Cookies @subsection HTTP Cookies
@@ -520,6 +576,9 @@ audio/mpeg.
This enables support for Icecast versions < 2.4.0, that do not support the This enables support for Icecast versions < 2.4.0, that do not support the
HTTP PUT method but the SOURCE method. HTTP PUT method but the SOURCE method.
@item tls
Establish a TLS (HTTPS) connection to Icecast.
@end table @end table
@example @example
@@ -637,6 +696,42 @@ Example usage:
-f rtp_mpegts -fec prompeg=l=8:d=4 rtp://@var{hostname}:@var{port} -f rtp_mpegts -fec prompeg=l=8:d=4 rtp://@var{hostname}:@var{port}
@end example @end example
@section rist
Reliable Internet Streaming Transport protocol
The accepted options are:
@table @option
@item rist_profile
Supported values:
@table @samp
@item simple
@item main
This one is default.
@item advanced
@end table
@item buffer_size
Set internal RIST buffer size in milliseconds for retransmission of data.
Default value is 0 which means the librist default (1 sec). Maximum value is 30
seconds.
@item pkt_size
Set maximum packet size for sending data. 1316 by default.
@item log_level
Set loglevel for RIST logging messages. You only need to set this if you
explicitly want to enable debug level messages or packet loss simulation,
otherwise the regular loglevel is respected.
@item secret
Set override of encryption secret, by default is unset.
@item encryption
Set encryption type, by default is disabled.
Acceptable values are 128 and 256.
@end table
@section rtmp @section rtmp
Real-Time Messaging Protocol. Real-Time Messaging Protocol.
@@ -938,6 +1033,9 @@ Set the local RTCP port to @var{n}.
@item pkt_size=@var{n} @item pkt_size=@var{n}
Set max packet size (in bytes) to @var{n}. Set max packet size (in bytes) to @var{n}.
@item buffer_size=@var{size}
Set the maximum UDP socket buffer size in bytes.
@item connect=0|1 @item connect=0|1
Do a @code{connect()} on the UDP socket (if set to 1) or not (if set Do a @code{connect()} on the UDP socket (if set to 1) or not (if set
to 0). to 0).
@@ -955,6 +1053,9 @@ set to 1) or to a default remote address (if set to 0).
@item localport=@var{n} @item localport=@var{n}
Set the local RTP port to @var{n}. Set the local RTP port to @var{n}.
@item timeout=@var{n}
Set timeout (in microseconds) of socket I/O operations to @var{n}.
This is a deprecated option. Instead, @option{localrtpport} should be This is a deprecated option. Instead, @option{localrtpport} should be
used. used.
@@ -1596,8 +1697,9 @@ tcp://@var{hostname}:@var{port}[?@var{options}]
The list of supported options follows. The list of supported options follows.
@table @option @table @option
@item listen=@var{1|0} @item listen=@var{2|1|0}
Listen for an incoming connection. Default value is 0. Listen for an incoming connection. 0 disables listen, 1 enables listen in
single client mode, 2 enables listen in multi-client mode. Default value is 0.
@item timeout=@var{microseconds} @item timeout=@var{microseconds}
Set raise error timeout, expressed in microseconds. Set raise error timeout, expressed in microseconds.
@@ -1673,6 +1775,10 @@ A file containing the private key for the certificate.
If enabled, listen for connections on the provided port, and assume If enabled, listen for connections on the provided port, and assume
the server role in the handshake instead of the client role. the server role in the handshake instead of the client role.
@item http_proxy
The HTTP proxy to tunnel through, e.g. @code{http://example.com:1234}.
The proxy must support the CONNECT method.
@end table @end table
Example command lines: Example command lines:
+9
View File
@@ -172,6 +172,9 @@ INF: while(<$inf>) {
} elsif ($ended =~ /^(?:itemize|enumerate|(?:multi|[fv])?table)$/) { } elsif ($ended =~ /^(?:itemize|enumerate|(?:multi|[fv])?table)$/) {
$_ = "\n=back\n"; $_ = "\n=back\n";
$ic = pop @icstack; $ic = pop @icstack;
} elsif ($ended =~ /^float$/) {
$_ = "\n=back\n";
$ic = pop @icstack;
} else { } else {
die "unknown command \@end $ended at line $.\n"; die "unknown command \@end $ended at line $.\n";
} }
@@ -297,6 +300,12 @@ INF: while(<$inf>) {
$_ = ""; # need a paragraph break $_ = ""; # need a paragraph break
}; };
/^\@(float)\s+\w+/ and do {
push @endwstack, $endw;
$endw = $1;
$_ = "\n=over 4\n";
};
/^\@item\s+(.*\S)\s*$/ and $endw eq "multitable" and do { /^\@item\s+(.*\S)\s*$/ and $endw eq "multitable" and do {
my $columns = $1; my $columns = $1;
$columns =~ s/\@tab/ : /; $columns =~ s/\@tab/ : /;
+4 -2
View File
@@ -110,11 +110,13 @@ maximum of 2 digits. The @var{m} at the end expresses decimal value for
@emph{or} @emph{or}
@example @example
[-]@var{S}+[.@var{m}...] [-]@var{S}+[.@var{m}...][s|ms|us]
@end example @end example
@var{S} expresses the number of seconds, with the optional decimal part @var{S} expresses the number of seconds, with the optional decimal part
@var{m}. @var{m}. The optional literal suffixes @samp{s}, @samp{ms} or @samp{us}
indicate to interpret the value as seconds, milliseconds or microseconds,
respectively.
In both expressions, the optional @samp{-} indicates negative duration. In both expressions, the optional @samp{-} indicates negative duration.
+10 -2
View File
@@ -44,7 +44,7 @@ LDFLAGS := $(ALLFFLIBS:%=$(LD_PATH)lib%) $(LDFLAGS)
define COMPILE define COMPILE
$(call $(1)DEP,$(1)) $(call $(1)DEP,$(1))
$($(1)) $($(1)FLAGS) $($(1)_DEPFLAGS) $($(1)_C) $($(1)_O) $(patsubst $(SRC_PATH)/%,$(SRC_LINK)/%,$<) $($(1)) $($(1)FLAGS) $($(2)) $($(1)_DEPFLAGS) $($(1)_C) $($(1)_O) $(patsubst $(SRC_PATH)/%,$(SRC_LINK)/%,$<)
endef endef
COMPILE_C = $(call COMPILE,CC) COMPILE_C = $(call COMPILE,CC)
@@ -54,6 +54,14 @@ COMPILE_M = $(call COMPILE,OBJCC)
COMPILE_X86ASM = $(call COMPILE,X86ASM) COMPILE_X86ASM = $(call COMPILE,X86ASM)
COMPILE_HOSTC = $(call COMPILE,HOSTCC) COMPILE_HOSTC = $(call COMPILE,HOSTCC)
COMPILE_NVCC = $(call COMPILE,NVCC) COMPILE_NVCC = $(call COMPILE,NVCC)
COMPILE_MMI = $(call COMPILE,CC,MMIFLAGS)
COMPILE_MSA = $(call COMPILE,CC,MSAFLAGS)
%_mmi.o: %_mmi.c
$(COMPILE_MMI)
%_msa.o: %_msa.c
$(COMPILE_MSA)
%.o: %.c %.o: %.c
$(COMPILE_C) $(COMPILE_C)
@@ -99,7 +107,7 @@ COMPILE_NVCC = $(call COMPILE,NVCC)
%.c %.h %.pc %.ver %.version: TAG = GEN %.c %.h %.pc %.ver %.version: TAG = GEN
# Dummy rule to stop make trying to rebuild removed or renamed headers # Dummy rule to stop make trying to rebuild removed or renamed headers
%.h: %.h %_template.c:
@: @:
# Disable suffix rules. Most of the builtin rules are suffix rules, # Disable suffix rules. Most of the builtin rules are suffix rules,
+16 -16
View File
@@ -202,23 +202,22 @@ void show_help_options(const OptionDef *options, const char *msg, int req_flags,
void show_help_children(const AVClass *class, int flags) void show_help_children(const AVClass *class, int flags)
{ {
const AVClass *child = NULL; void *iter = NULL;
const AVClass *child;
if (class->option) { if (class->option) {
av_opt_show2(&class, NULL, flags, 0); av_opt_show2(&class, NULL, flags, 0);
printf("\n"); printf("\n");
} }
while (child = av_opt_child_class_next(class, child)) while (child = av_opt_child_class_iterate(class, &iter))
show_help_children(child, flags); show_help_children(child, flags);
} }
static const OptionDef *find_option(const OptionDef *po, const char *name) static const OptionDef *find_option(const OptionDef *po, const char *name)
{ {
const char *p = strchr(name, ':');
int len = p ? p - name : strlen(name);
while (po->name) { while (po->name) {
if (!strncmp(name, po->name, len) && strlen(po->name) == len) const char *end;
if (av_strstart(name, po->name, &end) && (!*end || *end == ':'))
break; break;
po++; po++;
} }
@@ -1164,13 +1163,13 @@ static void print_buildconf(int flags, int level)
// Change all the ' --' strings to '~--' so that // Change all the ' --' strings to '~--' so that
// they can be identified as tokens. // they can be identified as tokens.
while ((conflist = strstr(str, " --")) != NULL) { while ((conflist = strstr(str, " --")) != NULL) {
strncpy(conflist, "~--", 3); conflist[0] = '~';
} }
// Compensate for the weirdness this would cause // Compensate for the weirdness this would cause
// when passing 'pkg-config --static'. // when passing 'pkg-config --static'.
while ((remove_tilde = strstr(str, "pkg-config~")) != NULL) { while ((remove_tilde = strstr(str, "pkg-config~")) != NULL) {
strncpy(remove_tilde, "pkg-config ", 11); remove_tilde[sizeof("pkg-config~") - 2] = ' ';
} }
splitconf = strtok(str, "~"); splitconf = strtok(str, "~");
@@ -1416,7 +1415,7 @@ static void print_codec(const AVCodec *c)
printf("variable "); printf("variable ");
if (c->capabilities & (AV_CODEC_CAP_FRAME_THREADS | if (c->capabilities & (AV_CODEC_CAP_FRAME_THREADS |
AV_CODEC_CAP_SLICE_THREADS | AV_CODEC_CAP_SLICE_THREADS |
AV_CODEC_CAP_AUTO_THREADS)) AV_CODEC_CAP_OTHER_THREADS))
printf("threads "); printf("threads ");
if (c->capabilities & AV_CODEC_CAP_AVOID_PROBING) if (c->capabilities & AV_CODEC_CAP_AVOID_PROBING)
printf("avoidprobe "); printf("avoidprobe ");
@@ -1433,12 +1432,12 @@ static void print_codec(const AVCodec *c)
printf(" Threading capabilities: "); printf(" Threading capabilities: ");
switch (c->capabilities & (AV_CODEC_CAP_FRAME_THREADS | switch (c->capabilities & (AV_CODEC_CAP_FRAME_THREADS |
AV_CODEC_CAP_SLICE_THREADS | AV_CODEC_CAP_SLICE_THREADS |
AV_CODEC_CAP_AUTO_THREADS)) { AV_CODEC_CAP_OTHER_THREADS)) {
case AV_CODEC_CAP_FRAME_THREADS | case AV_CODEC_CAP_FRAME_THREADS |
AV_CODEC_CAP_SLICE_THREADS: printf("frame and slice"); break; AV_CODEC_CAP_SLICE_THREADS: printf("frame and slice"); break;
case AV_CODEC_CAP_FRAME_THREADS: printf("frame"); break; case AV_CODEC_CAP_FRAME_THREADS: printf("frame"); break;
case AV_CODEC_CAP_SLICE_THREADS: printf("slice"); break; case AV_CODEC_CAP_SLICE_THREADS: printf("slice"); break;
case AV_CODEC_CAP_AUTO_THREADS : printf("auto"); break; case AV_CODEC_CAP_OTHER_THREADS: printf("other"); break;
default: printf("none"); break; default: printf("none"); break;
} }
printf("\n"); printf("\n");
@@ -2102,7 +2101,7 @@ int check_stream_specifier(AVFormatContext *s, AVStream *st, const char *spec)
} }
AVDictionary *filter_codec_opts(AVDictionary *opts, enum AVCodecID codec_id, AVDictionary *filter_codec_opts(AVDictionary *opts, enum AVCodecID codec_id,
AVFormatContext *s, AVStream *st, AVCodec *codec) AVFormatContext *s, AVStream *st, const AVCodec *codec)
{ {
AVDictionary *ret = NULL; AVDictionary *ret = NULL;
AVDictionaryEntry *t = NULL; AVDictionaryEntry *t = NULL;
@@ -2131,6 +2130,7 @@ AVDictionary *filter_codec_opts(AVDictionary *opts, enum AVCodecID codec_id,
} }
while (t = av_dict_get(opts, "", t, AV_DICT_IGNORE_SUFFIX)) { while (t = av_dict_get(opts, "", t, AV_DICT_IGNORE_SUFFIX)) {
const AVClass *priv_class;
char *p = strchr(t->key, ':'); char *p = strchr(t->key, ':');
/* check stream specification in opt name */ /* check stream specification in opt name */
@@ -2143,8 +2143,8 @@ AVDictionary *filter_codec_opts(AVDictionary *opts, enum AVCodecID codec_id,
if (av_opt_find(&cc, t->key, NULL, flags, AV_OPT_SEARCH_FAKE_OBJ) || if (av_opt_find(&cc, t->key, NULL, flags, AV_OPT_SEARCH_FAKE_OBJ) ||
!codec || !codec ||
(codec->priv_class && ((priv_class = codec->priv_class) &&
av_opt_find(&codec->priv_class, t->key, NULL, flags, av_opt_find(&priv_class, t->key, NULL, flags,
AV_OPT_SEARCH_FAKE_OBJ))) AV_OPT_SEARCH_FAKE_OBJ)))
av_dict_set(&ret, t->key, t->value, 0); av_dict_set(&ret, t->key, t->value, 0);
else if (t->key[0] == prefix && else if (t->key[0] == prefix &&
@@ -2307,7 +2307,7 @@ int show_sources(void *optctx, const char *opt, const char *arg)
int ret = 0; int ret = 0;
int error_level = av_log_get_level(); int error_level = av_log_get_level();
av_log_set_level(AV_LOG_ERROR); av_log_set_level(AV_LOG_WARNING);
if ((ret = show_sinks_sources_parse_arg(arg, &dev, &opts)) < 0) if ((ret = show_sinks_sources_parse_arg(arg, &dev, &opts)) < 0)
goto fail; goto fail;
@@ -2345,7 +2345,7 @@ int show_sinks(void *optctx, const char *opt, const char *arg)
int ret = 0; int ret = 0;
int error_level = av_log_get_level(); int error_level = av_log_get_level();
av_log_set_level(AV_LOG_ERROR); av_log_set_level(AV_LOG_WARNING);
if ((ret = show_sinks_sources_parse_arg(arg, &dev, &opts)) < 0) if ((ret = show_sinks_sources_parse_arg(arg, &dev, &opts)) < 0)
goto fail; goto fail;
+1 -1
View File
@@ -414,7 +414,7 @@ int check_stream_specifier(AVFormatContext *s, AVStream *st, const char *spec);
* @return a pointer to the created dictionary * @return a pointer to the created dictionary
*/ */
AVDictionary *filter_codec_opts(AVDictionary *opts, enum AVCodecID codec_id, AVDictionary *filter_codec_opts(AVDictionary *opts, enum AVCodecID codec_id,
AVFormatContext *s, AVStream *st, AVCodec *codec); AVFormatContext *s, AVStream *st, const AVCodec *codec);
/** /**
* Setup AVCodecContext options for avformat_find_stream_info(). * Setup AVCodecContext options for avformat_find_stream_info().
+389 -254
View File
File diff suppressed because it is too large Load Diff
+25 -10
View File
@@ -108,6 +108,8 @@ typedef struct OptionsContext {
int nb_audio_sample_rate; int nb_audio_sample_rate;
SpecifierOpt *frame_rates; SpecifierOpt *frame_rates;
int nb_frame_rates; int nb_frame_rates;
SpecifierOpt *max_frame_rates;
int nb_max_frame_rates;
SpecifierOpt *frame_sizes; SpecifierOpt *frame_sizes;
int nb_frame_sizes; int nb_frame_sizes;
SpecifierOpt *frame_pix_fmts; SpecifierOpt *frame_pix_fmts;
@@ -215,6 +217,8 @@ typedef struct OptionsContext {
int nb_passlogfiles; int nb_passlogfiles;
SpecifierOpt *max_muxing_queue_size; SpecifierOpt *max_muxing_queue_size;
int nb_max_muxing_queue_size; int nb_max_muxing_queue_size;
SpecifierOpt *muxing_queue_data_threshold;
int nb_muxing_queue_data_threshold;
SpecifierOpt *guess_layout_max; SpecifierOpt *guess_layout_max;
int nb_guess_layout_max; int nb_guess_layout_max;
SpecifierOpt *apad; SpecifierOpt *apad;
@@ -229,6 +233,8 @@ typedef struct OptionsContext {
int nb_time_bases; int nb_time_bases;
SpecifierOpt *enc_time_bases; SpecifierOpt *enc_time_bases;
int nb_enc_time_bases; int nb_enc_time_bases;
SpecifierOpt *autoscale;
int nb_autoscale;
} OptionsContext; } OptionsContext;
typedef struct InputFilter { typedef struct InputFilter {
@@ -301,9 +307,10 @@ typedef struct InputStream {
#define DECODING_FOR_FILTER 2 #define DECODING_FOR_FILTER 2
AVCodecContext *dec_ctx; AVCodecContext *dec_ctx;
AVCodec *dec; const AVCodec *dec;
AVFrame *decoded_frame; AVFrame *decoded_frame;
AVFrame *filter_frame; /* a ref of decoded_frame, to be sent to filters */ AVFrame *filter_frame; /* a ref of decoded_frame, to be sent to filters */
AVPacket *pkt;
int64_t start; /* time when read started */ int64_t start; /* time when read started */
/* predicted dts of the next packet read for this stream or (when there are /* predicted dts of the next packet read for this stream or (when there are
@@ -412,6 +419,8 @@ typedef struct InputFile {
int rate_emu; int rate_emu;
int accurate_seek; int accurate_seek;
AVPacket *pkt;
#if HAVE_THREADS #if HAVE_THREADS
AVThreadMessageQueue *in_thread_queue; AVThreadMessageQueue *in_thread_queue;
pthread_t thread; /* thread reading from this file */ pthread_t thread; /* thread reading from this file */
@@ -464,10 +473,11 @@ typedef struct OutputStream {
AVCodecContext *enc_ctx; AVCodecContext *enc_ctx;
AVCodecParameters *ref_par; /* associated input codec parameters with encoders options applied */ AVCodecParameters *ref_par; /* associated input codec parameters with encoders options applied */
AVCodec *enc; const AVCodec *enc;
int64_t max_frames; int64_t max_frames;
AVFrame *filtered_frame; AVFrame *filtered_frame;
AVFrame *last_frame; AVFrame *last_frame;
AVPacket *pkt;
int last_dropped; int last_dropped;
int last_nb0_frames[3]; int last_nb0_frames[3];
@@ -475,10 +485,12 @@ typedef struct OutputStream {
/* video only */ /* video only */
AVRational frame_rate; AVRational frame_rate;
AVRational max_frame_rate;
int is_cfr; int is_cfr;
int force_fps; int force_fps;
int top_field_first; int top_field_first;
int rotate_overridden; int rotate_overridden;
int autoscale;
double rotate_override_value; double rotate_override_value;
AVRational frame_aspect_ratio; AVRational frame_aspect_ratio;
@@ -544,6 +556,15 @@ typedef struct OutputStream {
/* the packets are buffered here until the muxer is ready to be initialized */ /* the packets are buffered here until the muxer is ready to be initialized */
AVFifoBuffer *muxing_queue; AVFifoBuffer *muxing_queue;
/*
* The size of the AVPackets' buffers in queue.
* Updated when a packet is either pushed or pulled from the queue.
*/
size_t muxing_queue_data_size;
/* Threshold after which max_muxing_queue_size will be in effect */
size_t muxing_queue_data_threshold;
/* packet picture type */ /* packet picture type */
int pict_type; int pict_type;
@@ -600,6 +621,7 @@ extern int debug_ts;
extern int exit_on_error; extern int exit_on_error;
extern int abort_on_flags; extern int abort_on_flags;
extern int print_stats; extern int print_stats;
extern int64_t stats_period;
extern int qp_hist; extern int qp_hist;
extern int stdin_interaction; extern int stdin_interaction;
extern int frame_bits_per_raw_sample; extern int frame_bits_per_raw_sample;
@@ -610,6 +632,7 @@ extern char *videotoolbox_pixfmt;
extern int filter_nbthreads; extern int filter_nbthreads;
extern int filter_complex_nbthreads; extern int filter_complex_nbthreads;
extern int vstats_version; extern int vstats_version;
extern int auto_conversion_filters;
extern const AVIOInterruptCB int_cb; extern const AVIOInterruptCB int_cb;
@@ -624,23 +647,15 @@ extern HWDevice *filter_hw_device;
void term_init(void); void term_init(void);
void term_exit(void); void term_exit(void);
void reset_options(OptionsContext *o, int is_input);
void show_usage(void); void show_usage(void);
void opt_output_file(void *optctx, const char *filename);
void remove_avoptions(AVDictionary **a, AVDictionary *b); void remove_avoptions(AVDictionary **a, AVDictionary *b);
void assert_avoptions(AVDictionary *m); void assert_avoptions(AVDictionary *m);
int guess_input_channel_layout(InputStream *ist); int guess_input_channel_layout(InputStream *ist);
enum AVPixelFormat choose_pixel_fmt(AVStream *st, AVCodecContext *avctx, AVCodec *codec, enum AVPixelFormat target);
void choose_sample_fmt(AVStream *st, AVCodec *codec);
int configure_filtergraph(FilterGraph *fg); int configure_filtergraph(FilterGraph *fg);
int configure_output_filter(FilterGraph *fg, OutputFilter *ofilter, AVFilterInOut *out);
void check_filter_outputs(void); void check_filter_outputs(void);
int ist_in_filtergraph(FilterGraph *fg, InputStream *ist);
int filtergraph_is_simple(FilterGraph *fg); int filtergraph_is_simple(FilterGraph *fg);
int init_simple_filtergraph(InputStream *ist, OutputStream *ost); int init_simple_filtergraph(InputStream *ist, OutputStream *ost);
int init_complex_filtergraph(FilterGraph *fg); int init_complex_filtergraph(FilterGraph *fg);
+8 -43
View File
@@ -60,7 +60,8 @@ static const enum AVPixelFormat *get_compliance_unofficial_pix_fmts(enum AVCodec
} }
} }
enum AVPixelFormat choose_pixel_fmt(AVStream *st, AVCodecContext *enc_ctx, AVCodec *codec, enum AVPixelFormat target) static enum AVPixelFormat choose_pixel_fmt(AVStream *st, AVCodecContext *enc_ctx,
const AVCodec *codec, enum AVPixelFormat target)
{ {
if (codec && codec->pix_fmts) { if (codec && codec->pix_fmts) {
const enum AVPixelFormat *p = codec->pix_fmts; const enum AVPixelFormat *p = codec->pix_fmts;
@@ -73,7 +74,7 @@ enum AVPixelFormat choose_pixel_fmt(AVStream *st, AVCodecContext *enc_ctx, AVCod
p = get_compliance_unofficial_pix_fmts(enc_ctx->codec_id, p); p = get_compliance_unofficial_pix_fmts(enc_ctx->codec_id, p);
} }
for (; *p != AV_PIX_FMT_NONE; p++) { for (; *p != AV_PIX_FMT_NONE; p++) {
best= avcodec_find_best_pix_fmt_of_2(best, *p, target, has_alpha, NULL); best = av_find_best_pix_fmt_of_2(best, *p, target, has_alpha, NULL);
if (*p == target) if (*p == target)
break; break;
} }
@@ -90,29 +91,6 @@ enum AVPixelFormat choose_pixel_fmt(AVStream *st, AVCodecContext *enc_ctx, AVCod
return target; return target;
} }
void choose_sample_fmt(AVStream *st, AVCodec *codec)
{
if (codec && codec->sample_fmts) {
const enum AVSampleFormat *p = codec->sample_fmts;
for (; *p != -1; p++) {
if (*p == st->codecpar->format)
break;
}
if (*p == -1) {
const AVCodecDescriptor *desc = avcodec_descriptor_get(codec->id);
if(desc && (desc->props & AV_CODEC_PROP_LOSSLESS) && av_get_sample_fmt_name(st->codecpar->format) > av_get_sample_fmt_name(codec->sample_fmts[0]))
av_log(NULL, AV_LOG_ERROR, "Conversion will not be lossless.\n");
if(av_get_sample_fmt_name(st->codecpar->format))
av_log(NULL, AV_LOG_WARNING,
"Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
av_get_sample_fmt_name(st->codecpar->format),
codec->name,
av_get_sample_fmt_name(codec->sample_fmts[0]));
st->codecpar->format = codec->sample_fmts[0];
}
}
}
static char *choose_pix_fmts(OutputFilter *ofilter) static char *choose_pix_fmts(OutputFilter *ofilter)
{ {
OutputStream *ost = ofilter->ost; OutputStream *ost = ofilter->ost;
@@ -470,7 +448,7 @@ static int configure_output_video_filter(FilterGraph *fg, OutputFilter *ofilter,
if (ret < 0) if (ret < 0)
return ret; return ret;
if (ofilter->width || ofilter->height) { if ((ofilter->width || ofilter->height) && ofilter->ost->autoscale) {
char args[255]; char args[255];
AVFilterContext *filter; AVFilterContext *filter;
AVDictionaryEntry *e = NULL; AVDictionaryEntry *e = NULL;
@@ -640,13 +618,6 @@ static int configure_output_audio_filter(FilterGraph *fg, OutputFilter *ofilter,
pad_idx = 0; pad_idx = 0;
} }
if (audio_volume != 256 && 0) {
char args[256];
snprintf(args, sizeof(args), "%f", audio_volume / 256.);
AUTO_INSERT_FILTER("-vol", "volume", args);
}
if (ost->apad && of->shortest) { if (ost->apad && of->shortest) {
char args[256]; char args[256];
int i; int i;
@@ -674,7 +645,8 @@ static int configure_output_audio_filter(FilterGraph *fg, OutputFilter *ofilter,
return 0; return 0;
} }
int configure_output_filter(FilterGraph *fg, OutputFilter *ofilter, AVFilterInOut *out) static int configure_output_filter(FilterGraph *fg, OutputFilter *ofilter,
AVFilterInOut *out)
{ {
if (!ofilter->ost) { if (!ofilter->ost) {
av_log(NULL, AV_LOG_FATAL, "Filter %s has an unconnected output\n", ofilter->name); av_log(NULL, AV_LOG_FATAL, "Filter %s has an unconnected output\n", ofilter->name);
@@ -1104,6 +1076,8 @@ int configure_filtergraph(FilterGraph *fg)
configure_output_filter(fg, fg->outputs[i], cur); configure_output_filter(fg, fg->outputs[i], cur);
avfilter_inout_free(&outputs); avfilter_inout_free(&outputs);
if (!auto_conversion_filters)
avfilter_graph_set_auto_convert(fg->graph, AVFILTER_AUTO_CONVERT_NONE);
if ((ret = avfilter_graph_config(fg->graph, NULL)) < 0) if ((ret = avfilter_graph_config(fg->graph, NULL)) < 0)
goto fail; goto fail;
@@ -1203,15 +1177,6 @@ int ifilter_parameters_from_frame(InputFilter *ifilter, const AVFrame *frame)
return 0; return 0;
} }
int ist_in_filtergraph(FilterGraph *fg, InputStream *ist)
{
int i;
for (i = 0; i < fg->nb_inputs; i++)
if (fg->inputs[i]->ist == ist)
return 1;
return 0;
}
int filtergraph_is_simple(FilterGraph *fg) int filtergraph_is_simple(FilterGraph *fg)
{ {
return !fg->graph_desc; return !fg->graph_desc;
+115 -64
View File
@@ -51,47 +51,50 @@
#define SPECIFIER_OPT_FMT_f "%f" #define SPECIFIER_OPT_FMT_f "%f"
#define SPECIFIER_OPT_FMT_dbl "%lf" #define SPECIFIER_OPT_FMT_dbl "%lf"
static const char *opt_name_codec_names[] = {"c", "codec", "acodec", "vcodec", "scodec", "dcodec", NULL}; static const char *const opt_name_codec_names[] = {"c", "codec", "acodec", "vcodec", "scodec", "dcodec", NULL};
static const char *opt_name_audio_channels[] = {"ac", NULL}; static const char *const opt_name_audio_channels[] = {"ac", NULL};
static const char *opt_name_audio_sample_rate[] = {"ar", NULL}; static const char *const opt_name_audio_sample_rate[] = {"ar", NULL};
static const char *opt_name_frame_rates[] = {"r", NULL}; static const char *const opt_name_frame_rates[] = {"r", NULL};
static const char *opt_name_frame_sizes[] = {"s", NULL}; static const char *const opt_name_max_frame_rates[] = {"fpsmax", NULL};
static const char *opt_name_frame_pix_fmts[] = {"pix_fmt", NULL}; static const char *const opt_name_frame_sizes[] = {"s", NULL};
static const char *opt_name_ts_scale[] = {"itsscale", NULL}; static const char *const opt_name_frame_pix_fmts[] = {"pix_fmt", NULL};
static const char *opt_name_hwaccels[] = {"hwaccel", NULL}; static const char *const opt_name_ts_scale[] = {"itsscale", NULL};
static const char *opt_name_hwaccel_devices[] = {"hwaccel_device", NULL}; static const char *const opt_name_hwaccels[] = {"hwaccel", NULL};
static const char *opt_name_hwaccel_output_formats[] = {"hwaccel_output_format", NULL}; static const char *const opt_name_hwaccel_devices[] = {"hwaccel_device", NULL};
static const char *opt_name_autorotate[] = {"autorotate", NULL}; static const char *const opt_name_hwaccel_output_formats[] = {"hwaccel_output_format", NULL};
static const char *opt_name_max_frames[] = {"frames", "aframes", "vframes", "dframes", NULL}; static const char *const opt_name_autorotate[] = {"autorotate", NULL};
static const char *opt_name_bitstream_filters[] = {"bsf", "absf", "vbsf", NULL}; static const char *const opt_name_autoscale[] = {"autoscale", NULL};
static const char *opt_name_codec_tags[] = {"tag", "atag", "vtag", "stag", NULL}; static const char *const opt_name_max_frames[] = {"frames", "aframes", "vframes", "dframes", NULL};
static const char *opt_name_sample_fmts[] = {"sample_fmt", NULL}; static const char *const opt_name_bitstream_filters[] = {"bsf", "absf", "vbsf", NULL};
static const char *opt_name_qscale[] = {"q", "qscale", NULL}; static const char *const opt_name_codec_tags[] = {"tag", "atag", "vtag", "stag", NULL};
static const char *opt_name_forced_key_frames[] = {"forced_key_frames", NULL}; static const char *const opt_name_sample_fmts[] = {"sample_fmt", NULL};
static const char *opt_name_force_fps[] = {"force_fps", NULL}; static const char *const opt_name_qscale[] = {"q", "qscale", NULL};
static const char *opt_name_frame_aspect_ratios[] = {"aspect", NULL}; static const char *const opt_name_forced_key_frames[] = {"forced_key_frames", NULL};
static const char *opt_name_rc_overrides[] = {"rc_override", NULL}; static const char *const opt_name_force_fps[] = {"force_fps", NULL};
static const char *opt_name_intra_matrices[] = {"intra_matrix", NULL}; static const char *const opt_name_frame_aspect_ratios[] = {"aspect", NULL};
static const char *opt_name_inter_matrices[] = {"inter_matrix", NULL}; static const char *const opt_name_rc_overrides[] = {"rc_override", NULL};
static const char *opt_name_chroma_intra_matrices[] = {"chroma_intra_matrix", NULL}; static const char *const opt_name_intra_matrices[] = {"intra_matrix", NULL};
static const char *opt_name_top_field_first[] = {"top", NULL}; static const char *const opt_name_inter_matrices[] = {"inter_matrix", NULL};
static const char *opt_name_presets[] = {"pre", "apre", "vpre", "spre", NULL}; static const char *const opt_name_chroma_intra_matrices[] = {"chroma_intra_matrix", NULL};
static const char *opt_name_copy_initial_nonkeyframes[] = {"copyinkfr", NULL}; static const char *const opt_name_top_field_first[] = {"top", NULL};
static const char *opt_name_copy_prior_start[] = {"copypriorss", NULL}; static const char *const opt_name_presets[] = {"pre", "apre", "vpre", "spre", NULL};
static const char *opt_name_filters[] = {"filter", "af", "vf", NULL}; static const char *const opt_name_copy_initial_nonkeyframes[] = {"copyinkfr", NULL};
static const char *opt_name_filter_scripts[] = {"filter_script", NULL}; static const char *const opt_name_copy_prior_start[] = {"copypriorss", NULL};
static const char *opt_name_reinit_filters[] = {"reinit_filter", NULL}; static const char *const opt_name_filters[] = {"filter", "af", "vf", NULL};
static const char *opt_name_fix_sub_duration[] = {"fix_sub_duration", NULL}; static const char *const opt_name_filter_scripts[] = {"filter_script", NULL};
static const char *opt_name_canvas_sizes[] = {"canvas_size", NULL}; static const char *const opt_name_reinit_filters[] = {"reinit_filter", NULL};
static const char *opt_name_pass[] = {"pass", NULL}; static const char *const opt_name_fix_sub_duration[] = {"fix_sub_duration", NULL};
static const char *opt_name_passlogfiles[] = {"passlogfile", NULL}; static const char *const opt_name_canvas_sizes[] = {"canvas_size", NULL};
static const char *opt_name_max_muxing_queue_size[] = {"max_muxing_queue_size", NULL}; static const char *const opt_name_pass[] = {"pass", NULL};
static const char *opt_name_guess_layout_max[] = {"guess_layout_max", NULL}; static const char *const opt_name_passlogfiles[] = {"passlogfile", NULL};
static const char *opt_name_apad[] = {"apad", NULL}; static const char *const opt_name_max_muxing_queue_size[] = {"max_muxing_queue_size", NULL};
static const char *opt_name_discard[] = {"discard", NULL}; static const char *const opt_name_muxing_queue_data_threshold[] = {"muxing_queue_data_threshold", NULL};
static const char *opt_name_disposition[] = {"disposition", NULL}; static const char *const opt_name_guess_layout_max[] = {"guess_layout_max", NULL};
static const char *opt_name_time_bases[] = {"time_base", NULL}; static const char *const opt_name_apad[] = {"apad", NULL};
static const char *opt_name_enc_time_bases[] = {"enc_time_base", NULL}; static const char *const opt_name_discard[] = {"discard", NULL};
static const char *const opt_name_disposition[] = {"disposition", NULL};
static const char *const opt_name_time_bases[] = {"time_base", NULL};
static const char *const opt_name_enc_time_bases[] = {"enc_time_base", NULL};
#define WARN_MULTIPLE_OPT_USAGE(name, type, so, st)\ #define WARN_MULTIPLE_OPT_USAGE(name, type, so, st)\
{\ {\
@@ -171,6 +174,8 @@ float max_error_rate = 2.0/3;
int filter_nbthreads = 0; int filter_nbthreads = 0;
int filter_complex_nbthreads = 0; int filter_complex_nbthreads = 0;
int vstats_version = 2; int vstats_version = 2;
int auto_conversion_filters = 1;
int64_t stats_period = 500000;
static int intra_only = 0; static int intra_only = 0;
@@ -227,6 +232,7 @@ static void init_options(OptionsContext *o)
o->limit_filesize = UINT64_MAX; o->limit_filesize = UINT64_MAX;
o->chapters_input_file = INT_MAX; o->chapters_input_file = INT_MAX;
o->accurate_seek = 1; o->accurate_seek = 1;
o->thread_queue_size = -1;
} }
static int show_hwaccels(void *optctx, const char *opt, const char *arg) static int show_hwaccels(void *optctx, const char *opt, const char *arg)
@@ -278,6 +284,21 @@ static int opt_abort_on(void *optctx, const char *opt, const char *arg)
return av_opt_eval_flags(&pclass, &opts[0], arg, &abort_on_flags); return av_opt_eval_flags(&pclass, &opts[0], arg, &abort_on_flags);
} }
static int opt_stats_period(void *optctx, const char *opt, const char *arg)
{
int64_t user_stats_period = parse_time_or_die(opt, arg, 1);
if (user_stats_period <= 0) {
av_log(NULL, AV_LOG_ERROR, "stats_period %s must be positive.\n", arg);
return AVERROR(EINVAL);
}
stats_period = user_stats_period;
av_log(NULL, AV_LOG_INFO, "ffmpeg stats and -progress period set to %s.\n", arg);
return 0;
}
static int opt_sameq(void *optctx, const char *opt, const char *arg) static int opt_sameq(void *optctx, const char *opt, const char *arg)
{ {
av_log(NULL, AV_LOG_ERROR, "Option '%s' was removed. " av_log(NULL, AV_LOG_ERROR, "Option '%s' was removed. "
@@ -745,13 +766,13 @@ static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int e
return codec; return codec;
} }
static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st) static const AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
{ {
char *codec_name = NULL; char *codec_name = NULL;
MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st); MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
if (codec_name) { if (codec_name) {
AVCodec *codec = find_codec_or_die(codec_name, st->codecpar->codec_type, 0); const AVCodec *codec = find_codec_or_die(codec_name, st->codecpar->codec_type, 0);
st->codecpar->codec_id = codec->id; st->codecpar->codec_id = codec->id;
return codec; return codec;
} else } else
@@ -847,15 +868,6 @@ static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
case AVMEDIA_TYPE_VIDEO: case AVMEDIA_TYPE_VIDEO:
if(!ist->dec) if(!ist->dec)
ist->dec = avcodec_find_decoder(par->codec_id); ist->dec = avcodec_find_decoder(par->codec_id);
#if FF_API_LOWRES
if (st->codec->lowres) {
ist->dec_ctx->lowres = st->codec->lowres;
ist->dec_ctx->width = st->codec->width;
ist->dec_ctx->height = st->codec->height;
ist->dec_ctx->coded_width = st->codec->coded_width;
ist->dec_ctx->coded_height = st->codec->coded_height;
}
#endif
// avformat_find_stream_info() doesn't set this for us anymore. // avformat_find_stream_info() doesn't set this for us anymore.
ist->dec_ctx->framerate = st->avg_frame_rate; ist->dec_ctx->framerate = st->avg_frame_rate;
@@ -1268,8 +1280,11 @@ static int open_input_file(OptionsContext *o, const char *filename)
f->loop = o->loop; f->loop = o->loop;
f->duration = 0; f->duration = 0;
f->time_base = (AVRational){ 1, 1 }; f->time_base = (AVRational){ 1, 1 };
f->pkt = av_packet_alloc();
if (!f->pkt)
exit_program(1);
#if HAVE_THREADS #if HAVE_THREADS
f->thread_queue_size = o->thread_queue_size > 0 ? o->thread_queue_size : 8; f->thread_queue_size = o->thread_queue_size;
#endif #endif
/* check if all codec options have been used */ /* check if all codec options have been used */
@@ -1462,6 +1477,8 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e
ost->encoder_opts = filter_codec_opts(o->g->codec_opts, ost->enc->id, oc, st, ost->enc); ost->encoder_opts = filter_codec_opts(o->g->codec_opts, ost->enc->id, oc, st, ost->enc);
MATCH_PER_STREAM_OPT(presets, str, preset, oc, st); MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
ost->autoscale = 1;
MATCH_PER_STREAM_OPT(autoscale, i, ost->autoscale, oc, st);
if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) { if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
do { do {
buf = get_line(s); buf = get_line(s);
@@ -1557,7 +1574,12 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e
ost->max_muxing_queue_size = 128; ost->max_muxing_queue_size = 128;
MATCH_PER_STREAM_OPT(max_muxing_queue_size, i, ost->max_muxing_queue_size, oc, st); MATCH_PER_STREAM_OPT(max_muxing_queue_size, i, ost->max_muxing_queue_size, oc, st);
ost->max_muxing_queue_size *= sizeof(AVPacket); ost->max_muxing_queue_size *= sizeof(ost->pkt);
ost->muxing_queue_data_size = 0;
ost->muxing_queue_data_threshold = 50*1024*1024;
MATCH_PER_STREAM_OPT(muxing_queue_data_threshold, i, ost->muxing_queue_data_threshold, oc, st);
if (oc->oformat->flags & AVFMT_GLOBALHEADER) if (oc->oformat->flags & AVFMT_GLOBALHEADER)
ost->enc_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER; ost->enc_ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
@@ -1670,7 +1692,7 @@ static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc, in
AVStream *st; AVStream *st;
OutputStream *ost; OutputStream *ost;
AVCodecContext *video_enc; AVCodecContext *video_enc;
char *frame_rate = NULL, *frame_aspect_ratio = NULL; char *frame_rate = NULL, *max_frame_rate = NULL, *frame_aspect_ratio = NULL;
ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO, source_index); ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO, source_index);
st = ost->st; st = ost->st;
@@ -1681,8 +1703,21 @@ static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc, in
av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate); av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
exit_program(1); exit_program(1);
} }
if (frame_rate && video_sync_method == VSYNC_PASSTHROUGH)
av_log(NULL, AV_LOG_ERROR, "Using -vsync 0 and -r can produce invalid output files\n"); MATCH_PER_STREAM_OPT(max_frame_rates, str, max_frame_rate, oc, st);
if (max_frame_rate && av_parse_video_rate(&ost->max_frame_rate, max_frame_rate) < 0) {
av_log(NULL, AV_LOG_FATAL, "Invalid maximum framerate value: %s\n", max_frame_rate);
exit_program(1);
}
if (frame_rate && max_frame_rate) {
av_log(NULL, AV_LOG_ERROR, "Only one of -fpsmax and -r can be set for a stream.\n");
exit_program(1);
}
if ((frame_rate || max_frame_rate) &&
video_sync_method == VSYNC_PASSTHROUGH)
av_log(NULL, AV_LOG_ERROR, "Using -vsync 0 and -r/-fpsmax can produce invalid output files\n");
MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st); MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
if (frame_aspect_ratio) { if (frame_aspect_ratio) {
@@ -2205,22 +2240,23 @@ static int open_output_file(OptionsContext *o, const char *filename)
/* video: highest resolution */ /* video: highest resolution */
if (!o->video_disable && av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_VIDEO) != AV_CODEC_ID_NONE) { if (!o->video_disable && av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_VIDEO) != AV_CODEC_ID_NONE) {
int area = 0, idx = -1; int best_score = 0, idx = -1;
int qcr = avformat_query_codec(oc->oformat, oc->oformat->video_codec, 0); int qcr = avformat_query_codec(oc->oformat, oc->oformat->video_codec, 0);
for (i = 0; i < nb_input_streams; i++) { for (i = 0; i < nb_input_streams; i++) {
int new_area; int score;
ist = input_streams[i]; ist = input_streams[i];
new_area = ist->st->codecpar->width * ist->st->codecpar->height + 100000000*!!ist->st->codec_info_nb_frames score = ist->st->codecpar->width * ist->st->codecpar->height
+ 100000000 * !!(ist->st->event_flags & AVSTREAM_EVENT_FLAG_NEW_PACKETS)
+ 5000000*!!(ist->st->disposition & AV_DISPOSITION_DEFAULT); + 5000000*!!(ist->st->disposition & AV_DISPOSITION_DEFAULT);
if (ist->user_set_discard == AVDISCARD_ALL) if (ist->user_set_discard == AVDISCARD_ALL)
continue; continue;
if((qcr!=MKTAG('A', 'P', 'I', 'C')) && (ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC)) if((qcr!=MKTAG('A', 'P', 'I', 'C')) && (ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
new_area = 1; score = 1;
if (ist->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && if (ist->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO &&
new_area > area) { score > best_score) {
if((qcr==MKTAG('A', 'P', 'I', 'C')) && !(ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC)) if((qcr==MKTAG('A', 'P', 'I', 'C')) && !(ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
continue; continue;
area = new_area; best_score = score;
idx = i; idx = i;
} }
} }
@@ -2622,6 +2658,9 @@ loop_end:
if(o->recording_time != INT64_MAX) if(o->recording_time != INT64_MAX)
av_dict_set(&oc->metadata, "duration", NULL, 0); av_dict_set(&oc->metadata, "duration", NULL, 0);
av_dict_set(&oc->metadata, "creation_time", NULL, 0); av_dict_set(&oc->metadata, "creation_time", NULL, 0);
av_dict_set(&oc->metadata, "company_name", NULL, 0);
av_dict_set(&oc->metadata, "product_name", NULL, 0);
av_dict_set(&oc->metadata, "product_version", NULL, 0);
} }
if (!o->metadata_streams_manual) if (!o->metadata_streams_manual)
for (i = of->ost_index; i < nb_output_streams; i++) { for (i = of->ost_index; i < nb_output_streams; i++) {
@@ -3541,8 +3580,12 @@ const OptionDef options[] = {
"create a complex filtergraph", "graph_description" }, "create a complex filtergraph", "graph_description" },
{ "filter_complex_script", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex_script }, { "filter_complex_script", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_complex_script },
"read complex filtergraph description from a file", "filename" }, "read complex filtergraph description from a file", "filename" },
{ "auto_conversion_filters", OPT_BOOL | OPT_EXPERT, { &auto_conversion_filters },
"enable automatic conversion filters globally" },
{ "stats", OPT_BOOL, { &print_stats }, { "stats", OPT_BOOL, { &print_stats },
"print progress report during encoding", }, "print progress report during encoding", },
{ "stats_period", HAS_ARG | OPT_EXPERT, { .func_arg = opt_stats_period },
"set the period at which ffmpeg updates stats and -progress output", "time" },
{ "attach", HAS_ARG | OPT_PERFILE | OPT_EXPERT | { "attach", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
OPT_OUTPUT, { .func_arg = opt_attach }, OPT_OUTPUT, { .func_arg = opt_attach },
"add an attachment to the output file", "filename" }, "add an attachment to the output file", "filename" },
@@ -3554,7 +3597,7 @@ const OptionDef options[] = {
{ "debug_ts", OPT_BOOL | OPT_EXPERT, { &debug_ts }, { "debug_ts", OPT_BOOL | OPT_EXPERT, { &debug_ts },
"print timestamp debugging info" }, "print timestamp debugging info" },
{ "max_error_rate", HAS_ARG | OPT_FLOAT, { &max_error_rate }, { "max_error_rate", HAS_ARG | OPT_FLOAT, { &max_error_rate },
"ratio of errors (0.0: no errors, 1.0: 100% errors) above which ffmpeg returns an error instead of success.", "maximum error rate" }, "ratio of decoding errors (0.0: no errors, 1.0: 100% errors) above which ffmpeg returns an error instead of success.", "maximum error rate" },
{ "discard", OPT_STRING | HAS_ARG | OPT_SPEC | { "discard", OPT_STRING | HAS_ARG | OPT_SPEC |
OPT_INPUT, { .off = OFFSET(discard) }, OPT_INPUT, { .off = OFFSET(discard) },
"discard", "" }, "discard", "" },
@@ -3573,6 +3616,9 @@ const OptionDef options[] = {
{ "r", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC | { "r", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_rates) }, OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_rates) },
"set frame rate (Hz value, fraction or abbreviation)", "rate" }, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
{ "fpsmax", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
OPT_OUTPUT, { .off = OFFSET(max_frame_rates) },
"set max frame rate (Hz value, fraction or abbreviation)", "rate" },
{ "s", OPT_VIDEO | HAS_ARG | OPT_SUBTITLE | OPT_STRING | OPT_SPEC | { "s", OPT_VIDEO | HAS_ARG | OPT_SUBTITLE | OPT_STRING | OPT_SPEC |
OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_sizes) }, OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_sizes) },
"set frame size (WxH or abbreviation)", "size" }, "set frame size (WxH or abbreviation)", "size" },
@@ -3664,6 +3710,9 @@ const OptionDef options[] = {
{ "autorotate", HAS_ARG | OPT_BOOL | OPT_SPEC | { "autorotate", HAS_ARG | OPT_BOOL | OPT_SPEC |
OPT_EXPERT | OPT_INPUT, { .off = OFFSET(autorotate) }, OPT_EXPERT | OPT_INPUT, { .off = OFFSET(autorotate) },
"automatically insert correct rotate filters" }, "automatically insert correct rotate filters" },
{ "autoscale", HAS_ARG | OPT_BOOL | OPT_SPEC |
OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(autoscale) },
"automatically insert a scale filter at the end of the filter graph" },
/* audio options */ /* audio options */
{ "aframes", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_frames }, { "aframes", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_frames },
@@ -3750,6 +3799,8 @@ const OptionDef options[] = {
{ "max_muxing_queue_size", HAS_ARG | OPT_INT | OPT_SPEC | OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(max_muxing_queue_size) }, { "max_muxing_queue_size", HAS_ARG | OPT_INT | OPT_SPEC | OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(max_muxing_queue_size) },
"maximum number of packets that can be buffered while waiting for all streams to initialize", "packets" }, "maximum number of packets that can be buffered while waiting for all streams to initialize", "packets" },
{ "muxing_queue_data_threshold", HAS_ARG | OPT_INT | OPT_SPEC | OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(muxing_queue_data_threshold) },
"set the threshold after which max_muxing_queue_size is taken into account", "bytes" },
/* data codec support */ /* data codec support */
{ "dcodec", HAS_ARG | OPT_DATA | OPT_PERFILE | OPT_EXPERT | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_data_codec }, { "dcodec", HAS_ARG | OPT_DATA | OPT_PERFILE | OPT_EXPERT | OPT_INPUT | OPT_OUTPUT, { .func_arg = opt_data_codec },
+132 -133
View File
@@ -36,6 +36,7 @@
#include "libavutil/pixdesc.h" #include "libavutil/pixdesc.h"
#include "libavutil/imgutils.h" #include "libavutil/imgutils.h"
#include "libavutil/dict.h" #include "libavutil/dict.h"
#include "libavutil/fifo.h"
#include "libavutil/parseutils.h" #include "libavutil/parseutils.h"
#include "libavutil/samplefmt.h" #include "libavutil/samplefmt.h"
#include "libavutil/avassert.h" #include "libavutil/avassert.h"
@@ -111,13 +112,12 @@ const int program_birth_year = 2003;
static unsigned sws_flags = SWS_BICUBIC; static unsigned sws_flags = SWS_BICUBIC;
typedef struct MyAVPacketList { typedef struct MyAVPacketList {
AVPacket pkt; AVPacket *pkt;
struct MyAVPacketList *next;
int serial; int serial;
} MyAVPacketList; } MyAVPacketList;
typedef struct PacketQueue { typedef struct PacketQueue {
MyAVPacketList *first_pkt, *last_pkt; AVFifoBuffer *pkt_list;
int nb_packets; int nb_packets;
int size; int size;
int64_t duration; int64_t duration;
@@ -187,7 +187,7 @@ enum {
}; };
typedef struct Decoder { typedef struct Decoder {
AVPacket pkt; AVPacket *pkt;
PacketQueue *queue; PacketQueue *queue;
AVCodecContext *avctx; AVCodecContext *avctx;
int pkt_serial; int pkt_serial;
@@ -361,8 +361,6 @@ static int filter_nbthreads = 0;
static int is_full_screen; static int is_full_screen;
static int64_t audio_callback_time; static int64_t audio_callback_time;
static AVPacket flush_pkt;
#define FF_QUIT_EVENT (SDL_USEREVENT + 2) #define FF_QUIT_EVENT (SDL_USEREVENT + 2)
static SDL_Window *window; static SDL_Window *window;
@@ -427,28 +425,23 @@ int64_t get_valid_channel_layout(int64_t channel_layout, int channels)
static int packet_queue_put_private(PacketQueue *q, AVPacket *pkt) static int packet_queue_put_private(PacketQueue *q, AVPacket *pkt)
{ {
MyAVPacketList *pkt1; MyAVPacketList pkt1;
if (q->abort_request) if (q->abort_request)
return -1; return -1;
pkt1 = av_malloc(sizeof(MyAVPacketList)); if (av_fifo_space(q->pkt_list) < sizeof(pkt1)) {
if (!pkt1) if (av_fifo_grow(q->pkt_list, sizeof(pkt1)) < 0)
return -1; return -1;
pkt1->pkt = *pkt; }
pkt1->next = NULL;
if (pkt == &flush_pkt)
q->serial++;
pkt1->serial = q->serial;
if (!q->last_pkt) pkt1.pkt = pkt;
q->first_pkt = pkt1; pkt1.serial = q->serial;
else
q->last_pkt->next = pkt1; av_fifo_generic_write(q->pkt_list, &pkt1, sizeof(pkt1), NULL);
q->last_pkt = pkt1;
q->nb_packets++; q->nb_packets++;
q->size += pkt1->pkt.size + sizeof(*pkt1); q->size += pkt1.pkt->size + sizeof(pkt1);
q->duration += pkt1->pkt.duration; q->duration += pkt1.pkt->duration;
/* XXX: should duplicate packet data in DV case */ /* XXX: should duplicate packet data in DV case */
SDL_CondSignal(q->cond); SDL_CondSignal(q->cond);
return 0; return 0;
@@ -456,24 +449,28 @@ static int packet_queue_put_private(PacketQueue *q, AVPacket *pkt)
static int packet_queue_put(PacketQueue *q, AVPacket *pkt) static int packet_queue_put(PacketQueue *q, AVPacket *pkt)
{ {
AVPacket *pkt1;
int ret; int ret;
pkt1 = av_packet_alloc();
if (!pkt1) {
av_packet_unref(pkt);
return -1;
}
av_packet_move_ref(pkt1, pkt);
SDL_LockMutex(q->mutex); SDL_LockMutex(q->mutex);
ret = packet_queue_put_private(q, pkt); ret = packet_queue_put_private(q, pkt1);
SDL_UnlockMutex(q->mutex); SDL_UnlockMutex(q->mutex);
if (pkt != &flush_pkt && ret < 0) if (ret < 0)
av_packet_unref(pkt); av_packet_free(&pkt1);
return ret; return ret;
} }
static int packet_queue_put_nullpacket(PacketQueue *q, int stream_index) static int packet_queue_put_nullpacket(PacketQueue *q, AVPacket *pkt, int stream_index)
{ {
AVPacket pkt1, *pkt = &pkt1;
av_init_packet(pkt);
pkt->data = NULL;
pkt->size = 0;
pkt->stream_index = stream_index; pkt->stream_index = stream_index;
return packet_queue_put(q, pkt); return packet_queue_put(q, pkt);
} }
@@ -482,6 +479,9 @@ static int packet_queue_put_nullpacket(PacketQueue *q, int stream_index)
static int packet_queue_init(PacketQueue *q) static int packet_queue_init(PacketQueue *q)
{ {
memset(q, 0, sizeof(PacketQueue)); memset(q, 0, sizeof(PacketQueue));
q->pkt_list = av_fifo_alloc(sizeof(MyAVPacketList));
if (!q->pkt_list)
return AVERROR(ENOMEM);
q->mutex = SDL_CreateMutex(); q->mutex = SDL_CreateMutex();
if (!q->mutex) { if (!q->mutex) {
av_log(NULL, AV_LOG_FATAL, "SDL_CreateMutex(): %s\n", SDL_GetError()); av_log(NULL, AV_LOG_FATAL, "SDL_CreateMutex(): %s\n", SDL_GetError());
@@ -498,25 +498,24 @@ static int packet_queue_init(PacketQueue *q)
static void packet_queue_flush(PacketQueue *q) static void packet_queue_flush(PacketQueue *q)
{ {
MyAVPacketList *pkt, *pkt1; MyAVPacketList pkt1;
SDL_LockMutex(q->mutex); SDL_LockMutex(q->mutex);
for (pkt = q->first_pkt; pkt; pkt = pkt1) { while (av_fifo_size(q->pkt_list) >= sizeof(pkt1)) {
pkt1 = pkt->next; av_fifo_generic_read(q->pkt_list, &pkt1, sizeof(pkt1), NULL);
av_packet_unref(&pkt->pkt); av_packet_free(&pkt1.pkt);
av_freep(&pkt);
} }
q->last_pkt = NULL;
q->first_pkt = NULL;
q->nb_packets = 0; q->nb_packets = 0;
q->size = 0; q->size = 0;
q->duration = 0; q->duration = 0;
q->serial++;
SDL_UnlockMutex(q->mutex); SDL_UnlockMutex(q->mutex);
} }
static void packet_queue_destroy(PacketQueue *q) static void packet_queue_destroy(PacketQueue *q)
{ {
packet_queue_flush(q); packet_queue_flush(q);
av_fifo_freep(&q->pkt_list);
SDL_DestroyMutex(q->mutex); SDL_DestroyMutex(q->mutex);
SDL_DestroyCond(q->cond); SDL_DestroyCond(q->cond);
} }
@@ -536,14 +535,14 @@ static void packet_queue_start(PacketQueue *q)
{ {
SDL_LockMutex(q->mutex); SDL_LockMutex(q->mutex);
q->abort_request = 0; q->abort_request = 0;
packet_queue_put_private(q, &flush_pkt); q->serial++;
SDL_UnlockMutex(q->mutex); SDL_UnlockMutex(q->mutex);
} }
/* return < 0 if aborted, 0 if no packet and > 0 if packet. */ /* return < 0 if aborted, 0 if no packet and > 0 if packet. */
static int packet_queue_get(PacketQueue *q, AVPacket *pkt, int block, int *serial) static int packet_queue_get(PacketQueue *q, AVPacket *pkt, int block, int *serial)
{ {
MyAVPacketList *pkt1; MyAVPacketList pkt1;
int ret; int ret;
SDL_LockMutex(q->mutex); SDL_LockMutex(q->mutex);
@@ -554,18 +553,15 @@ static int packet_queue_get(PacketQueue *q, AVPacket *pkt, int block, int *seria
break; break;
} }
pkt1 = q->first_pkt; if (av_fifo_size(q->pkt_list) >= sizeof(pkt1)) {
if (pkt1) { av_fifo_generic_read(q->pkt_list, &pkt1, sizeof(pkt1), NULL);
q->first_pkt = pkt1->next;
if (!q->first_pkt)
q->last_pkt = NULL;
q->nb_packets--; q->nb_packets--;
q->size -= pkt1->pkt.size + sizeof(*pkt1); q->size -= pkt1.pkt->size + sizeof(pkt1);
q->duration -= pkt1->pkt.duration; q->duration -= pkt1.pkt->duration;
*pkt = pkt1->pkt; av_packet_move_ref(pkt, pkt1.pkt);
if (serial) if (serial)
*serial = pkt1->serial; *serial = pkt1.serial;
av_free(pkt1); av_packet_free(&pkt1.pkt);
ret = 1; ret = 1;
break; break;
} else if (!block) { } else if (!block) {
@@ -579,21 +575,23 @@ static int packet_queue_get(PacketQueue *q, AVPacket *pkt, int block, int *seria
return ret; return ret;
} }
static void decoder_init(Decoder *d, AVCodecContext *avctx, PacketQueue *queue, SDL_cond *empty_queue_cond) { static int decoder_init(Decoder *d, AVCodecContext *avctx, PacketQueue *queue, SDL_cond *empty_queue_cond) {
memset(d, 0, sizeof(Decoder)); memset(d, 0, sizeof(Decoder));
d->pkt = av_packet_alloc();
if (!d->pkt)
return AVERROR(ENOMEM);
d->avctx = avctx; d->avctx = avctx;
d->queue = queue; d->queue = queue;
d->empty_queue_cond = empty_queue_cond; d->empty_queue_cond = empty_queue_cond;
d->start_pts = AV_NOPTS_VALUE; d->start_pts = AV_NOPTS_VALUE;
d->pkt_serial = -1; d->pkt_serial = -1;
return 0;
} }
static int decoder_decode_frame(Decoder *d, AVFrame *frame, AVSubtitle *sub) { static int decoder_decode_frame(Decoder *d, AVFrame *frame, AVSubtitle *sub) {
int ret = AVERROR(EAGAIN); int ret = AVERROR(EAGAIN);
for (;;) { for (;;) {
AVPacket pkt;
if (d->queue->serial == d->pkt_serial) { if (d->queue->serial == d->pkt_serial) {
do { do {
if (d->queue->abort_request) if (d->queue->abort_request)
@@ -639,49 +637,48 @@ static int decoder_decode_frame(Decoder *d, AVFrame *frame, AVSubtitle *sub) {
if (d->queue->nb_packets == 0) if (d->queue->nb_packets == 0)
SDL_CondSignal(d->empty_queue_cond); SDL_CondSignal(d->empty_queue_cond);
if (d->packet_pending) { if (d->packet_pending) {
av_packet_move_ref(&pkt, &d->pkt);
d->packet_pending = 0; d->packet_pending = 0;
} else { } else {
if (packet_queue_get(d->queue, &pkt, 1, &d->pkt_serial) < 0) int old_serial = d->pkt_serial;
if (packet_queue_get(d->queue, d->pkt, 1, &d->pkt_serial) < 0)
return -1; return -1;
if (old_serial != d->pkt_serial) {
avcodec_flush_buffers(d->avctx);
d->finished = 0;
d->next_pts = d->start_pts;
d->next_pts_tb = d->start_pts_tb;
}
} }
if (d->queue->serial == d->pkt_serial) if (d->queue->serial == d->pkt_serial)
break; break;
av_packet_unref(&pkt); av_packet_unref(d->pkt);
} while (1); } while (1);
if (pkt.data == flush_pkt.data) { if (d->avctx->codec_type == AVMEDIA_TYPE_SUBTITLE) {
avcodec_flush_buffers(d->avctx); int got_frame = 0;
d->finished = 0; ret = avcodec_decode_subtitle2(d->avctx, sub, &got_frame, d->pkt);
d->next_pts = d->start_pts; if (ret < 0) {
d->next_pts_tb = d->start_pts_tb; ret = AVERROR(EAGAIN);
} else {
if (d->avctx->codec_type == AVMEDIA_TYPE_SUBTITLE) {
int got_frame = 0;
ret = avcodec_decode_subtitle2(d->avctx, sub, &got_frame, &pkt);
if (ret < 0) {
ret = AVERROR(EAGAIN);
} else {
if (got_frame && !pkt.data) {
d->packet_pending = 1;
av_packet_move_ref(&d->pkt, &pkt);
}
ret = got_frame ? 0 : (pkt.data ? AVERROR(EAGAIN) : AVERROR_EOF);
}
} else { } else {
if (avcodec_send_packet(d->avctx, &pkt) == AVERROR(EAGAIN)) { if (got_frame && !d->pkt->data) {
av_log(d->avctx, AV_LOG_ERROR, "Receive_frame and send_packet both returned EAGAIN, which is an API violation.\n");
d->packet_pending = 1; d->packet_pending = 1;
av_packet_move_ref(&d->pkt, &pkt);
} }
ret = got_frame ? 0 : (d->pkt->data ? AVERROR(EAGAIN) : AVERROR_EOF);
}
av_packet_unref(d->pkt);
} else {
if (avcodec_send_packet(d->avctx, d->pkt) == AVERROR(EAGAIN)) {
av_log(d->avctx, AV_LOG_ERROR, "Receive_frame and send_packet both returned EAGAIN, which is an API violation.\n");
d->packet_pending = 1;
} else {
av_packet_unref(d->pkt);
} }
av_packet_unref(&pkt);
} }
} }
} }
static void decoder_destroy(Decoder *d) { static void decoder_destroy(Decoder *d) {
av_packet_unref(&d->pkt); av_packet_free(&d->pkt);
avcodec_free_context(&d->avctx); avcodec_free_context(&d->avctx);
} }
@@ -1151,6 +1148,8 @@ static void video_audio_display(VideoState *s)
if (realloc_texture(&s->vis_texture, SDL_PIXELFORMAT_ARGB8888, s->width, s->height, SDL_BLENDMODE_NONE, 1) < 0) if (realloc_texture(&s->vis_texture, SDL_PIXELFORMAT_ARGB8888, s->width, s->height, SDL_BLENDMODE_NONE, 1) < 0)
return; return;
if (s->xpos >= s->width)
s->xpos = 0;
nb_display_channels= FFMIN(nb_display_channels, 2); nb_display_channels= FFMIN(nb_display_channels, 2);
if (rdft_bits != s->rdft_bits) { if (rdft_bits != s->rdft_bits) {
av_rdft_end(s->rdft); av_rdft_end(s->rdft);
@@ -1200,8 +1199,6 @@ static void video_audio_display(VideoState *s)
} }
if (!s->paused) if (!s->paused)
s->xpos++; s->xpos++;
if (s->xpos >= s->width)
s->xpos= s->xleft;
} }
} }
@@ -1647,37 +1644,37 @@ retry:
} }
if (is->subtitle_st) { if (is->subtitle_st) {
while (frame_queue_nb_remaining(&is->subpq) > 0) { while (frame_queue_nb_remaining(&is->subpq) > 0) {
sp = frame_queue_peek(&is->subpq); sp = frame_queue_peek(&is->subpq);
if (frame_queue_nb_remaining(&is->subpq) > 1) if (frame_queue_nb_remaining(&is->subpq) > 1)
sp2 = frame_queue_peek_next(&is->subpq); sp2 = frame_queue_peek_next(&is->subpq);
else else
sp2 = NULL; sp2 = NULL;
if (sp->serial != is->subtitleq.serial if (sp->serial != is->subtitleq.serial
|| (is->vidclk.pts > (sp->pts + ((float) sp->sub.end_display_time / 1000))) || (is->vidclk.pts > (sp->pts + ((float) sp->sub.end_display_time / 1000)))
|| (sp2 && is->vidclk.pts > (sp2->pts + ((float) sp2->sub.start_display_time / 1000)))) || (sp2 && is->vidclk.pts > (sp2->pts + ((float) sp2->sub.start_display_time / 1000))))
{ {
if (sp->uploaded) { if (sp->uploaded) {
int i; int i;
for (i = 0; i < sp->sub.num_rects; i++) { for (i = 0; i < sp->sub.num_rects; i++) {
AVSubtitleRect *sub_rect = sp->sub.rects[i]; AVSubtitleRect *sub_rect = sp->sub.rects[i];
uint8_t *pixels; uint8_t *pixels;
int pitch, j; int pitch, j;
if (!SDL_LockTexture(is->sub_texture, (SDL_Rect *)sub_rect, (void **)&pixels, &pitch)) { if (!SDL_LockTexture(is->sub_texture, (SDL_Rect *)sub_rect, (void **)&pixels, &pitch)) {
for (j = 0; j < sub_rect->h; j++, pixels += pitch) for (j = 0; j < sub_rect->h; j++, pixels += pitch)
memset(pixels, 0, sub_rect->w << 2); memset(pixels, 0, sub_rect->w << 2);
SDL_UnlockTexture(is->sub_texture); SDL_UnlockTexture(is->sub_texture);
}
} }
} }
frame_queue_next(&is->subpq);
} else {
break;
} }
frame_queue_next(&is->subpq);
} else {
break;
} }
}
} }
frame_queue_next(&is->pictq); frame_queue_next(&is->pictq);
@@ -2008,7 +2005,7 @@ static int configure_audio_filters(VideoState *is, const char *afilters, int for
if (force_output_format) { if (force_output_format) {
channel_layouts[0] = is->audio_tgt.channel_layout; channel_layouts[0] = is->audio_tgt.channel_layout;
channels [0] = is->audio_tgt.channels; channels [0] = is->audio_tgt.channel_layout ? -1 : is->audio_tgt.channels;
sample_rates [0] = is->audio_tgt.freq; sample_rates [0] = is->audio_tgt.freq;
if ((ret = av_opt_set_int(filt_asink, "all_channel_counts", 0, AV_OPT_SEARCH_CHILDREN)) < 0) if ((ret = av_opt_set_int(filt_asink, "all_channel_counts", 0, AV_OPT_SEARCH_CHILDREN)) < 0)
goto end; goto end;
@@ -2576,7 +2573,7 @@ static int stream_component_open(VideoState *is, int stream_index)
{ {
AVFormatContext *ic = is->ic; AVFormatContext *ic = is->ic;
AVCodecContext *avctx; AVCodecContext *avctx;
AVCodec *codec; const AVCodec *codec;
const char *forced_codec_name = NULL; const char *forced_codec_name = NULL;
AVDictionary *opts = NULL; AVDictionary *opts = NULL;
AVDictionaryEntry *t = NULL; AVDictionaryEntry *t = NULL;
@@ -2631,8 +2628,6 @@ static int stream_component_open(VideoState *is, int stream_index)
av_dict_set(&opts, "threads", "auto", 0); av_dict_set(&opts, "threads", "auto", 0);
if (stream_lowres) if (stream_lowres)
av_dict_set_int(&opts, "lowres", stream_lowres, 0); av_dict_set_int(&opts, "lowres", stream_lowres, 0);
if (avctx->codec_type == AVMEDIA_TYPE_VIDEO || avctx->codec_type == AVMEDIA_TYPE_AUDIO)
av_dict_set(&opts, "refcounted_frames", "1", 0);
if ((ret = avcodec_open2(avctx, codec, &opts)) < 0) { if ((ret = avcodec_open2(avctx, codec, &opts)) < 0) {
goto fail; goto fail;
} }
@@ -2685,7 +2680,8 @@ static int stream_component_open(VideoState *is, int stream_index)
is->audio_stream = stream_index; is->audio_stream = stream_index;
is->audio_st = ic->streams[stream_index]; is->audio_st = ic->streams[stream_index];
decoder_init(&is->auddec, avctx, &is->audioq, is->continue_read_thread); if ((ret = decoder_init(&is->auddec, avctx, &is->audioq, is->continue_read_thread)) < 0)
goto fail;
if ((is->ic->iformat->flags & (AVFMT_NOBINSEARCH | AVFMT_NOGENSEARCH | AVFMT_NO_BYTE_SEEK)) && !is->ic->iformat->read_seek) { if ((is->ic->iformat->flags & (AVFMT_NOBINSEARCH | AVFMT_NOGENSEARCH | AVFMT_NO_BYTE_SEEK)) && !is->ic->iformat->read_seek) {
is->auddec.start_pts = is->audio_st->start_time; is->auddec.start_pts = is->audio_st->start_time;
is->auddec.start_pts_tb = is->audio_st->time_base; is->auddec.start_pts_tb = is->audio_st->time_base;
@@ -2698,7 +2694,8 @@ static int stream_component_open(VideoState *is, int stream_index)
is->video_stream = stream_index; is->video_stream = stream_index;
is->video_st = ic->streams[stream_index]; is->video_st = ic->streams[stream_index];
decoder_init(&is->viddec, avctx, &is->videoq, is->continue_read_thread); if ((ret = decoder_init(&is->viddec, avctx, &is->videoq, is->continue_read_thread)) < 0)
goto fail;
if ((ret = decoder_start(&is->viddec, video_thread, "video_decoder", is)) < 0) if ((ret = decoder_start(&is->viddec, video_thread, "video_decoder", is)) < 0)
goto out; goto out;
is->queue_attachments_req = 1; is->queue_attachments_req = 1;
@@ -2707,7 +2704,8 @@ static int stream_component_open(VideoState *is, int stream_index)
is->subtitle_stream = stream_index; is->subtitle_stream = stream_index;
is->subtitle_st = ic->streams[stream_index]; is->subtitle_st = ic->streams[stream_index];
decoder_init(&is->subdec, avctx, &is->subtitleq, is->continue_read_thread); if ((ret = decoder_init(&is->subdec, avctx, &is->subtitleq, is->continue_read_thread)) < 0)
goto fail;
if ((ret = decoder_start(&is->subdec, subtitle_thread, "subtitle_decoder", is)) < 0) if ((ret = decoder_start(&is->subdec, subtitle_thread, "subtitle_decoder", is)) < 0)
goto out; goto out;
break; break;
@@ -2760,7 +2758,7 @@ static int read_thread(void *arg)
AVFormatContext *ic = NULL; AVFormatContext *ic = NULL;
int err, i, ret; int err, i, ret;
int st_index[AVMEDIA_TYPE_NB]; int st_index[AVMEDIA_TYPE_NB];
AVPacket pkt1, *pkt = &pkt1; AVPacket *pkt = NULL;
int64_t stream_start_time; int64_t stream_start_time;
int pkt_in_play_range = 0; int pkt_in_play_range = 0;
AVDictionaryEntry *t; AVDictionaryEntry *t;
@@ -2777,6 +2775,12 @@ static int read_thread(void *arg)
memset(st_index, -1, sizeof(st_index)); memset(st_index, -1, sizeof(st_index));
is->eof = 0; is->eof = 0;
pkt = av_packet_alloc();
if (!pkt) {
av_log(NULL, AV_LOG_FATAL, "Could not allocate packet.\n");
ret = AVERROR(ENOMEM);
goto fail;
}
ic = avformat_alloc_context(); ic = avformat_alloc_context();
if (!ic) { if (!ic) {
av_log(NULL, AV_LOG_FATAL, "Could not allocate context.\n"); av_log(NULL, AV_LOG_FATAL, "Could not allocate context.\n");
@@ -2960,18 +2964,12 @@ static int read_thread(void *arg)
av_log(NULL, AV_LOG_ERROR, av_log(NULL, AV_LOG_ERROR,
"%s: error while seeking\n", is->ic->url); "%s: error while seeking\n", is->ic->url);
} else { } else {
if (is->audio_stream >= 0) { if (is->audio_stream >= 0)
packet_queue_flush(&is->audioq); packet_queue_flush(&is->audioq);
packet_queue_put(&is->audioq, &flush_pkt); if (is->subtitle_stream >= 0)
}
if (is->subtitle_stream >= 0) {
packet_queue_flush(&is->subtitleq); packet_queue_flush(&is->subtitleq);
packet_queue_put(&is->subtitleq, &flush_pkt); if (is->video_stream >= 0)
}
if (is->video_stream >= 0) {
packet_queue_flush(&is->videoq); packet_queue_flush(&is->videoq);
packet_queue_put(&is->videoq, &flush_pkt);
}
if (is->seek_flags & AVSEEK_FLAG_BYTE) { if (is->seek_flags & AVSEEK_FLAG_BYTE) {
set_clock(&is->extclk, NAN, 0); set_clock(&is->extclk, NAN, 0);
} else { } else {
@@ -2986,11 +2984,10 @@ static int read_thread(void *arg)
} }
if (is->queue_attachments_req) { if (is->queue_attachments_req) {
if (is->video_st && is->video_st->disposition & AV_DISPOSITION_ATTACHED_PIC) { if (is->video_st && is->video_st->disposition & AV_DISPOSITION_ATTACHED_PIC) {
AVPacket copy; if ((ret = av_packet_ref(pkt, &is->video_st->attached_pic)) < 0)
if ((ret = av_packet_ref(&copy, &is->video_st->attached_pic)) < 0)
goto fail; goto fail;
packet_queue_put(&is->videoq, &copy); packet_queue_put(&is->videoq, pkt);
packet_queue_put_nullpacket(&is->videoq, is->video_stream); packet_queue_put_nullpacket(&is->videoq, pkt, is->video_stream);
} }
is->queue_attachments_req = 0; is->queue_attachments_req = 0;
} }
@@ -3021,15 +3018,19 @@ static int read_thread(void *arg)
if (ret < 0) { if (ret < 0) {
if ((ret == AVERROR_EOF || avio_feof(ic->pb)) && !is->eof) { if ((ret == AVERROR_EOF || avio_feof(ic->pb)) && !is->eof) {
if (is->video_stream >= 0) if (is->video_stream >= 0)
packet_queue_put_nullpacket(&is->videoq, is->video_stream); packet_queue_put_nullpacket(&is->videoq, pkt, is->video_stream);
if (is->audio_stream >= 0) if (is->audio_stream >= 0)
packet_queue_put_nullpacket(&is->audioq, is->audio_stream); packet_queue_put_nullpacket(&is->audioq, pkt, is->audio_stream);
if (is->subtitle_stream >= 0) if (is->subtitle_stream >= 0)
packet_queue_put_nullpacket(&is->subtitleq, is->subtitle_stream); packet_queue_put_nullpacket(&is->subtitleq, pkt, is->subtitle_stream);
is->eof = 1; is->eof = 1;
} }
if (ic->pb && ic->pb->error) if (ic->pb && ic->pb->error) {
break; if (autoexit)
goto fail;
else
break;
}
SDL_LockMutex(wait_mutex); SDL_LockMutex(wait_mutex);
SDL_CondWaitTimeout(is->continue_read_thread, wait_mutex, 10); SDL_CondWaitTimeout(is->continue_read_thread, wait_mutex, 10);
SDL_UnlockMutex(wait_mutex); SDL_UnlockMutex(wait_mutex);
@@ -3062,6 +3063,7 @@ static int read_thread(void *arg)
if (ic && !is->ic) if (ic && !is->ic)
avformat_close_input(&ic); avformat_close_input(&ic);
av_packet_free(&pkt);
if (ret != 0) { if (ret != 0) {
SDL_Event event; SDL_Event event;
@@ -3734,9 +3736,6 @@ int main(int argc, char **argv)
SDL_EventState(SDL_SYSWMEVENT, SDL_IGNORE); SDL_EventState(SDL_SYSWMEVENT, SDL_IGNORE);
SDL_EventState(SDL_USEREVENT, SDL_IGNORE); SDL_EventState(SDL_USEREVENT, SDL_IGNORE);
av_init_packet(&flush_pkt);
flush_pkt.data = (uint8_t *)&flush_pkt;
if (!display_disable) { if (!display_disable) {
int flags = SDL_WINDOW_HIDDEN; int flags = SDL_WINDOW_HIDDEN;
if (alwaysontop) if (alwaysontop)
+142 -73
View File
@@ -35,6 +35,7 @@
#include "libavutil/bprint.h" #include "libavutil/bprint.h"
#include "libavutil/display.h" #include "libavutil/display.h"
#include "libavutil/hash.h" #include "libavutil/hash.h"
#include "libavutil/hdr_dynamic_metadata.h"
#include "libavutil/mastering_display_metadata.h" #include "libavutil/mastering_display_metadata.h"
#include "libavutil/dovi_meta.h" #include "libavutil/dovi_meta.h"
#include "libavutil/opt.h" #include "libavutil/opt.h"
@@ -1671,24 +1672,6 @@ static av_cold int xml_init(WriterContext *wctx)
return 0; return 0;
} }
static const char *xml_escape_str(AVBPrint *dst, const char *src, void *log_ctx)
{
const char *p;
for (p = src; *p; p++) {
switch (*p) {
case '&' : av_bprintf(dst, "%s", "&amp;"); break;
case '<' : av_bprintf(dst, "%s", "&lt;"); break;
case '>' : av_bprintf(dst, "%s", "&gt;"); break;
case '"' : av_bprintf(dst, "%s", "&quot;"); break;
case '\'': av_bprintf(dst, "%s", "&apos;"); break;
default: av_bprint_chars(dst, *p, 1);
}
}
return dst->str;
}
#define XML_INDENT() printf("%*c", xml->indent_level * 4, ' ') #define XML_INDENT() printf("%*c", xml->indent_level * 4, ' ')
static void xml_print_section_header(WriterContext *wctx) static void xml_print_section_header(WriterContext *wctx)
@@ -1760,14 +1743,22 @@ static void xml_print_str(WriterContext *wctx, const char *key, const char *valu
if (section->flags & SECTION_FLAG_HAS_VARIABLE_FIELDS) { if (section->flags & SECTION_FLAG_HAS_VARIABLE_FIELDS) {
XML_INDENT(); XML_INDENT();
av_bprint_escape(&buf, key, NULL,
AV_ESCAPE_MODE_XML, AV_ESCAPE_FLAG_XML_DOUBLE_QUOTES);
printf("<%s key=\"%s\"", printf("<%s key=\"%s\"",
section->element_name, xml_escape_str(&buf, key, wctx)); section->element_name, buf.str);
av_bprint_clear(&buf); av_bprint_clear(&buf);
printf(" value=\"%s\"/>\n", xml_escape_str(&buf, value, wctx));
av_bprint_escape(&buf, value, NULL,
AV_ESCAPE_MODE_XML, AV_ESCAPE_FLAG_XML_DOUBLE_QUOTES);
printf(" value=\"%s\"/>\n", buf.str);
} else { } else {
if (wctx->nb_item[wctx->level]) if (wctx->nb_item[wctx->level])
printf(" "); printf(" ");
printf("%s=\"%s\"", key, xml_escape_str(&buf, value, wctx));
av_bprint_escape(&buf, value, NULL,
AV_ESCAPE_MODE_XML, AV_ESCAPE_FLAG_XML_DOUBLE_QUOTES);
printf("%s=\"%s\"", key, buf.str);
} }
av_bprint_finalize(&buf, NULL); av_bprint_finalize(&buf, NULL);
@@ -1860,6 +1851,105 @@ static inline int show_tags(WriterContext *w, AVDictionary *tags, int section_id
return ret; return ret;
} }
static void print_dynamic_hdr10_plus(WriterContext *w, const AVDynamicHDRPlus *metadata)
{
if (!metadata)
return;
print_int("application version", metadata->application_version);
print_int("num_windows", metadata->num_windows);
for (int n = 1; n < metadata->num_windows; n++) {
const AVHDRPlusColorTransformParams *params = &metadata->params[n];
print_q("window_upper_left_corner_x",
params->window_upper_left_corner_x,'/');
print_q("window_upper_left_corner_y",
params->window_upper_left_corner_y,'/');
print_q("window_lower_right_corner_x",
params->window_lower_right_corner_x,'/');
print_q("window_lower_right_corner_y",
params->window_lower_right_corner_y,'/');
print_q("window_upper_left_corner_x",
params->window_upper_left_corner_x,'/');
print_q("window_upper_left_corner_y",
params->window_upper_left_corner_y,'/');
print_int("center_of_ellipse_x",
params->center_of_ellipse_x ) ;
print_int("center_of_ellipse_y",
params->center_of_ellipse_y );
print_int("rotation_angle",
params->rotation_angle);
print_int("semimajor_axis_internal_ellipse",
params->semimajor_axis_internal_ellipse);
print_int("semimajor_axis_external_ellipse",
params->semimajor_axis_external_ellipse);
print_int("semiminor_axis_external_ellipse",
params->semiminor_axis_external_ellipse);
print_int("overlap_process_option",
params->overlap_process_option);
}
print_q("targeted_system_display_maximum_luminance",
metadata->targeted_system_display_maximum_luminance,'/');
if (metadata->targeted_system_display_actual_peak_luminance_flag) {
print_int("num_rows_targeted_system_display_actual_peak_luminance",
metadata->num_rows_targeted_system_display_actual_peak_luminance);
print_int("num_cols_targeted_system_display_actual_peak_luminance",
metadata->num_cols_targeted_system_display_actual_peak_luminance);
for (int i = 0; i < metadata->num_rows_targeted_system_display_actual_peak_luminance; i++) {
for (int j = 0; j < metadata->num_cols_targeted_system_display_actual_peak_luminance; j++) {
print_q("targeted_system_display_actual_peak_luminance",
metadata->targeted_system_display_actual_peak_luminance[i][j],'/');
}
}
}
for (int n = 0; n < metadata->num_windows; n++) {
const AVHDRPlusColorTransformParams *params = &metadata->params[n];
for (int i = 0; i < 3; i++) {
print_q("maxscl",params->maxscl[i],'/');
}
print_q("average_maxrgb",
params->average_maxrgb,'/');
print_int("num_distribution_maxrgb_percentiles",
params->num_distribution_maxrgb_percentiles);
for (int i = 0; i < params->num_distribution_maxrgb_percentiles; i++) {
print_int("distribution_maxrgb_percentage",
params->distribution_maxrgb[i].percentage);
print_q("distribution_maxrgb_percentile",
params->distribution_maxrgb[i].percentile,'/');
}
print_q("fraction_bright_pixels",
params->fraction_bright_pixels,'/');
}
if (metadata->mastering_display_actual_peak_luminance_flag) {
print_int("num_rows_mastering_display_actual_peak_luminance",
metadata->num_rows_mastering_display_actual_peak_luminance);
print_int("num_cols_mastering_display_actual_peak_luminance",
metadata->num_cols_mastering_display_actual_peak_luminance);
for (int i = 0; i < metadata->num_rows_mastering_display_actual_peak_luminance; i++) {
for (int j = 0; j < metadata->num_cols_mastering_display_actual_peak_luminance; j++) {
print_q("mastering_display_actual_peak_luminance",
metadata->mastering_display_actual_peak_luminance[i][j],'/');
}
}
}
for (int n = 0; n < metadata->num_windows; n++) {
const AVHDRPlusColorTransformParams *params = &metadata->params[n];
if (params->tone_mapping_flag) {
print_q("knee_point_x", params->knee_point_x,'/');
print_q("knee_point_y", params->knee_point_y,'/');
print_int("num_bezier_curve_anchors",
params->num_bezier_curve_anchors );
for (int i = 0; i < params->num_bezier_curve_anchors; i++) {
print_q("bezier_curve_anchors",
params->bezier_curve_anchors[i],'/');
}
}
if (params->color_saturation_mapping_flag) {
print_q("color_saturation_weight",
params->color_saturation_weight,'/');
}
}
}
static void print_pkt_side_data(WriterContext *w, static void print_pkt_side_data(WriterContext *w,
AVCodecParameters *par, AVCodecParameters *par,
const AVPacketSideData *side_data, const AVPacketSideData *side_data,
@@ -2068,8 +2158,6 @@ static void show_packet(WriterContext *w, InputFile *ifile, AVPacket *pkt, int p
print_time("dts_time", pkt->dts, &st->time_base); print_time("dts_time", pkt->dts, &st->time_base);
print_duration_ts("duration", pkt->duration); print_duration_ts("duration", pkt->duration);
print_duration_time("duration_time", pkt->duration, &st->time_base); print_duration_time("duration_time", pkt->duration, &st->time_base);
print_duration_ts("convergence_duration", pkt->convergence_duration);
print_duration_time("convergence_duration_time", pkt->convergence_duration, &st->time_base);
print_val("size", pkt->size, unit_byte_str); print_val("size", pkt->size, unit_byte_str);
if (pkt->pos != -1) print_fmt ("pos", "%"PRId64, pkt->pos); if (pkt->pos != -1) print_fmt ("pos", "%"PRId64, pkt->pos);
else print_str_opt("pos", "N/A"); else print_str_opt("pos", "N/A");
@@ -2225,7 +2313,7 @@ static void show_frame(WriterContext *w, AVFrame *frame, AVStream *stream,
writer_print_section_header(w, SECTION_ID_FRAME_SIDE_DATA_TIMECODE_LIST); writer_print_section_header(w, SECTION_ID_FRAME_SIDE_DATA_TIMECODE_LIST);
for (int j = 1; j <= m ; j++) { for (int j = 1; j <= m ; j++) {
char tcbuf[AV_TIMECODE_STR_SIZE]; char tcbuf[AV_TIMECODE_STR_SIZE];
av_timecode_make_smpte_tc_string(tcbuf, tc[j], 0); av_timecode_make_smpte_tc_string2(tcbuf, stream->avg_frame_rate, tc[j], 0, 0);
writer_print_section_header(w, SECTION_ID_FRAME_SIDE_DATA_TIMECODE); writer_print_section_header(w, SECTION_ID_FRAME_SIDE_DATA_TIMECODE);
print_str("value", tcbuf); print_str("value", tcbuf);
writer_print_section_footer(w); writer_print_section_footer(w);
@@ -2250,6 +2338,9 @@ static void show_frame(WriterContext *w, AVFrame *frame, AVStream *stream,
print_q("min_luminance", metadata->min_luminance, '/'); print_q("min_luminance", metadata->min_luminance, '/');
print_q("max_luminance", metadata->max_luminance, '/'); print_q("max_luminance", metadata->max_luminance, '/');
} }
} else if (sd->type == AV_FRAME_DATA_DYNAMIC_HDR_PLUS) {
AVDynamicHDRPlus *metadata = (AVDynamicHDRPlus *)sd->data;
print_dynamic_hdr10_plus(w, metadata);
} else if (sd->type == AV_FRAME_DATA_CONTENT_LIGHT_LEVEL) { } else if (sd->type == AV_FRAME_DATA_CONTENT_LIGHT_LEVEL) {
AVContentLightMetadata *metadata = (AVContentLightMetadata *)sd->data; AVContentLightMetadata *metadata = (AVContentLightMetadata *)sd->data;
print_int("max_content", metadata->MaxCLL); print_int("max_content", metadata->MaxCLL);
@@ -2362,14 +2453,12 @@ static int read_interval_packets(WriterContext *w, InputFile *ifile,
const ReadInterval *interval, int64_t *cur_ts) const ReadInterval *interval, int64_t *cur_ts)
{ {
AVFormatContext *fmt_ctx = ifile->fmt_ctx; AVFormatContext *fmt_ctx = ifile->fmt_ctx;
AVPacket pkt; AVPacket *pkt = NULL;
AVFrame *frame = NULL; AVFrame *frame = NULL;
int ret = 0, i = 0, frame_count = 0; int ret = 0, i = 0, frame_count = 0;
int64_t start = -INT64_MAX, end = interval->end; int64_t start = -INT64_MAX, end = interval->end;
int has_start = 0, has_end = interval->has_end && !interval->end_is_offset; int has_start = 0, has_end = interval->has_end && !interval->end_is_offset;
av_init_packet(&pkt);
av_log(NULL, AV_LOG_VERBOSE, "Processing read interval "); av_log(NULL, AV_LOG_VERBOSE, "Processing read interval ");
log_read_interval(interval, NULL, AV_LOG_VERBOSE); log_read_interval(interval, NULL, AV_LOG_VERBOSE);
@@ -2402,18 +2491,23 @@ static int read_interval_packets(WriterContext *w, InputFile *ifile,
ret = AVERROR(ENOMEM); ret = AVERROR(ENOMEM);
goto end; goto end;
} }
while (!av_read_frame(fmt_ctx, &pkt)) { pkt = av_packet_alloc();
if (!pkt) {
ret = AVERROR(ENOMEM);
goto end;
}
while (!av_read_frame(fmt_ctx, pkt)) {
if (fmt_ctx->nb_streams > nb_streams) { if (fmt_ctx->nb_streams > nb_streams) {
REALLOCZ_ARRAY_STREAM(nb_streams_frames, nb_streams, fmt_ctx->nb_streams); REALLOCZ_ARRAY_STREAM(nb_streams_frames, nb_streams, fmt_ctx->nb_streams);
REALLOCZ_ARRAY_STREAM(nb_streams_packets, nb_streams, fmt_ctx->nb_streams); REALLOCZ_ARRAY_STREAM(nb_streams_packets, nb_streams, fmt_ctx->nb_streams);
REALLOCZ_ARRAY_STREAM(selected_streams, nb_streams, fmt_ctx->nb_streams); REALLOCZ_ARRAY_STREAM(selected_streams, nb_streams, fmt_ctx->nb_streams);
nb_streams = fmt_ctx->nb_streams; nb_streams = fmt_ctx->nb_streams;
} }
if (selected_streams[pkt.stream_index]) { if (selected_streams[pkt->stream_index]) {
AVRational tb = ifile->streams[pkt.stream_index].st->time_base; AVRational tb = ifile->streams[pkt->stream_index].st->time_base;
if (pkt.pts != AV_NOPTS_VALUE) if (pkt->pts != AV_NOPTS_VALUE)
*cur_ts = av_rescale_q(pkt.pts, tb, AV_TIME_BASE_Q); *cur_ts = av_rescale_q(pkt->pts, tb, AV_TIME_BASE_Q);
if (!has_start && *cur_ts != AV_NOPTS_VALUE) { if (!has_start && *cur_ts != AV_NOPTS_VALUE) {
start = *cur_ts; start = *cur_ts;
@@ -2435,26 +2529,27 @@ static int read_interval_packets(WriterContext *w, InputFile *ifile,
frame_count++; frame_count++;
if (do_read_packets) { if (do_read_packets) {
if (do_show_packets) if (do_show_packets)
show_packet(w, ifile, &pkt, i++); show_packet(w, ifile, pkt, i++);
nb_streams_packets[pkt.stream_index]++; nb_streams_packets[pkt->stream_index]++;
} }
if (do_read_frames) { if (do_read_frames) {
int packet_new = 1; int packet_new = 1;
while (process_frame(w, ifile, frame, &pkt, &packet_new) > 0); while (process_frame(w, ifile, frame, pkt, &packet_new) > 0);
} }
} }
av_packet_unref(&pkt); av_packet_unref(pkt);
} }
av_packet_unref(&pkt); av_packet_unref(pkt);
//Flush remaining frames that are cached in the decoder //Flush remaining frames that are cached in the decoder
for (i = 0; i < fmt_ctx->nb_streams; i++) { for (i = 0; i < fmt_ctx->nb_streams; i++) {
pkt.stream_index = i; pkt->stream_index = i;
if (do_read_frames) if (do_read_frames)
while (process_frame(w, ifile, frame, &pkt, &(int){1}) > 0); while (process_frame(w, ifile, frame, pkt, &(int){1}) > 0);
} }
end: end:
av_frame_free(&frame); av_frame_free(&frame);
av_packet_free(&pkt);
if (ret < 0) { if (ret < 0) {
av_log(NULL, AV_LOG_ERROR, "Could not read packets in interval "); av_log(NULL, AV_LOG_ERROR, "Could not read packets in interval ");
log_read_interval(interval, NULL, AV_LOG_ERROR); log_read_interval(interval, NULL, AV_LOG_ERROR);
@@ -2530,10 +2625,6 @@ static int show_stream(WriterContext *w, AVFormatContext *fmt_ctx, int stream_id
s = av_get_media_type_string(par->codec_type); s = av_get_media_type_string(par->codec_type);
if (s) print_str ("codec_type", s); if (s) print_str ("codec_type", s);
else print_str_opt("codec_type", "unknown"); else print_str_opt("codec_type", "unknown");
#if FF_API_LAVF_AVCTX
if (dec_ctx)
print_q("codec_time_base", dec_ctx->time_base, '/');
#endif
/* print AVI/FourCC tag */ /* print AVI/FourCC tag */
print_str("codec_tag_string", av_fourcc2str(par->codec_tag)); print_str("codec_tag_string", av_fourcc2str(par->codec_tag));
@@ -2543,13 +2634,11 @@ static int show_stream(WriterContext *w, AVFormatContext *fmt_ctx, int stream_id
case AVMEDIA_TYPE_VIDEO: case AVMEDIA_TYPE_VIDEO:
print_int("width", par->width); print_int("width", par->width);
print_int("height", par->height); print_int("height", par->height);
#if FF_API_LAVF_AVCTX
if (dec_ctx) { if (dec_ctx) {
print_int("coded_width", dec_ctx->coded_width); print_int("coded_width", dec_ctx->coded_width);
print_int("coded_height", dec_ctx->coded_height); print_int("coded_height", dec_ctx->coded_height);
print_int("closed_captions", !!(dec_ctx->properties & FF_CODEC_PROPERTY_CLOSED_CAPTIONS)); print_int("closed_captions", !!(dec_ctx->properties & FF_CODEC_PROPERTY_CLOSED_CAPTIONS));
} }
#endif
print_int("has_b_frames", par->video_delay); print_int("has_b_frames", par->video_delay);
sar = av_guess_sample_aspect_ratio(fmt_ctx, stream, NULL); sar = av_guess_sample_aspect_ratio(fmt_ctx, stream, NULL);
if (sar.num) { if (sar.num) {
@@ -2587,15 +2676,6 @@ static int show_stream(WriterContext *w, AVFormatContext *fmt_ctx, int stream_id
else else
print_str_opt("field_order", "unknown"); print_str_opt("field_order", "unknown");
#if FF_API_PRIVATE_OPT
if (dec_ctx && dec_ctx->timecode_frame_start >= 0) {
char tcbuf[AV_TIMECODE_STR_SIZE];
av_timecode_make_mpeg_tc_string(tcbuf, dec_ctx->timecode_frame_start);
print_str("timecode", tcbuf);
} else {
print_str_opt("timecode", "N/A");
}
#endif
if (dec_ctx) if (dec_ctx)
print_int("refs", dec_ctx->refs); print_int("refs", dec_ctx->refs);
break; break;
@@ -2653,10 +2733,10 @@ static int show_stream(WriterContext *w, AVFormatContext *fmt_ctx, int stream_id
print_time("duration", stream->duration, &stream->time_base); print_time("duration", stream->duration, &stream->time_base);
if (par->bit_rate > 0) print_val ("bit_rate", par->bit_rate, unit_bit_per_second_str); if (par->bit_rate > 0) print_val ("bit_rate", par->bit_rate, unit_bit_per_second_str);
else print_str_opt("bit_rate", "N/A"); else print_str_opt("bit_rate", "N/A");
#if FF_API_LAVF_AVCTX if (dec_ctx && dec_ctx->rc_max_rate > 0)
if (stream->codec->rc_max_rate > 0) print_val ("max_bit_rate", stream->codec->rc_max_rate, unit_bit_per_second_str); print_val ("max_bit_rate", dec_ctx->rc_max_rate, unit_bit_per_second_str);
else print_str_opt("max_bit_rate", "N/A"); else
#endif print_str_opt("max_bit_rate", "N/A");
if (dec_ctx && dec_ctx->bits_per_raw_sample > 0) print_fmt("bits_per_raw_sample", "%d", dec_ctx->bits_per_raw_sample); if (dec_ctx && dec_ctx->bits_per_raw_sample > 0) print_fmt("bits_per_raw_sample", "%d", dec_ctx->bits_per_raw_sample);
else print_str_opt("bits_per_raw_sample", "N/A"); else print_str_opt("bits_per_raw_sample", "N/A");
if (stream->nb_frames) print_fmt ("nb_frames", "%"PRId64, stream->nb_frames); if (stream->nb_frames) print_fmt ("nb_frames", "%"PRId64, stream->nb_frames);
@@ -2854,7 +2934,7 @@ static int open_input_file(InputFile *ifile, const char *filename,
{ {
int err, i; int err, i;
AVFormatContext *fmt_ctx = NULL; AVFormatContext *fmt_ctx = NULL;
AVDictionaryEntry *t; AVDictionaryEntry *t = NULL;
int scan_all_pmts_set = 0; int scan_all_pmts_set = 0;
fmt_ctx = avformat_alloc_context(); fmt_ctx = avformat_alloc_context();
@@ -2879,10 +2959,8 @@ static int open_input_file(InputFile *ifile, const char *filename,
ifile->fmt_ctx = fmt_ctx; ifile->fmt_ctx = fmt_ctx;
if (scan_all_pmts_set) if (scan_all_pmts_set)
av_dict_set(&format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE); av_dict_set(&format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE);
if ((t = av_dict_get(format_opts, "", NULL, AV_DICT_IGNORE_SUFFIX))) { while ((t = av_dict_get(format_opts, "", t, AV_DICT_IGNORE_SUFFIX)))
av_log(NULL, AV_LOG_ERROR, "Option %s not found.\n", t->key); av_log(NULL, AV_LOG_WARNING, "Option %s skipped - not known to demuxer.\n", t->key);
return AVERROR_OPTION_NOT_FOUND;
}
if (find_stream_info) { if (find_stream_info) {
AVDictionary **opts = setup_find_stream_info_opts(fmt_ctx, codec_opts); AVDictionary **opts = setup_find_stream_info_opts(fmt_ctx, codec_opts);
@@ -2912,7 +2990,7 @@ static int open_input_file(InputFile *ifile, const char *filename,
for (i = 0; i < fmt_ctx->nb_streams; i++) { for (i = 0; i < fmt_ctx->nb_streams; i++) {
InputStream *ist = &ifile->streams[i]; InputStream *ist = &ifile->streams[i];
AVStream *stream = fmt_ctx->streams[i]; AVStream *stream = fmt_ctx->streams[i];
AVCodec *codec; const AVCodec *codec;
ist->st = stream; ist->st = stream;
@@ -2950,12 +3028,6 @@ static int open_input_file(InputFile *ifile, const char *filename,
} }
ist->dec_ctx->pkt_timebase = stream->time_base; ist->dec_ctx->pkt_timebase = stream->time_base;
ist->dec_ctx->framerate = stream->avg_frame_rate;
#if FF_API_LAVF_AVCTX
ist->dec_ctx->properties = stream->codec->properties;
ist->dec_ctx->coded_width = stream->codec->coded_width;
ist->dec_ctx->coded_height = stream->codec->coded_height;
#endif
if (avcodec_open2(ist->dec_ctx, codec, &opts) < 0) { if (avcodec_open2(ist->dec_ctx, codec, &opts) < 0) {
av_log(NULL, AV_LOG_WARNING, "Could not open codec for input stream %d\n", av_log(NULL, AV_LOG_WARNING, "Could not open codec for input stream %d\n",
@@ -3156,9 +3228,6 @@ static void ffprobe_show_pixel_formats(WriterContext *w)
PRINT_PIX_FMT_FLAG(HWACCEL, "hwaccel"); PRINT_PIX_FMT_FLAG(HWACCEL, "hwaccel");
PRINT_PIX_FMT_FLAG(PLANAR, "planar"); PRINT_PIX_FMT_FLAG(PLANAR, "planar");
PRINT_PIX_FMT_FLAG(RGB, "rgb"); PRINT_PIX_FMT_FLAG(RGB, "rgb");
#if FF_API_PSEUDOPAL
PRINT_PIX_FMT_FLAG(PSEUDOPAL, "pseudopal");
#endif
PRINT_PIX_FMT_FLAG(ALPHA, "alpha"); PRINT_PIX_FMT_FLAG(ALPHA, "alpha");
writer_print_section_footer(w); writer_print_section_footer(w);
} }
+3 -2
View File
@@ -30,6 +30,7 @@
#include "libavutil/frame.h" #include "libavutil/frame.h"
#include "libavutil/imgutils.h" #include "libavutil/imgutils.h"
#include "libavutil/intreadwrite.h" #include "libavutil/intreadwrite.h"
#include "libavutil/mem_internal.h"
#include "avcodec.h" #include "avcodec.h"
#include "blockdsp.h" #include "blockdsp.h"
#include "bswapdsp.h" #include "bswapdsp.h"
@@ -498,8 +499,8 @@ static int decode_i_block(FourXContext *f, int16_t *block)
{ {
int code, i, j, level, val; int code, i, j, level, val;
if (get_bits_left(&f->gb) < 2){ if (get_bits_left(&f->pre_gb) < 2) {
av_log(f->avctx, AV_LOG_ERROR, "%d bits left before decode_i_block()\n", get_bits_left(&f->gb)); av_log(f->avctx, AV_LOG_ERROR, "%d bits left before decode_i_block()\n", get_bits_left(&f->pre_gb));
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
} }
+1 -1
View File
@@ -122,7 +122,7 @@ static int decode_frame(AVCodecContext *avctx, void *data,
} }
if (avctx->bits_per_coded_sample <= 8) { if (avctx->bits_per_coded_sample <= 8) {
int size; buffer_size_t size;
const uint8_t *pal = av_packet_get_side_data(avpkt, const uint8_t *pal = av_packet_get_side_data(avpkt,
AV_PKT_DATA_PALETTE, AV_PKT_DATA_PALETTE,
&size); &size);
+99 -63
View File
@@ -29,6 +29,7 @@ HEADERS = ac3_parser.h \
OBJS = ac3_parser.o \ OBJS = ac3_parser.o \
adts_parser.o \ adts_parser.o \
allcodecs.o \ allcodecs.o \
avcodec.o \
avdct.o \ avdct.o \
avpacket.o \ avpacket.o \
avpicture.o \ avpicture.o \
@@ -37,6 +38,7 @@ OBJS = ac3_parser.o \
bitstream_filters.o \ bitstream_filters.o \
bsf.o \ bsf.o \
codec_desc.o \ codec_desc.o \
codec_par.o \
d3d11va.o \ d3d11va.o \
decode.o \ decode.o \
dirac.o \ dirac.o \
@@ -48,7 +50,6 @@ OBJS = ac3_parser.o \
mediacodec.o \ mediacodec.o \
mpeg12framerate.o \ mpeg12framerate.o \
options.o \ options.o \
mjpegenc_huffman.o \
parser.o \ parser.o \
parsers.o \ parsers.o \
profiles.o \ profiles.o \
@@ -64,14 +65,15 @@ OBJS-$(CONFIG_AC3DSP) += ac3dsp.o ac3.o ac3tab.o
OBJS-$(CONFIG_ADTS_HEADER) += adts_header.o mpeg4audio.o OBJS-$(CONFIG_ADTS_HEADER) += adts_header.o mpeg4audio.o
OBJS-$(CONFIG_AMF) += amfenc.o OBJS-$(CONFIG_AMF) += amfenc.o
OBJS-$(CONFIG_AUDIO_FRAME_QUEUE) += audio_frame_queue.o OBJS-$(CONFIG_AUDIO_FRAME_QUEUE) += audio_frame_queue.o
OBJS-$(CONFIG_ATSC_A53) += atsc_a53.o
OBJS-$(CONFIG_AUDIODSP) += audiodsp.o OBJS-$(CONFIG_AUDIODSP) += audiodsp.o
OBJS-$(CONFIG_BLOCKDSP) += blockdsp.o OBJS-$(CONFIG_BLOCKDSP) += blockdsp.o
OBJS-$(CONFIG_BSWAPDSP) += bswapdsp.o OBJS-$(CONFIG_BSWAPDSP) += bswapdsp.o
OBJS-$(CONFIG_CABAC) += cabac.o OBJS-$(CONFIG_CABAC) += cabac.o
OBJS-$(CONFIG_CBS) += cbs.o OBJS-$(CONFIG_CBS) += cbs.o cbs_bsf.o
OBJS-$(CONFIG_CBS_AV1) += cbs_av1.o OBJS-$(CONFIG_CBS_AV1) += cbs_av1.o
OBJS-$(CONFIG_CBS_H264) += cbs_h2645.o h2645_parse.o OBJS-$(CONFIG_CBS_H264) += cbs_h2645.o cbs_sei.o h2645_parse.o
OBJS-$(CONFIG_CBS_H265) += cbs_h2645.o h2645_parse.o OBJS-$(CONFIG_CBS_H265) += cbs_h2645.o cbs_sei.o h2645_parse.o
OBJS-$(CONFIG_CBS_JPEG) += cbs_jpeg.o OBJS-$(CONFIG_CBS_JPEG) += cbs_jpeg.o
OBJS-$(CONFIG_CBS_MPEG2) += cbs_mpeg2.o OBJS-$(CONFIG_CBS_MPEG2) += cbs_mpeg2.o
OBJS-$(CONFIG_CBS_VP9) += cbs_vp9.o OBJS-$(CONFIG_CBS_VP9) += cbs_vp9.o
@@ -82,10 +84,9 @@ OBJS-$(CONFIG_EXIF) += exif.o tiff_common.o
OBJS-$(CONFIG_FAANDCT) += faandct.o OBJS-$(CONFIG_FAANDCT) += faandct.o
OBJS-$(CONFIG_FAANIDCT) += faanidct.o OBJS-$(CONFIG_FAANIDCT) += faanidct.o
OBJS-$(CONFIG_FDCTDSP) += fdctdsp.o jfdctfst.o jfdctint.o OBJS-$(CONFIG_FDCTDSP) += fdctdsp.o jfdctfst.o jfdctint.o
FFT-OBJS-$(CONFIG_HARDCODED_TABLES) += cos_tables.o cos_fixed_tables.o FFT-OBJS-$(CONFIG_HARDCODED_TABLES) += cos_tables.o
OBJS-$(CONFIG_FFT) += avfft.o fft_fixed.o fft_float.o \ OBJS-$(CONFIG_FFT) += avfft.o fft_float.o fft_fixed_32.o \
fft_fixed_32.o fft_init_table.o \ fft_init_table.o $(FFT-OBJS-yes)
$(FFT-OBJS-yes)
OBJS-$(CONFIG_FLACDSP) += flacdsp.o OBJS-$(CONFIG_FLACDSP) += flacdsp.o
OBJS-$(CONFIG_FMTCONVERT) += fmtconvert.o OBJS-$(CONFIG_FMTCONVERT) += fmtconvert.o
OBJS-$(CONFIG_GOLOMB) += golomb.o OBJS-$(CONFIG_GOLOMB) += golomb.o
@@ -95,7 +96,8 @@ OBJS-$(CONFIG_H264DSP) += h264dsp.o h264idct.o
OBJS-$(CONFIG_H264PARSE) += h264_parse.o h2645_parse.o h264_ps.o OBJS-$(CONFIG_H264PARSE) += h264_parse.o h2645_parse.o h264_ps.o
OBJS-$(CONFIG_H264PRED) += h264pred.o OBJS-$(CONFIG_H264PRED) += h264pred.o
OBJS-$(CONFIG_H264QPEL) += h264qpel.o OBJS-$(CONFIG_H264QPEL) += h264qpel.o
OBJS-$(CONFIG_HEVCPARSE) += hevc_parse.o h2645_parse.o hevc_ps.o hevc_sei.o hevc_data.o OBJS-$(CONFIG_HEVCPARSE) += hevc_parse.o h2645_parse.o hevc_ps.o hevc_sei.o hevc_data.o \
dynamic_hdr10_plus.o
OBJS-$(CONFIG_HPELDSP) += hpeldsp.o OBJS-$(CONFIG_HPELDSP) += hpeldsp.o
OBJS-$(CONFIG_HUFFMAN) += huffman.o OBJS-$(CONFIG_HUFFMAN) += huffman.o
OBJS-$(CONFIG_HUFFYUVDSP) += huffyuvdsp.o OBJS-$(CONFIG_HUFFYUVDSP) += huffyuvdsp.o
@@ -113,11 +115,11 @@ OBJS-$(CONFIG_LLVIDENCDSP) += lossless_videoencdsp.o
OBJS-$(CONFIG_LPC) += lpc.o OBJS-$(CONFIG_LPC) += lpc.o
OBJS-$(CONFIG_LSP) += lsp.o OBJS-$(CONFIG_LSP) += lsp.o
OBJS-$(CONFIG_LZF) += lzf.o OBJS-$(CONFIG_LZF) += lzf.o
OBJS-$(CONFIG_MDCT) += mdct_fixed.o mdct_float.o mdct_fixed_32.o OBJS-$(CONFIG_MDCT) += mdct_float.o mdct_fixed_32.o
OBJS-$(CONFIG_ME_CMP) += me_cmp.o OBJS-$(CONFIG_ME_CMP) += me_cmp.o
OBJS-$(CONFIG_MEDIACODEC) += mediacodecdec_common.o mediacodec_surface.o mediacodec_wrapper.o mediacodec_sw_buffer.o OBJS-$(CONFIG_MEDIACODEC) += mediacodecdec_common.o mediacodec_surface.o mediacodec_wrapper.o mediacodec_sw_buffer.o
OBJS-$(CONFIG_MPEG_ER) += mpeg_er.o OBJS-$(CONFIG_MPEG_ER) += mpeg_er.o
OBJS-$(CONFIG_MPEGAUDIO) += mpegaudio.o OBJS-$(CONFIG_MPEGAUDIO) += mpegaudio.o mpegaudiodec_common.o
OBJS-$(CONFIG_MPEGAUDIODSP) += mpegaudiodsp.o \ OBJS-$(CONFIG_MPEGAUDIODSP) += mpegaudiodsp.o \
mpegaudiodsp_data.o \ mpegaudiodsp_data.o \
mpegaudiodsp_fixed.o \ mpegaudiodsp_fixed.o \
@@ -140,7 +142,7 @@ OBJS-$(CONFIG_RANGECODER) += rangecoder.o
OBJS-$(CONFIG_RDFT) += rdft.o OBJS-$(CONFIG_RDFT) += rdft.o
OBJS-$(CONFIG_RV34DSP) += rv34dsp.o OBJS-$(CONFIG_RV34DSP) += rv34dsp.o
OBJS-$(CONFIG_SHARED) += log2_tab.o reverse.o OBJS-$(CONFIG_SHARED) += log2_tab.o reverse.o
OBJS-$(CONFIG_SINEWIN) += sinewin.o sinewin_fixed.o OBJS-$(CONFIG_SINEWIN) += sinewin.o
OBJS-$(CONFIG_SNAPPY) += snappy.o OBJS-$(CONFIG_SNAPPY) += snappy.o
OBJS-$(CONFIG_STARTCODE) += startcode.o OBJS-$(CONFIG_STARTCODE) += startcode.o
OBJS-$(CONFIG_TEXTUREDSP) += texturedsp.o OBJS-$(CONFIG_TEXTUREDSP) += texturedsp.o
@@ -160,10 +162,10 @@ OBJS-$(CONFIG_WMV2DSP) += wmv2dsp.o
OBJS-$(CONFIG_ZERO12V_DECODER) += 012v.o OBJS-$(CONFIG_ZERO12V_DECODER) += 012v.o
OBJS-$(CONFIG_A64MULTI_ENCODER) += a64multienc.o elbg.o OBJS-$(CONFIG_A64MULTI_ENCODER) += a64multienc.o elbg.o
OBJS-$(CONFIG_A64MULTI5_ENCODER) += a64multienc.o elbg.o OBJS-$(CONFIG_A64MULTI5_ENCODER) += a64multienc.o elbg.o
OBJS-$(CONFIG_AAC_DECODER) += aacdec.o aactab.o aacsbr.o aacps_float.o \ OBJS-$(CONFIG_AAC_DECODER) += aacdec.o aactab.o aacsbr.o aacps_common.o aacps_float.o \
mpeg4audio.o kbdwin.o \ mpeg4audio.o kbdwin.o \
sbrdsp.o aacpsdsp_float.o cbrt_data.o sbrdsp.o aacpsdsp_float.o cbrt_data.o
OBJS-$(CONFIG_AAC_FIXED_DECODER) += aacdec_fixed.o aactab.o aacsbr_fixed.o aacps_fixed.o \ OBJS-$(CONFIG_AAC_FIXED_DECODER) += aacdec_fixed.o aactab.o aacsbr_fixed.o aacps_common.o aacps_fixed.o \
mpeg4audio.o kbdwin.o \ mpeg4audio.o kbdwin.o \
sbrdsp_fixed.o aacpsdsp_fixed.o cbrt_data_fixed.o sbrdsp_fixed.o aacpsdsp_fixed.o cbrt_data_fixed.o
OBJS-$(CONFIG_AAC_ENCODER) += aacenc.o aaccoder.o aacenctab.o \ OBJS-$(CONFIG_AAC_ENCODER) += aacenc.o aaccoder.o aacenctab.o \
@@ -172,14 +174,14 @@ OBJS-$(CONFIG_AAC_ENCODER) += aacenc.o aaccoder.o aacenctab.o \
aacenc_tns.o \ aacenc_tns.o \
aacenc_ltp.o \ aacenc_ltp.o \
aacenc_pred.o \ aacenc_pred.o \
psymodel.o mpeg4audio.o kbdwin.o cbrt_data.o psymodel.o mpeg4audio.o kbdwin.o
OBJS-$(CONFIG_AAC_MF_ENCODER) += mfenc.o mf_utils.o OBJS-$(CONFIG_AAC_MF_ENCODER) += mfenc.o mf_utils.o
OBJS-$(CONFIG_AASC_DECODER) += aasc.o msrledec.o OBJS-$(CONFIG_AASC_DECODER) += aasc.o msrledec.o
OBJS-$(CONFIG_AC3_DECODER) += ac3dec_float.o ac3dec_data.o ac3.o kbdwin.o ac3tab.o OBJS-$(CONFIG_AC3_DECODER) += ac3dec_float.o ac3dec_data.o ac3.o kbdwin.o ac3tab.o
OBJS-$(CONFIG_AC3_FIXED_DECODER) += ac3dec_fixed.o ac3dec_data.o ac3.o kbdwin.o ac3tab.o OBJS-$(CONFIG_AC3_FIXED_DECODER) += ac3dec_fixed.o ac3dec_data.o ac3.o kbdwin.o ac3tab.o
OBJS-$(CONFIG_AC3_ENCODER) += ac3enc_float.o ac3enc.o ac3tab.o \ OBJS-$(CONFIG_AC3_ENCODER) += ac3enc_float.o ac3enc.o ac3tab.o \
ac3.o kbdwin.o ac3.o kbdwin.o
OBJS-$(CONFIG_AC3_FIXED_ENCODER) += ac3enc_fixed.o ac3enc.o ac3tab.o ac3.o OBJS-$(CONFIG_AC3_FIXED_ENCODER) += ac3enc_fixed.o ac3enc.o ac3tab.o ac3.o kbdwin.o
OBJS-$(CONFIG_AC3_MF_ENCODER) += mfenc.o mf_utils.o OBJS-$(CONFIG_AC3_MF_ENCODER) += mfenc.o mf_utils.o
OBJS-$(CONFIG_ACELP_KELVIN_DECODER) += g729dec.o lsp.o celp_math.o celp_filters.o acelp_filters.o acelp_pitch_delay.o acelp_vectors.o g729postfilter.o OBJS-$(CONFIG_ACELP_KELVIN_DECODER) += g729dec.o lsp.o celp_math.o celp_filters.o acelp_filters.o acelp_pitch_delay.o acelp_vectors.o g729postfilter.o
OBJS-$(CONFIG_AGM_DECODER) += agm.o OBJS-$(CONFIG_AGM_DECODER) += agm.o
@@ -209,6 +211,7 @@ OBJS-$(CONFIG_APTX_HD_ENCODER) += aptxenc.o aptx.o
OBJS-$(CONFIG_APNG_DECODER) += png.o pngdec.o pngdsp.o OBJS-$(CONFIG_APNG_DECODER) += png.o pngdec.o pngdsp.o
OBJS-$(CONFIG_APNG_ENCODER) += png.o pngenc.o OBJS-$(CONFIG_APNG_ENCODER) += png.o pngenc.o
OBJS-$(CONFIG_ARBC_DECODER) += arbc.o OBJS-$(CONFIG_ARBC_DECODER) += arbc.o
OBJS-$(CONFIG_ARGO_DECODER) += argo.o
OBJS-$(CONFIG_SSA_DECODER) += assdec.o ass.o OBJS-$(CONFIG_SSA_DECODER) += assdec.o ass.o
OBJS-$(CONFIG_SSA_ENCODER) += assenc.o ass.o OBJS-$(CONFIG_SSA_ENCODER) += assenc.o ass.o
OBJS-$(CONFIG_ASS_DECODER) += assdec.o ass.o OBJS-$(CONFIG_ASS_DECODER) += assdec.o ass.o
@@ -227,7 +230,9 @@ OBJS-$(CONFIG_ATRAC3PAL_DECODER) += atrac3plusdec.o atrac3plus.o \
OBJS-$(CONFIG_ATRAC9_DECODER) += atrac9dec.o OBJS-$(CONFIG_ATRAC9_DECODER) += atrac9dec.o
OBJS-$(CONFIG_AURA_DECODER) += cyuv.o OBJS-$(CONFIG_AURA_DECODER) += cyuv.o
OBJS-$(CONFIG_AURA2_DECODER) += aura.o OBJS-$(CONFIG_AURA2_DECODER) += aura.o
OBJS-$(CONFIG_AVRN_DECODER) += avrndec.o mjpegdec.o OBJS-$(CONFIG_AV1_DECODER) += av1dec.o
OBJS-$(CONFIG_AV1_CUVID_DECODER) += cuviddec.o
OBJS-$(CONFIG_AVRN_DECODER) += avrndec.o
OBJS-$(CONFIG_AVRP_DECODER) += r210dec.o OBJS-$(CONFIG_AVRP_DECODER) += r210dec.o
OBJS-$(CONFIG_AVRP_ENCODER) += r210enc.o OBJS-$(CONFIG_AVRP_ENCODER) += r210enc.o
OBJS-$(CONFIG_AVS_DECODER) += avs.o OBJS-$(CONFIG_AVS_DECODER) += avs.o
@@ -254,7 +259,8 @@ OBJS-$(CONFIG_CCAPTION_DECODER) += ccaption_dec.o ass.o
OBJS-$(CONFIG_CDGRAPHICS_DECODER) += cdgraphics.o OBJS-$(CONFIG_CDGRAPHICS_DECODER) += cdgraphics.o
OBJS-$(CONFIG_CDTOONS_DECODER) += cdtoons.o OBJS-$(CONFIG_CDTOONS_DECODER) += cdtoons.o
OBJS-$(CONFIG_CDXL_DECODER) += cdxl.o OBJS-$(CONFIG_CDXL_DECODER) += cdxl.o
OBJS-$(CONFIG_CFHD_DECODER) += cfhd.o cfhddata.o OBJS-$(CONFIG_CFHD_DECODER) += cfhd.o cfhddata.o cfhddsp.o
OBJS-$(CONFIG_CFHD_ENCODER) += cfhdenc.o cfhddata.o cfhdencdsp.o
OBJS-$(CONFIG_CINEPAK_DECODER) += cinepak.o OBJS-$(CONFIG_CINEPAK_DECODER) += cinepak.o
OBJS-$(CONFIG_CINEPAK_ENCODER) += cinepakenc.o elbg.o OBJS-$(CONFIG_CINEPAK_ENCODER) += cinepakenc.o elbg.o
OBJS-$(CONFIG_CLEARVIDEO_DECODER) += clearvideo.o OBJS-$(CONFIG_CLEARVIDEO_DECODER) += clearvideo.o
@@ -265,12 +271,13 @@ OBJS-$(CONFIG_COMFORTNOISE_DECODER) += cngdec.o celp_filters.o
OBJS-$(CONFIG_COMFORTNOISE_ENCODER) += cngenc.o OBJS-$(CONFIG_COMFORTNOISE_ENCODER) += cngenc.o
OBJS-$(CONFIG_COOK_DECODER) += cook.o OBJS-$(CONFIG_COOK_DECODER) += cook.o
OBJS-$(CONFIG_CPIA_DECODER) += cpia.o OBJS-$(CONFIG_CPIA_DECODER) += cpia.o
OBJS-$(CONFIG_CRI_DECODER) += cri.o
OBJS-$(CONFIG_CSCD_DECODER) += cscd.o OBJS-$(CONFIG_CSCD_DECODER) += cscd.o
OBJS-$(CONFIG_CYUV_DECODER) += cyuv.o OBJS-$(CONFIG_CYUV_DECODER) += cyuv.o
OBJS-$(CONFIG_DCA_DECODER) += dcadec.o dca.o dcadata.o dcahuff.o \ OBJS-$(CONFIG_DCA_DECODER) += dcadec.o dca.o dcadata.o dcahuff.o \
dca_core.o dca_exss.o dca_xll.o dca_lbr.o \ dca_core.o dca_exss.o dca_xll.o dca_lbr.o \
dcadsp.o dcadct.o synth_filter.o dcadsp.o dcadct.o synth_filter.o
OBJS-$(CONFIG_DCA_ENCODER) += dcaenc.o dca.o dcadata.o dcahuff.o \ OBJS-$(CONFIG_DCA_ENCODER) += dcaenc.o dcadata.o dcahuff.o \
dcaadpcm.o dcaadpcm.o
OBJS-$(CONFIG_DDS_DECODER) += dds.o OBJS-$(CONFIG_DDS_DECODER) += dds.o
OBJS-$(CONFIG_DERF_DPCM_DECODER) += dpcm.o OBJS-$(CONFIG_DERF_DPCM_DECODER) += dpcm.o
@@ -279,7 +286,7 @@ OBJS-$(CONFIG_DIRAC_DECODER) += diracdec.o dirac.o diracdsp.o diractab
OBJS-$(CONFIG_DFA_DECODER) += dfa.o OBJS-$(CONFIG_DFA_DECODER) += dfa.o
OBJS-$(CONFIG_DNXHD_DECODER) += dnxhddec.o dnxhddata.o OBJS-$(CONFIG_DNXHD_DECODER) += dnxhddec.o dnxhddata.o
OBJS-$(CONFIG_DNXHD_ENCODER) += dnxhdenc.o dnxhddata.o OBJS-$(CONFIG_DNXHD_ENCODER) += dnxhdenc.o dnxhddata.o
OBJS-$(CONFIG_DOLBY_E_DECODER) += dolby_e.o kbdwin.o OBJS-$(CONFIG_DOLBY_E_DECODER) += dolby_e.o dolby_e_parse.o kbdwin.o
OBJS-$(CONFIG_DPX_DECODER) += dpx.o OBJS-$(CONFIG_DPX_DECODER) += dpx.o
OBJS-$(CONFIG_DPX_ENCODER) += dpxenc.o OBJS-$(CONFIG_DPX_ENCODER) += dpxenc.o
OBJS-$(CONFIG_DSD_LSBF_DECODER) += dsddec.o dsd.o OBJS-$(CONFIG_DSD_LSBF_DECODER) += dsddec.o dsd.o
@@ -291,7 +298,7 @@ OBJS-$(CONFIG_DSICINVIDEO_DECODER) += dsicinvideo.o
OBJS-$(CONFIG_DSS_SP_DECODER) += dss_sp.o OBJS-$(CONFIG_DSS_SP_DECODER) += dss_sp.o
OBJS-$(CONFIG_DST_DECODER) += dstdec.o dsd.o OBJS-$(CONFIG_DST_DECODER) += dstdec.o dsd.o
OBJS-$(CONFIG_DVBSUB_DECODER) += dvbsubdec.o OBJS-$(CONFIG_DVBSUB_DECODER) += dvbsubdec.o
OBJS-$(CONFIG_DVBSUB_ENCODER) += dvbsub.o OBJS-$(CONFIG_DVBSUB_ENCODER) += dvbsubenc.o
OBJS-$(CONFIG_DVDSUB_DECODER) += dvdsubdec.o dvdsub.o OBJS-$(CONFIG_DVDSUB_DECODER) += dvdsubdec.o dvdsub.o
OBJS-$(CONFIG_DVDSUB_ENCODER) += dvdsubenc.o dvdsub.o OBJS-$(CONFIG_DVDSUB_ENCODER) += dvdsubenc.o dvdsub.o
OBJS-$(CONFIG_DVAUDIO_DECODER) += dvaudiodec.o OBJS-$(CONFIG_DVAUDIO_DECODER) += dvaudiodec.o
@@ -315,6 +322,8 @@ OBJS-$(CONFIG_ESCAPE124_DECODER) += escape124.o
OBJS-$(CONFIG_ESCAPE130_DECODER) += escape130.o OBJS-$(CONFIG_ESCAPE130_DECODER) += escape130.o
OBJS-$(CONFIG_EVRC_DECODER) += evrcdec.o acelp_vectors.o lsp.o OBJS-$(CONFIG_EVRC_DECODER) += evrcdec.o acelp_vectors.o lsp.o
OBJS-$(CONFIG_EXR_DECODER) += exr.o exrdsp.o OBJS-$(CONFIG_EXR_DECODER) += exr.o exrdsp.o
OBJS-$(CONFIG_EXR_ENCODER) += exrenc.o
OBJS-$(CONFIG_FASTAUDIO_DECODER) += fastaudio.o
OBJS-$(CONFIG_FFV1_DECODER) += ffv1dec.o ffv1.o OBJS-$(CONFIG_FFV1_DECODER) += ffv1dec.o ffv1.o
OBJS-$(CONFIG_FFV1_ENCODER) += ffv1enc.o ffv1.o OBJS-$(CONFIG_FFV1_ENCODER) += ffv1enc.o ffv1.o
OBJS-$(CONFIG_FFWAVESYNTH_DECODER) += ffwavesynth.o OBJS-$(CONFIG_FFWAVESYNTH_DECODER) += ffwavesynth.o
@@ -322,17 +331,19 @@ OBJS-$(CONFIG_FIC_DECODER) += fic.o
OBJS-$(CONFIG_FITS_DECODER) += fitsdec.o fits.o OBJS-$(CONFIG_FITS_DECODER) += fitsdec.o fits.o
OBJS-$(CONFIG_FITS_ENCODER) += fitsenc.o OBJS-$(CONFIG_FITS_ENCODER) += fitsenc.o
OBJS-$(CONFIG_FLAC_DECODER) += flacdec.o flacdata.o flac.o OBJS-$(CONFIG_FLAC_DECODER) += flacdec.o flacdata.o flac.o
OBJS-$(CONFIG_FLAC_ENCODER) += flacenc.o flacdata.o flac.o vorbis_data.o OBJS-$(CONFIG_FLAC_ENCODER) += flacenc.o flacdata.o flac.o
OBJS-$(CONFIG_FLASHSV_DECODER) += flashsv.o OBJS-$(CONFIG_FLASHSV_DECODER) += flashsv.o
OBJS-$(CONFIG_FLASHSV_ENCODER) += flashsvenc.o OBJS-$(CONFIG_FLASHSV_ENCODER) += flashsvenc.o
OBJS-$(CONFIG_FLASHSV2_ENCODER) += flashsv2enc.o OBJS-$(CONFIG_FLASHSV2_ENCODER) += flashsv2enc.o
OBJS-$(CONFIG_FLASHSV2_DECODER) += flashsv.o OBJS-$(CONFIG_FLASHSV2_DECODER) += flashsv.o
OBJS-$(CONFIG_FLIC_DECODER) += flicvideo.o OBJS-$(CONFIG_FLIC_DECODER) += flicvideo.o
OBJS-$(CONFIG_FLV_DECODER) += flvdec.o
OBJS-$(CONFIG_FLV_ENCODER) += flvenc.o
OBJS-$(CONFIG_FMVC_DECODER) += fmvc.o OBJS-$(CONFIG_FMVC_DECODER) += fmvc.o
OBJS-$(CONFIG_FOURXM_DECODER) += 4xm.o OBJS-$(CONFIG_FOURXM_DECODER) += 4xm.o
OBJS-$(CONFIG_FRAPS_DECODER) += fraps.o OBJS-$(CONFIG_FRAPS_DECODER) += fraps.o
OBJS-$(CONFIG_FRWU_DECODER) += frwu.o OBJS-$(CONFIG_FRWU_DECODER) += frwu.o
OBJS-$(CONFIG_G2M_DECODER) += g2meet.o elsdec.o OBJS-$(CONFIG_G2M_DECODER) += g2meet.o elsdec.o mjpegdec_common.o
OBJS-$(CONFIG_G723_1_DECODER) += g723_1dec.o g723_1.o \ OBJS-$(CONFIG_G723_1_DECODER) += g723_1dec.o g723_1.o \
acelp_vectors.o celp_filters.o celp_math.o acelp_vectors.o celp_filters.o celp_math.o
OBJS-$(CONFIG_G723_1_ENCODER) += g723_1enc.o g723_1.o \ OBJS-$(CONFIG_G723_1_ENCODER) += g723_1enc.o g723_1.o \
@@ -347,10 +358,11 @@ OBJS-$(CONFIG_GSM_MS_DECODER) += gsmdec.o gsmdec_data.o msgsmdec.o
OBJS-$(CONFIG_H261_DECODER) += h261dec.o h261data.o h261.o OBJS-$(CONFIG_H261_DECODER) += h261dec.o h261data.o h261.o
OBJS-$(CONFIG_H261_ENCODER) += h261enc.o h261data.o h261.o OBJS-$(CONFIG_H261_ENCODER) += h261enc.o h261data.o h261.o
OBJS-$(CONFIG_H263_DECODER) += h263dec.o h263.o ituh263dec.o \ OBJS-$(CONFIG_H263_DECODER) += h263dec.o h263.o ituh263dec.o \
mpeg4video.o mpeg4videodec.o flvdec.o\ mpeg4video.o mpeg4videodec.o \
intelh263dec.o h263data.o h263data.o
OBJS-$(CONFIG_H263_ENCODER) += mpeg4videoenc.o mpeg4video.o \ OBJS-$(CONFIG_H263I_DECODER) += intelh263dec.o
h263.o ituh263enc.o flvenc.o h263data.o OBJS-$(CONFIG_H263_ENCODER) += mpeg4video.o \
h263.o ituh263enc.o h263data.o
OBJS-$(CONFIG_H263_V4L2M2M_DECODER) += v4l2_m2m_dec.o OBJS-$(CONFIG_H263_V4L2M2M_DECODER) += v4l2_m2m_dec.o
OBJS-$(CONFIG_H263_V4L2M2M_ENCODER) += v4l2_m2m_enc.o OBJS-$(CONFIG_H263_V4L2M2M_ENCODER) += v4l2_m2m_enc.o
OBJS-$(CONFIG_H264_DECODER) += h264dec.o h264_cabac.o h264_cavlc.o \ OBJS-$(CONFIG_H264_DECODER) += h264dec.o h264_cabac.o h264_cavlc.o \
@@ -367,7 +379,7 @@ OBJS-$(CONFIG_H264_NVENC_ENCODER) += nvenc_h264.o
OBJS-$(CONFIG_NVENC_ENCODER) += nvenc_h264.o OBJS-$(CONFIG_NVENC_ENCODER) += nvenc_h264.o
OBJS-$(CONFIG_NVENC_H264_ENCODER) += nvenc_h264.o OBJS-$(CONFIG_NVENC_H264_ENCODER) += nvenc_h264.o
OBJS-$(CONFIG_H264_OMX_ENCODER) += omx.o OBJS-$(CONFIG_H264_OMX_ENCODER) += omx.o
OBJS-$(CONFIG_H264_QSV_DECODER) += qsvdec_h2645.o OBJS-$(CONFIG_H264_QSV_DECODER) += qsvdec.o
OBJS-$(CONFIG_H264_QSV_ENCODER) += qsvenc_h264.o OBJS-$(CONFIG_H264_QSV_ENCODER) += qsvenc_h264.o
OBJS-$(CONFIG_H264_RKMPP_DECODER) += rkmppdec.o OBJS-$(CONFIG_H264_RKMPP_DECODER) += rkmppdec.o
OBJS-$(CONFIG_H264_VAAPI_ENCODER) += vaapi_encode_h264.o h264_levels.o OBJS-$(CONFIG_H264_VAAPI_ENCODER) += vaapi_encode_h264.o h264_levels.o
@@ -387,7 +399,7 @@ OBJS-$(CONFIG_HEVC_MEDIACODEC_DECODER) += mediacodecdec.o
OBJS-$(CONFIG_HEVC_MF_ENCODER) += mfenc.o mf_utils.o OBJS-$(CONFIG_HEVC_MF_ENCODER) += mfenc.o mf_utils.o
OBJS-$(CONFIG_HEVC_NVENC_ENCODER) += nvenc_hevc.o OBJS-$(CONFIG_HEVC_NVENC_ENCODER) += nvenc_hevc.o
OBJS-$(CONFIG_NVENC_HEVC_ENCODER) += nvenc_hevc.o OBJS-$(CONFIG_NVENC_HEVC_ENCODER) += nvenc_hevc.o
OBJS-$(CONFIG_HEVC_QSV_DECODER) += qsvdec_h2645.o OBJS-$(CONFIG_HEVC_QSV_DECODER) += qsvdec.o
OBJS-$(CONFIG_HEVC_QSV_ENCODER) += qsvenc_hevc.o hevc_ps_enc.o \ OBJS-$(CONFIG_HEVC_QSV_ENCODER) += qsvenc_hevc.o hevc_ps_enc.o \
hevc_data.o hevc_data.o
OBJS-$(CONFIG_HEVC_RKMPP_DECODER) += rkmppdec.o OBJS-$(CONFIG_HEVC_RKMPP_DECODER) += rkmppdec.o
@@ -415,6 +427,7 @@ OBJS-$(CONFIG_INDEO5_DECODER) += indeo5.o ivi.o
OBJS-$(CONFIG_INTERPLAY_ACM_DECODER) += interplayacm.o OBJS-$(CONFIG_INTERPLAY_ACM_DECODER) += interplayacm.o
OBJS-$(CONFIG_INTERPLAY_DPCM_DECODER) += dpcm.o OBJS-$(CONFIG_INTERPLAY_DPCM_DECODER) += dpcm.o
OBJS-$(CONFIG_INTERPLAY_VIDEO_DECODER) += interplayvideo.o OBJS-$(CONFIG_INTERPLAY_VIDEO_DECODER) += interplayvideo.o
OBJS-$(CONFIG_IPU_DECODER) += mpeg12dec.o mpeg12.o mpeg12data.o
OBJS-$(CONFIG_JACOSUB_DECODER) += jacosubdec.o ass.o OBJS-$(CONFIG_JACOSUB_DECODER) += jacosubdec.o ass.o
OBJS-$(CONFIG_JPEG2000_ENCODER) += j2kenc.o mqcenc.o mqc.o jpeg2000.o \ OBJS-$(CONFIG_JPEG2000_ENCODER) += j2kenc.o mqcenc.o mqc.o jpeg2000.o \
jpeg2000dwt.o jpeg2000dwt.o
@@ -428,7 +441,7 @@ OBJS-$(CONFIG_KMVC_DECODER) += kmvc.o
OBJS-$(CONFIG_LAGARITH_DECODER) += lagarith.o lagarithrac.o OBJS-$(CONFIG_LAGARITH_DECODER) += lagarith.o lagarithrac.o
OBJS-$(CONFIG_LJPEG_ENCODER) += ljpegenc.o mjpegenc_common.o OBJS-$(CONFIG_LJPEG_ENCODER) += ljpegenc.o mjpegenc_common.o
OBJS-$(CONFIG_LOCO_DECODER) += loco.o OBJS-$(CONFIG_LOCO_DECODER) += loco.o
OBJS-$(CONFIG_LSCR_DECODER) += png.o pngdec.o pngdsp.o OBJS-$(CONFIG_LSCR_DECODER) += lscrdec.o png.o pngdec.o pngdsp.o
OBJS-$(CONFIG_M101_DECODER) += m101.o OBJS-$(CONFIG_M101_DECODER) += m101.o
OBJS-$(CONFIG_MACE3_DECODER) += mace.o OBJS-$(CONFIG_MACE3_DECODER) += mace.o
OBJS-$(CONFIG_MACE6_DECODER) += mace.o OBJS-$(CONFIG_MACE6_DECODER) += mace.o
@@ -439,8 +452,8 @@ OBJS-$(CONFIG_METASOUND_DECODER) += metasound.o metasound_data.o \
twinvq.o twinvq.o
OBJS-$(CONFIG_MICRODVD_DECODER) += microdvddec.o ass.o OBJS-$(CONFIG_MICRODVD_DECODER) += microdvddec.o ass.o
OBJS-$(CONFIG_MIMIC_DECODER) += mimic.o OBJS-$(CONFIG_MIMIC_DECODER) += mimic.o
OBJS-$(CONFIG_MJPEG_DECODER) += mjpegdec.o OBJS-$(CONFIG_MJPEG_DECODER) += mjpegdec.o mjpegdec_common.o
OBJS-$(CONFIG_MJPEG_QSV_DECODER) += qsvdec_other.o OBJS-$(CONFIG_MJPEG_QSV_DECODER) += qsvdec.o
OBJS-$(CONFIG_MJPEG_ENCODER) += mjpegenc.o mjpegenc_common.o \ OBJS-$(CONFIG_MJPEG_ENCODER) += mjpegenc.o mjpegenc_common.o \
mjpegenc_huffman.o mjpegenc_huffman.o
OBJS-$(CONFIG_MJPEGB_DECODER) += mjpegbdec.o OBJS-$(CONFIG_MJPEGB_DECODER) += mjpegbdec.o
@@ -450,6 +463,7 @@ OBJS-$(CONFIG_MJPEG_VAAPI_ENCODER) += vaapi_encode_mjpeg.o
OBJS-$(CONFIG_MLP_DECODER) += mlpdec.o mlpdsp.o OBJS-$(CONFIG_MLP_DECODER) += mlpdec.o mlpdsp.o
OBJS-$(CONFIG_MLP_ENCODER) += mlpenc.o mlp.o OBJS-$(CONFIG_MLP_ENCODER) += mlpenc.o mlp.o
OBJS-$(CONFIG_MMVIDEO_DECODER) += mmvideo.o OBJS-$(CONFIG_MMVIDEO_DECODER) += mmvideo.o
OBJS-$(CONFIG_MOBICLIP_DECODER) += mobiclip.o
OBJS-$(CONFIG_MOTIONPIXELS_DECODER) += motionpixels.o OBJS-$(CONFIG_MOTIONPIXELS_DECODER) += motionpixels.o
OBJS-$(CONFIG_MOVTEXT_DECODER) += movtextdec.o ass.o OBJS-$(CONFIG_MOVTEXT_DECODER) += movtextdec.o ass.o
OBJS-$(CONFIG_MOVTEXT_ENCODER) += movtextenc.o ass_split.o OBJS-$(CONFIG_MOVTEXT_ENCODER) += movtextenc.o ass_split.o
@@ -476,7 +490,7 @@ OBJS-$(CONFIG_MPEG1VIDEO_ENCODER) += mpeg12enc.o mpeg12.o
OBJS-$(CONFIG_MPEG1_CUVID_DECODER) += cuviddec.o OBJS-$(CONFIG_MPEG1_CUVID_DECODER) += cuviddec.o
OBJS-$(CONFIG_MPEG1_V4L2M2M_DECODER) += v4l2_m2m_dec.o OBJS-$(CONFIG_MPEG1_V4L2M2M_DECODER) += v4l2_m2m_dec.o
OBJS-$(CONFIG_MPEG2_MMAL_DECODER) += mmaldec.o OBJS-$(CONFIG_MPEG2_MMAL_DECODER) += mmaldec.o
OBJS-$(CONFIG_MPEG2_QSV_DECODER) += qsvdec_other.o OBJS-$(CONFIG_MPEG2_QSV_DECODER) += qsvdec.o
OBJS-$(CONFIG_MPEG2_QSV_ENCODER) += qsvenc_mpeg2.o OBJS-$(CONFIG_MPEG2_QSV_ENCODER) += qsvenc_mpeg2.o
OBJS-$(CONFIG_MPEG2VIDEO_DECODER) += mpeg12dec.o mpeg12.o mpeg12data.o OBJS-$(CONFIG_MPEG2VIDEO_DECODER) += mpeg12dec.o mpeg12.o mpeg12data.o
OBJS-$(CONFIG_MPEG2VIDEO_ENCODER) += mpeg12enc.o mpeg12.o OBJS-$(CONFIG_MPEG2VIDEO_ENCODER) += mpeg12enc.o mpeg12.o
@@ -485,6 +499,7 @@ OBJS-$(CONFIG_MPEG2_MEDIACODEC_DECODER) += mediacodecdec.o
OBJS-$(CONFIG_MPEG2_VAAPI_ENCODER) += vaapi_encode_mpeg2.o OBJS-$(CONFIG_MPEG2_VAAPI_ENCODER) += vaapi_encode_mpeg2.o
OBJS-$(CONFIG_MPEG2_V4L2M2M_DECODER) += v4l2_m2m_dec.o OBJS-$(CONFIG_MPEG2_V4L2M2M_DECODER) += v4l2_m2m_dec.o
OBJS-$(CONFIG_MPEG4_DECODER) += xvididct.o OBJS-$(CONFIG_MPEG4_DECODER) += xvididct.o
OBJS-$(CONFIG_MPEG4_ENCODER) += mpeg4videoenc.o
OBJS-$(CONFIG_MPEG4_CUVID_DECODER) += cuviddec.o OBJS-$(CONFIG_MPEG4_CUVID_DECODER) += cuviddec.o
OBJS-$(CONFIG_MPEG4_MEDIACODEC_DECODER) += mediacodecdec.o OBJS-$(CONFIG_MPEG4_MEDIACODEC_DECODER) += mediacodecdec.o
OBJS-$(CONFIG_MPEG4_OMX_ENCODER) += omx.o OBJS-$(CONFIG_MPEG4_OMX_ENCODER) += omx.o
@@ -498,6 +513,7 @@ OBJS-$(CONFIG_MSMPEG4V2_DECODER) += msmpeg4dec.o msmpeg4.o msmpeg4data.o
OBJS-$(CONFIG_MSMPEG4V2_ENCODER) += msmpeg4enc.o msmpeg4.o msmpeg4data.o OBJS-$(CONFIG_MSMPEG4V2_ENCODER) += msmpeg4enc.o msmpeg4.o msmpeg4data.o
OBJS-$(CONFIG_MSMPEG4V3_DECODER) += msmpeg4dec.o msmpeg4.o msmpeg4data.o OBJS-$(CONFIG_MSMPEG4V3_DECODER) += msmpeg4dec.o msmpeg4.o msmpeg4data.o
OBJS-$(CONFIG_MSMPEG4V3_ENCODER) += msmpeg4enc.o msmpeg4.o msmpeg4data.o OBJS-$(CONFIG_MSMPEG4V3_ENCODER) += msmpeg4enc.o msmpeg4.o msmpeg4data.o
OBJS-$(CONFIG_MSP2_DECODER) += msp2dec.o
OBJS-$(CONFIG_MSRLE_DECODER) += msrle.o msrledec.o OBJS-$(CONFIG_MSRLE_DECODER) += msrle.o msrledec.o
OBJS-$(CONFIG_MSS1_DECODER) += mss1.o mss12.o OBJS-$(CONFIG_MSS1_DECODER) += mss1.o mss12.o
OBJS-$(CONFIG_MSS2_DECODER) += mss2.o mss12.o mss2dsp.o wmv2data.o OBJS-$(CONFIG_MSS2_DECODER) += mss2.o mss12.o mss2dsp.o wmv2data.o
@@ -531,11 +547,14 @@ OBJS-$(CONFIG_PBM_ENCODER) += pnmenc.o
OBJS-$(CONFIG_PCX_DECODER) += pcx.o OBJS-$(CONFIG_PCX_DECODER) += pcx.o
OBJS-$(CONFIG_PCX_ENCODER) += pcxenc.o OBJS-$(CONFIG_PCX_ENCODER) += pcxenc.o
OBJS-$(CONFIG_PFM_DECODER) += pnmdec.o pnm.o OBJS-$(CONFIG_PFM_DECODER) += pnmdec.o pnm.o
OBJS-$(CONFIG_PFM_ENCODER) += pnmenc.o
OBJS-$(CONFIG_PGM_DECODER) += pnmdec.o pnm.o OBJS-$(CONFIG_PGM_DECODER) += pnmdec.o pnm.o
OBJS-$(CONFIG_PGM_ENCODER) += pnmenc.o OBJS-$(CONFIG_PGM_ENCODER) += pnmenc.o
OBJS-$(CONFIG_PGMYUV_DECODER) += pnmdec.o pnm.o OBJS-$(CONFIG_PGMYUV_DECODER) += pnmdec.o pnm.o
OBJS-$(CONFIG_PGMYUV_ENCODER) += pnmenc.o OBJS-$(CONFIG_PGMYUV_ENCODER) += pnmenc.o
OBJS-$(CONFIG_PGSSUB_DECODER) += pgssubdec.o OBJS-$(CONFIG_PGSSUB_DECODER) += pgssubdec.o
OBJS-$(CONFIG_PGX_DECODER) += pgxdec.o
OBJS-$(CONFIG_PHOTOCD_DECODER) += photocd.o
OBJS-$(CONFIG_PICTOR_DECODER) += pictordec.o cga_data.o OBJS-$(CONFIG_PICTOR_DECODER) += pictordec.o cga_data.o
OBJS-$(CONFIG_PIXLET_DECODER) += pixlet.o OBJS-$(CONFIG_PIXLET_DECODER) += pixlet.o
OBJS-$(CONFIG_PJS_DECODER) += textdec.o ass.o OBJS-$(CONFIG_PJS_DECODER) += textdec.o ass.o
@@ -577,6 +596,7 @@ OBJS-$(CONFIG_ROQ_ENCODER) += roqvideoenc.o roqvideo.o elbg.o
OBJS-$(CONFIG_ROQ_DPCM_DECODER) += dpcm.o OBJS-$(CONFIG_ROQ_DPCM_DECODER) += dpcm.o
OBJS-$(CONFIG_ROQ_DPCM_ENCODER) += roqaudioenc.o OBJS-$(CONFIG_ROQ_DPCM_ENCODER) += roqaudioenc.o
OBJS-$(CONFIG_RPZA_DECODER) += rpza.o OBJS-$(CONFIG_RPZA_DECODER) += rpza.o
OBJS-$(CONFIG_RPZA_ENCODER) += rpzaenc.o
OBJS-$(CONFIG_RSCC_DECODER) += rscc.o OBJS-$(CONFIG_RSCC_DECODER) += rscc.o
OBJS-$(CONFIG_RV10_DECODER) += rv10.o OBJS-$(CONFIG_RV10_DECODER) += rv10.o
OBJS-$(CONFIG_RV10_ENCODER) += rv10enc.o OBJS-$(CONFIG_RV10_ENCODER) += rv10enc.o
@@ -591,6 +611,7 @@ OBJS-$(CONFIG_SANM_DECODER) += sanm.o
OBJS-$(CONFIG_SCPR_DECODER) += scpr.o OBJS-$(CONFIG_SCPR_DECODER) += scpr.o
OBJS-$(CONFIG_SCREENPRESSO_DECODER) += screenpresso.o OBJS-$(CONFIG_SCREENPRESSO_DECODER) += screenpresso.o
OBJS-$(CONFIG_SDX2_DPCM_DECODER) += dpcm.o OBJS-$(CONFIG_SDX2_DPCM_DECODER) += dpcm.o
OBJS-$(CONFIG_SGA_DECODER) += sga.o
OBJS-$(CONFIG_SGI_DECODER) += sgidec.o OBJS-$(CONFIG_SGI_DECODER) += sgidec.o
OBJS-$(CONFIG_SGI_ENCODER) += sgienc.o rle.o OBJS-$(CONFIG_SGI_ENCODER) += sgienc.o rle.o
OBJS-$(CONFIG_SGIRLE_DECODER) += sgirledec.o OBJS-$(CONFIG_SGIRLE_DECODER) += sgirledec.o
@@ -601,10 +622,10 @@ OBJS-$(CONFIG_SIPR_DECODER) += sipr.o acelp_pitch_delay.o \
acelp_filters.o celp_filters.o \ acelp_filters.o celp_filters.o \
sipr16k.o sipr16k.o
OBJS-$(CONFIG_SIREN_DECODER) += siren.o OBJS-$(CONFIG_SIREN_DECODER) += siren.o
OBJS-$(CONFIG_SIMBIOSIS_IMX_DECODER) += imx.o
OBJS-$(CONFIG_SMACKAUD_DECODER) += smacker.o OBJS-$(CONFIG_SMACKAUD_DECODER) += smacker.o
OBJS-$(CONFIG_SMACKER_DECODER) += smacker.o OBJS-$(CONFIG_SMACKER_DECODER) += smacker.o
OBJS-$(CONFIG_SMC_DECODER) += smc.o OBJS-$(CONFIG_SMC_DECODER) += smc.o
OBJS-$(CONFIG_SMVJPEG_DECODER) += smvjpegdec.o
OBJS-$(CONFIG_SNOW_DECODER) += snowdec.o snow.o snow_dwt.o OBJS-$(CONFIG_SNOW_DECODER) += snowdec.o snow.o snow_dwt.o
OBJS-$(CONFIG_SNOW_ENCODER) += snowenc.o snow.o snow_dwt.o \ OBJS-$(CONFIG_SNOW_ENCODER) += snowenc.o snow.o snow_dwt.o \
h263.o h263data.o ituh263enc.o h263.o h263data.o ituh263enc.o
@@ -613,6 +634,7 @@ OBJS-$(CONFIG_SONIC_DECODER) += sonic.o
OBJS-$(CONFIG_SONIC_ENCODER) += sonic.o OBJS-$(CONFIG_SONIC_ENCODER) += sonic.o
OBJS-$(CONFIG_SONIC_LS_ENCODER) += sonic.o OBJS-$(CONFIG_SONIC_LS_ENCODER) += sonic.o
OBJS-$(CONFIG_SPEEDHQ_DECODER) += speedhq.o mpeg12.o mpeg12data.o simple_idct.o OBJS-$(CONFIG_SPEEDHQ_DECODER) += speedhq.o mpeg12.o mpeg12data.o simple_idct.o
OBJS-$(CONFIG_SPEEDHQ_ENCODER) += speedhq.o mpeg12data.o mpeg12enc.o speedhqenc.o
OBJS-$(CONFIG_SP5X_DECODER) += sp5xdec.o OBJS-$(CONFIG_SP5X_DECODER) += sp5xdec.o
OBJS-$(CONFIG_SRGC_DECODER) += mscc.o OBJS-$(CONFIG_SRGC_DECODER) += mscc.o
OBJS-$(CONFIG_SRT_DECODER) += srtdec.o ass.o htmlsubtitles.o OBJS-$(CONFIG_SRT_DECODER) += srtdec.o ass.o htmlsubtitles.o
@@ -639,8 +661,8 @@ OBJS-$(CONFIG_TARGA_ENCODER) += targaenc.o rle.o
OBJS-$(CONFIG_TARGA_Y216_DECODER) += targa_y216dec.o OBJS-$(CONFIG_TARGA_Y216_DECODER) += targa_y216dec.o
OBJS-$(CONFIG_TDSC_DECODER) += tdsc.o OBJS-$(CONFIG_TDSC_DECODER) += tdsc.o
OBJS-$(CONFIG_TIERTEXSEQVIDEO_DECODER) += tiertexseqv.o OBJS-$(CONFIG_TIERTEXSEQVIDEO_DECODER) += tiertexseqv.o
OBJS-$(CONFIG_TIFF_DECODER) += tiff.o lzw.o faxcompr.o tiff_data.o tiff_common.o mjpegdec.o OBJS-$(CONFIG_TIFF_DECODER) += tiff.o lzw.o faxcompr.o tiff_common.o
OBJS-$(CONFIG_TIFF_ENCODER) += tiffenc.o rle.o lzwenc.o tiff_data.o OBJS-$(CONFIG_TIFF_ENCODER) += tiffenc.o rle.o lzwenc.o
OBJS-$(CONFIG_TMV_DECODER) += tmv.o cga_data.o OBJS-$(CONFIG_TMV_DECODER) += tmv.o cga_data.o
OBJS-$(CONFIG_TRUEHD_DECODER) += mlpdec.o mlpdsp.o OBJS-$(CONFIG_TRUEHD_DECODER) += mlpdec.o mlpdsp.o
OBJS-$(CONFIG_TRUEHD_ENCODER) += mlpenc.o mlp.o OBJS-$(CONFIG_TRUEHD_ENCODER) += mlpenc.o mlp.o
@@ -652,11 +674,12 @@ OBJS-$(CONFIG_TSCC_DECODER) += tscc.o msrledec.o
OBJS-$(CONFIG_TSCC2_DECODER) += tscc2.o OBJS-$(CONFIG_TSCC2_DECODER) += tscc2.o
OBJS-$(CONFIG_TTA_DECODER) += tta.o ttadata.o ttadsp.o OBJS-$(CONFIG_TTA_DECODER) += tta.o ttadata.o ttadsp.o
OBJS-$(CONFIG_TTA_ENCODER) += ttaenc.o ttaencdsp.o ttadata.o OBJS-$(CONFIG_TTA_ENCODER) += ttaenc.o ttaencdsp.o ttadata.o
OBJS-$(CONFIG_TWINVQ_DECODER) += twinvqdec.o twinvq.o OBJS-$(CONFIG_TTML_ENCODER) += ttmlenc.o ass_split.o
OBJS-$(CONFIG_TWINVQ_DECODER) += twinvqdec.o twinvq.o metasound_data.o
OBJS-$(CONFIG_TXD_DECODER) += txd.o OBJS-$(CONFIG_TXD_DECODER) += txd.o
OBJS-$(CONFIG_ULTI_DECODER) += ulti.o OBJS-$(CONFIG_ULTI_DECODER) += ulti.o
OBJS-$(CONFIG_UTVIDEO_DECODER) += utvideodec.o utvideo.o utvideodsp.o OBJS-$(CONFIG_UTVIDEO_DECODER) += utvideodec.o utvideodsp.o
OBJS-$(CONFIG_UTVIDEO_ENCODER) += utvideoenc.o utvideo.o OBJS-$(CONFIG_UTVIDEO_ENCODER) += utvideoenc.o
OBJS-$(CONFIG_V210_DECODER) += v210dec.o OBJS-$(CONFIG_V210_DECODER) += v210dec.o
OBJS-$(CONFIG_V210_ENCODER) += v210enc.o OBJS-$(CONFIG_V210_ENCODER) += v210enc.o
OBJS-$(CONFIG_V210X_DECODER) += v210x.o OBJS-$(CONFIG_V210X_DECODER) += v210x.o
@@ -674,7 +697,7 @@ OBJS-$(CONFIG_VC1_DECODER) += vc1dec.o vc1_block.o vc1_loopfilter.o
wmv2dsp.o wmv2data.o wmv2dsp.o wmv2data.o
OBJS-$(CONFIG_VC1_CUVID_DECODER) += cuviddec.o OBJS-$(CONFIG_VC1_CUVID_DECODER) += cuviddec.o
OBJS-$(CONFIG_VC1_MMAL_DECODER) += mmaldec.o OBJS-$(CONFIG_VC1_MMAL_DECODER) += mmaldec.o
OBJS-$(CONFIG_VC1_QSV_DECODER) += qsvdec_other.o OBJS-$(CONFIG_VC1_QSV_DECODER) += qsvdec.o
OBJS-$(CONFIG_VC1_V4L2M2M_DECODER) += v4l2_m2m_dec.o OBJS-$(CONFIG_VC1_V4L2M2M_DECODER) += v4l2_m2m_dec.o
OBJS-$(CONFIG_VC2_ENCODER) += vc2enc.o vc2enc_dwt.o diractab.o OBJS-$(CONFIG_VC2_ENCODER) += vc2enc.o vc2enc_dwt.o diractab.o
OBJS-$(CONFIG_VCR1_DECODER) += vcr1.o OBJS-$(CONFIG_VCR1_DECODER) += vcr1.o
@@ -693,7 +716,7 @@ OBJS-$(CONFIG_VP7_DECODER) += vp8.o vp56rac.o
OBJS-$(CONFIG_VP8_DECODER) += vp8.o vp56rac.o OBJS-$(CONFIG_VP8_DECODER) += vp8.o vp56rac.o
OBJS-$(CONFIG_VP8_CUVID_DECODER) += cuviddec.o OBJS-$(CONFIG_VP8_CUVID_DECODER) += cuviddec.o
OBJS-$(CONFIG_VP8_MEDIACODEC_DECODER) += mediacodecdec.o OBJS-$(CONFIG_VP8_MEDIACODEC_DECODER) += mediacodecdec.o
OBJS-$(CONFIG_VP8_QSV_DECODER) += qsvdec_other.o OBJS-$(CONFIG_VP8_QSV_DECODER) += qsvdec.o
OBJS-$(CONFIG_VP8_RKMPP_DECODER) += rkmppdec.o OBJS-$(CONFIG_VP8_RKMPP_DECODER) += rkmppdec.o
OBJS-$(CONFIG_VP8_VAAPI_ENCODER) += vaapi_encode_vp8.o OBJS-$(CONFIG_VP8_VAAPI_ENCODER) += vaapi_encode_vp8.o
OBJS-$(CONFIG_VP8_V4L2M2M_DECODER) += v4l2_m2m_dec.o OBJS-$(CONFIG_VP8_V4L2M2M_DECODER) += v4l2_m2m_dec.o
@@ -709,8 +732,8 @@ OBJS-$(CONFIG_VP9_QSV_ENCODER) += qsvenc_vp9.o
OBJS-$(CONFIG_VPLAYER_DECODER) += textdec.o ass.o OBJS-$(CONFIG_VPLAYER_DECODER) += textdec.o ass.o
OBJS-$(CONFIG_VP9_V4L2M2M_DECODER) += v4l2_m2m_dec.o OBJS-$(CONFIG_VP9_V4L2M2M_DECODER) += v4l2_m2m_dec.o
OBJS-$(CONFIG_VQA_DECODER) += vqavideo.o OBJS-$(CONFIG_VQA_DECODER) += vqavideo.o
OBJS-$(CONFIG_WAVPACK_DECODER) += wavpack.o dsd.o OBJS-$(CONFIG_WAVPACK_DECODER) += wavpack.o wavpackdata.o dsd.o
OBJS-$(CONFIG_WAVPACK_ENCODER) += wavpackenc.o OBJS-$(CONFIG_WAVPACK_ENCODER) += wavpackdata.o wavpackenc.o
OBJS-$(CONFIG_WCMV_DECODER) += wcmv.o OBJS-$(CONFIG_WCMV_DECODER) += wcmv.o
OBJS-$(CONFIG_WEBP_DECODER) += webp.o OBJS-$(CONFIG_WEBP_DECODER) += webp.o
OBJS-$(CONFIG_WEBVTT_DECODER) += webvttdec.o ass.o OBJS-$(CONFIG_WEBVTT_DECODER) += webvttdec.o ass.o
@@ -811,6 +834,7 @@ OBJS-$(CONFIG_PCM_S64BE_DECODER) += pcm.o
OBJS-$(CONFIG_PCM_S64BE_ENCODER) += pcm.o OBJS-$(CONFIG_PCM_S64BE_ENCODER) += pcm.o
OBJS-$(CONFIG_PCM_S64LE_DECODER) += pcm.o OBJS-$(CONFIG_PCM_S64LE_DECODER) += pcm.o
OBJS-$(CONFIG_PCM_S64LE_ENCODER) += pcm.o OBJS-$(CONFIG_PCM_S64LE_ENCODER) += pcm.o
OBJS-$(CONFIG_PCM_SGA_DECODER) += pcm.o
OBJS-$(CONFIG_PCM_U8_DECODER) += pcm.o OBJS-$(CONFIG_PCM_U8_DECODER) += pcm.o
OBJS-$(CONFIG_PCM_U8_ENCODER) += pcm.o OBJS-$(CONFIG_PCM_U8_ENCODER) += pcm.o
OBJS-$(CONFIG_PCM_U16BE_DECODER) += pcm.o OBJS-$(CONFIG_PCM_U16BE_DECODER) += pcm.o
@@ -835,6 +859,7 @@ OBJS-$(CONFIG_ADPCM_AFC_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_AGM_DECODER) += adpcm.o adpcm_data.o OBJS-$(CONFIG_ADPCM_AGM_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_AICA_DECODER) += adpcm.o adpcm_data.o OBJS-$(CONFIG_ADPCM_AICA_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_ARGO_DECODER) += adpcm.o adpcm_data.o OBJS-$(CONFIG_ADPCM_ARGO_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_ARGO_ENCODER) += adpcm.o adpcmenc.o
OBJS-$(CONFIG_ADPCM_CT_DECODER) += adpcm.o adpcm_data.o OBJS-$(CONFIG_ADPCM_CT_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_DTK_DECODER) += adpcm.o adpcm_data.o OBJS-$(CONFIG_ADPCM_DTK_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_EA_DECODER) += adpcm.o adpcm_data.o OBJS-$(CONFIG_ADPCM_EA_DECODER) += adpcm.o adpcm_data.o
@@ -851,8 +876,10 @@ OBJS-$(CONFIG_ADPCM_G726LE_DECODER) += g726.o
OBJS-$(CONFIG_ADPCM_G726LE_ENCODER) += g726.o OBJS-$(CONFIG_ADPCM_G726LE_ENCODER) += g726.o
OBJS-$(CONFIG_ADPCM_IMA_AMV_DECODER) += adpcm.o adpcm_data.o OBJS-$(CONFIG_ADPCM_IMA_AMV_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_ALP_DECODER) += adpcm.o adpcm_data.o OBJS-$(CONFIG_ADPCM_IMA_ALP_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_ALP_ENCODER) += adpcmenc.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_APC_DECODER) += adpcm.o adpcm_data.o OBJS-$(CONFIG_ADPCM_IMA_APC_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_APM_DECODER) += adpcm.o adpcm_data.o OBJS-$(CONFIG_ADPCM_IMA_APM_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_APM_ENCODER) += adpcmenc.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_CUNNING_DECODER) += adpcm.o adpcm_data.o OBJS-$(CONFIG_ADPCM_IMA_CUNNING_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_DAT4_DECODER) += adpcm.o adpcm_data.o OBJS-$(CONFIG_ADPCM_IMA_DAT4_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_DK3_DECODER) += adpcm.o adpcm_data.o OBJS-$(CONFIG_ADPCM_IMA_DK3_DECODER) += adpcm.o adpcm_data.o
@@ -860,6 +887,7 @@ OBJS-$(CONFIG_ADPCM_IMA_DK4_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_EA_EACS_DECODER) += adpcm.o adpcm_data.o OBJS-$(CONFIG_ADPCM_IMA_EA_EACS_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_EA_SEAD_DECODER) += adpcm.o adpcm_data.o OBJS-$(CONFIG_ADPCM_IMA_EA_SEAD_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_ISS_DECODER) += adpcm.o adpcm_data.o OBJS-$(CONFIG_ADPCM_IMA_ISS_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_MOFLEX_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_MTF_DECODER) += adpcm.o adpcm_data.o OBJS-$(CONFIG_ADPCM_IMA_MTF_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_OKI_DECODER) += adpcm.o adpcm_data.o OBJS-$(CONFIG_ADPCM_IMA_OKI_DECODER) += adpcm.o adpcm_data.o
OBJS-$(CONFIG_ADPCM_IMA_QT_DECODER) += adpcm.o adpcm_data.o OBJS-$(CONFIG_ADPCM_IMA_QT_DECODER) += adpcm.o adpcm_data.o
@@ -896,21 +924,25 @@ OBJS-$(CONFIG_VAAPI) += vaapi_decode.o
OBJS-$(CONFIG_VIDEOTOOLBOX) += videotoolbox.o OBJS-$(CONFIG_VIDEOTOOLBOX) += videotoolbox.o
OBJS-$(CONFIG_VDPAU) += vdpau.o OBJS-$(CONFIG_VDPAU) += vdpau.o
OBJS-$(CONFIG_AV1_D3D11VA_HWACCEL) += dxva2_av1.o
OBJS-$(CONFIG_AV1_DXVA2_HWACCEL) += dxva2_av1.o
OBJS-$(CONFIG_AV1_NVDEC_HWACCEL) += nvdec_av1.o
OBJS-$(CONFIG_AV1_VAAPI_HWACCEL) += vaapi_av1.o
OBJS-$(CONFIG_H263_VAAPI_HWACCEL) += vaapi_mpeg4.o OBJS-$(CONFIG_H263_VAAPI_HWACCEL) += vaapi_mpeg4.o
OBJS-$(CONFIG_H263_VIDEOTOOLBOX_HWACCEL) += videotoolbox.o OBJS-$(CONFIG_H263_VIDEOTOOLBOX_HWACCEL) += videotoolbox.o
OBJS-$(CONFIG_H264_D3D11VA_HWACCEL) += dxva2_h264.o OBJS-$(CONFIG_H264_D3D11VA_HWACCEL) += dxva2_h264.o
OBJS-$(CONFIG_H264_DXVA2_HWACCEL) += dxva2_h264.o OBJS-$(CONFIG_H264_DXVA2_HWACCEL) += dxva2_h264.o
OBJS-$(CONFIG_H264_NVDEC_HWACCEL) += nvdec_h264.o OBJS-$(CONFIG_H264_NVDEC_HWACCEL) += nvdec_h264.o
OBJS-$(CONFIG_H264_QSV_HWACCEL) += qsvdec_h2645.o OBJS-$(CONFIG_H264_QSV_HWACCEL) += qsvdec.o
OBJS-$(CONFIG_H264_VAAPI_HWACCEL) += vaapi_h264.o OBJS-$(CONFIG_H264_VAAPI_HWACCEL) += vaapi_h264.o
OBJS-$(CONFIG_H264_VDPAU_HWACCEL) += vdpau_h264.o OBJS-$(CONFIG_H264_VDPAU_HWACCEL) += vdpau_h264.o
OBJS-$(CONFIG_H264_VIDEOTOOLBOX_HWACCEL) += videotoolbox.o OBJS-$(CONFIG_H264_VIDEOTOOLBOX_HWACCEL) += videotoolbox.o
OBJS-$(CONFIG_HEVC_D3D11VA_HWACCEL) += dxva2_hevc.o OBJS-$(CONFIG_HEVC_D3D11VA_HWACCEL) += dxva2_hevc.o
OBJS-$(CONFIG_HEVC_DXVA2_HWACCEL) += dxva2_hevc.o OBJS-$(CONFIG_HEVC_DXVA2_HWACCEL) += dxva2_hevc.o
OBJS-$(CONFIG_HEVC_NVDEC_HWACCEL) += nvdec_hevc.o OBJS-$(CONFIG_HEVC_NVDEC_HWACCEL) += nvdec_hevc.o
OBJS-$(CONFIG_HEVC_QSV_HWACCEL) += qsvdec_h2645.o OBJS-$(CONFIG_HEVC_QSV_HWACCEL) += qsvdec.o
OBJS-$(CONFIG_HEVC_VAAPI_HWACCEL) += vaapi_hevc.o h265_profile_level.o OBJS-$(CONFIG_HEVC_VAAPI_HWACCEL) += vaapi_hevc.o h265_profile_level.o
OBJS-$(CONFIG_HEVC_VDPAU_HWACCEL) += vdpau_hevc.o OBJS-$(CONFIG_HEVC_VDPAU_HWACCEL) += vdpau_hevc.o h265_profile_level.o
OBJS-$(CONFIG_MJPEG_NVDEC_HWACCEL) += nvdec_mjpeg.o OBJS-$(CONFIG_MJPEG_NVDEC_HWACCEL) += nvdec_mjpeg.o
OBJS-$(CONFIG_MJPEG_VAAPI_HWACCEL) += vaapi_mjpeg.o OBJS-$(CONFIG_MJPEG_VAAPI_HWACCEL) += vaapi_mjpeg.o
OBJS-$(CONFIG_MPEG1_NVDEC_HWACCEL) += nvdec_mpeg12.o OBJS-$(CONFIG_MPEG1_NVDEC_HWACCEL) += nvdec_mpeg12.o
@@ -920,7 +952,7 @@ OBJS-$(CONFIG_MPEG1_XVMC_HWACCEL) += mpegvideo_xvmc.o
OBJS-$(CONFIG_MPEG2_D3D11VA_HWACCEL) += dxva2_mpeg2.o OBJS-$(CONFIG_MPEG2_D3D11VA_HWACCEL) += dxva2_mpeg2.o
OBJS-$(CONFIG_MPEG2_DXVA2_HWACCEL) += dxva2_mpeg2.o OBJS-$(CONFIG_MPEG2_DXVA2_HWACCEL) += dxva2_mpeg2.o
OBJS-$(CONFIG_MPEG2_NVDEC_HWACCEL) += nvdec_mpeg12.o OBJS-$(CONFIG_MPEG2_NVDEC_HWACCEL) += nvdec_mpeg12.o
OBJS-$(CONFIG_MPEG2_QSV_HWACCEL) += qsvdec_other.o OBJS-$(CONFIG_MPEG2_QSV_HWACCEL) += qsvdec.o
OBJS-$(CONFIG_MPEG2_VAAPI_HWACCEL) += vaapi_mpeg2.o OBJS-$(CONFIG_MPEG2_VAAPI_HWACCEL) += vaapi_mpeg2.o
OBJS-$(CONFIG_MPEG2_VDPAU_HWACCEL) += vdpau_mpeg12.o OBJS-$(CONFIG_MPEG2_VDPAU_HWACCEL) += vdpau_mpeg12.o
OBJS-$(CONFIG_MPEG2_VIDEOTOOLBOX_HWACCEL) += videotoolbox.o OBJS-$(CONFIG_MPEG2_VIDEOTOOLBOX_HWACCEL) += videotoolbox.o
@@ -932,7 +964,7 @@ OBJS-$(CONFIG_MPEG4_VIDEOTOOLBOX_HWACCEL) += videotoolbox.o
OBJS-$(CONFIG_VC1_D3D11VA_HWACCEL) += dxva2_vc1.o OBJS-$(CONFIG_VC1_D3D11VA_HWACCEL) += dxva2_vc1.o
OBJS-$(CONFIG_VC1_DXVA2_HWACCEL) += dxva2_vc1.o OBJS-$(CONFIG_VC1_DXVA2_HWACCEL) += dxva2_vc1.o
OBJS-$(CONFIG_VC1_NVDEC_HWACCEL) += nvdec_vc1.o OBJS-$(CONFIG_VC1_NVDEC_HWACCEL) += nvdec_vc1.o
OBJS-$(CONFIG_VC1_QSV_HWACCEL) += qsvdec_other.o OBJS-$(CONFIG_VC1_QSV_HWACCEL) += qsvdec.o
OBJS-$(CONFIG_VC1_VAAPI_HWACCEL) += vaapi_vc1.o OBJS-$(CONFIG_VC1_VAAPI_HWACCEL) += vaapi_vc1.o
OBJS-$(CONFIG_VC1_VDPAU_HWACCEL) += vdpau_vc1.o OBJS-$(CONFIG_VC1_VDPAU_HWACCEL) += vdpau_vc1.o
OBJS-$(CONFIG_VP8_NVDEC_HWACCEL) += nvdec_vp8.o OBJS-$(CONFIG_VP8_NVDEC_HWACCEL) += nvdec_vp8.o
@@ -942,26 +974,24 @@ OBJS-$(CONFIG_VP9_DXVA2_HWACCEL) += dxva2_vp9.o
OBJS-$(CONFIG_VP9_NVDEC_HWACCEL) += nvdec_vp9.o OBJS-$(CONFIG_VP9_NVDEC_HWACCEL) += nvdec_vp9.o
OBJS-$(CONFIG_VP9_VAAPI_HWACCEL) += vaapi_vp9.o OBJS-$(CONFIG_VP9_VAAPI_HWACCEL) += vaapi_vp9.o
OBJS-$(CONFIG_VP9_VDPAU_HWACCEL) += vdpau_vp9.o OBJS-$(CONFIG_VP9_VDPAU_HWACCEL) += vdpau_vp9.o
OBJS-$(CONFIG_VP8_QSV_HWACCEL) += qsvdec_other.o OBJS-$(CONFIG_VP8_QSV_HWACCEL) += qsvdec.o
# libavformat dependencies # libavformat dependencies
OBJS-$(CONFIG_ISO_MEDIA) += mpeg4audio.o mpegaudiodata.o OBJS-$(CONFIG_ISO_MEDIA) += mpeg4audio.o mpegaudiodata.o
OBJS-$(CONFIG_ADTS_MUXER) += mpeg4audio.o OBJS-$(CONFIG_ADTS_MUXER) += mpeg4audio.o
OBJS-$(CONFIG_CAF_DEMUXER) += ac3tab.o
OBJS-$(CONFIG_CODEC2_DEMUXER) += codec2utils.o OBJS-$(CONFIG_CODEC2_DEMUXER) += codec2utils.o
OBJS-$(CONFIG_CODEC2_MUXER) += codec2utils.o OBJS-$(CONFIG_CODEC2_MUXER) += codec2utils.o
OBJS-$(CONFIG_CODEC2RAW_DEMUXER) += codec2utils.o OBJS-$(CONFIG_CODEC2RAW_DEMUXER) += codec2utils.o
OBJS-$(CONFIG_DNXHD_DEMUXER) += dnxhddata.o OBJS-$(CONFIG_DNXHD_DEMUXER) += dnxhddata.o
OBJS-$(CONFIG_FITS_DEMUXER) += fits.o OBJS-$(CONFIG_FITS_DEMUXER) += fits.o
OBJS-$(CONFIG_FLV_DEMUXER) += mpeg4audio.o
OBJS-$(CONFIG_LATM_MUXER) += mpeg4audio.o OBJS-$(CONFIG_LATM_MUXER) += mpeg4audio.o
OBJS-$(CONFIG_MATROSKA_AUDIO_MUXER) += mpeg4audio.o OBJS-$(CONFIG_MATROSKA_AUDIO_MUXER) += mpeg4audio.o
OBJS-$(CONFIG_MATROSKA_MUXER) += mpeg4audio.o OBJS-$(CONFIG_MATROSKA_MUXER) += mpeg4audio.o
OBJS-$(CONFIG_MOV_DEMUXER) += ac3tab.o OBJS-$(CONFIG_MOV_DEMUXER) += ac3tab.o
OBJS-$(CONFIG_MATROSKA_DEMUXER) += mpeg4audio.o
OBJS-$(CONFIG_MXF_MUXER) += dnxhddata.o OBJS-$(CONFIG_MXF_MUXER) += dnxhddata.o
OBJS-$(CONFIG_NUT_MUXER) += mpegaudiodata.o OBJS-$(CONFIG_NUT_MUXER) += mpegaudiodata.o
OBJS-$(CONFIG_NUT_DEMUXER) += mpegaudiodata.o mpeg4audio.o
OBJS-$(CONFIG_RTP_MUXER) += mpeg4audio.o OBJS-$(CONFIG_RTP_MUXER) += mpeg4audio.o
OBJS-$(CONFIG_SPDIF_MUXER) += dca.o OBJS-$(CONFIG_SPDIF_MUXER) += dca.o
OBJS-$(CONFIG_TAK_DEMUXER) += tak.o OBJS-$(CONFIG_TAK_DEMUXER) += tak.o
@@ -1024,8 +1054,10 @@ OBJS-$(CONFIG_LIBRAV1E_ENCODER) += librav1e.o
OBJS-$(CONFIG_LIBSHINE_ENCODER) += libshine.o OBJS-$(CONFIG_LIBSHINE_ENCODER) += libshine.o
OBJS-$(CONFIG_LIBSPEEX_DECODER) += libspeexdec.o OBJS-$(CONFIG_LIBSPEEX_DECODER) += libspeexdec.o
OBJS-$(CONFIG_LIBSPEEX_ENCODER) += libspeexenc.o OBJS-$(CONFIG_LIBSPEEX_ENCODER) += libspeexenc.o
OBJS-$(CONFIG_LIBSVTAV1_ENCODER) += libsvtav1.o
OBJS-$(CONFIG_LIBTHEORA_ENCODER) += libtheoraenc.o OBJS-$(CONFIG_LIBTHEORA_ENCODER) += libtheoraenc.o
OBJS-$(CONFIG_LIBTWOLAME_ENCODER) += libtwolame.o OBJS-$(CONFIG_LIBTWOLAME_ENCODER) += libtwolame.o
OBJS-$(CONFIG_LIBUAVS3D_DECODER) += libuavs3d.o
OBJS-$(CONFIG_LIBVO_AMRWBENC_ENCODER) += libvo-amrwbenc.o OBJS-$(CONFIG_LIBVO_AMRWBENC_ENCODER) += libvo-amrwbenc.o
OBJS-$(CONFIG_LIBVORBIS_DECODER) += libvorbisdec.o OBJS-$(CONFIG_LIBVORBIS_DECODER) += libvorbisdec.o
OBJS-$(CONFIG_LIBVORBIS_ENCODER) += libvorbisenc.o \ OBJS-$(CONFIG_LIBVORBIS_ENCODER) += libvorbisenc.o \
@@ -1034,7 +1066,6 @@ OBJS-$(CONFIG_LIBVPX_VP8_DECODER) += libvpxdec.o
OBJS-$(CONFIG_LIBVPX_VP8_ENCODER) += libvpxenc.o OBJS-$(CONFIG_LIBVPX_VP8_ENCODER) += libvpxenc.o
OBJS-$(CONFIG_LIBVPX_VP9_DECODER) += libvpxdec.o libvpx.o OBJS-$(CONFIG_LIBVPX_VP9_DECODER) += libvpxdec.o libvpx.o
OBJS-$(CONFIG_LIBVPX_VP9_ENCODER) += libvpxenc.o libvpx.o OBJS-$(CONFIG_LIBVPX_VP9_ENCODER) += libvpxenc.o libvpx.o
OBJS-$(CONFIG_LIBWAVPACK_ENCODER) += libwavpackenc.o
OBJS-$(CONFIG_LIBWEBP_ENCODER) += libwebpenc_common.o libwebpenc.o OBJS-$(CONFIG_LIBWEBP_ENCODER) += libwebpenc_common.o libwebpenc.o
OBJS-$(CONFIG_LIBWEBP_ANIM_ENCODER) += libwebpenc_common.o libwebpenc_animencoder.o OBJS-$(CONFIG_LIBWEBP_ANIM_ENCODER) += libwebpenc_common.o libwebpenc_animencoder.o
OBJS-$(CONFIG_LIBX262_ENCODER) += libx264.o OBJS-$(CONFIG_LIBX262_ENCODER) += libx264.o
@@ -1053,19 +1084,21 @@ OBJS-$(CONFIG_AC3_PARSER) += ac3tab.o aac_ac3_parser.o
OBJS-$(CONFIG_ADX_PARSER) += adx_parser.o adx.o OBJS-$(CONFIG_ADX_PARSER) += adx_parser.o adx.o
OBJS-$(CONFIG_AV1_PARSER) += av1_parser.o av1_parse.o OBJS-$(CONFIG_AV1_PARSER) += av1_parser.o av1_parse.o
OBJS-$(CONFIG_AVS2_PARSER) += avs2_parser.o OBJS-$(CONFIG_AVS2_PARSER) += avs2_parser.o
OBJS-$(CONFIG_AVS3_PARSER) += avs3_parser.o
OBJS-$(CONFIG_BMP_PARSER) += bmp_parser.o OBJS-$(CONFIG_BMP_PARSER) += bmp_parser.o
OBJS-$(CONFIG_CAVSVIDEO_PARSER) += cavs_parser.o OBJS-$(CONFIG_CAVSVIDEO_PARSER) += cavs_parser.o
OBJS-$(CONFIG_COOK_PARSER) += cook_parser.o OBJS-$(CONFIG_COOK_PARSER) += cook_parser.o
OBJS-$(CONFIG_CRI_PARSER) += cri_parser.o
OBJS-$(CONFIG_DCA_PARSER) += dca_parser.o dca_exss.o dca.o OBJS-$(CONFIG_DCA_PARSER) += dca_parser.o dca_exss.o dca.o
OBJS-$(CONFIG_DIRAC_PARSER) += dirac_parser.o OBJS-$(CONFIG_DIRAC_PARSER) += dirac_parser.o
OBJS-$(CONFIG_DNXHD_PARSER) += dnxhd_parser.o dnxhddata.o OBJS-$(CONFIG_DNXHD_PARSER) += dnxhd_parser.o dnxhddata.o
OBJS-$(CONFIG_DOLBY_E_PARSER) += dolby_e_parser.o dolby_e_parse.o
OBJS-$(CONFIG_DPX_PARSER) += dpx_parser.o OBJS-$(CONFIG_DPX_PARSER) += dpx_parser.o
OBJS-$(CONFIG_DVAUDIO_PARSER) += dvaudio_parser.o OBJS-$(CONFIG_DVAUDIO_PARSER) += dvaudio_parser.o
OBJS-$(CONFIG_DVBSUB_PARSER) += dvbsub_parser.o OBJS-$(CONFIG_DVBSUB_PARSER) += dvbsub_parser.o
OBJS-$(CONFIG_DVD_NAV_PARSER) += dvd_nav_parser.o OBJS-$(CONFIG_DVD_NAV_PARSER) += dvd_nav_parser.o
OBJS-$(CONFIG_DVDSUB_PARSER) += dvdsub_parser.o OBJS-$(CONFIG_DVDSUB_PARSER) += dvdsub_parser.o
OBJS-$(CONFIG_FLAC_PARSER) += flac_parser.o flacdata.o flac.o \ OBJS-$(CONFIG_FLAC_PARSER) += flac_parser.o flacdata.o flac.o
vorbis_data.o
OBJS-$(CONFIG_G723_1_PARSER) += g723_1_parser.o OBJS-$(CONFIG_G723_1_PARSER) += g723_1_parser.o
OBJS-$(CONFIG_G729_PARSER) += g729_parser.o OBJS-$(CONFIG_G729_PARSER) += g729_parser.o
OBJS-$(CONFIG_GIF_PARSER) += gif_parser.o OBJS-$(CONFIG_GIF_PARSER) += gif_parser.o
@@ -1074,6 +1107,7 @@ OBJS-$(CONFIG_H261_PARSER) += h261_parser.o
OBJS-$(CONFIG_H263_PARSER) += h263_parser.o OBJS-$(CONFIG_H263_PARSER) += h263_parser.o
OBJS-$(CONFIG_H264_PARSER) += h264_parser.o h264_sei.o h264data.o OBJS-$(CONFIG_H264_PARSER) += h264_parser.o h264_sei.o h264data.o
OBJS-$(CONFIG_HEVC_PARSER) += hevc_parser.o hevc_data.o OBJS-$(CONFIG_HEVC_PARSER) += hevc_parser.o hevc_data.o
OBJS-$(CONFIG_IPU_PARSER) += ipu_parser.o
OBJS-$(CONFIG_JPEG2000_PARSER) += jpeg2000_parser.o OBJS-$(CONFIG_JPEG2000_PARSER) += jpeg2000_parser.o
OBJS-$(CONFIG_MJPEG_PARSER) += mjpeg_parser.o OBJS-$(CONFIG_MJPEG_PARSER) += mjpeg_parser.o
OBJS-$(CONFIG_MLP_PARSER) += mlp_parse.o mlp_parser.o mlp.o OBJS-$(CONFIG_MLP_PARSER) += mlp_parse.o mlp_parser.o mlp.o
@@ -1098,6 +1132,7 @@ OBJS-$(CONFIG_VP3_PARSER) += vp3_parser.o
OBJS-$(CONFIG_VP8_PARSER) += vp8_parser.o OBJS-$(CONFIG_VP8_PARSER) += vp8_parser.o
OBJS-$(CONFIG_VP9_PARSER) += vp9_parser.o OBJS-$(CONFIG_VP9_PARSER) += vp9_parser.o
OBJS-$(CONFIG_WEBP_PARSER) += webp_parser.o OBJS-$(CONFIG_WEBP_PARSER) += webp_parser.o
OBJS-$(CONFIG_XBM_PARSER) += xbm_parser.o
OBJS-$(CONFIG_XMA_PARSER) += xma_parser.o OBJS-$(CONFIG_XMA_PARSER) += xma_parser.o
# bitstream filters # bitstream filters
@@ -1132,6 +1167,7 @@ OBJS-$(CONFIG_OPUS_METADATA_BSF) += opus_metadata_bsf.o
OBJS-$(CONFIG_PCM_RECHUNK_BSF) += pcm_rechunk_bsf.o OBJS-$(CONFIG_PCM_RECHUNK_BSF) += pcm_rechunk_bsf.o
OBJS-$(CONFIG_PRORES_METADATA_BSF) += prores_metadata_bsf.o OBJS-$(CONFIG_PRORES_METADATA_BSF) += prores_metadata_bsf.o
OBJS-$(CONFIG_REMOVE_EXTRADATA_BSF) += remove_extradata_bsf.o OBJS-$(CONFIG_REMOVE_EXTRADATA_BSF) += remove_extradata_bsf.o
OBJS-$(CONFIG_SETTS_BSF) += setts_bsf.o
OBJS-$(CONFIG_TEXT2MOVSUB_BSF) += movsub_bsf.o OBJS-$(CONFIG_TEXT2MOVSUB_BSF) += movsub_bsf.o
OBJS-$(CONFIG_TRACE_HEADERS_BSF) += trace_headers_bsf.o OBJS-$(CONFIG_TRACE_HEADERS_BSF) += trace_headers_bsf.o
OBJS-$(CONFIG_TRUEHD_CORE_BSF) += truehd_core_bsf.o mlp_parse.o mlp.o OBJS-$(CONFIG_TRUEHD_CORE_BSF) += truehd_core_bsf.o mlp_parse.o mlp.o
@@ -1171,10 +1207,9 @@ SKIPHEADERS-$(CONFIG_MEDIAFOUNDATION) += mf_utils.h
SKIPHEADERS-$(CONFIG_NVDEC) += nvdec.h SKIPHEADERS-$(CONFIG_NVDEC) += nvdec.h
SKIPHEADERS-$(CONFIG_NVENC) += nvenc.h SKIPHEADERS-$(CONFIG_NVENC) += nvenc.h
SKIPHEADERS-$(CONFIG_QSV) += qsv.h qsv_internal.h SKIPHEADERS-$(CONFIG_QSV) += qsv.h qsv_internal.h
SKIPHEADERS-$(CONFIG_QSVDEC) += qsvdec.h
SKIPHEADERS-$(CONFIG_QSVENC) += qsvenc.h SKIPHEADERS-$(CONFIG_QSVENC) += qsvenc.h
SKIPHEADERS-$(CONFIG_XVMC) += xvmc.h SKIPHEADERS-$(CONFIG_XVMC) += xvmc.h
SKIPHEADERS-$(CONFIG_VAAPI) += vaapi_decode.h vaapi_encode.h SKIPHEADERS-$(CONFIG_VAAPI) += vaapi_decode.h vaapi_hevc.h vaapi_encode.h
SKIPHEADERS-$(CONFIG_VDPAU) += vdpau.h vdpau_internal.h SKIPHEADERS-$(CONFIG_VDPAU) += vdpau.h vdpau_internal.h
SKIPHEADERS-$(CONFIG_VIDEOTOOLBOX) += videotoolbox.h vt_internal.h SKIPHEADERS-$(CONFIG_VIDEOTOOLBOX) += videotoolbox.h vt_internal.h
SKIPHEADERS-$(CONFIG_V4L2_M2M) += v4l2_buffers.h v4l2_context.h v4l2_m2m.h SKIPHEADERS-$(CONFIG_V4L2_M2M) += v4l2_buffers.h v4l2_context.h v4l2_m2m.h
@@ -1186,16 +1221,15 @@ TESTPROGS = avpacket \
imgconvert \ imgconvert \
jpeg2000dwt \ jpeg2000dwt \
mathops \ mathops \
options \
mjpegenc_huffman \
utils \ utils \
TESTPROGS-$(CONFIG_CABAC) += cabac TESTPROGS-$(CONFIG_CABAC) += cabac
TESTPROGS-$(CONFIG_DCT) += avfft TESTPROGS-$(CONFIG_DCT) += avfft
TESTPROGS-$(CONFIG_FFT) += fft fft-fixed fft-fixed32 TESTPROGS-$(CONFIG_FFT) += fft fft-fixed32
TESTPROGS-$(CONFIG_GOLOMB) += golomb TESTPROGS-$(CONFIG_GOLOMB) += golomb
TESTPROGS-$(CONFIG_IDCTDSP) += dct TESTPROGS-$(CONFIG_IDCTDSP) += dct
TESTPROGS-$(CONFIG_IIRFILTER) += iirfilter TESTPROGS-$(CONFIG_IIRFILTER) += iirfilter
TESTPROGS-$(CONFIG_MJPEG_ENCODER) += mjpegenc_huffman
TESTPROGS-$(HAVE_MMX) += motion TESTPROGS-$(HAVE_MMX) += motion
TESTPROGS-$(CONFIG_MPEGVIDEO) += mpeg12framerate TESTPROGS-$(CONFIG_MPEGVIDEO) += mpeg12framerate
TESTPROGS-$(CONFIG_H264_METADATA_BSF) += h264_levels TESTPROGS-$(CONFIG_H264_METADATA_BSF) += h264_levels
@@ -1215,6 +1249,7 @@ HOSTPROGS = aacps_tablegen \
dv_tablegen \ dv_tablegen \
motionpixels_tablegen \ motionpixels_tablegen \
mpegaudio_tablegen \ mpegaudio_tablegen \
mpegaudiodec_common_tablegen \
pcm_tablegen \ pcm_tablegen \
qdm2_tablegen \ qdm2_tablegen \
sinewin_tablegen \ sinewin_tablegen \
@@ -1239,7 +1274,8 @@ endif
GEN_HEADERS = cbrt_tables.h cbrt_fixed_tables.h aacps_tables.h aacps_fixed_tables.h \ GEN_HEADERS = cbrt_tables.h cbrt_fixed_tables.h aacps_tables.h aacps_fixed_tables.h \
dv_tables.h \ dv_tables.h \
sinewin_tables.h sinewin_fixed_tables.h mpegaudio_tables.h motionpixels_tables.h \ sinewin_tables.h sinewin_fixed_tables.h mpegaudio_tables.h \
mpegaudiodec_common_tables.h motionpixels_tables.h \
pcm_tables.h qdm2_tables.h pcm_tables.h qdm2_tables.h
GEN_HEADERS := $(addprefix $(SUBDIR), $(GEN_HEADERS)) GEN_HEADERS := $(addprefix $(SUBDIR), $(GEN_HEADERS))
@@ -1249,15 +1285,15 @@ $(GEN_HEADERS): $(SUBDIR)%_tables.h: $(SUBDIR)%_tablegen$(HOSTEXESUF)
ifdef CONFIG_HARDCODED_TABLES ifdef CONFIG_HARDCODED_TABLES
$(SUBDIR)cbrt_data.o: $(SUBDIR)cbrt_tables.h $(SUBDIR)cbrt_data.o: $(SUBDIR)cbrt_tables.h
$(SUBDIR)cbrt_data_fixed.o: $(SUBDIR)cbrt_fixed_tables.h $(SUBDIR)cbrt_data_fixed.o: $(SUBDIR)cbrt_fixed_tables.h
$(SUBDIR)aacdec_fixed.o: $(SUBDIR)sinewin_fixed_tables.h
$(SUBDIR)aacps_float.o: $(SUBDIR)aacps_tables.h $(SUBDIR)aacps_float.o: $(SUBDIR)aacps_tables.h
$(SUBDIR)aacps_fixed.o: $(SUBDIR)aacps_fixed_tables.h $(SUBDIR)aacps_fixed.o: $(SUBDIR)aacps_fixed_tables.h
$(SUBDIR)aactab_fixed.o: $(SUBDIR)aac_fixed_tables.h
$(SUBDIR)dvenc.o: $(SUBDIR)dv_tables.h $(SUBDIR)dvenc.o: $(SUBDIR)dv_tables.h
$(SUBDIR)motionpixels.o: $(SUBDIR)motionpixels_tables.h $(SUBDIR)motionpixels.o: $(SUBDIR)motionpixels_tables.h
$(SUBDIR)mpegaudiodec_common.o: $(SUBDIR)mpegaudiodec_common_tables.h
$(SUBDIR)mpegaudiodec_fixed.o: $(SUBDIR)mpegaudio_tables.h $(SUBDIR)mpegaudiodec_fixed.o: $(SUBDIR)mpegaudio_tables.h
$(SUBDIR)mpegaudiodec_float.o: $(SUBDIR)mpegaudio_tables.h $(SUBDIR)mpegaudiodec_float.o: $(SUBDIR)mpegaudio_tables.h
$(SUBDIR)pcm.o: $(SUBDIR)pcm_tables.h $(SUBDIR)pcm.o: $(SUBDIR)pcm_tables.h
$(SUBDIR)qdm2.o: $(SUBDIR)qdm2_tables.h $(SUBDIR)qdm2.o: $(SUBDIR)qdm2_tables.h
$(SUBDIR)sinewin.o: $(SUBDIR)sinewin_tables.h $(SUBDIR)sinewin.o: $(SUBDIR)sinewin_tables.h
$(SUBDIR)sinewin_fixed.o: $(SUBDIR)sinewin_fixed_tables.h
endif endif
+9 -4
View File
@@ -107,13 +107,16 @@ static void render_charset(AVCodecContext *avctx, uint8_t *charset,
uint8_t pix; uint8_t pix;
int lowdiff, highdiff; int lowdiff, highdiff;
int *best_cb = c->mc_best_cb; int *best_cb = c->mc_best_cb;
static uint8_t index1[256]; uint8_t index1[256];
static uint8_t index2[256]; uint8_t index2[256];
static uint8_t dither[256]; uint8_t dither[256];
int i; int i;
int distance; int distance;
/* generate lookup-tables for dither and index before looping */ /* Generate lookup-tables for dither and index before looping.
* This code relies on c->mc_luma_vals[c->mc_pal_size - 1] being
* the maximum of all the mc_luma_vals values and on the minimum
* being zero; this ensures that dither is properly initialized. */
i = 0; i = 0;
for (a=0; a < 256; a++) { for (a=0; a < 256; a++) {
if(i < c->mc_pal_size -1 && a == c->mc_luma_vals[i + 1]) { if(i < c->mc_pal_size -1 && a == c->mc_luma_vals[i + 1]) {
@@ -407,6 +410,7 @@ AVCodec ff_a64multi_encoder = {
.close = a64multi_close_encoder, .close = a64multi_close_encoder,
.pix_fmts = (const enum AVPixelFormat[]) {AV_PIX_FMT_GRAY8, AV_PIX_FMT_NONE}, .pix_fmts = (const enum AVPixelFormat[]) {AV_PIX_FMT_GRAY8, AV_PIX_FMT_NONE},
.capabilities = AV_CODEC_CAP_DELAY, .capabilities = AV_CODEC_CAP_DELAY,
.caps_internal = FF_CODEC_CAP_INIT_CLEANUP | FF_CODEC_CAP_INIT_THREADSAFE,
}; };
#endif #endif
#if CONFIG_A64MULTI5_ENCODER #if CONFIG_A64MULTI5_ENCODER
@@ -421,5 +425,6 @@ AVCodec ff_a64multi5_encoder = {
.close = a64multi_close_encoder, .close = a64multi_close_encoder,
.pix_fmts = (const enum AVPixelFormat[]) {AV_PIX_FMT_GRAY8, AV_PIX_FMT_NONE}, .pix_fmts = (const enum AVPixelFormat[]) {AV_PIX_FMT_GRAY8, AV_PIX_FMT_NONE},
.capabilities = AV_CODEC_CAP_DELAY, .capabilities = AV_CODEC_CAP_DELAY,
.caps_internal = FF_CODEC_CAP_INIT_CLEANUP | FF_CODEC_CAP_INIT_THREADSAFE,
}; };
#endif #endif
+1
View File
@@ -34,6 +34,7 @@
#include "aac_defines.h" #include "aac_defines.h"
#include "libavutil/float_dsp.h" #include "libavutil/float_dsp.h"
#include "libavutil/fixed_dsp.h" #include "libavutil/fixed_dsp.h"
#include "libavutil/mem_internal.h"
#include "avcodec.h" #include "avcodec.h"
#if !USE_FIXED #if !USE_FIXED
#include "mdct15.h" #include "mdct15.h"
+7 -3
View File
@@ -89,7 +89,7 @@ get_next:
the frame). */ the frame). */
if (avctx->codec_id != AV_CODEC_ID_AAC) { if (avctx->codec_id != AV_CODEC_ID_AAC) {
avctx->sample_rate = s->sample_rate; avctx->sample_rate = s->sample_rate;
if (avctx->codec_id != AV_CODEC_ID_EAC3) { if (!CONFIG_EAC3_DECODER || avctx->codec_id != AV_CODEC_ID_EAC3) {
avctx->channels = s->channels; avctx->channels = s->channels;
avctx->channel_layout = s->channel_layout; avctx->channel_layout = s->channel_layout;
} }
@@ -97,8 +97,12 @@ get_next:
avctx->audio_service_type = s->service_type; avctx->audio_service_type = s->service_type;
} }
if (avctx->codec_id != AV_CODEC_ID_EAC3) /* Calculate the average bit rate */
avctx->bit_rate = s->bit_rate; s->frame_number++;
if (!CONFIG_EAC3_DECODER || avctx->codec_id != AV_CODEC_ID_EAC3) {
avctx->bit_rate +=
(s->bit_rate - avctx->bit_rate) / s->frame_number;
}
} }
return i; return i;
+1
View File
@@ -55,6 +55,7 @@ typedef struct AACAC3ParseContext {
uint64_t state; uint64_t state;
int need_next_header; int need_next_header;
int frame_number;
enum AVCodecID codec_id; enum AVCodecID codec_id;
} AACAC3ParseContext; } AACAC3ParseContext;
+2
View File
@@ -34,6 +34,7 @@
#define AAC_RENAME(x) x ## _fixed #define AAC_RENAME(x) x ## _fixed
#define AAC_RENAME_32(x) x ## _fixed_32 #define AAC_RENAME_32(x) x ## _fixed_32
#define AAC_RENAME2(x) x ## _fixed
typedef int INTFLOAT; typedef int INTFLOAT;
typedef unsigned UINTFLOAT; ///< Equivalent to INTFLOAT, Used as temporal cast to avoid undefined sign overflow operations. typedef unsigned UINTFLOAT; ///< Equivalent to INTFLOAT, Used as temporal cast to avoid undefined sign overflow operations.
typedef int64_t INT64FLOAT; typedef int64_t INT64FLOAT;
@@ -83,6 +84,7 @@ typedef int AAC_SIGNE;
#define AAC_RENAME(x) x #define AAC_RENAME(x) x
#define AAC_RENAME_32(x) x #define AAC_RENAME_32(x) x
#define AAC_RENAME2(x) ff_ ## x
typedef float INTFLOAT; typedef float INTFLOAT;
typedef float UINTFLOAT; typedef float UINTFLOAT;
typedef float INT64FLOAT; typedef float INT64FLOAT;
+5
View File
@@ -69,6 +69,11 @@
# include "mips/aacdec_mips.h" # include "mips/aacdec_mips.h"
#endif #endif
DECLARE_ALIGNED(32, static INTFLOAT, AAC_RENAME(sine_120))[120];
DECLARE_ALIGNED(32, static INTFLOAT, AAC_RENAME(sine_960))[960];
DECLARE_ALIGNED(32, static INTFLOAT, AAC_RENAME(aac_kbd_long_960))[960];
DECLARE_ALIGNED(32, static INTFLOAT, AAC_RENAME(aac_kbd_short_120))[120];
static av_always_inline void reset_predict_state(PredictorState *ps) static av_always_inline void reset_predict_state(PredictorState *ps)
{ {
ps->r0 = 0.0f; ps->r0 = 0.0f;
+4 -1
View File
@@ -70,7 +70,7 @@
#include "fft.h" #include "fft.h"
#include "lpc.h" #include "lpc.h"
#include "kbdwin.h" #include "kbdwin.h"
#include "sinewin.h" #include "sinewin_fixed_tablegen.h"
#include "aac.h" #include "aac.h"
#include "aactab.h" #include "aactab.h"
@@ -86,6 +86,9 @@
#include <math.h> #include <math.h>
#include <string.h> #include <string.h>
DECLARE_ALIGNED(32, static int, AAC_RENAME2(aac_kbd_long_1024))[1024];
DECLARE_ALIGNED(32, static int, AAC_RENAME2(aac_kbd_short_128))[128];
static av_always_inline void reset_predict_state(PredictorState *ps) static av_always_inline void reset_predict_state(PredictorState *ps)
{ {
ps->r0.mant = 0; ps->r0.mant = 0;
+181 -82
View File
@@ -198,7 +198,7 @@ struct elem_to_channel {
static int assign_pair(struct elem_to_channel e2c_vec[MAX_ELEM_ID], static int assign_pair(struct elem_to_channel e2c_vec[MAX_ELEM_ID],
uint8_t (*layout_map)[3], int offset, uint64_t left, uint8_t (*layout_map)[3], int offset, uint64_t left,
uint64_t right, int pos) uint64_t right, int pos, uint64_t *layout)
{ {
if (layout_map[offset][0] == TYPE_CPE) { if (layout_map[offset][0] == TYPE_CPE) {
e2c_vec[offset] = (struct elem_to_channel) { e2c_vec[offset] = (struct elem_to_channel) {
@@ -207,6 +207,9 @@ static int assign_pair(struct elem_to_channel e2c_vec[MAX_ELEM_ID],
.elem_id = layout_map[offset][1], .elem_id = layout_map[offset][1],
.aac_position = pos .aac_position = pos
}; };
if (e2c_vec[offset].av_position != UINT64_MAX)
*layout |= e2c_vec[offset].av_position;
return 1; return 1;
} else { } else {
e2c_vec[offset] = (struct elem_to_channel) { e2c_vec[offset] = (struct elem_to_channel) {
@@ -221,6 +224,12 @@ static int assign_pair(struct elem_to_channel e2c_vec[MAX_ELEM_ID],
.elem_id = layout_map[offset + 1][1], .elem_id = layout_map[offset + 1][1],
.aac_position = pos .aac_position = pos
}; };
if (left != UINT64_MAX)
*layout |= left;
if (right != UINT64_MAX)
*layout |= right;
return 2; return 2;
} }
} }
@@ -257,12 +266,13 @@ static int count_paired_channels(uint8_t (*layout_map)[3], int tags, int pos,
return num_pos_channels; return num_pos_channels;
} }
#define PREFIX_FOR_22POINT2 (AV_CH_LAYOUT_7POINT1_WIDE_BACK|AV_CH_BACK_CENTER|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT|AV_CH_LOW_FREQUENCY_2)
static uint64_t sniff_channel_order(uint8_t (*layout_map)[3], int tags) static uint64_t sniff_channel_order(uint8_t (*layout_map)[3], int tags)
{ {
int i, n, total_non_cc_elements; int i, n, total_non_cc_elements;
struct elem_to_channel e2c_vec[4 * MAX_ELEM_ID] = { { 0 } }; struct elem_to_channel e2c_vec[4 * MAX_ELEM_ID] = { { 0 } };
int num_front_channels, num_side_channels, num_back_channels; int num_front_channels, num_side_channels, num_back_channels;
uint64_t layout; uint64_t layout = 0;
if (FF_ARRAY_ELEMS(e2c_vec) < tags) if (FF_ARRAY_ELEMS(e2c_vec) < tags)
return 0; return 0;
@@ -294,6 +304,7 @@ static uint64_t sniff_channel_order(uint8_t (*layout_map)[3], int tags)
.elem_id = layout_map[i][1], .elem_id = layout_map[i][1],
.aac_position = AAC_CHANNEL_FRONT .aac_position = AAC_CHANNEL_FRONT
}; };
layout |= e2c_vec[i].av_position;
i++; i++;
num_front_channels--; num_front_channels--;
} }
@@ -301,21 +312,21 @@ static uint64_t sniff_channel_order(uint8_t (*layout_map)[3], int tags)
i += assign_pair(e2c_vec, layout_map, i, i += assign_pair(e2c_vec, layout_map, i,
AV_CH_FRONT_LEFT_OF_CENTER, AV_CH_FRONT_LEFT_OF_CENTER,
AV_CH_FRONT_RIGHT_OF_CENTER, AV_CH_FRONT_RIGHT_OF_CENTER,
AAC_CHANNEL_FRONT); AAC_CHANNEL_FRONT, &layout);
num_front_channels -= 2; num_front_channels -= 2;
} }
if (num_front_channels >= 2) { if (num_front_channels >= 2) {
i += assign_pair(e2c_vec, layout_map, i, i += assign_pair(e2c_vec, layout_map, i,
AV_CH_FRONT_LEFT, AV_CH_FRONT_LEFT,
AV_CH_FRONT_RIGHT, AV_CH_FRONT_RIGHT,
AAC_CHANNEL_FRONT); AAC_CHANNEL_FRONT, &layout);
num_front_channels -= 2; num_front_channels -= 2;
} }
while (num_front_channels >= 2) { while (num_front_channels >= 2) {
i += assign_pair(e2c_vec, layout_map, i, i += assign_pair(e2c_vec, layout_map, i,
UINT64_MAX, UINT64_MAX,
UINT64_MAX, UINT64_MAX,
AAC_CHANNEL_FRONT); AAC_CHANNEL_FRONT, &layout);
num_front_channels -= 2; num_front_channels -= 2;
} }
@@ -323,14 +334,14 @@ static uint64_t sniff_channel_order(uint8_t (*layout_map)[3], int tags)
i += assign_pair(e2c_vec, layout_map, i, i += assign_pair(e2c_vec, layout_map, i,
AV_CH_SIDE_LEFT, AV_CH_SIDE_LEFT,
AV_CH_SIDE_RIGHT, AV_CH_SIDE_RIGHT,
AAC_CHANNEL_FRONT); AAC_CHANNEL_FRONT, &layout);
num_side_channels -= 2; num_side_channels -= 2;
} }
while (num_side_channels >= 2) { while (num_side_channels >= 2) {
i += assign_pair(e2c_vec, layout_map, i, i += assign_pair(e2c_vec, layout_map, i,
UINT64_MAX, UINT64_MAX,
UINT64_MAX, UINT64_MAX,
AAC_CHANNEL_SIDE); AAC_CHANNEL_SIDE, &layout);
num_side_channels -= 2; num_side_channels -= 2;
} }
@@ -338,14 +349,14 @@ static uint64_t sniff_channel_order(uint8_t (*layout_map)[3], int tags)
i += assign_pair(e2c_vec, layout_map, i, i += assign_pair(e2c_vec, layout_map, i,
UINT64_MAX, UINT64_MAX,
UINT64_MAX, UINT64_MAX,
AAC_CHANNEL_BACK); AAC_CHANNEL_BACK, &layout);
num_back_channels -= 2; num_back_channels -= 2;
} }
if (num_back_channels >= 2) { if (num_back_channels >= 2) {
i += assign_pair(e2c_vec, layout_map, i, i += assign_pair(e2c_vec, layout_map, i,
AV_CH_BACK_LEFT, AV_CH_BACK_LEFT,
AV_CH_BACK_RIGHT, AV_CH_BACK_RIGHT,
AAC_CHANNEL_BACK); AAC_CHANNEL_BACK, &layout);
num_back_channels -= 2; num_back_channels -= 2;
} }
if (num_back_channels) { if (num_back_channels) {
@@ -355,6 +366,7 @@ static uint64_t sniff_channel_order(uint8_t (*layout_map)[3], int tags)
.elem_id = layout_map[i][1], .elem_id = layout_map[i][1],
.aac_position = AAC_CHANNEL_BACK .aac_position = AAC_CHANNEL_BACK
}; };
layout |= e2c_vec[i].av_position;
i++; i++;
num_back_channels--; num_back_channels--;
} }
@@ -366,6 +378,17 @@ static uint64_t sniff_channel_order(uint8_t (*layout_map)[3], int tags)
.elem_id = layout_map[i][1], .elem_id = layout_map[i][1],
.aac_position = AAC_CHANNEL_LFE .aac_position = AAC_CHANNEL_LFE
}; };
layout |= e2c_vec[i].av_position;
i++;
}
if (i < tags && layout_map[i][2] == AAC_CHANNEL_LFE) {
e2c_vec[i] = (struct elem_to_channel) {
.av_position = AV_CH_LOW_FREQUENCY_2,
.syn_ele = TYPE_LFE,
.elem_id = layout_map[i][1],
.aac_position = AAC_CHANNEL_LFE
};
layout |= e2c_vec[i].av_position;
i++; i++;
} }
while (i < tags && layout_map[i][2] == AAC_CHANNEL_LFE) { while (i < tags && layout_map[i][2] == AAC_CHANNEL_LFE) {
@@ -378,26 +401,95 @@ static uint64_t sniff_channel_order(uint8_t (*layout_map)[3], int tags)
i++; i++;
} }
// Must choose a stable sort // The previous checks would end up at 8 at this point for 22.2
if (layout == PREFIX_FOR_22POINT2 && tags == 16 && i == 8) {
const uint8_t (*reference_layout_map)[3] = aac_channel_layout_map[12];
for (int j = 0; j < tags; j++) {
if (layout_map[j][0] != reference_layout_map[j][0] ||
layout_map[j][2] != reference_layout_map[j][2])
goto end_of_layout_definition;
}
e2c_vec[i] = (struct elem_to_channel) {
.av_position = AV_CH_TOP_FRONT_CENTER,
.syn_ele = layout_map[i][0],
.elem_id = layout_map[i][1],
.aac_position = layout_map[i][2]
}; layout |= e2c_vec[i].av_position; i++;
i += assign_pair(e2c_vec, layout_map, i,
AV_CH_TOP_FRONT_LEFT,
AV_CH_TOP_FRONT_RIGHT,
AAC_CHANNEL_FRONT,
&layout);
i += assign_pair(e2c_vec, layout_map, i,
AV_CH_TOP_SIDE_LEFT,
AV_CH_TOP_SIDE_RIGHT,
AAC_CHANNEL_SIDE,
&layout);
e2c_vec[i] = (struct elem_to_channel) {
.av_position = AV_CH_TOP_CENTER,
.syn_ele = layout_map[i][0],
.elem_id = layout_map[i][1],
.aac_position = layout_map[i][2]
}; layout |= e2c_vec[i].av_position; i++;
i += assign_pair(e2c_vec, layout_map, i,
AV_CH_TOP_BACK_LEFT,
AV_CH_TOP_BACK_RIGHT,
AAC_CHANNEL_BACK,
&layout);
e2c_vec[i] = (struct elem_to_channel) {
.av_position = AV_CH_TOP_BACK_CENTER,
.syn_ele = layout_map[i][0],
.elem_id = layout_map[i][1],
.aac_position = layout_map[i][2]
}; layout |= e2c_vec[i].av_position; i++;
e2c_vec[i] = (struct elem_to_channel) {
.av_position = AV_CH_BOTTOM_FRONT_CENTER,
.syn_ele = layout_map[i][0],
.elem_id = layout_map[i][1],
.aac_position = layout_map[i][2]
}; layout |= e2c_vec[i].av_position; i++;
i += assign_pair(e2c_vec, layout_map, i,
AV_CH_BOTTOM_FRONT_LEFT,
AV_CH_BOTTOM_FRONT_RIGHT,
AAC_CHANNEL_FRONT,
&layout);
}
end_of_layout_definition:
total_non_cc_elements = n = i; total_non_cc_elements = n = i;
do {
int next_n = 0; if (layout == AV_CH_LAYOUT_22POINT2) {
for (i = 1; i < n; i++) // For 22.2 reorder the result as needed
if (e2c_vec[i - 1].av_position > e2c_vec[i].av_position) { FFSWAP(struct elem_to_channel, e2c_vec[2], e2c_vec[0]); // FL & FR first (final), FC third
FFSWAP(struct elem_to_channel, e2c_vec[i - 1], e2c_vec[i]); FFSWAP(struct elem_to_channel, e2c_vec[2], e2c_vec[1]); // FC second (final), FLc & FRc third
next_n = i; FFSWAP(struct elem_to_channel, e2c_vec[6], e2c_vec[2]); // LFE1 third (final), FLc & FRc seventh
} FFSWAP(struct elem_to_channel, e2c_vec[4], e2c_vec[3]); // BL & BR fourth (final), SiL & SiR fifth
n = next_n; FFSWAP(struct elem_to_channel, e2c_vec[6], e2c_vec[4]); // FLc & FRc fifth (final), SiL & SiR seventh
} while (n > 0); FFSWAP(struct elem_to_channel, e2c_vec[7], e2c_vec[6]); // LFE2 seventh (final), SiL & SiR eight (final)
FFSWAP(struct elem_to_channel, e2c_vec[9], e2c_vec[8]); // TpFL & TpFR ninth (final), TFC tenth (final)
FFSWAP(struct elem_to_channel, e2c_vec[11], e2c_vec[10]); // TC eleventh (final), TpSiL & TpSiR twelth
FFSWAP(struct elem_to_channel, e2c_vec[12], e2c_vec[11]); // TpBL & TpBR twelth (final), TpSiL & TpSiR thirteenth (final)
} else {
// For everything else, utilize the AV channel position define as a
// stable sort.
do {
int next_n = 0;
for (i = 1; i < n; i++)
if (e2c_vec[i - 1].av_position > e2c_vec[i].av_position) {
FFSWAP(struct elem_to_channel, e2c_vec[i - 1], e2c_vec[i]);
next_n = i;
}
n = next_n;
} while (n > 0);
}
layout = 0;
for (i = 0; i < total_non_cc_elements; i++) { for (i = 0; i < total_non_cc_elements; i++) {
layout_map[i][0] = e2c_vec[i].syn_ele; layout_map[i][0] = e2c_vec[i].syn_ele;
layout_map[i][1] = e2c_vec[i].elem_id; layout_map[i][1] = e2c_vec[i].elem_id;
layout_map[i][2] = e2c_vec[i].aac_position; layout_map[i][2] = e2c_vec[i].aac_position;
if (e2c_vec[i].av_position != UINT64_MAX) {
layout |= e2c_vec[i].av_position;
}
} }
return layout; return layout;
@@ -526,7 +618,7 @@ static int set_default_channel_config(AACContext *ac, AVCodecContext *avctx,
int channel_config) int channel_config)
{ {
if (channel_config < 1 || (channel_config > 7 && channel_config < 11) || if (channel_config < 1 || (channel_config > 7 && channel_config < 11) ||
channel_config > 12) { channel_config > 13) {
av_log(avctx, AV_LOG_ERROR, av_log(avctx, AV_LOG_ERROR,
"invalid default channel configuration (%d)\n", "invalid default channel configuration (%d)\n",
channel_config); channel_config);
@@ -547,11 +639,14 @@ static int set_default_channel_config(AACContext *ac, AVCodecContext *avctx,
* As actual intended 7.1(wide) streams are very rare, default to assuming a * As actual intended 7.1(wide) streams are very rare, default to assuming a
* 7.1 layout was intended. * 7.1 layout was intended.
*/ */
if (channel_config == 7 && avctx->strict_std_compliance < FF_COMPLIANCE_STRICT && (!ac || !ac->warned_71_wide++)) { if (channel_config == 7 && avctx->strict_std_compliance < FF_COMPLIANCE_STRICT) {
av_log(avctx, AV_LOG_INFO, "Assuming an incorrectly encoded 7.1 channel layout"
" instead of a spec-compliant 7.1(wide) layout, use -strict %d to decode"
" according to the specification instead.\n", FF_COMPLIANCE_STRICT);
layout_map[2][2] = AAC_CHANNEL_SIDE; layout_map[2][2] = AAC_CHANNEL_SIDE;
if (!ac || !ac->warned_71_wide++) {
av_log(avctx, AV_LOG_INFO, "Assuming an incorrectly encoded 7.1 channel layout"
" instead of a spec-compliant 7.1(wide) layout, use -strict %d to decode"
" according to the specification instead.\n", FF_COMPLIANCE_STRICT);
}
} }
return 0; return 0;
@@ -606,6 +701,13 @@ static ChannelElement *get_che(AACContext *ac, int type, int elem_id)
/* For indexed channel configurations map the channels solely based /* For indexed channel configurations map the channels solely based
* on position. */ * on position. */
switch (ac->oc[1].m4ac.chan_config) { switch (ac->oc[1].m4ac.chan_config) {
case 13:
if (ac->tags_mapped > 3 && ((type == TYPE_CPE && elem_id < 8) ||
(type == TYPE_SCE && elem_id < 6) ||
(type == TYPE_LFE && elem_id < 2))) {
ac->tags_mapped++;
return ac->tag_che_map[type][elem_id] = ac->che[type][elem_id];
}
case 12: case 12:
case 7: case 7:
if (ac->tags_mapped == 3 && type == TYPE_CPE) { if (ac->tags_mapped == 3 && type == TYPE_CPE) {
@@ -1096,29 +1198,25 @@ static void reset_predictor_group(PredictorState *ps, int group_num)
reset_predict_state(&ps[i]); reset_predict_state(&ps[i]);
} }
#define AAC_INIT_VLC_STATIC(num, size) \
INIT_VLC_STATIC(&vlc_spectral[num], 8, ff_aac_spectral_sizes[num], \
ff_aac_spectral_bits[num], sizeof(ff_aac_spectral_bits[num][0]), \
sizeof(ff_aac_spectral_bits[num][0]), \
ff_aac_spectral_codes[num], sizeof(ff_aac_spectral_codes[num][0]), \
sizeof(ff_aac_spectral_codes[num][0]), \
size);
static void aacdec_init(AACContext *ac); static void aacdec_init(AACContext *ac);
static av_cold void aac_static_table_init(void) static av_cold void aac_static_table_init(void)
{ {
AAC_INIT_VLC_STATIC( 0, 304); static VLC_TYPE vlc_buf[304 + 270 + 550 + 300 + 328 +
AAC_INIT_VLC_STATIC( 1, 270); 294 + 306 + 268 + 510 + 366 + 462][2];
AAC_INIT_VLC_STATIC( 2, 550); for (unsigned i = 0, offset = 0; i < 11; i++) {
AAC_INIT_VLC_STATIC( 3, 300); vlc_spectral[i].table = &vlc_buf[offset];
AAC_INIT_VLC_STATIC( 4, 328); vlc_spectral[i].table_allocated = FF_ARRAY_ELEMS(vlc_buf) - offset;
AAC_INIT_VLC_STATIC( 5, 294); ff_init_vlc_sparse(&vlc_spectral[i], 8, ff_aac_spectral_sizes[i],
AAC_INIT_VLC_STATIC( 6, 306); ff_aac_spectral_bits[i], sizeof(ff_aac_spectral_bits[i][0]),
AAC_INIT_VLC_STATIC( 7, 268); sizeof(ff_aac_spectral_bits[i][0]),
AAC_INIT_VLC_STATIC( 8, 510); ff_aac_spectral_codes[i], sizeof(ff_aac_spectral_codes[i][0]),
AAC_INIT_VLC_STATIC( 9, 366); sizeof(ff_aac_spectral_codes[i][0]),
AAC_INIT_VLC_STATIC(10, 462); ff_aac_codebook_vector_idx[i], sizeof(ff_aac_codebook_vector_idx[i][0]),
sizeof(ff_aac_codebook_vector_idx[i][0]),
INIT_VLC_STATIC_OVERLONG);
offset += vlc_spectral[i].table_size;
}
AAC_RENAME(ff_aac_sbr_init)(); AAC_RENAME(ff_aac_sbr_init)();
@@ -1135,17 +1233,18 @@ static av_cold void aac_static_table_init(void)
352); 352);
// window initialization // window initialization
AAC_RENAME(ff_kbd_window_init)(AAC_RENAME(ff_aac_kbd_long_1024), 4.0, 1024);
AAC_RENAME(ff_kbd_window_init)(AAC_RENAME(ff_aac_kbd_short_128), 6.0, 128);
#if !USE_FIXED #if !USE_FIXED
AAC_RENAME(ff_kbd_window_init)(AAC_RENAME(ff_aac_kbd_long_960), 4.0, 960); AAC_RENAME(ff_kbd_window_init)(AAC_RENAME(aac_kbd_long_960), 4.0, 960);
AAC_RENAME(ff_kbd_window_init)(AAC_RENAME(ff_aac_kbd_short_120), 6.0, 120); AAC_RENAME(ff_kbd_window_init)(AAC_RENAME(aac_kbd_short_120), 6.0, 120);
AAC_RENAME(ff_sine_window_init)(AAC_RENAME(ff_sine_960), 960); AAC_RENAME(ff_sine_window_init)(AAC_RENAME(sine_960), 960);
AAC_RENAME(ff_sine_window_init)(AAC_RENAME(ff_sine_120), 120); AAC_RENAME(ff_sine_window_init)(AAC_RENAME(sine_120), 120);
AAC_RENAME(ff_init_ff_sine_windows)(9);
ff_aac_float_common_init();
#else
AAC_RENAME(ff_kbd_window_init)(AAC_RENAME2(aac_kbd_long_1024), 4.0, 1024);
AAC_RENAME(ff_kbd_window_init)(AAC_RENAME2(aac_kbd_short_128), 6.0, 128);
init_sine_windows_fixed();
#endif #endif
AAC_RENAME(ff_init_ff_sine_windows)(10);
AAC_RENAME(ff_init_ff_sine_windows)( 9);
AAC_RENAME(ff_init_ff_sine_windows)( 7);
AAC_RENAME(ff_cbrt_tableinit)(); AAC_RENAME(ff_cbrt_tableinit)();
} }
@@ -1703,7 +1802,6 @@ static int decode_spectrum_and_dequant(AACContext *ac, INTFLOAT coef[1024],
#if !USE_FIXED #if !USE_FIXED
const float *vq = ff_aac_codebook_vector_vals[cbt_m1]; const float *vq = ff_aac_codebook_vector_vals[cbt_m1];
#endif /* !USE_FIXED */ #endif /* !USE_FIXED */
const uint16_t *cb_vector_idx = ff_aac_codebook_vector_idx[cbt_m1];
VLC_TYPE (*vlc_tab)[2] = vlc_spectral[cbt_m1].table; VLC_TYPE (*vlc_tab)[2] = vlc_spectral[cbt_m1].table;
OPEN_READER(re, gb); OPEN_READER(re, gb);
@@ -1719,7 +1817,7 @@ static int decode_spectrum_and_dequant(AACContext *ac, INTFLOAT coef[1024],
UPDATE_CACHE(re, gb); UPDATE_CACHE(re, gb);
GET_VLC(code, re, gb, vlc_tab, 8, 2); GET_VLC(code, re, gb, vlc_tab, 8, 2);
cb_idx = cb_vector_idx[code]; cb_idx = code;
#if USE_FIXED #if USE_FIXED
cf = DEC_SQUAD(cf, cb_idx); cf = DEC_SQUAD(cf, cb_idx);
#else #else
@@ -1742,7 +1840,7 @@ static int decode_spectrum_and_dequant(AACContext *ac, INTFLOAT coef[1024],
UPDATE_CACHE(re, gb); UPDATE_CACHE(re, gb);
GET_VLC(code, re, gb, vlc_tab, 8, 2); GET_VLC(code, re, gb, vlc_tab, 8, 2);
cb_idx = cb_vector_idx[code]; cb_idx = code;
nnz = cb_idx >> 8 & 15; nnz = cb_idx >> 8 & 15;
bits = nnz ? GET_CACHE(re, gb) : 0; bits = nnz ? GET_CACHE(re, gb) : 0;
LAST_SKIP_BITS(re, gb, nnz); LAST_SKIP_BITS(re, gb, nnz);
@@ -1766,7 +1864,7 @@ static int decode_spectrum_and_dequant(AACContext *ac, INTFLOAT coef[1024],
UPDATE_CACHE(re, gb); UPDATE_CACHE(re, gb);
GET_VLC(code, re, gb, vlc_tab, 8, 2); GET_VLC(code, re, gb, vlc_tab, 8, 2);
cb_idx = cb_vector_idx[code]; cb_idx = code;
#if USE_FIXED #if USE_FIXED
cf = DEC_SPAIR(cf, cb_idx); cf = DEC_SPAIR(cf, cb_idx);
#else #else
@@ -1790,7 +1888,7 @@ static int decode_spectrum_and_dequant(AACContext *ac, INTFLOAT coef[1024],
UPDATE_CACHE(re, gb); UPDATE_CACHE(re, gb);
GET_VLC(code, re, gb, vlc_tab, 8, 2); GET_VLC(code, re, gb, vlc_tab, 8, 2);
cb_idx = cb_vector_idx[code]; cb_idx = code;
nnz = cb_idx >> 8 & 15; nnz = cb_idx >> 8 & 15;
sign = nnz ? SHOW_UBITS(re, gb, nnz) << (cb_idx >> 12) : 0; sign = nnz ? SHOW_UBITS(re, gb, nnz) << (cb_idx >> 12) : 0;
LAST_SKIP_BITS(re, gb, nnz); LAST_SKIP_BITS(re, gb, nnz);
@@ -1823,14 +1921,14 @@ static int decode_spectrum_and_dequant(AACContext *ac, INTFLOAT coef[1024],
UPDATE_CACHE(re, gb); UPDATE_CACHE(re, gb);
GET_VLC(code, re, gb, vlc_tab, 8, 2); GET_VLC(code, re, gb, vlc_tab, 8, 2);
cb_idx = code;
if (!code) { if (cb_idx == 0x0000) {
*icf++ = 0; *icf++ = 0;
*icf++ = 0; *icf++ = 0;
continue; continue;
} }
cb_idx = cb_vector_idx[code];
nnz = cb_idx >> 12; nnz = cb_idx >> 12;
nzt = cb_idx >> 8; nzt = cb_idx >> 8;
bits = SHOW_UBITS(re, gb, nnz) << (32-nnz); bits = SHOW_UBITS(re, gb, nnz) << (32-nnz);
@@ -2548,10 +2646,10 @@ static void apply_tns(INTFLOAT coef_param[1024], TemporalNoiseShaping *tns,
static void windowing_and_mdct_ltp(AACContext *ac, INTFLOAT *out, static void windowing_and_mdct_ltp(AACContext *ac, INTFLOAT *out,
INTFLOAT *in, IndividualChannelStream *ics) INTFLOAT *in, IndividualChannelStream *ics)
{ {
const INTFLOAT *lwindow = ics->use_kb_window[0] ? AAC_RENAME(ff_aac_kbd_long_1024) : AAC_RENAME(ff_sine_1024); const INTFLOAT *lwindow = ics->use_kb_window[0] ? AAC_RENAME2(aac_kbd_long_1024) : AAC_RENAME2(sine_1024);
const INTFLOAT *swindow = ics->use_kb_window[0] ? AAC_RENAME(ff_aac_kbd_short_128) : AAC_RENAME(ff_sine_128); const INTFLOAT *swindow = ics->use_kb_window[0] ? AAC_RENAME2(aac_kbd_short_128) : AAC_RENAME2(sine_128);
const INTFLOAT *lwindow_prev = ics->use_kb_window[1] ? AAC_RENAME(ff_aac_kbd_long_1024) : AAC_RENAME(ff_sine_1024); const INTFLOAT *lwindow_prev = ics->use_kb_window[1] ? AAC_RENAME2(aac_kbd_long_1024) : AAC_RENAME2(sine_1024);
const INTFLOAT *swindow_prev = ics->use_kb_window[1] ? AAC_RENAME(ff_aac_kbd_short_128) : AAC_RENAME(ff_sine_128); const INTFLOAT *swindow_prev = ics->use_kb_window[1] ? AAC_RENAME2(aac_kbd_short_128) : AAC_RENAME2(sine_128);
if (ics->window_sequence[0] != LONG_STOP_SEQUENCE) { if (ics->window_sequence[0] != LONG_STOP_SEQUENCE) {
ac->fdsp->vector_fmul(in, in, lwindow_prev, 1024); ac->fdsp->vector_fmul(in, in, lwindow_prev, 1024);
@@ -2608,8 +2706,8 @@ static void update_ltp(AACContext *ac, SingleChannelElement *sce)
IndividualChannelStream *ics = &sce->ics; IndividualChannelStream *ics = &sce->ics;
INTFLOAT *saved = sce->saved; INTFLOAT *saved = sce->saved;
INTFLOAT *saved_ltp = sce->coeffs; INTFLOAT *saved_ltp = sce->coeffs;
const INTFLOAT *lwindow = ics->use_kb_window[0] ? AAC_RENAME(ff_aac_kbd_long_1024) : AAC_RENAME(ff_sine_1024); const INTFLOAT *lwindow = ics->use_kb_window[0] ? AAC_RENAME2(aac_kbd_long_1024) : AAC_RENAME2(sine_1024);
const INTFLOAT *swindow = ics->use_kb_window[0] ? AAC_RENAME(ff_aac_kbd_short_128) : AAC_RENAME(ff_sine_128); const INTFLOAT *swindow = ics->use_kb_window[0] ? AAC_RENAME2(aac_kbd_short_128) : AAC_RENAME2(sine_128);
int i; int i;
if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) { if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) {
@@ -2647,9 +2745,9 @@ static void imdct_and_windowing(AACContext *ac, SingleChannelElement *sce)
INTFLOAT *in = sce->coeffs; INTFLOAT *in = sce->coeffs;
INTFLOAT *out = sce->ret; INTFLOAT *out = sce->ret;
INTFLOAT *saved = sce->saved; INTFLOAT *saved = sce->saved;
const INTFLOAT *swindow = ics->use_kb_window[0] ? AAC_RENAME(ff_aac_kbd_short_128) : AAC_RENAME(ff_sine_128); const INTFLOAT *swindow = ics->use_kb_window[0] ? AAC_RENAME2(aac_kbd_short_128) : AAC_RENAME2(sine_128);
const INTFLOAT *lwindow_prev = ics->use_kb_window[1] ? AAC_RENAME(ff_aac_kbd_long_1024) : AAC_RENAME(ff_sine_1024); const INTFLOAT *lwindow_prev = ics->use_kb_window[1] ? AAC_RENAME2(aac_kbd_long_1024) : AAC_RENAME2(sine_1024);
const INTFLOAT *swindow_prev = ics->use_kb_window[1] ? AAC_RENAME(ff_aac_kbd_short_128) : AAC_RENAME(ff_sine_128); const INTFLOAT *swindow_prev = ics->use_kb_window[1] ? AAC_RENAME2(aac_kbd_short_128) : AAC_RENAME2(sine_128);
INTFLOAT *buf = ac->buf_mdct; INTFLOAT *buf = ac->buf_mdct;
INTFLOAT *temp = ac->temp; INTFLOAT *temp = ac->temp;
int i; int i;
@@ -2716,9 +2814,9 @@ static void imdct_and_windowing_960(AACContext *ac, SingleChannelElement *sce)
INTFLOAT *in = sce->coeffs; INTFLOAT *in = sce->coeffs;
INTFLOAT *out = sce->ret; INTFLOAT *out = sce->ret;
INTFLOAT *saved = sce->saved; INTFLOAT *saved = sce->saved;
const INTFLOAT *swindow = ics->use_kb_window[0] ? AAC_RENAME(ff_aac_kbd_short_120) : AAC_RENAME(ff_sine_120); const INTFLOAT *swindow = ics->use_kb_window[0] ? AAC_RENAME(aac_kbd_short_120) : AAC_RENAME(sine_120);
const INTFLOAT *lwindow_prev = ics->use_kb_window[1] ? AAC_RENAME(ff_aac_kbd_long_960) : AAC_RENAME(ff_sine_960); const INTFLOAT *lwindow_prev = ics->use_kb_window[1] ? AAC_RENAME(aac_kbd_long_960) : AAC_RENAME(sine_960);
const INTFLOAT *swindow_prev = ics->use_kb_window[1] ? AAC_RENAME(ff_aac_kbd_short_120) : AAC_RENAME(ff_sine_120); const INTFLOAT *swindow_prev = ics->use_kb_window[1] ? AAC_RENAME(aac_kbd_short_120) : AAC_RENAME(sine_120);
INTFLOAT *buf = ac->buf_mdct; INTFLOAT *buf = ac->buf_mdct;
INTFLOAT *temp = ac->temp; INTFLOAT *temp = ac->temp;
int i; int i;
@@ -2795,10 +2893,10 @@ static void imdct_and_windowing_ld(AACContext *ac, SingleChannelElement *sce)
if (ics->use_kb_window[1]) { if (ics->use_kb_window[1]) {
// AAC LD uses a low overlap sine window instead of a KBD window // AAC LD uses a low overlap sine window instead of a KBD window
memcpy(out, saved, 192 * sizeof(*out)); memcpy(out, saved, 192 * sizeof(*out));
ac->fdsp->vector_fmul_window(out + 192, saved + 192, buf, AAC_RENAME(ff_sine_128), 64); ac->fdsp->vector_fmul_window(out + 192, saved + 192, buf, AAC_RENAME2(sine_128), 64);
memcpy( out + 320, buf + 64, 192 * sizeof(*out)); memcpy( out + 320, buf + 64, 192 * sizeof(*out));
} else { } else {
ac->fdsp->vector_fmul_window(out, saved, buf, AAC_RENAME(ff_sine_512), 256); ac->fdsp->vector_fmul_window(out, saved, buf, AAC_RENAME2(sine_512), 256);
} }
// buffer update // buffer update
@@ -2807,7 +2905,7 @@ static void imdct_and_windowing_ld(AACContext *ac, SingleChannelElement *sce)
static void imdct_and_windowing_eld(AACContext *ac, SingleChannelElement *sce) static void imdct_and_windowing_eld(AACContext *ac, SingleChannelElement *sce)
{ {
INTFLOAT *in = sce->coeffs; UINTFLOAT *in = sce->coeffs;
INTFLOAT *out = sce->ret; INTFLOAT *out = sce->ret;
INTFLOAT *saved = sce->saved; INTFLOAT *saved = sce->saved;
INTFLOAT *buf = ac->buf_mdct; INTFLOAT *buf = ac->buf_mdct;
@@ -3118,7 +3216,8 @@ static int aac_decode_er_frame(AVCodecContext *avctx, void *data,
} }
static int aac_decode_frame_int(AVCodecContext *avctx, void *data, static int aac_decode_frame_int(AVCodecContext *avctx, void *data,
int *got_frame_ptr, GetBitContext *gb, AVPacket *avpkt) int *got_frame_ptr, GetBitContext *gb,
const AVPacket *avpkt)
{ {
AACContext *ac = avctx->priv_data; AACContext *ac = avctx->priv_data;
ChannelElement *che = NULL, *che_prev = NULL; ChannelElement *che = NULL, *che_prev = NULL;
@@ -3213,7 +3312,7 @@ static int aac_decode_frame_int(AVCodecContext *avctx, void *data,
break; break;
case TYPE_PCE: { case TYPE_PCE: {
uint8_t layout_map[MAX_ELEM_ID*4][3]; uint8_t layout_map[MAX_ELEM_ID*4][3] = {{0}};
int tags; int tags;
int pushed = push_output_configuration(ac); int pushed = push_output_configuration(ac);
@@ -3338,11 +3437,11 @@ static int aac_decode_frame(AVCodecContext *avctx, void *data,
int buf_consumed; int buf_consumed;
int buf_offset; int buf_offset;
int err; int err;
int new_extradata_size; buffer_size_t new_extradata_size;
const uint8_t *new_extradata = av_packet_get_side_data(avpkt, const uint8_t *new_extradata = av_packet_get_side_data(avpkt,
AV_PKT_DATA_NEW_EXTRADATA, AV_PKT_DATA_NEW_EXTRADATA,
&new_extradata_size); &new_extradata_size);
int jp_dualmono_size; buffer_size_t jp_dualmono_size;
const uint8_t *jp_dualmono = av_packet_get_side_data(avpkt, const uint8_t *jp_dualmono = av_packet_get_side_data(avpkt,
AV_PKT_DATA_JP_DUALMONO, AV_PKT_DATA_JP_DUALMONO,
&jp_dualmono_size); &jp_dualmono_size);
+21 -2
View File
@@ -35,9 +35,9 @@
#include <stdint.h> #include <stdint.h>
static const int8_t tags_per_config[16] = { 0, 1, 1, 2, 3, 3, 4, 5, 0, 0, 0, 4, 5, 0, 5, 0 }; static const int8_t tags_per_config[16] = { 0, 1, 1, 2, 3, 3, 4, 5, 0, 0, 0, 4, 5, 16, 5, 0 };
static const uint8_t aac_channel_layout_map[16][5][3] = { static const uint8_t aac_channel_layout_map[16][16][3] = {
{ { TYPE_SCE, 0, AAC_CHANNEL_FRONT }, }, { { TYPE_SCE, 0, AAC_CHANNEL_FRONT }, },
{ { TYPE_CPE, 0, AAC_CHANNEL_FRONT }, }, { { TYPE_CPE, 0, AAC_CHANNEL_FRONT }, },
{ { TYPE_SCE, 0, AAC_CHANNEL_FRONT }, { TYPE_CPE, 0, AAC_CHANNEL_FRONT }, }, { { TYPE_SCE, 0, AAC_CHANNEL_FRONT }, { TYPE_CPE, 0, AAC_CHANNEL_FRONT }, },
@@ -50,6 +50,24 @@ static const uint8_t aac_channel_layout_map[16][5][3] = {
{ { 0, } }, { { 0, } },
{ { TYPE_SCE, 0, AAC_CHANNEL_FRONT }, { TYPE_CPE, 0, AAC_CHANNEL_FRONT }, { TYPE_CPE, 1, AAC_CHANNEL_BACK }, { TYPE_SCE, 1, AAC_CHANNEL_BACK }, { TYPE_LFE, 0, AAC_CHANNEL_LFE }, }, { { TYPE_SCE, 0, AAC_CHANNEL_FRONT }, { TYPE_CPE, 0, AAC_CHANNEL_FRONT }, { TYPE_CPE, 1, AAC_CHANNEL_BACK }, { TYPE_SCE, 1, AAC_CHANNEL_BACK }, { TYPE_LFE, 0, AAC_CHANNEL_LFE }, },
{ { TYPE_SCE, 0, AAC_CHANNEL_FRONT }, { TYPE_CPE, 0, AAC_CHANNEL_FRONT }, { TYPE_CPE, 1, AAC_CHANNEL_SIDE }, { TYPE_CPE, 2, AAC_CHANNEL_BACK }, { TYPE_LFE, 0, AAC_CHANNEL_LFE }, }, { { TYPE_SCE, 0, AAC_CHANNEL_FRONT }, { TYPE_CPE, 0, AAC_CHANNEL_FRONT }, { TYPE_CPE, 1, AAC_CHANNEL_SIDE }, { TYPE_CPE, 2, AAC_CHANNEL_BACK }, { TYPE_LFE, 0, AAC_CHANNEL_LFE }, },
{
{ TYPE_SCE, 0, AAC_CHANNEL_FRONT }, // SCE1 = FC,
{ TYPE_CPE, 0, AAC_CHANNEL_FRONT }, // CPE1 = FLc and FRc,
{ TYPE_CPE, 1, AAC_CHANNEL_FRONT }, // CPE2 = FL and FR,
{ TYPE_CPE, 2, AAC_CHANNEL_SIDE }, // CPE3 = SiL and SiR,
{ TYPE_CPE, 3, AAC_CHANNEL_BACK }, // CPE4 = BL and BR,
{ TYPE_SCE, 1, AAC_CHANNEL_BACK }, // SCE2 = BC,
{ TYPE_LFE, 0, AAC_CHANNEL_LFE }, // LFE1 = LFE1,
{ TYPE_LFE, 1, AAC_CHANNEL_LFE }, // LFE2 = LFE2,
{ TYPE_SCE, 2, AAC_CHANNEL_FRONT }, // SCE3 = TpFC,
{ TYPE_CPE, 4, AAC_CHANNEL_FRONT }, // CPE5 = TpFL and TpFR,
{ TYPE_CPE, 5, AAC_CHANNEL_SIDE }, // CPE6 = TpSiL and TpSiR,
{ TYPE_SCE, 3, AAC_CHANNEL_FRONT }, // SCE4 = TpC,
{ TYPE_CPE, 6, AAC_CHANNEL_BACK }, // CPE7 = TpBL and TpBR,
{ TYPE_SCE, 4, AAC_CHANNEL_BACK }, // SCE5 = TpBC,
{ TYPE_SCE, 5, AAC_CHANNEL_FRONT }, // SCE6 = BtFC,
{ TYPE_CPE, 7, AAC_CHANNEL_FRONT }, // CPE8 = BtFL and BtFR
},
{ { 0, } }, { { 0, } },
/* TODO: Add 7+1 TOP configuration */ /* TODO: Add 7+1 TOP configuration */
}; };
@@ -67,6 +85,7 @@ static const uint64_t aac_channel_layout[16] = {
0, 0,
AV_CH_LAYOUT_6POINT1, AV_CH_LAYOUT_6POINT1,
AV_CH_LAYOUT_7POINT1, AV_CH_LAYOUT_7POINT1,
AV_CH_LAYOUT_22POINT2,
0, 0,
/* AV_CH_LAYOUT_7POINT1_TOP, */ /* AV_CH_LAYOUT_7POINT1_TOP, */
}; };
+13 -31
View File
@@ -30,14 +30,12 @@
***********************************/ ***********************************/
#include "libavutil/libm.h" #include "libavutil/libm.h"
#include "libavutil/thread.h"
#include "libavutil/float_dsp.h" #include "libavutil/float_dsp.h"
#include "libavutil/opt.h" #include "libavutil/opt.h"
#include "avcodec.h" #include "avcodec.h"
#include "put_bits.h" #include "put_bits.h"
#include "internal.h" #include "internal.h"
#include "mpeg4audio.h" #include "mpeg4audio.h"
#include "kbdwin.h"
#include "sinewin.h" #include "sinewin.h"
#include "profiles.h" #include "profiles.h"
@@ -49,8 +47,6 @@
#include "psymodel.h" #include "psymodel.h"
static AVOnce aac_table_init = AV_ONCE_INIT;
static void put_pce(PutBitContext *pb, AVCodecContext *avctx) static void put_pce(PutBitContext *pb, AVCodecContext *avctx)
{ {
int i, j; int i, j;
@@ -83,9 +79,9 @@ static void put_pce(PutBitContext *pb, AVCodecContext *avctx)
} }
} }
avpriv_align_put_bits(pb); align_put_bits(pb);
put_bits(pb, 8, strlen(aux_data)); put_bits(pb, 8, strlen(aux_data));
avpriv_put_string(pb, aux_data, 0); ff_put_string(pb, aux_data, 0);
} }
/** /**
@@ -522,7 +518,7 @@ static void put_bitstream_info(AACEncContext *s, const char *name)
put_bits(&s->pb, 8, namelen - 14); put_bits(&s->pb, 8, namelen - 14);
put_bits(&s->pb, 4, 0); //extension type - filler put_bits(&s->pb, 4, 0); //extension type - filler
padbits = -put_bits_count(&s->pb) & 7; padbits = -put_bits_count(&s->pb) & 7;
avpriv_align_put_bits(&s->pb); align_put_bits(&s->pb);
for (i = 0; i < namelen - 2; i++) for (i = 0; i < namelen - 2; i++)
put_bits(&s->pb, 8, name[i]); put_bits(&s->pb, 8, name[i]);
put_bits(&s->pb, 12 - padbits, 0); put_bits(&s->pb, 12 - padbits, 0);
@@ -925,10 +921,7 @@ static av_cold int dsp_init(AVCodecContext *avctx, AACEncContext *s)
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
// window init // window init
ff_kbd_window_init(ff_aac_kbd_long_1024, 4.0, 1024); ff_aac_float_common_init();
ff_kbd_window_init(ff_aac_kbd_short_128, 6.0, 128);
ff_init_ff_sine_windows(10);
ff_init_ff_sine_windows(7);
if ((ret = ff_mdct_init(&s->mdct1024, 11, 0, 32768.0)) < 0) if ((ret = ff_mdct_init(&s->mdct1024, 11, 0, 32768.0)) < 0)
return ret; return ret;
@@ -941,20 +934,14 @@ static av_cold int dsp_init(AVCodecContext *avctx, AACEncContext *s)
static av_cold int alloc_buffers(AVCodecContext *avctx, AACEncContext *s) static av_cold int alloc_buffers(AVCodecContext *avctx, AACEncContext *s)
{ {
int ch; int ch;
FF_ALLOCZ_ARRAY_OR_GOTO(avctx, s->buffer.samples, s->channels, 3 * 1024 * sizeof(s->buffer.samples[0]), alloc_fail); if (!FF_ALLOCZ_TYPED_ARRAY(s->buffer.samples, s->channels * 3 * 1024) ||
FF_ALLOCZ_ARRAY_OR_GOTO(avctx, s->cpe, s->chan_map[0], sizeof(ChannelElement), alloc_fail); !FF_ALLOCZ_TYPED_ARRAY(s->cpe, s->chan_map[0]))
return AVERROR(ENOMEM);
for(ch = 0; ch < s->channels; ch++) for(ch = 0; ch < s->channels; ch++)
s->planar_samples[ch] = s->buffer.samples + 3 * 1024 * ch; s->planar_samples[ch] = s->buffer.samples + 3 * 1024 * ch;
return 0; return 0;
alloc_fail:
return AVERROR(ENOMEM);
}
static av_cold void aac_encode_init_tables(void)
{
ff_aac_tableinit();
} }
static av_cold int aac_encode_init(AVCodecContext *avctx) static av_cold int aac_encode_init(AVCodecContext *avctx)
@@ -1078,13 +1065,13 @@ static av_cold int aac_encode_init(AVCodecContext *avctx)
s->options.mid_side = 0; s->options.mid_side = 0;
if ((ret = dsp_init(avctx, s)) < 0) if ((ret = dsp_init(avctx, s)) < 0)
goto fail; return ret;
if ((ret = alloc_buffers(avctx, s)) < 0) if ((ret = alloc_buffers(avctx, s)) < 0)
goto fail; return ret;
if ((ret = put_audio_specific_config(avctx))) if ((ret = put_audio_specific_config(avctx)))
goto fail; return ret;
sizes[0] = ff_aac_swb_size_1024[s->samplerate_index]; sizes[0] = ff_aac_swb_size_1024[s->samplerate_index];
sizes[1] = ff_aac_swb_size_128[s->samplerate_index]; sizes[1] = ff_aac_swb_size_128[s->samplerate_index];
@@ -1094,7 +1081,7 @@ static av_cold int aac_encode_init(AVCodecContext *avctx)
grouping[i] = s->chan_map[i + 1] == TYPE_CPE; grouping[i] = s->chan_map[i + 1] == TYPE_CPE;
if ((ret = ff_psy_init(&s->psy, avctx, 2, sizes, lengths, if ((ret = ff_psy_init(&s->psy, avctx, 2, sizes, lengths,
s->chan_map[0], grouping)) < 0) s->chan_map[0], grouping)) < 0)
goto fail; return ret;
s->psypp = ff_psy_preprocess_init(avctx); s->psypp = ff_psy_preprocess_init(avctx);
ff_lpc_init(&s->lpc, 2*avctx->frame_size, TNS_MAX_ORDER, FF_LPC_TYPE_LEVINSON); ff_lpc_init(&s->lpc, 2*avctx->frame_size, TNS_MAX_ORDER, FF_LPC_TYPE_LEVINSON);
s->random_state = 0x1f2e3d4c; s->random_state = 0x1f2e3d4c;
@@ -1108,15 +1095,10 @@ static av_cold int aac_encode_init(AVCodecContext *avctx)
if (HAVE_MIPSDSP) if (HAVE_MIPSDSP)
ff_aac_coder_init_mips(s); ff_aac_coder_init_mips(s);
if ((ret = ff_thread_once(&aac_table_init, &aac_encode_init_tables)) != 0)
return AVERROR_UNKNOWN;
ff_af_queue_init(avctx, &s->afq); ff_af_queue_init(avctx, &s->afq);
ff_aac_tableinit();
return 0; return 0;
fail:
aac_encode_end(avctx);
return ret;
} }
#define AACENC_FLAGS AV_OPT_FLAG_ENCODING_PARAM | AV_OPT_FLAG_AUDIO_PARAM #define AACENC_FLAGS AV_OPT_FLAG_ENCODING_PARAM | AV_OPT_FLAG_AUDIO_PARAM
@@ -1159,7 +1141,7 @@ AVCodec ff_aac_encoder = {
.close = aac_encode_end, .close = aac_encode_end,
.defaults = aac_encode_defaults, .defaults = aac_encode_defaults,
.supported_samplerates = mpeg4audio_sample_rates, .supported_samplerates = mpeg4audio_sample_rates,
.caps_internal = FF_CODEC_CAP_INIT_THREADSAFE, .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP,
.capabilities = AV_CODEC_CAP_SMALL_LAST_FRAME | AV_CODEC_CAP_DELAY, .capabilities = AV_CODEC_CAP_SMALL_LAST_FRAME | AV_CODEC_CAP_DELAY,
.sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_FLTP, .sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_FLTP,
AV_SAMPLE_FMT_NONE }, AV_SAMPLE_FMT_NONE },
+2
View File
@@ -23,6 +23,8 @@
#define AVCODEC_AACENC_H #define AVCODEC_AACENC_H
#include "libavutil/float_dsp.h" #include "libavutil/float_dsp.h"
#include "libavutil/mem_internal.h"
#include "avcodec.h" #include "avcodec.h"
#include "put_bits.h" #include "put_bits.h"
+2 -2
View File
@@ -88,7 +88,7 @@ static const uint8_t swb_size_1024_8[] = {
32, 36, 36, 40, 44, 48, 52, 56, 60, 64, 80 32, 36, 36, 40, 44, 48, 52, 56, 60, 64, 80
}; };
const uint8_t *ff_aac_swb_size_128[] = { const uint8_t *const ff_aac_swb_size_128[] = {
swb_size_128_96, swb_size_128_96, swb_size_128_64, swb_size_128_96, swb_size_128_96, swb_size_128_64,
swb_size_128_48, swb_size_128_48, swb_size_128_48, swb_size_128_48, swb_size_128_48, swb_size_128_48,
swb_size_128_24, swb_size_128_24, swb_size_128_16, swb_size_128_24, swb_size_128_24, swb_size_128_16,
@@ -96,7 +96,7 @@ const uint8_t *ff_aac_swb_size_128[] = {
swb_size_128_8 swb_size_128_8
}; };
const uint8_t *ff_aac_swb_size_1024[] = { const uint8_t *const ff_aac_swb_size_1024[] = {
swb_size_1024_96, swb_size_1024_96, swb_size_1024_64, swb_size_1024_96, swb_size_1024_96, swb_size_1024_64,
swb_size_1024_48, swb_size_1024_48, swb_size_1024_32, swb_size_1024_48, swb_size_1024_48, swb_size_1024_32,
swb_size_1024_24, swb_size_1024_24, swb_size_1024_16, swb_size_1024_24, swb_size_1024_24, swb_size_1024_16,
+2 -2
View File
@@ -38,9 +38,9 @@
#define AAC_MAX_CHANNELS 16 #define AAC_MAX_CHANNELS 16
extern const uint8_t *ff_aac_swb_size_1024[]; extern const uint8_t *const ff_aac_swb_size_1024[];
extern const int ff_aac_swb_size_1024_len; extern const int ff_aac_swb_size_1024_len;
extern const uint8_t *ff_aac_swb_size_128[]; extern const uint8_t *const ff_aac_swb_size_128[];
extern const int ff_aac_swb_size_128_len; extern const int ff_aac_swb_size_128_len;
/* Supported layouts without using a PCE */ /* Supported layouts without using a PCE */
+43 -341
View File
@@ -25,8 +25,8 @@
#include <stdint.h> #include <stdint.h>
#include "libavutil/common.h" #include "libavutil/common.h"
#include "libavutil/mathematics.h" #include "libavutil/mathematics.h"
#include "libavutil/mem_internal.h"
#include "avcodec.h" #include "avcodec.h"
#include "get_bits.h"
#include "aacps.h" #include "aacps.h"
#if USE_FIXED #if USE_FIXED
#include "aacps_fixed_tablegen.h" #include "aacps_fixed_tablegen.h"
@@ -34,118 +34,12 @@
#include "libavutil/internal.h" #include "libavutil/internal.h"
#include "aacps_tablegen.h" #include "aacps_tablegen.h"
#endif /* USE_FIXED */ #endif /* USE_FIXED */
#include "aacpsdata.c"
#define PS_BASELINE 0 ///< Operate in Baseline PS mode static const INTFLOAT g1_Q2[] = {
///< Baseline implies 10 or 20 stereo bands, Q31(0.0f), Q31(0.01899487526049f), Q31(0.0f), Q31(-0.07293139167538f),
///< mixing mode A, and no ipd/opd Q31(0.0f), Q31(0.30596630545168f), Q31(0.5f)
#define numQMFSlots 32 //numTimeSlots * RATE
static const int8_t num_env_tab[2][4] = {
{ 0, 1, 2, 4, },
{ 1, 2, 3, 4, },
}; };
static const int8_t nr_iidicc_par_tab[] = {
10, 20, 34, 10, 20, 34,
};
static const int8_t nr_iidopd_par_tab[] = {
5, 11, 17, 5, 11, 17,
};
enum {
huff_iid_df1,
huff_iid_dt1,
huff_iid_df0,
huff_iid_dt0,
huff_icc_df,
huff_icc_dt,
huff_ipd_df,
huff_ipd_dt,
huff_opd_df,
huff_opd_dt,
};
static const int huff_iid[] = {
huff_iid_df0,
huff_iid_df1,
huff_iid_dt0,
huff_iid_dt1,
};
static VLC vlc_ps[10];
#define READ_PAR_DATA(PAR, OFFSET, MASK, ERR_CONDITION) \
/** \
* Read Inter-channel Intensity Difference/Inter-Channel Coherence/ \
* Inter-channel Phase Difference/Overall Phase Difference parameters from the \
* bitstream. \
* \
* @param avctx contains the current codec context \
* @param gb pointer to the input bitstream \
* @param ps pointer to the Parametric Stereo context \
* @param PAR pointer to the parameter to be read \
* @param e envelope to decode \
* @param dt 1: time delta-coded, 0: frequency delta-coded \
*/ \
static int read_ ## PAR ## _data(AVCodecContext *avctx, GetBitContext *gb, PSContext *ps, \
int8_t (*PAR)[PS_MAX_NR_IIDICC], int table_idx, int e, int dt) \
{ \
int b, num = ps->nr_ ## PAR ## _par; \
VLC_TYPE (*vlc_table)[2] = vlc_ps[table_idx].table; \
if (dt) { \
int e_prev = e ? e - 1 : ps->num_env_old - 1; \
e_prev = FFMAX(e_prev, 0); \
for (b = 0; b < num; b++) { \
int val = PAR[e_prev][b] + get_vlc2(gb, vlc_table, 9, 3) - OFFSET; \
if (MASK) val &= MASK; \
PAR[e][b] = val; \
if (ERR_CONDITION) \
goto err; \
} \
} else { \
int val = 0; \
for (b = 0; b < num; b++) { \
val += get_vlc2(gb, vlc_table, 9, 3) - OFFSET; \
if (MASK) val &= MASK; \
PAR[e][b] = val; \
if (ERR_CONDITION) \
goto err; \
} \
} \
return 0; \
err: \
av_log(avctx, AV_LOG_ERROR, "illegal "#PAR"\n"); \
return AVERROR_INVALIDDATA; \
}
READ_PAR_DATA(iid, huff_offset[table_idx], 0, FFABS(ps->iid_par[e][b]) > 7 + 8 * ps->iid_quant)
READ_PAR_DATA(icc, huff_offset[table_idx], 0, ps->icc_par[e][b] > 7U)
READ_PAR_DATA(ipdopd, 0, 0x07, 0)
static int ps_read_extension_data(GetBitContext *gb, PSContext *ps, int ps_extension_id)
{
int e;
int count = get_bits_count(gb);
if (ps_extension_id)
return 0;
ps->enable_ipdopd = get_bits1(gb);
if (ps->enable_ipdopd) {
for (e = 0; e < ps->num_env; e++) {
int dt = get_bits1(gb);
read_ipdopd_data(NULL, gb, ps, ps->ipd_par, dt ? huff_ipd_dt : huff_ipd_df, e, dt);
dt = get_bits1(gb);
read_ipdopd_data(NULL, gb, ps, ps->opd_par, dt ? huff_opd_dt : huff_opd_df, e, dt);
}
}
skip_bits1(gb); //reserved_ps
return get_bits_count(gb) - count;
}
static void ipdopd_reset(int8_t *ipd_hist, int8_t *opd_hist) static void ipdopd_reset(int8_t *ipd_hist, int8_t *opd_hist)
{ {
int i; int i;
@@ -155,163 +49,6 @@ static void ipdopd_reset(int8_t *ipd_hist, int8_t *opd_hist)
} }
} }
int AAC_RENAME(ff_ps_read_data)(AVCodecContext *avctx, GetBitContext *gb_host, PSContext *ps, int bits_left)
{
int e;
int bit_count_start = get_bits_count(gb_host);
int header;
int bits_consumed;
GetBitContext gbc = *gb_host, *gb = &gbc;
header = get_bits1(gb);
if (header) { //enable_ps_header
ps->enable_iid = get_bits1(gb);
if (ps->enable_iid) {
int iid_mode = get_bits(gb, 3);
if (iid_mode > 5) {
av_log(avctx, AV_LOG_ERROR, "iid_mode %d is reserved.\n",
iid_mode);
goto err;
}
ps->nr_iid_par = nr_iidicc_par_tab[iid_mode];
ps->iid_quant = iid_mode > 2;
ps->nr_ipdopd_par = nr_iidopd_par_tab[iid_mode];
}
ps->enable_icc = get_bits1(gb);
if (ps->enable_icc) {
ps->icc_mode = get_bits(gb, 3);
if (ps->icc_mode > 5) {
av_log(avctx, AV_LOG_ERROR, "icc_mode %d is reserved.\n",
ps->icc_mode);
goto err;
}
ps->nr_icc_par = nr_iidicc_par_tab[ps->icc_mode];
}
ps->enable_ext = get_bits1(gb);
}
ps->frame_class = get_bits1(gb);
ps->num_env_old = ps->num_env;
ps->num_env = num_env_tab[ps->frame_class][get_bits(gb, 2)];
ps->border_position[0] = -1;
if (ps->frame_class) {
for (e = 1; e <= ps->num_env; e++) {
ps->border_position[e] = get_bits(gb, 5);
if (ps->border_position[e] < ps->border_position[e-1]) {
av_log(avctx, AV_LOG_ERROR, "border_position non monotone.\n");
goto err;
}
}
} else
for (e = 1; e <= ps->num_env; e++)
ps->border_position[e] = (e * numQMFSlots >> ff_log2_tab[ps->num_env]) - 1;
if (ps->enable_iid) {
for (e = 0; e < ps->num_env; e++) {
int dt = get_bits1(gb);
if (read_iid_data(avctx, gb, ps, ps->iid_par, huff_iid[2*dt+ps->iid_quant], e, dt))
goto err;
}
} else
memset(ps->iid_par, 0, sizeof(ps->iid_par));
if (ps->enable_icc)
for (e = 0; e < ps->num_env; e++) {
int dt = get_bits1(gb);
if (read_icc_data(avctx, gb, ps, ps->icc_par, dt ? huff_icc_dt : huff_icc_df, e, dt))
goto err;
}
else
memset(ps->icc_par, 0, sizeof(ps->icc_par));
if (ps->enable_ext) {
int cnt = get_bits(gb, 4);
if (cnt == 15) {
cnt += get_bits(gb, 8);
}
cnt *= 8;
while (cnt > 7) {
int ps_extension_id = get_bits(gb, 2);
cnt -= 2 + ps_read_extension_data(gb, ps, ps_extension_id);
}
if (cnt < 0) {
av_log(avctx, AV_LOG_ERROR, "ps extension overflow %d\n", cnt);
goto err;
}
skip_bits(gb, cnt);
}
ps->enable_ipdopd &= !PS_BASELINE;
//Fix up envelopes
if (!ps->num_env || ps->border_position[ps->num_env] < numQMFSlots - 1) {
//Create a fake envelope
int source = ps->num_env ? ps->num_env - 1 : ps->num_env_old - 1;
int b;
if (source >= 0 && source != ps->num_env) {
if (ps->enable_iid) {
memcpy(ps->iid_par+ps->num_env, ps->iid_par+source, sizeof(ps->iid_par[0]));
}
if (ps->enable_icc) {
memcpy(ps->icc_par+ps->num_env, ps->icc_par+source, sizeof(ps->icc_par[0]));
}
if (ps->enable_ipdopd) {
memcpy(ps->ipd_par+ps->num_env, ps->ipd_par+source, sizeof(ps->ipd_par[0]));
memcpy(ps->opd_par+ps->num_env, ps->opd_par+source, sizeof(ps->opd_par[0]));
}
}
if (ps->enable_iid){
for (b = 0; b < ps->nr_iid_par; b++) {
if (FFABS(ps->iid_par[ps->num_env][b]) > 7 + 8 * ps->iid_quant) {
av_log(avctx, AV_LOG_ERROR, "iid_par invalid\n");
goto err;
}
}
}
if (ps->enable_icc){
for (b = 0; b < ps->nr_iid_par; b++) {
if (ps->icc_par[ps->num_env][b] > 7U) {
av_log(avctx, AV_LOG_ERROR, "icc_par invalid\n");
goto err;
}
}
}
ps->num_env++;
ps->border_position[ps->num_env] = numQMFSlots - 1;
}
ps->is34bands_old = ps->is34bands;
if (!PS_BASELINE && (ps->enable_iid || ps->enable_icc))
ps->is34bands = (ps->enable_iid && ps->nr_iid_par == 34) ||
(ps->enable_icc && ps->nr_icc_par == 34);
//Baseline
if (!ps->enable_ipdopd) {
memset(ps->ipd_par, 0, sizeof(ps->ipd_par));
memset(ps->opd_par, 0, sizeof(ps->opd_par));
}
if (header)
ps->start = 1;
bits_consumed = get_bits_count(gb) - bit_count_start;
if (bits_consumed <= bits_left) {
skip_bits_long(gb_host, bits_consumed);
return bits_consumed;
}
av_log(avctx, AV_LOG_ERROR, "Expected to read %d PS bits actually read %d.\n", bits_left, bits_consumed);
err:
ps->start = 0;
skip_bits_long(gb_host, bits_left);
memset(ps->iid_par, 0, sizeof(ps->iid_par));
memset(ps->icc_par, 0, sizeof(ps->icc_par));
memset(ps->ipd_par, 0, sizeof(ps->ipd_par));
memset(ps->opd_par, 0, sizeof(ps->opd_par));
return bits_left;
}
/** Split one subband into 2 subsubbands with a symmetric real filter. /** Split one subband into 2 subsubbands with a symmetric real filter.
* The filter must have its non-center even coefficients equal to zero. */ * The filter must have its non-center even coefficients equal to zero. */
static void hybrid2_re(INTFLOAT (*in)[2], INTFLOAT (*out)[32][2], const INTFLOAT filter[8], int len, int reverse) static void hybrid2_re(INTFLOAT (*in)[2], INTFLOAT (*out)[32][2], const INTFLOAT filter[8], int len, int reverse)
@@ -672,14 +409,14 @@ static void decorrelation(PSContext *ps, INTFLOAT (*out)[32][2], const INTFLOAT
const float transient_impact = 1.5f; const float transient_impact = 1.5f;
const float a_smooth = 0.25f; ///< Smoothing coefficient const float a_smooth = 0.25f; ///< Smoothing coefficient
#endif /* USE_FIXED */ #endif /* USE_FIXED */
const int8_t *k_to_i = is34 ? k_to_i_34 : k_to_i_20; const int8_t *const k_to_i = is34 ? ff_k_to_i_34 : ff_k_to_i_20;
int i, k, m, n; int i, k, m, n;
int n0 = 0, nL = 32; int n0 = 0, nL = 32;
const INTFLOAT peak_decay_factor = Q31(0.76592833836465f); const INTFLOAT peak_decay_factor = Q31(0.76592833836465f);
memset(power, 0, 34 * sizeof(*power)); memset(power, 0, 34 * sizeof(*power));
if (is34 != ps->is34bands_old) { if (is34 != ps->common.is34bands_old) {
memset(ps->peak_decay_nrg, 0, sizeof(ps->peak_decay_nrg)); memset(ps->peak_decay_nrg, 0, sizeof(ps->peak_decay_nrg));
memset(ps->power_smooth, 0, sizeof(ps->power_smooth)); memset(ps->power_smooth, 0, sizeof(ps->power_smooth));
memset(ps->peak_decay_diff_smooth, 0, sizeof(ps->peak_decay_diff_smooth)); memset(ps->peak_decay_diff_smooth, 0, sizeof(ps->peak_decay_diff_smooth));
@@ -821,6 +558,7 @@ static void stereo_processing(PSContext *ps, INTFLOAT (*l)[32][2], INTFLOAT (*r)
{ {
int e, b, k; int e, b, k;
PSCommonContext *const ps2 = &ps->common;
INTFLOAT (*H11)[PS_MAX_NUM_ENV+1][PS_MAX_NR_IIDICC] = ps->H11; INTFLOAT (*H11)[PS_MAX_NUM_ENV+1][PS_MAX_NR_IIDICC] = ps->H11;
INTFLOAT (*H12)[PS_MAX_NUM_ENV+1][PS_MAX_NR_IIDICC] = ps->H12; INTFLOAT (*H12)[PS_MAX_NUM_ENV+1][PS_MAX_NR_IIDICC] = ps->H12;
INTFLOAT (*H21)[PS_MAX_NUM_ENV+1][PS_MAX_NR_IIDICC] = ps->H21; INTFLOAT (*H21)[PS_MAX_NUM_ENV+1][PS_MAX_NR_IIDICC] = ps->H21;
@@ -835,29 +573,29 @@ static void stereo_processing(PSContext *ps, INTFLOAT (*l)[32][2], INTFLOAT (*r)
int8_t (*icc_mapped)[PS_MAX_NR_IIDICC] = icc_mapped_buf; int8_t (*icc_mapped)[PS_MAX_NR_IIDICC] = icc_mapped_buf;
int8_t (*ipd_mapped)[PS_MAX_NR_IIDICC] = ipd_mapped_buf; int8_t (*ipd_mapped)[PS_MAX_NR_IIDICC] = ipd_mapped_buf;
int8_t (*opd_mapped)[PS_MAX_NR_IIDICC] = opd_mapped_buf; int8_t (*opd_mapped)[PS_MAX_NR_IIDICC] = opd_mapped_buf;
const int8_t *k_to_i = is34 ? k_to_i_34 : k_to_i_20; const int8_t *const k_to_i = is34 ? ff_k_to_i_34 : ff_k_to_i_20;
TABLE_CONST INTFLOAT (*H_LUT)[8][4] = (PS_BASELINE || ps->icc_mode < 3) ? HA : HB; TABLE_CONST INTFLOAT (*H_LUT)[8][4] = (PS_BASELINE || ps2->icc_mode < 3) ? HA : HB;
//Remapping //Remapping
if (ps->num_env_old) { if (ps2->num_env_old) {
memcpy(H11[0][0], H11[0][ps->num_env_old], PS_MAX_NR_IIDICC*sizeof(H11[0][0][0])); memcpy(H11[0][0], H11[0][ps2->num_env_old], sizeof(H11[0][0]));
memcpy(H11[1][0], H11[1][ps->num_env_old], PS_MAX_NR_IIDICC*sizeof(H11[1][0][0])); memcpy(H11[1][0], H11[1][ps2->num_env_old], sizeof(H11[1][0]));
memcpy(H12[0][0], H12[0][ps->num_env_old], PS_MAX_NR_IIDICC*sizeof(H12[0][0][0])); memcpy(H12[0][0], H12[0][ps2->num_env_old], sizeof(H12[0][0]));
memcpy(H12[1][0], H12[1][ps->num_env_old], PS_MAX_NR_IIDICC*sizeof(H12[1][0][0])); memcpy(H12[1][0], H12[1][ps2->num_env_old], sizeof(H12[1][0]));
memcpy(H21[0][0], H21[0][ps->num_env_old], PS_MAX_NR_IIDICC*sizeof(H21[0][0][0])); memcpy(H21[0][0], H21[0][ps2->num_env_old], sizeof(H21[0][0]));
memcpy(H21[1][0], H21[1][ps->num_env_old], PS_MAX_NR_IIDICC*sizeof(H21[1][0][0])); memcpy(H21[1][0], H21[1][ps2->num_env_old], sizeof(H21[1][0]));
memcpy(H22[0][0], H22[0][ps->num_env_old], PS_MAX_NR_IIDICC*sizeof(H22[0][0][0])); memcpy(H22[0][0], H22[0][ps2->num_env_old], sizeof(H22[0][0]));
memcpy(H22[1][0], H22[1][ps->num_env_old], PS_MAX_NR_IIDICC*sizeof(H22[1][0][0])); memcpy(H22[1][0], H22[1][ps2->num_env_old], sizeof(H22[1][0]));
} }
if (is34) { if (is34) {
remap34(&iid_mapped, ps->iid_par, ps->nr_iid_par, ps->num_env, 1); remap34(&iid_mapped, ps2->iid_par, ps2->nr_iid_par, ps2->num_env, 1);
remap34(&icc_mapped, ps->icc_par, ps->nr_icc_par, ps->num_env, 1); remap34(&icc_mapped, ps2->icc_par, ps2->nr_icc_par, ps2->num_env, 1);
if (ps->enable_ipdopd) { if (ps2->enable_ipdopd) {
remap34(&ipd_mapped, ps->ipd_par, ps->nr_ipdopd_par, ps->num_env, 0); remap34(&ipd_mapped, ps2->ipd_par, ps2->nr_ipdopd_par, ps2->num_env, 0);
remap34(&opd_mapped, ps->opd_par, ps->nr_ipdopd_par, ps->num_env, 0); remap34(&opd_mapped, ps2->opd_par, ps2->nr_ipdopd_par, ps2->num_env, 0);
} }
if (!ps->is34bands_old) { if (!ps2->is34bands_old) {
map_val_20_to_34(H11[0][0]); map_val_20_to_34(H11[0][0]);
map_val_20_to_34(H11[1][0]); map_val_20_to_34(H11[1][0]);
map_val_20_to_34(H12[0][0]); map_val_20_to_34(H12[0][0]);
@@ -869,13 +607,13 @@ static void stereo_processing(PSContext *ps, INTFLOAT (*l)[32][2], INTFLOAT (*r)
ipdopd_reset(ipd_hist, opd_hist); ipdopd_reset(ipd_hist, opd_hist);
} }
} else { } else {
remap20(&iid_mapped, ps->iid_par, ps->nr_iid_par, ps->num_env, 1); remap20(&iid_mapped, ps2->iid_par, ps2->nr_iid_par, ps2->num_env, 1);
remap20(&icc_mapped, ps->icc_par, ps->nr_icc_par, ps->num_env, 1); remap20(&icc_mapped, ps2->icc_par, ps2->nr_icc_par, ps2->num_env, 1);
if (ps->enable_ipdopd) { if (ps2->enable_ipdopd) {
remap20(&ipd_mapped, ps->ipd_par, ps->nr_ipdopd_par, ps->num_env, 0); remap20(&ipd_mapped, ps2->ipd_par, ps2->nr_ipdopd_par, ps2->num_env, 0);
remap20(&opd_mapped, ps->opd_par, ps->nr_ipdopd_par, ps->num_env, 0); remap20(&opd_mapped, ps2->opd_par, ps2->nr_ipdopd_par, ps2->num_env, 0);
} }
if (ps->is34bands_old) { if (ps2->is34bands_old) {
map_val_34_to_20(H11[0][0]); map_val_34_to_20(H11[0][0]);
map_val_34_to_20(H11[1][0]); map_val_34_to_20(H11[1][0]);
map_val_34_to_20(H12[0][0]); map_val_34_to_20(H12[0][0]);
@@ -889,15 +627,15 @@ static void stereo_processing(PSContext *ps, INTFLOAT (*l)[32][2], INTFLOAT (*r)
} }
//Mixing //Mixing
for (e = 0; e < ps->num_env; e++) { for (e = 0; e < ps2->num_env; e++) {
for (b = 0; b < NR_PAR_BANDS[is34]; b++) { for (b = 0; b < NR_PAR_BANDS[is34]; b++) {
INTFLOAT h11, h12, h21, h22; INTFLOAT h11, h12, h21, h22;
h11 = H_LUT[iid_mapped[e][b] + 7 + 23 * ps->iid_quant][icc_mapped[e][b]][0]; h11 = H_LUT[iid_mapped[e][b] + 7 + 23 * ps2->iid_quant][icc_mapped[e][b]][0];
h12 = H_LUT[iid_mapped[e][b] + 7 + 23 * ps->iid_quant][icc_mapped[e][b]][1]; h12 = H_LUT[iid_mapped[e][b] + 7 + 23 * ps2->iid_quant][icc_mapped[e][b]][1];
h21 = H_LUT[iid_mapped[e][b] + 7 + 23 * ps->iid_quant][icc_mapped[e][b]][2]; h21 = H_LUT[iid_mapped[e][b] + 7 + 23 * ps2->iid_quant][icc_mapped[e][b]][2];
h22 = H_LUT[iid_mapped[e][b] + 7 + 23 * ps->iid_quant][icc_mapped[e][b]][3]; h22 = H_LUT[iid_mapped[e][b] + 7 + 23 * ps2->iid_quant][icc_mapped[e][b]][3];
if (!PS_BASELINE && ps->enable_ipdopd && b < NR_IPDOPD_BANDS[is34]) { if (!PS_BASELINE && ps2->enable_ipdopd && b < NR_IPDOPD_BANDS[is34]) {
//The spec say says to only run this smoother when enable_ipdopd //The spec say says to only run this smoother when enable_ipdopd
//is set but the reference decoder appears to run it constantly //is set but the reference decoder appears to run it constantly
INTFLOAT h11i, h12i, h21i, h22i; INTFLOAT h11i, h12i, h21i, h22i;
@@ -934,8 +672,8 @@ static void stereo_processing(PSContext *ps, INTFLOAT (*l)[32][2], INTFLOAT (*r)
for (k = 0; k < NR_BANDS[is34]; k++) { for (k = 0; k < NR_BANDS[is34]; k++) {
LOCAL_ALIGNED_16(INTFLOAT, h, [2], [4]); LOCAL_ALIGNED_16(INTFLOAT, h, [2], [4]);
LOCAL_ALIGNED_16(INTFLOAT, h_step, [2], [4]); LOCAL_ALIGNED_16(INTFLOAT, h_step, [2], [4]);
int start = ps->border_position[e]; int start = ps2->border_position[e];
int stop = ps->border_position[e+1]; int stop = ps2->border_position[e+1];
INTFLOAT width = Q30(1.f) / ((stop - start) ? (stop - start) : 1); INTFLOAT width = Q30(1.f) / ((stop - start) ? (stop - start) : 1);
#if USE_FIXED #if USE_FIXED
width = FFMIN(2U*width, INT_MAX); width = FFMIN(2U*width, INT_MAX);
@@ -945,7 +683,7 @@ static void stereo_processing(PSContext *ps, INTFLOAT (*l)[32][2], INTFLOAT (*r)
h[0][1] = H12[0][e][b]; h[0][1] = H12[0][e][b];
h[0][2] = H21[0][e][b]; h[0][2] = H21[0][e][b];
h[0][3] = H22[0][e][b]; h[0][3] = H22[0][e][b];
if (!PS_BASELINE && ps->enable_ipdopd) { if (!PS_BASELINE && ps2->enable_ipdopd) {
//Is this necessary? ps_04_new seems unchanged //Is this necessary? ps_04_new seems unchanged
if ((is34 && k <= 13 && k >= 9) || (!is34 && k <= 1)) { if ((is34 && k <= 13 && k >= 9) || (!is34 && k <= 1)) {
h[1][0] = -H11[1][e][b]; h[1][0] = -H11[1][e][b];
@@ -964,14 +702,14 @@ static void stereo_processing(PSContext *ps, INTFLOAT (*l)[32][2], INTFLOAT (*r)
h_step[0][1] = AAC_MSUB31_V3(H12[0][e+1][b], h[0][1], width); h_step[0][1] = AAC_MSUB31_V3(H12[0][e+1][b], h[0][1], width);
h_step[0][2] = AAC_MSUB31_V3(H21[0][e+1][b], h[0][2], width); h_step[0][2] = AAC_MSUB31_V3(H21[0][e+1][b], h[0][2], width);
h_step[0][3] = AAC_MSUB31_V3(H22[0][e+1][b], h[0][3], width); h_step[0][3] = AAC_MSUB31_V3(H22[0][e+1][b], h[0][3], width);
if (!PS_BASELINE && ps->enable_ipdopd) { if (!PS_BASELINE && ps2->enable_ipdopd) {
h_step[1][0] = AAC_MSUB31_V3(H11[1][e+1][b], h[1][0], width); h_step[1][0] = AAC_MSUB31_V3(H11[1][e+1][b], h[1][0], width);
h_step[1][1] = AAC_MSUB31_V3(H12[1][e+1][b], h[1][1], width); h_step[1][1] = AAC_MSUB31_V3(H12[1][e+1][b], h[1][1], width);
h_step[1][2] = AAC_MSUB31_V3(H21[1][e+1][b], h[1][2], width); h_step[1][2] = AAC_MSUB31_V3(H21[1][e+1][b], h[1][2], width);
h_step[1][3] = AAC_MSUB31_V3(H22[1][e+1][b], h[1][3], width); h_step[1][3] = AAC_MSUB31_V3(H22[1][e+1][b], h[1][3], width);
} }
if (stop - start) if (stop - start)
ps->dsp.stereo_interpolate[!PS_BASELINE && ps->enable_ipdopd]( ps->dsp.stereo_interpolate[!PS_BASELINE && ps2->enable_ipdopd](
l[k] + 1 + start, r[k] + 1 + start, l[k] + 1 + start, r[k] + 1 + start,
h, h_step, stop - start); h, h_step, stop - start);
} }
@@ -983,7 +721,7 @@ int AAC_RENAME(ff_ps_apply)(AVCodecContext *avctx, PSContext *ps, INTFLOAT L[2][
INTFLOAT (*Lbuf)[32][2] = ps->Lbuf; INTFLOAT (*Lbuf)[32][2] = ps->Lbuf;
INTFLOAT (*Rbuf)[32][2] = ps->Rbuf; INTFLOAT (*Rbuf)[32][2] = ps->Rbuf;
const int len = 32; const int len = 32;
int is34 = ps->is34bands; int is34 = ps->common.is34bands;
top += NR_BANDS[is34] - 64; top += NR_BANDS[is34] - 64;
memset(ps->delay+top, 0, (NR_BANDS[is34] - top)*sizeof(ps->delay[0])); memset(ps->delay+top, 0, (NR_BANDS[is34] - top)*sizeof(ps->delay[0]));
@@ -999,45 +737,9 @@ int AAC_RENAME(ff_ps_apply)(AVCodecContext *avctx, PSContext *ps, INTFLOAT L[2][
return 0; return 0;
} }
#define PS_INIT_VLC_STATIC(num, size) \
INIT_VLC_STATIC(&vlc_ps[num], 9, ps_tmp[num].table_size / ps_tmp[num].elem_size, \
ps_tmp[num].ps_bits, 1, 1, \
ps_tmp[num].ps_codes, ps_tmp[num].elem_size, ps_tmp[num].elem_size, \
size);
#define PS_VLC_ROW(name) \
{ name ## _codes, name ## _bits, sizeof(name ## _codes), sizeof(name ## _codes[0]) }
av_cold void AAC_RENAME(ff_ps_init)(void) { av_cold void AAC_RENAME(ff_ps_init)(void) {
// Syntax initialization
static const struct {
const void *ps_codes, *ps_bits;
const unsigned int table_size, elem_size;
} ps_tmp[] = {
PS_VLC_ROW(huff_iid_df1),
PS_VLC_ROW(huff_iid_dt1),
PS_VLC_ROW(huff_iid_df0),
PS_VLC_ROW(huff_iid_dt0),
PS_VLC_ROW(huff_icc_df),
PS_VLC_ROW(huff_icc_dt),
PS_VLC_ROW(huff_ipd_df),
PS_VLC_ROW(huff_ipd_dt),
PS_VLC_ROW(huff_opd_df),
PS_VLC_ROW(huff_opd_dt),
};
PS_INIT_VLC_STATIC(0, 1544);
PS_INIT_VLC_STATIC(1, 832);
PS_INIT_VLC_STATIC(2, 1024);
PS_INIT_VLC_STATIC(3, 1036);
PS_INIT_VLC_STATIC(4, 544);
PS_INIT_VLC_STATIC(5, 544);
PS_INIT_VLC_STATIC(6, 512);
PS_INIT_VLC_STATIC(7, 512);
PS_INIT_VLC_STATIC(8, 512);
PS_INIT_VLC_STATIC(9, 512);
ps_tableinit(); ps_tableinit();
ff_ps_init_common();
} }
av_cold void AAC_RENAME(ff_ps_ctx_init)(PSContext *ps) av_cold void AAC_RENAME(ff_ps_ctx_init)(PSContext *ps)
+18 -2
View File
@@ -24,6 +24,8 @@
#include <stdint.h> #include <stdint.h>
#include "libavutil/mem_internal.h"
#include "aacpsdsp.h" #include "aacpsdsp.h"
#include "avcodec.h" #include "avcodec.h"
#include "get_bits.h" #include "get_bits.h"
@@ -37,8 +39,13 @@
#define PS_MAX_DELAY 14 #define PS_MAX_DELAY 14
#define PS_AP_LINKS 3 #define PS_AP_LINKS 3
#define PS_MAX_AP_DELAY 5 #define PS_MAX_AP_DELAY 5
#define PS_BASELINE 0 ///< Operate in Baseline PS mode
///< Baseline implies 10 or 20 stereo bands,
///< mixing mode A, and no ipd/opd
typedef struct PSContext { #define numQMFSlots 32 //numTimeSlots * RATE
typedef struct PSCommonContext {
int start; int start;
int enable_iid; int enable_iid;
int iid_quant; int iid_quant;
@@ -60,6 +67,10 @@ typedef struct PSContext {
int8_t opd_par[PS_MAX_NUM_ENV][PS_MAX_NR_IIDICC]; ///< Overall Phase Difference Parameters int8_t opd_par[PS_MAX_NUM_ENV][PS_MAX_NR_IIDICC]; ///< Overall Phase Difference Parameters
int is34bands; int is34bands;
int is34bands_old; int is34bands_old;
} PSCommonContext;
typedef struct PSContext {
PSCommonContext common;
DECLARE_ALIGNED(16, INTFLOAT, in_buf)[5][44][2]; DECLARE_ALIGNED(16, INTFLOAT, in_buf)[5][44][2];
DECLARE_ALIGNED(16, INTFLOAT, delay)[PS_MAX_SSB][PS_QMF_TIME_SLOTS + PS_MAX_DELAY][2]; DECLARE_ALIGNED(16, INTFLOAT, delay)[PS_MAX_SSB][PS_QMF_TIME_SLOTS + PS_MAX_DELAY][2];
@@ -78,9 +89,14 @@ typedef struct PSContext {
PSDSPContext dsp; PSDSPContext dsp;
} PSContext; } PSContext;
extern const int8_t ff_k_to_i_20[];
extern const int8_t ff_k_to_i_34[];
void ff_ps_init_common(void);
void AAC_RENAME(ff_ps_init)(void); void AAC_RENAME(ff_ps_init)(void);
void AAC_RENAME(ff_ps_ctx_init)(PSContext *ps); void AAC_RENAME(ff_ps_ctx_init)(PSContext *ps);
int AAC_RENAME(ff_ps_read_data)(AVCodecContext *avctx, GetBitContext *gb, PSContext *ps, int bits_left); int ff_ps_read_data(AVCodecContext *avctx, GetBitContext *gb,
PSCommonContext *ps, int bits_left);
int AAC_RENAME(ff_ps_apply)(AVCodecContext *avctx, PSContext *ps, INTFLOAT L[2][38][64], INTFLOAT R[2][38][64], int top); int AAC_RENAME(ff_ps_apply)(AVCodecContext *avctx, PSContext *ps, INTFLOAT L[2][38][64], INTFLOAT R[2][38][64], int top);
#endif /* AVCODEC_AACPS_H */ #endif /* AVCODEC_AACPS_H */
+336
View File
@@ -0,0 +1,336 @@
/*
* Functions common to fixed/float MPEG-4 Parametric Stereo decoding
* Copyright (c) 2010 Alex Converse <alex.converse@gmail.com>
*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdint.h>
#include "libavutil/common.h"
#include "libavutil/thread.h"
#include "aacps.h"
#include "get_bits.h"
#include "aacpsdata.c"
static const int8_t num_env_tab[2][4] = {
{ 0, 1, 2, 4, },
{ 1, 2, 3, 4, },
};
static const int8_t nr_iidicc_par_tab[] = {
10, 20, 34, 10, 20, 34,
};
static const int8_t nr_iidopd_par_tab[] = {
5, 11, 17, 5, 11, 17,
};
enum {
huff_iid_df1,
huff_iid_dt1,
huff_iid_df0,
huff_iid_dt0,
huff_icc_df,
huff_icc_dt,
huff_ipd_df,
huff_ipd_dt,
huff_opd_df,
huff_opd_dt,
};
static const int huff_iid[] = {
huff_iid_df0,
huff_iid_df1,
huff_iid_dt0,
huff_iid_dt1,
};
static VLC vlc_ps[10];
#define READ_PAR_DATA(PAR, OFFSET, MASK, ERR_CONDITION, NB_BITS, MAX_DEPTH) \
/** \
* Read Inter-channel Intensity Difference/Inter-Channel Coherence/ \
* Inter-channel Phase Difference/Overall Phase Difference parameters from the \
* bitstream. \
* \
* @param avctx contains the current codec context \
* @param gb pointer to the input bitstream \
* @param ps pointer to the Parametric Stereo context \
* @param PAR pointer to the parameter to be read \
* @param e envelope to decode \
* @param dt 1: time delta-coded, 0: frequency delta-coded \
*/ \
static int read_ ## PAR ## _data(AVCodecContext *avctx, GetBitContext *gb, PSCommonContext *ps, \
int8_t (*PAR)[PS_MAX_NR_IIDICC], int table_idx, int e, int dt) \
{ \
int b, num = ps->nr_ ## PAR ## _par; \
VLC_TYPE (*vlc_table)[2] = vlc_ps[table_idx].table; \
if (dt) { \
int e_prev = e ? e - 1 : ps->num_env_old - 1; \
e_prev = FFMAX(e_prev, 0); \
for (b = 0; b < num; b++) { \
int val = PAR[e_prev][b] + get_vlc2(gb, vlc_table, NB_BITS, MAX_DEPTH) - OFFSET; \
if (MASK) val &= MASK; \
PAR[e][b] = val; \
if (ERR_CONDITION) \
goto err; \
} \
} else { \
int val = 0; \
for (b = 0; b < num; b++) { \
val += get_vlc2(gb, vlc_table, NB_BITS, MAX_DEPTH) - OFFSET; \
if (MASK) val &= MASK; \
PAR[e][b] = val; \
if (ERR_CONDITION) \
goto err; \
} \
} \
return 0; \
err: \
av_log(avctx, AV_LOG_ERROR, "illegal "#PAR"\n"); \
return AVERROR_INVALIDDATA; \
}
READ_PAR_DATA(iid, huff_offset[table_idx], 0, FFABS(ps->iid_par[e][b]) > 7 + 8 * ps->iid_quant, 9, 3)
READ_PAR_DATA(icc, huff_offset[table_idx], 0, ps->icc_par[e][b] > 7U, 9, 2)
READ_PAR_DATA(ipdopd, 0, 0x07, 0, 5, 1)
static int ps_read_extension_data(GetBitContext *gb, PSCommonContext *ps,
int ps_extension_id)
{
int e;
int count = get_bits_count(gb);
if (ps_extension_id)
return 0;
ps->enable_ipdopd = get_bits1(gb);
if (ps->enable_ipdopd) {
for (e = 0; e < ps->num_env; e++) {
int dt = get_bits1(gb);
read_ipdopd_data(NULL, gb, ps, ps->ipd_par, dt ? huff_ipd_dt : huff_ipd_df, e, dt);
dt = get_bits1(gb);
read_ipdopd_data(NULL, gb, ps, ps->opd_par, dt ? huff_opd_dt : huff_opd_df, e, dt);
}
}
skip_bits1(gb); //reserved_ps
return get_bits_count(gb) - count;
}
int ff_ps_read_data(AVCodecContext *avctx, GetBitContext *gb_host,
PSCommonContext *ps, int bits_left)
{
int e;
int bit_count_start = get_bits_count(gb_host);
int header;
int bits_consumed;
GetBitContext gbc = *gb_host, *gb = &gbc;
header = get_bits1(gb);
if (header) { //enable_ps_header
ps->enable_iid = get_bits1(gb);
if (ps->enable_iid) {
int iid_mode = get_bits(gb, 3);
if (iid_mode > 5) {
av_log(avctx, AV_LOG_ERROR, "iid_mode %d is reserved.\n",
iid_mode);
goto err;
}
ps->nr_iid_par = nr_iidicc_par_tab[iid_mode];
ps->iid_quant = iid_mode > 2;
ps->nr_ipdopd_par = nr_iidopd_par_tab[iid_mode];
}
ps->enable_icc = get_bits1(gb);
if (ps->enable_icc) {
ps->icc_mode = get_bits(gb, 3);
if (ps->icc_mode > 5) {
av_log(avctx, AV_LOG_ERROR, "icc_mode %d is reserved.\n",
ps->icc_mode);
goto err;
}
ps->nr_icc_par = nr_iidicc_par_tab[ps->icc_mode];
}
ps->enable_ext = get_bits1(gb);
}
ps->frame_class = get_bits1(gb);
ps->num_env_old = ps->num_env;
ps->num_env = num_env_tab[ps->frame_class][get_bits(gb, 2)];
ps->border_position[0] = -1;
if (ps->frame_class) {
for (e = 1; e <= ps->num_env; e++) {
ps->border_position[e] = get_bits(gb, 5);
if (ps->border_position[e] < ps->border_position[e-1]) {
av_log(avctx, AV_LOG_ERROR, "border_position non monotone.\n");
goto err;
}
}
} else
for (e = 1; e <= ps->num_env; e++)
ps->border_position[e] = (e * numQMFSlots >> ff_log2_tab[ps->num_env]) - 1;
if (ps->enable_iid) {
for (e = 0; e < ps->num_env; e++) {
int dt = get_bits1(gb);
if (read_iid_data(avctx, gb, ps, ps->iid_par, huff_iid[2*dt+ps->iid_quant], e, dt))
goto err;
}
} else
memset(ps->iid_par, 0, sizeof(ps->iid_par));
if (ps->enable_icc)
for (e = 0; e < ps->num_env; e++) {
int dt = get_bits1(gb);
if (read_icc_data(avctx, gb, ps, ps->icc_par, dt ? huff_icc_dt : huff_icc_df, e, dt))
goto err;
}
else
memset(ps->icc_par, 0, sizeof(ps->icc_par));
if (ps->enable_ext) {
int cnt = get_bits(gb, 4);
if (cnt == 15) {
cnt += get_bits(gb, 8);
}
cnt *= 8;
while (cnt > 7) {
int ps_extension_id = get_bits(gb, 2);
cnt -= 2 + ps_read_extension_data(gb, ps, ps_extension_id);
}
if (cnt < 0) {
av_log(avctx, AV_LOG_ERROR, "ps extension overflow %d\n", cnt);
goto err;
}
skip_bits(gb, cnt);
}
ps->enable_ipdopd &= !PS_BASELINE;
//Fix up envelopes
if (!ps->num_env || ps->border_position[ps->num_env] < numQMFSlots - 1) {
//Create a fake envelope
int source = ps->num_env ? ps->num_env - 1 : ps->num_env_old - 1;
int b;
if (source >= 0 && source != ps->num_env) {
if (ps->enable_iid) {
memcpy(ps->iid_par+ps->num_env, ps->iid_par+source, sizeof(ps->iid_par[0]));
}
if (ps->enable_icc) {
memcpy(ps->icc_par+ps->num_env, ps->icc_par+source, sizeof(ps->icc_par[0]));
}
if (ps->enable_ipdopd) {
memcpy(ps->ipd_par+ps->num_env, ps->ipd_par+source, sizeof(ps->ipd_par[0]));
memcpy(ps->opd_par+ps->num_env, ps->opd_par+source, sizeof(ps->opd_par[0]));
}
}
if (ps->enable_iid){
for (b = 0; b < ps->nr_iid_par; b++) {
if (FFABS(ps->iid_par[ps->num_env][b]) > 7 + 8 * ps->iid_quant) {
av_log(avctx, AV_LOG_ERROR, "iid_par invalid\n");
goto err;
}
}
}
if (ps->enable_icc){
for (b = 0; b < ps->nr_iid_par; b++) {
if (ps->icc_par[ps->num_env][b] > 7U) {
av_log(avctx, AV_LOG_ERROR, "icc_par invalid\n");
goto err;
}
}
}
ps->num_env++;
ps->border_position[ps->num_env] = numQMFSlots - 1;
}
ps->is34bands_old = ps->is34bands;
if (!PS_BASELINE && (ps->enable_iid || ps->enable_icc))
ps->is34bands = (ps->enable_iid && ps->nr_iid_par == 34) ||
(ps->enable_icc && ps->nr_icc_par == 34);
//Baseline
if (!ps->enable_ipdopd) {
memset(ps->ipd_par, 0, sizeof(ps->ipd_par));
memset(ps->opd_par, 0, sizeof(ps->opd_par));
}
if (header)
ps->start = 1;
bits_consumed = get_bits_count(gb) - bit_count_start;
if (bits_consumed <= bits_left) {
skip_bits_long(gb_host, bits_consumed);
return bits_consumed;
}
av_log(avctx, AV_LOG_ERROR, "Expected to read %d PS bits actually read %d.\n", bits_left, bits_consumed);
err:
ps->start = 0;
skip_bits_long(gb_host, bits_left);
memset(ps->iid_par, 0, sizeof(ps->iid_par));
memset(ps->icc_par, 0, sizeof(ps->icc_par));
memset(ps->ipd_par, 0, sizeof(ps->ipd_par));
memset(ps->opd_par, 0, sizeof(ps->opd_par));
return bits_left;
}
#define PS_INIT_VLC_STATIC(num, nb_bits, size) \
INIT_VLC_STATIC(&vlc_ps[num], nb_bits, ps_tmp[num].table_size / ps_tmp[num].elem_size, \
ps_tmp[num].ps_bits, 1, 1, \
ps_tmp[num].ps_codes, ps_tmp[num].elem_size, ps_tmp[num].elem_size, \
size);
#define PS_VLC_ROW(name) \
{ name ## _codes, name ## _bits, sizeof(name ## _codes), sizeof(name ## _codes[0]) }
static av_cold void ps_init_common(void)
{
// Syntax initialization
static const struct {
const void *ps_codes, *ps_bits;
const unsigned int table_size, elem_size;
} ps_tmp[] = {
PS_VLC_ROW(huff_iid_df1),
PS_VLC_ROW(huff_iid_dt1),
PS_VLC_ROW(huff_iid_df0),
PS_VLC_ROW(huff_iid_dt0),
PS_VLC_ROW(huff_icc_df),
PS_VLC_ROW(huff_icc_dt),
PS_VLC_ROW(huff_ipd_df),
PS_VLC_ROW(huff_ipd_dt),
PS_VLC_ROW(huff_opd_df),
PS_VLC_ROW(huff_opd_dt),
};
PS_INIT_VLC_STATIC(0, 9, 1544);
PS_INIT_VLC_STATIC(1, 9, 832);
PS_INIT_VLC_STATIC(2, 9, 1024);
PS_INIT_VLC_STATIC(3, 9, 1036);
PS_INIT_VLC_STATIC(4, 9, 544);
PS_INIT_VLC_STATIC(5, 9, 544);
PS_INIT_VLC_STATIC(6, 5, 32);
PS_INIT_VLC_STATIC(7, 5, 32);
PS_INIT_VLC_STATIC(8, 5, 32);
PS_INIT_VLC_STATIC(9, 5, 32);
}
av_cold void ff_ps_init_common(void)
{
static AVOnce init_static_once = AV_ONCE_INIT;
ff_thread_once(&init_static_once, ps_init_common);
}
+6 -1
View File
@@ -36,7 +36,12 @@
#else #else
#include "libavutil/common.h" #include "libavutil/common.h"
#include "libavutil/mathematics.h" #include "libavutil/mathematics.h"
#include "libavutil/mem.h" #ifdef BUILD_TABLES
#undef DECLARE_ALIGNED
#define DECLARE_ALIGNED(align, type, variable) type variable
#else
#include "libavutil/mem_internal.h"
#endif
#include "aac_defines.h" #include "aac_defines.h"
#include "libavutil/softfloat.h" #include "libavutil/softfloat.h"
+1
View File
@@ -21,6 +21,7 @@
*/ */
#include <stdlib.h> #include <stdlib.h>
#define BUILD_TABLES
#define CONFIG_HARDCODED_TABLES 0 #define CONFIG_HARDCODED_TABLES 0
#include "aac_defines.h" #include "aac_defines.h"
+2 -7
View File
@@ -142,22 +142,17 @@ static const int8_t huff_offset[] = {
}; };
///Table 8.48 ///Table 8.48
static const int8_t k_to_i_20[] = { const int8_t ff_k_to_i_20[] = {
1, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 14, 15, 1, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 14, 15,
15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18,
18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19,
19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19
}; };
///Table 8.49 ///Table 8.49
static const int8_t k_to_i_34[] = { const int8_t ff_k_to_i_34[] = {
0, 1, 2, 3, 4, 5, 6, 6, 7, 2, 1, 0, 10, 10, 4, 5, 6, 7, 8, 0, 1, 2, 3, 4, 5, 6, 6, 7, 2, 1, 0, 10, 10, 4, 5, 6, 7, 8,
9, 10, 11, 12, 9, 14, 11, 12, 13, 14, 15, 16, 13, 16, 17, 18, 19, 20, 21, 9, 10, 11, 12, 9, 14, 11, 12, 13, 14, 15, 16, 13, 16, 17, 18, 19, 20, 21,
22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 27, 28, 28, 28, 29, 29, 29, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, 27, 28, 28, 28, 29, 29, 29,
30, 30, 30, 31, 31, 31, 31, 32, 32, 32, 32, 33, 33, 33, 33, 33, 33, 33, 33, 30, 30, 30, 31, 31, 31, 31, 32, 32, 32, 32, 33, 33, 33, 33, 33, 33, 33, 33,
33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33
}; };
static const INTFLOAT g1_Q2[] = {
Q31(0.0f), Q31(0.01899487526049f), Q31(0.0f), Q31(-0.07293139167538f),
Q31(0.0f), Q31(0.30596630545168f), Q31(0.5f)
};
+1 -1
View File
@@ -31,7 +31,6 @@
#include "sbr.h" #include "sbr.h"
#include "aacsbr.h" #include "aacsbr.h"
#include "aacsbrdata.h" #include "aacsbrdata.h"
#include "aacsbr_tablegen.h"
#include "fft.h" #include "fft.h"
#include "internal.h" #include "internal.h"
#include "aacps.h" #include "aacps.h"
@@ -39,6 +38,7 @@
#include "libavutil/internal.h" #include "libavutil/internal.h"
#include "libavutil/libm.h" #include "libavutil/libm.h"
#include "libavutil/avassert.h" #include "libavutil/avassert.h"
#include "libavutil/mem_internal.h"
#include <stdint.h> #include <stdint.h>
#include <float.h> #include <float.h>
-1
View File
@@ -60,7 +60,6 @@
#include "sbr.h" #include "sbr.h"
#include "aacsbr.h" #include "aacsbr.h"
#include "aacsbrdata.h" #include "aacsbrdata.h"
#include "aacsbr_fixed_tablegen.h"
#include "fft.h" #include "fft.h"
#include "aacps.h" #include "aacps.h"
#include "sbrdsp.h" #include "sbrdsp.h"
+2 -6
View File
@@ -37,10 +37,6 @@
static av_cold void aacsbr_tableinit(void) static av_cold void aacsbr_tableinit(void)
{ {
int n; int n;
for (n = 1; n < 320; n++)
sbr_qmf_window_us[320 + n] = sbr_qmf_window_us[320 - n];
sbr_qmf_window_us[384] = -sbr_qmf_window_us[384];
sbr_qmf_window_us[512] = -sbr_qmf_window_us[512];
for (n = 0; n < 320; n++) for (n = 0; n < 320; n++)
sbr_qmf_window_ds[n] = sbr_qmf_window_us[2*n]; sbr_qmf_window_ds[n] = sbr_qmf_window_us[2*n];
@@ -957,7 +953,7 @@ static void read_sbr_extension(AACContext *ac, SpectralBandReplication *sbr,
skip_bits_long(gb, *num_bits_left); // bs_fill_bits skip_bits_long(gb, *num_bits_left); // bs_fill_bits
*num_bits_left = 0; *num_bits_left = 0;
} else { } else {
*num_bits_left -= AAC_RENAME(ff_ps_read_data)(ac->avctx, gb, &sbr->ps, *num_bits_left); *num_bits_left -= ff_ps_read_data(ac->avctx, gb, &sbr->ps.common, *num_bits_left);
ac->avctx->profile = FF_PROFILE_AAC_HE_V2; ac->avctx->profile = FF_PROFILE_AAC_HE_V2;
} }
break; break;
@@ -1548,7 +1544,7 @@ void AAC_RENAME(ff_sbr_apply)(AACContext *ac, SpectralBandReplication *sbr, int
} }
if (ac->oc[1].m4ac.ps == 1) { if (ac->oc[1].m4ac.ps == 1) {
if (sbr->ps.start) { if (sbr->ps.common.start) {
AAC_RENAME(ff_ps_apply)(ac->avctx, &sbr->ps, sbr->X[0], sbr->X[1], sbr->kx[1] + sbr->m[1]); AAC_RENAME(ff_ps_apply)(ac->avctx, &sbr->ps, sbr->X[0], sbr->X[1], sbr->kx[1] + sbr->m[1]);
} else { } else {
memcpy(sbr->X[1], sbr->X[0], sizeof(sbr->X[0])); memcpy(sbr->X[1], sbr->X[0], sizeof(sbr->X[0]));
+168 -1
View File
@@ -29,7 +29,7 @@
#define AVCODEC_AACSBRDATA_H #define AVCODEC_AACSBRDATA_H
#include <stdint.h> #include <stdint.h>
#include "libavutil/mem.h" #include "libavutil/mem_internal.h"
#include "aac_defines.h" #include "aac_defines.h"
///< Huffman tables for SBR ///< Huffman tables for SBR
@@ -532,4 +532,171 @@ const DECLARE_ALIGNED(16, INTFLOAT, AAC_RENAME(ff_sbr_noise_table))[][2] = {
{Q31(-0.01053049862020f), Q31(-0.66959058036166f)}, {Q31(-0.91266367957293f), Q31(-0.11522938140034f)}, {Q31(-0.01053049862020f), Q31(-0.66959058036166f)}, {Q31(-0.91266367957293f), Q31(-0.11522938140034f)},
}; };
///< window coefficients for analysis/synthesis QMF banks
static DECLARE_ALIGNED(32, INTFLOAT, sbr_qmf_window_ds)[320];
/* This table contains redundancy: It is symmetric about the entry #320
* with the exception of entries 384 and 512 which are negated. */
static const DECLARE_ALIGNED(32, INTFLOAT, sbr_qmf_window_us)[640] = {
Q31( 0.0000000000f), Q31(-0.0005525286f), Q31(-0.0005617692f), Q31(-0.0004947518f),
Q31(-0.0004875227f), Q31(-0.0004893791f), Q31(-0.0005040714f), Q31(-0.0005226564f),
Q31(-0.0005466565f), Q31(-0.0005677802f), Q31(-0.0005870930f), Q31(-0.0006132747f),
Q31(-0.0006312493f), Q31(-0.0006540333f), Q31(-0.0006777690f), Q31(-0.0006941614f),
Q31(-0.0007157736f), Q31(-0.0007255043f), Q31(-0.0007440941f), Q31(-0.0007490598f),
Q31(-0.0007681371f), Q31(-0.0007724848f), Q31(-0.0007834332f), Q31(-0.0007779869f),
Q31(-0.0007803664f), Q31(-0.0007801449f), Q31(-0.0007757977f), Q31(-0.0007630793f),
Q31(-0.0007530001f), Q31(-0.0007319357f), Q31(-0.0007215391f), Q31(-0.0006917937f),
Q31(-0.0006650415f), Q31(-0.0006341594f), Q31(-0.0005946118f), Q31(-0.0005564576f),
Q31(-0.0005145572f), Q31(-0.0004606325f), Q31(-0.0004095121f), Q31(-0.0003501175f),
Q31(-0.0002896981f), Q31(-0.0002098337f), Q31(-0.0001446380f), Q31(-0.0000617334f),
Q31( 0.0000134949f), Q31( 0.0001094383f), Q31( 0.0002043017f), Q31( 0.0002949531f),
Q31( 0.0004026540f), Q31( 0.0005107388f), Q31( 0.0006239376f), Q31( 0.0007458025f),
Q31( 0.0008608443f), Q31( 0.0009885988f), Q31( 0.0011250155f), Q31( 0.0012577884f),
Q31( 0.0013902494f), Q31( 0.0015443219f), Q31( 0.0016868083f), Q31( 0.0018348265f),
Q31( 0.0019841140f), Q31( 0.0021461583f), Q31( 0.0023017254f), Q31( 0.0024625616f),
Q31( 0.0026201758f), Q31( 0.0027870464f), Q31( 0.0029469447f), Q31( 0.0031125420f),
Q31( 0.0032739613f), Q31( 0.0034418874f), Q31( 0.0036008268f), Q31( 0.0037603922f),
Q31( 0.0039207432f), Q31( 0.0040819753f), Q31( 0.0042264269f), Q31( 0.0043730719f),
Q31( 0.0045209852f), Q31( 0.0046606460f), Q31( 0.0047932560f), Q31( 0.0049137603f),
Q31( 0.0050393022f), Q31( 0.0051407353f), Q31( 0.0052461166f), Q31( 0.0053471681f),
Q31( 0.0054196775f), Q31( 0.0054876040f), Q31( 0.0055475714f), Q31( 0.0055938023f),
Q31( 0.0056220643f), Q31( 0.0056455196f), Q31( 0.0056389199f), Q31( 0.0056266114f),
Q31( 0.0055917128f), Q31( 0.0055404363f), Q31( 0.0054753783f), Q31( 0.0053838975f),
Q31( 0.0052715758f), Q31( 0.0051382275f), Q31( 0.0049839687f), Q31( 0.0048109469f),
Q31( 0.0046039530f), Q31( 0.0043801861f), Q31( 0.0041251642f), Q31( 0.0038456408f),
Q31( 0.0035401246f), Q31( 0.0032091885f), Q31( 0.0028446757f), Q31( 0.0024508540f),
Q31( 0.0020274176f), Q31( 0.0015784682f), Q31( 0.0010902329f), Q31( 0.0005832264f),
Q31( 0.0000276045f), Q31(-0.0005464280f), Q31(-0.0011568135f), Q31(-0.0018039472f),
Q31(-0.0024826723f), Q31(-0.0031933778f), Q31(-0.0039401124f), Q31(-0.0047222596f),
Q31(-0.0055337211f), Q31(-0.0063792293f), Q31(-0.0072615816f), Q31(-0.0081798233f),
Q31(-0.0091325329f), Q31(-0.0101150215f), Q31(-0.0111315548f), Q31(-0.0121849995f),
Q31( 0.0132718220f), Q31( 0.0143904666f), Q31( 0.0155405553f), Q31( 0.0167324712f),
Q31( 0.0179433381f), Q31( 0.0191872431f), Q31( 0.0204531793f), Q31( 0.0217467550f),
Q31( 0.0230680169f), Q31( 0.0244160992f), Q31( 0.0257875847f), Q31( 0.0271859429f),
Q31( 0.0286072173f), Q31( 0.0300502657f), Q31( 0.0315017608f), Q31( 0.0329754081f),
Q31( 0.0344620948f), Q31( 0.0359697560f), Q31( 0.0374812850f), Q31( 0.0390053679f),
Q31( 0.0405349170f), Q31( 0.0420649094f), Q31( 0.0436097542f), Q31( 0.0451488405f),
Q31( 0.0466843027f), Q31( 0.0482165720f), Q31( 0.0497385755f), Q31( 0.0512556155f),
Q31( 0.0527630746f), Q31( 0.0542452768f), Q31( 0.0557173648f), Q31( 0.0571616450f),
Q31( 0.0585915683f), Q31( 0.0599837480f), Q31( 0.0613455171f), Q31( 0.0626857808f),
Q31( 0.0639715898f), Q31( 0.0652247106f), Q31( 0.0664367512f), Q31( 0.0676075985f),
Q31( 0.0687043828f), Q31( 0.0697630244f), Q31( 0.0707628710f), Q31( 0.0717002673f),
Q31( 0.0725682583f), Q31( 0.0733620255f), Q31( 0.0741003642f), Q31( 0.0747452558f),
Q31( 0.0753137336f), Q31( 0.0758008358f), Q31( 0.0761992479f), Q31( 0.0764992170f),
Q31( 0.0767093490f), Q31( 0.0768173975f), Q31( 0.0768230011f), Q31( 0.0767204924f),
Q31( 0.0765050718f), Q31( 0.0761748321f), Q31( 0.0757305756f), Q31( 0.0751576255f),
Q31( 0.0744664394f), Q31( 0.0736406005f), Q31( 0.0726774642f), Q31( 0.0715826364f),
Q31( 0.0703533073f), Q31( 0.0689664013f), Q31( 0.0674525021f), Q31( 0.0657690668f),
Q31( 0.0639444805f), Q31( 0.0619602779f), Q31( 0.0598166570f), Q31( 0.0575152691f),
Q31( 0.0550460034f), Q31( 0.0524093821f), Q31( 0.0495978676f), Q31( 0.0466303305f),
Q31( 0.0434768782f), Q31( 0.0401458278f), Q31( 0.0366418116f), Q31( 0.0329583930f),
Q31( 0.0290824006f), Q31( 0.0250307561f), Q31( 0.0207997072f), Q31( 0.0163701258f),
Q31( 0.0117623832f), Q31( 0.0069636862f), Q31( 0.0019765601f), Q31(-0.0032086896f),
Q31(-0.0085711749f), Q31(-0.0141288827f), Q31(-0.0198834129f), Q31(-0.0258227288f),
Q31(-0.0319531274f), Q31(-0.0382776572f), Q31(-0.0447806821f), Q31(-0.0514804176f),
Q31(-0.0583705326f), Q31(-0.0654409853f), Q31(-0.0726943300f), Q31(-0.0801372934f),
Q31(-0.0877547536f), Q31(-0.0955533352f), Q31(-0.1035329531f), Q31(-0.1116826931f),
Q31(-0.1200077984f), Q31(-0.1285002850f), Q31(-0.1371551761f), Q31(-0.1459766491f),
Q31(-0.1549607071f), Q31(-0.1640958855f), Q31(-0.1733808172f), Q31(-0.1828172548f),
Q31(-0.1923966745f), Q31(-0.2021250176f), Q31(-0.2119735853f), Q31(-0.2219652696f),
Q31(-0.2320690870f), Q31(-0.2423016884f), Q31(-0.2526480309f), Q31(-0.2631053299f),
Q31(-0.2736634040f), Q31(-0.2843214189f), Q31(-0.2950716717f), Q31(-0.3059098575f),
Q31(-0.3168278913f), Q31(-0.3278113727f), Q31(-0.3388722693f), Q31(-0.3499914122f),
Q31( 0.3611589903f), Q31( 0.3723795546f), Q31( 0.3836350013f), Q31( 0.3949211761f),
Q31( 0.4062317676f), Q31( 0.4175696896f), Q31( 0.4289119920f), Q31( 0.4402553754f),
Q31( 0.4515996535f), Q31( 0.4629308085f), Q31( 0.4742453214f), Q31( 0.4855253091f),
Q31( 0.4967708254f), Q31( 0.5079817500f), Q31( 0.5191234970f), Q31( 0.5302240895f),
Q31( 0.5412553448f), Q31( 0.5522051258f), Q31( 0.5630789140f), Q31( 0.5738524131f),
Q31( 0.5845403235f), Q31( 0.5951123086f), Q31( 0.6055783538f), Q31( 0.6159109932f),
Q31( 0.6261242695f), Q31( 0.6361980107f), Q31( 0.6461269695f), Q31( 0.6559016302f),
Q31( 0.6655139880f), Q31( 0.6749663190f), Q31( 0.6842353293f), Q31( 0.6933282376f),
Q31( 0.7022388719f), Q31( 0.7109410426f), Q31( 0.7194462634f), Q31( 0.7277448900f),
Q31( 0.7358211758f), Q31( 0.7436827863f), Q31( 0.7513137456f), Q31( 0.7587080760f),
Q31( 0.7658674865f), Q31( 0.7727780881f), Q31( 0.7794287519f), Q31( 0.7858353120f),
Q31( 0.7919735841f), Q31( 0.7978466413f), Q31( 0.8034485751f), Q31( 0.8087695004f),
Q31( 0.8138191270f), Q31( 0.8185776004f), Q31( 0.8230419890f), Q31( 0.8272275347f),
Q31( 0.8311038457f), Q31( 0.8346937361f), Q31( 0.8379717337f), Q31( 0.8409541392f),
Q31( 0.8436238281f), Q31( 0.8459818469f), Q31( 0.8480315777f), Q31( 0.8497805198f),
Q31( 0.8511971524f), Q31( 0.8523047035f), Q31( 0.8531020949f), Q31( 0.8535720573f),
Q31( 0.8537385600f), Q31( 0.8535720573f), Q31( 0.8531020949f), Q31( 0.8523047035f),
Q31( 0.8511971524f), Q31( 0.8497805198f), Q31( 0.8480315777f), Q31( 0.8459818469f),
Q31( 0.8436238281f), Q31( 0.8409541392f), Q31( 0.8379717337f), Q31( 0.8346937361f),
Q31( 0.8311038457f), Q31( 0.8272275347f), Q31( 0.8230419890f), Q31( 0.8185776004f),
Q31( 0.8138191270f), Q31( 0.8087695004f), Q31( 0.8034485751f), Q31( 0.7978466413f),
Q31( 0.7919735841f), Q31( 0.7858353120f), Q31( 0.7794287519f), Q31( 0.7727780881f),
Q31( 0.7658674865f), Q31( 0.7587080760f), Q31( 0.7513137456f), Q31( 0.7436827863f),
Q31( 0.7358211758f), Q31( 0.7277448900f), Q31( 0.7194462634f), Q31( 0.7109410426f),
Q31( 0.7022388719f), Q31( 0.6933282376f), Q31( 0.6842353293f), Q31( 0.6749663190f),
Q31( 0.6655139880f), Q31( 0.6559016302f), Q31( 0.6461269695f), Q31( 0.6361980107f),
Q31( 0.6261242695f), Q31( 0.6159109932f), Q31( 0.6055783538f), Q31( 0.5951123086f),
Q31( 0.5845403235f), Q31( 0.5738524131f), Q31( 0.5630789140f), Q31( 0.5522051258f),
Q31( 0.5412553448f), Q31( 0.5302240895f), Q31( 0.5191234970f), Q31( 0.5079817500f),
Q31( 0.4967708254f), Q31( 0.4855253091f), Q31( 0.4742453214f), Q31( 0.4629308085f),
Q31( 0.4515996535f), Q31( 0.4402553754f), Q31( 0.4289119920f), Q31( 0.4175696896f),
Q31( 0.4062317676f), Q31( 0.3949211761f), Q31( 0.3836350013f), Q31( 0.3723795546f),
-Q31( 0.3611589903f), Q31(-0.3499914122f), Q31(-0.3388722693f), Q31(-0.3278113727f),
Q31(-0.3168278913f), Q31(-0.3059098575f), Q31(-0.2950716717f), Q31(-0.2843214189f),
Q31(-0.2736634040f), Q31(-0.2631053299f), Q31(-0.2526480309f), Q31(-0.2423016884f),
Q31(-0.2320690870f), Q31(-0.2219652696f), Q31(-0.2119735853f), Q31(-0.2021250176f),
Q31(-0.1923966745f), Q31(-0.1828172548f), Q31(-0.1733808172f), Q31(-0.1640958855f),
Q31(-0.1549607071f), Q31(-0.1459766491f), Q31(-0.1371551761f), Q31(-0.1285002850f),
Q31(-0.1200077984f), Q31(-0.1116826931f), Q31(-0.1035329531f), Q31(-0.0955533352f),
Q31(-0.0877547536f), Q31(-0.0801372934f), Q31(-0.0726943300f), Q31(-0.0654409853f),
Q31(-0.0583705326f), Q31(-0.0514804176f), Q31(-0.0447806821f), Q31(-0.0382776572f),
Q31(-0.0319531274f), Q31(-0.0258227288f), Q31(-0.0198834129f), Q31(-0.0141288827f),
Q31(-0.0085711749f), Q31(-0.0032086896f), Q31( 0.0019765601f), Q31( 0.0069636862f),
Q31( 0.0117623832f), Q31( 0.0163701258f), Q31( 0.0207997072f), Q31( 0.0250307561f),
Q31( 0.0290824006f), Q31( 0.0329583930f), Q31( 0.0366418116f), Q31( 0.0401458278f),
Q31( 0.0434768782f), Q31( 0.0466303305f), Q31( 0.0495978676f), Q31( 0.0524093821f),
Q31( 0.0550460034f), Q31( 0.0575152691f), Q31( 0.0598166570f), Q31( 0.0619602779f),
Q31( 0.0639444805f), Q31( 0.0657690668f), Q31( 0.0674525021f), Q31( 0.0689664013f),
Q31( 0.0703533073f), Q31( 0.0715826364f), Q31( 0.0726774642f), Q31( 0.0736406005f),
Q31( 0.0744664394f), Q31( 0.0751576255f), Q31( 0.0757305756f), Q31( 0.0761748321f),
Q31( 0.0765050718f), Q31( 0.0767204924f), Q31( 0.0768230011f), Q31( 0.0768173975f),
Q31( 0.0767093490f), Q31( 0.0764992170f), Q31( 0.0761992479f), Q31( 0.0758008358f),
Q31( 0.0753137336f), Q31( 0.0747452558f), Q31( 0.0741003642f), Q31( 0.0733620255f),
Q31( 0.0725682583f), Q31( 0.0717002673f), Q31( 0.0707628710f), Q31( 0.0697630244f),
Q31( 0.0687043828f), Q31( 0.0676075985f), Q31( 0.0664367512f), Q31( 0.0652247106f),
Q31( 0.0639715898f), Q31( 0.0626857808f), Q31( 0.0613455171f), Q31( 0.0599837480f),
Q31( 0.0585915683f), Q31( 0.0571616450f), Q31( 0.0557173648f), Q31( 0.0542452768f),
Q31( 0.0527630746f), Q31( 0.0512556155f), Q31( 0.0497385755f), Q31( 0.0482165720f),
Q31( 0.0466843027f), Q31( 0.0451488405f), Q31( 0.0436097542f), Q31( 0.0420649094f),
Q31( 0.0405349170f), Q31( 0.0390053679f), Q31( 0.0374812850f), Q31( 0.0359697560f),
Q31( 0.0344620948f), Q31( 0.0329754081f), Q31( 0.0315017608f), Q31( 0.0300502657f),
Q31( 0.0286072173f), Q31( 0.0271859429f), Q31( 0.0257875847f), Q31( 0.0244160992f),
Q31( 0.0230680169f), Q31( 0.0217467550f), Q31( 0.0204531793f), Q31( 0.0191872431f),
Q31( 0.0179433381f), Q31( 0.0167324712f), Q31( 0.0155405553f), Q31( 0.0143904666f),
-Q31( 0.0132718220f), Q31(-0.0121849995f), Q31(-0.0111315548f), Q31(-0.0101150215f),
Q31(-0.0091325329f), Q31(-0.0081798233f), Q31(-0.0072615816f), Q31(-0.0063792293f),
Q31(-0.0055337211f), Q31(-0.0047222596f), Q31(-0.0039401124f), Q31(-0.0031933778f),
Q31(-0.0024826723f), Q31(-0.0018039472f), Q31(-0.0011568135f), Q31(-0.0005464280f),
Q31( 0.0000276045f), Q31( 0.0005832264f), Q31( 0.0010902329f), Q31( 0.0015784682f),
Q31( 0.0020274176f), Q31( 0.0024508540f), Q31( 0.0028446757f), Q31( 0.0032091885f),
Q31( 0.0035401246f), Q31( 0.0038456408f), Q31( 0.0041251642f), Q31( 0.0043801861f),
Q31( 0.0046039530f), Q31( 0.0048109469f), Q31( 0.0049839687f), Q31( 0.0051382275f),
Q31( 0.0052715758f), Q31( 0.0053838975f), Q31( 0.0054753783f), Q31( 0.0055404363f),
Q31( 0.0055917128f), Q31( 0.0056266114f), Q31( 0.0056389199f), Q31( 0.0056455196f),
Q31( 0.0056220643f), Q31( 0.0055938023f), Q31( 0.0055475714f), Q31( 0.0054876040f),
Q31( 0.0054196775f), Q31( 0.0053471681f), Q31( 0.0052461166f), Q31( 0.0051407353f),
Q31( 0.0050393022f), Q31( 0.0049137603f), Q31( 0.0047932560f), Q31( 0.0046606460f),
Q31( 0.0045209852f), Q31( 0.0043730719f), Q31( 0.0042264269f), Q31( 0.0040819753f),
Q31( 0.0039207432f), Q31( 0.0037603922f), Q31( 0.0036008268f), Q31( 0.0034418874f),
Q31( 0.0032739613f), Q31( 0.0031125420f), Q31( 0.0029469447f), Q31( 0.0027870464f),
Q31( 0.0026201758f), Q31( 0.0024625616f), Q31( 0.0023017254f), Q31( 0.0021461583f),
Q31( 0.0019841140f), Q31( 0.0018348265f), Q31( 0.0016868083f), Q31( 0.0015443219f),
Q31( 0.0013902494f), Q31( 0.0012577884f), Q31( 0.0011250155f), Q31( 0.0009885988f),
Q31( 0.0008608443f), Q31( 0.0007458025f), Q31( 0.0006239376f), Q31( 0.0005107388f),
Q31( 0.0004026540f), Q31( 0.0002949531f), Q31( 0.0002043017f), Q31( 0.0001094383f),
Q31( 0.0000134949f), Q31(-0.0000617334f), Q31(-0.0001446380f), Q31(-0.0002098337f),
Q31(-0.0002896981f), Q31(-0.0003501175f), Q31(-0.0004095121f), Q31(-0.0004606325f),
Q31(-0.0005145572f), Q31(-0.0005564576f), Q31(-0.0005946118f), Q31(-0.0006341594f),
Q31(-0.0006650415f), Q31(-0.0006917937f), Q31(-0.0007215391f), Q31(-0.0007319357f),
Q31(-0.0007530001f), Q31(-0.0007630793f), Q31(-0.0007757977f), Q31(-0.0007801449f),
Q31(-0.0007803664f), Q31(-0.0007779869f), Q31(-0.0007834332f), Q31(-0.0007724848f),
Q31(-0.0007681371f), Q31(-0.0007490598f), Q31(-0.0007440941f), Q31(-0.0007255043f),
Q31(-0.0007157736f), Q31(-0.0006941614f), Q31(-0.0006777690f), Q31(-0.0006540333f),
Q31(-0.0006312493f), Q31(-0.0006132747f), Q31(-0.0005870930f), Q31(-0.0005677802f),
Q31(-0.0005466565f), Q31(-0.0005226564f), Q31(-0.0005040714f), Q31(-0.0004893791f),
Q31(-0.0004875227f), Q31(-0.0004947518f), Q31(-0.0005617692f), Q31(-0.0005525286f),
};
#endif /* AVCODEC_AACSBRDATA_H */ #endif /* AVCODEC_AACSBRDATA_H */
+73 -4
View File
@@ -27,20 +27,39 @@
* @author Maxim Gavrilov ( maxim.gavrilov gmail com ) * @author Maxim Gavrilov ( maxim.gavrilov gmail com )
*/ */
#include "config.h"
#include "libavutil/mem.h" #include "libavutil/mem.h"
#include "libavutil/mem_internal.h"
#include "libavutil/thread.h"
#include "aac.h" #include "aac.h"
#include "aactab.h"
#include <stdint.h> #include <stdint.h>
float ff_aac_pow2sf_tab[428]; float ff_aac_pow2sf_tab[428];
float ff_aac_pow34sf_tab[428]; float ff_aac_pow34sf_tab[428];
#if CONFIG_AAC_ENCODER || CONFIG_AAC_DECODER
#include "kbdwin.h"
#include "sinewin.h"
DECLARE_ALIGNED(32, float, ff_aac_kbd_long_1024)[1024]; DECLARE_ALIGNED(32, float, ff_aac_kbd_long_1024)[1024];
DECLARE_ALIGNED(32, float, ff_aac_kbd_short_128)[128]; DECLARE_ALIGNED(32, float, ff_aac_kbd_short_128)[128];
DECLARE_ALIGNED(32, float, ff_aac_kbd_long_960)[960];
DECLARE_ALIGNED(32, float, ff_aac_kbd_short_120)[120]; static av_cold void aac_float_common_init(void)
DECLARE_ALIGNED(32, int, ff_aac_kbd_long_1024_fixed)[1024]; {
DECLARE_ALIGNED(32, int, ff_aac_kbd_short_128_fixed)[128]; ff_kbd_window_init(ff_aac_kbd_long_1024, 4.0, 1024);
ff_kbd_window_init(ff_aac_kbd_short_128, 6.0, 128);
ff_init_ff_sine_windows(10);
ff_init_ff_sine_windows(7);
}
av_cold void ff_aac_float_common_init(void)
{
static AVOnce init_static_once = AV_ONCE_INIT;
ff_thread_once(&init_static_once, aac_float_common_init);
}
#endif
const uint8_t ff_aac_num_swb_1024[] = { const uint8_t ff_aac_num_swb_1024[] = {
41, 41, 47, 49, 49, 51, 47, 47, 43, 43, 43, 40, 40 41, 41, 47, 49, 49, 51, 47, 47, 43, 43, 43, 40, 40
@@ -3280,3 +3299,53 @@ const DECLARE_ALIGNED(32, int, ff_aac_eld_window_480_fixed)[1800] = {
0xffecff1c, 0xffed391e, 0xffed740c, 0xffedafb1, 0xffecff1c, 0xffed391e, 0xffed740c, 0xffedafb1,
0xffedebe1, 0xffee287d, 0xffee654e, 0xffeea23f, 0xffedebe1, 0xffee287d, 0xffee654e, 0xffeea23f,
}; };
static void aac_tableinit(void)
{
/* 2^(i/16) for 0 <= i <= 15 */
static const float exp2_lut[] = {
1.00000000000000000000,
1.04427378242741384032,
1.09050773266525765921,
1.13878863475669165370,
1.18920711500272106672,
1.24185781207348404859,
1.29683955465100966593,
1.35425554693689272830,
1.41421356237309504880,
1.47682614593949931139,
1.54221082540794082361,
1.61049033194925430818,
1.68179283050742908606,
1.75625216037329948311,
1.83400808640934246349,
1.91520656139714729387,
};
float t1 = 8.8817841970012523233890533447265625e-16; // 2^(-50)
float t2 = 3.63797880709171295166015625e-12; // 2^(-38)
int t1_inc_cur, t2_inc_cur;
int t1_inc_prev = 0;
int t2_inc_prev = 8;
for (int i = 0; i < 428; i++) {
t1_inc_cur = 4 * (i % 4);
t2_inc_cur = (8 + 3*i) % 16;
if (t1_inc_cur < t1_inc_prev)
t1 *= 2;
if (t2_inc_cur < t2_inc_prev)
t2 *= 2;
// A much more efficient and accurate way of doing:
// ff_aac_pow2sf_tab[i] = pow(2, (i - POW_SF2_ZERO) / 4.0);
// ff_aac_pow34sf_tab[i] = pow(ff_aac_pow2sf_tab[i], 3.0/4.0);
ff_aac_pow2sf_tab[i] = t1 * exp2_lut[t1_inc_cur];
ff_aac_pow34sf_tab[i] = t2 * exp2_lut[t2_inc_cur];
t1_inc_prev = t1_inc_cur;
t2_inc_prev = t2_inc_cur;
}
}
void ff_aac_tableinit(void)
{
static AVOnce init_static_once = AV_ONCE_INIT;
ff_thread_once(&init_static_once, aac_tableinit);
}
+8 -54
View File
@@ -30,7 +30,7 @@
#ifndef AVCODEC_AACTAB_H #ifndef AVCODEC_AACTAB_H
#define AVCODEC_AACTAB_H #define AVCODEC_AACTAB_H
#include "libavutil/mem.h" #include "libavutil/mem_internal.h"
#include "aac.h" #include "aac.h"
#include <stdint.h> #include <stdint.h>
@@ -42,51 +42,7 @@
extern float ff_aac_pow2sf_tab[428]; extern float ff_aac_pow2sf_tab[428];
extern float ff_aac_pow34sf_tab[428]; extern float ff_aac_pow34sf_tab[428];
static inline void ff_aac_tableinit(void) void ff_aac_tableinit(void);
{
int i;
/* 2^(i/16) for 0 <= i <= 15 */
static const float exp2_lut[] = {
1.00000000000000000000,
1.04427378242741384032,
1.09050773266525765921,
1.13878863475669165370,
1.18920711500272106672,
1.24185781207348404859,
1.29683955465100966593,
1.35425554693689272830,
1.41421356237309504880,
1.47682614593949931139,
1.54221082540794082361,
1.61049033194925430818,
1.68179283050742908606,
1.75625216037329948311,
1.83400808640934246349,
1.91520656139714729387,
};
float t1 = 8.8817841970012523233890533447265625e-16; // 2^(-50)
float t2 = 3.63797880709171295166015625e-12; // 2^(-38)
int t1_inc_cur, t2_inc_cur;
int t1_inc_prev = 0;
int t2_inc_prev = 8;
for (i = 0; i < 428; i++) {
t1_inc_cur = 4 * (i % 4);
t2_inc_cur = (8 + 3*i) % 16;
if (t1_inc_cur < t1_inc_prev)
t1 *= 2;
if (t2_inc_cur < t2_inc_prev)
t2 *= 2;
// A much more efficient and accurate way of doing:
// ff_aac_pow2sf_tab[i] = pow(2, (i - POW_SF2_ZERO) / 4.0);
// ff_aac_pow34sf_tab[i] = pow(ff_aac_pow2sf_tab[i], 3.0/4.0);
ff_aac_pow2sf_tab[i] = t1 * exp2_lut[t1_inc_cur];
ff_aac_pow34sf_tab[i] = t2 * exp2_lut[t2_inc_cur];
t1_inc_prev = t1_inc_cur;
t2_inc_prev = t2_inc_cur;
}
}
/* @name ltp_coef /* @name ltp_coef
* Table of the LTP coefficients * Table of the LTP coefficients
@@ -136,17 +92,15 @@ static const INTFLOAT * const tns_tmp2_map[4] = {
*/ */
DECLARE_ALIGNED(32, extern float, ff_aac_kbd_long_1024)[1024]; DECLARE_ALIGNED(32, extern float, ff_aac_kbd_long_1024)[1024];
DECLARE_ALIGNED(32, extern float, ff_aac_kbd_short_128)[128]; DECLARE_ALIGNED(32, extern float, ff_aac_kbd_short_128)[128];
DECLARE_ALIGNED(32, extern float, ff_aac_kbd_long_960)[960];
DECLARE_ALIGNED(32, extern float, ff_aac_kbd_short_120)[120];
DECLARE_ALIGNED(32, extern int, ff_aac_kbd_long_1024_fixed)[1024];
DECLARE_ALIGNED(32, extern int, ff_aac_kbd_long_512_fixed)[512];
DECLARE_ALIGNED(32, extern int, ff_aac_kbd_short_128_fixed)[128];
DECLARE_ALIGNED(32, extern const float, ff_aac_eld_window_512)[1920]; DECLARE_ALIGNED(32, extern const float, ff_aac_eld_window_512)[1920];
DECLARE_ALIGNED(32, extern const int, ff_aac_eld_window_512_fixed)[1920]; DECLARE_ALIGNED(32, extern const int, ff_aac_eld_window_512_fixed)[1920];
DECLARE_ALIGNED(32, extern const float, ff_aac_eld_window_480)[1800]; DECLARE_ALIGNED(32, extern const float, ff_aac_eld_window_480)[1800];
DECLARE_ALIGNED(32, extern const int, ff_aac_eld_window_480_fixed)[1800]; DECLARE_ALIGNED(32, extern const int, ff_aac_eld_window_480_fixed)[1800];
// @} // @}
/* Initializes data shared between float decoder and encoder. */
void ff_aac_float_common_init(void);
/* @name number of scalefactor window bands for long and short transform windows respectively /* @name number of scalefactor window bands for long and short transform windows respectively
* @{ * @{
*/ */
@@ -167,9 +121,9 @@ extern const uint16_t * const ff_aac_spectral_codes[11];
extern const uint8_t * const ff_aac_spectral_bits [11]; extern const uint8_t * const ff_aac_spectral_bits [11];
extern const uint16_t ff_aac_spectral_sizes[11]; extern const uint16_t ff_aac_spectral_sizes[11];
extern const float *ff_aac_codebook_vectors[]; extern const float *const ff_aac_codebook_vectors[];
extern const float *ff_aac_codebook_vector_vals[]; extern const float *const ff_aac_codebook_vector_vals[];
extern const uint16_t *ff_aac_codebook_vector_idx[]; extern const uint16_t *const ff_aac_codebook_vector_idx[];
extern const uint16_t * const ff_swb_offset_1024[13]; extern const uint16_t * const ff_swb_offset_1024[13];
extern const uint16_t * const ff_swb_offset_960 [13]; extern const uint16_t * const ff_swb_offset_960 [13];
+3
View File
@@ -61,3 +61,6 @@ NEON-OBJS-$(CONFIG_VP9_DECODER) += aarch64/vp9itxfm_16bpp_neon.o \
aarch64/vp9lpf_neon.o \ aarch64/vp9lpf_neon.o \
aarch64/vp9mc_16bpp_neon.o \ aarch64/vp9mc_16bpp_neon.o \
aarch64/vp9mc_neon.o aarch64/vp9mc_neon.o
NEON-OBJS-$(CONFIG_HEVC_DECODER) += aarch64/hevcdsp_idct_neon.o \
aarch64/hevcdsp_init_aarch64.o \
aarch64/hevcdsp_sao_neon.o
+621
View File
@@ -0,0 +1,621 @@
/*
* ARM NEON optimised IDCT functions for HEVC decoding
* Copyright (c) 2014 Seppo Tomperi <seppo.tomperi@vtt.fi>
* Copyright (c) 2017 Alexandra Hájková
*
* Ported from arm/hevcdsp_idct_neon.S by
* Copyright (c) 2020 Reimar Döffinger
* Copyright (c) 2020 Josh Dekker
*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "libavutil/aarch64/asm.S"
const trans, align=4
.short 64, 83, 64, 36
.short 89, 75, 50, 18
.short 90, 87, 80, 70
.short 57, 43, 25, 9
.short 90, 90, 88, 85
.short 82, 78, 73, 67
.short 61, 54, 46, 38
.short 31, 22, 13, 4
endconst
.macro clip10 in1, in2, c1, c2
smax \in1, \in1, \c1
smax \in2, \in2, \c1
smin \in1, \in1, \c2
smin \in2, \in2, \c2
.endm
function ff_hevc_add_residual_4x4_8_neon, export=1
ld1 {v0.8h-v1.8h}, [x1]
ld1 {v2.s}[0], [x0], x2
ld1 {v2.s}[1], [x0], x2
ld1 {v2.s}[2], [x0], x2
ld1 {v2.s}[3], [x0], x2
sub x0, x0, x2, lsl #2
uxtl v6.8h, v2.8b
uxtl2 v7.8h, v2.16b
sqadd v0.8h, v0.8h, v6.8h
sqadd v1.8h, v1.8h, v7.8h
sqxtun v0.8b, v0.8h
sqxtun2 v0.16b, v1.8h
st1 {v0.s}[0], [x0], x2
st1 {v0.s}[1], [x0], x2
st1 {v0.s}[2], [x0], x2
st1 {v0.s}[3], [x0], x2
ret
endfunc
function ff_hevc_add_residual_4x4_10_neon, export=1
mov x12, x0
ld1 {v0.8h-v1.8h}, [x1]
ld1 {v2.d}[0], [x12], x2
ld1 {v2.d}[1], [x12], x2
ld1 {v3.d}[0], [x12], x2
sqadd v0.8h, v0.8h, v2.8h
ld1 {v3.d}[1], [x12], x2
movi v4.8h, #0
sqadd v1.8h, v1.8h, v3.8h
mvni v5.8h, #0xFC, lsl #8 // movi #0x3FF
clip10 v0.8h, v1.8h, v4.8h, v5.8h
st1 {v0.d}[0], [x0], x2
st1 {v0.d}[1], [x0], x2
st1 {v1.d}[0], [x0], x2
st1 {v1.d}[1], [x0], x2
ret
endfunc
function ff_hevc_add_residual_8x8_8_neon, export=1
add x12, x0, x2
add x2, x2, x2
mov x3, #8
1: subs x3, x3, #2
ld1 {v2.d}[0], [x0]
ld1 {v2.d}[1], [x12]
uxtl v3.8h, v2.8b
ld1 {v0.8h-v1.8h}, [x1], #32
uxtl2 v2.8h, v2.16b
sqadd v0.8h, v0.8h, v3.8h
sqadd v1.8h, v1.8h, v2.8h
sqxtun v0.8b, v0.8h
sqxtun2 v0.16b, v1.8h
st1 {v0.d}[0], [x0], x2
st1 {v0.d}[1], [x12], x2
bne 1b
ret
endfunc
function ff_hevc_add_residual_8x8_10_neon, export=1
add x12, x0, x2
add x2, x2, x2
mov x3, #8
movi v4.8h, #0
mvni v5.8h, #0xFC, lsl #8 // movi #0x3FF
1: subs x3, x3, #2
ld1 {v0.8h-v1.8h}, [x1], #32
ld1 {v2.8h}, [x0]
sqadd v0.8h, v0.8h, v2.8h
ld1 {v3.8h}, [x12]
sqadd v1.8h, v1.8h, v3.8h
clip10 v0.8h, v1.8h, v4.8h, v5.8h
st1 {v0.8h}, [x0], x2
st1 {v1.8h}, [x12], x2
bne 1b
ret
endfunc
function ff_hevc_add_residual_16x16_8_neon, export=1
mov x3, #16
add x12, x0, x2
add x2, x2, x2
1: subs x3, x3, #2
ld1 {v16.16b}, [x0]
ld1 {v0.8h-v3.8h}, [x1], #64
ld1 {v19.16b}, [x12]
uxtl v17.8h, v16.8b
uxtl2 v18.8h, v16.16b
uxtl v20.8h, v19.8b
uxtl2 v21.8h, v19.16b
sqadd v0.8h, v0.8h, v17.8h
sqadd v1.8h, v1.8h, v18.8h
sqadd v2.8h, v2.8h, v20.8h
sqadd v3.8h, v3.8h, v21.8h
sqxtun v0.8b, v0.8h
sqxtun2 v0.16b, v1.8h
sqxtun v1.8b, v2.8h
sqxtun2 v1.16b, v3.8h
st1 {v0.16b}, [x0], x2
st1 {v1.16b}, [x12], x2
bne 1b
ret
endfunc
function ff_hevc_add_residual_16x16_10_neon, export=1
mov x3, #16
movi v20.8h, #0
mvni v21.8h, #0xFC, lsl #8 // movi #0x3FF
add x12, x0, x2
add x2, x2, x2
1: subs x3, x3, #2
ld1 {v16.8h-v17.8h}, [x0]
ld1 {v0.8h-v3.8h}, [x1], #64
sqadd v0.8h, v0.8h, v16.8h
ld1 {v18.8h-v19.8h}, [x12]
sqadd v1.8h, v1.8h, v17.8h
sqadd v2.8h, v2.8h, v18.8h
sqadd v3.8h, v3.8h, v19.8h
clip10 v0.8h, v1.8h, v20.8h, v21.8h
clip10 v2.8h, v3.8h, v20.8h, v21.8h
st1 {v0.8h-v1.8h}, [x0], x2
st1 {v2.8h-v3.8h}, [x12], x2
bne 1b
ret
endfunc
function ff_hevc_add_residual_32x32_8_neon, export=1
add x12, x0, x2
add x2, x2, x2
mov x3, #32
1: subs x3, x3, #2
ld1 {v20.16b, v21.16b}, [x0]
uxtl v16.8h, v20.8b
uxtl2 v17.8h, v20.16b
ld1 {v22.16b, v23.16b}, [x12]
uxtl v18.8h, v21.8b
uxtl2 v19.8h, v21.16b
uxtl v20.8h, v22.8b
ld1 {v0.8h-v3.8h}, [x1], #64
ld1 {v4.8h-v7.8h}, [x1], #64
uxtl2 v21.8h, v22.16b
uxtl v22.8h, v23.8b
uxtl2 v23.8h, v23.16b
sqadd v0.8h, v0.8h, v16.8h
sqadd v1.8h, v1.8h, v17.8h
sqadd v2.8h, v2.8h, v18.8h
sqadd v3.8h, v3.8h, v19.8h
sqadd v4.8h, v4.8h, v20.8h
sqadd v5.8h, v5.8h, v21.8h
sqadd v6.8h, v6.8h, v22.8h
sqadd v7.8h, v7.8h, v23.8h
sqxtun v0.8b, v0.8h
sqxtun2 v0.16b, v1.8h
sqxtun v1.8b, v2.8h
sqxtun2 v1.16b, v3.8h
sqxtun v2.8b, v4.8h
sqxtun2 v2.16b, v5.8h
st1 {v0.16b, v1.16b}, [x0], x2
sqxtun v3.8b, v6.8h
sqxtun2 v3.16b, v7.8h
st1 {v2.16b, v3.16b}, [x12], x2
bne 1b
ret
endfunc
function ff_hevc_add_residual_32x32_10_neon, export=1
mov x3, #32
movi v20.8h, #0
mvni v21.8h, #0xFC, lsl #8 // movi #0x3FF
1: subs x3, x3, #1
ld1 {v0.8h-v3.8h}, [x1], #64
ld1 {v16.8h-v19.8h}, [x0]
sqadd v0.8h, v0.8h, v16.8h
sqadd v1.8h, v1.8h, v17.8h
sqadd v2.8h, v2.8h, v18.8h
sqadd v3.8h, v3.8h, v19.8h
clip10 v0.8h, v1.8h, v20.8h, v21.8h
clip10 v2.8h, v3.8h, v20.8h, v21.8h
st1 {v0.8h-v3.8h}, [x0], x2
bne 1b
ret
endfunc
.macro sum_sub out, in, c, op, p
.ifc \op, +
smlal\p \out, \in, \c
.else
smlsl\p \out, \in, \c
.endif
.endm
.macro fixsqrshrn d, dt, n, m
.ifc \dt, .8h
sqrshrn2 \d\dt, \n\().4s, \m
.else
sqrshrn \n\().4h, \n\().4s, \m
mov \d\().d[0], \n\().d[0]
.endif
.endm
// uses and clobbers v28-v31 as temp registers
.macro tr_4x4_8 in0, in1, in2, in3, out0, out1, out2, out3, p1, p2
sshll\p1 v28.4s, \in0, #6
mov v29.16b, v28.16b
smull\p1 v30.4s, \in1, v0.h[1]
smull\p1 v31.4s, \in1, v0.h[3]
smlal\p2 v28.4s, \in2, v0.h[0] //e0
smlsl\p2 v29.4s, \in2, v0.h[0] //e1
smlal\p2 v30.4s, \in3, v0.h[3] //o0
smlsl\p2 v31.4s, \in3, v0.h[1] //o1
add \out0, v28.4s, v30.4s
add \out1, v29.4s, v31.4s
sub \out2, v29.4s, v31.4s
sub \out3, v28.4s, v30.4s
.endm
.macro transpose8_4x4 r0, r1, r2, r3
trn1 v2.8h, \r0\().8h, \r1\().8h
trn2 v3.8h, \r0\().8h, \r1\().8h
trn1 v4.8h, \r2\().8h, \r3\().8h
trn2 v5.8h, \r2\().8h, \r3\().8h
trn1 \r0\().4s, v2.4s, v4.4s
trn2 \r2\().4s, v2.4s, v4.4s
trn1 \r1\().4s, v3.4s, v5.4s
trn2 \r3\().4s, v3.4s, v5.4s
.endm
.macro transpose_8x8 r0, r1, r2, r3, r4, r5, r6, r7
transpose8_4x4 \r0, \r1, \r2, \r3
transpose8_4x4 \r4, \r5, \r6, \r7
.endm
.macro tr_8x4 shift, in0,in0t, in1,in1t, in2,in2t, in3,in3t, in4,in4t, in5,in5t, in6,in6t, in7,in7t, p1, p2
tr_4x4_8 \in0\in0t, \in2\in2t, \in4\in4t, \in6\in6t, v24.4s, v25.4s, v26.4s, v27.4s, \p1, \p2
smull\p1 v30.4s, \in1\in1t, v0.h[6]
smull\p1 v28.4s, \in1\in1t, v0.h[4]
smull\p1 v29.4s, \in1\in1t, v0.h[5]
sum_sub v30.4s, \in3\in3t, v0.h[4], -, \p1
sum_sub v28.4s, \in3\in3t, v0.h[5], +, \p1
sum_sub v29.4s, \in3\in3t, v0.h[7], -, \p1
sum_sub v30.4s, \in5\in5t, v0.h[7], +, \p2
sum_sub v28.4s, \in5\in5t, v0.h[6], +, \p2
sum_sub v29.4s, \in5\in5t, v0.h[4], -, \p2
sum_sub v30.4s, \in7\in7t, v0.h[5], +, \p2
sum_sub v28.4s, \in7\in7t, v0.h[7], +, \p2
sum_sub v29.4s, \in7\in7t, v0.h[6], -, \p2
add v31.4s, v26.4s, v30.4s
sub v26.4s, v26.4s, v30.4s
fixsqrshrn \in2,\in2t, v31, \shift
smull\p1 v31.4s, \in1\in1t, v0.h[7]
sum_sub v31.4s, \in3\in3t, v0.h[6], -, \p1
sum_sub v31.4s, \in5\in5t, v0.h[5], +, \p2
sum_sub v31.4s, \in7\in7t, v0.h[4], -, \p2
fixsqrshrn \in5,\in5t, v26, \shift
add v26.4s, v24.4s, v28.4s
sub v24.4s, v24.4s, v28.4s
add v28.4s, v25.4s, v29.4s
sub v25.4s, v25.4s, v29.4s
add v30.4s, v27.4s, v31.4s
sub v27.4s, v27.4s, v31.4s
fixsqrshrn \in0,\in0t, v26, \shift
fixsqrshrn \in7,\in7t, v24, \shift
fixsqrshrn \in1,\in1t, v28, \shift
fixsqrshrn \in6,\in6t, v25, \shift
fixsqrshrn \in3,\in3t, v30, \shift
fixsqrshrn \in4,\in4t, v27, \shift
.endm
.macro idct_8x8 bitdepth
function ff_hevc_idct_8x8_\bitdepth\()_neon, export=1
//x0 - coeffs
mov x1, x0
ld1 {v16.8h-v19.8h}, [x1], #64
ld1 {v20.8h-v23.8h}, [x1]
movrel x1, trans
ld1 {v0.8h}, [x1]
tr_8x4 7, v16,.4h, v17,.4h, v18,.4h, v19,.4h, v20,.4h, v21,.4h, v22,.4h, v23,.4h
tr_8x4 7, v16,.8h, v17,.8h, v18,.8h, v19,.8h, v20,.8h, v21,.8h, v22,.8h, v23,.8h, 2, 2
transpose_8x8 v16, v17, v18, v19, v20, v21, v22, v23
tr_8x4 20 - \bitdepth, v16,.4h, v17,.4h, v18,.4h, v19,.4h, v16,.8h, v17,.8h, v18,.8h, v19,.8h, , 2
tr_8x4 20 - \bitdepth, v20,.4h, v21,.4h, v22,.4h, v23,.4h, v20,.8h, v21,.8h, v22,.8h, v23,.8h, , 2
transpose_8x8 v16, v17, v18, v19, v20, v21, v22, v23
mov x1, x0
st1 {v16.8h-v19.8h}, [x1], #64
st1 {v20.8h-v23.8h}, [x1]
ret
endfunc
.endm
.macro butterfly e, o, tmp_p, tmp_m
add \tmp_p, \e, \o
sub \tmp_m, \e, \o
.endm
.macro tr16_8x4 in0, in1, in2, in3, offset
tr_4x4_8 \in0\().4h, \in1\().4h, \in2\().4h, \in3\().4h, v24.4s, v25.4s, v26.4s, v27.4s
smull2 v28.4s, \in0\().8h, v0.h[4]
smull2 v29.4s, \in0\().8h, v0.h[5]
smull2 v30.4s, \in0\().8h, v0.h[6]
smull2 v31.4s, \in0\().8h, v0.h[7]
sum_sub v28.4s, \in1\().8h, v0.h[5], +, 2
sum_sub v29.4s, \in1\().8h, v0.h[7], -, 2
sum_sub v30.4s, \in1\().8h, v0.h[4], -, 2
sum_sub v31.4s, \in1\().8h, v0.h[6], -, 2
sum_sub v28.4s, \in2\().8h, v0.h[6], +, 2
sum_sub v29.4s, \in2\().8h, v0.h[4], -, 2
sum_sub v30.4s, \in2\().8h, v0.h[7], +, 2
sum_sub v31.4s, \in2\().8h, v0.h[5], +, 2
sum_sub v28.4s, \in3\().8h, v0.h[7], +, 2
sum_sub v29.4s, \in3\().8h, v0.h[6], -, 2
sum_sub v30.4s, \in3\().8h, v0.h[5], +, 2
sum_sub v31.4s, \in3\().8h, v0.h[4], -, 2
butterfly v24.4s, v28.4s, v16.4s, v23.4s
butterfly v25.4s, v29.4s, v17.4s, v22.4s
butterfly v26.4s, v30.4s, v18.4s, v21.4s
butterfly v27.4s, v31.4s, v19.4s, v20.4s
add x4, sp, #\offset
st1 {v16.4s-v19.4s}, [x4], #64
st1 {v20.4s-v23.4s}, [x4]
.endm
.macro load16 in0, in1, in2, in3
ld1 {\in0}[0], [x1], x2
ld1 {\in0}[1], [x3], x2
ld1 {\in1}[0], [x1], x2
ld1 {\in1}[1], [x3], x2
ld1 {\in2}[0], [x1], x2
ld1 {\in2}[1], [x3], x2
ld1 {\in3}[0], [x1], x2
ld1 {\in3}[1], [x3], x2
.endm
.macro add_member in, t0, t1, t2, t3, t4, t5, t6, t7, op0, op1, op2, op3, op4, op5, op6, op7, p
sum_sub v21.4s, \in, \t0, \op0, \p
sum_sub v22.4s, \in, \t1, \op1, \p
sum_sub v23.4s, \in, \t2, \op2, \p
sum_sub v24.4s, \in, \t3, \op3, \p
sum_sub v25.4s, \in, \t4, \op4, \p
sum_sub v26.4s, \in, \t5, \op5, \p
sum_sub v27.4s, \in, \t6, \op6, \p
sum_sub v28.4s, \in, \t7, \op7, \p
.endm
.macro butterfly16 in0, in1, in2, in3, in4, in5, in6, in7
add v20.4s, \in0, \in1
sub \in0, \in0, \in1
add \in1, \in2, \in3
sub \in2, \in2, \in3
add \in3, \in4, \in5
sub \in4, \in4, \in5
add \in5, \in6, \in7
sub \in6, \in6, \in7
.endm
.macro store16 in0, in1, in2, in3, rx
st1 {\in0}[0], [x1], x2
st1 {\in0}[1], [x3], \rx
st1 {\in1}[0], [x1], x2
st1 {\in1}[1], [x3], \rx
st1 {\in2}[0], [x1], x2
st1 {\in2}[1], [x3], \rx
st1 {\in3}[0], [x1], x2
st1 {\in3}[1], [x3], \rx
.endm
.macro scale out0, out1, out2, out3, in0, in1, in2, in3, in4, in5, in6, in7, shift
sqrshrn \out0\().4h, \in0, \shift
sqrshrn2 \out0\().8h, \in1, \shift
sqrshrn \out1\().4h, \in2, \shift
sqrshrn2 \out1\().8h, \in3, \shift
sqrshrn \out2\().4h, \in4, \shift
sqrshrn2 \out2\().8h, \in5, \shift
sqrshrn \out3\().4h, \in6, \shift
sqrshrn2 \out3\().8h, \in7, \shift
.endm
.macro transpose16_4x4_2 r0, r1, r2, r3
// lower halves
trn1 v2.4h, \r0\().4h, \r1\().4h
trn2 v3.4h, \r0\().4h, \r1\().4h
trn1 v4.4h, \r2\().4h, \r3\().4h
trn2 v5.4h, \r2\().4h, \r3\().4h
trn1 v6.2s, v2.2s, v4.2s
trn2 v7.2s, v2.2s, v4.2s
trn1 v2.2s, v3.2s, v5.2s
trn2 v4.2s, v3.2s, v5.2s
mov \r0\().d[0], v6.d[0]
mov \r2\().d[0], v7.d[0]
mov \r1\().d[0], v2.d[0]
mov \r3\().d[0], v4.d[0]
// upper halves in reverse order
trn1 v2.8h, \r3\().8h, \r2\().8h
trn2 v3.8h, \r3\().8h, \r2\().8h
trn1 v4.8h, \r1\().8h, \r0\().8h
trn2 v5.8h, \r1\().8h, \r0\().8h
trn1 v6.4s, v2.4s, v4.4s
trn2 v7.4s, v2.4s, v4.4s
trn1 v2.4s, v3.4s, v5.4s
trn2 v4.4s, v3.4s, v5.4s
mov \r3\().d[1], v6.d[1]
mov \r1\().d[1], v7.d[1]
mov \r2\().d[1], v2.d[1]
mov \r0\().d[1], v4.d[1]
.endm
.macro tr_16x4 name, shift, offset, step
function func_tr_16x4_\name
mov x1, x5
add x3, x5, #(\step * 64)
mov x2, #(\step * 128)
load16 v16.d, v17.d, v18.d, v19.d
movrel x1, trans
ld1 {v0.8h}, [x1]
tr16_8x4 v16, v17, v18, v19, \offset
add x1, x5, #(\step * 32)
add x3, x5, #(\step * 3 *32)
mov x2, #(\step * 128)
load16 v20.d, v17.d, v18.d, v19.d
movrel x1, trans, 16
ld1 {v1.8h}, [x1]
smull v21.4s, v20.4h, v1.h[0]
smull v22.4s, v20.4h, v1.h[1]
smull v23.4s, v20.4h, v1.h[2]
smull v24.4s, v20.4h, v1.h[3]
smull v25.4s, v20.4h, v1.h[4]
smull v26.4s, v20.4h, v1.h[5]
smull v27.4s, v20.4h, v1.h[6]
smull v28.4s, v20.4h, v1.h[7]
add_member v20.8h, v1.h[1], v1.h[4], v1.h[7], v1.h[5], v1.h[2], v1.h[0], v1.h[3], v1.h[6], +, +, +, -, -, -, -, -, 2
add_member v17.4h, v1.h[2], v1.h[7], v1.h[3], v1.h[1], v1.h[6], v1.h[4], v1.h[0], v1.h[5], +, +, -, -, -, +, +, +
add_member v17.8h, v1.h[3], v1.h[5], v1.h[1], v1.h[7], v1.h[0], v1.h[6], v1.h[2], v1.h[4], +, -, -, +, +, +, -, -, 2
add_member v18.4h, v1.h[4], v1.h[2], v1.h[6], v1.h[0], v1.h[7], v1.h[1], v1.h[5], v1.h[3], +, -, -, +, -, -, +, +
add_member v18.8h, v1.h[5], v1.h[0], v1.h[4], v1.h[6], v1.h[1], v1.h[3], v1.h[7], v1.h[2], +, -, +, +, -, +, +, -, 2
add_member v19.4h, v1.h[6], v1.h[3], v1.h[0], v1.h[2], v1.h[5], v1.h[7], v1.h[4], v1.h[1], +, -, +, -, +, +, -, +
add_member v19.8h, v1.h[7], v1.h[6], v1.h[5], v1.h[4], v1.h[3], v1.h[2], v1.h[1], v1.h[0], +, -, +, -, +, -, +, -, 2
add x4, sp, #\offset
ld1 {v16.4s-v19.4s}, [x4], #64
butterfly16 v16.4s, v21.4s, v17.4s, v22.4s, v18.4s, v23.4s, v19.4s, v24.4s
scale v29, v30, v31, v24, v20.4s, v16.4s, v21.4s, v17.4s, v22.4s, v18.4s, v23.4s, v19.4s, \shift
transpose16_4x4_2 v29, v30, v31, v24
mov x1, x6
add x3, x6, #(24 +3*32)
mov x2, #32
mov x4, #-32
store16 v29.d, v30.d, v31.d, v24.d, x4
add x4, sp, #(\offset + 64)
ld1 {v16.4s-v19.4s}, [x4]
butterfly16 v16.4s, v25.4s, v17.4s, v26.4s, v18.4s, v27.4s, v19.4s, v28.4s
scale v29, v30, v31, v20, v20.4s, v16.4s, v25.4s, v17.4s, v26.4s, v18.4s, v27.4s, v19.4s, \shift
transpose16_4x4_2 v29, v30, v31, v20
add x1, x6, #8
add x3, x6, #(16 + 3 * 32)
mov x2, #32
mov x4, #-32
store16 v29.d, v30.d, v31.d, v20.d, x4
ret
endfunc
.endm
.macro idct_16x16 bitdepth
function ff_hevc_idct_16x16_\bitdepth\()_neon, export=1
//r0 - coeffs
mov x15, x30
// allocate a temp buffer
sub sp, sp, #640
.irp i, 0, 1, 2, 3
add x5, x0, #(8 * \i)
add x6, sp, #(8 * \i * 16)
bl func_tr_16x4_firstpass
.endr
.irp i, 0, 1, 2, 3
add x5, sp, #(8 * \i)
add x6, x0, #(8 * \i * 16)
bl func_tr_16x4_secondpass_\bitdepth
.endr
add sp, sp, #640
mov x30, x15
ret
endfunc
.endm
idct_8x8 8
idct_8x8 10
tr_16x4 firstpass, 7, 512, 1
tr_16x4 secondpass_8, 20 - 8, 512, 1
tr_16x4 secondpass_10, 20 - 10, 512, 1
idct_16x16 8
idct_16x16 10
// void ff_hevc_idct_NxN_dc_DEPTH_neon(int16_t *coeffs)
.macro idct_dc size, bitdepth
function ff_hevc_idct_\size\()x\size\()_dc_\bitdepth\()_neon, export=1
movi v1.8h, #((1 << (14 - \bitdepth))+1)
ld1r {v4.8h}, [x0]
add v4.8h, v4.8h, v1.8h
sshr v0.8h, v4.8h, #(15 - \bitdepth)
sshr v1.8h, v4.8h, #(15 - \bitdepth)
.if \size > 4
sshr v2.8h, v4.8h, #(15 - \bitdepth)
sshr v3.8h, v4.8h, #(15 - \bitdepth)
.if \size > 16 /* dc 32x32 */
mov x2, #4
1:
subs x2, x2, #1
.endif
add x12, x0, #64
mov x13, #128
.if \size > 8 /* dc 16x16 */
st1 {v0.8h-v3.8h}, [x0], x13
st1 {v0.8h-v3.8h}, [x12], x13
st1 {v0.8h-v3.8h}, [x0], x13
st1 {v0.8h-v3.8h}, [x12], x13
st1 {v0.8h-v3.8h}, [x0], x13
st1 {v0.8h-v3.8h}, [x12], x13
.endif /* dc 8x8 */
st1 {v0.8h-v3.8h}, [x0], x13
st1 {v0.8h-v3.8h}, [x12], x13
.if \size > 16 /* dc 32x32 */
bne 1b
.endif
.else /* dc 4x4 */
st1 {v0.8h-v1.8h}, [x0]
.endif
ret
endfunc
.endm
idct_dc 4, 8
idct_dc 4, 10
idct_dc 8, 8
idct_dc 8, 10
idct_dc 16, 8
idct_dc 16, 10
idct_dc 32, 8
idct_dc 32, 10
+92
View File
@@ -0,0 +1,92 @@
/*
* Copyright (c) 2020 Reimar Döffinger
*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdint.h>
#include "libavutil/attributes.h"
#include "libavutil/cpu.h"
#include "libavutil/aarch64/cpu.h"
#include "libavcodec/hevcdsp.h"
void ff_hevc_add_residual_4x4_8_neon(uint8_t *_dst, int16_t *coeffs,
ptrdiff_t stride);
void ff_hevc_add_residual_4x4_10_neon(uint8_t *_dst, int16_t *coeffs,
ptrdiff_t stride);
void ff_hevc_add_residual_8x8_8_neon(uint8_t *_dst, int16_t *coeffs,
ptrdiff_t stride);
void ff_hevc_add_residual_8x8_10_neon(uint8_t *_dst, int16_t *coeffs,
ptrdiff_t stride);
void ff_hevc_add_residual_16x16_8_neon(uint8_t *_dst, int16_t *coeffs,
ptrdiff_t stride);
void ff_hevc_add_residual_16x16_10_neon(uint8_t *_dst, int16_t *coeffs,
ptrdiff_t stride);
void ff_hevc_add_residual_32x32_8_neon(uint8_t *_dst, int16_t *coeffs,
ptrdiff_t stride);
void ff_hevc_add_residual_32x32_10_neon(uint8_t *_dst, int16_t *coeffs,
ptrdiff_t stride);
void ff_hevc_idct_8x8_8_neon(int16_t *coeffs, int col_limit);
void ff_hevc_idct_8x8_10_neon(int16_t *coeffs, int col_limit);
void ff_hevc_idct_16x16_8_neon(int16_t *coeffs, int col_limit);
void ff_hevc_idct_16x16_10_neon(int16_t *coeffs, int col_limit);
void ff_hevc_idct_4x4_dc_8_neon(int16_t *coeffs);
void ff_hevc_idct_8x8_dc_8_neon(int16_t *coeffs);
void ff_hevc_idct_16x16_dc_8_neon(int16_t *coeffs);
void ff_hevc_idct_32x32_dc_8_neon(int16_t *coeffs);
void ff_hevc_idct_4x4_dc_10_neon(int16_t *coeffs);
void ff_hevc_idct_8x8_dc_10_neon(int16_t *coeffs);
void ff_hevc_idct_16x16_dc_10_neon(int16_t *coeffs);
void ff_hevc_idct_32x32_dc_10_neon(int16_t *coeffs);
void ff_hevc_sao_band_filter_8x8_8_neon(uint8_t *_dst, uint8_t *_src,
ptrdiff_t stride_dst, ptrdiff_t stride_src,
int16_t *sao_offset_val, int sao_left_class,
int width, int height);
av_cold void ff_hevc_dsp_init_aarch64(HEVCDSPContext *c, const int bit_depth)
{
if (!have_neon(av_get_cpu_flags())) return;
if (bit_depth == 8) {
c->add_residual[0] = ff_hevc_add_residual_4x4_8_neon;
c->add_residual[1] = ff_hevc_add_residual_8x8_8_neon;
c->add_residual[2] = ff_hevc_add_residual_16x16_8_neon;
c->add_residual[3] = ff_hevc_add_residual_32x32_8_neon;
c->idct[1] = ff_hevc_idct_8x8_8_neon;
c->idct[2] = ff_hevc_idct_16x16_8_neon;
c->idct_dc[0] = ff_hevc_idct_4x4_dc_8_neon;
c->idct_dc[1] = ff_hevc_idct_8x8_dc_8_neon;
c->idct_dc[2] = ff_hevc_idct_16x16_dc_8_neon;
c->idct_dc[3] = ff_hevc_idct_32x32_dc_8_neon;
c->sao_band_filter[0] = ff_hevc_sao_band_filter_8x8_8_neon;
}
if (bit_depth == 10) {
c->add_residual[0] = ff_hevc_add_residual_4x4_10_neon;
c->add_residual[1] = ff_hevc_add_residual_8x8_10_neon;
c->add_residual[2] = ff_hevc_add_residual_16x16_10_neon;
c->add_residual[3] = ff_hevc_add_residual_32x32_10_neon;
c->idct[1] = ff_hevc_idct_8x8_10_neon;
c->idct[2] = ff_hevc_idct_16x16_10_neon;
c->idct_dc[0] = ff_hevc_idct_4x4_dc_10_neon;
c->idct_dc[1] = ff_hevc_idct_8x8_dc_10_neon;
c->idct_dc[2] = ff_hevc_idct_16x16_dc_10_neon;
c->idct_dc[3] = ff_hevc_idct_32x32_dc_10_neon;
}
}
+87
View File
@@ -0,0 +1,87 @@
/* -*-arm64-*-
* vim: syntax=arm64asm
*
* AArch64 NEON optimised SAO functions for HEVC decoding
*
* Copyright (c) 2020 Josh Dekker <josh@itanimul.li>
*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "libavutil/aarch64/asm.S"
// void sao_band_filter(uint8_t *_dst, uint8_t *_src,
// ptrdiff_t stride_dst, ptrdiff_t stride_src,
// int16_t *sao_offset_val, int sao_left_class,
// int width, int height)
function ff_hevc_sao_band_filter_8x8_8_neon, export=1
sub sp, sp, #64
stp xzr, xzr, [sp]
stp xzr, xzr, [sp, #16]
stp xzr, xzr, [sp, #32]
stp xzr, xzr, [sp, #48]
mov w8, #4
0:
ldrsh x9, [x4, x8, lsl #1] // x9 = sao_offset_val[k+1]
subs w8, w8, #1
add w10, w8, w5 // x10 = k + sao_left_class
and w10, w10, #0x1F
strh w9, [sp, x10, lsl #1]
bne 0b
ld1 {v16.16b-v19.16b}, [sp], #64
movi v20.8h, #1
1: // beginning of line
mov w8, w6
2:
// Simple layout for accessing 16bit values
// with 8bit LUT.
//
// 00 01 02 03 04 05 06 07
// +----------------------------------->
// |xDE#xAD|xCA#xFE|xBE#xEF|xFE#xED|....
// +----------------------------------->
// i-0 i-1 i-2 i-3
// dst[x] = av_clip_pixel(src[x] + offset_table[src[x] >> shift]);
ld1 {v2.8b}, [x1]
// load src[x]
uxtl v0.8h, v2.8b
// >> shift
ushr v2.8h, v0.8h, #3 // BIT_DEPTH - 3
// x2 (access lower short)
shl v1.8h, v2.8h, #1 // low (x2, accessing short)
// +1 access upper short
add v3.8h, v1.8h, v20.8h
// shift insert index to upper byte
sli v1.8h, v3.8h, #8
// table
tbx v2.16b, {v16.16b-v19.16b}, v1.16b
// src[x] + table
add v1.8h, v0.8h, v2.8h
// clip + narrow
sqxtun v4.8b, v1.8h
// store
st1 {v4.8b}, [x0]
// done 8 pixels
subs w8, w8, #8
bne 2b
// finished line
subs w7, w7, #1
add x0, x0, x2 // dst += stride_dst
add x1, x1, x3 // src += stride_src
bne 1b
ret
endfunc
+17 -15
View File
@@ -29,6 +29,7 @@ wrap(avcodec_open2(AVCodecContext *avctx,
testneonclobbers(avcodec_open2, avctx, codec, options); testneonclobbers(avcodec_open2, avctx, codec, options);
} }
#if FF_API_OLD_ENCDEC
wrap(avcodec_decode_audio4(AVCodecContext *avctx, wrap(avcodec_decode_audio4(AVCodecContext *avctx,
AVFrame *frame, AVFrame *frame,
int *got_frame_ptr, int *got_frame_ptr,
@@ -47,15 +48,6 @@ wrap(avcodec_decode_video2(AVCodecContext *avctx,
got_picture_ptr, avpkt); got_picture_ptr, avpkt);
} }
wrap(avcodec_decode_subtitle2(AVCodecContext *avctx,
AVSubtitle *sub,
int *got_sub_ptr,
AVPacket *avpkt))
{
testneonclobbers(avcodec_decode_subtitle2, avctx, sub,
got_sub_ptr, avpkt);
}
wrap(avcodec_encode_audio2(AVCodecContext *avctx, wrap(avcodec_encode_audio2(AVCodecContext *avctx,
AVPacket *avpkt, AVPacket *avpkt,
const AVFrame *frame, const AVFrame *frame,
@@ -65,6 +57,22 @@ wrap(avcodec_encode_audio2(AVCodecContext *avctx,
got_packet_ptr); got_packet_ptr);
} }
wrap(avcodec_encode_video2(AVCodecContext *avctx, AVPacket *avpkt,
const AVFrame *frame, int *got_packet_ptr))
{
testneonclobbers(avcodec_encode_video2, avctx, avpkt, frame, got_packet_ptr);
}
#endif
wrap(avcodec_decode_subtitle2(AVCodecContext *avctx,
AVSubtitle *sub,
int *got_sub_ptr,
AVPacket *avpkt))
{
testneonclobbers(avcodec_decode_subtitle2, avctx, sub,
got_sub_ptr, avpkt);
}
wrap(avcodec_encode_subtitle(AVCodecContext *avctx, wrap(avcodec_encode_subtitle(AVCodecContext *avctx,
uint8_t *buf, int buf_size, uint8_t *buf, int buf_size,
const AVSubtitle *sub)) const AVSubtitle *sub))
@@ -72,12 +80,6 @@ wrap(avcodec_encode_subtitle(AVCodecContext *avctx,
testneonclobbers(avcodec_encode_subtitle, avctx, buf, buf_size, sub); testneonclobbers(avcodec_encode_subtitle, avctx, buf, buf_size, sub);
} }
wrap(avcodec_encode_video2(AVCodecContext *avctx, AVPacket *avpkt,
const AVFrame *frame, int *got_packet_ptr))
{
testneonclobbers(avcodec_encode_video2, avctx, avpkt, frame, got_packet_ptr);
}
wrap(avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt)) wrap(avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt))
{ {
testneonclobbers(avcodec_send_packet, avctx, avpkt); testneonclobbers(avcodec_send_packet, avctx, avpkt);
@@ -22,6 +22,7 @@
#include "libavutil/attributes.h" #include "libavutil/attributes.h"
#include "libavutil/internal.h" #include "libavutil/internal.h"
#include "libavutil/mem_internal.h"
#include "libavutil/aarch64/cpu.h" #include "libavutil/aarch64/cpu.h"
#include "vp9dsp_init.h" #include "vp9dsp_init.h"
+1
View File
@@ -22,6 +22,7 @@
#include "libavutil/attributes.h" #include "libavutil/attributes.h"
#include "libavutil/internal.h" #include "libavutil/internal.h"
#include "libavutil/mem_internal.h"
#include "libavutil/aarch64/cpu.h" #include "libavutil/aarch64/cpu.h"
#include "libavcodec/vp9dsp.h" #include "libavcodec/vp9dsp.h"
#include "vp9dsp_init.h" #include "vp9dsp_init.h"
-1
View File
@@ -27,7 +27,6 @@
#ifndef AVCODEC_AC3_H #ifndef AVCODEC_AC3_H
#define AVCODEC_AC3_H #define AVCODEC_AC3_H
#define AC3_MAX_CODED_FRAME_SIZE 3840 /* in bytes */
#define EAC3_MAX_CHANNELS 16 /**< maximum number of channels in EAC3 */ #define EAC3_MAX_CHANNELS 16 /**< maximum number of channels in EAC3 */
#define AC3_MAX_CHANNELS 7 /**< maximum number of channels, including coupling channel */ #define AC3_MAX_CHANNELS 7 /**< maximum number of channels, including coupling channel */
#define CPL_CH 0 /**< coupling channel index */ #define CPL_CH 0 /**< coupling channel index */
+11 -5
View File
@@ -33,6 +33,7 @@
#include "libavutil/crc.h" #include "libavutil/crc.h"
#include "libavutil/downmix_info.h" #include "libavutil/downmix_info.h"
#include "libavutil/opt.h" #include "libavutil/opt.h"
#include "libavutil/thread.h"
#include "bswapdsp.h" #include "bswapdsp.h"
#include "internal.h" #include "internal.h"
#include "aac_ac3_parser.h" #include "aac_ac3_parser.h"
@@ -183,23 +184,26 @@ static av_cold void ac3_tables_init(void)
*/ */
static av_cold int ac3_decode_init(AVCodecContext *avctx) static av_cold int ac3_decode_init(AVCodecContext *avctx)
{ {
static AVOnce init_static_once = AV_ONCE_INIT;
AC3DecodeContext *s = avctx->priv_data; AC3DecodeContext *s = avctx->priv_data;
int i; int i, ret;
s->avctx = avctx; s->avctx = avctx;
ac3_tables_init(); if ((ret = ff_mdct_init(&s->imdct_256, 8, 1, 1.0)) < 0 ||
ff_mdct_init(&s->imdct_256, 8, 1, 1.0); (ret = ff_mdct_init(&s->imdct_512, 9, 1, 1.0)) < 0)
ff_mdct_init(&s->imdct_512, 9, 1, 1.0); return ret;
AC3_RENAME(ff_kbd_window_init)(s->window, 5.0, 256); AC3_RENAME(ff_kbd_window_init)(s->window, 5.0, 256);
ff_bswapdsp_init(&s->bdsp); ff_bswapdsp_init(&s->bdsp);
#if (USE_FIXED) #if (USE_FIXED)
s->fdsp = avpriv_alloc_fixed_dsp(avctx->flags & AV_CODEC_FLAG_BITEXACT); s->fdsp = avpriv_alloc_fixed_dsp(avctx->flags & AV_CODEC_FLAG_BITEXACT);
#else #else
s->fdsp = avpriv_float_dsp_alloc(avctx->flags & AV_CODEC_FLAG_BITEXACT);
ff_fmt_convert_init(&s->fmt_conv, avctx); ff_fmt_convert_init(&s->fmt_conv, avctx);
s->fdsp = avpriv_float_dsp_alloc(avctx->flags & AV_CODEC_FLAG_BITEXACT);
#endif #endif
if (!s->fdsp)
return AVERROR(ENOMEM);
ff_ac3dsp_init(&s->ac3dsp, avctx->flags & AV_CODEC_FLAG_BITEXACT); ff_ac3dsp_init(&s->ac3dsp, avctx->flags & AV_CODEC_FLAG_BITEXACT);
av_lfg_init(&s->dith_state, 0); av_lfg_init(&s->dith_state, 0);
@@ -223,6 +227,8 @@ static av_cold int ac3_decode_init(AVCodecContext *avctx)
s->dlyptr[i] = s->delay[i]; s->dlyptr[i] = s->delay[i];
} }
ff_thread_once(&init_static_once, ac3_tables_init);
return 0; return 0;
} }
+2
View File
@@ -53,6 +53,8 @@
#include "libavutil/float_dsp.h" #include "libavutil/float_dsp.h"
#include "libavutil/fixed_dsp.h" #include "libavutil/fixed_dsp.h"
#include "libavutil/lfg.h" #include "libavutil/lfg.h"
#include "libavutil/mem_internal.h"
#include "ac3.h" #include "ac3.h"
#include "ac3dsp.h" #include "ac3dsp.h"
#include "bswapdsp.h" #include "bswapdsp.h"
+3 -1
View File
@@ -176,9 +176,11 @@ AVCodec ff_ac3_fixed_decoder = {
.init = ac3_decode_init, .init = ac3_decode_init,
.close = ac3_decode_end, .close = ac3_decode_end,
.decode = ac3_decode_frame, .decode = ac3_decode_frame,
.capabilities = AV_CODEC_CAP_DR1, .capabilities = AV_CODEC_CAP_CHANNEL_CONF |
AV_CODEC_CAP_DR1,
.long_name = NULL_IF_CONFIG_SMALL("ATSC A/52A (AC-3)"), .long_name = NULL_IF_CONFIG_SMALL("ATSC A/52A (AC-3)"),
.sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16P, .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16P,
AV_SAMPLE_FMT_NONE }, AV_SAMPLE_FMT_NONE },
.priv_class = &ac3_decoder_class, .priv_class = &ac3_decoder_class,
.caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP,
}; };
+6 -2
View File
@@ -61,11 +61,13 @@ AVCodec ff_ac3_decoder = {
.init = ac3_decode_init, .init = ac3_decode_init,
.close = ac3_decode_end, .close = ac3_decode_end,
.decode = ac3_decode_frame, .decode = ac3_decode_frame,
.capabilities = AV_CODEC_CAP_DR1, .capabilities = AV_CODEC_CAP_CHANNEL_CONF |
AV_CODEC_CAP_DR1,
.long_name = NULL_IF_CONFIG_SMALL("ATSC A/52A (AC-3)"), .long_name = NULL_IF_CONFIG_SMALL("ATSC A/52A (AC-3)"),
.sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP, .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP,
AV_SAMPLE_FMT_NONE }, AV_SAMPLE_FMT_NONE },
.priv_class = &ac3_decoder_class, .priv_class = &ac3_decoder_class,
.caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP,
}; };
#if CONFIG_EAC3_DECODER #if CONFIG_EAC3_DECODER
@@ -84,10 +86,12 @@ AVCodec ff_eac3_decoder = {
.init = ac3_decode_init, .init = ac3_decode_init,
.close = ac3_decode_end, .close = ac3_decode_end,
.decode = ac3_decode_frame, .decode = ac3_decode_frame,
.capabilities = AV_CODEC_CAP_DR1, .capabilities = AV_CODEC_CAP_CHANNEL_CONF |
AV_CODEC_CAP_DR1,
.long_name = NULL_IF_CONFIG_SMALL("ATSC A/52B (AC-3, E-AC-3)"), .long_name = NULL_IF_CONFIG_SMALL("ATSC A/52B (AC-3, E-AC-3)"),
.sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP, .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP,
AV_SAMPLE_FMT_NONE }, AV_SAMPLE_FMT_NONE },
.priv_class = &eac3_decoder_class, .priv_class = &eac3_decoder_class,
.caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP,
}; };
#endif #endif
+2 -60
View File
@@ -19,6 +19,8 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
#include "libavutil/mem_internal.h"
#include "avcodec.h" #include "avcodec.h"
#include "ac3.h" #include "ac3.h"
#include "ac3dsp.h" #include "ac3dsp.h"
@@ -44,49 +46,6 @@ static void ac3_exponent_min_c(uint8_t *exp, int num_reuse_blocks, int nb_coefs)
} }
} }
static int ac3_max_msb_abs_int16_c(const int16_t *src, int len)
{
int i, v = 0;
for (i = 0; i < len; i++)
v |= abs(src[i]);
return v;
}
static void ac3_lshift_int16_c(int16_t *src, unsigned int len,
unsigned int shift)
{
uint32_t *src32 = (uint32_t *)src;
const uint32_t mask = ~(((1 << shift) - 1) << 16);
int i;
len >>= 1;
for (i = 0; i < len; i += 8) {
src32[i ] = (src32[i ] << shift) & mask;
src32[i+1] = (src32[i+1] << shift) & mask;
src32[i+2] = (src32[i+2] << shift) & mask;
src32[i+3] = (src32[i+3] << shift) & mask;
src32[i+4] = (src32[i+4] << shift) & mask;
src32[i+5] = (src32[i+5] << shift) & mask;
src32[i+6] = (src32[i+6] << shift) & mask;
src32[i+7] = (src32[i+7] << shift) & mask;
}
}
static void ac3_rshift_int32_c(int32_t *src, unsigned int len,
unsigned int shift)
{
do {
*src++ >>= shift;
*src++ >>= shift;
*src++ >>= shift;
*src++ >>= shift;
*src++ >>= shift;
*src++ >>= shift;
*src++ >>= shift;
*src++ >>= shift;
len -= 8;
} while (len > 0);
}
static void float_to_fixed24_c(int32_t *dst, const float *src, unsigned int len) static void float_to_fixed24_c(int32_t *dst, const float *src, unsigned int len)
{ {
const float scale = 1 << 24; const float scale = 1 << 24;
@@ -374,19 +333,6 @@ void ff_ac3dsp_downmix_fixed(AC3DSPContext *c, int32_t **samples, int16_t **matr
ac3_downmix_c_fixed(samples, matrix, out_ch, in_ch, len); ac3_downmix_c_fixed(samples, matrix, out_ch, in_ch, len);
} }
static void apply_window_int16_c(int16_t *output, const int16_t *input,
const int16_t *window, unsigned int len)
{
int i;
int len2 = len >> 1;
for (i = 0; i < len2; i++) {
int16_t w = window[i];
output[i] = (MUL16(input[i], w) + (1 << 14)) >> 15;
output[len-i-1] = (MUL16(input[len-i-1], w) + (1 << 14)) >> 15;
}
}
void ff_ac3dsp_downmix(AC3DSPContext *c, float **samples, float **matrix, void ff_ac3dsp_downmix(AC3DSPContext *c, float **samples, float **matrix,
int out_ch, int in_ch, int len) int out_ch, int in_ch, int len)
{ {
@@ -422,9 +368,6 @@ void ff_ac3dsp_downmix(AC3DSPContext *c, float **samples, float **matrix,
av_cold void ff_ac3dsp_init(AC3DSPContext *c, int bit_exact) av_cold void ff_ac3dsp_init(AC3DSPContext *c, int bit_exact)
{ {
c->ac3_exponent_min = ac3_exponent_min_c; c->ac3_exponent_min = ac3_exponent_min_c;
c->ac3_max_msb_abs_int16 = ac3_max_msb_abs_int16_c;
c->ac3_lshift_int16 = ac3_lshift_int16_c;
c->ac3_rshift_int32 = ac3_rshift_int32_c;
c->float_to_fixed24 = float_to_fixed24_c; c->float_to_fixed24 = float_to_fixed24_c;
c->bit_alloc_calc_bap = ac3_bit_alloc_calc_bap_c; c->bit_alloc_calc_bap = ac3_bit_alloc_calc_bap_c;
c->update_bap_counts = ac3_update_bap_counts_c; c->update_bap_counts = ac3_update_bap_counts_c;
@@ -436,7 +379,6 @@ av_cold void ff_ac3dsp_init(AC3DSPContext *c, int bit_exact)
c->out_channels = 0; c->out_channels = 0;
c->downmix = NULL; c->downmix = NULL;
c->downmix_fixed = NULL; c->downmix_fixed = NULL;
c->apply_window_int16 = apply_window_int16_c;
if (ARCH_ARM) if (ARCH_ARM)
ff_ac3dsp_init_arm(c, bit_exact); ff_ac3dsp_init_arm(c, bit_exact);
-47
View File
@@ -42,39 +42,6 @@ typedef struct AC3DSPContext {
*/ */
void (*ac3_exponent_min)(uint8_t *exp, int num_reuse_blocks, int nb_coefs); void (*ac3_exponent_min)(uint8_t *exp, int num_reuse_blocks, int nb_coefs);
/**
* Calculate the maximum MSB of the absolute value of each element in an
* array of int16_t.
* @param src input array
* constraints: align 16. values must be in range [-32767,32767]
* @param len number of values in the array
* constraints: multiple of 16 greater than 0
* @return a value with the same MSB as max(abs(src[]))
*/
int (*ac3_max_msb_abs_int16)(const int16_t *src, int len);
/**
* Left-shift each value in an array of int16_t by a specified amount.
* @param src input array
* constraints: align 16
* @param len number of values in the array
* constraints: multiple of 32 greater than 0
* @param shift left shift amount
* constraints: range [0,15]
*/
void (*ac3_lshift_int16)(int16_t *src, unsigned int len, unsigned int shift);
/**
* Right-shift each value in an array of int32_t by a specified amount.
* @param src input array
* constraints: align 16
* @param len number of values in the array
* constraints: multiple of 16 greater than 0
* @param shift right shift amount
* constraints: range [0,31]
*/
void (*ac3_rshift_int32)(int32_t *src, unsigned int len, unsigned int shift);
/** /**
* Convert an array of float in range [-1.0,1.0] to int32_t with range * Convert an array of float in range [-1.0,1.0] to int32_t with range
* [-(1<<24),(1<<24)] * [-(1<<24),(1<<24)]
@@ -136,20 +103,6 @@ typedef struct AC3DSPContext {
int in_channels; int in_channels;
void (*downmix)(float **samples, float **matrix, int len); void (*downmix)(float **samples, float **matrix, int len);
void (*downmix_fixed)(int32_t **samples, int16_t **matrix, int len); void (*downmix_fixed)(int32_t **samples, int16_t **matrix, int len);
/**
* Apply symmetric window in 16-bit fixed-point.
* @param output destination array
* constraints: 16-byte aligned
* @param input source array
* constraints: 16-byte aligned
* @param window window array
* constraints: 16-byte aligned, at least len/2 elements
* @param len full window length
* constraints: multiple of ? greater than zero
*/
void (*apply_window_int16)(int16_t *output, const int16_t *input,
const int16_t *window, unsigned int len);
} AC3DSPContext; } AC3DSPContext;
void ff_ac3dsp_init (AC3DSPContext *c, int bit_exact); void ff_ac3dsp_init (AC3DSPContext *c, int bit_exact);
+155 -84
View File
@@ -34,7 +34,9 @@
#include "libavutil/channel_layout.h" #include "libavutil/channel_layout.h"
#include "libavutil/crc.h" #include "libavutil/crc.h"
#include "libavutil/internal.h" #include "libavutil/internal.h"
#include "libavutil/mem_internal.h"
#include "libavutil/opt.h" #include "libavutil/opt.h"
#include "libavutil/thread.h"
#include "avcodec.h" #include "avcodec.h"
#include "internal.h" #include "internal.h"
#include "me_cmp.h" #include "me_cmp.h"
@@ -67,6 +69,65 @@ static const float extmixlev_options[EXTMIXLEV_NUM_OPTIONS] = {
LEVEL_MINUS_3DB, LEVEL_MINUS_4POINT5DB, LEVEL_MINUS_6DB, LEVEL_ZERO LEVEL_MINUS_3DB, LEVEL_MINUS_4POINT5DB, LEVEL_MINUS_6DB, LEVEL_ZERO
}; };
/* The first two options apply only to the AC-3 encoders;
* the rest is also valid for EAC-3. When modifying it,
* it might be necessary to adapt said offset in eac3enc.c. */
#define OFFSET(param) offsetof(AC3EncodeContext, options.param)
#define AC3ENC_PARAM (AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM)
const AVOption ff_ac3_enc_options[] = {
/* AC-3 downmix levels */
{"center_mixlev", "Center Mix Level", OFFSET(center_mix_level), AV_OPT_TYPE_FLOAT, {.dbl = LEVEL_MINUS_4POINT5DB }, 0.0, 1.0, AC3ENC_PARAM},
{"surround_mixlev", "Surround Mix Level", OFFSET(surround_mix_level), AV_OPT_TYPE_FLOAT, {.dbl = LEVEL_MINUS_6DB }, 0.0, 1.0, AC3ENC_PARAM},
/* audio production information */
{"mixing_level", "Mixing Level", OFFSET(mixing_level), AV_OPT_TYPE_INT, {.i64 = AC3ENC_OPT_NONE }, AC3ENC_OPT_NONE, 111, AC3ENC_PARAM},
{"room_type", "Room Type", OFFSET(room_type), AV_OPT_TYPE_INT, {.i64 = AC3ENC_OPT_NONE }, AC3ENC_OPT_NONE, AC3ENC_OPT_SMALL_ROOM, AC3ENC_PARAM, "room_type"},
{"notindicated", "Not Indicated (default)", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_NOT_INDICATED }, INT_MIN, INT_MAX, AC3ENC_PARAM, "room_type"},
{"large", "Large Room", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_LARGE_ROOM }, INT_MIN, INT_MAX, AC3ENC_PARAM, "room_type"},
{"small", "Small Room", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_SMALL_ROOM }, INT_MIN, INT_MAX, AC3ENC_PARAM, "room_type"},
/* Metadata Options */
{"per_frame_metadata", "Allow Changing Metadata Per-Frame", OFFSET(allow_per_frame_metadata), AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1, AC3ENC_PARAM},
{"copyright", "Copyright Bit", OFFSET(copyright), AV_OPT_TYPE_INT, {.i64 = AC3ENC_OPT_NONE }, AC3ENC_OPT_NONE, 1, AC3ENC_PARAM},
{"dialnorm", "Dialogue Level (dB)", OFFSET(dialogue_level), AV_OPT_TYPE_INT, {.i64 = -31 }, -31, -1, AC3ENC_PARAM},
{"dsur_mode", "Dolby Surround Mode", OFFSET(dolby_surround_mode), AV_OPT_TYPE_INT, {.i64 = AC3ENC_OPT_NONE }, AC3ENC_OPT_NONE, AC3ENC_OPT_MODE_ON, AC3ENC_PARAM, "dsur_mode"},
{"notindicated", "Not Indicated (default)", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_NOT_INDICATED }, INT_MIN, INT_MAX, AC3ENC_PARAM, "dsur_mode"},
{"on", "Dolby Surround Encoded", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_MODE_ON }, INT_MIN, INT_MAX, AC3ENC_PARAM, "dsur_mode"},
{"off", "Not Dolby Surround Encoded", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_MODE_OFF }, INT_MIN, INT_MAX, AC3ENC_PARAM, "dsur_mode"},
{"original", "Original Bit Stream", OFFSET(original), AV_OPT_TYPE_INT, {.i64 = AC3ENC_OPT_NONE }, AC3ENC_OPT_NONE, 1, AC3ENC_PARAM},
/* extended bitstream information */
{"dmix_mode", "Preferred Stereo Downmix Mode", OFFSET(preferred_stereo_downmix), AV_OPT_TYPE_INT, {.i64 = AC3ENC_OPT_NONE }, AC3ENC_OPT_NONE, AC3ENC_OPT_DOWNMIX_DPLII, AC3ENC_PARAM, "dmix_mode"},
{"notindicated", "Not Indicated (default)", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_NOT_INDICATED }, INT_MIN, INT_MAX, AC3ENC_PARAM, "dmix_mode"},
{"ltrt", "Lt/Rt Downmix Preferred", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_DOWNMIX_LTRT }, INT_MIN, INT_MAX, AC3ENC_PARAM, "dmix_mode"},
{"loro", "Lo/Ro Downmix Preferred", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_DOWNMIX_LORO }, INT_MIN, INT_MAX, AC3ENC_PARAM, "dmix_mode"},
{"dplii", "Dolby Pro Logic II Downmix Preferred", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_DOWNMIX_DPLII }, INT_MIN, INT_MAX, AC3ENC_PARAM, "dmix_mode"},
{"ltrt_cmixlev", "Lt/Rt Center Mix Level", OFFSET(ltrt_center_mix_level), AV_OPT_TYPE_FLOAT, {.dbl = -1.0 }, -1.0, 2.0, AC3ENC_PARAM},
{"ltrt_surmixlev", "Lt/Rt Surround Mix Level", OFFSET(ltrt_surround_mix_level), AV_OPT_TYPE_FLOAT, {.dbl = -1.0 }, -1.0, 2.0, AC3ENC_PARAM},
{"loro_cmixlev", "Lo/Ro Center Mix Level", OFFSET(loro_center_mix_level), AV_OPT_TYPE_FLOAT, {.dbl = -1.0 }, -1.0, 2.0, AC3ENC_PARAM},
{"loro_surmixlev", "Lo/Ro Surround Mix Level", OFFSET(loro_surround_mix_level), AV_OPT_TYPE_FLOAT, {.dbl = -1.0 }, -1.0, 2.0, AC3ENC_PARAM},
{"dsurex_mode", "Dolby Surround EX Mode", OFFSET(dolby_surround_ex_mode), AV_OPT_TYPE_INT, {.i64 = AC3ENC_OPT_NONE }, AC3ENC_OPT_NONE, AC3ENC_OPT_DSUREX_DPLIIZ, AC3ENC_PARAM, "dsurex_mode"},
{"notindicated", "Not Indicated (default)", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_NOT_INDICATED }, INT_MIN, INT_MAX, AC3ENC_PARAM, "dsurex_mode"},
{"on", "Dolby Surround EX Encoded", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_MODE_ON }, INT_MIN, INT_MAX, AC3ENC_PARAM, "dsurex_mode"},
{"off", "Not Dolby Surround EX Encoded", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_MODE_OFF }, INT_MIN, INT_MAX, AC3ENC_PARAM, "dsurex_mode"},
{"dpliiz", "Dolby Pro Logic IIz-encoded", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_DSUREX_DPLIIZ }, INT_MIN, INT_MAX, AC3ENC_PARAM, "dsurex_mode"},
{"dheadphone_mode", "Dolby Headphone Mode", OFFSET(dolby_headphone_mode), AV_OPT_TYPE_INT, {.i64 = AC3ENC_OPT_NONE }, AC3ENC_OPT_NONE, AC3ENC_OPT_MODE_ON, AC3ENC_PARAM, "dheadphone_mode"},
{"notindicated", "Not Indicated (default)", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_NOT_INDICATED }, INT_MIN, INT_MAX, AC3ENC_PARAM, "dheadphone_mode"},
{"on", "Dolby Headphone Encoded", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_MODE_ON }, INT_MIN, INT_MAX, AC3ENC_PARAM, "dheadphone_mode"},
{"off", "Not Dolby Headphone Encoded", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_MODE_OFF }, INT_MIN, INT_MAX, AC3ENC_PARAM, "dheadphone_mode"},
{"ad_conv_type", "A/D Converter Type", OFFSET(ad_converter_type), AV_OPT_TYPE_INT, {.i64 = AC3ENC_OPT_NONE }, AC3ENC_OPT_NONE, AC3ENC_OPT_ADCONV_HDCD, AC3ENC_PARAM, "ad_conv_type"},
{"standard", "Standard (default)", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_ADCONV_STANDARD }, INT_MIN, INT_MAX, AC3ENC_PARAM, "ad_conv_type"},
{"hdcd", "HDCD", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_ADCONV_HDCD }, INT_MIN, INT_MAX, AC3ENC_PARAM, "ad_conv_type"},
/* Other Encoding Options */
{"stereo_rematrixing", "Stereo Rematrixing", OFFSET(stereo_rematrixing), AV_OPT_TYPE_BOOL, {.i64 = 1 }, 0, 1, AC3ENC_PARAM},
{"channel_coupling", "Channel Coupling", OFFSET(channel_coupling), AV_OPT_TYPE_INT, {.i64 = AC3ENC_OPT_AUTO }, AC3ENC_OPT_AUTO, AC3ENC_OPT_ON, AC3ENC_PARAM, "channel_coupling"},
{"auto", "Selected by the Encoder", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_AUTO }, INT_MIN, INT_MAX, AC3ENC_PARAM, "channel_coupling"},
{"cpl_start_band", "Coupling Start Band", OFFSET(cpl_start), AV_OPT_TYPE_INT, {.i64 = AC3ENC_OPT_AUTO }, AC3ENC_OPT_AUTO, 15, AC3ENC_PARAM, "cpl_start_band"},
{"auto", "Selected by the Encoder", 0, AV_OPT_TYPE_CONST, {.i64 = AC3ENC_OPT_AUTO }, INT_MIN, INT_MAX, AC3ENC_PARAM, "cpl_start_band"},
{NULL}
};
const AVCodecDefault ff_ac3_enc_defaults[] = {
{ "b", "0" },
{ NULL }
};
/** /**
* LUT for number of exponent groups. * LUT for number of exponent groups.
@@ -100,6 +161,15 @@ const uint64_t ff_ac3_channel_layouts[19] = {
0 0
}; };
/**
* Table to remap channels from SMPTE order to AC-3 order.
* [channel_mode][lfe][ch]
*/
static const uint8_t ac3_enc_channel_map[8][2][6] = {
COMMON_CHANNEL_MAP
{ { 0, 1, 2, 3, }, { 0, 1, 3, 4, 2, } },
{ { 0, 2, 1, 3, 4, }, { 0, 2, 1, 4, 5, 3 } },
};
/** /**
* LUT to select the bandwidth code based on the bit rate, sample rate, and * LUT to select the bandwidth code based on the bit rate, sample rate, and
@@ -269,7 +339,7 @@ void ff_ac3_compute_coupling_strategy(AC3EncodeContext *s)
* *
* @param s AC-3 encoder private context * @param s AC-3 encoder private context
*/ */
void ff_ac3_apply_rematrixing(AC3EncodeContext *s) static void ac3_apply_rematrixing(AC3EncodeContext *s)
{ {
int nb_coefs; int nb_coefs;
int blk, bnd, i; int blk, bnd, i;
@@ -303,7 +373,7 @@ void ff_ac3_apply_rematrixing(AC3EncodeContext *s)
/* /*
* Initialize exponent tables. * Initialize exponent tables.
*/ */
static av_cold void exponent_init(AC3EncodeContext *s) static av_cold void exponent_init(void)
{ {
int expstr, i, grpsize; int expstr, i, grpsize;
@@ -316,9 +386,6 @@ static av_cold void exponent_init(AC3EncodeContext *s)
} }
/* LFE */ /* LFE */
exponent_group_tab[0][0][7] = 2; exponent_group_tab[0][0][7] = 2;
if (CONFIG_EAC3_ENCODER && s->eac3)
ff_eac3_exponent_init();
} }
@@ -576,7 +643,7 @@ static int count_exponent_bits(AC3EncodeContext *s)
* *
* @param s AC-3 encoder private context * @param s AC-3 encoder private context
*/ */
void ff_ac3_group_exponents(AC3EncodeContext *s) static void ac3_group_exponents(AC3EncodeContext *s)
{ {
int blk, ch, i, cpl; int blk, ch, i, cpl;
int group_size, nb_groups; int group_size, nb_groups;
@@ -634,7 +701,7 @@ void ff_ac3_group_exponents(AC3EncodeContext *s)
* *
* @param s AC-3 encoder private context * @param s AC-3 encoder private context
*/ */
void ff_ac3_process_exponents(AC3EncodeContext *s) static void ac3_process_exponents(AC3EncodeContext *s)
{ {
extract_exponents(s); extract_exponents(s);
@@ -1143,7 +1210,7 @@ static int cbr_bit_allocation(AC3EncodeContext *s)
* frame size. Output is the SNR offset and a set of bit allocation pointers * frame size. Output is the SNR offset and a set of bit allocation pointers
* used to quantize the mantissas. * used to quantize the mantissas.
*/ */
int ff_ac3_compute_bit_allocation(AC3EncodeContext *s) static int ac3_compute_bit_allocation(AC3EncodeContext *s)
{ {
count_frame_bits(s); count_frame_bits(s);
@@ -1297,7 +1364,7 @@ static void quantize_mantissas_blk_ch(AC3Mant *s, int32_t *fixed_coef,
* *
* @param s AC-3 encoder private context * @param s AC-3 encoder private context
*/ */
void ff_ac3_quantize_mantissas(AC3EncodeContext *s) static void ac3_quantize_mantissas(AC3EncodeContext *s)
{ {
int blk, ch, ch0=0, got_cpl; int blk, ch, ch0=0, got_cpl;
@@ -1658,11 +1725,11 @@ static void output_frame_end(AC3EncodeContext *s)
* @param s AC-3 encoder private context * @param s AC-3 encoder private context
* @param frame output data buffer * @param frame output data buffer
*/ */
void ff_ac3_output_frame(AC3EncodeContext *s, unsigned char *frame) static void ac3_output_frame(AC3EncodeContext *s, unsigned char *frame)
{ {
int blk; int blk;
init_put_bits(&s->pb, frame, AC3_MAX_CODED_FRAME_SIZE); init_put_bits(&s->pb, frame, s->frame_size);
s->output_frame_header(s); s->output_frame_header(s);
@@ -1672,6 +1739,36 @@ void ff_ac3_output_frame(AC3EncodeContext *s, unsigned char *frame)
output_frame_end(s); output_frame_end(s);
} }
int ff_ac3_encode_frame_common_end(AVCodecContext *avctx, AVPacket *avpkt,
const AVFrame *frame, int *got_packet_ptr)
{
AC3EncodeContext *const s = avctx->priv_data;
int ret;
ac3_apply_rematrixing(s);
ac3_process_exponents(s);
ret = ac3_compute_bit_allocation(s);
if (ret) {
av_log(avctx, AV_LOG_ERROR, "Bit allocation failed. Try increasing the bitrate.\n");
return ret;
}
ac3_group_exponents(s);
ac3_quantize_mantissas(s);
if ((ret = ff_alloc_packet2(avctx, avpkt, s->frame_size, 0)) < 0)
return ret;
ac3_output_frame(s, avpkt->data);
if (frame->pts != AV_NOPTS_VALUE)
avpkt->pts = frame->pts - ff_samples_to_time_base(avctx, avctx->initial_padding);
*got_packet_ptr = 1;
return 0;
}
static void dprint_options(AC3EncodeContext *s) static void dprint_options(AC3EncodeContext *s)
{ {
@@ -2018,6 +2115,7 @@ av_cold int ff_ac3_encode_close(AVCodecContext *avctx)
int blk, ch; int blk, ch;
AC3EncodeContext *s = avctx->priv_data; AC3EncodeContext *s = avctx->priv_data;
av_freep(&s->mdct_window);
av_freep(&s->windowed_samples); av_freep(&s->windowed_samples);
if (s->planar_samples) if (s->planar_samples)
for (ch = 0; ch < s->channels; ch++) for (ch = 0; ch < s->channels; ch++)
@@ -2050,8 +2148,7 @@ av_cold int ff_ac3_encode_close(AVCodecContext *avctx)
av_freep(&block->cpl_coord_mant); av_freep(&block->cpl_coord_mant);
} }
if (s->mdct_end) s->mdct_end(s);
s->mdct_end(s);
return 0; return 0;
} }
@@ -2096,7 +2193,7 @@ static av_cold int set_channel_info(AC3EncodeContext *s, int channels,
s->has_center = (s->channel_mode & 0x01) && s->channel_mode != AC3_CHMODE_MONO; s->has_center = (s->channel_mode & 0x01) && s->channel_mode != AC3_CHMODE_MONO;
s->has_surround = s->channel_mode & 0x04; s->has_surround = s->channel_mode & 0x04;
s->channel_map = ff_ac3_enc_channel_map[s->channel_mode][s->lfe_on]; s->channel_map = ac3_enc_channel_map[s->channel_mode][s->lfe_on];
*channel_layout = ch_layout; *channel_layout = ch_layout;
if (s->lfe_on) if (s->lfe_on)
*channel_layout |= AV_CH_LOW_FREQUENCY; *channel_layout |= AV_CH_LOW_FREQUENCY;
@@ -2322,60 +2419,46 @@ static av_cold void set_bandwidth(AC3EncodeContext *s)
static av_cold int allocate_buffers(AC3EncodeContext *s) static av_cold int allocate_buffers(AC3EncodeContext *s)
{ {
AVCodecContext *avctx = s->avctx;
int blk, ch; int blk, ch;
int channels = s->channels + 1; /* includes coupling channel */ int channels = s->channels + 1; /* includes coupling channel */
int channel_blocks = channels * s->num_blocks; int channel_blocks = channels * s->num_blocks;
int total_coefs = AC3_MAX_COEFS * channel_blocks; int total_coefs = AC3_MAX_COEFS * channel_blocks;
if (s->allocate_sample_buffers(s)) if (s->allocate_sample_buffers(s))
goto alloc_fail; return AVERROR(ENOMEM);
if (!FF_ALLOC_TYPED_ARRAY(s->bap_buffer, total_coefs) ||
!FF_ALLOC_TYPED_ARRAY(s->bap1_buffer, total_coefs) ||
!FF_ALLOCZ_TYPED_ARRAY(s->mdct_coef_buffer, total_coefs) ||
!FF_ALLOC_TYPED_ARRAY(s->exp_buffer, total_coefs) ||
!FF_ALLOC_TYPED_ARRAY(s->grouped_exp_buffer, channel_blocks * 128) ||
!FF_ALLOC_TYPED_ARRAY(s->psd_buffer, total_coefs) ||
!FF_ALLOC_TYPED_ARRAY(s->band_psd_buffer, channel_blocks * 64) ||
!FF_ALLOC_TYPED_ARRAY(s->mask_buffer, channel_blocks * 64) ||
!FF_ALLOC_TYPED_ARRAY(s->qmant_buffer, total_coefs))
return AVERROR(ENOMEM);
FF_ALLOC_ARRAY_OR_GOTO(avctx, s->bap_buffer, total_coefs,
sizeof(*s->bap_buffer), alloc_fail);
FF_ALLOC_ARRAY_OR_GOTO(avctx, s->bap1_buffer, total_coefs,
sizeof(*s->bap1_buffer), alloc_fail);
FF_ALLOCZ_ARRAY_OR_GOTO(avctx, s->mdct_coef_buffer, total_coefs,
sizeof(*s->mdct_coef_buffer), alloc_fail);
FF_ALLOC_ARRAY_OR_GOTO(avctx, s->exp_buffer, total_coefs,
sizeof(*s->exp_buffer), alloc_fail);
FF_ALLOC_ARRAY_OR_GOTO(avctx, s->grouped_exp_buffer, channel_blocks, 128 *
sizeof(*s->grouped_exp_buffer), alloc_fail);
FF_ALLOC_ARRAY_OR_GOTO(avctx, s->psd_buffer, total_coefs,
sizeof(*s->psd_buffer), alloc_fail);
FF_ALLOC_ARRAY_OR_GOTO(avctx, s->band_psd_buffer, channel_blocks, 64 *
sizeof(*s->band_psd_buffer), alloc_fail);
FF_ALLOC_ARRAY_OR_GOTO(avctx, s->mask_buffer, channel_blocks, 64 *
sizeof(*s->mask_buffer), alloc_fail);
FF_ALLOC_ARRAY_OR_GOTO(avctx, s->qmant_buffer, total_coefs,
sizeof(*s->qmant_buffer), alloc_fail);
if (s->cpl_enabled) { if (s->cpl_enabled) {
FF_ALLOC_ARRAY_OR_GOTO(avctx, s->cpl_coord_exp_buffer, channel_blocks, 16 * if (!FF_ALLOC_TYPED_ARRAY(s->cpl_coord_exp_buffer, channel_blocks * 16) ||
sizeof(*s->cpl_coord_exp_buffer), alloc_fail); !FF_ALLOC_TYPED_ARRAY(s->cpl_coord_mant_buffer, channel_blocks * 16))
FF_ALLOC_ARRAY_OR_GOTO(avctx, s->cpl_coord_mant_buffer, channel_blocks, 16 * return AVERROR(ENOMEM);
sizeof(*s->cpl_coord_mant_buffer), alloc_fail);
} }
for (blk = 0; blk < s->num_blocks; blk++) { for (blk = 0; blk < s->num_blocks; blk++) {
AC3Block *block = &s->blocks[blk]; AC3Block *block = &s->blocks[blk];
FF_ALLOCZ_ARRAY_OR_GOTO(avctx, block->mdct_coef, channels, sizeof(*block->mdct_coef),
alloc_fail); if (!FF_ALLOCZ_TYPED_ARRAY(block->mdct_coef, channels) ||
FF_ALLOCZ_ARRAY_OR_GOTO(avctx, block->exp, channels, sizeof(*block->exp), !FF_ALLOCZ_TYPED_ARRAY(block->exp, channels) ||
alloc_fail); !FF_ALLOCZ_TYPED_ARRAY(block->grouped_exp, channels) ||
FF_ALLOCZ_ARRAY_OR_GOTO(avctx, block->grouped_exp, channels, sizeof(*block->grouped_exp), !FF_ALLOCZ_TYPED_ARRAY(block->psd, channels) ||
alloc_fail); !FF_ALLOCZ_TYPED_ARRAY(block->band_psd, channels) ||
FF_ALLOCZ_ARRAY_OR_GOTO(avctx, block->psd, channels, sizeof(*block->psd), !FF_ALLOCZ_TYPED_ARRAY(block->mask, channels) ||
alloc_fail); !FF_ALLOCZ_TYPED_ARRAY(block->qmant, channels))
FF_ALLOCZ_ARRAY_OR_GOTO(avctx, block->band_psd, channels, sizeof(*block->band_psd), return AVERROR(ENOMEM);
alloc_fail);
FF_ALLOCZ_ARRAY_OR_GOTO(avctx, block->mask, channels, sizeof(*block->mask),
alloc_fail);
FF_ALLOCZ_ARRAY_OR_GOTO(avctx, block->qmant, channels, sizeof(*block->qmant),
alloc_fail);
if (s->cpl_enabled) { if (s->cpl_enabled) {
FF_ALLOCZ_ARRAY_OR_GOTO(avctx, block->cpl_coord_exp, channels, sizeof(*block->cpl_coord_exp), if (!FF_ALLOCZ_TYPED_ARRAY(block->cpl_coord_exp, channels) ||
alloc_fail); !FF_ALLOCZ_TYPED_ARRAY(block->cpl_coord_mant, channels))
FF_ALLOCZ_ARRAY_OR_GOTO(avctx, block->cpl_coord_mant, channels, sizeof(*block->cpl_coord_mant), return AVERROR(ENOMEM);
alloc_fail);
} }
for (ch = 0; ch < channels; ch++) { for (ch = 0; ch < channels; ch++) {
@@ -2397,33 +2480,32 @@ static av_cold int allocate_buffers(AC3EncodeContext *s)
} }
if (!s->fixed_point) { if (!s->fixed_point) {
FF_ALLOCZ_ARRAY_OR_GOTO(avctx, s->fixed_coef_buffer, total_coefs, if (!FF_ALLOCZ_TYPED_ARRAY(s->fixed_coef_buffer, total_coefs))
sizeof(*s->fixed_coef_buffer), alloc_fail); return AVERROR(ENOMEM);
for (blk = 0; blk < s->num_blocks; blk++) { for (blk = 0; blk < s->num_blocks; blk++) {
AC3Block *block = &s->blocks[blk]; AC3Block *block = &s->blocks[blk];
FF_ALLOCZ_ARRAY_OR_GOTO(avctx, block->fixed_coef, channels, if (!FF_ALLOCZ_TYPED_ARRAY(block->fixed_coef, channels))
sizeof(*block->fixed_coef), alloc_fail); return AVERROR(ENOMEM);
for (ch = 0; ch < channels; ch++) for (ch = 0; ch < channels; ch++)
block->fixed_coef[ch] = &s->fixed_coef_buffer[AC3_MAX_COEFS * (s->num_blocks * ch + blk)]; block->fixed_coef[ch] = &s->fixed_coef_buffer[AC3_MAX_COEFS * (s->num_blocks * ch + blk)];
} }
} else { } else {
for (blk = 0; blk < s->num_blocks; blk++) { for (blk = 0; blk < s->num_blocks; blk++) {
AC3Block *block = &s->blocks[blk]; AC3Block *block = &s->blocks[blk];
FF_ALLOCZ_ARRAY_OR_GOTO(avctx, block->fixed_coef, channels, if (!FF_ALLOCZ_TYPED_ARRAY(block->fixed_coef, channels))
sizeof(*block->fixed_coef), alloc_fail); return AVERROR(ENOMEM);
for (ch = 0; ch < channels; ch++) for (ch = 0; ch < channels; ch++)
block->fixed_coef[ch] = (int32_t *)block->mdct_coef[ch]; block->fixed_coef[ch] = (int32_t *)block->mdct_coef[ch];
} }
} }
return 0; return 0;
alloc_fail:
return AVERROR(ENOMEM);
} }
av_cold int ff_ac3_encode_init(AVCodecContext *avctx) av_cold int ff_ac3_encode_init(AVCodecContext *avctx)
{ {
static AVOnce init_static_once = AV_ONCE_INIT;
AC3EncodeContext *s = avctx->priv_data; AC3EncodeContext *s = avctx->priv_data;
int ret, frame_size_58; int ret, frame_size_58;
@@ -2433,7 +2515,7 @@ av_cold int ff_ac3_encode_init(AVCodecContext *avctx)
ret = validate_options(s); ret = validate_options(s);
if (ret) if (ret)
goto init_fail; return ret;
avctx->frame_size = AC3_BLOCK_SIZE * s->num_blocks; avctx->frame_size = AC3_BLOCK_SIZE * s->num_blocks;
avctx->initial_padding = AC3_BLOCK_SIZE; avctx->initial_padding = AC3_BLOCK_SIZE;
@@ -2453,34 +2535,24 @@ av_cold int ff_ac3_encode_init(AVCodecContext *avctx)
s->crc_inv[1] = pow_poly((CRC16_POLY >> 1), (8 * frame_size_58) - 16, CRC16_POLY); s->crc_inv[1] = pow_poly((CRC16_POLY >> 1), (8 * frame_size_58) - 16, CRC16_POLY);
} }
/* set function pointers */ if (CONFIG_EAC3_ENCODER && s->eac3) {
if (CONFIG_AC3_FIXED_ENCODER && s->fixed_point) { static AVOnce init_static_once_eac3 = AV_ONCE_INIT;
s->mdct_end = ff_ac3_fixed_mdct_end; ff_thread_once(&init_static_once_eac3, ff_eac3_exponent_init);
s->mdct_init = ff_ac3_fixed_mdct_init;
s->allocate_sample_buffers = ff_ac3_fixed_allocate_sample_buffers;
} else if (CONFIG_AC3_ENCODER || CONFIG_EAC3_ENCODER) {
s->mdct_end = ff_ac3_float_mdct_end;
s->mdct_init = ff_ac3_float_mdct_init;
s->allocate_sample_buffers = ff_ac3_float_allocate_sample_buffers;
}
if (CONFIG_EAC3_ENCODER && s->eac3)
s->output_frame_header = ff_eac3_output_frame_header; s->output_frame_header = ff_eac3_output_frame_header;
else } else
s->output_frame_header = ac3_output_frame_header; s->output_frame_header = ac3_output_frame_header;
set_bandwidth(s); set_bandwidth(s);
exponent_init(s);
bit_alloc_init(s); bit_alloc_init(s);
ret = s->mdct_init(s); ret = s->mdct_init(s);
if (ret) if (ret)
goto init_fail; return ret;
ret = allocate_buffers(s); ret = allocate_buffers(s);
if (ret) if (ret)
goto init_fail; return ret;
ff_audiodsp_init(&s->adsp); ff_audiodsp_init(&s->adsp);
ff_me_cmp_init(&s->mecc, avctx); ff_me_cmp_init(&s->mecc, avctx);
@@ -2488,8 +2560,7 @@ av_cold int ff_ac3_encode_init(AVCodecContext *avctx)
dprint_options(s); dprint_options(s);
ff_thread_once(&init_static_once, exponent_init);
return 0; return 0;
init_fail:
ff_ac3_encode_close(avctx);
return ret;
} }
+14 -38
View File
@@ -30,8 +30,6 @@
#include <stdint.h> #include <stdint.h>
#include "libavutil/float_dsp.h"
#include "ac3.h" #include "ac3.h"
#include "ac3dsp.h" #include "ac3dsp.h"
#include "avcodec.h" #include "avcodec.h"
@@ -41,18 +39,12 @@
#include "put_bits.h" #include "put_bits.h"
#include "audiodsp.h" #include "audiodsp.h"
#ifndef CONFIG_AC3ENC_FLOAT #ifndef AC3ENC_FLOAT
#define CONFIG_AC3ENC_FLOAT 0 #define AC3ENC_FLOAT 0
#endif #endif
#define OFFSET(param) offsetof(AC3EncodeContext, options.param) #if AC3ENC_FLOAT
#define AC3ENC_PARAM (AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM) #include "libavutil/float_dsp.h"
#define AC3ENC_TYPE_AC3_FIXED 0
#define AC3ENC_TYPE_AC3 1
#define AC3ENC_TYPE_EAC3 2
#if CONFIG_AC3ENC_FLOAT
#define AC3_NAME(x) ff_ac3_float_ ## x #define AC3_NAME(x) ff_ac3_float_ ## x
#define MAC_COEF(d,a,b) ((d)+=(a)*(b)) #define MAC_COEF(d,a,b) ((d)+=(a)*(b))
#define COEF_MIN (-16777215.0/16777216.0) #define COEF_MIN (-16777215.0/16777216.0)
@@ -62,12 +54,13 @@ typedef float SampleType;
typedef float CoefType; typedef float CoefType;
typedef float CoefSumType; typedef float CoefSumType;
#else #else
#include "libavutil/fixed_dsp.h"
#define AC3_NAME(x) ff_ac3_fixed_ ## x #define AC3_NAME(x) ff_ac3_fixed_ ## x
#define MAC_COEF(d,a,b) MAC64(d,a,b) #define MAC_COEF(d,a,b) MAC64(d,a,b)
#define COEF_MIN -16777215 #define COEF_MIN -16777215
#define COEF_MAX 16777215 #define COEF_MAX 16777215
#define NEW_CPL_COORD_THRESHOLD 503317 #define NEW_CPL_COORD_THRESHOLD 503317
typedef int16_t SampleType; typedef int32_t SampleType;
typedef int32_t CoefType; typedef int32_t CoefType;
typedef int64_t CoefSumType; typedef int64_t CoefSumType;
#endif #endif
@@ -141,7 +134,6 @@ typedef struct AC3Block {
uint16_t **qmant; ///< quantized mantissas uint16_t **qmant; ///< quantized mantissas
uint8_t **cpl_coord_exp; ///< coupling coord exponents (cplcoexp) uint8_t **cpl_coord_exp; ///< coupling coord exponents (cplcoexp)
uint8_t **cpl_coord_mant; ///< coupling coord mantissas (cplcomant) uint8_t **cpl_coord_mant; ///< coupling coord mantissas (cplcomant)
uint8_t coeff_shift[AC3_MAX_CHANNELS]; ///< fixed-point coefficient shift values
uint8_t new_rematrixing_strategy; ///< send new rematrixing flags in this block uint8_t new_rematrixing_strategy; ///< send new rematrixing flags in this block
int num_rematrixing_bands; ///< number of rematrixing bands int num_rematrixing_bands; ///< number of rematrixing bands
uint8_t rematrixing_flags[4]; ///< rematrixing flags uint8_t rematrixing_flags[4]; ///< rematrixing flags
@@ -165,7 +157,11 @@ typedef struct AC3EncodeContext {
AVCodecContext *avctx; ///< parent AVCodecContext AVCodecContext *avctx; ///< parent AVCodecContext
PutBitContext pb; ///< bitstream writer context PutBitContext pb; ///< bitstream writer context
AudioDSPContext adsp; AudioDSPContext adsp;
#if AC3ENC_FLOAT
AVFloatDSPContext *fdsp; AVFloatDSPContext *fdsp;
#else
AVFixedDSPContext *fdsp;
#endif
MECmpContext mecc; MECmpContext mecc;
AC3DSPContext ac3dsp; ///< AC-3 optimized functions AC3DSPContext ac3dsp; ///< AC-3 optimized functions
FFTContext mdct; ///< FFT context for MDCT calculation FFTContext mdct; ///< FFT context for MDCT calculation
@@ -270,6 +266,8 @@ typedef struct AC3EncodeContext {
extern const uint64_t ff_ac3_channel_layouts[19]; extern const uint64_t ff_ac3_channel_layouts[19];
extern const AVOption ff_ac3_enc_options[];
extern const AVCodecDefault ff_ac3_enc_defaults[];
int ff_ac3_encode_init(AVCodecContext *avctx); int ff_ac3_encode_init(AVCodecContext *avctx);
int ff_ac3_float_encode_init(AVCodecContext *avctx); int ff_ac3_float_encode_init(AVCodecContext *avctx);
@@ -282,33 +280,11 @@ void ff_ac3_adjust_frame_size(AC3EncodeContext *s);
void ff_ac3_compute_coupling_strategy(AC3EncodeContext *s); void ff_ac3_compute_coupling_strategy(AC3EncodeContext *s);
void ff_ac3_apply_rematrixing(AC3EncodeContext *s); int ff_ac3_encode_frame_common_end(AVCodecContext *avctx, AVPacket *avpkt,
const AVFrame *frame, int *got_packet_ptr);
void ff_ac3_process_exponents(AC3EncodeContext *s);
int ff_ac3_compute_bit_allocation(AC3EncodeContext *s);
void ff_ac3_group_exponents(AC3EncodeContext *s);
void ff_ac3_quantize_mantissas(AC3EncodeContext *s);
void ff_ac3_output_frame(AC3EncodeContext *s, unsigned char *frame);
/* prototypes for functions in ac3enc_fixed.c and ac3enc_float.c */
void ff_ac3_fixed_mdct_end(AC3EncodeContext *s);
void ff_ac3_float_mdct_end(AC3EncodeContext *s);
int ff_ac3_fixed_mdct_init(AC3EncodeContext *s);
int ff_ac3_float_mdct_init(AC3EncodeContext *s);
/* prototypes for functions in ac3enc_template.c */ /* prototypes for functions in ac3enc_template.c */
int ff_ac3_fixed_allocate_sample_buffers(AC3EncodeContext *s);
int ff_ac3_float_allocate_sample_buffers(AC3EncodeContext *s);
int ff_ac3_fixed_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, int ff_ac3_fixed_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
const AVFrame *frame, int *got_packet_ptr); const AVFrame *frame, int *got_packet_ptr);
int ff_ac3_float_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, int ff_ac3_float_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
+29 -44
View File
@@ -26,54 +26,22 @@
* fixed-point AC-3 encoder. * fixed-point AC-3 encoder.
*/ */
#define AC3ENC_FLOAT 0
#define FFT_FLOAT 0 #define FFT_FLOAT 0
#undef CONFIG_AC3ENC_FLOAT #define FFT_FIXED_32 1
#include "internal.h" #include "internal.h"
#include "audiodsp.h" #include "audiodsp.h"
#include "ac3enc.h" #include "ac3enc.h"
#include "eac3enc.h" #include "eac3enc.h"
#include "kbdwin.h"
#define AC3ENC_TYPE AC3ENC_TYPE_AC3_FIXED
#include "ac3enc_opts_template.c"
static const AVClass ac3enc_class = { static const AVClass ac3enc_class = {
.class_name = "Fixed-Point AC-3 Encoder", .class_name = "Fixed-Point AC-3 Encoder",
.item_name = av_default_item_name, .item_name = av_default_item_name,
.option = ac3_options, .option = ff_ac3_enc_options,
.version = LIBAVUTIL_VERSION_INT, .version = LIBAVUTIL_VERSION_INT,
}; };
/*
* Normalize the input samples to use the maximum available precision.
* This assumes signed 16-bit input samples.
*/
static int normalize_samples(AC3EncodeContext *s)
{
int v = s->ac3dsp.ac3_max_msb_abs_int16(s->windowed_samples, AC3_WINDOW_SIZE);
v = 14 - av_log2(v);
if (v > 0)
s->ac3dsp.ac3_lshift_int16(s->windowed_samples, AC3_WINDOW_SIZE, v);
/* +6 to right-shift from 31-bit to 25-bit */
return v + 6;
}
/*
* Scale MDCT coefficients to 25-bit signed fixed-point.
*/
static void scale_coefficients(AC3EncodeContext *s)
{
int blk, ch;
for (blk = 0; blk < s->num_blocks; blk++) {
AC3Block *block = &s->blocks[blk];
for (ch = 1; ch <= s->channels; ch++) {
s->ac3dsp.ac3_rshift_int32(block->mdct_coef[ch], AC3_MAX_COEFS,
block->coeff_shift[ch]);
}
}
}
static void sum_square_butterfly(AC3EncodeContext *s, int64_t sum[4], static void sum_square_butterfly(AC3EncodeContext *s, int64_t sum[4],
const int32_t *coef0, const int32_t *coef1, const int32_t *coef0, const int32_t *coef1,
int len) int len)
@@ -115,23 +83,36 @@ static CoefType calc_cpl_coord(CoefSumType energy_ch, CoefSumType energy_cpl)
* *
* @param s AC-3 encoder private context * @param s AC-3 encoder private context
*/ */
av_cold void ff_ac3_fixed_mdct_end(AC3EncodeContext *s) static av_cold void ac3_fixed_mdct_end(AC3EncodeContext *s)
{ {
ff_mdct_end(&s->mdct); ff_mdct_end(&s->mdct);
} }
/** /**
* Initialize MDCT tables. * Initialize MDCT tables.
* *
* @param s AC-3 encoder private context * @param s AC-3 encoder private context
* @return 0 on success, negative error code on failure * @return 0 on success, negative error code on failure
*/ */
av_cold int ff_ac3_fixed_mdct_init(AC3EncodeContext *s) static av_cold int ac3_fixed_mdct_init(AC3EncodeContext *s)
{ {
int ret = ff_mdct_init(&s->mdct, 9, 0, -1.0); float fwin[AC3_BLOCK_SIZE];
s->mdct_window = ff_ac3_window;
return ret; int32_t *iwin = av_malloc_array(AC3_BLOCK_SIZE, sizeof(*iwin));
if (!iwin)
return AVERROR(ENOMEM);
ff_kbd_window_init(fwin, 5.0, AC3_BLOCK_SIZE);
for (int i = 0; i < AC3_BLOCK_SIZE; i++)
iwin[i] = lrintf(fwin[i] * (1 << 22));
s->mdct_window = iwin;
s->fdsp = avpriv_alloc_fixed_dsp(s->avctx->flags & AV_CODEC_FLAG_BITEXACT);
if (!s->fdsp)
return AVERROR(ENOMEM);
return ff_mdct_init(&s->mdct, 9, 0, -1.0);
} }
@@ -139,6 +120,9 @@ static av_cold int ac3_fixed_encode_init(AVCodecContext *avctx)
{ {
AC3EncodeContext *s = avctx->priv_data; AC3EncodeContext *s = avctx->priv_data;
s->fixed_point = 1; s->fixed_point = 1;
s->mdct_end = ac3_fixed_mdct_end;
s->mdct_init = ac3_fixed_mdct_init;
s->allocate_sample_buffers = allocate_sample_buffers;
return ff_ac3_encode_init(avctx); return ff_ac3_encode_init(avctx);
} }
@@ -152,10 +136,11 @@ AVCodec ff_ac3_fixed_encoder = {
.init = ac3_fixed_encode_init, .init = ac3_fixed_encode_init,
.encode2 = ff_ac3_fixed_encode_frame, .encode2 = ff_ac3_fixed_encode_frame,
.close = ff_ac3_encode_close, .close = ff_ac3_encode_close,
.sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16P, .sample_fmts = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S32P,
AV_SAMPLE_FMT_NONE }, AV_SAMPLE_FMT_NONE },
.priv_class = &ac3enc_class, .priv_class = &ac3enc_class,
.caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP,
.supported_samplerates = ff_ac3_sample_rate_tab, .supported_samplerates = ff_ac3_sample_rate_tab,
.channel_layouts = ff_ac3_channel_layouts, .channel_layouts = ff_ac3_channel_layouts,
.defaults = ac3_defaults, .defaults = ff_ac3_enc_defaults,
}; };
+13 -19
View File
@@ -26,7 +26,7 @@
* floating-point AC-3 encoder. * floating-point AC-3 encoder.
*/ */
#define CONFIG_AC3ENC_FLOAT 1 #define AC3ENC_FLOAT 1
#include "internal.h" #include "internal.h"
#include "audiodsp.h" #include "audiodsp.h"
#include "ac3enc.h" #include "ac3enc.h"
@@ -34,12 +34,10 @@
#include "kbdwin.h" #include "kbdwin.h"
#define AC3ENC_TYPE AC3ENC_TYPE_AC3
#include "ac3enc_opts_template.c"
static const AVClass ac3enc_class = { static const AVClass ac3enc_class = {
.class_name = "AC-3 Encoder", .class_name = "AC-3 Encoder",
.item_name = av_default_item_name, .item_name = av_default_item_name,
.option = ac3_options, .option = ff_ac3_enc_options,
.version = LIBAVUTIL_VERSION_INT, .version = LIBAVUTIL_VERSION_INT,
}; };
@@ -94,10 +92,9 @@ static void sum_square_butterfly(AC3EncodeContext *s, float sum[4],
* *
* @param s AC-3 encoder private context * @param s AC-3 encoder private context
*/ */
av_cold void ff_ac3_float_mdct_end(AC3EncodeContext *s) static av_cold void ac3_float_mdct_end(AC3EncodeContext *s)
{ {
ff_mdct_end(&s->mdct); ff_mdct_end(&s->mdct);
av_freep(&s->mdct_window);
} }
@@ -107,31 +104,27 @@ av_cold void ff_ac3_float_mdct_end(AC3EncodeContext *s)
* @param s AC-3 encoder private context * @param s AC-3 encoder private context
* @return 0 on success, negative error code on failure * @return 0 on success, negative error code on failure
*/ */
av_cold int ff_ac3_float_mdct_init(AC3EncodeContext *s) static av_cold int ac3_float_mdct_init(AC3EncodeContext *s)
{ {
float *window; float *window = av_malloc_array(AC3_BLOCK_SIZE, sizeof(*window));
int i, n, n2;
n = 1 << 9;
n2 = n >> 1;
window = av_malloc_array(n, sizeof(*window));
if (!window) { if (!window) {
av_log(s->avctx, AV_LOG_ERROR, "Cannot allocate memory.\n"); av_log(s->avctx, AV_LOG_ERROR, "Cannot allocate memory.\n");
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
} }
ff_kbd_window_init(window, 5.0, n2);
for (i = 0; i < n2; i++) ff_kbd_window_init(window, 5.0, AC3_BLOCK_SIZE);
window[n-1-i] = window[i];
s->mdct_window = window; s->mdct_window = window;
return ff_mdct_init(&s->mdct, 9, 0, -2.0 / n); return ff_mdct_init(&s->mdct, 9, 0, -2.0 / AC3_WINDOW_SIZE);
} }
av_cold int ff_ac3_float_encode_init(AVCodecContext *avctx) av_cold int ff_ac3_float_encode_init(AVCodecContext *avctx)
{ {
AC3EncodeContext *s = avctx->priv_data; AC3EncodeContext *s = avctx->priv_data;
s->mdct_end = ac3_float_mdct_end;
s->mdct_init = ac3_float_mdct_init;
s->allocate_sample_buffers = allocate_sample_buffers;
s->fdsp = avpriv_float_dsp_alloc(avctx->flags & AV_CODEC_FLAG_BITEXACT); s->fdsp = avpriv_float_dsp_alloc(avctx->flags & AV_CODEC_FLAG_BITEXACT);
if (!s->fdsp) if (!s->fdsp)
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
@@ -152,5 +145,6 @@ AVCodec ff_ac3_encoder = {
.priv_class = &ac3enc_class, .priv_class = &ac3enc_class,
.supported_samplerates = ff_ac3_sample_rate_tab, .supported_samplerates = ff_ac3_sample_rate_tab,
.channel_layouts = ff_ac3_channel_layouts, .channel_layouts = ff_ac3_channel_layouts,
.defaults = ac3_defaults, .defaults = ff_ac3_enc_defaults,
.caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP,
}; };
+25 -59
View File
@@ -30,6 +30,7 @@
#include "libavutil/attributes.h" #include "libavutil/attributes.h"
#include "libavutil/internal.h" #include "libavutil/internal.h"
#include "libavutil/mem_internal.h"
#include "audiodsp.h" #include "audiodsp.h"
#include "internal.h" #include "internal.h"
@@ -37,23 +38,20 @@
#include "eac3enc.h" #include "eac3enc.h"
int AC3_NAME(allocate_sample_buffers)(AC3EncodeContext *s) static int allocate_sample_buffers(AC3EncodeContext *s)
{ {
int ch; int ch;
FF_ALLOC_OR_GOTO(s->avctx, s->windowed_samples, AC3_WINDOW_SIZE * if (!FF_ALLOC_TYPED_ARRAY(s->windowed_samples, AC3_WINDOW_SIZE) ||
sizeof(*s->windowed_samples), alloc_fail); !FF_ALLOCZ_TYPED_ARRAY(s->planar_samples, s->channels))
FF_ALLOC_ARRAY_OR_GOTO(s->avctx, s->planar_samples, s->channels, sizeof(*s->planar_samples), return AVERROR(ENOMEM);
alloc_fail);
for (ch = 0; ch < s->channels; ch++) {
FF_ALLOCZ_OR_GOTO(s->avctx, s->planar_samples[ch],
(AC3_FRAME_SIZE+AC3_BLOCK_SIZE) * sizeof(**s->planar_samples),
alloc_fail);
}
for (ch = 0; ch < s->channels; ch++) {
if (!(s->planar_samples[ch] = av_mallocz((AC3_FRAME_SIZE + AC3_BLOCK_SIZE) *
sizeof(**s->planar_samples))))
return AVERROR(ENOMEM);
}
return 0; return 0;
alloc_fail:
return AVERROR(ENOMEM);
} }
@@ -93,19 +91,14 @@ static void apply_mdct(AC3EncodeContext *s)
AC3Block *block = &s->blocks[blk]; AC3Block *block = &s->blocks[blk];
const SampleType *input_samples = &s->planar_samples[ch][blk * AC3_BLOCK_SIZE]; const SampleType *input_samples = &s->planar_samples[ch][blk * AC3_BLOCK_SIZE];
#if CONFIG_AC3ENC_FLOAT
s->fdsp->vector_fmul(s->windowed_samples, input_samples, s->fdsp->vector_fmul(s->windowed_samples, input_samples,
s->mdct_window, AC3_WINDOW_SIZE); s->mdct_window, AC3_BLOCK_SIZE);
#else s->fdsp->vector_fmul_reverse(s->windowed_samples + AC3_BLOCK_SIZE,
s->ac3dsp.apply_window_int16(s->windowed_samples, input_samples, &input_samples[AC3_BLOCK_SIZE],
s->mdct_window, AC3_WINDOW_SIZE); s->mdct_window, AC3_BLOCK_SIZE);
if (s->fixed_point) s->mdct.mdct_calc(&s->mdct, block->mdct_coef[ch+1],
block->coeff_shift[ch+1] = normalize_samples(s); s->windowed_samples);
#endif
s->mdct.mdct_calcw(&s->mdct, block->mdct_coef[ch+1],
s->windowed_samples);
} }
} }
} }
@@ -117,7 +110,7 @@ static void apply_mdct(AC3EncodeContext *s)
static void apply_channel_coupling(AC3EncodeContext *s) static void apply_channel_coupling(AC3EncodeContext *s)
{ {
LOCAL_ALIGNED_16(CoefType, cpl_coords, [AC3_MAX_BLOCKS], [AC3_MAX_CHANNELS][16]); LOCAL_ALIGNED_16(CoefType, cpl_coords, [AC3_MAX_BLOCKS], [AC3_MAX_CHANNELS][16]);
#if CONFIG_AC3ENC_FLOAT #if AC3ENC_FLOAT
LOCAL_ALIGNED_16(int32_t, fixed_cpl_coords, [AC3_MAX_BLOCKS], [AC3_MAX_CHANNELS][16]); LOCAL_ALIGNED_16(int32_t, fixed_cpl_coords, [AC3_MAX_BLOCKS], [AC3_MAX_CHANNELS][16]);
#else #else
int32_t (*fixed_cpl_coords)[AC3_MAX_CHANNELS][16] = cpl_coords; int32_t (*fixed_cpl_coords)[AC3_MAX_CHANNELS][16] = cpl_coords;
@@ -127,7 +120,7 @@ static void apply_channel_coupling(AC3EncodeContext *s)
int cpl_start, num_cpl_coefs; int cpl_start, num_cpl_coefs;
memset(cpl_coords, 0, AC3_MAX_BLOCKS * sizeof(*cpl_coords)); memset(cpl_coords, 0, AC3_MAX_BLOCKS * sizeof(*cpl_coords));
#if CONFIG_AC3ENC_FLOAT #if AC3ENC_FLOAT
memset(fixed_cpl_coords, 0, AC3_MAX_BLOCKS * sizeof(*cpl_coords)); memset(fixed_cpl_coords, 0, AC3_MAX_BLOCKS * sizeof(*cpl_coords));
#endif #endif
@@ -268,7 +261,7 @@ static void apply_channel_coupling(AC3EncodeContext *s)
if (!block->cpl_in_use) if (!block->cpl_in_use)
continue; continue;
#if CONFIG_AC3ENC_FLOAT #if AC3ENC_FLOAT
s->ac3dsp.float_to_fixed24(fixed_cpl_coords[blk][1], s->ac3dsp.float_to_fixed24(fixed_cpl_coords[blk][1],
cpl_coords[blk][1], cpl_coords[blk][1],
s->fbw_channels * 16); s->fbw_channels * 16);
@@ -314,7 +307,7 @@ static void apply_channel_coupling(AC3EncodeContext *s)
} }
} }
if (CONFIG_EAC3_ENCODER && s->eac3) if (AC3ENC_FLOAT && CONFIG_EAC3_ENCODER && s->eac3)
ff_eac3_set_cpl_states(s); ff_eac3_set_cpl_states(s);
} }
@@ -386,19 +379,13 @@ int AC3_NAME(encode_frame)(AVCodecContext *avctx, AVPacket *avpkt,
return ret; return ret;
} }
if (s->bit_alloc.sr_code == 1 || s->eac3) if (s->bit_alloc.sr_code == 1 || (AC3ENC_FLOAT && s->eac3))
ff_ac3_adjust_frame_size(s); ff_ac3_adjust_frame_size(s);
copy_input_samples(s, (SampleType **)frame->extended_data); copy_input_samples(s, (SampleType **)frame->extended_data);
apply_mdct(s); apply_mdct(s);
if (s->fixed_point)
scale_coefficients(s);
clip_coefficients(&s->adsp, s->blocks[0].mdct_coef[1],
AC3_MAX_COEFS * s->num_blocks * s->channels);
s->cpl_on = s->cpl_enabled; s->cpl_on = s->cpl_enabled;
ff_ac3_compute_coupling_strategy(s); ff_ac3_compute_coupling_strategy(s);
@@ -407,30 +394,9 @@ int AC3_NAME(encode_frame)(AVCodecContext *avctx, AVPacket *avpkt,
compute_rematrixing_strategy(s); compute_rematrixing_strategy(s);
if (!s->fixed_point) #if AC3ENC_FLOAT
scale_coefficients(s); scale_coefficients(s);
#endif
ff_ac3_apply_rematrixing(s); return ff_ac3_encode_frame_common_end(avctx, avpkt, frame, got_packet_ptr);
ff_ac3_process_exponents(s);
ret = ff_ac3_compute_bit_allocation(s);
if (ret) {
av_log(avctx, AV_LOG_ERROR, "Bit allocation failed. Try increasing the bitrate.\n");
return ret;
}
ff_ac3_group_exponents(s);
ff_ac3_quantize_mantissas(s);
if ((ret = ff_alloc_packet2(avctx, avpkt, s->frame_size, 0)) < 0)
return ret;
ff_ac3_output_frame(s, avpkt->data);
if (frame->pts != AV_NOPTS_VALUE)
avpkt->pts = frame->pts - ff_samples_to_time_base(avctx, avctx->initial_padding);
*got_packet_ptr = 1;
return 0;
} }
+1 -70
View File
@@ -25,7 +25,7 @@
*/ */
#include "libavutil/channel_layout.h" #include "libavutil/channel_layout.h"
#include "libavutil/mem.h" #include "libavutil/mem_internal.h"
#include "avcodec.h" #include "avcodec.h"
#include "ac3tab.h" #include "ac3tab.h"
@@ -97,24 +97,6 @@ const uint16_t avpriv_ac3_channel_layout_tab[8] = {
AV_CH_LAYOUT_5POINT0 AV_CH_LAYOUT_5POINT0
}; };
#define COMMON_CHANNEL_MAP \
{ { 0, 1, }, { 0, 1, 2, } },\
{ { 0, }, { 0, 1, } },\
{ { 0, 1, }, { 0, 1, 2, } },\
{ { 0, 2, 1, }, { 0, 2, 1, 3, } },\
{ { 0, 1, 2, }, { 0, 1, 3, 2, } },\
{ { 0, 2, 1, 3, }, { 0, 2, 1, 4, 3, } },
/**
* Table to remap channels from SMPTE order to AC-3 order.
* [channel_mode][lfe][ch]
*/
const uint8_t ff_ac3_enc_channel_map[8][2][6] = {
COMMON_CHANNEL_MAP
{ { 0, 1, 2, 3, }, { 0, 1, 3, 4, 2, } },
{ { 0, 2, 1, 3, 4, }, { 0, 2, 1, 4, 5, 3 } },
};
/** /**
* Table to remap channels from AC-3 order to SMPTE order. * Table to remap channels from AC-3 order to SMPTE order.
* [channel_mode][lfe][ch] * [channel_mode][lfe][ch]
@@ -147,44 +129,6 @@ const uint8_t ff_eac3_default_cpl_band_struct[18] = {
0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1
}; };
/* AC-3 MDCT window */
/* MDCT window */
DECLARE_ALIGNED(16, const int16_t, ff_ac3_window)[AC3_WINDOW_SIZE/2] = {
4, 7, 12, 16, 21, 28, 34, 42,
51, 61, 72, 84, 97, 111, 127, 145,
164, 184, 207, 231, 257, 285, 315, 347,
382, 419, 458, 500, 544, 591, 641, 694,
750, 810, 872, 937, 1007, 1079, 1155, 1235,
1318, 1406, 1497, 1593, 1692, 1796, 1903, 2016,
2132, 2253, 2379, 2509, 2644, 2783, 2927, 3076,
3230, 3389, 3552, 3721, 3894, 4072, 4255, 4444,
4637, 4835, 5038, 5246, 5459, 5677, 5899, 6127,
6359, 6596, 6837, 7083, 7334, 7589, 7848, 8112,
8380, 8652, 8927, 9207, 9491, 9778,10069,10363,
10660,10960,11264,11570,11879,12190,12504,12820,
13138,13458,13780,14103,14427,14753,15079,15407,
15735,16063,16392,16720,17049,17377,17705,18032,
18358,18683,19007,19330,19651,19970,20287,20602,
20914,21225,21532,21837,22139,22438,22733,23025,
23314,23599,23880,24157,24430,24699,24964,25225,
25481,25732,25979,26221,26459,26691,26919,27142,
27359,27572,27780,27983,28180,28373,28560,28742,
28919,29091,29258,29420,29577,29729,29876,30018,
30155,30288,30415,30538,30657,30771,30880,30985,
31086,31182,31274,31363,31447,31528,31605,31678,
31747,31814,31877,31936,31993,32046,32097,32145,
32190,32232,32272,32310,32345,32378,32409,32438,
32465,32490,32513,32535,32556,32574,32592,32608,
32623,32636,32649,32661,32671,32681,32690,32698,
32705,32712,32718,32724,32729,32733,32737,32741,
32744,32747,32750,32752,32754,32756,32757,32759,
32760,32761,32762,32763,32764,32764,32765,32765,
32766,32766,32766,32766,32767,32767,32767,32767,
32767,32767,32767,32767,32767,32767,32767,32767,
32767,32767,32767,32767,32767,32767,32767,32767,
};
const uint8_t ff_ac3_log_add_tab[260]= { const uint8_t ff_ac3_log_add_tab[260]= {
0x40,0x3f,0x3e,0x3d,0x3c,0x3b,0x3a,0x39,0x38,0x37, 0x40,0x3f,0x3e,0x3d,0x3c,0x3b,0x3a,0x39,0x38,0x37,
0x36,0x35,0x34,0x34,0x33,0x32,0x31,0x30,0x2f,0x2f, 0x36,0x35,0x34,0x34,0x33,0x32,0x31,0x30,0x2f,0x2f,
@@ -301,19 +245,6 @@ const uint16_t ff_ac3_fast_gain_tab[8]= {
0x080, 0x100, 0x180, 0x200, 0x280, 0x300, 0x380, 0x400, 0x080, 0x100, 0x180, 0x200, 0x280, 0x300, 0x380, 0x400,
}; };
/**
* Default channel map for a dependent substream defined by acmod
*/
const uint16_t ff_eac3_default_chmap[8] = {
AC3_CHMAP_L | AC3_CHMAP_R, // FIXME Ch1+Ch2
AC3_CHMAP_C,
AC3_CHMAP_L | AC3_CHMAP_R,
AC3_CHMAP_L | AC3_CHMAP_C | AC3_CHMAP_R,
AC3_CHMAP_L | AC3_CHMAP_R | AC3_CHMAP_C_SUR,
AC3_CHMAP_L | AC3_CHMAP_C | AC3_CHMAP_R | AC3_CHMAP_C_SUR,
AC3_CHMAP_L | AC3_CHMAP_R | AC3_CHMAP_L_SUR | AC3_CHMAP_R_SUR,
AC3_CHMAP_L | AC3_CHMAP_C | AC3_CHMAP_R | AC3_CHMAP_L_SUR | AC3_CHMAP_R_SUR
};
const uint64_t ff_eac3_custom_channel_map_locations[16][2] = { const uint64_t ff_eac3_custom_channel_map_locations[16][2] = {
{ 1, AV_CH_FRONT_LEFT }, { 1, AV_CH_FRONT_LEFT },
{ 1, AV_CH_FRONT_CENTER }, { 1, AV_CH_FRONT_CENTER },
+8 -3
View File
@@ -31,13 +31,11 @@
extern const uint16_t ff_ac3_frame_size_tab[38][3]; extern const uint16_t ff_ac3_frame_size_tab[38][3];
extern const uint8_t ff_ac3_channels_tab[8]; extern const uint8_t ff_ac3_channels_tab[8];
extern av_export_avcodec const uint16_t avpriv_ac3_channel_layout_tab[8]; extern av_export_avcodec const uint16_t avpriv_ac3_channel_layout_tab[8];
extern const uint8_t ff_ac3_enc_channel_map[8][2][6];
extern const uint8_t ff_ac3_dec_channel_map[8][2][6]; extern const uint8_t ff_ac3_dec_channel_map[8][2][6];
extern const int ff_ac3_sample_rate_tab[]; extern const int ff_ac3_sample_rate_tab[];
extern const uint16_t ff_ac3_bitrate_tab[19]; extern const uint16_t ff_ac3_bitrate_tab[19];
extern const uint8_t ff_ac3_rematrix_band_tab[5]; extern const uint8_t ff_ac3_rematrix_band_tab[5];
extern const uint8_t ff_eac3_default_cpl_band_struct[18]; extern const uint8_t ff_eac3_default_cpl_band_struct[18];
extern const int16_t ff_ac3_window[AC3_WINDOW_SIZE/2];
extern const uint8_t ff_ac3_log_add_tab[260]; extern const uint8_t ff_ac3_log_add_tab[260];
extern const uint16_t ff_ac3_hearing_threshold_tab[AC3_CRITICAL_BANDS][3]; extern const uint16_t ff_ac3_hearing_threshold_tab[AC3_CRITICAL_BANDS][3];
extern const uint8_t ff_ac3_bap_tab[64]; extern const uint8_t ff_ac3_bap_tab[64];
@@ -47,7 +45,6 @@ extern const uint16_t ff_ac3_slow_gain_tab[4];
extern const uint16_t ff_ac3_db_per_bit_tab[4]; extern const uint16_t ff_ac3_db_per_bit_tab[4];
extern const int16_t ff_ac3_floor_tab[8]; extern const int16_t ff_ac3_floor_tab[8];
extern const uint16_t ff_ac3_fast_gain_tab[8]; extern const uint16_t ff_ac3_fast_gain_tab[8];
extern const uint16_t ff_eac3_default_chmap[8];
extern const uint8_t ff_ac3_band_start_tab[AC3_CRITICAL_BANDS+1]; extern const uint8_t ff_ac3_band_start_tab[AC3_CRITICAL_BANDS+1];
extern const uint8_t ff_ac3_bin_to_band_tab[253]; extern const uint8_t ff_ac3_bin_to_band_tab[253];
extern const uint64_t ff_eac3_custom_channel_map_locations[16][2]; extern const uint64_t ff_eac3_custom_channel_map_locations[16][2];
@@ -68,4 +65,12 @@ enum CustomChannelMapLocation{
AC3_CHMAP_LFE = 1<<(15-15) AC3_CHMAP_LFE = 1<<(15-15)
}; };
#define COMMON_CHANNEL_MAP \
{ { 0, 1, }, { 0, 1, 2, } },\
{ { 0, }, { 0, 1, } },\
{ { 0, 1, }, { 0, 1, 2, } },\
{ { 0, 2, 1, }, { 0, 2, 1, 3, } },\
{ { 0, 1, 2, }, { 0, 1, 3, 2, } },\
{ { 0, 2, 1, 3, }, { 0, 2, 1, 4, 3, } },
#endif /* AVCODEC_AC3TAB_H */ #endif /* AVCODEC_AC3TAB_H */
-41
View File
@@ -29,47 +29,6 @@
#include "celp_math.h" #include "celp_math.h"
#include "audiodsp.h" #include "audiodsp.h"
int ff_acelp_decode_8bit_to_1st_delay3(int ac_index)
{
ac_index += 58;
if(ac_index > 254)
ac_index = 3 * ac_index - 510;
return ac_index;
}
int ff_acelp_decode_4bit_to_2nd_delay3(
int ac_index,
int pitch_delay_min)
{
if(ac_index < 4)
return 3 * (ac_index + pitch_delay_min);
else if(ac_index < 12)
return 3 * pitch_delay_min + ac_index + 6;
else
return 3 * (ac_index + pitch_delay_min) - 18;
}
int ff_acelp_decode_5_6_bit_to_2nd_delay3(
int ac_index,
int pitch_delay_min)
{
return 3 * pitch_delay_min + ac_index - 2;
}
int ff_acelp_decode_9bit_to_1st_delay6(int ac_index)
{
if(ac_index < 463)
return ac_index + 105;
else
return 6 * (ac_index - 368);
}
int ff_acelp_decode_6bit_to_2nd_delay6(
int ac_index,
int pitch_delay_min)
{
return 6 * pitch_delay_min + ac_index - 3;
}
void ff_acelp_update_past_gain( void ff_acelp_update_past_gain(
int16_t* quant_energy, int16_t* quant_energy,
int gain_corr_factor, int gain_corr_factor,
+34 -11
View File
@@ -41,7 +41,13 @@
* with 1/3 resolution, 19 < pitch_delay < 85 * with 1/3 resolution, 19 < pitch_delay < 85
* integers only, 85 <= pitch_delay <= 143 * integers only, 85 <= pitch_delay <= 143
*/ */
int ff_acelp_decode_8bit_to_1st_delay3(int ac_index); static inline int ff_acelp_decode_8bit_to_1st_delay3(int ac_index)
{
ac_index += 58;
if (ac_index > 254)
ac_index = 3 * ac_index - 510;
return ac_index;
}
/** /**
* @brief Decode pitch delay of the second subframe encoded by 5 or 6 bits * @brief Decode pitch delay of the second subframe encoded by 5 or 6 bits
@@ -58,9 +64,11 @@ int ff_acelp_decode_8bit_to_1st_delay3(int ac_index);
* @remark The routine is used in G.729 @@8k, AMR @@10.2k, AMR @@7.95k, * @remark The routine is used in G.729 @@8k, AMR @@10.2k, AMR @@7.95k,
* AMR @@7.4k for the second subframe. * AMR @@7.4k for the second subframe.
*/ */
int ff_acelp_decode_5_6_bit_to_2nd_delay3( static inline int ff_acelp_decode_5_6_bit_to_2nd_delay3(int ac_index,
int ac_index, int pitch_delay_min)
int pitch_delay_min); {
return 3 * pitch_delay_min + ac_index - 2;
}
/** /**
* @brief Decode pitch delay with 1/3 precision. * @brief Decode pitch delay with 1/3 precision.
@@ -78,9 +86,16 @@ int ff_acelp_decode_5_6_bit_to_2nd_delay3(
* @remark The routine is used in G.729 @@6.4k, AMR @@6.7k, AMR @@5.9k, * @remark The routine is used in G.729 @@6.4k, AMR @@6.7k, AMR @@5.9k,
* AMR @@5.15k, AMR @@4.75k for the second subframe. * AMR @@5.15k, AMR @@4.75k for the second subframe.
*/ */
int ff_acelp_decode_4bit_to_2nd_delay3( static inline int ff_acelp_decode_4bit_to_2nd_delay3(int ac_index,
int ac_index, int pitch_delay_min)
int pitch_delay_min); {
if (ac_index < 4)
return 3 * (ac_index + pitch_delay_min);
else if (ac_index < 12)
return 3 * pitch_delay_min + ac_index + 6;
else
return 3 * (ac_index + pitch_delay_min) - 18;
}
/** /**
* @brief Decode pitch delay of the first subframe encoded by 9 bits * @brief Decode pitch delay of the first subframe encoded by 9 bits
@@ -95,7 +110,13 @@ int ff_acelp_decode_4bit_to_2nd_delay3(
* *
* @remark The routine is used in AMR @@12.2k for the first and third subframes. * @remark The routine is used in AMR @@12.2k for the first and third subframes.
*/ */
int ff_acelp_decode_9bit_to_1st_delay6(int ac_index); static inline int ff_acelp_decode_9bit_to_1st_delay6(int ac_index)
{
if (ac_index < 463)
return ac_index + 105;
else
return 6 * (ac_index - 368);
}
/** /**
* @brief Decode pitch delay of the second subframe encoded by 6 bits * @brief Decode pitch delay of the second subframe encoded by 6 bits
@@ -111,9 +132,11 @@ int ff_acelp_decode_9bit_to_1st_delay6(int ac_index);
* *
* @remark The routine is used in AMR @@12.2k for the second and fourth subframes. * @remark The routine is used in AMR @@12.2k for the second and fourth subframes.
*/ */
int ff_acelp_decode_6bit_to_2nd_delay6( static inline int ff_acelp_decode_6bit_to_2nd_delay6(int ac_index,
int ac_index, int pitch_delay_min)
int pitch_delay_min); {
return 6 * pitch_delay_min + ac_index - 3;
}
/** /**
* @brief Update past quantized energies * @brief Update past quantized energies

Some files were not shown because too many files have changed in this diff Show More