From 1be8c90847300ac7889833612c99d57c58ff64b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Tue, 3 Jul 2012 14:18:58 +0300 Subject: [PATCH 01/29] ismindex: Properly report errors reading the MFRA atom MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Martin Storsjö --- tools/ismindex.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/tools/ismindex.c b/tools/ismindex.c index 5980869c24..1614cca8e9 100644 --- a/tools/ismindex.c +++ b/tools/ismindex.c @@ -209,10 +209,14 @@ static int read_mfra(struct VideoFiles *files, int start_index, avio_seek(f, avio_size(f) - 4, SEEK_SET); mfra_size = avio_rb32(f); avio_seek(f, -mfra_size, SEEK_CUR); - if (avio_rb32(f) != mfra_size) + if (avio_rb32(f) != mfra_size) { + err = AVERROR_INVALIDDATA; goto fail; - if (avio_rb32(f) != MKBETAG('m', 'f', 'r', 'a')) + } + if (avio_rb32(f) != MKBETAG('m', 'f', 'r', 'a')) { + err = AVERROR_INVALIDDATA; goto fail; + } while (!read_tfra(files, start_index, f)) { /* Empty */ } @@ -223,6 +227,8 @@ static int read_mfra(struct VideoFiles *files, int start_index, fail: if (f) avio_close(f); + if (err) + fprintf(stderr, "Unable to read the MFRA atom in %s\n", file); return err; } @@ -355,7 +361,7 @@ static int handle_file(struct VideoFiles *files, const char *file, int split) avformat_close_input(&ctx); - read_mfra(files, orig_files, file, split); + err = read_mfra(files, orig_files, file, split); fail: if (ctx) @@ -509,7 +515,8 @@ int main(int argc, char **argv) } else if (argv[i][0] == '-') { return usage(argv[0], 1); } else { - handle_file(&vf, argv[i], split); + if (handle_file(&vf, argv[i], split)) + return 1; } } if (!vf.nb_files || (!basename && !split)) From 30327865f388260e49d40affd1b9c9fc2e20ebfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Tue, 3 Jul 2012 14:58:52 +0300 Subject: [PATCH 02/29] ismindex: Verify that all bitrate variants match MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In Smooth Streaming, the fragments are addressed by time, and the manifest only stores one list of time offests for all streams, so all streams need to have identical fragment offsets. Warn if this isn't the case, so that the user can fix the files instead of getting failures at runtime when the fragments can't be found. Signed-off-by: Martin Storsjö --- tools/ismindex.c | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/tools/ismindex.c b/tools/ismindex.c index 1614cca8e9..54c49dc2f5 100644 --- a/tools/ismindex.c +++ b/tools/ismindex.c @@ -426,6 +426,7 @@ static void output_client_manifest(struct VideoFiles *files, "Duration=\"%"PRId64 "\">\n", files->duration * 10); if (files->video_file >= 0) { struct VideoFile *vf = files->files[files->video_file]; + struct VideoFile *first_vf = vf; int index = 0; fprintf(out, "\tcodec_private[j]); fprintf(out, "\" />\n"); index++; + if (vf->chunks != first_vf->chunks) + fprintf(stderr, "Mismatched number of video chunks in %s and %s\n", + vf->name, first_vf->name); } - vf = files->files[files->video_file]; - for (i = 0; i < vf->chunks; i++) + vf = first_vf; + for (i = 0; i < vf->chunks; i++) { + for (j = files->video_file + 1; j < files->nb_files; j++) { + if (files->files[j]->is_video && + vf->offsets[i].duration != files->files[j]->offsets[i].duration) + fprintf(stderr, "Mismatched duration of video chunk %d in %s and %s\n", + i, vf->name, files->files[j]->name); + } fprintf(out, "\t\t\n", i, vf->offsets[i].duration); + } fprintf(out, "\t\n"); } if (files->audio_file >= 0) { struct VideoFile *vf = files->files[files->audio_file]; + struct VideoFile *first_vf = vf; int index = 0; fprintf(out, "\tcodec_private[j]); fprintf(out, "\" />\n"); index++; + if (vf->chunks != first_vf->chunks) + fprintf(stderr, "Mismatched number of audio chunks in %s and %s\n", + vf->name, first_vf->name); } - vf = files->files[files->audio_file]; - for (i = 0; i < vf->chunks; i++) + vf = first_vf; + for (i = 0; i < vf->chunks; i++) { + for (j = files->audio_file + 1; j < files->nb_files; j++) { + if (files->files[j]->is_audio && + vf->offsets[i].duration != files->files[j]->offsets[i].duration) + fprintf(stderr, "Mismatched duration of audio chunk %d in %s and %s\n", + i, vf->name, files->files[j]->name); + } fprintf(out, "\t\t\n", i, vf->offsets[i].duration); + } fprintf(out, "\t\n"); } fprintf(out, "\n"); From 360aa2465a7cba8b66f96b27365011958787c72b Mon Sep 17 00:00:00 2001 From: Mans Rullgard Date: Mon, 2 Jul 2012 14:52:05 +0100 Subject: [PATCH 03/29] flacenc: add option for forcing stereo decorrelation mode This is mainly useful for testing. Signed-off-by: Mans Rullgard --- libavcodec/flacenc.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/libavcodec/flacenc.c b/libavcodec/flacenc.c index fc1f00aad2..7a532495b9 100644 --- a/libavcodec/flacenc.c +++ b/libavcodec/flacenc.c @@ -53,6 +53,7 @@ typedef struct CompressionOptions { int prediction_order_method; int min_partition_order; int max_partition_order; + int ch_mode; } CompressionOptions; typedef struct RiceContext { @@ -1031,7 +1032,10 @@ static void channel_decorrelation(FlacEncodeContext *s) return; } - frame->ch_mode = estimate_stereo_mode(left, right, n); + if (s->options.ch_mode < 0) + frame->ch_mode = estimate_stereo_mode(left, right, n); + else + frame->ch_mode = s->options.ch_mode; /* perform decorrelation and adjust bits-per-sample */ if (frame->ch_mode == FLAC_CHMODE_INDEPENDENT) @@ -1288,6 +1292,12 @@ static const AVOption options[] = { { "8level", NULL, 0, AV_OPT_TYPE_CONST, {.dbl = ORDER_METHOD_8LEVEL }, INT_MIN, INT_MAX, FLAGS, "predm" }, { "search", NULL, 0, AV_OPT_TYPE_CONST, {.dbl = ORDER_METHOD_SEARCH }, INT_MIN, INT_MAX, FLAGS, "predm" }, { "log", NULL, 0, AV_OPT_TYPE_CONST, {.dbl = ORDER_METHOD_LOG }, INT_MIN, INT_MAX, FLAGS, "predm" }, +{ "ch_mode", "Stereo decorrelation mode", offsetof(FlacEncodeContext, options.ch_mode), AV_OPT_TYPE_INT, { .dbl = -1 }, -1, FLAC_CHMODE_MID_SIDE, FLAGS, "ch_mode" }, +{ "auto", NULL, 0, AV_OPT_TYPE_CONST, { .dbl = -1 }, INT_MIN, INT_MAX, FLAGS, "ch_mode" }, +{ "indep", NULL, 0, AV_OPT_TYPE_CONST, { .dbl = FLAC_CHMODE_INDEPENDENT }, INT_MIN, INT_MAX, FLAGS, "ch_mode" }, +{ "left_side", NULL, 0, AV_OPT_TYPE_CONST, { .dbl = FLAC_CHMODE_LEFT_SIDE }, INT_MIN, INT_MAX, FLAGS, "ch_mode" }, +{ "right_side", NULL, 0, AV_OPT_TYPE_CONST, { .dbl = FLAC_CHMODE_RIGHT_SIDE }, INT_MIN, INT_MAX, FLAGS, "ch_mode" }, +{ "mid_side", NULL, 0, AV_OPT_TYPE_CONST, { .dbl = FLAC_CHMODE_MID_SIDE }, INT_MIN, INT_MAX, FLAGS, "ch_mode" }, { NULL }, }; From 983fa8bc46a7365b0fdb71c85535da433b262776 Mon Sep 17 00:00:00 2001 From: Mans Rullgard Date: Mon, 2 Jul 2012 16:07:42 +0100 Subject: [PATCH 04/29] fate: add flac encode/decode tests with various options Signed-off-by: Mans Rullgard --- tests/Makefile | 1 + tests/fate/flac.mak | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 tests/fate/flac.mak diff --git a/tests/Makefile b/tests/Makefile index 429762be7c..12928c7926 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -41,6 +41,7 @@ include $(SRC_PATH)/tests/fate/demux.mak include $(SRC_PATH)/tests/fate/dfa.mak include $(SRC_PATH)/tests/fate/dpcm.mak include $(SRC_PATH)/tests/fate/ea.mak +include $(SRC_PATH)/tests/fate/flac.mak include $(SRC_PATH)/tests/fate/fft.mak include $(SRC_PATH)/tests/fate/h264.mak include $(SRC_PATH)/tests/fate/image.mak diff --git a/tests/fate/flac.mak b/tests/fate/flac.mak new file mode 100644 index 0000000000..c5340590d1 --- /dev/null +++ b/tests/fate/flac.mak @@ -0,0 +1,19 @@ +FATE_FLAC += fate-flac-chmode-indep \ + fate-flac-chmode-left_side \ + fate-flac-chmode-mid_side \ + fate-flac-chmode-right_side \ + fate-flac-fixed \ + fate-flac-lpc-cholesky \ + fate-flac-lpc-levinson \ + +fate-flac-chmode-%: OPTS = -ch_mode $(@:fate-flac-chmode-%=%) +fate-flac-fixed: OPTS = -lpc_type fixed +fate-flac-lpc-%: OPTS = -lpc_type $(@:fate-flac-lpc-%=%) + +fate-flac-%: REF = $(SAMPLES)/audio-reference/luckynight_2ch_44kHz_s16.wav +fate-flac-%: CMD = enc_dec_pcm flac wav s16le $(REF) -c flac $(OPTS) +fate-flac-%: CMP = oneoff +fate-flac-%: FUZZ = 0 + +FATE_AVCONV += $(FATE_FLAC) +fate-flac: $(FATE_FLAC) From 0da301e105daf55a0b96a44625270ec1c514d8f2 Mon Sep 17 00:00:00 2001 From: Mans Rullgard Date: Mon, 2 Jul 2012 01:43:12 +0100 Subject: [PATCH 05/29] flacdec: remove curr_bps from FLACContext This value does not need to be persistent across calls. --- libavcodec/flacdec.c | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/libavcodec/flacdec.c b/libavcodec/flacdec.c index 6a06d1922d..da2202af2b 100644 --- a/libavcodec/flacdec.c +++ b/libavcodec/flacdec.c @@ -54,7 +54,6 @@ typedef struct FLACContext { GetBitContext gb; ///< GetBitContext initialized to start at the current frame int blocksize; ///< number of samples in the current frame - int curr_bps; ///< bps for current subframe, adjusted for channel correlation and wasted bits int sample_shift; ///< shift required to make output samples 16-bit or 32-bit int is32; ///< flag to indicate if output should be 32-bit instead of 16-bit int ch_mode; ///< channel decorrelation type in the current frame @@ -295,7 +294,8 @@ static int decode_residuals(FLACContext *s, int channel, int pred_order) return 0; } -static int decode_subframe_fixed(FLACContext *s, int channel, int pred_order) +static int decode_subframe_fixed(FLACContext *s, int channel, int pred_order, + int bps) { const int blocksize = s->blocksize; int32_t *decoded = s->decoded[channel]; @@ -303,7 +303,7 @@ static int decode_subframe_fixed(FLACContext *s, int channel, int pred_order) /* warm up samples */ for (i = 0; i < pred_order; i++) { - decoded[i] = get_sbits_long(&s->gb, s->curr_bps); + decoded[i] = get_sbits_long(&s->gb, bps); } if (decode_residuals(s, channel, pred_order) < 0) @@ -345,7 +345,8 @@ static int decode_subframe_fixed(FLACContext *s, int channel, int pred_order) return 0; } -static int decode_subframe_lpc(FLACContext *s, int channel, int pred_order) +static int decode_subframe_lpc(FLACContext *s, int channel, int pred_order, + int bps) { int i, j; int coeff_prec, qlevel; @@ -354,7 +355,7 @@ static int decode_subframe_lpc(FLACContext *s, int channel, int pred_order) /* warm up samples */ for (i = 0; i < pred_order; i++) { - decoded[i] = get_sbits_long(&s->gb, s->curr_bps); + decoded[i] = get_sbits_long(&s->gb, bps); } coeff_prec = get_bits(&s->gb, 4) + 1; @@ -415,15 +416,15 @@ static int decode_subframe_lpc(FLACContext *s, int channel, int pred_order) static inline int decode_subframe(FLACContext *s, int channel) { int type, wasted = 0; + int bps = s->bps; int i, tmp; - s->curr_bps = s->bps; if (channel == 0) { if (s->ch_mode == FLAC_CHMODE_RIGHT_SIDE) - s->curr_bps++; + bps++; } else { if (s->ch_mode == FLAC_CHMODE_LEFT_SIDE || s->ch_mode == FLAC_CHMODE_MID_SIDE) - s->curr_bps++; + bps++; } if (get_bits1(&s->gb)) { @@ -436,35 +437,35 @@ static inline int decode_subframe(FLACContext *s, int channel) int left = get_bits_left(&s->gb); wasted = 1; if ( left < 0 || - (left < s->curr_bps && !show_bits_long(&s->gb, left)) || - !show_bits_long(&s->gb, s->curr_bps)) { + (left < bps && !show_bits_long(&s->gb, left)) || + !show_bits_long(&s->gb, bps)) { av_log(s->avctx, AV_LOG_ERROR, "Invalid number of wasted bits > available bits (%d) - left=%d\n", - s->curr_bps, left); + bps, left); return AVERROR_INVALIDDATA; } while (!get_bits1(&s->gb)) wasted++; - s->curr_bps -= wasted; + bps -= wasted; } - if (s->curr_bps > 32) { + if (bps > 32) { av_log_missing_feature(s->avctx, "decorrelated bit depth > 32", 0); return -1; } //FIXME use av_log2 for types if (type == 0) { - tmp = get_sbits_long(&s->gb, s->curr_bps); + tmp = get_sbits_long(&s->gb, bps); for (i = 0; i < s->blocksize; i++) s->decoded[channel][i] = tmp; } else if (type == 1) { for (i = 0; i < s->blocksize; i++) - s->decoded[channel][i] = get_sbits_long(&s->gb, s->curr_bps); + s->decoded[channel][i] = get_sbits_long(&s->gb, bps); } else if ((type >= 8) && (type <= 12)) { - if (decode_subframe_fixed(s, channel, type & ~0x8) < 0) + if (decode_subframe_fixed(s, channel, type & ~0x8, bps) < 0) return -1; } else if (type >= 32) { - if (decode_subframe_lpc(s, channel, (type & ~0x20)+1) < 0) + if (decode_subframe_lpc(s, channel, (type & ~0x20)+1, bps) < 0) return -1; } else { av_log(s->avctx, AV_LOG_ERROR, "invalid coding type\n"); From 93e7ef9a2472d64d550ba1cf0e7a6f206fbc8dfd Mon Sep 17 00:00:00 2001 From: Mans Rullgard Date: Mon, 2 Jul 2012 23:16:30 +0100 Subject: [PATCH 06/29] flacdec: allocate sample buffers with av_malloc The buffers are only allocated once, although it can happen from any of a few different places, so there is no need to use realloc. Using av_malloc() ensures they are aligned suitably for SIMD optimisations. Signed-off-by: Mans Rullgard --- libavcodec/flacdec.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libavcodec/flacdec.c b/libavcodec/flacdec.c index da2202af2b..4b62ea8518 100644 --- a/libavcodec/flacdec.c +++ b/libavcodec/flacdec.c @@ -149,8 +149,7 @@ static void allocate_buffers(FLACContext *s) assert(s->max_blocksize); for (i = 0; i < s->channels; i++) { - s->decoded[i] = av_realloc(s->decoded[i], - sizeof(int32_t)*s->max_blocksize); + s->decoded[i] = av_malloc(sizeof(int32_t)*s->max_blocksize); } } From d155b60fc8ec8b1e7fa9cf3b0fa9eb826efefab7 Mon Sep 17 00:00:00 2001 From: Mans Rullgard Date: Sun, 17 Jun 2012 11:45:10 +0100 Subject: [PATCH 07/29] flac: make FLAC_CHMODE_* constants consecutive --- libavcodec/flac.c | 3 ++- libavcodec/flac.h | 8 ++++---- libavcodec/flacenc.c | 13 +++---------- 3 files changed, 9 insertions(+), 15 deletions(-) diff --git a/libavcodec/flac.c b/libavcodec/flac.c index e6a427af11..ac36376cdc 100644 --- a/libavcodec/flac.c +++ b/libavcodec/flac.c @@ -55,8 +55,9 @@ int ff_flac_decode_frame_header(AVCodecContext *avctx, GetBitContext *gb, if (fi->ch_mode < FLAC_MAX_CHANNELS) { fi->channels = fi->ch_mode + 1; fi->ch_mode = FLAC_CHMODE_INDEPENDENT; - } else if (fi->ch_mode <= FLAC_CHMODE_MID_SIDE) { + } else if (fi->ch_mode < FLAC_MAX_CHANNELS + FLAC_CHMODE_MID_SIDE) { fi->channels = 2; + fi->ch_mode -= FLAC_MAX_CHANNELS - 1; } else { av_log(avctx, AV_LOG_ERROR + log_level_offset, "invalid channel mode: %d\n", fi->ch_mode); diff --git a/libavcodec/flac.h b/libavcodec/flac.h index b826fd43bd..55bacea9ea 100644 --- a/libavcodec/flac.h +++ b/libavcodec/flac.h @@ -37,10 +37,10 @@ #define FLAC_MIN_FRAME_SIZE 11 enum { - FLAC_CHMODE_INDEPENDENT = 0, - FLAC_CHMODE_LEFT_SIDE = 8, - FLAC_CHMODE_RIGHT_SIDE = 9, - FLAC_CHMODE_MID_SIDE = 10, + FLAC_CHMODE_INDEPENDENT = 0, + FLAC_CHMODE_LEFT_SIDE = 1, + FLAC_CHMODE_RIGHT_SIDE = 2, + FLAC_CHMODE_MID_SIDE = 3, }; enum { diff --git a/libavcodec/flacenc.c b/libavcodec/flacenc.c index 7a532495b9..e2a370507a 100644 --- a/libavcodec/flacenc.c +++ b/libavcodec/flacenc.c @@ -1001,15 +1001,8 @@ static int estimate_stereo_mode(int32_t *left_ch, int32_t *right_ch, int n) for (i = 1; i < 4; i++) if (score[i] < score[best]) best = i; - if (best == 0) { - return FLAC_CHMODE_INDEPENDENT; - } else if (best == 1) { - return FLAC_CHMODE_LEFT_SIDE; - } else if (best == 2) { - return FLAC_CHMODE_RIGHT_SIDE; - } else { - return FLAC_CHMODE_MID_SIDE; - } + + return best; } @@ -1081,7 +1074,7 @@ static void write_frame_header(FlacEncodeContext *s) if (frame->ch_mode == FLAC_CHMODE_INDEPENDENT) put_bits(&s->pb, 4, s->channels-1); else - put_bits(&s->pb, 4, frame->ch_mode); + put_bits(&s->pb, 4, frame->ch_mode + FLAC_MAX_CHANNELS - 1); put_bits(&s->pb, 3, 4); /* bits-per-sample code */ put_bits(&s->pb, 1, 0); From 87466f81240afc0dafd94dceced02429343436e6 Mon Sep 17 00:00:00 2001 From: Mans Rullgard Date: Tue, 3 Jul 2012 00:28:32 +0100 Subject: [PATCH 08/29] flacdec: factor out code setting avctx->sample_fmt --- libavcodec/flacdec.c | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/libavcodec/flacdec.c b/libavcodec/flacdec.c index 4b62ea8518..ca6b4f2dec 100644 --- a/libavcodec/flacdec.c +++ b/libavcodec/flacdec.c @@ -100,6 +100,19 @@ int avpriv_flac_is_extradata_valid(AVCodecContext *avctx, return 1; } +static void flac_set_bps(FLACContext *s) +{ + if (s->bps > 16) { + s->avctx->sample_fmt = AV_SAMPLE_FMT_S32; + s->sample_shift = 32 - s->bps; + s->is32 = 1; + } else { + s->avctx->sample_fmt = AV_SAMPLE_FMT_S16; + s->sample_shift = 16 - s->bps; + s->is32 = 0; + } +} + static av_cold int flac_decode_init(AVCodecContext *avctx) { enum FLACExtradataFormat format; @@ -117,11 +130,8 @@ static av_cold int flac_decode_init(AVCodecContext *avctx) /* initialize based on the demuxer-supplied streamdata header */ avpriv_flac_parse_streaminfo(avctx, (FLACStreaminfo *)s, streaminfo); - if (s->bps > 16) - avctx->sample_fmt = AV_SAMPLE_FMT_S32; - else - avctx->sample_fmt = AV_SAMPLE_FMT_S16; allocate_buffers(s); + flac_set_bps(s); s->got_streaminfo = 1; avcodec_get_frame_defaults(&s->frame); @@ -512,15 +522,7 @@ static int decode_frame(FLACContext *s) } s->bps = s->avctx->bits_per_raw_sample = fi.bps; - if (s->bps > 16) { - s->avctx->sample_fmt = AV_SAMPLE_FMT_S32; - s->sample_shift = 32 - s->bps; - s->is32 = 1; - } else { - s->avctx->sample_fmt = AV_SAMPLE_FMT_S16; - s->sample_shift = 16 - s->bps; - s->is32 = 0; - } + flac_set_bps(s); if (!s->max_blocksize) s->max_blocksize = FLAC_MAX_BLOCKSIZE; From bf2a7f9161ee76724d120a88a5a6aafad9a1ba1c Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Fri, 22 Jun 2012 07:24:45 +0200 Subject: [PATCH 09/29] FATE: add a test for itunes cover art. --- tests/Makefile | 1 + tests/fate/cover-art.mak | 7 +++++++ 2 files changed, 8 insertions(+) create mode 100644 tests/fate/cover-art.mak diff --git a/tests/Makefile b/tests/Makefile index 12928c7926..6fe4ed3923 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -36,6 +36,7 @@ include $(SRC_PATH)/tests/fate/atrac.mak include $(SRC_PATH)/tests/fate/audio.mak include $(SRC_PATH)/tests/fate/bmp.mak include $(SRC_PATH)/tests/fate/cdxl.mak +include $(SRC_PATH)/tests/fate/cover-art.mak include $(SRC_PATH)/tests/fate/dct.mak include $(SRC_PATH)/tests/fate/demux.mak include $(SRC_PATH)/tests/fate/dfa.mak diff --git a/tests/fate/cover-art.mak b/tests/fate/cover-art.mak new file mode 100644 index 0000000000..ae3d1cd3f0 --- /dev/null +++ b/tests/fate/cover-art.mak @@ -0,0 +1,7 @@ +FATE_COVER_ART += fate-cover-art-m4a +fate-cover-art-m4a: CMD = md5 -i $(SAMPLES)/cover_art/Owner-iTunes_9.0.3.15.m4a -an -c:v copy -f rawvideo +fate-cover-art-m4a: REF = 08ba70a3b594ff6345a93965e96a9d3e + +$(FATE_COVER_ART): CMP = oneline +FATE_SAMPLES_AVCONV += $(FATE_COVER_ART) +fate-cover-art: $(FATE_COVER_ART) From 8059d3b7d41101930a4822cd85febdd811edea5b Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Fri, 22 Jun 2012 13:16:18 +0200 Subject: [PATCH 10/29] FATE: add a test for apetag cover art --- tests/fate/cover-art.mak | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tests/fate/cover-art.mak b/tests/fate/cover-art.mak index ae3d1cd3f0..cb06430dd4 100644 --- a/tests/fate/cover-art.mak +++ b/tests/fate/cover-art.mak @@ -1,7 +1,15 @@ +FATE_COVER_ART += fate-cover-art-ape +fate-cover-art-ape: CMD = md5 -i $(SAMPLES)/cover_art/luckynight_cover.ape -an -c:v copy -f rawvideo +fate-cover-art-ape: REF = 45333c983c45af54449dff10af144317 + FATE_COVER_ART += fate-cover-art-m4a fate-cover-art-m4a: CMD = md5 -i $(SAMPLES)/cover_art/Owner-iTunes_9.0.3.15.m4a -an -c:v copy -f rawvideo fate-cover-art-m4a: REF = 08ba70a3b594ff6345a93965e96a9d3e +FATE_COVER_ART += fate-cover-art-wv +fate-cover-art-wv: CMD = md5 -i $(SAMPLES)/cover_art/luckynight_cover.wv -an -c:v copy -f rawvideo +fate-cover-art-wv: REF = 45333c983c45af54449dff10af144317 + $(FATE_COVER_ART): CMP = oneline FATE_SAMPLES_AVCONV += $(FATE_COVER_ART) fate-cover-art: $(FATE_COVER_ART) From 1c840fa227527c47f5e5b5954eab2b72d6b20632 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Fri, 22 Jun 2012 19:02:06 +0200 Subject: [PATCH 11/29] FATE: add a test for WMA cover art. --- tests/fate/cover-art.mak | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/fate/cover-art.mak b/tests/fate/cover-art.mak index cb06430dd4..f35e9bb729 100644 --- a/tests/fate/cover-art.mak +++ b/tests/fate/cover-art.mak @@ -6,6 +6,10 @@ FATE_COVER_ART += fate-cover-art-m4a fate-cover-art-m4a: CMD = md5 -i $(SAMPLES)/cover_art/Owner-iTunes_9.0.3.15.m4a -an -c:v copy -f rawvideo fate-cover-art-m4a: REF = 08ba70a3b594ff6345a93965e96a9d3e +FATE_COVER_ART += fate-cover-art-wma +fate-cover-art-wma: CMD = md5 -i $(SAMPLES)/cover_art/Californication_cover.wma -an -c:v copy -f rawvideo +fate-cover-art-wma: REF = 0808bd0e1b61542a16e1906812dd924b + FATE_COVER_ART += fate-cover-art-wv fate-cover-art-wv: CMD = md5 -i $(SAMPLES)/cover_art/luckynight_cover.wv -an -c:v copy -f rawvideo fate-cover-art-wv: REF = 45333c983c45af54449dff10af144317 From 296d0da8bd3b5bc5220a3b062d387bf9fa4584c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Tue, 3 Jul 2012 22:57:19 +0300 Subject: [PATCH 12/29] avplay: Add an option for not limiting the input buffer size MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For reading from normal files on disk, the queue limits for demuxed data work fine, but for reading data from realtime streams, they mean we're not reading from the input stream at all once the queue limit has been reached. For TCP streams, this means that writing to the socket from the peer side blocks (potentially leading to the peer dropping data), and for UDP streams it means that our kernel might drop data. For some protocols/servers, the server initially sends a large burst with data to fill client side buffers, but once filled, we should keep reading to avoid dropping data. For all realtime streams, it IMO makes sense to just buffer as much as we get (rather in buffers in avplay.c than in OS level buffers). With this option set, the input thread should always be blocking waiting for more input data, never sleeping waiting for the decoder to consume data. Signed-off-by: Martin Storsjö --- avplay.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/avplay.c b/avplay.c index e05016964b..a5d4e63417 100644 --- a/avplay.c +++ b/avplay.c @@ -264,6 +264,7 @@ static int exit_on_keydown; static int exit_on_mousedown; static int loop = 1; static int framedrop = 1; +static int infinite_buffer = 0; static int rdftspeed = 20; #if CONFIG_AVFILTER @@ -2439,10 +2440,11 @@ static int decode_thread(void *arg) } /* if the queue are full, no need to read more */ - if ( is->audioq.size + is->videoq.size + is->subtitleq.size > MAX_QUEUE_SIZE + if (!infinite_buffer && + (is->audioq.size + is->videoq.size + is->subtitleq.size > MAX_QUEUE_SIZE || ( (is->audioq .size > MIN_AUDIOQ_SIZE || is->audio_stream < 0) && (is->videoq .nb_packets > MIN_FRAMES || is->video_stream < 0) - && (is->subtitleq.nb_packets > MIN_FRAMES || is->subtitle_stream < 0))) { + && (is->subtitleq.nb_packets > MIN_FRAMES || is->subtitle_stream < 0)))) { /* wait 10 ms */ SDL_Delay(10); continue; @@ -2907,6 +2909,7 @@ static const OptionDef options[] = { { "exitonmousedown", OPT_BOOL | OPT_EXPERT, { (void*)&exit_on_mousedown }, "exit on mouse down", "" }, { "loop", OPT_INT | HAS_ARG | OPT_EXPERT, { (void*)&loop }, "set number of times the playback shall be looped", "loop count" }, { "framedrop", OPT_BOOL | OPT_EXPERT, { (void*)&framedrop }, "drop frames when cpu is too slow", "" }, + { "infbuf", OPT_BOOL | OPT_EXPERT, { (void*)&infinite_buffer }, "don't limit the input buffer size (useful with realtime streams)", "" }, { "window_title", OPT_STRING | HAS_ARG, { (void*)&window_title }, "set window title", "window title" }, #if CONFIG_AVFILTER { "vf", OPT_STRING | HAS_ARG, { (void*)&vfilters }, "video filters", "filter list" }, From 4a8528349f897fba72e6eb41400aca3ca4605a79 Mon Sep 17 00:00:00 2001 From: Mans Rullgard Date: Sun, 17 Jun 2012 15:10:40 +0100 Subject: [PATCH 13/29] flacdec: split off channel decorrelation as flacdsp Signed-off-by: Mans Rullgard --- libavcodec/Makefile | 2 +- libavcodec/flacdec.c | 51 ++++----------------- libavcodec/flacdsp.c | 49 ++++++++++++++++++++ libavcodec/flacdsp.h | 32 +++++++++++++ libavcodec/flacdsp_template.c | 86 +++++++++++++++++++++++++++++++++++ 5 files changed, 178 insertions(+), 42 deletions(-) create mode 100644 libavcodec/flacdsp.c create mode 100644 libavcodec/flacdsp.h create mode 100644 libavcodec/flacdsp_template.c diff --git a/libavcodec/Makefile b/libavcodec/Makefile index efedee90fc..b23bc29891 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -158,7 +158,7 @@ OBJS-$(CONFIG_FFV1_DECODER) += ffv1.o rangecoder.o OBJS-$(CONFIG_FFV1_ENCODER) += ffv1.o rangecoder.o OBJS-$(CONFIG_FFVHUFF_DECODER) += huffyuv.o OBJS-$(CONFIG_FFVHUFF_ENCODER) += huffyuv.o -OBJS-$(CONFIG_FLAC_DECODER) += flacdec.o flacdata.o flac.o +OBJS-$(CONFIG_FLAC_DECODER) += flacdec.o flacdata.o flac.o flacdsp.o OBJS-$(CONFIG_FLAC_ENCODER) += flacenc.o flacdata.o flac.o OBJS-$(CONFIG_FLASHSV_DECODER) += flashsv.o OBJS-$(CONFIG_FLASHSV_ENCODER) += flashsvenc.o diff --git a/libavcodec/flacdec.c b/libavcodec/flacdec.c index ca6b4f2dec..daa5bd8daf 100644 --- a/libavcodec/flacdec.c +++ b/libavcodec/flacdec.c @@ -42,6 +42,7 @@ #include "golomb.h" #include "flac.h" #include "flacdata.h" +#include "flacdsp.h" #undef NDEBUG #include @@ -55,11 +56,12 @@ typedef struct FLACContext { int blocksize; ///< number of samples in the current frame int sample_shift; ///< shift required to make output samples 16-bit or 32-bit - int is32; ///< flag to indicate if output should be 32-bit instead of 16-bit int ch_mode; ///< channel decorrelation type in the current frame int got_streaminfo; ///< indicates if the STREAMINFO has been read int32_t *decoded[FLAC_MAX_CHANNELS]; ///< decoded samples + + FLACDSPContext dsp; } FLACContext; static const int64_t flac_channel_layouts[6] = { @@ -105,11 +107,9 @@ static void flac_set_bps(FLACContext *s) if (s->bps > 16) { s->avctx->sample_fmt = AV_SAMPLE_FMT_S32; s->sample_shift = 32 - s->bps; - s->is32 = 1; } else { s->avctx->sample_fmt = AV_SAMPLE_FMT_S16; s->sample_shift = 16 - s->bps; - s->is32 = 0; } } @@ -132,6 +132,7 @@ static av_cold int flac_decode_init(AVCodecContext *avctx) avpriv_flac_parse_streaminfo(avctx, (FLACStreaminfo *)s, streaminfo); allocate_buffers(s); flac_set_bps(s); + ff_flacdsp_init(&s->dsp, avctx->sample_fmt); s->got_streaminfo = 1; avcodec_get_frame_defaults(&s->frame); @@ -231,6 +232,8 @@ static int parse_streaminfo(FLACContext *s, const uint8_t *buf, int buf_size) } avpriv_flac_parse_streaminfo(s->avctx, (FLACStreaminfo *)s, &buf[8]); allocate_buffers(s); + flac_set_bps(s); + ff_flacdsp_init(&s->dsp, s->avctx->sample_fmt); s->got_streaminfo = 1; return 0; @@ -548,6 +551,7 @@ static int decode_frame(FLACContext *s) if (!s->got_streaminfo) { allocate_buffers(s); + ff_flacdsp_init(&s->dsp, s->avctx->sample_fmt); s->got_streaminfo = 1; dump_headers(s->avctx, (FLACStreaminfo *)s); } @@ -574,9 +578,7 @@ static int flac_decode_frame(AVCodecContext *avctx, void *data, const uint8_t *buf = avpkt->data; int buf_size = avpkt->size; FLACContext *s = avctx->priv_data; - int i, j = 0, bytes_read = 0; - int16_t *samples_16; - int32_t *samples_32; + int bytes_read = 0; int ret; *got_frame_ptr = 0; @@ -616,42 +618,9 @@ static int flac_decode_frame(AVCodecContext *avctx, void *data, av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); return ret; } - samples_16 = (int16_t *)s->frame.data[0]; - samples_32 = (int32_t *)s->frame.data[0]; -#define DECORRELATE(left, right)\ - assert(s->channels == 2);\ - for (i = 0; i < s->blocksize; i++) {\ - int a= s->decoded[0][i];\ - int b= s->decoded[1][i];\ - if (s->is32) {\ - *samples_32++ = (left) << s->sample_shift;\ - *samples_32++ = (right) << s->sample_shift;\ - } else {\ - *samples_16++ = (left) << s->sample_shift;\ - *samples_16++ = (right) << s->sample_shift;\ - }\ - }\ - break; - - switch (s->ch_mode) { - case FLAC_CHMODE_INDEPENDENT: - for (j = 0; j < s->blocksize; j++) { - for (i = 0; i < s->channels; i++) { - if (s->is32) - *samples_32++ = s->decoded[i][j] << s->sample_shift; - else - *samples_16++ = s->decoded[i][j] << s->sample_shift; - } - } - break; - case FLAC_CHMODE_LEFT_SIDE: - DECORRELATE(a,a-b) - case FLAC_CHMODE_RIGHT_SIDE: - DECORRELATE(a+b,b) - case FLAC_CHMODE_MID_SIDE: - DECORRELATE( (a-=b>>1) + b, a) - } + s->dsp.decorrelate[s->ch_mode](s->frame.data, s->decoded, s->channels, + s->blocksize, s->sample_shift); if (bytes_read > buf_size) { av_log(s->avctx, AV_LOG_ERROR, "overread: %d\n", bytes_read - buf_size); diff --git a/libavcodec/flacdsp.c b/libavcodec/flacdsp.c new file mode 100644 index 0000000000..b7e074644e --- /dev/null +++ b/libavcodec/flacdsp.c @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2012 Mans Rullgard + * + * This file is part of Libav. + * + * Libav is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libav is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Libav; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "libavutil/attributes.h" +#include "libavutil/samplefmt.h" +#include "flacdsp.h" + +#define SAMPLE_SIZE 16 +#include "flacdsp_template.c" + +#undef SAMPLE_SIZE +#define SAMPLE_SIZE 32 +#include "flacdsp_template.c" + +av_cold void ff_flacdsp_init(FLACDSPContext *c, enum AVSampleFormat fmt) +{ + switch (fmt) { + case AV_SAMPLE_FMT_S32: + c->decorrelate[0] = flac_decorrelate_indep_c_32; + c->decorrelate[1] = flac_decorrelate_ls_c_32; + c->decorrelate[2] = flac_decorrelate_rs_c_32; + c->decorrelate[3] = flac_decorrelate_ms_c_32; + break; + + case AV_SAMPLE_FMT_S16: + c->decorrelate[0] = flac_decorrelate_indep_c_16; + c->decorrelate[1] = flac_decorrelate_ls_c_16; + c->decorrelate[2] = flac_decorrelate_rs_c_16; + c->decorrelate[3] = flac_decorrelate_ms_c_16; + break; + } +} diff --git a/libavcodec/flacdsp.h b/libavcodec/flacdsp.h new file mode 100644 index 0000000000..bb289eea13 --- /dev/null +++ b/libavcodec/flacdsp.h @@ -0,0 +1,32 @@ +/* + * This file is part of Libav. + * + * Libav is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libav is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Libav; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_FLACDSP_H +#define AVCODEC_FLACDSP_H + +#include +#include "libavutil/samplefmt.h" + +typedef struct FLACDSPContext { + void (*decorrelate[4])(uint8_t **out, int32_t **in, int channels, + int len, int shift); +} FLACDSPContext; + +void ff_flacdsp_init(FLACDSPContext *c, enum AVSampleFormat fmt); + +#endif /* AVCODEC_FLACDSP_H */ diff --git a/libavcodec/flacdsp_template.c b/libavcodec/flacdsp_template.c new file mode 100644 index 0000000000..34da5a6d25 --- /dev/null +++ b/libavcodec/flacdsp_template.c @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2012 Mans Rullgard + * + * This file is part of Libav. + * + * Libav is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libav is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Libav; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#undef FUNC +#undef sample + +#if SAMPLE_SIZE == 32 +# define FUNC(n) n ## _32 +# define sample int32_t +#else +# define FUNC(n) n ## _16 +# define sample int16_t +#endif + +static void FUNC(flac_decorrelate_indep_c)(uint8_t **out, int32_t **in, + int channels, int len, int shift) +{ + sample *samples = (sample *) out[0]; + int i, j; + + for (j = 0; j < len; j++) + for (i = 0; i < channels; i++) + *samples++ = in[i][j] << shift; +} + +static void FUNC(flac_decorrelate_ls_c)(uint8_t **out, int32_t **in, + int channels, int len, int shift) +{ + sample *samples = (sample *) out[0]; + int i; + + for (i = 0; i < len; i++) { + int a = in[0][i]; + int b = in[1][i]; + *samples++ = a << shift; + *samples++ = (a - b) << shift; + } +} + +static void FUNC(flac_decorrelate_rs_c)(uint8_t **out, int32_t **in, + int channels, int len, int shift) +{ + sample *samples = (sample *) out[0]; + int i; + + for (i = 0; i < len; i++) { + int a = in[0][i]; + int b = in[1][i]; + *samples++ = (a + b) << shift; + *samples++ = b << shift; + } +} + +static void FUNC(flac_decorrelate_ms_c)(uint8_t **out, int32_t **in, + int channels, int len, int shift) +{ + sample *samples = (sample *) out[0]; + int i; + + for (i = 0; i < len; i++) { + int a = in[0][i]; + int b = in[1][i]; + a -= b >> 1; + *samples++ = (a + b) << shift; + *samples++ = a << shift; + } +} From 25accf93ad7b0ad3e2a17718e689c05fbc5b5698 Mon Sep 17 00:00:00 2001 From: Mans Rullgard Date: Mon, 2 Jul 2012 13:51:04 +0100 Subject: [PATCH 14/29] flacdec: move lpc filter to flacdsp Signed-off-by: Mans Rullgard --- libavcodec/flacdec.c | 35 ++-------------------------------- libavcodec/flacdsp.c | 45 ++++++++++++++++++++++++++++++++++++++++++++ libavcodec/flacdsp.h | 2 ++ 3 files changed, 49 insertions(+), 33 deletions(-) diff --git a/libavcodec/flacdec.c b/libavcodec/flacdec.c index daa5bd8daf..7295e2e1ce 100644 --- a/libavcodec/flacdec.c +++ b/libavcodec/flacdec.c @@ -360,7 +360,7 @@ static int decode_subframe_fixed(FLACContext *s, int channel, int pred_order, static int decode_subframe_lpc(FLACContext *s, int channel, int pred_order, int bps) { - int i, j; + int i; int coeff_prec, qlevel; int coeffs[32]; int32_t *decoded = s->decoded[channel]; @@ -389,38 +389,7 @@ static int decode_subframe_lpc(FLACContext *s, int channel, int pred_order, if (decode_residuals(s, channel, pred_order) < 0) return -1; - if (s->bps > 16) { - int64_t sum; - for (i = pred_order; i < s->blocksize; i++) { - sum = 0; - for (j = 0; j < pred_order; j++) - sum += (int64_t)coeffs[j] * decoded[i-j-1]; - decoded[i] += sum >> qlevel; - } - } else { - for (i = pred_order; i < s->blocksize-1; i += 2) { - int c; - int d = decoded[i-pred_order]; - int s0 = 0, s1 = 0; - for (j = pred_order-1; j > 0; j--) { - c = coeffs[j]; - s0 += c*d; - d = decoded[i-j]; - s1 += c*d; - } - c = coeffs[0]; - s0 += c*d; - d = decoded[i] += s0 >> qlevel; - s1 += c*d; - decoded[i+1] += s1 >> qlevel; - } - if (i < s->blocksize) { - int sum = 0; - for (j = 0; j < pred_order; j++) - sum += coeffs[j] * decoded[i-j-1]; - decoded[i] += sum >> qlevel; - } - } + s->dsp.lpc(decoded, coeffs, pred_order, qlevel, s->blocksize); return 0; } diff --git a/libavcodec/flacdsp.c b/libavcodec/flacdsp.c index b7e074644e..fcee8e44c7 100644 --- a/libavcodec/flacdsp.c +++ b/libavcodec/flacdsp.c @@ -29,6 +29,49 @@ #define SAMPLE_SIZE 32 #include "flacdsp_template.c" +static void flac_lpc_16_c(int32_t *decoded, const int coeffs[32], + int pred_order, int qlevel, int len) +{ + int i, j; + + for (i = pred_order; i < len - 1; i += 2) { + int c; + int d = decoded[i-pred_order]; + int s0 = 0, s1 = 0; + for (j = pred_order-1; j > 0; j--) { + c = coeffs[j]; + s0 += c*d; + d = decoded[i-j]; + s1 += c*d; + } + c = coeffs[0]; + s0 += c*d; + d = decoded[i] += s0 >> qlevel; + s1 += c*d; + decoded[i+1] += s1 >> qlevel; + } + if (i < len) { + int sum = 0; + for (j = 0; j < pred_order; j++) + sum += coeffs[j] * decoded[i-j-1]; + decoded[i] += sum >> qlevel; + } +} + +static void flac_lpc_32_c(int32_t *decoded, const int coeffs[32], + int pred_order, int qlevel, int len) +{ + int i, j; + + for (i = pred_order; i < len; i++) { + int64_t sum = 0; + for (j = 0; j < pred_order; j++) + sum += (int64_t)coeffs[j] * decoded[i-j-1]; + decoded[i] += sum >> qlevel; + } + +} + av_cold void ff_flacdsp_init(FLACDSPContext *c, enum AVSampleFormat fmt) { switch (fmt) { @@ -37,6 +80,7 @@ av_cold void ff_flacdsp_init(FLACDSPContext *c, enum AVSampleFormat fmt) c->decorrelate[1] = flac_decorrelate_ls_c_32; c->decorrelate[2] = flac_decorrelate_rs_c_32; c->decorrelate[3] = flac_decorrelate_ms_c_32; + c->lpc = flac_lpc_32_c; break; case AV_SAMPLE_FMT_S16: @@ -44,6 +88,7 @@ av_cold void ff_flacdsp_init(FLACDSPContext *c, enum AVSampleFormat fmt) c->decorrelate[1] = flac_decorrelate_ls_c_16; c->decorrelate[2] = flac_decorrelate_rs_c_16; c->decorrelate[3] = flac_decorrelate_ms_c_16; + c->lpc = flac_lpc_16_c; break; } } diff --git a/libavcodec/flacdsp.h b/libavcodec/flacdsp.h index bb289eea13..fe5ca53177 100644 --- a/libavcodec/flacdsp.h +++ b/libavcodec/flacdsp.h @@ -25,6 +25,8 @@ typedef struct FLACDSPContext { void (*decorrelate[4])(uint8_t **out, int32_t **in, int channels, int len, int shift); + void (*lpc)(int32_t *samples, const int coeffs[32], int order, + int qlevel, int len); } FLACDSPContext; void ff_flacdsp_init(FLACDSPContext *c, enum AVSampleFormat fmt); From 143f1e92034429e0b87a24bca0f98da81f17d38a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Sun, 1 Jul 2012 16:11:23 +0300 Subject: [PATCH 15/29] eval: Add the isinf() function and tests for it MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Martin Storsjö --- doc/eval.texi | 2 ++ libavutil/avutil.h | 2 +- libavutil/eval.c | 9 ++++++++- tests/ref/fate/eval | 12 ++++++++++++ 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/doc/eval.texi b/doc/eval.texi index 7f8f3653b3..e1fd7ee484 100644 --- a/doc/eval.texi +++ b/doc/eval.texi @@ -34,6 +34,8 @@ The following functions are available: @item abs(x) @item squish(x) @item gauss(x) +@item isinf(x) +Return 1.0 if @var{x} is +/-INFINITY, 0.0 otherwise. @item isnan(x) Return 1.0 if @var{x} is NAN, 0.0 otherwise. diff --git a/libavutil/avutil.h b/libavutil/avutil.h index 351e8279ac..69c5727fb2 100644 --- a/libavutil/avutil.h +++ b/libavutil/avutil.h @@ -153,7 +153,7 @@ #define LIBAVUTIL_VERSION_MAJOR 51 #define LIBAVUTIL_VERSION_MINOR 34 -#define LIBAVUTIL_VERSION_MICRO 0 +#define LIBAVUTIL_VERSION_MICRO 1 #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ LIBAVUTIL_VERSION_MINOR, \ diff --git a/libavutil/eval.c b/libavutil/eval.c index 36b5ce5dda..f2d619f5c9 100644 --- a/libavutil/eval.c +++ b/libavutil/eval.c @@ -120,7 +120,7 @@ static int strmatch(const char *s, const char *prefix) struct AVExpr { enum { e_value, e_const, e_func0, e_func1, e_func2, - e_squish, e_gauss, e_ld, e_isnan, + e_squish, e_gauss, e_ld, e_isnan, e_isinf, e_mod, e_max, e_min, e_eq, e_gt, e_gte, e_pow, e_mul, e_div, e_add, e_last, e_st, e_while, e_floor, e_ceil, e_trunc, @@ -148,6 +148,7 @@ static double eval_expr(Parser *p, AVExpr *e) case e_gauss: { double d = eval_expr(p, e->param[0]); return exp(-d*d/2)/sqrt(2*M_PI); } case e_ld: return e->value * p->var[av_clip(eval_expr(p, e->param[0]), 0, VARS-1)]; case e_isnan: return e->value * !!isnan(eval_expr(p, e->param[0])); + case e_isinf: return e->value * !!isinf(eval_expr(p, e->param[0])); case e_floor: return e->value * floor(eval_expr(p, e->param[0])); case e_ceil : return e->value * ceil (eval_expr(p, e->param[0])); case e_trunc: return e->value * trunc(eval_expr(p, e->param[0])); @@ -282,6 +283,7 @@ static int parse_primary(AVExpr **e, Parser *p) else if (strmatch(next, "lt" )) { AVExpr *tmp = d->param[1]; d->param[1] = d->param[0]; d->param[0] = tmp; d->type = e_gte; } else if (strmatch(next, "ld" )) d->type = e_ld; else if (strmatch(next, "isnan" )) d->type = e_isnan; + else if (strmatch(next, "isinf" )) d->type = e_isinf; else if (strmatch(next, "st" )) d->type = e_st; else if (strmatch(next, "while" )) d->type = e_while; else if (strmatch(next, "floor" )) d->type = e_floor; @@ -453,6 +455,7 @@ static int verify_expr(AVExpr *e) case e_ld: case e_gauss: case e_isnan: + case e_isinf: case e_floor: case e_ceil: case e_trunc: @@ -601,6 +604,10 @@ int main(int argc, char **argv) "st(0, 1); while(lte(ld(0),100), st(1, ld(1)+ld(0)); st(0, ld(0)+1))", "isnan(1)", "isnan(NAN)", + "isnan(INF)", + "isinf(1)", + "isinf(NAN)", + "isinf(INF)", "floor(NAN)", "floor(123.123)", "floor(-123.123)", diff --git a/tests/ref/fate/eval b/tests/ref/fate/eval index ef50292024..b6ca0fa383 100644 --- a/tests/ref/fate/eval +++ b/tests/ref/fate/eval @@ -112,6 +112,18 @@ Evaluating 'isnan(1)' Evaluating 'isnan(NAN)' 'isnan(NAN)' -> 1.000000 +Evaluating 'isnan(INF)' +'isnan(INF)' -> 0.000000 + +Evaluating 'isinf(1)' +'isinf(1)' -> 0.000000 + +Evaluating 'isinf(NAN)' +'isinf(NAN)' -> 0.000000 + +Evaluating 'isinf(INF)' +'isinf(INF)' -> 1.000000 + Evaluating 'floor(NAN)' 'floor(NAN)' -> nan From bc3dbcc8e5553d25afbb2e85aeb909a44210af0a Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Tue, 3 Jul 2012 15:45:27 +0200 Subject: [PATCH 16/29] Add Blowfish encryption support in libavutil MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Martin Storsjö --- libavutil/Makefile | 3 + libavutil/avutil.h | 4 +- libavutil/blowfish.c | 566 +++++++++++++++++++++++++++++++++++++++ libavutil/blowfish.h | 76 ++++++ tests/fate/libavutil.mak | 4 + tests/ref/fate/blowfish | 1 + 6 files changed, 652 insertions(+), 2 deletions(-) create mode 100644 libavutil/blowfish.c create mode 100644 libavutil/blowfish.h create mode 100644 tests/ref/fate/blowfish diff --git a/libavutil/Makefile b/libavutil/Makefile index 6fe174bb62..ea8139f522 100644 --- a/libavutil/Makefile +++ b/libavutil/Makefile @@ -9,6 +9,7 @@ HEADERS = adler32.h \ avstring.h \ avutil.h \ base64.h \ + blowfish.h \ bswap.h \ common.h \ cpu.h \ @@ -51,6 +52,7 @@ OBJS = adler32.o \ audioconvert.o \ avstring.o \ base64.o \ + blowfish.o \ cpu.o \ crc.o \ des.o \ @@ -86,6 +88,7 @@ TESTPROGS = adler32 \ aes \ avstring \ base64 \ + blowfish \ cpu \ crc \ des \ diff --git a/libavutil/avutil.h b/libavutil/avutil.h index 69c5727fb2..31811528b6 100644 --- a/libavutil/avutil.h +++ b/libavutil/avutil.h @@ -152,8 +152,8 @@ */ #define LIBAVUTIL_VERSION_MAJOR 51 -#define LIBAVUTIL_VERSION_MINOR 34 -#define LIBAVUTIL_VERSION_MICRO 1 +#define LIBAVUTIL_VERSION_MINOR 35 +#define LIBAVUTIL_VERSION_MICRO 0 #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ LIBAVUTIL_VERSION_MINOR, \ diff --git a/libavutil/blowfish.c b/libavutil/blowfish.c new file mode 100644 index 0000000000..b7f5294677 --- /dev/null +++ b/libavutil/blowfish.c @@ -0,0 +1,566 @@ +/* + * Blowfish algorithm + * Copyright (c) 2012 Samuel Pitoiset + * + * loosely based on Paul Kocher's implementation + * + * This file is part of Libav. + * + * Libav is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libav is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Libav; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "libavutil/intreadwrite.h" + +#include "avutil.h" +#include "common.h" +#include "blowfish.h" + +static const uint32_t orig_p[AV_BF_ROUNDS + 2] = { + 0x243F6A88, 0x85A308D3, 0x13198A2E, 0x03707344, + 0xA4093822, 0x299F31D0, 0x082EFA98, 0xEC4E6C89, + 0x452821E6, 0x38D01377, 0xBE5466CF, 0x34E90C6C, + 0xC0AC29B7, 0xC97C50DD, 0x3F84D5B5, 0xB5470917, + 0x9216D5D9, 0x8979FB1B +}; + +static const uint32_t orig_s[4][256] = { + { 0xD1310BA6, 0x98DFB5AC, 0x2FFD72DB, 0xD01ADFB7, + 0xB8E1AFED, 0x6A267E96, 0xBA7C9045, 0xF12C7F99, + 0x24A19947, 0xB3916CF7, 0x0801F2E2, 0x858EFC16, + 0x636920D8, 0x71574E69, 0xA458FEA3, 0xF4933D7E, + 0x0D95748F, 0x728EB658, 0x718BCD58, 0x82154AEE, + 0x7B54A41D, 0xC25A59B5, 0x9C30D539, 0x2AF26013, + 0xC5D1B023, 0x286085F0, 0xCA417918, 0xB8DB38EF, + 0x8E79DCB0, 0x603A180E, 0x6C9E0E8B, 0xB01E8A3E, + 0xD71577C1, 0xBD314B27, 0x78AF2FDA, 0x55605C60, + 0xE65525F3, 0xAA55AB94, 0x57489862, 0x63E81440, + 0x55CA396A, 0x2AAB10B6, 0xB4CC5C34, 0x1141E8CE, + 0xA15486AF, 0x7C72E993, 0xB3EE1411, 0x636FBC2A, + 0x2BA9C55D, 0x741831F6, 0xCE5C3E16, 0x9B87931E, + 0xAFD6BA33, 0x6C24CF5C, 0x7A325381, 0x28958677, + 0x3B8F4898, 0x6B4BB9AF, 0xC4BFE81B, 0x66282193, + 0x61D809CC, 0xFB21A991, 0x487CAC60, 0x5DEC8032, + 0xEF845D5D, 0xE98575B1, 0xDC262302, 0xEB651B88, + 0x23893E81, 0xD396ACC5, 0x0F6D6FF3, 0x83F44239, + 0x2E0B4482, 0xA4842004, 0x69C8F04A, 0x9E1F9B5E, + 0x21C66842, 0xF6E96C9A, 0x670C9C61, 0xABD388F0, + 0x6A51A0D2, 0xD8542F68, 0x960FA728, 0xAB5133A3, + 0x6EEF0B6C, 0x137A3BE4, 0xBA3BF050, 0x7EFB2A98, + 0xA1F1651D, 0x39AF0176, 0x66CA593E, 0x82430E88, + 0x8CEE8619, 0x456F9FB4, 0x7D84A5C3, 0x3B8B5EBE, + 0xE06F75D8, 0x85C12073, 0x401A449F, 0x56C16AA6, + 0x4ED3AA62, 0x363F7706, 0x1BFEDF72, 0x429B023D, + 0x37D0D724, 0xD00A1248, 0xDB0FEAD3, 0x49F1C09B, + 0x075372C9, 0x80991B7B, 0x25D479D8, 0xF6E8DEF7, + 0xE3FE501A, 0xB6794C3B, 0x976CE0BD, 0x04C006BA, + 0xC1A94FB6, 0x409F60C4, 0x5E5C9EC2, 0x196A2463, + 0x68FB6FAF, 0x3E6C53B5, 0x1339B2EB, 0x3B52EC6F, + 0x6DFC511F, 0x9B30952C, 0xCC814544, 0xAF5EBD09, + 0xBEE3D004, 0xDE334AFD, 0x660F2807, 0x192E4BB3, + 0xC0CBA857, 0x45C8740F, 0xD20B5F39, 0xB9D3FBDB, + 0x5579C0BD, 0x1A60320A, 0xD6A100C6, 0x402C7279, + 0x679F25FE, 0xFB1FA3CC, 0x8EA5E9F8, 0xDB3222F8, + 0x3C7516DF, 0xFD616B15, 0x2F501EC8, 0xAD0552AB, + 0x323DB5FA, 0xFD238760, 0x53317B48, 0x3E00DF82, + 0x9E5C57BB, 0xCA6F8CA0, 0x1A87562E, 0xDF1769DB, + 0xD542A8F6, 0x287EFFC3, 0xAC6732C6, 0x8C4F5573, + 0x695B27B0, 0xBBCA58C8, 0xE1FFA35D, 0xB8F011A0, + 0x10FA3D98, 0xFD2183B8, 0x4AFCB56C, 0x2DD1D35B, + 0x9A53E479, 0xB6F84565, 0xD28E49BC, 0x4BFB9790, + 0xE1DDF2DA, 0xA4CB7E33, 0x62FB1341, 0xCEE4C6E8, + 0xEF20CADA, 0x36774C01, 0xD07E9EFE, 0x2BF11FB4, + 0x95DBDA4D, 0xAE909198, 0xEAAD8E71, 0x6B93D5A0, + 0xD08ED1D0, 0xAFC725E0, 0x8E3C5B2F, 0x8E7594B7, + 0x8FF6E2FB, 0xF2122B64, 0x8888B812, 0x900DF01C, + 0x4FAD5EA0, 0x688FC31C, 0xD1CFF191, 0xB3A8C1AD, + 0x2F2F2218, 0xBE0E1777, 0xEA752DFE, 0x8B021FA1, + 0xE5A0CC0F, 0xB56F74E8, 0x18ACF3D6, 0xCE89E299, + 0xB4A84FE0, 0xFD13E0B7, 0x7CC43B81, 0xD2ADA8D9, + 0x165FA266, 0x80957705, 0x93CC7314, 0x211A1477, + 0xE6AD2065, 0x77B5FA86, 0xC75442F5, 0xFB9D35CF, + 0xEBCDAF0C, 0x7B3E89A0, 0xD6411BD3, 0xAE1E7E49, + 0x00250E2D, 0x2071B35E, 0x226800BB, 0x57B8E0AF, + 0x2464369B, 0xF009B91E, 0x5563911D, 0x59DFA6AA, + 0x78C14389, 0xD95A537F, 0x207D5BA2, 0x02E5B9C5, + 0x83260376, 0x6295CFA9, 0x11C81968, 0x4E734A41, + 0xB3472DCA, 0x7B14A94A, 0x1B510052, 0x9A532915, + 0xD60F573F, 0xBC9BC6E4, 0x2B60A476, 0x81E67400, + 0x08BA6FB5, 0x571BE91F, 0xF296EC6B, 0x2A0DD915, + 0xB6636521, 0xE7B9F9B6, 0xFF34052E, 0xC5855664, + 0x53B02D5D, 0xA99F8FA1, 0x08BA4799, 0x6E85076A }, + { 0x4B7A70E9, 0xB5B32944, 0xDB75092E, 0xC4192623, + 0xAD6EA6B0, 0x49A7DF7D, 0x9CEE60B8, 0x8FEDB266, + 0xECAA8C71, 0x699A17FF, 0x5664526C, 0xC2B19EE1, + 0x193602A5, 0x75094C29, 0xA0591340, 0xE4183A3E, + 0x3F54989A, 0x5B429D65, 0x6B8FE4D6, 0x99F73FD6, + 0xA1D29C07, 0xEFE830F5, 0x4D2D38E6, 0xF0255DC1, + 0x4CDD2086, 0x8470EB26, 0x6382E9C6, 0x021ECC5E, + 0x09686B3F, 0x3EBAEFC9, 0x3C971814, 0x6B6A70A1, + 0x687F3584, 0x52A0E286, 0xB79C5305, 0xAA500737, + 0x3E07841C, 0x7FDEAE5C, 0x8E7D44EC, 0x5716F2B8, + 0xB03ADA37, 0xF0500C0D, 0xF01C1F04, 0x0200B3FF, + 0xAE0CF51A, 0x3CB574B2, 0x25837A58, 0xDC0921BD, + 0xD19113F9, 0x7CA92FF6, 0x94324773, 0x22F54701, + 0x3AE5E581, 0x37C2DADC, 0xC8B57634, 0x9AF3DDA7, + 0xA9446146, 0x0FD0030E, 0xECC8C73E, 0xA4751E41, + 0xE238CD99, 0x3BEA0E2F, 0x3280BBA1, 0x183EB331, + 0x4E548B38, 0x4F6DB908, 0x6F420D03, 0xF60A04BF, + 0x2CB81290, 0x24977C79, 0x5679B072, 0xBCAF89AF, + 0xDE9A771F, 0xD9930810, 0xB38BAE12, 0xDCCF3F2E, + 0x5512721F, 0x2E6B7124, 0x501ADDE6, 0x9F84CD87, + 0x7A584718, 0x7408DA17, 0xBC9F9ABC, 0xE94B7D8C, + 0xEC7AEC3A, 0xDB851DFA, 0x63094366, 0xC464C3D2, + 0xEF1C1847, 0x3215D908, 0xDD433B37, 0x24C2BA16, + 0x12A14D43, 0x2A65C451, 0x50940002, 0x133AE4DD, + 0x71DFF89E, 0x10314E55, 0x81AC77D6, 0x5F11199B, + 0x043556F1, 0xD7A3C76B, 0x3C11183B, 0x5924A509, + 0xF28FE6ED, 0x97F1FBFA, 0x9EBABF2C, 0x1E153C6E, + 0x86E34570, 0xEAE96FB1, 0x860E5E0A, 0x5A3E2AB3, + 0x771FE71C, 0x4E3D06FA, 0x2965DCB9, 0x99E71D0F, + 0x803E89D6, 0x5266C825, 0x2E4CC978, 0x9C10B36A, + 0xC6150EBA, 0x94E2EA78, 0xA5FC3C53, 0x1E0A2DF4, + 0xF2F74EA7, 0x361D2B3D, 0x1939260F, 0x19C27960, + 0x5223A708, 0xF71312B6, 0xEBADFE6E, 0xEAC31F66, + 0xE3BC4595, 0xA67BC883, 0xB17F37D1, 0x018CFF28, + 0xC332DDEF, 0xBE6C5AA5, 0x65582185, 0x68AB9802, + 0xEECEA50F, 0xDB2F953B, 0x2AEF7DAD, 0x5B6E2F84, + 0x1521B628, 0x29076170, 0xECDD4775, 0x619F1510, + 0x13CCA830, 0xEB61BD96, 0x0334FE1E, 0xAA0363CF, + 0xB5735C90, 0x4C70A239, 0xD59E9E0B, 0xCBAADE14, + 0xEECC86BC, 0x60622CA7, 0x9CAB5CAB, 0xB2F3846E, + 0x648B1EAF, 0x19BDF0CA, 0xA02369B9, 0x655ABB50, + 0x40685A32, 0x3C2AB4B3, 0x319EE9D5, 0xC021B8F7, + 0x9B540B19, 0x875FA099, 0x95F7997E, 0x623D7DA8, + 0xF837889A, 0x97E32D77, 0x11ED935F, 0x16681281, + 0x0E358829, 0xC7E61FD6, 0x96DEDFA1, 0x7858BA99, + 0x57F584A5, 0x1B227263, 0x9B83C3FF, 0x1AC24696, + 0xCDB30AEB, 0x532E3054, 0x8FD948E4, 0x6DBC3128, + 0x58EBF2EF, 0x34C6FFEA, 0xFE28ED61, 0xEE7C3C73, + 0x5D4A14D9, 0xE864B7E3, 0x42105D14, 0x203E13E0, + 0x45EEE2B6, 0xA3AAABEA, 0xDB6C4F15, 0xFACB4FD0, + 0xC742F442, 0xEF6ABBB5, 0x654F3B1D, 0x41CD2105, + 0xD81E799E, 0x86854DC7, 0xE44B476A, 0x3D816250, + 0xCF62A1F2, 0x5B8D2646, 0xFC8883A0, 0xC1C7B6A3, + 0x7F1524C3, 0x69CB7492, 0x47848A0B, 0x5692B285, + 0x095BBF00, 0xAD19489D, 0x1462B174, 0x23820E00, + 0x58428D2A, 0x0C55F5EA, 0x1DADF43E, 0x233F7061, + 0x3372F092, 0x8D937E41, 0xD65FECF1, 0x6C223BDB, + 0x7CDE3759, 0xCBEE7460, 0x4085F2A7, 0xCE77326E, + 0xA6078084, 0x19F8509E, 0xE8EFD855, 0x61D99735, + 0xA969A7AA, 0xC50C06C2, 0x5A04ABFC, 0x800BCADC, + 0x9E447A2E, 0xC3453484, 0xFDD56705, 0x0E1E9EC9, + 0xDB73DBD3, 0x105588CD, 0x675FDA79, 0xE3674340, + 0xC5C43465, 0x713E38D8, 0x3D28F89E, 0xF16DFF20, + 0x153E21E7, 0x8FB03D4A, 0xE6E39F2B, 0xDB83ADF7 }, + { 0xE93D5A68, 0x948140F7, 0xF64C261C, 0x94692934, + 0x411520F7, 0x7602D4F7, 0xBCF46B2E, 0xD4A20068, + 0xD4082471, 0x3320F46A, 0x43B7D4B7, 0x500061AF, + 0x1E39F62E, 0x97244546, 0x14214F74, 0xBF8B8840, + 0x4D95FC1D, 0x96B591AF, 0x70F4DDD3, 0x66A02F45, + 0xBFBC09EC, 0x03BD9785, 0x7FAC6DD0, 0x31CB8504, + 0x96EB27B3, 0x55FD3941, 0xDA2547E6, 0xABCA0A9A, + 0x28507825, 0x530429F4, 0x0A2C86DA, 0xE9B66DFB, + 0x68DC1462, 0xD7486900, 0x680EC0A4, 0x27A18DEE, + 0x4F3FFEA2, 0xE887AD8C, 0xB58CE006, 0x7AF4D6B6, + 0xAACE1E7C, 0xD3375FEC, 0xCE78A399, 0x406B2A42, + 0x20FE9E35, 0xD9F385B9, 0xEE39D7AB, 0x3B124E8B, + 0x1DC9FAF7, 0x4B6D1856, 0x26A36631, 0xEAE397B2, + 0x3A6EFA74, 0xDD5B4332, 0x6841E7F7, 0xCA7820FB, + 0xFB0AF54E, 0xD8FEB397, 0x454056AC, 0xBA489527, + 0x55533A3A, 0x20838D87, 0xFE6BA9B7, 0xD096954B, + 0x55A867BC, 0xA1159A58, 0xCCA92963, 0x99E1DB33, + 0xA62A4A56, 0x3F3125F9, 0x5EF47E1C, 0x9029317C, + 0xFDF8E802, 0x04272F70, 0x80BB155C, 0x05282CE3, + 0x95C11548, 0xE4C66D22, 0x48C1133F, 0xC70F86DC, + 0x07F9C9EE, 0x41041F0F, 0x404779A4, 0x5D886E17, + 0x325F51EB, 0xD59BC0D1, 0xF2BCC18F, 0x41113564, + 0x257B7834, 0x602A9C60, 0xDFF8E8A3, 0x1F636C1B, + 0x0E12B4C2, 0x02E1329E, 0xAF664FD1, 0xCAD18115, + 0x6B2395E0, 0x333E92E1, 0x3B240B62, 0xEEBEB922, + 0x85B2A20E, 0xE6BA0D99, 0xDE720C8C, 0x2DA2F728, + 0xD0127845, 0x95B794FD, 0x647D0862, 0xE7CCF5F0, + 0x5449A36F, 0x877D48FA, 0xC39DFD27, 0xF33E8D1E, + 0x0A476341, 0x992EFF74, 0x3A6F6EAB, 0xF4F8FD37, + 0xA812DC60, 0xA1EBDDF8, 0x991BE14C, 0xDB6E6B0D, + 0xC67B5510, 0x6D672C37, 0x2765D43B, 0xDCD0E804, + 0xF1290DC7, 0xCC00FFA3, 0xB5390F92, 0x690FED0B, + 0x667B9FFB, 0xCEDB7D9C, 0xA091CF0B, 0xD9155EA3, + 0xBB132F88, 0x515BAD24, 0x7B9479BF, 0x763BD6EB, + 0x37392EB3, 0xCC115979, 0x8026E297, 0xF42E312D, + 0x6842ADA7, 0xC66A2B3B, 0x12754CCC, 0x782EF11C, + 0x6A124237, 0xB79251E7, 0x06A1BBE6, 0x4BFB6350, + 0x1A6B1018, 0x11CAEDFA, 0x3D25BDD8, 0xE2E1C3C9, + 0x44421659, 0x0A121386, 0xD90CEC6E, 0xD5ABEA2A, + 0x64AF674E, 0xDA86A85F, 0xBEBFE988, 0x64E4C3FE, + 0x9DBC8057, 0xF0F7C086, 0x60787BF8, 0x6003604D, + 0xD1FD8346, 0xF6381FB0, 0x7745AE04, 0xD736FCCC, + 0x83426B33, 0xF01EAB71, 0xB0804187, 0x3C005E5F, + 0x77A057BE, 0xBDE8AE24, 0x55464299, 0xBF582E61, + 0x4E58F48F, 0xF2DDFDA2, 0xF474EF38, 0x8789BDC2, + 0x5366F9C3, 0xC8B38E74, 0xB475F255, 0x46FCD9B9, + 0x7AEB2661, 0x8B1DDF84, 0x846A0E79, 0x915F95E2, + 0x466E598E, 0x20B45770, 0x8CD55591, 0xC902DE4C, + 0xB90BACE1, 0xBB8205D0, 0x11A86248, 0x7574A99E, + 0xB77F19B6, 0xE0A9DC09, 0x662D09A1, 0xC4324633, + 0xE85A1F02, 0x09F0BE8C, 0x4A99A025, 0x1D6EFE10, + 0x1AB93D1D, 0x0BA5A4DF, 0xA186F20F, 0x2868F169, + 0xDCB7DA83, 0x573906FE, 0xA1E2CE9B, 0x4FCD7F52, + 0x50115E01, 0xA70683FA, 0xA002B5C4, 0x0DE6D027, + 0x9AF88C27, 0x773F8641, 0xC3604C06, 0x61A806B5, + 0xF0177A28, 0xC0F586E0, 0x006058AA, 0x30DC7D62, + 0x11E69ED7, 0x2338EA63, 0x53C2DD94, 0xC2C21634, + 0xBBCBEE56, 0x90BCB6DE, 0xEBFC7DA1, 0xCE591D76, + 0x6F05E409, 0x4B7C0188, 0x39720A3D, 0x7C927C24, + 0x86E3725F, 0x724D9DB9, 0x1AC15BB4, 0xD39EB8FC, + 0xED545578, 0x08FCA5B5, 0xD83D7CD3, 0x4DAD0FC4, + 0x1E50EF5E, 0xB161E6F8, 0xA28514D9, 0x6C51133C, + 0x6FD5C7E7, 0x56E14EC4, 0x362ABFCE, 0xDDC6C837, + 0xD79A3234, 0x92638212, 0x670EFA8E, 0x406000E0 }, + { 0x3A39CE37, 0xD3FAF5CF, 0xABC27737, 0x5AC52D1B, + 0x5CB0679E, 0x4FA33742, 0xD3822740, 0x99BC9BBE, + 0xD5118E9D, 0xBF0F7315, 0xD62D1C7E, 0xC700C47B, + 0xB78C1B6B, 0x21A19045, 0xB26EB1BE, 0x6A366EB4, + 0x5748AB2F, 0xBC946E79, 0xC6A376D2, 0x6549C2C8, + 0x530FF8EE, 0x468DDE7D, 0xD5730A1D, 0x4CD04DC6, + 0x2939BBDB, 0xA9BA4650, 0xAC9526E8, 0xBE5EE304, + 0xA1FAD5F0, 0x6A2D519A, 0x63EF8CE2, 0x9A86EE22, + 0xC089C2B8, 0x43242EF6, 0xA51E03AA, 0x9CF2D0A4, + 0x83C061BA, 0x9BE96A4D, 0x8FE51550, 0xBA645BD6, + 0x2826A2F9, 0xA73A3AE1, 0x4BA99586, 0xEF5562E9, + 0xC72FEFD3, 0xF752F7DA, 0x3F046F69, 0x77FA0A59, + 0x80E4A915, 0x87B08601, 0x9B09E6AD, 0x3B3EE593, + 0xE990FD5A, 0x9E34D797, 0x2CF0B7D9, 0x022B8B51, + 0x96D5AC3A, 0x017DA67D, 0xD1CF3ED6, 0x7C7D2D28, + 0x1F9F25CF, 0xADF2B89B, 0x5AD6B472, 0x5A88F54C, + 0xE029AC71, 0xE019A5E6, 0x47B0ACFD, 0xED93FA9B, + 0xE8D3C48D, 0x283B57CC, 0xF8D56629, 0x79132E28, + 0x785F0191, 0xED756055, 0xF7960E44, 0xE3D35E8C, + 0x15056DD4, 0x88F46DBA, 0x03A16125, 0x0564F0BD, + 0xC3EB9E15, 0x3C9057A2, 0x97271AEC, 0xA93A072A, + 0x1B3F6D9B, 0x1E6321F5, 0xF59C66FB, 0x26DCF319, + 0x7533D928, 0xB155FDF5, 0x03563482, 0x8ABA3CBB, + 0x28517711, 0xC20AD9F8, 0xABCC5167, 0xCCAD925F, + 0x4DE81751, 0x3830DC8E, 0x379D5862, 0x9320F991, + 0xEA7A90C2, 0xFB3E7BCE, 0x5121CE64, 0x774FBE32, + 0xA8B6E37E, 0xC3293D46, 0x48DE5369, 0x6413E680, + 0xA2AE0810, 0xDD6DB224, 0x69852DFD, 0x09072166, + 0xB39A460A, 0x6445C0DD, 0x586CDECF, 0x1C20C8AE, + 0x5BBEF7DD, 0x1B588D40, 0xCCD2017F, 0x6BB4E3BB, + 0xDDA26A7E, 0x3A59FF45, 0x3E350A44, 0xBCB4CDD5, + 0x72EACEA8, 0xFA6484BB, 0x8D6612AE, 0xBF3C6F47, + 0xD29BE463, 0x542F5D9E, 0xAEC2771B, 0xF64E6370, + 0x740E0D8D, 0xE75B1357, 0xF8721671, 0xAF537D5D, + 0x4040CB08, 0x4EB4E2CC, 0x34D2466A, 0x0115AF84, + 0xE1B00428, 0x95983A1D, 0x06B89FB4, 0xCE6EA048, + 0x6F3F3B82, 0x3520AB82, 0x011A1D4B, 0x277227F8, + 0x611560B1, 0xE7933FDC, 0xBB3A792B, 0x344525BD, + 0xA08839E1, 0x51CE794B, 0x2F32C9B7, 0xA01FBAC9, + 0xE01CC87E, 0xBCC7D1F6, 0xCF0111C3, 0xA1E8AAC7, + 0x1A908749, 0xD44FBD9A, 0xD0DADECB, 0xD50ADA38, + 0x0339C32A, 0xC6913667, 0x8DF9317C, 0xE0B12B4F, + 0xF79E59B7, 0x43F5BB3A, 0xF2D519FF, 0x27D9459C, + 0xBF97222C, 0x15E6FC2A, 0x0F91FC71, 0x9B941525, + 0xFAE59361, 0xCEB69CEB, 0xC2A86459, 0x12BAA8D1, + 0xB6C1075E, 0xE3056A0C, 0x10D25065, 0xCB03A442, + 0xE0EC6E0E, 0x1698DB3B, 0x4C98A0BE, 0x3278E964, + 0x9F1F9532, 0xE0D392DF, 0xD3A0342B, 0x8971F21E, + 0x1B0A7441, 0x4BA3348C, 0xC5BE7120, 0xC37632D8, + 0xDF359F8D, 0x9B992F2E, 0xE60B6F47, 0x0FE3F11D, + 0xE54CDA54, 0x1EDAD891, 0xCE6279CF, 0xCD3E7E6F, + 0x1618B166, 0xFD2C1D05, 0x848FD2C5, 0xF6FB2299, + 0xF523F357, 0xA6327623, 0x93A83531, 0x56CCCD02, + 0xACF08162, 0x5A75EBB5, 0x6E163697, 0x88D273CC, + 0xDE966292, 0x81B949D0, 0x4C50901B, 0x71C65614, + 0xE6C6C7BD, 0x327A140A, 0x45E1D006, 0xC3F27B9A, + 0xC9AA53FD, 0x62A80F00, 0xBB25BFE2, 0x35BDD2F6, + 0x71126905, 0xB2040222, 0xB6CBCF7C, 0xCD769C2B, + 0x53113EC0, 0x1640E3D3, 0x38ABBD60, 0x2547ADF0, + 0xBA38209C, 0xF746CE76, 0x77AFA1C5, 0x20756060, + 0x85CBFE4E, 0x8AE88DD8, 0x7AAAF9B0, 0x4CF9AA7E, + 0x1948C25C, 0x02FB8A8C, 0x01C36AE4, 0xD6EBE1F9, + 0x90D4F869, 0xA65CDEA0, 0x3F09252D, 0xC208E69F, + 0xB74E6132, 0xCE77E25B, 0x578FDFE3, 0x3AC372E6 } +}; + +static void F(AVBlowfish *ctx, uint32_t *xl, uint32_t *xr, int i) +{ + uint32_t Xl, Xr; + uint32_t y; + + Xl = *xl; + Xr = *xr; + + Xl ^= ctx->p[i]; + y = ctx->s[0][(Xl >> 24) & 0xFF]; + y += ctx->s[1][(Xl >> 16) & 0xFF]; + y ^= ctx->s[2][(Xl >> 8) & 0xFF]; + y += ctx->s[3][ Xl & 0xFF]; + Xr ^= y; + + *xl = Xr; + *xr = Xl; +} + +av_cold void av_blowfish_init(AVBlowfish *ctx, const uint8_t *key, int key_len) +{ + uint32_t data, data_l, data_r; + int i, j, k; + + memcpy(ctx->s, orig_s, sizeof(orig_s)); + + j = 0; + for (i = 0; i < AV_BF_ROUNDS + 2; ++i) { + data = 0; + for (k = 0; k < 4; k++) { + data = (data << 8) | key[j]; + if (++j >= key_len) + j = 0; + } + ctx->p[i] = orig_p[i] ^ data; + } + + data_l = data_r = 0; + + for (i = 0; i < AV_BF_ROUNDS + 2; i += 2) { + av_blowfish_crypt_ecb(ctx, &data_l, &data_r, 0); + ctx->p[i] = data_l; + ctx->p[i + 1] = data_r; + } + + for (i = 0; i < 4; ++i) { + for (j = 0; j < 256; j += 2) { + av_blowfish_crypt_ecb(ctx, &data_l, &data_r, 0); + ctx->s[i][j] = data_l; + ctx->s[i][j + 1] = data_r; + } + } +} + +void av_blowfish_crypt_ecb(AVBlowfish *ctx, uint32_t *xl, uint32_t *xr, + int decrypt) +{ + uint32_t Xl, Xr; + int i; + + Xl = *xl; + Xr = *xr; + + if (decrypt) { + for (i = AV_BF_ROUNDS + 1; i > 1; --i) + F(ctx, &Xl, &Xr, i); + + Xl = Xl ^ ctx->p[1]; + Xr = Xr ^ ctx->p[0]; + } else { + for (i = 0; i < AV_BF_ROUNDS; ++i) + F(ctx, &Xl, &Xr, i); + + Xl = Xl ^ ctx->p[AV_BF_ROUNDS]; + Xr = Xr ^ ctx->p[AV_BF_ROUNDS + 1]; + } + + *xl = Xr; + *xr = Xl; +} + +void av_blowfish_crypt(AVBlowfish *ctx, uint8_t *dst, const uint8_t *src, + int count, uint8_t *iv, int decrypt) +{ + uint32_t v0, v1; + int i; + + while (count > 0) { + if (decrypt) { + v0 = AV_RB32(src); + v1 = AV_RB32(src + 4); + + av_blowfish_crypt_ecb(ctx, &v0, &v1, decrypt); + + AV_WB32(dst, v0); + AV_WB32(dst + 4, v1); + + if (iv) { + for (i = 0; i < 8; i++) + dst[i] = dst[i] ^ iv[i]; + memcpy(iv, src, 8); + } + } else { + if (iv) { + for (i = 0; i < 8; i++) + dst[i] = src[i] ^ iv[i]; + v0 = AV_RB32(dst); + v1 = AV_RB32(dst + 4); + } else { + v0 = AV_RB32(src); + v1 = AV_RB32(src + 4); + } + + av_blowfish_crypt_ecb(ctx, &v0, &v1, decrypt); + + AV_WB32(dst, v0); + AV_WB32(dst + 4, v1); + + if (iv) + memcpy(iv, dst, 8); + } + + src += 8; + dst += 8; + count -= 8; + } +} + +#ifdef TEST +#include +#undef printf + +#define NUM_VARIABLE_KEY_TESTS 34 + +/* plaintext bytes -- left halves */ +static const uint32_t plaintext_l[NUM_VARIABLE_KEY_TESTS] = { + 0x00000000, 0xFFFFFFFF, 0x10000000, 0x11111111, 0x11111111, + 0x01234567, 0x00000000, 0x01234567, 0x01A1D6D0, 0x5CD54CA8, + 0x0248D438, 0x51454B58, 0x42FD4430, 0x059B5E08, 0x0756D8E0, + 0x762514B8, 0x3BDD1190, 0x26955F68, 0x164D5E40, 0x6B056E18, + 0x004BD6EF, 0x480D3900, 0x437540C8, 0x072D43A0, 0x02FE5577, + 0x1D9D5C50, 0x30553228, 0x01234567, 0x01234567, 0x01234567, + 0xFFFFFFFF, 0x00000000, 0x00000000, 0xFFFFFFFF +}; + +/* plaintext bytes -- right halves */ +static const uint32_t plaintext_r[NUM_VARIABLE_KEY_TESTS] = { + 0x00000000, 0xFFFFFFFF, 0x00000001, 0x11111111, 0x11111111, + 0x89ABCDEF, 0x00000000, 0x89ABCDEF, 0x39776742, 0x3DEF57DA, + 0x06F67172, 0x2DDF440A, 0x59577FA2, 0x51CF143A, 0x774761D2, + 0x29BF486A, 0x49372802, 0x35AF609A, 0x4F275232, 0x759F5CCA, + 0x09176062, 0x6EE762F2, 0x698F3CFA, 0x77075292, 0x8117F12A, + 0x18F728C2, 0x6D6F295A, 0x89ABCDEF, 0x89ABCDEF, 0x89ABCDEF, + 0xFFFFFFFF, 0x00000000, 0x00000000, 0xFFFFFFFF +}; + +/* key bytes for variable key tests */ +static const uint8_t variable_key[NUM_VARIABLE_KEY_TESTS][8] = { + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, + { 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11 }, + { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF }, + { 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }, + { 0x7C, 0xA1, 0x10, 0x45, 0x4A, 0x1A, 0x6E, 0x57 }, + { 0x01, 0x31, 0xD9, 0x61, 0x9D, 0xC1, 0x37, 0x6E }, + { 0x07, 0xA1, 0x13, 0x3E, 0x4A, 0x0B, 0x26, 0x86 }, + { 0x38, 0x49, 0x67, 0x4C, 0x26, 0x02, 0x31, 0x9E }, + { 0x04, 0xB9, 0x15, 0xBA, 0x43, 0xFE, 0xB5, 0xB6 }, + { 0x01, 0x13, 0xB9, 0x70, 0xFD, 0x34, 0xF2, 0xCE }, + { 0x01, 0x70, 0xF1, 0x75, 0x46, 0x8F, 0xB5, 0xE6 }, + { 0x43, 0x29, 0x7F, 0xAD, 0x38, 0xE3, 0x73, 0xFE }, + { 0x07, 0xA7, 0x13, 0x70, 0x45, 0xDA, 0x2A, 0x16 }, + { 0x04, 0x68, 0x91, 0x04, 0xC2, 0xFD, 0x3B, 0x2F }, + { 0x37, 0xD0, 0x6B, 0xB5, 0x16, 0xCB, 0x75, 0x46 }, + { 0x1F, 0x08, 0x26, 0x0D, 0x1A, 0xC2, 0x46, 0x5E }, + { 0x58, 0x40, 0x23, 0x64, 0x1A, 0xBA, 0x61, 0x76 }, + { 0x02, 0x58, 0x16, 0x16, 0x46, 0x29, 0xB0, 0x07 }, + { 0x49, 0x79, 0x3E, 0xBC, 0x79, 0xB3, 0x25, 0x8F }, + { 0x4F, 0xB0, 0x5E, 0x15, 0x15, 0xAB, 0x73, 0xA7 }, + { 0x49, 0xE9, 0x5D, 0x6D, 0x4C, 0xA2, 0x29, 0xBF }, + { 0x01, 0x83, 0x10, 0xDC, 0x40, 0x9B, 0x26, 0xD6 }, + { 0x1C, 0x58, 0x7F, 0x1C, 0x13, 0x92, 0x4F, 0xEF }, + { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 }, + { 0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E }, + { 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, + { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF }, + { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 } +}; + +/* ciphertext bytes -- left halves */ +static const uint32_t ciphertext_l[NUM_VARIABLE_KEY_TESTS] = { + 0x4EF99745, 0x51866FD5, 0x7D856F9A, 0x2466DD87, 0x61F9C380, + 0x7D0CC630, 0x4EF99745, 0x0ACEAB0F, 0x59C68245, 0xB1B8CC0B, + 0x1730E577, 0xA25E7856, 0x353882B1, 0x48F4D088, 0x432193B7, + 0x13F04154, 0x2EEDDA93, 0xD887E039, 0x5F99D04F, 0x4A057A3B, + 0x452031C1, 0x7555AE39, 0x53C55F9C, 0x7A8E7BFA, 0xCF9C5D7A, + 0xD1ABB290, 0x55CB3774, 0xFA34EC48, 0xA7907951, 0xC39E072D, + 0x014933E0, 0xF21E9A77, 0x24594688, 0x6B5C5A9C +}; + +/* ciphertext bytes -- right halves */ +static const uint32_t ciphertext_r[NUM_VARIABLE_KEY_TESTS] = { + 0x6198DD78, 0xB85ECB8A, 0x613063F2, 0x8B963C9D, 0x2281B096, + 0xAFDA1EC7, 0x6198DD78, 0xC6A0A28D, 0xEB05282B, 0x250F09A0, + 0x8BEA1DA4, 0xCF2651EB, 0x09CE8F1A, 0x4C379918, 0x8951FC98, + 0xD69D1AE5, 0xFFD39C79, 0x3C2DA6E3, 0x5B163969, 0x24D3977B, + 0xE4FADA8E, 0xF59B87BD, 0xB49FC019, 0x937E89A3, 0x4986ADB5, + 0x658BC778, 0xD13EF201, 0x47B268B2, 0x08EA3CAE, 0x9FAC631D, + 0xCDAFF6E4, 0xB71C49BC, 0x5754369A, 0x5D9E0A5A +}; + +/* plaintext bytes */ +static const uint8_t plaintext[8] = "BLOWFISH"; + +/* ciphertext bytes */ +static const uint8_t ciphertext[8] = { + 0x32, 0x4E, 0xD0, 0xFE, 0xF4, 0x13, 0xA2, 0x03 +}; + +int main(void) +{ + AVBlowfish ctx; + uint32_t tmptext_l[NUM_VARIABLE_KEY_TESTS]; + uint32_t tmptext_r[NUM_VARIABLE_KEY_TESTS]; + uint8_t tmp[8]; + int i; + + av_blowfish_init(&ctx, "abcdefghijklmnopqrstuvwxyz", 26); + + av_blowfish_crypt(&ctx, tmp, plaintext, 1, NULL, 0); + if (memcmp(tmp, ciphertext, 8)) { + printf("Test encryption failed.\n"); + return 1; + } + + av_blowfish_crypt(&ctx, tmp, ciphertext, 1, NULL, 1); + if (memcmp(tmp, plaintext, 8)) { + printf("Test decryption failed.\n"); + return 1; + } + + memcpy(tmptext_l, plaintext_l, sizeof(*plaintext_l) * NUM_VARIABLE_KEY_TESTS); + memcpy(tmptext_r, plaintext_r, sizeof(*plaintext_r) * NUM_VARIABLE_KEY_TESTS); + + for (i = 0; i < NUM_VARIABLE_KEY_TESTS; i++) { + av_blowfish_init(&ctx, variable_key[i], 8); + + av_blowfish_crypt_ecb(&ctx, &tmptext_l[i], &tmptext_r[i], 0); + if (tmptext_l[i] != ciphertext_l[i] || tmptext_r[i] != ciphertext_r[i]) { + printf("Test encryption failed.\n"); + return 1; + } + + av_blowfish_crypt_ecb(&ctx, &tmptext_l[i], &tmptext_r[i], 1); + if (tmptext_l[i] != plaintext_l[i] || tmptext_r[i] != plaintext_r[i]) { + printf("Test decryption failed.\n"); + return 1; + } + } + printf("Test encryption/decryption success.\n"); + + return 0; +} + +#endif diff --git a/libavutil/blowfish.h b/libavutil/blowfish.h new file mode 100644 index 0000000000..8c29536cfe --- /dev/null +++ b/libavutil/blowfish.h @@ -0,0 +1,76 @@ +/* + * Blowfish algorithm + * + * This file is part of Libav. + * + * Libav is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libav is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Libav; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_BLOWFISH_H +#define AVUTIL_BLOWFISH_H + +#include + +/** + * @defgroup lavu_blowfish Blowfish + * @ingroup lavu_crypto + * @{ + */ + +#define AV_BF_ROUNDS 16 + +typedef struct AVBlowfish { + uint32_t p[AV_BF_ROUNDS + 2]; + uint32_t s[4][256]; +} AVBlowfish; + +/** + * Initialize an AVBlowfish context. + * + * @param ctx an AVBlowfish context + * @param key a key + * @param key_len length of the key + */ +void av_blowfish_init(struct AVBlowfish *ctx, const uint8_t *key, int key_len); + +/** + * Encrypt or decrypt a buffer using a previously initialized context. + * + * @param ctx an AVBlowfish context + * @param xl left four bytes halves of input to be encrypted + * @param xr right four bytes halves of input to be encrypted + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_blowfish_crypt_ecb(struct AVBlowfish *ctx, uint32_t *xl, uint32_t *xr, + int decrypt); + +/** + * Encrypt or decrypt a buffer using a previously initialized context. + * + * @param ctx an AVBlowfish context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 8 byte blocks + * @param iv initialization vector for CBC mode, if NULL ECB will be used + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_blowfish_crypt(struct AVBlowfish *ctx, uint8_t *dst, const uint8_t *src, + int count, uint8_t *iv, int decrypt); + +/** + * @} + */ + +#endif /* AVUTIL_BLOWFISH_H */ diff --git a/tests/fate/libavutil.mak b/tests/fate/libavutil.mak index 9993584f32..d84b4131ce 100644 --- a/tests/fate/libavutil.mak +++ b/tests/fate/libavutil.mak @@ -12,6 +12,10 @@ FATE_LIBAVUTIL += fate-base64 fate-base64: libavutil/base64-test$(EXESUF) fate-base64: CMD = run libavutil/base64-test +FATE_LIBAVUTIL += fate-blowfish +fate-blowfish: libavutil/blowfish-test$(EXESUF) +fate-blowfish: CMD = run libavutil/blowfish-test + FATE_LIBAVUTIL += fate-crc fate-crc: libavutil/crc-test$(EXESUF) fate-crc: CMD = run libavutil/crc-test diff --git a/tests/ref/fate/blowfish b/tests/ref/fate/blowfish new file mode 100644 index 0000000000..fed0b4dd3b --- /dev/null +++ b/tests/ref/fate/blowfish @@ -0,0 +1 @@ +Test encryption/decryption success. From 8c14f7a5937f05238e0e16da6ceccad8a86458ad Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Tue, 3 Jul 2012 15:53:16 +0200 Subject: [PATCH 17/29] Add XTEA encryption support in libavutil MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Martin Storsjö --- libavutil/Makefile | 3 + libavutil/avutil.h | 2 +- libavutil/xtea.c | 165 +++++++++++++++++++++++++++++++++++++++ libavutil/xtea.h | 61 +++++++++++++++ tests/fate/libavutil.mak | 4 + tests/ref/fate/xtea | 1 + 6 files changed, 235 insertions(+), 1 deletion(-) create mode 100644 libavutil/xtea.c create mode 100644 libavutil/xtea.h create mode 100644 tests/ref/fate/xtea diff --git a/libavutil/Makefile b/libavutil/Makefile index ea8139f522..4eabcd046a 100644 --- a/libavutil/Makefile +++ b/libavutil/Makefile @@ -38,6 +38,7 @@ HEADERS = adler32.h \ samplefmt.h \ sha.h \ time.h \ + xtea.h \ ARCH_HEADERS = bswap.h \ intmath.h \ @@ -83,6 +84,7 @@ OBJS = adler32.o \ time.o \ tree.o \ utils.o \ + xtea.o \ TESTPROGS = adler32 \ aes \ @@ -101,3 +103,4 @@ TESTPROGS = adler32 \ parseutils \ sha \ tree \ + xtea \ diff --git a/libavutil/avutil.h b/libavutil/avutil.h index 31811528b6..fc1841785e 100644 --- a/libavutil/avutil.h +++ b/libavutil/avutil.h @@ -152,7 +152,7 @@ */ #define LIBAVUTIL_VERSION_MAJOR 51 -#define LIBAVUTIL_VERSION_MINOR 35 +#define LIBAVUTIL_VERSION_MINOR 36 #define LIBAVUTIL_VERSION_MICRO 0 #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ diff --git a/libavutil/xtea.c b/libavutil/xtea.c new file mode 100644 index 0000000000..138657f88b --- /dev/null +++ b/libavutil/xtea.c @@ -0,0 +1,165 @@ +/* + * A 32-bit implementation of the XTEA algorithm + * Copyright (c) 2012 Samuel Pitoiset + * + * loosely based on the implementation of David Wheeler and Roger Needham + * + * This file is part of Libav. + * + * Libav is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libav is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Libav; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "libavutil/intreadwrite.h" + +#include "avutil.h" +#include "common.h" +#include "xtea.h" + +void av_xtea_init(AVXTEA *ctx, const uint8_t key[16]) +{ + int i; + + for (i = 0; i < 4; i++) + ctx->key[i] = AV_RB32(key + (i << 2)); +} + +static void xtea_crypt_ecb(AVXTEA *ctx, uint8_t *dst, const uint8_t *src, + int decrypt) +{ + uint32_t v0, v1; + int i; + + v0 = AV_RB32(src); + v1 = AV_RB32(src + 4); + + if (decrypt) { + uint32_t delta = 0x9E3779B9, sum = delta * 32; + + for (i = 0; i < 32; i++) { + v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + ctx->key[(sum >> 11) & 3]); + sum -= delta; + v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + ctx->key[sum & 3]); + } + } else { + uint32_t sum = 0, delta = 0x9E3779B9; + + for (i = 0; i < 32; i++) { + v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + ctx->key[sum & 3]); + sum += delta; + v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + ctx->key[(sum >> 11) & 3]); + } + } + + AV_WB32(dst, v0); + AV_WB32(dst + 4, v1); +} + +void av_xtea_crypt(AVXTEA *ctx, uint8_t *dst, const uint8_t *src, int count, + uint8_t *iv, int decrypt) +{ + int i; + + while (count > 0) { + if (decrypt) { + xtea_crypt_ecb(ctx, dst, src, decrypt); + + if (iv) { + for (i = 0; i < 8; i++) + dst[i] = dst[i] ^ iv[i]; + memcpy(iv, src, 8); + } + } else { + if (iv) { + for (i = 0; i < 8; i++) + dst[i] = src[i] ^ iv[i]; + xtea_crypt_ecb(ctx, dst, dst, decrypt); + memcpy(iv, dst, 8); + } else { + xtea_crypt_ecb(ctx, dst, src, decrypt); + } + } + + src += 8; + dst += 8; + count -= 8; + } +} + +#ifdef TEST +#include +#undef printf + +#define XTEA_NUM_TESTS 6 + +static const uint8_t xtea_test_key[XTEA_NUM_TESTS][16] = { + { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }, + { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }, + { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } +}; + +static const uint8_t xtea_test_pt[XTEA_NUM_TESTS][8] = { + { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48 }, + { 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41 }, + { 0x5a, 0x5b, 0x6e, 0x27, 0x89, 0x48, 0xd7, 0x7f }, + { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48 }, + { 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41 }, + { 0x70, 0xe1, 0x22, 0x5d, 0x6e, 0x4e, 0x76, 0x55 } +}; + +static const uint8_t xtea_test_ct[XTEA_NUM_TESTS][8] = { + { 0x49, 0x7d, 0xf3, 0xd0, 0x72, 0x61, 0x2c, 0xb5 }, + { 0xe7, 0x8f, 0x2d, 0x13, 0x74, 0x43, 0x41, 0xd8 }, + { 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41 }, + { 0xa0, 0x39, 0x05, 0x89, 0xf8, 0xb8, 0xef, 0xa5 }, + { 0xed, 0x23, 0x37, 0x5a, 0x82, 0x1a, 0x8c, 0x2d }, + { 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41 } +}; + +int main(void) +{ + AVXTEA ctx; + uint8_t buf[8]; + int i; + + for (i = 0; i < XTEA_NUM_TESTS; i++) { + av_xtea_init(&ctx, xtea_test_key[i]); + + av_xtea_crypt(&ctx, buf, xtea_test_pt[i], 1, NULL, 0); + if (memcmp(buf, xtea_test_ct[i], 8)) { + printf("Test encryption failed.\n"); + return 1; + } + + av_xtea_crypt(&ctx, buf, xtea_test_ct[i], 1, NULL, 1); + if (memcmp(buf, xtea_test_pt[i], 8)) { + printf("Test decryption failed.\n"); + return 1; + } + } + printf("Test encryption/decryption success.\n"); + + return 0; +} + +#endif diff --git a/libavutil/xtea.h b/libavutil/xtea.h new file mode 100644 index 0000000000..cf305c6632 --- /dev/null +++ b/libavutil/xtea.h @@ -0,0 +1,61 @@ +/* + * A 32-bit implementation of the XTEA algorithm + * + * This file is part of Libav. + * + * Libav is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libav is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Libav; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVUTIL_XTEA_H +#define AVUTIL_XTEA_H + +#include + +/** + * @defgroup lavu_xtea XTEA + * @ingroup lavu_crypto + * @{ + */ + +typedef struct AVXTEA { + uint32_t key[16]; +} AVXTEA; + +/** + * Initialize an AVXTEA context. + * + * @param x an AVXTEA context + * @param key a key of 16 bytes used for encryption/decryption + */ +void av_xtea_init(struct AVXTEA *ctx, const uint8_t key[16]); + +/** + * Encrypt or decrypt a buffer using a previously initialized context. + * + * @param x an AVXTEA context + * @param dst destination array, can be equal to src + * @param src source array, can be equal to dst + * @param count number of 8 byte blocks + * @param iv initialization vector for CBC mode, if NULL then ECB will be used + * @param decrypt 0 for encryption, 1 for decryption + */ +void av_xtea_crypt(struct AVXTEA *ctx, uint8_t *dst, const uint8_t *src, + int count, uint8_t *iv, int decrypt); + +/** + * @} + */ + +#endif /* AVUTIL_XTEA_H */ diff --git a/tests/fate/libavutil.mak b/tests/fate/libavutil.mak index d84b4131ce..1052b1d239 100644 --- a/tests/fate/libavutil.mak +++ b/tests/fate/libavutil.mak @@ -41,4 +41,8 @@ FATE_LIBAVUTIL += fate-sha fate-sha: libavutil/sha-test$(EXESUF) fate-sha: CMD = run libavutil/sha-test +FATE_LIBAVUTIL += fate-xtea +fate-xtea: libavutil/xtea-test$(EXESUF) +fate-xtea: CMD = run libavutil/xtea-test + fate-libavutil: $(FATE_LIBAVUTIL) diff --git a/tests/ref/fate/xtea b/tests/ref/fate/xtea new file mode 100644 index 0000000000..fed0b4dd3b --- /dev/null +++ b/tests/ref/fate/xtea @@ -0,0 +1 @@ +Test encryption/decryption success. From 89b81a1c8841817fd3610396a33e6a1420a195ec Mon Sep 17 00:00:00 2001 From: "Ronald S. Bultje" Date: Sun, 24 Jun 2012 21:19:24 +0300 Subject: [PATCH 18/29] mpegvideo: remove VLAs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Martin Storsjö --- libavcodec/error_resilience.c | 2 +- libavcodec/mpegvideo.c | 10 ++++++++++ libavcodec/mpegvideo.h | 6 ++++++ libavcodec/ratecontrol.c | 4 ++-- 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/libavcodec/error_resilience.c b/libavcodec/error_resilience.c index fa1e008584..9cebb6d52e 100644 --- a/libavcodec/error_resilience.c +++ b/libavcodec/error_resilience.c @@ -388,7 +388,7 @@ static void v_block_filter(MpegEncContext *s, uint8_t *dst, int w, int h, static void guess_mv(MpegEncContext *s) { - uint8_t fixed[s->mb_stride * s->mb_height]; + uint8_t *fixed = s->er_temp_buffer; #define MV_FROZEN 3 #define MV_CHANGED 2 #define MV_UNCHANGED 1 diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index d1c42331c2..574893ed05 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -798,6 +798,11 @@ av_cold int ff_MPV_common_init(MpegEncContext *s) FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_offset, 2 * 64 * sizeof(uint16_t), fail); } + + FF_ALLOC_OR_GOTO(s->avctx, s->cplx_tab, + mb_array_size * sizeof(float), fail); + FF_ALLOC_OR_GOTO(s->avctx, s->bits_tab, + mb_array_size * sizeof(float), fail); } } @@ -809,6 +814,8 @@ av_cold int ff_MPV_common_init(MpegEncContext *s) } if (s->width && s->height) { + FF_ALLOC_OR_GOTO(s->avctx, s->er_temp_buffer, + mb_array_size * sizeof(uint8_t), fail); FF_ALLOCZ_OR_GOTO(s->avctx, s->error_status_table, mb_array_size * sizeof(uint8_t), fail); @@ -974,6 +981,7 @@ void ff_MPV_common_end(MpegEncContext *s) av_freep(&s->avctx->stats_out); av_freep(&s->ac_stats); av_freep(&s->error_status_table); + av_freep(&s->er_temp_buffer); av_freep(&s->mb_index2xy); av_freep(&s->lambda_table); av_freep(&s->q_intra_matrix); @@ -983,6 +991,8 @@ void ff_MPV_common_end(MpegEncContext *s) av_freep(&s->input_picture); av_freep(&s->reordered_input_picture); av_freep(&s->dct_offset); + av_freep(&s->cplx_tab); + av_freep(&s->bits_tab); if (s->picture && !s->avctx->internal->is_copy) { for (i = 0; i < s->picture_count; i++) { diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h index b73da416ba..f5b20e662e 100644 --- a/libavcodec/mpegvideo.h +++ b/libavcodec/mpegvideo.h @@ -696,6 +696,12 @@ typedef struct MpegEncContext { int mpv_flags; ///< flags set by private options int quantizer_noise_shaping; + + /* error resilience stuff */ + uint8_t *er_temp_buffer; + + /* temp buffers for rate control */ + float *cplx_tab, *bits_tab; } MpegEncContext; #define REBASE_PICTURE(pic, new_ctx, old_ctx) (pic ? \ diff --git a/libavcodec/ratecontrol.c b/libavcodec/ratecontrol.c index 9065f8e416..e2e3a54137 100644 --- a/libavcodec/ratecontrol.c +++ b/libavcodec/ratecontrol.c @@ -529,8 +529,8 @@ static void adaptive_quantization(MpegEncContext *s, double q){ const float border_masking = s->avctx->border_masking; float bits_sum= 0.0; float cplx_sum= 0.0; - float cplx_tab[s->mb_num]; - float bits_tab[s->mb_num]; + float *cplx_tab = s->cplx_tab; + float *bits_tab = s->bits_tab; const int qmin= s->avctx->mb_lmin; const int qmax= s->avctx->mb_lmax; Picture * const pic= &s->current_picture; From 40e61b7b07da8b32f431fcb72f547b934837f389 Mon Sep 17 00:00:00 2001 From: Diego Biurrun Date: Mon, 2 Jul 2012 22:49:42 +0200 Subject: [PATCH 19/29] gitignore: Use full path instead of relative path to specify patterns This avoids confusion from patterns meant to only match at the top level matching files in subdirectories. --- .gitignore | 70 +++++++++++++++++++++++++++--------------------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/.gitignore b/.gitignore index b7f063f99b..6fe94349d0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,3 @@ -.config -.version *.a *.o *.d @@ -14,36 +12,38 @@ *.ver *-example *-test -config.* -doc/*.1 -doc/*.html -doc/*.pod -doxy -avconv -avplay -avprobe -avserver -doc/avoptions_codec.texi -doc/avoptions_format.texi -doc/print_options -libavcodec/*_tablegen -libavcodec/*_tables.c -libavcodec/*_tables.h -libavutil/avconfig.h -tests/audiogen -tests/base64 -tests/data -tests/rotozoom -tests/tiny_psnr -tests/videogen -tests/vsynth1 -tools/aviocat -tools/cws2fws -tools/graph2dot -tools/ismindex -tools/lavfi-showfiltfmts -tools/pktdumper -tools/probetest -tools/qt-faststart -tools/trasher -version.h +/.config +/.version +/avconv +/avplay +/avprobe +/avserver +/config.* +/version.h +/doc/*.1 +/doc/*.html +/doc/*.pod +/doc/avoptions_codec.texi +/doc/avoptions_format.texi +/doc/print_options +/doxy/ +/libavcodec/*_tablegen +/libavcodec/*_tables.c +/libavcodec/*_tables.h +/libavutil/avconfig.h +/tests/audiogen +/tests/base64 +/tests/data/ +/tests/rotozoom +/tests/tiny_psnr +/tests/videogen +/tests/vsynth1/ +/tools/aviocat +/tools/cws2fws +/tools/graph2dot +/tools/ismindex +/tools/lavfi-showfiltfmts +/tools/pktdumper +/tools/probetest +/tools/qt-faststart +/tools/trasher From 86ab7b0f2fc1e32924603731be9fdee0854f9e7e Mon Sep 17 00:00:00 2001 From: Diego Biurrun Date: Sun, 1 Jul 2012 11:51:30 +0200 Subject: [PATCH 20/29] Create version.h headers for libraries that lack them --- configure | 6 ++-- libavdevice/Makefile | 3 +- libavdevice/avdevice.h | 16 ++------- libavdevice/version.h | 42 ++++++++++++++++++++++ libavutil/Makefile | 1 + libavutil/avutil.h | 51 +------------------------- libavutil/version.h | 82 ++++++++++++++++++++++++++++++++++++++++++ libswscale/Makefile | 3 +- libswscale/swscale.h | 26 +------------- libswscale/version.h | 54 ++++++++++++++++++++++++++++ 10 files changed, 190 insertions(+), 94 deletions(-) create mode 100644 libavdevice/version.h create mode 100644 libavutil/version.h create mode 100644 libswscale/version.h diff --git a/configure b/configure index 3a1b4361b8..930fad19bf 100755 --- a/configure +++ b/configure @@ -3378,12 +3378,12 @@ get_version(){ } get_version LIBAVCODEC libavcodec/version.h -get_version LIBAVDEVICE libavdevice/avdevice.h +get_version LIBAVDEVICE libavdevice/version.h get_version LIBAVFILTER libavfilter/version.h get_version LIBAVFORMAT libavformat/version.h get_version LIBAVRESAMPLE libavresample/version.h -get_version LIBAVUTIL libavutil/avutil.h -get_version LIBSWSCALE libswscale/swscale.h +get_version LIBAVUTIL libavutil/version.h +get_version LIBSWSCALE libswscale/version.h cat > $TMPH < Date: Mon, 2 Jul 2012 23:04:09 +0200 Subject: [PATCH 21/29] configure: simplify get_version() All libs have version headers now, which allows hardcoding the path. --- configure | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/configure b/configure index 930fad19bf..9f70a36f74 100755 --- a/configure +++ b/configure @@ -3368,22 +3368,22 @@ SAMPLES:=${samples:-\$(LIBAV_SAMPLES)} EOF get_version(){ - name=$1 - file=$source_path/$2 + lcname=$1 + name=$(toupper $lcname) + file=$source_path/$lcname/version.h eval $(grep "#define ${name}_VERSION_M" "$file" | awk '{ print $2"="$3 }') eval ${name}_VERSION=\$${name}_VERSION_MAJOR.\$${name}_VERSION_MINOR.\$${name}_VERSION_MICRO - lcname=$(tolower $name) eval echo "${lcname}_VERSION=\$${name}_VERSION" >> config.mak eval echo "${lcname}_VERSION_MAJOR=\$${name}_VERSION_MAJOR" >> config.mak } -get_version LIBAVCODEC libavcodec/version.h -get_version LIBAVDEVICE libavdevice/version.h -get_version LIBAVFILTER libavfilter/version.h -get_version LIBAVFORMAT libavformat/version.h -get_version LIBAVRESAMPLE libavresample/version.h -get_version LIBAVUTIL libavutil/version.h -get_version LIBSWSCALE libswscale/version.h +get_version libavcodec +get_version libavdevice +get_version libavfilter +get_version libavformat +get_version libavresample +get_version libavutil +get_version libswscale cat > $TMPH < Date: Tue, 3 Jul 2012 22:42:42 +0200 Subject: [PATCH 22/29] Clarify Doxygen comment for FF_API_* #defines. --- libavcodec/version.h | 6 ++++-- libavdevice/version.h | 6 ++++++ libavfilter/version.h | 6 ++++-- libavformat/version.h | 6 ++++-- libavresample/version.h | 5 +++-- libavutil/version.h | 9 ++++----- libswscale/version.h | 6 ++++-- 7 files changed, 29 insertions(+), 15 deletions(-) diff --git a/libavcodec/version.h b/libavcodec/version.h index 1e189f6390..cb2373848e 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -41,9 +41,11 @@ #define LIBAVCODEC_IDENT "Lavc" AV_STRINGIFY(LIBAVCODEC_VERSION) /** - * These FF_API_* defines are not part of the public API. - * They may change, break or disappear at any time. + * FF_API_* defines may be placed below to indicate public API that will be + * dropped at a future version bump. The defines themselves are not part of + * the public API and may change, break or disappear at any time. */ + #ifndef FF_API_REQUEST_CHANNELS #define FF_API_REQUEST_CHANNELS (LIBAVCODEC_VERSION_MAJOR < 55) #endif diff --git a/libavdevice/version.h b/libavdevice/version.h index 6ed3817cf5..52b47db546 100644 --- a/libavdevice/version.h +++ b/libavdevice/version.h @@ -39,4 +39,10 @@ LIBAVDEVICE_VERSION_MICRO) #define LIBAVDEVICE_BUILD LIBAVDEVICE_VERSION_INT +/** + * FF_API_* defines may be placed below to indicate public API that will be + * dropped at a future version bump. The defines themselves are not part of + * the public API and may change, break or disappear at any time. + */ + #endif /* AVDEVICE_VERSION_H */ diff --git a/libavfilter/version.h b/libavfilter/version.h index 88bdd4a821..c1292bb70d 100644 --- a/libavfilter/version.h +++ b/libavfilter/version.h @@ -41,9 +41,11 @@ #define LIBAVFILTER_BUILD LIBAVFILTER_VERSION_INT /** - * These FF_API_* defines are not part of the public API. - * They may change, break or disappear at any time. + * FF_API_* defines may be placed below to indicate public API that will be + * dropped at a future version bump. The defines themselves are not part of + * the public API and may change, break or disappear at any time. */ + #ifndef FF_API_AVFILTERPAD_PUBLIC #define FF_API_AVFILTERPAD_PUBLIC (LIBAVFILTER_VERSION_MAJOR < 4) #endif diff --git a/libavformat/version.h b/libavformat/version.h index 26bb2c596e..0017698cce 100644 --- a/libavformat/version.h +++ b/libavformat/version.h @@ -44,9 +44,11 @@ #define LIBAVFORMAT_IDENT "Lavf" AV_STRINGIFY(LIBAVFORMAT_VERSION) /** - * These FF_API_* defines are not part of the public API. - * They may change, break or disappear at any time. + * FF_API_* defines may be placed below to indicate public API that will be + * dropped at a future version bump. The defines themselves are not part of + * the public API and may change, break or disappear at any time. */ + #ifndef FF_API_CLOSE_INPUT_FILE #define FF_API_CLOSE_INPUT_FILE (LIBAVFORMAT_VERSION_MAJOR < 55) #endif diff --git a/libavresample/version.h b/libavresample/version.h index 63f07f5e84..c4741e420e 100644 --- a/libavresample/version.h +++ b/libavresample/version.h @@ -34,8 +34,9 @@ #define LIBAVRESAMPLE_IDENT "Lavr" AV_STRINGIFY(LIBAVRESAMPLE_VERSION) /** - * These FF_API_* defines are not part of public API. - * They may change, break or disappear at any time. + * FF_API_* defines may be placed below to indicate public API that will be + * dropped at a future version bump. The defines themselves are not part of + * the public API and may change, break or disappear at any time. */ #endif /* AVRESAMPLE_VERSION_H */ diff --git a/libavutil/version.h b/libavutil/version.h index 426146562e..c42c6b0bc4 100644 --- a/libavutil/version.h +++ b/libavutil/version.h @@ -54,14 +54,13 @@ * @} * * @defgroup depr_guards Deprecation guards - * These FF_API_* defines are not part of the public API. - * They may change, break or disappear at any time. - * - * They are used mostly internally to mark code that will be removed - * on the next major version. + * FF_API_* defines may be placed below to indicate public API that will be + * dropped at a future version bump. The defines themselves are not part of + * the public API and may change, break or disappear at any time. * * @{ */ + #ifndef FF_API_GET_BITS_PER_SAMPLE_FMT #define FF_API_GET_BITS_PER_SAMPLE_FMT (LIBAVUTIL_VERSION_MAJOR < 52) #endif diff --git a/libswscale/version.h b/libswscale/version.h index f1d95bc691..32bb2f5887 100644 --- a/libswscale/version.h +++ b/libswscale/version.h @@ -41,9 +41,11 @@ #define LIBSWSCALE_IDENT "SwS" AV_STRINGIFY(LIBSWSCALE_VERSION) /** - * Those FF_API_* defines are not part of public API. - * They may change, break or disappear at any time. + * FF_API_* defines may be placed below to indicate public API that will be + * dropped at a future version bump. The defines themselves are not part of + * the public API and may change, break or disappear at any time. */ + #ifndef FF_API_SWS_GETCONTEXT #define FF_API_SWS_GETCONTEXT (LIBSWSCALE_VERSION_MAJOR < 3) #endif From 1ce1e6360dc740a0a24f64dfff62811c4834c06d Mon Sep 17 00:00:00 2001 From: "Ronald S. Bultje" Date: Tue, 3 Jul 2012 20:49:49 -0700 Subject: [PATCH 23/29] mov: use forward declaration of a function instead of a table. MSVC gives a compile error on the tentative definition of mov_default_parse_table[]. --- libavformat/mov.c | 148 +++++++++++++++++++++++----------------------- 1 file changed, 74 insertions(+), 74 deletions(-) diff --git a/libavformat/mov.c b/libavformat/mov.c index 6ddecd182d..647fd0eb9e 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -64,7 +64,7 @@ typedef struct MOVParseTableEntry { int (*parse)(MOVContext *ctx, AVIOContext *pb, MOVAtom atom); } MOVParseTableEntry; -static const MOVParseTableEntry mov_default_parse_table[]; +static int mov_read_default(MOVContext *c, AVIOContext *pb, MOVAtom atom); static int mov_metadata_track_or_disc_number(MOVContext *c, AVIOContext *pb, unsigned len, const char *key) @@ -351,79 +351,6 @@ static int mov_read_chpl(MOVContext *c, AVIOContext *pb, MOVAtom atom) return 0; } -static int mov_read_default(MOVContext *c, AVIOContext *pb, MOVAtom atom) -{ - int64_t total_size = 0; - MOVAtom a; - int i; - - if (atom.size < 0) - atom.size = INT64_MAX; - while (total_size + 8 < atom.size && !pb->eof_reached) { - int (*parse)(MOVContext*, AVIOContext*, MOVAtom) = NULL; - a.size = atom.size; - a.type=0; - if (atom.size >= 8) { - a.size = avio_rb32(pb); - a.type = avio_rl32(pb); - } - av_dlog(c->fc, "type: %08x '%.4s' parent:'%.4s' sz: %"PRId64" %"PRId64" %"PRId64"\n", - a.type, (char*)&a.type, (char*)&atom.type, a.size, total_size, atom.size); - total_size += 8; - if (a.size == 1) { /* 64 bit extended size */ - a.size = avio_rb64(pb) - 8; - total_size += 8; - } - if (a.size == 0) { - a.size = atom.size - total_size; - if (a.size <= 8) - break; - } - a.size -= 8; - if (a.size < 0) - break; - a.size = FFMIN(a.size, atom.size - total_size); - - for (i = 0; mov_default_parse_table[i].type; i++) - if (mov_default_parse_table[i].type == a.type) { - parse = mov_default_parse_table[i].parse; - break; - } - - // container is user data - if (!parse && (atom.type == MKTAG('u','d','t','a') || - atom.type == MKTAG('i','l','s','t'))) - parse = mov_read_udta_string; - - if (!parse) { /* skip leaf atoms data */ - avio_skip(pb, a.size); - } else { - int64_t start_pos = avio_tell(pb); - int64_t left; - int err = parse(c, pb, a); - if (err < 0) - return err; - if (c->found_moov && c->found_mdat && - ((!pb->seekable || c->fc->flags & AVFMT_FLAG_IGNIDX) || - start_pos + a.size == avio_size(pb))) { - if (!pb->seekable || c->fc->flags & AVFMT_FLAG_IGNIDX) - c->next_root_atom = start_pos + a.size; - return 0; - } - left = a.size - avio_tell(pb) + start_pos; - if (left > 0) /* skip garbage at atom end */ - avio_skip(pb, left); - } - - total_size += a.size; - } - - if (total_size < atom.size && atom.size < 0x7ffff) - avio_skip(pb, atom.size - total_size); - - return 0; -} - static int mov_read_dref(MOVContext *c, AVIOContext *pb, MOVAtom atom) { AVStream *st; @@ -2563,6 +2490,79 @@ static const MOVParseTableEntry mov_default_parse_table[] = { { 0, NULL } }; +static int mov_read_default(MOVContext *c, AVIOContext *pb, MOVAtom atom) +{ + int64_t total_size = 0; + MOVAtom a; + int i; + + if (atom.size < 0) + atom.size = INT64_MAX; + while (total_size + 8 < atom.size && !pb->eof_reached) { + int (*parse)(MOVContext*, AVIOContext*, MOVAtom) = NULL; + a.size = atom.size; + a.type=0; + if (atom.size >= 8) { + a.size = avio_rb32(pb); + a.type = avio_rl32(pb); + } + av_dlog(c->fc, "type: %08x '%.4s' parent:'%.4s' sz: %"PRId64" %"PRId64" %"PRId64"\n", + a.type, (char*)&a.type, (char*)&atom.type, a.size, total_size, atom.size); + total_size += 8; + if (a.size == 1) { /* 64 bit extended size */ + a.size = avio_rb64(pb) - 8; + total_size += 8; + } + if (a.size == 0) { + a.size = atom.size - total_size; + if (a.size <= 8) + break; + } + a.size -= 8; + if (a.size < 0) + break; + a.size = FFMIN(a.size, atom.size - total_size); + + for (i = 0; mov_default_parse_table[i].type; i++) + if (mov_default_parse_table[i].type == a.type) { + parse = mov_default_parse_table[i].parse; + break; + } + + // container is user data + if (!parse && (atom.type == MKTAG('u','d','t','a') || + atom.type == MKTAG('i','l','s','t'))) + parse = mov_read_udta_string; + + if (!parse) { /* skip leaf atoms data */ + avio_skip(pb, a.size); + } else { + int64_t start_pos = avio_tell(pb); + int64_t left; + int err = parse(c, pb, a); + if (err < 0) + return err; + if (c->found_moov && c->found_mdat && + ((!pb->seekable || c->fc->flags & AVFMT_FLAG_IGNIDX) || + start_pos + a.size == avio_size(pb))) { + if (!pb->seekable || c->fc->flags & AVFMT_FLAG_IGNIDX) + c->next_root_atom = start_pos + a.size; + return 0; + } + left = a.size - avio_tell(pb) + start_pos; + if (left > 0) /* skip garbage at atom end */ + avio_skip(pb, left); + } + + total_size += a.size; + } + + if (total_size < atom.size && atom.size < 0x7ffff) + avio_skip(pb, atom.size - total_size); + + return 0; +} + static int mov_probe(AVProbeData *p) { unsigned int offset; From 723b266d7285776e5134a42503e468447940decb Mon Sep 17 00:00:00 2001 From: "Ronald S. Bultje" Date: Tue, 3 Jul 2012 21:00:05 -0700 Subject: [PATCH 24/29] dsputilenc: group yasm and inline asm function pointer assignment. --- libavcodec/x86/dsputilenc_mmx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavcodec/x86/dsputilenc_mmx.c b/libavcodec/x86/dsputilenc_mmx.c index d8a60e106b..47fa5ca43c 100644 --- a/libavcodec/x86/dsputilenc_mmx.c +++ b/libavcodec/x86/dsputilenc_mmx.c @@ -1146,11 +1146,11 @@ void ff_dsputilenc_init_mmx(DSPContext* c, AVCodecContext *avctx) if (mm_flags & AV_CPU_FLAG_MMX2) { - c->sum_abs_dctelem= sum_abs_dctelem_mmx2; #if HAVE_YASM c->hadamard8_diff[0]= ff_hadamard8_diff16_mmx2; c->hadamard8_diff[1]= ff_hadamard8_diff_mmx2; #endif + c->sum_abs_dctelem= sum_abs_dctelem_mmx2; c->vsad[4]= vsad_intra16_mmx2; if(!(avctx->flags & CODEC_FLAG_BITEXACT)){ From c51838478cab37488883f49ce940c4a0f0b235ba Mon Sep 17 00:00:00 2001 From: "Ronald S. Bultje" Date: Tue, 3 Jul 2012 20:36:44 -0700 Subject: [PATCH 25/29] amr: remove shift out of the AMR_BIT() macro. MSVC doesn't like the offsetof(..) >> 1 construct, it interprets it as a non-literal, thus causing use of this in static tables to fail compilation. --- libavcodec/amr.h | 2 +- libavcodec/amrnbdata.h | 2 +- libavcodec/amrwbdata.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libavcodec/amr.h b/libavcodec/amr.h index ae6e4d1490..9498d57a9b 100644 --- a/libavcodec/amr.h +++ b/libavcodec/amr.h @@ -61,7 +61,7 @@ static inline void ff_amr_bit_reorder(uint16_t *out, int size, field <<= 1; field |= data[bit >> 3] >> (bit & 7) & 1; } - out[field_offset] = field; + out[field_offset >> 1] = field; } } diff --git a/libavcodec/amrnbdata.h b/libavcodec/amrnbdata.h index 26ff7fb40e..c2e2f8a5e5 100644 --- a/libavcodec/amrnbdata.h +++ b/libavcodec/amrnbdata.h @@ -71,7 +71,7 @@ typedef struct { } AMRNBFrame; /** The index of a frame parameter */ -#define AMR_BIT(field) (offsetof(AMRNBFrame, field) >> 1) +#define AMR_BIT(field) (offsetof(AMRNBFrame, field)) /** The index of a subframe-specific parameter */ #define AMR_OF(frame_num, variable) AMR_BIT(subframe[frame_num].variable) diff --git a/libavcodec/amrwbdata.h b/libavcodec/amrwbdata.h index 5421c23afb..83a93e997a 100644 --- a/libavcodec/amrwbdata.h +++ b/libavcodec/amrwbdata.h @@ -82,7 +82,7 @@ typedef struct { } AMRWBFrame; /** The index of a frame parameter */ -#define AMR_BIT(field) (offsetof(AMRWBFrame, field) >> 1) +#define AMR_BIT(field) (offsetof(AMRWBFrame, field)) /** The index of a subframe-specific parameter */ #define AMR_OF(frame_num, variable) AMR_BIT(subframe[frame_num].variable) From 70a1c8000f7cd74e945a250117973b6ea4408d9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Tue, 3 Jul 2012 21:11:36 -0700 Subject: [PATCH 26/29] vp8: loopfilter >=sse2 functions need aligned stack on x86-32. Signed-off-by: Ronald S. Bultje --- libavcodec/x86/vp8dsp-init.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/libavcodec/x86/vp8dsp-init.c b/libavcodec/x86/vp8dsp-init.c index d3f1456b71..a0e8f9be1f 100644 --- a/libavcodec/x86/vp8dsp-init.c +++ b/libavcodec/x86/vp8dsp-init.c @@ -401,11 +401,13 @@ av_cold void ff_vp8dsp_init_x86(VP8DSPContext* c) c->vp8_h_loop_filter_simple = ff_vp8_h_loop_filter_simple_sse2; +#if ARCH_X86_64 || HAVE_ALIGNED_STACK c->vp8_h_loop_filter16y_inner = ff_vp8_h_loop_filter16y_inner_sse2; c->vp8_h_loop_filter8uv_inner = ff_vp8_h_loop_filter8uv_inner_sse2; c->vp8_h_loop_filter16y = ff_vp8_h_loop_filter16y_mbedge_sse2; c->vp8_h_loop_filter8uv = ff_vp8_h_loop_filter8uv_mbedge_sse2; +#endif } if (mm_flags & AV_CPU_FLAG_SSSE3) { @@ -419,6 +421,7 @@ av_cold void ff_vp8dsp_init_x86(VP8DSPContext* c) c->vp8_v_loop_filter_simple = ff_vp8_v_loop_filter_simple_ssse3; c->vp8_h_loop_filter_simple = ff_vp8_h_loop_filter_simple_ssse3; +#if ARCH_X86_64 || HAVE_ALIGNED_STACK c->vp8_v_loop_filter16y_inner = ff_vp8_v_loop_filter16y_inner_ssse3; c->vp8_h_loop_filter16y_inner = ff_vp8_h_loop_filter16y_inner_ssse3; c->vp8_v_loop_filter8uv_inner = ff_vp8_v_loop_filter8uv_inner_ssse3; @@ -428,14 +431,17 @@ av_cold void ff_vp8dsp_init_x86(VP8DSPContext* c) c->vp8_h_loop_filter16y = ff_vp8_h_loop_filter16y_mbedge_ssse3; c->vp8_v_loop_filter8uv = ff_vp8_v_loop_filter8uv_mbedge_ssse3; c->vp8_h_loop_filter8uv = ff_vp8_h_loop_filter8uv_mbedge_ssse3; +#endif } if (mm_flags & AV_CPU_FLAG_SSE4) { c->vp8_idct_dc_add = ff_vp8_idct_dc_add_sse4; c->vp8_h_loop_filter_simple = ff_vp8_h_loop_filter_simple_sse4; +#if ARCH_X86_64 || HAVE_ALIGNED_STACK c->vp8_h_loop_filter16y = ff_vp8_h_loop_filter16y_mbedge_sse4; c->vp8_h_loop_filter8uv = ff_vp8_h_loop_filter8uv_mbedge_sse4; +#endif } #endif } From 557519189f0c78bb8d9b7d91f92908fd6ff8f6f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Tue, 3 Jul 2012 21:11:23 -0700 Subject: [PATCH 27/29] swscale: yuv2planeX 8bit >=sse2 functions need aligned stack on x86-32. Signed-off-by: Ronald S. Bultje --- libswscale/x86/swscale_mmx.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/libswscale/x86/swscale_mmx.c b/libswscale/x86/swscale_mmx.c index 99b32623cb..37d786a87d 100644 --- a/libswscale/x86/swscale_mmx.c +++ b/libswscale/x86/swscale_mmx.c @@ -329,12 +329,12 @@ void ff_sws_init_swScale_mmx(SwsContext *c) case 8: ASSIGN_SCALE_FUNC2(hscalefn, 8, opt1, opt2); break; \ default: ASSIGN_SCALE_FUNC2(hscalefn, X, opt1, opt2); break; \ } -#define ASSIGN_VSCALEX_FUNC(vscalefn, opt, do_16_case) \ +#define ASSIGN_VSCALEX_FUNC(vscalefn, opt, do_16_case, condition_8bit) \ switch(c->dstBpc){ \ case 16: do_16_case; break; \ case 10: if (!isBE(c->dstFormat)) vscalefn = ff_yuv2planeX_10_ ## opt; break; \ case 9: if (!isBE(c->dstFormat)) vscalefn = ff_yuv2planeX_9_ ## opt; break; \ - default: vscalefn = ff_yuv2planeX_8_ ## opt; break; \ + default: if (condition_8bit) vscalefn = ff_yuv2planeX_8_ ## opt; break; \ } #define ASSIGN_VSCALE_FUNC(vscalefn, opt1, opt2, opt2chk) \ switch(c->dstBpc){ \ @@ -386,7 +386,7 @@ switch(c->dstBpc){ \ } } if (cpu_flags & AV_CPU_FLAG_MMX2) { - ASSIGN_VSCALEX_FUNC(c->yuv2planeX, mmx2,); + ASSIGN_VSCALEX_FUNC(c->yuv2planeX, mmx2, , 1); } #endif #define ASSIGN_SSE_SCALE_FUNC(hscalefn, filtersize, opt1, opt2) \ @@ -400,7 +400,8 @@ switch(c->dstBpc){ \ if (cpu_flags & AV_CPU_FLAG_SSE2) { ASSIGN_SSE_SCALE_FUNC(c->hyScale, c->hLumFilterSize, sse2, sse2); ASSIGN_SSE_SCALE_FUNC(c->hcScale, c->hChrFilterSize, sse2, sse2); - ASSIGN_VSCALEX_FUNC(c->yuv2planeX, sse2,); + ASSIGN_VSCALEX_FUNC(c->yuv2planeX, sse2, , + HAVE_ALIGNED_STACK || ARCH_X86_64); ASSIGN_VSCALE_FUNC(c->yuv2plane1, sse2, sse2, 1); switch (c->srcFormat) { @@ -448,13 +449,15 @@ switch(c->dstBpc){ \ ASSIGN_SSE_SCALE_FUNC(c->hyScale, c->hLumFilterSize, sse4, ssse3); ASSIGN_SSE_SCALE_FUNC(c->hcScale, c->hChrFilterSize, sse4, ssse3); ASSIGN_VSCALEX_FUNC(c->yuv2planeX, sse4, - if (!isBE(c->dstFormat)) c->yuv2planeX = ff_yuv2planeX_16_sse4); + if (!isBE(c->dstFormat)) c->yuv2planeX = ff_yuv2planeX_16_sse4, + HAVE_ALIGNED_STACK || ARCH_X86_64); if (c->dstBpc == 16 && !isBE(c->dstFormat)) c->yuv2plane1 = ff_yuv2plane1_16_sse4; } if (cpu_flags & AV_CPU_FLAG_AVX) { - ASSIGN_VSCALEX_FUNC(c->yuv2planeX, avx,); + ASSIGN_VSCALEX_FUNC(c->yuv2planeX, avx, , + HAVE_ALIGNED_STACK || ARCH_X86_64); ASSIGN_VSCALE_FUNC(c->yuv2plane1, avx, avx, 1); switch (c->srcFormat) { From fa2d7473528c601c1076957d474ab7550d588828 Mon Sep 17 00:00:00 2001 From: Diego Biurrun Date: Wed, 4 Jul 2012 16:55:13 +0200 Subject: [PATCH 28/29] graph2dot: fix printf format specifier MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit tools/graph2dot.c:85: warning: format ‘%lld’ expects type ‘long long int’, but argument 4 has type ‘int’ --- tools/graph2dot.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/graph2dot.c b/tools/graph2dot.c index a52416db31..6ea2f3206d 100644 --- a/tools/graph2dot.c +++ b/tools/graph2dot.c @@ -80,7 +80,7 @@ static void print_digraph(FILE *outfile, AVFilterGraph *graph) av_get_channel_layout_string(buf, sizeof(buf), -1, link->channel_layout); fprintf(outfile, - " [ label= \"fmt:%s sr:%"PRId64 " cl:%s\" ]", + " [ label= \"fmt:%s sr:%d cl:%s\" ]", av_get_sample_fmt_name(link->format), link->sample_rate, buf); } From 7c29377b702783680b223a12503df784b1808086 Mon Sep 17 00:00:00 2001 From: Mans Rullgard Date: Wed, 4 Jul 2012 16:51:10 +0100 Subject: [PATCH 29/29] lavfi: reclassify showfiltfmts as a TESTPROG This tool uses lavfi internal symbols not accessible in shared libraries. TESTPROGS are linked statically to allow them use of library internals not normally exported. Signed-off-by: Mans Rullgard --- .gitignore | 1 - libavfilter/Makefile | 4 ++-- tools/lavfi-showfiltfmts.c => libavfilter/filtfmts.c | 5 +++++ tests/Makefile | 2 +- tests/lavfi-regression.sh | 2 +- 5 files changed, 9 insertions(+), 5 deletions(-) rename tools/lavfi-showfiltfmts.c => libavfilter/filtfmts.c (98%) diff --git a/.gitignore b/.gitignore index 6fe94349d0..56b304070d 100644 --- a/.gitignore +++ b/.gitignore @@ -42,7 +42,6 @@ /tools/cws2fws /tools/graph2dot /tools/ismindex -/tools/lavfi-showfiltfmts /tools/pktdumper /tools/probetest /tools/qt-faststart diff --git a/libavfilter/Makefile b/libavfilter/Makefile index b78960932f..530aa576ae 100644 --- a/libavfilter/Makefile +++ b/libavfilter/Makefile @@ -89,5 +89,5 @@ OBJS-$(CONFIG_TESTSRC_FILTER) += vsrc_testsrc.o OBJS-$(CONFIG_NULLSINK_FILTER) += vsink_nullsink.o -TOOLS = graph2dot \ - lavfi-showfiltfmts \ +TOOLS = graph2dot +TESTPROGS = filtfmts diff --git a/tools/lavfi-showfiltfmts.c b/libavfilter/filtfmts.c similarity index 98% rename from tools/lavfi-showfiltfmts.c rename to libavfilter/filtfmts.c index 146f0cd081..8b23c7b844 100644 --- a/tools/lavfi-showfiltfmts.c +++ b/libavfilter/filtfmts.c @@ -18,11 +18,16 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include + #include "libavformat/avformat.h" #include "libavutil/pixdesc.h" #include "libavfilter/avfilter.h" #include "libavfilter/formats.h" +#undef fprintf +#undef printf + int main(int argc, char **argv) { AVFilter *filter; diff --git a/tests/Makefile b/tests/Makefile index 6fe4ed3923..91f2d49b19 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -92,7 +92,7 @@ FATE += $(FATE_LIBAVUTIL) $(FATE_AVCONV) $(FATE_SAMPLES_AVCONV): avconv$(EXESUF) $(FATE_LAVF): $(AREF) $(VREF) -$(FATE_LAVFI): $(VREF) tools/lavfi-showfiltfmts$(EXESUF) +$(FATE_LAVFI): $(VREF) libavfilter/filtfmts-test$(EXESUF) $(FATE_SEEK): fate-acodec fate-vsynth2 fate-lavf libavformat/seek-test$(EXESUF) $(FATE_LAVF): CMD = lavftest diff --git a/tests/lavfi-regression.sh b/tests/lavfi-regression.sh index f8c0c4e75b..a315e725ea 100755 --- a/tests/lavfi-regression.sh +++ b/tests/lavfi-regression.sh @@ -44,7 +44,7 @@ do_lavfi_pixfmts(){ filter=$1 filter_args=$2 - showfiltfmts="$target_exec $target_path/tools/lavfi-showfiltfmts" + showfiltfmts="$target_exec $target_path/libavfilter/filtfmts-test" exclude_fmts=${outfile}${1}_exclude_fmts out_fmts=${outfile}${1}_out_fmts