Compare commits
266 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
1fd7fb9036 | ||
![]() |
9cc1d21e76 | ||
![]() |
0b0293ceaf | ||
![]() |
1b3332659a | ||
![]() |
07c9df792c | ||
![]() |
3b4e9dddcf | ||
![]() |
2ba1af5791 | ||
![]() |
51e880fed9 | ||
![]() |
86f4ac9365 | ||
![]() |
fe457ce4d1 | ||
![]() |
4506958289 | ||
![]() |
6300790144 | ||
![]() |
20a4cf0d09 | ||
![]() |
54b76eb595 | ||
![]() |
0787163cf3 | ||
![]() |
134ff88c6a | ||
![]() |
e2e145db89 | ||
![]() |
efdd30df06 | ||
![]() |
54e3aff10e | ||
![]() |
d9ec3070d1 | ||
![]() |
6ac156864c | ||
![]() |
0775653b4c | ||
![]() |
33c8bb2c6a | ||
![]() |
883795fb0f | ||
![]() |
849f55368c | ||
![]() |
b86c2640f6 | ||
![]() |
9b9411c1cf | ||
![]() |
54825047ab | ||
![]() |
a7c18b628f | ||
![]() |
81754d8f8b | ||
![]() |
36e6842aa6 | ||
![]() |
47e4a1ac6d | ||
![]() |
a058cbcfdf | ||
![]() |
4895211635 | ||
![]() |
58dc526ebf | ||
![]() |
eac49477aa | ||
![]() |
69a930b988 | ||
![]() |
55788572ea | ||
![]() |
aa7a19b417 | ||
![]() |
577f1feb3f | ||
![]() |
4afe2684d8 | ||
![]() |
5d1d143a4e | ||
![]() |
820f41e1a1 | ||
![]() |
14d6ea0c45 | ||
![]() |
0fb2b61614 | ||
![]() |
0d277be45a | ||
![]() |
3b332ef33c | ||
![]() |
787e4d12da | ||
![]() |
95c298b125 | ||
![]() |
fd72ff6f31 | ||
![]() |
82db2f2ac8 | ||
![]() |
f36b3c5df9 | ||
![]() |
117dcc2097 | ||
![]() |
c4e18917d4 | ||
![]() |
03fbc282ff | ||
![]() |
f30a89e15f | ||
![]() |
3ea49fc508 | ||
![]() |
9bafd6a8f6 | ||
![]() |
396195c505 | ||
![]() |
e2324b5b37 | ||
![]() |
bb97f243ba | ||
![]() |
b6dc16bd95 | ||
![]() |
a9c77e5c22 | ||
![]() |
de882ec2b1 | ||
![]() |
bd62554ad2 | ||
![]() |
cd51f41791 | ||
![]() |
da811dfc93 | ||
![]() |
dce726f091 | ||
![]() |
ea5b4c682c | ||
![]() |
65d426bddd | ||
![]() |
64fdce7802 | ||
![]() |
195e8ecacc | ||
![]() |
a4ffcf024e | ||
![]() |
da52c0ebc6 | ||
![]() |
8815ddc29f | ||
![]() |
5ceae49caf | ||
![]() |
864c0c50eb | ||
![]() |
89dbef7329 | ||
![]() |
93df243a59 | ||
![]() |
db61d34e83 | ||
![]() |
309609ce4d | ||
![]() |
6607057d0e | ||
![]() |
575dc3a1b2 | ||
![]() |
1cc6fef067 | ||
![]() |
60ccc1a748 | ||
![]() |
b31a3c6f26 | ||
![]() |
ce99ef48ea | ||
![]() |
dd2394754d | ||
![]() |
883f3e18dd | ||
![]() |
06336ce760 | ||
![]() |
6f580e8735 | ||
![]() |
5c2d8bbffa | ||
![]() |
4b8f3c5bf3 | ||
![]() |
18dba3d80d | ||
![]() |
2ba17ac96c | ||
![]() |
12e064d6c2 | ||
![]() |
f2595a6c38 | ||
![]() |
a654f483cd | ||
![]() |
991a203479 | ||
![]() |
8524009161 | ||
![]() |
47f345de1d | ||
![]() |
af0a95ee03 | ||
![]() |
2abc6e930b | ||
![]() |
3bb48296ef | ||
![]() |
a3fdc0b35b | ||
![]() |
cf8b91a28e | ||
![]() |
cfda2a677c | ||
![]() |
11dfd1fa20 | ||
![]() |
f7e9fcda2d | ||
![]() |
2719ba9ee3 | ||
![]() |
d48e0aed3c | ||
![]() |
89b52d25b4 | ||
![]() |
9984d492dc | ||
![]() |
56b84b023d | ||
![]() |
0e216ed407 | ||
![]() |
f783259fdb | ||
![]() |
b6691fba77 | ||
![]() |
15fd62110f | ||
![]() |
86b532898d | ||
![]() |
ca78ee73db | ||
![]() |
517ce1d09b | ||
![]() |
46a17d886b | ||
![]() |
944570906b | ||
![]() |
057ee35924 | ||
![]() |
e386241d54 | ||
![]() |
222236317b | ||
![]() |
633a2a082f | ||
![]() |
e5f5df37c8 | ||
![]() |
cc9c74ea87 | ||
![]() |
12700b0219 | ||
![]() |
3e0802e42b | ||
![]() |
56e11cbe32 | ||
![]() |
2be7d565bb | ||
![]() |
c7b64a904a | ||
![]() |
9798dc8061 | ||
![]() |
a5cc8775cf | ||
![]() |
f9ca1fecb0 | ||
![]() |
cd57d608a4 | ||
![]() |
043f326060 | ||
![]() |
9a641b909c | ||
![]() |
5405ba7b63 | ||
![]() |
70f6d553d9 | ||
![]() |
25fc3deed8 | ||
![]() |
a8a6cdfcd7 | ||
![]() |
39518589e7 | ||
![]() |
857e391697 | ||
![]() |
04aa2ffbcf | ||
![]() |
63523485f4 | ||
![]() |
35bc67503e | ||
![]() |
1f636a697f | ||
![]() |
24d725f455 | ||
![]() |
66fcf1fa40 | ||
![]() |
c7b7e0790c | ||
![]() |
3f3e5f8f60 | ||
![]() |
8e95ddbe82 | ||
![]() |
8cba067fe5 | ||
![]() |
73c6520c09 | ||
![]() |
ca47574e16 | ||
![]() |
045670a6f7 | ||
![]() |
30a0622a5d | ||
![]() |
e4d921dc71 | ||
![]() |
2185103bcd | ||
![]() |
bf7ee2524b | ||
![]() |
5a1efc7b85 | ||
![]() |
71af22097d | ||
![]() |
f3d34cff76 | ||
![]() |
81b38caf21 | ||
![]() |
20071ff1a4 | ||
![]() |
3b7db9c4f5 | ||
![]() |
0ddcee172e | ||
![]() |
13ecdb06f8 | ||
![]() |
ca8c62d187 | ||
![]() |
e443165c32 | ||
![]() |
0b41eeac45 | ||
![]() |
de31f85707 | ||
![]() |
d61454e7c1 | ||
![]() |
b02e4faa3e | ||
![]() |
09256527be | ||
![]() |
84d26ab6eb | ||
![]() |
1d99adc953 | ||
![]() |
67991f3a3e | ||
![]() |
32e8922faf | ||
![]() |
32dbd1f342 | ||
![]() |
eefc3ca7be | ||
![]() |
a16558e122 | ||
![]() |
506368f563 | ||
![]() |
c0c24bc9b3 | ||
![]() |
b89f279cd6 | ||
![]() |
7f90eef87a | ||
![]() |
71f0a3c4ad | ||
![]() |
d9bef14e41 | ||
![]() |
4b4ed88e89 | ||
![]() |
f6476944e1 | ||
![]() |
03d30d4c2c | ||
![]() |
853a27e345 | ||
![]() |
f7c0f8355e | ||
![]() |
6f5c505109 | ||
![]() |
b29f9897e3 | ||
![]() |
1d987a34d8 | ||
![]() |
6099d1ca0e | ||
![]() |
a9b9751bc8 | ||
![]() |
da5e52010c | ||
![]() |
e1fd837888 | ||
![]() |
1d10997488 | ||
![]() |
76a5cf1f80 | ||
![]() |
16c3d6d392 | ||
![]() |
9d79848f84 | ||
![]() |
b8d34604ff | ||
![]() |
7a02b9cb2d | ||
![]() |
ff6d440d10 | ||
![]() |
a88a57cd24 | ||
![]() |
0cda7baa8b | ||
![]() |
31baa6f199 | ||
![]() |
3b364ac18a | ||
![]() |
63660277fd | ||
![]() |
6101187c55 | ||
![]() |
91ff803a74 | ||
![]() |
4f4f78ea48 | ||
![]() |
ff24824a72 | ||
![]() |
570cefb02b | ||
![]() |
ce0972ecdd | ||
![]() |
09c848855a | ||
![]() |
e1ce4f805f | ||
![]() |
bb5c0ac922 | ||
![]() |
d389438296 | ||
![]() |
3b57d7769a | ||
![]() |
b7f2719951 | ||
![]() |
dc4e34a2f0 | ||
![]() |
d694ab846c | ||
![]() |
ab02548c8a | ||
![]() |
9eb442cca2 | ||
![]() |
b45ab61b24 | ||
![]() |
cc73b4f574 | ||
![]() |
8ac3b2cdb7 | ||
![]() |
ace90ee265 | ||
![]() |
703bd31647 | ||
![]() |
c16e80ee3d | ||
![]() |
66ac5b96e8 | ||
![]() |
547cad8c81 | ||
![]() |
55b1a1e9c1 | ||
![]() |
f851477889 | ||
![]() |
4f2d4b98fc | ||
![]() |
7d8ebb8774 | ||
![]() |
07b0ccf511 | ||
![]() |
9d3e69ae30 | ||
![]() |
480633c6c2 | ||
![]() |
b5d4f49e3c | ||
![]() |
4cde8bae49 | ||
![]() |
5b740d1eaa | ||
![]() |
152e09fde7 | ||
![]() |
110841c3ab | ||
![]() |
5694831e06 | ||
![]() |
1f52f82a55 | ||
![]() |
e62f08ca8d | ||
![]() |
ee099059e7 | ||
![]() |
e2a89f7f0f | ||
![]() |
7c46855074 | ||
![]() |
c2d6cc2971 | ||
![]() |
8c91414803 | ||
![]() |
0263750a0d | ||
![]() |
63795fe5b9 | ||
![]() |
d2bad216f7 | ||
![]() |
d04fb11868 | ||
![]() |
e8f2823f06 | ||
![]() |
7dfccac20c | ||
![]() |
04361427e6 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -64,7 +64,6 @@
|
||||
/tests/data/
|
||||
/tests/pixfmts.mak
|
||||
/tests/rotozoom
|
||||
/tests/test_copy.ffmeta
|
||||
/tests/tiny_psnr
|
||||
/tests/tiny_ssim
|
||||
/tests/videogen
|
||||
|
184
Changelog
184
Changelog
@@ -1,23 +1,173 @@
|
||||
Entries are sorted chronologically from oldest to youngest within each release,
|
||||
releases are sorted from youngest to oldest.
|
||||
|
||||
version 2.5:
|
||||
- HEVC/H.265 RTP payload format (draft v6) packetizer
|
||||
- SUP/PGS subtitle demuxer
|
||||
- ffprobe -show_pixel_formats option
|
||||
- CAST128 symmetric block cipher, ECB mode
|
||||
- STL subtitle demuxer and decoder
|
||||
- libutvideo YUV 4:2:2 10bit support
|
||||
- XCB-based screen-grabber
|
||||
- UDP-Lite support (RFC 3828)
|
||||
- xBR scaling filter
|
||||
- AVFoundation screen capturing support
|
||||
- ffserver supports codec private options
|
||||
- creating DASH compatible fragmented MP4, MPEG-DASH segmenting muxer
|
||||
- WebP muxer with animated WebP support
|
||||
- zygoaudio decoding support
|
||||
- APNG demuxer
|
||||
- postproc visualization support
|
||||
version <next>:
|
||||
|
||||
|
||||
version 2.4.6:
|
||||
- doc/examples: fix lib math dep for decoding_encoding
|
||||
- avformat/movenc: workaround bug in "PathScale EKOPath(tm) Compiler Suite Version 4.0.12.1"
|
||||
- vp9: fix parser return values in error case
|
||||
- ffmpeg: Clear error message array at init.
|
||||
- avcodec/dvdsubdec: fix accessing dangling pointers
|
||||
- avcodec/dvdsubdec: error on bitmaps with size 0
|
||||
- avformat/mov: Fix mixed declaration and statement warning
|
||||
- cmdutils: Use 64bit for file size/offset related variable in cmdutils_read_file()
|
||||
- avformat/utils: Clear pointer in ff_alloc_extradata() to avoid leaving a stale pointer in memory
|
||||
- avformat/matroskadec: Use av_freep() to avoid leaving stale pointers in memory
|
||||
- lavfi: check av_strdup() return value
|
||||
- mov: Fix negative size calculation in mov_read_default().
|
||||
- avformat/mov: fix integer overflow in mov_read_udta_string()
|
||||
- mov: Avoid overflow with mov_metadata_raw()
|
||||
- avcodec/dvdsubdec: fix out of bounds accesses
|
||||
- avfilter/vf_sab: fix filtering tiny images
|
||||
- avformat/flvdec: Increase string array size
|
||||
- avformat/flvdec: do not inject dts=0 metadata packets which failed to be parsed into a new data stream
|
||||
- avformat/cdxl: Fix integer overflow of image_size
|
||||
- avformat/segment: Use av_freep() avoid leaving stale pointers in memory
|
||||
- avformat/mov: Fix memleaks for duplicate STCO/CO64/STSC atoms
|
||||
- mov: avoid a memleak when multiple stss boxes are presen
|
||||
|
||||
version 2.4.5:
|
||||
- lavu/frame: fix malloc error path in av_frame_copy_props()
|
||||
- avformat/utils: Do not update programs streams from program-less streams in update_wrap_reference()
|
||||
- avformat/aviobuf: Check that avio_seek() target is non negative
|
||||
- swresample/soxr_resample: fix error handling
|
||||
- avformat/flvdec: fix potential use of uninitialized variables
|
||||
- avformat/matroskadec: fix handling of recursive SeekHead elements
|
||||
- doc/examples/transcoding: check encoder before using it
|
||||
- swscale/x86/rgb2rgb_template: fix crash with tiny size and nv12 output
|
||||
- avformat/rmdec: Check codec_data_size
|
||||
- avformat/aviobuf: Fix infinite loop in ff_get_line()
|
||||
- vc1: Do not assume seek happens after decoding
|
||||
- mmvideo: check frame dimensions
|
||||
- jvdec: check frame dimensions
|
||||
- avcodec/indeo3: ensure offsets are non negative
|
||||
- avcodec/h264: Check *log2_weight_denom
|
||||
- avcodec/hevc_ps: Check diff_cu_qp_delta_depth
|
||||
- avcodec/h264: Clear delayed_pic on deallocation
|
||||
- avcodec/hevc: clear filter_slice_edges() on allocation
|
||||
- avcodec/dcadec: Check that the added xch channel isnt already there
|
||||
- avcodec/indeo3: use signed variables to avoid underflow
|
||||
- swscale: increase yuv2rgb table headroom
|
||||
- avformat/mov: fix integer overflow of size
|
||||
- avformat/mov: check atom nesting depth
|
||||
- avcodec/utvideodec: Fix handling of slice_height=0
|
||||
- avcodec/vmdvideo: Check len before using it in method 3
|
||||
- avformat/flvdec: Use av_freep() avoid leaving stale pointers in memory
|
||||
- avformat/hdsenc: Use av_freep() avoid leaving stale pointers in memory
|
||||
- configure: create the tests directory like the doc directory
|
||||
- v4l2: Make use of the VIDIOC_ENUM_FRAMESIZES ioctl on OpenBSD
|
||||
- avcodec/motion_est: use 2x8x8 for interlaced qpel
|
||||
- Treat all '*.pnm' files as non-text file
|
||||
|
||||
version 2.4.4:
|
||||
- avformat: replace some odd 30-60 rates by higher less odd ones in get_std_framerate()
|
||||
- swscale: fix yuv2yuvX_8 assembly on x86
|
||||
- avcodec/hevc_ps: Check num_long_term_ref_pics_sps
|
||||
- avcodec/mjpegdec: Fix integer overflow in shift
|
||||
- avcodec/hevc_ps: Check return code from pps_range_extensions()
|
||||
- avcodec/rawdec: Check the return code of avpicture_get_size()
|
||||
- avcodec/pngdec: Check IHDR/IDAT order
|
||||
- avcodec/flacdec: Call ff_flacdsp_init() unconditionally
|
||||
- avcodec/utils: Check that the data is complete in avpriv_bprint_to_extradata()
|
||||
- avcodec/mjpegdec: Fix context fields becoming inconsistent
|
||||
- avcodec/mjpegdec: Check for pixfmtid 0x42111100 || 0x24111100 with more than 8 bits
|
||||
- swscale/x86/rgb2rgb_template: handle the first 2 lines with C in rgb24toyv12_*()
|
||||
- doc/APIchanges: Fix some wrong versions
|
||||
- avformat/hlsenc: Free context after hls_append_segment
|
||||
- avcodec/mpeg4video_parser: fix spurious extradata parse warnings
|
||||
- lavu/opt: fix av_opt_get function
|
||||
- avcodec/wmaprodec: Fix integer overflow in sfb_offsets initialization
|
||||
- avcodec/utvideodec: fix assumtation that slice_height >= 1
|
||||
- avcodec/options_table fix min of audio channels and sample rate
|
||||
- libavutil/thread.h: Support OS/2 threads
|
||||
- fix Makefile objects for pulseaudio support
|
||||
- opusdec: make sure all substreams have the same number of coded samples
|
||||
- lavu: add wrappers for the pthreads mutex API
|
||||
- avformat/avidec: fix handling dv in avi
|
||||
- avfilter/vf_lut: gammaval709()
|
||||
- cinedec: report white balance gain coefficients using metadata
|
||||
- swscale/utils: support bayer input + scaling, and bayer input + any supported output
|
||||
- swscale: support internal scaler cascades
|
||||
- avformat/dtsdec: dts_probe: check reserved bit, check lfe, check sr_code similarity
|
||||
- avformat/segment: export inner muxer timebase
|
||||
- Remove fminf() emulation, fix build issues
|
||||
- avcodec/mpegaudio_parser: fix off by 1 error in bitrate calculation
|
||||
- Use -fno-optimize-sibling-calls on parisc also for gcc 4.9.
|
||||
- ffmpeg_opt: store canvas size in decoder context
|
||||
- avcodec/mpeg12dec: do not trust AVCodecContext input dimensions
|
||||
|
||||
version 2.4.3:
|
||||
- avcodec/svq1dec: zero terminate embedded message before printing
|
||||
- avcodec/cook: check that the subpacket sizes fit in block_align
|
||||
- avcodec/g2meet: check tile dimensions to avoid integer overflow
|
||||
- avcodec/utils: Align dimensions by at least their chroma sub-sampling factors.
|
||||
- avcodec/dnxhddec: treat pix_fmt like width/height
|
||||
- avcodec/dxa: check dimensions
|
||||
- avcodec/dirac_arith: fix integer overflow
|
||||
- avcodec/diracdec: Tighter checks on CODEBLOCKS_X/Y
|
||||
- avcodec/diracdec: Use 64bit in calculation of codeblock coordinates
|
||||
- avcodec/sgidec: fix count check
|
||||
- avcodec/sgidec: fix linesize for 16bit
|
||||
- avcodec/hevc_ps: Check default display window bitstream and skip if invalid
|
||||
- avcodec/tiffenc: properly compute packet size
|
||||
- lavd: export all symbols with av_ prefix
|
||||
- avformat/mxfdec: Fix termination of mxf_data_essence_container_uls
|
||||
- postproc: fix qp count
|
||||
- postproc/postprocess: fix quant store for fq mode
|
||||
- vf_drawtext: add missing clear of pointers after av_expr_free()
|
||||
- utvideoenc: properly set slice height/last line
|
||||
- swresample: fix sample drop loop end condition
|
||||
- resample: Avoid off-by-1 errors in PTS calcs.
|
||||
- imc: fix order of operations in coefficients read
|
||||
- hevc_mvs: make sure to always initialize the temporal MV fully
|
||||
- hevc_mvs: initialize the temporal MV in case of missing reference
|
||||
|
||||
version 2.4.2:
|
||||
- avcodec/on2avc: Check number of channels
|
||||
- avcodec/hevc: fix chroma transform_add size
|
||||
- avcodec/h264: Check mode before considering mixed mode intra prediction
|
||||
- avformat/mpegts: use a padded buffer in read_sl_header()
|
||||
- avformat/mpegts: Check desc_len / get8() return code
|
||||
- avcodec/vorbisdec: Fix off by 1 error in ptns_to_read
|
||||
- sdp: add support for H.261
|
||||
- avcodec/svq3: Do not memcpy AVFrame
|
||||
- avcodec/smc: fix off by 1 error
|
||||
- avcodec/qpeg: fix off by 1 error in MV bounds check
|
||||
- avcodec/gifdec: factorize interleave end handling out
|
||||
- avcodec/cinepak: fix integer underflow
|
||||
- avcodec/pngdec: Check bits per pixel before setting monoblack pixel format
|
||||
- avcodec/pngdec: Calculate MPNG bytewidth more defensively
|
||||
- avcodec/tiff: more completely check bpp/bppcount
|
||||
- avcodec/mmvideo: Bounds check 2nd line of HHV Intra blocks
|
||||
- avcodec/h263dec: Fix decoding messenger.h263
|
||||
- avcodec/utils: Add case for jv to avcodec_align_dimensions2()
|
||||
- avcodec/mjpegdec: check bits per pixel for changes similar to dimensions
|
||||
- avcodec/jpeglsdec: Check run value more completely in ls_decode_line()
|
||||
- avformat/hlsenc: export inner muxer timebase
|
||||
- configure: add noexecstack to linker options if supported.
|
||||
- avcodec/ac3enc_template: fix out of array read
|
||||
- avutil/x86/cpu: fix cpuid sub-leaf selection
|
||||
- avformat/img2dec: enable generic seeking for image pipes
|
||||
- avformat/img2dec: initialize pkt->pos for image pipes
|
||||
- avformat/img2dec: pass error code and signal EOF
|
||||
- avformat/img2dec: fix error code at EOF for pipes
|
||||
- libavutil/opt: fix av_opt_set_channel_layout() to access correct memory address
|
||||
- tests/fate-run.sh: Cat .err file in case of error with V>0
|
||||
- avformat/riffenc: Filter out "BottomUp" in ff_put_bmp_header()
|
||||
- avcodec/webp: fix default palette color 0xff000000 -> 0x00000000
|
||||
- avcodec/asvenc: fix AAN scaling
|
||||
- Fix compile error on arm4/arm5 platform
|
||||
|
||||
|
||||
version 2.4.1:
|
||||
- swscale: Allow chroma samples to be above and to the left of luma samples
|
||||
- avcodec/libilbc: support for latest git of libilbc
|
||||
- avcodec/webp: treat out-of-bound palette index as translucent black
|
||||
- vf_deshake: rename Transform.vector to Transform.vec to avoid compiler confusion
|
||||
- apetag: Fix APE tag size check
|
||||
- tools/crypto_bench: fix build when AV_READ_TIME is unavailable
|
||||
|
||||
|
||||
version 2.4:
|
||||
|
@@ -64,7 +64,6 @@ There are a handful of files under other licensing terms, namely:
|
||||
documentation accompanying your program if you only distribute executables.
|
||||
You must also indicate any changes including additions and deletions to
|
||||
those three files in the documentation.
|
||||
tests/reference.pnm is under the expat license
|
||||
|
||||
|
||||
external libraries
|
||||
|
@@ -309,7 +309,6 @@ libavdevice
|
||||
|
||||
|
||||
avfoundation.m Thilo Borgmann
|
||||
decklink* Deti Fliegl
|
||||
dshow.c Roger Pack (CC rogerdpack@gmail.com)
|
||||
fbdev_enc.c Lukasz Marek
|
||||
gdigrab.c Roger Pack (CC rogerdpack@gmail.com)
|
||||
@@ -386,7 +385,6 @@ Muxers/Demuxers:
|
||||
aiffdec.c Baptiste Coudurier, Matthieu Bouron
|
||||
aiffenc.c Baptiste Coudurier, Matthieu Bouron
|
||||
ape.c Kostya Shishkov
|
||||
apngdec.c Benoit Fouet
|
||||
ass* Aurelien Jacobs
|
||||
astdec.c Paul B Mahol
|
||||
astenc.c James Almer
|
||||
@@ -464,7 +462,7 @@ Muxers/Demuxers:
|
||||
rtmp* Kostya Shishkov
|
||||
rtp.c, rtpenc.c Martin Storsjo
|
||||
rtpdec_h261.*, rtpenc_h261.* Thomas Volkert
|
||||
rtpdec_hevc.*, rtpenc_hevc.* Thomas Volkert
|
||||
rtpdec_hevc.* Thomas Volkert
|
||||
rtpdec_asf.* Ronald S. Bultje
|
||||
rtpenc_mpv.*, rtpenc_aac.* Martin Storsjo
|
||||
rtsp.c Luca Barbato
|
||||
@@ -498,7 +496,6 @@ Protocols:
|
||||
libssh.c Lukasz Marek
|
||||
mms*.c Ronald S. Bultje
|
||||
udp.c Luca Abeni
|
||||
icecast.c Marvin Scholz
|
||||
|
||||
|
||||
libswresample
|
||||
|
3
Makefile
3
Makefile
@@ -32,7 +32,6 @@ OBJS-ffmpeg += ffmpeg_opt.o ffmpeg_filter.o
|
||||
OBJS-ffmpeg-$(HAVE_VDPAU_X11) += ffmpeg_vdpau.o
|
||||
OBJS-ffmpeg-$(HAVE_DXVA2_LIB) += ffmpeg_dxva2.o
|
||||
OBJS-ffmpeg-$(CONFIG_VDA) += ffmpeg_vda.o
|
||||
OBJS-ffserver += ffserver_config.o
|
||||
|
||||
TESTTOOLS = audiogen videogen rotozoom tiny_psnr tiny_ssim base64
|
||||
HOSTPROGS := $(TESTTOOLS:%=tests/%) doc/print_options
|
||||
@@ -112,7 +111,7 @@ endef
|
||||
|
||||
$(foreach P,$(PROGS),$(eval $(call DOPROG,$(P:$(PROGSSUF)$(EXESUF)=))))
|
||||
|
||||
ffprobe.o cmdutils.o : libavutil/ffversion.h
|
||||
ffprobe.o cmdutils.o 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
|
||||
|
||||
$(PROGS): %$(PROGSSUF)$(EXESUF): %$(PROGSSUF)_g$(EXESUF)
|
||||
$(CP) $< $@
|
||||
|
@@ -32,7 +32,7 @@ and in the [wiki](http://trac.ffmpeg.org).
|
||||
|
||||
### Examples
|
||||
|
||||
Coding examples are available in the **doc/examples** directory.
|
||||
Conding examples are available in the **doc/example** directory.
|
||||
|
||||
## License
|
||||
|
||||
|
100
RELEASE_NOTES
100
RELEASE_NOTES
@@ -1,11 +1,17 @@
|
||||
┌────────────────────────────────────────┐
|
||||
│ RELEASE NOTES for FFmpeg 2.5 "Bohr" │
|
||||
│ RELEASE NOTES for FFmpeg 2.4 "Fresnel" │
|
||||
└────────────────────────────────────────┘
|
||||
|
||||
The FFmpeg Project proudly presents FFmpeg 2.5 "Bohr", just 2.5 months
|
||||
after the release of 2.4. Since this wasn't a long time ago, the Changelog
|
||||
The FFmpeg Project proudly presents FFmpeg 2.4 "Fresnel", just 2 months
|
||||
after the release of 2.3. Since this wasn't a long time ago, the Changelog
|
||||
is a bit short this time.
|
||||
|
||||
The most important thing in this release is the major version bump of the
|
||||
libraries. This means that this release is neither ABI-compatible nor
|
||||
fully API-compatible. But on the other hand it is aligned with the Libav
|
||||
11 release series, and will as a result probably end up being maintained for
|
||||
a long time.
|
||||
|
||||
As usual, if you have any question on this release or any FFmpeg related
|
||||
topic, feel free to join us on the #ffmpeg IRC channel (on
|
||||
irc.freenode.net).
|
||||
@@ -14,21 +20,24 @@
|
||||
│ 🔨 API Information │
|
||||
└────────────────────────────┘
|
||||
|
||||
FFmpeg 2.5 includes the following library versions:
|
||||
FFmpeg 2.4 includes the following library versions:
|
||||
|
||||
• libavutil 54.15.100
|
||||
• libavcodec 56.13.100
|
||||
• libavformat 56.15.102
|
||||
• libavdevice 56. 3.100
|
||||
• libavfilter 5. 2.103
|
||||
• libswscale 3. 1.101
|
||||
• libswresample 1. 1.100
|
||||
• libpostproc 53. 3.100
|
||||
• libavutil 54.7.100
|
||||
• libavcodec 56.1.100
|
||||
• libavformat 56.4.101
|
||||
• libavdevice 56.0.100
|
||||
• libavfilter 5.1.100
|
||||
• libswscale 3.0.100
|
||||
• libswresample 1.1.100
|
||||
• libpostproc 53.0.100
|
||||
|
||||
Important API changes since 2.4:
|
||||
|
||||
• avpriv_dv_frame_profile2() has been deprecated
|
||||
Important API changes since 2.3:
|
||||
|
||||
• The new field mime_type was added to AVProbeData, which can
|
||||
cause crashes, if it is not initialized.
|
||||
• Some deprecated functions were removed.
|
||||
• The avfilter_graph_parse function was made compatible with Libav.
|
||||
• The Matroska demuxer now outputs verbatim ASS packets.
|
||||
|
||||
Please refer to the doc/APIchanges file for more information.
|
||||
|
||||
@@ -36,64 +45,39 @@
|
||||
│ ★ List of New Features │
|
||||
└────────────────────────────┘
|
||||
|
||||
┌────────────────────────────┐
|
||||
│ ffprobe │
|
||||
└────────────────────────────┘
|
||||
|
||||
• -show_pixel_formats option
|
||||
|
||||
┌────────────────────────────┐
|
||||
│ ffserver │
|
||||
└────────────────────────────┘
|
||||
|
||||
• codec private options support
|
||||
|
||||
┌────────────────────────────┐
|
||||
│ libavcodec │
|
||||
└────────────────────────────┘
|
||||
|
||||
• STL subtitle decoder
|
||||
• libutvideo YUV 4:2:2 10bit support
|
||||
• animated WebP decoding support
|
||||
• zygoaudio decoding support
|
||||
|
||||
┌────────────────────────────┐
|
||||
│ libavdevice │
|
||||
└────────────────────────────┘
|
||||
|
||||
• XCB-based screen-grabber
|
||||
• AVFoundation screen capturing support
|
||||
|
||||
┌────────────────────────────┐
|
||||
│ libavformat │
|
||||
└────────────────────────────┘
|
||||
|
||||
• HEVC/H.265 RTP payload format (draft v6) packetizer
|
||||
• SUP/PGS subtitle demuxer
|
||||
• STL subtitle demuxer
|
||||
• UDP-Lite support (RFC 3828)
|
||||
• creating DASH compatible fragmented MP4, MPEG-DASH segmenting muxer
|
||||
• WebP muxer
|
||||
• APNG demuxer
|
||||
• Icecast protocol.
|
||||
• API for live metadata updates through event flags.
|
||||
• UTF-16 support in text subtitles formats.
|
||||
• The ASS muxer now reorders the Dialogue events properly.
|
||||
• support for H.261 RTP payload format (RFC 4587)
|
||||
• HEVC/H.265 RTP payload format (draft v6) depacketizer
|
||||
|
||||
┌────────────────────────────┐
|
||||
│ libavfilter │
|
||||
└────────────────────────────┘
|
||||
|
||||
• xBR scaling filter
|
||||
• Ported lenscorrection filter from frei0r filter.
|
||||
• Large optimizations in dctdnoiz to make it usable.
|
||||
• Added codecview filter to visualize information exported by some codecs.
|
||||
• Added silenceremove filter.
|
||||
|
||||
┌────────────────────────────┐
|
||||
│ libavutil │
|
||||
└────────────────────────────┘
|
||||
|
||||
• CAST128 symmetric block cipher, ECB mode
|
||||
|
||||
┌────────────────────────────┐
|
||||
│ libpostproc │
|
||||
└────────────────────────────┘
|
||||
|
||||
• visualization support
|
||||
• Added clip() function in eval.
|
||||
|
||||
┌────────────────────────────┐
|
||||
│ ⚠ Behaviour changes │
|
||||
└────────────────────────────┘
|
||||
|
||||
• dctdnoiz filter now uses a block size of 8x8 instead of 16x16 by default
|
||||
• -vismv option is deprecated in favor of the codecview filter
|
||||
• libmodplug is now detected through pkg-config
|
||||
• HTML documentation generation through texi2html is deprecated in
|
||||
favor of makeinfo/texi2any
|
||||
• ICY metadata are now requested by default with the HTTP protocol
|
||||
|
204
cmdutils.c
204
cmdutils.c
@@ -444,7 +444,7 @@ int locate_option(int argc, char **argv, const OptionDef *options,
|
||||
(po->name && !strcmp(optname, po->name)))
|
||||
return i;
|
||||
|
||||
if (!po->name || po->flags & HAS_ARG)
|
||||
if (po->flags & HAS_ARG)
|
||||
i++;
|
||||
}
|
||||
return 0;
|
||||
@@ -959,10 +959,9 @@ static int init_report(const char *env)
|
||||
|
||||
report_file = fopen(filename.str, "w");
|
||||
if (!report_file) {
|
||||
int ret = AVERROR(errno);
|
||||
av_log(NULL, AV_LOG_ERROR, "Failed to open report \"%s\": %s\n",
|
||||
filename.str, strerror(errno));
|
||||
return ret;
|
||||
return AVERROR(errno);
|
||||
}
|
||||
av_log_set_callback(log_callback_report);
|
||||
av_log(NULL, AV_LOG_INFO,
|
||||
@@ -1544,8 +1543,7 @@ int show_protocols(void *optctx, const char *opt, const char *arg)
|
||||
|
||||
int show_filters(void *optctx, const char *opt, const char *arg)
|
||||
{
|
||||
#if CONFIG_AVFILTER
|
||||
const AVFilter *filter = NULL;
|
||||
const AVFilter av_unused(*filter) = NULL;
|
||||
char descr[64], *descr_cur;
|
||||
int i, j;
|
||||
const AVFilterPad *pad;
|
||||
@@ -1558,6 +1556,7 @@ int show_filters(void *optctx, const char *opt, const char *arg)
|
||||
" V = Video input/output\n"
|
||||
" N = Dynamic number and/or type of input/output\n"
|
||||
" | = Source or sink filter\n");
|
||||
#if CONFIG_AVFILTER
|
||||
while ((filter = avfilter_next(filter))) {
|
||||
descr_cur = descr;
|
||||
for (i = 0; i < 2; i++) {
|
||||
@@ -1582,8 +1581,6 @@ int show_filters(void *optctx, const char *opt, const char *arg)
|
||||
filter->process_command ? 'C' : '.',
|
||||
filter->name, descr, filter->description);
|
||||
}
|
||||
#else
|
||||
printf("No filters available: libavfilter disabled\n");
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
@@ -1860,23 +1857,21 @@ int read_yesno(void)
|
||||
|
||||
int cmdutils_read_file(const char *filename, char **bufptr, size_t *size)
|
||||
{
|
||||
int ret;
|
||||
int64_t ret;
|
||||
FILE *f = av_fopen_utf8(filename, "rb");
|
||||
|
||||
if (!f) {
|
||||
ret = AVERROR(errno);
|
||||
av_log(NULL, AV_LOG_ERROR, "Cannot read file '%s': %s\n", filename,
|
||||
strerror(errno));
|
||||
return ret;
|
||||
return AVERROR(errno);
|
||||
}
|
||||
fseek(f, 0, SEEK_END);
|
||||
*size = ftell(f);
|
||||
fseek(f, 0, SEEK_SET);
|
||||
if (*size == (size_t)-1) {
|
||||
ret = AVERROR(errno);
|
||||
av_log(NULL, AV_LOG_ERROR, "IO error: %s\n", strerror(errno));
|
||||
fclose(f);
|
||||
return ret;
|
||||
return AVERROR(errno);
|
||||
}
|
||||
*bufptr = av_malloc(*size + 1);
|
||||
if (!*bufptr) {
|
||||
@@ -1888,9 +1883,9 @@ int cmdutils_read_file(const char *filename, char **bufptr, size_t *size)
|
||||
if (ret < *size) {
|
||||
av_free(*bufptr);
|
||||
if (ferror(f)) {
|
||||
ret = AVERROR(errno);
|
||||
av_log(NULL, AV_LOG_ERROR, "Error while reading file '%s': %s\n",
|
||||
filename, strerror(errno));
|
||||
ret = AVERROR(errno);
|
||||
} else
|
||||
ret = AVERROR_EOF;
|
||||
} else {
|
||||
@@ -1997,7 +1992,7 @@ AVDictionary *filter_codec_opts(AVDictionary *opts, enum AVCodecID codec_id,
|
||||
switch (check_stream_specifier(s, st, p + 1)) {
|
||||
case 1: *p = 0; break;
|
||||
case 0: continue;
|
||||
default: exit_program(1);
|
||||
default: return NULL;
|
||||
}
|
||||
|
||||
if (av_opt_find(&cc, t->key, NULL, flags, AV_OPT_SEARCH_FAKE_OBJ) ||
|
||||
@@ -2055,184 +2050,3 @@ void *grow_array(void *array, int elem_size, int *size, int new_size)
|
||||
}
|
||||
return array;
|
||||
}
|
||||
|
||||
#if CONFIG_AVDEVICE
|
||||
static int print_device_sources(AVInputFormat *fmt, AVDictionary *opts)
|
||||
{
|
||||
int ret, i;
|
||||
AVFormatContext *dev = NULL;
|
||||
AVDeviceInfoList *device_list = NULL;
|
||||
AVDictionary *tmp_opts = NULL;
|
||||
|
||||
if (!fmt || !fmt->priv_class || !AV_IS_INPUT_DEVICE(fmt->priv_class->category))
|
||||
return AVERROR(EINVAL);
|
||||
|
||||
printf("Audo-detected sources for %s:\n", fmt->name);
|
||||
if (!fmt->get_device_list) {
|
||||
ret = AVERROR(ENOSYS);
|
||||
printf("Cannot list sources. Not implemented.\n");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/* TODO: avformat_open_input calls read_header callback which is not necessary.
|
||||
Function like avformat_alloc_output_context2 for input could be helpful here. */
|
||||
av_dict_copy(&tmp_opts, opts, 0);
|
||||
if ((ret = avformat_open_input(&dev, NULL, fmt, &tmp_opts)) < 0) {
|
||||
printf("Cannot open device: %s.\n", fmt->name);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if ((ret = avdevice_list_devices(dev, &device_list)) < 0) {
|
||||
printf("Cannot list sources.\n");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
for (i = 0; i < device_list->nb_devices; i++) {
|
||||
printf("%s %s [%s]\n", device_list->default_device == i ? "*" : " ",
|
||||
device_list->devices[i]->device_name, device_list->devices[i]->device_description);
|
||||
}
|
||||
|
||||
fail:
|
||||
av_dict_free(&tmp_opts);
|
||||
avdevice_free_list_devices(&device_list);
|
||||
avformat_close_input(&dev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int print_device_sinks(AVOutputFormat *fmt, AVDictionary *opts)
|
||||
{
|
||||
int ret, i;
|
||||
AVFormatContext *dev = NULL;
|
||||
AVDeviceInfoList *device_list = NULL;
|
||||
AVDictionary *tmp_opts = NULL;
|
||||
|
||||
if (!fmt || !fmt->priv_class || !AV_IS_OUTPUT_DEVICE(fmt->priv_class->category))
|
||||
return AVERROR(EINVAL);
|
||||
|
||||
printf("Audo-detected sinks for %s:\n", fmt->name);
|
||||
if (!fmt->get_device_list) {
|
||||
ret = AVERROR(ENOSYS);
|
||||
printf("Cannot list sinks. Not implemented.\n");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if ((ret = avformat_alloc_output_context2(&dev, fmt, NULL, NULL)) < 0) {
|
||||
printf("Cannot open device: %s.\n", fmt->name);
|
||||
goto fail;
|
||||
}
|
||||
av_dict_copy(&tmp_opts, opts, 0);
|
||||
av_opt_set_dict2(dev, &tmp_opts, AV_OPT_SEARCH_CHILDREN);
|
||||
|
||||
if ((ret = avdevice_list_devices(dev, &device_list)) < 0) {
|
||||
printf("Cannot list sinks.\n");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
for (i = 0; i < device_list->nb_devices; i++) {
|
||||
printf("%s %s [%s]\n", device_list->default_device == i ? "*" : " ",
|
||||
device_list->devices[i]->device_name, device_list->devices[i]->device_description);
|
||||
}
|
||||
|
||||
fail:
|
||||
av_dict_free(&tmp_opts);
|
||||
avdevice_free_list_devices(&device_list);
|
||||
avformat_free_context(dev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int show_sinks_sources_parse_arg(const char *arg, char **dev, AVDictionary **opts)
|
||||
{
|
||||
int ret;
|
||||
if (arg) {
|
||||
char *opts_str = NULL;
|
||||
av_assert0(dev && opts);
|
||||
*dev = av_strdup(arg);
|
||||
if (!*dev)
|
||||
return AVERROR(ENOMEM);
|
||||
if ((opts_str = strchr(*dev, ','))) {
|
||||
*(opts_str++) = '\0';
|
||||
if (opts_str[0] && ((ret = av_dict_parse_string(opts, opts_str, "=", ":", 0)) < 0)) {
|
||||
av_freep(dev);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
} else
|
||||
printf("\nDevice name is not provided.\n"
|
||||
"You can pass devicename[,opt1=val1[,opt2=val2...]] as an argument.\n\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
int show_sources(void *optctx, const char *opt, const char *arg)
|
||||
{
|
||||
AVInputFormat *fmt = NULL;
|
||||
char *dev = NULL;
|
||||
AVDictionary *opts = NULL;
|
||||
int ret = 0;
|
||||
int error_level = av_log_get_level();
|
||||
|
||||
av_log_set_level(AV_LOG_ERROR);
|
||||
|
||||
if ((ret = show_sinks_sources_parse_arg(arg, &dev, &opts)) < 0)
|
||||
goto fail;
|
||||
|
||||
do {
|
||||
fmt = av_input_audio_device_next(fmt);
|
||||
if (fmt) {
|
||||
if (!strcmp(fmt->name, "lavfi"))
|
||||
continue; //it's pointless to probe lavfi
|
||||
if (dev && strcmp(fmt->name, dev))
|
||||
continue;
|
||||
print_device_sources(fmt, opts);
|
||||
}
|
||||
} while (fmt);
|
||||
do {
|
||||
fmt = av_input_video_device_next(fmt);
|
||||
if (fmt) {
|
||||
if (dev && strcmp(fmt->name, dev))
|
||||
continue;
|
||||
print_device_sources(fmt, opts);
|
||||
}
|
||||
} while (fmt);
|
||||
fail:
|
||||
av_dict_free(&opts);
|
||||
av_free(dev);
|
||||
av_log_set_level(error_level);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int show_sinks(void *optctx, const char *opt, const char *arg)
|
||||
{
|
||||
AVOutputFormat *fmt = NULL;
|
||||
char *dev = NULL;
|
||||
AVDictionary *opts = NULL;
|
||||
int ret = 0;
|
||||
int error_level = av_log_get_level();
|
||||
|
||||
av_log_set_level(AV_LOG_ERROR);
|
||||
|
||||
if ((ret = show_sinks_sources_parse_arg(arg, &dev, &opts)) < 0)
|
||||
goto fail;
|
||||
|
||||
do {
|
||||
fmt = av_output_audio_device_next(fmt);
|
||||
if (fmt) {
|
||||
if (dev && strcmp(fmt->name, dev))
|
||||
continue;
|
||||
print_device_sinks(fmt, opts);
|
||||
}
|
||||
} while (fmt);
|
||||
do {
|
||||
fmt = av_output_video_device_next(fmt);
|
||||
if (fmt) {
|
||||
if (dev && strcmp(fmt->name, dev))
|
||||
continue;
|
||||
print_device_sinks(fmt, opts);
|
||||
}
|
||||
} while (fmt);
|
||||
fail:
|
||||
av_dict_free(&opts);
|
||||
av_free(dev);
|
||||
av_log_set_level(error_level);
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
14
cmdutils.h
14
cmdutils.h
@@ -443,20 +443,6 @@ int show_formats(void *optctx, const char *opt, const char *arg);
|
||||
*/
|
||||
int show_devices(void *optctx, const char *opt, const char *arg);
|
||||
|
||||
#if CONFIG_AVDEVICE
|
||||
/**
|
||||
* Print a listing containing audodetected sinks of the output device.
|
||||
* Device name with options may be passed as an argument to limit results.
|
||||
*/
|
||||
int show_sinks(void *optctx, const char *opt, const char *arg);
|
||||
|
||||
/**
|
||||
* Print a listing containing audodetected sources of the input device.
|
||||
* Device name with options may be passed as an argument to limit results.
|
||||
*/
|
||||
int show_sources(void *optctx, const char *opt, const char *arg);
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Print a listing containing all the codecs supported by the
|
||||
* program.
|
||||
|
@@ -27,9 +27,3 @@
|
||||
{ "opencl_bench", OPT_EXIT, {.func_arg = opt_opencl_bench}, "run benchmark on all OpenCL devices and show results" },
|
||||
{ "opencl_options", HAS_ARG, {.func_arg = opt_opencl}, "set OpenCL environment options" },
|
||||
#endif
|
||||
#if CONFIG_AVDEVICE
|
||||
{ "sources" , OPT_EXIT | HAS_ARG, { .func_arg = show_sources },
|
||||
"list sources of the input device", "device" },
|
||||
{ "sinks" , OPT_EXIT | HAS_ARG, { .func_arg = show_sinks },
|
||||
"list sinks of the output device", "device" },
|
||||
#endif
|
||||
|
@@ -55,17 +55,35 @@ typedef struct pthread_t {
|
||||
* not mutexes */
|
||||
typedef CRITICAL_SECTION pthread_mutex_t;
|
||||
|
||||
/* This is the CONDITION_VARIABLE typedef for using Windows' native
|
||||
* conditional variables on kernels 6.0+. */
|
||||
#if HAVE_CONDITION_VARIABLE_PTR
|
||||
typedef CONDITION_VARIABLE pthread_cond_t;
|
||||
#else
|
||||
/* This is the CONDITIONAL_VARIABLE typedef for using Window's native
|
||||
* conditional variables on kernels 6.0+.
|
||||
* MinGW does not currently have this typedef. */
|
||||
typedef struct pthread_cond_t {
|
||||
void *Ptr;
|
||||
void *ptr;
|
||||
} pthread_cond_t;
|
||||
#endif
|
||||
|
||||
#if _WIN32_WINNT >= 0x0600
|
||||
/* function pointers to conditional variable API on windows 6.0+ kernels */
|
||||
#if _WIN32_WINNT < 0x0600
|
||||
static void (WINAPI *cond_broadcast)(pthread_cond_t *cond);
|
||||
static void (WINAPI *cond_init)(pthread_cond_t *cond);
|
||||
static void (WINAPI *cond_signal)(pthread_cond_t *cond);
|
||||
static BOOL (WINAPI *cond_wait)(pthread_cond_t *cond, pthread_mutex_t *mutex,
|
||||
DWORD milliseconds);
|
||||
#else
|
||||
#define cond_init InitializeConditionVariable
|
||||
#define cond_broadcast WakeAllConditionVariable
|
||||
#define cond_signal WakeConditionVariable
|
||||
#define cond_wait SleepConditionVariableCS
|
||||
|
||||
#define CreateEvent(a, reset, init, name) \
|
||||
CreateEventEx(a, name, \
|
||||
(reset ? CREATE_EVENT_MANUAL_RESET : 0) | \
|
||||
(init ? CREATE_EVENT_INITIAL_SET : 0), \
|
||||
EVENT_ALL_ACCESS)
|
||||
// CreateSemaphoreExA seems to be desktop-only, but as long as we don't
|
||||
// use named semaphores, it doesn't matter if we use the W version.
|
||||
#define CreateSemaphore(a, b, c, d) \
|
||||
CreateSemaphoreExW(a, b, c, d, 0, SEMAPHORE_ALL_ACCESS)
|
||||
#define InitializeCriticalSection(x) InitializeCriticalSectionEx(x, 0, 0)
|
||||
#define WaitForSingleObject(a, b) WaitForSingleObjectEx(a, b, FALSE)
|
||||
#endif
|
||||
@@ -118,36 +136,6 @@ static inline int pthread_mutex_unlock(pthread_mutex_t *m)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if _WIN32_WINNT >= 0x0600
|
||||
static inline int pthread_cond_init(pthread_cond_t *cond, const void *unused_attr)
|
||||
{
|
||||
InitializeConditionVariable(cond);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* native condition variables do not destroy */
|
||||
static inline void pthread_cond_destroy(pthread_cond_t *cond)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
static inline void pthread_cond_broadcast(pthread_cond_t *cond)
|
||||
{
|
||||
WakeAllConditionVariable(cond);
|
||||
}
|
||||
|
||||
static inline int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
|
||||
{
|
||||
SleepConditionVariableCS(cond, mutex, INFINITE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void pthread_cond_signal(pthread_cond_t *cond)
|
||||
{
|
||||
WakeConditionVariable(cond);
|
||||
}
|
||||
|
||||
#else // _WIN32_WINNT < 0x0600
|
||||
/* for pre-Windows 6.0 platforms we need to define and use our own condition
|
||||
* variable and api */
|
||||
typedef struct win32_cond_t {
|
||||
@@ -159,13 +147,6 @@ typedef struct win32_cond_t {
|
||||
volatile int is_broadcast;
|
||||
} win32_cond_t;
|
||||
|
||||
/* function pointers to conditional variable API on windows 6.0+ kernels */
|
||||
static void (WINAPI *cond_broadcast)(pthread_cond_t *cond);
|
||||
static void (WINAPI *cond_init)(pthread_cond_t *cond);
|
||||
static void (WINAPI *cond_signal)(pthread_cond_t *cond);
|
||||
static BOOL (WINAPI *cond_wait)(pthread_cond_t *cond, pthread_mutex_t *mutex,
|
||||
DWORD milliseconds);
|
||||
|
||||
static av_unused int pthread_cond_init(pthread_cond_t *cond, const void *unused_attr)
|
||||
{
|
||||
win32_cond_t *win32_cond = NULL;
|
||||
@@ -178,7 +159,7 @@ static av_unused int pthread_cond_init(pthread_cond_t *cond, const void *unused_
|
||||
win32_cond = av_mallocz(sizeof(win32_cond_t));
|
||||
if (!win32_cond)
|
||||
return ENOMEM;
|
||||
cond->Ptr = win32_cond;
|
||||
cond->ptr = win32_cond;
|
||||
win32_cond->semaphore = CreateSemaphore(NULL, 0, 0x7fffffff, NULL);
|
||||
if (!win32_cond->semaphore)
|
||||
return ENOMEM;
|
||||
@@ -193,7 +174,7 @@ static av_unused int pthread_cond_init(pthread_cond_t *cond, const void *unused_
|
||||
|
||||
static av_unused void pthread_cond_destroy(pthread_cond_t *cond)
|
||||
{
|
||||
win32_cond_t *win32_cond = cond->Ptr;
|
||||
win32_cond_t *win32_cond = cond->ptr;
|
||||
/* native condition variables do not destroy */
|
||||
if (cond_init)
|
||||
return;
|
||||
@@ -204,12 +185,12 @@ static av_unused void pthread_cond_destroy(pthread_cond_t *cond)
|
||||
pthread_mutex_destroy(&win32_cond->mtx_waiter_count);
|
||||
pthread_mutex_destroy(&win32_cond->mtx_broadcast);
|
||||
av_freep(&win32_cond);
|
||||
cond->Ptr = NULL;
|
||||
cond->ptr = NULL;
|
||||
}
|
||||
|
||||
static av_unused void pthread_cond_broadcast(pthread_cond_t *cond)
|
||||
{
|
||||
win32_cond_t *win32_cond = cond->Ptr;
|
||||
win32_cond_t *win32_cond = cond->ptr;
|
||||
int have_waiter;
|
||||
|
||||
if (cond_broadcast) {
|
||||
@@ -240,7 +221,7 @@ static av_unused void pthread_cond_broadcast(pthread_cond_t *cond)
|
||||
|
||||
static av_unused int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
|
||||
{
|
||||
win32_cond_t *win32_cond = cond->Ptr;
|
||||
win32_cond_t *win32_cond = cond->ptr;
|
||||
int last_waiter;
|
||||
if (cond_wait) {
|
||||
cond_wait(cond, mutex, INFINITE);
|
||||
@@ -272,7 +253,7 @@ static av_unused int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mu
|
||||
|
||||
static av_unused void pthread_cond_signal(pthread_cond_t *cond)
|
||||
{
|
||||
win32_cond_t *win32_cond = cond->Ptr;
|
||||
win32_cond_t *win32_cond = cond->ptr;
|
||||
int have_waiter;
|
||||
if (cond_signal) {
|
||||
cond_signal(cond);
|
||||
@@ -294,7 +275,6 @@ static av_unused void pthread_cond_signal(pthread_cond_t *cond)
|
||||
|
||||
pthread_mutex_unlock(&win32_cond->mtx_broadcast);
|
||||
}
|
||||
#endif
|
||||
|
||||
static av_unused void w32thread_init(void)
|
||||
{
|
||||
|
219
configure
vendored
219
configure
vendored
@@ -251,22 +251,17 @@ External library support:
|
||||
--enable-libx264 enable H.264 encoding via x264 [no]
|
||||
--enable-libx265 enable HEVC encoding via x265 [no]
|
||||
--enable-libxavs enable AVS encoding via xavs [no]
|
||||
--enable-libxcb enable X11 grabbing using XCB [auto]
|
||||
--enable-libxcb-shm enable X11 grabbing shm communication [auto]
|
||||
--enable-libxcb-xfixes enable X11 grabbing mouse rendering [auto]
|
||||
--enable-libxcb-shape enable X11 grabbing shape rendering [auto]
|
||||
--enable-libxvid enable Xvid encoding via xvidcore,
|
||||
native MPEG-4/Xvid encoder exists [no]
|
||||
--enable-libzmq enable message passing via libzmq [no]
|
||||
--enable-libzvbi enable teletext support via libzvbi [no]
|
||||
--disable-lzma disable lzma [autodetect]
|
||||
--enable-decklink enable Blackmagick DeckLink I/O support [no]
|
||||
--enable-decklink enable Blackmagick DeckLink output [no]
|
||||
--enable-openal enable OpenAL 1.1 capture support [no]
|
||||
--enable-opencl enable OpenCL code
|
||||
--enable-opengl enable OpenGL rendering [no]
|
||||
--enable-openssl enable openssl [no]
|
||||
--disable-sdl disable sdl [autodetect]
|
||||
--enable-x11grab enable X11 grabbing (legacy) [no]
|
||||
--enable-x11grab enable X11 grabbing [no]
|
||||
--disable-xlib disable xlib [autodetect]
|
||||
--disable-zlib disable zlib [autodetect]
|
||||
|
||||
@@ -1203,17 +1198,13 @@ require_cpp(){
|
||||
check_lib_cpp "$headers" "$classes" "$@" || die "ERROR: $name not found"
|
||||
}
|
||||
|
||||
use_pkg_config(){
|
||||
require_pkg_config(){
|
||||
pkg="$1"
|
||||
check_pkg_config "$@" || return 1
|
||||
check_pkg_config "$@" || die "ERROR: $pkg not found"
|
||||
add_cflags $(get_safe ${pkg}_cflags)
|
||||
add_extralibs $(get_safe ${pkg}_libs)
|
||||
}
|
||||
|
||||
require_pkg_config(){
|
||||
use_pkg_config "$@" || die "ERROR: $pkg not found using pkg-config$pkg_config_fail_message"
|
||||
}
|
||||
|
||||
require_libfreetype(){
|
||||
log require_libfreetype "$@"
|
||||
pkg="freetype2"
|
||||
@@ -1389,10 +1380,6 @@ EXTERNAL_LIBRARY_LIST="
|
||||
libx264
|
||||
libx265
|
||||
libxavs
|
||||
libxcb
|
||||
libxcb_shm
|
||||
libxcb_shape
|
||||
libxcb_xfixes
|
||||
libxvid
|
||||
libzmq
|
||||
libzvbi
|
||||
@@ -1401,7 +1388,6 @@ EXTERNAL_LIBRARY_LIST="
|
||||
opencl
|
||||
opengl
|
||||
openssl
|
||||
sdl
|
||||
x11grab
|
||||
xlib
|
||||
zlib
|
||||
@@ -1608,7 +1594,6 @@ ARCH_FEATURES="
|
||||
|
||||
BUILTIN_LIST="
|
||||
atomic_cas_ptr
|
||||
atomic_compare_exchange
|
||||
machine_rw_barrier
|
||||
MemoryBarrier
|
||||
mm_empty
|
||||
@@ -1665,7 +1650,6 @@ HEADERS_LIST="
|
||||
sys_un_h
|
||||
sys_videoio_h
|
||||
termios_h
|
||||
udplite_h
|
||||
unistd_h
|
||||
windows_h
|
||||
winsock2_h
|
||||
@@ -1727,7 +1711,6 @@ SYSTEM_FUNCS="
|
||||
gettimeofday
|
||||
glob
|
||||
glXGetProcAddress
|
||||
gmtime_r
|
||||
inet_aton
|
||||
isatty
|
||||
jack_port_get_latency_range
|
||||
@@ -1736,7 +1719,6 @@ SYSTEM_FUNCS="
|
||||
lzo1x_999_compress
|
||||
mach_absolute_time
|
||||
MapViewOfFile
|
||||
MoveFileExA
|
||||
memalign
|
||||
mkstemp
|
||||
mmap
|
||||
@@ -1782,7 +1764,6 @@ TOOLCHAIN_FEATURES="
|
||||
"
|
||||
|
||||
TYPES_LIST="
|
||||
CONDITION_VARIABLE_Ptr
|
||||
socklen_t
|
||||
struct_addrinfo
|
||||
struct_group_source_req
|
||||
@@ -2036,7 +2017,7 @@ simd_align_16_if_any="altivec neon sse"
|
||||
symver_if_any="symver_asm_label symver_gnu_asm"
|
||||
|
||||
# threading support
|
||||
atomics_gcc_if_any="sync_val_compare_and_swap atomic_compare_exchange"
|
||||
atomics_gcc_if="sync_val_compare_and_swap"
|
||||
atomics_suncc_if="atomic_cas_ptr machine_rw_barrier"
|
||||
atomics_win32_if="MemoryBarrier"
|
||||
atomics_native_if_any="$ATOMICS_LIST"
|
||||
@@ -2075,7 +2056,6 @@ amrwb_decoder_select="lsp"
|
||||
amv_decoder_select="sp5x_decoder exif"
|
||||
amv_encoder_select="aandcttables mpegvideoenc"
|
||||
ape_decoder_select="bswapdsp llauddsp"
|
||||
apng_decoder_select="zlib"
|
||||
asv1_decoder_select="blockdsp bswapdsp idctdsp"
|
||||
asv1_encoder_select="bswapdsp fdctdsp pixblockdsp"
|
||||
asv2_decoder_select="blockdsp bswapdsp idctdsp"
|
||||
@@ -2405,7 +2385,6 @@ avi_muxer_select="riffenc"
|
||||
avisynth_demuxer_deps="avisynth"
|
||||
avisynth_demuxer_select="riffdec"
|
||||
caf_demuxer_select="riffdec"
|
||||
dash_muxer_select="mp4_muxer"
|
||||
dirac_demuxer_select="dirac_parser"
|
||||
dts_demuxer_select="dca_parser"
|
||||
dtshd_demuxer_select="dca_parser"
|
||||
@@ -2430,7 +2409,7 @@ matroska_muxer_select="riffenc"
|
||||
mmf_muxer_select="riffenc"
|
||||
mov_demuxer_select="riffdec"
|
||||
mov_demuxer_suggest="zlib"
|
||||
mov_muxer_select="riffenc rtpenc_chain ac3_parser"
|
||||
mov_muxer_select="riffenc rtpenc_chain"
|
||||
mp3_demuxer_select="mpegaudio_parser"
|
||||
mp4_muxer_select="mov_muxer"
|
||||
mpegts_muxer_select="adts_muxer latm_muxer"
|
||||
@@ -2469,14 +2448,12 @@ xwma_demuxer_select="riffdec"
|
||||
# indevs / outdevs
|
||||
alsa_indev_deps="alsa_asoundlib_h snd_pcm_htimestamp"
|
||||
alsa_outdev_deps="alsa_asoundlib_h"
|
||||
avfoundation_indev_extralibs="-framework CoreVideo -framework Foundation -framework AVFoundation -framework CoreMedia -framework CoreGraphics"
|
||||
avfoundation_indev_extralibs="-framework CoreVideo -framework Foundation -framework AVFoundation -framework CoreMedia"
|
||||
avfoundation_indev_select="avfoundation"
|
||||
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"
|
||||
decklink_outdev_deps="decklink pthreads"
|
||||
decklink_outdev_extralibs="-lstdc++"
|
||||
decklink_indev_deps="decklink pthreads"
|
||||
decklink_indev_extralibs="-lstdc++"
|
||||
dshow_indev_deps="IBaseFilter"
|
||||
dshow_indev_extralibs="-lpsapi -lole32 -lstrmiids -luuid"
|
||||
dv1394_indev_deps="dv1394"
|
||||
@@ -2511,7 +2488,6 @@ vfwcap_indev_extralibs="-lavicap32"
|
||||
xv_outdev_deps="X11_extensions_Xvlib_h XvGetPortAttribute"
|
||||
xv_outdev_extralibs="-lXv -lX11 -lXext"
|
||||
x11grab_indev_deps="x11grab"
|
||||
x11grab_xcb_indev_deps="libxcb"
|
||||
|
||||
# protocols
|
||||
bluray_protocol_deps="libbluray"
|
||||
@@ -2551,11 +2527,11 @@ tcp_protocol_select="network"
|
||||
tls_protocol_deps_any="openssl gnutls"
|
||||
tls_protocol_select="tcp_protocol"
|
||||
udp_protocol_select="network"
|
||||
udplite_protocol_select="network"
|
||||
unix_protocol_deps="sys_un_h"
|
||||
unix_protocol_select="network"
|
||||
|
||||
# filters
|
||||
aconvert_filter_deps="swresample"
|
||||
amovie_filter_deps="avcodec avformat"
|
||||
aresample_filter_deps="swresample"
|
||||
ass_filter_deps="libass"
|
||||
@@ -2574,16 +2550,19 @@ drawtext_filter_deps="libfreetype"
|
||||
ebur128_filter_deps="gpl"
|
||||
flite_filter_deps="libflite"
|
||||
frei0r_filter_deps="frei0r dlopen"
|
||||
frei0r_filter_extralibs='$ldl'
|
||||
frei0r_src_filter_deps="frei0r dlopen"
|
||||
frei0r_src_filter_extralibs='$ldl'
|
||||
geq_filter_deps="gpl"
|
||||
histeq_filter_deps="gpl"
|
||||
hqdn3d_filter_deps="gpl"
|
||||
interlace_filter_deps="gpl"
|
||||
kerndeint_filter_deps="gpl"
|
||||
ladspa_filter_deps="ladspa dlopen"
|
||||
ladspa_filter_extralibs='$ldl'
|
||||
mcdeint_filter_deps="avcodec gpl"
|
||||
movie_filter_deps="avcodec avformat"
|
||||
mp_filter_deps="gpl avcodec swscale"
|
||||
mp_filter_deps="gpl avcodec swscale inline_asm"
|
||||
mpdecimate_filter_deps="gpl"
|
||||
mpdecimate_filter_select="pixelutils"
|
||||
mptestsrc_filter_deps="gpl"
|
||||
@@ -3056,9 +3035,8 @@ case "$toolchain" in
|
||||
add_ldflags -fprofile-arcs -ftest-coverage
|
||||
;;
|
||||
hardened)
|
||||
add_cppflags -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2
|
||||
add_cflags -fno-strict-overflow -fstack-protector-all
|
||||
add_ldflags -Wl,-z,relro -Wl,-z,now
|
||||
add_cflags -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fno-strict-overflow -fstack-protector-all
|
||||
add_ldflags -Wl,-z,relro -Wl,-z,now
|
||||
;;
|
||||
?*)
|
||||
die "Unknown toolchain $toolchain"
|
||||
@@ -3070,13 +3048,9 @@ set_default arch cc cxx doxygen pkg_config ranlib strip sysinclude \
|
||||
enabled cross_compile || host_cc_default=$cc
|
||||
set_default host_cc
|
||||
|
||||
pkg_config_fail_message=""
|
||||
if ! $pkg_config --version >/dev/null 2>&1; then
|
||||
warn "$pkg_config not found, library detection may fail."
|
||||
pkg_config=false
|
||||
elif is_in -static $cc $LDFLAGS && ! is_in --static $pkg_config $pkg_config_flags; then
|
||||
pkg_config_fail_message="
|
||||
Note: When building a static binary, add --pkg-config-flags=\"--static\"."
|
||||
fi
|
||||
|
||||
if test $doxygen != $doxygen_default && \
|
||||
@@ -3453,6 +3427,29 @@ probe_cc(){
|
||||
# 4509: "This form of conditional instruction is deprecated"
|
||||
_flags="-nologo -ignore 4509"
|
||||
_flags_filter=armasm_flags
|
||||
elif $_cc 2>&1 | grep -q Microsoft; then
|
||||
_type=msvc
|
||||
_ident=$($cc 2>&1 | head -n1)
|
||||
_DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< 2>&1 | awk '\''/including/ { sub(/^.*file: */, ""); gsub(/\\/, "/"); if (!match($$0, / /)) print "$@:", $$0 }'\'' > $(@:.o=.d)'
|
||||
_DEPFLAGS='$(CPPFLAGS) $(CFLAGS) -showIncludes -Zs'
|
||||
_cflags_speed="-O2"
|
||||
_cflags_size="-O1"
|
||||
if $_cc 2>&1 | grep -q Linker; then
|
||||
_ld_o='-out:$@'
|
||||
else
|
||||
_ld_o='-Fe$@'
|
||||
fi
|
||||
_cc_o='-Fo$@'
|
||||
_cc_e='-P -Fi$@'
|
||||
_flags_filter=msvc_flags
|
||||
_ld_lib='lib%.a'
|
||||
_ld_path='-libpath:'
|
||||
_flags='-nologo'
|
||||
_cflags='-D_USE_MATH_DEFINES -D_CRT_SECURE_NO_WARNINGS -Dinline=__inline -FIstdlib.h -Dstrtoll=_strtoi64'
|
||||
if [ $pfx = hostcc ]; then
|
||||
append _cflags -Dsnprintf=_snprintf
|
||||
fi
|
||||
disable stripping
|
||||
elif $_cc 2>&1 | grep -q Intel; then
|
||||
_type=icl
|
||||
_ident=$($cc 2>&1 | head -n1)
|
||||
@@ -3479,30 +3476,6 @@ probe_cc(){
|
||||
if [ $pfx = hostcc ]; then
|
||||
append _cflags -Dsnprintf=_snprintf
|
||||
fi
|
||||
disable stripping
|
||||
elif $_cc 2>&1 | grep -q Microsoft; then
|
||||
_type=msvc
|
||||
_ident=$($cc 2>&1 | head -n1)
|
||||
_DEPCMD='$(DEP$(1)) $(DEP$(1)FLAGS) $($(1)DEP_FLAGS) $< 2>&1 | awk '\''/including/ { sub(/^.*file: */, ""); gsub(/\\/, "/"); if (!match($$0, / /)) print "$@:", $$0 }'\'' > $(@:.o=.d)'
|
||||
_DEPFLAGS='$(CPPFLAGS) $(CFLAGS) -showIncludes -Zs'
|
||||
_cflags_speed="-O2"
|
||||
_cflags_size="-O1"
|
||||
if $_cc 2>&1 | grep -q Linker; then
|
||||
_ld_o='-out:$@'
|
||||
else
|
||||
_ld_o='-Fe$@'
|
||||
fi
|
||||
_cc_o='-Fo$@'
|
||||
_cc_e='-P -Fi$@'
|
||||
_flags_filter=msvc_flags
|
||||
_ld_lib='lib%.a'
|
||||
_ld_path='-libpath:'
|
||||
_flags='-nologo'
|
||||
_cflags='-D_USE_MATH_DEFINES -D_CRT_SECURE_NO_WARNINGS -Dinline=__inline -FIstdlib.h -Dstrtoll=_strtoi64'
|
||||
if [ $pfx = hostcc ]; then
|
||||
append _cflags -Dsnprintf=_snprintf
|
||||
fi
|
||||
disable stripping
|
||||
elif $_cc --version 2>/dev/null | grep -q ^cparser; then
|
||||
_type=cparser
|
||||
_ident=$($_cc --version | head -n1)
|
||||
@@ -4062,7 +4035,6 @@ case $target_os in
|
||||
enabled shared && ! enabled small && check_cmd $windres --version && enable gnu_windres
|
||||
check_ldflags -Wl,--nxcompat
|
||||
check_ldflags -Wl,--dynamicbase
|
||||
enabled x86_32 && check_ldflags -Wl,--large-address-aware
|
||||
shlibdir_default="$bindir_default"
|
||||
SLIBPREF=""
|
||||
SLIBSUF=".dll"
|
||||
@@ -4095,7 +4067,6 @@ case $target_os in
|
||||
# Cannot build both shared and static libs with MSVC or icl.
|
||||
disable static
|
||||
fi
|
||||
enabled x86_32 && check_ldflags -LARGEADDRESSAWARE
|
||||
shlibdir_default="$bindir_default"
|
||||
SLIBPREF=""
|
||||
SLIBSUF=".dll"
|
||||
@@ -4261,15 +4232,6 @@ probe_libc(){
|
||||
eval ${pfx}libc_type=solaris
|
||||
add_${pfx}cppflags -D__EXTENSIONS__ -D_XOPEN_SOURCE=600
|
||||
fi
|
||||
check_${pfx}cc <<EOF
|
||||
#include <time.h>
|
||||
void *v = localtime_r;
|
||||
EOF
|
||||
test "$?" != 0 && check_${pfx}cc -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 <<EOF && add_${pfx}cppflags -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600
|
||||
#include <time.h>
|
||||
void *v = localtime_r;
|
||||
EOF
|
||||
|
||||
}
|
||||
|
||||
probe_libc
|
||||
@@ -4414,7 +4376,7 @@ EOF
|
||||
od -t x1 $TMPO | grep -q '42 *49 *47 *45' && enable bigendian
|
||||
|
||||
if [ "$cpu" = "power7" ] || [ "$cpu" = "power8" ] ;then
|
||||
if ! enabled bigendian && enabled altivec ;then
|
||||
if ! enabled bigendian ;then
|
||||
enable vsx
|
||||
fi
|
||||
fi
|
||||
@@ -4656,10 +4618,6 @@ elif check_func dlopen -ldl; then
|
||||
ldl=-ldl
|
||||
fi
|
||||
|
||||
frei0r_filter_extralibs='$ldl'
|
||||
frei0r_src_filter_extralibs='$ldl'
|
||||
ladspa_filter_extralibs='$ldl'
|
||||
|
||||
if ! disabled network; then
|
||||
check_func getaddrinfo $network_extralibs
|
||||
check_func getservbyport $network_extralibs
|
||||
@@ -4701,7 +4659,6 @@ if ! disabled network; then
|
||||
fi
|
||||
|
||||
check_builtin atomic_cas_ptr atomic.h "void **ptr; void *oldval, *newval; atomic_cas_ptr(ptr, oldval, newval)"
|
||||
check_builtin atomic_compare_exchange "" "int *ptr, *oldval; int newval; __atomic_compare_exchange_n(ptr, oldval, newval, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)"
|
||||
check_builtin machine_rw_barrier mbarrier.h "__machine_rw_barrier()"
|
||||
check_builtin MemoryBarrier windows.h "MemoryBarrier()"
|
||||
check_builtin sarestart signal.h "SA_RESTART"
|
||||
@@ -4712,14 +4669,13 @@ check_func ${malloc_prefix}memalign && enable memalign
|
||||
check_func ${malloc_prefix}posix_memalign && enable posix_memalign
|
||||
|
||||
check_func access
|
||||
check_func_headers time.h clock_gettime || { check_func_headers time.h clock_gettime -lrt && add_extralibs -lrt && LIBRT="-lrt"; }
|
||||
check_func_headers time.h clock_gettime || { check_func_headers time.h clock_gettime -lrt && add_extralibs -lrt; }
|
||||
check_func fcntl
|
||||
check_func fork
|
||||
check_func gethrtime
|
||||
check_func getopt
|
||||
check_func getrusage
|
||||
check_func gettimeofday
|
||||
check_func gmtime_r
|
||||
check_func isatty
|
||||
check_func localtime_r
|
||||
check_func mach_absolute_time
|
||||
@@ -4727,7 +4683,7 @@ check_func mkstemp
|
||||
check_func mmap
|
||||
check_func mprotect
|
||||
# Solaris has nanosleep in -lrt, OpenSolaris no longer needs that
|
||||
check_func_headers time.h nanosleep || { check_func_headers time.h nanosleep -lrt && add_extralibs -lrt && LIBRT="-lrt"; }
|
||||
check_func_headers time.h nanosleep || { check_func_headers time.h nanosleep -lrt && add_extralibs -lrt; }
|
||||
check_func sched_getaffinity
|
||||
check_func setrlimit
|
||||
check_struct "sys/stat.h" "struct stat" st_mtim.tv_nsec -D_BSD_SOURCE
|
||||
@@ -4746,12 +4702,10 @@ check_func_headers windows.h GetProcessAffinityMask
|
||||
check_func_headers windows.h GetProcessTimes
|
||||
check_func_headers windows.h GetSystemTimeAsFileTime
|
||||
check_func_headers windows.h MapViewOfFile
|
||||
check_func_headers windows.h MoveFileExA
|
||||
check_func_headers windows.h PeekNamedPipe
|
||||
check_func_headers windows.h SetConsoleTextAttribute
|
||||
check_func_headers windows.h Sleep
|
||||
check_func_headers windows.h VirtualAlloc
|
||||
check_struct windows.h "CONDITION_VARIABLE" Ptr
|
||||
check_func_headers glob.h glob
|
||||
enabled xlib &&
|
||||
check_func_headers "X11/Xlib.h X11/extensions/Xvlib.h" XvGetPortAttribute -lXv -lX11 -lXext
|
||||
@@ -4765,7 +4719,6 @@ check_header io.h
|
||||
check_header libcrystalhd/libcrystalhd_if.h
|
||||
check_header mach/mach_time.h
|
||||
check_header malloc.h
|
||||
check_header net/udplite.h
|
||||
check_header poll.h
|
||||
check_header sys/mman.h
|
||||
check_header sys/param.h
|
||||
@@ -4873,8 +4826,7 @@ enabled libnut && require libnut libnut.h nut_demuxer_init -lnut
|
||||
enabled libopencore_amrnb && require libopencore_amrnb opencore-amrnb/interf_dec.h Decoder_Interface_init -lopencore-amrnb
|
||||
enabled libopencore_amrwb && require libopencore_amrwb opencore-amrwb/dec_if.h D_IF_init -lopencore-amrwb
|
||||
enabled libopencv && require_pkg_config opencv opencv/cxcore.h cvCreateImageHeader
|
||||
enabled libopenjpeg && { check_lib openjpeg.h opj_version -lopenmj2 -DOPJ_STATIC ||
|
||||
check_lib openjpeg-1.5/openjpeg.h opj_version -lopenjpeg -DOPJ_STATIC ||
|
||||
enabled libopenjpeg && { check_lib openjpeg-1.5/openjpeg.h opj_version -lopenjpeg -DOPJ_STATIC ||
|
||||
check_lib openjpeg.h opj_version -lopenjpeg -DOPJ_STATIC ||
|
||||
die "ERROR: libopenjpeg not found"; }
|
||||
enabled libopus && require_pkg_config opus opus_multistream.h opus_multistream_decoder_create
|
||||
@@ -4883,8 +4835,9 @@ enabled libquvi && require_pkg_config libquvi quvi/quvi.h quvi_init
|
||||
enabled librtmp && require_pkg_config librtmp librtmp/rtmp.h RTMP_Socket
|
||||
enabled libschroedinger && require_pkg_config schroedinger-1.0 schroedinger/schro.h schro_init
|
||||
enabled libshine && require_pkg_config shine shine/layer3.h shine_encode_buffer
|
||||
enabled libsmbclient && { check_pkg_config smbclient libsmbclient.h smbc_init ||
|
||||
require smbclient libsmbclient.h smbc_init -lsmbclient; }
|
||||
enabled libsmbclient && { { check_pkg_config smbclient libsmbclient.h smbc_init &&
|
||||
require_pkg_config smbclient libsmbclient.h smbc_init; } ||
|
||||
require smbclient libsmbclient.h smbc_init -lsmbclient; }
|
||||
enabled libsoxr && require libsoxr soxr.h soxr_create -lsoxr
|
||||
enabled libssh && require_pkg_config libssh libssh/sftp.h sftp_init
|
||||
enabled libspeex && require_pkg_config speex speex/speex.h speex_decoder_init -lspeex
|
||||
@@ -4909,10 +4862,10 @@ enabled libvpx && {
|
||||
enabled libvpx_vp9_decoder && { check_lib2 "vpx/vpx_decoder.h vpx/vp8dx.h" "vpx_codec_vp9_dx" -lvpx || disable libvpx_vp9_decoder; }
|
||||
enabled libvpx_vp9_encoder && { check_lib2 "vpx/vpx_encoder.h vpx/vp8cx.h" "vpx_codec_vp9_cx VP9E_SET_AQ_MODE" -lvpx || disable libvpx_vp9_encoder; } }
|
||||
enabled libwavpack && require libwavpack wavpack/wavpack.h WavpackOpenFileOutput -lwavpack
|
||||
enabled libwebp && require_pkg_config "libwebp >= 0.2.0" webp/encode.h WebPGetEncoderVersion
|
||||
enabled libx264 && { use_pkg_config x264 "stdint.h x264.h" x264_encoder_encode ||
|
||||
{ require libx264 x264.h x264_encoder_encode -lx264 &&
|
||||
warn "using libx264 without pkg-config"; } } &&
|
||||
enabled libwebp && require_pkg_config libwebp webp/encode.h WebPGetEncoderVersion &&
|
||||
{ check_code cc webp/encode.h "WebPPicture wp; wp.use_argb++" ||
|
||||
die "ERROR: libwebp too old."; }
|
||||
enabled libx264 && require libx264 x264.h x264_encoder_encode -lx264 &&
|
||||
{ check_cpp_condition x264.h "X264_BUILD >= 118" ||
|
||||
die "ERROR: libx264 must be installed and version must be >= 0.118."; }
|
||||
enabled libx265 && require_pkg_config x265 x265.h x265_encoder_encode &&
|
||||
@@ -4958,26 +4911,21 @@ if enabled libdc1394; then
|
||||
enable libdc1394_1; } ||
|
||||
die "ERROR: No version of libdc1394 found "
|
||||
fi
|
||||
if ! disabled sdl; then
|
||||
SDL_CONFIG="${cross_prefix}sdl-config"
|
||||
if check_pkg_config sdl SDL_events.h SDL_PollEvent; then
|
||||
check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) >= 0x010201" $sdl_cflags &&
|
||||
check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) < 0x010300" $sdl_cflags &&
|
||||
enable sdl
|
||||
else
|
||||
if "${SDL_CONFIG}" --version > /dev/null 2>&1; then
|
||||
sdl_cflags=$("${SDL_CONFIG}" --cflags)
|
||||
sdl_libs=$("${SDL_CONFIG}" --libs)
|
||||
check_func_headers SDL_version.h SDL_Linked_Version $sdl_cflags $sdl_libs &&
|
||||
check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) >= 0x010201" $sdl_cflags &&
|
||||
check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) < 0x010300" $sdl_cflags &&
|
||||
enable sdl
|
||||
elif enabled sdl ; then
|
||||
die "ERROR: SDL not found"
|
||||
else
|
||||
disable sdl
|
||||
fi
|
||||
fi
|
||||
|
||||
SDL_CONFIG="${cross_prefix}sdl-config"
|
||||
if check_pkg_config sdl SDL_events.h SDL_PollEvent; then
|
||||
check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) >= 0x010201" $sdl_cflags &&
|
||||
check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) < 0x010300" $sdl_cflags &&
|
||||
enable sdl
|
||||
else
|
||||
if "${SDL_CONFIG}" --version > /dev/null 2>&1; then
|
||||
sdl_cflags=$("${SDL_CONFIG}" --cflags)
|
||||
sdl_libs=$("${SDL_CONFIG}" --libs)
|
||||
check_func_headers SDL_version.h SDL_Linked_Version $sdl_cflags $sdl_libs &&
|
||||
check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) >= 0x010201" $sdl_cflags &&
|
||||
check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) < 0x010300" $sdl_cflags &&
|
||||
enable sdl
|
||||
fi
|
||||
fi
|
||||
enabled sdl && add_cflags $sdl_cflags && add_extralibs $sdl_libs
|
||||
|
||||
@@ -5042,37 +4990,10 @@ fi
|
||||
enabled xlib &&
|
||||
check_lib X11/Xlib.h XOpenDisplay -lX11 || disable xlib
|
||||
|
||||
if ! disabled libxcb; then
|
||||
check_pkg_config xcb xcb/xcb.h xcb_connect || {
|
||||
enabled libxcb && die "ERROR: libxcb not found";
|
||||
} && disable x11grab && enable libxcb
|
||||
|
||||
if enabled libxcb; then
|
||||
disabled libxcb_shm || {
|
||||
check_pkg_config xcb-shm xcb/shm.h xcb_shm_attach || {
|
||||
enabled libxcb_shm && die "ERROR: libxcb_shm not found";
|
||||
} && check_header sys/shm.h && enable libxcb_shm; }
|
||||
|
||||
disabled libxcb_xfixes || {
|
||||
check_pkg_config xcb-xfixes xcb/xfixes.h xcb_xfixes_get_cursor_image || {
|
||||
enabled libxcb_xfixes && die "ERROR: libxcb_xfixes not found";
|
||||
} && enable libxcb_xfixes; }
|
||||
|
||||
disabled libxcb_shape || {
|
||||
check_pkg_config xcb-shape xcb/shape.h xcb_shape_get_rectangles || {
|
||||
enabled libxcb_shape && die "ERROR: libxcb_shape not found";
|
||||
} && enable libxcb_shape; }
|
||||
|
||||
add_cflags $xcb_cflags $xcb_shm_cflags $xcb_xfixes_cflags $xcb_shape_cflags
|
||||
add_extralibs $xcb_libs $xcb_shm_libs $xcb_xfixes_libs $xcb_shape_libs
|
||||
fi
|
||||
fi
|
||||
|
||||
if enabled x11grab; then
|
||||
enabled xlib || die "ERROR: Xlib not found"
|
||||
require Xext X11/extensions/XShm.h XShmCreateImage -lXext
|
||||
require Xfixes X11/extensions/Xfixes.h XFixesGetCursorImage -lXfixes
|
||||
fi
|
||||
enabled x11grab &&
|
||||
require Xext X11/extensions/XShm.h XShmCreateImage -lXext &&
|
||||
require Xfixes X11/extensions/Xfixes.h XFixesGetCursorImage -lXfixes &&
|
||||
{ enabled xlib || die "ERROR: Xlib not found"; }
|
||||
|
||||
check_func_headers "windows.h" CreateDIBSection "$gdigrab_indev_extralibs"
|
||||
|
||||
@@ -5383,6 +5304,7 @@ done
|
||||
enabled zlib && add_cppflags -DZLIB_CONST
|
||||
|
||||
# conditional library dependencies, in linking order
|
||||
enabled aconvert_filter && prepend avfilter_deps "swresample"
|
||||
enabled amovie_filter && prepend avfilter_deps "avformat avcodec"
|
||||
enabled aresample_filter && prepend avfilter_deps "swresample"
|
||||
enabled asyncts_filter && prepend avfilter_deps "avresample"
|
||||
@@ -5678,7 +5600,7 @@ cat > $TMPH <<EOF
|
||||
#define FFMPEG_CONFIG_H
|
||||
#define FFMPEG_CONFIGURATION "$(c_escape $FFMPEG_CONFIGURATION)"
|
||||
#define FFMPEG_LICENSE "$(c_escape $license)"
|
||||
#define CONFIG_THIS_YEAR 2014
|
||||
#define CONFIG_THIS_YEAR 2015
|
||||
#define FFMPEG_DATADIR "$(eval c_escape $datadir)"
|
||||
#define AVCONV_DATADIR "$(eval c_escape $datadir)"
|
||||
#define CC_IDENT "$(c_escape ${cc_ident:-Unknown compiler})"
|
||||
@@ -5706,6 +5628,7 @@ enabled getenv || echo "#define getenv(x) NULL" >> $TMPH
|
||||
|
||||
|
||||
mkdir -p doc
|
||||
mkdir -p tests
|
||||
echo "@c auto-generated by configure" > doc/config.texi
|
||||
|
||||
print_config ARCH_ "$config_files" $ARCH_LIST
|
||||
@@ -5792,7 +5715,7 @@ Cflags: -I\${includedir}
|
||||
EOF
|
||||
}
|
||||
|
||||
pkgconfig_generate libavutil "FFmpeg utility library" "$LIBAVUTIL_VERSION" "$LIBRT $LIBM"
|
||||
pkgconfig_generate libavutil "FFmpeg utility library" "$LIBAVUTIL_VERSION" "$LIBM"
|
||||
pkgconfig_generate libavcodec "FFmpeg codec library" "$LIBAVCODEC_VERSION" "$extralibs"
|
||||
pkgconfig_generate libavformat "FFmpeg container format library" "$LIBAVFORMAT_VERSION" "$extralibs"
|
||||
pkgconfig_generate libavdevice "FFmpeg device handling library" "$LIBAVDEVICE_VERSION" "$extralibs"
|
||||
|
@@ -15,58 +15,6 @@ libavutil: 2014-08-09
|
||||
|
||||
API changes, most recent first:
|
||||
|
||||
2014-11-21 - ab922f9 - lavu 54.15.100 - dict.h
|
||||
Add av_dict_get_string().
|
||||
|
||||
2014-11-18 - a54a51c - lavu 54.14.100 - float_dsp.h
|
||||
Add avpriv_float_dsp_alloc().
|
||||
|
||||
2014-11-16 - 6690d4c3 - lavf 56.13.100 - avformat.h
|
||||
Add AVStream.recommended_encoder_configuration with accessors.
|
||||
|
||||
2014-11-16 - bee5844d - lavu 54.13.100 - opt.h
|
||||
Add av_opt_serialize().
|
||||
|
||||
2014-11-16 - eec69332 - lavu 54.12.100 - opt.h
|
||||
Add av_opt_is_set_to_default().
|
||||
|
||||
2014-11-06 - 44fa267 / 5e80fb7 - lavc 56.11.100 / 56.6.0 - vorbis_parser.h
|
||||
Add a public API for parsing vorbis packets.
|
||||
|
||||
2014-10-15 - 17085a0 / 7ea1b34 - lavc 56.7.100 / 56.5.0 - avcodec.h
|
||||
Replace AVCodecContext.time_base used for decoding
|
||||
with AVCodecContext.framerate.
|
||||
|
||||
2014-10-15 - 51c810e / d565fef1 - lavc 56.6.100 / 56.4.0 - avcodec.h
|
||||
Add AV_HWACCEL_FLAG_IGNORE_LEVEL flag to av_vdpau_bind_context().
|
||||
|
||||
2014-10-13 - da21895 / 2df0c32e - lavc 56.5.100 / 56.3.0 - avcodec.h
|
||||
Add AVCodecContext.initial_padding. Deprecate the use of AVCodecContext.delay
|
||||
for audio encoding.
|
||||
|
||||
2014-10-08 - bb44f7d / 5a419b2 - lavu 54.10.100 / 54.4.0 - pixdesc.h
|
||||
Add API to return the name of frame and context color properties.
|
||||
|
||||
2014-10-06 - a61899a / e3e158e - lavc 56.3.100 / 56.2.0 - vdpau.h
|
||||
Add av_vdpau_bind_context(). This function should now be used for creating
|
||||
(or resetting) a AVVDPAUContext instead of av_vdpau_alloc_context().
|
||||
|
||||
2014-10-02 - cdd6f05 - lavc 56.2.100 - avcodec.h
|
||||
2014-10-02 - cdd6f05 - lavu 54.9.100 - frame.h
|
||||
Add AV_FRAME_DATA_SKIP_SAMPLES. Add lavc CODEC_FLAG2_SKIP_MANUAL and
|
||||
AVOption "skip_manual", which makes lavc export skip information via
|
||||
AV_FRAME_DATA_SKIP_SAMPLES AVFrame side data, instead of skipping and
|
||||
discarding samples automatically.
|
||||
|
||||
2014-10-02 - 0d92b0d - lavu 54.8.100 - avstring.h
|
||||
Add av_match_list()
|
||||
|
||||
2014-09-24 - ac68295 - libpostproc 53.1.100
|
||||
Add visualization support
|
||||
|
||||
2014-09-19 - 6edd6a4 - lavc 56.1.101 - dv_profile.h
|
||||
deprecate avpriv_dv_frame_profile2(), which was made public by accident.
|
||||
|
||||
|
||||
-------- 8< --------- FFmpeg 2.4 was cut here -------- 8< ---------
|
||||
|
||||
@@ -914,9 +862,6 @@ lavd 54.4.100 / 54.0.0, lavfi 3.5.0
|
||||
avresample_read() are now uint8_t** instead of void**.
|
||||
Libavresample is now stable.
|
||||
|
||||
2012-09-26 - 3ba0dab7 / 1384df64 - lavf 54.29.101 / 56.06.3 - avformat.h
|
||||
Add AVFormatContext.avoid_negative_ts.
|
||||
|
||||
2012-09-24 - 46a3595 / a42aada - lavc 54.59.100 / 54.28.0 - avcodec.h
|
||||
Add avcodec_free_frame(). This function must now
|
||||
be used for freeing an AVFrame.
|
||||
|
@@ -31,7 +31,7 @@ PROJECT_NAME = FFmpeg
|
||||
# This could be handy for archiving the generated documentation or
|
||||
# if some version control system is used.
|
||||
|
||||
PROJECT_NUMBER = 2.5
|
||||
PROJECT_NUMBER = 2.4.6
|
||||
|
||||
# With the PROJECT_LOGO tag one can specify a logo or icon that is included
|
||||
# in the documentation. The maximum height of the logo should not exceed 55
|
||||
|
@@ -13,16 +13,7 @@ bitstream filter using the option @code{--disable-bsf=BSF}.
|
||||
The option @code{-bsfs} of the ff* tools will display the list of
|
||||
all the supported bitstream filters included in your build.
|
||||
|
||||
The ff* tools have a -bsf option applied per stream, taking a
|
||||
comma-separated list of filters, whose parameters follow the filter
|
||||
name after a '='.
|
||||
|
||||
@example
|
||||
ffmpeg -i INPUT -c:v copy -bsf:v filter1[=opt1=str1/opt2=str2][,filter2] OUTPUT
|
||||
@end example
|
||||
|
||||
Below is a description of the currently available bitstream filters,
|
||||
with their parameters, if any.
|
||||
Below is a description of the currently available bitstream filters.
|
||||
|
||||
@section aac_adtstoasc
|
||||
|
||||
@@ -144,16 +135,9 @@ ffmpeg -i frame_%d.jpg -c:v copy rotated.avi
|
||||
Damages the contents of packets without damaging the container. Can be
|
||||
used for fuzzing or testing error resilience/concealment.
|
||||
|
||||
Parameters:
|
||||
A numeral string, whose value is related to how often output bytes will
|
||||
be modified. Therefore, values below or equal to 0 are forbidden, and
|
||||
the lower the more frequent bytes will be modified, with 1 meaning
|
||||
every byte is modified.
|
||||
|
||||
@example
|
||||
ffmpeg -i INPUT -c copy -bsf noise[=1] output.mkv
|
||||
ffmpeg -i INPUT -c copy -bsf noise output.mkv
|
||||
@end example
|
||||
applies the modification to every byte.
|
||||
|
||||
@section remove_extra
|
||||
|
||||
|
@@ -71,9 +71,7 @@ Force low delay.
|
||||
@item global_header
|
||||
Place global headers in extradata instead of every keyframe.
|
||||
@item bitexact
|
||||
Only write platform-, build- and time-independent data. (except (I)DCT).
|
||||
This ensures that file and data checksums are reproducible and match between
|
||||
platforms. Its primary use is for regression testing.
|
||||
Use only bitexact stuff (except (I)DCT).
|
||||
@item aic
|
||||
Apply H263 advanced intra coding / mpeg4 ac prediction.
|
||||
@item cbp
|
||||
@@ -1116,19 +1114,6 @@ Interlaced video, bottom coded first, top displayed first
|
||||
Set to 1 to disable processing alpha (transparency). This works like the
|
||||
@samp{gray} flag in the @option{flags} option which skips chroma information
|
||||
instead of alpha. Default is 0.
|
||||
|
||||
@item codec_whitelist @var{list} (@emph{input})
|
||||
"," separated List of allowed decoders. By default all are allowed.
|
||||
|
||||
@item dump_separator @var{string} (@emph{input})
|
||||
Separator used to separate the fields printed on the command line about the
|
||||
Stream parameters.
|
||||
For example to separate the fields with newlines and indention:
|
||||
@example
|
||||
ffprobe -dump_separator "
|
||||
" -i ~/videos/matrixbench_mpeg2.mpg
|
||||
@end example
|
||||
|
||||
@end table
|
||||
|
||||
@c man end CODEC OPTIONS
|
||||
|
@@ -190,15 +190,6 @@ The format for this option is a string containing 16 24-bits hexadecimal
|
||||
numbers (without 0x prefix) separated by comas, for example @code{0d00ee,
|
||||
ee450d, 101010, eaeaea, 0ce60b, ec14ed, ebff0b, 0d617a, 7b7b7b, d1d1d1,
|
||||
7b2a0e, 0d950c, 0f007b, cf0dec, cfa80c, 7c127b}.
|
||||
|
||||
@item ifo_palette
|
||||
Specify the IFO file from which the global palette is obtained.
|
||||
(experimental)
|
||||
|
||||
@item forced_subs_only
|
||||
Only decode subtitle entries marked as forced. Some titles have forced
|
||||
and non-forced subtitles in the same track. Setting this flag to @code{1}
|
||||
will only keep the forced subtitles. Default value is @code{0}.
|
||||
@end table
|
||||
|
||||
@section libzvbi-teletext
|
||||
|
@@ -29,26 +29,6 @@ the caller can decide which variant streams to actually receive.
|
||||
The total bitrate of the variant that the stream belongs to is
|
||||
available in a metadata key named "variant_bitrate".
|
||||
|
||||
@section apng
|
||||
|
||||
Animated Portable Network Graphics demuxer.
|
||||
|
||||
This demuxer is used to demux APNG files.
|
||||
All headers, but the PNG signature, up to (but not including) the first
|
||||
fcTL chunk are transmitted as extradata.
|
||||
Frames are then split as being all the chunks between two fcTL ones, or
|
||||
between the last fcTL and IEND chunks.
|
||||
|
||||
@table @option
|
||||
@item -ignore_loop @var{bool}
|
||||
Ignore the loop variable in the file if set.
|
||||
@item -max_fps @var{int}
|
||||
Maximum framerate in frames per second (0 for no limit).
|
||||
@item -default_fps @var{int}
|
||||
Default framerate in frames per second when none is specified in the file
|
||||
(0 meaning as fast as possible).
|
||||
@end table
|
||||
|
||||
@section asf
|
||||
|
||||
Advanced Systems Format demuxer.
|
||||
|
@@ -1745,10 +1745,6 @@ Enable calculation and printing SSIM stats after the encoding.
|
||||
Enable the use of Periodic Intra Refresh instead of IDR frames when set
|
||||
to 1.
|
||||
|
||||
@item avcintra-class (@emph{class})
|
||||
Configure the encoder to generate AVC-Intra.
|
||||
Valid values are 50,100 and 200
|
||||
|
||||
@item bluray-compat (@emph{bluray-compat})
|
||||
Configure the encoder to be compatible with the bluray standard.
|
||||
It is a shorthand for setting "bluray-compat=1 force-cfr=1".
|
||||
@@ -1886,34 +1882,6 @@ no-fast-pskip=1:subq=6:8x8dct=0:trellis=0 OUTPUT
|
||||
Encoding ffpresets for common usages are provided so they can be used with the
|
||||
general presets system (e.g. passing the @option{pre} option).
|
||||
|
||||
@section libx265
|
||||
|
||||
x265 H.265/HEVC encoder wrapper.
|
||||
|
||||
This encoder requires the presence of the libx265 headers and library
|
||||
during configuration. You need to explicitly configure the build with
|
||||
@option{--enable-libx265}.
|
||||
|
||||
@subsection Options
|
||||
|
||||
@table @option
|
||||
@item preset
|
||||
Set the x265 preset.
|
||||
|
||||
@item tune
|
||||
Set the x265 tune parameter.
|
||||
|
||||
@item x265-params
|
||||
Set x265 options using a list of @var{key}=@var{value} couples separated
|
||||
by ":". See @command{x265 --help} for a list of options.
|
||||
|
||||
For example to specify libx265 encoding options with @option{-x265-params}:
|
||||
|
||||
@example
|
||||
ffmpeg -i input -c:v libx265 -x265-params crf=26:psy-rd=1 output.mp4
|
||||
@end example
|
||||
@end table
|
||||
|
||||
@section libxvid
|
||||
|
||||
Xvid MPEG-4 Part 2 encoder wrapper.
|
||||
|
@@ -29,6 +29,7 @@ OBJS=$(addsuffix .o,$(EXAMPLES))
|
||||
|
||||
# the following examples make explicit use of the math library
|
||||
avcodec: LDLIBS += -lm
|
||||
decoding_encoding: LDLIBS += -lm
|
||||
muxing: LDLIBS += -lm
|
||||
resampling_audio: LDLIBS += -lm
|
||||
|
||||
|
@@ -288,7 +288,6 @@ static void audio_decode_example(const char *outfilename, const char *filename)
|
||||
avpkt.size = fread(inbuf, 1, AUDIO_INBUF_SIZE, f);
|
||||
|
||||
while (avpkt.size > 0) {
|
||||
int i, ch;
|
||||
int got_frame = 0;
|
||||
|
||||
if (!decoded_frame) {
|
||||
@@ -305,15 +304,15 @@ static void audio_decode_example(const char *outfilename, const char *filename)
|
||||
}
|
||||
if (got_frame) {
|
||||
/* if a frame has been decoded, output it */
|
||||
int data_size = av_get_bytes_per_sample(c->sample_fmt);
|
||||
int data_size = av_samples_get_buffer_size(NULL, c->channels,
|
||||
decoded_frame->nb_samples,
|
||||
c->sample_fmt, 1);
|
||||
if (data_size < 0) {
|
||||
/* This should not occur, checking just for paranoia */
|
||||
fprintf(stderr, "Failed to calculate data size\n");
|
||||
exit(1);
|
||||
}
|
||||
for (i=0; i<decoded_frame->nb_samples; i++)
|
||||
for (ch=0; ch<c->channels; ch++)
|
||||
fwrite(decoded_frame->data[ch] + data_size*i, 1, data_size, outfile);
|
||||
fwrite(decoded_frame->data[0], 1, data_size, outfile);
|
||||
}
|
||||
avpkt.size -= len;
|
||||
avpkt.data += len;
|
||||
@@ -651,7 +650,7 @@ int main(int argc, char **argv)
|
||||
video_encode_example("test.h264", AV_CODEC_ID_H264);
|
||||
} else if (!strcmp(output_type, "mp2")) {
|
||||
audio_encode_example("test.mp2");
|
||||
audio_decode_example("test.pcm", "test.mp2");
|
||||
audio_decode_example("test.sw", "test.mp2");
|
||||
} else if (!strcmp(output_type, "mpg")) {
|
||||
video_encode_example("test.mpg", AV_CODEC_ID_MPEG1VIDEO);
|
||||
video_decode_example("test%02d.pgm", "test.mpg");
|
||||
|
@@ -306,7 +306,7 @@ static int decode_audio_frame(AVFrame *frame,
|
||||
|
||||
/** Read one audio frame from the input file into a temporary packet. */
|
||||
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 the the end of the file, flush the decoder below. */
|
||||
if (error == AVERROR_EOF)
|
||||
*finished = 1;
|
||||
else {
|
||||
|
@@ -116,6 +116,10 @@ static int open_output_file(const char *filename)
|
||||
|| dec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) {
|
||||
/* in this example, we choose transcoding to same codec */
|
||||
encoder = avcodec_find_encoder(dec_ctx->codec_id);
|
||||
if (!encoder) {
|
||||
av_log(NULL, AV_LOG_FATAL, "Neccessary encoder not found\n");
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
/* In this example, we transcode to same properties (picture size,
|
||||
* sample rate etc.). These properties can be changed for output
|
||||
@@ -385,9 +389,17 @@ static int encode_write_frame(AVFrame *filt_frame, unsigned int stream_index, in
|
||||
|
||||
/* prepare packet for muxing */
|
||||
enc_pkt.stream_index = stream_index;
|
||||
av_packet_rescale_ts(&enc_pkt,
|
||||
ofmt_ctx->streams[stream_index]->codec->time_base,
|
||||
ofmt_ctx->streams[stream_index]->time_base);
|
||||
enc_pkt.dts = av_rescale_q_rnd(enc_pkt.dts,
|
||||
ofmt_ctx->streams[stream_index]->codec->time_base,
|
||||
ofmt_ctx->streams[stream_index]->time_base,
|
||||
AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
|
||||
enc_pkt.pts = av_rescale_q_rnd(enc_pkt.pts,
|
||||
ofmt_ctx->streams[stream_index]->codec->time_base,
|
||||
ofmt_ctx->streams[stream_index]->time_base,
|
||||
AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
|
||||
enc_pkt.duration = av_rescale_q(enc_pkt.duration,
|
||||
ofmt_ctx->streams[stream_index]->codec->time_base,
|
||||
ofmt_ctx->streams[stream_index]->time_base);
|
||||
|
||||
av_log(NULL, AV_LOG_DEBUG, "Muxing frame\n");
|
||||
/* mux encoded frame */
|
||||
@@ -501,9 +513,14 @@ int main(int argc, char **argv)
|
||||
ret = AVERROR(ENOMEM);
|
||||
break;
|
||||
}
|
||||
av_packet_rescale_ts(&packet,
|
||||
ifmt_ctx->streams[stream_index]->time_base,
|
||||
ifmt_ctx->streams[stream_index]->codec->time_base);
|
||||
packet.dts = av_rescale_q_rnd(packet.dts,
|
||||
ifmt_ctx->streams[stream_index]->time_base,
|
||||
ifmt_ctx->streams[stream_index]->codec->time_base,
|
||||
AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
|
||||
packet.pts = av_rescale_q_rnd(packet.pts,
|
||||
ifmt_ctx->streams[stream_index]->time_base,
|
||||
ifmt_ctx->streams[stream_index]->codec->time_base,
|
||||
AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
|
||||
dec_func = (type == AVMEDIA_TYPE_VIDEO) ? avcodec_decode_video2 :
|
||||
avcodec_decode_audio4;
|
||||
ret = dec_func(ifmt_ctx->streams[stream_index]->codec, frame,
|
||||
@@ -525,9 +542,14 @@ int main(int argc, char **argv)
|
||||
}
|
||||
} else {
|
||||
/* remux this frame without reencoding */
|
||||
av_packet_rescale_ts(&packet,
|
||||
ifmt_ctx->streams[stream_index]->time_base,
|
||||
ofmt_ctx->streams[stream_index]->time_base);
|
||||
packet.dts = av_rescale_q_rnd(packet.dts,
|
||||
ifmt_ctx->streams[stream_index]->time_base,
|
||||
ofmt_ctx->streams[stream_index]->time_base,
|
||||
AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
|
||||
packet.pts = av_rescale_q_rnd(packet.pts,
|
||||
ifmt_ctx->streams[stream_index]->time_base,
|
||||
ofmt_ctx->streams[stream_index]->time_base,
|
||||
AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
|
||||
|
||||
ret = av_interleaved_write_frame(ofmt_ctx, &packet);
|
||||
if (ret < 0)
|
||||
|
@@ -360,7 +360,7 @@ ffmpeg -i myfile.avi -target vcd -bf 2 /tmp/vcd.mpg
|
||||
@end example
|
||||
|
||||
@item -dframes @var{number} (@emph{output})
|
||||
Set the number of data frames to output. This is an alias for @code{-frames:d}.
|
||||
Set the number of data frames to record. This is an alias for @code{-frames:d}.
|
||||
|
||||
@item -frames[:@var{stream_specifier}] @var{framecount} (@emph{output,per-stream})
|
||||
Stop writing to the stream after @var{framecount} frames.
|
||||
@@ -467,7 +467,7 @@ attachments.
|
||||
|
||||
@table @option
|
||||
@item -vframes @var{number} (@emph{output})
|
||||
Set the number of video frames to output. This is an alias for @code{-frames:v}.
|
||||
Set the number of video frames to record. This is an alias for @code{-frames:v}.
|
||||
@item -r[:@var{stream_specifier}] @var{fps} (@emph{input/output,per-stream})
|
||||
Set frame rate (Hz value, fraction or abbreviation).
|
||||
|
||||
@@ -692,7 +692,7 @@ If this option is not specified, the default adapter is used.
|
||||
|
||||
@table @option
|
||||
@item -aframes @var{number} (@emph{output})
|
||||
Set the number of audio frames to output. This is an alias for @code{-frames:a}.
|
||||
Set the number of audio frames to record. This is an alias for @code{-frames:a}.
|
||||
@item -ar[:@var{stream_specifier}] @var{freq} (@emph{input/output,per-stream})
|
||||
Set the audio sampling frequency. For output streams it is set by
|
||||
default to the frequency of the corresponding input stream. For input
|
||||
@@ -1016,12 +1016,6 @@ processing (e.g. in case the format option @option{avoid_negative_ts}
|
||||
is enabled) the output timestamps may mismatch with the input
|
||||
timestamps even when this option is selected.
|
||||
|
||||
@item -start_at_zero
|
||||
When used with @option{copyts}, shift input timestamps so they start at zero.
|
||||
|
||||
This means that using e.g. @code{-ss 50} will make output timestamps start at
|
||||
50 seconds, regardless of what timestamp the input file started at.
|
||||
|
||||
@item -copytb @var{mode}
|
||||
Specify how to set the encoder timebase when stream copying. @var{mode} is an
|
||||
integer numeric value, and can assume one of the following values:
|
||||
|
@@ -37,14 +37,10 @@ Force displayed height.
|
||||
Set frame size (WxH or abbreviation), needed for videos which do
|
||||
not contain a header with the frame size like raw YUV. This option
|
||||
has been deprecated in favor of private options, try -video_size.
|
||||
@item -fs
|
||||
Start in fullscreen mode.
|
||||
@item -an
|
||||
Disable audio.
|
||||
@item -vn
|
||||
Disable video.
|
||||
@item -sn
|
||||
Disable subtitles.
|
||||
@item -ss @var{pos}
|
||||
Seek to a given position in seconds.
|
||||
@item -t @var{duration}
|
||||
@@ -113,10 +109,15 @@ duration, the codec parameters, the current position in the stream and
|
||||
the audio/video synchronisation drift. It is on by default, to
|
||||
explicitly disable it you need to specify @code{-nostats}.
|
||||
|
||||
@item -bug
|
||||
Work around bugs.
|
||||
@item -fast
|
||||
Non-spec-compliant optimizations.
|
||||
@item -genpts
|
||||
Generate pts.
|
||||
@item -rtp_tcp
|
||||
Force RTP/TCP protocol usage instead of RTP/UDP. It is only meaningful
|
||||
if you are streaming with the RTSP protocol.
|
||||
@item -sync @var{type}
|
||||
Set the master clock to audio (@code{type=audio}), video
|
||||
(@code{type=video}) or external (@code{type=ext}). Default is audio. The
|
||||
@@ -125,8 +126,7 @@ players use audio as master clock, but in some cases (streaming or high
|
||||
quality broadcast) it is necessary to change that. This option is mainly
|
||||
used for debugging purposes.
|
||||
@item -threads @var{count}
|
||||
Set the thread count. By default, @command{ffplay} automatically detects a
|
||||
suitable number of threads to use.
|
||||
Set the thread count.
|
||||
@item -ast @var{audio_stream_number}
|
||||
Select the desired audio stream number, counting from 0. The number
|
||||
refers to the list of all the input audio streams. If it is greater
|
||||
@@ -164,20 +164,8 @@ Force a specific video decoder.
|
||||
Force a specific subtitle decoder.
|
||||
|
||||
@item -autorotate
|
||||
Automatically rotate the video according to presentation metadata. Enabled by
|
||||
default, use @option{-noautorotate} to disable it.
|
||||
|
||||
@item -framedrop
|
||||
Drop video frames if video is out of sync. Enabled by default if the master
|
||||
clock is not set to video. Use this option to enable frame dropping for all
|
||||
master clock sources, use @option{-noframedrop} to disable it.
|
||||
|
||||
@item -infbuf
|
||||
Do not limit the input buffer size, read as much data as possible from the
|
||||
input as soon as possible. Enabled by default for realtime streams, where data
|
||||
may be dropped if not read in time. Use this option to enable infinite buffers
|
||||
for all inputs, use @option{-noinfbuf} to disable it.
|
||||
|
||||
Automatically rotate the video according to presentation metadata. Set by
|
||||
default, use -noautorotate to disable.
|
||||
@end table
|
||||
|
||||
@section While playing
|
||||
|
@@ -321,12 +321,6 @@ Show information related to program and library versions. This is the
|
||||
equivalent of setting both @option{-show_program_version} and
|
||||
@option{-show_library_versions} options.
|
||||
|
||||
@item -show_pixel_formats
|
||||
Show information about all pixel formats supported by FFmpeg.
|
||||
|
||||
Pixel format information for each format is printed within a section
|
||||
with name "PIXEL_FORMAT".
|
||||
|
||||
@item -bitexact
|
||||
Force bitexact output, useful to produce output which is not dependent
|
||||
on the specific build.
|
||||
|
@@ -10,10 +10,8 @@
|
||||
<xsd:sequence>
|
||||
<xsd:element name="program_version" type="ffprobe:programVersionType" minOccurs="0" maxOccurs="1" />
|
||||
<xsd:element name="library_versions" type="ffprobe:libraryVersionsType" minOccurs="0" maxOccurs="1" />
|
||||
<xsd:element name="pixel_formats" type="ffprobe:pixelFormatsType" minOccurs="0" maxOccurs="1" />
|
||||
<xsd:element name="packets" type="ffprobe:packetsType" minOccurs="0" maxOccurs="1" />
|
||||
<xsd:element name="frames" type="ffprobe:framesType" minOccurs="0" maxOccurs="1" />
|
||||
<xsd:element name="packets_and_frames" type="ffprobe:packetsAndFramesType" minOccurs="0" maxOccurs="1" />
|
||||
<xsd:element name="programs" type="ffprobe:programsType" minOccurs="0" maxOccurs="1" />
|
||||
<xsd:element name="streams" type="ffprobe:streamsType" minOccurs="0" maxOccurs="1" />
|
||||
<xsd:element name="chapters" type="ffprobe:chaptersType" minOccurs="0" maxOccurs="1" />
|
||||
@@ -37,16 +35,6 @@
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="packetsAndFramesType">
|
||||
<xsd:sequence>
|
||||
<xsd:choice minOccurs="0" maxOccurs="unbounded">
|
||||
<xsd:element name="packet" type="ffprobe:packetType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xsd:element name="frame" type="ffprobe:frameType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
<xsd:element name="subtitle" type="ffprobe:subtitleType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xsd:choice>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="packetType">
|
||||
<xsd:attribute name="codec_type" type="xsd:string" use="required" />
|
||||
<xsd:attribute name="stream_index" type="xsd:int" use="required" />
|
||||
@@ -178,9 +166,6 @@
|
||||
<xsd:attribute name="level" type="xsd:int"/>
|
||||
<xsd:attribute name="color_range" type="xsd:string"/>
|
||||
<xsd:attribute name="color_space" type="xsd:string"/>
|
||||
<xsd:attribute name="color_transfer" type="xsd:string"/>
|
||||
<xsd:attribute name="color_primaries" type="xsd:string"/>
|
||||
<xsd:attribute name="chroma_location" type="xsd:string"/>
|
||||
<xsd:attribute name="timecode" type="xsd:string"/>
|
||||
|
||||
<!-- audio attributes -->
|
||||
@@ -292,45 +277,4 @@
|
||||
<xsd:element name="library_version" type="ffprobe:libraryVersionType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="pixelFormatFlagsType">
|
||||
<xsd:attribute name="big_endian" type="xsd:int" use="required"/>
|
||||
<xsd:attribute name="palette" type="xsd:int" use="required"/>
|
||||
<xsd:attribute name="bitstream" 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="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:complexType>
|
||||
|
||||
<xsd:complexType name="pixelFormatComponentType">
|
||||
<xsd:attribute name="index" type="xsd:int" use="required"/>
|
||||
<xsd:attribute name="bit_depth" type="xsd:int" use="required"/>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="pixelFormatComponentsType">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="component" type="ffprobe:pixelFormatComponentType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="pixelFormatType">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="flags" type="ffprobe:pixelFormatFlagsType" minOccurs="0" maxOccurs="1"/>
|
||||
<xsd:element name="components" type="ffprobe:pixelFormatComponentsType" minOccurs="0" maxOccurs="1"/>
|
||||
</xsd:sequence>
|
||||
|
||||
<xsd:attribute name="name" type="xsd:string" use="required"/>
|
||||
<xsd:attribute name="nb_components" type="xsd:int" use="required"/>
|
||||
<xsd:attribute name="log2_chroma_w" type="xsd:int"/>
|
||||
<xsd:attribute name="log2_chroma_h" type="xsd:int"/>
|
||||
<xsd:attribute name="bits_per_pixel" type="xsd:int"/>
|
||||
</xsd:complexType>
|
||||
|
||||
<xsd:complexType name="pixelFormatsType">
|
||||
<xsd:sequence>
|
||||
<xsd:element name="pixel_format" type="ffprobe:pixelFormatType" minOccurs="0" maxOccurs="unbounded"/>
|
||||
</xsd:sequence>
|
||||
</xsd:complexType>
|
||||
</xsd:schema>
|
||||
|
@@ -408,12 +408,6 @@ ignored, and the log is written to standard output.
|
||||
Set no-daemon mode. This option is currently ignored since now
|
||||
@command{ffserver} will always work in no-daemon mode, and is
|
||||
deprecated.
|
||||
|
||||
@item UseDefaults
|
||||
@item NoDefaults
|
||||
Control whether default codec options are used for the all streams or not.
|
||||
Each stream may overwrite this setting for its own. Default is @var{UseDefaults}.
|
||||
The lastest occurrence overrides previous if multiple definitions.
|
||||
@end table
|
||||
|
||||
@section Feed section
|
||||
@@ -577,11 +571,6 @@ deprecated in favor of @option{Metadata}.
|
||||
@item Metadata @var{key} @var{value}
|
||||
Set metadata value on the output stream.
|
||||
|
||||
@item UseDefaults
|
||||
@item NoDefaults
|
||||
Control whether default codec options are used for the stream or not.
|
||||
Default is @var{UseDefaults} unless disabled globally.
|
||||
|
||||
@item NoAudio
|
||||
@item NoVideo
|
||||
Suppress audio/video.
|
||||
@@ -600,9 +589,8 @@ Set sampling frequency for audio. When using low bitrates, you should
|
||||
lower this frequency to 22050 or 11025. The supported frequencies
|
||||
depend on the selected audio codec.
|
||||
|
||||
@item AVOptionAudio [@var{codec}:]@var{option} @var{value} (@emph{encoding,audio})
|
||||
Set generic or private option for audio stream.
|
||||
Private option must be prefixed with codec name or codec must be defined before.
|
||||
@item AVOptionAudio @var{option} @var{value} (@emph{encoding,audio})
|
||||
Set generic option for audio stream.
|
||||
|
||||
@item AVPresetAudio @var{preset} (@emph{encoding,audio})
|
||||
Set preset for audio stream.
|
||||
@@ -679,9 +667,8 @@ Set video @option{qdiff} encoding option.
|
||||
@item DarkMask @var{float} (@emph{encoding,video})
|
||||
Set @option{lumi_mask}/@option{dark_mask} encoding options.
|
||||
|
||||
@item AVOptionVideo [@var{codec}:]@var{option} @var{value} (@emph{encoding,video})
|
||||
Set generic or private option for video stream.
|
||||
Private option must be prefixed with codec name or codec must be defined before.
|
||||
@item AVOptionVideo @var{option} @var{value} (@emph{encoding,video})
|
||||
Set generic option for video stream.
|
||||
|
||||
@item AVPresetVideo @var{preset} (@emph{encoding,video})
|
||||
Set preset for video stream.
|
||||
|
@@ -103,10 +103,7 @@ Print detailed information about the filter name @var{filter_name}. Use the
|
||||
Show version.
|
||||
|
||||
@item -formats
|
||||
Show available formats (including devices).
|
||||
|
||||
@item -devices
|
||||
Show available devices.
|
||||
Show available formats.
|
||||
|
||||
@item -codecs
|
||||
Show all codecs known to libavcodec.
|
||||
@@ -141,22 +138,6 @@ Show channel names and standard channel layouts.
|
||||
@item -colors
|
||||
Show recognized color names.
|
||||
|
||||
@item -sources @var{device}[,@var{opt1}=@var{val1}[,@var{opt2}=@var{val2}]...]
|
||||
Show autodetected sources of the intput device.
|
||||
Some devices may provide system-dependent source names that cannot be autodetected.
|
||||
The returned list cannot be assumed to be always complete.
|
||||
@example
|
||||
ffmpeg -sources pulse,server=192.168.0.4
|
||||
@end example
|
||||
|
||||
@item -sinks @var{device}[,@var{opt1}=@var{val1}[,@var{opt2}=@var{val2}]...]
|
||||
Show autodetected sinks of the output device.
|
||||
Some devices may provide system-dependent sink names that cannot be autodetected.
|
||||
The returned list cannot be assumed to be always complete.
|
||||
@example
|
||||
ffmpeg -sinks pulse,server=192.168.0.4
|
||||
@end example
|
||||
|
||||
@item -loglevel [repeat+]@var{loglevel} | -v [repeat+]@var{loglevel}
|
||||
Set the logging level used by the library.
|
||||
Adding "repeat+" indicates that repeated log output should not be compressed
|
||||
|
214
doc/filters.texi
214
doc/filters.texi
@@ -282,10 +282,6 @@ sequential number of the input frame, starting from 0
|
||||
|
||||
@item pos
|
||||
the position in the file of the input frame, NAN if unknown
|
||||
|
||||
@item w
|
||||
@item h
|
||||
width and height of the input frame if video
|
||||
@end table
|
||||
|
||||
Additionally, these filters support an @option{enable} command that can be used
|
||||
@@ -313,6 +309,41 @@ build.
|
||||
|
||||
Below is a description of the currently available audio filters.
|
||||
|
||||
@section aconvert
|
||||
|
||||
Convert the input audio format to the specified formats.
|
||||
|
||||
@emph{This filter is deprecated. Use @ref{aformat} instead.}
|
||||
|
||||
The filter accepts a string of the form:
|
||||
"@var{sample_format}:@var{channel_layout}".
|
||||
|
||||
@var{sample_format} specifies the sample format, and can be a string or the
|
||||
corresponding numeric value defined in @file{libavutil/samplefmt.h}. Use 'p'
|
||||
suffix for a planar sample format.
|
||||
|
||||
@var{channel_layout} specifies the channel layout, and can be a string
|
||||
or the corresponding number value defined in @file{libavutil/channel_layout.h}.
|
||||
|
||||
The special parameter "auto", signifies that the filter will
|
||||
automatically select the output format depending on the output filter.
|
||||
|
||||
@subsection Examples
|
||||
|
||||
@itemize
|
||||
@item
|
||||
Convert input to float, planar, stereo:
|
||||
@example
|
||||
aconvert=fltp:stereo
|
||||
@end example
|
||||
|
||||
@item
|
||||
Convert input to unsigned 8-bit, automatically select out channel layout:
|
||||
@example
|
||||
aconvert=u8:auto
|
||||
@end example
|
||||
@end itemize
|
||||
|
||||
@section adelay
|
||||
|
||||
Delay one or more audio channels.
|
||||
@@ -1710,11 +1741,11 @@ The default is 0.707q and gives a Butterworth response.
|
||||
Mix channels with specific gain levels. The filter accepts the output
|
||||
channel layout followed by a set of channels definitions.
|
||||
|
||||
This filter is also designed to efficiently remap the channels of an audio
|
||||
This filter is also designed to remap efficiently the channels of an audio
|
||||
stream.
|
||||
|
||||
The filter accepts parameters of the form:
|
||||
"@var{l}|@var{outdef}|@var{outdef}|..."
|
||||
"@var{l}:@var{outdef}:@var{outdef}:..."
|
||||
|
||||
@table @option
|
||||
@item l
|
||||
@@ -1745,13 +1776,13 @@ avoiding clipping noise.
|
||||
For example, if you want to down-mix from stereo to mono, but with a bigger
|
||||
factor for the left channel:
|
||||
@example
|
||||
pan=1c|c0=0.9*c0+0.1*c1
|
||||
pan=1:c0=0.9*c0+0.1*c1
|
||||
@end example
|
||||
|
||||
A customized down-mix to stereo that works automatically for 3-, 4-, 5- and
|
||||
7-channels surround:
|
||||
@example
|
||||
pan=stereo| FL < FL + 0.5*FC + 0.6*BL + 0.6*SL | FR < FR + 0.5*FC + 0.6*BR + 0.6*SR
|
||||
pan=stereo: FL < FL + 0.5*FC + 0.6*BL + 0.6*SL : FR < FR + 0.5*FC + 0.6*BR + 0.6*SR
|
||||
@end example
|
||||
|
||||
Note that @command{ffmpeg} integrates a default down-mix (and up-mix) system
|
||||
@@ -1774,25 +1805,25 @@ remapping.
|
||||
For example, if you have a 5.1 source and want a stereo audio stream by
|
||||
dropping the extra channels:
|
||||
@example
|
||||
pan="stereo| c0=FL | c1=FR"
|
||||
pan="stereo: c0=FL : c1=FR"
|
||||
@end example
|
||||
|
||||
Given the same source, you can also switch front left and front right channels
|
||||
and keep the input channel layout:
|
||||
@example
|
||||
pan="5.1| c0=c1 | c1=c0 | c2=c2 | c3=c3 | c4=c4 | c5=c5"
|
||||
pan="5.1: c0=c1 : c1=c0 : c2=c2 : c3=c3 : c4=c4 : c5=c5"
|
||||
@end example
|
||||
|
||||
If the input is a stereo audio stream, you can mute the front left channel (and
|
||||
still keep the stereo channel layout) with:
|
||||
@example
|
||||
pan="stereo|c1=c1"
|
||||
pan="stereo:c1=c1"
|
||||
@end example
|
||||
|
||||
Still with a stereo audio stream input, you can copy the right channel in both
|
||||
front left and right:
|
||||
@example
|
||||
pan="stereo| c0=FR | c1=FR"
|
||||
pan="stereo: c0=FR : c1=FR"
|
||||
@end example
|
||||
|
||||
@section replaygain
|
||||
@@ -2521,26 +2552,6 @@ Same as the @ref{subtitles} filter, except that it doesn't require libavcodec
|
||||
and libavformat to work. On the other hand, it is limited to ASS (Advanced
|
||||
Substation Alpha) subtitles files.
|
||||
|
||||
This filter accepts the following option in addition to the common options from
|
||||
the @ref{subtitles} filter:
|
||||
|
||||
@table @option
|
||||
@item shaping
|
||||
Set the shaping engine
|
||||
|
||||
Available values are:
|
||||
@table @samp
|
||||
@item auto
|
||||
The default libass shaping engine, which is the best available.
|
||||
@item simple
|
||||
Fast, font-agnostic shaper that can do only substitutions
|
||||
@item complex
|
||||
Slower shaper using OpenType for substitutions and positioning
|
||||
@end table
|
||||
|
||||
The default is @code{auto}.
|
||||
@end table
|
||||
|
||||
@section bbox
|
||||
|
||||
Compute the bounding box for the non-black pixels in the input frame
|
||||
@@ -4174,7 +4185,7 @@ drawtext='fontfile=Linux Libertine O-40\:style=Semibold:text=FFmpeg'
|
||||
@item
|
||||
Print the date of a real-time encoding (see strftime(3)):
|
||||
@example
|
||||
drawtext='fontfile=FreeSans.ttf:text=%@{localtime\:%a %b %d %Y@}'
|
||||
drawtext='fontfile=FreeSans.ttf:text=%@{localtime:%a %b %d %Y@}'
|
||||
@end example
|
||||
|
||||
@item
|
||||
@@ -4447,10 +4458,6 @@ and VIVTC/VFM (VapourSynth project). The later is a light clone of TFM from
|
||||
which @code{fieldmatch} is based on. While the semantic and usage are very
|
||||
close, some behaviour and options names can differ.
|
||||
|
||||
The @ref{decimate} filter currently only works for constant frame rate input.
|
||||
Do not use @code{fieldmatch} and @ref{decimate} if your input has mixed
|
||||
telecined and progressive content with changing framerate.
|
||||
|
||||
The filter accepts the following options:
|
||||
|
||||
@table @option
|
||||
@@ -5117,22 +5124,6 @@ Modify RGB components depending on pixel position:
|
||||
@example
|
||||
geq=r='X/W*r(X,Y)':g='(1-X/W)*g(X,Y)':b='(H-Y)/H*b(X,Y)'
|
||||
@end example
|
||||
|
||||
@item
|
||||
Create a radial gradient that is the same size as the input (also see
|
||||
the @ref{vignette} filter):
|
||||
@example
|
||||
geq=lum=255*gauss((X/W-0.5)*3)*gauss((Y/H-0.5)*3)/gauss(0)/gauss(0),format=gray
|
||||
@end example
|
||||
|
||||
@item
|
||||
Create a linear gradient to use as a mask for another filter, then
|
||||
compose with @ref{overlay}. In this example the video will gradually
|
||||
become more blurry from the top to the bottom of the y-axis as defined
|
||||
by the linear gradient:
|
||||
@example
|
||||
ffmpeg -i input.mp4 -filter_complex "geq=lum=255*(Y/H),format=gray[grad];[0:v]boxblur=4[blur];[blur][grad]alphamerge[alpha];[0:v][alpha]overlay" output.mp4
|
||||
@end example
|
||||
@end itemize
|
||||
|
||||
@section gradfun
|
||||
@@ -5574,62 +5565,8 @@ value.
|
||||
|
||||
Detect video interlacing type.
|
||||
|
||||
This filter tries to detect if the input frames as interlaced, progressive,
|
||||
top or bottom field first. It will also try and detect fields that are
|
||||
repeated between adjacent frames (a sign of telecine).
|
||||
|
||||
Single frame detection considers only immediately adjacent frames when classifying each frame.
|
||||
Multiple frame detection incorporates the classification history of previous frames.
|
||||
|
||||
The filter will log these metadata values:
|
||||
|
||||
@table @option
|
||||
@item single.current_frame
|
||||
Detected type of current frame using single-frame detection. One of:
|
||||
``tff'' (top field first), ``bff'' (bottom field first),
|
||||
``progressive'', or ``undetermined''
|
||||
|
||||
@item single.tff
|
||||
Cumulative number of frames detected as top field first using single-frame detection.
|
||||
|
||||
@item multiple.tff
|
||||
Cumulative number of frames detected as top field first using multiple-frame detection.
|
||||
|
||||
@item single.bff
|
||||
Cumulative number of frames detected as bottom field first using single-frame detection.
|
||||
|
||||
@item multiple.current_frame
|
||||
Detected type of current frame using multiple-frame detection. One of:
|
||||
``tff'' (top field first), ``bff'' (bottom field first),
|
||||
``progressive'', or ``undetermined''
|
||||
|
||||
@item multiple.bff
|
||||
Cumulative number of frames detected as bottom field first using multiple-frame detection.
|
||||
|
||||
@item single.progressive
|
||||
Cumulative number of frames detected as progressive using single-frame detection.
|
||||
|
||||
@item multiple.progressive
|
||||
Cumulative number of frames detected as progressive using multiple-frame detection.
|
||||
|
||||
@item single.undetermined
|
||||
Cumulative number of frames that could not be classified using single-frame detection.
|
||||
|
||||
@item multiple.undetermined
|
||||
Cumulative number of frames that could not be classified using multiple-frame detection.
|
||||
|
||||
@item repeated.current_frame
|
||||
Which field in the current frame is repeated from the last. One of ``neither'', ``top'', or ``bottom''.
|
||||
|
||||
@item repeated.neither
|
||||
Cumulative number of frames with no repeated field.
|
||||
|
||||
@item repeated.top
|
||||
Cumulative number of frames with the top field repeated from the previous frame's top field.
|
||||
|
||||
@item repeated.bottom
|
||||
Cumulative number of frames with the bottom field repeated from the previous frame's bottom field.
|
||||
@end table
|
||||
This filter tries to detect if the input is interlaced or progressive,
|
||||
top or bottom field first.
|
||||
|
||||
The filter accepts the following options:
|
||||
|
||||
@@ -5638,13 +5575,6 @@ The filter accepts the following options:
|
||||
Set interlacing threshold.
|
||||
@item prog_thres
|
||||
Set progressive threshold.
|
||||
@item repeat_thres
|
||||
Threshold for repeated field detection.
|
||||
@item half_life
|
||||
Number of frames after which a given frame's contribution to the
|
||||
statistics is halved (i.e., it contributes only 0.5 to it's
|
||||
classification). The default of 0 means that all frames seen are given
|
||||
full weight of 1.0 forever.
|
||||
@end table
|
||||
|
||||
@section il
|
||||
@@ -6291,7 +6221,7 @@ values are assumed.
|
||||
|
||||
Refer to the official libopencv documentation for more precise
|
||||
information:
|
||||
@url{http://docs.opencv.org/master/modules/imgproc/doc/filtering.html}
|
||||
@url{http://opencv.willowgarage.com/documentation/c/image_filtering.html}
|
||||
|
||||
Several libopencv filters are supported; see the following subsections.
|
||||
|
||||
@@ -6783,9 +6713,6 @@ A description of the accepted parameters follows.
|
||||
@item y3
|
||||
Set coordinates expression for top left, top right, bottom left and bottom right corners.
|
||||
Default values are @code{0:0:W:0:0:H:W:H} with which perspective will remain unchanged.
|
||||
If the @code{sense} option is set to @code{source}, then the specified points will be sent
|
||||
to the corners of the destination. If the @code{sense} option is set to @code{destination},
|
||||
then the corners of the source will be sent to the specified coordinates.
|
||||
|
||||
The expressions can use the following variables:
|
||||
|
||||
@@ -6805,24 +6732,6 @@ It accepts the following values:
|
||||
@end table
|
||||
|
||||
Default value is @samp{linear}.
|
||||
|
||||
@item sense
|
||||
Set interpretation of coordinate options.
|
||||
|
||||
It accepts the following values:
|
||||
@table @samp
|
||||
@item 0, source
|
||||
|
||||
Send point in the source specified by the given coordinates to
|
||||
the corners of the destination.
|
||||
|
||||
@item 1, destination
|
||||
|
||||
Send the corners of the source to the point in the destination specified
|
||||
by the given coordinates.
|
||||
|
||||
Default value is @samp{source}.
|
||||
@end table
|
||||
@end table
|
||||
|
||||
@section phase
|
||||
@@ -8737,7 +8646,6 @@ ffmpeg -i INPUT -vf trim=duration=1
|
||||
@end itemize
|
||||
|
||||
|
||||
@anchor{unsharp}
|
||||
@section unsharp
|
||||
|
||||
Sharpen or blur the input video.
|
||||
@@ -8899,7 +8807,7 @@ Read a file with transform information for each frame and
|
||||
apply/compensate them. Together with the @ref{vidstabdetect}
|
||||
filter this can be used to deshake videos. See also
|
||||
@url{http://public.hronopik.de/vid.stab}. It is important to also use
|
||||
the @ref{unsharp} filter, see below.
|
||||
the unsharp filter, see below.
|
||||
|
||||
To enable compilation of this filter you need to configure FFmpeg with
|
||||
@code{--enable-libvidstab}.
|
||||
@@ -8909,7 +8817,7 @@ To enable compilation of this filter you need to configure FFmpeg with
|
||||
@table @option
|
||||
@item input
|
||||
Set path to the file used to read the transforms. Default value is
|
||||
@file{transforms.trf}.
|
||||
@file{transforms.trf}).
|
||||
|
||||
@item smoothing
|
||||
Set the number of frames (value*2 + 1) used for lowpass filtering the
|
||||
@@ -8917,9 +8825,9 @@ camera movements. Default value is 10.
|
||||
|
||||
For example a number of 10 means that 21 frames are used (10 in the
|
||||
past and 10 in the future) to smoothen the motion in the video. A
|
||||
larger value leads to a smoother video, but limits the acceleration of
|
||||
the camera (pan/tilt movements). 0 is a special case where a static
|
||||
camera is simulated.
|
||||
larger values leads to a smoother video, but limits the acceleration
|
||||
of the camera (pan/tilt movements). 0 is a special case where a
|
||||
static camera is simulated.
|
||||
|
||||
@item optalgo
|
||||
Set the camera path optimization algorithm.
|
||||
@@ -8956,7 +8864,7 @@ fill the border black
|
||||
Invert transforms if set to 1. Default value is 0.
|
||||
|
||||
@item relative
|
||||
Consider transforms as relative to previous frame if set to 1,
|
||||
Consider transforms as relative to previsou frame if set to 1,
|
||||
absolute if set to 0. Default value is 0.
|
||||
|
||||
@item zoom
|
||||
@@ -9022,7 +8930,7 @@ Use @command{ffmpeg} for a typical stabilization with default values:
|
||||
ffmpeg -i inp.mpeg -vf vidstabtransform,unsharp=5:5:0.8:3:3:0.4 inp_stabilized.mpeg
|
||||
@end example
|
||||
|
||||
Note the use of the @ref{unsharp} filter which is always recommended.
|
||||
Note the use of the unsharp filter which is always recommended.
|
||||
|
||||
@item
|
||||
Zoom in a bit more and load transform data from a given file:
|
||||
@@ -9196,20 +9104,6 @@ Only deinterlace frames marked as interlaced.
|
||||
Default value is @samp{all}.
|
||||
@end table
|
||||
|
||||
@section xbr
|
||||
Apply the xBR high-quality magnification filter which is designed for pixel
|
||||
art. It follows a set of edge-detection rules, see
|
||||
@url{http://www.libretro.com/forums/viewtopic.php?f=6&t=134}.
|
||||
|
||||
It accepts the following option:
|
||||
|
||||
@table @option
|
||||
@item n
|
||||
Set the scaling dimension: @code{2} for @code{2xBR}, @code{3} for
|
||||
@code{3xBR} and @code{4} for @code{4xBR}.
|
||||
Default is @code{3}.
|
||||
@end table
|
||||
|
||||
@anchor{yadif}
|
||||
@section yadif
|
||||
|
||||
|
@@ -55,10 +55,6 @@ Do not merge side data.
|
||||
Enable RTP MP4A-LATM payload.
|
||||
@item nobuffer
|
||||
Reduce the latency introduced by optional buffering
|
||||
@item bitexact
|
||||
Only write platform-, build- and time-independent data.
|
||||
This ensures that file and data checksums are reproducible and match between
|
||||
platforms. Its primary use is for regression testing.
|
||||
@end table
|
||||
|
||||
@item seek2any @var{integer} (@emph{input})
|
||||
@@ -172,18 +168,6 @@ The offset is added by the muxer to the output timestamps.
|
||||
Specifying a positive offset means that the corresponding streams are
|
||||
delayed bt the time duration specified in @var{offset}. Default value
|
||||
is @code{0} (meaning that no offset is applied).
|
||||
|
||||
@item format_whitelist @var{list} (@emph{input})
|
||||
"," separated List of allowed demuxers. By default all are allowed.
|
||||
|
||||
@item dump_separator @var{string} (@emph{input})
|
||||
Separator used to separate the fields printed on the command line about the
|
||||
Stream parameters.
|
||||
For example to separate the fields with newlines and indention:
|
||||
@example
|
||||
ffprobe -dump_separator "
|
||||
" -i ~/videos/matrixbench_mpeg2.mpg
|
||||
@end example
|
||||
@end table
|
||||
|
||||
@c man end FORMAT OPTIONS
|
||||
|
@@ -454,7 +454,6 @@ library:
|
||||
@item Sony Wave64 (W64) @tab X @tab X
|
||||
@item SoX native format @tab X @tab X
|
||||
@item SUN AU format @tab X @tab X
|
||||
@item SUP raw PGS subtitles @tab @tab X
|
||||
@item Text files @tab @tab X
|
||||
@item THP @tab @tab X
|
||||
@tab Used on the Nintendo GameCube.
|
||||
@@ -1031,7 +1030,6 @@ performance on systems without hardware floating point support).
|
||||
@item PJS (Phoenix) @tab @tab X @tab @tab X
|
||||
@item RealText @tab @tab X @tab @tab X
|
||||
@item SAMI @tab @tab X @tab @tab X
|
||||
@item Spruce format (STL) @tab @tab X @tab @tab X
|
||||
@item SSA/ASS @tab X @tab X @tab X @tab X
|
||||
@item SubRip (SRT) @tab X @tab X @tab X @tab X
|
||||
@item SubViewer v1 @tab @tab X @tab @tab X
|
||||
|
142
doc/indevs.texi
142
doc/indevs.texi
@@ -58,94 +58,34 @@ AVFoundation input device.
|
||||
AVFoundation is the currently recommended framework by Apple for streamgrabbing on OSX >= 10.7 as well as on iOS.
|
||||
The older QTKit framework has been marked deprecated since OSX version 10.7.
|
||||
|
||||
The input filename has to be given in the following syntax:
|
||||
@example
|
||||
-i "[[VIDEO]:[AUDIO]]"
|
||||
@end example
|
||||
The first entry selects the video input while the latter selects the audio input.
|
||||
The stream has to be specified by the device name or the device index as shown by the device list.
|
||||
Alternatively, the video and/or audio input device can be chosen by index using the
|
||||
@option{
|
||||
-video_device_index <INDEX>
|
||||
}
|
||||
and/or
|
||||
@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 and corresponding indices.
|
||||
|
||||
There are two device name aliases:
|
||||
@table @code
|
||||
|
||||
@item default
|
||||
Select the AVFoundation default device of the corresponding type.
|
||||
|
||||
@item none
|
||||
Do not record the corresponding media type.
|
||||
This is equivalent to specifying an empty device name or index.
|
||||
|
||||
@end table
|
||||
|
||||
@subsection Options
|
||||
|
||||
AVFoundation supports the following options:
|
||||
|
||||
@table @option
|
||||
|
||||
@item -list_devices <TRUE|FALSE>
|
||||
If set to true, a list of all available input devices is given showing all
|
||||
device names and indices.
|
||||
|
||||
@item -video_device_index <INDEX>
|
||||
Specify the video device by its index. Overrides anything given in the input filename.
|
||||
|
||||
@item -audio_device_index <INDEX>
|
||||
Specify the audio device by its index. Overrides anything given in the input filename.
|
||||
|
||||
@item -pixel_format <FORMAT>
|
||||
Request the video device to use a specific pixel format.
|
||||
If the specified format is not supported, a list of available formats is given
|
||||
und the first one in this list is used instead. Available pixel formats are:
|
||||
@code{monob, rgb555be, rgb555le, rgb565be, rgb565le, rgb24, bgr24, 0rgb, bgr0, 0bgr, rgb0,
|
||||
The filename passed as input is parsed to contain either a device name or index.
|
||||
The device index can also be given by using -video_device_index.
|
||||
A given device index will override any given device name.
|
||||
If the desired device consists of numbers only, use -video_device_index to identify it.
|
||||
The default device will be chosen if an empty string or the device name "default" is given.
|
||||
The available devices can be enumerated by using -list_devices.
|
||||
The pixel format can be set using -pixel_format.
|
||||
Available formats:
|
||||
monob, rgb555be, rgb555le, rgb565be, rgb565le, rgb24, bgr24, 0rgb, bgr0, 0bgr, rgb0,
|
||||
bgr48be, uyvy422, yuva444p, yuva444p16le, yuv444p, yuv422p16, yuv422p10, yuv444p10,
|
||||
yuv420p, nv12, yuyv422, gray}
|
||||
yuv420p, nv12, yuyv422, gray
|
||||
|
||||
@end table
|
||||
|
||||
@subsection Examples
|
||||
|
||||
@itemize
|
||||
|
||||
@item
|
||||
Print the list of AVFoundation supported devices and exit:
|
||||
@example
|
||||
$ ffmpeg -f avfoundation -list_devices true -i ""
|
||||
ffmpeg -f avfoundation -i "0" out.mpg
|
||||
@end example
|
||||
|
||||
@item
|
||||
Record video from video device 0 and audio from audio device 0 into out.avi:
|
||||
@example
|
||||
$ ffmpeg -f avfoundation -i "0:0" out.avi
|
||||
ffmpeg -f avfoundation -video_device_index 0 -i "" out.mpg
|
||||
@end example
|
||||
|
||||
@item
|
||||
Record video from video device 2 and audio from audio device 1 into out.avi:
|
||||
@example
|
||||
$ ffmpeg -f avfoundation -video_device_index 2 -i ":1" out.avi
|
||||
ffmpeg -f avfoundation -pixel_format bgr0 -i "default" out.mpg
|
||||
@end example
|
||||
|
||||
@item
|
||||
Record video from the system default video device using the pixel format bgr0 and do not record any audio into out.avi:
|
||||
@example
|
||||
$ ffmpeg -f avfoundation -pixel_format bgr0 -i "default:none" out.avi
|
||||
ffmpeg -f avfoundation -list_devices true -i ""
|
||||
@end example
|
||||
|
||||
@end itemize
|
||||
|
||||
@section bktr
|
||||
|
||||
BSD video input device.
|
||||
@@ -982,58 +922,4 @@ Use the MIT-SHM extension for shared memory. Default value is @code{1}.
|
||||
It may be necessary to disable it for remote displays.
|
||||
@end table
|
||||
|
||||
@section decklink
|
||||
|
||||
The decklink input device provides capture capabilities for Blackmagic
|
||||
DeckLink devices.
|
||||
|
||||
To enable this input device, you need the Blackmagic DeckLink SDK and you
|
||||
need to configure with the appropriate @code{--extra-cflags}
|
||||
and @code{--extra-ldflags}.
|
||||
On Windows, you need to run the IDL files through @command{widl}.
|
||||
|
||||
DeckLink is very picky about the formats it supports. Pixel format is always
|
||||
uyvy422, framerate and video size must be determined for your device with
|
||||
@command{-list_formats 1}. Audio sample rate is always 48 kHz and the number
|
||||
of channels currently is limited to 2 (stereo).
|
||||
|
||||
@subsection Options
|
||||
|
||||
@table @option
|
||||
|
||||
@item list_devices
|
||||
If set to @option{true}, print a list of devices and exit.
|
||||
Defaults to @option{false}.
|
||||
|
||||
@item list_formats
|
||||
If set to @option{true}, print a list of supported formats and exit.
|
||||
Defaults to @option{false}.
|
||||
|
||||
@end table
|
||||
|
||||
@subsection Examples
|
||||
|
||||
@itemize
|
||||
|
||||
@item
|
||||
List input devices:
|
||||
@example
|
||||
ffmpeg -f decklink -list_devices 1 -i dummy
|
||||
@end example
|
||||
|
||||
@item
|
||||
List supported formats:
|
||||
@example
|
||||
ffmpeg -f decklink -list_formats 1 -i 'Intensity Pro'
|
||||
@end example
|
||||
|
||||
@item
|
||||
Capture video clip at 1080i50 (format 11):
|
||||
@example
|
||||
ffmpeg -f decklink -i 'Intensity Pro@@11' -acodec copy -vcodec copy output.avi
|
||||
@end example
|
||||
|
||||
@end itemize
|
||||
|
||||
|
||||
@c man end INPUT DEVICES
|
||||
|
@@ -194,19 +194,15 @@ can not be smaller than one centi second.
|
||||
Apple HTTP Live Streaming muxer that segments MPEG-TS according to
|
||||
the HTTP Live Streaming (HLS) specification.
|
||||
|
||||
It creates a playlist file, and one or more segment files. The output filename
|
||||
specifies the playlist filename.
|
||||
|
||||
By default, the muxer creates a file for each segment produced. These files
|
||||
have the same name as the playlist, followed by a sequential number and a
|
||||
.ts extension.
|
||||
It creates a playlist file and numbered segment files. The output
|
||||
filename specifies the playlist filename; the segment filenames
|
||||
receive the same basename as the playlist, a sequential number and
|
||||
a .ts extension.
|
||||
|
||||
For example, to convert an input file with @command{ffmpeg}:
|
||||
@example
|
||||
ffmpeg -i in.nut out.m3u8
|
||||
@end example
|
||||
This example will produce the playlist, @file{out.m3u8}, and segment files:
|
||||
@file{out0.ts}, @file{out1.ts}, @file{out2.ts}, etc.
|
||||
|
||||
See also the @ref{segment} muxer, which provides a more generic and
|
||||
flexible implementation of a segmenter, and can be used to perform HLS
|
||||
@@ -224,11 +220,6 @@ Set the segment length in seconds. Default value is 2.
|
||||
Set the maximum number of playlist entries. If set to 0 the list file
|
||||
will contain all the segments. Default value is 5.
|
||||
|
||||
@item hls_ts_options @var{options_list}
|
||||
Set output format options using a :-separated list of key=value
|
||||
parameters. Values containing @code{:} special characters must be
|
||||
escaped.
|
||||
|
||||
@item hls_wrap @var{wrap}
|
||||
Set the number after which the segment filename number (the number
|
||||
specified in each segment file) wraps. If set to 0 the number will be
|
||||
@@ -242,9 +233,6 @@ to @var{wrap}.
|
||||
Start the playlist sequence number from @var{number}. Default value is
|
||||
0.
|
||||
|
||||
@item hls_allow_cache @var{allowcache}
|
||||
Explicitly set whether the client MAY (1) or MUST NOT (0) cache media segments.
|
||||
|
||||
@item hls_base_url @var{baseurl}
|
||||
Append @var{baseurl} to every entry in the playlist.
|
||||
Useful to generate playlists with absolute paths.
|
||||
@@ -253,17 +241,6 @@ Note that the playlist sequence number must be unique for each segment
|
||||
and it is not to be confused with the segment filename sequence number
|
||||
which can be cyclic, for example if the @option{wrap} option is
|
||||
specified.
|
||||
|
||||
@item hls_flags single_file
|
||||
If this flag is set, the muxer will store all segments in a single MPEG-TS
|
||||
file, and will use byte ranges in the playlist. HLS playlists generated with
|
||||
this way will have the version number 4.
|
||||
For example:
|
||||
@example
|
||||
ffmpeg -i in.nut -hls_flags single_file out.m3u8
|
||||
@end example
|
||||
Will produce the playlist, @file{out.m3u8}, and a single segment file,
|
||||
@file{out.ts}.
|
||||
@end table
|
||||
|
||||
@anchor{ico}
|
||||
@@ -559,6 +536,7 @@ a short portion of the file. With this option set, there is no initial
|
||||
mdat atom, and the moov atom only describes the tracks but has
|
||||
a zero duration.
|
||||
|
||||
Files written with this option set do not work in QuickTime.
|
||||
This option is implicitly set when writing ismv (Smooth Streaming) files.
|
||||
@item -movflags separate_moof
|
||||
Write a separate moof (movie fragment) atom for each track. Normally,
|
||||
@@ -579,16 +557,6 @@ and a QuickTime chapter track are written to the file. With this option
|
||||
set, only the QuickTime chapter track will be written. Nero chapters can
|
||||
cause failures when the file is reprocessed with certain tagging programs, like
|
||||
mp3Tag 2.61a and iTunes 11.3, most likely other versions are affected as well.
|
||||
@item -movflags omit_tfhd_offset
|
||||
Do not write any absolute base_data_offset in tfhd atoms. This avoids
|
||||
tying fragments to absolute byte positions in the file/streams.
|
||||
@item -movflags default_base_moof
|
||||
Similarly to the omit_tfhd_offset, this flag avoids writing the
|
||||
absolute base_data_offset field in tfhd atoms, but does so by using
|
||||
the new default-base-is-moof flag instead. This flag is new from
|
||||
14496-12:2012. This may make the fragments easier to parse in certain
|
||||
circumstances (avoiding basing track fragment location calculations
|
||||
on the implicit end of the previous track fragment).
|
||||
@end table
|
||||
|
||||
@subsection Example
|
||||
@@ -601,38 +569,29 @@ ffmpeg -re @var{<normal input/transcoding options>} -movflags isml+frag_keyframe
|
||||
|
||||
@section mp3
|
||||
|
||||
The MP3 muxer writes a raw MP3 stream with the following optional features:
|
||||
@itemize @bullet
|
||||
@item
|
||||
An ID3v2 metadata header at the beginning (enabled by default). Versions 2.3 and
|
||||
2.4 are supported, the @code{id3v2_version} private option controls which one is
|
||||
used (3 or 4). Setting @code{id3v2_version} to 0 disables the ID3v2 header
|
||||
completely.
|
||||
The MP3 muxer writes a raw MP3 stream with an ID3v2 header at the beginning and
|
||||
optionally an ID3v1 tag at the end. ID3v2.3 and ID3v2.4 are supported, the
|
||||
@code{id3v2_version} option controls which one is used. Setting
|
||||
@code{id3v2_version} to 0 will disable the ID3v2 header completely. The legacy
|
||||
ID3v1 tag is not written by default, but may be enabled with the
|
||||
@code{write_id3v1} option.
|
||||
|
||||
The muxer supports writing attached pictures (APIC frames) to the ID3v2 header.
|
||||
The pictures are supplied to the muxer in form of a video stream with a single
|
||||
packet. There can be any number of those streams, each will correspond to a
|
||||
single APIC frame. The stream metadata tags @var{title} and @var{comment} map
|
||||
to APIC @var{description} and @var{picture type} respectively. See
|
||||
The muxer may also write a Xing frame at the beginning, which contains the
|
||||
number of frames in the file. It is useful for computing duration of VBR files.
|
||||
The Xing frame is written if the output stream is seekable and if the
|
||||
@code{write_xing} option is set to 1 (the default).
|
||||
|
||||
The muxer supports writing ID3v2 attached pictures (APIC frames). The pictures
|
||||
are supplied to the muxer in form of a video stream with a single packet. There
|
||||
can be any number of those streams, each will correspond to a single APIC frame.
|
||||
The stream metadata tags @var{title} and @var{comment} map to APIC
|
||||
@var{description} and @var{picture type} respectively. See
|
||||
@url{http://id3.org/id3v2.4.0-frames} for allowed picture types.
|
||||
|
||||
Note that the APIC frames must be written at the beginning, so the muxer will
|
||||
buffer the audio frames until it gets all the pictures. It is therefore advised
|
||||
to provide the pictures as soon as possible to avoid excessive buffering.
|
||||
|
||||
@item
|
||||
A Xing/LAME frame right after the ID3v2 header (if present). It is enabled by
|
||||
default, but will be written only if the output is seekable. The
|
||||
@code{write_xing} private option can be used to disable it. The frame contains
|
||||
various information that may be useful to the decoder, like the audio duration
|
||||
or encoder delay.
|
||||
|
||||
@item
|
||||
A legacy ID3v1 tag at the end of the file (disabled by default). It may be
|
||||
enabled with the @code{write_id3v1} private option, but as its capabilities are
|
||||
very limited, its usage is not recommended.
|
||||
@end itemize
|
||||
|
||||
Examples:
|
||||
|
||||
Write an mp3 with an ID3v2.3 header and an ID3v1 footer:
|
||||
|
@@ -26,10 +26,6 @@
|
||||
#include <string.h>
|
||||
#include <float.h>
|
||||
|
||||
// print_options is build for the host, os_support.h isn't needed and is setup
|
||||
// for the target. without this build breaks on mingw
|
||||
#define AVFORMAT_OS_SUPPORT_H
|
||||
|
||||
#include "libavformat/avformat.h"
|
||||
#include "libavformat/options_table.h"
|
||||
#include "libavcodec/avcodec.h"
|
||||
|
@@ -750,7 +750,7 @@ port will be used for the local RTP and RTCP ports.
|
||||
|
||||
@item
|
||||
If @option{localrtcpport} (the local RTCP port) is not set it will be
|
||||
set to the local RTP port value plus 1.
|
||||
set to the the local RTP port value plus 1.
|
||||
@end enumerate
|
||||
|
||||
@section rtsp
|
||||
|
@@ -16,15 +16,16 @@ outputs the modified frame. The most simple way of doing this is to take a
|
||||
similar filter. We'll pick edgedetect, but any other should do. You can look
|
||||
for others using the `./ffmpeg -v 0 -filters|grep ' V->V '` command.
|
||||
|
||||
- sed 's/edgedetect/foobar/g;s/EdgeDetect/Foobar/g' libavfilter/vf_edgedetect.c > libavfilter/vf_foobar.c
|
||||
- cp libavfilter/vf_{edgedetect,foobar}.c
|
||||
- sed -i s/edgedetect/foobar/g -i libavfilter/vf_foobar.c
|
||||
- sed -i s/EdgeDetect/Foobar/g -i libavfilter/vf_foobar.c
|
||||
- edit libavfilter/Makefile, and add an entry for "foobar" following the
|
||||
pattern of the other filters.
|
||||
- edit libavfilter/allfilters.c, and add an entry for "foobar" following the
|
||||
pattern of the other filters.
|
||||
- ./configure ...
|
||||
- make -j<whatever> ffmpeg
|
||||
- ./ffmpeg -i http://samples.ffmpeg.org/image-samples/lena.pnm -vf foobar foobar.png
|
||||
Note here: you can obviously use a random local image instead of a remote URL.
|
||||
- ./ffmpeg -i tests/lena.pnm -vf foobar foobar.png
|
||||
|
||||
If everything went right, you should get a foobar.png with Lena edge-detected.
|
||||
|
||||
|
181
ffmpeg.c
181
ffmpeg.c
@@ -475,7 +475,6 @@ static void ffmpeg_cleanup(int ret)
|
||||
}
|
||||
ost->bitstream_filters = NULL;
|
||||
av_frame_free(&ost->filtered_frame);
|
||||
av_frame_free(&ost->last_frame);
|
||||
|
||||
av_parser_close(ost->parser);
|
||||
|
||||
@@ -623,11 +622,7 @@ static void write_frame(AVFormatContext *s, AVPacket *pkt, OutputStream *ost)
|
||||
|
||||
while (bsfc) {
|
||||
AVPacket new_pkt = *pkt;
|
||||
AVDictionaryEntry *bsf_arg = av_dict_get(ost->bsf_args,
|
||||
bsfc->filter->name,
|
||||
NULL, 0);
|
||||
int a = av_bitstream_filter_filter(bsfc, avctx,
|
||||
bsf_arg ? bsf_arg->value : NULL,
|
||||
int a = av_bitstream_filter_filter(bsfc, avctx, NULL,
|
||||
&new_pkt.data, &new_pkt.size,
|
||||
pkt->data, pkt->size,
|
||||
pkt->flags & AV_PKT_FLAG_KEY);
|
||||
@@ -664,17 +659,6 @@ static void write_frame(AVFormatContext *s, AVPacket *pkt, OutputStream *ost)
|
||||
}
|
||||
|
||||
if (!(s->oformat->flags & AVFMT_NOTIMESTAMPS)) {
|
||||
if (pkt->dts != AV_NOPTS_VALUE &&
|
||||
pkt->pts != AV_NOPTS_VALUE &&
|
||||
pkt->dts > pkt->pts) {
|
||||
av_log(s, AV_LOG_WARNING, "Invalid DTS: %"PRId64" PTS: %"PRId64" in output stream %d:%d, replacing by guess\n",
|
||||
pkt->dts, pkt->pts,
|
||||
ost->file_index, ost->st->index);
|
||||
pkt->pts =
|
||||
pkt->dts = pkt->pts + pkt->dts + ost->last_mux_dts + 1
|
||||
- FFMIN3(pkt->pts, pkt->dts, ost->last_mux_dts + 1)
|
||||
- FFMAX3(pkt->pts, pkt->dts, ost->last_mux_dts + 1);
|
||||
}
|
||||
if(
|
||||
(avctx->codec_type == AVMEDIA_TYPE_AUDIO || avctx->codec_type == AVMEDIA_TYPE_VIDEO) &&
|
||||
pkt->dts != AV_NOPTS_VALUE &&
|
||||
@@ -697,6 +681,15 @@ static void write_frame(AVFormatContext *s, AVPacket *pkt, OutputStream *ost)
|
||||
pkt->dts = max;
|
||||
}
|
||||
}
|
||||
if (pkt->dts != AV_NOPTS_VALUE &&
|
||||
pkt->pts != AV_NOPTS_VALUE &&
|
||||
pkt->dts > pkt->pts) {
|
||||
av_log(s, AV_LOG_WARNING, "Invalid DTS: %"PRId64" PTS: %"PRId64" in output stream %d:%d\n",
|
||||
pkt->dts, pkt->pts,
|
||||
ost->file_index, ost->st->index);
|
||||
pkt->pts = AV_NOPTS_VALUE;
|
||||
pkt->dts = AV_NOPTS_VALUE;
|
||||
}
|
||||
}
|
||||
ost->last_mux_dts = pkt->dts;
|
||||
|
||||
@@ -879,14 +872,14 @@ static void do_subtitle_out(AVFormatContext *s,
|
||||
|
||||
static void do_video_out(AVFormatContext *s,
|
||||
OutputStream *ost,
|
||||
AVFrame *next_picture)
|
||||
AVFrame *in_picture)
|
||||
{
|
||||
int ret, format_video_sync;
|
||||
AVPacket pkt;
|
||||
AVCodecContext *enc = ost->enc_ctx;
|
||||
AVCodecContext *mux_enc = ost->st->codec;
|
||||
int nb_frames, nb0_frames, i;
|
||||
double sync_ipts, delta, delta0;
|
||||
int nb_frames, i;
|
||||
double sync_ipts, delta;
|
||||
double duration = 0;
|
||||
int frame_size = 0;
|
||||
InputStream *ist = NULL;
|
||||
@@ -897,20 +890,10 @@ static void do_video_out(AVFormatContext *s,
|
||||
if(ist && ist->st->start_time != AV_NOPTS_VALUE && ist->st->first_dts != AV_NOPTS_VALUE && ost->frame_rate.num)
|
||||
duration = 1/(av_q2d(ost->frame_rate) * av_q2d(enc->time_base));
|
||||
|
||||
if (!ost->filters_script &&
|
||||
!ost->filters &&
|
||||
next_picture &&
|
||||
ist &&
|
||||
lrintf(av_frame_get_pkt_duration(next_picture) * av_q2d(ist->st->time_base) / av_q2d(enc->time_base)) > 0) {
|
||||
duration = lrintf(av_frame_get_pkt_duration(next_picture) * av_q2d(ist->st->time_base) / av_q2d(enc->time_base));
|
||||
}
|
||||
|
||||
sync_ipts = next_picture->pts;
|
||||
delta0 = sync_ipts - ost->sync_opts;
|
||||
delta = delta0 + duration;
|
||||
sync_ipts = in_picture->pts;
|
||||
delta = sync_ipts - ost->sync_opts + duration;
|
||||
|
||||
/* by default, we output a single frame */
|
||||
nb0_frames = 0;
|
||||
nb_frames = 1;
|
||||
|
||||
format_video_sync = video_sync_method;
|
||||
@@ -930,34 +913,19 @@ static void do_video_out(AVFormatContext *s,
|
||||
}
|
||||
}
|
||||
|
||||
if (delta0 < 0 &&
|
||||
delta > 0 &&
|
||||
format_video_sync != VSYNC_PASSTHROUGH &&
|
||||
format_video_sync != VSYNC_DROP) {
|
||||
double cor = FFMIN(-delta0, duration);
|
||||
av_log(NULL, AV_LOG_WARNING, "Past duration %f too large\n", -delta0);
|
||||
sync_ipts += cor;
|
||||
duration -= cor;
|
||||
delta0 += cor;
|
||||
}
|
||||
|
||||
switch (format_video_sync) {
|
||||
case VSYNC_VSCFR:
|
||||
if (ost->frame_number == 0 && delta - duration >= 0.5) {
|
||||
av_log(NULL, AV_LOG_DEBUG, "Not duplicating %d initial frames\n", (int)lrintf(delta - duration));
|
||||
delta = duration;
|
||||
delta0 = 0;
|
||||
ost->sync_opts = lrint(sync_ipts);
|
||||
}
|
||||
case VSYNC_CFR:
|
||||
// FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
|
||||
if (delta < -1.1)
|
||||
nb_frames = 0;
|
||||
else if (delta > 1.1) {
|
||||
else if (delta > 1.1)
|
||||
nb_frames = lrintf(delta);
|
||||
if (delta0 > 1.1)
|
||||
nb0_frames = lrintf(delta0 - 0.6);
|
||||
}
|
||||
break;
|
||||
case VSYNC_VFR:
|
||||
if (delta <= -0.6)
|
||||
@@ -974,36 +942,28 @@ static void do_video_out(AVFormatContext *s,
|
||||
}
|
||||
|
||||
nb_frames = FFMIN(nb_frames, ost->max_frames - ost->frame_number);
|
||||
nb0_frames = FFMIN(nb0_frames, nb_frames);
|
||||
if (nb0_frames == 0 && ost->last_droped) {
|
||||
if (nb_frames == 0) {
|
||||
nb_frames_drop++;
|
||||
av_log(NULL, AV_LOG_VERBOSE,
|
||||
"*** dropping frame %d from stream %d at ts %"PRId64"\n",
|
||||
ost->frame_number, ost->st->index, ost->last_frame->pts);
|
||||
}
|
||||
if (nb_frames > (nb0_frames && ost->last_droped) + (nb_frames > nb0_frames)) {
|
||||
ost->frame_number, ost->st->index, in_picture->pts);
|
||||
return;
|
||||
} else if (nb_frames > 1) {
|
||||
if (nb_frames > dts_error_threshold * 30) {
|
||||
av_log(NULL, AV_LOG_ERROR, "%d frame duplication too large, skipping\n", nb_frames - 1);
|
||||
nb_frames_drop++;
|
||||
return;
|
||||
}
|
||||
nb_frames_dup += nb_frames - (nb0_frames && ost->last_droped) - (nb_frames > nb0_frames);
|
||||
nb_frames_dup += nb_frames - 1;
|
||||
av_log(NULL, AV_LOG_VERBOSE, "*** %d dup!\n", nb_frames - 1);
|
||||
}
|
||||
ost->last_droped = nb_frames == nb0_frames;
|
||||
|
||||
/* duplicates frame if needed */
|
||||
for (i = 0; i < nb_frames; i++) {
|
||||
AVFrame *in_picture;
|
||||
av_init_packet(&pkt);
|
||||
pkt.data = NULL;
|
||||
pkt.size = 0;
|
||||
|
||||
if (i < nb0_frames && ost->last_frame) {
|
||||
in_picture = ost->last_frame;
|
||||
} else
|
||||
in_picture = next_picture;
|
||||
|
||||
in_picture->pts = ost->sync_opts;
|
||||
|
||||
#if 1
|
||||
@@ -1045,7 +1005,8 @@ static void do_video_out(AVFormatContext *s,
|
||||
mux_enc->field_order = AV_FIELD_PROGRESSIVE;
|
||||
|
||||
in_picture->quality = enc->global_quality;
|
||||
in_picture->pict_type = 0;
|
||||
if (!enc->me_threshold)
|
||||
in_picture->pict_type = 0;
|
||||
|
||||
pts_time = in_picture->pts != AV_NOPTS_VALUE ?
|
||||
in_picture->pts * av_q2d(enc->time_base) : NAN;
|
||||
@@ -1139,11 +1100,6 @@ static void do_video_out(AVFormatContext *s,
|
||||
if (vstats_filename && frame_size)
|
||||
do_video_stats(ost, frame_size);
|
||||
}
|
||||
|
||||
if (!ost->last_frame)
|
||||
ost->last_frame = av_frame_alloc();
|
||||
av_frame_unref(ost->last_frame);
|
||||
av_frame_ref(ost->last_frame, next_picture);
|
||||
}
|
||||
|
||||
static double psnr(double d)
|
||||
@@ -1312,6 +1268,7 @@ static void print_final_stats(int64_t total_size)
|
||||
if (data_size && total_size>0 && total_size >= data_size)
|
||||
percent = 100.0 * (total_size - data_size) / data_size;
|
||||
|
||||
av_log(NULL, AV_LOG_INFO, "\n");
|
||||
av_log(NULL, AV_LOG_INFO, "video:%1.0fkB audio:%1.0fkB subtitle:%1.0fkB other streams:%1.0fkB global headers:%1.0fkB muxing overhead: ",
|
||||
video_size / 1024.0,
|
||||
audio_size / 1024.0,
|
||||
@@ -1502,8 +1459,6 @@ static void print_report(int is_last_report, int64_t timer_start, int64_t cur_ti
|
||||
if (av_stream_get_end_pts(ost->st) != AV_NOPTS_VALUE)
|
||||
pts = FFMAX(pts, av_rescale_q(av_stream_get_end_pts(ost->st),
|
||||
ost->st->time_base, AV_TIME_BASE_Q));
|
||||
if (is_last_report)
|
||||
nb_frames_drop += ost->last_droped;
|
||||
}
|
||||
|
||||
secs = pts / AV_TIME_BASE;
|
||||
@@ -1539,11 +1494,10 @@ static void print_report(int is_last_report, int64_t timer_start, int64_t cur_ti
|
||||
av_bprintf(&buf_script, "drop_frames=%d\n", nb_frames_drop);
|
||||
|
||||
if (print_stats || is_last_report) {
|
||||
const char end = is_last_report ? '\n' : '\r';
|
||||
if (print_stats==1 && AV_LOG_INFO > av_log_get_level()) {
|
||||
fprintf(stderr, "%s %c", buf, end);
|
||||
fprintf(stderr, "%s \r", buf);
|
||||
} else
|
||||
av_log(NULL, AV_LOG_INFO, "%s %c", buf, end);
|
||||
av_log(NULL, AV_LOG_INFO, "%s \r", buf);
|
||||
|
||||
fflush(stderr);
|
||||
}
|
||||
@@ -1950,20 +1904,6 @@ static int decode_video(InputStream *ist, AVPacket *pkt, int *got_output)
|
||||
if (*got_output || ret<0 || pkt->size)
|
||||
decode_error_stat[ret<0] ++;
|
||||
|
||||
if (*got_output && ret >= 0) {
|
||||
if (ist->dec_ctx->width != decoded_frame->width ||
|
||||
ist->dec_ctx->height != decoded_frame->height ||
|
||||
ist->dec_ctx->pix_fmt != decoded_frame->format) {
|
||||
av_log(NULL, AV_LOG_DEBUG, "Frame parameters mismatch context %d,%d,%d != %d,%d,%d\n",
|
||||
decoded_frame->width,
|
||||
decoded_frame->height,
|
||||
decoded_frame->format,
|
||||
ist->dec_ctx->width,
|
||||
ist->dec_ctx->height,
|
||||
ist->dec_ctx->pix_fmt);
|
||||
}
|
||||
}
|
||||
|
||||
if (!*got_output || ret < 0) {
|
||||
if (!pkt->size) {
|
||||
for (i = 0; i < ist->nb_filters; i++)
|
||||
@@ -2180,11 +2120,11 @@ static int process_input_packet(InputStream *ist, const AVPacket *pkt)
|
||||
ret = decode_video (ist, &avpkt, &got_output);
|
||||
if (avpkt.duration) {
|
||||
duration = av_rescale_q(avpkt.duration, ist->st->time_base, AV_TIME_BASE_Q);
|
||||
} else if(ist->dec_ctx->framerate.num != 0 && ist->dec_ctx->framerate.den != 0) {
|
||||
} else if(ist->dec_ctx->time_base.num != 0 && ist->dec_ctx->time_base.den != 0) {
|
||||
int ticks= av_stream_get_parser(ist->st) ? av_stream_get_parser(ist->st)->repeat_pict+1 : ist->dec_ctx->ticks_per_frame;
|
||||
duration = ((int64_t)AV_TIME_BASE *
|
||||
ist->dec_ctx->framerate.den * ticks) /
|
||||
ist->dec_ctx->framerate.num / ist->dec_ctx->ticks_per_frame;
|
||||
ist->dec_ctx->time_base.num * ticks) /
|
||||
ist->dec_ctx->time_base.den;
|
||||
} else
|
||||
duration = 0;
|
||||
|
||||
@@ -2239,11 +2179,11 @@ static int process_input_packet(InputStream *ist, const AVPacket *pkt)
|
||||
ist->next_dts = av_rescale_q(next_dts + 1, av_inv_q(ist->framerate), time_base_q);
|
||||
} else if (pkt->duration) {
|
||||
ist->next_dts += av_rescale_q(pkt->duration, ist->st->time_base, AV_TIME_BASE_Q);
|
||||
} else if(ist->dec_ctx->framerate.num != 0) {
|
||||
} else if(ist->dec_ctx->time_base.num != 0) {
|
||||
int ticks= av_stream_get_parser(ist->st) ? av_stream_get_parser(ist->st)->repeat_pict + 1 : ist->dec_ctx->ticks_per_frame;
|
||||
ist->next_dts += ((int64_t)AV_TIME_BASE *
|
||||
ist->dec_ctx->framerate.den * ticks) /
|
||||
ist->dec_ctx->framerate.num / ist->dec_ctx->ticks_per_frame;
|
||||
ist->dec_ctx->time_base.num * ticks) /
|
||||
ist->dec_ctx->time_base.den;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -2521,7 +2461,7 @@ static int transcode_init(void)
|
||||
AVFormatContext *oc;
|
||||
OutputStream *ost;
|
||||
InputStream *ist;
|
||||
char error[1024];
|
||||
char error[1024] = {0};
|
||||
int want_sdp = 1;
|
||||
|
||||
for (i = 0; i < nb_filtergraphs; i++) {
|
||||
@@ -2679,26 +2619,6 @@ static int transcode_init(void)
|
||||
av_reduce(&enc_ctx->time_base.num, &enc_ctx->time_base.den,
|
||||
enc_ctx->time_base.num, enc_ctx->time_base.den, INT_MAX);
|
||||
|
||||
if (ist->st->nb_side_data) {
|
||||
ost->st->side_data = av_realloc_array(NULL, ist->st->nb_side_data,
|
||||
sizeof(*ist->st->side_data));
|
||||
if (!ost->st->side_data)
|
||||
return AVERROR(ENOMEM);
|
||||
|
||||
for (j = 0; j < ist->st->nb_side_data; j++) {
|
||||
const AVPacketSideData *sd_src = &ist->st->side_data[j];
|
||||
AVPacketSideData *sd_dst = &ost->st->side_data[j];
|
||||
|
||||
sd_dst->data = av_malloc(sd_src->size);
|
||||
if (!sd_dst->data)
|
||||
return AVERROR(ENOMEM);
|
||||
memcpy(sd_dst->data, sd_src->data, sd_src->size);
|
||||
sd_dst->size = sd_src->size;
|
||||
sd_dst->type = sd_src->type;
|
||||
ost->st->nb_side_data++;
|
||||
}
|
||||
}
|
||||
|
||||
ost->parser = av_parser_init(enc_ctx->codec_id);
|
||||
|
||||
switch (enc_ctx->codec_type) {
|
||||
@@ -2713,10 +2633,7 @@ static int transcode_init(void)
|
||||
enc_ctx->frame_size = dec_ctx->frame_size;
|
||||
enc_ctx->audio_service_type = dec_ctx->audio_service_type;
|
||||
enc_ctx->block_align = dec_ctx->block_align;
|
||||
enc_ctx->initial_padding = dec_ctx->delay;
|
||||
#if FF_API_AUDIOENC_DELAY
|
||||
enc_ctx->delay = dec_ctx->delay;
|
||||
#endif
|
||||
if((enc_ctx->block_align == 1 || enc_ctx->block_align == 1152 || enc_ctx->block_align == 576) && enc_ctx->codec_id == AV_CODEC_ID_MP3)
|
||||
enc_ctx->block_align= 0;
|
||||
if(enc_ctx->codec_id == AV_CODEC_ID_AC3)
|
||||
@@ -2963,11 +2880,10 @@ static int transcode_init(void)
|
||||
av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
|
||||
" It takes bits/s as argument, not kbits/s\n");
|
||||
} else {
|
||||
ret = av_opt_set_dict(ost->enc_ctx, &ost->encoder_opts);
|
||||
if (ret < 0) {
|
||||
if (av_opt_set_dict(ost->enc_ctx, &ost->encoder_opts) < 0) {
|
||||
av_log(NULL, AV_LOG_FATAL,
|
||||
"Error setting up codec context options.\n");
|
||||
return ret;
|
||||
exit_program(1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3167,9 +3083,9 @@ static OutputStream *choose_output(void)
|
||||
OutputStream *ost = output_streams[i];
|
||||
int64_t opts = av_rescale_q(ost->st->cur_dts, ost->st->time_base,
|
||||
AV_TIME_BASE_Q);
|
||||
if (!ost->finished && opts < opts_min) {
|
||||
if (!ost->unavailable && !ost->finished && opts < opts_min) {
|
||||
opts_min = opts;
|
||||
ost_min = ost->unavailable ? NULL : ost;
|
||||
ost_min = ost;
|
||||
}
|
||||
}
|
||||
return ost_min;
|
||||
@@ -3547,14 +3463,13 @@ static int process_input(int file_index)
|
||||
if (pkt.dts != AV_NOPTS_VALUE)
|
||||
pkt.dts *= ist->ts_scale;
|
||||
|
||||
if ((ist->dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO ||
|
||||
ist->dec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) &&
|
||||
pkt.dts != AV_NOPTS_VALUE && ist->next_dts == AV_NOPTS_VALUE && !copy_ts
|
||||
if (pkt.dts != AV_NOPTS_VALUE && ist->next_dts == AV_NOPTS_VALUE && !copy_ts
|
||||
&& (is->iformat->flags & AVFMT_TS_DISCONT) && ifile->last_ts != AV_NOPTS_VALUE) {
|
||||
int64_t pkt_dts = av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
|
||||
int64_t delta = pkt_dts - ifile->last_ts;
|
||||
if (delta < -1LL*dts_delta_threshold*AV_TIME_BASE ||
|
||||
delta > 1LL*dts_delta_threshold*AV_TIME_BASE){
|
||||
if(delta < -1LL*dts_delta_threshold*AV_TIME_BASE ||
|
||||
(delta > 1LL*dts_delta_threshold*AV_TIME_BASE &&
|
||||
ist->dec_ctx->codec_type != AVMEDIA_TYPE_SUBTITLE)){
|
||||
ifile->ts_offset -= delta;
|
||||
av_log(NULL, AV_LOG_DEBUG,
|
||||
"Inter stream timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
|
||||
@@ -3565,15 +3480,14 @@ static int process_input(int file_index)
|
||||
}
|
||||
}
|
||||
|
||||
if ((ist->dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO ||
|
||||
ist->dec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) &&
|
||||
pkt.dts != AV_NOPTS_VALUE && ist->next_dts != AV_NOPTS_VALUE &&
|
||||
if (pkt.dts != AV_NOPTS_VALUE && ist->next_dts != AV_NOPTS_VALUE &&
|
||||
!copy_ts) {
|
||||
int64_t pkt_dts = av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
|
||||
int64_t delta = pkt_dts - ist->next_dts;
|
||||
if (is->iformat->flags & AVFMT_TS_DISCONT) {
|
||||
if (delta < -1LL*dts_delta_threshold*AV_TIME_BASE ||
|
||||
delta > 1LL*dts_delta_threshold*AV_TIME_BASE ||
|
||||
(delta > 1LL*dts_delta_threshold*AV_TIME_BASE &&
|
||||
ist->dec_ctx->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
|
||||
pkt_dts + AV_TIME_BASE/10 < FFMAX(ist->pts, ist->dts)) {
|
||||
ifile->ts_offset -= delta;
|
||||
av_log(NULL, AV_LOG_DEBUG,
|
||||
@@ -3585,7 +3499,7 @@ static int process_input(int file_index)
|
||||
}
|
||||
} else {
|
||||
if ( delta < -1LL*dts_error_threshold*AV_TIME_BASE ||
|
||||
delta > 1LL*dts_error_threshold*AV_TIME_BASE) {
|
||||
(delta > 1LL*dts_error_threshold*AV_TIME_BASE && ist->dec_ctx->codec_type != AVMEDIA_TYPE_SUBTITLE)) {
|
||||
av_log(NULL, AV_LOG_WARNING, "DTS %"PRId64", next:%"PRId64" st:%d invalid dropping\n", pkt.dts, ist->next_dts, pkt.stream_index);
|
||||
pkt.dts = AV_NOPTS_VALUE;
|
||||
}
|
||||
@@ -3593,7 +3507,7 @@ static int process_input(int file_index)
|
||||
int64_t pkt_pts = av_rescale_q(pkt.pts, ist->st->time_base, AV_TIME_BASE_Q);
|
||||
delta = pkt_pts - ist->next_dts;
|
||||
if ( delta < -1LL*dts_error_threshold*AV_TIME_BASE ||
|
||||
delta > 1LL*dts_error_threshold*AV_TIME_BASE) {
|
||||
(delta > 1LL*dts_error_threshold*AV_TIME_BASE && ist->dec_ctx->codec_type != AVMEDIA_TYPE_SUBTITLE)) {
|
||||
av_log(NULL, AV_LOG_WARNING, "PTS %"PRId64", next:%"PRId64" invalid dropping st:%d\n", pkt.pts, ist->next_dts, pkt.stream_index);
|
||||
pkt.pts = AV_NOPTS_VALUE;
|
||||
}
|
||||
@@ -3836,7 +3750,6 @@ static int transcode(void)
|
||||
av_dict_free(&ost->encoder_opts);
|
||||
av_dict_free(&ost->swr_opts);
|
||||
av_dict_free(&ost->resample_opts);
|
||||
av_dict_free(&ost->bsf_args);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3858,7 +3771,7 @@ static int64_t getutime(void)
|
||||
GetProcessTimes(proc, &c, &e, &k, &u);
|
||||
return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
|
||||
#else
|
||||
return av_gettime_relative();
|
||||
return av_gettime();
|
||||
#endif
|
||||
}
|
||||
|
||||
|
5
ffmpeg.h
5
ffmpeg.h
@@ -388,8 +388,6 @@ typedef struct OutputStream {
|
||||
AVCodec *enc;
|
||||
int64_t max_frames;
|
||||
AVFrame *filtered_frame;
|
||||
AVFrame *last_frame;
|
||||
int last_droped;
|
||||
|
||||
/* video only */
|
||||
AVRational frame_rate;
|
||||
@@ -422,7 +420,6 @@ typedef struct OutputStream {
|
||||
AVDictionary *encoder_opts;
|
||||
AVDictionary *swr_opts;
|
||||
AVDictionary *resample_opts;
|
||||
AVDictionary *bsf_args;
|
||||
char *apad;
|
||||
OSTFinished finished; /* no more packets should be written for this stream */
|
||||
int unavailable; /* true if the steram is unavailable (possibly temporarily) */
|
||||
@@ -484,7 +481,6 @@ extern int do_deinterlace;
|
||||
extern int do_hex_dump;
|
||||
extern int do_pkt_dump;
|
||||
extern int copy_ts;
|
||||
extern int start_at_zero;
|
||||
extern int copy_tb;
|
||||
extern int debug_ts;
|
||||
extern int exit_on_error;
|
||||
@@ -494,7 +490,6 @@ extern int stdin_interaction;
|
||||
extern int frame_bits_per_raw_sample;
|
||||
extern AVIOContext *progress_avio;
|
||||
extern float max_error_rate;
|
||||
extern int vdpau_api_ver;
|
||||
|
||||
extern const AVIOInterruptCB int_cb;
|
||||
|
||||
|
@@ -383,8 +383,9 @@ static int configure_output_video_filter(FilterGraph *fg, OutputFilter *ofilter,
|
||||
snprintf(name, sizeof(name), "pixel format for output stream %d:%d",
|
||||
ost->file_index, ost->index);
|
||||
ret = avfilter_graph_create_filter(&filter,
|
||||
avfilter_get_by_name("format"),
|
||||
"format", pix_fmts, NULL, fg->graph);
|
||||
avfilter_get_by_name("format"),
|
||||
"format", pix_fmts, NULL,
|
||||
fg->graph);
|
||||
av_freep(&pix_fmts);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
@@ -619,7 +620,6 @@ static int sub2video_prepare(InputStream *ist)
|
||||
ist->sub2video.frame = av_frame_alloc();
|
||||
if (!ist->sub2video.frame)
|
||||
return AVERROR(ENOMEM);
|
||||
ist->sub2video.last_pts = INT64_MIN;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -637,7 +637,6 @@ static int configure_input_video_filter(FilterGraph *fg, InputFilter *ifilter,
|
||||
AVBPrint args;
|
||||
char name[255];
|
||||
int ret, pad_idx = 0;
|
||||
int64_t tsoffset = 0;
|
||||
|
||||
if (ist->dec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) {
|
||||
av_log(NULL, AV_LOG_ERROR, "Cannot connect video filter to audio input\n");
|
||||
@@ -712,14 +711,8 @@ static int configure_input_video_filter(FilterGraph *fg, InputFilter *ifilter,
|
||||
|
||||
snprintf(name, sizeof(name), "trim for input stream %d:%d",
|
||||
ist->file_index, ist->st->index);
|
||||
if (copy_ts) {
|
||||
tsoffset = f->start_time == AV_NOPTS_VALUE ? 0 : f->start_time;
|
||||
if (!start_at_zero && f->ctx->start_time != AV_NOPTS_VALUE)
|
||||
tsoffset += f->ctx->start_time;
|
||||
}
|
||||
ret = insert_trim(((f->start_time == AV_NOPTS_VALUE) || !f->accurate_seek) ?
|
||||
AV_NOPTS_VALUE : tsoffset, f->recording_time,
|
||||
&last_filter, &pad_idx, name);
|
||||
AV_NOPTS_VALUE : 0, f->recording_time, &last_filter, &pad_idx, name);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
@@ -738,7 +731,6 @@ static int configure_input_audio_filter(FilterGraph *fg, InputFilter *ifilter,
|
||||
AVBPrint args;
|
||||
char name[255];
|
||||
int ret, pad_idx = 0;
|
||||
int64_t tsoffset = 0;
|
||||
|
||||
if (ist->dec_ctx->codec_type != AVMEDIA_TYPE_AUDIO) {
|
||||
av_log(NULL, AV_LOG_ERROR, "Cannot connect audio filter to non audio input\n");
|
||||
@@ -821,14 +813,8 @@ static int configure_input_audio_filter(FilterGraph *fg, InputFilter *ifilter,
|
||||
|
||||
snprintf(name, sizeof(name), "trim for input stream %d:%d",
|
||||
ist->file_index, ist->st->index);
|
||||
if (copy_ts) {
|
||||
tsoffset = f->start_time == AV_NOPTS_VALUE ? 0 : f->start_time;
|
||||
if (!start_at_zero && f->ctx->start_time != AV_NOPTS_VALUE)
|
||||
tsoffset += f->ctx->start_time;
|
||||
}
|
||||
ret = insert_trim(((f->start_time == AV_NOPTS_VALUE) || !f->accurate_seek) ?
|
||||
AV_NOPTS_VALUE : tsoffset, f->recording_time,
|
||||
&last_filter, &pad_idx, name);
|
||||
AV_NOPTS_VALUE : 0, f->recording_time, &last_filter, &pad_idx, name);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
|
65
ffmpeg_opt.c
65
ffmpeg_opt.c
@@ -91,7 +91,6 @@ int do_benchmark_all = 0;
|
||||
int do_hex_dump = 0;
|
||||
int do_pkt_dump = 0;
|
||||
int copy_ts = 0;
|
||||
int start_at_zero = 0;
|
||||
int copy_tb = -1;
|
||||
int debug_ts = 0;
|
||||
int exit_on_error = 0;
|
||||
@@ -509,8 +508,7 @@ static int opt_recording_timestamp(void *optctx, const char *opt, const char *ar
|
||||
char buf[128];
|
||||
int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
|
||||
struct tm time = *gmtime((time_t*)&recording_timestamp);
|
||||
if (!strftime(buf, sizeof(buf), "creation_time=%FT%T%z", &time))
|
||||
return -1;
|
||||
strftime(buf, sizeof(buf), "creation_time=%FT%T%z", &time);
|
||||
parse_option(o, "metadata", buf, options);
|
||||
|
||||
av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
|
||||
@@ -794,7 +792,6 @@ static int open_input_file(OptionsContext *o, const char *filename)
|
||||
char * video_codec_name = NULL;
|
||||
char * audio_codec_name = NULL;
|
||||
char *subtitle_codec_name = NULL;
|
||||
int scan_all_pmts_set = 0;
|
||||
|
||||
if (o->format) {
|
||||
if (!(file_iformat = av_find_input_format(o->format))) {
|
||||
@@ -865,18 +862,12 @@ static int open_input_file(OptionsContext *o, const char *filename)
|
||||
ic->flags |= AVFMT_FLAG_NONBLOCK;
|
||||
ic->interrupt_callback = int_cb;
|
||||
|
||||
if (!av_dict_get(o->g->format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE)) {
|
||||
av_dict_set(&o->g->format_opts, "scan_all_pmts", "1", AV_DICT_DONT_OVERWRITE);
|
||||
scan_all_pmts_set = 1;
|
||||
}
|
||||
/* open the input file with generic avformat function */
|
||||
err = avformat_open_input(&ic, filename, file_iformat, &o->g->format_opts);
|
||||
if (err < 0) {
|
||||
print_error(filename, err);
|
||||
exit_program(1);
|
||||
}
|
||||
if (scan_all_pmts_set)
|
||||
av_dict_set(&o->g->format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE);
|
||||
remove_avoptions(&o->g->format_opts, o->g->codec_opts);
|
||||
assert_avoptions(o->g->format_opts);
|
||||
|
||||
@@ -930,7 +921,7 @@ static int open_input_file(OptionsContext *o, const char *filename)
|
||||
f->start_time = o->start_time;
|
||||
f->recording_time = o->recording_time;
|
||||
f->input_ts_offset = o->input_ts_offset;
|
||||
f->ts_offset = o->input_ts_offset - (copy_ts ? (start_at_zero && ic->start_time != AV_NOPTS_VALUE ? ic->start_time : 0) : timestamp);
|
||||
f->ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
|
||||
f->nb_streams = ic->nb_streams;
|
||||
f->rate_emu = o->rate_emu;
|
||||
f->accurate_seek = o->accurate_seek;
|
||||
@@ -1138,11 +1129,8 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e
|
||||
|
||||
MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
|
||||
while (bsf) {
|
||||
char *arg = NULL;
|
||||
if (next = strchr(bsf, ','))
|
||||
*next++ = 0;
|
||||
if (arg = strchr(bsf, '='))
|
||||
*arg++ = 0;
|
||||
if (!(bsfc = av_bitstream_filter_init(bsf))) {
|
||||
av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
|
||||
exit_program(1);
|
||||
@@ -1151,7 +1139,6 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e
|
||||
bsfc_prev->next = bsfc;
|
||||
else
|
||||
ost->bitstream_filters = bsfc;
|
||||
av_dict_set(&ost->bsf_args, bsfc->filter->name, arg, 0);
|
||||
|
||||
bsfc_prev = bsfc;
|
||||
bsf = next;
|
||||
@@ -1289,8 +1276,6 @@ static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc, in
|
||||
av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
|
||||
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(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
|
||||
if (frame_aspect_ratio) {
|
||||
@@ -1635,36 +1620,27 @@ static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const ch
|
||||
AVStream *st;
|
||||
OutputStream *ost;
|
||||
AVCodec *codec;
|
||||
const char *enc_config;
|
||||
AVCodecContext *avctx;
|
||||
|
||||
codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
|
||||
if (!codec) {
|
||||
av_log(s, AV_LOG_ERROR, "no encoder found for codec id %i\n", ic->streams[i]->codec->codec_id);
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
if (codec->type == AVMEDIA_TYPE_AUDIO)
|
||||
opt_audio_codec(o, "c:a", codec->name);
|
||||
else if (codec->type == AVMEDIA_TYPE_VIDEO)
|
||||
opt_video_codec(o, "c:v", codec->name);
|
||||
ost = new_output_stream(o, s, codec->type, -1);
|
||||
st = ost->st;
|
||||
avctx = st->codec;
|
||||
ost->enc = codec;
|
||||
|
||||
avcodec_get_context_defaults3(st->codec, codec);
|
||||
enc_config = av_stream_get_recommended_encoder_configuration(ic->streams[i]);
|
||||
if (enc_config) {
|
||||
AVDictionary *opts = NULL;
|
||||
av_dict_parse_string(&opts, enc_config, "=", ",", 0);
|
||||
av_opt_set_dict2(st->codec, &opts, AV_OPT_SEARCH_CHILDREN);
|
||||
av_dict_free(&opts);
|
||||
}
|
||||
// FIXME: a more elegant solution is needed
|
||||
memcpy(st, ic->streams[i], sizeof(AVStream));
|
||||
st->cur_dts = 0;
|
||||
st->info = av_malloc(sizeof(*st->info));
|
||||
memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
|
||||
st->codec= avctx;
|
||||
avcodec_copy_context(st->codec, ic->streams[i]->codec);
|
||||
|
||||
if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !ost->stream_copy)
|
||||
choose_sample_fmt(st, codec);
|
||||
else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !ost->stream_copy)
|
||||
choose_pixel_fmt(st, st->codec, codec, st->codec->pix_fmt);
|
||||
avcodec_copy_context(ost->enc_ctx, st->codec);
|
||||
if (enc_config)
|
||||
av_dict_parse_string(&ost->encoder_opts, enc_config, "=", ",", 0);
|
||||
}
|
||||
|
||||
avformat_close_input(&ic);
|
||||
@@ -1752,8 +1728,8 @@ static int open_output_file(OptionsContext *o, const char *filename)
|
||||
if (o->stop_time != INT64_MAX && o->recording_time == INT64_MAX) {
|
||||
int64_t start_time = o->start_time == AV_NOPTS_VALUE ? 0 : o->start_time;
|
||||
if (o->stop_time <= start_time) {
|
||||
av_log(NULL, AV_LOG_ERROR, "-to value smaller than -ss; aborting.\n");
|
||||
exit_program(1);
|
||||
av_log(NULL, AV_LOG_WARNING, "-to value smaller than -ss; ignoring -to.\n");
|
||||
o->stop_time = INT64_MAX;
|
||||
} else {
|
||||
o->recording_time = o->stop_time - start_time;
|
||||
}
|
||||
@@ -2831,7 +2807,7 @@ const OptionDef options[] = {
|
||||
"add metadata", "string=string" },
|
||||
{ "dframes", HAS_ARG | OPT_PERFILE | OPT_EXPERT |
|
||||
OPT_OUTPUT, { .func_arg = opt_data_frames },
|
||||
"set the number of data frames to output", "number" },
|
||||
"set the number of data frames to record", "number" },
|
||||
{ "benchmark", OPT_BOOL | OPT_EXPERT, { &do_benchmark },
|
||||
"add timings for benchmarking" },
|
||||
{ "benchmark_all", OPT_BOOL | OPT_EXPERT, { &do_benchmark_all },
|
||||
@@ -2860,8 +2836,6 @@ const OptionDef options[] = {
|
||||
"audio drift threshold", "threshold" },
|
||||
{ "copyts", OPT_BOOL | OPT_EXPERT, { ©_ts },
|
||||
"copy timestamps" },
|
||||
{ "start_at_zero", OPT_BOOL | OPT_EXPERT, { &start_at_zero },
|
||||
"shift input timestamps to start at 0 when using copyts" },
|
||||
{ "copytb", HAS_ARG | OPT_INT | OPT_EXPERT, { ©_tb },
|
||||
"copy input stream time base when stream copying", "mode" },
|
||||
{ "shortest", OPT_BOOL | OPT_EXPERT | OPT_OFFSET |
|
||||
@@ -2882,7 +2856,7 @@ const OptionDef options[] = {
|
||||
{ "copypriorss", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(copy_prior_start) },
|
||||
"copy or discard frames before start time" },
|
||||
{ "frames", OPT_INT64 | HAS_ARG | OPT_SPEC | OPT_OUTPUT, { .off = OFFSET(max_frames) },
|
||||
"set the number of frames to output", "number" },
|
||||
"set the number of frames to record", "number" },
|
||||
{ "tag", OPT_STRING | HAS_ARG | OPT_SPEC |
|
||||
OPT_EXPERT | OPT_OUTPUT | OPT_INPUT, { .off = OFFSET(codec_tags) },
|
||||
"force codec tag/fourcc", "fourcc/tag" },
|
||||
@@ -2924,7 +2898,7 @@ const OptionDef options[] = {
|
||||
|
||||
/* video options */
|
||||
{ "vframes", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_frames },
|
||||
"set the number of video frames to output", "number" },
|
||||
"set the number of video frames to record", "number" },
|
||||
{ "r", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_SPEC |
|
||||
OPT_INPUT | OPT_OUTPUT, { .off = OFFSET(frame_rates) },
|
||||
"set frame rate (Hz value, fraction or abbreviation)", "rate" },
|
||||
@@ -3006,13 +2980,10 @@ const OptionDef options[] = {
|
||||
{ "hwaccel_device", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT |
|
||||
OPT_SPEC | OPT_INPUT, { .off = OFFSET(hwaccel_devices) },
|
||||
"select a device for HW acceleration" "devicename" },
|
||||
#if HAVE_VDPAU_X11
|
||||
{ "vdpau_api_ver", HAS_ARG | OPT_INT | OPT_EXPERT, { &vdpau_api_ver }, "" },
|
||||
#endif
|
||||
|
||||
/* audio options */
|
||||
{ "aframes", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_frames },
|
||||
"set the number of audio frames to output", "number" },
|
||||
"set the number of audio frames to record", "number" },
|
||||
{ "aq", OPT_AUDIO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_audio_qscale },
|
||||
"set audio quality (codec-specific)", "quality", },
|
||||
{ "ar", OPT_AUDIO | HAS_ARG | OPT_INT | OPT_SPEC |
|
||||
|
@@ -42,11 +42,9 @@ typedef struct VDPAUContext {
|
||||
VdpGetErrorString *get_error_string;
|
||||
VdpGetInformationString *get_information_string;
|
||||
VdpDeviceDestroy *device_destroy;
|
||||
#if 1 // for ffmpegs older vdpau API, not the oldest though
|
||||
VdpDecoderCreate *decoder_create;
|
||||
VdpDecoderDestroy *decoder_destroy;
|
||||
VdpDecoderRender *decoder_render;
|
||||
#endif
|
||||
VdpVideoSurfaceCreate *video_surface_create;
|
||||
VdpVideoSurfaceDestroy *video_surface_destroy;
|
||||
VdpVideoSurfaceGetBitsYCbCr *video_surface_get_bits;
|
||||
@@ -59,8 +57,6 @@ typedef struct VDPAUContext {
|
||||
VdpYCbCrFormat vdpau_format;
|
||||
} VDPAUContext;
|
||||
|
||||
int vdpau_api_ver = 2;
|
||||
|
||||
static void vdpau_uninit(AVCodecContext *s)
|
||||
{
|
||||
InputStream *ist = s->opaque;
|
||||
@@ -243,11 +239,9 @@ do {
|
||||
GET_CALLBACK(VDP_FUNC_ID_GET_ERROR_STRING, get_error_string);
|
||||
GET_CALLBACK(VDP_FUNC_ID_GET_INFORMATION_STRING, get_information_string);
|
||||
GET_CALLBACK(VDP_FUNC_ID_DEVICE_DESTROY, device_destroy);
|
||||
if (vdpau_api_ver == 1) {
|
||||
GET_CALLBACK(VDP_FUNC_ID_DECODER_CREATE, decoder_create);
|
||||
GET_CALLBACK(VDP_FUNC_ID_DECODER_DESTROY, decoder_destroy);
|
||||
GET_CALLBACK(VDP_FUNC_ID_DECODER_RENDER, decoder_render);
|
||||
}
|
||||
GET_CALLBACK(VDP_FUNC_ID_DECODER_CREATE, decoder_create);
|
||||
GET_CALLBACK(VDP_FUNC_ID_DECODER_DESTROY, decoder_destroy);
|
||||
GET_CALLBACK(VDP_FUNC_ID_DECODER_RENDER, decoder_render);
|
||||
GET_CALLBACK(VDP_FUNC_ID_VIDEO_SURFACE_CREATE, video_surface_create);
|
||||
GET_CALLBACK(VDP_FUNC_ID_VIDEO_SURFACE_DESTROY, video_surface_destroy);
|
||||
GET_CALLBACK(VDP_FUNC_ID_VIDEO_SURFACE_GET_BITS_Y_CB_CR, video_surface_get_bits);
|
||||
@@ -276,16 +270,12 @@ do {
|
||||
ctx->vdpau_format = vdpau_formats[i][0];
|
||||
ctx->pix_fmt = vdpau_formats[i][1];
|
||||
|
||||
if (vdpau_api_ver == 1) {
|
||||
vdpau_ctx = av_vdpau_alloc_context();
|
||||
if (!vdpau_ctx)
|
||||
goto fail;
|
||||
vdpau_ctx->render = ctx->decoder_render;
|
||||
|
||||
s->hwaccel_context = vdpau_ctx;
|
||||
} else
|
||||
if (av_vdpau_bind_context(s, ctx->device, ctx->get_proc_address, 0))
|
||||
vdpau_ctx = av_vdpau_alloc_context();
|
||||
if (!vdpau_ctx)
|
||||
goto fail;
|
||||
vdpau_ctx->render = ctx->decoder_render;
|
||||
|
||||
s->hwaccel_context = vdpau_ctx;
|
||||
|
||||
ctx->get_information_string(&vendor);
|
||||
av_log(NULL, AV_LOG_VERBOSE, "Using VDPAU -- %s -- on X11 display %s, "
|
||||
@@ -301,7 +291,7 @@ fail:
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
|
||||
static int vdpau_old_init(AVCodecContext *s)
|
||||
int vdpau_init(AVCodecContext *s)
|
||||
{
|
||||
InputStream *ist = s->opaque;
|
||||
int loglevel = (ist->hwaccel_id == HWACCEL_AUTO) ? AV_LOG_VERBOSE : AV_LOG_ERROR;
|
||||
@@ -343,22 +333,3 @@ static int vdpau_old_init(AVCodecContext *s)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int vdpau_init(AVCodecContext *s)
|
||||
{
|
||||
InputStream *ist = s->opaque;
|
||||
|
||||
if (vdpau_api_ver == 1)
|
||||
return vdpau_old_init(s);
|
||||
|
||||
if (!ist->hwaccel_ctx) {
|
||||
int ret = vdpau_alloc(s);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
|
||||
ist->hwaccel_get_buffer = vdpau_get_buffer;
|
||||
ist->hwaccel_retrieve_data = vdpau_retrieve_data;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
102
ffprobe.c
102
ffprobe.c
@@ -66,9 +66,6 @@ static int do_show_stream_disposition = 0;
|
||||
static int do_show_data = 0;
|
||||
static int do_show_program_version = 0;
|
||||
static int do_show_library_versions = 0;
|
||||
static int do_show_pixel_formats = 0;
|
||||
static int do_show_pixel_format_flags = 0;
|
||||
static int do_show_pixel_format_components = 0;
|
||||
|
||||
static int do_show_chapter_tags = 0;
|
||||
static int do_show_format_tags = 0;
|
||||
@@ -135,11 +132,6 @@ typedef enum {
|
||||
SECTION_ID_PACKET,
|
||||
SECTION_ID_PACKETS,
|
||||
SECTION_ID_PACKETS_AND_FRAMES,
|
||||
SECTION_ID_PIXEL_FORMAT,
|
||||
SECTION_ID_PIXEL_FORMAT_FLAGS,
|
||||
SECTION_ID_PIXEL_FORMAT_COMPONENT,
|
||||
SECTION_ID_PIXEL_FORMAT_COMPONENTS,
|
||||
SECTION_ID_PIXEL_FORMATS,
|
||||
SECTION_ID_PROGRAM_STREAM_DISPOSITION,
|
||||
SECTION_ID_PROGRAM_STREAM_TAGS,
|
||||
SECTION_ID_PROGRAM,
|
||||
@@ -173,11 +165,6 @@ static struct section sections[] = {
|
||||
[SECTION_ID_PACKETS] = { SECTION_ID_PACKETS, "packets", SECTION_FLAG_IS_ARRAY, { SECTION_ID_PACKET, -1} },
|
||||
[SECTION_ID_PACKETS_AND_FRAMES] = { SECTION_ID_PACKETS_AND_FRAMES, "packets_and_frames", SECTION_FLAG_IS_ARRAY, { SECTION_ID_PACKET, -1} },
|
||||
[SECTION_ID_PACKET] = { SECTION_ID_PACKET, "packet", 0, { -1 } },
|
||||
[SECTION_ID_PIXEL_FORMATS] = { SECTION_ID_PIXEL_FORMATS, "pixel_formats", SECTION_FLAG_IS_ARRAY, { SECTION_ID_PIXEL_FORMAT, -1 } },
|
||||
[SECTION_ID_PIXEL_FORMAT] = { SECTION_ID_PIXEL_FORMAT, "pixel_format", 0, { SECTION_ID_PIXEL_FORMAT_FLAGS, SECTION_ID_PIXEL_FORMAT_COMPONENTS, -1 } },
|
||||
[SECTION_ID_PIXEL_FORMAT_FLAGS] = { SECTION_ID_PIXEL_FORMAT_FLAGS, "flags", 0, { -1 }, .unique_name = "pixel_format_flags" },
|
||||
[SECTION_ID_PIXEL_FORMAT_COMPONENTS] = { SECTION_ID_PIXEL_FORMAT_COMPONENTS, "components", SECTION_FLAG_IS_ARRAY, {SECTION_ID_PIXEL_FORMAT_COMPONENT, -1 }, .unique_name = "pixel_format_components" },
|
||||
[SECTION_ID_PIXEL_FORMAT_COMPONENT] = { SECTION_ID_PIXEL_FORMAT_COMPONENT, "component", 0, { -1 } },
|
||||
[SECTION_ID_PROGRAM_STREAM_DISPOSITION] = { SECTION_ID_PROGRAM_STREAM_DISPOSITION, "disposition", 0, { -1 }, .unique_name = "program_stream_disposition" },
|
||||
[SECTION_ID_PROGRAM_STREAM_TAGS] = { SECTION_ID_PROGRAM_STREAM_TAGS, "tags", SECTION_FLAG_HAS_VARIABLE_FIELDS, { -1 }, .element_name = "tag", .unique_name = "program_stream_tags" },
|
||||
[SECTION_ID_PROGRAM] = { SECTION_ID_PROGRAM, "program", 0, { SECTION_ID_PROGRAM_TAGS, SECTION_ID_PROGRAM_STREAMS, -1 } },
|
||||
@@ -188,8 +175,7 @@ static struct section sections[] = {
|
||||
[SECTION_ID_PROGRAMS] = { SECTION_ID_PROGRAMS, "programs", SECTION_FLAG_IS_ARRAY, { SECTION_ID_PROGRAM, -1 } },
|
||||
[SECTION_ID_ROOT] = { SECTION_ID_ROOT, "root", SECTION_FLAG_IS_WRAPPER,
|
||||
{ SECTION_ID_CHAPTERS, SECTION_ID_FORMAT, SECTION_ID_FRAMES, SECTION_ID_PROGRAMS, SECTION_ID_STREAMS,
|
||||
SECTION_ID_PACKETS, SECTION_ID_ERROR, SECTION_ID_PROGRAM_VERSION, SECTION_ID_LIBRARY_VERSIONS,
|
||||
SECTION_ID_PIXEL_FORMATS, -1} },
|
||||
SECTION_ID_PACKETS, SECTION_ID_ERROR, SECTION_ID_PROGRAM_VERSION, SECTION_ID_LIBRARY_VERSIONS, -1} },
|
||||
[SECTION_ID_STREAMS] = { SECTION_ID_STREAMS, "streams", SECTION_FLAG_IS_ARRAY, { SECTION_ID_STREAM, -1 } },
|
||||
[SECTION_ID_STREAM] = { SECTION_ID_STREAM, "stream", 0, { SECTION_ID_STREAM_DISPOSITION, SECTION_ID_STREAM_TAGS, -1 } },
|
||||
[SECTION_ID_STREAM_DISPOSITION] = { SECTION_ID_STREAM_DISPOSITION, "disposition", 0, { -1 }, .unique_name = "stream_disposition" },
|
||||
@@ -2112,28 +2098,12 @@ static int show_stream(WriterContext *w, AVFormatContext *fmt_ctx, int stream_id
|
||||
else print_str_opt("pix_fmt", "unknown");
|
||||
print_int("level", dec_ctx->level);
|
||||
if (dec_ctx->color_range != AVCOL_RANGE_UNSPECIFIED)
|
||||
print_str ("color_range", av_color_range_name(dec_ctx->color_range));
|
||||
print_str ("color_range", dec_ctx->color_range == AVCOL_RANGE_MPEG ? "tv": "pc");
|
||||
else
|
||||
print_str_opt("color_range", "N/A");
|
||||
s = av_get_colorspace_name(dec_ctx->colorspace);
|
||||
if (s) print_str ("color_space", s);
|
||||
else print_str_opt("color_space", "unknown");
|
||||
|
||||
if (dec_ctx->color_trc != AVCOL_TRC_UNSPECIFIED)
|
||||
print_str("color_transfer", av_color_transfer_name(dec_ctx->color_trc));
|
||||
else
|
||||
print_str_opt("color_transfer", av_color_transfer_name(dec_ctx->color_trc));
|
||||
|
||||
if (dec_ctx->color_primaries != AVCOL_PRI_UNSPECIFIED)
|
||||
print_str("color_primaries", av_color_primaries_name(dec_ctx->color_primaries));
|
||||
else
|
||||
print_str_opt("color_primaries", av_color_primaries_name(dec_ctx->color_primaries));
|
||||
|
||||
if (dec_ctx->chroma_sample_location != AVCHROMA_LOC_UNSPECIFIED)
|
||||
print_str("chroma_location", av_chroma_location_name(dec_ctx->chroma_sample_location));
|
||||
else
|
||||
print_str_opt("chroma_location", av_chroma_location_name(dec_ctx->chroma_sample_location));
|
||||
|
||||
if (dec_ctx->timecode_frame_start >= 0) {
|
||||
char tcbuf[AV_TIMECODE_STR_SIZE];
|
||||
av_timecode_make_mpeg_tc_string(tcbuf, dec_ctx->timecode_frame_start);
|
||||
@@ -2386,19 +2356,12 @@ static int open_input_file(AVFormatContext **fmt_ctx_ptr, const char *filename)
|
||||
AVFormatContext *fmt_ctx = NULL;
|
||||
AVDictionaryEntry *t;
|
||||
AVDictionary **opts;
|
||||
int scan_all_pmts_set = 0;
|
||||
|
||||
if (!av_dict_get(format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE)) {
|
||||
av_dict_set(&format_opts, "scan_all_pmts", "1", AV_DICT_DONT_OVERWRITE);
|
||||
scan_all_pmts_set = 1;
|
||||
}
|
||||
if ((err = avformat_open_input(&fmt_ctx, filename,
|
||||
iformat, &format_opts)) < 0) {
|
||||
print_error(filename, err);
|
||||
return err;
|
||||
}
|
||||
if (scan_all_pmts_set)
|
||||
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))) {
|
||||
av_log(NULL, AV_LOG_ERROR, "Option %s not found.\n", t->key);
|
||||
return AVERROR_OPTION_NOT_FOUND;
|
||||
@@ -2594,58 +2557,6 @@ static void ffprobe_show_library_versions(WriterContext *w)
|
||||
writer_print_section_footer(w);
|
||||
}
|
||||
|
||||
#define PRINT_PIX_FMT_FLAG(flagname, name) \
|
||||
do { \
|
||||
print_int(name, !!(pixdesc->flags & AV_PIX_FMT_FLAG_##flagname)); \
|
||||
} while (0)
|
||||
|
||||
static void ffprobe_show_pixel_formats(WriterContext *w)
|
||||
{
|
||||
const AVPixFmtDescriptor *pixdesc = NULL;
|
||||
int i, n;
|
||||
|
||||
writer_print_section_header(w, SECTION_ID_PIXEL_FORMATS);
|
||||
while (pixdesc = av_pix_fmt_desc_next(pixdesc)) {
|
||||
writer_print_section_header(w, SECTION_ID_PIXEL_FORMAT);
|
||||
print_str("name", pixdesc->name);
|
||||
print_int("nb_components", pixdesc->nb_components);
|
||||
if ((pixdesc->nb_components >= 3) && !(pixdesc->flags & AV_PIX_FMT_FLAG_RGB)) {
|
||||
print_int ("log2_chroma_w", pixdesc->log2_chroma_w);
|
||||
print_int ("log2_chroma_h", pixdesc->log2_chroma_h);
|
||||
} else {
|
||||
print_str_opt("log2_chroma_w", "N/A");
|
||||
print_str_opt("log2_chroma_h", "N/A");
|
||||
}
|
||||
n = av_get_bits_per_pixel(pixdesc);
|
||||
if (n) print_int ("bits_per_pixel", n);
|
||||
else print_str_opt("bits_per_pixel", "N/A");
|
||||
if (do_show_pixel_format_flags) {
|
||||
writer_print_section_header(w, SECTION_ID_PIXEL_FORMAT_FLAGS);
|
||||
PRINT_PIX_FMT_FLAG(BE, "big_endian");
|
||||
PRINT_PIX_FMT_FLAG(PAL, "palette");
|
||||
PRINT_PIX_FMT_FLAG(BITSTREAM, "bitstream");
|
||||
PRINT_PIX_FMT_FLAG(HWACCEL, "hwaccel");
|
||||
PRINT_PIX_FMT_FLAG(PLANAR, "planar");
|
||||
PRINT_PIX_FMT_FLAG(RGB, "rgb");
|
||||
PRINT_PIX_FMT_FLAG(PSEUDOPAL, "pseudopal");
|
||||
PRINT_PIX_FMT_FLAG(ALPHA, "alpha");
|
||||
writer_print_section_footer(w);
|
||||
}
|
||||
if (do_show_pixel_format_components && (pixdesc->nb_components > 0)) {
|
||||
writer_print_section_header(w, SECTION_ID_PIXEL_FORMAT_COMPONENTS);
|
||||
for (i = 0; i < pixdesc->nb_components; i++) {
|
||||
writer_print_section_header(w, SECTION_ID_PIXEL_FORMAT_COMPONENT);
|
||||
print_int("index", i + 1);
|
||||
print_int("bit_depth", pixdesc->comp[i].depth_minus1 + 1);
|
||||
writer_print_section_footer(w);
|
||||
}
|
||||
writer_print_section_footer(w);
|
||||
}
|
||||
writer_print_section_footer(w);
|
||||
}
|
||||
writer_print_section_footer(w);
|
||||
}
|
||||
|
||||
static int opt_format(void *optctx, const char *opt, const char *arg)
|
||||
{
|
||||
iformat = av_find_input_format(arg);
|
||||
@@ -2979,7 +2890,6 @@ DEFINE_OPT_SHOW_SECTION(format, FORMAT);
|
||||
DEFINE_OPT_SHOW_SECTION(frames, FRAMES);
|
||||
DEFINE_OPT_SHOW_SECTION(library_versions, LIBRARY_VERSIONS);
|
||||
DEFINE_OPT_SHOW_SECTION(packets, PACKETS);
|
||||
DEFINE_OPT_SHOW_SECTION(pixel_formats, PIXEL_FORMATS);
|
||||
DEFINE_OPT_SHOW_SECTION(program_version, PROGRAM_VERSION);
|
||||
DEFINE_OPT_SHOW_SECTION(streams, STREAMS);
|
||||
DEFINE_OPT_SHOW_SECTION(programs, PROGRAMS);
|
||||
@@ -3018,7 +2928,6 @@ static const OptionDef real_options[] = {
|
||||
{ "show_program_version", 0, {(void*)&opt_show_program_version}, "show ffprobe version" },
|
||||
{ "show_library_versions", 0, {(void*)&opt_show_library_versions}, "show library versions" },
|
||||
{ "show_versions", 0, {(void*)&opt_show_versions}, "show program and library versions" },
|
||||
{ "show_pixel_formats", 0, {(void*)&opt_show_pixel_formats}, "show pixel format descriptions" },
|
||||
{ "show_private_data", OPT_BOOL, {(void*)&show_private_data}, "show private data" },
|
||||
{ "private", OPT_BOOL, {(void*)&show_private_data}, "same as show_private_data" },
|
||||
{ "bitexact", OPT_BOOL, {&do_bitexact}, "force bitexact output" },
|
||||
@@ -3075,9 +2984,6 @@ int main(int argc, char **argv)
|
||||
SET_DO_SHOW(FRAMES, frames);
|
||||
SET_DO_SHOW(LIBRARY_VERSIONS, library_versions);
|
||||
SET_DO_SHOW(PACKETS, packets);
|
||||
SET_DO_SHOW(PIXEL_FORMATS, pixel_formats);
|
||||
SET_DO_SHOW(PIXEL_FORMAT_FLAGS, pixel_format_flags);
|
||||
SET_DO_SHOW(PIXEL_FORMAT_COMPONENTS, pixel_format_components);
|
||||
SET_DO_SHOW(PROGRAM_VERSION, program_version);
|
||||
SET_DO_SHOW(PROGRAMS, programs);
|
||||
SET_DO_SHOW(STREAMS, streams);
|
||||
@@ -3142,12 +3048,10 @@ int main(int argc, char **argv)
|
||||
ffprobe_show_program_version(wctx);
|
||||
if (do_show_library_versions)
|
||||
ffprobe_show_library_versions(wctx);
|
||||
if (do_show_pixel_formats)
|
||||
ffprobe_show_pixel_formats(wctx);
|
||||
|
||||
if (!input_filename &&
|
||||
((do_show_format || do_show_programs || do_show_streams || do_show_chapters || do_show_packets || do_show_error) ||
|
||||
(!do_show_program_version && !do_show_library_versions && !do_show_pixel_formats))) {
|
||||
(!do_show_program_version && !do_show_library_versions))) {
|
||||
show_usage();
|
||||
av_log(NULL, AV_LOG_ERROR, "You have to specify one input file.\n");
|
||||
av_log(NULL, AV_LOG_ERROR, "Use -h to get full help or, even better, run 'man %s'.\n", program_name);
|
||||
|
1252
ffserver.c
1252
ffserver.c
File diff suppressed because it is too large
Load Diff
1260
ffserver_config.c
1260
ffserver_config.c
File diff suppressed because it is too large
Load Diff
@@ -1,133 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2000, 2001, 2002 Fabrice Bellard
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
#ifndef FFSERVER_CONFIG_H
|
||||
#define FFSERVER_CONFIG_H
|
||||
|
||||
#include "libavutil/dict.h"
|
||||
#include "libavformat/avformat.h"
|
||||
#include "libavformat/network.h"
|
||||
|
||||
#define FFSERVER_MAX_STREAMS 20
|
||||
|
||||
/* each generated stream is described here */
|
||||
enum FFServerStreamType {
|
||||
STREAM_TYPE_LIVE,
|
||||
STREAM_TYPE_STATUS,
|
||||
STREAM_TYPE_REDIRECT,
|
||||
};
|
||||
|
||||
enum FFServerIPAddressAction {
|
||||
IP_ALLOW = 1,
|
||||
IP_DENY,
|
||||
};
|
||||
|
||||
typedef struct FFServerIPAddressACL {
|
||||
struct FFServerIPAddressACL *next;
|
||||
enum FFServerIPAddressAction action;
|
||||
/* These are in host order */
|
||||
struct in_addr first;
|
||||
struct in_addr last;
|
||||
} FFServerIPAddressACL;
|
||||
|
||||
/* description of each stream of the ffserver.conf file */
|
||||
typedef struct FFServerStream {
|
||||
enum FFServerStreamType stream_type;
|
||||
char filename[1024]; /* stream filename */
|
||||
struct FFServerStream *feed; /* feed we are using (can be null if coming from file) */
|
||||
AVDictionary *in_opts; /* input parameters */
|
||||
AVDictionary *metadata; /* metadata to set on the stream */
|
||||
AVInputFormat *ifmt; /* if non NULL, force input format */
|
||||
AVOutputFormat *fmt;
|
||||
FFServerIPAddressACL *acl;
|
||||
char dynamic_acl[1024];
|
||||
int nb_streams;
|
||||
int prebuffer; /* Number of milliseconds early to start */
|
||||
int64_t max_time; /* Number of milliseconds to run */
|
||||
int send_on_key;
|
||||
AVStream *streams[FFSERVER_MAX_STREAMS];
|
||||
int feed_streams[FFSERVER_MAX_STREAMS]; /* index of streams in the feed */
|
||||
char feed_filename[1024]; /* file name of the feed storage, or
|
||||
input file name for a stream */
|
||||
pid_t pid; /* Of ffmpeg process */
|
||||
time_t pid_start; /* Of ffmpeg process */
|
||||
char **child_argv;
|
||||
struct FFServerStream *next;
|
||||
unsigned bandwidth; /* bandwidth, in kbits/s */
|
||||
/* RTSP options */
|
||||
char *rtsp_option;
|
||||
/* multicast specific */
|
||||
int is_multicast;
|
||||
struct in_addr multicast_ip;
|
||||
int multicast_port; /* first port used for multicast */
|
||||
int multicast_ttl;
|
||||
int loop; /* if true, send the stream in loops (only meaningful if file) */
|
||||
|
||||
/* feed specific */
|
||||
int feed_opened; /* true if someone is writing to the feed */
|
||||
int is_feed; /* true if it is a feed */
|
||||
int readonly; /* True if writing is prohibited to the file */
|
||||
int truncate; /* True if feeder connection truncate the feed file */
|
||||
int conns_served;
|
||||
int64_t bytes_served;
|
||||
int64_t feed_max_size; /* maximum storage size, zero means unlimited */
|
||||
int64_t feed_write_index; /* current write position in feed (it wraps around) */
|
||||
int64_t feed_size; /* current size of feed */
|
||||
struct FFServerStream *next_feed;
|
||||
} FFServerStream;
|
||||
|
||||
typedef struct FFServerConfig {
|
||||
char *filename;
|
||||
FFServerStream *first_feed; /* contains only feeds */
|
||||
FFServerStream *first_stream; /* contains all streams, including feeds */
|
||||
unsigned int nb_max_http_connections;
|
||||
unsigned int nb_max_connections;
|
||||
uint64_t max_bandwidth;
|
||||
int debug;
|
||||
char logfilename[1024];
|
||||
struct sockaddr_in http_addr;
|
||||
struct sockaddr_in rtsp_addr;
|
||||
int errors;
|
||||
int warnings;
|
||||
int use_defaults;
|
||||
// Following variables MUST NOT be used outside configuration parsing code.
|
||||
enum AVCodecID guessed_audio_codec_id;
|
||||
enum AVCodecID guessed_video_codec_id;
|
||||
AVDictionary *video_opts; /* AVOptions for video encoder */
|
||||
AVDictionary *audio_opts; /* AVOptions for audio encoder */
|
||||
AVCodecContext *dummy_actx; /* Used internally to test audio AVOptions. */
|
||||
AVCodecContext *dummy_vctx; /* Used internally to test video AVOptions. */
|
||||
int no_audio;
|
||||
int no_video;
|
||||
int line_num;
|
||||
int stream_use_defaults;
|
||||
} FFServerConfig;
|
||||
|
||||
void ffserver_get_arg(char *buf, int buf_size, const char **pp);
|
||||
|
||||
void ffserver_parse_acl_row(FFServerStream *stream, FFServerStream* feed,
|
||||
FFServerIPAddressACL *ext_acl,
|
||||
const char *p, const char *filename, int line_num);
|
||||
|
||||
int ffserver_parse_ffconfig(const char *filename, FFServerConfig *config);
|
||||
|
||||
void ffserver_free_child_args(void *argsp);
|
||||
|
||||
#endif /* FFSERVER_CONFIG_H */
|
@@ -339,25 +339,21 @@ static inline void mcdc(uint16_t *dst, const uint16_t *src, int log2w,
|
||||
}
|
||||
}
|
||||
|
||||
static int decode_p_block(FourXContext *f, uint16_t *dst, const uint16_t *src,
|
||||
static int decode_p_block(FourXContext *f, uint16_t *dst, uint16_t *src,
|
||||
int log2w, int log2h, int stride)
|
||||
{
|
||||
int index, h, code, ret, scale = 1;
|
||||
uint16_t *start, *end;
|
||||
const int index = size2index[log2h][log2w];
|
||||
const int h = 1 << log2h;
|
||||
int code = get_vlc2(&f->gb,
|
||||
block_type_vlc[1 - (f->version > 1)][index].table,
|
||||
BLOCK_TYPE_VLC_BITS, 1);
|
||||
uint16_t *start = f->last_frame_buffer;
|
||||
uint16_t *end = start + stride * (f->avctx->height - h + 1) - (1 << log2w);
|
||||
int ret;
|
||||
int scale = 1;
|
||||
unsigned dc = 0;
|
||||
|
||||
av_assert0(log2w >= 0 && log2h >= 0);
|
||||
|
||||
index = size2index[log2h][log2w];
|
||||
av_assert0(index >= 0);
|
||||
|
||||
h = 1 << log2h;
|
||||
code = get_vlc2(&f->gb, block_type_vlc[1 - (f->version > 1)][index].table,
|
||||
BLOCK_TYPE_VLC_BITS, 1);
|
||||
av_assert0(code >= 0 && code <= 6);
|
||||
|
||||
start = f->last_frame_buffer;
|
||||
end = start + stride * (f->avctx->height - h + 1) - (1 << log2w);
|
||||
av_assert0(code >= 0 && code <= 6 && log2w >= 0);
|
||||
|
||||
if (code == 1) {
|
||||
log2h--;
|
||||
|
@@ -11,7 +11,6 @@ HEADERS = avcodec.h \
|
||||
vda.h \
|
||||
vdpau.h \
|
||||
version.h \
|
||||
vorbis_parser.h \
|
||||
xvmc.h \
|
||||
|
||||
OBJS = allcodecs.o \
|
||||
@@ -32,8 +31,6 @@ OBJS = allcodecs.o \
|
||||
resample.o \
|
||||
resample2.o \
|
||||
utils.o \
|
||||
vorbis_parser.o \
|
||||
xiph.o \
|
||||
|
||||
# subsystems
|
||||
OBJS-$(CONFIG_AANDCTTABLES) += aandcttab.o
|
||||
@@ -73,7 +70,7 @@ OBJS-$(CONFIG_LLVIDDSP) += lossless_videodsp.o
|
||||
OBJS-$(CONFIG_LPC) += lpc.o
|
||||
OBJS-$(CONFIG_LSP) += lsp.o
|
||||
OBJS-$(CONFIG_MDCT) += mdct_fixed.o mdct_float.o mdct_fixed_32.o
|
||||
OBJS-$(CONFIG_ME_CMP) += me_cmp.o
|
||||
OBJS-$(CONFIG_ME_CMP) += me_cmp.o dsputil_compat.o
|
||||
OBJS-$(CONFIG_MPEG_ER) += mpeg_er.o
|
||||
OBJS-$(CONFIG_MPEGAUDIO) += mpegaudio.o mpegaudiodata.o \
|
||||
mpegaudiodecheader.o
|
||||
@@ -136,7 +133,6 @@ OBJS-$(CONFIG_AMV_ENCODER) += mjpegenc.o mjpeg.o mjpegenc_common.o \
|
||||
OBJS-$(CONFIG_ANM_DECODER) += anm.o
|
||||
OBJS-$(CONFIG_ANSI_DECODER) += ansi.o cga_data.o
|
||||
OBJS-$(CONFIG_APE_DECODER) += apedec.o
|
||||
OBJS-$(CONFIG_APNG_DECODER) += png.o pngdec.o pngdsp.o
|
||||
OBJS-$(CONFIG_SSA_DECODER) += assdec.o ass.o ass_split.o
|
||||
OBJS-$(CONFIG_SSA_ENCODER) += assenc.o ass.o
|
||||
OBJS-$(CONFIG_ASS_DECODER) += assdec.o ass.o ass_split.o
|
||||
@@ -280,7 +276,7 @@ OBJS-$(CONFIG_INTERPLAY_VIDEO_DECODER) += interplayvideo.o
|
||||
OBJS-$(CONFIG_JACOSUB_DECODER) += jacosubdec.o ass.o
|
||||
OBJS-$(CONFIG_JPEG2000_ENCODER) += j2kenc.o mqcenc.o mqc.o jpeg2000.o \
|
||||
jpeg2000dwt.o
|
||||
OBJS-$(CONFIG_JPEG2000_DECODER) += jpeg2000dec.o jpeg2000.o jpeg2000dsp.o \
|
||||
OBJS-$(CONFIG_JPEG2000_DECODER) += jpeg2000dec.o jpeg2000.o \
|
||||
jpeg2000dwt.o mqcdec.o mqc.o
|
||||
OBJS-$(CONFIG_JPEGLS_DECODER) += jpeglsdec.o jpegls.o
|
||||
OBJS-$(CONFIG_JPEGLS_ENCODER) += jpeglsenc.o jpegls.o
|
||||
@@ -433,7 +429,6 @@ OBJS-$(CONFIG_SONIC_LS_ENCODER) += sonic.o
|
||||
OBJS-$(CONFIG_SP5X_DECODER) += sp5xdec.o
|
||||
OBJS-$(CONFIG_SRT_DECODER) += srtdec.o ass.o
|
||||
OBJS-$(CONFIG_SRT_ENCODER) += srtenc.o ass_split.o
|
||||
OBJS-$(CONFIG_STL_DECODER) += textdec.o ass.o
|
||||
OBJS-$(CONFIG_SUBRIP_DECODER) += srtdec.o ass.o
|
||||
OBJS-$(CONFIG_SUBRIP_ENCODER) += srtenc.o ass_split.o
|
||||
OBJS-$(CONFIG_SUBVIEWER1_DECODER) += textdec.o ass.o
|
||||
@@ -449,6 +444,7 @@ OBJS-$(CONFIG_TAK_DECODER) += takdec.o tak.o
|
||||
OBJS-$(CONFIG_TARGA_DECODER) += targa.o
|
||||
OBJS-$(CONFIG_TARGA_ENCODER) += targaenc.o rle.o
|
||||
OBJS-$(CONFIG_TARGA_Y216_DECODER) += targa_y216dec.o
|
||||
OBJS-$(CONFIG_THEORA_DECODER) += xiph.o
|
||||
OBJS-$(CONFIG_TIERTEXSEQVIDEO_DECODER) += tiertexseqv.o
|
||||
OBJS-$(CONFIG_TIFF_DECODER) += tiff.o lzw.o faxcompr.o tiff_data.o tiff_common.o
|
||||
OBJS-$(CONFIG_TIFF_ENCODER) += tiffenc.o rle.o lzwenc.o tiff_data.o
|
||||
@@ -477,9 +473,7 @@ OBJS-$(CONFIG_V410_ENCODER) += v410enc.o
|
||||
OBJS-$(CONFIG_V210X_DECODER) += v210x.o
|
||||
OBJS-$(CONFIG_VB_DECODER) += vb.o
|
||||
OBJS-$(CONFIG_VBLE_DECODER) += vble.o
|
||||
OBJS-$(CONFIG_VC1_DECODER) += vc1dec.o vc1_block.o vc1_loopfilter.o \
|
||||
vc1_mc.o vc1_pred.o vc1.o vc1data.o \
|
||||
vc1dsp.o \
|
||||
OBJS-$(CONFIG_VC1_DECODER) += vc1dec.o vc1.o vc1data.o vc1dsp.o \
|
||||
msmpeg4dec.o msmpeg4.o msmpeg4data.o \
|
||||
wmv2dsp.o
|
||||
OBJS-$(CONFIG_VCR1_DECODER) += vcr1.o
|
||||
@@ -487,7 +481,7 @@ OBJS-$(CONFIG_VMDAUDIO_DECODER) += vmdaudio.o
|
||||
OBJS-$(CONFIG_VMDVIDEO_DECODER) += vmdvideo.o
|
||||
OBJS-$(CONFIG_VMNC_DECODER) += vmnc.o
|
||||
OBJS-$(CONFIG_VORBIS_DECODER) += vorbisdec.o vorbisdsp.o vorbis.o \
|
||||
vorbis_data.o
|
||||
vorbis_data.o xiph.o
|
||||
OBJS-$(CONFIG_VORBIS_ENCODER) += vorbisenc.o vorbis.o \
|
||||
vorbis_data.o
|
||||
OBJS-$(CONFIG_VP3_DECODER) += vp3.o
|
||||
@@ -679,18 +673,20 @@ OBJS-$(CONFIG_VC1_VDPAU_HWACCEL) += vdpau_vc1.o
|
||||
OBJS-$(CONFIG_ADTS_MUXER) += mpeg4audio.o
|
||||
OBJS-$(CONFIG_CAF_DEMUXER) += mpeg4audio.o mpegaudiodata.o \
|
||||
ac3tab.o
|
||||
OBJS-$(CONFIG_FLAC_DEMUXER) += flac.o flacdata.o vorbis_data.o
|
||||
OBJS-$(CONFIG_FLAC_DEMUXER) += flac.o flacdata.o vorbis_data.o \
|
||||
vorbis_parser.o xiph.o
|
||||
OBJS-$(CONFIG_FLAC_MUXER) += flac.o flacdata.o vorbis_data.o
|
||||
OBJS-$(CONFIG_FLV_DEMUXER) += mpeg4audio.o
|
||||
OBJS-$(CONFIG_GXF_DEMUXER) += mpeg12data.o
|
||||
OBJS-$(CONFIG_IFF_DEMUXER) += iff.o
|
||||
OBJS-$(CONFIG_ISMV_MUXER) += mpeg4audio.o mpegaudiodata.o
|
||||
OBJS-$(CONFIG_LATM_MUXER) += mpeg4audio.o
|
||||
OBJS-$(CONFIG_MATROSKA_AUDIO_MUXER) += mpeg4audio.o vorbis_data.o \
|
||||
OBJS-$(CONFIG_MATROSKA_AUDIO_MUXER) += xiph.o mpeg4audio.o vorbis_data.o \
|
||||
flac.o flacdata.o
|
||||
OBJS-$(CONFIG_MATROSKA_DEMUXER) += mpeg4audio.o mpegaudiodata.o
|
||||
OBJS-$(CONFIG_MATROSKA_DEMUXER) += mpeg4audio.o mpegaudiodata.o \
|
||||
vorbis_parser.o xiph.o
|
||||
OBJS-$(CONFIG_MATROSKA_MUXER) += mpeg4audio.o mpegaudiodata.o \
|
||||
flac.o flacdata.o vorbis_data.o
|
||||
flac.o flacdata.o vorbis_data.o xiph.o
|
||||
OBJS-$(CONFIG_MP2_MUXER) += mpegaudiodata.o mpegaudiodecheader.o
|
||||
OBJS-$(CONFIG_MP3_MUXER) += mpegaudiodata.o mpegaudiodecheader.o
|
||||
OBJS-$(CONFIG_MOV_DEMUXER) += mpeg4audio.o mpegaudiodata.o ac3tab.o
|
||||
@@ -699,19 +695,21 @@ OBJS-$(CONFIG_MPEGTS_MUXER) += mpeg4audio.o
|
||||
OBJS-$(CONFIG_MPEGTS_DEMUXER) += mpeg4audio.o mpegaudiodata.o
|
||||
OBJS-$(CONFIG_MXF_MUXER) += dnxhddata.o
|
||||
OBJS-$(CONFIG_NUT_MUXER) += mpegaudiodata.o
|
||||
OBJS-$(CONFIG_OGA_MUXER) += flac.o flacdata.o
|
||||
OBJS-$(CONFIG_OGG_DEMUXER) += mpeg12data.o \
|
||||
OBJS-$(CONFIG_OGA_MUXER) += xiph.o flac.o flacdata.o
|
||||
OBJS-$(CONFIG_OGG_DEMUXER) += xiph.o flac.o flacdata.o \
|
||||
mpeg12data.o vorbis_parser.o \
|
||||
dirac.o vorbis_data.o
|
||||
OBJS-$(CONFIG_OGG_MUXER) += flac.o flacdata.o \
|
||||
OBJS-$(CONFIG_OGG_MUXER) += xiph.o flac.o flacdata.o \
|
||||
vorbis_data.o
|
||||
OBJS-$(CONFIG_RTP_MUXER) += mpeg4audio.o
|
||||
OBJS-$(CONFIG_RTP_MUXER) += mpeg4audio.o xiph.o
|
||||
OBJS-$(CONFIG_RTPDEC) += mjpeg.o
|
||||
OBJS-$(CONFIG_SPDIF_DEMUXER) += aacadtsdec.o mpeg4audio.o
|
||||
OBJS-$(CONFIG_SPDIF_MUXER) += dca.o
|
||||
OBJS-$(CONFIG_TAK_DEMUXER) += tak.o
|
||||
OBJS-$(CONFIG_WEBM_MUXER) += mpeg4audio.o mpegaudiodata.o \
|
||||
flac.o flacdata.o \
|
||||
xiph.o flac.o flacdata.o \
|
||||
vorbis_data.o
|
||||
OBJS-$(CONFIG_WEBM_DASH_MANIFEST_DEMUXER) += vorbis_parser.o xiph.o
|
||||
OBJS-$(CONFIG_WTV_DEMUXER) += mpeg4audio.o mpegaudiodata.o
|
||||
|
||||
# libavfilter dependencies
|
||||
@@ -755,7 +753,7 @@ OBJS-$(CONFIG_LIBVO_AACENC_ENCODER) += libvo-aacenc.o mpeg4audio.o
|
||||
OBJS-$(CONFIG_LIBVO_AMRWBENC_ENCODER) += libvo-amrwbenc.o
|
||||
OBJS-$(CONFIG_LIBVORBIS_DECODER) += libvorbisdec.o
|
||||
OBJS-$(CONFIG_LIBVORBIS_ENCODER) += libvorbisenc.o \
|
||||
vorbis_data.o
|
||||
vorbis_data.o vorbis_parser.o xiph.o
|
||||
OBJS-$(CONFIG_LIBVPX_VP8_DECODER) += libvpxdec.o
|
||||
OBJS-$(CONFIG_LIBVPX_VP8_ENCODER) += libvpxenc.o
|
||||
OBJS-$(CONFIG_LIBVPX_VP9_DECODER) += libvpxdec.o libvpx.o
|
||||
@@ -811,6 +809,7 @@ OBJS-$(CONFIG_TAK_PARSER) += tak_parser.o tak.o
|
||||
OBJS-$(CONFIG_VC1_PARSER) += vc1_parser.o vc1.o vc1data.o vc1dsp.o \
|
||||
msmpeg4.o msmpeg4data.o mpeg4video.o \
|
||||
h263.o
|
||||
OBJS-$(CONFIG_VORBIS_PARSER) += vorbis_parser.o xiph.o
|
||||
OBJS-$(CONFIG_VP3_PARSER) += vp3_parser.o
|
||||
OBJS-$(CONFIG_VP8_PARSER) += vp8_parser.o
|
||||
OBJS-$(CONFIG_VP9_PARSER) += vp9_parser.o
|
||||
|
@@ -245,7 +245,6 @@ typedef struct SingleChannelElement {
|
||||
* channel element - generic struct for SCE/CPE/CCE/LFE
|
||||
*/
|
||||
typedef struct ChannelElement {
|
||||
int present;
|
||||
// CPE specific
|
||||
int common_window; ///< Set if channels share a common 'IndividualChannelStream' in bitstream.
|
||||
int ms_mode; ///< Signals mid/side stereo flags coding mode (used by encoder)
|
||||
@@ -275,7 +274,6 @@ struct AACContext {
|
||||
ChannelElement *che[4][MAX_ELEM_ID];
|
||||
ChannelElement *tag_che_map[4][MAX_ELEM_ID];
|
||||
int tags_mapped;
|
||||
int warned_remapping_once;
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
@@ -295,7 +293,7 @@ struct AACContext {
|
||||
FFTContext mdct_ld;
|
||||
FFTContext mdct_ltp;
|
||||
FmtConvertContext fmt_conv;
|
||||
AVFloatDSPContext *fdsp;
|
||||
AVFloatDSPContext fdsp;
|
||||
int random_state;
|
||||
/** @} */
|
||||
|
||||
|
@@ -621,12 +621,6 @@ static ChannelElement *get_che(AACContext *ac, int type, int elem_id)
|
||||
* If we seem to have encountered such a stream, transfer
|
||||
* the LFE[0] element to the SCE[1]'s mapping */
|
||||
if (ac->tags_mapped == tags_per_config[ac->oc[1].m4ac.chan_config] - 1 && (type == TYPE_LFE || type == TYPE_SCE)) {
|
||||
if (!ac->warned_remapping_once && (type != TYPE_LFE || elem_id != 0)) {
|
||||
av_log(ac->avctx, AV_LOG_WARNING,
|
||||
"This stream seems to incorrectly report its last channel as %s[%d], mapping to LFE[0]\n",
|
||||
type == TYPE_SCE ? "SCE" : "LFE", elem_id);
|
||||
ac->warned_remapping_once++;
|
||||
}
|
||||
ac->tags_mapped++;
|
||||
return ac->tag_che_map[type][elem_id] = ac->che[TYPE_LFE][0];
|
||||
}
|
||||
@@ -636,22 +630,6 @@ static ChannelElement *get_che(AACContext *ac, int type, int elem_id)
|
||||
return ac->tag_che_map[TYPE_CPE][elem_id] = ac->che[TYPE_CPE][1];
|
||||
}
|
||||
case 4:
|
||||
/* Some streams incorrectly code 4.0 audio as
|
||||
* SCE[0] CPE[0] LFE[0]
|
||||
* instead of
|
||||
* SCE[0] CPE[0] SCE[1].
|
||||
* If we seem to have encountered such a stream, transfer
|
||||
* the SCE[1] element to the LFE[0]'s mapping */
|
||||
if (ac->tags_mapped == tags_per_config[ac->oc[1].m4ac.chan_config] - 1 && (type == TYPE_LFE || type == TYPE_SCE)) {
|
||||
if (!ac->warned_remapping_once && (type != TYPE_SCE || elem_id != 1)) {
|
||||
av_log(ac->avctx, AV_LOG_WARNING,
|
||||
"This stream seems to incorrectly report its last channel as %s[%d], mapping to SCE[1]\n",
|
||||
type == TYPE_SCE ? "SCE" : "LFE", elem_id);
|
||||
ac->warned_remapping_once++;
|
||||
}
|
||||
ac->tags_mapped++;
|
||||
return ac->tag_che_map[type][elem_id] = ac->che[TYPE_SCE][1];
|
||||
}
|
||||
if (ac->tags_mapped == 2 &&
|
||||
ac->oc[1].m4ac.chan_config == 4 &&
|
||||
type == TYPE_SCE) {
|
||||
@@ -703,7 +681,6 @@ static void decode_channel_map(uint8_t layout_map[][3],
|
||||
syn_ele = TYPE_LFE;
|
||||
break;
|
||||
default:
|
||||
// AAC_CHANNEL_OFF has no channel map
|
||||
av_assert0(0);
|
||||
}
|
||||
layout_map[0][0] = syn_ele;
|
||||
@@ -1137,10 +1114,7 @@ static av_cold int aac_decode_init(AVCodecContext *avctx)
|
||||
ff_aac_sbr_init();
|
||||
|
||||
ff_fmt_convert_init(&ac->fmt_conv, avctx);
|
||||
ac->fdsp = avpriv_float_dsp_alloc(avctx->flags & CODEC_FLAG_BITEXACT);
|
||||
if (!ac->fdsp) {
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
avpriv_float_dsp_init(&ac->fdsp, avctx->flags & CODEC_FLAG_BITEXACT);
|
||||
|
||||
ac->random_state = 0x1f2e3d4c;
|
||||
|
||||
@@ -1516,12 +1490,13 @@ static void decode_mid_side_stereo(ChannelElement *cpe, GetBitContext *gb,
|
||||
int ms_present)
|
||||
{
|
||||
int idx;
|
||||
int max_idx = cpe->ch[0].ics.num_window_groups * cpe->ch[0].ics.max_sfb;
|
||||
if (ms_present == 1) {
|
||||
for (idx = 0; idx < max_idx; idx++)
|
||||
for (idx = 0;
|
||||
idx < cpe->ch[0].ics.num_window_groups * cpe->ch[0].ics.max_sfb;
|
||||
idx++)
|
||||
cpe->ms_mask[idx] = get_bits1(gb);
|
||||
} else if (ms_present == 2) {
|
||||
memset(cpe->ms_mask, 1, max_idx * sizeof(cpe->ms_mask[0]));
|
||||
memset(cpe->ms_mask, 1, sizeof(cpe->ms_mask[0]) * cpe->ch[0].ics.num_window_groups * cpe->ch[0].ics.max_sfb);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1643,9 +1618,9 @@ static int decode_spectrum_and_dequant(AACContext *ac, float coef[1024],
|
||||
cfo[k] = ac->random_state;
|
||||
}
|
||||
|
||||
band_energy = ac->fdsp->scalarproduct_float(cfo, cfo, off_len);
|
||||
band_energy = ac->fdsp.scalarproduct_float(cfo, cfo, off_len);
|
||||
scale = sf[idx] / sqrtf(band_energy);
|
||||
ac->fdsp->vector_fmul_scalar(cfo, cfo, scale, off_len);
|
||||
ac->fdsp.vector_fmul_scalar(cfo, cfo, scale, off_len);
|
||||
}
|
||||
} else {
|
||||
const float *vq = ff_aac_codebook_vector_vals[cbt_m1];
|
||||
@@ -1791,7 +1766,7 @@ static int decode_spectrum_and_dequant(AACContext *ac, float coef[1024],
|
||||
}
|
||||
} while (len -= 2);
|
||||
|
||||
ac->fdsp->vector_fmul_scalar(cfo, cfo, sf[idx], off_len);
|
||||
ac->fdsp.vector_fmul_scalar(cfo, cfo, sf[idx], off_len);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2004,7 +1979,7 @@ static void apply_mid_side_stereo(AACContext *ac, ChannelElement *cpe)
|
||||
cpe->ch[0].band_type[idx] < NOISE_BT &&
|
||||
cpe->ch[1].band_type[idx] < NOISE_BT) {
|
||||
for (group = 0; group < ics->group_len[g]; group++) {
|
||||
ac->fdsp->butterflies_float(ch0 + group * 128 + offsets[i],
|
||||
ac->fdsp.butterflies_float(ch0 + group * 128 + offsets[i],
|
||||
ch1 + group * 128 + offsets[i],
|
||||
offsets[i+1] - offsets[i]);
|
||||
}
|
||||
@@ -2043,7 +2018,7 @@ static void apply_intensity_stereo(AACContext *ac,
|
||||
c *= 1 - 2 * cpe->ms_mask[idx];
|
||||
scale = c * sce1->sf[idx];
|
||||
for (group = 0; group < ics->group_len[g]; group++)
|
||||
ac->fdsp->vector_fmul_scalar(coef1 + group * 128 + offsets[i],
|
||||
ac->fdsp.vector_fmul_scalar(coef1 + group * 128 + offsets[i],
|
||||
coef0 + group * 128 + offsets[i],
|
||||
scale,
|
||||
offsets[i + 1] - offsets[i]);
|
||||
@@ -2293,12 +2268,7 @@ static int decode_extension_payload(AACContext *ac, GetBitContext *gb, int cnt,
|
||||
{
|
||||
int crc_flag = 0;
|
||||
int res = cnt;
|
||||
int type = get_bits(gb, 4);
|
||||
|
||||
if (ac->avctx->debug & FF_DEBUG_STARTCODE)
|
||||
av_log(ac->avctx, AV_LOG_DEBUG, "extension type: %d len:%d\n", type, cnt);
|
||||
|
||||
switch (type) { // extension type
|
||||
switch (get_bits(gb, 4)) { // extension type
|
||||
case EXT_SBR_DATA_CRC:
|
||||
crc_flag++;
|
||||
case EXT_SBR_DATA:
|
||||
@@ -2411,15 +2381,15 @@ static void windowing_and_mdct_ltp(AACContext *ac, float *out,
|
||||
const float *swindow_prev = ics->use_kb_window[1] ? ff_aac_kbd_short_128 : ff_sine_128;
|
||||
|
||||
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);
|
||||
} else {
|
||||
memset(in, 0, 448 * sizeof(float));
|
||||
ac->fdsp->vector_fmul(in + 448, in + 448, swindow_prev, 128);
|
||||
ac->fdsp.vector_fmul(in + 448, in + 448, swindow_prev, 128);
|
||||
}
|
||||
if (ics->window_sequence[0] != LONG_START_SEQUENCE) {
|
||||
ac->fdsp->vector_fmul_reverse(in + 1024, in + 1024, lwindow, 1024);
|
||||
ac->fdsp.vector_fmul_reverse(in + 1024, in + 1024, lwindow, 1024);
|
||||
} else {
|
||||
ac->fdsp->vector_fmul_reverse(in + 1024 + 448, in + 1024 + 448, swindow, 128);
|
||||
ac->fdsp.vector_fmul_reverse(in + 1024 + 448, in + 1024 + 448, swindow, 128);
|
||||
memset(in + 1024 + 576, 0, 448 * sizeof(float));
|
||||
}
|
||||
ac->mdct_ltp.mdct_calc(&ac->mdct_ltp, out, in);
|
||||
@@ -2472,17 +2442,17 @@ static void update_ltp(AACContext *ac, SingleChannelElement *sce)
|
||||
if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) {
|
||||
memcpy(saved_ltp, saved, 512 * sizeof(float));
|
||||
memset(saved_ltp + 576, 0, 448 * sizeof(float));
|
||||
ac->fdsp->vector_fmul_reverse(saved_ltp + 448, ac->buf_mdct + 960, &swindow[64], 64);
|
||||
ac->fdsp.vector_fmul_reverse(saved_ltp + 448, ac->buf_mdct + 960, &swindow[64], 64);
|
||||
for (i = 0; i < 64; i++)
|
||||
saved_ltp[i + 512] = ac->buf_mdct[1023 - i] * swindow[63 - i];
|
||||
} else if (ics->window_sequence[0] == LONG_START_SEQUENCE) {
|
||||
memcpy(saved_ltp, ac->buf_mdct + 512, 448 * sizeof(float));
|
||||
memset(saved_ltp + 576, 0, 448 * sizeof(float));
|
||||
ac->fdsp->vector_fmul_reverse(saved_ltp + 448, ac->buf_mdct + 960, &swindow[64], 64);
|
||||
ac->fdsp.vector_fmul_reverse(saved_ltp + 448, ac->buf_mdct + 960, &swindow[64], 64);
|
||||
for (i = 0; i < 64; i++)
|
||||
saved_ltp[i + 512] = ac->buf_mdct[1023 - i] * swindow[63 - i];
|
||||
} else { // LONG_STOP or ONLY_LONG
|
||||
ac->fdsp->vector_fmul_reverse(saved_ltp, ac->buf_mdct + 512, &lwindow[512], 512);
|
||||
ac->fdsp.vector_fmul_reverse(saved_ltp, ac->buf_mdct + 512, &lwindow[512], 512);
|
||||
for (i = 0; i < 512; i++)
|
||||
saved_ltp[i + 512] = ac->buf_mdct[1023 - i] * lwindow[511 - i];
|
||||
}
|
||||
@@ -2523,19 +2493,19 @@ static void imdct_and_windowing(AACContext *ac, SingleChannelElement *sce)
|
||||
*/
|
||||
if ((ics->window_sequence[1] == ONLY_LONG_SEQUENCE || ics->window_sequence[1] == LONG_STOP_SEQUENCE) &&
|
||||
(ics->window_sequence[0] == ONLY_LONG_SEQUENCE || ics->window_sequence[0] == LONG_START_SEQUENCE)) {
|
||||
ac->fdsp->vector_fmul_window( out, saved, buf, lwindow_prev, 512);
|
||||
ac->fdsp.vector_fmul_window( out, saved, buf, lwindow_prev, 512);
|
||||
} else {
|
||||
memcpy( out, saved, 448 * sizeof(float));
|
||||
|
||||
if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) {
|
||||
ac->fdsp->vector_fmul_window(out + 448 + 0*128, saved + 448, buf + 0*128, swindow_prev, 64);
|
||||
ac->fdsp->vector_fmul_window(out + 448 + 1*128, buf + 0*128 + 64, buf + 1*128, swindow, 64);
|
||||
ac->fdsp->vector_fmul_window(out + 448 + 2*128, buf + 1*128 + 64, buf + 2*128, swindow, 64);
|
||||
ac->fdsp->vector_fmul_window(out + 448 + 3*128, buf + 2*128 + 64, buf + 3*128, swindow, 64);
|
||||
ac->fdsp->vector_fmul_window(temp, buf + 3*128 + 64, buf + 4*128, swindow, 64);
|
||||
ac->fdsp.vector_fmul_window(out + 448 + 0*128, saved + 448, buf + 0*128, swindow_prev, 64);
|
||||
ac->fdsp.vector_fmul_window(out + 448 + 1*128, buf + 0*128 + 64, buf + 1*128, swindow, 64);
|
||||
ac->fdsp.vector_fmul_window(out + 448 + 2*128, buf + 1*128 + 64, buf + 2*128, swindow, 64);
|
||||
ac->fdsp.vector_fmul_window(out + 448 + 3*128, buf + 2*128 + 64, buf + 3*128, swindow, 64);
|
||||
ac->fdsp.vector_fmul_window(temp, buf + 3*128 + 64, buf + 4*128, swindow, 64);
|
||||
memcpy( out + 448 + 4*128, temp, 64 * sizeof(float));
|
||||
} else {
|
||||
ac->fdsp->vector_fmul_window(out + 448, saved + 448, buf, swindow_prev, 64);
|
||||
ac->fdsp.vector_fmul_window(out + 448, saved + 448, buf, swindow_prev, 64);
|
||||
memcpy( out + 576, buf + 64, 448 * sizeof(float));
|
||||
}
|
||||
}
|
||||
@@ -2543,9 +2513,9 @@ static void imdct_and_windowing(AACContext *ac, SingleChannelElement *sce)
|
||||
// buffer update
|
||||
if (ics->window_sequence[0] == EIGHT_SHORT_SEQUENCE) {
|
||||
memcpy( saved, temp + 64, 64 * sizeof(float));
|
||||
ac->fdsp->vector_fmul_window(saved + 64, buf + 4*128 + 64, buf + 5*128, swindow, 64);
|
||||
ac->fdsp->vector_fmul_window(saved + 192, buf + 5*128 + 64, buf + 6*128, swindow, 64);
|
||||
ac->fdsp->vector_fmul_window(saved + 320, buf + 6*128 + 64, buf + 7*128, swindow, 64);
|
||||
ac->fdsp.vector_fmul_window(saved + 64, buf + 4*128 + 64, buf + 5*128, swindow, 64);
|
||||
ac->fdsp.vector_fmul_window(saved + 192, buf + 5*128 + 64, buf + 6*128, swindow, 64);
|
||||
ac->fdsp.vector_fmul_window(saved + 320, buf + 6*128 + 64, buf + 7*128, swindow, 64);
|
||||
memcpy( saved + 448, buf + 7*128 + 64, 64 * sizeof(float));
|
||||
} else if (ics->window_sequence[0] == LONG_START_SEQUENCE) {
|
||||
memcpy( saved, buf + 512, 448 * sizeof(float));
|
||||
@@ -2570,10 +2540,10 @@ static void imdct_and_windowing_ld(AACContext *ac, SingleChannelElement *sce)
|
||||
if (ics->use_kb_window[1]) {
|
||||
// AAC LD uses a low overlap sine window instead of a KBD window
|
||||
memcpy(out, saved, 192 * sizeof(float));
|
||||
ac->fdsp->vector_fmul_window(out + 192, saved + 192, buf, ff_sine_128, 64);
|
||||
ac->fdsp.vector_fmul_window(out + 192, saved + 192, buf, ff_sine_128, 64);
|
||||
memcpy( out + 320, buf + 64, 192 * sizeof(float));
|
||||
} else {
|
||||
ac->fdsp->vector_fmul_window(out, saved, buf, ff_sine_512, 256);
|
||||
ac->fdsp.vector_fmul_window(out, saved, buf, ff_sine_512, 256);
|
||||
}
|
||||
|
||||
// buffer update
|
||||
@@ -2746,7 +2716,7 @@ static void spectral_to_sample(AACContext *ac)
|
||||
for (type = 3; type >= 0; type--) {
|
||||
for (i = 0; i < MAX_ELEM_ID; i++) {
|
||||
ChannelElement *che = ac->che[type][i];
|
||||
if (che && che->present) {
|
||||
if (che) {
|
||||
if (type <= TYPE_CPE)
|
||||
apply_channel_coupling(ac, che, type, i, BEFORE_TNS, apply_dependent_coupling);
|
||||
if (ac->oc[1].m4ac.object_type == AOT_AAC_LTP) {
|
||||
@@ -2778,9 +2748,6 @@ static void spectral_to_sample(AACContext *ac)
|
||||
}
|
||||
if (type <= TYPE_CCE)
|
||||
apply_channel_coupling(ac, che, type, i, AFTER_IMDCT, apply_independent_coupling);
|
||||
che->present = 0;
|
||||
} else if (che) {
|
||||
av_log(ac->avctx, AV_LOG_VERBOSE, "ChannelElement %d.%d missing \n", type, i);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2885,7 +2852,6 @@ static int aac_decode_er_frame(AVCodecContext *avctx, void *data,
|
||||
elem_type, elem_id);
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
che->present = 1;
|
||||
if (aot != AOT_ER_AAC_ELD)
|
||||
skip_bits(gb, 4);
|
||||
switch (elem_type) {
|
||||
@@ -2949,9 +2915,6 @@ static int aac_decode_frame_int(AVCodecContext *avctx, void *data,
|
||||
while ((elem_type = get_bits(gb, 3)) != TYPE_END) {
|
||||
elem_id = get_bits(gb, 4);
|
||||
|
||||
if (avctx->debug & FF_DEBUG_STARTCODE)
|
||||
av_log(avctx, AV_LOG_DEBUG, "Elem type:%x id:%x\n", elem_type, elem_id);
|
||||
|
||||
if (elem_type < TYPE_DSE) {
|
||||
if (!(che=get_che(ac, elem_type, elem_id))) {
|
||||
av_log(ac->avctx, AV_LOG_ERROR, "channel element %d.%d is not allocated\n",
|
||||
@@ -2960,7 +2923,6 @@ static int aac_decode_frame_int(AVCodecContext *avctx, void *data,
|
||||
goto fail;
|
||||
}
|
||||
samples = 1024;
|
||||
che->present = 1;
|
||||
}
|
||||
|
||||
switch (elem_type) {
|
||||
@@ -3169,7 +3131,6 @@ static av_cold int aac_decode_close(AVCodecContext *avctx)
|
||||
ff_mdct_end(&ac->mdct_small);
|
||||
ff_mdct_end(&ac->mdct_ld);
|
||||
ff_mdct_end(&ac->mdct_ltp);
|
||||
av_freep(&ac->fdsp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -3479,18 +3440,6 @@ static const AVClass aac_decoder_class = {
|
||||
.version = LIBAVUTIL_VERSION_INT,
|
||||
};
|
||||
|
||||
static const AVProfile profiles[] = {
|
||||
{ FF_PROFILE_AAC_MAIN, "Main" },
|
||||
{ FF_PROFILE_AAC_LOW, "LC" },
|
||||
{ FF_PROFILE_AAC_SSR, "SSR" },
|
||||
{ FF_PROFILE_AAC_LTP, "LTP" },
|
||||
{ FF_PROFILE_AAC_HE, "HE-AAC" },
|
||||
{ FF_PROFILE_AAC_HE_V2, "HE-AACv2" },
|
||||
{ FF_PROFILE_AAC_LD, "LD" },
|
||||
{ FF_PROFILE_AAC_ELD, "ELD" },
|
||||
{ FF_PROFILE_UNKNOWN },
|
||||
};
|
||||
|
||||
AVCodec ff_aac_decoder = {
|
||||
.name = "aac",
|
||||
.long_name = NULL_IF_CONFIG_SMALL("AAC (Advanced Audio Coding)"),
|
||||
@@ -3507,7 +3456,6 @@ AVCodec ff_aac_decoder = {
|
||||
.channel_layouts = aac_channel_layout,
|
||||
.flush = flush,
|
||||
.priv_class = &aac_decoder_class,
|
||||
.profiles = profiles,
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -3530,5 +3478,4 @@ AVCodec ff_aac_latm_decoder = {
|
||||
.capabilities = CODEC_CAP_CHANNEL_CONF | CODEC_CAP_DR1,
|
||||
.channel_layouts = aac_channel_layout,
|
||||
.flush = flush,
|
||||
.profiles = profiles,
|
||||
};
|
||||
|
@@ -252,7 +252,7 @@ static void apply_window_and_mdct(AACEncContext *s, SingleChannelElement *sce,
|
||||
int i;
|
||||
float *output = sce->ret_buf;
|
||||
|
||||
apply_window[sce->ics.window_sequence[0]](s->fdsp, sce, audio);
|
||||
apply_window[sce->ics.window_sequence[0]](&s->fdsp, sce, audio);
|
||||
|
||||
if (sce->ics.window_sequence[0] != EIGHT_SHORT_SEQUENCE)
|
||||
s->mdct1024.mdct_calc(&s->mdct1024, sce->coeffs, output);
|
||||
@@ -567,10 +567,6 @@ static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
|
||||
ics->group_len[w] = wi[ch].grouping[w];
|
||||
|
||||
apply_window_and_mdct(s, &cpe->ch[ch], overlap);
|
||||
if (isnan(cpe->ch->coeffs[0])) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Input contains NaN\n");
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
}
|
||||
start_ch += chans;
|
||||
}
|
||||
@@ -682,7 +678,6 @@ static av_cold int aac_encode_end(AVCodecContext *avctx)
|
||||
ff_psy_preprocess_end(s->psypp);
|
||||
av_freep(&s->buffer.samples);
|
||||
av_freep(&s->cpe);
|
||||
av_freep(&s->fdsp);
|
||||
ff_af_queue_close(&s->afq);
|
||||
return 0;
|
||||
}
|
||||
@@ -691,9 +686,7 @@ static av_cold int dsp_init(AVCodecContext *avctx, AACEncContext *s)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
s->fdsp = avpriv_float_dsp_alloc(avctx->flags & CODEC_FLAG_BITEXACT);
|
||||
if (!s->fdsp)
|
||||
return AVERROR(ENOMEM);
|
||||
avpriv_float_dsp_init(&s->fdsp, avctx->flags & CODEC_FLAG_BITEXACT);
|
||||
|
||||
// window init
|
||||
ff_kbd_window_init(ff_aac_kbd_long_1024, 4.0, 1024);
|
||||
@@ -783,7 +776,7 @@ static av_cold int aac_encode_init(AVCodecContext *avctx)
|
||||
for (i = 0; i < 428; i++)
|
||||
ff_aac_pow34sf_tab[i] = sqrt(ff_aac_pow2sf_tab[i] * sqrt(ff_aac_pow2sf_tab[i]));
|
||||
|
||||
avctx->initial_padding = 1024;
|
||||
avctx->delay = 1024;
|
||||
ff_af_queue_init(avctx, &s->afq);
|
||||
|
||||
return 0;
|
||||
|
@@ -67,7 +67,7 @@ typedef struct AACEncContext {
|
||||
PutBitContext pb;
|
||||
FFTContext mdct1024; ///< long (1024 samples) frame transform context
|
||||
FFTContext mdct128; ///< short (128 samples) frame transform context
|
||||
AVFloatDSPContext *fdsp;
|
||||
AVFloatDSPContext fdsp;
|
||||
float *planar_samples[6]; ///< saved preprocessed input
|
||||
|
||||
int samplerate_index; ///< MPEG-4 samplerate index
|
||||
|
@@ -326,7 +326,7 @@ static int check_n_master(AVCodecContext *avctx, int n_master, int bs_xover_band
|
||||
static int sbr_make_f_master(AACContext *ac, SpectralBandReplication *sbr,
|
||||
SpectrumParameters *spectrum)
|
||||
{
|
||||
unsigned int temp, max_qmf_subbands = 0;
|
||||
unsigned int temp, max_qmf_subbands;
|
||||
unsigned int start_min, stop_min;
|
||||
int k;
|
||||
const int8_t *sbr_offset_ptr;
|
||||
@@ -556,8 +556,7 @@ static int sbr_hf_calc_npatches(AACContext *ac, SpectralBandReplication *sbr)
|
||||
k = sbr->n_master;
|
||||
} while (sb != sbr->kx[1] + sbr->m[1]);
|
||||
|
||||
if (sbr->num_patches > 1 &&
|
||||
sbr->patch_num_subbands[sbr->num_patches - 1] < 3)
|
||||
if (sbr->num_patches > 1 && sbr->patch_num_subbands[sbr->num_patches-1] < 3)
|
||||
sbr->num_patches--;
|
||||
|
||||
return 0;
|
||||
@@ -1612,14 +1611,8 @@ static void sbr_hf_assemble(float Y1[38][64][2],
|
||||
memcpy(q_temp[i + 2*ch_data->t_env[0]], sbr->q_m[0], m_max * sizeof(sbr->q_m[0][0]));
|
||||
}
|
||||
} else if (h_SL) {
|
||||
for (i = 0; i < 4; i++) {
|
||||
memcpy(g_temp[i + 2 * ch_data->t_env[0]],
|
||||
g_temp[i + 2 * ch_data->t_env_num_env_old],
|
||||
sizeof(g_temp[0]));
|
||||
memcpy(q_temp[i + 2 * ch_data->t_env[0]],
|
||||
q_temp[i + 2 * ch_data->t_env_num_env_old],
|
||||
sizeof(q_temp[0]));
|
||||
}
|
||||
memcpy(g_temp[2*ch_data->t_env[0]], g_temp[2*ch_data->t_env_num_env_old], 4*sizeof(g_temp[0]));
|
||||
memcpy(q_temp[2*ch_data->t_env[0]], q_temp[2*ch_data->t_env_num_env_old], 4*sizeof(q_temp[0]));
|
||||
}
|
||||
|
||||
for (e = 0; e < ch_data->bs_num_env; e++) {
|
||||
@@ -1700,7 +1693,7 @@ void ff_sbr_apply(AACContext *ac, SpectralBandReplication *sbr, int id_aac,
|
||||
}
|
||||
for (ch = 0; ch < nch; ch++) {
|
||||
/* decode channel */
|
||||
sbr_qmf_analysis(ac->fdsp, &sbr->mdct_ana, &sbr->dsp, ch ? R : L, sbr->data[ch].analysis_filterbank_samples,
|
||||
sbr_qmf_analysis(&ac->fdsp, &sbr->mdct_ana, &sbr->dsp, ch ? R : L, sbr->data[ch].analysis_filterbank_samples,
|
||||
(float*)sbr->qmf_filter_scratch,
|
||||
sbr->data[ch].W, sbr->data[ch].Ypos);
|
||||
sbr->c.sbr_lf_gen(ac, sbr, sbr->X_low,
|
||||
@@ -1746,13 +1739,13 @@ void ff_sbr_apply(AACContext *ac, SpectralBandReplication *sbr, int id_aac,
|
||||
nch = 2;
|
||||
}
|
||||
|
||||
sbr_qmf_synthesis(&sbr->mdct, &sbr->dsp, ac->fdsp,
|
||||
sbr_qmf_synthesis(&sbr->mdct, &sbr->dsp, &ac->fdsp,
|
||||
L, sbr->X[0], sbr->qmf_filter_scratch,
|
||||
sbr->data[0].synthesis_filterbank_samples,
|
||||
&sbr->data[0].synthesis_filterbank_samples_offset,
|
||||
downsampled);
|
||||
if (nch == 2)
|
||||
sbr_qmf_synthesis(&sbr->mdct, &sbr->dsp, ac->fdsp,
|
||||
sbr_qmf_synthesis(&sbr->mdct, &sbr->dsp, &ac->fdsp,
|
||||
R, sbr->X[1], sbr->qmf_filter_scratch,
|
||||
sbr->data[1].synthesis_filterbank_samples,
|
||||
&sbr->data[1].synthesis_filterbank_samples_offset,
|
||||
|
@@ -376,8 +376,7 @@ function ff_fft_calc_neon, export=1
|
||||
ld1 {v30.16b}, [x10]
|
||||
mov x7, #-8
|
||||
movrel x12, pmmp
|
||||
ldr x4, [x3, x2, lsl #3]
|
||||
add x3, x3, x4
|
||||
ldr x3, [x3, x2, lsl #3]
|
||||
movrel x13, mppm
|
||||
movrel x14, X(ff_cos_16)
|
||||
ld1 {v31.16b}, [x11]
|
||||
@@ -417,21 +416,21 @@ function ff_fft_permute_neon, export=1
|
||||
endfunc
|
||||
|
||||
const fft_tab_neon
|
||||
.quad fft4_neon - fft_tab_neon
|
||||
.quad fft8_neon - fft_tab_neon
|
||||
.quad fft16_neon - fft_tab_neon
|
||||
.quad fft32_neon - fft_tab_neon
|
||||
.quad fft64_neon - fft_tab_neon
|
||||
.quad fft128_neon - fft_tab_neon
|
||||
.quad fft256_neon - fft_tab_neon
|
||||
.quad fft512_neon - fft_tab_neon
|
||||
.quad fft1024_neon - fft_tab_neon
|
||||
.quad fft2048_neon - fft_tab_neon
|
||||
.quad fft4096_neon - fft_tab_neon
|
||||
.quad fft8192_neon - fft_tab_neon
|
||||
.quad fft16384_neon - fft_tab_neon
|
||||
.quad fft32768_neon - fft_tab_neon
|
||||
.quad fft65536_neon - fft_tab_neon
|
||||
.quad fft4_neon
|
||||
.quad fft8_neon
|
||||
.quad fft16_neon
|
||||
.quad fft32_neon
|
||||
.quad fft64_neon
|
||||
.quad fft128_neon
|
||||
.quad fft256_neon
|
||||
.quad fft512_neon
|
||||
.quad fft1024_neon
|
||||
.quad fft2048_neon
|
||||
.quad fft4096_neon
|
||||
.quad fft8192_neon
|
||||
.quad fft16384_neon
|
||||
.quad fft32768_neon
|
||||
.quad fft65536_neon
|
||||
endconst
|
||||
|
||||
const pmmp, align=4
|
||||
|
@@ -438,8 +438,8 @@ function fft_b15_calc_neon
|
||||
uzp1 v12.4s, v4.4s, v5.4s // exp[11 - 14].re
|
||||
uzp2 v13.4s, v4.4s, v5.4s // exp[11 - 14].im
|
||||
zip1 v14.4s, v6.4s, v7.4s // exp[5,10].re/exp[5,10].im
|
||||
ldr x6, [x5, x3, lsl #3]
|
||||
add x5, x5, x6
|
||||
add x5, x5, x3, lsl #3
|
||||
ldr x5, [x5]
|
||||
mov x10, x0
|
||||
blr x5
|
||||
ldp x20, x30, [sp]
|
||||
@@ -452,13 +452,13 @@ function fft_b15_calc_neon
|
||||
endfunc
|
||||
|
||||
const fft_tab_neon
|
||||
.quad fft15_neon - fft_tab_neon
|
||||
.quad fft30_neon - fft_tab_neon
|
||||
.quad fft60_neon - fft_tab_neon
|
||||
.quad fft120_neon - fft_tab_neon
|
||||
.quad fft240_neon - fft_tab_neon
|
||||
.quad fft480_neon - fft_tab_neon
|
||||
.quad fft960_neon - fft_tab_neon
|
||||
.quad fft15_neon
|
||||
.quad fft30_neon
|
||||
.quad fft60_neon
|
||||
.quad fft120_neon
|
||||
.quad fft240_neon
|
||||
.quad fft480_neon
|
||||
.quad fft960_neon
|
||||
endconst
|
||||
|
||||
function ff_celt_imdct_half_neon, export=1
|
||||
|
@@ -195,7 +195,7 @@ static av_cold int ac3_decode_init(AVCodecContext *avctx)
|
||||
#if (USE_FIXED)
|
||||
s->fdsp = avpriv_alloc_fixed_dsp(avctx->flags & CODEC_FLAG_BITEXACT);
|
||||
#else
|
||||
s->fdsp = avpriv_float_dsp_alloc(avctx->flags & CODEC_FLAG_BITEXACT);
|
||||
avpriv_float_dsp_init(&s->fdsp, avctx->flags & CODEC_FLAG_BITEXACT);
|
||||
#endif
|
||||
|
||||
ff_ac3dsp_init(&s->ac3dsp, avctx->flags & CODEC_FLAG_BITEXACT);
|
||||
@@ -688,7 +688,7 @@ static inline void do_imdct(AC3DecodeContext *s, int channels)
|
||||
s->fdsp->vector_fmul_window_scaled(s->outptr[ch - 1], s->delay[ch - 1],
|
||||
s->tmp_output, s->window, 128, 8);
|
||||
#else
|
||||
s->fdsp->vector_fmul_window(s->outptr[ch - 1], s->delay[ch - 1],
|
||||
s->fdsp.vector_fmul_window(s->outptr[ch - 1], s->delay[ch - 1],
|
||||
s->tmp_output, s->window, 128);
|
||||
#endif
|
||||
for (i = 0; i < 128; i++)
|
||||
@@ -700,7 +700,7 @@ static inline void do_imdct(AC3DecodeContext *s, int channels)
|
||||
s->fdsp->vector_fmul_window_scaled(s->outptr[ch - 1], s->delay[ch - 1],
|
||||
s->tmp_output, s->window, 128, 8);
|
||||
#else
|
||||
s->fdsp->vector_fmul_window(s->outptr[ch - 1], s->delay[ch - 1],
|
||||
s->fdsp.vector_fmul_window(s->outptr[ch - 1], s->delay[ch - 1],
|
||||
s->tmp_output, s->window, 128);
|
||||
#endif
|
||||
memcpy(s->delay[ch - 1], s->tmp_output + 128, 128 * sizeof(FFTSample));
|
||||
@@ -1635,7 +1635,9 @@ static av_cold int ac3_decode_end(AVCodecContext *avctx)
|
||||
AC3DecodeContext *s = avctx->priv_data;
|
||||
ff_mdct_end(&s->imdct_512);
|
||||
ff_mdct_end(&s->imdct_256);
|
||||
#if (USE_FIXED)
|
||||
av_freep(&s->fdsp);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@@ -218,7 +218,7 @@ typedef struct AC3DecodeContext {
|
||||
#if USE_FIXED
|
||||
AVFixedDSPContext *fdsp;
|
||||
#else
|
||||
AVFloatDSPContext *fdsp;
|
||||
AVFloatDSPContext fdsp;
|
||||
#endif
|
||||
AC3DSPContext ac3dsp;
|
||||
FmtConvertContext fmt_conv; ///< optimized conversion functions
|
||||
|
@@ -2035,7 +2035,6 @@ av_cold int ff_ac3_encode_close(AVCodecContext *avctx)
|
||||
av_freep(&s->qmant_buffer);
|
||||
av_freep(&s->cpl_coord_exp_buffer);
|
||||
av_freep(&s->cpl_coord_mant_buffer);
|
||||
av_freep(&s->fdsp);
|
||||
for (blk = 0; blk < s->num_blocks; blk++) {
|
||||
AC3Block *block = &s->blocks[blk];
|
||||
av_freep(&block->mdct_coef);
|
||||
@@ -2435,7 +2434,7 @@ av_cold int ff_ac3_encode_init(AVCodecContext *avctx)
|
||||
return ret;
|
||||
|
||||
avctx->frame_size = AC3_BLOCK_SIZE * s->num_blocks;
|
||||
avctx->initial_padding = AC3_BLOCK_SIZE;
|
||||
avctx->delay = AC3_BLOCK_SIZE;
|
||||
|
||||
s->bitstream_mode = avctx->audio_service_type;
|
||||
if (s->bitstream_mode == AV_AUDIO_SERVICE_TYPE_KARAOKE)
|
||||
|
@@ -80,14 +80,12 @@ typedef int64_t CoefSumType;
|
||||
#define AC3ENC_OPT_NOT_INDICATED 0
|
||||
#define AC3ENC_OPT_MODE_ON 2
|
||||
#define AC3ENC_OPT_MODE_OFF 1
|
||||
#define AC3ENC_OPT_DSUREX_DPLIIZ 3
|
||||
|
||||
/* specific option values */
|
||||
#define AC3ENC_OPT_LARGE_ROOM 1
|
||||
#define AC3ENC_OPT_SMALL_ROOM 2
|
||||
#define AC3ENC_OPT_DOWNMIX_LTRT 1
|
||||
#define AC3ENC_OPT_DOWNMIX_LORO 2
|
||||
#define AC3ENC_OPT_DOWNMIX_DPLII 3 // reserved value in A/52, but used by encoders to indicate DPL2
|
||||
#define AC3ENC_OPT_ADCONV_STANDARD 0
|
||||
#define AC3ENC_OPT_ADCONV_HDCD 1
|
||||
|
||||
@@ -165,7 +163,7 @@ typedef struct AC3EncodeContext {
|
||||
AVCodecContext *avctx; ///< parent AVCodecContext
|
||||
PutBitContext pb; ///< bitstream writer context
|
||||
AudioDSPContext adsp;
|
||||
AVFloatDSPContext *fdsp;
|
||||
AVFloatDSPContext fdsp;
|
||||
MECmpContext mecc;
|
||||
AC3DSPContext ac3dsp; ///< AC-3 optimized functions
|
||||
FFTContext mdct; ///< FFT context for MDCT calculation
|
||||
|
@@ -139,9 +139,7 @@ static CoefType calc_cpl_coord(CoefSumType energy_ch, CoefSumType energy_cpl)
|
||||
av_cold int ff_ac3_float_encode_init(AVCodecContext *avctx)
|
||||
{
|
||||
AC3EncodeContext *s = avctx->priv_data;
|
||||
s->fdsp = avpriv_float_dsp_alloc(avctx->flags & CODEC_FLAG_BITEXACT);
|
||||
if (!s->fdsp)
|
||||
return AVERROR(ENOMEM);
|
||||
avpriv_float_dsp_init(&s->fdsp, avctx->flags & CODEC_FLAG_BITEXACT);
|
||||
return ff_ac3_encode_init(avctx);
|
||||
}
|
||||
|
||||
|
@@ -46,20 +46,18 @@ static const AVOption ac3_options[] = {
|
||||
{"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"},
|
||||
{"dmix_mode", "Preferred Stereo Downmix Mode", OFFSET(preferred_stereo_downmix), AV_OPT_TYPE_INT, {.i64 = AC3ENC_OPT_NONE }, AC3ENC_OPT_NONE, AC3ENC_OPT_DOWNMIX_LORO, 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"},
|
||||
{"dsurex_mode", "Dolby Surround EX Mode", OFFSET(dolby_surround_ex_mode), AV_OPT_TYPE_INT, {.i64 = AC3ENC_OPT_NONE }, AC3ENC_OPT_NONE, AC3ENC_OPT_MODE_ON, 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"},
|
||||
|
@@ -108,7 +108,7 @@ static void apply_mdct(AC3EncodeContext *s)
|
||||
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);
|
||||
#else
|
||||
s->ac3dsp.apply_window_int16(s->windowed_samples, input_samples,
|
||||
@@ -443,7 +443,7 @@ int AC3_NAME(encode_frame)(AVCodecContext *avctx, AVPacket *avpkt,
|
||||
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);
|
||||
avpkt->pts = frame->pts - ff_samples_to_time_base(avctx, avctx->delay);
|
||||
|
||||
*got_packet_ptr = 1;
|
||||
return 0;
|
||||
|
@@ -43,12 +43,14 @@ static void adx_encode(ADXContext *c, uint8_t *adx, const int16_t *wav,
|
||||
int s0, s1, s2, d;
|
||||
int max = 0;
|
||||
int min = 0;
|
||||
int data[BLOCK_SAMPLES];
|
||||
|
||||
s1 = prev->s1;
|
||||
s2 = prev->s2;
|
||||
for (i = 0, j = 0; j < 32; i += channels, j++) {
|
||||
s0 = wav[i];
|
||||
d = ((s0 << COEFF_BITS) - c->coeff[0] * s1 - c->coeff[1] * s2) >> COEFF_BITS;
|
||||
data[j] = d;
|
||||
if (max < d)
|
||||
max = d;
|
||||
if (min > d)
|
||||
@@ -56,10 +58,10 @@ static void adx_encode(ADXContext *c, uint8_t *adx, const int16_t *wav,
|
||||
s2 = s1;
|
||||
s1 = s0;
|
||||
}
|
||||
prev->s1 = s1;
|
||||
prev->s2 = s2;
|
||||
|
||||
if (max == 0 && min == 0) {
|
||||
prev->s1 = s1;
|
||||
prev->s2 = s2;
|
||||
memset(adx, 0, BLOCK_SIZE);
|
||||
return;
|
||||
}
|
||||
@@ -75,23 +77,8 @@ static void adx_encode(ADXContext *c, uint8_t *adx, const int16_t *wav,
|
||||
AV_WB16(adx, scale);
|
||||
|
||||
init_put_bits(&pb, adx + 2, 16);
|
||||
|
||||
s1 = prev->s1;
|
||||
s2 = prev->s2;
|
||||
for (i = 0, j = 0; j < 32; i += channels, j++) {
|
||||
d = ((wav[i] << COEFF_BITS) - c->coeff[0] * s1 - c->coeff[1] * s2) >> COEFF_BITS;
|
||||
|
||||
d = av_clip(ROUNDED_DIV(d, scale), -8, 7);
|
||||
|
||||
put_sbits(&pb, 4, d);
|
||||
|
||||
s0 = ((d << COEFF_BITS) * scale + c->coeff[0] * s1 + c->coeff[1] * s2) >> COEFF_BITS;
|
||||
s2 = s1;
|
||||
s1 = s0;
|
||||
}
|
||||
prev->s1 = s1;
|
||||
prev->s2 = s2;
|
||||
|
||||
for (i = 0; i < BLOCK_SAMPLES; i++)
|
||||
put_sbits(&pb, 4, av_clip(data[i] / scale, -8, 7));
|
||||
flush_put_bits(&pb);
|
||||
}
|
||||
|
||||
|
@@ -429,9 +429,10 @@ static void write_element(AlacEncodeContext *s,
|
||||
|
||||
// write extra bits if needed
|
||||
if (s->extra_bits) {
|
||||
uint32_t mask = (1 << s->extra_bits) - 1;
|
||||
for (i = 0; i < s->frame_size; i++) {
|
||||
for (j = 0; j < channels; j++) {
|
||||
put_bits(pb, s->extra_bits, s->predictor_buf[j][i]);
|
||||
put_bits(pb, s->extra_bits, s->predictor_buf[j][i] & mask);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -443,7 +444,7 @@ static void write_element(AlacEncodeContext *s,
|
||||
// TODO: determine when this will actually help. for now it's not used.
|
||||
if (prediction_type == 15) {
|
||||
// 2nd pass 1st order filter
|
||||
int32_t *residual = s->predictor_buf[i];
|
||||
int32_t *residual = s->predictor_buf[channels];
|
||||
for (j = s->frame_size - 1; j > 0; j--)
|
||||
residual[j] -= residual[j - 1];
|
||||
}
|
||||
|
@@ -105,7 +105,6 @@ void avcodec_register_all(void)
|
||||
REGISTER_ENCDEC (AMV, amv);
|
||||
REGISTER_DECODER(ANM, anm);
|
||||
REGISTER_DECODER(ANSI, ansi);
|
||||
REGISTER_DECODER(APNG, apng);
|
||||
REGISTER_ENCDEC (ASV1, asv1);
|
||||
REGISTER_ENCDEC (ASV2, asv2);
|
||||
REGISTER_DECODER(AURA, aura);
|
||||
@@ -491,7 +490,6 @@ void avcodec_register_all(void)
|
||||
REGISTER_DECODER(REALTEXT, realtext);
|
||||
REGISTER_DECODER(SAMI, sami);
|
||||
REGISTER_ENCDEC (SRT, srt);
|
||||
REGISTER_DECODER(STL, stl);
|
||||
REGISTER_ENCDEC (SUBRIP, subrip);
|
||||
REGISTER_DECODER(SUBVIEWER, subviewer);
|
||||
REGISTER_DECODER(SUBVIEWER1, subviewer1);
|
||||
|
@@ -24,14 +24,14 @@
|
||||
#include "asm.h"
|
||||
|
||||
void put_pixels_clamped_mvi_asm(const int16_t *block, uint8_t *pixels,
|
||||
ptrdiff_t line_size);
|
||||
int line_size);
|
||||
void add_pixels_clamped_mvi_asm(const int16_t *block, uint8_t *pixels,
|
||||
ptrdiff_t line_size);
|
||||
int line_size);
|
||||
|
||||
void (*put_pixels_clamped_axp_p)(const int16_t *block, uint8_t *pixels,
|
||||
ptrdiff_t line_size);
|
||||
int line_size);
|
||||
void (*add_pixels_clamped_axp_p)(const int16_t *block, uint8_t *pixels,
|
||||
ptrdiff_t line_size);
|
||||
int line_size);
|
||||
|
||||
#if 0
|
||||
/* These functions were the base for the optimized assembler routines,
|
||||
|
@@ -23,9 +23,9 @@
|
||||
#include <stdint.h>
|
||||
|
||||
extern void (*put_pixels_clamped_axp_p)(const int16_t *block, uint8_t *pixels,
|
||||
ptrdiff_t line_size);
|
||||
int line_size);
|
||||
extern void (*add_pixels_clamped_axp_p)(const int16_t *block, uint8_t *pixels,
|
||||
ptrdiff_t line_size);
|
||||
int line_size);
|
||||
|
||||
void ff_simple_idct_axp(int16_t *block);
|
||||
void ff_simple_idct_put_axp(uint8_t *dest, int line_size, int16_t *block);
|
||||
|
@@ -33,7 +33,7 @@
|
||||
|
||||
/************************************************************************
|
||||
* void put_pixels_clamped_mvi_asm(const int16_t *block, uint8_t *pixels,
|
||||
* ptrdiff_t line_size)
|
||||
* int line_size)
|
||||
*/
|
||||
.align 6
|
||||
.globl put_pixels_clamped_mvi_asm
|
||||
@@ -83,7 +83,7 @@ put_pixels_clamped_mvi_asm:
|
||||
|
||||
/************************************************************************
|
||||
* void add_pixels_clamped_mvi_asm(const int16_t *block, uint8_t *pixels,
|
||||
* ptrdiff_t line_size)
|
||||
* int line_size)
|
||||
*/
|
||||
.align 6
|
||||
.globl add_pixels_clamped_mvi_asm
|
||||
|
@@ -47,10 +47,8 @@ static av_cold int decode_init(AVCodecContext *avctx)
|
||||
return AVERROR(ENOMEM);
|
||||
|
||||
bytestream2_init(&s->gb, avctx->extradata, avctx->extradata_size);
|
||||
if (bytestream2_get_bytes_left(&s->gb) < 16 * 8 + 4 * 256) {
|
||||
av_frame_free(&s->frame);
|
||||
if (bytestream2_get_bytes_left(&s->gb) < 16 * 8 + 4 * 256)
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
bytestream2_skipu(&s->gb, 16 * 8);
|
||||
for (i = 0; i < 256; i++)
|
||||
|
@@ -90,11 +90,9 @@ static av_cold int decode_init(AVCodecContext *avctx)
|
||||
s->fg = DEFAULT_FG_COLOR;
|
||||
s->bg = DEFAULT_BG_COLOR;
|
||||
|
||||
if (!avctx->width || !avctx->height) {
|
||||
int ret = ff_set_dimensions(avctx, 80 << 3, 25 << 4);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
if (!avctx->width || !avctx->height)
|
||||
ff_set_dimensions(avctx, 80 << 3, 25 << 4);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@@ -1,41 +0,0 @@
|
||||
/*
|
||||
* APNG common header
|
||||
* Copyright (c) 2014 Benoit Fouet
|
||||
*
|
||||
* 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
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file
|
||||
* APNG common header
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_APNG_H
|
||||
#define AVCODEC_APNG_H
|
||||
|
||||
enum {
|
||||
APNG_DISPOSE_OP_NONE = 0,
|
||||
APNG_DISPOSE_OP_BACKGROUND = 1,
|
||||
APNG_DISPOSE_OP_PREVIOUS = 2,
|
||||
};
|
||||
|
||||
enum {
|
||||
APNG_BLEND_OP_SOURCE = 0,
|
||||
APNG_BLEND_OP_OVER = 1,
|
||||
};
|
||||
|
||||
#endif /* AVCODEC_APNG_H */
|
@@ -24,7 +24,7 @@
|
||||
void ff_flac_lpc_16_arm(int32_t *samples, const int coeffs[32], int order,
|
||||
int qlevel, int len);
|
||||
|
||||
av_cold void ff_flacdsp_init_arm(FLACDSPContext *c, enum AVSampleFormat fmt, int channels,
|
||||
av_cold void ff_flacdsp_init_arm(FLACDSPContext *c, enum AVSampleFormat fmt,
|
||||
int bps)
|
||||
{
|
||||
if (bps <= 16 && CONFIG_FLAC_DECODER)
|
||||
|
@@ -22,7 +22,7 @@
|
||||
#include "config.h"
|
||||
#include "libavutil/arm/asm.S"
|
||||
|
||||
@ void ff_add_pixels_clamped_arm(int16_t *block, uint8_t *dest, ptrdiff_t stride)
|
||||
@ void ff_add_pixels_clamped_arm(int16_t *block, uint8_t *dest, int stride)
|
||||
function ff_add_pixels_clamped_arm, export=1, align=5
|
||||
push {r4-r10}
|
||||
mov r10, #8
|
||||
|
@@ -30,7 +30,7 @@
|
||||
#include "idctdsp_arm.h"
|
||||
|
||||
void ff_add_pixels_clamped_arm(const int16_t *block, uint8_t *dest,
|
||||
ptrdiff_t line_size);
|
||||
int line_size);
|
||||
|
||||
/* XXX: those functions should be suppressed ASAP when all IDCTs are
|
||||
* converted */
|
||||
|
@@ -27,7 +27,7 @@
|
||||
#include "idctdsp_arm.h"
|
||||
|
||||
void ff_add_pixels_clamped_armv6(const int16_t *block, uint8_t *pixels,
|
||||
ptrdiff_t line_size);
|
||||
int line_size);
|
||||
|
||||
av_cold void ff_idctdsp_init_armv6(IDCTDSPContext *c, AVCodecContext *avctx,
|
||||
unsigned high_bit_depth)
|
||||
|
@@ -27,9 +27,9 @@
|
||||
#include "idct.h"
|
||||
#include "idctdsp_arm.h"
|
||||
|
||||
void ff_add_pixels_clamped_neon(const int16_t *, uint8_t *, ptrdiff_t);
|
||||
void ff_put_pixels_clamped_neon(const int16_t *, uint8_t *, ptrdiff_t);
|
||||
void ff_put_signed_pixels_clamped_neon(const int16_t *, uint8_t *, ptrdiff_t);
|
||||
void ff_add_pixels_clamped_neon(const int16_t *, uint8_t *, int);
|
||||
void ff_put_pixels_clamped_neon(const int16_t *, uint8_t *, int);
|
||||
void ff_put_signed_pixels_clamped_neon(const int16_t *, uint8_t *, int);
|
||||
|
||||
av_cold void ff_idctdsp_init_neon(IDCTDSPContext *c, AVCodecContext *avctx,
|
||||
unsigned high_bit_depth)
|
||||
|
@@ -26,17 +26,17 @@
|
||||
#include "libavcodec/mpegvideo.h"
|
||||
|
||||
int ff_pix_abs16_armv6(MpegEncContext *s, uint8_t *blk1, uint8_t *blk2,
|
||||
ptrdiff_t stride, int h);
|
||||
int line_size, int h);
|
||||
int ff_pix_abs16_x2_armv6(MpegEncContext *s, uint8_t *blk1, uint8_t *blk2,
|
||||
ptrdiff_t stride, int h);
|
||||
int line_size, int h);
|
||||
int ff_pix_abs16_y2_armv6(MpegEncContext *s, uint8_t *blk1, uint8_t *blk2,
|
||||
ptrdiff_t stride, int h);
|
||||
int line_size, int h);
|
||||
|
||||
int ff_pix_abs8_armv6(MpegEncContext *s, uint8_t *blk1, uint8_t *blk2,
|
||||
ptrdiff_t stride, int h);
|
||||
int line_size, int h);
|
||||
|
||||
int ff_sse16_armv6(MpegEncContext *s, uint8_t *blk1, uint8_t *blk2,
|
||||
ptrdiff_t stride, int h);
|
||||
int line_size, int h);
|
||||
|
||||
av_cold void ff_me_cmp_init_arm(MECmpContext *c, AVCodecContext *avctx)
|
||||
{
|
||||
|
@@ -34,39 +34,16 @@ int ff_ass_subtitle_header(AVCodecContext *avctx,
|
||||
{
|
||||
avctx->subtitle_header = av_asprintf(
|
||||
"[Script Info]\r\n"
|
||||
"; Script generated by FFmpeg/Lavc%s\r\n"
|
||||
"ScriptType: v4.00+\r\n"
|
||||
"PlayResX: 384\r\n"
|
||||
"PlayResY: 288\r\n"
|
||||
"\r\n"
|
||||
"[V4+ Styles]\r\n"
|
||||
|
||||
/* ASSv4 header */
|
||||
"Format: Name, "
|
||||
"Fontname, Fontsize, "
|
||||
"PrimaryColour, SecondaryColour, OutlineColour, BackColour, "
|
||||
"Bold, Italic, Underline, StrikeOut, "
|
||||
"ScaleX, ScaleY, "
|
||||
"Spacing, Angle, "
|
||||
"BorderStyle, Outline, Shadow, "
|
||||
"Alignment, MarginL, MarginR, MarginV, "
|
||||
"Encoding\r\n"
|
||||
|
||||
"Style: "
|
||||
"Default," /* Name */
|
||||
"%s,%d," /* Font{name,size} */
|
||||
"&H%x,&H%x,&H%x,&H%x," /* {Primary,Secondary,Outline,Back}Colour */
|
||||
"%d,%d,%d,0," /* Bold, Italic, Underline, StrikeOut */
|
||||
"100,100," /* Scale{X,Y} */
|
||||
"0,0," /* Spacing, Angle */
|
||||
"1,1,0," /* BorderStyle, Outline, Shadow */
|
||||
"%d,10,10,10," /* Alignment, Margin[LRV] */
|
||||
"0\r\n" /* Encoding */
|
||||
|
||||
"Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, AlphaLevel, Encoding\r\n"
|
||||
"Style: Default,%s,%d,&H%x,&H%x,&H%x,&H%x,%d,%d,%d,1,1,0,%d,10,10,10,0,0\r\n"
|
||||
"\r\n"
|
||||
"[Events]\r\n"
|
||||
"Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text\r\n",
|
||||
!(avctx->flags & CODEC_FLAG_BITEXACT) ? AV_STRINGIFY(LIBAVCODEC_VERSION) : "",
|
||||
"Format: Layer, Start, End, Style, Text\r\n",
|
||||
font, font_size, color, color, back_color, back_color,
|
||||
-bold, -italic, -underline, alignment);
|
||||
|
||||
@@ -127,7 +104,7 @@ int ff_ass_bprint_dialog(AVBPrint *buf, const char *dialog,
|
||||
insert_ts(buf, ts_start);
|
||||
insert_ts(buf, duration == -1 ? -1 : ts_start + duration);
|
||||
if (raw != 2)
|
||||
av_bprintf(buf, "Default,,0,0,0,,");
|
||||
av_bprintf(buf, "Default,");
|
||||
}
|
||||
|
||||
dlen = strcspn(dialog, "\n");
|
||||
@@ -174,15 +151,6 @@ err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ff_ass_add_rect_bprint(AVSubtitle *sub, AVBPrint *buf,
|
||||
int ts_start, int duration)
|
||||
{
|
||||
av_bprintf(buf, "\r\n");
|
||||
if (!av_bprint_is_complete(buf))
|
||||
return AVERROR(ENOMEM);
|
||||
return ff_ass_add_rect(sub, buf->str, ts_start, duration, 0);
|
||||
}
|
||||
|
||||
void ff_ass_bprint_text_event(AVBPrint *buf, const char *p, int size,
|
||||
const char *linebreaks, int keep_ass_markup)
|
||||
{
|
||||
@@ -219,4 +187,5 @@ void ff_ass_bprint_text_event(AVBPrint *buf, const char *p, int size,
|
||||
av_bprint_chars(buf, *p, 1);
|
||||
}
|
||||
}
|
||||
av_bprintf(buf, "\r\n");
|
||||
}
|
||||
|
@@ -91,13 +91,6 @@ int ff_ass_subtitle_header_default(AVCodecContext *avctx);
|
||||
int ff_ass_add_rect(AVSubtitle *sub, const char *dialog,
|
||||
int ts_start, int duration, int raw);
|
||||
|
||||
/**
|
||||
* Same as ff_ass_add_rect_bprint, but taking an AVBPrint buffer instead of a
|
||||
* string, and assuming raw=0.
|
||||
*/
|
||||
int ff_ass_add_rect_bprint(AVSubtitle *sub, AVBPrint *buf,
|
||||
int ts_start, int duration);
|
||||
|
||||
/**
|
||||
* Add an ASS dialog line to an AVBPrint buffer.
|
||||
*
|
||||
|
@@ -44,7 +44,7 @@ typedef struct {
|
||||
int size;
|
||||
int offset;
|
||||
int offset_count;
|
||||
ASSFields fields[24];
|
||||
ASSFields fields[10];
|
||||
} ASSSection;
|
||||
|
||||
static const ASSSection ass_sections[] = {
|
||||
@@ -64,29 +64,15 @@ static const ASSSection ass_sections[] = {
|
||||
.size = sizeof(ASSStyle),
|
||||
.offset = offsetof(ASS, styles),
|
||||
.offset_count = offsetof(ASS, styles_count),
|
||||
.fields = {{"Name", ASS_STR, offsetof(ASSStyle, name) },
|
||||
{"Fontname", ASS_STR, offsetof(ASSStyle, font_name) },
|
||||
{"Fontsize", ASS_INT, offsetof(ASSStyle, font_size) },
|
||||
{"PrimaryColour", ASS_COLOR, offsetof(ASSStyle, primary_color) },
|
||||
{"SecondaryColour", ASS_COLOR, offsetof(ASSStyle, secondary_color)},
|
||||
{"OutlineColour", ASS_COLOR, offsetof(ASSStyle, outline_color) },
|
||||
{"BackColour", ASS_COLOR, offsetof(ASSStyle, back_color) },
|
||||
{"Bold", ASS_INT, offsetof(ASSStyle, bold) },
|
||||
{"Italic", ASS_INT, offsetof(ASSStyle, italic) },
|
||||
{"Underline", ASS_INT, offsetof(ASSStyle, underline) },
|
||||
{"StrikeOut", ASS_INT, offsetof(ASSStyle, strikeout) },
|
||||
{"ScaleX", ASS_FLT, offsetof(ASSStyle, scalex) },
|
||||
{"ScaleY", ASS_FLT, offsetof(ASSStyle, scaley) },
|
||||
{"Spacing", ASS_FLT, offsetof(ASSStyle, spacing) },
|
||||
{"Angle", ASS_FLT, offsetof(ASSStyle, angle) },
|
||||
{"BorderStyle", ASS_INT, offsetof(ASSStyle, border_style) },
|
||||
{"Outline", ASS_FLT, offsetof(ASSStyle, outline) },
|
||||
{"Shadow", ASS_FLT, offsetof(ASSStyle, shadow) },
|
||||
{"Alignment", ASS_INT, offsetof(ASSStyle, alignment) },
|
||||
{"MarginL", ASS_INT, offsetof(ASSStyle, margin_l) },
|
||||
{"MarginR", ASS_INT, offsetof(ASSStyle, margin_r) },
|
||||
{"MarginV", ASS_INT, offsetof(ASSStyle, margin_v) },
|
||||
{"Encoding", ASS_INT, offsetof(ASSStyle, encoding) },
|
||||
.fields = {{"Name", ASS_STR, offsetof(ASSStyle, name) },
|
||||
{"Fontname", ASS_STR, offsetof(ASSStyle, font_name) },
|
||||
{"Fontsize", ASS_INT, offsetof(ASSStyle, font_size) },
|
||||
{"PrimaryColour",ASS_COLOR,offsetof(ASSStyle, primary_color)},
|
||||
{"BackColour", ASS_COLOR,offsetof(ASSStyle, back_color) },
|
||||
{"Bold", ASS_INT, offsetof(ASSStyle, bold) },
|
||||
{"Italic", ASS_INT, offsetof(ASSStyle, italic) },
|
||||
{"Underline", ASS_INT, offsetof(ASSStyle, underline) },
|
||||
{"Alignment", ASS_INT, offsetof(ASSStyle, alignment) },
|
||||
{0},
|
||||
}
|
||||
},
|
||||
@@ -96,24 +82,14 @@ static const ASSSection ass_sections[] = {
|
||||
.size = sizeof(ASSStyle),
|
||||
.offset = offsetof(ASS, styles),
|
||||
.offset_count = offsetof(ASS, styles_count),
|
||||
.fields = {{"Name", ASS_STR, offsetof(ASSStyle, name) },
|
||||
{"Fontname", ASS_STR, offsetof(ASSStyle, font_name) },
|
||||
{"Fontsize", ASS_INT, offsetof(ASSStyle, font_size) },
|
||||
{"PrimaryColour", ASS_COLOR, offsetof(ASSStyle, primary_color) },
|
||||
{"SecondaryColour", ASS_COLOR, offsetof(ASSStyle, secondary_color)},
|
||||
{"TertiaryColour", ASS_COLOR, offsetof(ASSStyle, outline_color) },
|
||||
{"BackColour", ASS_COLOR, offsetof(ASSStyle, back_color) },
|
||||
{"Bold", ASS_INT, offsetof(ASSStyle, bold) },
|
||||
{"Italic", ASS_INT, offsetof(ASSStyle, italic) },
|
||||
{"BorderStyle", ASS_INT, offsetof(ASSStyle, border_style) },
|
||||
{"Outline", ASS_FLT, offsetof(ASSStyle, outline) },
|
||||
{"Shadow", ASS_FLT, offsetof(ASSStyle, shadow) },
|
||||
{"Alignment", ASS_ALGN, offsetof(ASSStyle, alignment) },
|
||||
{"MarginL", ASS_INT, offsetof(ASSStyle, margin_l) },
|
||||
{"MarginR", ASS_INT, offsetof(ASSStyle, margin_r) },
|
||||
{"MarginV", ASS_INT, offsetof(ASSStyle, margin_v) },
|
||||
{"AlphaLevel", ASS_INT, offsetof(ASSStyle, alpha_level) },
|
||||
{"Encoding", ASS_INT, offsetof(ASSStyle, encoding) },
|
||||
.fields = {{"Name", ASS_STR, offsetof(ASSStyle, name) },
|
||||
{"Fontname", ASS_STR, offsetof(ASSStyle, font_name) },
|
||||
{"Fontsize", ASS_INT, offsetof(ASSStyle, font_size) },
|
||||
{"PrimaryColour",ASS_COLOR,offsetof(ASSStyle, primary_color)},
|
||||
{"BackColour", ASS_COLOR,offsetof(ASSStyle, back_color) },
|
||||
{"Bold", ASS_INT, offsetof(ASSStyle, bold) },
|
||||
{"Italic", ASS_INT, offsetof(ASSStyle, italic) },
|
||||
{"Alignment", ASS_ALGN, offsetof(ASSStyle, alignment) },
|
||||
{0},
|
||||
}
|
||||
},
|
||||
@@ -123,16 +99,11 @@ static const ASSSection ass_sections[] = {
|
||||
.size = sizeof(ASSDialog),
|
||||
.offset = offsetof(ASS, dialogs),
|
||||
.offset_count = offsetof(ASS, dialogs_count),
|
||||
.fields = {{"Layer", ASS_INT, offsetof(ASSDialog, layer) },
|
||||
{"Start", ASS_TIMESTAMP, offsetof(ASSDialog, start) },
|
||||
{"End", ASS_TIMESTAMP, offsetof(ASSDialog, end) },
|
||||
{"Style", ASS_STR, offsetof(ASSDialog, style) },
|
||||
{"Name", ASS_STR, offsetof(ASSDialog, name) },
|
||||
{"MarginL", ASS_INT, offsetof(ASSDialog, margin_l)},
|
||||
{"MarginR", ASS_INT, offsetof(ASSDialog, margin_r)},
|
||||
{"MarginV", ASS_INT, offsetof(ASSDialog, margin_v)},
|
||||
{"Effect", ASS_STR, offsetof(ASSDialog, effect) },
|
||||
{"Text", ASS_STR, offsetof(ASSDialog, text) },
|
||||
.fields = {{"Layer", ASS_INT, offsetof(ASSDialog, layer) },
|
||||
{"Start", ASS_TIMESTAMP, offsetof(ASSDialog, start) },
|
||||
{"End", ASS_TIMESTAMP, offsetof(ASSDialog, end) },
|
||||
{"Style", ASS_STR, offsetof(ASSDialog, style) },
|
||||
{"Text", ASS_STR, offsetof(ASSDialog, text) },
|
||||
{0},
|
||||
}
|
||||
},
|
||||
@@ -229,20 +200,6 @@ static inline const char *skip_space(const char *buf)
|
||||
return buf;
|
||||
}
|
||||
|
||||
static int *get_default_field_orders(const ASSSection *section)
|
||||
{
|
||||
int i;
|
||||
int *order = av_malloc(FF_ARRAY_ELEMS(section->fields) * sizeof(*order));
|
||||
|
||||
if (!order)
|
||||
return NULL;
|
||||
for (i = 0; section->fields[i].name; i++)
|
||||
order[i] = i;
|
||||
while (i < FF_ARRAY_ELEMS(section->fields))
|
||||
order[i] = -1;
|
||||
return order;
|
||||
}
|
||||
|
||||
static const char *ass_split_section(ASSSplitContext *ctx, const char *buf)
|
||||
{
|
||||
const ASSSection *section = &ass_sections[ctx->current_section];
|
||||
@@ -260,7 +217,7 @@ static const char *ass_split_section(ASSSplitContext *ctx, const char *buf)
|
||||
} else if (section->format_header && !order) {
|
||||
len = strlen(section->format_header);
|
||||
if (strncmp(buf, section->format_header, len) || buf[len] != ':')
|
||||
goto next_line;
|
||||
return NULL;
|
||||
buf += len + 1;
|
||||
while (!is_eol(*buf)) {
|
||||
buf = skip_space(buf);
|
||||
@@ -283,15 +240,6 @@ static const char *ass_split_section(ASSSplitContext *ctx, const char *buf)
|
||||
if (!strncmp(buf, section->fields_header, len) && buf[len] == ':') {
|
||||
uint8_t *ptr, *struct_ptr = realloc_section_array(ctx);
|
||||
if (!struct_ptr) return NULL;
|
||||
|
||||
/* No format header line found so far, assume default */
|
||||
if (!order) {
|
||||
order = get_default_field_orders(section);
|
||||
if (!order)
|
||||
return NULL;
|
||||
ctx->field_order[ctx->current_section] = order;
|
||||
}
|
||||
|
||||
buf += len + 1;
|
||||
for (i=0; !is_eol(*buf) && i < *number; i++) {
|
||||
int last = i == *number - 1;
|
||||
@@ -321,7 +269,6 @@ static const char *ass_split_section(ASSSplitContext *ctx, const char *buf)
|
||||
}
|
||||
}
|
||||
}
|
||||
next_line:
|
||||
buf += strcspn(buf, "\n");
|
||||
buf += !!*buf;
|
||||
}
|
||||
|
@@ -41,28 +41,13 @@ typedef struct {
|
||||
char *font_name; /**< font face (case sensitive) */
|
||||
int font_size; /**< font height */
|
||||
int primary_color; /**< color that a subtitle will normally appear in */
|
||||
int secondary_color;
|
||||
int outline_color; /**< color for outline in ASS, called tertiary in SSA */
|
||||
int back_color; /**< color of the subtitle outline or shadow */
|
||||
int bold; /**< whether text is bold (1) or not (0) */
|
||||
int italic; /**< whether text is italic (1) or not (0) */
|
||||
int underline; /**< whether text is underlined (1) or not (0) */
|
||||
int strikeout;
|
||||
float scalex;
|
||||
float scaley;
|
||||
float spacing;
|
||||
float angle;
|
||||
int border_style;
|
||||
float outline;
|
||||
float shadow;
|
||||
int alignment; /**< position of the text (left, center, top...),
|
||||
defined after the layout of the numpad
|
||||
(1-3 sub, 4-6 mid, 7-9 top) */
|
||||
int margin_l;
|
||||
int margin_r;
|
||||
int margin_v;
|
||||
int alpha_level;
|
||||
int encoding;
|
||||
} ASSStyle;
|
||||
|
||||
/**
|
||||
@@ -73,11 +58,6 @@ typedef struct {
|
||||
int start; /**< start time of the dialog in centiseconds */
|
||||
int end; /**< end time of the dialog in centiseconds */
|
||||
char *style; /**< name of the ASSStyle to use with this dialog */
|
||||
char *name;
|
||||
int margin_l;
|
||||
int margin_r;
|
||||
int margin_v;
|
||||
char *effect;
|
||||
char *text; /**< actual text which will be displayed as a subtitle,
|
||||
can include style override control codes (see
|
||||
ff_ass_split_override_codes()) */
|
||||
|
@@ -52,7 +52,7 @@ static inline void asv1_put_level(PutBitContext *pb, int level)
|
||||
}
|
||||
}
|
||||
|
||||
static inline void asv2_put_level(ASV1Context *a, PutBitContext *pb, int level)
|
||||
static inline void asv2_put_level(PutBitContext *pb, int level)
|
||||
{
|
||||
unsigned int index = level + 31;
|
||||
|
||||
@@ -60,10 +60,6 @@ static inline void asv2_put_level(ASV1Context *a, PutBitContext *pb, int level)
|
||||
put_bits(pb, ff_asv2_level_tab[index][1], ff_asv2_level_tab[index][0]);
|
||||
} else {
|
||||
put_bits(pb, ff_asv2_level_tab[31][1], ff_asv2_level_tab[31][0]);
|
||||
if (level < -128 || level > 127) {
|
||||
av_log(a->avctx, AV_LOG_WARNING, "Cliping level %d, increase qscale\n", level);
|
||||
level = av_clip_int8(level);
|
||||
}
|
||||
asv2_put_bits(pb, 8, level & 0xFF);
|
||||
}
|
||||
}
|
||||
@@ -156,13 +152,13 @@ static inline void asv2_encode_block(ASV1Context *a, int16_t block[64])
|
||||
|
||||
if (ccp) {
|
||||
if (ccp & 8)
|
||||
asv2_put_level(a, &a->pb, block[index + 0]);
|
||||
asv2_put_level(&a->pb, block[index + 0]);
|
||||
if (ccp & 4)
|
||||
asv2_put_level(a, &a->pb, block[index + 8]);
|
||||
asv2_put_level(&a->pb, block[index + 8]);
|
||||
if (ccp & 2)
|
||||
asv2_put_level(a, &a->pb, block[index + 1]);
|
||||
asv2_put_level(&a->pb, block[index + 1]);
|
||||
if (ccp & 1)
|
||||
asv2_put_level(a, &a->pb, block[index + 9]);
|
||||
asv2_put_level(&a->pb, block[index + 9]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -80,7 +80,7 @@ typedef struct {
|
||||
DECLARE_ALIGNED(32, float, high)[512];
|
||||
float* bands[3];
|
||||
FFTContext mdct_ctx[3];
|
||||
AVFloatDSPContext *fdsp;
|
||||
AVFloatDSPContext fdsp;
|
||||
} AT1Ctx;
|
||||
|
||||
/** size of the transform in samples in the long mode for each QMF band */
|
||||
@@ -140,7 +140,7 @@ static int at1_imdct_block(AT1SUCtx* su, AT1Ctx *q)
|
||||
at1_imdct(q, &q->spec[pos], &su->spectrum[0][ref_pos + start_pos], nbits, band_num);
|
||||
|
||||
/* overlap and window */
|
||||
q->fdsp->vector_fmul_window(&q->bands[band_num][start_pos], prev_buf,
|
||||
q->fdsp.vector_fmul_window(&q->bands[band_num][start_pos], prev_buf,
|
||||
&su->spectrum[0][ref_pos + start_pos], ff_sine_32, 16);
|
||||
|
||||
prev_buf = &su->spectrum[0][ref_pos+start_pos + 16];
|
||||
@@ -324,8 +324,6 @@ static av_cold int atrac1_decode_end(AVCodecContext * avctx)
|
||||
ff_mdct_end(&q->mdct_ctx[1]);
|
||||
ff_mdct_end(&q->mdct_ctx[2]);
|
||||
|
||||
av_freep(&q->fdsp);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -361,7 +359,7 @@ static av_cold int atrac1_decode_init(AVCodecContext *avctx)
|
||||
|
||||
ff_atrac_generate_tables();
|
||||
|
||||
q->fdsp = avpriv_float_dsp_alloc(avctx->flags & CODEC_FLAG_BITEXACT);
|
||||
avpriv_float_dsp_init(&q->fdsp, avctx->flags & CODEC_FLAG_BITEXACT);
|
||||
|
||||
q->bands[0] = q->low;
|
||||
q->bands[1] = q->mid;
|
||||
|
@@ -109,7 +109,7 @@ typedef struct ATRAC3Context {
|
||||
AtracGCContext gainc_ctx;
|
||||
FFTContext mdct_ctx;
|
||||
FmtConvertContext fmt_conv;
|
||||
AVFloatDSPContext *fdsp;
|
||||
AVFloatDSPContext fdsp;
|
||||
} ATRAC3Context;
|
||||
|
||||
static DECLARE_ALIGNED(32, float, mdct_window)[MDCT_SIZE];
|
||||
@@ -142,7 +142,7 @@ static void imlt(ATRAC3Context *q, float *input, float *output, int odd_band)
|
||||
q->mdct_ctx.imdct_calc(&q->mdct_ctx, output, input);
|
||||
|
||||
/* Perform windowing on the output. */
|
||||
q->fdsp->vector_fmul(output, output, mdct_window, MDCT_SIZE);
|
||||
q->fdsp.vector_fmul(output, output, mdct_window, MDCT_SIZE);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -190,9 +190,8 @@ static av_cold int atrac3_decode_close(AVCodecContext *avctx)
|
||||
{
|
||||
ATRAC3Context *q = avctx->priv_data;
|
||||
|
||||
av_freep(&q->units);
|
||||
av_freep(&q->decoded_bytes_buffer);
|
||||
av_freep(&q->fdsp);
|
||||
av_free(q->units);
|
||||
av_free(q->decoded_bytes_buffer);
|
||||
|
||||
ff_mdct_end(&q->mdct_ctx);
|
||||
|
||||
@@ -916,11 +915,11 @@ static av_cold int atrac3_decode_init(AVCodecContext *avctx)
|
||||
}
|
||||
|
||||
ff_atrac_init_gain_compensation(&q->gainc_ctx, 4, 3);
|
||||
q->fdsp = avpriv_float_dsp_alloc(avctx->flags & CODEC_FLAG_BITEXACT);
|
||||
avpriv_float_dsp_init(&q->fdsp, avctx->flags & CODEC_FLAG_BITEXACT);
|
||||
ff_fmt_convert_init(&q->fmt_conv, avctx);
|
||||
|
||||
q->units = av_mallocz_array(avctx->channels, sizeof(*q->units));
|
||||
if (!q->units || !q->fdsp) {
|
||||
if (!q->units) {
|
||||
atrac3_decode_close(avctx);
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
|
@@ -1575,7 +1575,7 @@ static void decode_tones_amplitude(GetBitContext *gb, Atrac3pChanUnitCtx *ctx,
|
||||
{
|
||||
int mode, sb, j, i, diff, maxdiff, fi, delta, pred;
|
||||
Atrac3pWaveParam *wsrc, *wref;
|
||||
int refwaves[48] = { 0 };
|
||||
int refwaves[48];
|
||||
Atrac3pWavesData *dst = ctx->channels[ch_num].tones_info;
|
||||
Atrac3pWavesData *ref = ctx->channels[0].tones_info;
|
||||
|
||||
|
@@ -47,7 +47,7 @@
|
||||
|
||||
typedef struct ATRAC3PContext {
|
||||
GetBitContext gb;
|
||||
AVFloatDSPContext *fdsp;
|
||||
AVFloatDSPContext fdsp;
|
||||
|
||||
DECLARE_ALIGNED(32, float, samples)[2][ATRAC3P_FRAME_SAMPLES]; ///< quantized MDCT spectrum
|
||||
DECLARE_ALIGNED(32, float, mdct_buf)[2][ATRAC3P_FRAME_SAMPLES]; ///< output of the IMDCT
|
||||
@@ -67,10 +67,7 @@ typedef struct ATRAC3PContext {
|
||||
|
||||
static av_cold int atrac3p_decode_close(AVCodecContext *avctx)
|
||||
{
|
||||
ATRAC3PContext *ctx = avctx->priv_data;
|
||||
|
||||
av_freep(&ctx->ch_units);
|
||||
av_freep(&ctx->fdsp);
|
||||
av_free(((ATRAC3PContext *)(avctx->priv_data))->ch_units);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -153,6 +150,8 @@ static av_cold int atrac3p_decode_init(AVCodecContext *avctx)
|
||||
|
||||
ff_atrac3p_init_vlcs();
|
||||
|
||||
avpriv_float_dsp_init(&ctx->fdsp, avctx->flags & CODEC_FLAG_BITEXACT);
|
||||
|
||||
/* initialize IPQF */
|
||||
ff_mdct_init(&ctx->ipqf_dct_ctx, 5, 1, 32.0 / 32768.0);
|
||||
|
||||
@@ -168,9 +167,8 @@ static av_cold int atrac3p_decode_init(AVCodecContext *avctx)
|
||||
ctx->my_channel_layout = avctx->channel_layout;
|
||||
|
||||
ctx->ch_units = av_mallocz_array(ctx->num_channel_blocks, sizeof(*ctx->ch_units));
|
||||
ctx->fdsp = avpriv_float_dsp_alloc(avctx->flags & CODEC_FLAG_BITEXACT);
|
||||
|
||||
if (!ctx->ch_units || !ctx->fdsp) {
|
||||
if (!ctx->ch_units) {
|
||||
atrac3p_decode_close(avctx);
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
@@ -267,7 +265,7 @@ static void reconstruct_frame(ATRAC3PContext *ctx, Atrac3pChanUnitCtx *ch_unit,
|
||||
for (ch = 0; ch < num_channels; ch++) {
|
||||
for (sb = 0; sb < ch_unit->num_subbands; sb++) {
|
||||
/* inverse transform and windowing */
|
||||
ff_atrac3p_imdct(ctx->fdsp, &ctx->mdct_ctx,
|
||||
ff_atrac3p_imdct(&ctx->fdsp, &ctx->mdct_ctx,
|
||||
&ctx->samples[ch][sb * ATRAC3P_SUBBAND_SAMPLES],
|
||||
&ctx->mdct_buf[ch][sb * ATRAC3P_SUBBAND_SAMPLES],
|
||||
(ch_unit->channels[ch].wnd_shape_prev[sb] << 1) +
|
||||
@@ -301,7 +299,7 @@ static void reconstruct_frame(ATRAC3PContext *ctx, Atrac3pChanUnitCtx *ch_unit,
|
||||
for (sb = 0; sb < ch_unit->num_subbands; sb++)
|
||||
if (ch_unit->channels[ch].tones_info[sb].num_wavs ||
|
||||
ch_unit->channels[ch].tones_info_prev[sb].num_wavs) {
|
||||
ff_atrac3p_generate_tones(ch_unit, ctx->fdsp, ch, sb,
|
||||
ff_atrac3p_generate_tones(ch_unit, &ctx->fdsp, ch, sb,
|
||||
&ctx->time_buf[ch][sb * 128]);
|
||||
}
|
||||
}
|
||||
|
@@ -28,8 +28,8 @@
|
||||
av_cold void ff_af_queue_init(AVCodecContext *avctx, AudioFrameQueue *afq)
|
||||
{
|
||||
afq->avctx = avctx;
|
||||
afq->remaining_delay = avctx->initial_padding;
|
||||
afq->remaining_samples = avctx->initial_padding;
|
||||
afq->remaining_delay = avctx->delay;
|
||||
afq->remaining_samples = avctx->delay;
|
||||
afq->frame_count = 0;
|
||||
}
|
||||
|
||||
|
@@ -42,6 +42,11 @@
|
||||
|
||||
#include "version.h"
|
||||
|
||||
#if FF_API_FAST_MALLOC
|
||||
// to provide fast_*alloc
|
||||
#include "libavutil/mem.h"
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @defgroup libavc Encoding/Decoding Library
|
||||
* @{
|
||||
@@ -319,7 +324,6 @@ enum AVCodecID {
|
||||
AV_CODEC_ID_HEVC = MKBETAG('H','2','6','5'),
|
||||
#define AV_CODEC_ID_H265 AV_CODEC_ID_HEVC
|
||||
AV_CODEC_ID_VP7 = MKBETAG('V','P','7','0'),
|
||||
AV_CODEC_ID_APNG = MKBETAG('A','P','N','G'),
|
||||
|
||||
/* various PCM "codecs" */
|
||||
AV_CODEC_ID_FIRST_AUDIO = 0x10000, ///< A dummy id pointing at the start of audio codecs
|
||||
@@ -510,7 +514,6 @@ enum AVCodecID {
|
||||
AV_CODEC_ID_JACOSUB = MKBETAG('J','S','U','B'),
|
||||
AV_CODEC_ID_SAMI = MKBETAG('S','A','M','I'),
|
||||
AV_CODEC_ID_REALTEXT = MKBETAG('R','T','X','T'),
|
||||
AV_CODEC_ID_STL = MKBETAG('S','p','T','L'),
|
||||
AV_CODEC_ID_SUBVIEWER1 = MKBETAG('S','b','V','1'),
|
||||
AV_CODEC_ID_SUBVIEWER = MKBETAG('S','u','b','V'),
|
||||
AV_CODEC_ID_SUBRIP = MKBETAG('S','R','i','p'),
|
||||
@@ -549,7 +552,7 @@ enum AVCodecID {
|
||||
/**
|
||||
* This struct describes the properties of a single codec described by an
|
||||
* AVCodecID.
|
||||
* @see avcodec_descriptor_get()
|
||||
* @see avcodec_get_descriptor()
|
||||
*/
|
||||
typedef struct AVCodecDescriptor {
|
||||
enum AVCodecID id;
|
||||
@@ -765,7 +768,6 @@ typedef struct RcOverride{
|
||||
#define CODEC_FLAG2_CHUNKS 0x00008000 ///< Input bitstream might be truncated at a packet boundaries instead of only at frame boundaries.
|
||||
#define CODEC_FLAG2_SHOW_ALL 0x00400000 ///< Show all frames before the first keyframe
|
||||
#define CODEC_FLAG2_EXPORT_MVS 0x10000000 ///< Export motion vectors through frame side data
|
||||
#define CODEC_FLAG2_SKIP_MANUAL 0x20000000 ///< Do not skip samples and export skip information as frame side data
|
||||
|
||||
/* Unsupported options :
|
||||
* Syntax Arithmetic coding (SAC)
|
||||
@@ -1348,11 +1350,8 @@ typedef struct AVCodecContext {
|
||||
* of which frame timestamps are represented. For fixed-fps content,
|
||||
* timebase should be 1/framerate and timestamp increments should be
|
||||
* identically 1.
|
||||
* This often, but not always is the inverse of the frame rate or field rate
|
||||
* for video.
|
||||
* - encoding: MUST be set by user.
|
||||
* - decoding: the use of this field for decoding is deprecated.
|
||||
* Use framerate instead.
|
||||
* - decoding: Set by libavcodec.
|
||||
*/
|
||||
AVRational time_base;
|
||||
|
||||
@@ -1378,7 +1377,16 @@ typedef struct AVCodecContext {
|
||||
* encoded input.
|
||||
*
|
||||
* Audio:
|
||||
* For encoding, this field is unused (see initial_padding).
|
||||
* For encoding, this is the number of "priming" samples added by the
|
||||
* encoder to the beginning of the stream. The decoded output will be
|
||||
* delayed by this many samples relative to the input to the encoder (or
|
||||
* more, if the decoder adds its own padding).
|
||||
* The timestamps on the output packets are adjusted by the encoder so
|
||||
* that they always refer to the first sample of the data actually
|
||||
* contained in the packet, including any added padding.
|
||||
* E.g. if the timebase is 1/samplerate and the timestamp of the first
|
||||
* input sample is 0, the timestamp of the first output packet will be
|
||||
* -delay.
|
||||
*
|
||||
* For decoding, this is the number of samples the decoder needs to
|
||||
* output before the decoder's output is valid. When seeking, you should
|
||||
@@ -1472,10 +1480,6 @@ typedef struct AVCodecContext {
|
||||
* @param fmt is the list of formats which are supported by the codec,
|
||||
* it is terminated by -1 as 0 is a valid format, the formats are ordered by quality.
|
||||
* The first is always the native one.
|
||||
* @note The callback may be called again immediately if initialization for
|
||||
* the selected (hardware-accelerated) pixel format failed.
|
||||
* @warning Behavior is undefined if the callback returns a value not
|
||||
* in the fmt list of formats.
|
||||
* @return the chosen format
|
||||
* - encoding: unused
|
||||
* - decoding: Set by user, if not set the native format will be chosen.
|
||||
@@ -1796,19 +1800,21 @@ typedef struct AVCodecContext {
|
||||
*/
|
||||
int noise_reduction;
|
||||
|
||||
#if FF_API_MPV_OPT
|
||||
/**
|
||||
* @deprecated this field is unused
|
||||
* Motion estimation threshold below which no motion estimation is
|
||||
* performed, but instead the user specified motion vectors are used.
|
||||
*
|
||||
* - encoding: Set by user.
|
||||
* - decoding: unused
|
||||
*/
|
||||
attribute_deprecated
|
||||
int me_threshold;
|
||||
|
||||
/**
|
||||
* @deprecated this field is unused
|
||||
* Macroblock threshold below which the user specified macroblock types will be used.
|
||||
* - encoding: Set by user.
|
||||
* - decoding: unused
|
||||
*/
|
||||
attribute_deprecated
|
||||
int mb_threshold;
|
||||
#endif
|
||||
|
||||
/**
|
||||
* precision of the intra DC coefficient - 8
|
||||
@@ -1831,13 +1837,13 @@ typedef struct AVCodecContext {
|
||||
*/
|
||||
int skip_bottom;
|
||||
|
||||
#if FF_API_MPV_OPT
|
||||
/**
|
||||
* @deprecated use encoder private options instead
|
||||
* Border processing masking, raises the quantizer for mbs on the borders
|
||||
* of the picture.
|
||||
* - encoding: Set by user.
|
||||
* - decoding: unused
|
||||
*/
|
||||
attribute_deprecated
|
||||
float border_masking;
|
||||
#endif
|
||||
|
||||
/**
|
||||
* minimum MB lagrange multipler
|
||||
@@ -2271,18 +2277,16 @@ typedef struct AVCodecContext {
|
||||
*/
|
||||
int max_qdiff;
|
||||
|
||||
#if FF_API_MPV_OPT
|
||||
/**
|
||||
* @deprecated use encoder private options instead
|
||||
* ratecontrol qmin qmax limiting method
|
||||
* 0-> clipping, 1-> use a nice continuous function to limit qscale within qmin/qmax.
|
||||
* - encoding: Set by user.
|
||||
* - decoding: unused
|
||||
*/
|
||||
attribute_deprecated
|
||||
float rc_qsquish;
|
||||
|
||||
attribute_deprecated
|
||||
float rc_qmod_amp;
|
||||
attribute_deprecated
|
||||
int rc_qmod_freq;
|
||||
#endif
|
||||
|
||||
/**
|
||||
* decoder bitstream buffer size
|
||||
@@ -2299,13 +2303,12 @@ typedef struct AVCodecContext {
|
||||
int rc_override_count;
|
||||
RcOverride *rc_override;
|
||||
|
||||
#if FF_API_MPV_OPT
|
||||
/**
|
||||
* @deprecated use encoder private options instead
|
||||
* rate control equation
|
||||
* - encoding: Set by user
|
||||
* - decoding: unused
|
||||
*/
|
||||
attribute_deprecated
|
||||
const char *rc_eq;
|
||||
#endif
|
||||
|
||||
/**
|
||||
* maximum bitrate
|
||||
@@ -2321,16 +2324,14 @@ typedef struct AVCodecContext {
|
||||
*/
|
||||
int rc_min_rate;
|
||||
|
||||
#if FF_API_MPV_OPT
|
||||
/**
|
||||
* @deprecated use encoder private options instead
|
||||
*/
|
||||
attribute_deprecated
|
||||
float rc_buffer_aggressivity;
|
||||
|
||||
attribute_deprecated
|
||||
/**
|
||||
* initial complexity for pass1 ratecontrol
|
||||
* - encoding: Set by user.
|
||||
* - decoding: unused
|
||||
*/
|
||||
float rc_initial_cplx;
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Ratecontrol attempt to use, at maximum, <value> of what can be used without an underflow.
|
||||
@@ -2374,19 +2375,19 @@ typedef struct AVCodecContext {
|
||||
*/
|
||||
int context_model;
|
||||
|
||||
#if FF_API_MPV_OPT
|
||||
/**
|
||||
* @deprecated use encoder private options instead
|
||||
* minimum Lagrange multiplier
|
||||
* - encoding: Set by user.
|
||||
* - decoding: unused
|
||||
*/
|
||||
attribute_deprecated
|
||||
int lmin;
|
||||
|
||||
/**
|
||||
* @deprecated use encoder private options instead
|
||||
* maximum Lagrange multiplier
|
||||
* - encoding: Set by user.
|
||||
* - decoding: unused
|
||||
*/
|
||||
attribute_deprecated
|
||||
int lmax;
|
||||
#endif
|
||||
|
||||
/**
|
||||
* frame skip threshold
|
||||
@@ -2979,31 +2980,6 @@ typedef struct AVCodecContext {
|
||||
*/
|
||||
int side_data_only_packets;
|
||||
|
||||
/**
|
||||
* Audio only. The number of "priming" samples (padding) inserted by the
|
||||
* encoder at the beginning of the audio. I.e. this number of leading
|
||||
* decoded samples must be discarded by the caller to get the original audio
|
||||
* without leading padding.
|
||||
*
|
||||
* - decoding: unused
|
||||
* - encoding: Set by libavcodec. The timestamps on the output packets are
|
||||
* adjusted by the encoder so that they always refer to the
|
||||
* first sample of the data actually contained in the packet,
|
||||
* including any added padding. E.g. if the timebase is
|
||||
* 1/samplerate and the timestamp of the first input sample is
|
||||
* 0, the timestamp of the first output packet will be
|
||||
* -initial_padding.
|
||||
*/
|
||||
int initial_padding;
|
||||
|
||||
/**
|
||||
* - decoding: For codecs that store a framerate value in the compressed
|
||||
* bitstream, the decoder may export it here. { 0, 1} when
|
||||
* unknown.
|
||||
* - encoding: unused
|
||||
*/
|
||||
AVRational framerate;
|
||||
|
||||
/**
|
||||
* Timebase in which pkt_dts/pts and AVPacket.dts/pts are.
|
||||
* Code outside libavcodec should access this field using:
|
||||
@@ -3103,24 +3079,6 @@ typedef struct AVCodecContext {
|
||||
* - decoding: unused.
|
||||
*/
|
||||
uint16_t *chroma_intra_matrix;
|
||||
|
||||
/**
|
||||
* dump format separator.
|
||||
* can be ", " or "\n " or anything else
|
||||
* Code outside libavcodec should access this field using AVOptions
|
||||
* (NO direct access).
|
||||
* - encoding: Set by user.
|
||||
* - decoding: Set by user.
|
||||
*/
|
||||
uint8_t *dump_separator;
|
||||
|
||||
/**
|
||||
* ',' separated list of allowed decoders.
|
||||
* If NULL then all are allowed
|
||||
* - encoding: unused
|
||||
* - decoding: set by user through AVOPtions (NO direct access)
|
||||
*/
|
||||
char *codec_whitelist;
|
||||
} AVCodecContext;
|
||||
|
||||
AVRational av_codec_get_pkt_timebase (const AVCodecContext *avctx);
|
||||
@@ -3252,8 +3210,7 @@ int av_codec_get_max_lowres(const AVCodec *codec);
|
||||
struct MpegEncContext;
|
||||
|
||||
/**
|
||||
* @defgroup lavc_hwaccel AVHWAccel
|
||||
* @{
|
||||
* AVHWAccel.
|
||||
*/
|
||||
typedef struct AVHWAccel {
|
||||
/**
|
||||
@@ -3389,17 +3346,6 @@ typedef struct AVHWAccel {
|
||||
int priv_data_size;
|
||||
} AVHWAccel;
|
||||
|
||||
/**
|
||||
* Hardware acceleration should be used for decoding even if the codec level
|
||||
* used is unknown or higher than the maximum supported level reported by the
|
||||
* hardware driver.
|
||||
*/
|
||||
#define AV_HWACCEL_FLAG_IGNORE_LEVEL (1 << 0)
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
/**
|
||||
* @defgroup lavc_picture AVPicture
|
||||
*
|
||||
@@ -5170,26 +5116,16 @@ enum AVLockOp {
|
||||
|
||||
/**
|
||||
* Register a user provided lock manager supporting the operations
|
||||
* specified by AVLockOp. The "mutex" argument to the function points
|
||||
* to a (void *) where the lockmgr should store/get a pointer to a user
|
||||
* allocated mutex. It is NULL upon AV_LOCK_CREATE and equal to the
|
||||
* value left by the last call for all other ops. If the lock manager is
|
||||
* unable to perform the op then it should leave the mutex in the same
|
||||
* state as when it was called and return a non-zero value. However,
|
||||
* when called with AV_LOCK_DESTROY the mutex will always be assumed to
|
||||
* have been successfully destroyed. If av_lockmgr_register succeeds
|
||||
* it will return a non-negative value, if it fails it will return a
|
||||
* negative value and destroy all mutex and unregister all callbacks.
|
||||
* av_lockmgr_register is not thread-safe, it must be called from a
|
||||
* single thread before any calls which make use of locking are used.
|
||||
* specified by AVLockOp. mutex points to a (void *) where the
|
||||
* lockmgr should store/get a pointer to a user allocated mutex. It's
|
||||
* NULL upon AV_LOCK_CREATE and != NULL for all other ops.
|
||||
*
|
||||
* @param cb User defined callback. av_lockmgr_register invokes calls
|
||||
* to this callback and the previously registered callback.
|
||||
* The callback will be used to create more than one mutex
|
||||
* each of which must be backed by its own underlying locking
|
||||
* mechanism (i.e. do not use a single static object to
|
||||
* implement your lock manager). If cb is set to NULL the
|
||||
* lockmgr will be unregistered.
|
||||
* @param cb User defined callback. Note: FFmpeg may invoke calls to this
|
||||
* callback during the call to av_lockmgr_register().
|
||||
* Thus, the application must be prepared to handle that.
|
||||
* If cb is set to NULL the lockmgr will be unregistered.
|
||||
* Also note that during unregistration the previously registered
|
||||
* lockmgr callback may also be invoked.
|
||||
*/
|
||||
int av_lockmgr_register(int (*cb)(void **mutex, enum AVLockOp op));
|
||||
|
||||
|
@@ -34,7 +34,8 @@
|
||||
|
||||
void av_destruct_packet(AVPacket *pkt)
|
||||
{
|
||||
av_freep(&pkt->data);
|
||||
av_free(pkt->data);
|
||||
pkt->data = NULL;
|
||||
pkt->size = 0;
|
||||
}
|
||||
|
||||
@@ -272,7 +273,7 @@ void av_packet_free_side_data(AVPacket *pkt)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < pkt->side_data_elems; i++)
|
||||
av_freep(&pkt->side_data[i].data);
|
||||
av_free(pkt->side_data[i].data);
|
||||
av_freep(&pkt->side_data);
|
||||
pkt->side_data_elems = 0;
|
||||
}
|
||||
|
@@ -66,7 +66,7 @@ int avpicture_alloc(AVPicture *picture,
|
||||
|
||||
void avpicture_free(AVPicture *picture)
|
||||
{
|
||||
av_freep(&picture->data[0]);
|
||||
av_free(picture->data[0]);
|
||||
}
|
||||
|
||||
void av_picture_copy(AVPicture *dst, const AVPicture *src,
|
||||
|
@@ -165,8 +165,9 @@ static av_cold int avs_decode_init(AVCodecContext * avctx)
|
||||
return AVERROR(ENOMEM);
|
||||
|
||||
avctx->pix_fmt = AV_PIX_FMT_PAL8;
|
||||
ff_set_dimensions(avctx, 318, 198);
|
||||
|
||||
return ff_set_dimensions(avctx, 318, 198);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static av_cold int avs_decode_end(AVCodecContext *avctx)
|
||||
|
@@ -25,10 +25,16 @@
|
||||
|
||||
static av_cold int avui_encode_init(AVCodecContext *avctx)
|
||||
{
|
||||
avctx->coded_frame = av_frame_alloc();
|
||||
|
||||
if (avctx->width != 720 || avctx->height != 486 && avctx->height != 576) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Only 720x486 and 720x576 are supported.\n");
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
if (!avctx->coded_frame) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Could not allocate frame.\n");
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
if (!(avctx->extradata = av_mallocz(24 + FF_INPUT_BUFFER_PADDING_SIZE)))
|
||||
return AVERROR(ENOMEM);
|
||||
avctx->extradata_size = 24;
|
||||
@@ -39,11 +45,6 @@ static av_cold int avui_encode_init(AVCodecContext *avctx)
|
||||
avctx->extradata[19] = 1;
|
||||
}
|
||||
|
||||
avctx->coded_frame = av_frame_alloc();
|
||||
if (!avctx->coded_frame) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Could not allocate frame.\n");
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@@ -171,7 +171,7 @@ static int bfi_decode_frame(AVCodecContext *avctx, void *data,
|
||||
static av_cold int bfi_decode_close(AVCodecContext *avctx)
|
||||
{
|
||||
BFIContext *bfi = avctx->priv_data;
|
||||
av_freep(&bfi->dst);
|
||||
av_free(bfi->dst);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@@ -43,9 +43,9 @@ void av_register_bitstream_filter(AVBitStreamFilter *bsf)
|
||||
|
||||
AVBitStreamFilterContext *av_bitstream_filter_init(const char *name)
|
||||
{
|
||||
AVBitStreamFilter *bsf = NULL;
|
||||
AVBitStreamFilter *bsf = first_bitstream_filter;
|
||||
|
||||
while (bsf = av_bitstream_filter_next(bsf)) {
|
||||
while (bsf) {
|
||||
if (!strcmp(name, bsf->name)) {
|
||||
AVBitStreamFilterContext *bsfc =
|
||||
av_mallocz(sizeof(AVBitStreamFilterContext));
|
||||
@@ -54,6 +54,7 @@ AVBitStreamFilterContext *av_bitstream_filter_init(const char *name)
|
||||
bsf->priv_data_size ? av_mallocz(bsf->priv_data_size) : NULL;
|
||||
return bsfc;
|
||||
}
|
||||
bsf = bsf->next;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
@@ -30,7 +30,6 @@
|
||||
#include "golomb.h"
|
||||
#include "h264chroma.h"
|
||||
#include "idctdsp.h"
|
||||
#include "internal.h"
|
||||
#include "mathops.h"
|
||||
#include "qpeldsp.h"
|
||||
#include "cavs.h"
|
||||
@@ -540,8 +539,8 @@ static inline void scale_mv(AVSContext *h, int *d_x, int *d_y,
|
||||
{
|
||||
int den = h->scale_den[FFMAX(src->ref, 0)];
|
||||
|
||||
*d_x = (src->x * distp * den + 256 + FF_SIGNBIT(src->x)) >> 9;
|
||||
*d_y = (src->y * distp * den + 256 + FF_SIGNBIT(src->y)) >> 9;
|
||||
*d_x = (src->x * distp * den + 256 + (src->x >> 31)) >> 9;
|
||||
*d_y = (src->y * distp * den + 256 + (src->y >> 31)) >> 9;
|
||||
}
|
||||
|
||||
static inline void mv_pred_median(AVSContext *h,
|
||||
@@ -823,16 +822,16 @@ av_cold int ff_cavs_end(AVCodecContext *avctx)
|
||||
av_frame_free(&h->DPB[0].f);
|
||||
av_frame_free(&h->DPB[1].f);
|
||||
|
||||
av_freep(&h->top_qp);
|
||||
av_freep(&h->top_mv[0]);
|
||||
av_freep(&h->top_mv[1]);
|
||||
av_freep(&h->top_pred_Y);
|
||||
av_freep(&h->top_border_y);
|
||||
av_freep(&h->top_border_u);
|
||||
av_freep(&h->top_border_v);
|
||||
av_freep(&h->col_mv);
|
||||
av_freep(&h->col_type_base);
|
||||
av_freep(&h->block);
|
||||
av_free(h->top_qp);
|
||||
av_free(h->top_mv[0]);
|
||||
av_free(h->top_mv[1]);
|
||||
av_free(h->top_pred_Y);
|
||||
av_free(h->top_border_y);
|
||||
av_free(h->top_border_u);
|
||||
av_free(h->top_border_v);
|
||||
av_free(h->col_mv);
|
||||
av_free(h->col_type_base);
|
||||
av_free(h->block);
|
||||
av_freep(&h->edge_emu_buffer);
|
||||
return 0;
|
||||
}
|
||||
|
@@ -467,7 +467,7 @@ static inline void mv_pred_direct(AVSContext *h, cavs_vector *pmv_fw,
|
||||
{
|
||||
cavs_vector *pmv_bw = pmv_fw + MV_BWD_OFFS;
|
||||
int den = h->direct_den[col_mv->ref];
|
||||
int m = FF_SIGNBIT(col_mv->x);
|
||||
int m = col_mv->x >> 31;
|
||||
|
||||
pmv_fw->dist = h->dist[1];
|
||||
pmv_bw->dist = h->dist[0];
|
||||
@@ -476,7 +476,7 @@ static inline void mv_pred_direct(AVSContext *h, cavs_vector *pmv_fw,
|
||||
/* scale the co-located motion vector according to its temporal span */
|
||||
pmv_fw->x = (((den + (den * col_mv->x * pmv_fw->dist ^ m) - m - 1) >> 14) ^ m) - m;
|
||||
pmv_bw->x = m - (((den + (den * col_mv->x * pmv_bw->dist ^ m) - m - 1) >> 14) ^ m);
|
||||
m = FF_SIGNBIT(col_mv->y);
|
||||
m = col_mv->y >> 31;
|
||||
pmv_fw->y = (((den + (den * col_mv->y * pmv_fw->dist ^ m) - m - 1) >> 14) ^ m) - m;
|
||||
pmv_bw->y = m - (((den + (den * col_mv->y * pmv_bw->dist ^ m) - m - 1) >> 14) ^ m);
|
||||
}
|
||||
@@ -1147,7 +1147,8 @@ static int decode_seq_header(AVSContext *h)
|
||||
h->low_delay = get_bits1(&h->gb);
|
||||
h->mb_width = (h->width + 15) >> 4;
|
||||
h->mb_height = (h->height + 15) >> 4;
|
||||
h->avctx->framerate = ff_mpeg12_frame_rate_tab[frame_rate_code];
|
||||
h->avctx->time_base.den = ff_mpeg12_frame_rate_tab[frame_rate_code].num;
|
||||
h->avctx->time_base.num = ff_mpeg12_frame_rate_tab[frame_rate_code].den;
|
||||
h->avctx->width = h->width;
|
||||
h->avctx->height = h->height;
|
||||
if (!h->top_qp)
|
||||
|
@@ -41,11 +41,11 @@ typedef struct CNGContext {
|
||||
static av_cold int cng_decode_close(AVCodecContext *avctx)
|
||||
{
|
||||
CNGContext *p = avctx->priv_data;
|
||||
av_freep(&p->refl_coef);
|
||||
av_freep(&p->target_refl_coef);
|
||||
av_freep(&p->lpc_coef);
|
||||
av_freep(&p->filter_out);
|
||||
av_freep(&p->excitation);
|
||||
av_free(p->refl_coef);
|
||||
av_free(p->target_refl_coef);
|
||||
av_free(p->lpc_coef);
|
||||
av_free(p->filter_out);
|
||||
av_free(p->excitation);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@@ -1440,14 +1440,6 @@ static const AVCodecDescriptor codec_descriptors[] = {
|
||||
.props = AV_CODEC_PROP_INTRA_ONLY | AV_CODEC_PROP_LOSSLESS,
|
||||
.mime_types= MT("image/x-xwindowdump"),
|
||||
},
|
||||
{
|
||||
.id = AV_CODEC_ID_APNG,
|
||||
.type = AVMEDIA_TYPE_VIDEO,
|
||||
.name = "apng",
|
||||
.long_name = NULL_IF_CONFIG_SMALL("APNG (Animated Portable Network Graphics) image"),
|
||||
.props = AV_CODEC_PROP_LOSSLESS,
|
||||
.mime_types= MT("image/png"),
|
||||
},
|
||||
|
||||
/* various PCM "codecs" */
|
||||
{
|
||||
@@ -2642,13 +2634,6 @@ static const AVCodecDescriptor codec_descriptors[] = {
|
||||
.long_name = NULL_IF_CONFIG_SMALL("RealText subtitle"),
|
||||
.props = AV_CODEC_PROP_TEXT_SUB,
|
||||
},
|
||||
{
|
||||
.id = AV_CODEC_ID_STL,
|
||||
.type = AVMEDIA_TYPE_SUBTITLE,
|
||||
.name = "stl",
|
||||
.long_name = NULL_IF_CONFIG_SMALL("Spruce subtitle format"),
|
||||
.props = AV_CODEC_PROP_TEXT_SUB,
|
||||
},
|
||||
{
|
||||
.id = AV_CODEC_ID_SUBVIEWER1,
|
||||
.type = AVMEDIA_TYPE_SUBTITLE,
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user