History

lavf: add AVFMT_FLAG_BITEXACT.

Use it instead of checking CODEC_FLAG_BITEXACT in the first stream's codec context. Using codec options inside lavf is fragile and can easily break when the muxing codec context is not the encoding context.

Anton Khirnov committed 12 years ago

Commit 0c1959b1 parent b70d7a415 files · +40 −20Browse files

Unified · Split

15 files
  1. doc/APIchanges +4 −0
  2. libavformat/avformat.h +7 −0
  3. libavformat/flacenc.c +1 −1
  4. libavformat/matroskaenc.c +1 −1
  5. libavformat/movenc.c +1 −1
  6. libavformat/mux.c +6 −1
  7. libavformat/mxfenc.c +2 −2
  8. libavformat/oggenc.c +5 −5
  9. libavformat/options_table.h +1 −0
  10. libavformat/version.h +4 −1
  11. tests/fate-run.sh +1 −1
  12. tests/fate/filter-audio.mak +2 −2
  13. tests/fate/video.mak +2 −2
  14. tests/fate/wavpack.mak +2 −2
  15. tests/regression-funcs.sh +1 −1
doc/APIchanges+4−0
@@ -13,6 +13,10 @@ libavutil: 2013-12-xx · 12 unmodified lines
1313
1414 API changes, most recent first:
1515
16+2014-05-xx - xxxxxxx - lavf 55.17.0 - avformat.h
17+ Add AVMFT_FLAG_BITEXACT flag. Muxers now use it instead of checking
18+ CODEC_FLAG_BITEXACT on the first stream.
19+
1620 2014-xx-xx - xxxxxxx - lavu 53.14.0 - pixfmt.h
1721 Add AV_PIX_FMT_VDA for new-style VDA acceleration.
1822
libavformat/avformat.h+7−0
@@ -1004,6 +1004,13 @@ typedef struct AVFormatContext { · 1003 unmodified lines
10041004 #define AVFMT_FLAG_CUSTOM_IO 0x0080 ///< The caller has supplied a custom AVIOContext, don't avio_close() it.
10051005 #define AVFMT_FLAG_DISCARD_CORRUPT 0x0100 ///< Discard frames marked corrupted
10061006 #define AVFMT_FLAG_FLUSH_PACKETS 0x0200 ///< Flush the AVIOContext every packet.
1007+/**
1008+ * When muxing, try to avoid writing any random/volatile data to the output.
1009+ * This includes any random IDs, real-time timestamps/dates, muxer version, etc.
1010+ *
1011+ * This flag is mainly intended for testing.
1012+ */
1013+#define AVFMT_FLAG_BITEXACT 0x0400
10071014
10081015 /**
10091016 * Maximum size of the data read from input for determining
libavformat/flacenc.c+1−1
@@ -84,7 +84,7 @@ static int flac_write_header(struct AVFormatContext *s) · 83 unmodified lines
8484 return ret;
8585
8686 ret = flac_write_block_comment(s->pb, &s->metadata, 0,
87− codec->flags & CODEC_FLAG_BITEXACT);
87+ s->flags & AVFMT_FLAG_BITEXACT);
8888 if (ret)
8989 return ret;
9090
libavformat/matroskaenc.c+1−1
@@ -970,7 +970,7 @@ static int mkv_write_header(AVFormatContext *s) · 969 unmodified lines
970970 put_ebml_uint(pb, MATROSKA_ID_TIMECODESCALE, 1000000);
971971 if ((tag = av_dict_get(s->metadata, "title", NULL, 0)))
972972 put_ebml_string(pb, MATROSKA_ID_TITLE, tag->value);
973− if (!(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) {
973+ if (!(s->flags & AVFMT_FLAG_BITEXACT)) {
974974 uint32_t segment_uid[4];
975975 AVLFG lfg;
976976
libavformat/movenc.c+1−1
@@ -2024,7 +2024,7 @@ static int mov_write_udta_tag(AVIOContext *pb, MOVMuxContext *mov, · 2023 unmodified lines
20242024 uint8_t *buf;
20252025
20262026 for (i = 0; i < s->nb_streams; i++)
2027− if (mov->tracks[i].enc->flags & CODEC_FLAG_BITEXACT) {
2027+ if (s->flags & AVFMT_FLAG_BITEXACT) {
20282028 return 0;
20292029 }
20302030
libavformat/mux.c+6−1
@@ -149,6 +149,11 @@ static int init_muxer(AVFormatContext *s, AVDictionary **options) · 148 unmodified lines
149149 if ((ret = av_opt_set_dict(s, &tmp)) < 0)
150150 goto fail;
151151
152+#if FF_API_LAVF_BITEXACT
153+ if (s->nb_streams && s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)
154+ s->flags |= AVFMT_FLAG_BITEXACT;
155+#endif
156+
152157 // some sanity checks
153158 if (s->nb_streams == 0 && !(of->flags & AVFMT_NOSTREAMS)) {
154159 av_log(s, AV_LOG_ERROR, "no streams\n");
@@ -252,7 +257,7 @@ static int init_muxer(AVFormatContext *s, AVDictionary **options) · 97 unmodified lines
252257 }
253258
254259 /* set muxer identification string */
255− if (s->nb_streams && !(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) {
260+ if (!(s->flags & AVFMT_FLAG_BITEXACT)) {
256261 av_dict_set(&s->metadata, "encoder", LIBAVFORMAT_IDENT, 0);
257262 }
258263
libavformat/mxfenc.c+2−2
@@ -507,7 +507,7 @@ static void mxf_write_identification(AVFormatContext *s) · 506 unmodified lines
507507 mxf_write_metadata_key(pb, 0x013000);
508508 PRINT_KEY(s, "identification key", pb->buf_ptr - 16);
509509
510− version = s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT ?
510+ version = s->flags & AVFMT_FLAG_BITEXACT ?
511511 "0.0.0" : AV_STRINGIFY(LIBAVFORMAT_VERSION);
512512 length = 84 + (strlen(company)+strlen(product)+strlen(version))*2; // utf-16
513513 klv_encode_ber_length(pb, length);
@@ -1512,7 +1512,7 @@ static int mxf_write_header(AVFormatContext *s) · 998 unmodified lines
15121512 mxf->essence_container_count = 1;
15131513 }
15141514
1515− if (!(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT))
1515+ if (!(s->flags & AVFMT_FLAG_BITEXACT))
15161516 mxf_gen_umid(s);
15171517
15181518 for (i = 0; i < s->nb_streams; i++) {
libavformat/oggenc.c+5−5
@@ -425,7 +425,7 @@ static int ogg_write_header(AVFormatContext *s) · 424 unmodified lines
425425 oggstream = av_mallocz(sizeof(*oggstream));
426426 oggstream->page.stream_index = i;
427427
428− if (!(st->codec->flags & CODEC_FLAG_BITEXACT))
428+ if (!(s->flags & AVFMT_FLAG_BITEXACT))
429429 do {
430430 serial_num = av_get_random_seed();
431431 for (j = 0; j < i; j++) {
@@ -439,7 +439,7 @@ static int ogg_write_header(AVFormatContext *s) · 7 unmodified lines
439439 st->priv_data = oggstream;
440440 if (st->codec->codec_id == AV_CODEC_ID_FLAC) {
441441 int err = ogg_build_flac_headers(st->codec, oggstream,
442− st->codec->flags & CODEC_FLAG_BITEXACT,
442+ s->flags & AVFMT_FLAG_BITEXACT,
443443 &s->metadata);
444444 if (err) {
445445 av_log(s, AV_LOG_ERROR, "Error writing FLAC headers\n");
@@ -448,7 +448,7 @@ static int ogg_write_header(AVFormatContext *s) · 2 unmodified lines
448448 }
449449 } else if (st->codec->codec_id == AV_CODEC_ID_SPEEX) {
450450 int err = ogg_build_speex_headers(st->codec, oggstream,
451− st->codec->flags & CODEC_FLAG_BITEXACT,
451+ s->flags & AVFMT_FLAG_BITEXACT,
452452 &s->metadata);
453453 if (err) {
454454 av_log(s, AV_LOG_ERROR, "Error writing Speex headers\n");
@@ -457,7 +457,7 @@ static int ogg_write_header(AVFormatContext *s) · 2 unmodified lines
457457 }
458458 } else if (st->codec->codec_id == AV_CODEC_ID_OPUS) {
459459 int err = ogg_build_opus_headers(st->codec, oggstream,
460− st->codec->flags & CODEC_FLAG_BITEXACT,
460+ s->flags & AVFMT_FLAG_BITEXACT,
461461 &s->metadata);
462462 if (err) {
463463 av_log(s, AV_LOG_ERROR, "Error writing Opus headers\n");
@@ -478,7 +478,7 @@ static int ogg_write_header(AVFormatContext *s) · 14 unmodified lines
478478 return -1;
479479 }
480480
481− p = ogg_write_vorbiscomment(7, st->codec->flags & CODEC_FLAG_BITEXACT,
481+ p = ogg_write_vorbiscomment(7, s->flags & AVFMT_FLAG_BITEXACT,
482482 &oggstream->header_len[1], &s->metadata,
483483 framing_bit);
484484 oggstream->header[1] = p;
libavformat/options_table.h+1−0
@@ -42,6 +42,7 @@ static const AVOption avformat_options[] = { · 41 unmodified lines
4242 {"igndts", "ignore dts", 0, AV_OPT_TYPE_CONST, {.i64 = AVFMT_FLAG_IGNDTS }, INT_MIN, INT_MAX, D, "fflags"},
4343 {"discardcorrupt", "discard corrupted frames", 0, AV_OPT_TYPE_CONST, {.i64 = AVFMT_FLAG_DISCARD_CORRUPT }, INT_MIN, INT_MAX, D, "fflags"},
4444 {"nobuffer", "reduce the latency introduced by optional buffering", 0, AV_OPT_TYPE_CONST, {.i64 = AVFMT_FLAG_NOBUFFER }, 0, INT_MAX, D, "fflags"},
45+{"bitexact", "do not write random/volatile data", 0, AV_OPT_TYPE_CONST, { .i64 = AVFMT_FLAG_BITEXACT }, 0, 0, E, "fflags" },
4546 {"analyzeduration", "how many microseconds are analyzed to estimate duration", OFFSET(max_analyze_duration), AV_OPT_TYPE_INT, {.i64 = 5*AV_TIME_BASE }, 0, INT_MAX, D},
4647 {"cryptokey", "decryption key", OFFSET(key), AV_OPT_TYPE_BINARY, {.dbl = 0}, 0, 0, D},
4748 {"indexmem", "max memory used for timestamp index (per stream)", OFFSET(max_index_size), AV_OPT_TYPE_INT, {.i64 = 1<<20 }, 0, INT_MAX, D},
libavformat/version.h+4−1
@@ -30,7 +30,7 @@ · 29 unmodified lines
3030 #include "libavutil/version.h"
3131
3232 #define LIBAVFORMAT_VERSION_MAJOR 55
33−#define LIBAVFORMAT_VERSION_MINOR 16
33+#define LIBAVFORMAT_VERSION_MINOR 17
3434 #define LIBAVFORMAT_VERSION_MICRO 0
3535
3636 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
@@ -51,5 +51,8 @@ · 14 unmodified lines
5151 #ifndef FF_API_REFERENCE_DTS
5252 #define FF_API_REFERENCE_DTS (LIBAVFORMAT_VERSION_MAJOR < 56)
5353 #endif
54+#ifndef FF_API_LAVF_BITEXACT
55+#define FF_API_LAVF_BITEXACT (LIBAVFORMAT_VERSION_MAJOR < 56)
56+#endif
5457
5558 #endif /* AVFORMAT_VERSION_H */
tests/fate-run.sh+1−1
@@ -118,7 +118,7 @@ enc_dec_pcm(){ · 117 unmodified lines
118118 avconv -f $out_fmt -i ${encfile} -c:a pcm_${pcm_fmt} -f ${dec_fmt} -
119119 }
120120
121−FLAGS="-flags +bitexact -sws_flags +accurate_rnd+bitexact"
121+FLAGS="-flags +bitexact -sws_flags +accurate_rnd+bitexact -fflags +bitexact"
122122 DEC_OPTS="-threads $threads -idct simple $FLAGS"
123123 ENC_OPTS="-threads 1 -idct simple -dct fastint"
124124
tests/fate/filter-audio.mak+2−2
@@ -45,7 +45,7 @@ FATE_FILTER_CHANNELMAP += fate-filter-channelmap-one-int · 44 unmodified lines
4545 fate-filter-channelmap-one-int: tests/data/filtergraphs/channelmap_one_int
4646 fate-filter-channelmap-one-int: SRC = $(TARGET_PATH)/tests/data/asynth-44100-6.wav
4747 fate-filter-channelmap-one-int: tests/data/asynth-44100-6.wav
48−fate-filter-channelmap-one-int: CMD = md5 -i $(SRC) -filter_complex_script $(TARGET_PATH)/tests/data/filtergraphs/channelmap_one_int -f wav -flags +bitexact
48+fate-filter-channelmap-one-int: CMD = md5 -i $(SRC) -filter_complex_script $(TARGET_PATH)/tests/data/filtergraphs/channelmap_one_int -f wav -fflags +bitexact
4949 fate-filter-channelmap-one-int: CMP = oneline
5050 fate-filter-channelmap-one-int: REF = 21f1977c4f9705e2057083f84764e685
5151
@@ -53,7 +53,7 @@ FATE_FILTER_CHANNELMAP += fate-filter-channelmap-one-str · 1 unmodified line
5353 fate-filter-channelmap-one-str: tests/data/filtergraphs/channelmap_one_str
5454 fate-filter-channelmap-one-str: SRC = $(TARGET_PATH)/tests/data/asynth-44100-2.wav
5555 fate-filter-channelmap-one-str: tests/data/asynth-44100-2.wav
56−fate-filter-channelmap-one-str: CMD = md5 -i $(SRC) -filter_complex_script $(TARGET_PATH)/tests/data/filtergraphs/channelmap_one_str -f wav -flags +bitexact
56+fate-filter-channelmap-one-str: CMD = md5 -i $(SRC) -filter_complex_script $(TARGET_PATH)/tests/data/filtergraphs/channelmap_one_str -f wav -fflags +bitexact
5757 fate-filter-channelmap-one-str: CMP = oneline
5858 fate-filter-channelmap-one-str: REF = 9fe9bc452282dfd94fd80e9491607a0c
5959
tests/fate/video.mak+2−2
@@ -176,7 +176,7 @@ FATE_SAMPLES_AVCONV-$(call DEMDEC, MSNWC_TCP, MIMIC) += fate-mimic · 175 unmodified lines
176176 fate-mimic: CMD = framecrc -idct simple -i $(TARGET_SAMPLES)/mimic/mimic2-womanloveffmpeg.cam
177177
178178 FATE_SAMPLES_AVCONV-$(call DEMDEC, MOV, MJPEGB) += fate-mjpegb
179−fate-mjpegb: CMD = framecrc -idct simple -flags +bitexact -i $(TARGET_SAMPLES)/mjpegb/mjpegb_part.mov -an
179+fate-mjpegb: CMD = framecrc -idct simple -fflags +bitexact -i $(TARGET_SAMPLES)/mjpegb/mjpegb_part.mov -an
180180
181181 FATE_SAMPLES_AVCONV-$(call DEMDEC, MVI, MOTIONPIXELS) += fate-motionpixels
182182 fate-motionpixels: CMD = framecrc -i $(TARGET_SAMPLES)/motion-pixels/INTRO-partial.MVI -an -pix_fmt rgb24 -vframes 111
@@ -265,7 +265,7 @@ fate-v410dec: CMD = framecrc -i $(TARGET_SAMPLES)/v410/lenav410.mov -pix_fmt yuv · 82 unmodified lines
265265
266266 FATE_SAMPLES_AVCONV-$(call ENCDEC, V410 PGMYUV, AVI IMAGE2) += fate-v410enc
267267 fate-v410enc: $(VREF)
268−fate-v410enc: CMD = md5 -f image2 -vcodec pgmyuv -i $(TARGET_PATH)/tests/vsynth1/%02d.pgm -flags +bitexact -vcodec v410 -f avi
268+fate-v410enc: CMD = md5 -f image2 -vcodec pgmyuv -i $(TARGET_PATH)/tests/vsynth1/%02d.pgm -fflags +bitexact -vcodec v410 -f avi
269269
270270 FATE_SAMPLES_AVCONV-$(call DEMDEC, SIFF, VB) += fate-vb
271271 fate-vb: CMD = framecrc -i $(TARGET_SAMPLES)/SIFF/INTRO_B.VB -t 3 -pix_fmt rgb24 -an
tests/fate/wavpack.mak+2−2
@@ -89,12 +89,12 @@ FATE_WAVPACK-$(call DEMDEC, MATROSKA, WAVPACK) += fate-wavpack-matroskamode · 88 unmodified lines
8989 fate-wavpack-matroskamode: CMD = md5 -i $(TARGET_SAMPLES)/wavpack/special/matroska_mode.mka -f s16le
9090
9191 FATE_WAVPACK-$(call DEMMUX, WV, MATROSKA) += fate-wavpack-matroska_mux-mono
92−fate-wavpack-matroska_mux-mono: CMD = md5 -i $(TARGET_SAMPLES)/wavpack/num_channels/mono_16bit_int.wv -c copy -flags +bitexact -f matroska
92+fate-wavpack-matroska_mux-mono: CMD = md5 -i $(TARGET_SAMPLES)/wavpack/num_channels/mono_16bit_int.wv -c copy -fflags +bitexact -f matroska
9393 fate-wavpack-matroska_mux-mono: CMP = oneline
9494 fate-wavpack-matroska_mux-mono: REF = 6bd769b3f0e9d7fa6261c3b73a53eb7d
9595
9696 FATE_WAVPACK-$(call DEMMUX, WV, MATROSKA) += fate-wavpack-matroska_mux-61
97−fate-wavpack-matroska_mux-61: CMD = md5 -i $(TARGET_SAMPLES)/wavpack/num_channels/eva_2.22_6.1_16bit-partial.wv -c copy -flags +bitexact -f matroska
97+fate-wavpack-matroska_mux-61: CMD = md5 -i $(TARGET_SAMPLES)/wavpack/num_channels/eva_2.22_6.1_16bit-partial.wv -c copy -fflags +bitexact -f matroska
9898 fate-wavpack-matroska_mux-61: CMP = oneline
9999 fate-wavpack-matroska_mux-61: REF = 2d2f1e7f81a8b1983fcffc7f24de8a11
100100
tests/regression-funcs.sh+1−1
@@ -41,7 +41,7 @@ echov(){ · 40 unmodified lines
4141 . $(dirname $0)/md5.sh
4242
4343 AVCONV_OPTS="-nostats -y -cpuflags $cpuflags"
44−COMMON_OPTS="-flags +bitexact -idct simple -sws_flags +accurate_rnd+bitexact"
44+COMMON_OPTS="-flags +bitexact -idct simple -sws_flags +accurate_rnd+bitexact -fflags +bitexact"
4545 DEC_OPTS="$COMMON_OPTS -threads $threads"
4646 ENC_OPTS="$COMMON_OPTS -threads 1 -dct fastint"
4747

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t