Compare commits
349 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
21d0ae829f | ||
![]() |
af27254eb3 | ||
![]() |
ffb4362bf0 | ||
![]() |
3ea101b234 | ||
![]() |
3c7ea2c46e | ||
![]() |
682ccd4167 | ||
![]() |
e7e1832cfd | ||
![]() |
23e88c81d6 | ||
![]() |
6b7c621839 | ||
![]() |
3d65a272da | ||
![]() |
458ba000a5 | ||
![]() |
64c82912a7 | ||
![]() |
1aaf9613a8 | ||
![]() |
8b95fc6d8d | ||
![]() |
10b77a3471 | ||
![]() |
7e3d413f12 | ||
![]() |
1bf416dfc3 | ||
![]() |
d3c9d87eea | ||
![]() |
228f7c7eed | ||
![]() |
ba82b23a1d | ||
![]() |
665b343f92 | ||
![]() |
43f9ec7113 | ||
![]() |
8d02ba5b7b | ||
![]() |
cb0cc44f3a | ||
![]() |
71689e7863 | ||
![]() |
d2fbf8b569 | ||
![]() |
c14359f24d | ||
![]() |
9fb1c02f30 | ||
![]() |
4a49f1e764 | ||
![]() |
474bfd5438 | ||
![]() |
02c1074f18 | ||
![]() |
db00ecbc96 | ||
![]() |
ebdbb13108 | ||
![]() |
cdc4727766 | ||
![]() |
4858ee1d9c | ||
![]() |
63d484c342 | ||
![]() |
4c6224b1cd | ||
![]() |
bf2254bffd | ||
![]() |
2cab5f4ad0 | ||
![]() |
1ed8a10487 | ||
![]() |
502684348b | ||
![]() |
58f310f496 | ||
![]() |
0230a8efc6 | ||
![]() |
ef5fa5099b | ||
![]() |
885f501f7a | ||
![]() |
00223d461b | ||
![]() |
7d45230d81 | ||
![]() |
254e3af60f | ||
![]() |
05c2801413 | ||
![]() |
b7a3a3a8d2 | ||
![]() |
2012a226d2 | ||
![]() |
b8e0b6c702 | ||
![]() |
1973b6ac5c | ||
![]() |
9c10c0fdcd | ||
![]() |
596b9d6ed8 | ||
![]() |
699357dd4e | ||
![]() |
ff0f0b1e83 | ||
![]() |
cb1ecf08b2 | ||
![]() |
e3d9bf1151 | ||
![]() |
b2d31dcf04 | ||
![]() |
a9f003b8ac | ||
![]() |
4d3450d62f | ||
![]() |
466575c0e0 | ||
![]() |
dc8f42e037 | ||
![]() |
bb523c1b86 | ||
![]() |
b8568c546e | ||
![]() |
7d58774360 | ||
![]() |
448d6488b1 | ||
![]() |
e67181a351 | ||
![]() |
84db3e6648 | ||
![]() |
d8bfa4bb94 | ||
![]() |
39115c01f0 | ||
![]() |
e337d5f1b1 | ||
![]() |
454f63181a | ||
![]() |
9b12e4c1e3 | ||
![]() |
b04f6dfd3c | ||
![]() |
c3653e2265 | ||
![]() |
4d6d159069 | ||
![]() |
77059eedb5 | ||
![]() |
31601db12a | ||
![]() |
69f122abd9 | ||
![]() |
8016800a64 | ||
![]() |
4158d55b9a | ||
![]() |
b8627a63d8 | ||
![]() |
260f6b4418 | ||
![]() |
c946f2cc83 | ||
![]() |
1e6352578a | ||
![]() |
d269eb2c11 | ||
![]() |
cb63a8c646 | ||
![]() |
2f85f511ff | ||
![]() |
3afb2653bd | ||
![]() |
4c01572a94 | ||
![]() |
216ef1200a | ||
![]() |
b8f5996071 | ||
![]() |
004064912f | ||
![]() |
5ae8df8d37 | ||
![]() |
af70697836 | ||
![]() |
836a66eeb0 | ||
![]() |
346c4f0ad0 | ||
![]() |
a2ad7fdb3a | ||
![]() |
5fd5b8ef79 | ||
![]() |
3f629c83b4 | ||
![]() |
faac8e4331 | ||
![]() |
5be683d687 | ||
![]() |
96c1421627 | ||
![]() |
8a59dbbc68 | ||
![]() |
0683ef4b50 | ||
![]() |
b420354a8b | ||
![]() |
1d0f9c92c5 | ||
![]() |
d846d3e88e | ||
![]() |
621f1a2e63 | ||
![]() |
9a241d95ef | ||
![]() |
41b15817ce | ||
![]() |
07ea57c5bb | ||
![]() |
84fedd3be7 | ||
![]() |
74fb9df48b | ||
![]() |
8c0fd44317 | ||
![]() |
6f02d93c0f | ||
![]() |
9333ee7c0d | ||
![]() |
3e30424961 | ||
![]() |
fe2df122b4 | ||
![]() |
f96fdb46b7 | ||
![]() |
7fa861dfe0 | ||
![]() |
48f616ceee | ||
![]() |
8968de6c61 | ||
![]() |
043cb40bec | ||
![]() |
76b289bcf2 | ||
![]() |
52ba406b94 | ||
![]() |
071eb56a6a | ||
![]() |
2f67222780 | ||
![]() |
a376ef4a17 | ||
![]() |
43fdd89a3f | ||
![]() |
60f2f332a3 | ||
![]() |
7e05c70bb0 | ||
![]() |
b46840475e | ||
![]() |
d0599a3516 | ||
![]() |
742d7e9a6e | ||
![]() |
eb6f2a183a | ||
![]() |
1e86b7108e | ||
![]() |
4be1cc7b1d | ||
![]() |
61dbd3f3d0 | ||
![]() |
38d6ff31b7 | ||
![]() |
b0cd6fb590 | ||
![]() |
50fd06ea32 | ||
![]() |
808d5444c4 | ||
![]() |
6915dd49c7 | ||
![]() |
c657b08fd7 | ||
![]() |
6d14bea8b5 | ||
![]() |
749cd89ca9 | ||
![]() |
2b408d257f | ||
![]() |
8d853dc341 | ||
![]() |
86960b1101 | ||
![]() |
94354e368d | ||
![]() |
93a0682b1d | ||
![]() |
0e16c3843a | ||
![]() |
819955f0c6 | ||
![]() |
b36bda3c82 | ||
![]() |
25b8d52fdd | ||
![]() |
1a2aaa7497 | ||
![]() |
f18fc45d18 | ||
![]() |
2684ff3573 | ||
![]() |
ea0f616a57 | ||
![]() |
51b911e948 | ||
![]() |
bb508ddb8b | ||
![]() |
9246eb1ec5 | ||
![]() |
c5b2ef3bdf | ||
![]() |
07df052d8d | ||
![]() |
9bb7e2bd90 | ||
![]() |
90fa2460c0 | ||
![]() |
50f5037947 | ||
![]() |
21533730fc | ||
![]() |
032476f830 | ||
![]() |
57c7922331 | ||
![]() |
73dd8f0a24 | ||
![]() |
55637b2e5e | ||
![]() |
e6bc1fe10c | ||
![]() |
e6b18f5700 | ||
![]() |
3791436eb5 | ||
![]() |
61147f58ab | ||
![]() |
29e435ca33 | ||
![]() |
0540d5c5fc | ||
![]() |
7f97231d97 | ||
![]() |
4005a71def | ||
![]() |
429347afa7 | ||
![]() |
a81b6a662a | ||
![]() |
6168fe32f1 | ||
![]() |
711374b626 | ||
![]() |
9a63a36dc6 | ||
![]() |
db1a99a209 | ||
![]() |
fe8c81a0f3 | ||
![]() |
728051d9b1 | ||
![]() |
99d58a0da4 | ||
![]() |
9783f9fb98 | ||
![]() |
2ed0a77b7b | ||
![]() |
804e1e1610 | ||
![]() |
99d2d1404c | ||
![]() |
cb1c9294f3 | ||
![]() |
84341627d7 | ||
![]() |
4f694182e0 | ||
![]() |
a2cfb784fb | ||
![]() |
6faf18acbd | ||
![]() |
96807933d8 | ||
![]() |
4ef32aa2a6 | ||
![]() |
727730e279 | ||
![]() |
5a829ee69e | ||
![]() |
7fe22c3fe6 | ||
![]() |
c7565b143c | ||
![]() |
303ecfc373 | ||
![]() |
1456ed2dd5 | ||
![]() |
79c9d9b134 | ||
![]() |
d0aa3d13fa | ||
![]() |
e5cc73e0a5 | ||
![]() |
3429714f3d | ||
![]() |
ee902d3d2d | ||
![]() |
9bc62da980 | ||
![]() |
2a6d16ba5f | ||
![]() |
c7e967a7cb | ||
![]() |
5262c88bb0 | ||
![]() |
bd78b9416d | ||
![]() |
48ae72e501 | ||
![]() |
0f671dfeac | ||
![]() |
345962121d | ||
![]() |
0cbf53bdf5 | ||
![]() |
b20409c690 | ||
![]() |
7997ec54c9 | ||
![]() |
e805826903 | ||
![]() |
137a000377 | ||
![]() |
78c314e39e | ||
![]() |
756d85dc14 | ||
![]() |
eeab3e1b20 | ||
![]() |
a75787a71a | ||
![]() |
09425294c9 | ||
![]() |
3572eaaf02 | ||
![]() |
25da8d84a4 | ||
![]() |
0f642909d8 | ||
![]() |
6252e9141b | ||
![]() |
c65a731b6f | ||
![]() |
58096b70fa | ||
![]() |
0ae93844d0 | ||
![]() |
657dc91b44 | ||
![]() |
352d17086f | ||
![]() |
193440f566 | ||
![]() |
563e542b31 | ||
![]() |
b0b6d8de7e | ||
![]() |
2f5c5767d1 | ||
![]() |
979a54ed18 | ||
![]() |
d11bca8043 | ||
![]() |
a3ef410b9c | ||
![]() |
260e5c6dbe | ||
![]() |
bac6554c74 | ||
![]() |
1e366c15ed | ||
![]() |
675fb3a8af | ||
![]() |
25fc0faccb | ||
![]() |
164083434e | ||
![]() |
8026606497 | ||
![]() |
6ac8ac0109 | ||
![]() |
f07e2ff697 | ||
![]() |
b62b3e1a25 | ||
![]() |
a45b8af839 | ||
![]() |
a443b48ccf | ||
![]() |
a45402d4c0 | ||
![]() |
0bdc64e8b9 | ||
![]() |
5fbf63ea39 | ||
![]() |
4d74bb24e3 | ||
![]() |
7f8d0cf93a | ||
![]() |
28fba55306 | ||
![]() |
7caee17204 | ||
![]() |
edec2a4da3 | ||
![]() |
65074a5dae | ||
![]() |
e3b6144e0c | ||
![]() |
8acbba0ec3 | ||
![]() |
9e9cde6afa | ||
![]() |
4f8814964c | ||
![]() |
8a6770a214 | ||
![]() |
763e6ecf83 | ||
![]() |
07d508e4f5 | ||
![]() |
b089b58250 | ||
![]() |
a7dd37169c | ||
![]() |
3032291b3a | ||
![]() |
f9bbc26e69 | ||
![]() |
b895e29941 | ||
![]() |
3d71024f8a | ||
![]() |
b834dc14da | ||
![]() |
d0041dc8c4 | ||
![]() |
b3c082412c | ||
![]() |
918ed73b70 | ||
![]() |
2791eba1d7 | ||
![]() |
0d3a07852c | ||
![]() |
c7a2ac6b6b | ||
![]() |
0ce35b8ce8 | ||
![]() |
25312a427b | ||
![]() |
9143ab0e5a | ||
![]() |
022bfd3dd4 | ||
![]() |
e0a12b3dc3 | ||
![]() |
252ba4a925 | ||
![]() |
5bb31e856d | ||
![]() |
eac0451e47 | ||
![]() |
68c6347089 | ||
![]() |
bcd7f35717 | ||
![]() |
93cbdcd4d3 | ||
![]() |
959ab06c68 | ||
![]() |
46db3121c6 | ||
![]() |
c96c755320 | ||
![]() |
9f8cdd520b | ||
![]() |
f5631d23e0 | ||
![]() |
50f4543c6b | ||
![]() |
1344e91f33 | ||
![]() |
f13e6ec7a6 | ||
![]() |
bf2c9e1ad4 | ||
![]() |
0663aab1d9 | ||
![]() |
e911f125fc | ||
![]() |
5aead5ee05 | ||
![]() |
3a5b749d7c | ||
![]() |
4b4d0b0290 | ||
![]() |
c9b25252cb | ||
![]() |
4400385d5f | ||
![]() |
d85e25fe0b | ||
![]() |
3d1972d182 | ||
![]() |
71b1abe638 | ||
![]() |
991ef3a67e | ||
![]() |
b850b01533 | ||
![]() |
23a17b4a3d | ||
![]() |
3a8ad4b878 | ||
![]() |
b85a939633 | ||
![]() |
7e130ca5b4 | ||
![]() |
f295f9488a | ||
![]() |
2c01dd2ea5 | ||
![]() |
5e26152ee4 | ||
![]() |
135c733125 | ||
![]() |
3b3a3c3d44 | ||
![]() |
13244abcd3 | ||
![]() |
9783d5bfda | ||
![]() |
0e4efad93c | ||
![]() |
0103bc67fd | ||
![]() |
d5af3fb1c5 | ||
![]() |
6ec5a199ea | ||
![]() |
f7b5366657 | ||
![]() |
542332e523 | ||
![]() |
aa24dd487f | ||
![]() |
3bcd1daad7 | ||
![]() |
91f88eab32 | ||
![]() |
aac467ae17 | ||
![]() |
968e733b2e | ||
![]() |
192d46e6d1 | ||
![]() |
bb8614cb7b | ||
![]() |
d9bdf7d9ae | ||
![]() |
a588e1e560 | ||
![]() |
36e7385d0e | ||
![]() |
5108323aa9 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -83,7 +83,6 @@
|
||||
/tools/pktdumper
|
||||
/tools/probetest
|
||||
/tools/qt-faststart
|
||||
/tools/sidxindex
|
||||
/tools/trasher
|
||||
/tools/seek_print
|
||||
/tools/uncoded_frame
|
||||
|
480
Changelog
480
Changelog
@@ -1,282 +1,54 @@
|
||||
Entries are sorted chronologically from oldest to youngest within each release,
|
||||
releases are sorted from youngest to oldest.
|
||||
|
||||
version 2.6.5:
|
||||
- rtmpcrypt: Do the xtea decryption in little endian mode
|
||||
- avformat/matroskadec: Check subtitle stream before dereferencing
|
||||
- avformat/utils: Do not init parser if probing is unfinished
|
||||
- avcodec/jpeg2000dec: Fix potential integer overflow with tile dimensions
|
||||
- avcodec/jpeg2000dec: Check SIZ dimensions to be within the supported range
|
||||
- avcodec/jpeg2000: Check comp coords to be within the supported size
|
||||
- avcodec/jpeg2000: Use av_image_check_size() in ff_jpeg2000_init_component()
|
||||
- avcodec/wmaprodec: Check for overread in decode_packet()
|
||||
- avcodec/smacker: Check that the data size is a multiple of a sample vector
|
||||
- avcodec/takdec: Skip last p2 sample (which is unused)
|
||||
- avcodec/dxtory: Fix input size check in dxtory_decode_v1_410()
|
||||
- avcodec/dxtory: Fix input size check in dxtory_decode_v1_420()
|
||||
- avcodec/error_resilience: avoid accessing previous or next frames tables beyond height
|
||||
- avcodec/dpx: Move need_align to act per line
|
||||
- avcodec/flashsv: Check size before updating it
|
||||
- avcodec/ivi: Check image dimensions
|
||||
- avcodec/utils: Better check for channels in av_get_audio_frame_duration()
|
||||
- avcodec/jpeg2000dec: Check for duplicate SIZ marker
|
||||
- doc/ffmpeg: Clarify that the sdp_file option requires an rtp output.
|
||||
- ffmpeg: Don't try and write sdp info if none of the outputs had an rtp format.
|
||||
- jvdec: avoid unsigned overflow in comparison
|
||||
- avcodec/jpeg2000dec: Clip all tile coordinates
|
||||
- avcodec/hevc_ps: Check chroma_format_idc
|
||||
- avcodec/microdvddec: Check for string end in 'P' case
|
||||
- avcodec/dirac_parser: Fix undefined memcpy() use
|
||||
- avformat/xmv: Discard remainder of packet on error
|
||||
- avformat/xmv: factor return check out of if/else
|
||||
- avcodec/mpeg12dec: Do not call show_bits() with invalid bits
|
||||
- libavutil/channel_layout: Check strtol*() for failure
|
||||
- avcodec/ffv1dec: Check for 0 quant tables
|
||||
- avcodec/mjpegdec: Reinitialize IDCT on BPP changes
|
||||
- avcodec/mjpegdec: Check index in ljpeg_decode_yuv_scan() before using it
|
||||
- avutil/file_open: avoid file handle inheritance on Windows
|
||||
- opusdec: Don't run vector_fmul_scalar on zero length arrays
|
||||
- avcodec/ffv1: Initialize vlc_state on allocation
|
||||
- avcodec/ffv1dec: update progress in case of broken pointer chains
|
||||
- avcodec/ffv1dec: Clear slice coordinates if they are invalid or slice header decoding fails for other reasons
|
||||
- avformat/httpauth: Add space after commas in HTTP/RTSP auth header
|
||||
- avcodec/x86/sbrdsp: Fix using uninitialized upper 32bit of noise
|
||||
- avcodec/ffv1dec: Fix off by 1 error in quant_table_count check
|
||||
- avcodec/ffv1dec: Explicitly check read_quant_table() return value
|
||||
- avcodec/rangecoder: Check e
|
||||
- lavf/webvttenc: Require webvtt file to contain exactly one WebVTT stream.
|
||||
- avcodec/mjpegdec: Fix decoding RGBA RCT LJPEG
|
||||
- avfilter/af_asyncts: use llabs for int64_t
|
||||
- avcodec/g2meet: Also clear tile dimensions on header_fail
|
||||
- avcodec/g2meet: Fix potential overflow in tile dimensions check
|
||||
- avcodec/svq1dec: Check init_get_bits8() for failure
|
||||
- avcodec/tta: Check init_get_bits8() for failure
|
||||
- avcodec/vp3: Check init_get_bits8() for failure
|
||||
- swresample/swresample: Fix integer overflow in seed calculation
|
||||
- avformat/mov: Fix integer overflow in FFABS
|
||||
- avutil/common: Add FFNABS()
|
||||
- avutil/common: Document FFABS() corner case
|
||||
- avformat/dump: Fix integer overflow in aspect ratio calculation
|
||||
- avcodec/truemotion1: Check for even width
|
||||
- avcodec/mpeg12dec: Set dimensions in mpeg1_decode_sequence() only in absence of errors
|
||||
- avcodec/libopusenc: Fix infinite loop on flushing after 0 input
|
||||
- avformat/hevc: Check num_long_term_ref_pics_sps to avoid potentially long loops
|
||||
- avformat/hevc: Fix parsing errors
|
||||
- ffmpeg: Use correct codec_id for av_parser_change() check
|
||||
- ffmpeg: Check av_parser_change() for failure
|
||||
- ffmpeg: Check for RAWVIDEO and do not relay only on AVFMT_RAWPICTURE
|
||||
- ffmpeg: check avpicture_fill() return value
|
||||
- avformat/mux: Update sidedata in ff_write_chained()
|
||||
- avcodec/flashsvenc: Correct max dimension in error message
|
||||
- avcodec/svq1enc: Check dimensions
|
||||
- avcodec/dcaenc: clear bitstream end
|
||||
- libavcodec/aacdec_template: Use init_get_bits8() in aac_decode_frame()
|
||||
- rawdec: fix mjpeg probing buffer size check
|
||||
- rawdec: fix mjpeg probing
|
||||
- videodsp: don't overread edges in vfix3 emu_edge.
|
||||
- lavf/matroskadec: Fully parse and repack MP3 packets
|
||||
- avcodec/h264_mp4toannexb_bsf: Reorder operations in nal_size check
|
||||
- avformat/oggenc: Check segments_count for headers too
|
||||
- avformat/avidec: Workaround broken initial frame
|
||||
- hevc: properly handle no_rasl_output_flag when removing pictures from the DPB
|
||||
- hevc: fix wpp threading deadlock.
|
||||
- avcodec/ffv1: separate slice_count from max_slice_count
|
||||
- lavf/img2dec: Fix memory leak
|
||||
- avcodec/mp3: fix skipping zeros
|
||||
- avformat/srtdec: make sure we probe a number
|
||||
- avformat/srtdec: more lenient first line probing
|
||||
- doc: mention libavcodec can decode Opus natively
|
||||
- MAINTAINERS: Remove myself as leader
|
||||
|
||||
|
||||
version 2.6.4:
|
||||
- imc: use correct position for flcoeffs2 calculation
|
||||
- hevc: check slice address length
|
||||
- snow: remove an obsolete av_assert2
|
||||
- webp: fix infinite loop in webp_decode_frame
|
||||
- wavpack: limit extra_bits to 32 and use get_bits_long
|
||||
- ffmpeg: only count got_output/errors in decode_error_stat
|
||||
- ffmpeg: exit_on_error if decoding a packet failed
|
||||
- pthread_frame: forward error codes when flushing
|
||||
- huffyuvdec: validate image size
|
||||
- wavpack: use get_bits_long to read up to 32 bits
|
||||
- nutdec: check maxpos in read_sm_data before returning success
|
||||
- vc1dec: use get_bits_long and limit the read bits to 32
|
||||
- mpegaudiodec: copy AVFloatDSPContext from first context to all contexts
|
||||
- avcodec/vp8: Check buffer size in vp8_decode_frame_header()
|
||||
- avcodec/vp8: Fix null pointer dereference in ff_vp8_decode_free()
|
||||
- avcodec/diracdec: Check for hpel_base allocation failure
|
||||
- avcodec/rv34: Clear pointers in ff_rv34_decode_init_thread_copy()
|
||||
- avfilter/af_aresample: Check ff_all_* for allocation failures
|
||||
- avcodec/pthread_frame: clear priv_data, avoid stale pointer in error case
|
||||
- swscale/utils: Clear pix buffers
|
||||
- avutil/fifo: Fix the case where func() returns less bytes than requested in av_fifo_generic_write()
|
||||
- ffmpeg: Fix cleanup after failed allocation of output_files
|
||||
- avformat/mov: Fix deallocation when MOVStreamContext failed to allocate
|
||||
- ffmpeg: Fix crash with ost->last_frame allocation failure
|
||||
- ffmpeg: Fix cleanup with ost = NULL
|
||||
- avcodec/pthread_frame: check avctx on deallocation
|
||||
- avcodec/sanm: Reset sizes in destroy_buffers()
|
||||
- avcodec/alac: Clear pointers in allocate_buffers()
|
||||
- bytestream2: set the reader to the end when reading more than available
|
||||
- avcodec/utils: use a minimum 32pixel width in avcodec_align_dimensions2() for H.264
|
||||
- avcodec/mpegvideo: Clear pointers in ff_mpv_common_init()
|
||||
- oggparsedirac: check return value of init_get_bits
|
||||
- wmalosslessdec: reset frame->nb_samples on packet loss
|
||||
- wmalosslessdec: avoid reading 0 bits with get_bits
|
||||
- avcodec/rawenc: Use ff_alloc_packet() instead of ff_alloc_packet2()
|
||||
- avcodec/aacsbr: Assert that bs_num_env is positive
|
||||
- avcodec/aacsbr: check that the element type matches before applying SBR
|
||||
- avcodec/h264_slice: Use w/h from the AVFrame instead of mb_w/h
|
||||
- vp9/update_prob: prevent out of bounds table read
|
||||
- avfilter/vf_transpose: Fix rounding error
|
||||
- avcodec/pngdec: Check values before updating context in decode_fctl_chunk()
|
||||
- avcodec/pngdec: Require a IHDR chunk before fctl
|
||||
- avcodec/pngdec: Only allow one IHDR chunk
|
||||
- wmavoice: limit wmavoice_decode_packet return value to packet size
|
||||
- swscale/swscale_unscaled: Fix rounding difference with RGBA output between little and big endian
|
||||
- ffmpeg: Do not use the data/size of a bitstream filter after failure
|
||||
- swscale/x86/rgb2rgb_template: fix signedness of v in shuffle_bytes_2103_{mmx,mmxext}
|
||||
- swscale/x86/rgb2rgb_template: add missing xmm clobbers
|
||||
- vda: unlock the pixel buffer base address.
|
||||
- swscale/rgb2rgb_template: Fix signedness of v in shuffle_bytes_2103_c()
|
||||
- swscale/rgb2rgb_template: Implement shuffle_bytes_0321_c and fix shuffle_bytes_2103_c on BE
|
||||
- swscale/rgb2rgb_template: Disable shuffle_bytes_2103_c on big endian
|
||||
- swr: Remember previously set int_sample_format from user
|
||||
- matroskadec: check audio sample rate
|
||||
- matroskadec: validate audio channels and bitdepth
|
||||
- avcodec/dpxenc: implement write16/32 as functions
|
||||
- postproc: fix unaligned access
|
||||
- ffmpeg: Free last_frame instead of just unref
|
||||
- avio: fix potential crashes when combining ffio_ensure_seekback + crc
|
||||
- examples/demuxing_decoding: use properties from frame instead of video_dec_ctx
|
||||
- h264: er: Copy from the previous reference only if compatible
|
||||
- sonic: set avctx->channels in sonic_decode_init
|
||||
- vp8: change mv_{min,max}.{x,y} type to int
|
||||
- vp9: change type of tile_size from unsigned to int64_t
|
||||
- arm: only enable setend on ARMv6
|
||||
- libopenjpegdec: check existence of image component data
|
||||
- mov: abort on EOF in ff_mov_read_chan
|
||||
- ffmpeg_opt: Check for localtime() failure
|
||||
- avformat: Fix bug in parse_rps for HEVC.
|
||||
- takdec: ensure chan2 is a valid channel index
|
||||
- avcodec/h264_slice: Use AVFrame diemensions for grayscale handling
|
||||
- avdevice/lavfi: do not rescale AV_NOPTS_VALUE in lavfi_read_packet()
|
||||
- libavutil/channel_layout: Correctly return layout when channel specification ends with a trailing 'c'.
|
||||
- avcodec/jpeg2000dec: Check that coords match before applying ICT
|
||||
- avformat/ffmdec: Check ffio_set_buf_size() return value
|
||||
- avcodec/adpcm: Check for overreads
|
||||
- avcodec/alsdec: Check for overread
|
||||
- avcodec/atrac3plusdec: consume only as many bytes as available
|
||||
- libavutil/softfloat: Fix av_normalize1_sf bias.
|
||||
- swresample/swresample: Cleanup on init failure.
|
||||
- Revert "avformat/rtpenc: check av_packet_get_side_data() return, fix null ptr dereference"
|
||||
- avformat/mxfenc: Accept MXF D-10 with 49.999840 Mbit/sec
|
||||
- swresample/dither: check memory allocation
|
||||
- libopenjpegenc: add NULL check for img before accessing it
|
||||
- swresample: Check the return value of resampler->init()
|
||||
- h264: Make sure reinit failures mark the context as not initialized
|
||||
- avfilter/x86/vf_fspp: Fix invalid combination of opcode and operands
|
||||
- ffmpeg_opt: Set the video VBV parameters only for the video stream from -target
|
||||
- avcodec/bitstream: Assert that there is enough space left in avpriv_copy_bits()
|
||||
- avcodec/put_bits: Assert that there is enough space left in skip_put_bytes()
|
||||
- avcodec/mpegvideo_enc: Update the buffer size as more slices are merged
|
||||
- avcodec/put_bits: Update size_in_bits in set_put_bits_buffer_size()
|
||||
- avformat/wavdec: Increase dts packet threshold to fix more misdetections
|
||||
- avformat/wavdec: Increase probe_packets limit
|
||||
- nutdec: abort if EOF is reached in decode_info_header/read_sm_data
|
||||
- nutdec: stop skipping bytes at EOF
|
||||
- nutdec: fix infinite resync loops
|
||||
- avformat/nutdec: Check X in 2nd branch of index reading
|
||||
version 2.5.7
|
||||
- avformat/nutdec: Fix recovery when immedeately after seeking a failure happens
|
||||
- avformat/nutdec: Return error on EOF from get_str()
|
||||
- rtsp: Make sure we don't write too many transport entries into a fixed-size array
|
||||
- nutdec: fix memleaks on error in nut_read_header
|
||||
- rtpenc_jpeg: handle case of picture dimensions not dividing by 8
|
||||
- avcodec/golomb: get_ur_golomb_jpegls: Fix reading huge k values
|
||||
- avformat/swfdec: Do not error out on pixel format changes
|
||||
- avformat/mov: Mark avio context of decompressed atoms as seekable
|
||||
- avcodec/mjpegenc_common: Use ff_mpv_reallocate_putbitbuffer()
|
||||
- avcodec/mpegvideo: Factor ff_mpv_reallocate_putbitbuffer() out
|
||||
- avfilter/x86/vf_hqdn3d: Fix register types
|
||||
- avcodec/exr: fix crash caused by merge
|
||||
- avcodec/x86/h264_weight: handle weight1=128
|
||||
- avcodec/dvbsubdec: Fix buf_size check in dvbsub_parse_display_definition_segment()
|
||||
- avcodec/hevc_ps: Only discard overread VPS if a previous is available
|
||||
- avcodec/flacenc: Fix Invalid Rice order
|
||||
- lavd/xcbgrab: fix comparison with screen size.
|
||||
|
||||
version 2.6.3:
|
||||
- avcodec/libtheoraenc: Check for av_malloc failure
|
||||
- avformat/mov: Fix parsing short loci
|
||||
- avcodec/shorten: Fix code depending on signed overflow behavior
|
||||
- avcodec/proresdec2: Reset slice_count on deallocation
|
||||
- ffmpeg_opt: Fix -timestamp parsing
|
||||
- hevc: make avcodec_decode_video2() fail if get_format() fails
|
||||
- avcodec/cavsdec: Use ff_set_dimensions()
|
||||
- avcodec/mpeg4audio: add some padding/alignment to MAX_PCE_SIZE
|
||||
- swr: fix alignment issue caused by 8ch sse functions
|
||||
- avcodec/mjpegdec: fix len computation in ff_mjpeg_decode_dqt()
|
||||
- avcodec/jpeg2000dec: fix boolean operator
|
||||
- avcodec/hevc_ps: Explicitly check num_tile_* for negative values
|
||||
- libswscale/x86/hscale_fast_bilinear_simd.c: Include BX in the clobber list on x86_64, because it isn't implicitly included when PIC is on.
|
||||
- aacdec: don't return frames without data
|
||||
- avformat/matroskadec: Cleanup error handling for bz2 & zlib
|
||||
- avformat/nutdec: Fix use of uinitialized value
|
||||
- tools/graph2dot: use larger data types than int for array/string sizes
|
||||
- avformat/matroskaenc: Check ff_vorbiscomment_length in put_flac_codecpriv()
|
||||
- avcodec/mpeg12dec: use the correct dimensions for checking SAR
|
||||
- xcbgrab: Validate the capture area
|
||||
- xcbgrab: Do not assume the non shm image data is always available
|
||||
- avfilter/lavfutils: disable frame threads when decoding a single image
|
||||
- avformat/mov: Do not read ACLR into extradata for H.264
|
||||
- ffmpeg: remove incorrect network deinit
|
||||
- OpenCL: Avoid potential buffer overflow in cmdutils_opencl.c
|
||||
- libvpxenc: only set noise reduction w/vp8
|
||||
- vp9: remove another optimization branch in iadst16 which causes overflows.
|
||||
- lavf: Reset global flag on deinit
|
||||
- network: Do not leave context locked on error
|
||||
- vp9: remove one optimization branch in iadst16 which causes overflows.
|
||||
- fate: Include branch information in the payload header
|
||||
- avformat/utils: Ensure that AVFMT_FLAG_CUSTOM_IO is set before use
|
||||
- avformat/img2dec: do not rewind custom io buffers
|
||||
- avcodec/alsdec: Use av_mallocz_array() for chan_data to ensure the arrays never contain random data
|
||||
- avcodec/atrac3plusdsp: fix on stack alignment
|
||||
- swresample/swresample-test: Randomly wipe out channel counts
|
||||
- swresample: Check channel layouts and channels against each other and print human readable error messages
|
||||
- swresample: Allow reinitialization without ever setting channel layouts (cherry picked from commit 80a28c7509a11114e1aea5b208d56c6646d69c07)
|
||||
- swresample: Allow reinitialization without ever setting channel counts
|
||||
- dashenc: replace attribute id with contentType for the AdaptationSet element
|
||||
- avformat/matroskaenc: Use avoid_negative_ts_use_pts if no stream writes dts
|
||||
- avformat/mux: Add avoid_negative_ts_use_pts
|
||||
- tests/fate-run: do not attempt to parse tiny_psnrs output if it failed
|
||||
- cafdec: free extradata before allocating it
|
||||
- imgutils: initialize palette padding bytes in av_image_alloc
|
||||
- aacdec: don't return frames without data
|
||||
- id3v2: catch avio_read errors in check_tag
|
||||
- avi: Validate sample_size
|
||||
- aacsbr: break infinite loop in sbr_hf_calc_npatches
|
||||
- diracdec: avoid overflow of bytes*8 in decode_lowdelay
|
||||
- diracdec: prevent overflow in data_unit_size check
|
||||
- avformat/matroskadec: Use tracks[k]->stream instead of s->streams[k]
|
||||
- matroskadec: use uint64_t instead of int for index_scale
|
||||
- avidec: avoid infinite loop due to negative ast->sample_size
|
||||
- pngdec: don't use AV_PIX_FMT_MONOBLACK for apng
|
||||
- pngdec: return correct error code from decode_frame_common
|
||||
- avcodec/wavpack: Check L/R values before use to avoid harmless integer overflow and undefined behavior in fate
|
||||
- xcbgrab: Validate the capture area
|
||||
- xcbgrab: Do not assume the non shm image data is always available
|
||||
- avfilter/lavfutils: disable frame threads when decoding a single image
|
||||
- nutdec: fix illegal count check in decode_main_header
|
||||
- nutdec: fix memleaks on error in nut_read_header
|
||||
- apedec: prevent out of array writes in decode_array_0000
|
||||
- ffmpeg: remove incorrect network deinit
|
||||
- OpenCL: Avoid potential buffer overflow in cmdutils_opencl.c
|
||||
- apedec: set s->samples only when init_frame_decoder succeeded
|
||||
- swscale/ppc/swscale_altivec.c: POWER LE support in yuv2planeX_8() delete macro GET_VF() it was wrong
|
||||
- swscale/ppc/swscale_altivec.c: POWER LE support in yuv2planeX_8() delete macro GET_VF()
|
||||
- libvpxenc: only set noise reduction w/vp8
|
||||
- tests/fate-run: do not attempt to parse tiny_psnrs output if it failed
|
||||
- alac: reject rice_limit 0 if compression is used
|
||||
- alsdec: only adapt order for positive max_order
|
||||
- bink: check vst->index_entries before using it
|
||||
- mpeg4videodec: only allow a positive length
|
||||
- aacpsy: correct calculation of minath in psy_3gpp_init
|
||||
- alsdec: validate time diff index
|
||||
- alsdec: ensure channel reordering is reversible
|
||||
- alsdec: check sample pointer range in revert_channel_correlation
|
||||
- tests: drop bc dependency
|
||||
- fate: Include branch information in the payload header
|
||||
|
||||
|
||||
version 2.5.6
|
||||
- avcodec/atrac3plusdsp: fix on stack alignment
|
||||
- ac3: validate end in ff_ac3_bit_alloc_calc_mask
|
||||
- aacpsy: avoid psy_band->threshold becoming NaN
|
||||
- aasc: return correct buffer size from aasc_decode_frame
|
||||
- matroskadec: export cover art correctly
|
||||
- mxfenc: don't try to write footer without header
|
||||
- mxfenc: fix memleaks in mxf_write_footer
|
||||
- rtpenc_mpegts: Set chain->rtp_ctx only after avformat_write_header succeeded
|
||||
- rtpenc_mpegts: Free the right ->pb in the error path in the init function
|
||||
|
||||
version 2.6.2:
|
||||
- msrledec: use signed pixel_ptr in msrle_decode_pal4
|
||||
- swresample: Allow reinitialization without ever setting channel layouts (cherry picked from commit 80a28c7509a11114e1aea5b208d56c6646d69c07)
|
||||
- swresample: Allow reinitialization without ever setting channel counts
|
||||
- avcodec/h264: Do not fail with randomly truncated VUIs
|
||||
- avcodec/h264_ps: Move truncation check from VUI to SPS
|
||||
- avcodec/h264: Be more tolerant to changing pps id between slices
|
||||
@@ -285,87 +57,163 @@ version 2.6.2:
|
||||
- avcodec/h264_slice: Do not reset mb_aff_frame per slice
|
||||
- avcodec/h264: finish previous slices before switching to single thread mode
|
||||
- avcodec/h264: Fix race between slices where one overwrites data from the next
|
||||
- avformat/utils: avoid discarded streams in av_find_default_stream_index()
|
||||
- ffmpeg: Fix extradata allocation
|
||||
- avcodec/h264_refs: Do not set reference to things which do not exist
|
||||
- avcodec/h264: Fail for invalid mixed IDR / non IDR frames in slice threading mode
|
||||
- Revert "avcodec/exr: fix memset first arg in reverse_lut()"
|
||||
- h264: avoid unnecessary calls to get_format
|
||||
- avutil/pca: Check for av_malloc* failures
|
||||
- avutil/cpu: add missing check for mmxext to av_force_cpu_flags
|
||||
- lavc/dnxhd: Fix pix_fmt change.
|
||||
- avformat/http: replace cookies with updated values instead of appending forever
|
||||
- avformat/hls: store cookies returned in HLS key response
|
||||
- avformat/rmdec: fix support for 0 sized mdpr
|
||||
- avcodec/msrledec: restructure msrle_decode_pal4() based on the line number instead of the pixel pointer
|
||||
- avcodec/hevc_ps: Check cropping parameters more correctly
|
||||
- hevc: make the crop sizes unsigned
|
||||
- avcodec/dnxhddec: Reset is_444 if format is not 444
|
||||
- avcodec/dnxhddec: Check that the frame is interlaced before using cur_field
|
||||
- mips/float_dsp: fix vector_fmul_window_mips on mips64
|
||||
- doc: Remove non-existing decklink options.
|
||||
|
||||
version 2.6.1:
|
||||
|
||||
version 2.5.5:
|
||||
- vp9: make above buffer pointer 32-byte aligned.
|
||||
- avcodec/dnxhddec: Check that the frame is interlaced before using cur_field
|
||||
- avformat/mov: Disallow ".." in dref unless use_absolute_path is set
|
||||
- avfilter/palettegen: make sure at least one frame was sent to the filter
|
||||
- avformat/mov: Check for string truncation in mov_open_dref()
|
||||
- avformat/mov: Use sizeof(filename) instead of a literal number
|
||||
- eac3dec: fix scaling
|
||||
- ac3_fixed: fix computation of spx_noise_blend
|
||||
- ac3_fixed: fix out-of-bound read
|
||||
- mips/asmdefs: use _ABI64 as defined by gcc
|
||||
- hevc: delay ff_thread_finish_setup for hwaccel
|
||||
- ac3dec_fixed: always use the USE_FIXED=1 variant of the AC3DecodeContext
|
||||
- avcodec/012v: redesign main loop
|
||||
- avcodec/012v: Check dimensions more completely
|
||||
- asfenc: fix leaking asf->index_ptr on error
|
||||
- roqvideoenc: set enc->avctx in roq_encode_init
|
||||
- avcodec/options_table: remove extradata_size from the AVOptions table
|
||||
- ffmdec: limit the backward seek to the last resync position
|
||||
- Add dependencies to configure file for vf_fftfilt
|
||||
- ffmdec: make sure the time base is valid
|
||||
- ffmdec: fix infinite loop at EOF
|
||||
- ffmdec: initialize f_cprv, f_stvi and f_stau
|
||||
- avformat/rm: limit packet size
|
||||
- avcodec/webp: validate the distance prefix code
|
||||
- avcodec/rv10: check size of s->mb_width * s->mb_height
|
||||
- eamad: check for out of bounds read
|
||||
- mdec: check for out of bounds read
|
||||
- arm: Suppress tags about used cpu arch and extensions
|
||||
- aic: Fix decoding files with odd dimensions
|
||||
- avcodec/tiff: move bpp check to after "end:"
|
||||
- mxfdec: Fix the error handling for when strftime fails
|
||||
- avcodec/opusdec: Fix delayed sample value
|
||||
- avcodec/opusdec: Clear out pointers per packet
|
||||
- avcodec/utils: Align YUV411 by as much as the other YUV variants
|
||||
- lavc/hevcdsp: Fix compilation for arm with --disable-neon.
|
||||
- vp9: fix segmentation map retention with threading enabled.
|
||||
- Revert "avutil/opencl: is_compiled flag not being cleared in av_opencl_uninit"
|
||||
- webp: ensure that each transform is only used once
|
||||
- doc/protocols/tcp: fix units of listen_timeout option value, from microseconds to milliseconds
|
||||
- fix VP9 packet decoder returning 0 instead of the used data size
|
||||
- avformat/flvenc: check that the codec_tag fits in the available bits
|
||||
- avcodec/utils: use correct printf specifier in ff_set_sar
|
||||
- avutil/imgutils: correctly check for negative SAR components
|
||||
- swscale/utils: clear formatConvBuffer on allocation
|
||||
- avformat/bit: only accept the g729 codec and 1 channel
|
||||
- avformat/bit: check that pkt->size is 10 in write_packet
|
||||
- avformat/adxdec: check avctx->channels for invalid values
|
||||
- avformat/adxdec: set avctx->channels in adx_read_header
|
||||
- Fix buffer_size argument to init_put_bits() in multiple encoders.
|
||||
- mips/acelp_filters: fix incorrect register constraint
|
||||
- avcodec/hevc_ps: Sanity checks for some log2_* values
|
||||
- avcodec/zmbv: Check len before reading in decode_frame()
|
||||
- avcodec/h264: Only reinit quant tables if a new PPS is allowed
|
||||
- avcodec/snowdec: Fix ref value check
|
||||
- swscale/utils: More carefully merge and clear coefficients outside the input
|
||||
- avcodec/a64multienc: Assert that the Packet size does not grow
|
||||
- avcodec/a64multienc: simplify frame handling code
|
||||
- avcodec/a64multienc: fix use of uninitialized values in to_meta_with_crop
|
||||
- avcodec/a64multienc: initialize mc_meta_charset to zero
|
||||
- avcodec/a64multienc: don't set incorrect packet size
|
||||
- avcodec/a64multienc: use av_frame_ref instead of copying the frame
|
||||
- avcodec/x86/mlpdsp_init: Simplify mlp_filter_channel_x86()
|
||||
- h264: initialize H264Context.avctx in init_thread_copy
|
||||
- wtvdec: fix integer overflow resulting in errors with large files
|
||||
- avcodec/gif: fix off by one in column offsetting finding
|
||||
|
||||
version 2.6:
|
||||
- nvenc encoder
|
||||
- 10bit spp filter
|
||||
- colorlevels filter
|
||||
- RIFX format for *.wav files
|
||||
- RTP/mpegts muxer
|
||||
- non continuous cache protocol support
|
||||
- tblend filter
|
||||
- cropdetect support for non 8bpp, absolute (if limit >= 1) and relative (if limit < 1.0) threshold
|
||||
- Camellia symmetric block cipher
|
||||
- OpenH264 encoder wrapper
|
||||
- VOC seeking support
|
||||
- Closed caption Decoder
|
||||
- fspp, uspp, pp7 MPlayer postprocessing filters ported to native filters
|
||||
- showpalette filter
|
||||
- Twofish symmetric block cipher
|
||||
- Support DNx100 (960x720@8)
|
||||
- eq2 filter ported from libmpcodecs as eq filter
|
||||
- removed libmpcodecs
|
||||
- Changed default DNxHD colour range in QuickTime .mov derivatives to mpeg range
|
||||
- ported softpulldown filter from libmpcodecs as repeatfields filter
|
||||
- dcshift filter
|
||||
- RTP depacketizer for loss tolerant payload format for MP3 audio (RFC 5219)
|
||||
- RTP depacketizer for AC3 payload format (RFC 4184)
|
||||
- palettegen and paletteuse filters
|
||||
- VP9 RTP payload format (draft 0) experimental depacketizer
|
||||
- RTP depacketizer for DV (RFC 6469)
|
||||
- DXVA2-accelerated HEVC decoding
|
||||
- AAC ELD 480 decoding
|
||||
- Intel QSV-accelerated H.264 decoding
|
||||
- DSS SP decoder and DSS demuxer
|
||||
- Fix stsd atom corruption in DNxHD QuickTimes
|
||||
- Canopus HQX decoder
|
||||
- RTP depacketization of T.140 text (RFC 4103)
|
||||
- Port MIPS optimizations to 64-bit
|
||||
|
||||
version 2.5.4:
|
||||
- avcodec/arm/videodsp_armv5te: Fix linking failure with shared libs
|
||||
- avcodec/mjpegdec: Skip blocks which are outside the visible area
|
||||
- avcodec/h264_slice: ignore SAR changes in slices after the first
|
||||
- avcodec/h264_slice: Check picture structure before setting the related fields
|
||||
- avcodec/h264_slice: Do not change frame_num after the first slice
|
||||
- avutil/opt: Fix type used to access AV_OPT_TYPE_SAMPLE_FMT
|
||||
- avutil/opt: Fix types used to access AV_OPT_TYPE_PIXEL_FMT
|
||||
- avcodec/h264: Be more strict on rejecting pps/sps changes
|
||||
- avcodec/h264: Be more strict on rejecting pps_id changes
|
||||
- avcodec/h264_ps: More completely check the bit depths
|
||||
- avformat/thp: Check av_get_packet() for failure not only for partial output
|
||||
- swscale/utils: Limit filter shifting so as not to read from prior the array
|
||||
- avcodec/mpegvideo_motion: Fix gmc chroma dimensions
|
||||
- avcodec/mjpegdec: Check number of components for JPEG-LS
|
||||
- avcodec/mjpegdec: Check escape sequence validity
|
||||
- avformat/mpc8: Use uint64_t in *_get_v() to avoid undefined behavior
|
||||
- avformat/mpc8: fix broken pointer math
|
||||
- avformat/mpc8: fix hang with fuzzed file
|
||||
- avformat/tta: fix crash with corrupted files
|
||||
- avcodec/ppc/idctdsp.c: POWER LE support in idct_add_altivec()
|
||||
- swscale/input: fix rgba64 alpha non native
|
||||
- swscale/input: Fix alpha of YA16 input
|
||||
- libavcodec/ppc/mpegvideoencdsp.c: fix stack smashing in pix_norm1_altivec() and pix_sum_altivec()
|
||||
- avformat/rmdec: Check for overflow in ff_rm_read_mdpr_codecdata()
|
||||
- avformat/mpeg: do not count PES packets inside PES packets during probing
|
||||
- hevc: always clip luma_log2_weight_denom
|
||||
- rtpdec_h263_rfc2190: Clear the stored bits if discarding buffered data
|
||||
- aacenc: correctly check returned value
|
||||
- swscale: check memory allocations
|
||||
- opt: check memory allocation
|
||||
- avformat/utils: check for malloc failure
|
||||
- avcodec/flac_parser: fix handling EOF if no headers are found
|
||||
- avfilter/vf_framepack: Check and update frame_rate
|
||||
- vp8: improve memory allocation checks
|
||||
- configure: enable vsx together with altivec for ppc64el
|
||||
- avcodec/hevc: Fix handling of skipped_bytes() reallocation failures
|
||||
- qpeg: avoid pointless invalid memcpy()
|
||||
|
||||
|
||||
version 2.5.3:
|
||||
- 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
|
||||
- cmdutils: Use 64bit for file size/offset related variable in cmdutils_read_file()
|
||||
- mov: Fix negative size calculation in mov_read_default().
|
||||
- avformat/mov: fix integer overflow in mov_read_udta_string()
|
||||
- mov: Fix overflow and error handling in read_tfra().
|
||||
- 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
|
||||
- libavformat: Build hevc.o when building the RTP muxer
|
||||
|
||||
version 2.5.2:
|
||||
- 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/xface: correct the XFACE_MAX_* values
|
||||
- avcodec/vmdvideo: Check len before using it in method 3
|
||||
- configure: create the tests directory like the doc directory
|
||||
- mmvideo: check frame dimensions
|
||||
- jvdec: check frame dimensions
|
||||
|
||||
version 2.5.1:
|
||||
- lavu/frame: fix malloc error path in av_frame_copy_props()
|
||||
- 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/crypto: fix key vs iv typo
|
||||
- configure: use use_pkg_config() instead of check_pkg_config() for libsmbclient
|
||||
- avcodec/ppc/vp3dsp_altivec: POWER LE support to vp3_idct_add_altivec()
|
||||
- avformat/matroskadec: fix handling of recursive SeekHead elements
|
||||
- doc/examples/filtering_video: fix frame rate
|
||||
- avcodec/mpegaudiodec_template: only allocate fdsp when its used
|
||||
- doc/examples/transcoding: check encoder before using it
|
||||
- update MAINTAINERS file
|
||||
- POWER LE support in put_vp8_epel_h_altivec_core() put_vp8_epel_v_altivec_core() put_vp8_pixels16_altivec()
|
||||
- POWER LE support in vc1_inv_trans_8x4_altivec()
|
||||
|
||||
version 2.5:
|
||||
- HEVC/H.265 RTP payload format (draft v6) packetizer
|
||||
@@ -382,7 +230,7 @@ version 2.5:
|
||||
- creating DASH compatible fragmented MP4, MPEG-DASH segmenting muxer
|
||||
- WebP muxer with animated WebP support
|
||||
- zygoaudio decoding support
|
||||
- APNG demuxer
|
||||
- APNG decoder and demuxer
|
||||
- postproc visualization support
|
||||
|
||||
|
||||
@@ -393,7 +241,7 @@ version 2.4:
|
||||
- ICY metadata are now requested by default with the HTTP protocol
|
||||
- support for using metadata in stream specifiers in fftools
|
||||
- LZMA compression support in TIFF decoder
|
||||
- H.261 RTP payload format (RFC 4587) depacketizer and experimental packetizer
|
||||
- support for H.261 RTP payload format (RFC 4587)
|
||||
- HEVC/H.265 RTP payload format (draft v6) depacketizer
|
||||
- added codecview filter to visualize information exported by some codecs
|
||||
- Matroska 3D support thorugh side data
|
||||
|
110
LICENSE.md
110
LICENSE.md
@@ -1,73 +1,70 @@
|
||||
#FFmpeg:
|
||||
|
||||
Most files in FFmpeg are under the GNU Lesser General Public License version 2.1
|
||||
or later (LGPL v2.1+). Read the file `COPYING.LGPLv2.1` for details. Some other
|
||||
or later (LGPL v2.1+). Read the file COPYING.LGPLv2.1 for details. Some other
|
||||
files have MIT/X11/BSD-style licenses. In combination the LGPL v2.1+ applies to
|
||||
FFmpeg.
|
||||
|
||||
Some optional parts of FFmpeg are licensed under the GNU General Public License
|
||||
version 2 or later (GPL v2+). See the file `COPYING.GPLv2` for details. None of
|
||||
these parts are used by default, you have to explicitly pass `--enable-gpl` to
|
||||
version 2 or later (GPL v2+). See the file COPYING.GPLv2 for details. None of
|
||||
these parts are used by default, you have to explicitly pass --enable-gpl to
|
||||
configure to activate them. In this case, FFmpeg's license changes to GPL v2+.
|
||||
|
||||
Specifically, the GPL parts of FFmpeg are:
|
||||
|
||||
- libpostproc
|
||||
- libmpcodecs
|
||||
- optional x86 optimizations in the files
|
||||
- `libavcodec/x86/flac_dsp_gpl.asm`
|
||||
- `libavcodec/x86/idct_mmx.c`
|
||||
libavcodec/x86/flac_dsp_gpl.asm
|
||||
libavcodec/x86/idct_mmx.c
|
||||
- libutvideo encoding/decoding wrappers in
|
||||
`libavcodec/libutvideo*.cpp`
|
||||
- the X11 grabber in `libavdevice/x11grab.c`
|
||||
libavcodec/libutvideo*.cpp
|
||||
- the X11 grabber in libavdevice/x11grab.c
|
||||
- the swresample test app in
|
||||
`libswresample/swresample-test.c`
|
||||
- the `texi2pod.pl` tool
|
||||
libswresample/swresample-test.c
|
||||
- the texi2pod.pl tool
|
||||
- the following filters in libavfilter:
|
||||
- `f_ebur128.c`
|
||||
- `vf_blackframe.c`
|
||||
- `vf_boxblur.c`
|
||||
- `vf_colormatrix.c`
|
||||
- `vf_cropdetect.c`
|
||||
- `vf_delogo.c`
|
||||
- `vf_eq.c`
|
||||
- `vf_fspp.c`
|
||||
- `vf_geq.c`
|
||||
- `vf_histeq.c`
|
||||
- `vf_hqdn3d.c`
|
||||
- `vf_interlace.c`
|
||||
- `vf_kerndeint.c`
|
||||
- `vf_mcdeint.c`
|
||||
- `vf_mpdecimate.c`
|
||||
- `vf_owdenoise.c`
|
||||
- `vf_perspective.c`
|
||||
- `vf_phase.c`
|
||||
- `vf_pp.c`
|
||||
- `vf_pp7.c`
|
||||
- `vf_pullup.c`
|
||||
- `vf_sab.c`
|
||||
- `vf_smartblur.c`
|
||||
- `vf_repeatfields.c`
|
||||
- `vf_spp.c`
|
||||
- `vf_stereo3d.c`
|
||||
- `vf_super2xsai.c`
|
||||
- `vf_tinterlace.c`
|
||||
- `vf_uspp.c`
|
||||
- `vsrc_mptestsrc.c`
|
||||
- f_ebur128.c
|
||||
- vf_blackframe.c
|
||||
- vf_boxblur.c
|
||||
- vf_colormatrix.c
|
||||
- vf_cropdetect.c
|
||||
- vf_decimate.c
|
||||
- vf_delogo.c
|
||||
- vf_geq.c
|
||||
- vf_histeq.c
|
||||
- vf_hqdn3d.c
|
||||
- vf_interlace.c
|
||||
- vf_kerndeint.c
|
||||
- vf_mcdeint.c
|
||||
- vf_mp.c
|
||||
- vf_owdenoise.c
|
||||
- vf_perspective.c
|
||||
- vf_phase.c
|
||||
- vf_pp.c
|
||||
- vf_pullup.c
|
||||
- vf_sab.c
|
||||
- vf_smartblur.c
|
||||
- vf_spp.c
|
||||
- vf_stereo3d.c
|
||||
- vf_super2xsai.c
|
||||
- vf_tinterlace.c
|
||||
- vsrc_mptestsrc.c
|
||||
|
||||
Should you, for whatever reason, prefer to use version 3 of the (L)GPL, then
|
||||
the configure parameter `--enable-version3` will activate this licensing option
|
||||
for you. Read the file `COPYING.LGPLv3` or, if you have enabled GPL parts,
|
||||
`COPYING.GPLv3` to learn the exact legal terms that apply in this case.
|
||||
the configure parameter --enable-version3 will activate this licensing option
|
||||
for you. Read the file COPYING.LGPLv3 or, if you have enabled GPL parts,
|
||||
COPYING.GPLv3 to learn the exact legal terms that apply in this case.
|
||||
|
||||
There are a handful of files under other licensing terms, namely:
|
||||
|
||||
* The files `libavcodec/jfdctfst.c`, `libavcodec/jfdctint_template.c` and
|
||||
`libavcodec/jrevdct.c` are taken from libjpeg, see the top of the files for
|
||||
* The files libavcodec/jfdctfst.c, libavcodec/jfdctint_template.c and
|
||||
libavcodec/jrevdct.c are taken from libjpeg, see the top of the files for
|
||||
licensing details. Specifically note that you must credit the IJG in the
|
||||
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.
|
||||
tests/reference.pnm is under the expat license
|
||||
|
||||
|
||||
external libraries
|
||||
@@ -80,22 +77,21 @@ compatible libraries
|
||||
--------------------
|
||||
|
||||
The following libraries are under GPL:
|
||||
- frei0r
|
||||
- libcdio
|
||||
- libutvideo
|
||||
- libvidstab
|
||||
- libx264
|
||||
- libx265
|
||||
- libxavs
|
||||
- libxvid
|
||||
|
||||
- frei0r
|
||||
- libcdio
|
||||
- libutvideo
|
||||
- libvidstab
|
||||
- libx264
|
||||
- libx265
|
||||
- libxavs
|
||||
- libxvid
|
||||
When combining them with FFmpeg, FFmpeg needs to be licensed as GPL as well by
|
||||
passing `--enable-gpl` to configure.
|
||||
passing --enable-gpl to configure.
|
||||
|
||||
The OpenCORE and VisualOn libraries are under the Apache License 2.0. That
|
||||
license is incompatible with the LGPL v2.1 and the GPL v2, but not with
|
||||
version 3 of those licenses. So to combine these libraries with FFmpeg, the
|
||||
license version needs to be upgraded by passing `--enable-version3` to configure.
|
||||
license version needs to be upgraded by passing --enable-version3 to configure.
|
||||
|
||||
incompatible libraries
|
||||
----------------------
|
||||
@@ -103,7 +99,7 @@ incompatible libraries
|
||||
The Fraunhofer AAC library, FAAC and aacplus are under licenses which
|
||||
are incompatible with the GPLv2 and v3. We do not know for certain if their
|
||||
licenses are compatible with the LGPL.
|
||||
If you wish to enable these libraries, pass `--enable-nonfree` to configure.
|
||||
If you wish to enable these libraries, pass --enable-nonfree to configure.
|
||||
But note that if you enable any of these libraries the resulting binary will
|
||||
be under a complex license mix that is more restrictive than the LGPL and that
|
||||
may result in additional obligations. It is possible that these
|
||||
|
11
MAINTAINERS
11
MAINTAINERS
@@ -14,6 +14,7 @@ patches and related discussions.
|
||||
Project Leader
|
||||
==============
|
||||
|
||||
Michael Niedermayer
|
||||
final design decisions
|
||||
|
||||
|
||||
@@ -155,7 +156,6 @@ Codecs:
|
||||
celp_filters.* Vitor Sessak
|
||||
cinepak.c Roberto Togni
|
||||
cinepakenc.c Rl / Aetey G.T. AB
|
||||
ccaption_dec.c Anshul Maheshwari
|
||||
cljr Alex Beregszaszi
|
||||
cllc.c Derek Buitenhuis
|
||||
cook.c, cookdata.h Benjamin Larsson
|
||||
@@ -165,7 +165,6 @@ Codecs:
|
||||
dca.c Kostya Shishkov, Benjamin Larsson
|
||||
dnxhd* Baptiste Coudurier
|
||||
dpcm.c Mike Melanson
|
||||
dss_sp.c Oleksij Rempel, Michael Niedermayer
|
||||
dv.c Roman Shaposhnik
|
||||
dvbsubdec.c Anshul Maheshwari
|
||||
dxa.c Kostya Shishkov
|
||||
@@ -227,7 +226,6 @@ Codecs:
|
||||
msvideo1.c Mike Melanson
|
||||
nellymoserdec.c Benjamin Larsson
|
||||
nuv.c Reimar Doeffinger
|
||||
nvenc.c Timo Rothenpieler
|
||||
paf.* Paul B Mahol
|
||||
pcx.c Ivo van Poorten
|
||||
pgssubdec.c Reimar Doeffinger
|
||||
@@ -401,7 +399,6 @@ Muxers/Demuxers:
|
||||
cdxl.c Paul B Mahol
|
||||
crc.c Michael Niedermayer
|
||||
daud.c Reimar Doeffinger
|
||||
dss.c Oleksij Rempel, Michael Niedermayer
|
||||
dtshddec.c Paul B Mahol
|
||||
dv.c Roman Shaposhnik
|
||||
dxa.c Kostya Shishkov
|
||||
@@ -466,13 +463,9 @@ Muxers/Demuxers:
|
||||
rmdec.c, rmenc.c Ronald S. Bultje, Kostya Shishkov
|
||||
rtmp* Kostya Shishkov
|
||||
rtp.c, rtpenc.c Martin Storsjo
|
||||
rtpdec_ac3.* Gilles Chanteperdrix
|
||||
rtpdec_dv.* Thomas Volkert
|
||||
rtpdec_h261.*, rtpenc_h261.* Thomas Volkert
|
||||
rtpdec_hevc.*, rtpenc_hevc.* Thomas Volkert
|
||||
rtpdec_mpa_robust.* Gilles Chanteperdrix
|
||||
rtpdec_asf.* Ronald S. Bultje
|
||||
rtpdec_vp9.c Thomas Volkert
|
||||
rtpenc_mpv.*, rtpenc_aac.* Martin Storsjo
|
||||
rtsp.c Luca Barbato
|
||||
sbgdec.c Nicolas George
|
||||
@@ -544,10 +537,10 @@ x86 Michael Niedermayer
|
||||
Releases
|
||||
========
|
||||
|
||||
2.6 Michael Niedermayer
|
||||
2.5 Michael Niedermayer
|
||||
2.4 Michael Niedermayer
|
||||
2.2 Michael Niedermayer
|
||||
1.2 Michael Niedermayer
|
||||
|
||||
If you want to maintain an older release, please contact us
|
||||
|
||||
|
2
Makefile
2
Makefile
@@ -80,7 +80,7 @@ SUBDIR_VARS := CLEANFILES EXAMPLES FFLIBS HOSTPROGS TESTPROGS TOOLS \
|
||||
HEADERS ARCH_HEADERS BUILT_HEADERS SKIPHEADERS \
|
||||
ARMV5TE-OBJS ARMV6-OBJS ARMV8-OBJS VFP-OBJS NEON-OBJS \
|
||||
ALTIVEC-OBJS MMX-OBJS YASM-OBJS \
|
||||
MIPSFPU-OBJS MIPSDSPR2-OBJS MIPSDSPR1-OBJS \
|
||||
MIPSFPU-OBJS MIPSDSPR2-OBJS MIPSDSPR1-OBJS MIPS32R2-OBJS \
|
||||
OBJS SLIBOBJS HOSTOBJS TESTOBJS
|
||||
|
||||
define RESET
|
||||
|
@@ -19,10 +19,8 @@ such as audio, video, subtitles and related metadata.
|
||||
* [ffmpeg](http://ffmpeg.org/ffmpeg.html) is a command line toolbox to
|
||||
manipulate, convert and stream multimedia content.
|
||||
* [ffplay](http://ffmpeg.org/ffplay.html) is a minimalistic multimedia player.
|
||||
* [ffprobe](http://ffmpeg.org/ffprobe.html) is a simple analysis tool to inspect
|
||||
* [ffprobe](http://ffmpeg.org/ffprobe.html) is a simple analisys tool to inspect
|
||||
multimedia content.
|
||||
* [ffserver](http://ffmpeg.org/ffserver.html) is a multimedia streaming server
|
||||
for live broadcasts.
|
||||
* Additional small tools such as `aviocat`, `ismindex` and `qt-faststart`.
|
||||
|
||||
## Documentation
|
||||
|
138
RELEASE_NOTES
138
RELEASE_NOTES
@@ -1,65 +1,101 @@
|
||||
┌────────────────────────────────────────┐
|
||||
│ RELEASE NOTES for FFmpeg 2.5 "Bohr" │
|
||||
└────────────────────────────────────────┘
|
||||
|
||||
┌─────────────────────────────────────────────┐
|
||||
│ RELEASE NOTES for FFmpeg 2.6 "Grothendieck" │
|
||||
└─────────────────────────────────────────────┘
|
||||
The FFmpeg Project proudly presents FFmpeg 2.5 "Bohr", 2.5 months after the
|
||||
release of 2.4.
|
||||
|
||||
The FFmpeg Project proudly presents FFmpeg 2.6 "Grothendieck", about 3
|
||||
months after the release of FFmpeg 2.5.
|
||||
The most important new features are AVFoundation screen-grabbing support,
|
||||
animated WebP decoding support, and Animated PNG support. In addition, many
|
||||
exciting features for video streaming are also implemented, including MPEG-
|
||||
DASH fragmenting muxer, HEVC RTP payload muxer, and UDP Lite support.
|
||||
|
||||
A lot of important work got in this time, so let's start talking about what
|
||||
we like to brag the most about: features.
|
||||
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).
|
||||
|
||||
A lot of people will probably be happy to hear that we now have support for
|
||||
NVENC — the Nvidia Video Encoder interface for H.264 encoding — thanks to
|
||||
Timo Rothenpieler, with some little help from NVIDIA and Philip Langdale.
|
||||
┌────────────────────────────┐
|
||||
│ 🔨 API Information │
|
||||
└────────────────────────────┘
|
||||
|
||||
People in the broadcasting industry might also be interested in the first
|
||||
steps of closed captions support with the introduction of a decoder by
|
||||
Anshul Maheswhwari.
|
||||
FFmpeg 2.5 includes the following library versions:
|
||||
|
||||
Regarding filters love, we improved and added many. We could talk about the
|
||||
10-bit support in spp, but maybe it's more important to mention the addition
|
||||
of colorlevels (yet another color handling filter), tblend (allowing you
|
||||
to for example run a diff between successive frames of a video stream), or
|
||||
the dcshift audio filter.
|
||||
• 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
|
||||
|
||||
There are also two other important filters landing in libavfilter: palettegen
|
||||
and paletteuse. Both submitted by the Stupeflix company. These filters will
|
||||
be very useful in case you are looking for creating high quality GIFs, a
|
||||
format that still bravely fights annihilation in 2015.
|
||||
Important API changes since 2.4:
|
||||
|
||||
There are many other new features, but let's follow-up on one big cleanup
|
||||
achievement: the libmpcodecs (MPlayer filters) wrapper is finally dead. The
|
||||
last remaining filters (softpulldown/repeatfields, eq*, and various
|
||||
postprocessing filters) were ported by Arwa Arif (OPW student) and Paul B
|
||||
Mahol.
|
||||
• avpriv_dv_frame_profile2() has been deprecated
|
||||
|
||||
Concerning API changes, there are not many things to mention. Though, the
|
||||
introduction of device inputs and outputs listing by Lukasz Marek is a
|
||||
notable addition (try ffmpeg -sources or ffmpeg -sinks for an example of
|
||||
the usage). As usual, see doc/APIchanges for more information.
|
||||
|
||||
Now let's talk about optimizations. Ronald S. Bultje made the VP9 decoder
|
||||
usable on x86 32-bit systems and pre-ssse3 CPUs like Phenom (even dual core
|
||||
Athlons can play 1080p 30fps VP9 content now), so we now secretly hope for
|
||||
Google and Mozilla to use ffvp9 instead of libvpx. But VP9 is not the
|
||||
center of attention anymore, and HEVC/H.265 is also getting many
|
||||
improvements, which include C and x86 ASM optimizations, mainly from James
|
||||
Almer, Christophe Gisquet and Pierre-Edouard Lepere.
|
||||
Please refer to the doc/APIchanges file for more information.
|
||||
|
||||
Even though we had many x86 contributions, it is not the only architecture
|
||||
getting some love, with Seppo Tomperi adding ARM NEON optimizations to the
|
||||
HEVC stack, and James Cowgill adding MIPS64 assembly for all kind of audio
|
||||
processing code in libavcodec.
|
||||
┌────────────────────────────┐
|
||||
│ ★ List of New Features │
|
||||
└────────────────────────────┘
|
||||
|
||||
And finally, Michael Niedermayer is still fixing many bugs, dealing with
|
||||
most of the boring work such as making releases, applying tons of
|
||||
contributors patches, and daily merging the changes from the Libav project.
|
||||
┌────────────────────────────┐
|
||||
│ ffprobe │
|
||||
└────────────────────────────┘
|
||||
|
||||
A more complete Changelog is available at the root of the project, and the
|
||||
complete Git history on http://source.ffmpeg.org.
|
||||
• -show_pixel_formats option
|
||||
|
||||
We hope you will like this release as much as we enjoyed working on it, and
|
||||
as usual, if you have any questions about it, or any FFmpeg related topic,
|
||||
feel free to join us on the #ffmpeg IRC channel (on irc.freenode.net) or ask
|
||||
on the mailing-lists.
|
||||
┌────────────────────────────┐
|
||||
│ ffserver │
|
||||
└────────────────────────────┘
|
||||
|
||||
• codec private options support
|
||||
|
||||
┌────────────────────────────┐
|
||||
│ libavcodec │
|
||||
└────────────────────────────┘
|
||||
|
||||
• STL subtitle decoder
|
||||
• libutvideo YUV 4:2:2 10bit support
|
||||
• animated WebP decoding support
|
||||
• zygoaudio decoding support
|
||||
• APNG decoder
|
||||
|
||||
┌────────────────────────────┐
|
||||
│ 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)
|
||||
• MPEG-DASH segmenting muxer, which allows creating DASH compatible
|
||||
fragmented MP4
|
||||
• WebP muxer
|
||||
• APNG demuxer
|
||||
|
||||
┌────────────────────────────┐
|
||||
│ libavfilter │
|
||||
└────────────────────────────┘
|
||||
|
||||
• xBR scaling filter
|
||||
|
||||
┌────────────────────────────┐
|
||||
│ libavutil │
|
||||
└────────────────────────────┘
|
||||
|
||||
• CAST128 symmetric block cipher, ECB mode
|
||||
|
||||
┌────────────────────────────┐
|
||||
│ libpostproc │
|
||||
└────────────────────────────┘
|
||||
|
||||
• visualization support
|
||||
|
1
arch.mak
1
arch.mak
@@ -5,6 +5,7 @@ OBJS-$(HAVE_VFP) += $(VFP-OBJS) $(VFP-OBJS-yes)
|
||||
OBJS-$(HAVE_NEON) += $(NEON-OBJS) $(NEON-OBJS-yes)
|
||||
|
||||
OBJS-$(HAVE_MIPSFPU) += $(MIPSFPU-OBJS) $(MIPSFPU-OBJS-yes)
|
||||
OBJS-$(HAVE_MIPS32R2) += $(MIPS32R2-OBJS) $(MIPS32R2-OBJS-yes)
|
||||
OBJS-$(HAVE_MIPSDSPR1) += $(MIPSDSPR1-OBJS) $(MIPSDSPR1-OBJS-yes)
|
||||
OBJS-$(HAVE_MIPSDSPR2) += $(MIPSDSPR2-OBJS) $(MIPSDSPR2-OBJS-yes)
|
||||
|
||||
|
89
cmdutils.c
89
cmdutils.c
@@ -290,14 +290,10 @@ static int write_option(void *optctx, const OptionDef *po, const char *opt,
|
||||
if (po->flags & OPT_SPEC) {
|
||||
SpecifierOpt **so = dst;
|
||||
char *p = strchr(opt, ':');
|
||||
char *str;
|
||||
|
||||
dstcount = (int *)(so + 1);
|
||||
*so = grow_array(*so, sizeof(**so), dstcount, *dstcount + 1);
|
||||
str = av_strdup(p ? p + 1 : "");
|
||||
if (!str)
|
||||
return AVERROR(ENOMEM);
|
||||
(*so)[*dstcount - 1].specifier = str;
|
||||
(*so)[*dstcount - 1].specifier = av_strdup(p ? p + 1 : "");
|
||||
dst = &(*so)[*dstcount - 1].u;
|
||||
}
|
||||
|
||||
@@ -305,8 +301,6 @@ static int write_option(void *optctx, const OptionDef *po, const char *opt,
|
||||
char *str;
|
||||
str = av_strdup(arg);
|
||||
av_freep(dst);
|
||||
if (!str)
|
||||
return AVERROR(ENOMEM);
|
||||
*(char **)dst = str;
|
||||
} else if (po->flags & OPT_BOOL || po->flags & OPT_INT) {
|
||||
*(int *)dst = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
|
||||
@@ -1081,7 +1075,8 @@ static void print_program_info(int flags, int level)
|
||||
av_log(NULL, level, " Copyright (c) %d-%d the FFmpeg developers",
|
||||
program_birth_year, CONFIG_THIS_YEAR);
|
||||
av_log(NULL, level, "\n");
|
||||
av_log(NULL, level, "%sbuilt with %s\n", indent, CC_IDENT);
|
||||
av_log(NULL, level, "%sbuilt on %s %s with %s\n",
|
||||
indent, __DATE__, __TIME__, CC_IDENT);
|
||||
|
||||
av_log(NULL, level, "%sconfiguration: " FFMPEG_CONFIGURATION "\n", indent);
|
||||
}
|
||||
@@ -1218,7 +1213,12 @@ static int is_device(const AVClass *avclass)
|
||||
{
|
||||
if (!avclass)
|
||||
return 0;
|
||||
return AV_IS_INPUT_DEVICE(avclass->category) || AV_IS_OUTPUT_DEVICE(avclass->category);
|
||||
return avclass->category == AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT ||
|
||||
avclass->category == AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT ||
|
||||
avclass->category == AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT ||
|
||||
avclass->category == AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT ||
|
||||
avclass->category == AV_CLASS_CATEGORY_DEVICE_OUTPUT ||
|
||||
avclass->category == AV_CLASS_CATEGORY_DEVICE_INPUT;
|
||||
}
|
||||
|
||||
static int show_formats_devices(void *optctx, const char *opt, const char *arg, int device_only)
|
||||
@@ -1821,8 +1821,6 @@ int show_help(void *optctx, const char *opt, const char *arg)
|
||||
av_log_set_callback(log_callback_help);
|
||||
|
||||
topic = av_strdup(arg ? arg : "");
|
||||
if (!topic)
|
||||
return AVERROR(ENOMEM);
|
||||
par = strchr(topic, '=');
|
||||
if (par)
|
||||
*par++ = 0;
|
||||
@@ -1871,31 +1869,20 @@ int cmdutils_read_file(const char *filename, char **bufptr, size_t *size)
|
||||
strerror(errno));
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = fseek(f, 0, SEEK_END);
|
||||
if (ret == -1) {
|
||||
fseek(f, 0, SEEK_END);
|
||||
*size = ftell(f);
|
||||
fseek(f, 0, SEEK_SET);
|
||||
if (*size == (size_t)-1) {
|
||||
ret = AVERROR(errno);
|
||||
goto out;
|
||||
av_log(NULL, AV_LOG_ERROR, "IO error: %s\n", strerror(errno));
|
||||
fclose(f);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = ftell(f);
|
||||
if (ret < 0) {
|
||||
ret = AVERROR(errno);
|
||||
goto out;
|
||||
}
|
||||
*size = ret;
|
||||
|
||||
ret = fseek(f, 0, SEEK_SET);
|
||||
if (ret == -1) {
|
||||
ret = AVERROR(errno);
|
||||
goto out;
|
||||
}
|
||||
|
||||
*bufptr = av_malloc(*size + 1);
|
||||
if (!*bufptr) {
|
||||
av_log(NULL, AV_LOG_ERROR, "Could not allocate file buffer\n");
|
||||
ret = AVERROR(ENOMEM);
|
||||
goto out;
|
||||
fclose(f);
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
ret = fread(*bufptr, 1, *size, f);
|
||||
if (ret < *size) {
|
||||
@@ -1911,9 +1898,6 @@ int cmdutils_read_file(const char *filename, char **bufptr, size_t *size)
|
||||
(*bufptr)[(*size)++] = '\0';
|
||||
}
|
||||
|
||||
out:
|
||||
if (ret < 0)
|
||||
av_log(NULL, AV_LOG_ERROR, "IO error: %s\n", av_err2str(ret));
|
||||
fclose(f);
|
||||
return ret;
|
||||
}
|
||||
@@ -2060,7 +2044,7 @@ void *grow_array(void *array, int elem_size, int *size, int new_size)
|
||||
exit_program(1);
|
||||
}
|
||||
if (*size < new_size) {
|
||||
uint8_t *tmp = av_realloc_array(array, new_size, elem_size);
|
||||
uint8_t *tmp = av_realloc(array, new_size*elem_size);
|
||||
if (!tmp) {
|
||||
av_log(NULL, AV_LOG_ERROR, "Could not alloc buffer.\n");
|
||||
exit_program(1);
|
||||
@@ -2076,7 +2060,9 @@ void *grow_array(void *array, int elem_size, int *size, int new_size)
|
||||
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);
|
||||
@@ -2088,7 +2074,15 @@ static int print_device_sources(AVInputFormat *fmt, AVDictionary *opts)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if ((ret = avdevice_list_input_sources(fmt, NULL, opts, &device_list)) < 0) {
|
||||
/* 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;
|
||||
}
|
||||
@@ -2099,14 +2093,18 @@ static int print_device_sources(AVInputFormat *fmt, AVDictionary *opts)
|
||||
}
|
||||
|
||||
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);
|
||||
@@ -2118,7 +2116,14 @@ static int print_device_sinks(AVOutputFormat *fmt, AVDictionary *opts)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if ((ret = avdevice_list_output_sinks(fmt, NULL, opts, &device_list)) < 0) {
|
||||
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;
|
||||
}
|
||||
@@ -2129,7 +2134,9 @@ static int print_device_sinks(AVOutputFormat *fmt, AVDictionary *opts)
|
||||
}
|
||||
|
||||
fail:
|
||||
av_dict_free(&tmp_opts);
|
||||
avdevice_free_list_devices(&device_list);
|
||||
avformat_free_context(dev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -2173,7 +2180,7 @@ int show_sources(void *optctx, const char *opt, const char *arg)
|
||||
if (fmt) {
|
||||
if (!strcmp(fmt->name, "lavfi"))
|
||||
continue; //it's pointless to probe lavfi
|
||||
if (dev && !av_match_name(dev, fmt->name))
|
||||
if (dev && strcmp(fmt->name, dev))
|
||||
continue;
|
||||
print_device_sources(fmt, opts);
|
||||
}
|
||||
@@ -2181,7 +2188,7 @@ int show_sources(void *optctx, const char *opt, const char *arg)
|
||||
do {
|
||||
fmt = av_input_video_device_next(fmt);
|
||||
if (fmt) {
|
||||
if (dev && !av_match_name(dev, fmt->name))
|
||||
if (dev && strcmp(fmt->name, dev))
|
||||
continue;
|
||||
print_device_sources(fmt, opts);
|
||||
}
|
||||
@@ -2209,7 +2216,7 @@ int show_sinks(void *optctx, const char *opt, const char *arg)
|
||||
do {
|
||||
fmt = av_output_audio_device_next(fmt);
|
||||
if (fmt) {
|
||||
if (dev && !av_match_name(dev, fmt->name))
|
||||
if (dev && strcmp(fmt->name, dev))
|
||||
continue;
|
||||
print_device_sinks(fmt, opts);
|
||||
}
|
||||
@@ -2217,7 +2224,7 @@ int show_sinks(void *optctx, const char *opt, const char *arg)
|
||||
do {
|
||||
fmt = av_output_video_device_next(fmt);
|
||||
if (fmt) {
|
||||
if (dev && !av_match_name(dev, fmt->name))
|
||||
if (dev && strcmp(fmt->name, dev))
|
||||
continue;
|
||||
print_device_sinks(fmt, opts);
|
||||
}
|
||||
|
14
common.mak
14
common.mak
@@ -5,14 +5,6 @@
|
||||
# first so "all" becomes default target
|
||||
all: all-yes
|
||||
|
||||
DEFAULT_YASMD=.dbg
|
||||
|
||||
ifeq (1, DBG)
|
||||
YASMD=$(DEFAULT_YASMD)
|
||||
else
|
||||
YASMD=
|
||||
endif
|
||||
|
||||
ifndef SUBDIR
|
||||
|
||||
ifndef V
|
||||
@@ -146,17 +138,17 @@ $(TOOLOBJS): | tools
|
||||
|
||||
OBJDIRS := $(OBJDIRS) $(dir $(OBJS) $(HOBJS) $(HOSTOBJS) $(SLIBOBJS) $(TESTOBJS))
|
||||
|
||||
CLEANSUFFIXES = *.d *.o *~ *.h.c *.map *.ver *.ho *.gcno *.gcda *$(DEFAULT_YASMD).asm
|
||||
CLEANSUFFIXES = *.d *.o *~ *.h.c *.map *.ver *.ho *.gcno *.gcda
|
||||
DISTCLEANSUFFIXES = *.pc
|
||||
LIBSUFFIXES = *.a *.lib *.so *.so.* *.dylib *.dll *.def *.dll.a
|
||||
|
||||
define RULES
|
||||
clean::
|
||||
$(RM) $(OBJS) $(OBJS:.o=.d) $(OBJS:.o=$(DEFAULT_YASMD).d)
|
||||
$(RM) $(OBJS) $(OBJS:.o=.d)
|
||||
$(RM) $(HOSTPROGS)
|
||||
$(RM) $(TOOLS)
|
||||
endef
|
||||
|
||||
$(eval $(RULES))
|
||||
|
||||
-include $(wildcard $(OBJS:.o=.d) $(HOSTOBJS:.o=.d) $(TESTOBJS:.o=.d) $(HOBJS:.o=.d) $(SLIBOBJS:.o=.d)) $(OBJS:.o=$(DEFAULT_YASMD).d)
|
||||
-include $(wildcard $(OBJS:.o=.d) $(HOSTOBJS:.o=.d) $(TESTOBJS:.o=.d) $(HOBJS:.o=.d) $(SLIBOBJS:.o=.d))
|
||||
|
@@ -513,21 +513,21 @@ AVSC_INLINE AVS_Value avs_array_elt(AVS_Value v, int index)
|
||||
// only use these functions on am AVS_Value that does not already have
|
||||
// an active value. Remember, treat AVS_Value as a fat pointer.
|
||||
AVSC_INLINE AVS_Value avs_new_value_bool(int v0)
|
||||
{ AVS_Value v = {0}; v.type = 'b'; v.d.boolean = v0 == 0 ? 0 : 1; return v; }
|
||||
{ AVS_Value v; v.type = 'b'; v.d.boolean = v0 == 0 ? 0 : 1; return v; }
|
||||
AVSC_INLINE AVS_Value avs_new_value_int(int v0)
|
||||
{ AVS_Value v = {0}; v.type = 'i'; v.d.integer = v0; return v; }
|
||||
{ AVS_Value v; v.type = 'i'; v.d.integer = v0; return v; }
|
||||
AVSC_INLINE AVS_Value avs_new_value_string(const char * v0)
|
||||
{ AVS_Value v = {0}; v.type = 's'; v.d.string = v0; return v; }
|
||||
{ AVS_Value v; v.type = 's'; v.d.string = v0; return v; }
|
||||
AVSC_INLINE AVS_Value avs_new_value_float(float v0)
|
||||
{ AVS_Value v = {0}; v.type = 'f'; v.d.floating_pt = v0; return v;}
|
||||
{ AVS_Value v; v.type = 'f'; v.d.floating_pt = v0; return v;}
|
||||
AVSC_INLINE AVS_Value avs_new_value_error(const char * v0)
|
||||
{ AVS_Value v = {0}; v.type = 'e'; v.d.string = v0; return v; }
|
||||
{ AVS_Value v; v.type = 'e'; v.d.string = v0; return v; }
|
||||
#ifndef AVSC_NO_DECLSPEC
|
||||
AVSC_INLINE AVS_Value avs_new_value_clip(AVS_Clip * v0)
|
||||
{ AVS_Value v = {0}; avs_set_to_clip(&v, v0); return v; }
|
||||
{ AVS_Value v; avs_set_to_clip(&v, v0); return v; }
|
||||
#endif
|
||||
AVSC_INLINE AVS_Value avs_new_value_array(AVS_Value * v0, int size)
|
||||
{ AVS_Value v = {0}; v.type = 'a'; v.d.array = v0; v.array_size = size; return v; }
|
||||
{ AVS_Value v; v.type = 'a'; v.d.array = v0; v.array_size = size; return v; }
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
|
@@ -52,8 +52,8 @@ namespace avxsynth {
|
||||
//
|
||||
// Functions
|
||||
//
|
||||
#define MAKEDWORD(a,b,c,d) (((a) << 24) | ((b) << 16) | ((c) << 8) | (d))
|
||||
#define MAKEWORD(a,b) (((a) << 8) | (b))
|
||||
#define MAKEDWORD(a,b,c,d) ((a << 24) | (b << 16) | (c << 8) | (d))
|
||||
#define MAKEWORD(a,b) ((a << 8) | (b))
|
||||
|
||||
#define lstrlen strlen
|
||||
#define lstrcpy strcpy
|
||||
|
170
configure
vendored
170
configure
vendored
@@ -84,7 +84,7 @@ Standard options:
|
||||
--datadir=DIR install data files in DIR [PREFIX/share/ffmpeg]
|
||||
--docdir=DIR install documentation in DIR [PREFIX/share/doc/ffmpeg]
|
||||
--libdir=DIR install libs in DIR [PREFIX/lib]
|
||||
--shlibdir=DIR install shared libs in DIR [LIBDIR]
|
||||
--shlibdir=DIR install shared libs in DIR [PREFIX/lib]
|
||||
--incdir=DIR install includes in DIR [PREFIX/include]
|
||||
--mandir=DIR install man page in DIR [PREFIX/share/man]
|
||||
--enable-rpath use rpath to allow installing libraries in paths
|
||||
@@ -133,9 +133,9 @@ Component options:
|
||||
--disable-postproc disable libpostproc build
|
||||
--disable-avfilter disable libavfilter build
|
||||
--enable-avresample enable libavresample build [no]
|
||||
--disable-pthreads disable pthreads [autodetect]
|
||||
--disable-w32threads disable Win32 threads [autodetect]
|
||||
--disable-os2threads disable OS/2 threads [autodetect]
|
||||
--disable-pthreads disable pthreads [auto]
|
||||
--disable-w32threads disable Win32 threads [auto]
|
||||
--disable-os2threads disable OS/2 threads [auto]
|
||||
--disable-network disable network support [no]
|
||||
--disable-dct disable DCT code
|
||||
--disable-dwt disable DWT code
|
||||
@@ -194,32 +194,29 @@ Individual component options:
|
||||
External library support:
|
||||
--enable-avisynth enable reading of AviSynth script files [no]
|
||||
--disable-bzlib disable bzlib [autodetect]
|
||||
--enable-fontconfig enable fontconfig, useful for drawtext filter [no]
|
||||
--enable-frei0r enable frei0r video filtering [no]
|
||||
--enable-gnutls enable gnutls, needed for https support
|
||||
if openssl is not used [no]
|
||||
--enable-fontconfig enable fontconfig
|
||||
--enable-frei0r enable frei0r video filtering
|
||||
--enable-gnutls enable gnutls [no]
|
||||
--disable-iconv disable iconv [autodetect]
|
||||
--enable-ladspa enable LADSPA audio filtering [no]
|
||||
--enable-ladspa enable LADSPA audio filtering
|
||||
--enable-libaacplus enable AAC+ encoding via libaacplus [no]
|
||||
--enable-libass enable libass subtitles rendering,
|
||||
needed for subtitles and ass filter [no]
|
||||
--enable-libass enable libass subtitles rendering [no]
|
||||
--enable-libbluray enable BluRay reading using libbluray [no]
|
||||
--enable-libbs2b enable bs2b DSP library [no]
|
||||
--enable-libcaca enable textual display using libcaca [no]
|
||||
--enable-libcaca enable textual display using libcaca
|
||||
--enable-libcelt enable CELT decoding via libcelt [no]
|
||||
--enable-libcdio enable audio CD grabbing with libcdio [no]
|
||||
--enable-libcdio enable audio CD grabbing with libcdio
|
||||
--enable-libdc1394 enable IIDC-1394 grabbing using libdc1394
|
||||
and libraw1394 [no]
|
||||
--enable-libfaac enable AAC encoding via libfaac [no]
|
||||
--enable-libfdk-aac enable AAC de/encoding via libfdk-aac [no]
|
||||
--enable-libflite enable flite (voice synthesis) support via libflite [no]
|
||||
--enable-libfreetype enable libfreetype, needed for drawtext filter [no]
|
||||
--enable-libfribidi enable libfribidi, improves drawtext filter [no]
|
||||
--enable-libfreetype enable libfreetype [no]
|
||||
--enable-libfribidi enable libfribidi [no]
|
||||
--enable-libgme enable Game Music Emu via libgme [no]
|
||||
--enable-libgsm enable GSM de/encoding via libgsm [no]
|
||||
--enable-libiec61883 enable iec61883 via libiec61883 [no]
|
||||
--enable-libilbc enable iLBC de/encoding via libilbc [no]
|
||||
--enable-libmfx enable HW acceleration through libmfx
|
||||
--enable-libmodplug enable ModPlug via libmodplug [no]
|
||||
--enable-libmp3lame enable MP3 encoding via libmp3lame [no]
|
||||
--enable-libnut enable NUT (de)muxing via libnut,
|
||||
@@ -227,7 +224,6 @@ External library support:
|
||||
--enable-libopencore-amrnb enable AMR-NB de/encoding via libopencore-amrnb [no]
|
||||
--enable-libopencore-amrwb enable AMR-WB decoding via libopencore-amrwb [no]
|
||||
--enable-libopencv enable video filtering via libopencv [no]
|
||||
--enable-libopenh264 enable H.264 encoding via OpenH264 [no]
|
||||
--enable-libopenjpeg enable JPEG 2000 de/encoding via OpenJPEG [no]
|
||||
--enable-libopus enable Opus de/encoding via libopus [no]
|
||||
--enable-libpulse enable Pulseaudio input via libpulse [no]
|
||||
@@ -255,22 +251,20 @@ 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 [autodetect]
|
||||
--enable-libxcb-shm enable X11 grabbing shm communication [autodetect]
|
||||
--enable-libxcb-xfixes enable X11 grabbing mouse rendering [autodetect]
|
||||
--enable-libxcb-shape enable X11 grabbing shape rendering [autodetect]
|
||||
--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-nvenc enable NVIDIA NVENC support [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, needed for https support
|
||||
if gnutls is not used [no]
|
||||
--enable-openssl enable openssl [no]
|
||||
--disable-sdl disable sdl [autodetect]
|
||||
--enable-x11grab enable X11 grabbing (legacy) [no]
|
||||
--disable-xlib disable xlib [autodetect]
|
||||
@@ -358,6 +352,7 @@ Optimization options (experts only):
|
||||
--disable-neon disable NEON optimizations
|
||||
--disable-inline-asm disable use of inline assembly
|
||||
--disable-yasm disable use of nasm/yasm assembly
|
||||
--disable-mips32r2 disable MIPS32R2 optimizations
|
||||
--disable-mipsdspr1 disable MIPS DSP ASE R1 optimizations
|
||||
--disable-mipsdspr2 disable MIPS DSP ASE R2 optimizations
|
||||
--disable-mipsfpu disable floating point MIPS optimizations
|
||||
@@ -1328,7 +1323,6 @@ EXAMPLE_LIST="
|
||||
filtering_video_example
|
||||
metadata_example
|
||||
muxing_example
|
||||
qsvdec_example
|
||||
remuxing_example
|
||||
resampling_audio_example
|
||||
scaling_video_example
|
||||
@@ -1363,14 +1357,12 @@ EXTERNAL_LIBRARY_LIST="
|
||||
libgsm
|
||||
libiec61883
|
||||
libilbc
|
||||
libmfx
|
||||
libmodplug
|
||||
libmp3lame
|
||||
libnut
|
||||
libopencore_amrnb
|
||||
libopencore_amrwb
|
||||
libopencv
|
||||
libopenh264
|
||||
libopenjpeg
|
||||
libopus
|
||||
libpulse
|
||||
@@ -1405,7 +1397,6 @@ EXTERNAL_LIBRARY_LIST="
|
||||
libzmq
|
||||
libzvbi
|
||||
lzma
|
||||
nvenc
|
||||
openal
|
||||
opencl
|
||||
opengl
|
||||
@@ -1481,7 +1472,6 @@ SUBSYSTEM_LIST="
|
||||
mdct
|
||||
pixelutils
|
||||
network
|
||||
qsv
|
||||
rdft
|
||||
"
|
||||
|
||||
@@ -1745,6 +1735,7 @@ SYSTEM_FUNCS="
|
||||
lzo1x_999_compress
|
||||
mach_absolute_time
|
||||
MapViewOfFile
|
||||
MoveFileExA
|
||||
memalign
|
||||
mkstemp
|
||||
mmap
|
||||
@@ -1792,7 +1783,6 @@ TOOLCHAIN_FEATURES="
|
||||
|
||||
TYPES_LIST="
|
||||
CONDITION_VARIABLE_Ptr
|
||||
DXVA_PicParams_HEVC
|
||||
socklen_t
|
||||
struct_addrinfo
|
||||
struct_group_source_req
|
||||
@@ -1836,10 +1826,8 @@ HAVE_LIST="
|
||||
perl
|
||||
pod2man
|
||||
sdl
|
||||
section_data_rel_ro
|
||||
texi2html
|
||||
threads
|
||||
vaapi_x11
|
||||
vdpau_x11
|
||||
xlib
|
||||
"
|
||||
@@ -1858,7 +1846,6 @@ CONFIG_EXTRA="
|
||||
faandct
|
||||
faanidct
|
||||
fdctdsp
|
||||
fmtconvert
|
||||
frame_thread_encoder
|
||||
gcrypt
|
||||
golomb
|
||||
@@ -1874,7 +1861,6 @@ CONFIG_EXTRA="
|
||||
huffyuvencdsp
|
||||
idctdsp
|
||||
iirfilter
|
||||
imdct15
|
||||
intrax8
|
||||
lgplv3
|
||||
llauddsp
|
||||
@@ -1999,6 +1985,7 @@ setend_deps="arm"
|
||||
map 'eval ${v}_inline_deps=inline_asm' $ARCH_EXT_LIST_ARM
|
||||
|
||||
mipsfpu_deps="mips"
|
||||
mips32r2_deps="mips"
|
||||
mipsdspr1_deps="mips"
|
||||
mipsdspr2_deps="mips"
|
||||
|
||||
@@ -2073,10 +2060,10 @@ mpegvideo_select="blockdsp h264chroma hpeldsp idctdsp me_cmp videodsp"
|
||||
mpegvideoenc_select="me_cmp mpegvideo pixblockdsp qpeldsp"
|
||||
|
||||
# decoders / encoders
|
||||
aac_decoder_select="imdct15 mdct sinewin"
|
||||
aac_decoder_select="mdct sinewin"
|
||||
aac_encoder_select="audio_frame_queue iirfilter mdct sinewin"
|
||||
aac_latm_decoder_select="aac_decoder aac_latm_parser"
|
||||
ac3_decoder_select="ac3_parser ac3dsp bswapdsp fmtconvert mdct"
|
||||
ac3_decoder_select="ac3_parser ac3dsp bswapdsp mdct"
|
||||
ac3_fixed_decoder_select="ac3_parser ac3dsp bswapdsp mdct"
|
||||
ac3_encoder_select="ac3dsp audiodsp mdct me_cmp"
|
||||
ac3_fixed_encoder_select="ac3dsp audiodsp mdct me_cmp"
|
||||
@@ -2106,7 +2093,7 @@ comfortnoise_encoder_select="lpc"
|
||||
cook_decoder_select="audiodsp mdct sinewin"
|
||||
cscd_decoder_select="lzo"
|
||||
cscd_decoder_suggest="zlib"
|
||||
dca_decoder_select="fmtconvert mdct"
|
||||
dca_decoder_select="mdct"
|
||||
dirac_decoder_select="dwt golomb videodsp mpegvideoenc"
|
||||
dnxhd_decoder_select="blockdsp idctdsp"
|
||||
dnxhd_encoder_select="aandcttables blockdsp fdctdsp idctdsp mpegvideoenc pixblockdsp"
|
||||
@@ -2144,8 +2131,6 @@ h263i_decoder_select="h263_decoder"
|
||||
h263p_encoder_select="h263_encoder"
|
||||
h264_decoder_select="cabac golomb h264chroma h264dsp h264pred h264qpel startcode videodsp"
|
||||
h264_decoder_suggest="error_resilience"
|
||||
h264_qsv_decoder_deps="libmfx"
|
||||
h264_qsv_decoder_select="h264_mp4toannexb_bsf h264_parser qsv h264_qsv_hwaccel"
|
||||
hevc_decoder_select="bswapdsp cabac golomb videodsp"
|
||||
huffyuv_decoder_select="bswapdsp huffyuvdsp llviddsp"
|
||||
huffyuv_encoder_select="bswapdsp huffman huffyuvencdsp llviddsp"
|
||||
@@ -2200,7 +2185,6 @@ nellymoser_encoder_select="audio_frame_queue mdct sinewin"
|
||||
nuv_decoder_select="idctdsp lzo"
|
||||
on2avc_decoder_select="mdct"
|
||||
opus_decoder_deps="swresample"
|
||||
opus_decoder_select="imdct15"
|
||||
png_decoder_select="zlib"
|
||||
png_encoder_select="huffyuvencdsp zlib"
|
||||
prores_decoder_select="blockdsp idctdsp"
|
||||
@@ -2291,7 +2275,6 @@ h263_vdpau_hwaccel_select="h263_decoder"
|
||||
h264_crystalhd_decoder_select="crystalhd h264_mp4toannexb_bsf h264_parser"
|
||||
h264_dxva2_hwaccel_deps="dxva2"
|
||||
h264_dxva2_hwaccel_select="h264_decoder"
|
||||
h264_qsv_hwaccel_deps="libmfx"
|
||||
h264_vaapi_hwaccel_deps="vaapi"
|
||||
h264_vaapi_hwaccel_select="h264_decoder"
|
||||
h264_vda_decoder_deps="vda"
|
||||
@@ -2304,8 +2287,6 @@ h264_vdpau_decoder_deps="vdpau"
|
||||
h264_vdpau_decoder_select="h264_decoder"
|
||||
h264_vdpau_hwaccel_deps="vdpau"
|
||||
h264_vdpau_hwaccel_select="h264_decoder"
|
||||
hevc_dxva2_hwaccel_deps="dxva2 DXVA_PicParams_HEVC"
|
||||
hevc_dxva2_hwaccel_select="hevc_decoder"
|
||||
mpeg_vdpau_decoder_deps="vdpau"
|
||||
mpeg_vdpau_decoder_select="mpeg2video_decoder"
|
||||
mpeg_xvmc_hwaccel_deps="xvmc"
|
||||
@@ -2377,7 +2358,6 @@ libopencore_amrnb_decoder_deps="libopencore_amrnb"
|
||||
libopencore_amrnb_encoder_deps="libopencore_amrnb"
|
||||
libopencore_amrnb_encoder_select="audio_frame_queue"
|
||||
libopencore_amrwb_decoder_deps="libopencore_amrwb"
|
||||
libopenh264_encoder_deps="libopenh264"
|
||||
libopenjpeg_decoder_deps="libopenjpeg"
|
||||
libopenjpeg_encoder_deps="libopenjpeg"
|
||||
libopus_decoder_deps="libopus"
|
||||
@@ -2408,14 +2388,12 @@ libwavpack_encoder_deps="libwavpack"
|
||||
libwebp_encoder_deps="libwebp"
|
||||
libx264_encoder_deps="libx264"
|
||||
libx264rgb_encoder_deps="libx264"
|
||||
libx264rgb_encoder_select="libx264_encoder"
|
||||
libx265_encoder_deps="libx265"
|
||||
libxavs_encoder_deps="libxavs"
|
||||
libxvid_encoder_deps="libxvid"
|
||||
libutvideo_decoder_deps="libutvideo"
|
||||
libutvideo_encoder_deps="libutvideo"
|
||||
libzvbi_teletext_decoder_deps="libzvbi"
|
||||
nvenc_encoder_deps="nvenc"
|
||||
|
||||
# demuxers / muxers
|
||||
ac3_demuxer_select="ac3_parser"
|
||||
@@ -2452,13 +2430,12 @@ matroska_muxer_select="riffenc"
|
||||
mmf_muxer_select="riffenc"
|
||||
mov_demuxer_select="riffdec"
|
||||
mov_demuxer_suggest="zlib"
|
||||
mov_muxer_select="riffenc rtpenc_chain"
|
||||
mov_muxer_select="riffenc rtpenc_chain ac3_parser"
|
||||
mp3_demuxer_select="mpegaudio_parser"
|
||||
mp4_muxer_select="mov_muxer"
|
||||
mpegts_muxer_select="adts_muxer latm_muxer"
|
||||
mpegtsraw_demuxer_select="mpegts_demuxer"
|
||||
mxf_d10_muxer_select="mxf_muxer"
|
||||
mxf_opatom_muxer_select="mxf_muxer"
|
||||
nut_muxer_select="riffenc"
|
||||
nuv_demuxer_select="riffdec"
|
||||
oga_muxer_select="ogg_muxer"
|
||||
@@ -2492,7 +2469,7 @@ 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"
|
||||
avfoundation_indev_extralibs="-framework CoreVideo -framework Foundation -framework AVFoundation -framework CoreMedia -framework CoreGraphics"
|
||||
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"
|
||||
@@ -2501,7 +2478,7 @@ decklink_outdev_extralibs="-lstdc++"
|
||||
decklink_indev_deps="decklink pthreads"
|
||||
decklink_indev_extralibs="-lstdc++"
|
||||
dshow_indev_deps="IBaseFilter"
|
||||
dshow_indev_extralibs="-lpsapi -lole32 -lstrmiids -luuid -loleaut32"
|
||||
dshow_indev_extralibs="-lpsapi -lole32 -lstrmiids -luuid"
|
||||
dv1394_indev_deps="dv1394"
|
||||
dv1394_indev_select="dv_demuxer"
|
||||
fbdev_indev_deps="linux_fb_h"
|
||||
@@ -2595,13 +2572,9 @@ delogo_filter_deps="gpl"
|
||||
deshake_filter_select="pixelutils"
|
||||
drawtext_filter_deps="libfreetype"
|
||||
ebur128_filter_deps="gpl"
|
||||
eq_filter_deps="gpl"
|
||||
fftfilt_filter_deps="avcodec"
|
||||
fftfilt_filter_select="rdft"
|
||||
flite_filter_deps="libflite"
|
||||
frei0r_filter_deps="frei0r dlopen"
|
||||
frei0r_src_filter_deps="frei0r dlopen"
|
||||
fspp_filter_deps="gpl"
|
||||
geq_filter_deps="gpl"
|
||||
histeq_filter_deps="gpl"
|
||||
hqdn3d_filter_deps="gpl"
|
||||
@@ -2610,12 +2583,12 @@ kerndeint_filter_deps="gpl"
|
||||
ladspa_filter_deps="ladspa dlopen"
|
||||
mcdeint_filter_deps="avcodec gpl"
|
||||
movie_filter_deps="avcodec avformat"
|
||||
mp_filter_deps="gpl avcodec swscale"
|
||||
mpdecimate_filter_deps="gpl"
|
||||
mpdecimate_filter_select="pixelutils"
|
||||
mptestsrc_filter_deps="gpl"
|
||||
negate_filter_deps="lut_filter"
|
||||
perspective_filter_deps="gpl"
|
||||
pp7_filter_deps="gpl"
|
||||
ocv_filter_deps="libopencv"
|
||||
owdenoise_filter_deps="gpl"
|
||||
pan_filter_deps="swresample"
|
||||
@@ -2623,7 +2596,6 @@ phase_filter_deps="gpl"
|
||||
pp_filter_deps="gpl postproc"
|
||||
pullup_filter_deps="gpl"
|
||||
removelogo_filter_deps="avcodec avformat swscale"
|
||||
repeatfields_filter_deps="gpl"
|
||||
resample_filter_deps="avresample"
|
||||
sab_filter_deps="gpl swscale"
|
||||
scale_filter_deps="swscale"
|
||||
@@ -2642,7 +2614,6 @@ vidstabtransform_filter_deps="libvidstab"
|
||||
pixfmts_super2xsai_test_deps="super2xsai_filter"
|
||||
tinterlace_merge_test_deps="tinterlace_filter"
|
||||
tinterlace_pad_test_deps="tinterlace_filter"
|
||||
uspp_filter_deps="gpl avcodec"
|
||||
zmq_filter_deps="libzmq"
|
||||
zoompan_filter_deps="swscale"
|
||||
|
||||
@@ -2657,7 +2628,6 @@ filtering_audio_example_deps="avfilter avcodec avformat avutil"
|
||||
filtering_video_example_deps="avfilter avcodec avformat avutil"
|
||||
metadata_example_deps="avformat avutil"
|
||||
muxing_example_deps="avcodec avformat avutil swscale"
|
||||
qsvdec_example_deps="avcodec avutil libmfx h264_qsv_decoder vaapi_x11"
|
||||
remuxing_example_deps="avcodec avformat avutil"
|
||||
resampling_audio_example_deps="avutil swresample"
|
||||
scaling_video_example_deps="avutil swscale"
|
||||
@@ -2706,6 +2676,7 @@ docdir_default='${prefix}/share/doc/ffmpeg'
|
||||
incdir_default='${prefix}/include'
|
||||
libdir_default='${prefix}/lib'
|
||||
mandir_default='${prefix}/share/man'
|
||||
shlibdir_default="$libdir_default"
|
||||
|
||||
# toolchain
|
||||
ar_default="ar"
|
||||
@@ -2719,11 +2690,7 @@ ln_s="ln -s -f"
|
||||
nm_default="nm -g"
|
||||
objformat="elf"
|
||||
pkg_config_default=pkg-config
|
||||
if ranlib 2>&1 | grep -q "\-D "; then
|
||||
ranlib_default="ranlib -D"
|
||||
else
|
||||
ranlib_default="ranlib"
|
||||
fi
|
||||
ranlib_default="ranlib"
|
||||
strip_default="strip"
|
||||
yasmexe_default="yasm"
|
||||
windres_default="windres"
|
||||
@@ -3001,6 +2968,17 @@ if enabled cross_compile; then
|
||||
die "Must specify target arch and OS when cross-compiling"
|
||||
fi
|
||||
|
||||
ar_default="${cross_prefix}${ar_default}"
|
||||
cc_default="${cross_prefix}${cc_default}"
|
||||
cxx_default="${cross_prefix}${cxx_default}"
|
||||
nm_default="${cross_prefix}${nm_default}"
|
||||
pkg_config_default="${cross_prefix}${pkg_config_default}"
|
||||
ranlib_default="${cross_prefix}${ranlib_default}"
|
||||
strip_default="${cross_prefix}${strip_default}"
|
||||
windres_default="${cross_prefix}${windres_default}"
|
||||
|
||||
sysinclude_default="${sysroot}/usr/include"
|
||||
|
||||
test -n "$valgrind" && toolchain="valgrind-memcheck"
|
||||
|
||||
case "$toolchain" in
|
||||
@@ -3087,17 +3065,6 @@ case "$toolchain" in
|
||||
;;
|
||||
esac
|
||||
|
||||
ar_default="${cross_prefix}${ar_default}"
|
||||
cc_default="${cross_prefix}${cc_default}"
|
||||
cxx_default="${cross_prefix}${cxx_default}"
|
||||
nm_default="${cross_prefix}${nm_default}"
|
||||
pkg_config_default="${cross_prefix}${pkg_config_default}"
|
||||
ranlib_default="${cross_prefix}${ranlib_default}"
|
||||
strip_default="${cross_prefix}${strip_default}"
|
||||
windres_default="${cross_prefix}${windres_default}"
|
||||
|
||||
sysinclude_default="${sysroot}/usr/include"
|
||||
|
||||
set_default arch cc cxx doxygen pkg_config ranlib strip sysinclude \
|
||||
target_exec target_os yasmexe
|
||||
enabled cross_compile || host_cc_default=$cc
|
||||
@@ -3243,7 +3210,6 @@ msvc_common_flags(){
|
||||
-lavifil32) echo vfw32.lib ;;
|
||||
-lavicap32) echo vfw32.lib user32.lib ;;
|
||||
-l*) echo ${flag#-l}.lib ;;
|
||||
-L*) echo -libpath:${flag#-L} ;;
|
||||
*) echo $flag ;;
|
||||
esac
|
||||
done
|
||||
@@ -3621,9 +3587,6 @@ elif $ar 2>&1 | grep -q 'Texas Instruments'; then
|
||||
elif $ar 2>&1 | grep -q 'Usage: ar.*-X.*any'; then
|
||||
arflags='-Xany -r -c'
|
||||
ar_o='$@'
|
||||
elif $ar 2>&1 | grep -q "\[D\] "; then
|
||||
arflags="rcD"
|
||||
ar_o='$@'
|
||||
else
|
||||
arflags="rc"
|
||||
ar_o='$@'
|
||||
@@ -4023,7 +3986,6 @@ case $target_os in
|
||||
;;
|
||||
android)
|
||||
disable symver
|
||||
enable section_data_rel_ro
|
||||
SLIB_INSTALL_NAME='$(SLIBNAME)'
|
||||
SLIB_INSTALL_LINKS=
|
||||
# soname not set on purpose
|
||||
@@ -4082,7 +4044,7 @@ case $target_os in
|
||||
SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME).$(LIBMAJOR)$(SLIBSUF)'
|
||||
objformat="macho"
|
||||
enabled x86_64 && objformat="macho64"
|
||||
enabled_any pic shared x86_64 ||
|
||||
enabled_any pic shared ||
|
||||
{ check_cflags -mdynamic-no-pic && add_asflags -mdynamic-no-pic; }
|
||||
;;
|
||||
mingw32*)
|
||||
@@ -4172,7 +4134,6 @@ case $target_os in
|
||||
;;
|
||||
linux)
|
||||
enable dv1394
|
||||
enable section_data_rel_ro
|
||||
;;
|
||||
irix*)
|
||||
target_os=irix
|
||||
@@ -4353,9 +4314,6 @@ echo "config:$arch:$subarch:$cpu:$target_os:$(esc $cc_ident):$(esc $FFMPEG_CONFI
|
||||
|
||||
check_cpp_condition stdlib.h "defined(__PIC__) || defined(__pic__) || defined(PIC)" && enable_weak pic
|
||||
|
||||
set_default libdir
|
||||
: ${shlibdir_default:="$libdir"}
|
||||
|
||||
set_default $PATHS_LIST
|
||||
set_default nm
|
||||
|
||||
@@ -4392,7 +4350,6 @@ die_license_disabled gpl x11grab
|
||||
|
||||
die_license_disabled nonfree libaacplus
|
||||
die_license_disabled nonfree libfaac
|
||||
die_license_disabled nonfree nvenc
|
||||
enabled gpl && die_license_disabled_gpl nonfree libfdk_aac
|
||||
enabled gpl && die_license_disabled_gpl nonfree openssl
|
||||
|
||||
@@ -4575,19 +4532,8 @@ EOF
|
||||
elif enabled mips; then
|
||||
|
||||
check_inline_asm loongson '"dmult.g $1, $2, $3"'
|
||||
|
||||
# Enable minimum ISA based on selected options
|
||||
if enabled mips64 && (enabled mipsdspr1 || enabled mipsdspr2); then
|
||||
add_cflags "-mips64r2"
|
||||
add_asflags "-mips64r2"
|
||||
elif enabled mips64 && enabled mipsfpu; then
|
||||
add_cflags "-mips64"
|
||||
add_asflags "-mips64"
|
||||
elif enabled mipsfpu || enabled mipsdspr1 || enabled mipsdspr2; then
|
||||
add_cflags "-mips32r2"
|
||||
add_asflags "-mips32r2"
|
||||
fi
|
||||
|
||||
enabled mips32r2 && add_cflags "-mips32r2" && add_asflags "-mips32r2" &&
|
||||
check_inline_asm mips32r2 '"rotr $t0, $t1, 1"'
|
||||
enabled mipsdspr1 && add_cflags "-mdsp" && add_asflags "-mdsp" &&
|
||||
check_inline_asm mipsdspr1 '"addu.qb $t0, $t1, $t2"'
|
||||
enabled mipsdspr2 && add_cflags "-mdspr2" && add_asflags "-mdspr2" &&
|
||||
@@ -4718,7 +4664,6 @@ fi
|
||||
frei0r_filter_extralibs='$ldl'
|
||||
frei0r_src_filter_extralibs='$ldl'
|
||||
ladspa_filter_extralibs='$ldl'
|
||||
nvenc_encoder_extralibs='$ldl'
|
||||
|
||||
if ! disabled network; then
|
||||
check_func getaddrinfo $network_extralibs
|
||||
@@ -4806,6 +4751,7 @@ 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
|
||||
@@ -4846,8 +4792,6 @@ check_lib2 "windows.h psapi.h" GetProcessMemoryInfo -lpsapi
|
||||
|
||||
check_struct "sys/time.h sys/resource.h" "struct rusage" ru_maxrss
|
||||
|
||||
check_type "windows.h dxva.h" "DXVA_PicParams_HEVC"
|
||||
|
||||
if ! disabled w32threads && ! enabled pthreads; then
|
||||
check_func_headers "windows.h process.h" _beginthreadex &&
|
||||
enable w32threads || disable w32threads
|
||||
@@ -4898,8 +4842,6 @@ done
|
||||
|
||||
# these are off by default, so fail if requested and not available
|
||||
enabled avfoundation_indev && { check_header_oc AVFoundation/AVFoundation.h || disable avfoundation_indev; }
|
||||
enabled avfoundation_indev && { check_lib2 CoreGraphics/CoreGraphics.h CGGetActiveDisplayList -framework CoreGraphics ||
|
||||
check_lib2 ApplicationServices/ApplicationServices.h CGGetActiveDisplayList -framework ApplicationServices; }
|
||||
enabled avisynth && { { check_lib2 "windows.h" LoadLibrary; } ||
|
||||
{ check_lib2 "dlfcn.h" dlopen -ldl; } ||
|
||||
die "ERROR: LoadLibrary/dlopen not found for avisynth"; }
|
||||
@@ -4929,14 +4871,12 @@ enabled libgsm && { for gsm_hdr in "gsm.h" "gsm/gsm.h"; do
|
||||
check_lib "${gsm_hdr}" gsm_create -lgsm && break;
|
||||
done || die "ERROR: libgsm not found"; }
|
||||
enabled libilbc && require libilbc ilbc.h WebRtcIlbcfix_InitDecode -lilbc
|
||||
enabled libmfx && require_pkg_config libmfx "mfx/mfxvideo.h" MFXInit
|
||||
enabled libmodplug && require_pkg_config libmodplug libmodplug/modplug.h ModPlug_Load
|
||||
enabled libmp3lame && require "libmp3lame >= 3.98.3" lame/lame.h lame_set_VBR_quality -lmp3lame
|
||||
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 libopenh264 && require_pkg_config openh264 wels/codec_api.h WelsGetCodecVersion
|
||||
enabled libopenjpeg && { check_lib openjpeg.h opj_version -lopenmj2 -DOPJ_STATIC ||
|
||||
check_lib openjpeg-1.5/openjpeg.h opj_version -lopenjpeg -DOPJ_STATIC ||
|
||||
check_lib openjpeg.h opj_version -lopenjpeg -DOPJ_STATIC ||
|
||||
@@ -4986,8 +4926,6 @@ enabled libxavs && require libxavs xavs.h xavs_encoder_encode -lxavs
|
||||
enabled libxvid && require libxvid xvid.h xvid_global -lxvidcore
|
||||
enabled libzmq && require_pkg_config libzmq zmq.h zmq_ctx_new
|
||||
enabled libzvbi && require libzvbi libzvbi.h vbi_decoder_new -lzvbi
|
||||
enabled nvenc && { check_header nvEncodeAPI.h || die "ERROR: nvEncodeAPI.h not found."; } &&
|
||||
{ [ $target_os != cygwin ] || die "ERROR: NVENC is not supported on Cygwin currently."; }
|
||||
enabled openal && { { for al_libs in "${OPENAL_LIBS}" "-lopenal" "-lOpenAL32"; do
|
||||
check_lib 'AL/al.h' alGetError "${al_libs}" && break; done } ||
|
||||
die "ERROR: openal not found"; } &&
|
||||
@@ -5018,7 +4956,7 @@ fi
|
||||
|
||||
# libdc1394 check
|
||||
if enabled libdc1394; then
|
||||
{ require_pkg_config libdc1394-2 dc1394/dc1394.h dc1394_new &&
|
||||
{ check_lib dc1394/dc1394.h dc1394_new -ldc1394 -lraw1394 &&
|
||||
enable libdc1394_2; } ||
|
||||
{ check_lib libdc1394/dc1394_control.h dc1394_create_handle -ldc1394_control -lraw1394 &&
|
||||
enable libdc1394_1; } ||
|
||||
@@ -5102,15 +5040,15 @@ enabled_any sndio_indev sndio_outdev && check_lib2 sndio.h sio_open -lsndio
|
||||
if enabled libcdio; then
|
||||
check_lib2 "cdio/cdda.h cdio/paranoia.h" cdio_cddap_open -lcdio_paranoia -lcdio_cdda -lcdio ||
|
||||
check_lib2 "cdio/paranoia/cdda.h cdio/paranoia/paranoia.h" cdio_cddap_open -lcdio_paranoia -lcdio_cdda -lcdio ||
|
||||
die "ERROR: No usable libcdio/cdparanoia found"
|
||||
die "ERROR: libcdio-paranoia not found"
|
||||
fi
|
||||
|
||||
enabled xlib &&
|
||||
check_lib X11/Xlib.h XOpenDisplay -lX11 || disable xlib
|
||||
|
||||
if ! disabled libxcb; then
|
||||
check_pkg_config "xcb >= 1.4" xcb/xcb.h xcb_connect || {
|
||||
enabled libxcb && die "ERROR: libxcb >= 1.4 not found";
|
||||
check_pkg_config xcb xcb/xcb.h xcb_connect || {
|
||||
enabled libxcb && die "ERROR: libxcb not found";
|
||||
} && disable x11grab && enable libxcb
|
||||
|
||||
if enabled libxcb; then
|
||||
@@ -5156,10 +5094,6 @@ enabled vaapi &&
|
||||
check_lib va/va.h vaInitialize -lva ||
|
||||
disable vaapi
|
||||
|
||||
enabled vaapi && enabled xlib &&
|
||||
check_lib2 "va/va.h va/va_x11.h" vaGetDisplay -lva -lva-x11 &&
|
||||
enable vaapi_x11
|
||||
|
||||
enabled vdpau &&
|
||||
check_cpp_condition vdpau/vdpau.h "defined VDP_DECODER_PROFILE_MPEG4_PART2_ASP" ||
|
||||
disable vdpau
|
||||
@@ -5407,7 +5341,7 @@ if test $target_os = "haiku"; then
|
||||
fi
|
||||
|
||||
enabled_all dxva2 dxva2api_cobj CoTaskMemFree &&
|
||||
prepend ffmpeg_libs $($ldflags_filter "-lole32" "-luser32") &&
|
||||
prepend ffmpeg_libs $($ldflags_filter "-lole32") &&
|
||||
enable dxva2_lib
|
||||
|
||||
! enabled_any memalign posix_memalign aligned_malloc &&
|
||||
@@ -5459,9 +5393,9 @@ enabled asyncts_filter && prepend avfilter_deps "avresample"
|
||||
enabled atempo_filter && prepend avfilter_deps "avcodec"
|
||||
enabled ebur128_filter && enabled swresample && prepend avfilter_deps "swresample"
|
||||
enabled elbg_filter && prepend avfilter_deps "avcodec"
|
||||
enabled fftfilt_filter && prepend avfilter_deps "avcodec"
|
||||
enabled mcdeint_filter && prepend avfilter_deps "avcodec"
|
||||
enabled movie_filter && prepend avfilter_deps "avformat avcodec"
|
||||
enabled mp_filter && prepend avfilter_deps "avcodec"
|
||||
enabled pan_filter && prepend avfilter_deps "swresample"
|
||||
enabled pp_filter && prepend avfilter_deps "postproc"
|
||||
enabled removelogo_filter && prepend avfilter_deps "avformat avcodec swscale"
|
||||
@@ -5471,7 +5405,6 @@ enabled scale_filter && prepend avfilter_deps "swscale"
|
||||
enabled showspectrum_filter && prepend avfilter_deps "avcodec"
|
||||
enabled smartblur_filter && prepend avfilter_deps "swscale"
|
||||
enabled subtitles_filter && prepend avfilter_deps "avformat avcodec"
|
||||
enabled uspp_filter && prepend avfilter_deps "avcodec"
|
||||
|
||||
enabled lavfi_indev && prepend avdevice_deps "avfilter"
|
||||
|
||||
@@ -5540,6 +5473,7 @@ if enabled arm; then
|
||||
fi
|
||||
if enabled mips; then
|
||||
echo "MIPS FPU enabled ${mipsfpu-no}"
|
||||
echo "MIPS32R2 enabled ${mips32r2-no}"
|
||||
echo "MIPS DSP R1 enabled ${mipsdspr1-no}"
|
||||
echo "MIPS DSP R2 enabled ${mipsdspr2-no}"
|
||||
fi
|
||||
|
@@ -15,49 +15,6 @@ libavutil: 2014-08-09
|
||||
|
||||
API changes, most recent first:
|
||||
|
||||
-------- 8< --------- FFmpeg 2.6 was cut here -------- 8< ---------
|
||||
|
||||
2015-03-04 - cca4476 - lavf 56.25.100
|
||||
Add avformat_flush()
|
||||
|
||||
2015-03-03 - 81a9126 - lavf 56.24.100
|
||||
Add avio_put_str16be()
|
||||
|
||||
2015-02-19 - 560eb71 / 31d2039 - lavc 56.23.100 / 56.13.0
|
||||
Add width, height, coded_width, coded_height and format to
|
||||
AVCodecParserContext.
|
||||
|
||||
2015-02-19 - e375511 / 5b1d9ce - lavu 54.19.100 / 54.9.0
|
||||
Add AV_PIX_FMT_QSV for QSV hardware acceleration.
|
||||
|
||||
2015-02-14 - ba22295 - lavc 56.21.102
|
||||
Deprecate VIMA decoder.
|
||||
|
||||
2015-01-27 - 62a82c6 / 728685f - lavc 56.21.100 / 56.12.0, lavu 54.18.100 / 54.8.0 - avcodec.h, frame.h
|
||||
Add AV_PKT_DATA_AUDIO_SERVICE_TYPE and AV_FRAME_DATA_AUDIO_SERVICE_TYPE for
|
||||
storing the audio service type as side data.
|
||||
|
||||
2015-01-16 - a47c933 - lavf 56.19.100 - avformat.h
|
||||
Add data_codec and data_codec_id for storing codec of data stream
|
||||
|
||||
2015-01-11 - 007c33d - lavd 56.4.100 - avdevice.h
|
||||
Add avdevice_list_input_sources().
|
||||
Add avdevice_list_output_sinks().
|
||||
|
||||
2014-12-25 - d7aaeea / c220a60 - lavc 56.19.100 / 56.10.0 - vdpau.h
|
||||
Add av_vdpau_get_surface_parameters().
|
||||
|
||||
2014-12-25 - ddb9a24 / 6c99c92 - lavc 56.18.100 / 56.9.0 - avcodec.h
|
||||
Add AV_HWACCEL_FLAG_ALLOW_HIGH_DEPTH flag to av_vdpau_bind_context().
|
||||
|
||||
2014-12-25 - d16079a / 57b6704 - lavc 56.17.100 / 56.8.0 - avcodec.h
|
||||
Add AVCodecContext.sw_pix_fmt.
|
||||
|
||||
2014-12-04 - 6e9ac02 - lavc 56.14.100 - dv_profile.h
|
||||
Add av_dv_codec_profile2().
|
||||
|
||||
-------- 8< --------- FFmpeg 2.5 was cut here -------- 8< ---------
|
||||
|
||||
2014-11-21 - ab922f9 - lavu 54.15.100 - dict.h
|
||||
Add av_dict_get_string().
|
||||
|
||||
@@ -113,12 +70,12 @@ API changes, most recent first:
|
||||
|
||||
-------- 8< --------- FFmpeg 2.4 was cut here -------- 8< ---------
|
||||
|
||||
2014-08-25 - 215db29 / b263f8f - lavf 56.3.100 / 56.3.0 - avformat.h
|
||||
Add AVFormatContext.max_ts_probe.
|
||||
|
||||
2014-08-28 - f30a815 / 9301486 - lavc 56.1.100 / 56.1.0 - avcodec.h
|
||||
Add AV_PKT_DATA_STEREO3D to export container-level stereo3d information.
|
||||
|
||||
2014-08-25 - 215db29 / b263f8f - lavf 56.3.100 / 56.3.0 - avformat.h
|
||||
Add AVFormatContext.max_ts_probe.
|
||||
|
||||
2014-08-23 - 8fc9bd0 - lavu 54.7.100 - dict.h
|
||||
AV_DICT_DONT_STRDUP_KEY and AV_DICT_DONT_STRDUP_VAL arguments are now
|
||||
freed even on error. This is consistent with the behaviour all users
|
||||
@@ -296,7 +253,7 @@ API changes, most recent first:
|
||||
Add avcodec_free_context(). From now on it should be used for freeing
|
||||
AVCodecContext.
|
||||
|
||||
2014-05-17 - 0eec06e / 1bd0bdc - lavu 52.84.100 / 54.5.0 - time.h
|
||||
2014-05-17 - 0eec06e - lavu 52.84.100 - time.h
|
||||
Add av_gettime_relative() av_gettime_relative_is_monotonic()
|
||||
|
||||
2014-05-15 - eacf7d6 / 0c1959b - lavf 55.38.100 / 55.17.0 - avformat.h
|
||||
|
@@ -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.6.5
|
||||
PROJECT_NUMBER = 2.5.7
|
||||
|
||||
# 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
|
||||
|
@@ -46,7 +46,6 @@ DOC_EXAMPLES-$(CONFIG_FILTERING_AUDIO_EXAMPLE) += filtering_audio
|
||||
DOC_EXAMPLES-$(CONFIG_FILTERING_VIDEO_EXAMPLE) += filtering_video
|
||||
DOC_EXAMPLES-$(CONFIG_METADATA_EXAMPLE) += metadata
|
||||
DOC_EXAMPLES-$(CONFIG_MUXING_EXAMPLE) += muxing
|
||||
DOC_EXAMPLES-$(CONFIG_QSVDEC_EXAMPLE) += qsvdec
|
||||
DOC_EXAMPLES-$(CONFIG_REMUXING_EXAMPLE) += remuxing
|
||||
DOC_EXAMPLES-$(CONFIG_RESAMPLING_AUDIO_EXAMPLE) += resampling_audio
|
||||
DOC_EXAMPLES-$(CONFIG_SCALING_VIDEO_EXAMPLE) += scaling_video
|
||||
@@ -115,9 +114,9 @@ doc/%-all.pod: doc/%.texi $(SRC_PATH)/doc/texi2pod.pl $(GENTEXI)
|
||||
|
||||
doc/%.1 doc/%.3: TAG = MAN
|
||||
doc/%.1: doc/%.pod $(GENTEXI)
|
||||
$(M)pod2man --section=1 --center=" " --release=" " --date=" " $< > $@
|
||||
$(M)pod2man --section=1 --center=" " --release=" " $< > $@
|
||||
doc/%.3: doc/%.pod $(GENTEXI)
|
||||
$(M)pod2man --section=3 --center=" " --release=" " --date=" " $< > $@
|
||||
$(M)pod2man --section=3 --center=" " --release=" " $< > $@
|
||||
|
||||
$(DOCS) doc/doxy/html: | doc/
|
||||
$(DOC_EXAMPLES:%$(EXESUF)=%.o): | doc/examples
|
||||
|
@@ -7,11 +7,6 @@ V
|
||||
Disable the default terse mode, the full command issued by make and its
|
||||
output will be shown on the screen.
|
||||
|
||||
DBG
|
||||
Preprocess x86 external assembler files to a .dbg.asm file in the object
|
||||
directory, which then gets compiled. Helps developping those assembler
|
||||
files.
|
||||
|
||||
DESTDIR
|
||||
Destination directory for the install targets, useful to prepare packages
|
||||
or install FFmpeg in cross-environments.
|
||||
|
@@ -7,7 +7,7 @@ all the encoders and decoders. In addition each codec may support
|
||||
so-called private options, which are specific for a given codec.
|
||||
|
||||
Sometimes, a global option may only affect a specific kind of codec,
|
||||
and may be nonsensical or ignored by another, so you need to be aware
|
||||
and may be unsensical or ignored by another, so you need to be aware
|
||||
of the meaning of the specified options. Also some options are
|
||||
meant only for decoding or encoding.
|
||||
|
||||
@@ -495,8 +495,6 @@ visualize block types
|
||||
picture buffer allocations
|
||||
@item thread_ops
|
||||
threading operations
|
||||
@item nomc
|
||||
skip motion compensation
|
||||
@end table
|
||||
|
||||
@item vismv @var{integer} (@emph{decoding,video})
|
||||
@@ -865,14 +863,6 @@ Possible values:
|
||||
|
||||
@item mpeg2_aac_he
|
||||
|
||||
@item mpeg4_sp
|
||||
|
||||
@item mpeg4_core
|
||||
|
||||
@item mpeg4_main
|
||||
|
||||
@item mpeg4_asp
|
||||
|
||||
@item dts
|
||||
|
||||
@item dts_es
|
||||
|
@@ -1,5 +1,4 @@
|
||||
\input texinfo @c -*- texinfo -*-
|
||||
@documentencoding UTF-8
|
||||
|
||||
@settitle Developer Documentation
|
||||
@titlepage
|
||||
@@ -648,12 +647,12 @@ accordingly].
|
||||
@subsection Adding files to the fate-suite dataset
|
||||
|
||||
When there is no muxer or encoder available to generate test media for a
|
||||
specific test then the media has to be included in the fate-suite.
|
||||
specific test then the media has to be inlcuded in the fate-suite.
|
||||
First please make sure that the sample file is as small as possible to test the
|
||||
respective decoder or demuxer sufficiently. Large files increase network
|
||||
bandwidth and disk space requirements.
|
||||
Once you have a working fate test and fate sample, provide in the commit
|
||||
message or introductory message for the patch series that you post to
|
||||
message or introductionary message for the patch series that you post to
|
||||
the ffmpeg-devel mailing list, a direct link to download the sample media.
|
||||
|
||||
|
||||
|
@@ -6,16 +6,8 @@ DOXYGEN="${3}"
|
||||
|
||||
shift 3
|
||||
|
||||
if [ -e "$SRC_PATH/VERSION" ]; then
|
||||
VERSION=`cat "$SRC_PATH/VERSION"`
|
||||
else
|
||||
VERSION=`cd "$SRC_PATH"; git describe`
|
||||
fi
|
||||
|
||||
$DOXYGEN - <<EOF
|
||||
@INCLUDE = ${DOXYFILE}
|
||||
INPUT = $@
|
||||
EXAMPLE_PATH = ${SRC_PATH}/doc/examples
|
||||
HTML_TIMESTAMP = NO
|
||||
PROJECT_NUMBER = $VERSION
|
||||
EOF
|
||||
|
@@ -2171,7 +2171,7 @@ Use @var{0} to disable alpha plane coding.
|
||||
@subsection Speed considerations
|
||||
|
||||
In the default mode of operation the encoder has to honor frame constraints
|
||||
(i.e. not produce frames with size bigger than requested) while still making
|
||||
(i.e. not produc frames with size bigger than requested) while still making
|
||||
output picture as good as possible.
|
||||
A frame containing a lot of small details is harder to compress and the encoder
|
||||
would spend more time searching for appropriate quantizers for each slice.
|
||||
|
@@ -36,8 +36,6 @@
|
||||
|
||||
static AVFormatContext *fmt_ctx = NULL;
|
||||
static AVCodecContext *video_dec_ctx = NULL, *audio_dec_ctx;
|
||||
static int width, height;
|
||||
static enum AVPixelFormat pix_fmt;
|
||||
static AVStream *video_stream = NULL, *audio_stream = NULL;
|
||||
static const char *src_filename = NULL;
|
||||
static const char *video_dst_filename = NULL;
|
||||
@@ -83,22 +81,6 @@ static int decode_packet(int *got_frame, int cached)
|
||||
}
|
||||
|
||||
if (*got_frame) {
|
||||
|
||||
if (frame->width != width || frame->height != height ||
|
||||
frame->format != pix_fmt) {
|
||||
/* To handle this change, one could call av_image_alloc again and
|
||||
* decode the following frames into another rawvideo file. */
|
||||
fprintf(stderr, "Error: Width, height and pixel format have to be "
|
||||
"constant in a rawvideo file, but the width, height or "
|
||||
"pixel format of the input video changed:\n"
|
||||
"old: width = %d, height = %d, format = %s\n"
|
||||
"new: width = %d, height = %d, format = %s\n",
|
||||
width, height, av_get_pix_fmt_name(pix_fmt),
|
||||
frame->width, frame->height,
|
||||
av_get_pix_fmt_name(frame->format));
|
||||
return -1;
|
||||
}
|
||||
|
||||
printf("video_frame%s n:%d coded_n:%d pts:%s\n",
|
||||
cached ? "(cached)" : "",
|
||||
video_frame_count++, frame->coded_picture_number,
|
||||
@@ -108,7 +90,7 @@ static int decode_packet(int *got_frame, int cached)
|
||||
* this is required since rawvideo expects non aligned data */
|
||||
av_image_copy(video_dst_data, video_dst_linesize,
|
||||
(const uint8_t **)(frame->data), frame->linesize,
|
||||
pix_fmt, width, height);
|
||||
video_dec_ctx->pix_fmt, video_dec_ctx->width, video_dec_ctx->height);
|
||||
|
||||
/* write to rawvideo file */
|
||||
fwrite(video_dst_data[0], 1, video_dst_bufsize, video_dst_file);
|
||||
@@ -156,7 +138,7 @@ static int decode_packet(int *got_frame, int cached)
|
||||
static int open_codec_context(int *stream_idx,
|
||||
AVFormatContext *fmt_ctx, enum AVMediaType type)
|
||||
{
|
||||
int ret, stream_index;
|
||||
int ret;
|
||||
AVStream *st;
|
||||
AVCodecContext *dec_ctx = NULL;
|
||||
AVCodec *dec = NULL;
|
||||
@@ -168,8 +150,8 @@ static int open_codec_context(int *stream_idx,
|
||||
av_get_media_type_string(type), src_filename);
|
||||
return ret;
|
||||
} else {
|
||||
stream_index = ret;
|
||||
st = fmt_ctx->streams[stream_index];
|
||||
*stream_idx = ret;
|
||||
st = fmt_ctx->streams[*stream_idx];
|
||||
|
||||
/* find decoder for the stream */
|
||||
dec_ctx = st->codec;
|
||||
@@ -188,7 +170,6 @@ static int open_codec_context(int *stream_idx,
|
||||
av_get_media_type_string(type));
|
||||
return ret;
|
||||
}
|
||||
*stream_idx = stream_index;
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -283,11 +264,9 @@ int main (int argc, char **argv)
|
||||
}
|
||||
|
||||
/* allocate image where the decoded image will be put */
|
||||
width = video_dec_ctx->width;
|
||||
height = video_dec_ctx->height;
|
||||
pix_fmt = video_dec_ctx->pix_fmt;
|
||||
ret = av_image_alloc(video_dst_data, video_dst_linesize,
|
||||
width, height, pix_fmt, 1);
|
||||
video_dec_ctx->width, video_dec_ctx->height,
|
||||
video_dec_ctx->pix_fmt, 1);
|
||||
if (ret < 0) {
|
||||
fprintf(stderr, "Could not allocate raw video buffer\n");
|
||||
goto end;
|
||||
@@ -362,7 +341,7 @@ int main (int argc, char **argv)
|
||||
if (video_stream) {
|
||||
printf("Play the output video file with the command:\n"
|
||||
"ffplay -f rawvideo -pix_fmt %s -video_size %dx%d %s\n",
|
||||
av_get_pix_fmt_name(pix_fmt), width, height,
|
||||
av_get_pix_fmt_name(video_dec_ctx->pix_fmt), video_dec_ctx->width, video_dec_ctx->height,
|
||||
video_dst_filename);
|
||||
}
|
||||
|
||||
|
@@ -145,28 +145,12 @@ static int init_filters(const char *filters_descr)
|
||||
goto end;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set the endpoints for the filter graph. The filter_graph will
|
||||
* be linked to the graph described by filters_descr.
|
||||
*/
|
||||
|
||||
/*
|
||||
* The buffer source output must be connected to the input pad of
|
||||
* the first filter described by filters_descr; since the first
|
||||
* filter input label is not specified, it is set to "in" by
|
||||
* default.
|
||||
*/
|
||||
/* Endpoints for the filter graph. */
|
||||
outputs->name = av_strdup("in");
|
||||
outputs->filter_ctx = buffersrc_ctx;
|
||||
outputs->pad_idx = 0;
|
||||
outputs->next = NULL;
|
||||
|
||||
/*
|
||||
* The buffer sink input must be connected to the output pad of
|
||||
* the last filter described by filters_descr; since the last
|
||||
* filter output label is not specified, it is set to "out" by
|
||||
* default.
|
||||
*/
|
||||
inputs->name = av_strdup("out");
|
||||
inputs->filter_ctx = buffersink_ctx;
|
||||
inputs->pad_idx = 0;
|
||||
|
@@ -128,28 +128,12 @@ static int init_filters(const char *filters_descr)
|
||||
goto end;
|
||||
}
|
||||
|
||||
/*
|
||||
* Set the endpoints for the filter graph. The filter_graph will
|
||||
* be linked to the graph described by filters_descr.
|
||||
*/
|
||||
|
||||
/*
|
||||
* The buffer source output must be connected to the input pad of
|
||||
* the first filter described by filters_descr; since the first
|
||||
* filter input label is not specified, it is set to "in" by
|
||||
* default.
|
||||
*/
|
||||
/* Endpoints for the filter graph. */
|
||||
outputs->name = av_strdup("in");
|
||||
outputs->filter_ctx = buffersrc_ctx;
|
||||
outputs->pad_idx = 0;
|
||||
outputs->next = NULL;
|
||||
|
||||
/*
|
||||
* The buffer sink input must be connected to the output pad of
|
||||
* the last filter described by filters_descr; since the last
|
||||
* filter output label is not specified, it is set to "out" by
|
||||
* default.
|
||||
*/
|
||||
inputs->name = av_strdup("out");
|
||||
inputs->filter_ctx = buffersink_ctx;
|
||||
inputs->pad_idx = 0;
|
||||
|
@@ -661,7 +661,7 @@ int main(int argc, char **argv)
|
||||
|
||||
if (!(fmt->flags & AVFMT_NOFILE))
|
||||
/* Close the output file. */
|
||||
avio_closep(&oc->pb);
|
||||
avio_close(oc->pb);
|
||||
|
||||
/* free the stream */
|
||||
avformat_free_context(oc);
|
||||
|
@@ -1,484 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2015 Anton Khirnov
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Intel QSV-accelerated H.264 decoding example.
|
||||
*
|
||||
* @example qsvdec.c
|
||||
* This example shows how to do QSV-accelerated H.264 decoding with output
|
||||
* frames in the VA-API video surfaces.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <mfx/mfxvideo.h>
|
||||
|
||||
#include <va/va.h>
|
||||
#include <va/va_x11.h>
|
||||
#include <X11/Xlib.h>
|
||||
|
||||
#include "libavformat/avformat.h"
|
||||
#include "libavformat/avio.h"
|
||||
|
||||
#include "libavcodec/avcodec.h"
|
||||
#include "libavcodec/qsv.h"
|
||||
|
||||
#include "libavutil/error.h"
|
||||
#include "libavutil/mem.h"
|
||||
|
||||
typedef struct DecodeContext {
|
||||
mfxSession mfx_session;
|
||||
VADisplay va_dpy;
|
||||
|
||||
VASurfaceID *surfaces;
|
||||
mfxMemId *surface_ids;
|
||||
int *surface_used;
|
||||
int nb_surfaces;
|
||||
|
||||
mfxFrameInfo frame_info;
|
||||
} DecodeContext;
|
||||
|
||||
static mfxStatus frame_alloc(mfxHDL pthis, mfxFrameAllocRequest *req,
|
||||
mfxFrameAllocResponse *resp)
|
||||
{
|
||||
DecodeContext *decode = pthis;
|
||||
int err, i;
|
||||
|
||||
if (decode->surfaces) {
|
||||
fprintf(stderr, "Multiple allocation requests.\n");
|
||||
return MFX_ERR_MEMORY_ALLOC;
|
||||
}
|
||||
if (!(req->Type & MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET)) {
|
||||
fprintf(stderr, "Unsupported surface type: %d\n", req->Type);
|
||||
return MFX_ERR_UNSUPPORTED;
|
||||
}
|
||||
if (req->Info.BitDepthLuma != 8 || req->Info.BitDepthChroma != 8 ||
|
||||
req->Info.Shift || req->Info.FourCC != MFX_FOURCC_NV12 ||
|
||||
req->Info.ChromaFormat != MFX_CHROMAFORMAT_YUV420) {
|
||||
fprintf(stderr, "Unsupported surface properties.\n");
|
||||
return MFX_ERR_UNSUPPORTED;
|
||||
}
|
||||
|
||||
decode->surfaces = av_malloc_array (req->NumFrameSuggested, sizeof(*decode->surfaces));
|
||||
decode->surface_ids = av_malloc_array (req->NumFrameSuggested, sizeof(*decode->surface_ids));
|
||||
decode->surface_used = av_mallocz_array(req->NumFrameSuggested, sizeof(*decode->surface_used));
|
||||
if (!decode->surfaces || !decode->surface_ids || !decode->surface_used)
|
||||
goto fail;
|
||||
|
||||
err = vaCreateSurfaces(decode->va_dpy, VA_RT_FORMAT_YUV420,
|
||||
req->Info.Width, req->Info.Height,
|
||||
decode->surfaces, req->NumFrameSuggested,
|
||||
NULL, 0);
|
||||
if (err != VA_STATUS_SUCCESS) {
|
||||
fprintf(stderr, "Error allocating VA surfaces\n");
|
||||
goto fail;
|
||||
}
|
||||
decode->nb_surfaces = req->NumFrameSuggested;
|
||||
|
||||
for (i = 0; i < decode->nb_surfaces; i++)
|
||||
decode->surface_ids[i] = &decode->surfaces[i];
|
||||
|
||||
resp->mids = decode->surface_ids;
|
||||
resp->NumFrameActual = decode->nb_surfaces;
|
||||
|
||||
decode->frame_info = req->Info;
|
||||
|
||||
return MFX_ERR_NONE;
|
||||
fail:
|
||||
av_freep(&decode->surfaces);
|
||||
av_freep(&decode->surface_ids);
|
||||
av_freep(&decode->surface_used);
|
||||
|
||||
return MFX_ERR_MEMORY_ALLOC;
|
||||
}
|
||||
|
||||
static mfxStatus frame_free(mfxHDL pthis, mfxFrameAllocResponse *resp)
|
||||
{
|
||||
DecodeContext *decode = pthis;
|
||||
|
||||
if (decode->surfaces)
|
||||
vaDestroySurfaces(decode->va_dpy, decode->surfaces, decode->nb_surfaces);
|
||||
av_freep(&decode->surfaces);
|
||||
av_freep(&decode->surface_ids);
|
||||
av_freep(&decode->surface_used);
|
||||
decode->nb_surfaces = 0;
|
||||
|
||||
return MFX_ERR_NONE;
|
||||
}
|
||||
|
||||
static mfxStatus frame_lock(mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr)
|
||||
{
|
||||
return MFX_ERR_UNSUPPORTED;
|
||||
}
|
||||
|
||||
static mfxStatus frame_unlock(mfxHDL pthis, mfxMemId mid, mfxFrameData *ptr)
|
||||
{
|
||||
return MFX_ERR_UNSUPPORTED;
|
||||
}
|
||||
|
||||
static mfxStatus frame_get_hdl(mfxHDL pthis, mfxMemId mid, mfxHDL *hdl)
|
||||
{
|
||||
*hdl = mid;
|
||||
return MFX_ERR_NONE;
|
||||
}
|
||||
|
||||
static void free_buffer(void *opaque, uint8_t *data)
|
||||
{
|
||||
int *used = opaque;
|
||||
*used = 0;
|
||||
av_freep(&data);
|
||||
}
|
||||
|
||||
static int get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
|
||||
{
|
||||
DecodeContext *decode = avctx->opaque;
|
||||
|
||||
mfxFrameSurface1 *surf;
|
||||
AVBufferRef *surf_buf;
|
||||
int idx;
|
||||
|
||||
for (idx = 0; idx < decode->nb_surfaces; idx++) {
|
||||
if (!decode->surface_used[idx])
|
||||
break;
|
||||
}
|
||||
if (idx == decode->nb_surfaces) {
|
||||
fprintf(stderr, "No free surfaces\n");
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
|
||||
surf = av_mallocz(sizeof(*surf));
|
||||
if (!surf)
|
||||
return AVERROR(ENOMEM);
|
||||
surf_buf = av_buffer_create((uint8_t*)surf, sizeof(*surf), free_buffer,
|
||||
&decode->surface_used[idx], AV_BUFFER_FLAG_READONLY);
|
||||
if (!surf_buf) {
|
||||
av_freep(&surf);
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
|
||||
surf->Info = decode->frame_info;
|
||||
surf->Data.MemId = &decode->surfaces[idx];
|
||||
|
||||
frame->buf[0] = surf_buf;
|
||||
frame->data[3] = (uint8_t*)surf;
|
||||
|
||||
decode->surface_used[idx] = 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_format(AVCodecContext *avctx, const enum AVPixelFormat *pix_fmts)
|
||||
{
|
||||
while (*pix_fmts != AV_PIX_FMT_NONE) {
|
||||
if (*pix_fmts == AV_PIX_FMT_QSV) {
|
||||
if (!avctx->hwaccel_context) {
|
||||
DecodeContext *decode = avctx->opaque;
|
||||
AVQSVContext *qsv = av_qsv_alloc_context();
|
||||
if (!qsv)
|
||||
return AV_PIX_FMT_NONE;
|
||||
|
||||
qsv->session = decode->mfx_session;
|
||||
qsv->iopattern = MFX_IOPATTERN_OUT_VIDEO_MEMORY;
|
||||
|
||||
avctx->hwaccel_context = qsv;
|
||||
}
|
||||
|
||||
return AV_PIX_FMT_QSV;
|
||||
}
|
||||
|
||||
pix_fmts++;
|
||||
}
|
||||
|
||||
fprintf(stderr, "The QSV pixel format not offered in get_format()\n");
|
||||
|
||||
return AV_PIX_FMT_NONE;
|
||||
}
|
||||
|
||||
static int decode_packet(DecodeContext *decode, AVCodecContext *decoder_ctx,
|
||||
AVFrame *frame, AVPacket *pkt,
|
||||
AVIOContext *output_ctx)
|
||||
{
|
||||
int ret = 0;
|
||||
int got_frame = 1;
|
||||
|
||||
while (pkt->size > 0 || (!pkt->data && got_frame)) {
|
||||
ret = avcodec_decode_video2(decoder_ctx, frame, &got_frame, pkt);
|
||||
if (ret < 0) {
|
||||
fprintf(stderr, "Error during decoding\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
pkt->data += ret;
|
||||
pkt->size -= ret;
|
||||
|
||||
/* A real program would do something useful with the decoded frame here.
|
||||
* We just retrieve the raw data and write it to a file, which is rather
|
||||
* useless but pedagogic. */
|
||||
if (got_frame) {
|
||||
mfxFrameSurface1 *surf = (mfxFrameSurface1*)frame->data[3];
|
||||
VASurfaceID surface = *(VASurfaceID*)surf->Data.MemId;
|
||||
|
||||
VAImageFormat img_fmt = {
|
||||
.fourcc = VA_FOURCC_NV12,
|
||||
.byte_order = VA_LSB_FIRST,
|
||||
.bits_per_pixel = 8,
|
||||
.depth = 8,
|
||||
};
|
||||
|
||||
VAImage img;
|
||||
|
||||
VAStatus err;
|
||||
uint8_t *data;
|
||||
int i, j;
|
||||
|
||||
img.buf = VA_INVALID_ID;
|
||||
img.image_id = VA_INVALID_ID;
|
||||
|
||||
err = vaCreateImage(decode->va_dpy, &img_fmt,
|
||||
frame->width, frame->height, &img);
|
||||
if (err != VA_STATUS_SUCCESS) {
|
||||
fprintf(stderr, "Error creating an image: %s\n",
|
||||
vaErrorStr(err));
|
||||
ret = AVERROR_UNKNOWN;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
err = vaGetImage(decode->va_dpy, surface, 0, 0,
|
||||
frame->width, frame->height,
|
||||
img.image_id);
|
||||
if (err != VA_STATUS_SUCCESS) {
|
||||
fprintf(stderr, "Error getting an image: %s\n",
|
||||
vaErrorStr(err));
|
||||
ret = AVERROR_UNKNOWN;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
err = vaMapBuffer(decode->va_dpy, img.buf, (void**)&data);
|
||||
if (err != VA_STATUS_SUCCESS) {
|
||||
fprintf(stderr, "Error mapping the image buffer: %s\n",
|
||||
vaErrorStr(err));
|
||||
ret = AVERROR_UNKNOWN;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
for (i = 0; i < img.num_planes; i++)
|
||||
for (j = 0; j < (img.height >> (i > 0)); j++)
|
||||
avio_write(output_ctx, data + img.offsets[i] + j * img.pitches[i], img.width);
|
||||
|
||||
fail:
|
||||
if (img.buf != VA_INVALID_ID)
|
||||
vaUnmapBuffer(decode->va_dpy, img.buf);
|
||||
if (img.image_id != VA_INVALID_ID)
|
||||
vaDestroyImage(decode->va_dpy, img.image_id);
|
||||
av_frame_unref(frame);
|
||||
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
AVFormatContext *input_ctx = NULL;
|
||||
AVStream *video_st = NULL;
|
||||
AVCodecContext *decoder_ctx = NULL;
|
||||
const AVCodec *decoder;
|
||||
|
||||
AVPacket pkt = { 0 };
|
||||
AVFrame *frame = NULL;
|
||||
|
||||
DecodeContext decode = { NULL };
|
||||
|
||||
Display *dpy = NULL;
|
||||
int va_ver_major, va_ver_minor;
|
||||
|
||||
mfxIMPL mfx_impl = MFX_IMPL_AUTO_ANY;
|
||||
mfxVersion mfx_ver = { { 1, 1 } };
|
||||
|
||||
mfxFrameAllocator frame_allocator = {
|
||||
.pthis = &decode,
|
||||
.Alloc = frame_alloc,
|
||||
.Lock = frame_lock,
|
||||
.Unlock = frame_unlock,
|
||||
.GetHDL = frame_get_hdl,
|
||||
.Free = frame_free,
|
||||
};
|
||||
|
||||
AVIOContext *output_ctx = NULL;
|
||||
|
||||
int ret, i, err;
|
||||
|
||||
av_register_all();
|
||||
|
||||
if (argc < 3) {
|
||||
fprintf(stderr, "Usage: %s <input file> <output file>\n", argv[0]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* open the input file */
|
||||
ret = avformat_open_input(&input_ctx, argv[1], NULL, NULL);
|
||||
if (ret < 0) {
|
||||
fprintf(stderr, "Cannot open input file '%s': ", argv[1]);
|
||||
goto finish;
|
||||
}
|
||||
|
||||
/* find the first H.264 video stream */
|
||||
for (i = 0; i < input_ctx->nb_streams; i++) {
|
||||
AVStream *st = input_ctx->streams[i];
|
||||
|
||||
if (st->codec->codec_id == AV_CODEC_ID_H264 && !video_st)
|
||||
video_st = st;
|
||||
else
|
||||
st->discard = AVDISCARD_ALL;
|
||||
}
|
||||
if (!video_st) {
|
||||
fprintf(stderr, "No H.264 video stream in the input file\n");
|
||||
goto finish;
|
||||
}
|
||||
|
||||
/* initialize VA-API */
|
||||
dpy = XOpenDisplay(NULL);
|
||||
if (!dpy) {
|
||||
fprintf(stderr, "Cannot open the X display\n");
|
||||
goto finish;
|
||||
}
|
||||
decode.va_dpy = vaGetDisplay(dpy);
|
||||
if (!decode.va_dpy) {
|
||||
fprintf(stderr, "Cannot open the VA display\n");
|
||||
goto finish;
|
||||
}
|
||||
|
||||
err = vaInitialize(decode.va_dpy, &va_ver_major, &va_ver_minor);
|
||||
if (err != VA_STATUS_SUCCESS) {
|
||||
fprintf(stderr, "Cannot initialize VA: %s\n", vaErrorStr(err));
|
||||
goto finish;
|
||||
}
|
||||
fprintf(stderr, "Initialized VA v%d.%d\n", va_ver_major, va_ver_minor);
|
||||
|
||||
/* initialize an MFX session */
|
||||
err = MFXInit(mfx_impl, &mfx_ver, &decode.mfx_session);
|
||||
if (err != MFX_ERR_NONE) {
|
||||
fprintf(stderr, "Error initializing an MFX session\n");
|
||||
goto finish;
|
||||
}
|
||||
|
||||
MFXVideoCORE_SetHandle(decode.mfx_session, MFX_HANDLE_VA_DISPLAY, decode.va_dpy);
|
||||
MFXVideoCORE_SetFrameAllocator(decode.mfx_session, &frame_allocator);
|
||||
|
||||
/* initialize the decoder */
|
||||
decoder = avcodec_find_decoder_by_name("h264_qsv");
|
||||
if (!decoder) {
|
||||
fprintf(stderr, "The QSV decoder is not present in libavcodec\n");
|
||||
goto finish;
|
||||
}
|
||||
|
||||
decoder_ctx = avcodec_alloc_context3(decoder);
|
||||
if (!decoder_ctx) {
|
||||
ret = AVERROR(ENOMEM);
|
||||
goto finish;
|
||||
}
|
||||
decoder_ctx->codec_id = AV_CODEC_ID_H264;
|
||||
if (video_st->codec->extradata_size) {
|
||||
decoder_ctx->extradata = av_mallocz(video_st->codec->extradata_size +
|
||||
FF_INPUT_BUFFER_PADDING_SIZE);
|
||||
if (!decoder_ctx->extradata) {
|
||||
ret = AVERROR(ENOMEM);
|
||||
goto finish;
|
||||
}
|
||||
memcpy(decoder_ctx->extradata, video_st->codec->extradata,
|
||||
video_st->codec->extradata_size);
|
||||
decoder_ctx->extradata_size = video_st->codec->extradata_size;
|
||||
}
|
||||
decoder_ctx->refcounted_frames = 1;
|
||||
|
||||
decoder_ctx->opaque = &decode;
|
||||
decoder_ctx->get_buffer2 = get_buffer;
|
||||
decoder_ctx->get_format = get_format;
|
||||
|
||||
ret = avcodec_open2(decoder_ctx, NULL, NULL);
|
||||
if (ret < 0) {
|
||||
fprintf(stderr, "Error opening the decoder: ");
|
||||
goto finish;
|
||||
}
|
||||
|
||||
/* open the output stream */
|
||||
ret = avio_open(&output_ctx, argv[2], AVIO_FLAG_WRITE);
|
||||
if (ret < 0) {
|
||||
fprintf(stderr, "Error opening the output context: ");
|
||||
goto finish;
|
||||
}
|
||||
|
||||
frame = av_frame_alloc();
|
||||
if (!frame) {
|
||||
ret = AVERROR(ENOMEM);
|
||||
goto finish;
|
||||
}
|
||||
|
||||
/* actual decoding */
|
||||
while (ret >= 0) {
|
||||
ret = av_read_frame(input_ctx, &pkt);
|
||||
if (ret < 0)
|
||||
break;
|
||||
|
||||
if (pkt.stream_index == video_st->index)
|
||||
ret = decode_packet(&decode, decoder_ctx, frame, &pkt, output_ctx);
|
||||
|
||||
av_packet_unref(&pkt);
|
||||
}
|
||||
|
||||
/* flush the decoder */
|
||||
pkt.data = NULL;
|
||||
pkt.size = 0;
|
||||
ret = decode_packet(&decode, decoder_ctx, frame, &pkt, output_ctx);
|
||||
|
||||
finish:
|
||||
if (ret < 0) {
|
||||
char buf[1024];
|
||||
av_strerror(ret, buf, sizeof(buf));
|
||||
fprintf(stderr, "%s\n", buf);
|
||||
}
|
||||
|
||||
avformat_close_input(&input_ctx);
|
||||
|
||||
av_frame_free(&frame);
|
||||
|
||||
if (decode.mfx_session)
|
||||
MFXClose(decode.mfx_session);
|
||||
if (decode.va_dpy)
|
||||
vaTerminate(decode.va_dpy);
|
||||
if (dpy)
|
||||
XCloseDisplay(dpy);
|
||||
|
||||
if (decoder_ctx)
|
||||
av_freep(&decoder_ctx->hwaccel_context);
|
||||
avcodec_free_context(&decoder_ctx);
|
||||
|
||||
avio_close(output_ctx);
|
||||
|
||||
return ret;
|
||||
}
|
@@ -153,7 +153,7 @@ end:
|
||||
|
||||
/* close output */
|
||||
if (ofmt_ctx && !(ofmt->flags & AVFMT_NOFILE))
|
||||
avio_closep(&ofmt_ctx->pb);
|
||||
avio_close(ofmt_ctx->pb);
|
||||
avformat_free_context(ofmt_ctx);
|
||||
|
||||
if (ret < 0 && ret != AVERROR_EOF) {
|
||||
|
@@ -41,9 +41,11 @@
|
||||
#include "libswresample/swresample.h"
|
||||
|
||||
/** The output bit rate in kbit/s */
|
||||
#define OUTPUT_BIT_RATE 96000
|
||||
#define OUTPUT_BIT_RATE 48000
|
||||
/** The number of output channels */
|
||||
#define OUTPUT_CHANNELS 2
|
||||
/** The audio sample output format */
|
||||
#define OUTPUT_SAMPLE_FORMAT AV_SAMPLE_FMT_S16
|
||||
|
||||
/**
|
||||
* Convert an error code into a text message.
|
||||
@@ -167,7 +169,7 @@ static int open_output_file(const char *filename,
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/** Save the encoder context for easier access later. */
|
||||
/** Save the encoder context for easiert access later. */
|
||||
*output_codec_context = stream->codec;
|
||||
|
||||
/**
|
||||
@@ -177,16 +179,9 @@ static int open_output_file(const char *filename,
|
||||
(*output_codec_context)->channels = OUTPUT_CHANNELS;
|
||||
(*output_codec_context)->channel_layout = av_get_default_channel_layout(OUTPUT_CHANNELS);
|
||||
(*output_codec_context)->sample_rate = input_codec_context->sample_rate;
|
||||
(*output_codec_context)->sample_fmt = output_codec->sample_fmts[0];
|
||||
(*output_codec_context)->sample_fmt = AV_SAMPLE_FMT_S16;
|
||||
(*output_codec_context)->bit_rate = OUTPUT_BIT_RATE;
|
||||
|
||||
/** Allow the use of the experimental AAC encoder */
|
||||
(*output_codec_context)->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL;
|
||||
|
||||
/** Set the sample rate for the container. */
|
||||
stream->time_base.den = input_codec_context->sample_rate;
|
||||
stream->time_base.num = 1;
|
||||
|
||||
/**
|
||||
* Some container formats (like MP4) require global headers to be present
|
||||
* Mark the encoder so that it behaves accordingly.
|
||||
@@ -204,7 +199,7 @@ static int open_output_file(const char *filename,
|
||||
return 0;
|
||||
|
||||
cleanup:
|
||||
avio_closep(&(*output_format_context)->pb);
|
||||
avio_close((*output_format_context)->pb);
|
||||
avformat_free_context(*output_format_context);
|
||||
*output_format_context = NULL;
|
||||
return error < 0 ? error : AVERROR_EXIT;
|
||||
@@ -276,11 +271,10 @@ static int init_resampler(AVCodecContext *input_codec_context,
|
||||
}
|
||||
|
||||
/** Initialize a FIFO buffer for the audio samples to be encoded. */
|
||||
static int init_fifo(AVAudioFifo **fifo, AVCodecContext *output_codec_context)
|
||||
static int init_fifo(AVAudioFifo **fifo)
|
||||
{
|
||||
/** Create the FIFO buffer based on the specified output sample format. */
|
||||
if (!(*fifo = av_audio_fifo_alloc(output_codec_context->sample_fmt,
|
||||
output_codec_context->channels, 1))) {
|
||||
if (!(*fifo = av_audio_fifo_alloc(OUTPUT_SAMPLE_FORMAT, OUTPUT_CHANNELS, 1))) {
|
||||
fprintf(stderr, "Could not allocate FIFO\n");
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
@@ -543,9 +537,6 @@ static int init_output_frame(AVFrame **frame,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/** Global timestamp for the audio frames */
|
||||
static int64_t pts = 0;
|
||||
|
||||
/** Encode one frame worth of audio to the output file. */
|
||||
static int encode_audio_frame(AVFrame *frame,
|
||||
AVFormatContext *output_format_context,
|
||||
@@ -557,12 +548,6 @@ static int encode_audio_frame(AVFrame *frame,
|
||||
int error;
|
||||
init_packet(&output_packet);
|
||||
|
||||
/** Set a timestamp based on the sample rate for the container. */
|
||||
if (frame) {
|
||||
frame->pts = pts;
|
||||
pts += frame->nb_samples;
|
||||
}
|
||||
|
||||
/**
|
||||
* Encode the audio frame and store it in the temporary packet.
|
||||
* The output audio stream encoder is used to do this.
|
||||
@@ -674,7 +659,7 @@ int main(int argc, char **argv)
|
||||
&resample_context))
|
||||
goto cleanup;
|
||||
/** Initialize the FIFO buffer to store audio samples to be encoded. */
|
||||
if (init_fifo(&fifo, output_codec_context))
|
||||
if (init_fifo(&fifo))
|
||||
goto cleanup;
|
||||
/** Write the header of the output file container. */
|
||||
if (write_output_file_header(output_format_context))
|
||||
@@ -758,7 +743,7 @@ cleanup:
|
||||
if (output_codec_context)
|
||||
avcodec_close(output_codec_context);
|
||||
if (output_format_context) {
|
||||
avio_closep(&output_format_context->pb);
|
||||
avio_close(output_format_context->pb);
|
||||
avformat_free_context(output_format_context);
|
||||
}
|
||||
if (input_codec_context)
|
||||
|
@@ -573,7 +573,7 @@ end:
|
||||
av_free(filter_ctx);
|
||||
avformat_close_input(&ifmt_ctx);
|
||||
if (ofmt_ctx && !(ofmt_ctx->oformat->flags & AVFMT_NOFILE))
|
||||
avio_closep(&ofmt_ctx->pb);
|
||||
avio_close(ofmt_ctx->pb);
|
||||
avformat_free_context(ofmt_ctx);
|
||||
|
||||
if (ret < 0)
|
||||
|
85
doc/faq.texi
85
doc/faq.texi
@@ -1,5 +1,4 @@
|
||||
\input texinfo @c -*- texinfo -*-
|
||||
@documentencoding UTF-8
|
||||
|
||||
@settitle FFmpeg FAQ
|
||||
@titlepage
|
||||
@@ -91,56 +90,6 @@ To build FFmpeg, you need to install the development package. It is usually
|
||||
called @file{libfoo-dev} or @file{libfoo-devel}. You can remove it after the
|
||||
build is finished, but be sure to keep the main package.
|
||||
|
||||
@section How do I make @command{pkg-config} find my libraries?
|
||||
|
||||
Somewhere along with your libraries, there is a @file{.pc} file (or several)
|
||||
in a @file{pkgconfig} directory. You need to set environment variables to
|
||||
point @command{pkg-config} to these files.
|
||||
|
||||
If you need to @emph{add} directories to @command{pkg-config}'s search list
|
||||
(typical use case: library installed separately), add it to
|
||||
@code{$PKG_CONFIG_PATH}:
|
||||
|
||||
@example
|
||||
export PKG_CONFIG_PATH=/opt/x264/lib/pkgconfig:/opt/opus/lib/pkgconfig
|
||||
@end example
|
||||
|
||||
If you need to @emph{replace} @command{pkg-config}'s search list
|
||||
(typical use case: cross-compiling), set it in
|
||||
@code{$PKG_CONFIG_LIBDIR}:
|
||||
|
||||
@example
|
||||
export PKG_CONFIG_LIBDIR=/home/me/cross/usr/lib/pkgconfig:/home/me/cross/usr/local/lib/pkgconfig
|
||||
@end example
|
||||
|
||||
If you need to know the library's internal dependencies (typical use: static
|
||||
linking), add the @code{--static} option to @command{pkg-config}:
|
||||
|
||||
@example
|
||||
./configure --pkg-config-flags=--static
|
||||
@end example
|
||||
|
||||
@section How do I use @command{pkg-config} when cross-compiling?
|
||||
|
||||
The best way is to install @command{pkg-config} in your cross-compilation
|
||||
environment. It will automatically use the cross-compilation libraries.
|
||||
|
||||
You can also use @command{pkg-config} from the host environment by
|
||||
specifying explicitly @code{--pkg-config=pkg-config} to @command{configure}.
|
||||
In that case, you must point @command{pkg-config} to the correct directories
|
||||
using the @code{PKG_CONFIG_LIBDIR}, as explained in the previous entry.
|
||||
|
||||
As an intermediate solution, you can place in your cross-compilation
|
||||
environment a script that calls the host @command{pkg-config} with
|
||||
@code{PKG_CONFIG_LIBDIR} set. That script can look like that:
|
||||
|
||||
@example
|
||||
#!/bin/sh
|
||||
PKG_CONFIG_LIBDIR=/path/to/cross/lib/pkgconfig
|
||||
export PKG_CONFIG_LIBDIR
|
||||
exec /usr/bin/pkg-config "$@@"
|
||||
@end example
|
||||
|
||||
@chapter Usage
|
||||
|
||||
@section ffmpeg does not work; what is wrong?
|
||||
@@ -467,40 +416,6 @@ point acceptable for your tastes. The most common options to do that are
|
||||
@option{-qscale} and @option{-qmax}, but you should peruse the documentation
|
||||
of the encoder you chose.
|
||||
|
||||
@section I have a stretched video, why does scaling does not fix it?
|
||||
|
||||
A lot of video codecs and formats can store the @emph{aspect ratio} of the
|
||||
video: this is the ratio between the width and the height of either the full
|
||||
image (DAR, display aspect ratio) or individual pixels (SAR, sample aspect
|
||||
ratio). For example, EGA screens at resolution 640×350 had 4:3 DAR and 35:48
|
||||
SAR.
|
||||
|
||||
Most still image processing work with square pixels, i.e. 1:1 SAR, but a lot
|
||||
of video standards, especially from the analogic-numeric transition era, use
|
||||
non-square pixels.
|
||||
|
||||
Most processing filters in FFmpeg handle the aspect ratio to avoid
|
||||
stretching the image: cropping adjusts the DAR to keep the SAR constant,
|
||||
scaling adjusts the SAR to keep the DAR constant.
|
||||
|
||||
If you want to stretch, or “unstretch”, the image, you need to override the
|
||||
information with the
|
||||
@url{http://ffmpeg.org/ffmpeg-filters.html#setdar_002c-setsar, @code{setdar or setsar filters}}.
|
||||
|
||||
Do not forget to examine carefully the original video to check whether the
|
||||
stretching comes from the image or from the aspect ratio information.
|
||||
|
||||
For example, to fix a badly encoded EGA capture, use the following commands,
|
||||
either the first one to upscale to square pixels or the second one to set
|
||||
the correct aspect ratio or the third one to avoid transcoding (may not work
|
||||
depending on the format / codec / player / phase of the moon):
|
||||
|
||||
@example
|
||||
ffmpeg -i ega_screen.nut -vf scale=640:480,setsar=1 ega_screen_scaled.nut
|
||||
ffmpeg -i ega_screen.nut -vf setdar=4/3 ega_screen_anamorphic.nut
|
||||
ffmpeg -i ega_screen.nut -aspect 4/3 -c copy ega_screen_overridden.nut
|
||||
@end example
|
||||
|
||||
@chapter Development
|
||||
|
||||
@section Are there examples illustrating how to use the FFmpeg libraries, particularly libavcodec and libavformat?
|
||||
|
@@ -1,5 +1,4 @@
|
||||
\input texinfo @c -*- texinfo -*-
|
||||
@documentencoding UTF-8
|
||||
|
||||
@settitle FFmpeg Automated Testing Environment
|
||||
@titlepage
|
||||
|
@@ -1,5 +1,4 @@
|
||||
\input texinfo @c -*- texinfo -*-
|
||||
@documentencoding UTF-8
|
||||
|
||||
@settitle FFmpeg Bitstream Filters Documentation
|
||||
@titlepage
|
||||
|
@@ -1,5 +1,4 @@
|
||||
\input texinfo @c -*- texinfo -*-
|
||||
@documentencoding UTF-8
|
||||
|
||||
@settitle FFmpeg Codecs Documentation
|
||||
@titlepage
|
||||
|
@@ -1,5 +1,4 @@
|
||||
\input texinfo @c -*- texinfo -*-
|
||||
@documentencoding UTF-8
|
||||
|
||||
@settitle FFmpeg Devices Documentation
|
||||
@titlepage
|
||||
|
@@ -1,5 +1,4 @@
|
||||
\input texinfo @c -*- texinfo -*-
|
||||
@documentencoding UTF-8
|
||||
|
||||
@settitle FFmpeg Filters Documentation
|
||||
@titlepage
|
||||
|
@@ -1,5 +1,4 @@
|
||||
\input texinfo @c -*- texinfo -*-
|
||||
@documentencoding UTF-8
|
||||
|
||||
@settitle FFmpeg Formats Documentation
|
||||
@titlepage
|
||||
|
@@ -1,5 +1,4 @@
|
||||
\input texinfo @c -*- texinfo -*-
|
||||
@documentencoding UTF-8
|
||||
|
||||
@settitle FFmpeg Protocols Documentation
|
||||
@titlepage
|
||||
|
@@ -1,5 +1,4 @@
|
||||
\input texinfo @c -*- texinfo -*-
|
||||
@documentencoding UTF-8
|
||||
|
||||
@settitle FFmpeg Resampler Documentation
|
||||
@titlepage
|
||||
|
@@ -1,5 +1,4 @@
|
||||
\input texinfo @c -*- texinfo -*-
|
||||
@documentencoding UTF-8
|
||||
|
||||
@settitle FFmpeg Scaler Documentation
|
||||
@titlepage
|
||||
|
@@ -1,5 +1,4 @@
|
||||
\input texinfo @c -*- texinfo -*-
|
||||
@documentencoding UTF-8
|
||||
|
||||
@settitle FFmpeg Utilities Documentation
|
||||
@titlepage
|
||||
|
@@ -1,5 +1,4 @@
|
||||
\input texinfo @c -*- texinfo -*-
|
||||
@documentencoding UTF-8
|
||||
|
||||
@settitle ffmpeg Documentation
|
||||
@titlepage
|
||||
@@ -995,13 +994,6 @@ With -map you can select from which stream the timestamps should be
|
||||
taken. You can leave either video or audio unchanged and sync the
|
||||
remaining stream(s) to the unchanged one.
|
||||
|
||||
@item -frame_drop_threshold @var{parameter}
|
||||
Frame drop threshold, which specifies how much behind video frames can
|
||||
be before they are dropped. In frame rate units, so 1.0 is one frame.
|
||||
The default is -1.1. One possible usecase is to avoid framedrops in case
|
||||
of noisy timestamps or to increase frame drop precision in case of exact
|
||||
timestamps.
|
||||
|
||||
@item -async @var{samples_per_second}
|
||||
Audio sync method. "Stretches/squeezes" the audio stream to match the timestamps,
|
||||
the parameter is the maximum samples per second by which the audio is changed.
|
||||
@@ -1158,12 +1150,6 @@ This option enables or disables accurate seeking in input files with the
|
||||
transcoding. Use @option{-noaccurate_seek} to disable it, which may be useful
|
||||
e.g. when copying some streams and transcoding the others.
|
||||
|
||||
@item -thread_message_queue @var{size} (@emph{input})
|
||||
This option sets the maximum number of queued packets when reading from the
|
||||
file or device. With low latency / high rate live streams, packets may be
|
||||
discarded if they are not read in a timely manner; raising this value can
|
||||
avoid it.
|
||||
|
||||
@item -override_ffserver (@emph{global})
|
||||
Overrides the input specifications from @command{ffserver}. Using this
|
||||
option you can map any input stream to @command{ffserver} and control
|
||||
@@ -1174,11 +1160,6 @@ requested by @command{ffserver}.
|
||||
The option is intended for cases where features are needed that cannot be
|
||||
specified to @command{ffserver} but can be to @command{ffmpeg}.
|
||||
|
||||
@item -sdp_file @var{file} (@emph{global})
|
||||
Print sdp information for an output stream to @var{file}.
|
||||
This allows dumping sdp information when at least one output isn't an
|
||||
rtp stream. (Requires at least one of the output formats to be rtp).
|
||||
|
||||
@item -discard (@emph{input})
|
||||
Allows discarding specific streams or frames of streams at the demuxer.
|
||||
Not all demuxers support this.
|
||||
@@ -1228,10 +1209,7 @@ awkward to specify on the command line. Lines starting with the hash
|
||||
('#') character are ignored and are used to provide comments. Check
|
||||
the @file{presets} directory in the FFmpeg source tree for examples.
|
||||
|
||||
There are two types of preset files: ffpreset and avpreset files.
|
||||
|
||||
@subsection ffpreset files
|
||||
ffpreset files are specified with the @code{vpre}, @code{apre},
|
||||
Preset files are specified with the @code{vpre}, @code{apre},
|
||||
@code{spre}, and @code{fpre} options. The @code{fpre} option takes the
|
||||
filename of the preset instead of a preset name as input and can be
|
||||
used for any kind of codec. For the @code{vpre}, @code{apre}, and
|
||||
@@ -1256,26 +1234,6 @@ directories, where @var{codec_name} is the name of the codec to which
|
||||
the preset file options will be applied. For example, if you select
|
||||
the video codec with @code{-vcodec libvpx} and use @code{-vpre 1080p},
|
||||
then it will search for the file @file{libvpx-1080p.ffpreset}.
|
||||
|
||||
@subsection avpreset files
|
||||
avpreset files are specified with the @code{pre} option. They work similar to
|
||||
ffpreset files, but they only allow encoder- specific options. Therefore, an
|
||||
@var{option}=@var{value} pair specifying an encoder cannot be used.
|
||||
|
||||
When the @code{pre} option is specified, ffmpeg will look for files with the
|
||||
suffix .avpreset in the directories @file{$AVCONV_DATADIR} (if set), and
|
||||
@file{$HOME/.avconv}, and in the datadir defined at configuration time (usually
|
||||
@file{PREFIX/share/ffmpeg}), in that order.
|
||||
|
||||
First ffmpeg searches for a file named @var{codec_name}-@var{arg}.avpreset in
|
||||
the above-mentioned directories, where @var{codec_name} is the name of the codec
|
||||
to which the preset file options will be applied. For example, if you select the
|
||||
video codec with @code{-vcodec libvpx} and use @code{-pre 1080p}, then it will
|
||||
search for the file @file{libvpx-1080p.avpreset}.
|
||||
|
||||
If no such file is found, then ffmpeg will search for a file named
|
||||
@var{arg}.avpreset in the same directories.
|
||||
|
||||
@c man end OPTIONS
|
||||
|
||||
@chapter Tips
|
||||
@@ -1322,6 +1280,21 @@ quality).
|
||||
@chapter Examples
|
||||
@c man begin EXAMPLES
|
||||
|
||||
@section Preset files
|
||||
|
||||
A preset file contains a sequence of @var{option=value} pairs, one for
|
||||
each line, specifying a sequence of options which can be specified also on
|
||||
the command line. Lines starting with the hash ('#') character are ignored and
|
||||
are used to provide comments. Empty lines are also ignored. Check the
|
||||
@file{presets} directory in the FFmpeg source tree for examples.
|
||||
|
||||
Preset files are specified with the @code{pre} option, this option takes a
|
||||
preset name as input. FFmpeg searches for a file named @var{preset_name}.avpreset in
|
||||
the directories @file{$AVCONV_DATADIR} (if set), and @file{$HOME/.ffmpeg}, and in
|
||||
the data directory defined at configuration time (usually @file{$PREFIX/share/ffmpeg})
|
||||
in that order. For example, if the argument is @code{libx264-max}, it will
|
||||
search for the file @file{libx264-max.avpreset}.
|
||||
|
||||
@section Video and Audio grabbing
|
||||
|
||||
If you specify the input format and device then ffmpeg can grab video
|
||||
|
@@ -1,5 +1,4 @@
|
||||
\input texinfo @c -*- texinfo -*-
|
||||
@documentencoding UTF-8
|
||||
|
||||
@settitle ffplay Documentation
|
||||
@titlepage
|
||||
@@ -125,20 +124,24 @@ master clock is used to control audio-video synchronization. Most media
|
||||
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 -ast @var{audio_stream_specifier}
|
||||
Select the desired audio stream using the given stream specifier. The stream
|
||||
specifiers are described in the @ref{Stream specifiers} chapter. If this option
|
||||
is not specified, the "best" audio stream is selected in the program of the
|
||||
already selected video stream.
|
||||
@item -vst @var{video_stream_specifier}
|
||||
Select the desired video stream using the given stream specifier. The stream
|
||||
specifiers are described in the @ref{Stream specifiers} chapter. If this option
|
||||
is not specified, the "best" video stream is selected.
|
||||
@item -sst @var{subtitle_stream_specifier}
|
||||
Select the desired subtitle stream using the given stream specifier. The stream
|
||||
specifiers are described in the @ref{Stream specifiers} chapter. If this option
|
||||
is not specified, the "best" subtitle stream is selected in the program of the
|
||||
already selected video or audio stream.
|
||||
@item -threads @var{count}
|
||||
Set the thread count. By default, @command{ffplay} automatically detects a
|
||||
suitable number of threads to use.
|
||||
@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
|
||||
than the number of audio streams minus one, then the last one is
|
||||
selected, if it is negative the audio playback is disabled.
|
||||
@item -vst @var{video_stream_number}
|
||||
Select the desired video stream number, counting from 0. The number
|
||||
refers to the list of all the input video streams. If it is greater
|
||||
than the number of video streams minus one, then the last one is
|
||||
selected, if it is negative the video playback is disabled.
|
||||
@item -sst @var{subtitle_stream_number}
|
||||
Select the desired subtitle stream number, counting from 0. The number
|
||||
refers to the list of all the input subtitle streams. If it is greater
|
||||
than the number of subtitle streams minus one, then the last one is
|
||||
selected, if it is negative the subtitle rendering is disabled.
|
||||
@item -autoexit
|
||||
Exit when video is done playing.
|
||||
@item -exitonkeydown
|
||||
|
@@ -1,5 +1,4 @@
|
||||
\input texinfo @c -*- texinfo -*-
|
||||
@documentencoding UTF-8
|
||||
|
||||
@settitle ffprobe Documentation
|
||||
@titlepage
|
||||
|
@@ -182,7 +182,6 @@
|
||||
<xsd:attribute name="color_primaries" type="xsd:string"/>
|
||||
<xsd:attribute name="chroma_location" type="xsd:string"/>
|
||||
<xsd:attribute name="timecode" type="xsd:string"/>
|
||||
<xsd:attribute name="refs" type="xsd:int"/>
|
||||
|
||||
<!-- audio attributes -->
|
||||
<xsd:attribute name="sample_fmt" type="xsd:string"/>
|
||||
@@ -254,6 +253,8 @@
|
||||
<xsd:complexType name="programVersionType">
|
||||
<xsd:attribute name="version" type="xsd:string" use="required"/>
|
||||
<xsd:attribute name="copyright" type="xsd:string" use="required"/>
|
||||
<xsd:attribute name="build_date" type="xsd:string" use="required"/>
|
||||
<xsd:attribute name="build_time" type="xsd:string" use="required"/>
|
||||
<xsd:attribute name="compiler_ident" type="xsd:string" use="required"/>
|
||||
<xsd:attribute name="configuration" type="xsd:string" use="required"/>
|
||||
</xsd:complexType>
|
||||
|
@@ -1,5 +1,4 @@
|
||||
\input texinfo @c -*- texinfo -*-
|
||||
@documentencoding UTF-8
|
||||
|
||||
@settitle ffserver Documentation
|
||||
@titlepage
|
||||
|
@@ -165,27 +165,27 @@ omitted. "repeat" can also be used alone.
|
||||
If "repeat" is used alone, and with no prior loglevel set, the default
|
||||
loglevel will be used. If multiple loglevel parameters are given, using
|
||||
'repeat' will not change the loglevel.
|
||||
@var{loglevel} is a string or a number containing one of the following values:
|
||||
@var{loglevel} is a number or a string containing one of the following values:
|
||||
@table @samp
|
||||
@item quiet, -8
|
||||
@item quiet
|
||||
Show nothing at all; be silent.
|
||||
@item panic, 0
|
||||
@item panic
|
||||
Only show fatal errors which could lead the process to crash, such as
|
||||
and assert failure. This is not currently used for anything.
|
||||
@item fatal, 8
|
||||
@item fatal
|
||||
Only show fatal errors. These are errors after which the process absolutely
|
||||
cannot continue after.
|
||||
@item error, 16
|
||||
@item error
|
||||
Show all errors, including ones which can be recovered from.
|
||||
@item warning, 24
|
||||
@item warning
|
||||
Show all warnings and errors. Any message related to possibly
|
||||
incorrect or unexpected events will be shown.
|
||||
@item info, 32
|
||||
@item info
|
||||
Show informative messages during processing. This is in addition to
|
||||
warnings and errors. This is the default value.
|
||||
@item verbose, 40
|
||||
@item verbose
|
||||
Same as @code{info}, except more verbose.
|
||||
@item debug, 48
|
||||
@item debug
|
||||
Show everything, including debugging information.
|
||||
@end table
|
||||
|
||||
@@ -204,29 +204,21 @@ directory.
|
||||
This file can be useful for bug reports.
|
||||
It also implies @code{-loglevel verbose}.
|
||||
|
||||
Setting the environment variable @env{FFREPORT} to any value has the
|
||||
Setting the environment variable @code{FFREPORT} to any value has the
|
||||
same effect. If the value is a ':'-separated key=value sequence, these
|
||||
options will affect the report; option values must be escaped if they
|
||||
options will affect the report; options values must be escaped if they
|
||||
contain special characters or the options delimiter ':' (see the
|
||||
``Quoting and escaping'' section in the ffmpeg-utils manual).
|
||||
|
||||
The following options are recognized:
|
||||
``Quoting and escaping'' section in the ffmpeg-utils manual). The
|
||||
following option is recognized:
|
||||
@table @option
|
||||
@item file
|
||||
set the file name to use for the report; @code{%p} is expanded to the name
|
||||
of the program, @code{%t} is expanded to a timestamp, @code{%%} is expanded
|
||||
to a plain @code{%}
|
||||
@item level
|
||||
set the log verbosity level using a numerical value (see @code{-loglevel}).
|
||||
set the log level
|
||||
@end table
|
||||
|
||||
For example, to output a report to a file named @file{ffreport.log}
|
||||
using a log level of @code{32} (alias for log level @code{info}):
|
||||
|
||||
@example
|
||||
FFREPORT=file=ffreport.log:level=32 ffmpeg -i input output
|
||||
@end example
|
||||
|
||||
Errors in parsing the environment variable are not fatal, and will not
|
||||
appear in the report.
|
||||
|
||||
@@ -305,41 +297,8 @@ Possible flags for this option are:
|
||||
@end table
|
||||
|
||||
@item -opencl_bench
|
||||
This option is used to benchmark all available OpenCL devices and print the
|
||||
results. This option is only available when FFmpeg has been compiled with
|
||||
@code{--enable-opencl}.
|
||||
|
||||
When FFmpeg is configured with @code{--enable-opencl}, the options for the
|
||||
global OpenCL context are set via @option{-opencl_options}. See the
|
||||
"OpenCL Options" section in the ffmpeg-utils manual for the complete list of
|
||||
supported options. Amongst others, these options include the ability to select
|
||||
a specific platform and device to run the OpenCL code on. By default, FFmpeg
|
||||
will run on the first device of the first platform. While the options for the
|
||||
global OpenCL context provide flexibility to the user in selecting the OpenCL
|
||||
device of their choice, most users would probably want to select the fastest
|
||||
OpenCL device for their system.
|
||||
|
||||
This option assists the selection of the most efficient configuration by
|
||||
identifying the appropriate device for the user's system. The built-in
|
||||
benchmark is run on all the OpenCL devices and the performance is measured for
|
||||
each device. The devices in the results list are sorted based on their
|
||||
performance with the fastest device listed first. The user can subsequently
|
||||
invoke @command{ffmpeg} using the device deemed most appropriate via
|
||||
@option{-opencl_options} to obtain the best performance for the OpenCL
|
||||
accelerated code.
|
||||
|
||||
Typical usage to use the fastest OpenCL device involve the following steps.
|
||||
|
||||
Run the command:
|
||||
@example
|
||||
ffmpeg -opencl_bench
|
||||
@end example
|
||||
Note down the platform ID (@var{pidx}) and device ID (@var{didx}) of the first
|
||||
i.e. fastest device in the list.
|
||||
Select the platform and device using the command:
|
||||
@example
|
||||
ffmpeg -opencl_options platform_idx=@var{pidx}:device_idx=@var{didx} ...
|
||||
@end example
|
||||
Benchmark all available OpenCL devices and show the results. This option
|
||||
is only available when FFmpeg has been compiled with @code{--enable-opencl}.
|
||||
|
||||
@item -opencl_options options (@emph{global})
|
||||
Set OpenCL environment options. This option is only available when
|
||||
|
749
doc/filters.texi
749
doc/filters.texi
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,4 @@
|
||||
\input texinfo @c -*- texinfo -*-
|
||||
@documentencoding UTF-8
|
||||
|
||||
@settitle General Documentation
|
||||
@titlepage
|
||||
@@ -109,14 +108,6 @@ Go to @url{http://www.wavpack.com/} and follow the instructions for
|
||||
installing the library. Then pass @code{--enable-libwavpack} to configure to
|
||||
enable it.
|
||||
|
||||
@section OpenH264
|
||||
|
||||
FFmpeg can make use of the OpenH264 library for H.264 encoding.
|
||||
|
||||
Go to @url{http://www.openh264.org/} and follow the instructions for
|
||||
installing the library. Then pass @code{--enable-libopenh264} to configure to
|
||||
enable it.
|
||||
|
||||
@section x264
|
||||
|
||||
FFmpeg can make use of the x264 library for H.264 encoding.
|
||||
@@ -152,7 +143,7 @@ by Google as part of the WebRTC project. libilbc is a packaging friendly
|
||||
copy of the iLBC codec. FFmpeg can make use of the libilbc library for
|
||||
iLBC encoding and decoding.
|
||||
|
||||
Go to @url{https://github.com/TimothyGu/libilbc} and follow the instructions for
|
||||
Go to @url{https://github.com/dekkers/libilbc} and follow the instructions for
|
||||
installing the library. Then pass @code{--enable-libilbc} to configure to
|
||||
enable it.
|
||||
|
||||
@@ -252,8 +243,6 @@ library:
|
||||
@tab Used in the game Cyberia from Interplay.
|
||||
@item Delphine Software International CIN @tab @tab X
|
||||
@tab Multimedia format used by Delphine Software games.
|
||||
@item Digital Speech Standard (DSS) @tab @tab X
|
||||
@item Canopus HQX @tab @tab X
|
||||
@item CD+G @tab @tab X
|
||||
@tab Video format used by CD+G karaoke disks
|
||||
@item Phantom Cine @tab @tab X
|
||||
@@ -664,7 +653,7 @@ following image formats are supported:
|
||||
@item H.263 / H.263-1996 @tab X @tab X
|
||||
@item H.263+ / H.263-1998 / H.263 version 2 @tab X @tab X
|
||||
@item H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 @tab E @tab X
|
||||
@tab encoding supported through external library libx264 and OpenH264
|
||||
@tab encoding supported through external library libx264
|
||||
@item HEVC @tab X @tab X
|
||||
@tab encoding supported through the external library libx265
|
||||
@item HNM version 4 @tab @tab X
|
||||
@@ -900,7 +889,6 @@ following image formats are supported:
|
||||
@tab decoding supported through external library libcelt
|
||||
@item Delphine Software International CIN audio @tab @tab X
|
||||
@tab Codec used in Delphine Software International games.
|
||||
@item Digital Speech Standard - Standard Play mode (DSS SP) @tab @tab X
|
||||
@item Discworld II BMV Audio @tab @tab X
|
||||
@item COOK @tab @tab X
|
||||
@tab All versions except 5.1 are supported.
|
||||
@@ -948,8 +936,8 @@ following image formats are supported:
|
||||
@item Musepack SV8 @tab @tab X
|
||||
@item Nellymoser Asao @tab X @tab X
|
||||
@item On2 AVC (Audio for Video Codec) @tab @tab X
|
||||
@item Opus @tab E @tab X
|
||||
@tab encoding supported through external library libopus
|
||||
@item Opus @tab E @tab E
|
||||
@tab supported through external library libopus
|
||||
@item PCM A-law @tab X @tab X
|
||||
@item PCM mu-law @tab X @tab X
|
||||
@item PCM signed 8-bit planar @tab X @tab X
|
||||
|
@@ -1,5 +1,4 @@
|
||||
\input texinfo @c -*- texinfo -*-
|
||||
@documentencoding UTF-8
|
||||
|
||||
@settitle Using git to develop FFmpeg
|
||||
|
||||
|
270
doc/indevs.texi
270
doc/indevs.texi
@@ -150,81 +150,6 @@ $ ffmpeg -f avfoundation -pixel_format bgr0 -i "default:none" out.avi
|
||||
|
||||
BSD video input device.
|
||||
|
||||
@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
|
||||
uyvy422 or v210, 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 can be 2, 8 or 16.
|
||||
|
||||
@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}.
|
||||
|
||||
@item bm_v210
|
||||
If set to @samp{1}, video is captured in 10 bit v210 instead
|
||||
of uyvy422. Not all Blackmagic devices support this option.
|
||||
|
||||
@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
|
||||
|
||||
@item
|
||||
Capture video clip at 1080i50 10 bit:
|
||||
@example
|
||||
ffmpeg -bm_v210 1 -f decklink -i 'UltraStudio Mini Recorder@@11' -acodec copy -vcodec copy output.avi
|
||||
@end example
|
||||
|
||||
@item
|
||||
Capture video clip at 720p50 with 32bit audio:
|
||||
@example
|
||||
ffmpeg -bm_audiodepth 32 -f decklink -i 'UltraStudio Mini Recorder@@14' -acodec copy -vcodec copy output.avi
|
||||
@end example
|
||||
|
||||
@item
|
||||
Capture video clip at 576i50 with 8 audio channels:
|
||||
@example
|
||||
ffmpeg -bm_channels 8 -f decklink -i 'UltraStudio Mini Recorder@@3' -acodec copy -vcodec copy output.avi
|
||||
@end example
|
||||
|
||||
@end itemize
|
||||
|
||||
@section dshow
|
||||
|
||||
Windows DirectShow input device.
|
||||
@@ -242,7 +167,7 @@ The input name should be in the format:
|
||||
@end example
|
||||
|
||||
where @var{TYPE} can be either @var{audio} or @var{video},
|
||||
and @var{NAME} is the device's name or alternative name..
|
||||
and @var{NAME} is the device's name.
|
||||
|
||||
@subsection Options
|
||||
|
||||
@@ -295,61 +220,6 @@ Setting this value too low can degrade performance.
|
||||
See also
|
||||
@url{http://msdn.microsoft.com/en-us/library/windows/desktop/dd377582(v=vs.85).aspx}
|
||||
|
||||
@item video_pin_name
|
||||
Select video capture pin to use by name or alternative name.
|
||||
|
||||
@item audio_pin_name
|
||||
Select audio capture pin to use by name or alternative name.
|
||||
|
||||
@item crossbar_video_input_pin_number
|
||||
Select video input pin number for crossbar device. This will be
|
||||
routed to the crossbar device's Video Decoder output pin.
|
||||
Note that changing this value can affect future invocations
|
||||
(sets a new default) until system reboot occurs.
|
||||
|
||||
@item crossbar_audio_input_pin_number
|
||||
Select audio input pin number for crossbar device. This will be
|
||||
routed to the crossbar device's Audio Decoder output pin.
|
||||
Note that changing this value can affect future invocations
|
||||
(sets a new default) until system reboot occurs.
|
||||
|
||||
@item show_video_device_dialog
|
||||
If set to @option{true}, before capture starts, popup a display dialog
|
||||
to the end user, allowing them to change video filter properties
|
||||
and configurations manually.
|
||||
Note that for crossbar devices, adjusting values in this dialog
|
||||
may be needed at times to toggle between PAL (25 fps) and NTSC (29.97)
|
||||
input frame rates, sizes, interlacing, etc. Changing these values can
|
||||
enable different scan rates/frame rates and avoiding green bars at
|
||||
the bottom, flickering scan lines, etc.
|
||||
Note that with some devices, changing these properties can also affect future
|
||||
invocations (sets new defaults) until system reboot occurs.
|
||||
|
||||
@item show_audio_device_dialog
|
||||
If set to @option{true}, before capture starts, popup a display dialog
|
||||
to the end user, allowing them to change audio filter properties
|
||||
and configurations manually.
|
||||
|
||||
@item show_video_crossbar_connection_dialog
|
||||
If set to @option{true}, before capture starts, popup a display
|
||||
dialog to the end user, allowing them to manually
|
||||
modify crossbar pin routings, when it opens a video device.
|
||||
|
||||
@item show_audio_crossbar_connection_dialog
|
||||
If set to @option{true}, before capture starts, popup a display
|
||||
dialog to the end user, allowing them to manually
|
||||
modify crossbar pin routings, when it opens an audio device.
|
||||
|
||||
@item show_analog_tv_tuner_dialog
|
||||
If set to @option{true}, before capture starts, popup a display
|
||||
dialog to the end user, allowing them to manually
|
||||
modify TV channels and frequencies.
|
||||
|
||||
@item show_analog_tv_tuner_audio_dialog
|
||||
If set to @option{true}, before capture starts, popup a display
|
||||
dialog to the end user, allowing them to manually
|
||||
modify TV audio (like mono vs. stereo, Language A,B or C).
|
||||
|
||||
@end table
|
||||
|
||||
@subsection Examples
|
||||
@@ -386,19 +256,6 @@ Print the list of supported options in selected device and exit:
|
||||
$ ffmpeg -list_options true -f dshow -i video="Camera"
|
||||
@end example
|
||||
|
||||
@item
|
||||
Specify pin names to capture by name or alternative name, specify alternative device name:
|
||||
@example
|
||||
$ ffmpeg -f dshow -audio_pin_name "Audio Out" -video_pin_name 2 -i video=video="@@device_pnp_\\?\pci#ven_1a0a&dev_6200&subsys_62021461&rev_01#4&e2c7dd6&0&00e1#@{65e8773d-8f56-11d0-a3b9-00a0c9223196@}\@{ca465100-deb0-4d59-818f-8c477184adf6@}":audio="Microphone"
|
||||
@end example
|
||||
|
||||
@item
|
||||
Configure a crossbar device, specifying crossbar pins, allow user to adjust video capture properties at startup:
|
||||
@example
|
||||
$ ffmpeg -f dshow -show_video_device_dialog true -crossbar_video_input_pin_number 0
|
||||
-crossbar_audio_input_pin_number 3 -i video="AVerMedia BDA Analog Capture":audio="AVerMedia BDA Analog Capture"
|
||||
@end example
|
||||
|
||||
@end itemize
|
||||
|
||||
@section dv1394
|
||||
@@ -533,7 +390,7 @@ not work and result in undefined behavior.
|
||||
The values @option{auto}, @option{dv} and @option{hdv} are supported.
|
||||
|
||||
@item dvbuffer
|
||||
Set maximum size of buffer for incoming data, in frames. For DV, this
|
||||
Set maxiumum size of buffer for incoming data, in frames. For DV, this
|
||||
is an exact value. For HDV, it is not frame exact, since HDV does
|
||||
not have a fixed frame size.
|
||||
|
||||
@@ -638,14 +495,6 @@ generated by the device.
|
||||
The first unlabelled output is automatically assigned to the "out0"
|
||||
label, but all the others need to be specified explicitly.
|
||||
|
||||
The suffix "+subcc" can be appended to the output label to create an extra
|
||||
stream with the closed captions packets attached to that output
|
||||
(experimental; only for EIA-608 / CEA-708 for now).
|
||||
The subcc streams are created after all the normal streams, in the order of
|
||||
the corresponding stream.
|
||||
For example, if there is "out19+subcc", "out7+subcc" and up to "out42", the
|
||||
stream #43 is subcc for stream #7 and stream #44 is subcc for stream #19.
|
||||
|
||||
If not specified defaults to the filename specified for the input
|
||||
device.
|
||||
|
||||
@@ -692,57 +541,24 @@ Read an audio stream and a video stream and play it back with
|
||||
ffplay -f lavfi "movie=test.avi[out0];amovie=test.wav[out1]"
|
||||
@end example
|
||||
|
||||
@item
|
||||
Dump decoded frames to images and closed captions to a file (experimental):
|
||||
@example
|
||||
ffmpeg -f lavfi -i "movie=test.ts[out0+subcc]" -map v frame%08d.png -map s -c copy -f rawvideo subcc.bin
|
||||
@end example
|
||||
|
||||
@end itemize
|
||||
|
||||
@section libcdio
|
||||
|
||||
Audio-CD input device based on libcdio.
|
||||
Audio-CD input device based on cdio.
|
||||
|
||||
To enable this input device during configuration you need libcdio
|
||||
installed on your system. It requires the configure option
|
||||
installed on your system. Requires the configure option
|
||||
@code{--enable-libcdio}.
|
||||
|
||||
This device allows playing and grabbing from an Audio-CD.
|
||||
|
||||
For example to copy with @command{ffmpeg} the entire Audio-CD in @file{/dev/sr0},
|
||||
For example to copy with @command{ffmpeg} the entire Audio-CD in /dev/sr0,
|
||||
you may run the command:
|
||||
@example
|
||||
ffmpeg -f libcdio -i /dev/sr0 cd.wav
|
||||
@end example
|
||||
|
||||
@subsection Options
|
||||
@table @option
|
||||
@item speed
|
||||
Set drive reading speed. Default value is 0.
|
||||
|
||||
The speed is specified CD-ROM speed units. The speed is set through
|
||||
the libcdio @code{cdio_cddap_speed_set} function. On many CD-ROM
|
||||
drives, specifying a value too large will result in using the fastest
|
||||
speed.
|
||||
|
||||
@item paranoia_mode
|
||||
Set paranoia recovery mode flags. It accepts one of the following values:
|
||||
|
||||
@table @samp
|
||||
@item disable
|
||||
@item verify
|
||||
@item overlap
|
||||
@item neverskip
|
||||
@item full
|
||||
@end table
|
||||
|
||||
Default value is @samp{disable}.
|
||||
|
||||
For more information about the available recovery modes, consult the
|
||||
paranoia project documentation.
|
||||
@end table
|
||||
|
||||
@section libdc1394
|
||||
|
||||
IIDC1394 input device, based on libdc1394 and libraw1394.
|
||||
@@ -1077,12 +893,8 @@ other filename will be interpreted as device number 0.
|
||||
|
||||
X11 video input device.
|
||||
|
||||
To enable this input device during configuration you need libxcb
|
||||
installed on your system. It will be automatically detected during
|
||||
configuration.
|
||||
|
||||
Alternatively, the configure option @option{--enable-x11grab} exists
|
||||
for legacy Xlib users.
|
||||
Depends on X11, Xext, and Xfixes. Requires the configure option
|
||||
@code{--enable-x11grab}.
|
||||
|
||||
This device allows one to capture a region of an X11 display.
|
||||
|
||||
@@ -1100,12 +912,10 @@ omitted, and defaults to "localhost". The environment variable
|
||||
area with respect to the top-left border of the X11 screen. They
|
||||
default to 0.
|
||||
|
||||
Check the X11 documentation (e.g. @command{man X}) for more detailed
|
||||
information.
|
||||
Check the X11 documentation (e.g. man X) for more detailed information.
|
||||
|
||||
Use the @command{xdpyinfo} program for getting basic information about
|
||||
the properties of your X11 display (e.g. grep for "name" or
|
||||
"dimensions").
|
||||
Use the @command{dpyinfo} program for getting basic information about the
|
||||
properties of your X11 display (e.g. grep for "name" or "dimensions").
|
||||
|
||||
For example to grab from @file{:0.0} using @command{ffmpeg}:
|
||||
@example
|
||||
@@ -1154,10 +964,6 @@ If @var{show_region} is specified with @code{1}, then the grabbing
|
||||
region will be indicated on screen. With this option, it is easy to
|
||||
know what is being grabbed if only a portion of the screen is grabbed.
|
||||
|
||||
@item region_border
|
||||
Set the region border thickness if @option{-show_region 1} is used.
|
||||
Range is 1 to 128 and default is 3 (XCB-based x11grab only).
|
||||
|
||||
For example:
|
||||
@example
|
||||
ffmpeg -f x11grab -show_region 1 -framerate 25 -video_size cif -i :0.0+10,20 out.mpg
|
||||
@@ -1173,19 +979,61 @@ Set the video frame size. Default value is @code{vga}.
|
||||
|
||||
@item use_shm
|
||||
Use the MIT-SHM extension for shared memory. Default value is @code{1}.
|
||||
It may be necessary to disable it for remote displays (legacy x11grab
|
||||
only).
|
||||
It may be necessary to disable it for remote displays.
|
||||
@end table
|
||||
|
||||
@subsection @var{grab_x} @var{grab_y} AVOption
|
||||
@section decklink
|
||||
|
||||
The syntax is:
|
||||
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
|
||||
-grab_x @var{x_offset} -grab_y @var{y_offset}
|
||||
ffmpeg -f decklink -list_devices 1 -i dummy
|
||||
@end example
|
||||
|
||||
Set the grabbing region coordinates. They are expressed as offset from the top left
|
||||
corner of the X11 window. The default value is 0.
|
||||
@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
|
||||
|
@@ -1,5 +1,4 @@
|
||||
\input texinfo @c -*- texinfo -*-
|
||||
@documentencoding UTF-8
|
||||
|
||||
@settitle Libavcodec Documentation
|
||||
@titlepage
|
||||
|
@@ -1,5 +1,4 @@
|
||||
\input texinfo @c -*- texinfo -*-
|
||||
@documentencoding UTF-8
|
||||
|
||||
@settitle Libavdevice Documentation
|
||||
@titlepage
|
||||
|
@@ -1,5 +1,4 @@
|
||||
\input texinfo @c -*- texinfo -*-
|
||||
@documentencoding UTF-8
|
||||
|
||||
@settitle Libavfilter Documentation
|
||||
@titlepage
|
||||
|
@@ -1,5 +1,4 @@
|
||||
\input texinfo @c -*- texinfo -*-
|
||||
@documentencoding UTF-8
|
||||
|
||||
@settitle Libavformat Documentation
|
||||
@titlepage
|
||||
|
@@ -1,5 +1,4 @@
|
||||
\input texinfo @c -*- texinfo -*-
|
||||
@documentencoding UTF-8
|
||||
|
||||
@settitle Libavutil Documentation
|
||||
@titlepage
|
||||
|
@@ -1,5 +1,4 @@
|
||||
\input texinfo @c -*- texinfo -*-
|
||||
@documentencoding UTF-8
|
||||
|
||||
@settitle Libswresample Documentation
|
||||
@titlepage
|
||||
|
@@ -1,5 +1,4 @@
|
||||
\input texinfo @c -*- texinfo -*-
|
||||
@documentencoding UTF-8
|
||||
|
||||
@settitle Libswscale Documentation
|
||||
@titlepage
|
||||
|
@@ -254,15 +254,6 @@ 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_segment_filename @var{filename}
|
||||
Set the segment filename. Unless hls_flags single_file is set @var{filename}
|
||||
is used as a string format with the segment number:
|
||||
@example
|
||||
ffmpeg in.nut -hls_segment_filename 'file%03d.ts' out.m3u8
|
||||
@end example
|
||||
This example will produce the playlist, @file{out.m3u8}, and segment files:
|
||||
@file{file000.ts}, @file{file001.ts}, @file{file002.ts}, etc.
|
||||
|
||||
@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
|
||||
@@ -273,10 +264,6 @@ 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}.
|
||||
|
||||
@item hls_flags delete_segments
|
||||
Segment files removed from the playlist are deleted after a period of time
|
||||
equal to the duration of the segment plus the duration of the playlist.
|
||||
@end table
|
||||
|
||||
@anchor{ico}
|
||||
@@ -381,7 +368,8 @@ ffmpeg -f v4l2 -r 1 -i /dev/video0 -f image2 -strftime 1 "%Y-%m-%d_%H-%M-%S.jpg"
|
||||
|
||||
@table @option
|
||||
@item start_number
|
||||
Start the sequence from the specified number. Default value is 0.
|
||||
Start the sequence from the specified number. Default value is 1. Must
|
||||
be a non-negative number.
|
||||
|
||||
@item update
|
||||
If set to 1, the filename will always be interpreted as just a
|
||||
@@ -689,9 +677,6 @@ Set the transport_stream_id (default 0x0001). This identifies a
|
||||
transponder in DVB.
|
||||
@item -mpegts_service_id @var{number}
|
||||
Set the service_id (default 0x0001) also known as program in DVB.
|
||||
@item -mpegts_service_type @var{number}
|
||||
Set the program service_type (default @var{digital_tv}), see below
|
||||
a list of pre defined values.
|
||||
@item -mpegts_pmt_start_pid @var{number}
|
||||
Set the first PID for PMT (default 0x1000, max 0x1f00).
|
||||
@item -mpegts_start_pid @var{number}
|
||||
@@ -726,27 +711,6 @@ ffmpeg -i source2.ts -codec copy -f mpegts -tables_version 1 udp://1.1.1.1:1111
|
||||
@end example
|
||||
@end table
|
||||
|
||||
Option mpegts_service_type accepts the following values:
|
||||
|
||||
@table @option
|
||||
@item hex_value
|
||||
Any hexdecimal value between 0x01 to 0xff as defined in ETSI 300 468.
|
||||
@item digital_tv
|
||||
Digital TV service.
|
||||
@item digital_radio
|
||||
Digital Radio service.
|
||||
@item teletext
|
||||
Teletext service.
|
||||
@item advanced_codec_digital_radio
|
||||
Advanced Codec Digital Radio service.
|
||||
@item mpeg2_digital_hdtv
|
||||
MPEG2 Digital HDTV service.
|
||||
@item advanced_codec_digital_sdtv
|
||||
Advanced Codec Digital SDTV service.
|
||||
@item advanced_codec_digital_hdtv
|
||||
Advanced Codec Digital HDTV service.
|
||||
@end table
|
||||
|
||||
Option mpegts_flags may take a set of such flags:
|
||||
|
||||
@table @option
|
||||
@@ -804,7 +768,7 @@ Change the syncpoint usage in nut:
|
||||
sensitive and seeking is not possible. Also in general the overhead from
|
||||
syncpoints is negligible. Note, -@code{write_index} 0 can be used to disable
|
||||
all growing data tables, allowing to mux endless streams with limited memory
|
||||
and without these disadvantages.
|
||||
and wihout these disadvantages.
|
||||
@item @var{timestamped} extend the syncpoint with a wallclock field.
|
||||
@end table
|
||||
The @var{none} and @var{timestamped} flags are experimental.
|
||||
@@ -829,11 +793,6 @@ is 1 second. A value of 0 will fill all segments, making pages as large as
|
||||
possible. A value of 1 will effectively use 1 packet-per-page in most
|
||||
situations, giving a small seek granularity at the cost of additional container
|
||||
overhead.
|
||||
@item -serial_offset @var{value}
|
||||
Serial value from which to set the streams serial number.
|
||||
Setting it to different and sufficiently large values ensures that the produced
|
||||
ogg files can be safely chained.
|
||||
|
||||
@end table
|
||||
|
||||
@anchor{segment}
|
||||
@@ -842,9 +801,8 @@ ogg files can be safely chained.
|
||||
Basic stream segmenter.
|
||||
|
||||
This muxer outputs streams to a number of separate files of nearly
|
||||
fixed duration. Output filename pattern can be set in a fashion
|
||||
similar to @ref{image2}, or by using a @code{strftime} template if
|
||||
the @option{strftime} option is enabled.
|
||||
fixed duration. Output filename pattern can be set in a fashion similar to
|
||||
@ref{image2}.
|
||||
|
||||
@code{stream_segment} is a variant of the muxer used to write to
|
||||
streaming output formats, i.e. which do not require global headers,
|
||||
@@ -1024,12 +982,6 @@ Wrap around segment index once it reaches @var{limit}.
|
||||
@item segment_start_number @var{number}
|
||||
Set the sequence number of the first segment. Defaults to @code{0}.
|
||||
|
||||
@item strftime @var{1|0}
|
||||
Use the @code{strftime} function to define the name of the new
|
||||
segments to write. If this is selected, the output segment name must
|
||||
contain a @code{strftime} function template. Default value is
|
||||
@code{0}.
|
||||
|
||||
@item reset_timestamps @var{1|0}
|
||||
Reset timestamps at the begin of each segment, so that each segment
|
||||
will start with near-zero timestamps. It is meant to ease the playback
|
||||
|
@@ -1,5 +1,4 @@
|
||||
\input texinfo @c -*- texinfo -*-
|
||||
@documentencoding UTF-8
|
||||
|
||||
@settitle NUT
|
||||
|
||||
|
@@ -191,11 +191,6 @@ __asm__() block.
|
||||
Use external asm (nasm/yasm) or inline asm (__asm__()), do not use intrinsics.
|
||||
The latter requires a good optimizing compiler which gcc is not.
|
||||
|
||||
When debugging a x86 external asm compilation issue, if lost in the macro
|
||||
expansions, add DBG=1 to your make command-line: the input file will be
|
||||
preprocessed, stripped of the debug/empty lines, then compiled, showing the
|
||||
actual lines causing issues.
|
||||
|
||||
Inline asm vs. external asm
|
||||
---------------------------
|
||||
Both inline asm (__asm__("..") in a .c file, handled by a compiler such as gcc)
|
||||
|
@@ -1,5 +1,4 @@
|
||||
\input texinfo @c -*- texinfo -*-
|
||||
@documentencoding UTF-8
|
||||
|
||||
@settitle Platform Specific Information
|
||||
@titlepage
|
||||
@@ -97,9 +96,9 @@ the FFmpeg Windows Help Forum at @url{http://ffmpeg.zeranoe.com/forum/}.
|
||||
|
||||
@section Native Windows compilation using MinGW or MinGW-w64
|
||||
|
||||
FFmpeg can be built to run natively on Windows using the MinGW-w64
|
||||
toolchain. Install the latest versions of MSYS2 and MinGW-w64 from
|
||||
@url{http://msys2.github.io/} and/or @url{http://mingw-w64.sourceforge.net/}.
|
||||
FFmpeg can be built to run natively on Windows using the MinGW or MinGW-w64
|
||||
toolchains. Install the latest versions of MSYS and MinGW or MinGW-w64 from
|
||||
@url{http://www.mingw.org/} or @url{http://mingw-w64.sourceforge.net/}.
|
||||
You can find detailed installation instructions in the download section and
|
||||
the FAQ.
|
||||
|
||||
@@ -107,7 +106,7 @@ Notes:
|
||||
|
||||
@itemize
|
||||
|
||||
@item Building natively using MSYS2 can be sped up by disabling implicit rules
|
||||
@item Building natively using MSYS can be sped up by disabling implicit rules
|
||||
in the Makefile by calling @code{make -r} instead of plain @code{make}. This
|
||||
speed up is close to non-existent for normal one-off builds and is only
|
||||
noticeable when running make for a second time (for example during
|
||||
@@ -134,12 +133,11 @@ You will need the following prerequisites:
|
||||
(if using MSVC 2012 or earlier)
|
||||
@item @uref{http://code.google.com/p/msinttypes/, msinttypes}
|
||||
(if using MSVC 2012 or earlier)
|
||||
@item @uref{http://msys2.github.io/, MSYS2}
|
||||
@item @uref{http://www.mingw.org/, MSYS}
|
||||
@item @uref{http://yasm.tortall.net/, YASM}
|
||||
(Also available via MSYS2's package manager.)
|
||||
@end itemize
|
||||
|
||||
To set up a proper environment in MSYS2, you need to run @code{msys_shell.bat} from
|
||||
To set up a proper environment in MSYS, you need to run @code{msys.bat} from
|
||||
the Visual Studio or Intel Compiler command prompt.
|
||||
|
||||
Place @code{yasm.exe} somewhere in your @code{PATH}. If using MSVC 2012 or
|
||||
|
@@ -63,7 +63,7 @@ cache:@var{URL}
|
||||
|
||||
Physical concatenation protocol.
|
||||
|
||||
Read and seek from many resources in sequence as if they were
|
||||
Allow to read and seek from many resource in sequence as if they were
|
||||
a unique resource.
|
||||
|
||||
A URL accepted by this protocol has the syntax:
|
||||
@@ -117,7 +117,7 @@ ffmpeg -i "data:image/gif;base64,R0lGODdhCAAIAMIEAAAAAAAA//8AAP//AP/////////////
|
||||
|
||||
File access protocol.
|
||||
|
||||
Read from or write to a file.
|
||||
Allow to read from or write to a file.
|
||||
|
||||
A file URL can have the form:
|
||||
@example
|
||||
@@ -155,7 +155,7 @@ time, which is valuable for files on slow medium.
|
||||
|
||||
FTP (File Transfer Protocol).
|
||||
|
||||
Read from or write to remote resources using FTP protocol.
|
||||
Allow to read from or write to remote resources using FTP protocol.
|
||||
|
||||
Following syntax is required.
|
||||
@example
|
||||
@@ -374,7 +374,7 @@ be seekable, so they will fail with the MD5 output protocol.
|
||||
|
||||
UNIX pipe access protocol.
|
||||
|
||||
Read and write from UNIX pipes.
|
||||
Allow to read and write from UNIX pipes.
|
||||
|
||||
The accepted syntax is:
|
||||
@example
|
||||
@@ -614,7 +614,7 @@ For more information see: @url{http://www.samba.org/}.
|
||||
|
||||
Secure File Transfer Protocol via libssh
|
||||
|
||||
Read from or write to remote resources using SFTP protocol.
|
||||
Allow to read from or write to remote resources using SFTP protocol.
|
||||
|
||||
Following syntax is required.
|
||||
|
||||
|
122
doc/t2h.pm
122
doc/t2h.pm
@@ -23,108 +23,8 @@
|
||||
# no navigation elements
|
||||
set_from_init_file('HEADERS', 0);
|
||||
|
||||
sub ffmpeg_heading_command($$$$$)
|
||||
{
|
||||
my $self = shift;
|
||||
my $cmdname = shift;
|
||||
my $command = shift;
|
||||
my $args = shift;
|
||||
my $content = shift;
|
||||
|
||||
my $result = '';
|
||||
|
||||
# not clear that it may really happen
|
||||
if ($self->in_string) {
|
||||
$result .= $self->command_string($command) ."\n" if ($cmdname ne 'node');
|
||||
$result .= $content if (defined($content));
|
||||
return $result;
|
||||
}
|
||||
|
||||
my $element_id = $self->command_id($command);
|
||||
$result .= "<a name=\"$element_id\"></a>\n"
|
||||
if (defined($element_id) and $element_id ne '');
|
||||
|
||||
print STDERR "Process $command "
|
||||
.Texinfo::Structuring::_print_root_command_texi($command)."\n"
|
||||
if ($self->get_conf('DEBUG'));
|
||||
my $element;
|
||||
if ($Texinfo::Common::root_commands{$command->{'cmdname'}}
|
||||
and $command->{'parent'}
|
||||
and $command->{'parent'}->{'type'}
|
||||
and $command->{'parent'}->{'type'} eq 'element') {
|
||||
$element = $command->{'parent'};
|
||||
}
|
||||
if ($element) {
|
||||
$result .= &{$self->{'format_element_header'}}($self, $cmdname,
|
||||
$command, $element);
|
||||
}
|
||||
|
||||
my $heading_level;
|
||||
# node is used as heading if there is nothing else.
|
||||
if ($cmdname eq 'node') {
|
||||
if (!$element or (!$element->{'extra'}->{'section'}
|
||||
and $element->{'extra'}->{'node'}
|
||||
and $element->{'extra'}->{'node'} eq $command
|
||||
# bogus node may not have been normalized
|
||||
and defined($command->{'extra'}->{'normalized'}))) {
|
||||
if ($command->{'extra'}->{'normalized'} eq 'Top') {
|
||||
$heading_level = 0;
|
||||
} else {
|
||||
$heading_level = 3;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$heading_level = $command->{'level'};
|
||||
}
|
||||
|
||||
my $heading = $self->command_text($command);
|
||||
# $heading not defined may happen if the command is a @node, for example
|
||||
# if there is an error in the node.
|
||||
if (defined($heading) and $heading ne '' and defined($heading_level)) {
|
||||
|
||||
if ($Texinfo::Common::root_commands{$cmdname}
|
||||
and $Texinfo::Common::sectioning_commands{$cmdname}) {
|
||||
my $content_href = $self->command_contents_href($command, 'contents',
|
||||
$self->{'current_filename'});
|
||||
if ($content_href) {
|
||||
my $this_href = $content_href =~ s/^\#toc-/\#/r;
|
||||
$heading .= '<span class="pull-right">'.
|
||||
'<a class="anchor hidden-xs" '.
|
||||
"href=\"$this_href\" aria-hidden=\"true\">".
|
||||
($ENV{"FA_ICONS"} ? '<i class="fa fa-link"></i>'
|
||||
: '#').
|
||||
'</a> '.
|
||||
'<a class="anchor hidden-xs"'.
|
||||
"href=\"$content_href\" aria-hidden=\"true\">".
|
||||
($ENV{"FA_ICONS"} ? '<i class="fa fa-navicon"></i>'
|
||||
: 'TOC').
|
||||
'</a>'.
|
||||
'</span>';
|
||||
}
|
||||
}
|
||||
|
||||
if ($self->in_preformatted()) {
|
||||
$result .= $heading."\n";
|
||||
} else {
|
||||
# if the level was changed, set the command name right
|
||||
if ($cmdname ne 'node'
|
||||
and $heading_level ne $Texinfo::Common::command_structuring_level{$cmdname}) {
|
||||
$cmdname
|
||||
= $Texinfo::Common::level_to_structuring_command{$cmdname}->[$heading_level];
|
||||
}
|
||||
$result .= &{$self->{'format_heading_text'}}(
|
||||
$self, $cmdname, $heading,
|
||||
$heading_level +
|
||||
$self->get_conf('CHAPTER_HEADER_LEVEL') - 1, $command);
|
||||
}
|
||||
}
|
||||
$result .= $content if (defined($content));
|
||||
return $result;
|
||||
}
|
||||
|
||||
foreach my $command (keys(%Texinfo::Common::sectioning_commands), 'node') {
|
||||
texinfo_register_command_formatting($command, \&ffmpeg_heading_command);
|
||||
}
|
||||
# TOC and Chapter headings link
|
||||
set_from_init_file('TOC_LINKS', 1);
|
||||
|
||||
# print the TOC where @contents is used
|
||||
set_from_init_file('INLINE_CONTENTS', 1);
|
||||
@@ -169,7 +69,6 @@ EOT
|
||||
|
||||
my $head2 = $ENV{"FFMPEG_HEADER2"} || <<EOT;
|
||||
</title>
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<link rel="stylesheet" type="text/css" href="bootstrap.min.css">
|
||||
<link rel="stylesheet" type="text/css" href="style.min.css">
|
||||
</head>
|
||||
@@ -186,23 +85,6 @@ EOT
|
||||
}
|
||||
texinfo_register_formatting_function('begin_file', \&ffmpeg_begin_file);
|
||||
|
||||
sub ffmpeg_program_string($)
|
||||
{
|
||||
my $self = shift;
|
||||
if (defined($self->get_conf('PROGRAM'))
|
||||
and $self->get_conf('PROGRAM') ne ''
|
||||
and defined($self->get_conf('PACKAGE_URL'))) {
|
||||
return $self->convert_tree(
|
||||
$self->gdt('This document was generated using @uref{{program_homepage}, @emph{{program}}}.',
|
||||
{ 'program_homepage' => $self->get_conf('PACKAGE_URL'),
|
||||
'program' => $self->get_conf('PROGRAM') }));
|
||||
} else {
|
||||
return $self->convert_tree(
|
||||
$self->gdt('This document was generated automatically.'));
|
||||
}
|
||||
}
|
||||
texinfo_register_formatting_function('program_string', \&ffmpeg_program_string);
|
||||
|
||||
# Customized file ending
|
||||
sub ffmpeg_end_file($)
|
||||
{
|
||||
|
232
ffmpeg.c
232
ffmpeg.c
@@ -62,6 +62,8 @@
|
||||
#include "libavutil/threadmessage.h"
|
||||
#include "libavformat/os_support.h"
|
||||
|
||||
#include "libavformat/ffm.h" // not public API
|
||||
|
||||
# include "libavfilter/avcodec.h"
|
||||
# include "libavfilter/avfilter.h"
|
||||
# include "libavfilter/buffersrc.h"
|
||||
@@ -153,9 +155,8 @@ static struct termios oldtty;
|
||||
static int restore_tty;
|
||||
#endif
|
||||
|
||||
#if HAVE_PTHREADS
|
||||
static void free_input_threads(void);
|
||||
#endif
|
||||
|
||||
|
||||
/* sub2video hack:
|
||||
Convert subtitles to video with alpha to insert them in filter graphs.
|
||||
@@ -455,12 +456,9 @@ static void ffmpeg_cleanup(int ret)
|
||||
/* close files */
|
||||
for (i = 0; i < nb_output_files; i++) {
|
||||
OutputFile *of = output_files[i];
|
||||
AVFormatContext *s;
|
||||
if (!of)
|
||||
continue;
|
||||
s = of->ctx;
|
||||
if (s && s->oformat && !(s->oformat->flags & AVFMT_NOFILE))
|
||||
avio_closep(&s->pb);
|
||||
AVFormatContext *s = of->ctx;
|
||||
if (s && s->oformat && !(s->oformat->flags & AVFMT_NOFILE) && s->pb)
|
||||
avio_close(s->pb);
|
||||
avformat_free_context(s);
|
||||
av_dict_free(&of->opts);
|
||||
|
||||
@@ -468,12 +466,7 @@ static void ffmpeg_cleanup(int ret)
|
||||
}
|
||||
for (i = 0; i < nb_output_streams; i++) {
|
||||
OutputStream *ost = output_streams[i];
|
||||
AVBitStreamFilterContext *bsfc;
|
||||
|
||||
if (!ost)
|
||||
continue;
|
||||
|
||||
bsfc = ost->bitstream_filters;
|
||||
AVBitStreamFilterContext *bsfc = ost->bitstream_filters;
|
||||
while (bsfc) {
|
||||
AVBitStreamFilterContext *next = bsfc->next;
|
||||
av_bitstream_filter_close(bsfc);
|
||||
@@ -522,7 +515,7 @@ static void ffmpeg_cleanup(int ret)
|
||||
|
||||
if (vstats_file)
|
||||
fclose(vstats_file);
|
||||
av_freep(&vstats_filename);
|
||||
av_free(vstats_filename);
|
||||
|
||||
av_freep(&input_streams);
|
||||
av_freep(&input_files);
|
||||
@@ -657,7 +650,6 @@ static void write_frame(AVFormatContext *s, AVPacket *pkt, OutputStream *ost)
|
||||
if (!new_pkt.buf)
|
||||
exit_program(1);
|
||||
} else if (a < 0) {
|
||||
new_pkt = *pkt;
|
||||
av_log(NULL, AV_LOG_ERROR, "Failed to open bitstream filter %s for stream %d with codec %s",
|
||||
bsfc->filter->name, pkt->stream_index,
|
||||
avctx->codec ? avctx->codec->name : "copy");
|
||||
@@ -826,10 +818,6 @@ static void do_subtitle_out(AVFormatContext *s,
|
||||
|
||||
if (!subtitle_out) {
|
||||
subtitle_out = av_malloc(subtitle_out_max_size);
|
||||
if (!subtitle_out) {
|
||||
av_log(NULL, AV_LOG_FATAL, "Failed to allocate subtitle_out\n");
|
||||
exit_program(1);
|
||||
}
|
||||
}
|
||||
|
||||
/* Note: DVB subtitle need one packet to draw them and one other
|
||||
@@ -890,29 +878,23 @@ static void do_subtitle_out(AVFormatContext *s,
|
||||
|
||||
static void do_video_out(AVFormatContext *s,
|
||||
OutputStream *ost,
|
||||
AVFrame *next_picture,
|
||||
double sync_ipts)
|
||||
AVFrame *next_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 delta, delta0;
|
||||
double sync_ipts, delta, delta0;
|
||||
double duration = 0;
|
||||
int frame_size = 0;
|
||||
InputStream *ist = NULL;
|
||||
AVFilterContext *filter = ost->filter->filter;
|
||||
|
||||
if (ost->source_index >= 0)
|
||||
ist = input_streams[ost->source_index];
|
||||
|
||||
if (filter->inputs[0]->frame_rate.num > 0 &&
|
||||
filter->inputs[0]->frame_rate.den > 0)
|
||||
duration = 1/(av_q2d(filter->inputs[0]->frame_rate) * av_q2d(enc->time_base));
|
||||
|
||||
if(ist && ist->st->start_time != AV_NOPTS_VALUE && ist->st->first_dts != AV_NOPTS_VALUE && ost->frame_rate.num)
|
||||
duration = FFMIN(duration, 1/(av_q2d(ost->frame_rate) * av_q2d(enc->time_base)));
|
||||
duration = 1/(av_q2d(ost->frame_rate) * av_q2d(enc->time_base));
|
||||
|
||||
if (!ost->filters_script &&
|
||||
!ost->filters &&
|
||||
@@ -922,6 +904,7 @@ static void do_video_out(AVFormatContext *s,
|
||||
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;
|
||||
|
||||
@@ -951,10 +934,7 @@ static void do_video_out(AVFormatContext *s,
|
||||
format_video_sync != VSYNC_PASSTHROUGH &&
|
||||
format_video_sync != VSYNC_DROP) {
|
||||
double cor = FFMIN(-delta0, duration);
|
||||
if (delta0 < -0.6) {
|
||||
av_log(NULL, AV_LOG_WARNING, "Past duration %f too large\n", -delta0);
|
||||
} else
|
||||
av_log(NULL, AV_LOG_DEBUG, "Cliping frame in rate conversion by %f\n", -delta0);
|
||||
av_log(NULL, AV_LOG_WARNING, "Past duration %f too large\n", -delta0);
|
||||
sync_ipts += cor;
|
||||
duration -= cor;
|
||||
delta0 += cor;
|
||||
@@ -970,9 +950,7 @@ static void do_video_out(AVFormatContext *s,
|
||||
}
|
||||
case VSYNC_CFR:
|
||||
// FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
|
||||
if (frame_drop_threshold && delta < frame_drop_threshold && ost->frame_number) {
|
||||
nb_frames = 0;
|
||||
} else if (delta < -1.1)
|
||||
if (delta < -1.1)
|
||||
nb_frames = 0;
|
||||
else if (delta > 1.1) {
|
||||
nb_frames = lrintf(delta);
|
||||
@@ -1164,10 +1142,7 @@ static void do_video_out(AVFormatContext *s,
|
||||
if (!ost->last_frame)
|
||||
ost->last_frame = av_frame_alloc();
|
||||
av_frame_unref(ost->last_frame);
|
||||
if (next_picture && ost->last_frame)
|
||||
av_frame_ref(ost->last_frame, next_picture);
|
||||
else
|
||||
av_frame_free(&ost->last_frame);
|
||||
av_frame_ref(ost->last_frame, next_picture);
|
||||
}
|
||||
|
||||
static double psnr(double d)
|
||||
@@ -1193,8 +1168,8 @@ static void do_video_stats(OutputStream *ost, int frame_size)
|
||||
enc = ost->enc_ctx;
|
||||
if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
|
||||
frame_number = ost->st->nb_frames;
|
||||
fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame ? enc->coded_frame->quality / (float)FF_QP2LAMBDA : 0);
|
||||
if (enc->coded_frame && (enc->flags&CODEC_FLAG_PSNR))
|
||||
fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality / (float)FF_QP2LAMBDA);
|
||||
if (enc->flags&CODEC_FLAG_PSNR)
|
||||
fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0] / (enc->width * enc->height * 255.0 * 255.0)));
|
||||
|
||||
fprintf(vstats_file,"f_size= %6d ", frame_size);
|
||||
@@ -1207,7 +1182,7 @@ static void do_video_stats(OutputStream *ost, int frame_size)
|
||||
avg_bitrate = (double)(ost->data_size * 8) / ti1 / 1000.0;
|
||||
fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
|
||||
(double)ost->data_size / 1024, ti1, bitrate, avg_bitrate);
|
||||
fprintf(vstats_file, "type= %c\n", enc->coded_frame ? av_get_picture_type_char(enc->coded_frame->pict_type) : 'I');
|
||||
fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1234,6 +1209,7 @@ static int reap_filters(void)
|
||||
{
|
||||
AVFrame *filtered_frame = NULL;
|
||||
int i;
|
||||
int64_t frame_pts;
|
||||
|
||||
/* Reap all buffers present in the buffer sinks */
|
||||
for (i = 0; i < nb_output_streams; i++) {
|
||||
@@ -1253,7 +1229,6 @@ static int reap_filters(void)
|
||||
filtered_frame = ost->filtered_frame;
|
||||
|
||||
while (1) {
|
||||
double float_pts = AV_NOPTS_VALUE; // this is identical to filtered_frame.pts but with higher precision
|
||||
ret = av_buffersink_get_frame_flags(filter, filtered_frame,
|
||||
AV_BUFFERSINK_FLAG_NO_REQUEST);
|
||||
if (ret < 0) {
|
||||
@@ -1267,20 +1242,10 @@ static int reap_filters(void)
|
||||
av_frame_unref(filtered_frame);
|
||||
continue;
|
||||
}
|
||||
frame_pts = AV_NOPTS_VALUE;
|
||||
if (filtered_frame->pts != AV_NOPTS_VALUE) {
|
||||
int64_t start_time = (of->start_time == AV_NOPTS_VALUE) ? 0 : of->start_time;
|
||||
AVRational tb = enc->time_base;
|
||||
int extra_bits = av_clip(29 - av_log2(tb.den), 0, 16);
|
||||
|
||||
tb.den <<= extra_bits;
|
||||
float_pts =
|
||||
av_rescale_q(filtered_frame->pts, filter->inputs[0]->time_base, tb) -
|
||||
av_rescale_q(start_time, AV_TIME_BASE_Q, tb);
|
||||
float_pts /= 1 << extra_bits;
|
||||
// avoid exact midoints to reduce the chance of rounding differences, this can be removed in case the fps code is changed to work with integers
|
||||
float_pts += FFSIGN(float_pts) * 1.0 / (1<<17);
|
||||
|
||||
filtered_frame->pts =
|
||||
filtered_frame->pts = frame_pts =
|
||||
av_rescale_q(filtered_frame->pts, filter->inputs[0]->time_base, enc->time_base) -
|
||||
av_rescale_q(start_time, AV_TIME_BASE_Q, enc->time_base);
|
||||
}
|
||||
@@ -1289,19 +1254,20 @@ static int reap_filters(void)
|
||||
|
||||
switch (filter->inputs[0]->type) {
|
||||
case AVMEDIA_TYPE_VIDEO:
|
||||
filtered_frame->pts = frame_pts;
|
||||
if (!ost->frame_aspect_ratio.num)
|
||||
enc->sample_aspect_ratio = filtered_frame->sample_aspect_ratio;
|
||||
|
||||
if (debug_ts) {
|
||||
av_log(NULL, AV_LOG_INFO, "filter -> pts:%s pts_time:%s exact:%f time_base:%d/%d\n",
|
||||
av_log(NULL, AV_LOG_INFO, "filter -> pts:%s pts_time:%s time_base:%d/%d\n",
|
||||
av_ts2str(filtered_frame->pts), av_ts2timestr(filtered_frame->pts, &enc->time_base),
|
||||
float_pts,
|
||||
enc->time_base.num, enc->time_base.den);
|
||||
}
|
||||
|
||||
do_video_out(of->ctx, ost, filtered_frame, float_pts);
|
||||
do_video_out(of->ctx, ost, filtered_frame);
|
||||
break;
|
||||
case AVMEDIA_TYPE_AUDIO:
|
||||
filtered_frame->pts = frame_pts;
|
||||
if (!(enc->codec->capabilities & CODEC_CAP_PARAM_CHANGE) &&
|
||||
enc->channels != av_frame_get_channels(filtered_frame)) {
|
||||
av_log(NULL, AV_LOG_ERROR,
|
||||
@@ -1539,8 +1505,8 @@ static void print_report(int is_last_report, int64_t timer_start, int64_t cur_ti
|
||||
nb_frames_drop += ost->last_droped;
|
||||
}
|
||||
|
||||
secs = FFABS(pts) / AV_TIME_BASE;
|
||||
us = FFABS(pts) % AV_TIME_BASE;
|
||||
secs = pts / AV_TIME_BASE;
|
||||
us = pts % AV_TIME_BASE;
|
||||
mins = secs / 60;
|
||||
secs %= 60;
|
||||
hours = mins / 60;
|
||||
@@ -1552,20 +1518,13 @@ static void print_report(int is_last_report, int64_t timer_start, int64_t cur_ti
|
||||
"size=N/A time=");
|
||||
else snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
|
||||
"size=%8.0fkB time=", total_size / 1024.0);
|
||||
if (pts < 0)
|
||||
snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "-");
|
||||
snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
|
||||
"%02d:%02d:%02d.%02d ", hours, mins, secs,
|
||||
(100 * us) / AV_TIME_BASE);
|
||||
|
||||
if (bitrate < 0) {
|
||||
snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),"bitrate=N/A");
|
||||
av_bprintf(&buf_script, "bitrate=N/A\n");
|
||||
}else{
|
||||
snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),"bitrate=%6.1fkbits/s", bitrate);
|
||||
av_bprintf(&buf_script, "bitrate=%6.1fkbits/s\n", bitrate);
|
||||
}
|
||||
|
||||
if (bitrate < 0) snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
|
||||
"bitrate=N/A");
|
||||
else snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
|
||||
"bitrate=%6.1fkbits/s", bitrate);
|
||||
if (total_size < 0) av_bprintf(&buf_script, "total_size=N/A\n");
|
||||
else av_bprintf(&buf_script, "total_size=%"PRId64"\n", total_size);
|
||||
av_bprintf(&buf_script, "out_time_ms=%"PRId64"\n", pts);
|
||||
@@ -1596,7 +1555,8 @@ static void print_report(int is_last_report, int64_t timer_start, int64_t cur_ti
|
||||
avio_flush(progress_avio);
|
||||
av_bprint_finalize(&buf_script, NULL);
|
||||
if (is_last_report) {
|
||||
avio_closep(&progress_avio);
|
||||
avio_close(progress_avio);
|
||||
progress_avio = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1767,21 +1727,17 @@ static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *p
|
||||
|
||||
opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
|
||||
opkt.flags = pkt->flags;
|
||||
|
||||
// FIXME remove the following 2 lines they shall be replaced by the bitstream filters
|
||||
if ( ost->st->codec->codec_id != AV_CODEC_ID_H264
|
||||
&& ost->st->codec->codec_id != AV_CODEC_ID_MPEG1VIDEO
|
||||
&& ost->st->codec->codec_id != AV_CODEC_ID_MPEG2VIDEO
|
||||
&& ost->st->codec->codec_id != AV_CODEC_ID_VC1
|
||||
if ( ost->enc_ctx->codec_id != AV_CODEC_ID_H264
|
||||
&& ost->enc_ctx->codec_id != AV_CODEC_ID_MPEG1VIDEO
|
||||
&& ost->enc_ctx->codec_id != AV_CODEC_ID_MPEG2VIDEO
|
||||
&& ost->enc_ctx->codec_id != AV_CODEC_ID_VC1
|
||||
) {
|
||||
int ret = av_parser_change(ost->parser, ost->st->codec,
|
||||
if (av_parser_change(ost->parser, ost->st->codec,
|
||||
&opkt.data, &opkt.size,
|
||||
pkt->data, pkt->size,
|
||||
pkt->flags & AV_PKT_FLAG_KEY);
|
||||
if (ret < 0) {
|
||||
av_log(NULL, AV_LOG_FATAL, "av_parser_change failed\n");
|
||||
exit_program(1);
|
||||
}
|
||||
if (ret) {
|
||||
pkt->flags & AV_PKT_FLAG_KEY)) {
|
||||
opkt.buf = av_buffer_create(opkt.data, opkt.size, av_buffer_default_free, NULL, 0);
|
||||
if (!opkt.buf)
|
||||
exit_program(1);
|
||||
@@ -1792,15 +1748,9 @@ static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *p
|
||||
}
|
||||
av_copy_packet_side_data(&opkt, pkt);
|
||||
|
||||
if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
|
||||
ost->st->codec->codec_id == AV_CODEC_ID_RAWVIDEO &&
|
||||
(of->ctx->oformat->flags & AVFMT_RAWPICTURE)) {
|
||||
if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (of->ctx->oformat->flags & AVFMT_RAWPICTURE)) {
|
||||
/* store AVPicture in AVPacket, as expected by the output format */
|
||||
int ret = avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height);
|
||||
if (ret < 0) {
|
||||
av_log(NULL, AV_LOG_FATAL, "avpicture_fill failed\n");
|
||||
exit_program(1);
|
||||
}
|
||||
avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height);
|
||||
opkt.data = (uint8_t *)&pict;
|
||||
opkt.size = sizeof(AVPicture);
|
||||
opkt.flags |= AV_PKT_FLAG_KEY;
|
||||
@@ -1851,12 +1801,9 @@ static int decode_audio(InputStream *ist, AVPacket *pkt, int *got_output)
|
||||
ret = AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
if (*got_output || ret<0)
|
||||
if (*got_output || ret<0 || pkt->size)
|
||||
decode_error_stat[ret<0] ++;
|
||||
|
||||
if (ret < 0 && exit_on_error)
|
||||
exit_program(1);
|
||||
|
||||
if (!*got_output || ret < 0) {
|
||||
if (!pkt->size) {
|
||||
for (i = 0; i < ist->nb_filters; i++)
|
||||
@@ -1999,12 +1946,9 @@ static int decode_video(InputStream *ist, AVPacket *pkt, int *got_output)
|
||||
);
|
||||
}
|
||||
|
||||
if (*got_output || ret<0)
|
||||
if (*got_output || ret<0 || pkt->size)
|
||||
decode_error_stat[ret<0] ++;
|
||||
|
||||
if (ret < 0 && exit_on_error)
|
||||
exit_program(1);
|
||||
|
||||
if (*got_output && ret >= 0) {
|
||||
if (ist->dec_ctx->width != decoded_frame->width ||
|
||||
ist->dec_ctx->height != decoded_frame->height ||
|
||||
@@ -2120,12 +2064,9 @@ static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output)
|
||||
int i, ret = avcodec_decode_subtitle2(ist->dec_ctx,
|
||||
&subtitle, got_output, pkt);
|
||||
|
||||
if (*got_output || ret<0)
|
||||
if (*got_output || ret<0 || pkt->size)
|
||||
decode_error_stat[ret<0] ++;
|
||||
|
||||
if (ret < 0 && exit_on_error)
|
||||
exit_program(1);
|
||||
|
||||
if (ret < 0 || !*got_output) {
|
||||
if (!pkt->size)
|
||||
sub2video_flush(ist);
|
||||
@@ -2324,38 +2265,16 @@ static void print_sdp(void)
|
||||
{
|
||||
char sdp[16384];
|
||||
int i;
|
||||
int j;
|
||||
AVIOContext *sdp_pb;
|
||||
AVFormatContext **avc = av_malloc_array(nb_output_files, sizeof(*avc));
|
||||
|
||||
if (!avc)
|
||||
exit_program(1);
|
||||
for (i = 0, j = 0; i < nb_output_files; i++) {
|
||||
if (!strcmp(output_files[i]->ctx->oformat->name, "rtp")) {
|
||||
avc[j] = output_files[i]->ctx;
|
||||
j++;
|
||||
}
|
||||
}
|
||||
for (i = 0; i < nb_output_files; i++)
|
||||
avc[i] = output_files[i]->ctx;
|
||||
|
||||
if (!j)
|
||||
goto fail;
|
||||
|
||||
av_sdp_create(avc, j, sdp, sizeof(sdp));
|
||||
|
||||
if (!sdp_filename) {
|
||||
printf("SDP:\n%s\n", sdp);
|
||||
fflush(stdout);
|
||||
} else {
|
||||
if (avio_open2(&sdp_pb, sdp_filename, AVIO_FLAG_WRITE, &int_cb, NULL) < 0) {
|
||||
av_log(NULL, AV_LOG_ERROR, "Failed to open sdp file '%s'\n", sdp_filename);
|
||||
} else {
|
||||
avio_printf(sdp_pb, "SDP:\n%s", sdp);
|
||||
avio_closep(&sdp_pb);
|
||||
av_freep(&sdp_filename);
|
||||
}
|
||||
}
|
||||
|
||||
fail:
|
||||
av_sdp_create(avc, nb_output_files, sdp, sizeof(sdp));
|
||||
printf("SDP:\n%s\n", sdp);
|
||||
fflush(stdout);
|
||||
av_freep(&avc);
|
||||
}
|
||||
|
||||
@@ -2822,7 +2741,6 @@ static int transcode_init(void)
|
||||
sar = dec_ctx->sample_aspect_ratio;
|
||||
ost->st->sample_aspect_ratio = enc_ctx->sample_aspect_ratio = sar;
|
||||
ost->st->avg_frame_rate = ist->st->avg_frame_rate;
|
||||
ost->st->r_frame_rate = ist->st->r_frame_rate;
|
||||
break;
|
||||
case AVMEDIA_TYPE_SUBTITLE:
|
||||
enc_ctx->width = dec_ctx->width;
|
||||
@@ -2883,7 +2801,6 @@ static int transcode_init(void)
|
||||
int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
|
||||
ost->frame_rate = ost->enc->supported_framerates[idx];
|
||||
}
|
||||
// reduce frame rate for mpeg4 to be within the spec limits
|
||||
if (enc_ctx->codec_id == AV_CODEC_ID_MPEG4) {
|
||||
av_reduce(&ost->frame_rate.num, &ost->frame_rate.den,
|
||||
ost->frame_rate.num, ost->frame_rate.den, 65535);
|
||||
@@ -2968,8 +2885,6 @@ static int transcode_init(void)
|
||||
enc_ctx->height = input_streams[ost->source_index]->st->codec->height;
|
||||
}
|
||||
break;
|
||||
case AVMEDIA_TYPE_DATA:
|
||||
break;
|
||||
default:
|
||||
abort();
|
||||
break;
|
||||
@@ -3008,37 +2923,6 @@ static int transcode_init(void)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ost->disposition) {
|
||||
static const AVOption opts[] = {
|
||||
{ "disposition" , NULL, 0, AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT64_MIN, INT64_MAX, .unit = "flags" },
|
||||
{ "default" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_DEFAULT }, .unit = "flags" },
|
||||
{ "dub" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_DUB }, .unit = "flags" },
|
||||
{ "original" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_ORIGINAL }, .unit = "flags" },
|
||||
{ "comment" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_COMMENT }, .unit = "flags" },
|
||||
{ "lyrics" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_LYRICS }, .unit = "flags" },
|
||||
{ "karaoke" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_KARAOKE }, .unit = "flags" },
|
||||
{ "forced" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_FORCED }, .unit = "flags" },
|
||||
{ "hearing_impaired" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_HEARING_IMPAIRED }, .unit = "flags" },
|
||||
{ "visual_impaired" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_VISUAL_IMPAIRED }, .unit = "flags" },
|
||||
{ "clean_effects" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_CLEAN_EFFECTS }, .unit = "flags" },
|
||||
{ "captions" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_CAPTIONS }, .unit = "flags" },
|
||||
{ "descriptions" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_DESCRIPTIONS }, .unit = "flags" },
|
||||
{ "metadata" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_METADATA }, .unit = "flags" },
|
||||
{ NULL },
|
||||
};
|
||||
static const AVClass class = {
|
||||
.class_name = "",
|
||||
.item_name = av_default_item_name,
|
||||
.option = opts,
|
||||
.version = LIBAVUTIL_VERSION_INT,
|
||||
};
|
||||
const AVClass *pclass = &class;
|
||||
|
||||
ret = av_opt_eval_flags(&pclass, &opts[0], ost->disposition, &ost->st->disposition);
|
||||
if (ret < 0)
|
||||
goto dump_format;
|
||||
}
|
||||
}
|
||||
|
||||
/* open each encoder */
|
||||
@@ -3234,7 +3118,7 @@ static int transcode_init(void)
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (sdp_filename || want_sdp) {
|
||||
if (want_sdp) {
|
||||
print_sdp();
|
||||
}
|
||||
|
||||
@@ -3393,7 +3277,6 @@ static int check_keyboard_interaction(int64_t cur_time)
|
||||
static void *input_thread(void *arg)
|
||||
{
|
||||
InputFile *f = arg;
|
||||
unsigned flags = f->non_blocking ? AV_THREAD_MESSAGE_NONBLOCK : 0;
|
||||
int ret = 0;
|
||||
|
||||
while (1) {
|
||||
@@ -3409,15 +3292,7 @@ static void *input_thread(void *arg)
|
||||
break;
|
||||
}
|
||||
av_dup_packet(&pkt);
|
||||
ret = av_thread_message_queue_send(f->in_thread_queue, &pkt, flags);
|
||||
if (flags && ret == AVERROR(EAGAIN)) {
|
||||
flags = 0;
|
||||
ret = av_thread_message_queue_send(f->in_thread_queue, &pkt, flags);
|
||||
av_log(f->ctx, AV_LOG_WARNING,
|
||||
"Thread message queue blocking; consider raising the "
|
||||
"thread_queue_size option (current value: %d)\n",
|
||||
f->thread_queue_size);
|
||||
}
|
||||
ret = av_thread_message_queue_send(f->in_thread_queue, &pkt, 0);
|
||||
if (ret < 0) {
|
||||
if (ret != AVERROR_EOF)
|
||||
av_log(f->ctx, AV_LOG_ERROR,
|
||||
@@ -3466,7 +3341,7 @@ static int init_input_threads(void)
|
||||
strcmp(f->ctx->iformat->name, "lavfi"))
|
||||
f->non_blocking = 1;
|
||||
ret = av_thread_message_queue_alloc(&f->in_thread_queue,
|
||||
f->thread_queue_size, sizeof(AVPacket));
|
||||
8, sizeof(AVPacket));
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
@@ -3959,7 +3834,6 @@ static int transcode(void)
|
||||
}
|
||||
av_freep(&ost->forced_kf_pts);
|
||||
av_freep(&ost->apad);
|
||||
av_freep(&ost->disposition);
|
||||
av_dict_free(&ost->encoder_opts);
|
||||
av_dict_free(&ost->swr_opts);
|
||||
av_dict_free(&ost->resample_opts);
|
||||
|
7
ffmpeg.h
7
ffmpeg.h
@@ -111,7 +111,6 @@ typedef struct OptionsContext {
|
||||
int64_t input_ts_offset;
|
||||
int rate_emu;
|
||||
int accurate_seek;
|
||||
int thread_queue_size;
|
||||
|
||||
SpecifierOpt *ts_scale;
|
||||
int nb_ts_scale;
|
||||
@@ -207,8 +206,6 @@ typedef struct OptionsContext {
|
||||
int nb_apad;
|
||||
SpecifierOpt *discard;
|
||||
int nb_discard;
|
||||
SpecifierOpt *disposition;
|
||||
int nb_disposition;
|
||||
} OptionsContext;
|
||||
|
||||
typedef struct InputFilter {
|
||||
@@ -351,7 +348,6 @@ typedef struct InputFile {
|
||||
pthread_t thread; /* thread reading from this file */
|
||||
int non_blocking; /* reading packets from the thread should not block */
|
||||
int joined; /* the thread has been joined */
|
||||
int thread_queue_size; /* maximum number of queued packets */
|
||||
#endif
|
||||
} InputFile;
|
||||
|
||||
@@ -434,7 +430,6 @@ typedef struct OutputStream {
|
||||
const char *attachment_filename;
|
||||
int copy_initial_nonkeyframes;
|
||||
int copy_prior_start;
|
||||
char *disposition;
|
||||
|
||||
int keep_pix_fmt;
|
||||
|
||||
@@ -475,7 +470,6 @@ extern FilterGraph **filtergraphs;
|
||||
extern int nb_filtergraphs;
|
||||
|
||||
extern char *vstats_filename;
|
||||
extern char *sdp_filename;
|
||||
|
||||
extern float audio_drift_threshold;
|
||||
extern float dts_delta_threshold;
|
||||
@@ -484,7 +478,6 @@ extern float dts_error_threshold;
|
||||
extern int audio_volume;
|
||||
extern int audio_sync_method;
|
||||
extern int video_sync_method;
|
||||
extern float frame_drop_threshold;
|
||||
extern int do_benchmark;
|
||||
extern int do_benchmark_all;
|
||||
extern int do_deinterlace;
|
||||
|
@@ -52,7 +52,6 @@ DEFINE_GUID(DXVA2_ModeH264_F, 0x1b81be69, 0xa0c7,0x11d3,0xb9,0x84,0x00,0
|
||||
DEFINE_GUID(DXVADDI_Intel_ModeH264_E, 0x604F8E68, 0x4951,0x4C54,0x88,0xFE,0xAB,0xD2,0x5C,0x15,0xB3,0xD6);
|
||||
DEFINE_GUID(DXVA2_ModeVC1_D, 0x1b81beA3, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5);
|
||||
DEFINE_GUID(DXVA2_ModeVC1_D2010, 0x1b81beA4, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5);
|
||||
DEFINE_GUID(DXVA2_ModeHEVC_VLD_Main, 0x5b11d51b, 0x2f4c,0x4452,0xbc,0xc3,0x09,0xf2,0xa1,0x16,0x0c,0xc0);
|
||||
DEFINE_GUID(DXVA2_NoEncrypt, 0x1b81beD0, 0xa0c7,0x11d3,0xb9,0x84,0x00,0xc0,0x4f,0x2e,0x73,0xc5);
|
||||
DEFINE_GUID(GUID_NULL, 0x00000000, 0x0000,0x0000,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00);
|
||||
|
||||
@@ -81,9 +80,6 @@ static const dxva2_mode dxva2_modes[] = {
|
||||
{ &DXVA2_ModeVC1_D, AV_CODEC_ID_VC1 },
|
||||
{ &DXVA2_ModeVC1_D, AV_CODEC_ID_WMV3 },
|
||||
|
||||
/* HEVC/H.265 */
|
||||
{ &DXVA2_ModeHEVC_VLD_Main, AV_CODEC_ID_HEVC },
|
||||
|
||||
{ NULL, 0 },
|
||||
};
|
||||
|
||||
@@ -530,10 +526,6 @@ static int dxva2_create_decoder(AVCodecContext *s)
|
||||
but it causes issues for H.264 on certain AMD GPUs..... */
|
||||
if (s->codec_id == AV_CODEC_ID_MPEG2VIDEO)
|
||||
surface_alignment = 32;
|
||||
/* the HEVC DXVA2 spec asks for 128 pixel aligned surfaces to ensure
|
||||
all coding features have enough room to work with */
|
||||
else if (s->codec_id == AV_CODEC_ID_HEVC)
|
||||
surface_alignment = 128;
|
||||
else
|
||||
surface_alignment = 16;
|
||||
|
||||
@@ -541,7 +533,7 @@ static int dxva2_create_decoder(AVCodecContext *s)
|
||||
ctx->num_surfaces = 4;
|
||||
|
||||
/* add surfaces based on number of possible refs */
|
||||
if (s->codec_id == AV_CODEC_ID_H264 || s->codec_id == AV_CODEC_ID_HEVC)
|
||||
if (s->codec_id == AV_CODEC_ID_H264)
|
||||
ctx->num_surfaces += 16;
|
||||
else
|
||||
ctx->num_surfaces += 2;
|
||||
|
79
ffmpeg_opt.c
79
ffmpeg_opt.c
@@ -77,7 +77,6 @@ const HWAccel hwaccels[] = {
|
||||
};
|
||||
|
||||
char *vstats_filename;
|
||||
char *sdp_filename;
|
||||
|
||||
float audio_drift_threshold = 0.1;
|
||||
float dts_delta_threshold = 10;
|
||||
@@ -86,7 +85,6 @@ float dts_error_threshold = 3600*30;
|
||||
int audio_volume = 256;
|
||||
int audio_sync_method = 0;
|
||||
int video_sync_method = VSYNC_AUTO;
|
||||
float frame_drop_threshold = 0;
|
||||
int do_deinterlace = 0;
|
||||
int do_benchmark = 0;
|
||||
int do_benchmark_all = 0;
|
||||
@@ -233,8 +231,6 @@ static int opt_map(void *optctx, const char *opt, const char *arg)
|
||||
arg++;
|
||||
}
|
||||
map = av_strdup(arg);
|
||||
if (!map)
|
||||
return AVERROR(ENOMEM);
|
||||
|
||||
/* parse sync stream first, just pick first matching stream */
|
||||
if (sync = strchr(map, ',')) {
|
||||
@@ -383,13 +379,6 @@ static int opt_map_channel(void *optctx, const char *opt, const char *arg)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int opt_sdp_file(void *optctx, const char *opt, const char *arg)
|
||||
{
|
||||
av_free(sdp_filename);
|
||||
sdp_filename = av_strdup(arg);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse a metadata specifier passed as 'arg' parameter.
|
||||
* @param arg metadata string to parse
|
||||
@@ -520,7 +509,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=%Y-%m-%dT%H:%M:%S%z", &time))
|
||||
if (!strftime(buf, sizeof(buf), "creation_time=%FT%T%z", &time))
|
||||
return -1;
|
||||
parse_option(o, "metadata", buf, options);
|
||||
|
||||
@@ -805,7 +794,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;
|
||||
char * data_codec_name = NULL;
|
||||
int scan_all_pmts_set = 0;
|
||||
|
||||
if (o->format) {
|
||||
@@ -859,7 +847,6 @@ static int open_input_file(OptionsContext *o, const char *filename)
|
||||
MATCH_PER_TYPE_OPT(codec_names, str, video_codec_name, ic, "v");
|
||||
MATCH_PER_TYPE_OPT(codec_names, str, audio_codec_name, ic, "a");
|
||||
MATCH_PER_TYPE_OPT(codec_names, str, subtitle_codec_name, ic, "s");
|
||||
MATCH_PER_TYPE_OPT(codec_names, str, data_codec_name, ic, "d");
|
||||
|
||||
ic->video_codec_id = video_codec_name ?
|
||||
find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0)->id : AV_CODEC_ID_NONE;
|
||||
@@ -867,8 +854,6 @@ static int open_input_file(OptionsContext *o, const char *filename)
|
||||
find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0)->id : AV_CODEC_ID_NONE;
|
||||
ic->subtitle_codec_id= subtitle_codec_name ?
|
||||
find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0)->id : AV_CODEC_ID_NONE;
|
||||
ic->data_codec_id = data_codec_name ?
|
||||
find_codec_or_die(data_codec_name, AVMEDIA_TYPE_DATA, 0)->id : AV_CODEC_ID_NONE;
|
||||
|
||||
if (video_codec_name)
|
||||
av_format_set_video_codec (ic, find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0));
|
||||
@@ -876,8 +861,6 @@ static int open_input_file(OptionsContext *o, const char *filename)
|
||||
av_format_set_audio_codec (ic, find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0));
|
||||
if (subtitle_codec_name)
|
||||
av_format_set_subtitle_codec(ic, find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0));
|
||||
if (data_codec_name)
|
||||
av_format_set_data_codec(ic, find_codec_or_die(data_codec_name, AVMEDIA_TYPE_DATA, 0));
|
||||
|
||||
ic->flags |= AVFMT_FLAG_NONBLOCK;
|
||||
ic->interrupt_callback = int_cb;
|
||||
@@ -951,9 +934,6 @@ static int open_input_file(OptionsContext *o, const char *filename)
|
||||
f->nb_streams = ic->nb_streams;
|
||||
f->rate_emu = o->rate_emu;
|
||||
f->accurate_seek = o->accurate_seek;
|
||||
#if HAVE_PTHREADS
|
||||
f->thread_queue_size = o->thread_queue_size > 0 ? o->thread_queue_size : 8;
|
||||
#endif
|
||||
|
||||
/* check if all codec options have been used */
|
||||
unused_opts = strip_specifiers(o->g->codec_opts);
|
||||
@@ -1131,7 +1111,7 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e
|
||||
av_dict_set(&ost->encoder_opts, buf, arg, AV_DICT_DONT_OVERWRITE);
|
||||
av_free(buf);
|
||||
} while (!s->eof_reached);
|
||||
avio_closep(&s);
|
||||
avio_close(s);
|
||||
}
|
||||
if (ret) {
|
||||
av_log(NULL, AV_LOG_FATAL,
|
||||
@@ -1191,9 +1171,6 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e
|
||||
ost->enc_ctx->global_quality = FF_QP2LAMBDA * qscale;
|
||||
}
|
||||
|
||||
MATCH_PER_STREAM_OPT(disposition, str, ost->disposition, oc, st);
|
||||
ost->disposition = av_strdup(ost->disposition);
|
||||
|
||||
if (oc->oformat->flags & AVFMT_GLOBALHEADER)
|
||||
ost->enc_ctx->flags |= CODEC_FLAG_GLOBAL_HEADER;
|
||||
|
||||
@@ -1394,13 +1371,10 @@ static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc, in
|
||||
av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
|
||||
exit_program(1);
|
||||
}
|
||||
/* FIXME realloc failure */
|
||||
video_enc->rc_override =
|
||||
av_realloc_array(video_enc->rc_override,
|
||||
i + 1, sizeof(RcOverride));
|
||||
if (!video_enc->rc_override) {
|
||||
av_log(NULL, AV_LOG_FATAL, "Could not (re)allocate memory for rc_override.\n");
|
||||
exit_program(1);
|
||||
}
|
||||
av_realloc(video_enc->rc_override,
|
||||
sizeof(RcOverride) * (i + 1));
|
||||
video_enc->rc_override[i].start_frame = start;
|
||||
video_enc->rc_override[i].end_frame = end;
|
||||
if (q > 0) {
|
||||
@@ -1941,15 +1915,7 @@ static int open_output_file(OptionsContext *o, const char *filename)
|
||||
}
|
||||
}
|
||||
}
|
||||
/* Data only if codec id match */
|
||||
if (!o->data_disable ) {
|
||||
enum AVCodecID codec_id = av_guess_codec(oc->oformat, NULL, filename, NULL, AVMEDIA_TYPE_DATA);
|
||||
for (i = 0; codec_id != AV_CODEC_ID_NONE && i < nb_input_streams; i++) {
|
||||
if (input_streams[i]->st->codec->codec_type == AVMEDIA_TYPE_DATA
|
||||
&& input_streams[i]->st->codec->codec_id == codec_id )
|
||||
new_data_stream(o, oc, i);
|
||||
}
|
||||
}
|
||||
/* do something with data? */
|
||||
} else {
|
||||
for (i = 0; i < o->nb_stream_maps; i++) {
|
||||
StreamMap *map = &o->stream_maps[i];
|
||||
@@ -2040,7 +2006,7 @@ loop_end:
|
||||
|
||||
p = strrchr(o->attachments[i], '/');
|
||||
av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
|
||||
avio_closep(&pb);
|
||||
avio_close(pb);
|
||||
}
|
||||
|
||||
for (i = nb_output_streams - oc->nb_streams; i < nb_output_streams; i++) { //for all streams of this output file
|
||||
@@ -2282,9 +2248,9 @@ static int opt_target(void *optctx, const char *opt, const char *arg)
|
||||
opt_default(NULL, "g", norm == PAL ? "15" : "18");
|
||||
|
||||
opt_default(NULL, "b:v", "1150000");
|
||||
opt_default(NULL, "maxrate:v", "1150000");
|
||||
opt_default(NULL, "minrate:v", "1150000");
|
||||
opt_default(NULL, "bufsize:v", "327680"); // 40*1024*8;
|
||||
opt_default(NULL, "maxrate", "1150000");
|
||||
opt_default(NULL, "minrate", "1150000");
|
||||
opt_default(NULL, "bufsize", "327680"); // 40*1024*8;
|
||||
|
||||
opt_default(NULL, "b:a", "224000");
|
||||
parse_option(o, "ar", "44100", options);
|
||||
@@ -2311,9 +2277,9 @@ static int opt_target(void *optctx, const char *opt, const char *arg)
|
||||
opt_default(NULL, "g", norm == PAL ? "15" : "18");
|
||||
|
||||
opt_default(NULL, "b:v", "2040000");
|
||||
opt_default(NULL, "maxrate:v", "2516000");
|
||||
opt_default(NULL, "minrate:v", "0"); // 1145000;
|
||||
opt_default(NULL, "bufsize:v", "1835008"); // 224*1024*8;
|
||||
opt_default(NULL, "maxrate", "2516000");
|
||||
opt_default(NULL, "minrate", "0"); // 1145000;
|
||||
opt_default(NULL, "bufsize", "1835008"); // 224*1024*8;
|
||||
opt_default(NULL, "scan_offset", "1");
|
||||
|
||||
opt_default(NULL, "b:a", "224000");
|
||||
@@ -2333,9 +2299,9 @@ static int opt_target(void *optctx, const char *opt, const char *arg)
|
||||
opt_default(NULL, "g", norm == PAL ? "15" : "18");
|
||||
|
||||
opt_default(NULL, "b:v", "6000000");
|
||||
opt_default(NULL, "maxrate:v", "9000000");
|
||||
opt_default(NULL, "minrate:v", "0"); // 1500000;
|
||||
opt_default(NULL, "bufsize:v", "1835008"); // 224*1024*8;
|
||||
opt_default(NULL, "maxrate", "9000000");
|
||||
opt_default(NULL, "minrate", "0"); // 1500000;
|
||||
opt_default(NULL, "bufsize", "1835008"); // 224*1024*8;
|
||||
|
||||
opt_default(NULL, "packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
|
||||
opt_default(NULL, "muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
|
||||
@@ -2379,9 +2345,6 @@ static int opt_vstats(void *optctx, const char *opt, const char *arg)
|
||||
time_t today2 = time(NULL);
|
||||
struct tm *today = localtime(&today2);
|
||||
|
||||
if (!today)
|
||||
return AVERROR(errno);
|
||||
|
||||
snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
|
||||
today->tm_sec);
|
||||
return opt_vstats_file(NULL, opt, filename);
|
||||
@@ -2891,8 +2854,6 @@ const OptionDef options[] = {
|
||||
" \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
|
||||
{ "vsync", HAS_ARG | OPT_EXPERT, { opt_vsync },
|
||||
"video sync method", "" },
|
||||
{ "frame_drop_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &frame_drop_threshold },
|
||||
"frame drop threshold", "" },
|
||||
{ "async", HAS_ARG | OPT_INT | OPT_EXPERT, { &audio_sync_method },
|
||||
"audio sync method", "" },
|
||||
{ "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, { &audio_drift_threshold },
|
||||
@@ -2960,12 +2921,6 @@ const OptionDef options[] = {
|
||||
{ "discard", OPT_STRING | HAS_ARG | OPT_SPEC |
|
||||
OPT_INPUT, { .off = OFFSET(discard) },
|
||||
"discard", "" },
|
||||
{ "disposition", OPT_STRING | HAS_ARG | OPT_SPEC |
|
||||
OPT_OUTPUT, { .off = OFFSET(disposition) },
|
||||
"disposition", "" },
|
||||
{ "thread_queue_size", HAS_ARG | OPT_INT | OPT_OFFSET | OPT_EXPERT | OPT_INPUT,
|
||||
{ .off = OFFSET(thread_queue_size) },
|
||||
"set the maximum number of queued packets from the demuxer" },
|
||||
|
||||
/* video options */
|
||||
{ "vframes", OPT_VIDEO | HAS_ARG | OPT_PERFILE | OPT_OUTPUT, { .func_arg = opt_video_frames },
|
||||
@@ -3113,8 +3068,6 @@ const OptionDef options[] = {
|
||||
"set the initial demux-decode delay", "seconds" },
|
||||
{ "override_ffserver", OPT_BOOL | OPT_EXPERT | OPT_OUTPUT, { &override_ffserver },
|
||||
"override the options from ffserver", "" },
|
||||
{ "sdp_file", HAS_ARG | OPT_EXPERT | OPT_OUTPUT, { opt_sdp_file },
|
||||
"specify a file in which to print sdp information", "file" },
|
||||
|
||||
{ "bsf", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_EXPERT | OPT_OUTPUT, { .off = OFFSET(bitstream_filters) },
|
||||
"A comma-separated list of bitstream filters", "bitstream_filters" },
|
||||
|
@@ -77,8 +77,6 @@ static int vda_retrieve_data(AVCodecContext *s, AVFrame *frame)
|
||||
frame->width, frame->height);
|
||||
|
||||
ret = av_frame_copy_props(vda->tmp_frame, frame);
|
||||
CVPixelBufferUnlockBaseAddress(pixbuf, kCVPixelBufferLock_ReadOnly);
|
||||
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
|
@@ -100,14 +100,9 @@ static int vdpau_get_buffer(AVCodecContext *s, AVFrame *frame, int flags)
|
||||
VDPAUContext *ctx = ist->hwaccel_ctx;
|
||||
VdpVideoSurface *surface;
|
||||
VdpStatus err;
|
||||
VdpChromaType chroma;
|
||||
uint32_t width, height;
|
||||
|
||||
av_assert0(frame->format == AV_PIX_FMT_VDPAU);
|
||||
|
||||
if (av_vdpau_get_surface_parameters(s, &chroma, &width, &height))
|
||||
return AVERROR(ENOSYS);
|
||||
|
||||
surface = av_malloc(sizeof(*surface));
|
||||
if (!surface)
|
||||
return AVERROR(ENOMEM);
|
||||
@@ -123,8 +118,8 @@ static int vdpau_get_buffer(AVCodecContext *s, AVFrame *frame, int flags)
|
||||
// properly we should keep a pool of surfaces instead of creating
|
||||
// them anew for each frame, but since we don't care about speed
|
||||
// much in this code, we don't bother
|
||||
err = ctx->video_surface_create(ctx->device, chroma, width, height,
|
||||
surface);
|
||||
err = ctx->video_surface_create(ctx->device, VDP_CHROMA_TYPE_420,
|
||||
frame->width, frame->height, surface);
|
||||
if (err != VDP_STATUS_OK) {
|
||||
av_log(NULL, AV_LOG_ERROR, "Error allocating a VDPAU video surface: %s\n",
|
||||
ctx->get_error_string(err));
|
||||
|
131
ffplay.c
131
ffplay.c
@@ -185,18 +185,21 @@ typedef struct Decoder {
|
||||
AVCodecContext *avctx;
|
||||
int pkt_serial;
|
||||
int finished;
|
||||
int flushed;
|
||||
int packet_pending;
|
||||
SDL_cond *empty_queue_cond;
|
||||
int64_t start_pts;
|
||||
AVRational start_pts_tb;
|
||||
int64_t next_pts;
|
||||
AVRational next_pts_tb;
|
||||
SDL_Thread *decoder_tid;
|
||||
} Decoder;
|
||||
|
||||
typedef struct VideoState {
|
||||
SDL_Thread *read_tid;
|
||||
SDL_Thread *video_tid;
|
||||
SDL_Thread *audio_tid;
|
||||
AVInputFormat *iformat;
|
||||
int no_background;
|
||||
int abort_request;
|
||||
int force_refresh;
|
||||
int paused;
|
||||
@@ -263,6 +266,7 @@ typedef struct VideoState {
|
||||
int xpos;
|
||||
double last_vis_time;
|
||||
|
||||
SDL_Thread *subtitle_tid;
|
||||
int subtitle_stream;
|
||||
AVStream *subtitle_st;
|
||||
PacketQueue subtitleq;
|
||||
@@ -278,7 +282,6 @@ typedef struct VideoState {
|
||||
struct SwsContext *img_convert_ctx;
|
||||
#endif
|
||||
SDL_Rect last_display_rect;
|
||||
int eof;
|
||||
|
||||
char filename[1024];
|
||||
int width, height, xleft, ytop;
|
||||
@@ -311,7 +314,11 @@ static int screen_height = 0;
|
||||
static int audio_disable;
|
||||
static int video_disable;
|
||||
static int subtitle_disable;
|
||||
static const char* wanted_stream_spec[AVMEDIA_TYPE_NB] = {0};
|
||||
static int wanted_stream[AVMEDIA_TYPE_NB] = {
|
||||
[AVMEDIA_TYPE_AUDIO] = -1,
|
||||
[AVMEDIA_TYPE_VIDEO] = -1,
|
||||
[AVMEDIA_TYPE_SUBTITLE] = -1,
|
||||
};
|
||||
static int seek_by_bytes = -1;
|
||||
static int display_disable;
|
||||
static int show_status = 1;
|
||||
@@ -541,6 +548,8 @@ static void decoder_init(Decoder *d, AVCodecContext *avctx, PacketQueue *queue,
|
||||
static int decoder_decode_frame(Decoder *d, AVFrame *frame, AVSubtitle *sub) {
|
||||
int got_frame = 0;
|
||||
|
||||
d->flushed = 0;
|
||||
|
||||
do {
|
||||
int ret = -1;
|
||||
|
||||
@@ -557,6 +566,7 @@ static int decoder_decode_frame(Decoder *d, AVFrame *frame, AVSubtitle *sub) {
|
||||
if (pkt.data == flush_pkt.data) {
|
||||
avcodec_flush_buffers(d->avctx);
|
||||
d->finished = 0;
|
||||
d->flushed = 1;
|
||||
d->next_pts = d->start_pts;
|
||||
d->next_pts_tb = d->start_pts_tb;
|
||||
}
|
||||
@@ -767,15 +777,6 @@ static int64_t frame_queue_last_pos(FrameQueue *f)
|
||||
return -1;
|
||||
}
|
||||
|
||||
static void decoder_abort(Decoder *d, FrameQueue *fq)
|
||||
{
|
||||
packet_queue_abort(d->queue);
|
||||
frame_queue_signal(fq);
|
||||
SDL_WaitThread(d->decoder_tid, NULL);
|
||||
d->decoder_tid = NULL;
|
||||
packet_queue_flush(d->queue);
|
||||
}
|
||||
|
||||
static inline void fill_rectangle(SDL_Surface *screen,
|
||||
int x, int y, int w, int h, int color, int update)
|
||||
{
|
||||
@@ -1247,10 +1248,7 @@ static void video_audio_display(VideoState *s)
|
||||
s->rdft_bits = rdft_bits;
|
||||
s->rdft_data = av_malloc_array(nb_freq, 4 *sizeof(*s->rdft_data));
|
||||
}
|
||||
if (!s->rdft || !s->rdft_data){
|
||||
av_log(NULL, AV_LOG_ERROR, "Failed to allocate buffers for RDFT, switching to waves display\n");
|
||||
s->show_mode = SHOW_MODE_WAVES;
|
||||
} else {
|
||||
{
|
||||
FFTSample *data[2];
|
||||
for (ch = 0; ch < nb_display_channels; ch++) {
|
||||
data[ch] = s->rdft_data + 2 * nb_freq * ch;
|
||||
@@ -1505,7 +1503,7 @@ static void stream_seek(VideoState *is, int64_t pos, int64_t rel, int seek_by_by
|
||||
static void stream_toggle_pause(VideoState *is)
|
||||
{
|
||||
if (is->paused) {
|
||||
is->frame_timer += av_gettime_relative() / 1000000.0 - is->vidclk.last_updated;
|
||||
is->frame_timer += av_gettime_relative() / 1000000.0 + is->vidclk.pts_drift - is->vidclk.pts;
|
||||
if (is->read_pause_return != AVERROR(ENOSYS)) {
|
||||
is->vidclk.paused = 0;
|
||||
}
|
||||
@@ -2207,12 +2205,6 @@ static int audio_thread(void *arg)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void decoder_start(Decoder *d, int (*fn)(void *), void *arg)
|
||||
{
|
||||
packet_queue_start(d->queue);
|
||||
d->decoder_tid = SDL_CreateThread(fn, arg);
|
||||
}
|
||||
|
||||
static int video_thread(void *arg)
|
||||
{
|
||||
VideoState *is = arg;
|
||||
@@ -2233,9 +2225,6 @@ static int video_thread(void *arg)
|
||||
int last_vfilter_idx = 0;
|
||||
#endif
|
||||
|
||||
if (!frame)
|
||||
return AVERROR(ENOMEM);
|
||||
|
||||
for (;;) {
|
||||
ret = get_video_frame(is, frame);
|
||||
if (ret < 0)
|
||||
@@ -2707,7 +2696,6 @@ static int stream_component_open(VideoState *is, int stream_index)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
is->eof = 0;
|
||||
ic->streams[stream_index]->discard = AVDISCARD_DEFAULT;
|
||||
switch (avctx->codec_type) {
|
||||
case AVMEDIA_TYPE_AUDIO:
|
||||
@@ -2750,28 +2738,31 @@ static int stream_component_open(VideoState *is, int stream_index)
|
||||
is->audio_stream = stream_index;
|
||||
is->audio_st = ic->streams[stream_index];
|
||||
|
||||
packet_queue_start(&is->audioq);
|
||||
decoder_init(&is->auddec, avctx, &is->audioq, is->continue_read_thread);
|
||||
if ((is->ic->iformat->flags & (AVFMT_NOBINSEARCH | AVFMT_NOGENSEARCH | AVFMT_NO_BYTE_SEEK)) && !is->ic->iformat->read_seek) {
|
||||
is->auddec.start_pts = is->audio_st->start_time;
|
||||
is->auddec.start_pts_tb = is->audio_st->time_base;
|
||||
}
|
||||
decoder_start(&is->auddec, audio_thread, is);
|
||||
is->audio_tid = SDL_CreateThread(audio_thread, is);
|
||||
SDL_PauseAudio(0);
|
||||
break;
|
||||
case AVMEDIA_TYPE_VIDEO:
|
||||
is->video_stream = stream_index;
|
||||
is->video_st = ic->streams[stream_index];
|
||||
|
||||
packet_queue_start(&is->videoq);
|
||||
decoder_init(&is->viddec, avctx, &is->videoq, is->continue_read_thread);
|
||||
decoder_start(&is->viddec, video_thread, is);
|
||||
is->video_tid = SDL_CreateThread(video_thread, is);
|
||||
is->queue_attachments_req = 1;
|
||||
break;
|
||||
case AVMEDIA_TYPE_SUBTITLE:
|
||||
is->subtitle_stream = stream_index;
|
||||
is->subtitle_st = ic->streams[stream_index];
|
||||
|
||||
packet_queue_start(&is->subtitleq);
|
||||
decoder_init(&is->subdec, avctx, &is->subtitleq, is->continue_read_thread);
|
||||
decoder_start(&is->subdec, subtitle_thread, is);
|
||||
is->subtitle_tid = SDL_CreateThread(subtitle_thread, is);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -2794,9 +2785,13 @@ static void stream_component_close(VideoState *is, int stream_index)
|
||||
|
||||
switch (avctx->codec_type) {
|
||||
case AVMEDIA_TYPE_AUDIO:
|
||||
decoder_abort(&is->auddec, &is->sampq);
|
||||
packet_queue_abort(&is->audioq);
|
||||
frame_queue_signal(&is->sampq);
|
||||
SDL_CloseAudio();
|
||||
SDL_WaitThread(is->audio_tid, NULL);
|
||||
|
||||
decoder_destroy(&is->auddec);
|
||||
packet_queue_flush(&is->audioq);
|
||||
swr_free(&is->swr_ctx);
|
||||
av_freep(&is->audio_buf1);
|
||||
is->audio_buf1_size = 0;
|
||||
@@ -2810,12 +2805,28 @@ static void stream_component_close(VideoState *is, int stream_index)
|
||||
}
|
||||
break;
|
||||
case AVMEDIA_TYPE_VIDEO:
|
||||
decoder_abort(&is->viddec, &is->pictq);
|
||||
packet_queue_abort(&is->videoq);
|
||||
|
||||
/* note: we also signal this mutex to make sure we deblock the
|
||||
video thread in all cases */
|
||||
frame_queue_signal(&is->pictq);
|
||||
|
||||
SDL_WaitThread(is->video_tid, NULL);
|
||||
|
||||
decoder_destroy(&is->viddec);
|
||||
packet_queue_flush(&is->videoq);
|
||||
break;
|
||||
case AVMEDIA_TYPE_SUBTITLE:
|
||||
decoder_abort(&is->subdec, &is->subpq);
|
||||
packet_queue_abort(&is->subtitleq);
|
||||
|
||||
/* note: we also signal this mutex to make sure we deblock the
|
||||
video thread in all cases */
|
||||
frame_queue_signal(&is->subpq);
|
||||
|
||||
SDL_WaitThread(is->subtitle_tid, NULL);
|
||||
|
||||
decoder_destroy(&is->subdec);
|
||||
packet_queue_flush(&is->subtitleq);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -2871,6 +2882,7 @@ static int read_thread(void *arg)
|
||||
int err, i, ret;
|
||||
int st_index[AVMEDIA_TYPE_NB];
|
||||
AVPacket pkt1, *pkt = &pkt1;
|
||||
int eof = 0;
|
||||
int64_t stream_start_time;
|
||||
int pkt_in_play_range = 0;
|
||||
AVDictionaryEntry *t;
|
||||
@@ -2878,20 +2890,13 @@ static int read_thread(void *arg)
|
||||
int orig_nb_streams;
|
||||
SDL_mutex *wait_mutex = SDL_CreateMutex();
|
||||
int scan_all_pmts_set = 0;
|
||||
int64_t pkt_ts;
|
||||
|
||||
memset(st_index, -1, sizeof(st_index));
|
||||
is->last_video_stream = is->video_stream = -1;
|
||||
is->last_audio_stream = is->audio_stream = -1;
|
||||
is->last_subtitle_stream = is->subtitle_stream = -1;
|
||||
is->eof = 0;
|
||||
|
||||
ic = avformat_alloc_context();
|
||||
if (!ic) {
|
||||
av_log(NULL, AV_LOG_FATAL, "Could not allocate context.\n");
|
||||
ret = AVERROR(ENOMEM);
|
||||
goto fail;
|
||||
}
|
||||
ic->interrupt_callback.callback = decode_interrupt_cb;
|
||||
ic->interrupt_callback.opaque = is;
|
||||
if (!av_dict_get(format_opts, "scan_all_pmts", NULL, AV_DICT_MATCH_CASE)) {
|
||||
@@ -2963,42 +2968,29 @@ static int read_thread(void *arg)
|
||||
|
||||
is->realtime = is_realtime(ic);
|
||||
|
||||
if (show_status)
|
||||
av_dump_format(ic, 0, is->filename, 0);
|
||||
|
||||
for (i = 0; i < ic->nb_streams; i++) {
|
||||
AVStream *st = ic->streams[i];
|
||||
enum AVMediaType type = st->codec->codec_type;
|
||||
st->discard = AVDISCARD_ALL;
|
||||
if (wanted_stream_spec[type] && st_index[type] == -1)
|
||||
if (avformat_match_stream_specifier(ic, st, wanted_stream_spec[type]) > 0)
|
||||
st_index[type] = i;
|
||||
}
|
||||
for (i = 0; i < AVMEDIA_TYPE_NB; i++) {
|
||||
if (wanted_stream_spec[i] && st_index[i] == -1) {
|
||||
av_log(NULL, AV_LOG_ERROR, "Stream specifier %s does not match any %s stream\n", wanted_stream_spec[i], av_get_media_type_string(i));
|
||||
st_index[i] = INT_MAX;
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < ic->nb_streams; i++)
|
||||
ic->streams[i]->discard = AVDISCARD_ALL;
|
||||
if (!video_disable)
|
||||
st_index[AVMEDIA_TYPE_VIDEO] =
|
||||
av_find_best_stream(ic, AVMEDIA_TYPE_VIDEO,
|
||||
st_index[AVMEDIA_TYPE_VIDEO], -1, NULL, 0);
|
||||
wanted_stream[AVMEDIA_TYPE_VIDEO], -1, NULL, 0);
|
||||
if (!audio_disable)
|
||||
st_index[AVMEDIA_TYPE_AUDIO] =
|
||||
av_find_best_stream(ic, AVMEDIA_TYPE_AUDIO,
|
||||
st_index[AVMEDIA_TYPE_AUDIO],
|
||||
wanted_stream[AVMEDIA_TYPE_AUDIO],
|
||||
st_index[AVMEDIA_TYPE_VIDEO],
|
||||
NULL, 0);
|
||||
if (!video_disable && !subtitle_disable)
|
||||
st_index[AVMEDIA_TYPE_SUBTITLE] =
|
||||
av_find_best_stream(ic, AVMEDIA_TYPE_SUBTITLE,
|
||||
st_index[AVMEDIA_TYPE_SUBTITLE],
|
||||
wanted_stream[AVMEDIA_TYPE_SUBTITLE],
|
||||
(st_index[AVMEDIA_TYPE_AUDIO] >= 0 ?
|
||||
st_index[AVMEDIA_TYPE_AUDIO] :
|
||||
st_index[AVMEDIA_TYPE_VIDEO]),
|
||||
NULL, 0);
|
||||
if (show_status) {
|
||||
av_dump_format(ic, 0, is->filename, 0);
|
||||
}
|
||||
|
||||
is->show_mode = show_mode;
|
||||
if (st_index[AVMEDIA_TYPE_VIDEO] >= 0) {
|
||||
@@ -3087,7 +3079,7 @@ static int read_thread(void *arg)
|
||||
}
|
||||
is->seek_req = 0;
|
||||
is->queue_attachments_req = 1;
|
||||
is->eof = 0;
|
||||
eof = 0;
|
||||
if (is->paused)
|
||||
step_to_next_frame(is);
|
||||
}
|
||||
@@ -3127,14 +3119,14 @@ static int read_thread(void *arg)
|
||||
}
|
||||
ret = av_read_frame(ic, pkt);
|
||||
if (ret < 0) {
|
||||
if ((ret == AVERROR_EOF || avio_feof(ic->pb)) && !is->eof) {
|
||||
if ((ret == AVERROR_EOF || avio_feof(ic->pb)) && !eof) {
|
||||
if (is->video_stream >= 0)
|
||||
packet_queue_put_nullpacket(&is->videoq, is->video_stream);
|
||||
if (is->audio_stream >= 0)
|
||||
packet_queue_put_nullpacket(&is->audioq, is->audio_stream);
|
||||
if (is->subtitle_stream >= 0)
|
||||
packet_queue_put_nullpacket(&is->subtitleq, is->subtitle_stream);
|
||||
is->eof = 1;
|
||||
eof = 1;
|
||||
}
|
||||
if (ic->pb && ic->pb->error)
|
||||
break;
|
||||
@@ -3143,13 +3135,12 @@ static int read_thread(void *arg)
|
||||
SDL_UnlockMutex(wait_mutex);
|
||||
continue;
|
||||
} else {
|
||||
is->eof = 0;
|
||||
eof = 0;
|
||||
}
|
||||
/* check if packet is in play range specified by user, then queue, otherwise discard */
|
||||
stream_start_time = ic->streams[pkt->stream_index]->start_time;
|
||||
pkt_ts = pkt->pts == AV_NOPTS_VALUE ? pkt->dts : pkt->pts;
|
||||
pkt_in_play_range = duration == AV_NOPTS_VALUE ||
|
||||
(pkt_ts - (stream_start_time != AV_NOPTS_VALUE ? stream_start_time : 0)) *
|
||||
(pkt->pts - (stream_start_time != AV_NOPTS_VALUE ? stream_start_time : 0)) *
|
||||
av_q2d(ic->streams[pkt->stream_index]->time_base) -
|
||||
(double)(start_time != AV_NOPTS_VALUE ? start_time : 0) / 1000000
|
||||
<= ((double)duration / 1000000);
|
||||
@@ -3683,9 +3674,9 @@ static const OptionDef options[] = {
|
||||
{ "an", OPT_BOOL, { &audio_disable }, "disable audio" },
|
||||
{ "vn", OPT_BOOL, { &video_disable }, "disable video" },
|
||||
{ "sn", OPT_BOOL, { &subtitle_disable }, "disable subtitling" },
|
||||
{ "ast", OPT_STRING | HAS_ARG | OPT_EXPERT, { &wanted_stream_spec[AVMEDIA_TYPE_AUDIO] }, "select desired audio stream", "stream_specifier" },
|
||||
{ "vst", OPT_STRING | HAS_ARG | OPT_EXPERT, { &wanted_stream_spec[AVMEDIA_TYPE_VIDEO] }, "select desired video stream", "stream_specifier" },
|
||||
{ "sst", OPT_STRING | HAS_ARG | OPT_EXPERT, { &wanted_stream_spec[AVMEDIA_TYPE_SUBTITLE] }, "select desired subtitle stream", "stream_specifier" },
|
||||
{ "ast", OPT_INT | HAS_ARG | OPT_EXPERT, { &wanted_stream[AVMEDIA_TYPE_AUDIO] }, "select desired audio stream", "stream_number" },
|
||||
{ "vst", OPT_INT | HAS_ARG | OPT_EXPERT, { &wanted_stream[AVMEDIA_TYPE_VIDEO] }, "select desired video stream", "stream_number" },
|
||||
{ "sst", OPT_INT | HAS_ARG | OPT_EXPERT, { &wanted_stream[AVMEDIA_TYPE_SUBTITLE] }, "select desired subtitle stream", "stream_number" },
|
||||
{ "ss", HAS_ARG, { .func_arg = opt_seek }, "seek to a given position in seconds", "pos" },
|
||||
{ "t", HAS_ARG, { .func_arg = opt_duration }, "play \"duration\" seconds of audio/video", "duration" },
|
||||
{ "bytes", OPT_INT | HAS_ARG, { &seek_by_bytes }, "seek by bytes 0=off 1=on -1=auto", "val" },
|
||||
|
32
ffprobe.c
32
ffprobe.c
@@ -86,7 +86,7 @@ static char *print_format;
|
||||
static char *stream_specifier;
|
||||
static char *show_data_hash;
|
||||
|
||||
typedef struct ReadInterval {
|
||||
typedef struct {
|
||||
int id; ///< identifier
|
||||
int64_t start, end; ///< start, end in second/AV_TIME_BASE units
|
||||
int has_start, has_end;
|
||||
@@ -338,7 +338,7 @@ struct WriterContext {
|
||||
unsigned int nb_section_frame; ///< number of the frame section in case we are in "packets_and_frames" section
|
||||
unsigned int nb_section_packet_frame; ///< nb_section_packet or nb_section_frame according if is_packets_and_frames
|
||||
|
||||
int string_validation;
|
||||
StringValidation string_validation;
|
||||
char *string_validation_replacement;
|
||||
unsigned int string_validation_utf8_flags;
|
||||
};
|
||||
@@ -1192,7 +1192,7 @@ static const Writer flat_writer = {
|
||||
|
||||
/* INI format output */
|
||||
|
||||
typedef struct INIContext {
|
||||
typedef struct {
|
||||
const AVClass *class;
|
||||
int hierarchical;
|
||||
} INIContext;
|
||||
@@ -1296,7 +1296,7 @@ static const Writer ini_writer = {
|
||||
|
||||
/* JSON output */
|
||||
|
||||
typedef struct JSONContext {
|
||||
typedef struct {
|
||||
const AVClass *class;
|
||||
int indent_level;
|
||||
int compact;
|
||||
@@ -1458,7 +1458,7 @@ static const Writer json_writer = {
|
||||
|
||||
/* XML output */
|
||||
|
||||
typedef struct XMLContext {
|
||||
typedef struct {
|
||||
const AVClass *class;
|
||||
int within_tag;
|
||||
int indent_level;
|
||||
@@ -2141,7 +2141,6 @@ static int show_stream(WriterContext *w, AVFormatContext *fmt_ctx, int stream_id
|
||||
} else {
|
||||
print_str_opt("timecode", "N/A");
|
||||
}
|
||||
print_int("refs", dec_ctx->refs);
|
||||
break;
|
||||
|
||||
case AVMEDIA_TYPE_AUDIO:
|
||||
@@ -2398,7 +2397,6 @@ static int open_input_file(AVFormatContext **fmt_ctx_ptr, const char *filename)
|
||||
print_error(filename, err);
|
||||
return err;
|
||||
}
|
||||
*fmt_ctx_ptr = fmt_ctx;
|
||||
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))) {
|
||||
@@ -2410,16 +2408,13 @@ static int open_input_file(AVFormatContext **fmt_ctx_ptr, const char *filename)
|
||||
opts = setup_find_stream_info_opts(fmt_ctx, codec_opts);
|
||||
orig_nb_streams = fmt_ctx->nb_streams;
|
||||
|
||||
err = avformat_find_stream_info(fmt_ctx, opts);
|
||||
|
||||
for (i = 0; i < orig_nb_streams; i++)
|
||||
av_dict_free(&opts[i]);
|
||||
av_freep(&opts);
|
||||
|
||||
if (err < 0) {
|
||||
if ((err = avformat_find_stream_info(fmt_ctx, opts)) < 0) {
|
||||
print_error(filename, err);
|
||||
return err;
|
||||
}
|
||||
for (i = 0; i < orig_nb_streams; i++)
|
||||
av_dict_free(&opts[i]);
|
||||
av_freep(&opts);
|
||||
|
||||
av_dump_format(fmt_ctx, 0, filename, 0);
|
||||
|
||||
@@ -2470,7 +2465,7 @@ static void close_input_file(AVFormatContext **ctx_ptr)
|
||||
|
||||
static int probe_file(WriterContext *wctx, const char *filename)
|
||||
{
|
||||
AVFormatContext *fmt_ctx = NULL;
|
||||
AVFormatContext *fmt_ctx;
|
||||
int ret, i;
|
||||
int section_id;
|
||||
|
||||
@@ -2479,7 +2474,7 @@ static int probe_file(WriterContext *wctx, const char *filename)
|
||||
|
||||
ret = open_input_file(&fmt_ctx, filename);
|
||||
if (ret < 0)
|
||||
goto end;
|
||||
return ret;
|
||||
|
||||
#define CHECK_END if (ret < 0) goto end
|
||||
|
||||
@@ -2537,8 +2532,7 @@ static int probe_file(WriterContext *wctx, const char *filename)
|
||||
}
|
||||
|
||||
end:
|
||||
if (fmt_ctx)
|
||||
close_input_file(&fmt_ctx);
|
||||
close_input_file(&fmt_ctx);
|
||||
av_freep(&nb_streams_frames);
|
||||
av_freep(&nb_streams_packets);
|
||||
av_freep(&selected_streams);
|
||||
@@ -2562,6 +2556,8 @@ static void ffprobe_show_program_version(WriterContext *w)
|
||||
print_str("version", FFMPEG_VERSION);
|
||||
print_fmt("copyright", "Copyright (c) %d-%d the FFmpeg developers",
|
||||
program_birth_year, CONFIG_THIS_YEAR);
|
||||
print_str("build_date", __DATE__);
|
||||
print_str("build_time", __TIME__);
|
||||
print_str("compiler_ident", CC_IDENT);
|
||||
print_str("configuration", FFMPEG_CONFIGURATION);
|
||||
writer_print_section_footer(w);
|
||||
|
777
ffserver.c
777
ffserver.c
File diff suppressed because it is too large
Load Diff
@@ -35,12 +35,10 @@
|
||||
|
||||
static int ffserver_save_avoption(const char *opt, const char *arg, int type,
|
||||
FFServerConfig *config);
|
||||
static void vreport_config_error(const char *filename, int line_num,
|
||||
int log_level, int *errors, const char *fmt,
|
||||
va_list vl);
|
||||
static void report_config_error(const char *filename, int line_num,
|
||||
int log_level, int *errors, const char *fmt,
|
||||
...);
|
||||
static void vreport_config_error(const char *filename, int line_num, int log_level,
|
||||
int *errors, const char *fmt, va_list vl);
|
||||
static void report_config_error(const char *filename, int line_num, int log_level,
|
||||
int *errors, const char *fmt, ...);
|
||||
|
||||
#define ERROR(...) report_config_error(config->filename, config->line_num,\
|
||||
AV_LOG_ERROR, &config->errors, __VA_ARGS__)
|
||||
@@ -86,24 +84,28 @@ void ffserver_get_arg(char *buf, int buf_size, const char **pp)
|
||||
{
|
||||
const char *p;
|
||||
char *q;
|
||||
int quote = 0;
|
||||
int quote;
|
||||
|
||||
p = *pp;
|
||||
q = buf;
|
||||
|
||||
while (av_isspace(*p)) p++;
|
||||
|
||||
q = buf;
|
||||
quote = 0;
|
||||
if (*p == '\"' || *p == '\'')
|
||||
quote = *p++;
|
||||
|
||||
while (*p != '\0') {
|
||||
if (quote && *p == quote || !quote && av_isspace(*p))
|
||||
for(;;) {
|
||||
if (quote) {
|
||||
if (*p == quote)
|
||||
break;
|
||||
} else {
|
||||
if (av_isspace(*p))
|
||||
break;
|
||||
}
|
||||
if (*p == '\0')
|
||||
break;
|
||||
if ((q - buf) < buf_size - 1)
|
||||
*q++ = *p;
|
||||
p++;
|
||||
}
|
||||
|
||||
*q = '\0';
|
||||
if (quote && *p == quote)
|
||||
p++;
|
||||
@@ -124,7 +126,7 @@ void ffserver_parse_acl_row(FFServerStream *stream, FFServerStream* feed,
|
||||
else if (av_strcasecmp(arg, "deny") == 0)
|
||||
acl.action = IP_DENY;
|
||||
else {
|
||||
fprintf(stderr, "%s:%d: ACL action '%s' should be ALLOW or DENY.\n",
|
||||
fprintf(stderr, "%s:%d: ACL action '%s' is not ALLOW or DENY\n",
|
||||
filename, line_num, arg);
|
||||
errors++;
|
||||
}
|
||||
@@ -132,8 +134,7 @@ void ffserver_parse_acl_row(FFServerStream *stream, FFServerStream* feed,
|
||||
ffserver_get_arg(arg, sizeof(arg), &p);
|
||||
|
||||
if (resolve_host(&acl.first, arg)) {
|
||||
fprintf(stderr,
|
||||
"%s:%d: ACL refers to invalid host or IP address '%s'\n",
|
||||
fprintf(stderr, "%s:%d: ACL refers to invalid host or IP address '%s'\n",
|
||||
filename, line_num, arg);
|
||||
errors++;
|
||||
} else
|
||||
@@ -164,7 +165,7 @@ void ffserver_parse_acl_row(FFServerStream *stream, FFServerStream* feed,
|
||||
else if (ext_acl)
|
||||
naclp = &ext_acl;
|
||||
else {
|
||||
fprintf(stderr, "%s:%d: ACL found not in <Stream> or <Feed>\n",
|
||||
fprintf(stderr, "%s:%d: ACL found not in <stream> or <feed>\n",
|
||||
filename, line_num);
|
||||
errors++;
|
||||
}
|
||||
@@ -195,38 +196,12 @@ static void add_codec(FFServerStream *stream, AVCodecContext *av,
|
||||
av_dict_copy(&recommended, *opts, 0);
|
||||
av_opt_set_dict2(av->priv_data, opts, AV_OPT_SEARCH_CHILDREN);
|
||||
av_opt_set_dict2(av, opts, AV_OPT_SEARCH_CHILDREN);
|
||||
|
||||
if (av_dict_count(*opts))
|
||||
av_log(NULL, AV_LOG_WARNING,
|
||||
"Something is wrong, %d options are not set!\n",
|
||||
av_dict_count(*opts));
|
||||
|
||||
if (!config->stream_use_defaults) {
|
||||
switch(av->codec_type) {
|
||||
case AVMEDIA_TYPE_AUDIO:
|
||||
if (av->bit_rate == 0)
|
||||
report_config_error(config->filename, config->line_num,
|
||||
AV_LOG_ERROR, &config->errors,
|
||||
"audio bit rate is not set\n");
|
||||
if (av->sample_rate == 0)
|
||||
report_config_error(config->filename, config->line_num,
|
||||
AV_LOG_ERROR, &config->errors,
|
||||
"audio sample rate is not set\n");
|
||||
break;
|
||||
case AVMEDIA_TYPE_VIDEO:
|
||||
if (av->width == 0 || av->height == 0)
|
||||
report_config_error(config->filename, config->line_num,
|
||||
AV_LOG_ERROR, &config->errors,
|
||||
"video size is not set\n");
|
||||
break;
|
||||
default:
|
||||
av_assert0(0);
|
||||
}
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* stream_use_defaults = true */
|
||||
"Something is wrong, %d options are not set!\n", av_dict_count(*opts));
|
||||
|
||||
if (config->stream_use_defaults) {
|
||||
//TODO: reident
|
||||
/* compute default parameters */
|
||||
switch(av->codec_type) {
|
||||
case AVMEDIA_TYPE_AUDIO:
|
||||
@@ -289,8 +264,8 @@ static void add_codec(FFServerStream *stream, AVCodecContext *av,
|
||||
if (!av_dict_get(recommended, "rc_eq", NULL, 0)) {
|
||||
av->rc_eq = av_strdup("tex^qComp");
|
||||
av_dict_set(&recommended, "rc_eq", "tex^qComp", 0);
|
||||
WARNING("Setting default value for video rate control equation = "
|
||||
"%s. Use NoDefaults to disable it.\n",
|
||||
WARNING("Setting default value for video rate control equation = %s. "
|
||||
"Use NoDefaults to disable it.\n",
|
||||
av->rc_eq);
|
||||
}
|
||||
if (!av_dict_get(recommended, "maxrate", NULL, 0)) {
|
||||
@@ -312,8 +287,26 @@ static void add_codec(FFServerStream *stream, AVCodecContext *av,
|
||||
default:
|
||||
abort();
|
||||
}
|
||||
} else {
|
||||
switch(av->codec_type) {
|
||||
case AVMEDIA_TYPE_AUDIO:
|
||||
if (av->bit_rate == 0)
|
||||
report_config_error(config->filename, config->line_num, AV_LOG_ERROR,
|
||||
&config->errors, "audio bit rate is not set\n");
|
||||
if (av->sample_rate == 0)
|
||||
report_config_error(config->filename, config->line_num, AV_LOG_ERROR,
|
||||
&config->errors, "audio sample rate is not set\n");
|
||||
break;
|
||||
case AVMEDIA_TYPE_VIDEO:
|
||||
if (av->width == 0 || av->height == 0)
|
||||
report_config_error(config->filename, config->line_num, AV_LOG_ERROR,
|
||||
&config->errors, "video size is not set\n");
|
||||
break;
|
||||
default:
|
||||
av_assert0(0);
|
||||
}
|
||||
}
|
||||
|
||||
done:
|
||||
st = av_mallocz(sizeof(AVStream));
|
||||
if (!st)
|
||||
return;
|
||||
@@ -324,15 +317,13 @@ done:
|
||||
stream->streams[stream->nb_streams++] = st;
|
||||
}
|
||||
|
||||
static int ffserver_set_codec(AVCodecContext *ctx, const char *codec_name,
|
||||
FFServerConfig *config)
|
||||
static int ffserver_set_codec(AVCodecContext *ctx, const char *codec_name, FFServerConfig *config)
|
||||
{
|
||||
int ret;
|
||||
AVCodec *codec = avcodec_find_encoder_by_name(codec_name);
|
||||
if (!codec || codec->type != ctx->codec_type) {
|
||||
report_config_error(config->filename, config->line_num, AV_LOG_ERROR,
|
||||
&config->errors,
|
||||
"Invalid codec name: '%s'\n", codec_name);
|
||||
&config->errors, "Invalid codec name: %s\n", codec_name);
|
||||
return 0;
|
||||
}
|
||||
if (ctx->codec_id == AV_CODEC_ID_NONE && !ctx->priv_data) {
|
||||
@@ -341,10 +332,8 @@ static int ffserver_set_codec(AVCodecContext *ctx, const char *codec_name,
|
||||
ctx->codec = codec;
|
||||
}
|
||||
if (ctx->codec_id != codec->id)
|
||||
report_config_error(config->filename, config->line_num, AV_LOG_ERROR,
|
||||
&config->errors,
|
||||
"Inconsistent configuration: trying to set '%s' "
|
||||
"codec option, but '%s' codec is used previously\n",
|
||||
report_config_error(config->filename, config->line_num, AV_LOG_ERROR, &config->errors,
|
||||
"Inconsistent configuration: trying to set %s codec option, but %s codec is used previously\n",
|
||||
codec_name, avcodec_get_name(ctx->codec_id));
|
||||
return 0;
|
||||
}
|
||||
@@ -381,13 +370,12 @@ static int ffserver_opt_preset(const char *arg, int type, FFServerConfig *config
|
||||
continue;
|
||||
e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
|
||||
if(e){
|
||||
av_log(NULL, AV_LOG_ERROR, "%s: Invalid syntax: '%s'\n", filename,
|
||||
line);
|
||||
av_log(NULL, AV_LOG_ERROR, "%s: Invalid syntax: '%s'\n", filename, line);
|
||||
ret = AVERROR(EINVAL);
|
||||
break;
|
||||
}
|
||||
if (!strcmp(tmp, "acodec") && avctx->codec_type == AVMEDIA_TYPE_AUDIO ||
|
||||
!strcmp(tmp, "vcodec") && avctx->codec_type == AVMEDIA_TYPE_VIDEO)
|
||||
if ((!strcmp(tmp, "acodec") && avctx->codec_type == AVMEDIA_TYPE_AUDIO) ||
|
||||
!strcmp(tmp, "vcodec") && avctx->codec_type == AVMEDIA_TYPE_VIDEO)
|
||||
{
|
||||
if (ffserver_set_codec(avctx, tmp2, config) < 0)
|
||||
break;
|
||||
@@ -404,9 +392,7 @@ static int ffserver_opt_preset(const char *arg, int type, FFServerConfig *config
|
||||
return ret;
|
||||
}
|
||||
|
||||
static AVOutputFormat *ffserver_guess_format(const char *short_name,
|
||||
const char *filename,
|
||||
const char *mime_type)
|
||||
static AVOutputFormat *ffserver_guess_format(const char *short_name, const char *filename, const char *mime_type)
|
||||
{
|
||||
AVOutputFormat *fmt = av_guess_format(short_name, filename, mime_type);
|
||||
|
||||
@@ -425,9 +411,7 @@ static AVOutputFormat *ffserver_guess_format(const char *short_name,
|
||||
return fmt;
|
||||
}
|
||||
|
||||
static void vreport_config_error(const char *filename, int line_num,
|
||||
int log_level, int *errors, const char *fmt,
|
||||
va_list vl)
|
||||
static void vreport_config_error(const char *filename, int line_num, int log_level, int *errors, const char *fmt, va_list vl)
|
||||
{
|
||||
av_log(NULL, log_level, "%s:%d: ", filename, line_num);
|
||||
av_vlog(NULL, log_level, fmt, vl);
|
||||
@@ -435,9 +419,7 @@ static void vreport_config_error(const char *filename, int line_num,
|
||||
(*errors)++;
|
||||
}
|
||||
|
||||
static void report_config_error(const char *filename, int line_num,
|
||||
int log_level, int *errors,
|
||||
const char *fmt, ...)
|
||||
static void report_config_error(const char *filename, int line_num, int log_level, int *errors, const char *fmt, ...)
|
||||
{
|
||||
va_list vl;
|
||||
va_start(vl, fmt);
|
||||
@@ -445,9 +427,8 @@ static void report_config_error(const char *filename, int line_num,
|
||||
va_end(vl);
|
||||
}
|
||||
|
||||
static int ffserver_set_int_param(int *dest, const char *value, int factor,
|
||||
int min, int max, FFServerConfig *config,
|
||||
const char *error_msg, ...)
|
||||
static int ffserver_set_int_param(int *dest, const char *value, int factor, int min, int max,
|
||||
FFServerConfig *config, const char *error_msg, ...)
|
||||
{
|
||||
int tmp;
|
||||
char *tailp;
|
||||
@@ -478,10 +459,8 @@ static int ffserver_set_int_param(int *dest, const char *value, int factor,
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
|
||||
static int ffserver_set_float_param(float *dest, const char *value,
|
||||
float factor, float min, float max,
|
||||
FFServerConfig *config,
|
||||
const char *error_msg, ...)
|
||||
static int ffserver_set_float_param(float *dest, const char *value, float factor, float min, float max,
|
||||
FFServerConfig *config, const char *error_msg, ...)
|
||||
{
|
||||
double tmp;
|
||||
char *tailp;
|
||||
@@ -509,8 +488,7 @@ static int ffserver_set_float_param(float *dest, const char *value,
|
||||
return AVERROR(EINVAL);
|
||||
}
|
||||
|
||||
static int ffserver_save_avoption(const char *opt, const char *arg, int type,
|
||||
FFServerConfig *config)
|
||||
static int ffserver_save_avoption(const char *opt, const char *arg, int type, FFServerConfig *config)
|
||||
{
|
||||
static int hinted = 0;
|
||||
int ret = 0;
|
||||
@@ -544,13 +522,7 @@ static int ffserver_save_avoption(const char *opt, const char *arg, int type,
|
||||
//explicit private option
|
||||
snprintf(buff, sizeof(buff), "%s", opt);
|
||||
codec_name = buff;
|
||||
if(!(option = strchr(buff, ':'))){
|
||||
report_config_error(config->filename, config->line_num,
|
||||
AV_LOG_ERROR, &config->errors,
|
||||
"Syntax error. Unmatched ':'\n");
|
||||
return -1;
|
||||
|
||||
}
|
||||
option = strchr(buff, ':');
|
||||
buff[option - buff] = '\0';
|
||||
option++;
|
||||
if ((ret = ffserver_set_codec(ctx, codec_name, config)) < 0)
|
||||
@@ -561,35 +533,31 @@ static int ffserver_save_avoption(const char *opt, const char *arg, int type,
|
||||
option = opt;
|
||||
}
|
||||
|
||||
o = av_opt_find(ctx, option, NULL, type | AV_OPT_FLAG_ENCODING_PARAM,
|
||||
AV_OPT_SEARCH_CHILDREN);
|
||||
if (!o &&
|
||||
(!strcmp(option, "time_base") || !strcmp(option, "pixel_format") ||
|
||||
!strcmp(option, "video_size") || !strcmp(option, "codec_tag")))
|
||||
o = av_opt_find(ctx, option, NULL, type | AV_OPT_FLAG_ENCODING_PARAM, AV_OPT_SEARCH_CHILDREN);
|
||||
if (!o && (!strcmp(option, "time_base") || !strcmp(option, "pixel_format") ||
|
||||
!strcmp(option, "video_size") || !strcmp(option, "codec_tag")))
|
||||
o = av_opt_find(ctx, option, NULL, 0, 0);
|
||||
if (!o) {
|
||||
report_config_error(config->filename, config->line_num, AV_LOG_ERROR,
|
||||
&config->errors, "Option not found: '%s'\n", opt);
|
||||
&config->errors, "Option not found: %s\n", opt);
|
||||
if (!hinted && ctx->codec_id == AV_CODEC_ID_NONE) {
|
||||
hinted = 1;
|
||||
report_config_error(config->filename, config->line_num,
|
||||
AV_LOG_ERROR, NULL, "If '%s' is a codec private"
|
||||
"option, then prefix it with codec name, for "
|
||||
"example '%s:%s %s' or define codec earlier.\n",
|
||||
opt, avcodec_get_name(guessed_codec_id) ,opt,
|
||||
arg);
|
||||
report_config_error(config->filename, config->line_num, AV_LOG_ERROR, NULL,
|
||||
"If '%s' is a codec private option, then prefix it with codec name, "
|
||||
"for example '%s:%s %s' or define codec earlier.\n",
|
||||
opt, avcodec_get_name(guessed_codec_id) ,opt, arg);
|
||||
}
|
||||
} else if ((ret = av_opt_set(ctx, option, arg, AV_OPT_SEARCH_CHILDREN)) < 0) {
|
||||
report_config_error(config->filename, config->line_num, AV_LOG_ERROR,
|
||||
&config->errors, "Invalid value for option %s (%s): %s\n", opt,
|
||||
arg, av_err2str(ret));
|
||||
} else if ((e = av_dict_get(*dict, option, NULL, 0))) {
|
||||
if ((o->type == AV_OPT_TYPE_FLAGS) && arg &&
|
||||
(arg[0] == '+' || arg[0] == '-'))
|
||||
if ((o->type == AV_OPT_TYPE_FLAGS) && arg && (arg[0] == '+' || arg[0] == '-'))
|
||||
return av_dict_set(dict, option, arg, AV_DICT_APPEND);
|
||||
report_config_error(config->filename, config->line_num, AV_LOG_ERROR,
|
||||
&config->errors, "Redeclaring value of option '%s'."
|
||||
"Previous value was: '%s'.\n", opt, e->value);
|
||||
&config->errors,
|
||||
"Redeclaring value of the option %s, previous value: %s\n",
|
||||
opt, e->value);
|
||||
} else if (av_dict_set(dict, option, arg, 0) < 0) {
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
@@ -611,23 +579,21 @@ static int ffserver_parse_config_global(FFServerConfig *config, const char *cmd,
|
||||
char arg[1024];
|
||||
if (!av_strcasecmp(cmd, "Port") || !av_strcasecmp(cmd, "HTTPPort")) {
|
||||
if (!av_strcasecmp(cmd, "Port"))
|
||||
WARNING("Port option is deprecated. Use HTTPPort instead.\n");
|
||||
WARNING("Port option is deprecated, use HTTPPort instead\n");
|
||||
ffserver_get_arg(arg, sizeof(arg), p);
|
||||
ffserver_set_int_param(&val, arg, 0, 1, 65535, config,
|
||||
"Invalid port: %s\n", arg);
|
||||
if (val < 1024)
|
||||
WARNING("Trying to use IETF assigned system port: '%d'\n", val);
|
||||
WARNING("Trying to use IETF assigned system port: %d\n", val);
|
||||
config->http_addr.sin_port = htons(val);
|
||||
} else if (!av_strcasecmp(cmd, "HTTPBindAddress") ||
|
||||
!av_strcasecmp(cmd, "BindAddress")) {
|
||||
} else if (!av_strcasecmp(cmd, "HTTPBindAddress") || !av_strcasecmp(cmd, "BindAddress")) {
|
||||
if (!av_strcasecmp(cmd, "BindAddress"))
|
||||
WARNING("BindAddress option is deprecated. Use HTTPBindAddress "
|
||||
"instead.\n");
|
||||
WARNING("BindAddress option is deprecated, use HTTPBindAddress instead\n");
|
||||
ffserver_get_arg(arg, sizeof(arg), p);
|
||||
if (resolve_host(&config->http_addr.sin_addr, arg))
|
||||
ERROR("Invalid host/IP address: '%s'\n", arg);
|
||||
ERROR("Invalid host/IP address: %s\n", arg);
|
||||
} else if (!av_strcasecmp(cmd, "NoDaemon")) {
|
||||
WARNING("NoDaemon option has no effect. You should remove it.\n");
|
||||
WARNING("NoDaemon option has no effect, you should remove it\n");
|
||||
} else if (!av_strcasecmp(cmd, "RTSPPort")) {
|
||||
ffserver_get_arg(arg, sizeof(arg), p);
|
||||
ffserver_set_int_param(&val, arg, 0, 1, 65535, config,
|
||||
@@ -642,21 +608,17 @@ static int ffserver_parse_config_global(FFServerConfig *config, const char *cmd,
|
||||
ffserver_set_int_param(&val, arg, 0, 1, 65535, config,
|
||||
"Invalid MaxHTTPConnections: %s\n", arg);
|
||||
config->nb_max_http_connections = val;
|
||||
if (config->nb_max_connections > config->nb_max_http_connections) {
|
||||
ERROR("Inconsistent configuration: MaxClients(%d) > "
|
||||
"MaxHTTPConnections(%d)\n", config->nb_max_connections,
|
||||
config->nb_max_http_connections);
|
||||
}
|
||||
if (config->nb_max_connections > config->nb_max_http_connections)
|
||||
ERROR("Inconsistent configuration: MaxClients(%d) > MaxHTTPConnections(%d)\n",
|
||||
config->nb_max_connections, config->nb_max_http_connections);
|
||||
} else if (!av_strcasecmp(cmd, "MaxClients")) {
|
||||
ffserver_get_arg(arg, sizeof(arg), p);
|
||||
ffserver_set_int_param(&val, arg, 0, 1, 65535, config,
|
||||
"Invalid MaxClients: '%s'\n", arg);
|
||||
"Invalid MaxClients: %s\n", arg);
|
||||
config->nb_max_connections = val;
|
||||
if (config->nb_max_connections > config->nb_max_http_connections) {
|
||||
ERROR("Inconsistent configuration: MaxClients(%d) > "
|
||||
"MaxHTTPConnections(%d)\n", config->nb_max_connections,
|
||||
config->nb_max_http_connections);
|
||||
}
|
||||
if (config->nb_max_connections > config->nb_max_http_connections)
|
||||
ERROR("Inconsistent configuration: MaxClients(%d) > MaxHTTPConnections(%d)\n",
|
||||
config->nb_max_connections, config->nb_max_http_connections);
|
||||
} else if (!av_strcasecmp(cmd, "MaxBandwidth")) {
|
||||
int64_t llval;
|
||||
char *tailp;
|
||||
@@ -664,14 +626,12 @@ static int ffserver_parse_config_global(FFServerConfig *config, const char *cmd,
|
||||
errno = 0;
|
||||
llval = strtoll(arg, &tailp, 10);
|
||||
if (llval < 10 || llval > 10000000 || tailp[0] || errno)
|
||||
ERROR("Invalid MaxBandwidth: '%s'\n", arg);
|
||||
ERROR("Invalid MaxBandwidth: %s\n", arg);
|
||||
else
|
||||
config->max_bandwidth = llval;
|
||||
} else if (!av_strcasecmp(cmd, "CustomLog")) {
|
||||
if (!config->debug) {
|
||||
ffserver_get_arg(config->logfilename, sizeof(config->logfilename),
|
||||
p);
|
||||
}
|
||||
if (!config->debug)
|
||||
ffserver_get_arg(config->logfilename, sizeof(config->logfilename), p);
|
||||
} else if (!av_strcasecmp(cmd, "LoadModule")) {
|
||||
ERROR("Loadable modules are no longer supported\n");
|
||||
} else if (!av_strcasecmp(cmd, "NoDefaults")) {
|
||||
@@ -735,16 +695,15 @@ static int ffserver_parse_config_feed(FFServerConfig *config, const char *cmd, c
|
||||
|
||||
feed->child_argv[i] =
|
||||
av_asprintf("http://%s:%d/%s",
|
||||
(config->http_addr.sin_addr.s_addr == INADDR_ANY) ?
|
||||
"127.0.0.1" : inet_ntoa(config->http_addr.sin_addr),
|
||||
ntohs(config->http_addr.sin_port), feed->filename);
|
||||
(config->http_addr.sin_addr.s_addr == INADDR_ANY) ? "127.0.0.1" :
|
||||
inet_ntoa(config->http_addr.sin_addr), ntohs(config->http_addr.sin_port),
|
||||
feed->filename);
|
||||
if (!feed->child_argv[i])
|
||||
return AVERROR(ENOMEM);
|
||||
} else if (!av_strcasecmp(cmd, "ACL")) {
|
||||
ffserver_parse_acl_row(NULL, feed, NULL, *p, config->filename,
|
||||
config->line_num);
|
||||
} else if (!av_strcasecmp(cmd, "File") ||
|
||||
!av_strcasecmp(cmd, "ReadOnlyFile")) {
|
||||
} else if (!av_strcasecmp(cmd, "File") || !av_strcasecmp(cmd, "ReadOnlyFile")) {
|
||||
ffserver_get_arg(feed->feed_filename, sizeof(feed->feed_filename), p);
|
||||
feed->readonly = !av_strcasecmp(cmd, "ReadOnlyFile");
|
||||
} else if (!av_strcasecmp(cmd, "Truncate")) {
|
||||
@@ -753,8 +712,8 @@ static int ffserver_parse_config_feed(FFServerConfig *config, const char *cmd, c
|
||||
if (!arg[0]) {
|
||||
feed->truncate = 1;
|
||||
} else {
|
||||
WARNING("Truncate N syntax in configuration file is deprecated. "
|
||||
"Use Truncate alone with no arguments.\n");
|
||||
WARNING("Truncate N syntax in configuration file is deprecated, "
|
||||
"use Truncate alone with no arguments\n");
|
||||
feed->truncate = strtod(arg, NULL);
|
||||
}
|
||||
} else if (!av_strcasecmp(cmd, "FileMaxSize")) {
|
||||
@@ -775,14 +734,13 @@ static int ffserver_parse_config_feed(FFServerConfig *config, const char *cmd, c
|
||||
fsize *= 1024 * 1024 * 1024;
|
||||
break;
|
||||
default:
|
||||
ERROR("Invalid file size: '%s'\n", arg);
|
||||
ERROR("Invalid file size: %s\n", arg);
|
||||
break;
|
||||
}
|
||||
feed->feed_max_size = (int64_t)fsize;
|
||||
if (feed->feed_max_size < FFM_PACKET_SIZE*4) {
|
||||
ERROR("Feed max file size is too small. Must be at least %d.\n",
|
||||
FFM_PACKET_SIZE*4);
|
||||
}
|
||||
if (feed->feed_max_size < FFM_PACKET_SIZE*4)
|
||||
ERROR("Feed max file size is too small, must be at least %d\n",
|
||||
FFM_PACKET_SIZE*4);
|
||||
} else if (!av_strcasecmp(cmd, "</Feed>")) {
|
||||
*pfeed = NULL;
|
||||
} else {
|
||||
@@ -866,7 +824,7 @@ static int ffserver_parse_config_stream(FFServerConfig *config, const char *cmd,
|
||||
strcpy(arg, "mjpeg");
|
||||
stream->fmt = ffserver_guess_format(arg, NULL, NULL);
|
||||
if (!stream->fmt)
|
||||
ERROR("Unknown Format: '%s'\n", arg);
|
||||
ERROR("Unknown Format: %s\n", arg);
|
||||
}
|
||||
if (stream->fmt) {
|
||||
config->guessed_audio_codec_id = stream->fmt->audio_codec;
|
||||
@@ -876,7 +834,7 @@ static int ffserver_parse_config_stream(FFServerConfig *config, const char *cmd,
|
||||
ffserver_get_arg(arg, sizeof(arg), p);
|
||||
stream->ifmt = av_find_input_format(arg);
|
||||
if (!stream->ifmt)
|
||||
ERROR("Unknown input format: '%s'\n", arg);
|
||||
ERROR("Unknown input format: %s\n", arg);
|
||||
} else if (!av_strcasecmp(cmd, "FaviconURL")) {
|
||||
if (stream->stream_type == STREAM_TYPE_STATUS)
|
||||
ffserver_get_arg(stream->feed_filename,
|
||||
@@ -893,8 +851,8 @@ static int ffserver_parse_config_stream(FFServerConfig *config, const char *cmd,
|
||||
for (i = 0; i < strlen(cmd); i++)
|
||||
key[i] = av_tolower(cmd[i]);
|
||||
key[i] = 0;
|
||||
WARNING("Deprecated '%s' option in configuration file. Use "
|
||||
"'Metadata %s VALUE' instead.\n", cmd, key);
|
||||
WARNING("'%s' option in configuration file is deprecated, "
|
||||
"use 'Metadata %s VALUE' instead\n", cmd, key);
|
||||
if (av_dict_set(&stream->metadata, key, arg, 0) < 0)
|
||||
goto nomem;
|
||||
} else if (!av_strcasecmp(cmd, "Metadata")) {
|
||||
@@ -920,9 +878,8 @@ static int ffserver_parse_config_stream(FFServerConfig *config, const char *cmd,
|
||||
float f;
|
||||
ffserver_get_arg(arg, sizeof(arg), p);
|
||||
ffserver_set_float_param(&f, arg, 1000, -FLT_MAX, FLT_MAX, config,
|
||||
"Invalid %s: '%s'\n", cmd, arg);
|
||||
if (ffserver_save_avoption_int("ab", (int64_t)lrintf(f),
|
||||
AV_OPT_FLAG_AUDIO_PARAM, config) < 0)
|
||||
"Invalid %s: %s\n", cmd, arg);
|
||||
if (ffserver_save_avoption_int("ab", (int64_t)lrintf(f), AV_OPT_FLAG_AUDIO_PARAM, config) < 0)
|
||||
goto nomem;
|
||||
} else if (!av_strcasecmp(cmd, "AudioChannels")) {
|
||||
ffserver_get_arg(arg, sizeof(arg), p);
|
||||
@@ -940,15 +897,15 @@ static int ffserver_parse_config_stream(FFServerConfig *config, const char *cmd,
|
||||
if (dash) {
|
||||
*dash = '\0';
|
||||
dash++;
|
||||
if (ffserver_set_int_param(&minrate, arg, 1000, 0, INT_MAX, config, "Invalid %s: '%s'", cmd, arg) >= 0 &&
|
||||
ffserver_set_int_param(&maxrate, dash, 1000, 0, INT_MAX, config, "Invalid %s: '%s'", cmd, arg) >= 0) {
|
||||
if (ffserver_set_int_param(&minrate, arg, 1000, 0, INT_MAX, config, "Invalid %s: %s", cmd, arg) >= 0 &&
|
||||
ffserver_set_int_param(&maxrate, dash, 1000, 0, INT_MAX, config, "Invalid %s: %s", cmd, arg) >= 0) {
|
||||
if (ffserver_save_avoption_int("minrate", minrate, AV_OPT_FLAG_VIDEO_PARAM, config) < 0 ||
|
||||
ffserver_save_avoption_int("maxrate", maxrate, AV_OPT_FLAG_VIDEO_PARAM, config) < 0)
|
||||
goto nomem;
|
||||
}
|
||||
} else
|
||||
ERROR("Incorrect format for VideoBitRateRange. It should be "
|
||||
"<min>-<max>: '%s'.\n", arg);
|
||||
ERROR("Incorrect format for VideoBitRateRange -- should be "
|
||||
"<min>-<max>: %s\n", arg);
|
||||
} else if (!av_strcasecmp(cmd, "Debug")) {
|
||||
ffserver_get_arg(arg, sizeof(arg), p);
|
||||
if (ffserver_save_avoption("debug", arg, AV_OPT_FLAG_AUDIO_PARAM, config) < 0 ||
|
||||
@@ -962,19 +919,19 @@ static int ffserver_parse_config_stream(FFServerConfig *config, const char *cmd,
|
||||
} else if (!av_strcasecmp(cmd, "VideoBufferSize")) {
|
||||
ffserver_get_arg(arg, sizeof(arg), p);
|
||||
ffserver_set_int_param(&val, arg, 8*1024, 0, INT_MAX, config,
|
||||
"Invalid %s: '%s'", cmd, arg);
|
||||
"Invalid %s: %s", cmd, arg);
|
||||
if (ffserver_save_avoption_int("bufsize", val, AV_OPT_FLAG_VIDEO_PARAM, config) < 0)
|
||||
goto nomem;
|
||||
} else if (!av_strcasecmp(cmd, "VideoBitRateTolerance")) {
|
||||
ffserver_get_arg(arg, sizeof(arg), p);
|
||||
ffserver_set_int_param(&val, arg, 1000, INT_MIN, INT_MAX, config,
|
||||
"Invalid %s: '%s'", cmd, arg);
|
||||
"Invalid %s: %s", cmd, arg);
|
||||
if (ffserver_save_avoption_int("bt", val, AV_OPT_FLAG_VIDEO_PARAM, config) < 0)
|
||||
goto nomem;
|
||||
} else if (!av_strcasecmp(cmd, "VideoBitRate")) {
|
||||
ffserver_get_arg(arg, sizeof(arg), p);
|
||||
ffserver_set_int_param(&val, arg, 1000, INT_MIN, INT_MAX, config,
|
||||
"Invalid %s: '%s'", cmd, arg);
|
||||
"Invalid %s: %s", cmd, arg);
|
||||
if (ffserver_save_avoption_int("b", val, AV_OPT_FLAG_VIDEO_PARAM, config) < 0)
|
||||
goto nomem;
|
||||
} else if (!av_strcasecmp(cmd, "VideoSize")) {
|
||||
@@ -999,7 +956,7 @@ static int ffserver_parse_config_stream(FFServerConfig *config, const char *cmd,
|
||||
ffserver_get_arg(arg, sizeof(arg), p);
|
||||
pix_fmt = av_get_pix_fmt(arg);
|
||||
if (pix_fmt == AV_PIX_FMT_NONE)
|
||||
ERROR("Unknown pixel format: '%s'\n", arg);
|
||||
ERROR("Unknown pixel format: %s\n", arg);
|
||||
else if (ffserver_save_avoption("pixel_format", arg, AV_OPT_FLAG_VIDEO_PARAM, config) < 0)
|
||||
goto nomem;
|
||||
} else if (!av_strcasecmp(cmd, "VideoGopSize")) {
|
||||
@@ -1022,11 +979,9 @@ static int ffserver_parse_config_stream(FFServerConfig *config, const char *cmd,
|
||||
ffserver_get_arg(arg, sizeof(arg), p);
|
||||
ffserver_get_arg(arg2, sizeof(arg2), p);
|
||||
if (!av_strcasecmp(cmd, "AVOptionVideo"))
|
||||
ret = ffserver_save_avoption(arg, arg2, AV_OPT_FLAG_VIDEO_PARAM,
|
||||
config);
|
||||
ret = ffserver_save_avoption(arg, arg2, AV_OPT_FLAG_VIDEO_PARAM, config);
|
||||
else
|
||||
ret = ffserver_save_avoption(arg, arg2, AV_OPT_FLAG_AUDIO_PARAM,
|
||||
config);
|
||||
ret = ffserver_save_avoption(arg, arg2, AV_OPT_FLAG_AUDIO_PARAM, config);
|
||||
if (ret < 0)
|
||||
goto nomem;
|
||||
} else if (!av_strcasecmp(cmd, "AVPresetVideo") ||
|
||||
@@ -1039,8 +994,7 @@ static int ffserver_parse_config_stream(FFServerConfig *config, const char *cmd,
|
||||
} else if (!av_strcasecmp(cmd, "VideoTag")) {
|
||||
ffserver_get_arg(arg, sizeof(arg), p);
|
||||
if (strlen(arg) == 4 &&
|
||||
ffserver_save_avoption_int("codec_tag",
|
||||
MKTAG(arg[0], arg[1], arg[2], arg[3]),
|
||||
ffserver_save_avoption_int("codec_tag", MKTAG(arg[0], arg[1], arg[2], arg[3]),
|
||||
AV_OPT_FLAG_VIDEO_PARAM, config) < 0)
|
||||
goto nomem;
|
||||
} else if (!av_strcasecmp(cmd, "BitExact")) {
|
||||
@@ -1055,7 +1009,7 @@ static int ffserver_parse_config_stream(FFServerConfig *config, const char *cmd,
|
||||
} else if (!av_strcasecmp(cmd, "Qscale")) {
|
||||
ffserver_get_arg(arg, sizeof(arg), p);
|
||||
ffserver_set_int_param(&val, arg, 0, INT_MIN, INT_MAX, config,
|
||||
"Invalid Qscale: '%s'\n", arg);
|
||||
"Invalid Qscale: %s\n", arg);
|
||||
if (ffserver_save_avoption("flags", "+qscale", AV_OPT_FLAG_VIDEO_PARAM, config) < 0 ||
|
||||
ffserver_save_avoption_int("global_quality", FF_QP2LAMBDA * val,
|
||||
AV_OPT_FLAG_VIDEO_PARAM, config) < 0)
|
||||
@@ -1096,18 +1050,18 @@ static int ffserver_parse_config_stream(FFServerConfig *config, const char *cmd,
|
||||
} else if (!av_strcasecmp(cmd, "MulticastAddress")) {
|
||||
ffserver_get_arg(arg, sizeof(arg), p);
|
||||
if (resolve_host(&stream->multicast_ip, arg))
|
||||
ERROR("Invalid host/IP address: '%s'\n", arg);
|
||||
ERROR("Invalid host/IP address: %s\n", arg);
|
||||
stream->is_multicast = 1;
|
||||
stream->loop = 1; /* default is looping */
|
||||
} else if (!av_strcasecmp(cmd, "MulticastPort")) {
|
||||
ffserver_get_arg(arg, sizeof(arg), p);
|
||||
ffserver_set_int_param(&val, arg, 0, 1, 65535, config,
|
||||
"Invalid MulticastPort: '%s'\n", arg);
|
||||
"Invalid MulticastPort: %s\n", arg);
|
||||
stream->multicast_port = val;
|
||||
} else if (!av_strcasecmp(cmd, "MulticastTTL")) {
|
||||
ffserver_get_arg(arg, sizeof(arg), p);
|
||||
ffserver_set_int_param(&val, arg, 0, INT_MIN, INT_MAX, config,
|
||||
"Invalid MulticastTTL: '%s'\n", arg);
|
||||
"Invalid MulticastTTL: %s\n", arg);
|
||||
stream->multicast_ttl = val;
|
||||
} else if (!av_strcasecmp(cmd, "NoLoop")) {
|
||||
stream->loop = 0;
|
||||
@@ -1116,15 +1070,13 @@ static int ffserver_parse_config_stream(FFServerConfig *config, const char *cmd,
|
||||
if (stream->feed && stream->fmt && strcmp(stream->fmt->name, "ffm")) {
|
||||
if (config->dummy_actx->codec_id == AV_CODEC_ID_NONE)
|
||||
config->dummy_actx->codec_id = config->guessed_audio_codec_id;
|
||||
if (!config->no_audio &&
|
||||
config->dummy_actx->codec_id != AV_CODEC_ID_NONE) {
|
||||
if (!config->no_audio && config->dummy_actx->codec_id != AV_CODEC_ID_NONE) {
|
||||
AVCodecContext *audio_enc = avcodec_alloc_context3(avcodec_find_encoder(config->dummy_actx->codec_id));
|
||||
add_codec(stream, audio_enc, config);
|
||||
}
|
||||
if (config->dummy_vctx->codec_id == AV_CODEC_ID_NONE)
|
||||
config->dummy_vctx->codec_id = config->guessed_video_codec_id;
|
||||
if (!config->no_video &&
|
||||
config->dummy_vctx->codec_id != AV_CODEC_ID_NONE) {
|
||||
if (!config->no_video && config->dummy_vctx->codec_id != AV_CODEC_ID_NONE) {
|
||||
AVCodecContext *video_enc = avcodec_alloc_context3(avcodec_find_encoder(config->dummy_vctx->codec_id));
|
||||
add_codec(stream, video_enc, config);
|
||||
}
|
||||
@@ -1134,8 +1086,7 @@ static int ffserver_parse_config_stream(FFServerConfig *config, const char *cmd,
|
||||
avcodec_free_context(&config->dummy_vctx);
|
||||
avcodec_free_context(&config->dummy_actx);
|
||||
*pstream = NULL;
|
||||
} else if (!av_strcasecmp(cmd, "File") ||
|
||||
!av_strcasecmp(cmd, "ReadOnlyFile")) {
|
||||
} else if (!av_strcasecmp(cmd, "File") || !av_strcasecmp(cmd, "ReadOnlyFile")) {
|
||||
ffserver_get_arg(stream->feed_filename, sizeof(stream->feed_filename),
|
||||
p);
|
||||
} else if (!av_strcasecmp(cmd, "UseDefaults")) {
|
||||
@@ -1159,8 +1110,7 @@ static int ffserver_parse_config_stream(FFServerConfig *config, const char *cmd,
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
|
||||
static int ffserver_parse_config_redirect(FFServerConfig *config,
|
||||
const char *cmd, const char **p,
|
||||
static int ffserver_parse_config_redirect(FFServerConfig *config, const char *cmd, const char **p,
|
||||
FFServerStream **predirect)
|
||||
{
|
||||
FFServerStream *redirect;
|
||||
@@ -1207,6 +1157,7 @@ int ffserver_parse_ffconfig(const char *filename, FFServerConfig *config)
|
||||
|
||||
av_assert0(config);
|
||||
|
||||
config->line_num = 0;
|
||||
f = fopen(filename, "r");
|
||||
if (!f) {
|
||||
ret = AVERROR(errno);
|
||||
@@ -1216,14 +1167,14 @@ int ffserver_parse_ffconfig(const char *filename, FFServerConfig *config)
|
||||
}
|
||||
|
||||
config->first_stream = NULL;
|
||||
last_stream = &config->first_stream;
|
||||
config->first_feed = NULL;
|
||||
last_feed = &config->first_feed;
|
||||
config->errors = config->warnings = 0;
|
||||
|
||||
last_stream = &config->first_stream;
|
||||
last_feed = &config->first_feed;
|
||||
|
||||
config->line_num = 0;
|
||||
while (fgets(line, sizeof(line), f) != NULL) {
|
||||
for(;;) {
|
||||
if (fgets(line, sizeof(line), f) == NULL)
|
||||
break;
|
||||
config->line_num++;
|
||||
p = line;
|
||||
while (av_isspace(*p))
|
||||
@@ -1238,14 +1189,14 @@ int ffserver_parse_ffconfig(const char *filename, FFServerConfig *config)
|
||||
if (opening && (stream || feed || redirect)) {
|
||||
ERROR("Already in a tag\n");
|
||||
} else {
|
||||
ret = ffserver_parse_config_feed(config, cmd, &p, &feed);
|
||||
if (ret < 0)
|
||||
if ((ret = ffserver_parse_config_feed(config, cmd, &p, &feed)) < 0)
|
||||
break;
|
||||
if (opening) {
|
||||
/* add in stream & feed list */
|
||||
/* add in stream list */
|
||||
*last_stream = feed;
|
||||
*last_feed = feed;
|
||||
last_stream = &feed->next;
|
||||
/* add in feed list */
|
||||
*last_feed = feed;
|
||||
last_feed = &feed->next_feed;
|
||||
}
|
||||
}
|
||||
@@ -1254,8 +1205,7 @@ int ffserver_parse_ffconfig(const char *filename, FFServerConfig *config)
|
||||
if (opening && (stream || feed || redirect)) {
|
||||
ERROR("Already in a tag\n");
|
||||
} else {
|
||||
ret = ffserver_parse_config_stream(config, cmd, &p, &stream);
|
||||
if (ret < 0)
|
||||
if ((ret = ffserver_parse_config_stream(config, cmd, &p, &stream)) < 0)
|
||||
break;
|
||||
if (opening) {
|
||||
/* add in stream list */
|
||||
@@ -1268,9 +1218,7 @@ int ffserver_parse_ffconfig(const char *filename, FFServerConfig *config)
|
||||
if (opening && (stream || feed || redirect))
|
||||
ERROR("Already in a tag\n");
|
||||
else {
|
||||
ret = ffserver_parse_config_redirect(config, cmd, &p,
|
||||
&redirect);
|
||||
if (ret < 0)
|
||||
if ((ret = ffserver_parse_config_redirect(config, cmd, &p, &redirect)) < 0)
|
||||
break;
|
||||
if (opening) {
|
||||
/* add in stream list */
|
||||
@@ -1283,8 +1231,7 @@ int ffserver_parse_ffconfig(const char *filename, FFServerConfig *config)
|
||||
}
|
||||
}
|
||||
if (stream || feed || redirect)
|
||||
ERROR("Missing closing </%s> tag\n",
|
||||
stream ? "Stream" : (feed ? "Feed" : "Redirect"));
|
||||
ERROR("Not closed tag %s\n", stream ? "<Stream>" : (feed ? "<Feed>" : "<Redirect>"));
|
||||
|
||||
fclose(f);
|
||||
if (ret < 0)
|
||||
|
@@ -7,7 +7,6 @@ HEADERS = avcodec.h \
|
||||
dv_profile.h \
|
||||
dxva2.h \
|
||||
old_codec_ids.h \
|
||||
qsv.h \
|
||||
vaapi.h \
|
||||
vda.h \
|
||||
vdpau.h \
|
||||
@@ -24,11 +23,11 @@ OBJS = allcodecs.o \
|
||||
bitstream_filter.o \
|
||||
codec_desc.o \
|
||||
dv_profile.o \
|
||||
fmtconvert.o \
|
||||
imgconvert.o \
|
||||
mathtables.o \
|
||||
options.o \
|
||||
parser.o \
|
||||
qsv_api.o \
|
||||
raw.o \
|
||||
resample.o \
|
||||
resample2.o \
|
||||
@@ -55,7 +54,6 @@ FFT-OBJS-$(CONFIG_HARDCODED_TABLES) += cos_tables.o cos_fixed_tables.o
|
||||
OBJS-$(CONFIG_FFT) += avfft.o fft_fixed.o fft_float.o \
|
||||
fft_fixed_32.o fft_init_table.o \
|
||||
$(FFT-OBJS-yes)
|
||||
OBJS-$(CONFIG_FMTCONVERT) += fmtconvert.o
|
||||
OBJS-$(CONFIG_GOLOMB) += golomb.o
|
||||
OBJS-$(CONFIG_H263DSP) += h263dsp.o
|
||||
OBJS-$(CONFIG_H264CHROMA) += h264chroma.o
|
||||
@@ -68,7 +66,6 @@ OBJS-$(CONFIG_HUFFYUVDSP) += huffyuvdsp.o
|
||||
OBJS-$(CONFIG_HUFFYUVENCDSP) += huffyuvencdsp.o
|
||||
OBJS-$(CONFIG_IDCTDSP) += idctdsp.o simple_idct.o jrevdct.o
|
||||
OBJS-$(CONFIG_IIRFILTER) += iirfilter.o
|
||||
OBJS-$(CONFIG_IMDCT15) += imdct15.o
|
||||
OBJS-$(CONFIG_INTRAX8) += intrax8.o intrax8dsp.o
|
||||
OBJS-$(CONFIG_LIBXVID) += libxvid_rc.o
|
||||
OBJS-$(CONFIG_LLAUDDSP) += lossless_audiodsp.o
|
||||
@@ -91,7 +88,6 @@ OBJS-$(CONFIG_MPEGVIDEOENC) += mpegvideo_enc.o mpeg12data.o \
|
||||
mpegvideoencdsp.o
|
||||
OBJS-$(CONFIG_PIXBLOCKDSP) += pixblockdsp.o
|
||||
OBJS-$(CONFIG_QPELDSP) += qpeldsp.o
|
||||
OBJS-$(CONFIG_QSV) += qsv.o
|
||||
OBJS-$(CONFIG_RANGECODER) += rangecoder.o
|
||||
RDFT-OBJS-$(CONFIG_HARDCODED_TABLES) += sin_tables.o
|
||||
OBJS-$(CONFIG_RDFT) += rdft.o $(RDFT-OBJS-yes)
|
||||
@@ -177,7 +173,6 @@ OBJS-$(CONFIG_BRENDER_PIX_DECODER) += brenderpix.o
|
||||
OBJS-$(CONFIG_C93_DECODER) += c93.o
|
||||
OBJS-$(CONFIG_CAVS_DECODER) += cavs.o cavsdec.o cavsdsp.o \
|
||||
cavsdata.o mpeg12data.o
|
||||
OBJS-$(CONFIG_CCAPTION_DECODER) += ccaption_dec.o
|
||||
OBJS-$(CONFIG_CDGRAPHICS_DECODER) += cdgraphics.o
|
||||
OBJS-$(CONFIG_CDXL_DECODER) += cdxl.o
|
||||
OBJS-$(CONFIG_CINEPAK_DECODER) += cinepak.o
|
||||
@@ -192,9 +187,8 @@ OBJS-$(CONFIG_CPIA_DECODER) += cpia.o
|
||||
OBJS-$(CONFIG_CSCD_DECODER) += cscd.o
|
||||
OBJS-$(CONFIG_CYUV_DECODER) += cyuv.o
|
||||
OBJS-$(CONFIG_DCA_DECODER) += dcadec.o dca.o dcadsp.o \
|
||||
dcadata.o dca_exss.o \
|
||||
synth_filter.o
|
||||
OBJS-$(CONFIG_DCA_ENCODER) += dcaenc.o dca.o dcadata.o
|
||||
OBJS-$(CONFIG_DCA_ENCODER) += dcaenc.o dca.o
|
||||
OBJS-$(CONFIG_DIRAC_DECODER) += diracdec.o dirac.o diracdsp.o \
|
||||
dirac_arith.o mpeg12data.o dirac_dwt.o
|
||||
OBJS-$(CONFIG_DFA_DECODER) += dfa.o
|
||||
@@ -208,7 +202,6 @@ OBJS-$(CONFIG_DSD_LSBF_PLANAR_DECODER) += dsddec.o
|
||||
OBJS-$(CONFIG_DSD_MSBF_PLANAR_DECODER) += dsddec.o
|
||||
OBJS-$(CONFIG_DSICINAUDIO_DECODER) += dsicinaudio.o
|
||||
OBJS-$(CONFIG_DSICINVIDEO_DECODER) += dsicinvideo.o
|
||||
OBJS-$(CONFIG_DSS_SP_DECODER) += dss_sp.o
|
||||
OBJS-$(CONFIG_DVBSUB_DECODER) += dvbsubdec.o
|
||||
OBJS-$(CONFIG_DVBSUB_ENCODER) += dvbsub.o
|
||||
OBJS-$(CONFIG_DVDSUB_DECODER) += dvdsubdec.o
|
||||
@@ -267,12 +260,10 @@ OBJS-$(CONFIG_H264_DECODER) += h264.o h264_cabac.o h264_cavlc.o \
|
||||
h264_mb.o h264_picture.o h264_ps.o \
|
||||
h264_refs.o h264_sei.o h264_slice.o
|
||||
OBJS-$(CONFIG_H264_VDA_DECODER) += vda_h264_dec.o
|
||||
OBJS-$(CONFIG_H264_QSV_DECODER) += qsv_h264.o
|
||||
OBJS-$(CONFIG_HEVC_DECODER) += hevc.o hevc_mvs.o hevc_ps.o hevc_sei.o \
|
||||
hevc_cabac.o hevc_refs.o hevcpred.o \
|
||||
hevcdsp.o hevc_filter.o
|
||||
OBJS-$(CONFIG_HNM4_VIDEO_DECODER) += hnm4video.o
|
||||
OBJS-$(CONFIG_HQX_DECODER) += hqx.o hqxvlc.o
|
||||
OBJS-$(CONFIG_HUFFYUV_DECODER) += huffyuv.o huffyuvdec.o
|
||||
OBJS-$(CONFIG_HUFFYUV_ENCODER) += huffyuv.o huffyuvenc.o
|
||||
OBJS-$(CONFIG_IDCIN_DECODER) += idcinvideo.o
|
||||
@@ -356,10 +347,10 @@ OBJS-$(CONFIG_MXPEG_DECODER) += mxpegdec.o
|
||||
OBJS-$(CONFIG_NELLYMOSER_DECODER) += nellymoserdec.o nellymoser.o
|
||||
OBJS-$(CONFIG_NELLYMOSER_ENCODER) += nellymoserenc.o nellymoser.o
|
||||
OBJS-$(CONFIG_NUV_DECODER) += nuv.o rtjpeg.o
|
||||
OBJS-$(CONFIG_NVENC_ENCODER) += nvenc.o
|
||||
OBJS-$(CONFIG_ON2AVC_DECODER) += on2avc.o on2avcdata.o
|
||||
OBJS-$(CONFIG_OPUS_DECODER) += opusdec.o opus.o opus_celt.o \
|
||||
opus_silk.o vorbis_data.o
|
||||
opus_imdct.o opus_silk.o \
|
||||
vorbis_data.o
|
||||
OBJS-$(CONFIG_PAF_AUDIO_DECODER) += pafaudio.o
|
||||
OBJS-$(CONFIG_PAF_VIDEO_DECODER) += pafvideo.o
|
||||
OBJS-$(CONFIG_PAM_DECODER) += pnmdec.o pnm.o
|
||||
@@ -626,8 +617,8 @@ OBJS-$(CONFIG_ADPCM_EA_R1_DECODER) += adpcm.o adpcm_data.o
|
||||
OBJS-$(CONFIG_ADPCM_EA_R2_DECODER) += adpcm.o adpcm_data.o
|
||||
OBJS-$(CONFIG_ADPCM_EA_R3_DECODER) += adpcm.o adpcm_data.o
|
||||
OBJS-$(CONFIG_ADPCM_EA_XAS_DECODER) += adpcm.o adpcm_data.o
|
||||
OBJS-$(CONFIG_ADPCM_G722_DECODER) += g722.o g722dsp.o g722dec.o
|
||||
OBJS-$(CONFIG_ADPCM_G722_ENCODER) += g722.o g722dsp.o g722enc.o
|
||||
OBJS-$(CONFIG_ADPCM_G722_DECODER) += g722.o g722dec.o
|
||||
OBJS-$(CONFIG_ADPCM_G722_ENCODER) += g722.o g722enc.o
|
||||
OBJS-$(CONFIG_ADPCM_G726_DECODER) += g726.o
|
||||
OBJS-$(CONFIG_ADPCM_G726_ENCODER) += g726.o
|
||||
OBJS-$(CONFIG_ADPCM_G726LE_DECODER) += g726.o
|
||||
@@ -666,23 +657,22 @@ OBJS-$(CONFIG_VAAPI) += vaapi.o
|
||||
OBJS-$(CONFIG_VDA) += vda.o
|
||||
OBJS-$(CONFIG_VDPAU) += vdpau.o
|
||||
|
||||
OBJS-$(CONFIG_H263_VAAPI_HWACCEL) += vaapi_mpeg4.o
|
||||
OBJS-$(CONFIG_H263_VAAPI_HWACCEL) += vaapi_mpeg4.o vaapi_mpeg.o
|
||||
OBJS-$(CONFIG_H263_VDPAU_HWACCEL) += vdpau_mpeg4.o
|
||||
OBJS-$(CONFIG_H264_DXVA2_HWACCEL) += dxva2_h264.o
|
||||
OBJS-$(CONFIG_H264_VAAPI_HWACCEL) += vaapi_h264.o
|
||||
OBJS-$(CONFIG_H264_VDA_HWACCEL) += vda_h264.o
|
||||
OBJS-$(CONFIG_H264_VDPAU_HWACCEL) += vdpau_h264.o
|
||||
OBJS-$(CONFIG_HEVC_DXVA2_HWACCEL) += dxva2_hevc.o
|
||||
OBJS-$(CONFIG_MPEG1_VDPAU_HWACCEL) += vdpau_mpeg12.o
|
||||
OBJS-$(CONFIG_MPEG1_XVMC_HWACCEL) += mpegvideo_xvmc.o
|
||||
OBJS-$(CONFIG_MPEG2_DXVA2_HWACCEL) += dxva2_mpeg2.o
|
||||
OBJS-$(CONFIG_MPEG2_VAAPI_HWACCEL) += vaapi_mpeg2.o
|
||||
OBJS-$(CONFIG_MPEG2_VAAPI_HWACCEL) += vaapi_mpeg2.o vaapi_mpeg.o
|
||||
OBJS-$(CONFIG_MPEG2_VDPAU_HWACCEL) += vdpau_mpeg12.o
|
||||
OBJS-$(CONFIG_MPEG2_XVMC_HWACCEL) += mpegvideo_xvmc.o
|
||||
OBJS-$(CONFIG_MPEG4_VAAPI_HWACCEL) += vaapi_mpeg4.o
|
||||
OBJS-$(CONFIG_MPEG4_VAAPI_HWACCEL) += vaapi_mpeg4.o vaapi_mpeg.o
|
||||
OBJS-$(CONFIG_MPEG4_VDPAU_HWACCEL) += vdpau_mpeg4.o
|
||||
OBJS-$(CONFIG_VC1_DXVA2_HWACCEL) += dxva2_vc1.o
|
||||
OBJS-$(CONFIG_VC1_VAAPI_HWACCEL) += vaapi_vc1.o
|
||||
OBJS-$(CONFIG_VC1_VAAPI_HWACCEL) += vaapi_vc1.o vaapi_mpeg.o
|
||||
OBJS-$(CONFIG_VC1_VDPAU_HWACCEL) += vdpau_vc1.o
|
||||
|
||||
# libavformat dependencies
|
||||
@@ -709,7 +699,6 @@ 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_NUT_DEMUXER) += mpegaudiodata.o mpeg4audio.o
|
||||
OBJS-$(CONFIG_OGA_MUXER) += flac.o flacdata.o
|
||||
OBJS-$(CONFIG_OGG_DEMUXER) += mpeg12data.o \
|
||||
dirac.o vorbis_data.o
|
||||
@@ -744,7 +733,6 @@ OBJS-$(CONFIG_LIBMP3LAME_ENCODER) += libmp3lame.o mpegaudiodecheader.o
|
||||
OBJS-$(CONFIG_LIBOPENCORE_AMRNB_DECODER) += libopencore-amr.o
|
||||
OBJS-$(CONFIG_LIBOPENCORE_AMRNB_ENCODER) += libopencore-amr.o
|
||||
OBJS-$(CONFIG_LIBOPENCORE_AMRWB_DECODER) += libopencore-amr.o
|
||||
OBJS-$(CONFIG_LIBOPENH264_ENCODER) += libopenh264enc.o
|
||||
OBJS-$(CONFIG_LIBOPENJPEG_DECODER) += libopenjpegdec.o
|
||||
OBJS-$(CONFIG_LIBOPENJPEG_ENCODER) += libopenjpegenc.o
|
||||
OBJS-$(CONFIG_LIBOPUS_DECODER) += libopusdec.o libopus.o \
|
||||
@@ -820,7 +808,9 @@ OBJS-$(CONFIG_PNM_PARSER) += pnm_parser.o pnm.o
|
||||
OBJS-$(CONFIG_RV30_PARSER) += rv34_parser.o
|
||||
OBJS-$(CONFIG_RV40_PARSER) += rv34_parser.o
|
||||
OBJS-$(CONFIG_TAK_PARSER) += tak_parser.o tak.o
|
||||
OBJS-$(CONFIG_VC1_PARSER) += vc1_parser.o
|
||||
OBJS-$(CONFIG_VC1_PARSER) += vc1_parser.o vc1.o vc1data.o vc1dsp.o \
|
||||
msmpeg4.o msmpeg4data.o mpeg4video.o \
|
||||
h263.o
|
||||
OBJS-$(CONFIG_VP3_PARSER) += vp3_parser.o
|
||||
OBJS-$(CONFIG_VP8_PARSER) += vp8_parser.o
|
||||
OBJS-$(CONFIG_VP9_PARSER) += vp9_parser.o
|
||||
@@ -857,22 +847,17 @@ SKIPHEADERS += %_tablegen.h \
|
||||
libutvideo.h \
|
||||
old_codec_ids.h \
|
||||
tableprint.h \
|
||||
tableprint_vlc.h \
|
||||
$(ARCH)/vp56_arith.h \
|
||||
|
||||
SKIPHEADERS-$(CONFIG_DXVA2) += dxva2.h dxva2_internal.h
|
||||
SKIPHEADERS-$(CONFIG_LIBSCHROEDINGER) += libschroedinger.h
|
||||
SKIPHEADERS-$(CONFIG_LIBUTVIDEO) += libutvideo.h
|
||||
SKIPHEADERS-$(CONFIG_QSV) += qsv.h qsv_internal.h
|
||||
SKIPHEADERS-$(CONFIG_XVMC) += xvmc.h
|
||||
SKIPHEADERS-$(CONFIG_VAAPI) += vaapi_internal.h
|
||||
SKIPHEADERS-$(CONFIG_VDA) += vda.h vda_internal.h
|
||||
SKIPHEADERS-$(CONFIG_VDPAU) += vdpau.h vdpau_internal.h
|
||||
|
||||
TESTPROGS = imgconvert \
|
||||
options \
|
||||
avfft \
|
||||
|
||||
|
||||
TESTPROGS-$(CONFIG_CABAC) += cabac
|
||||
TESTPROGS-$(CONFIG_FFT) += fft fft-fixed fft-fixed32
|
||||
|
@@ -332,14 +332,8 @@ static int a64multi_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
|
||||
buf = pkt->data;
|
||||
|
||||
/* calc optimal new charset + charmaps */
|
||||
ret = avpriv_init_elbg(meta, 32, 1000 * c->mc_lifetime, best_cb,
|
||||
CHARSET_CHARS, 50, charmap, &c->randctx);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
ret = avpriv_do_elbg(meta, 32, 1000 * c->mc_lifetime, best_cb,
|
||||
CHARSET_CHARS, 50, charmap, &c->randctx);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
avpriv_init_elbg(meta, 32, 1000 * c->mc_lifetime, best_cb, CHARSET_CHARS, 50, charmap, &c->randctx);
|
||||
avpriv_do_elbg (meta, 32, 1000 * c->mc_lifetime, best_cb, CHARSET_CHARS, 50, charmap, &c->randctx);
|
||||
|
||||
/* create colorram map and a c64 readable charset */
|
||||
render_charset(avctx, charset, colram);
|
||||
|
@@ -32,10 +32,10 @@
|
||||
|
||||
#include "libavutil/float_dsp.h"
|
||||
#include "avcodec.h"
|
||||
#include "imdct15.h"
|
||||
#include "fft.h"
|
||||
#include "mpeg4audio.h"
|
||||
#include "sbr.h"
|
||||
#include "fmtconvert.h"
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
@@ -233,8 +233,7 @@ typedef struct SingleChannelElement {
|
||||
float sf[120]; ///< scalefactors
|
||||
int sf_idx[128]; ///< scalefactor indices (used by encoder)
|
||||
uint8_t zeroes[128]; ///< band is not coded (used by encoder)
|
||||
DECLARE_ALIGNED(32, float, pcoeffs)[1024]; ///< coefficients for IMDCT, pristine
|
||||
DECLARE_ALIGNED(32, float, coeffs)[1024]; ///< coefficients for IMDCT, maybe processed
|
||||
DECLARE_ALIGNED(32, float, coeffs)[1024]; ///< coefficients for IMDCT
|
||||
DECLARE_ALIGNED(32, float, saved)[1536]; ///< overlap
|
||||
DECLARE_ALIGNED(32, float, ret_buf)[2048]; ///< PCM output buffer
|
||||
DECLARE_ALIGNED(16, float, ltp_state)[3072]; ///< time signal for LTP
|
||||
@@ -295,7 +294,7 @@ struct AACContext {
|
||||
FFTContext mdct_small;
|
||||
FFTContext mdct_ld;
|
||||
FFTContext mdct_ltp;
|
||||
IMDCT15Context *mdct480;
|
||||
FmtConvertContext fmt_conv;
|
||||
AVFloatDSPContext *fdsp;
|
||||
int random_state;
|
||||
/** @} */
|
||||
|
@@ -90,10 +90,6 @@ static int aac_adtstoasc_filter(AVBitStreamFilterContext *bsfc,
|
||||
av_free(avctx->extradata);
|
||||
avctx->extradata_size = 2 + pce_size;
|
||||
avctx->extradata = av_mallocz(avctx->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
|
||||
if (!avctx->extradata) {
|
||||
avctx->extradata_size = 0;
|
||||
return AVERROR(ENOMEM);
|
||||
}
|
||||
|
||||
init_put_bits(&pb, avctx->extradata, avctx->extradata_size);
|
||||
put_bits(&pb, 5, hdr.object_type);
|
||||
|
@@ -161,7 +161,7 @@ static av_always_inline float quantize_and_encode_band_cost_template(
|
||||
di = t - CLIPPED_ESCAPE;
|
||||
curbits += 21;
|
||||
} else {
|
||||
int c = av_clip_uintp2(quant(t, Q), 13);
|
||||
int c = av_clip(quant(t, Q), 0, 8191);
|
||||
di = t - c*cbrtf(c)*IQ;
|
||||
curbits += av_log2(c)*2 - 4 + 1;
|
||||
}
|
||||
@@ -191,7 +191,7 @@ static av_always_inline float quantize_and_encode_band_cost_template(
|
||||
if (BT_ESC) {
|
||||
for (j = 0; j < 2; j++) {
|
||||
if (ff_aac_codebook_vectors[cb-1][curidx*2+j] == 64.0f) {
|
||||
int coef = av_clip_uintp2(quant(fabsf(in[i+j]), Q), 13);
|
||||
int coef = av_clip(quant(fabsf(in[i+j]), Q), 0, 8191);
|
||||
int len = av_log2(coef);
|
||||
|
||||
put_bits(pb, len - 4 + 1, (1 << (len - 4 + 1)) - 2);
|
||||
@@ -1069,10 +1069,10 @@ static void search_for_ms(AACEncContext *s, ChannelElement *cpe,
|
||||
float minthr = FFMIN(band0->threshold, band1->threshold);
|
||||
float maxthr = FFMAX(band0->threshold, band1->threshold);
|
||||
for (i = 0; i < sce0->ics.swb_sizes[g]; i++) {
|
||||
M[i] = (sce0->pcoeffs[start+w2*128+i]
|
||||
+ sce1->pcoeffs[start+w2*128+i]) * 0.5;
|
||||
M[i] = (sce0->coeffs[start+w2*128+i]
|
||||
+ sce1->coeffs[start+w2*128+i]) * 0.5;
|
||||
S[i] = M[i]
|
||||
- sce1->pcoeffs[start+w2*128+i];
|
||||
- sce1->coeffs[start+w2*128+i];
|
||||
}
|
||||
abs_pow34_v(L34, sce0->coeffs+start+w2*128, sce0->ics.swb_sizes[g]);
|
||||
abs_pow34_v(R34, sce1->coeffs+start+w2*128, sce0->ics.swb_sizes[g]);
|
||||
|
@@ -87,7 +87,7 @@
|
||||
#include "internal.h"
|
||||
#include "get_bits.h"
|
||||
#include "fft.h"
|
||||
#include "imdct15.h"
|
||||
#include "fmtconvert.h"
|
||||
#include "lpc.h"
|
||||
#include "kbdwin.h"
|
||||
#include "sinewin.h"
|
||||
@@ -102,6 +102,7 @@
|
||||
#include "aacadtsdec.h"
|
||||
#include "libavutil/intfloat.h"
|
||||
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
#include <math.h>
|
||||
#include <stdint.h>
|
||||
@@ -800,7 +801,6 @@ static int decode_ga_specific_config(AACContext *ac, AVCodecContext *avctx,
|
||||
avpriv_request_sample(avctx, "960/120 MDCT window");
|
||||
return AVERROR_PATCHWELCOME;
|
||||
}
|
||||
m4ac->frame_length_short = 0;
|
||||
|
||||
if (get_bits1(gb)) // dependsOnCoreCoder
|
||||
skip_bits(gb, 14); // coreCoderDelay
|
||||
@@ -878,7 +878,11 @@ static int decode_eld_specific_config(AACContext *ac, AVCodecContext *avctx,
|
||||
m4ac->ps = 0;
|
||||
m4ac->sbr = 0;
|
||||
|
||||
m4ac->frame_length_short = get_bits1(gb);
|
||||
if (get_bits1(gb)) { // frameLengthFlag
|
||||
avpriv_request_sample(avctx, "960/120 MDCT window");
|
||||
return AVERROR_PATCHWELCOME;
|
||||
}
|
||||
|
||||
res_flags = get_bits(gb, 3);
|
||||
if (res_flags) {
|
||||
avpriv_report_missing_feature(avctx,
|
||||
@@ -1132,6 +1136,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);
|
||||
@@ -1155,10 +1160,6 @@ static av_cold int aac_decode_init(AVCodecContext *avctx)
|
||||
ff_mdct_init(&ac->mdct_ld, 10, 1, 1.0 / (32768.0 * 512.0));
|
||||
ff_mdct_init(&ac->mdct_small, 8, 1, 1.0 / (32768.0 * 128.0));
|
||||
ff_mdct_init(&ac->mdct_ltp, 11, 0, -2.0 * 32768.0);
|
||||
ret = ff_imdct15_init(&ac->mdct480, 5);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
// window initialization
|
||||
ff_kbd_window_init(ff_aac_kbd_long_1024, 4.0, 1024);
|
||||
ff_kbd_window_init(ff_aac_kbd_short_128, 6.0, 128);
|
||||
@@ -1230,14 +1231,11 @@ static void decode_ltp(LongTermPrediction *ltp,
|
||||
static int decode_ics_info(AACContext *ac, IndividualChannelStream *ics,
|
||||
GetBitContext *gb)
|
||||
{
|
||||
const MPEG4AudioConfig *const m4ac = &ac->oc[1].m4ac;
|
||||
const int aot = m4ac->object_type;
|
||||
const int sampling_index = m4ac->sampling_index;
|
||||
int aot = ac->oc[1].m4ac.object_type;
|
||||
if (aot != AOT_ER_AAC_ELD) {
|
||||
if (get_bits1(gb)) {
|
||||
av_log(ac->avctx, AV_LOG_ERROR, "Reserved bit set.\n");
|
||||
if (ac->avctx->err_recognition & AV_EF_BITSTREAM)
|
||||
return AVERROR_INVALIDDATA;
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
ics->window_sequence[1] = ics->window_sequence[0];
|
||||
ics->window_sequence[0] = get_bits(gb, 2);
|
||||
@@ -1266,29 +1264,23 @@ static int decode_ics_info(AACContext *ac, IndividualChannelStream *ics,
|
||||
}
|
||||
}
|
||||
ics->num_windows = 8;
|
||||
ics->swb_offset = ff_swb_offset_128[sampling_index];
|
||||
ics->num_swb = ff_aac_num_swb_128[sampling_index];
|
||||
ics->tns_max_bands = ff_tns_max_bands_128[sampling_index];
|
||||
ics->swb_offset = ff_swb_offset_128[ac->oc[1].m4ac.sampling_index];
|
||||
ics->num_swb = ff_aac_num_swb_128[ac->oc[1].m4ac.sampling_index];
|
||||
ics->tns_max_bands = ff_tns_max_bands_128[ac->oc[1].m4ac.sampling_index];
|
||||
ics->predictor_present = 0;
|
||||
} else {
|
||||
ics->max_sfb = get_bits(gb, 6);
|
||||
ics->num_windows = 1;
|
||||
ics->max_sfb = get_bits(gb, 6);
|
||||
ics->num_windows = 1;
|
||||
if (aot == AOT_ER_AAC_LD || aot == AOT_ER_AAC_ELD) {
|
||||
if (m4ac->frame_length_short) {
|
||||
ics->swb_offset = ff_swb_offset_480[sampling_index];
|
||||
ics->num_swb = ff_aac_num_swb_480[sampling_index];
|
||||
ics->tns_max_bands = ff_tns_max_bands_480[sampling_index];
|
||||
} else {
|
||||
ics->swb_offset = ff_swb_offset_512[sampling_index];
|
||||
ics->num_swb = ff_aac_num_swb_512[sampling_index];
|
||||
ics->tns_max_bands = ff_tns_max_bands_512[sampling_index];
|
||||
}
|
||||
ics->swb_offset = ff_swb_offset_512[ac->oc[1].m4ac.sampling_index];
|
||||
ics->num_swb = ff_aac_num_swb_512[ac->oc[1].m4ac.sampling_index];
|
||||
ics->tns_max_bands = ff_tns_max_bands_512[ac->oc[1].m4ac.sampling_index];
|
||||
if (!ics->num_swb || !ics->swb_offset)
|
||||
return AVERROR_BUG;
|
||||
} else {
|
||||
ics->swb_offset = ff_swb_offset_1024[sampling_index];
|
||||
ics->num_swb = ff_aac_num_swb_1024[sampling_index];
|
||||
ics->tns_max_bands = ff_tns_max_bands_1024[sampling_index];
|
||||
ics->swb_offset = ff_swb_offset_1024[ac->oc[1].m4ac.sampling_index];
|
||||
ics->num_swb = ff_aac_num_swb_1024[ac->oc[1].m4ac.sampling_index];
|
||||
ics->tns_max_bands = ff_tns_max_bands_1024[ac->oc[1].m4ac.sampling_index];
|
||||
}
|
||||
if (aot != AOT_ER_AAC_ELD) {
|
||||
ics->predictor_present = get_bits1(gb);
|
||||
@@ -2593,13 +2585,12 @@ static void imdct_and_windowing_eld(AACContext *ac, SingleChannelElement *sce)
|
||||
float *in = sce->coeffs;
|
||||
float *out = sce->ret;
|
||||
float *saved = sce->saved;
|
||||
const float *const window = ff_aac_eld_window;
|
||||
float *buf = ac->buf_mdct;
|
||||
int i;
|
||||
const int n = ac->oc[1].m4ac.frame_length_short ? 480 : 512;
|
||||
const int n = 512;
|
||||
const int n2 = n >> 1;
|
||||
const int n4 = n >> 2;
|
||||
const float *const window = n == 480 ? ff_aac_eld_window_480 :
|
||||
ff_aac_eld_window_512;
|
||||
|
||||
// Inverse transform, mapped to the conventional IMDCT by
|
||||
// Chivukula, R.K.; Reznik, Y.A.; Devarajan, V.,
|
||||
@@ -2611,10 +2602,7 @@ static void imdct_and_windowing_eld(AACContext *ac, SingleChannelElement *sce)
|
||||
temp = in[i ]; in[i ] = -in[n - 1 - i]; in[n - 1 - i] = temp;
|
||||
temp = -in[i + 1]; in[i + 1] = in[n - 2 - i]; in[n - 2 - i] = temp;
|
||||
}
|
||||
if (n == 480)
|
||||
ac->mdct480->imdct_half(ac->mdct480, buf, in, 1, -1.f/(16*1024*960));
|
||||
else
|
||||
ac->mdct.imdct_half(&ac->mdct_ld, buf, in);
|
||||
ac->mdct.imdct_half(&ac->mdct_ld, buf, in);
|
||||
for (i = 0; i < n; i+=2) {
|
||||
buf[i] = -buf[i];
|
||||
}
|
||||
@@ -2847,7 +2835,6 @@ static int parse_adts_frame_header(AACContext *ac, GetBitContext *gb)
|
||||
ac->oc[1].m4ac.sample_rate = hdr_info.sample_rate;
|
||||
ac->oc[1].m4ac.sampling_index = hdr_info.sampling_index;
|
||||
ac->oc[1].m4ac.object_type = hdr_info.object_type;
|
||||
ac->oc[1].m4ac.frame_length_short = 0;
|
||||
if (ac->oc[0].status != OC_LOCKED ||
|
||||
ac->oc[0].m4ac.chan_config != hdr_info.chan_config ||
|
||||
ac->oc[0].m4ac.sample_rate != hdr_info.sample_rate) {
|
||||
@@ -2864,12 +2851,11 @@ static int aac_decode_er_frame(AVCodecContext *avctx, void *data,
|
||||
int *got_frame_ptr, GetBitContext *gb)
|
||||
{
|
||||
AACContext *ac = avctx->priv_data;
|
||||
const MPEG4AudioConfig *const m4ac = &ac->oc[1].m4ac;
|
||||
ChannelElement *che;
|
||||
int err, i;
|
||||
int samples = m4ac->frame_length_short ? 960 : 1024;
|
||||
int chan_config = m4ac->chan_config;
|
||||
int aot = m4ac->object_type;
|
||||
int samples = 1024;
|
||||
int chan_config = ac->oc[1].m4ac.chan_config;
|
||||
int aot = ac->oc[1].m4ac.object_type;
|
||||
|
||||
if (aot == AOT_ER_AAC_LD || aot == AOT_ER_AAC_ELD)
|
||||
samples >>= 1;
|
||||
@@ -2881,13 +2867,13 @@ static int aac_decode_er_frame(AVCodecContext *avctx, void *data,
|
||||
|
||||
// The FF_PROFILE_AAC_* defines are all object_type - 1
|
||||
// This may lead to an undefined profile being signaled
|
||||
ac->avctx->profile = aot - 1;
|
||||
ac->avctx->profile = ac->oc[1].m4ac.object_type - 1;
|
||||
|
||||
ac->tags_mapped = 0;
|
||||
|
||||
if (chan_config < 0 || chan_config >= 8) {
|
||||
avpriv_request_sample(avctx, "Unknown ER channel configuration %d",
|
||||
chan_config);
|
||||
ac->oc[1].m4ac.chan_config);
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
for (i = 0; i < tags_per_config[chan_config]; i++) {
|
||||
@@ -3148,7 +3134,7 @@ static int aac_decode_frame(AVCodecContext *avctx, void *data,
|
||||
if (INT_MAX / 8 <= buf_size)
|
||||
return AVERROR_INVALIDDATA;
|
||||
|
||||
if ((err = init_get_bits8(&gb, buf, buf_size)) < 0)
|
||||
if ((err = init_get_bits(&gb, buf, buf_size * 8)) < 0)
|
||||
return err;
|
||||
|
||||
switch (ac->oc[1].m4ac.object_type) {
|
||||
@@ -3189,7 +3175,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);
|
||||
ff_imdct15_uninit(&ac->mdct480);
|
||||
av_freep(&ac->fdsp);
|
||||
return 0;
|
||||
}
|
||||
@@ -3448,17 +3433,7 @@ static int latm_decode_frame(AVCodecContext *avctx, void *out,
|
||||
return AVERROR_INVALIDDATA;
|
||||
}
|
||||
|
||||
switch (latmctx->aac_ctx.oc[1].m4ac.object_type) {
|
||||
case AOT_ER_AAC_LC:
|
||||
case AOT_ER_AAC_LTP:
|
||||
case AOT_ER_AAC_LD:
|
||||
case AOT_ER_AAC_ELD:
|
||||
err = aac_decode_er_frame(avctx, out, got_frame_ptr, &gb);
|
||||
break;
|
||||
default:
|
||||
err = aac_decode_frame_int(avctx, out, got_frame_ptr, &gb, avpkt);
|
||||
}
|
||||
if (err < 0)
|
||||
if ((err = aac_decode_frame_int(avctx, out, got_frame_ptr, &gb, avpkt)) < 0)
|
||||
return err;
|
||||
|
||||
return muxlength;
|
||||
|
@@ -53,11 +53,6 @@
|
||||
return AVERROR(EINVAL); \
|
||||
}
|
||||
|
||||
#define WARN_IF(cond, ...) \
|
||||
if (cond) { \
|
||||
av_log(avctx, AV_LOG_WARNING, __VA_ARGS__); \
|
||||
}
|
||||
|
||||
float ff_aac_pow34sf_tab[428];
|
||||
|
||||
static const uint8_t swb_size_1024_96[] = {
|
||||
@@ -107,8 +102,7 @@ static const uint8_t *swb_size_1024[] = {
|
||||
swb_size_1024_96, swb_size_1024_96, swb_size_1024_64,
|
||||
swb_size_1024_48, swb_size_1024_48, swb_size_1024_32,
|
||||
swb_size_1024_24, swb_size_1024_24, swb_size_1024_16,
|
||||
swb_size_1024_16, swb_size_1024_16, swb_size_1024_8,
|
||||
swb_size_1024_8
|
||||
swb_size_1024_16, swb_size_1024_16, swb_size_1024_8
|
||||
};
|
||||
|
||||
static const uint8_t swb_size_128_96[] = {
|
||||
@@ -137,8 +131,7 @@ static const uint8_t *swb_size_128[] = {
|
||||
swb_size_128_96, swb_size_128_96, swb_size_128_96,
|
||||
swb_size_128_48, swb_size_128_48, swb_size_128_48,
|
||||
swb_size_128_24, swb_size_128_24, swb_size_128_16,
|
||||
swb_size_128_16, swb_size_128_16, swb_size_128_8,
|
||||
swb_size_128_8
|
||||
swb_size_128_16, swb_size_128_16, swb_size_128_8
|
||||
};
|
||||
|
||||
/** default channel configurations */
|
||||
@@ -267,7 +260,6 @@ static void apply_window_and_mdct(AACEncContext *s, SingleChannelElement *sce,
|
||||
for (i = 0; i < 1024; i += 128)
|
||||
s->mdct128.mdct_calc(&s->mdct128, sce->coeffs + i, output + i*2);
|
||||
memcpy(audio, audio + 1024, sizeof(audio[0]) * 1024);
|
||||
memcpy(sce->pcoeffs, sce->coeffs, sizeof(sce->pcoeffs));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -319,23 +311,20 @@ static void adjust_frame_information(ChannelElement *cpe, int chans)
|
||||
start = 0;
|
||||
maxsfb = 0;
|
||||
cpe->ch[ch].pulse.num_pulse = 0;
|
||||
for (w = 0; w < ics->num_windows; w += ics->group_len[w]) {
|
||||
for (w2 = 0; w2 < ics->group_len[w]; w2++) {
|
||||
start = (w+w2) * 128;
|
||||
for (g = 0; g < ics->num_swb; g++) {
|
||||
//apply M/S
|
||||
if (cpe->common_window && !ch && cpe->ms_mask[w*16 + g]) {
|
||||
for (i = 0; i < ics->swb_sizes[g]; i++) {
|
||||
cpe->ch[0].coeffs[start+i] = (cpe->ch[0].pcoeffs[start+i] + cpe->ch[1].pcoeffs[start+i]) * 0.5f;
|
||||
cpe->ch[1].coeffs[start+i] = cpe->ch[0].coeffs[start+i] - cpe->ch[1].pcoeffs[start+i];
|
||||
}
|
||||
for (w = 0; w < ics->num_windows*16; w += 16) {
|
||||
for (g = 0; g < ics->num_swb; g++) {
|
||||
//apply M/S
|
||||
if (cpe->common_window && !ch && cpe->ms_mask[w + g]) {
|
||||
for (i = 0; i < ics->swb_sizes[g]; i++) {
|
||||
cpe->ch[0].coeffs[start+i] = (cpe->ch[0].coeffs[start+i] + cpe->ch[1].coeffs[start+i]) / 2.0;
|
||||
cpe->ch[1].coeffs[start+i] = cpe->ch[0].coeffs[start+i] - cpe->ch[1].coeffs[start+i];
|
||||
}
|
||||
start += ics->swb_sizes[g];
|
||||
}
|
||||
for (cmaxsfb = ics->num_swb; cmaxsfb > 0 && cpe->ch[ch].zeroes[w*16+cmaxsfb-1]; cmaxsfb--)
|
||||
;
|
||||
maxsfb = FFMAX(maxsfb, cmaxsfb);
|
||||
start += ics->swb_sizes[g];
|
||||
}
|
||||
for (cmaxsfb = ics->num_swb; cmaxsfb > 0 && cpe->ch[ch].zeroes[w+cmaxsfb-1]; cmaxsfb--)
|
||||
;
|
||||
maxsfb = FFMAX(maxsfb, cmaxsfb);
|
||||
}
|
||||
ics->max_sfb = maxsfb;
|
||||
|
||||
@@ -518,7 +507,7 @@ static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
|
||||
AACEncContext *s = avctx->priv_data;
|
||||
float **samples = s->planar_samples, *samples2, *la, *overlap;
|
||||
ChannelElement *cpe;
|
||||
int i, ch, w, g, chans, tag, start_ch, ret, ms_mode = 0;
|
||||
int i, ch, w, g, chans, tag, start_ch, ret;
|
||||
int chan_el_counter[4];
|
||||
FFPsyWindowInfo windows[AAC_MAX_CHANNELS];
|
||||
|
||||
@@ -641,7 +630,6 @@ static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
|
||||
if (cpe->common_window) {
|
||||
put_ics_info(s, &cpe->ch[0].ics);
|
||||
encode_ms_info(&s->pb, cpe);
|
||||
if (cpe->ms_mode) ms_mode = 1;
|
||||
}
|
||||
}
|
||||
for (ch = 0; ch < chans; ch++) {
|
||||
@@ -656,15 +644,6 @@ static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
|
||||
s->psy.bitres.bits = frame_bits / s->channels;
|
||||
break;
|
||||
}
|
||||
if (ms_mode) {
|
||||
for (i = 0; i < s->chan_map[0]; i++) {
|
||||
// Must restore coeffs
|
||||
chans = tag == TYPE_CPE ? 2 : 1;
|
||||
cpe = &s->cpe[i];
|
||||
for (ch = 0; ch < chans; ch++)
|
||||
memcpy(cpe->ch[ch].coeffs, cpe->ch[ch].pcoeffs, sizeof(cpe->ch[ch].coeffs));
|
||||
}
|
||||
}
|
||||
|
||||
s->lambda *= avctx->bit_rate * 1024.0f / avctx->sample_rate / frame_bits;
|
||||
|
||||
@@ -761,20 +740,14 @@ static av_cold int aac_encode_init(AVCodecContext *avctx)
|
||||
|
||||
s->channels = avctx->channels;
|
||||
|
||||
ERROR_IF(i == 16
|
||||
|| i >= (sizeof(swb_size_1024) / sizeof(*swb_size_1024))
|
||||
|| i >= (sizeof(swb_size_128) / sizeof(*swb_size_128)),
|
||||
ERROR_IF(i == 16,
|
||||
"Unsupported sample rate %d\n", avctx->sample_rate);
|
||||
ERROR_IF(s->channels > AAC_MAX_CHANNELS,
|
||||
"Unsupported number of channels: %d\n", s->channels);
|
||||
ERROR_IF(avctx->profile != FF_PROFILE_UNKNOWN && avctx->profile != FF_PROFILE_AAC_LOW,
|
||||
"Unsupported profile %d\n", avctx->profile);
|
||||
WARN_IF(1024.0 * avctx->bit_rate / avctx->sample_rate > 6144 * s->channels,
|
||||
"Too many bits per frame requested, clamping to max\n");
|
||||
|
||||
avctx->bit_rate = (int)FFMIN(
|
||||
6144 * s->channels / 1024.0 * avctx->sample_rate,
|
||||
avctx->bit_rate);
|
||||
ERROR_IF(1024.0 * avctx->bit_rate / avctx->sample_rate > 6144 * s->channels,
|
||||
"Too many bits per frame requested\n");
|
||||
|
||||
s->samplerate_index = i;
|
||||
|
||||
|
@@ -908,8 +908,8 @@ static void stereo_processing(PSContext *ps, float (*l)[32][2], float (*r)[32][2
|
||||
|
||||
int ff_ps_apply(AVCodecContext *avctx, PSContext *ps, float L[2][38][64], float R[2][38][64], int top)
|
||||
{
|
||||
float (*Lbuf)[32][2] = ps->Lbuf;
|
||||
float (*Rbuf)[32][2] = ps->Rbuf;
|
||||
LOCAL_ALIGNED_16(float, Lbuf, [91], [32][2]);
|
||||
LOCAL_ALIGNED_16(float, Rbuf, [91], [32][2]);
|
||||
const int len = 32;
|
||||
int is34 = ps->is34bands;
|
||||
|
||||
|
@@ -71,8 +71,6 @@ typedef struct PSContext {
|
||||
DECLARE_ALIGNED(16, float, H12)[2][PS_MAX_NUM_ENV+1][PS_MAX_NR_IIDICC];
|
||||
DECLARE_ALIGNED(16, float, H21)[2][PS_MAX_NUM_ENV+1][PS_MAX_NR_IIDICC];
|
||||
DECLARE_ALIGNED(16, float, H22)[2][PS_MAX_NUM_ENV+1][PS_MAX_NR_IIDICC];
|
||||
DECLARE_ALIGNED(16, float, Lbuf)[91][32][2];
|
||||
DECLARE_ALIGNED(16, float, Rbuf)[91][32][2];
|
||||
int8_t opd_hist[PS_MAX_NR_IIDICC];
|
||||
int8_t ipd_hist[PS_MAX_NR_IIDICC];
|
||||
PSDSPContext dsp;
|
||||
|
@@ -162,7 +162,7 @@ typedef struct AacPsyContext{
|
||||
/**
|
||||
* LAME psy model preset struct
|
||||
*/
|
||||
typedef struct PsyLamePreset {
|
||||
typedef struct {
|
||||
int quality; ///< Quality to map the rest of the vaules to.
|
||||
/* This is overloaded to be both kbps per channel in ABR mode, and
|
||||
* requested quality in constant quality mode.
|
||||
@@ -313,7 +313,7 @@ static av_cold int psy_3gpp_init(FFPsyContext *ctx) {
|
||||
ctx->bitres.size = 6144 - pctx->frame_bits;
|
||||
ctx->bitres.size -= ctx->bitres.size % 8;
|
||||
pctx->fill_level = ctx->bitres.size;
|
||||
minath = ath(3410 - 0.733 * ATH_ADD, ATH_ADD);
|
||||
minath = ath(3410, ATH_ADD);
|
||||
for (j = 0; j < 2; j++) {
|
||||
AacPsyCoeffs *coeffs = pctx->psy_coef[j];
|
||||
const uint8_t *band_sizes = ctx->bands[j];
|
||||
@@ -717,7 +717,7 @@ static void psy_3gpp_analyze_channel(FFPsyContext *ctx, int channel,
|
||||
}
|
||||
desired_pe_no_ah = FFMAX(desired_pe - (pe - pe_no_ah), 0.0f);
|
||||
if (active_lines > 0.0f)
|
||||
reduction = calc_reduction_3gpp(a, desired_pe_no_ah, pe_no_ah, active_lines);
|
||||
reduction += calc_reduction_3gpp(a, desired_pe_no_ah, pe_no_ah, active_lines);
|
||||
|
||||
pe = 0.0f;
|
||||
for (w = 0; w < wi->num_windows*16; w += 16) {
|
||||
|
@@ -1018,8 +1018,6 @@ static unsigned int read_sbr_data(AACContext *ac, SpectralBandReplication *sbr,
|
||||
{
|
||||
unsigned int cnt = get_bits_count(gb);
|
||||
|
||||
sbr->id_aac = id_aac;
|
||||
|
||||
if (id_aac == TYPE_SCE || id_aac == TYPE_CCE) {
|
||||
if (read_sbr_single_channel_element(ac, sbr, gb)) {
|
||||
sbr_turnoff(sbr);
|
||||
@@ -1696,12 +1694,6 @@ void ff_sbr_apply(AACContext *ac, SpectralBandReplication *sbr, int id_aac,
|
||||
int nch = (id_aac == TYPE_CPE) ? 2 : 1;
|
||||
int err;
|
||||
|
||||
if (id_aac != sbr->id_aac) {
|
||||
av_log(ac->avctx, AV_LOG_ERROR,
|
||||
"element type mismatch %d != %d\n", id_aac, sbr->id_aac);
|
||||
sbr_turnoff(sbr);
|
||||
}
|
||||
|
||||
if (!sbr->kx_and_m_pushed) {
|
||||
sbr->kx[0] = sbr->kx[1];
|
||||
sbr->m[0] = sbr->m[1];
|
||||
@@ -1725,7 +1717,6 @@ void ff_sbr_apply(AACContext *ac, SpectralBandReplication *sbr, int id_aac,
|
||||
sbr->c.sbr_hf_inverse_filter(&sbr->dsp, sbr->alpha0, sbr->alpha1,
|
||||
(const float (*)[40][2]) sbr->X_low, sbr->k[0]);
|
||||
sbr_chirp(sbr, &sbr->data[ch]);
|
||||
av_assert0(sbr->data[ch].bs_num_env > 0);
|
||||
sbr_hf_gen(ac, sbr, sbr->X_high,
|
||||
(const float (*)[40][2]) sbr->X_low,
|
||||
(const float (*)[2]) sbr->alpha0,
|
||||
|
@@ -44,10 +44,6 @@ const uint8_t ff_aac_num_swb_512[] = {
|
||||
0, 0, 0, 36, 36, 37, 31, 31, 0, 0, 0, 0, 0
|
||||
};
|
||||
|
||||
const uint8_t ff_aac_num_swb_480[] = {
|
||||
0, 0, 0, 35, 35, 37, 30, 30, 0, 0, 0, 0, 0
|
||||
};
|
||||
|
||||
const uint8_t ff_aac_num_swb_128[] = {
|
||||
12, 12, 12, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15
|
||||
};
|
||||
@@ -1130,14 +1126,6 @@ static const uint16_t swb_offset_512_48[] = {
|
||||
364, 396, 428, 460, 512
|
||||
};
|
||||
|
||||
static const uint16_t swb_offset_480_48[] = {
|
||||
0, 4, 8, 12, 16, 20, 24, 28,
|
||||
32, 36, 40, 44, 48, 52, 56, 64,
|
||||
72, 80, 88, 96, 108, 120, 132, 144,
|
||||
156, 172, 188, 212, 240, 272, 304, 336,
|
||||
368, 400, 432, 480
|
||||
};
|
||||
|
||||
static const uint16_t swb_offset_128_48[] = {
|
||||
0, 4, 8, 12, 16, 20, 28, 36,
|
||||
44, 56, 68, 80, 96, 112, 128
|
||||
@@ -1161,14 +1149,6 @@ static const uint16_t swb_offset_512_32[] = {
|
||||
352, 384, 416, 448, 480, 512
|
||||
};
|
||||
|
||||
static const uint16_t swb_offset_480_32[] = {
|
||||
0, 4, 8, 12, 16, 20, 24, 28,
|
||||
32, 36, 40, 44, 48, 52, 56, 60,
|
||||
64, 72, 80, 88, 96, 104, 112, 124,
|
||||
136, 148, 164, 180, 200, 224, 256, 288,
|
||||
320, 352, 384, 416, 448, 480
|
||||
};
|
||||
|
||||
static const uint16_t swb_offset_1024_24[] = {
|
||||
0, 4, 8, 12, 16, 20, 24, 28,
|
||||
32, 36, 40, 44, 52, 60, 68, 76,
|
||||
@@ -1185,13 +1165,6 @@ static const uint16_t swb_offset_512_24[] = {
|
||||
288, 320, 352, 384, 416, 448, 480, 512,
|
||||
};
|
||||
|
||||
static const uint16_t swb_offset_480_24[] = {
|
||||
0, 4, 8, 12, 16, 20, 24, 28,
|
||||
32, 36, 40, 44, 52, 60, 68, 80,
|
||||
92, 104, 120, 140, 164, 192, 224, 256,
|
||||
288, 320, 352, 384, 416, 448, 480
|
||||
};
|
||||
|
||||
static const uint16_t swb_offset_128_24[] = {
|
||||
0, 4, 8, 12, 16, 20, 24, 28,
|
||||
36, 44, 52, 64, 76, 92, 108, 128
|
||||
@@ -1241,14 +1214,6 @@ const uint16_t * const ff_swb_offset_512[] = {
|
||||
NULL
|
||||
};
|
||||
|
||||
const uint16_t * const ff_swb_offset_480[] = {
|
||||
NULL, NULL, NULL,
|
||||
swb_offset_480_48, swb_offset_480_48, swb_offset_480_32,
|
||||
swb_offset_480_24, swb_offset_480_24, NULL,
|
||||
NULL, NULL, NULL,
|
||||
NULL
|
||||
};
|
||||
|
||||
const uint16_t * const ff_swb_offset_128[] = {
|
||||
/* The last entry on the following row is swb_offset_128_64 but is a
|
||||
duplicate of swb_offset_128_96. */
|
||||
@@ -1275,16 +1240,12 @@ const uint8_t ff_tns_max_bands_512[] = {
|
||||
0, 0, 0, 31, 32, 37, 31, 31, 0, 0, 0, 0, 0
|
||||
};
|
||||
|
||||
const uint8_t ff_tns_max_bands_480[] = {
|
||||
0, 0, 0, 31, 32, 37, 30, 30, 0, 0, 0, 0, 0
|
||||
};
|
||||
|
||||
const uint8_t ff_tns_max_bands_128[] = {
|
||||
9, 9, 10, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14
|
||||
};
|
||||
// @}
|
||||
|
||||
const DECLARE_ALIGNED(32, float, ff_aac_eld_window_512)[1920] = {
|
||||
const DECLARE_ALIGNED(32, float, ff_aac_eld_window)[1920] = {
|
||||
0.00338834, 0.00567745, 0.00847677, 0.01172641,
|
||||
0.01532555, 0.01917664, 0.02318809, 0.02729259,
|
||||
0.03144503, 0.03560261, 0.03972499, 0.04379783,
|
||||
@@ -1766,456 +1727,3 @@ const DECLARE_ALIGNED(32, float, ff_aac_eld_window_512)[1920] = {
|
||||
-0.00116552, -0.00115223, -0.00113877, -0.00112517,
|
||||
-0.00111144, -0.00109764, -0.00108377, -0.00106989,
|
||||
};
|
||||
|
||||
const DECLARE_ALIGNED(32, float, ff_aac_eld_window_480)[1800] = {
|
||||
0.00101191, 0.00440397, 0.00718669, 0.01072130,
|
||||
0.01459757, 0.01875954, 0.02308987, 0.02751541,
|
||||
0.03198130, 0.03643738, 0.04085290, 0.04522835,
|
||||
0.04957620, 0.05390454, 0.05821503, 0.06251214,
|
||||
0.06680463, 0.07109582, 0.07538014, 0.07965207,
|
||||
0.08390857, 0.08815177, 0.09238785, 0.09662163,
|
||||
0.10085860, 0.10510892, 0.10938110, 0.11367819,
|
||||
0.11800355, 0.12236410, 0.12676834, 0.13122384,
|
||||
0.13573476, 0.14030106, 0.14492340, 0.14960315,
|
||||
0.15433828, 0.15912396, 0.16395663, 0.16883310,
|
||||
0.17374837, 0.17869679, 0.18367394, 0.18867661,
|
||||
0.19370368, 0.19875413, 0.20382641, 0.20892055,
|
||||
0.21403775, 0.21917761, 0.22433899, 0.22952250,
|
||||
0.23472991, 0.23996189, 0.24521859, 0.25049930,
|
||||
0.25580312, 0.26112942, 0.26647748, 0.27184703,
|
||||
0.27723785, 0.28264967, 0.28808086, 0.29352832,
|
||||
0.29898979, 0.30446379, 0.30994292, 0.31541664,
|
||||
0.32087942, 0.32632772, 0.33176291, 0.33718641,
|
||||
0.34259612, 0.34799346, 0.35338857, 0.35878843,
|
||||
0.36419504, 0.36960630, 0.37501567, 0.38042067,
|
||||
0.38582069, 0.39121276, 0.39659312, 0.40195993,
|
||||
0.40731155, 0.41264382, 0.41795277, 0.42323670,
|
||||
0.42849480, 0.43372753, 0.43893452, 0.44411398,
|
||||
0.44927117, 0.45441882, 0.45956191, 0.46470167,
|
||||
0.46983016, 0.47493636, 0.48001827, 0.48507480,
|
||||
0.49010240, 0.49509781, 0.50005986, 0.50499037,
|
||||
0.50989790, 0.51478708, 0.51965805, 0.52450975,
|
||||
0.52933955, 0.53414668, 0.53893113, 0.54369178,
|
||||
0.54842731, 0.55313757, 0.55782259, 0.56248253,
|
||||
0.56711762, 0.57172819, 0.57631468, 0.58087761,
|
||||
0.58719976, 0.59173064, 0.59623644, 0.60071719,
|
||||
0.60517294, 0.60960372, 0.61400958, 0.61839056,
|
||||
0.62274670, 0.62707805, 0.63138475, 0.63566700,
|
||||
0.63992500, 0.64415895, 0.64836893, 0.65255499,
|
||||
0.65671715, 0.66085548, 0.66497005, 0.66906094,
|
||||
0.67312824, 0.67717199, 0.68119219, 0.68518882,
|
||||
0.68916187, 0.69311129, 0.69703698, 0.70093884,
|
||||
0.70481679, 0.70867071, 0.71250047, 0.71630596,
|
||||
0.72008705, 0.72384360, 0.72757549, 0.73128256,
|
||||
0.73496463, 0.73862141, 0.74225263, 0.74585799,
|
||||
0.74943730, 0.75299039, 0.75651711, 0.76001729,
|
||||
0.76349062, 0.76693670, 0.77035516, 0.77374564,
|
||||
0.77710790, 0.78044169, 0.78374678, 0.78702291,
|
||||
0.79026979, 0.79348715, 0.79667471, 0.79983215,
|
||||
0.80295914, 0.80605536, 0.80912047, 0.81215417,
|
||||
0.81515616, 0.81812616, 0.82106389, 0.82396915,
|
||||
0.82684176, 0.82968154, 0.83248830, 0.83526186,
|
||||
0.83800204, 0.84070866, 0.84338156, 0.84602058,
|
||||
0.84862556, 0.85119636, 0.85373292, 0.85623523,
|
||||
0.85870326, 0.86113701, 0.86353649, 0.86590173,
|
||||
0.86823275, 0.87052968, 0.87279275, 0.87502220,
|
||||
0.87721829, 0.87938130, 0.88151157, 0.88360940,
|
||||
0.88567517, 0.88770954, 0.88971328, 0.89168716,
|
||||
0.89363199, 0.89554856, 0.89743771, 0.89930025,
|
||||
0.90113740, 0.90295086, 0.90474240, 0.90651380,
|
||||
0.90826684, 0.91000335, 0.91172515, 0.91343416,
|
||||
0.91513276, 0.91682357, 0.91850924, 0.92019170,
|
||||
0.92187129, 0.92354778, 0.92522116, 0.92688597,
|
||||
0.92852960, 0.93013861, 0.93169897, 0.93319114,
|
||||
0.93458502, 0.93587626, 0.93694276, 0.93825562,
|
||||
0.93882222, 0.93910780, 0.93944183, 0.93981497,
|
||||
0.94021434, 0.94062629, 0.94103714, 0.94144084,
|
||||
0.94184042, 0.94223966, 0.94264206, 0.94304859,
|
||||
0.94345831, 0.94387033, 0.94428390, 0.94469895,
|
||||
0.94511572, 0.94553441, 0.94595520, 0.94637816,
|
||||
0.94680335, 0.94723080, 0.94766054, 0.94809253,
|
||||
0.94852674, 0.94896314, 0.94940178, 0.94984276,
|
||||
0.95028618, 0.95073213, 0.95118056, 0.95163139,
|
||||
0.95208451, 0.95253992, 0.95299770, 0.95345799,
|
||||
0.95392092, 0.95438653, 0.95485472, 0.95532539,
|
||||
0.95579847, 0.95627397, 0.95675201, 0.95723273,
|
||||
0.95771618, 0.95820232, 0.95869103, 0.95918218,
|
||||
0.95967573, 0.96017172, 0.96067026, 0.96117144,
|
||||
0.96167526, 0.96218157, 0.96269026, 0.96320119,
|
||||
0.96371437, 0.96422988, 0.96474782, 0.96526824,
|
||||
0.96579106, 0.96631614, 0.96684334, 0.96737257,
|
||||
0.96790390, 0.96843740, 0.96897315, 0.96951112,
|
||||
0.97005119, 0.97059318, 0.97113697, 0.97168253,
|
||||
0.97222994, 0.97277928, 0.97333058, 0.97388375,
|
||||
0.97443863, 0.97499505, 0.97555292, 0.97611230,
|
||||
0.97667326, 0.97723589, 0.97780016, 0.97836591,
|
||||
0.97893300, 0.97950127, 0.98007071, 0.98064139,
|
||||
0.98121342, 0.98178684, 0.98236156, 0.98293743,
|
||||
0.98351428, 0.98409205, 0.98467078, 0.98525056,
|
||||
0.98583146, 0.98641348, 0.98699650, 0.98758037,
|
||||
0.98816497, 0.98875030, 0.98933647, 0.98992356,
|
||||
0.99051163, 0.99110062, 0.99169038, 0.99228079,
|
||||
0.99287177, 0.99346341, 0.99405581, 0.99464907,
|
||||
0.99524320, 0.99583812, 0.99643375, 0.99702997,
|
||||
0.99762671, 0.99822386, 0.99882134, 0.99941903,
|
||||
1.00058131, 1.00118006, 1.00177930, 1.00237893,
|
||||
1.00297887, 1.00357902, 1.00417927, 1.00477954,
|
||||
1.00537972, 1.00597973, 1.00657959, 1.00717940,
|
||||
1.00777926, 1.00837925, 1.00897929, 1.00957926,
|
||||
1.01017901, 1.01077847, 1.01137769, 1.01197678,
|
||||
1.01257582, 1.01317482, 1.01377365, 1.01437217,
|
||||
1.01497025, 1.01556786, 1.01616510, 1.01676205,
|
||||
1.01735876, 1.01795514, 1.01855103, 1.01914627,
|
||||
1.01974076, 1.02033455, 1.02092772, 1.02152037,
|
||||
1.02211247, 1.02270387, 1.02329439, 1.02388387,
|
||||
1.02447229, 1.02505972, 1.02564624, 1.02623190,
|
||||
1.02681660, 1.02740017, 1.02798242, 1.02856326,
|
||||
1.02914272, 1.02972087, 1.03029778, 1.03087344,
|
||||
1.03144768, 1.03202035, 1.03259127, 1.03316042,
|
||||
1.03372788, 1.03429373, 1.03485801, 1.03542064,
|
||||
1.03598146, 1.03654030, 1.03709708, 1.03765185,
|
||||
1.03820470, 1.03875571, 1.03930488, 1.03985206,
|
||||
1.04039712, 1.04093989, 1.04148037, 1.04201865,
|
||||
1.04255481, 1.04308893, 1.04362093, 1.04415068,
|
||||
1.04467803, 1.04520292, 1.04572542, 1.04624566,
|
||||
1.04676376, 1.04727974, 1.04779350, 1.04830493,
|
||||
1.04881391, 1.04932048, 1.04982477, 1.05032693,
|
||||
1.05082705, 1.05132510, 1.05182098, 1.05231457,
|
||||
1.05280584, 1.05329485, 1.05378171, 1.05426654,
|
||||
1.05474937, 1.05523018, 1.05570892, 1.05618554,
|
||||
1.05666005, 1.05713251, 1.05760297, 1.05807149,
|
||||
1.05853828, 1.05900355, 1.05946756, 1.05993024,
|
||||
1.06039075, 1.06084806, 1.06130111, 1.06175099,
|
||||
1.06220164, 1.06265732, 1.06312146, 1.06358726,
|
||||
1.06403924, 1.06446186, 1.06484048, 1.06516440,
|
||||
1.06527864, 1.06498077, 1.06470196, 1.06425743,
|
||||
1.06372091, 1.06311464, 1.06246622, 1.06179277,
|
||||
1.06110808, 1.06042455, 1.05974495, 1.05906206,
|
||||
1.05836706, 1.05765243, 1.05691470, 1.05615178,
|
||||
1.05536069, 1.05454152, 1.05370030, 1.05284445,
|
||||
1.05198094, 1.05111433, 1.05024634, 1.04937859,
|
||||
1.04851245, 1.04764614, 1.04677586, 1.04589855,
|
||||
1.04501046, 1.04410500, 1.04317417, 1.04221010,
|
||||
1.04120649, 1.04016012, 1.03906851, 1.03792894,
|
||||
1.03674090, 1.03550649, 1.03422800, 1.03290769,
|
||||
1.03154944, 1.03015834, 1.02873938, 1.02729712,
|
||||
1.02583470, 1.02435463, 1.02285952, 1.02135114,
|
||||
1.01982974, 1.01829520, 1.01674752, 1.01518534,
|
||||
1.01360559, 1.01200510, 1.01038076, 1.00872996,
|
||||
1.00705045, 1.00533999, 1.00359618, 1.00181613,
|
||||
0.99999673, 0.99813477, 0.99622793, 0.99427571,
|
||||
0.99227814, 0.99023501, 0.98815128, 0.98603857,
|
||||
0.98390898, 0.98177413, 0.97964151, 0.97751528,
|
||||
0.97539999, 0.97329751, 0.97119933, 0.96909179,
|
||||
0.96696152, 0.96479824, 0.96259840, 0.96036028,
|
||||
0.95808180, 0.95576295, 0.95340622, 0.95101436,
|
||||
0.94859030, 0.94614009, 0.94367232, 0.94119555,
|
||||
0.93871796, 0.93624630, 0.93378636, 0.93134465,
|
||||
0.92892076, 0.92649974, 0.92406255, 0.92159041,
|
||||
0.91907411, 0.91651711, 0.91392425, 0.91130056,
|
||||
0.90865471, 0.90599838, 0.90334350, 0.90069934,
|
||||
0.89806435, 0.89543132, 0.89279335, 0.89014496,
|
||||
0.88748403, 0.88480945, 0.88211997, 0.87941558,
|
||||
0.87669794, 0.87396891, 0.87123030, 0.86848394,
|
||||
0.86573164, 0.86297523, 0.86021649, 0.85745725,
|
||||
0.85474342, 0.85193656, 0.84911455, 0.84627969,
|
||||
0.84343424, 0.84058046, 0.83772057, 0.83485680,
|
||||
0.83199134, 0.82912621, 0.82626143, 0.82339529,
|
||||
0.82052619, 0.81765147, 0.81476433, 0.81185593,
|
||||
0.80891701, 0.80594452, 0.80294885, 0.79994431,
|
||||
0.79694485, 0.79396166, 0.79100220, 0.78807349,
|
||||
0.78518123, 0.78231422, 0.77944709, 0.77655407,
|
||||
0.77361369, 0.77062281, 0.76758806, 0.76451506,
|
||||
0.76141145, 0.75828860, 0.75515892, 0.75203479,
|
||||
0.74892561, 0.74583682, 0.74277342, 0.73974008,
|
||||
0.73673754, 0.73376310, 0.73081444, 0.72788616,
|
||||
0.72496070, 0.72201426, 0.71902283, 0.71596990,
|
||||
0.71285541, 0.70968427, 0.70646064, 0.70319589,
|
||||
0.69991077, 0.69662714, 0.69336592, 0.69013742,
|
||||
0.68694302, 0.68378420, 0.68066143, 0.67757157,
|
||||
0.67450951, 0.67147030, 0.66844879, 0.66543949,
|
||||
0.66243677, 0.65943505, 0.65642754, 0.65340591,
|
||||
0.65036160, 0.64728630, 0.64417440, 0.64102268,
|
||||
0.63782771, 0.63458757, 0.63130628, 0.62799109,
|
||||
0.62464879, 0.62128816, 0.61792203, 0.61456438,
|
||||
0.61122915, 0.60792802, 0.60466971, 0.60146257,
|
||||
0.59831460, 0.59522876, 0.59220375, 0.58923859,
|
||||
0.58632936, 0.58346064, 0.58061078, 0.57775874,
|
||||
0.57488246, 0.57195790, 0.56896078, 0.56586637,
|
||||
0.56266594, 0.55937186, 0.55599898, 0.55256299,
|
||||
0.54909184, 0.54562376, 0.54219742, 0.53884728,
|
||||
0.53559047, 0.53243453, 0.52938894, 0.52645052,
|
||||
0.52358958, 0.52076862, 0.51795080, 0.51510761,
|
||||
0.51222179, 0.50927733, 0.50625944, 0.50317073,
|
||||
0.50002767, 0.49685021, 0.49364116, 0.49048690,
|
||||
0.48726128, 0.48404889, 0.48090875, 0.47783482,
|
||||
0.47481564, 0.47184024, 0.46889391, 0.46595836,
|
||||
0.46301611, 0.46005089, 0.45705924, 0.45404822,
|
||||
0.45102447, 0.44799543, 0.44497138, 0.44196397,
|
||||
0.43898547, 0.43604105, 0.43312057, 0.43020942,
|
||||
0.42729337, 0.42436272, 0.42141388, 0.41844400,
|
||||
0.41545081, 0.41244014, 0.40942464, 0.40641716,
|
||||
0.40342874, 0.40046292, 0.39751923, 0.39459758,
|
||||
0.39169692, 0.38881435, 0.38594643, 0.38308980,
|
||||
0.38024146, 0.37739896, 0.37455986, 0.37172187,
|
||||
0.36888463, 0.36604937, 0.36321735, 0.36038967,
|
||||
0.35756668, 0.35474832, 0.35193455, 0.34912542,
|
||||
0.34632129, 0.34352258, 0.34072974, 0.33794323,
|
||||
0.33516354, 0.33239114, 0.32962648, 0.32686967,
|
||||
0.32412042, 0.32137919, 0.31864044, 0.31588373,
|
||||
0.31309909, 0.31028631, 0.30745528, 0.30462678,
|
||||
0.30180656, 0.29899424, 0.29619082, 0.29339717,
|
||||
0.29061333, 0.28783935, 0.28507563, 0.28232266,
|
||||
0.27958067, 0.27684984, 0.27413017, 0.27142157,
|
||||
0.26872396, 0.26603737, 0.26336211, 0.26069855,
|
||||
0.25804700, 0.25540830, 0.25278329, 0.25017211,
|
||||
0.24757451, 0.24498713, 0.24240740, 0.23983550,
|
||||
0.23727200, 0.23471866, 0.23217624, 0.22964458,
|
||||
0.22712346, 0.22461258, 0.22211202, 0.21962197,
|
||||
0.21714290, 0.21467522, 0.21221877, 0.20977323,
|
||||
0.20733693, 0.20490860, 0.20248823, 0.20007615,
|
||||
0.19767358, 0.19528091, 0.19289781, 0.19052347,
|
||||
0.18815661, 0.18579693, 0.18344441, 0.18110010,
|
||||
0.17876595, 0.17644344, 0.17413400, 0.17183905,
|
||||
0.16956003, 0.16729836, 0.16505547, 0.16283278,
|
||||
0.15990780, 0.15776021, 0.15563325, 0.15352557,
|
||||
0.15143584, 0.14936270, 0.14730481, 0.14526081,
|
||||
0.14322937, 0.14120918, 0.13919977, 0.13720138,
|
||||
0.13521422, 0.13323852, 0.13127445, 0.12932216,
|
||||
0.12738181, 0.12545358, 0.12353773, 0.12163457,
|
||||
0.11974436, 0.11786730, 0.11600347, 0.11415293,
|
||||
0.11231573, 0.11049201, 0.10868196, 0.10688578,
|
||||
0.10510362, 0.10333551, 0.10158143, 0.09984133,
|
||||
0.09811524, 0.09640327, 0.09470556, 0.09302228,
|
||||
0.09135347, 0.08969907, 0.08805903, 0.08643326,
|
||||
0.08482183, 0.08322486, 0.08164249, 0.08007481,
|
||||
0.07852179, 0.07698335, 0.07545938, 0.07394984,
|
||||
0.07245482, 0.07097444, 0.06950883, 0.06805800,
|
||||
0.06662187, 0.06520031, 0.06379324, 0.06240065,
|
||||
0.06102266, 0.05965936, 0.05831084, 0.05697701,
|
||||
0.05565775, 0.05435290, 0.05306239, 0.05178628,
|
||||
0.05052464, 0.04927758, 0.04804510, 0.04682709,
|
||||
0.04562344, 0.04443405, 0.04325893, 0.04209822,
|
||||
0.04095208, 0.03982059, 0.03870371, 0.03760131,
|
||||
0.03651325, 0.03543944, 0.03437987, 0.03333454,
|
||||
0.03230348, 0.03128653, 0.03028332, 0.02929346,
|
||||
0.02831658, 0.02735252, 0.02640127, 0.02546283,
|
||||
0.02453725, 0.02362471, 0.02272547, 0.02183980,
|
||||
0.02096810, 0.02011108, 0.01926957, 0.01844439,
|
||||
0.01763565, 0.01684248, 0.01606394, 0.01529909,
|
||||
0.01454726, 0.01380802, 0.01308092, 0.01236569,
|
||||
0.01166273, 0.01097281, 0.01029671, 0.00963479,
|
||||
0.00898646, 0.00835089, 0.00772725, 0.00711521,
|
||||
0.00651513, 0.00592741, 0.00535249, 0.00479089,
|
||||
0.00424328, 0.00371041, 0.00319271, 0.00268947,
|
||||
0.00219928, 0.00172084, 0.00125271, 0.00079311,
|
||||
0.00034023, -0.00010786, -0.00055144, -0.00098865,
|
||||
-0.00141741, -0.00183557, -0.00224010, -0.00262725,
|
||||
-0.00299314, -0.00333475, -0.00365250, -0.00394867,
|
||||
-0.00422533, -0.00448528, -0.00473278, -0.00497252,
|
||||
-0.00520916, -0.00544584, -0.00568360, -0.00592326,
|
||||
-0.00616547, -0.00640861, -0.00664914, -0.00688354,
|
||||
-0.00710845, -0.00732136, -0.00752022, -0.00770289,
|
||||
-0.00786789, -0.00801521, -0.00814526, -0.00825839,
|
||||
-0.00835563, -0.00843882, -0.00850996, -0.00857097,
|
||||
-0.00862360, -0.00866943, -0.00871004, -0.00874688,
|
||||
-0.00878091, -0.00881277, -0.00884320, -0.00887248,
|
||||
-0.00890002, -0.00892494, -0.00894641, -0.00896355,
|
||||
-0.00897541, -0.00898104, -0.00897948, -0.00896990,
|
||||
-0.00895149, -0.00892346, -0.00888519, -0.00883670,
|
||||
-0.00877839, -0.00871058, -0.00863388, -0.00854936,
|
||||
-0.00845826, -0.00836179, -0.00826124, -0.00815807,
|
||||
-0.00805372, -0.00794953, -0.00784572, -0.00774156,
|
||||
-0.00763634, -0.00752929, -0.00741941, -0.00730556,
|
||||
-0.00718664, -0.00706184, -0.00693107, -0.00679443,
|
||||
-0.00665200, -0.00650428, -0.00635230, -0.00619718,
|
||||
-0.00603995, -0.00588133, -0.00572169, -0.00556143,
|
||||
-0.00540085, -0.00523988, -0.00507828, -0.00491582,
|
||||
-0.00475220, -0.00458693, -0.00441953, -0.00424950,
|
||||
-0.00407681, -0.00390204, -0.00372581, -0.00354874,
|
||||
-0.00337115, -0.00319318, -0.00301494, -0.00283652,
|
||||
-0.00265797, -0.00247934, -0.00230066, -0.00212197,
|
||||
-0.00194331, -0.00176471, -0.00158620, -0.00140787,
|
||||
-0.00122989, -0.00105244, -0.00087567, -0.00069976,
|
||||
-0.00052487, -0.00035115, -0.00017875, -0.00000782,
|
||||
0.00000779, 0.00017701, 0.00034552, 0.00051313,
|
||||
0.00067966, 0.00084492, 0.00100873, 0.00117093,
|
||||
0.00133133, 0.00148978, 0.00164611, 0.00180023,
|
||||
0.00195211, 0.00210172, 0.00224898, 0.00239383,
|
||||
0.00253618, 0.00267593, 0.00281306, 0.00294756,
|
||||
0.00307942, 0.00320864, 0.00333502, 0.00345816,
|
||||
0.00357762, 0.00369297, 0.00380414, 0.00391140,
|
||||
0.00401499, 0.00411524, 0.00421242, 0.00430678,
|
||||
0.00439859, 0.00448799, 0.00457487, 0.00465908,
|
||||
0.00474045, 0.00481857, 0.00489277, 0.00496235,
|
||||
0.00502666, 0.00508546, 0.00513877, 0.00518662,
|
||||
0.00522904, 0.00526648, 0.00529956, 0.00532895,
|
||||
0.00535532, 0.00537929, 0.00540141, 0.00542228,
|
||||
0.00544196, 0.00545981, 0.00547515, 0.00548726,
|
||||
0.00549542, 0.00549899, 0.00549732, 0.00548986,
|
||||
0.00547633, 0.00545664, 0.00543067, 0.00539849,
|
||||
0.00536061, 0.00531757, 0.00526993, 0.00521822,
|
||||
0.00516300, 0.00510485, 0.00504432, 0.00498194,
|
||||
0.00491822, 0.00485364, 0.00478862, 0.00472309,
|
||||
0.00465675, 0.00458939, 0.00452067, 0.00445003,
|
||||
0.00437688, 0.00430063, 0.00422062, 0.00413609,
|
||||
0.00404632, 0.00395060, 0.00384863, 0.00374044,
|
||||
0.00362600, 0.00350540, 0.00337934, 0.00324885,
|
||||
0.00311486, 0.00297849, 0.00284122, 0.00270458,
|
||||
0.00257013, 0.00243867, 0.00231005, 0.00218399,
|
||||
0.00206023, 0.00193766, 0.00181460, 0.00168938,
|
||||
0.00156050, 0.00142701, 0.00128830, 0.00114365,
|
||||
0.00099297, 0.00083752, 0.00067884, 0.00051845,
|
||||
0.00035760, 0.00019720, 0.00003813, -0.00011885,
|
||||
-0.00027375, -0.00042718, -0.00057975, -0.00073204,
|
||||
-0.00088453, -0.00103767, -0.00119192, -0.00134747,
|
||||
-0.00150411, -0.00166151, -0.00181932, -0.00197723,
|
||||
-0.00213493, -0.00229210, -0.00244849, -0.00260415,
|
||||
-0.00275928, -0.00291410, -0.00306879, -0.00322332,
|
||||
-0.00337759, -0.00353145, -0.00368470, -0.00383722,
|
||||
-0.00398892, -0.00413972, -0.00428967, -0.00443889,
|
||||
-0.00458749, -0.00473571, -0.00488366, -0.00503137,
|
||||
-0.00517887, -0.00532610, -0.00547302, -0.00561965,
|
||||
-0.00576598, -0.00591199, -0.00605766, -0.00620300,
|
||||
-0.00634801, -0.00649273, -0.00663727, -0.00678170,
|
||||
-0.00692617, -0.00707084, -0.00721583, -0.00736129,
|
||||
-0.00750735, -0.00765415, -0.00780184, -0.00795059,
|
||||
-0.00810058, -0.00825195, -0.00840487, -0.00855950,
|
||||
-0.00871607, -0.00887480, -0.00903596, -0.00919978,
|
||||
-0.00936650, -0.00953635, -0.00970931, -0.00988421,
|
||||
-0.01005916, -0.01023208, -0.01040130, -0.01056627,
|
||||
-0.01072678, -0.01088259, -0.01103348, -0.01117933,
|
||||
-0.01132004, -0.01145552, -0.01158573, -0.01171065,
|
||||
-0.01183025, -0.01194454, -0.01205352, -0.01215722,
|
||||
-0.01225572, -0.01234911, -0.01243749, -0.01252102,
|
||||
-0.01259985, -0.01267419, -0.01274437, -0.01281078,
|
||||
-0.01287379, -0.01293350, -0.01298972, -0.01304224,
|
||||
-0.01309086, -0.01313556, -0.01317644, -0.01321357,
|
||||
-0.01324707, -0.01327697, -0.01330334, -0.01332622,
|
||||
-0.01334570, -0.01336194, -0.01337510, -0.01338538,
|
||||
-0.01339276, -0.01339708, -0.01339816, -0.01339584,
|
||||
-0.01339014, -0.01338116, -0.01336903, -0.01335382,
|
||||
-0.01333545, -0.01331381, -0.01328876, -0.01326033,
|
||||
-0.01322880, -0.01319457, -0.01315806, -0.01311968,
|
||||
-0.01307987, -0.01303906, -0.01299769, -0.01295623,
|
||||
-0.01308207, -0.01304153, -0.01299802, -0.01295155,
|
||||
-0.01290215, -0.01284980, -0.01279450, -0.01273625,
|
||||
-0.01267501, -0.01261077, -0.01254347, -0.01247306,
|
||||
-0.01239950, -0.01232277, -0.01224304, -0.01216055,
|
||||
-0.01207554, -0.01198813, -0.01189829, -0.01180590,
|
||||
-0.01171090, -0.01161335, -0.01151352, -0.01141167,
|
||||
-0.01130807, -0.01120289, -0.01109626, -0.01098830,
|
||||
-0.01087916, -0.01076898, -0.01065793, -0.01054618,
|
||||
-0.01043380, -0.01032068, -0.01020670, -0.01009171,
|
||||
-0.00997585, -0.00985959, -0.00974338, -0.00962765,
|
||||
-0.00951273, -0.00939888, -0.00928634, -0.00917534,
|
||||
-0.00906604, -0.00895860, -0.00885313, -0.00874977,
|
||||
-0.00864862, -0.00854979, -0.00845337, -0.00835939,
|
||||
-0.00826785, -0.00817872, -0.00809195, -0.00800745,
|
||||
-0.00792506, -0.00784469, -0.00776588, -0.00768695,
|
||||
-0.00760568, -0.00752004, -0.00742875, -0.00733186,
|
||||
-0.00722976, -0.00712279, -0.00701130, -0.00689559,
|
||||
-0.00677595, -0.00665269, -0.00652610, -0.00639649,
|
||||
-0.00626417, -0.00612943, -0.00599252, -0.00585368,
|
||||
-0.00571315, -0.00557115, -0.00542792, -0.00528367,
|
||||
-0.00513864, -0.00499301, -0.00484693, -0.00470054,
|
||||
-0.00455395, -0.00440733, -0.00426086, -0.00411471,
|
||||
-0.00396904, -0.00382404, -0.00367991, -0.00353684,
|
||||
-0.00339502, -0.00325472, -0.00311618, -0.00297967,
|
||||
-0.00284531, -0.00271307, -0.00258290, -0.00245475,
|
||||
-0.00232860, -0.00220447, -0.00208236, -0.00196233,
|
||||
-0.00184450, -0.00172906, -0.00161620, -0.00150603,
|
||||
-0.00139852, -0.00129358, -0.00119112, -0.00109115,
|
||||
-0.00099375, -0.00089902, -0.00080705, -0.00071796,
|
||||
-0.00063185, -0.00054886, -0.00046904, -0.00039231,
|
||||
-0.00031845, -0.00024728, -0.00017860, -0.00011216,
|
||||
-0.00004771, 0.00001500, 0.00007600, 0.00013501,
|
||||
0.00019176, 0.00024595, 0.00029720, 0.00034504,
|
||||
0.00038902, 0.00042881, 0.00046456, 0.00049662,
|
||||
0.00052534, 0.00055114, 0.00057459, 0.00059629,
|
||||
0.00061684, 0.00063660, 0.00065568, 0.00067417,
|
||||
0.00069213, 0.00070935, 0.00072545, 0.00074005,
|
||||
0.00075283, 0.00076356, 0.00077209, 0.00077828,
|
||||
0.00078205, 0.00078350, 0.00078275, 0.00077992,
|
||||
0.00077520, 0.00076884, 0.00076108, 0.00075218,
|
||||
0.00074232, 0.00073170, 0.00072048, 0.00070881,
|
||||
0.00069680, 0.00068450, 0.00067201, 0.00065934,
|
||||
0.00064647, 0.00063335, 0.00061994, 0.00060621,
|
||||
0.00059211, 0.00057763, 0.00056274, 0.00054743,
|
||||
0.00053169, 0.00051553, 0.00049897, 0.00048206,
|
||||
0.00046487, 0.00044748, 0.00042996, 0.00041241,
|
||||
0.00039492, 0.00037759, 0.00036049, 0.00034371,
|
||||
0.00032732, 0.00031137, 0.00029587, 0.00028079,
|
||||
0.00026612, 0.00025183, 0.00023789, 0.00022428,
|
||||
0.00021097, 0.00019797, 0.00018530, 0.00017297,
|
||||
0.00016100, 0.00014942, 0.00013827, 0.00012757,
|
||||
0.00011736, 0.00010764, 0.00009841, 0.00008969,
|
||||
0.00008145, 0.00007369, 0.00006641, 0.00005958,
|
||||
0.00005320, 0.00004725, 0.00004171, 0.00003659,
|
||||
0.00003186, 0.00002752, 0.00002357, 0.00001999,
|
||||
0.00001679, 0.00001392, 0.00001140, 0.00000918,
|
||||
0.00000726, 0.00000562, 0.00000424, 0.00000309,
|
||||
0.00000217, 0.00000143, 0.00000088, 0.00000048,
|
||||
0.00000020, 0.00000004, -0.00000004, -0.00000006,
|
||||
-0.00000004, -0.00000000, 0.00000002, 0.00000000,
|
||||
0.00000000, 0.00000002, -0.00000000, -0.00000004,
|
||||
-0.00000005, -0.00000004, 0.00000004, 0.00000019,
|
||||
0.00000045, 0.00000083, 0.00000134, 0.00000201,
|
||||
0.00000285, 0.00000387, 0.00000510, 0.00000654,
|
||||
0.00000821, 0.00001011, 0.00001227, 0.00001468,
|
||||
0.00001735, 0.00002030, 0.00002352, 0.00002702,
|
||||
0.00003080, 0.00003486, 0.00003918, 0.00004379,
|
||||
0.00004866, 0.00005382, 0.00005924, 0.00006495,
|
||||
0.00007093, 0.00007719, 0.00008373, 0.00009053,
|
||||
0.00009758, 0.00010488, 0.00011240, 0.00012010,
|
||||
0.00012796, 0.00013596, 0.00014406, 0.00015226,
|
||||
0.00016053, 0.00016886, 0.00017725, 0.00018571,
|
||||
0.00019424, 0.00020286, 0.00021156, 0.00022037,
|
||||
0.00022928, 0.00023825, 0.00024724, 0.00025621,
|
||||
0.00026509, 0.00027385, 0.00028241, 0.00029072,
|
||||
0.00029874, 0.00030643, 0.00031374, 0.00032065,
|
||||
0.00032715, 0.00033325, 0.00033895, 0.00034425,
|
||||
0.00034917, 0.00035374, 0.00035796, 0.00036187,
|
||||
0.00036549, 0.00036883, 0.00037194, 0.00037479,
|
||||
0.00037736, 0.00037963, 0.00038154, 0.00038306,
|
||||
0.00038411, 0.00038462, 0.00038453, 0.00038373,
|
||||
0.00038213, 0.00037965, 0.00037621, 0.00037179,
|
||||
0.00036636, 0.00035989, 0.00035244, 0.00034407,
|
||||
0.00033488, 0.00032497, 0.00031449, 0.00030361,
|
||||
0.00029252, 0.00028133, 0.00027003, 0.00025862,
|
||||
0.00024706, 0.00023524, 0.00022297, 0.00021004,
|
||||
0.00019626, 0.00018150, 0.00016566, 0.00014864,
|
||||
0.00013041, 0.00011112, 0.00009096, 0.00007014,
|
||||
0.00004884, 0.00002718, 0.00000530, -0.00001667,
|
||||
-0.00003871, -0.00006090, -0.00008331, -0.00010600,
|
||||
-0.00012902, -0.00015244, -0.00017631, -0.00020065,
|
||||
-0.00022541, -0.00025052, -0.00027594, -0.00030159,
|
||||
-0.00032740, -0.00035332, -0.00037928, -0.00040527,
|
||||
-0.00043131, -0.00045741, -0.00048357, -0.00050978,
|
||||
-0.00053599, -0.00056217, -0.00058827, -0.00061423,
|
||||
-0.00064002, -0.00066562, -0.00069100, -0.00071616,
|
||||
-0.00074110, -0.00076584, -0.00079036, -0.00081465,
|
||||
-0.00083869, -0.00086245, -0.00088590, -0.00090901,
|
||||
-0.00093176, -0.00095413, -0.00097608, -0.00099758,
|
||||
-0.00101862, -0.00103918, -0.00105924, -0.00107879,
|
||||
-0.00109783, -0.00111635, -0.00113434, -0.00115181,
|
||||
-0.00116873, -0.00118510, -0.00120091, -0.00121615,
|
||||
-0.00123082, -0.00124490, -0.00125838, -0.00127125,
|
||||
-0.00128350, -0.00129511, -0.00130610, -0.00131643,
|
||||
-0.00132610, -0.00133509, -0.00134334, -0.00135069,
|
||||
-0.00135711, -0.00136272, -0.00136768, -0.00137225,
|
||||
-0.00137649, -0.00138042, -0.00138404, -0.00138737,
|
||||
-0.00139041, -0.00139317, -0.00139565, -0.00139785,
|
||||
-0.00139976, -0.00140137, -0.00140267, -0.00140366,
|
||||
-0.00140432, -0.00140464, -0.00140461, -0.00140423,
|
||||
-0.00140347, -0.00140235, -0.00140084, -0.00139894,
|
||||
-0.00139664, -0.00139388, -0.00139065, -0.00138694,
|
||||
-0.00138278, -0.00137818, -0.00137317, -0.00136772,
|
||||
-0.00136185, -0.00135556, -0.00134884, -0.00134170,
|
||||
-0.00133415, -0.00132619, -0.00131784, -0.00130908,
|
||||
-0.00129991, -0.00129031, -0.00128031, -0.00126990,
|
||||
-0.00125912, -0.00124797, -0.00123645, -0.00122458,
|
||||
-0.00121233, -0.00119972, -0.00118676, -0.00117347,
|
||||
-0.00115988, -0.00114605, -0.00113200, -0.00111778,
|
||||
-0.00110343, -0.00108898, -0.00107448, -0.00105995,
|
||||
};
|
||||
|
@@ -46,8 +46,7 @@
|
||||
*/
|
||||
DECLARE_ALIGNED(32, extern float, ff_aac_kbd_long_1024)[1024];
|
||||
DECLARE_ALIGNED(32, extern float, ff_aac_kbd_short_128)[128];
|
||||
const DECLARE_ALIGNED(32, extern float, ff_aac_eld_window_512)[1920];
|
||||
const DECLARE_ALIGNED(32, extern float, ff_aac_eld_window_480)[1800];
|
||||
const DECLARE_ALIGNED(32, extern float, ff_aac_eld_window)[1920];
|
||||
// @}
|
||||
|
||||
/* @name number of scalefactor window bands for long and short transform windows respectively
|
||||
@@ -55,7 +54,6 @@ const DECLARE_ALIGNED(32, extern float, ff_aac_eld_window_480)[1800];
|
||||
*/
|
||||
extern const uint8_t ff_aac_num_swb_1024[];
|
||||
extern const uint8_t ff_aac_num_swb_512 [];
|
||||
extern const uint8_t ff_aac_num_swb_480 [];
|
||||
extern const uint8_t ff_aac_num_swb_128 [];
|
||||
// @}
|
||||
|
||||
@@ -74,12 +72,10 @@ extern const uint16_t *ff_aac_codebook_vector_idx[];
|
||||
|
||||
extern const uint16_t * const ff_swb_offset_1024[13];
|
||||
extern const uint16_t * const ff_swb_offset_512 [13];
|
||||
extern const uint16_t * const ff_swb_offset_480 [13];
|
||||
extern const uint16_t * const ff_swb_offset_128 [13];
|
||||
|
||||
extern const uint8_t ff_tns_max_bands_1024[13];
|
||||
extern const uint8_t ff_tns_max_bands_512 [13];
|
||||
extern const uint8_t ff_tns_max_bands_480 [13];
|
||||
extern const uint8_t ff_tns_max_bands_128 [13];
|
||||
|
||||
#endif /* AVCODEC_AACTAB_H */
|
||||
|
@@ -3,11 +3,11 @@ OBJS-$(CONFIG_H264CHROMA) += aarch64/h264chroma_init_aarch64.o
|
||||
OBJS-$(CONFIG_H264DSP) += aarch64/h264dsp_init_aarch64.o
|
||||
OBJS-$(CONFIG_H264QPEL) += aarch64/h264qpel_init_aarch64.o
|
||||
OBJS-$(CONFIG_HPELDSP) += aarch64/hpeldsp_init_aarch64.o
|
||||
OBJS-$(CONFIG_IMDCT15) += aarch64/imdct15_init.o
|
||||
OBJS-$(CONFIG_MPEGAUDIODSP) += aarch64/mpegaudiodsp_init.o
|
||||
OBJS-$(CONFIG_NEON_CLOBBER_TEST) += aarch64/neontest.o
|
||||
OBJS-$(CONFIG_VIDEODSP) += aarch64/videodsp_init.o
|
||||
|
||||
OBJS-$(CONFIG_OPUS_DECODER) += aarch64/opus_imdct_init.o
|
||||
OBJS-$(CONFIG_RV40_DECODER) += aarch64/rv40dsp_init_aarch64.o
|
||||
OBJS-$(CONFIG_VC1_DECODER) += aarch64/vc1dsp_init_aarch64.o
|
||||
OBJS-$(CONFIG_VORBIS_DECODER) += aarch64/vorbisdsp_init.o
|
||||
@@ -21,8 +21,8 @@ NEON-OBJS-$(CONFIG_H264DSP) += aarch64/h264dsp_neon.o \
|
||||
NEON-OBJS-$(CONFIG_H264QPEL) += aarch64/h264qpel_neon.o \
|
||||
aarch64/hpeldsp_neon.o
|
||||
NEON-OBJS-$(CONFIG_HPELDSP) += aarch64/hpeldsp_neon.o
|
||||
NEON-OBJS-$(CONFIG_IMDCT15) += aarch64/imdct15_neon.o
|
||||
NEON-OBJS-$(CONFIG_MPEGAUDIODSP) += aarch64/mpegaudiodsp_neon.o
|
||||
NEON-OBJS-$(CONFIG_MDCT) += aarch64/mdct_neon.o
|
||||
|
||||
NEON-OBJS-$(CONFIG_OPUS_DECODER) += aarch64/opus_imdct_neon.o
|
||||
NEON-OBJS-$(CONFIG_VORBIS_DECODER) += aarch64/vorbisdsp_neon.o
|
||||
|
@@ -376,7 +376,8 @@ function ff_fft_calc_neon, export=1
|
||||
ld1 {v30.16b}, [x10]
|
||||
mov x7, #-8
|
||||
movrel x12, pmmp
|
||||
ldr x3, [x3, x2, lsl #3]
|
||||
ldr x4, [x3, x2, lsl #3]
|
||||
add x3, x3, x4
|
||||
movrel x13, mppm
|
||||
movrel x14, X(ff_cos_16)
|
||||
ld1 {v31.16b}, [x11]
|
||||
@@ -415,22 +416,22 @@ function ff_fft_permute_neon, export=1
|
||||
ret
|
||||
endfunc
|
||||
|
||||
const fft_tab_neon, relocate=1
|
||||
.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
|
||||
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
|
||||
endconst
|
||||
|
||||
const pmmp, align=4
|
||||
|
@@ -21,22 +21,21 @@
|
||||
#include "libavutil/cpu.h"
|
||||
#include "libavutil/aarch64/cpu.h"
|
||||
#include "libavutil/internal.h"
|
||||
|
||||
#include "libavcodec/imdct15.h"
|
||||
#include "libavcodec/opus_imdct.h"
|
||||
|
||||
#include "asm-offsets.h"
|
||||
|
||||
AV_CHECK_OFFSET(IMDCT15Context, exptab, CELT_EXPTAB);
|
||||
AV_CHECK_OFFSET(IMDCT15Context, fft_n, CELT_FFT_N);
|
||||
AV_CHECK_OFFSET(IMDCT15Context, len2, CELT_LEN2);
|
||||
AV_CHECK_OFFSET(IMDCT15Context, len4, CELT_LEN4);
|
||||
AV_CHECK_OFFSET(IMDCT15Context, tmp, CELT_TMP);
|
||||
AV_CHECK_OFFSET(IMDCT15Context, twiddle_exptab, CELT_TWIDDLE);
|
||||
AV_CHECK_OFFSET(CeltIMDCTContext, exptab, CELT_EXPTAB);
|
||||
AV_CHECK_OFFSET(CeltIMDCTContext, fft_n, CELT_FFT_N);
|
||||
AV_CHECK_OFFSET(CeltIMDCTContext, len2, CELT_LEN2);
|
||||
AV_CHECK_OFFSET(CeltIMDCTContext, len4, CELT_LEN4);
|
||||
AV_CHECK_OFFSET(CeltIMDCTContext, tmp, CELT_TMP);
|
||||
AV_CHECK_OFFSET(CeltIMDCTContext, twiddle_exptab, CELT_TWIDDLE);
|
||||
|
||||
void ff_celt_imdct_half_neon(IMDCT15Context *s, float *dst, const float *src,
|
||||
void ff_celt_imdct_half_neon(CeltIMDCTContext *s, float *dst, const float *src,
|
||||
ptrdiff_t stride, float scale);
|
||||
|
||||
void ff_imdct15_init_aarch64(IMDCT15Context *s)
|
||||
void ff_celt_imdct_init_aarch64(CeltIMDCTContext *s)
|
||||
{
|
||||
int cpu_flags = av_get_cpu_flags();
|
||||
|
@@ -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
|
||||
add x5, x5, x3, lsl #3
|
||||
ldr x5, [x5]
|
||||
ldr x6, [x5, x3, lsl #3]
|
||||
add x5, x5, x6
|
||||
mov x10, x0
|
||||
blr x5
|
||||
ldp x20, x30, [sp]
|
||||
@@ -451,14 +451,14 @@ function fft_b15_calc_neon
|
||||
ret
|
||||
endfunc
|
||||
|
||||
const fft_tab_neon, relocate=1
|
||||
.quad fft15_neon
|
||||
.quad fft30_neon
|
||||
.quad fft60_neon
|
||||
.quad fft120_neon
|
||||
.quad fft240_neon
|
||||
.quad fft480_neon
|
||||
.quad fft960_neon
|
||||
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
|
||||
endconst
|
||||
|
||||
function ff_celt_imdct_half_neon, export=1
|
@@ -67,8 +67,8 @@
|
||||
#define AC3_RENAME(x) x ## _fixed
|
||||
#define AC3_NORM(norm) (1<<24)/(norm)
|
||||
#define AC3_MUL(a,b) ((((int64_t) (a)) * (b))>>12)
|
||||
#define AC3_RANGE(x) ((x)|(((x)&128)<<1))
|
||||
#define AC3_HEAVY_RANGE(x) ((x)<<1)
|
||||
#define AC3_RANGE(x) (x|((x&128)<<1))
|
||||
#define AC3_HEAVY_RANGE(x) (x<<1)
|
||||
#define AC3_DYNAMIC_RANGE(x) (x)
|
||||
#define AC3_SPX_BLEND(x) (x)
|
||||
#define AC3_DYNAMIC_RANGE1 0
|
||||
|
@@ -485,7 +485,7 @@ static void calc_transform_coeffs_cpl(AC3DecodeContext *s)
|
||||
/**
|
||||
* Grouped mantissas for 3-level 5-level and 11-level quantization
|
||||
*/
|
||||
typedef struct mant_groups {
|
||||
typedef struct {
|
||||
int b1_mant[2];
|
||||
int b2_mant[2];
|
||||
int b4_mant;
|
||||
@@ -1429,8 +1429,7 @@ static int ac3_decode_frame(AVCodecContext * avctx, void *data,
|
||||
memcpy(s->input_buffer, buf, FFMIN(buf_size, AC3_FRAME_BUFFER_SIZE));
|
||||
buf = s->input_buffer;
|
||||
/* initialize the GetBitContext with the start of valid AC-3 Frame */
|
||||
if ((ret = init_get_bits8(&s->gbc, buf, buf_size)) < 0)
|
||||
return ret;
|
||||
init_get_bits(&s->gbc, buf, buf_size * 8);
|
||||
|
||||
/* parse the syncinfo */
|
||||
err = parse_frame_header(s);
|
||||
|
@@ -125,7 +125,7 @@ static void ac3_bit_alloc_calc_bap_c(int16_t *mask, int16_t *psd,
|
||||
band_end = FFMIN(band_end, end);
|
||||
|
||||
for (; bin < band_end; bin++) {
|
||||
int address = av_clip_uintp2((psd[bin] - m) >> 5, 6);
|
||||
int address = av_clip((psd[bin] - m) >> 5, 0, 63);
|
||||
bap[bin] = bap_tab[address];
|
||||
}
|
||||
} while (end > band_end);
|
||||
|
@@ -246,10 +246,6 @@ static inline short adpcm_ms_expand_nibble(ADPCMChannelStatus *c, int nibble)
|
||||
c->sample1 = av_clip_int16(predictor);
|
||||
c->idelta = (ff_adpcm_AdaptationTable[(int)nibble] * c->idelta) >> 8;
|
||||
if (c->idelta < 16) c->idelta = 16;
|
||||
if (c->idelta > INT_MAX/768) {
|
||||
av_log(NULL, AV_LOG_WARNING, "idelta overflow\n");
|
||||
c->idelta = INT_MAX/768;
|
||||
}
|
||||
|
||||
return c->sample1;
|
||||
}
|
||||
@@ -269,7 +265,7 @@ static inline short adpcm_ima_oki_expand_nibble(ADPCMChannelStatus *c, int nibbl
|
||||
if (sign) predictor -= diff;
|
||||
else predictor += diff;
|
||||
|
||||
c->predictor = av_clip_intp2(predictor, 11);
|
||||
c->predictor = av_clip(predictor, -2048, 2047);
|
||||
c->step_index = step_index;
|
||||
|
||||
return c->predictor << 4;
|
||||
@@ -578,8 +574,6 @@ static int get_nb_samples(AVCodecContext *avctx, GetByteContext *gb,
|
||||
case AV_CODEC_ID_ADPCM_IMA_DK4:
|
||||
if (avctx->block_align > 0)
|
||||
buf_size = FFMIN(buf_size, avctx->block_align);
|
||||
if (buf_size < 4 * ch)
|
||||
return AVERROR_INVALIDDATA;
|
||||
nb_samples = 1 + (buf_size - 4 * ch) * 2 / ch;
|
||||
break;
|
||||
case AV_CODEC_ID_ADPCM_IMA_RAD:
|
||||
@@ -593,15 +587,13 @@ static int get_nb_samples(AVCodecContext *avctx, GetByteContext *gb,
|
||||
int bsamples = ff_adpcm_ima_block_samples[avctx->bits_per_coded_sample - 2];
|
||||
if (avctx->block_align > 0)
|
||||
buf_size = FFMIN(buf_size, avctx->block_align);
|
||||
if (buf_size < 4 * ch)
|
||||
return AVERROR_INVALIDDATA;
|
||||
nb_samples = 1 + (buf_size - 4 * ch) / (bsize * ch) * bsamples;
|
||||
break;
|
||||
}
|
||||
case AV_CODEC_ID_ADPCM_MS:
|
||||
if (avctx->block_align > 0)
|
||||
buf_size = FFMIN(buf_size, avctx->block_align);
|
||||
nb_samples = (buf_size - 6 * ch) * 2 / ch;
|
||||
nb_samples = 2 + (buf_size - 7 * ch) * 2 / ch;
|
||||
break;
|
||||
case AV_CODEC_ID_ADPCM_SBPRO_2:
|
||||
case AV_CODEC_ID_ADPCM_SBPRO_3:
|
||||
@@ -614,8 +606,6 @@ static int get_nb_samples(AVCodecContext *avctx, GetByteContext *gb,
|
||||
case AV_CODEC_ID_ADPCM_SBPRO_4: samples_per_byte = 2; break;
|
||||
}
|
||||
if (!s->status[0].step_index) {
|
||||
if (buf_size < ch)
|
||||
return AVERROR_INVALIDDATA;
|
||||
nb_samples++;
|
||||
buf_size -= ch;
|
||||
}
|
||||
@@ -1534,11 +1524,6 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data,
|
||||
|
||||
*got_frame_ptr = 1;
|
||||
|
||||
if (avpkt->size < bytestream2_tell(&gb)) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Overread of %d < %d\n", avpkt->size, bytestream2_tell(&gb));
|
||||
return avpkt->size;
|
||||
}
|
||||
|
||||
return bytestream2_tell(&gb);
|
||||
}
|
||||
|
||||
|
@@ -227,7 +227,7 @@ static inline uint8_t adpcm_ms_compress_sample(ADPCMChannelStatus *c,
|
||||
bias = -c->idelta / 2;
|
||||
|
||||
nibble = (nibble + bias) / c->idelta;
|
||||
nibble = av_clip_intp2(nibble, 3) & 0x0F;
|
||||
nibble = av_clip(nibble, -8, 7) & 0x0F;
|
||||
|
||||
predictor += ((nibble & 0x08) ? (nibble - 0x10) : nibble) * c->idelta;
|
||||
|
||||
@@ -581,7 +581,7 @@ static int adpcm_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
|
||||
// init the encoder state
|
||||
for (i = 0; i < avctx->channels; i++) {
|
||||
// clip step so it fits 6 bits
|
||||
c->status[i].step_index = av_clip_uintp2(c->status[i].step_index, 6);
|
||||
c->status[i].step_index = av_clip(c->status[i].step_index, 0, 63);
|
||||
put_sbits(&pb, 16, samples[i]);
|
||||
put_bits(&pb, 6, c->status[i].step_index);
|
||||
c->status[i].prev_sample = samples[i];
|
||||
|
@@ -81,7 +81,7 @@ static void adx_encode(ADXContext *c, uint8_t *adx, const int16_t *wav,
|
||||
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_intp2(ROUNDED_DIV(d, scale), 3);
|
||||
d = av_clip(ROUNDED_DIV(d, scale), -8, 7);
|
||||
|
||||
put_sbits(&pb, 4, d);
|
||||
|
||||
|
@@ -448,7 +448,7 @@ static av_cold int aic_decode_init(AVCodecContext *avctx)
|
||||
}
|
||||
}
|
||||
|
||||
ctx->slice_data = av_malloc_array(ctx->slice_width, AIC_BAND_COEFFS
|
||||
ctx->slice_data = av_malloc(ctx->slice_width * AIC_BAND_COEFFS
|
||||
* sizeof(*ctx->slice_data));
|
||||
if (!ctx->slice_data) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Error allocating slice buffer\n");
|
||||
|
@@ -60,7 +60,7 @@
|
||||
|
||||
#define ALAC_EXTRADATA_SIZE 36
|
||||
|
||||
typedef struct ALACContext {
|
||||
typedef struct {
|
||||
AVClass *class;
|
||||
AVCodecContext *avctx;
|
||||
GetBitContext gb;
|
||||
@@ -533,12 +533,6 @@ static int allocate_buffers(ALACContext *alac)
|
||||
int ch;
|
||||
int buf_size = alac->max_samples_per_frame * sizeof(int32_t);
|
||||
|
||||
for (ch = 0; ch < 2; ch++) {
|
||||
alac->predict_error_buffer[ch] = NULL;
|
||||
alac->output_samples_buffer[ch] = NULL;
|
||||
alac->extra_bits_buffer[ch] = NULL;
|
||||
}
|
||||
|
||||
for (ch = 0; ch < FFMIN(alac->channels, 2); ch++) {
|
||||
FF_ALLOC_OR_GOTO(alac->avctx, alac->predict_error_buffer[ch],
|
||||
buf_size, buf_alloc_fail);
|
||||
|
@@ -77,12 +77,10 @@ void avcodec_register_all(void)
|
||||
REGISTER_HWACCEL(H263_VAAPI, h263_vaapi);
|
||||
REGISTER_HWACCEL(H263_VDPAU, h263_vdpau);
|
||||
REGISTER_HWACCEL(H264_DXVA2, h264_dxva2);
|
||||
REGISTER_HWACCEL(H264_QSV, h264_qsv);
|
||||
REGISTER_HWACCEL(H264_VAAPI, h264_vaapi);
|
||||
REGISTER_HWACCEL(H264_VDA, h264_vda);
|
||||
REGISTER_HWACCEL(H264_VDA_OLD, h264_vda_old);
|
||||
REGISTER_HWACCEL(H264_VDPAU, h264_vdpau);
|
||||
REGISTER_HWACCEL(HEVC_DXVA2, hevc_dxva2);
|
||||
REGISTER_HWACCEL(MPEG1_XVMC, mpeg1_xvmc);
|
||||
REGISTER_HWACCEL(MPEG1_VDPAU, mpeg1_vdpau);
|
||||
REGISTER_HWACCEL(MPEG2_XVMC, mpeg2_xvmc);
|
||||
@@ -171,12 +169,10 @@ void avcodec_register_all(void)
|
||||
REGISTER_ENCDEC (H263P, h263p);
|
||||
REGISTER_DECODER(H264, h264);
|
||||
REGISTER_DECODER(H264_CRYSTALHD, h264_crystalhd);
|
||||
REGISTER_DECODER(H264_QSV, h264_qsv);
|
||||
REGISTER_DECODER(H264_VDA, h264_vda);
|
||||
REGISTER_DECODER(H264_VDPAU, h264_vdpau);
|
||||
REGISTER_DECODER(HEVC, hevc);
|
||||
REGISTER_DECODER(HNM4_VIDEO, hnm4_video);
|
||||
REGISTER_DECODER(HQX, hqx);
|
||||
REGISTER_ENCDEC (HUFFYUV, huffyuv);
|
||||
REGISTER_DECODER(IDCIN, idcin);
|
||||
REGISTER_DECODER(IFF_BYTERUN1, iff_byterun1);
|
||||
@@ -227,7 +223,6 @@ void avcodec_register_all(void)
|
||||
REGISTER_DECODER(MVC2, mvc2);
|
||||
REGISTER_DECODER(MXPEG, mxpeg);
|
||||
REGISTER_DECODER(NUV, nuv);
|
||||
REGISTER_ENCODER(NVENC, nvenc);
|
||||
REGISTER_DECODER(PAF_VIDEO, paf_video);
|
||||
REGISTER_ENCDEC (PAM, pam);
|
||||
REGISTER_ENCDEC (PBM, pbm);
|
||||
@@ -349,7 +344,6 @@ void avcodec_register_all(void)
|
||||
REGISTER_DECODER(DSD_LSBF_PLANAR, dsd_lsbf_planar);
|
||||
REGISTER_DECODER(DSD_MSBF_PLANAR, dsd_msbf_planar);
|
||||
REGISTER_DECODER(DSICINAUDIO, dsicinaudio);
|
||||
REGISTER_DECODER(DSS_SP, dss_sp);
|
||||
REGISTER_ENCDEC (EAC3, eac3);
|
||||
REGISTER_DECODER(EVRC, evrc);
|
||||
REGISTER_DECODER(FFWAVESYNTH, ffwavesynth);
|
||||
@@ -481,14 +475,11 @@ void avcodec_register_all(void)
|
||||
REGISTER_DECODER(ADPCM_VIMA, adpcm_vima);
|
||||
REGISTER_DECODER(ADPCM_XA, adpcm_xa);
|
||||
REGISTER_ENCDEC (ADPCM_YAMAHA, adpcm_yamaha);
|
||||
#if FF_API_VIMA_DECODER
|
||||
REGISTER_DECODER(VIMA, vima);
|
||||
#endif
|
||||
|
||||
/* subtitles */
|
||||
REGISTER_ENCDEC (SSA, ssa);
|
||||
REGISTER_ENCDEC (ASS, ass);
|
||||
REGISTER_DECODER(CCAPTION, ccaption);
|
||||
REGISTER_ENCDEC (DVBSUB, dvbsub);
|
||||
REGISTER_ENCDEC (DVDSUB, dvdsub);
|
||||
REGISTER_DECODER(JACOSUB, jacosub);
|
||||
@@ -542,7 +533,6 @@ void avcodec_register_all(void)
|
||||
REGISTER_ENCODER(LIBXVID, libxvid);
|
||||
REGISTER_DECODER(LIBZVBI_TELETEXT, libzvbi_teletext);
|
||||
REGISTER_ENCODER(LIBAACPLUS, libaacplus);
|
||||
REGISTER_ENCODER(LIBOPENH264, libopenh264);
|
||||
|
||||
/* text */
|
||||
REGISTER_DECODER(BINTEXT, bintext);
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user