From 082768f0b189b1706fdcd15b42dcca5fd0822315 Mon Sep 17 00:00:00 2001 From: Loren Merritt Date: Sun, 3 Jul 2011 22:47:10 +0000 Subject: [PATCH 01/36] vf_gradfun: relicense x86 asm to LGPL Actually I gave permission for LGPL long ago, but the original import failed to update the license header. --- libavfilter/x86/gradfun.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/libavfilter/x86/gradfun.c b/libavfilter/x86/gradfun.c index c9ade8294a..ff3b19d38d 100644 --- a/libavfilter/x86/gradfun.c +++ b/libavfilter/x86/gradfun.c @@ -1,19 +1,21 @@ /* + * Copyright (C) 2009 Loren Merritt + * * This file is part of Libav. * - * Libav is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * 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 General Public License for more details. + * 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 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. + * 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/cpu.h" From 58f7aad05125058407a3e15ad0125ec3e6d48ffa Mon Sep 17 00:00:00 2001 From: Daniel Kang Date: Sun, 3 Jul 2011 22:28:47 -0400 Subject: [PATCH 02/36] Fix build with --disable-yasm. Signed-off-by: Ronald S. Bultje --- libavcodec/x86/dsputil_mmx.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libavcodec/x86/dsputil_mmx.c b/libavcodec/x86/dsputil_mmx.c index d6eed82dd8..cfec97c8af 100644 --- a/libavcodec/x86/dsputil_mmx.c +++ b/libavcodec/x86/dsputil_mmx.c @@ -2835,11 +2835,13 @@ void dsputil_init_mmx(DSPContext* c, AVCodecContext *avctx) H264_QPEL_FUNCS(3, 2, ssse3); H264_QPEL_FUNCS(3, 3, ssse3); } +#if HAVE_YASM else if (bit_depth == 10) { H264_QPEL_FUNCS_10(1, 0, ssse3_cache64) H264_QPEL_FUNCS_10(2, 0, ssse3_cache64) H264_QPEL_FUNCS_10(3, 0, ssse3_cache64) } +#endif c->add_png_paeth_prediction= add_png_paeth_prediction_ssse3; #if HAVE_YASM if (!high_bit_depth) { From a4ab70f92e4d8705434a2fee42a2b69a8bfa6bb1 Mon Sep 17 00:00:00 2001 From: Carl Eugen Hoyos Date: Mon, 27 Jun 2011 07:25:58 +0000 Subject: [PATCH 03/36] ffmpeg: Fix VDPAU decoding for some H264 samples. --- libavcodec/vdpau.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libavcodec/vdpau.c b/libavcodec/vdpau.c index 98616e8da6..bdc596ce24 100644 --- a/libavcodec/vdpau.c +++ b/libavcodec/vdpau.c @@ -183,7 +183,8 @@ void ff_vdpau_h264_picture_complete(MpegEncContext *s) render->info.h264.deblocking_filter_control_present_flag = h->pps.deblocking_filter_parameters_present; render->info.h264.redundant_pic_cnt_present_flag = h->pps.redundant_pic_cnt_present; memcpy(render->info.h264.scaling_lists_4x4, h->pps.scaling_matrix4, sizeof(render->info.h264.scaling_lists_4x4)); - memcpy(render->info.h264.scaling_lists_8x8, h->pps.scaling_matrix8, sizeof(render->info.h264.scaling_lists_8x8)); + memcpy(render->info.h264.scaling_lists_8x8[0], h->pps.scaling_matrix8[0], sizeof(render->info.h264.scaling_lists_8x8[0])); + memcpy(render->info.h264.scaling_lists_8x8[1], h->pps.scaling_matrix8[3], sizeof(render->info.h264.scaling_lists_8x8[0])); ff_draw_horiz_band(s, 0, s->avctx->height); render->bitstream_buffers_used = 0; From 954a6532160b9eac7773613be105fd706d639ade Mon Sep 17 00:00:00 2001 From: Robert Swain Date: Mon, 4 Jul 2011 08:44:49 +0200 Subject: [PATCH 04/36] vorbis: vpxenc: Add missing include for av_rescale* Signed-off-by: Mans Rullgard --- libavcodec/libvorbis.c | 1 + libavcodec/libvpxenc.c | 1 + 2 files changed, 2 insertions(+) diff --git a/libavcodec/libvorbis.c b/libavcodec/libvorbis.c index 88da705a32..85cb9c5989 100644 --- a/libavcodec/libvorbis.c +++ b/libavcodec/libvorbis.c @@ -30,6 +30,7 @@ #include "avcodec.h" #include "bytestream.h" #include "vorbis.h" +#include "libavutil/mathematics.h" #undef NDEBUG #include diff --git a/libavcodec/libvpxenc.c b/libavcodec/libvpxenc.c index 02f8135381..ca2e6157d5 100644 --- a/libavcodec/libvpxenc.c +++ b/libavcodec/libvpxenc.c @@ -30,6 +30,7 @@ #include "avcodec.h" #include "libavutil/base64.h" +#include "libavutil/mathematics.h" /** * Portion of struct vpx_codec_cx_pkt from vpx_encoder.h. From 412594ed0ac72ea66391eb3fa9dc8e644237ea61 Mon Sep 17 00:00:00 2001 From: Mans Rullgard Date: Sun, 3 Jul 2011 23:19:46 +0100 Subject: [PATCH 05/36] dct-test: remove commented out code Signed-off-by: Mans Rullgard --- libavcodec/dct-test.c | 35 ----------------------------------- 1 file changed, 35 deletions(-) diff --git a/libavcodec/dct-test.c b/libavcodec/dct-test.c index d0fe34e1d7..b40fcc8593 100644 --- a/libavcodec/dct-test.c +++ b/libavcodec/dct-test.c @@ -177,7 +177,6 @@ static void idct_mmx_init(void) /* the mmx/mmxext idct uses a reordered input, so we patch scan tables */ for (i = 0; i < 64; i++) { idct_mmx_perm[i] = (i & 0x38) | ((i & 6) >> 1) | ((i & 1) << 2); -// idct_simple_mmx_perm[i] = simple_block_permute_op(i); } } @@ -235,15 +234,6 @@ static void dct_error(const char *name, int is_idct, break; } -#if 0 // simulate mismatch control -{ int sum=0; - for(i=0;i<64;i++) - sum+=block1[i]; - - if((sum&1)==0) block1[63]^=1; -} -#endif - for(i=0; i<64; i++) block_org[i]= block1[i]; @@ -264,14 +254,6 @@ static void dct_error(const char *name, int is_idct, for(i=0; i<64; i++) block[i]= block1[i]; } -#if 0 // simulate mismatch control for tested IDCT but not the ref -{ int sum=0; - for(i=0;i<64;i++) - sum+=block[i]; - - if((sum&1)==0) block[63]^=1; -} -#endif fdct_func(block); mmx_emms(); @@ -296,19 +278,6 @@ static void dct_error(const char *name, int is_idct, if( abs(block[i])>maxout) maxout=abs(block[i]); } if(blockSumErrMax < blockSumErr) blockSumErrMax= blockSumErr; -#if 0 // print different matrix pairs - if(blockSumErr){ - printf("\n"); - for(i=0; i<64; i++){ - if((i&7)==0) printf("\n"); - printf("%4d ", block_org[i]); - } - for(i=0; i<64; i++){ - if((i&7)==0) printf("\n"); - printf("%4d ", block[i] - block1[i]); - } - } -#endif } for(i=0; i<64; i++) sysErrMax= FFMAX(sysErrMax, FFABS(sysErr[i])); @@ -362,8 +331,6 @@ static void dct_error(const char *name, int is_idct, for(it=0;it Date: Sun, 3 Jul 2011 22:59:03 +0100 Subject: [PATCH 06/36] dct-test: whitespace cosmetics Signed-off-by: Mans Rullgard --- libavcodec/dct-test.c | 376 +++++++++++++++++++++--------------------- 1 file changed, 192 insertions(+), 184 deletions(-) diff --git a/libavcodec/dct-test.c b/libavcodec/dct-test.c index b40fcc8593..c5e29c44a8 100644 --- a/libavcodec/dct-test.c +++ b/libavcodec/dct-test.c @@ -68,12 +68,13 @@ void ff_simple_idct_neon(DCTELEM *data); void ff_simple_idct_axp(DCTELEM *data); struct algo { - const char *name; - enum { FDCT, IDCT } is_idct; - void (* func) (DCTELEM *block); - void (* ref) (DCTELEM *block); - enum formattag { NO_PERM,MMX_PERM, MMX_SIMPLE_PERM, SCALE_PERM, SSE2_PERM, PARTTRANS_PERM } format; - int mm_support; + const char *name; + enum { FDCT, IDCT } is_idct; + void (*func)(DCTELEM *block); + void (*ref) (DCTELEM *block); + enum formattag { NO_PERM, MMX_PERM, MMX_SIMPLE_PERM, SCALE_PERM, + SSE2_PERM, PARTTRANS_PERM } format; + int mm_support; }; #ifndef FAAN_POSTSCALE @@ -85,60 +86,60 @@ struct algo { static int cpu_flags; struct algo algos[] = { - {"REF-DBL", 0, ff_ref_fdct, ff_ref_fdct, NO_PERM}, - {"FAAN", 0, ff_faandct, ff_ref_fdct, FAAN_SCALE}, - {"FAANI", 1, ff_faanidct, ff_ref_idct, NO_PERM}, - {"IJG-AAN-INT", 0, fdct_ifast, ff_ref_fdct, SCALE_PERM}, - {"IJG-LLM-INT", 0, ff_jpeg_fdct_islow, ff_ref_fdct, NO_PERM}, - {"REF-DBL", 1, ff_ref_idct, ff_ref_idct, NO_PERM}, - {"INT", 1, j_rev_dct, ff_ref_idct, MMX_PERM}, - {"SIMPLE-C", 1, ff_simple_idct, ff_ref_idct, NO_PERM}, + {"REF-DBL", 0, ff_ref_fdct, ff_ref_fdct, NO_PERM}, + {"FAAN", 0, ff_faandct, ff_ref_fdct, FAAN_SCALE}, + {"FAANI", 1, ff_faanidct, ff_ref_idct, NO_PERM}, + {"IJG-AAN-INT", 0, fdct_ifast, ff_ref_fdct, SCALE_PERM}, + {"IJG-LLM-INT", 0, ff_jpeg_fdct_islow, ff_ref_fdct, NO_PERM}, + {"REF-DBL", 1, ff_ref_idct, ff_ref_idct, NO_PERM}, + {"INT", 1, j_rev_dct, ff_ref_idct, MMX_PERM}, + {"SIMPLE-C", 1, ff_simple_idct, ff_ref_idct, NO_PERM}, #if HAVE_MMX - {"MMX", 0, ff_fdct_mmx, ff_ref_fdct, NO_PERM, AV_CPU_FLAG_MMX}, + {"MMX", 0, ff_fdct_mmx, ff_ref_fdct, NO_PERM, AV_CPU_FLAG_MMX}, #if HAVE_MMX2 - {"MMX2", 0, ff_fdct_mmx2, ff_ref_fdct, NO_PERM, AV_CPU_FLAG_MMX2}, - {"SSE2", 0, ff_fdct_sse2, ff_ref_fdct, NO_PERM, AV_CPU_FLAG_SSE2}, + {"MMX2", 0, ff_fdct_mmx2, ff_ref_fdct, NO_PERM, AV_CPU_FLAG_MMX2}, + {"SSE2", 0, ff_fdct_sse2, ff_ref_fdct, NO_PERM, AV_CPU_FLAG_SSE2}, #endif #if CONFIG_GPL - {"LIBMPEG2-MMX", 1, ff_mmx_idct, ff_ref_idct, MMX_PERM, AV_CPU_FLAG_MMX}, - {"LIBMPEG2-MMX2", 1, ff_mmxext_idct, ff_ref_idct, MMX_PERM, AV_CPU_FLAG_MMX2}, + {"LIBMPEG2-MMX", 1, ff_mmx_idct, ff_ref_idct, MMX_PERM, AV_CPU_FLAG_MMX}, + {"LIBMPEG2-MMX2", 1, ff_mmxext_idct, ff_ref_idct, MMX_PERM, AV_CPU_FLAG_MMX2}, #endif - {"SIMPLE-MMX", 1, ff_simple_idct_mmx, ff_ref_idct, MMX_SIMPLE_PERM, AV_CPU_FLAG_MMX}, - {"XVID-MMX", 1, ff_idct_xvid_mmx, ff_ref_idct, NO_PERM, AV_CPU_FLAG_MMX}, - {"XVID-MMX2", 1, ff_idct_xvid_mmx2, ff_ref_idct, NO_PERM, AV_CPU_FLAG_MMX2}, - {"XVID-SSE2", 1, ff_idct_xvid_sse2, ff_ref_idct, SSE2_PERM, AV_CPU_FLAG_SSE2}, + {"SIMPLE-MMX", 1, ff_simple_idct_mmx, ff_ref_idct, MMX_SIMPLE_PERM, AV_CPU_FLAG_MMX}, + {"XVID-MMX", 1, ff_idct_xvid_mmx, ff_ref_idct, NO_PERM, AV_CPU_FLAG_MMX}, + {"XVID-MMX2", 1, ff_idct_xvid_mmx2, ff_ref_idct, NO_PERM, AV_CPU_FLAG_MMX2}, + {"XVID-SSE2", 1, ff_idct_xvid_sse2, ff_ref_idct, SSE2_PERM, AV_CPU_FLAG_SSE2}, #endif #if HAVE_ALTIVEC - {"altivecfdct", 0, fdct_altivec, ff_ref_fdct, NO_PERM, AV_CPU_FLAG_ALTIVEC}, + {"altivecfdct", 0, fdct_altivec, ff_ref_fdct, NO_PERM, AV_CPU_FLAG_ALTIVEC}, #endif #if ARCH_BFIN - {"BFINfdct", 0, ff_bfin_fdct, ff_ref_fdct, NO_PERM}, - {"BFINidct", 1, ff_bfin_idct, ff_ref_idct, NO_PERM}, + {"BFINfdct", 0, ff_bfin_fdct, ff_ref_fdct, NO_PERM}, + {"BFINidct", 1, ff_bfin_idct, ff_ref_idct, NO_PERM}, #endif #if ARCH_ARM - {"SIMPLE-ARM", 1, ff_simple_idct_arm, ff_ref_idct, NO_PERM }, - {"INT-ARM", 1, ff_j_rev_dct_arm, ff_ref_idct, MMX_PERM }, + {"SIMPLE-ARM", 1, ff_simple_idct_arm, ff_ref_idct, NO_PERM }, + {"INT-ARM", 1, ff_j_rev_dct_arm, ff_ref_idct, MMX_PERM }, #if HAVE_ARMV5TE - {"SIMPLE-ARMV5TE", 1, ff_simple_idct_armv5te, ff_ref_idct, NO_PERM }, + {"SIMPLE-ARMV5TE", 1, ff_simple_idct_armv5te, ff_ref_idct, NO_PERM }, #endif #if HAVE_ARMV6 - {"SIMPLE-ARMV6", 1, ff_simple_idct_armv6, ff_ref_idct, MMX_PERM }, + {"SIMPLE-ARMV6", 1, ff_simple_idct_armv6, ff_ref_idct, MMX_PERM }, #endif #if HAVE_NEON - {"SIMPLE-NEON", 1, ff_simple_idct_neon, ff_ref_idct, PARTTRANS_PERM }, + {"SIMPLE-NEON", 1, ff_simple_idct_neon, ff_ref_idct, PARTTRANS_PERM }, #endif #endif /* ARCH_ARM */ #if ARCH_ALPHA - {"SIMPLE-ALPHA", 1, ff_simple_idct_axp, ff_ref_idct, NO_PERM }, + {"SIMPLE-ALPHA", 1, ff_simple_idct_axp, ff_ref_idct, NO_PERM }, #endif - { 0 } + { 0 } }; #define AANSCALE_BITS 12 @@ -148,7 +149,7 @@ uint8_t cropTbl[256 + 2 * MAX_NEG_CROP]; static int64_t gettime(void) { struct timeval tv; - gettimeofday(&tv,NULL); + gettimeofday(&tv, NULL); return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec; } @@ -157,18 +158,18 @@ static int64_t gettime(void) static short idct_mmx_perm[64]; -static short idct_simple_mmx_perm[64]={ - 0x00, 0x08, 0x04, 0x09, 0x01, 0x0C, 0x05, 0x0D, - 0x10, 0x18, 0x14, 0x19, 0x11, 0x1C, 0x15, 0x1D, - 0x20, 0x28, 0x24, 0x29, 0x21, 0x2C, 0x25, 0x2D, - 0x12, 0x1A, 0x16, 0x1B, 0x13, 0x1E, 0x17, 0x1F, - 0x02, 0x0A, 0x06, 0x0B, 0x03, 0x0E, 0x07, 0x0F, - 0x30, 0x38, 0x34, 0x39, 0x31, 0x3C, 0x35, 0x3D, - 0x22, 0x2A, 0x26, 0x2B, 0x23, 0x2E, 0x27, 0x2F, - 0x32, 0x3A, 0x36, 0x3B, 0x33, 0x3E, 0x37, 0x3F, +static short idct_simple_mmx_perm[64] = { + 0x00, 0x08, 0x04, 0x09, 0x01, 0x0C, 0x05, 0x0D, + 0x10, 0x18, 0x14, 0x19, 0x11, 0x1C, 0x15, 0x1D, + 0x20, 0x28, 0x24, 0x29, 0x21, 0x2C, 0x25, 0x2D, + 0x12, 0x1A, 0x16, 0x1B, 0x13, 0x1E, 0x17, 0x1F, + 0x02, 0x0A, 0x06, 0x0B, 0x03, 0x0E, 0x07, 0x0F, + 0x30, 0x38, 0x34, 0x39, 0x31, 0x3C, 0x35, 0x3D, + 0x22, 0x2A, 0x26, 0x2B, 0x23, 0x2E, 0x27, 0x2F, + 0x32, 0x3A, 0x36, 0x3B, 0x33, 0x3E, 0x37, 0x3F, }; -static const uint8_t idct_sse2_row_perm[8] = {0, 4, 1, 5, 2, 6, 3, 7}; +static const uint8_t idct_sse2_row_perm[8] = { 0, 4, 1, 5, 2, 6, 3, 7 }; static void idct_mmx_init(void) { @@ -181,8 +182,8 @@ static void idct_mmx_init(void) } DECLARE_ALIGNED(16, static DCTELEM, block)[64]; -DECLARE_ALIGNED(8, static DCTELEM, block1)[64]; -DECLARE_ALIGNED(8, static DCTELEM, block_org)[64]; +DECLARE_ALIGNED(8, static DCTELEM, block1)[64]; +DECLARE_ALIGNED(8, static DCTELEM, block_org)[64]; static inline void mmx_emms(void) { @@ -193,144 +194,151 @@ static inline void mmx_emms(void) } static void dct_error(const char *name, int is_idct, - void (*fdct_func)(DCTELEM *block), - void (*fdct_ref)(DCTELEM *block), int form, int test) + void (*fdct_func)(DCTELEM *block), + void (*fdct_ref)(DCTELEM *block), int form, + int test) { int it, i, scale; int err_inf, v; int64_t err2, ti, ti1, it1; - int64_t sysErr[64], sysErrMax=0; - int maxout=0; - int blockSumErrMax=0, blockSumErr; + int64_t sysErr[64], sysErrMax = 0; + int maxout = 0; + int blockSumErrMax = 0, blockSumErr; AVLFG prng; av_lfg_init(&prng, 1); err_inf = 0; err2 = 0; - for(i=0; i<64; i++) sysErr[i]=0; - for(it=0;it>=3; + for (i = 0; i < 64; i++) + block1[i] >>= 3; } - break; - case 1:{ - int num = av_lfg_get(&prng) % 10 + 1; - for(i=0;i>3)&3)] = block1[i]; + for (i = 0; i < 64; i++) + block[(i & 0x24) | ((i & 3) << 3) | ((i >> 3) & 3)] = block1[i]; } else { - for(i=0; i<64; i++) - block[i]= block1[i]; + for (i = 0; i < 64; i++) + block[i] = block1[i]; } fdct_func(block); mmx_emms(); if (form == SCALE_PERM) { - for(i=0; i<64; i++) { - scale = 8*(1 << (AANSCALE_BITS + 11)) / ff_aanscales[i]; - block[i] = (block[i] * scale /*+ (1<<(AANSCALE_BITS-1))*/) >> AANSCALE_BITS; + for (i = 0; i < 64; i++) { + scale = 8 * (1 << (AANSCALE_BITS + 11)) / ff_aanscales[i]; + block[i] = (block[i] * scale) >> AANSCALE_BITS; } } fdct_ref(block1); - blockSumErr=0; - for(i=0;i<64;i++) { + blockSumErr = 0; + for (i = 0; i < 64; i++) { v = abs(block[i] - block1[i]); if (v > err_inf) err_inf = v; err2 += v * v; sysErr[i] += block[i] - block1[i]; blockSumErr += v; - if( abs(block[i])>maxout) maxout=abs(block[i]); + if (abs(block[i]) > maxout) + maxout = abs(block[i]); } - if(blockSumErrMax < blockSumErr) blockSumErrMax= blockSumErr; + if (blockSumErrMax < blockSumErr) + blockSumErrMax = blockSumErr; } - for(i=0; i<64; i++) sysErrMax= FFMAX(sysErrMax, FFABS(sysErr[i])); + for (i = 0; i < 64; i++) + sysErrMax = FFMAX(sysErrMax, FFABS(sysErr[i])); - for(i=0; i<64; i++){ - if(i%8==0) printf("\n"); - printf("%7d ", (int)sysErr[i]); + for (i = 0; i < 64; i++) { + if (i % 8 == 0) + printf("\n"); + printf("%7d ", (int) sysErr[i]); } printf("\n"); printf("%s %s: err_inf=%d err2=%0.8f syserr=%0.8f maxout=%d blockSumErr=%d\n", - is_idct ? "IDCT" : "DCT", - name, err_inf, (double)err2 / NB_ITS / 64.0, (double)sysErrMax / NB_ITS, maxout, blockSumErrMax); + is_idct ? "IDCT" : "DCT", name, err_inf, + (double) err2 / NB_ITS / 64.0, (double) sysErrMax / NB_ITS, + maxout, blockSumErrMax); /* speed test */ - for(i=0;i<64;i++) + for (i = 0; i < 64; i++) block1[i] = 0; - switch(test){ - case 0: - for(i=0;i<64;i++) - block1[i] = av_lfg_get(&prng) % 512 -256; - if (is_idct){ - ff_ref_fdct(block1); - for(i=0;i<64;i++) - block1[i]>>=3; + switch (test) { + case 0: + for (i = 0; i < 64; i++) + block1[i] = av_lfg_get(&prng) % 512 - 256; + if (is_idct) { + ff_ref_fdct(block1); + for (i = 0; i < 64; i++) + block1[i] >>= 3; } - break; - case 1:{ + break; + case 1: case 2: - block1[0] = av_lfg_get(&prng) % 512 -256; - block1[1] = av_lfg_get(&prng) % 512 -256; - block1[2] = av_lfg_get(&prng) % 512 -256; - block1[3] = av_lfg_get(&prng) % 512 -256; - }break; + block1[0] = av_lfg_get(&prng) % 512 - 256; + block1[1] = av_lfg_get(&prng) % 512 - 256; + block1[2] = av_lfg_get(&prng) % 512 - 256; + block1[3] = av_lfg_get(&prng) % 512 - 256; + break; } if (form == MMX_PERM) { - for(i=0;i<64;i++) + for (i = 0; i < 64; i++) block[idct_mmx_perm[i]] = block1[i]; - } else if(form == MMX_SIMPLE_PERM) { - for(i=0;i<64;i++) + } else if (form == MMX_SIMPLE_PERM) { + for (i = 0; i < 64; i++) block[idct_simple_mmx_perm[i]] = block1[i]; } else { - for(i=0; i<64; i++) - block[i]= block1[i]; + for (i = 0; i < 64; i++) + block[i] = block1[i]; } ti = gettime(); it1 = 0; do { - for(it=0;it 255) - v = 255; - dest[i * linesize + j] = (int)rint(v); + for (i = 0; i < 8; i++) { + for (j = 0; j < 8; j++) { + v = block3[8 * i + j]; + if (v < 0) v = 0; + else if (v > 255) v = 255; + dest[i * linesize + j] = (int) rint(v); } } } static void idct248_error(const char *name, - void (*idct248_put)(uint8_t *dest, int line_size, int16_t *block)) + void (*idct248_put)(uint8_t *dest, int line_size, + int16_t *block)) { int it, i, it1, ti, ti1, err_max, v; - AVLFG prng; av_lfg_init(&prng, 1); @@ -438,39 +445,36 @@ static void idct248_error(const char *name, /* just one test to see if code is correct (precision is less important here) */ err_max = 0; - for(it=0;it err_max) err_max = v; } } - printf("%s %s: err_inf=%d\n", - 1 ? "IDCT248" : "DCT248", - name, err_max); + printf("%s %s: err_inf=%d\n", 1 ? "IDCT248" : "DCT248", name, err_max); ti = gettime(); it1 = 0; do { - for(it=0;it Date: Sun, 3 Jul 2011 22:48:53 +0100 Subject: [PATCH 07/36] dct-test: simplify calling dct_error() Pass a pointer to the DCT descriptor instead of each field individually. Signed-off-by: Mans Rullgard --- libavcodec/dct-test.c | 36 ++++++++++++++++-------------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/libavcodec/dct-test.c b/libavcodec/dct-test.c index c5e29c44a8..7602cfa137 100644 --- a/libavcodec/dct-test.c +++ b/libavcodec/dct-test.c @@ -193,10 +193,7 @@ static inline void mmx_emms(void) #endif } -static void dct_error(const char *name, int is_idct, - void (*fdct_func)(DCTELEM *block), - void (*fdct_ref)(DCTELEM *block), int form, - int test) +static void dct_error(const struct algo *dct, int test) { int it, i, scale; int err_inf, v; @@ -219,7 +216,7 @@ static void dct_error(const char *name, int is_idct, case 0: for (i = 0; i < 64; i++) block1[i] = (av_lfg_get(&prng) % 512) - 256; - if (is_idct) { + if (dct->is_idct) { ff_ref_fdct(block1); for (i = 0; i < 64; i++) block1[i] >>= 3; @@ -241,16 +238,16 @@ static void dct_error(const char *name, int is_idct, for (i = 0; i < 64; i++) block_org[i] = block1[i]; - if (form == MMX_PERM) { + if (dct->format == MMX_PERM) { for (i = 0; i < 64; i++) block[idct_mmx_perm[i]] = block1[i]; - } else if (form == MMX_SIMPLE_PERM) { + } else if (dct->format == MMX_SIMPLE_PERM) { for (i = 0; i < 64; i++) block[idct_simple_mmx_perm[i]] = block1[i]; - } else if (form == SSE2_PERM) { + } else if (dct->format == SSE2_PERM) { for (i = 0; i < 64; i++) block[(i & 0x38) | idct_sse2_row_perm[i & 7]] = block1[i]; - } else if (form == PARTTRANS_PERM) { + } else if (dct->format == PARTTRANS_PERM) { for (i = 0; i < 64; i++) block[(i & 0x24) | ((i & 3) << 3) | ((i >> 3) & 3)] = block1[i]; } else { @@ -258,17 +255,17 @@ static void dct_error(const char *name, int is_idct, block[i] = block1[i]; } - fdct_func(block); + dct->func(block); mmx_emms(); - if (form == SCALE_PERM) { + if (dct->format == SCALE_PERM) { for (i = 0; i < 64; i++) { scale = 8 * (1 << (AANSCALE_BITS + 11)) / ff_aanscales[i]; block[i] = (block[i] * scale) >> AANSCALE_BITS; } } - fdct_ref(block1); + dct->ref(block1); blockSumErr = 0; for (i = 0; i < 64; i++) { @@ -295,7 +292,7 @@ static void dct_error(const char *name, int is_idct, printf("\n"); printf("%s %s: err_inf=%d err2=%0.8f syserr=%0.8f maxout=%d blockSumErr=%d\n", - is_idct ? "IDCT" : "DCT", name, err_inf, + dct->is_idct ? "IDCT" : "DCT", dct->name, err_inf, (double) err2 / NB_ITS / 64.0, (double) sysErrMax / NB_ITS, maxout, blockSumErrMax); @@ -307,7 +304,7 @@ static void dct_error(const char *name, int is_idct, case 0: for (i = 0; i < 64; i++) block1[i] = av_lfg_get(&prng) % 512 - 256; - if (is_idct) { + if (dct->is_idct) { ff_ref_fdct(block1); for (i = 0; i < 64; i++) block1[i] >>= 3; @@ -322,10 +319,10 @@ static void dct_error(const char *name, int is_idct, break; } - if (form == MMX_PERM) { + if (dct->format == MMX_PERM) { for (i = 0; i < 64; i++) block[idct_mmx_perm[i]] = block1[i]; - } else if (form == MMX_SIMPLE_PERM) { + } else if (dct->format == MMX_SIMPLE_PERM) { for (i = 0; i < 64; i++) block[idct_simple_mmx_perm[i]] = block1[i]; } else { @@ -339,14 +336,14 @@ static void dct_error(const char *name, int is_idct, for (it = 0; it < NB_ITS_SPEED; it++) { for (i = 0; i < 64; i++) block[i] = block1[i]; - fdct_func(block); + dct->func(block); } it1 += NB_ITS_SPEED; ti1 = gettime() - ti; } while (ti1 < 1000000); mmx_emms(); - printf("%s %s: %0.1f kdct/s\n", is_idct ? "IDCT" : "DCT", name, + printf("%s %s: %0.1f kdct/s\n", dct->is_idct ? "IDCT" : "DCT", dct->name, (double) it1 * 1000.0 / (double) ti1); } @@ -543,8 +540,7 @@ int main(int argc, char **argv) for (i = 0; algos[i].name; i++) if (algos[i].is_idct == test_idct && !(~cpu_flags & algos[i].mm_support)) { - dct_error(algos[i].name, algos[i].is_idct, algos[i].func, - algos[i].ref, algos[i].format, test); + dct_error(&algos[i], test); } } return 0; From 4b357756b1a6e4a8d47d5e8def7c8561efc61c60 Mon Sep 17 00:00:00 2001 From: Mans Rullgard Date: Sun, 3 Jul 2011 23:03:11 +0100 Subject: [PATCH 08/36] dct-test: split table in two for idct and fdct Signed-off-by: Mans Rullgard --- libavcodec/dct-test.c | 40 ++++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/libavcodec/dct-test.c b/libavcodec/dct-test.c index 7602cfa137..9a38304ab6 100644 --- a/libavcodec/dct-test.c +++ b/libavcodec/dct-test.c @@ -85,23 +85,36 @@ struct algo { static int cpu_flags; -struct algo algos[] = { +static const struct algo fdct_tab[] = { {"REF-DBL", 0, ff_ref_fdct, ff_ref_fdct, NO_PERM}, {"FAAN", 0, ff_faandct, ff_ref_fdct, FAAN_SCALE}, - {"FAANI", 1, ff_faanidct, ff_ref_idct, NO_PERM}, {"IJG-AAN-INT", 0, fdct_ifast, ff_ref_fdct, SCALE_PERM}, {"IJG-LLM-INT", 0, ff_jpeg_fdct_islow, ff_ref_fdct, NO_PERM}, + +#if HAVE_MMX + {"MMX", 0, ff_fdct_mmx, ff_ref_fdct, NO_PERM, AV_CPU_FLAG_MMX}, + {"MMX2", 0, ff_fdct_mmx2, ff_ref_fdct, NO_PERM, AV_CPU_FLAG_MMX2}, + {"SSE2", 0, ff_fdct_sse2, ff_ref_fdct, NO_PERM, AV_CPU_FLAG_SSE2}, +#endif + +#if HAVE_ALTIVEC + {"altivecfdct", 0, fdct_altivec, ff_ref_fdct, NO_PERM, AV_CPU_FLAG_ALTIVEC}, +#endif + +#if ARCH_BFIN + {"BFINfdct", 0, ff_bfin_fdct, ff_ref_fdct, NO_PERM}, +#endif + + { 0 } +}; + +static const struct algo idct_tab[] = { + {"FAANI", 1, ff_faanidct, ff_ref_idct, NO_PERM}, {"REF-DBL", 1, ff_ref_idct, ff_ref_idct, NO_PERM}, {"INT", 1, j_rev_dct, ff_ref_idct, MMX_PERM}, {"SIMPLE-C", 1, ff_simple_idct, ff_ref_idct, NO_PERM}, #if HAVE_MMX - {"MMX", 0, ff_fdct_mmx, ff_ref_fdct, NO_PERM, AV_CPU_FLAG_MMX}, -#if HAVE_MMX2 - {"MMX2", 0, ff_fdct_mmx2, ff_ref_fdct, NO_PERM, AV_CPU_FLAG_MMX2}, - {"SSE2", 0, ff_fdct_sse2, ff_ref_fdct, NO_PERM, AV_CPU_FLAG_SSE2}, -#endif - #if CONFIG_GPL {"LIBMPEG2-MMX", 1, ff_mmx_idct, ff_ref_idct, MMX_PERM, AV_CPU_FLAG_MMX}, {"LIBMPEG2-MMX2", 1, ff_mmxext_idct, ff_ref_idct, MMX_PERM, AV_CPU_FLAG_MMX2}, @@ -112,18 +125,14 @@ struct algo algos[] = { {"XVID-SSE2", 1, ff_idct_xvid_sse2, ff_ref_idct, SSE2_PERM, AV_CPU_FLAG_SSE2}, #endif -#if HAVE_ALTIVEC - {"altivecfdct", 0, fdct_altivec, ff_ref_fdct, NO_PERM, AV_CPU_FLAG_ALTIVEC}, -#endif - #if ARCH_BFIN - {"BFINfdct", 0, ff_bfin_fdct, ff_ref_fdct, NO_PERM}, {"BFINidct", 1, ff_bfin_idct, ff_ref_idct, NO_PERM}, #endif #if ARCH_ARM {"SIMPLE-ARM", 1, ff_simple_idct_arm, ff_ref_idct, NO_PERM }, {"INT-ARM", 1, ff_j_rev_dct_arm, ff_ref_idct, MMX_PERM }, +#endif #if HAVE_ARMV5TE {"SIMPLE-ARMV5TE", 1, ff_simple_idct_armv5te, ff_ref_idct, NO_PERM }, #endif @@ -133,7 +142,6 @@ struct algo algos[] = { #if HAVE_NEON {"SIMPLE-NEON", 1, ff_simple_idct_neon, ff_ref_idct, PARTTRANS_PERM }, #endif -#endif /* ARCH_ARM */ #if ARCH_ALPHA {"SIMPLE-ALPHA", 1, ff_simple_idct_axp, ff_ref_idct, NO_PERM }, @@ -537,9 +545,9 @@ int main(int argc, char **argv) if (test_248_dct) { idct248_error("SIMPLE-C", ff_simple_idct248_put); } else { + const struct algo *algos = test_idct ? idct_tab : fdct_tab; for (i = 0; algos[i].name; i++) - if (algos[i].is_idct == test_idct && - !(~cpu_flags & algos[i].mm_support)) { + if (!(~cpu_flags & algos[i].mm_support)) { dct_error(&algos[i], test); } } From cf2b4f884d6155a22053e22db73e6da339233062 Mon Sep 17 00:00:00 2001 From: Mans Rullgard Date: Sun, 3 Jul 2011 23:05:21 +0100 Subject: [PATCH 09/36] dct-test: remove is_idct field from tables Signed-off-by: Mans Rullgard --- libavcodec/dct-test.c | 65 +++++++++++++++++++++---------------------- 1 file changed, 32 insertions(+), 33 deletions(-) diff --git a/libavcodec/dct-test.c b/libavcodec/dct-test.c index 9a38304ab6..3c71993900 100644 --- a/libavcodec/dct-test.c +++ b/libavcodec/dct-test.c @@ -69,7 +69,6 @@ void ff_simple_idct_axp(DCTELEM *data); struct algo { const char *name; - enum { FDCT, IDCT } is_idct; void (*func)(DCTELEM *block); void (*ref) (DCTELEM *block); enum formattag { NO_PERM, MMX_PERM, MMX_SIMPLE_PERM, SCALE_PERM, @@ -86,65 +85,65 @@ struct algo { static int cpu_flags; static const struct algo fdct_tab[] = { - {"REF-DBL", 0, ff_ref_fdct, ff_ref_fdct, NO_PERM}, - {"FAAN", 0, ff_faandct, ff_ref_fdct, FAAN_SCALE}, - {"IJG-AAN-INT", 0, fdct_ifast, ff_ref_fdct, SCALE_PERM}, - {"IJG-LLM-INT", 0, ff_jpeg_fdct_islow, ff_ref_fdct, NO_PERM}, + {"REF-DBL", ff_ref_fdct, ff_ref_fdct, NO_PERM}, + {"FAAN", ff_faandct, ff_ref_fdct, FAAN_SCALE}, + {"IJG-AAN-INT", fdct_ifast, ff_ref_fdct, SCALE_PERM}, + {"IJG-LLM-INT", ff_jpeg_fdct_islow, ff_ref_fdct, NO_PERM}, #if HAVE_MMX - {"MMX", 0, ff_fdct_mmx, ff_ref_fdct, NO_PERM, AV_CPU_FLAG_MMX}, - {"MMX2", 0, ff_fdct_mmx2, ff_ref_fdct, NO_PERM, AV_CPU_FLAG_MMX2}, - {"SSE2", 0, ff_fdct_sse2, ff_ref_fdct, NO_PERM, AV_CPU_FLAG_SSE2}, + {"MMX", ff_fdct_mmx, ff_ref_fdct, NO_PERM, AV_CPU_FLAG_MMX}, + {"MMX2", ff_fdct_mmx2, ff_ref_fdct, NO_PERM, AV_CPU_FLAG_MMX2}, + {"SSE2", ff_fdct_sse2, ff_ref_fdct, NO_PERM, AV_CPU_FLAG_SSE2}, #endif #if HAVE_ALTIVEC - {"altivecfdct", 0, fdct_altivec, ff_ref_fdct, NO_PERM, AV_CPU_FLAG_ALTIVEC}, + {"altivecfdct", fdct_altivec, ff_ref_fdct, NO_PERM, AV_CPU_FLAG_ALTIVEC}, #endif #if ARCH_BFIN - {"BFINfdct", 0, ff_bfin_fdct, ff_ref_fdct, NO_PERM}, + {"BFINfdct", ff_bfin_fdct, ff_ref_fdct, NO_PERM}, #endif { 0 } }; static const struct algo idct_tab[] = { - {"FAANI", 1, ff_faanidct, ff_ref_idct, NO_PERM}, - {"REF-DBL", 1, ff_ref_idct, ff_ref_idct, NO_PERM}, - {"INT", 1, j_rev_dct, ff_ref_idct, MMX_PERM}, - {"SIMPLE-C", 1, ff_simple_idct, ff_ref_idct, NO_PERM}, + {"FAANI", ff_faanidct, ff_ref_idct, NO_PERM}, + {"REF-DBL", ff_ref_idct, ff_ref_idct, NO_PERM}, + {"INT", j_rev_dct, ff_ref_idct, MMX_PERM}, + {"SIMPLE-C", ff_simple_idct, ff_ref_idct, NO_PERM}, #if HAVE_MMX #if CONFIG_GPL - {"LIBMPEG2-MMX", 1, ff_mmx_idct, ff_ref_idct, MMX_PERM, AV_CPU_FLAG_MMX}, - {"LIBMPEG2-MMX2", 1, ff_mmxext_idct, ff_ref_idct, MMX_PERM, AV_CPU_FLAG_MMX2}, + {"LIBMPEG2-MMX", ff_mmx_idct, ff_ref_idct, MMX_PERM, AV_CPU_FLAG_MMX}, + {"LIBMPEG2-MMX2", ff_mmxext_idct, ff_ref_idct, MMX_PERM, AV_CPU_FLAG_MMX2}, #endif - {"SIMPLE-MMX", 1, ff_simple_idct_mmx, ff_ref_idct, MMX_SIMPLE_PERM, AV_CPU_FLAG_MMX}, - {"XVID-MMX", 1, ff_idct_xvid_mmx, ff_ref_idct, NO_PERM, AV_CPU_FLAG_MMX}, - {"XVID-MMX2", 1, ff_idct_xvid_mmx2, ff_ref_idct, NO_PERM, AV_CPU_FLAG_MMX2}, - {"XVID-SSE2", 1, ff_idct_xvid_sse2, ff_ref_idct, SSE2_PERM, AV_CPU_FLAG_SSE2}, + {"SIMPLE-MMX", ff_simple_idct_mmx, ff_ref_idct, MMX_SIMPLE_PERM, AV_CPU_FLAG_MMX}, + {"XVID-MMX", ff_idct_xvid_mmx, ff_ref_idct, NO_PERM, AV_CPU_FLAG_MMX}, + {"XVID-MMX2", ff_idct_xvid_mmx2, ff_ref_idct, NO_PERM, AV_CPU_FLAG_MMX2}, + {"XVID-SSE2", ff_idct_xvid_sse2, ff_ref_idct, SSE2_PERM, AV_CPU_FLAG_SSE2}, #endif #if ARCH_BFIN - {"BFINidct", 1, ff_bfin_idct, ff_ref_idct, NO_PERM}, + {"BFINidct", ff_bfin_idct, ff_ref_idct, NO_PERM}, #endif #if ARCH_ARM - {"SIMPLE-ARM", 1, ff_simple_idct_arm, ff_ref_idct, NO_PERM }, - {"INT-ARM", 1, ff_j_rev_dct_arm, ff_ref_idct, MMX_PERM }, + {"SIMPLE-ARM", ff_simple_idct_arm, ff_ref_idct, NO_PERM }, + {"INT-ARM", ff_j_rev_dct_arm, ff_ref_idct, MMX_PERM }, #endif #if HAVE_ARMV5TE - {"SIMPLE-ARMV5TE", 1, ff_simple_idct_armv5te, ff_ref_idct, NO_PERM }, + {"SIMPLE-ARMV5TE", ff_simple_idct_armv5te, ff_ref_idct, NO_PERM }, #endif #if HAVE_ARMV6 - {"SIMPLE-ARMV6", 1, ff_simple_idct_armv6, ff_ref_idct, MMX_PERM }, + {"SIMPLE-ARMV6", ff_simple_idct_armv6, ff_ref_idct, MMX_PERM }, #endif #if HAVE_NEON - {"SIMPLE-NEON", 1, ff_simple_idct_neon, ff_ref_idct, PARTTRANS_PERM }, + {"SIMPLE-NEON", ff_simple_idct_neon, ff_ref_idct, PARTTRANS_PERM }, #endif #if ARCH_ALPHA - {"SIMPLE-ALPHA", 1, ff_simple_idct_axp, ff_ref_idct, NO_PERM }, + {"SIMPLE-ALPHA", ff_simple_idct_axp, ff_ref_idct, NO_PERM }, #endif { 0 } @@ -201,7 +200,7 @@ static inline void mmx_emms(void) #endif } -static void dct_error(const struct algo *dct, int test) +static void dct_error(const struct algo *dct, int test, int is_idct) { int it, i, scale; int err_inf, v; @@ -224,7 +223,7 @@ static void dct_error(const struct algo *dct, int test) case 0: for (i = 0; i < 64; i++) block1[i] = (av_lfg_get(&prng) % 512) - 256; - if (dct->is_idct) { + if (is_idct) { ff_ref_fdct(block1); for (i = 0; i < 64; i++) block1[i] >>= 3; @@ -300,7 +299,7 @@ static void dct_error(const struct algo *dct, int test) printf("\n"); printf("%s %s: err_inf=%d err2=%0.8f syserr=%0.8f maxout=%d blockSumErr=%d\n", - dct->is_idct ? "IDCT" : "DCT", dct->name, err_inf, + is_idct ? "IDCT" : "DCT", dct->name, err_inf, (double) err2 / NB_ITS / 64.0, (double) sysErrMax / NB_ITS, maxout, blockSumErrMax); @@ -312,7 +311,7 @@ static void dct_error(const struct algo *dct, int test) case 0: for (i = 0; i < 64; i++) block1[i] = av_lfg_get(&prng) % 512 - 256; - if (dct->is_idct) { + if (is_idct) { ff_ref_fdct(block1); for (i = 0; i < 64; i++) block1[i] >>= 3; @@ -351,7 +350,7 @@ static void dct_error(const struct algo *dct, int test) } while (ti1 < 1000000); mmx_emms(); - printf("%s %s: %0.1f kdct/s\n", dct->is_idct ? "IDCT" : "DCT", dct->name, + printf("%s %s: %0.1f kdct/s\n", is_idct ? "IDCT" : "DCT", dct->name, (double) it1 * 1000.0 / (double) ti1); } @@ -548,7 +547,7 @@ int main(int argc, char **argv) const struct algo *algos = test_idct ? idct_tab : fdct_tab; for (i = 0; algos[i].name; i++) if (!(~cpu_flags & algos[i].mm_support)) { - dct_error(&algos[i], test); + dct_error(&algos[i], test, test_idct); } } return 0; From 7fd2c138880c61b646090475c90a5607fcd7ddc8 Mon Sep 17 00:00:00 2001 From: Mans Rullgard Date: Sun, 3 Jul 2011 23:19:13 +0100 Subject: [PATCH 10/36] dct-test: make speed test optional Signed-off-by: Mans Rullgard --- libavcodec/dct-test.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/libavcodec/dct-test.c b/libavcodec/dct-test.c index 3c71993900..054d0f378d 100644 --- a/libavcodec/dct-test.c +++ b/libavcodec/dct-test.c @@ -200,7 +200,7 @@ static inline void mmx_emms(void) #endif } -static void dct_error(const struct algo *dct, int test, int is_idct) +static void dct_error(const struct algo *dct, int test, int is_idct, int speed) { int it, i, scale; int err_inf, v; @@ -303,6 +303,9 @@ static void dct_error(const struct algo *dct, int test, int is_idct) (double) err2 / NB_ITS / 64.0, (double) sysErrMax / NB_ITS, maxout, blockSumErrMax); + if (!speed) + return; + /* speed test */ for (i = 0; i < 64; i++) block1[i] = 0; @@ -439,7 +442,8 @@ static void idct248_ref(uint8_t *dest, int linesize, int16_t *block) static void idct248_error(const char *name, void (*idct248_put)(uint8_t *dest, int line_size, - int16_t *block)) + int16_t *block), + int speed) { int it, i, it1, ti, ti1, err_max, v; AVLFG prng; @@ -473,6 +477,9 @@ static void idct248_error(const char *name, } printf("%s %s: err_inf=%d\n", 1 ? "IDCT248" : "DCT248", name, err_max); + if (!speed) + return; + ti = gettime(); it1 = 0; do { @@ -497,7 +504,8 @@ static void help(void) " 1 -> test with random sparse matrixes\n" " 2 -> do 3. test from mpeg4 std\n" "-i test IDCT implementations\n" - "-4 test IDCT248 implementations\n"); + "-4 test IDCT248 implementations\n" + "-t speed test\n"); } int main(int argc, char **argv) @@ -505,6 +513,7 @@ int main(int argc, char **argv) int test_idct = 0, test_248_dct = 0; int c, i; int test = 1; + int speed = 0; cpu_flags = av_get_cpu_flags(); @@ -519,7 +528,7 @@ int main(int argc, char **argv) } for (;;) { - c = getopt(argc, argv, "ih4"); + c = getopt(argc, argv, "ih4t"); if (c == -1) break; switch (c) { @@ -529,6 +538,9 @@ int main(int argc, char **argv) case '4': test_248_dct = 1; break; + case 't': + speed = 1; + break; default: case 'h': help(); @@ -542,12 +554,12 @@ int main(int argc, char **argv) printf("ffmpeg DCT/IDCT test\n"); if (test_248_dct) { - idct248_error("SIMPLE-C", ff_simple_idct248_put); + idct248_error("SIMPLE-C", ff_simple_idct248_put, speed); } else { const struct algo *algos = test_idct ? idct_tab : fdct_tab; for (i = 0; algos[i].name; i++) if (!(~cpu_flags & algos[i].mm_support)) { - dct_error(&algos[i], test, test_idct); + dct_error(&algos[i], test, test_idct, speed); } } return 0; From 84757de0f5b32b2e7dab52b4409fcb99c3e8f65b Mon Sep 17 00:00:00 2001 From: Mans Rullgard Date: Mon, 4 Jul 2011 00:56:38 +0100 Subject: [PATCH 11/36] fate: add 'null' comparison method Setting CMP=null uses stdout from the test as the diff record in the report without further inspection. This can be useful when the exit status of the test itself determines success while the output is informative. Signed-off-by: Mans Rullgard --- tests/fate-run.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/fate-run.sh b/tests/fate-run.sh index 2c744b880f..10497c497e 100755 --- a/tests/fate-run.sh +++ b/tests/fate-run.sh @@ -123,6 +123,7 @@ if test -e "$ref"; then diff) diff -u -w "$ref" "$outfile" >$cmpfile ;; oneoff) oneoff "$ref" "$outfile" "$fuzz" >$cmpfile ;; stddev) stddev "$ref" "$outfile" "$fuzz" >$cmpfile ;; + null) cat "$outfile" >$cmpfile ;; esac cmperr=$? test $err = 0 && err=$cmperr From 6da812e4ee6d6620d3a77ca1ac47a32161ba5aab Mon Sep 17 00:00:00 2001 From: Mans Rullgard Date: Sun, 3 Jul 2011 19:34:10 +0100 Subject: [PATCH 12/36] eval: make timing optional in test program Signed-off-by: Mans Rullgard --- libavutil/eval.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/libavutil/eval.c b/libavutil/eval.c index 4bba343bec..8ce687df19 100644 --- a/libavutil/eval.c +++ b/libavutil/eval.c @@ -533,6 +533,8 @@ int av_expr_parse_and_eval(double *d, const char *s, #ifdef TEST #undef printf +#include + static double const_values[] = { M_PI, M_E, @@ -545,7 +547,7 @@ static const char *const_names[] = { 0 }; -int main(void) +int main(int argc, char **argv) { int i; double d; @@ -617,13 +619,16 @@ int main(void) NULL, NULL, NULL, NULL, NULL, 0, NULL); printf("%f == 0.931322575\n", d); - for (i=0; i<1050; i++) { - START_TIMER + if (argc > 1 && !strcmp(argv[1], "-t")) { + for (i = 0; i < 1050; i++) { + START_TIMER; av_expr_parse_and_eval(&d, "1+(5-2)^(3-1)+1/2+sin(PI)-max(-2.2,-3.1)", const_names, const_values, NULL, NULL, NULL, NULL, NULL, 0, NULL); - STOP_TIMER("av_expr_parse_and_eval") + STOP_TIMER("av_expr_parse_and_eval"); + } } + return 0; } #endif From 883fd9e393cea378bda99ddc6ee5d5ef2141a9f8 Mon Sep 17 00:00:00 2001 From: Mans Rullgard Date: Sun, 3 Jul 2011 19:35:30 +0100 Subject: [PATCH 13/36] eval: add fate test Signed-off-by: Mans Rullgard --- tests/fate/libavutil.mak | 4 ++ tests/ref/fate/eval | 134 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 138 insertions(+) create mode 100644 tests/ref/fate/eval diff --git a/tests/fate/libavutil.mak b/tests/fate/libavutil.mak index d83ced8a98..4299f081ac 100644 --- a/tests/fate/libavutil.mak +++ b/tests/fate/libavutil.mak @@ -21,6 +21,10 @@ fate-des: libavutil/des-test$(EXESUF) fate-des: CMD = run libavutil/des-test fate-des: REF = /dev/null +FATE_TESTS += fate-eval +fate-eval: libavutil/eval-test$(EXESUF) +fate-eval: CMD = run libavutil/eval-test + FATE_TESTS += fate-md5 fate-md5: libavutil/md5-test$(EXESUF) fate-md5: CMD = run libavutil/md5-test diff --git a/tests/ref/fate/eval b/tests/ref/fate/eval new file mode 100644 index 0000000000..bcc1a505b0 --- /dev/null +++ b/tests/ref/fate/eval @@ -0,0 +1,134 @@ +Evaluating '' +'' -> nan + +Evaluating '1;2' +'1;2' -> 2.000000 + +Evaluating '-20' +'-20' -> -20.000000 + +Evaluating '-PI' +'-PI' -> -3.141593 + +Evaluating '+PI' +'+PI' -> 3.141593 + +Evaluating '1+(5-2)^(3-1)+1/2+sin(PI)-max(-2.2,-3.1)' +'1+(5-2)^(3-1)+1/2+sin(PI)-max(-2.2,-3.1)' -> 12.700000 + +Evaluating '80G/80Gi1k' +'80G/80Gi1k' -> nan + +Evaluating '1Gi' +'1Gi' -> 1073741824.000000 + +Evaluating '1gi' +'1gi' -> nan + +Evaluating '1GiFoo' +'1GiFoo' -> nan + +Evaluating '1k+1k' +'1k+1k' -> 2000.000000 + +Evaluating '1Gi*3foo' +'1Gi*3foo' -> nan + +Evaluating 'foo' +'foo' -> nan + +Evaluating 'foo(' +'foo(' -> nan + +Evaluating 'foo()' +'foo()' -> nan + +Evaluating 'foo)' +'foo)' -> nan + +Evaluating 'sin' +'sin' -> nan + +Evaluating 'sin(' +'sin(' -> nan + +Evaluating 'sin()' +'sin()' -> nan + +Evaluating 'sin)' +'sin)' -> nan + +Evaluating 'sin 10' +'sin 10' -> nan + +Evaluating 'sin(1,2,3)' +'sin(1,2,3)' -> nan + +Evaluating 'sin(1 )' +'sin(1 )' -> 0.841471 + +Evaluating '1' +'1' -> 1.000000 + +Evaluating '1foo' +'1foo' -> nan + +Evaluating 'bar + PI + E + 100f*2 + foo' +'bar + PI + E + 100f*2 + foo' -> nan + +Evaluating '13k + 12f - foo(1, 2)' +'13k + 12f - foo(1, 2)' -> nan + +Evaluating '1gi' +'1gi' -> nan + +Evaluating '1Gi' +'1Gi' -> 1073741824.000000 + +Evaluating 'st(0, 123)' +'st(0, 123)' -> 123.000000 + +Evaluating 'st(1, 123); ld(1)' +'st(1, 123); ld(1)' -> 123.000000 + +Evaluating 'st(0, 1); while(lte(ld(0), 100), st(1, ld(1)+ld(0));st(0, ld(0)+1)); ld(1)' +'st(0, 1); while(lte(ld(0), 100), st(1, ld(1)+ld(0));st(0, ld(0)+1)); ld(1)' -> 5073.000000 + +Evaluating 'st(1, 1); st(2, 2); st(0, 1); while(lte(ld(0),10), st(3, ld(1)+ld(2)); st(1, ld(2)); st(2, ld(3)); st(0, ld(0)+1)); ld(3)' +'st(1, 1); st(2, 2); st(0, 1); while(lte(ld(0),10), st(3, ld(1)+ld(2)); st(1, ld(2)); st(2, ld(3)); st(0, ld(0)+1)); ld(3)' -> 144.000000 + +Evaluating 'while(0, 10)' +'while(0, 10)' -> nan + +Evaluating 'st(0, 1); while(lte(ld(0),100), st(1, ld(1)+ld(0)); st(0, ld(0)+1))' +'st(0, 1); while(lte(ld(0),100), st(1, ld(1)+ld(0)); st(0, ld(0)+1))' -> 100.000000 + +Evaluating 'isnan(1)' +'isnan(1)' -> 0.000000 + +Evaluating 'isnan(NAN)' +'isnan(NAN)' -> 1.000000 + +Evaluating 'floor(NAN)' +'floor(NAN)' -> nan + +Evaluating 'floor(123.123)' +'floor(123.123)' -> 123.000000 + +Evaluating 'floor(-123.123)' +'floor(-123.123)' -> -124.000000 + +Evaluating 'trunc(123.123)' +'trunc(123.123)' -> 123.000000 + +Evaluating 'trunc(-123.123)' +'trunc(-123.123)' -> -123.000000 + +Evaluating 'ceil(123.123)' +'ceil(123.123)' -> 124.000000 + +Evaluating 'ceil(-123.123)' +'ceil(-123.123)' -> -123.000000 + +12.700000 == 12.7 +0.931323 == 0.931322575 From dbf396d497e6d6f14b838092ed4ba4283a9505a0 Mon Sep 17 00:00:00 2001 From: Mans Rullgard Date: Mon, 4 Jul 2011 00:53:39 +0100 Subject: [PATCH 14/36] dct-test: exit with non-zero status if an IDCT fails IDCTs are partially evaluated according to IEEE 1180-1990 (more or less). An override is added to the table for implementations known to not meet the spec requirements. These variants are run but not checked for accuracy. Signed-off-by: Mans Rullgard --- libavcodec/dct-test.c | 43 ++++++++++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/libavcodec/dct-test.c b/libavcodec/dct-test.c index 054d0f378d..cd68d48ebc 100644 --- a/libavcodec/dct-test.c +++ b/libavcodec/dct-test.c @@ -74,6 +74,7 @@ struct algo { enum formattag { NO_PERM, MMX_PERM, MMX_SIMPLE_PERM, SCALE_PERM, SSE2_PERM, PARTTRANS_PERM } format; int mm_support; + int nonspec; }; #ifndef FAAN_POSTSCALE @@ -115,13 +116,13 @@ static const struct algo idct_tab[] = { #if HAVE_MMX #if CONFIG_GPL - {"LIBMPEG2-MMX", ff_mmx_idct, ff_ref_idct, MMX_PERM, AV_CPU_FLAG_MMX}, - {"LIBMPEG2-MMX2", ff_mmxext_idct, ff_ref_idct, MMX_PERM, AV_CPU_FLAG_MMX2}, + {"LIBMPEG2-MMX", ff_mmx_idct, ff_ref_idct, MMX_PERM, AV_CPU_FLAG_MMX, 1}, + {"LIBMPEG2-MMX2", ff_mmxext_idct, ff_ref_idct, MMX_PERM, AV_CPU_FLAG_MMX2, 1}, #endif {"SIMPLE-MMX", ff_simple_idct_mmx, ff_ref_idct, MMX_SIMPLE_PERM, AV_CPU_FLAG_MMX}, - {"XVID-MMX", ff_idct_xvid_mmx, ff_ref_idct, NO_PERM, AV_CPU_FLAG_MMX}, - {"XVID-MMX2", ff_idct_xvid_mmx2, ff_ref_idct, NO_PERM, AV_CPU_FLAG_MMX2}, - {"XVID-SSE2", ff_idct_xvid_sse2, ff_ref_idct, SSE2_PERM, AV_CPU_FLAG_SSE2}, + {"XVID-MMX", ff_idct_xvid_mmx, ff_ref_idct, NO_PERM, AV_CPU_FLAG_MMX, 1}, + {"XVID-MMX2", ff_idct_xvid_mmx2, ff_ref_idct, NO_PERM, AV_CPU_FLAG_MMX2, 1}, + {"XVID-SSE2", ff_idct_xvid_sse2, ff_ref_idct, SSE2_PERM, AV_CPU_FLAG_SSE2, 1}, #endif #if ARCH_BFIN @@ -200,15 +201,17 @@ static inline void mmx_emms(void) #endif } -static void dct_error(const struct algo *dct, int test, int is_idct, int speed) +static int dct_error(const struct algo *dct, int test, int is_idct, int speed) { int it, i, scale; int err_inf, v; - int64_t err2, ti, ti1, it1; + int64_t err2, ti, ti1, it1, err_sum = 0; int64_t sysErr[64], sysErrMax = 0; int maxout = 0; int blockSumErrMax = 0, blockSumErr; AVLFG prng; + double omse, ome; + int spec_err; av_lfg_init(&prng, 1); @@ -276,7 +279,9 @@ static void dct_error(const struct algo *dct, int test, int is_idct, int speed) blockSumErr = 0; for (i = 0; i < 64; i++) { - v = abs(block[i] - block1[i]); + int err = block[i] - block1[i]; + err_sum += err; + v = abs(err); if (v > err_inf) err_inf = v; err2 += v * v; @@ -298,13 +303,21 @@ static void dct_error(const struct algo *dct, int test, int is_idct, int speed) } printf("\n"); - printf("%s %s: err_inf=%d err2=%0.8f syserr=%0.8f maxout=%d blockSumErr=%d\n", + omse = (double) err2 / NB_ITS / 64; + ome = (double) err_sum / NB_ITS / 64; + + spec_err = is_idct && (err_inf > 1 || omse > 0.02 || fabs(ome) > 0.0015); + + printf("%s %s: ppe=%d omse=%0.8f ome=%0.8f syserr=%0.8f maxout=%d blockSumErr=%d\n", is_idct ? "IDCT" : "DCT", dct->name, err_inf, - (double) err2 / NB_ITS / 64.0, (double) sysErrMax / NB_ITS, + omse, ome, (double) sysErrMax / NB_ITS, maxout, blockSumErrMax); + if (spec_err && !dct->nonspec) + return 1; + if (!speed) - return; + return 0; /* speed test */ for (i = 0; i < 64; i++) @@ -355,6 +368,8 @@ static void dct_error(const struct algo *dct, int test, int is_idct, int speed) printf("%s %s: %0.1f kdct/s\n", is_idct ? "IDCT" : "DCT", dct->name, (double) it1 * 1000.0 / (double) ti1); + + return 0; } DECLARE_ALIGNED(8, static uint8_t, img_dest)[64]; @@ -514,6 +529,7 @@ int main(int argc, char **argv) int c, i; int test = 1; int speed = 0; + int err = 0; cpu_flags = av_get_cpu_flags(); @@ -559,8 +575,9 @@ int main(int argc, char **argv) const struct algo *algos = test_idct ? idct_tab : fdct_tab; for (i = 0; algos[i].name; i++) if (!(~cpu_flags & algos[i].mm_support)) { - dct_error(&algos[i], test, test_idct, speed); + err |= dct_error(&algos[i], test, test_idct, speed); } } - return 0; + + return err; } From 27e714435043f52ef818642489c1fb698717496e Mon Sep 17 00:00:00 2001 From: Mans Rullgard Date: Mon, 4 Jul 2011 00:58:56 +0100 Subject: [PATCH 15/36] fate: add idct8x8 test This tests the IDCT implementations available in the build. Signed-off-by: Mans Rullgard --- tests/Makefile | 1 + tests/fate/dct.mak | 5 +++++ 2 files changed, 6 insertions(+) create mode 100644 tests/fate/dct.mak diff --git a/tests/Makefile b/tests/Makefile index f69acf7e23..431a404219 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -41,6 +41,7 @@ include $(SRC_PATH)/tests/fate/aac.mak include $(SRC_PATH)/tests/fate/als.mak include $(SRC_PATH)/tests/fate/amrnb.mak include $(SRC_PATH)/tests/fate/amrwb.mak +include $(SRC_PATH)/tests/fate/dct.mak include $(SRC_PATH)/tests/fate/fft.mak include $(SRC_PATH)/tests/fate/h264.mak include $(SRC_PATH)/tests/fate/libavutil.mak diff --git a/tests/fate/dct.mak b/tests/fate/dct.mak new file mode 100644 index 0000000000..8f2ab7a8e0 --- /dev/null +++ b/tests/fate/dct.mak @@ -0,0 +1,5 @@ +FATE_TESTS += fate-idct8x8 +fate-idct8x8: libavcodec/dct-test$(EXESUF) +fate-idct8x8: CMD = run libavcodec/dct-test -i +fate-idct8x8: REF = /dev/null +fate-idct8x8: CMP = null From 6c374bc0b40306c84e35a4002ab7fa96ace11c6c Mon Sep 17 00:00:00 2001 From: Christian Schmidt Date: Mon, 4 Jul 2011 10:41:04 +0100 Subject: [PATCH 16/36] libxvid: add missing include of libavutil/mathematics.h Signed-off-by: Mans Rullgard --- libavcodec/libxvidff.c | 1 + 1 file changed, 1 insertion(+) diff --git a/libavcodec/libxvidff.c b/libavcodec/libxvidff.c index 1e887a2a8c..fd0aea58fa 100644 --- a/libavcodec/libxvidff.c +++ b/libavcodec/libxvidff.c @@ -30,6 +30,7 @@ #include "avcodec.h" #include "libavutil/cpu.h" #include "libavutil/intreadwrite.h" +#include "libavutil/mathematics.h" #include "libxvid_internal.h" #if !HAVE_MKSTEMP #include From d04d9f24a0f1ff5d903a8222f6933a7482ddde19 Mon Sep 17 00:00:00 2001 From: Mans Rullgard Date: Sun, 3 Jul 2011 19:13:20 +0100 Subject: [PATCH 17/36] aes: allow unaligned input and output buffers Signed-off-by: Mans Rullgard --- libavutil/aes.c | 41 ++++++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/libavutil/aes.c b/libavutil/aes.c index d1fe857914..ace317f38a 100644 --- a/libavutil/aes.c +++ b/libavutil/aes.c @@ -22,6 +22,7 @@ #include "common.h" #include "aes.h" +#include "intreadwrite.h" typedef union { uint64_t u64[2]; @@ -67,6 +68,20 @@ static inline void addkey(av_aes_block *dst, const av_aes_block *src, dst->u64[1] = src->u64[1] ^ round_key->u64[1]; } +static inline void addkey_s(av_aes_block *dst, const uint8_t *src, + const av_aes_block *round_key) +{ + dst->u64[0] = AV_RN64(src) ^ round_key->u64[0]; + dst->u64[1] = AV_RN64(src + 8) ^ round_key->u64[1]; +} + +static inline void addkey_d(uint8_t *dst, const av_aes_block *src, + const av_aes_block *round_key) +{ + AV_WN64(dst, src->u64[0] ^ round_key->u64[0]); + AV_WN64(dst + 8, src->u64[1] ^ round_key->u64[1]); +} + static void subshift(av_aes_block s0[2], int s, const uint8_t *box) { av_aes_block *s1 = (av_aes_block *) (s0[0].u8 - s); @@ -119,32 +134,28 @@ static inline void crypt(AVAES *a, int s, const uint8_t *sbox, subshift(&a->state[0], s, sbox); } -void av_aes_crypt(AVAES *a, uint8_t *dst_, const uint8_t *src_, - int count, uint8_t *iv_, int decrypt) +void av_aes_crypt(AVAES *a, uint8_t *dst, const uint8_t *src, + int count, uint8_t *iv, int decrypt) { - av_aes_block *dst = (av_aes_block *) dst_; - const av_aes_block *src = (const av_aes_block *) src_; - av_aes_block *iv = (av_aes_block *) iv_; - while (count--) { - addkey(&a->state[1], src, &a->round_key[a->rounds]); + addkey_s(&a->state[1], src, &a->round_key[a->rounds]); if (decrypt) { crypt(a, 0, inv_sbox, dec_multbl); if (iv) { - addkey(&a->state[0], &a->state[0], iv); - *iv = *src; + addkey_s(&a->state[0], iv, &a->state[0]); + memcpy(iv, src, 16); } - addkey(dst, &a->state[0], &a->round_key[0]); + addkey_d(dst, &a->state[0], &a->round_key[0]); } else { if (iv) - addkey(&a->state[1], &a->state[1], iv); + addkey_s(&a->state[1], iv, &a->state[1]); crypt(a, 2, sbox, enc_multbl); - addkey(dst, &a->state[0], &a->round_key[0]); + addkey_d(dst, &a->state[0], &a->round_key[0]); if (iv) - *iv = *dst; + memcpy(iv, dst, 16); } - src++; - dst++; + src += 16; + dst += 16; } } From 9e52a40695609259d1f2fe1d9381ea45f9824272 Mon Sep 17 00:00:00 2001 From: Mans Rullgard Date: Sun, 3 Jul 2011 19:14:01 +0100 Subject: [PATCH 18/36] des: allow unaligned input and output buffers Signed-off-by: Mans Rullgard --- libavutil/des.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libavutil/des.c b/libavutil/des.c index 5de816387f..db2227b6ec 100644 --- a/libavutil/des.c +++ b/libavutil/des.c @@ -299,10 +299,10 @@ int av_des_init(AVDES *d, const uint8_t *key, int key_bits, int decrypt) { } void av_des_crypt(AVDES *d, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt) { - uint64_t iv_val = iv ? av_be2ne64(*(uint64_t *)iv) : 0; + uint64_t iv_val = iv ? AV_RB64(iv) : 0; while (count-- > 0) { uint64_t dst_val; - uint64_t src_val = src ? av_be2ne64(*(const uint64_t *)src) : 0; + uint64_t src_val = src ? AV_RB64(src) : 0; if (decrypt) { uint64_t tmp = src_val; if (d->triple_des) { @@ -319,12 +319,12 @@ void av_des_crypt(AVDES *d, uint8_t *dst, const uint8_t *src, int count, uint8_t } iv_val = iv ? dst_val : 0; } - *(uint64_t *)dst = av_be2ne64(dst_val); + AV_WB64(dst, dst_val); src += 8; dst += 8; } if (iv) - *(uint64_t *)iv = av_be2ne64(iv_val); + AV_WB64(iv, iv_val); } #ifdef TEST From 3e2aa268f652be8828b6351f54d41914c1ec3dae Mon Sep 17 00:00:00 2001 From: Kostya Shishkov Date: Mon, 4 Jul 2011 11:57:46 +0200 Subject: [PATCH 19/36] sha: use AV_RB32() instead of assuming buffer can be cast to uint32_t* Signed-off-by: Mans Rullgard --- libavutil/sha.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libavutil/sha.c b/libavutil/sha.c index ae6069dd34..5af742dc48 100644 --- a/libavutil/sha.c +++ b/libavutil/sha.c @@ -42,7 +42,7 @@ const int av_sha_size = sizeof(AVSHA); #define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits)))) /* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */ -#define blk0(i) (block[i] = av_be2ne32(((const uint32_t*)buffer)[i])) +#define blk0(i) (block[i] = AV_RB32(buffer + 4 * (i))) #define blk(i) (block[i] = rol(block[i-3] ^ block[i-8] ^ block[i-14] ^ block[i-16], 1)) #define R0(v,w,x,y,z,i) z += ((w&(x^y))^y) + blk0(i) + 0x5A827999 + rol(v, 5); w = rol(w, 30); @@ -67,7 +67,7 @@ static void sha1_transform(uint32_t state[5], const uint8_t buffer[64]) for (i = 0; i < 80; i++) { int t; if (i < 16) - t = av_be2ne32(((uint32_t*)buffer)[i]); + t = AV_RB32(buffer + 4 * i); else t = rol(block[i-3] ^ block[i-8] ^ block[i-14] ^ block[i-16], 1); block[i] = t; From 3c432e1186443fae474fa4e8613fbc21fd8a6c63 Mon Sep 17 00:00:00 2001 From: Diego Biurrun Date: Sun, 3 Jul 2011 16:09:37 +0200 Subject: [PATCH 20/36] doxygen: Fix documentation for some VP8 functions. --- libavcodec/vp8.c | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/libavcodec/vp8.c b/libavcodec/vp8.c index fdf63f095d..e8d3621ea7 100644 --- a/libavcodec/vp8.c +++ b/libavcodec/vp8.c @@ -641,8 +641,6 @@ void decode_mb_mode(VP8Context *s, VP8Macroblock *mb, int mb_x, int mb_y, uint8_ * @param block destination for block coefficients * @param probs probabilities to use when reading trees from the bitstream * @param i initial coeff index, 0 unless a separate DC block is coded - * @param zero_nhood the initial prediction context for number of surrounding - * all-zero blocks (only left/top, so 0-2) * @param qmul array holding the dc/ac dequant factor at position 0/1 * @return 0 if no coeffs were decoded * otherwise, the index of the last coeff decoded plus one @@ -701,6 +699,17 @@ skip_eob: } #endif +/** + * @param c arithmetic bitstream reader context + * @param block destination for block coefficients + * @param probs probabilities to use when reading trees from the bitstream + * @param i initial coeff index, 0 unless a separate DC block is coded + * @param zero_nhood the initial prediction context for number of surrounding + * all-zero blocks (only left/top, so 0-2) + * @param qmul array holding the dc/ac dequant factor at position 0/1 + * @return 0 if no coeffs were decoded + * otherwise, the index of the last coeff decoded plus one + */ static av_always_inline int decode_block_coeffs(VP56RangeCoder *c, DCTELEM block[16], uint8_t probs[16][3][NUM_DCT_TOKENS-1], @@ -1034,10 +1043,9 @@ static const uint8_t subpel_idx[3][8] = { }; /** - * Generic MC function. + * luma MC function * * @param s VP8 decoding context - * @param luma 1 for luma (Y) planes, 0 for chroma (Cb/Cr) planes * @param dst target buffer for block data at block position * @param ref reference picture buffer at origin (0, 0) * @param mv motion vector (relative to block position) to get pixel data from @@ -1083,6 +1091,23 @@ void vp8_mc_luma(VP8Context *s, uint8_t *dst, AVFrame *ref, const VP56mv *mv, } } +/** + * chroma MC function + * + * @param s VP8 decoding context + * @param dst1 target buffer for block data at block position (U plane) + * @param dst2 target buffer for block data at block position (V plane) + * @param ref reference picture buffer at origin (0, 0) + * @param mv motion vector (relative to block position) to get pixel data from + * @param x_off horizontal position of block from origin (0, 0) + * @param y_off vertical position of block from origin (0, 0) + * @param block_w width of block (16, 8 or 4) + * @param block_h height of block (always same as block_w) + * @param width width of src/dst plane data + * @param height height of src/dst plane data + * @param linesize size of a single line of plane data, including padding + * @param mc_func motion compensation function pointers (bilinear or sixtap MC) + */ static av_always_inline void vp8_mc_chroma(VP8Context *s, uint8_t *dst1, uint8_t *dst2, AVFrame *ref, const VP56mv *mv, int x_off, int y_off, From 19b6127365ca12c9bbed2b90a250c4860257166d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20B=C5=93sch?= Date: Mon, 4 Jul 2011 10:19:47 +0200 Subject: [PATCH 21/36] mxfenc: small typo fix Signed-off-by: Diego Biurrun --- libavformat/mxfenc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavformat/mxfenc.c b/libavformat/mxfenc.c index c448e14b00..c87f2334ba 100644 --- a/libavformat/mxfenc.c +++ b/libavformat/mxfenc.c @@ -1549,7 +1549,7 @@ static uint32_t ff_framenum_to_12m_time_code(unsigned frame, int drop, int fps) ((((frame / (fps * 60)) % 60) / 10) << 12) | // tens of minutes ((((frame / (fps * 60)) % 60) % 10) << 8) | // units of minutes (0 << 7) | // b1 - (0 << 6) | // b2 (NSC), field phase (PAL) + (0 << 6) | // b2 (NTSC), field phase (PAL) ((((frame / (fps * 3600) % 24)) / 10) << 4) | // tens of hours ( (frame / (fps * 3600) % 24)) % 10; // units of hours } From e3759c567db42c8dff255ef9f7258326da470755 Mon Sep 17 00:00:00 2001 From: Diego Biurrun Date: Sun, 3 Jul 2011 19:40:34 +0200 Subject: [PATCH 22/36] Add LGPL license boilerplate to files lacking it. --- libavcodec/high_bit_depth.h | 18 ++++++++++++++++++ libavcodec/opt.h | 18 ++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/libavcodec/high_bit_depth.h b/libavcodec/high_bit_depth.h index 511cd00f3a..c0a6eafe89 100644 --- a/libavcodec/high_bit_depth.h +++ b/libavcodec/high_bit_depth.h @@ -1,3 +1,21 @@ +/* + * 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 "dsputil.h" #ifndef BIT_DEPTH diff --git a/libavcodec/opt.h b/libavcodec/opt.h index 70de27d192..2380e74332 100644 --- a/libavcodec/opt.h +++ b/libavcodec/opt.h @@ -1,3 +1,21 @@ +/* + * 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 + */ + /** * @file * This header is provided for compatibility only and will be removed From 0a94020b5b073d1abf442e28b6db3be785aa680a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Reimar=20D=C3=B6ffinger?= Date: Mon, 4 Jul 2011 02:57:47 +0200 Subject: [PATCH 23/36] oggdec: Abort Ogg header parsing when encountering a data packet. Fixes Bugzilla #11. Signed-off-by: Diego Biurrun --- libavformat/oggdec.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/libavformat/oggdec.c b/libavformat/oggdec.c index 998a33b43c..49f24e9b9b 100644 --- a/libavformat/oggdec.c +++ b/libavformat/oggdec.c @@ -373,8 +373,7 @@ static int ogg_packet(AVFormatContext *s, int *str, int *dstart, int *dsize, // We have reached the first non-header packet in this stream. // Unfortunately more header packets may still follow for others, - // so we reset this later unless we are done with the headers - // for all streams. + // but if we continue with header parsing we may lose data packets. ogg->headers = 1; // Update the header state for all streams and @@ -383,8 +382,6 @@ static int ogg_packet(AVFormatContext *s, int *str, int *dstart, int *dsize, s->data_offset = os->sync_pos; for (i = 0; i < ogg->nstreams; i++) { struct ogg_stream *cur_os = ogg->streams + i; - if (cur_os->header > 0) - ogg->headers = 0; // if we have a partial non-header packet, its start is // obviously at or after the data start From db54be09c20917081031c73816bfa79c08a1cd5b Mon Sep 17 00:00:00 2001 From: Diego Biurrun Date: Thu, 30 Jun 2011 13:46:58 +0200 Subject: [PATCH 24/36] build: Remove deleted 'check' target from .PHONY list. --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 2cb5f65c6f..9f7b4361d4 100644 --- a/Makefile +++ b/Makefile @@ -199,5 +199,5 @@ $(sort $(OBJDIRS)): # so this saves some time on slow systems. .SUFFIXES: -.PHONY: all all-yes alltools *clean check config examples install* +.PHONY: all all-yes alltools *clean config examples install* .PHONY: testprogs uninstall* From 74965f2644e3af4d21a1d52841b5b48b2bc0895b Mon Sep 17 00:00:00 2001 From: Mans Rullgard Date: Mon, 4 Jul 2011 11:54:22 +0100 Subject: [PATCH 25/36] dct-test: remove 'ref' function pointer from tables The reference function can be inferred from the direction of the transform, no need for storing it with each entry. Signed-off-by: Mans Rullgard --- libavcodec/dct-test.c | 56 +++++++++++++++++++++---------------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/libavcodec/dct-test.c b/libavcodec/dct-test.c index cd68d48ebc..689aef8fa9 100644 --- a/libavcodec/dct-test.c +++ b/libavcodec/dct-test.c @@ -70,7 +70,6 @@ void ff_simple_idct_axp(DCTELEM *data); struct algo { const char *name; void (*func)(DCTELEM *block); - void (*ref) (DCTELEM *block); enum formattag { NO_PERM, MMX_PERM, MMX_SIMPLE_PERM, SCALE_PERM, SSE2_PERM, PARTTRANS_PERM } format; int mm_support; @@ -86,65 +85,65 @@ struct algo { static int cpu_flags; static const struct algo fdct_tab[] = { - {"REF-DBL", ff_ref_fdct, ff_ref_fdct, NO_PERM}, - {"FAAN", ff_faandct, ff_ref_fdct, FAAN_SCALE}, - {"IJG-AAN-INT", fdct_ifast, ff_ref_fdct, SCALE_PERM}, - {"IJG-LLM-INT", ff_jpeg_fdct_islow, ff_ref_fdct, NO_PERM}, + { "REF-DBL", ff_ref_fdct, NO_PERM }, + { "FAAN", ff_faandct, FAAN_SCALE }, + { "IJG-AAN-INT", fdct_ifast, SCALE_PERM }, + { "IJG-LLM-INT", ff_jpeg_fdct_islow, NO_PERM }, #if HAVE_MMX - {"MMX", ff_fdct_mmx, ff_ref_fdct, NO_PERM, AV_CPU_FLAG_MMX}, - {"MMX2", ff_fdct_mmx2, ff_ref_fdct, NO_PERM, AV_CPU_FLAG_MMX2}, - {"SSE2", ff_fdct_sse2, ff_ref_fdct, NO_PERM, AV_CPU_FLAG_SSE2}, + { "MMX", ff_fdct_mmx, NO_PERM, AV_CPU_FLAG_MMX }, + { "MMX2", ff_fdct_mmx2, NO_PERM, AV_CPU_FLAG_MMX2 }, + { "SSE2", ff_fdct_sse2, NO_PERM, AV_CPU_FLAG_SSE2 }, #endif #if HAVE_ALTIVEC - {"altivecfdct", fdct_altivec, ff_ref_fdct, NO_PERM, AV_CPU_FLAG_ALTIVEC}, + { "altivecfdct", fdct_altivec, NO_PERM, AV_CPU_FLAG_ALTIVEC }, #endif #if ARCH_BFIN - {"BFINfdct", ff_bfin_fdct, ff_ref_fdct, NO_PERM}, + { "BFINfdct", ff_bfin_fdct, NO_PERM }, #endif { 0 } }; static const struct algo idct_tab[] = { - {"FAANI", ff_faanidct, ff_ref_idct, NO_PERM}, - {"REF-DBL", ff_ref_idct, ff_ref_idct, NO_PERM}, - {"INT", j_rev_dct, ff_ref_idct, MMX_PERM}, - {"SIMPLE-C", ff_simple_idct, ff_ref_idct, NO_PERM}, + { "FAANI", ff_faanidct, NO_PERM }, + { "REF-DBL", ff_ref_idct, NO_PERM }, + { "INT", j_rev_dct, MMX_PERM }, + { "SIMPLE-C", ff_simple_idct, NO_PERM }, #if HAVE_MMX #if CONFIG_GPL - {"LIBMPEG2-MMX", ff_mmx_idct, ff_ref_idct, MMX_PERM, AV_CPU_FLAG_MMX, 1}, - {"LIBMPEG2-MMX2", ff_mmxext_idct, ff_ref_idct, MMX_PERM, AV_CPU_FLAG_MMX2, 1}, + { "LIBMPEG2-MMX", ff_mmx_idct, MMX_PERM, AV_CPU_FLAG_MMX, 1 }, + { "LIBMPEG2-MMX2", ff_mmxext_idct, MMX_PERM, AV_CPU_FLAG_MMX2, 1 }, #endif - {"SIMPLE-MMX", ff_simple_idct_mmx, ff_ref_idct, MMX_SIMPLE_PERM, AV_CPU_FLAG_MMX}, - {"XVID-MMX", ff_idct_xvid_mmx, ff_ref_idct, NO_PERM, AV_CPU_FLAG_MMX, 1}, - {"XVID-MMX2", ff_idct_xvid_mmx2, ff_ref_idct, NO_PERM, AV_CPU_FLAG_MMX2, 1}, - {"XVID-SSE2", ff_idct_xvid_sse2, ff_ref_idct, SSE2_PERM, AV_CPU_FLAG_SSE2, 1}, + { "SIMPLE-MMX", ff_simple_idct_mmx, MMX_SIMPLE_PERM, AV_CPU_FLAG_MMX }, + { "XVID-MMX", ff_idct_xvid_mmx, NO_PERM, AV_CPU_FLAG_MMX, 1 }, + { "XVID-MMX2", ff_idct_xvid_mmx2, NO_PERM, AV_CPU_FLAG_MMX2, 1 }, + { "XVID-SSE2", ff_idct_xvid_sse2, SSE2_PERM, AV_CPU_FLAG_SSE2, 1 }, #endif #if ARCH_BFIN - {"BFINidct", ff_bfin_idct, ff_ref_idct, NO_PERM}, + { "BFINidct", ff_bfin_idct, NO_PERM }, #endif #if ARCH_ARM - {"SIMPLE-ARM", ff_simple_idct_arm, ff_ref_idct, NO_PERM }, - {"INT-ARM", ff_j_rev_dct_arm, ff_ref_idct, MMX_PERM }, + { "SIMPLE-ARM", ff_simple_idct_arm, NO_PERM }, + { "INT-ARM", ff_j_rev_dct_arm, MMX_PERM }, #endif #if HAVE_ARMV5TE - {"SIMPLE-ARMV5TE", ff_simple_idct_armv5te, ff_ref_idct, NO_PERM }, + { "SIMPLE-ARMV5TE", ff_simple_idct_armv5te,NO_PERM }, #endif #if HAVE_ARMV6 - {"SIMPLE-ARMV6", ff_simple_idct_armv6, ff_ref_idct, MMX_PERM }, + { "SIMPLE-ARMV6", ff_simple_idct_armv6, MMX_PERM }, #endif #if HAVE_NEON - {"SIMPLE-NEON", ff_simple_idct_neon, ff_ref_idct, PARTTRANS_PERM }, + { "SIMPLE-NEON", ff_simple_idct_neon, PARTTRANS_PERM }, #endif #if ARCH_ALPHA - {"SIMPLE-ALPHA", ff_simple_idct_axp, ff_ref_idct, NO_PERM }, + { "SIMPLE-ALPHA", ff_simple_idct_axp, NO_PERM }, #endif { 0 } @@ -203,6 +202,7 @@ static inline void mmx_emms(void) static int dct_error(const struct algo *dct, int test, int is_idct, int speed) { + void (*ref)(DCTELEM *block) = is_idct ? ff_ref_idct : ff_ref_fdct; int it, i, scale; int err_inf, v; int64_t err2, ti, ti1, it1, err_sum = 0; @@ -275,7 +275,7 @@ static int dct_error(const struct algo *dct, int test, int is_idct, int speed) } } - dct->ref(block1); + ref(block1); blockSumErr = 0; for (i = 0; i < 64; i++) { From 94350ab986dfce1c93fa720baf28b548c60a9879 Mon Sep 17 00:00:00 2001 From: Mans Rullgard Date: Mon, 4 Jul 2011 12:26:59 +0100 Subject: [PATCH 26/36] eval: clear Parser instances before using This prevents random values from the stack being used as "variables" in expressions. Signed-off-by: Mans Rullgard --- libavutil/eval.c | 4 ++-- tests/ref/fate/eval | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libavutil/eval.c b/libavutil/eval.c index 8ce687df19..4d55f42664 100644 --- a/libavutil/eval.c +++ b/libavutil/eval.c @@ -461,7 +461,7 @@ int av_expr_parse(AVExpr **expr, const char *s, const char * const *func2_names, double (* const *funcs2)(void *, double, double), int log_offset, void *log_ctx) { - Parser p; + Parser p = { 0 }; AVExpr *e = NULL; char *w = av_malloc(strlen(s) + 1); char *wp = w; @@ -506,7 +506,7 @@ end: double av_expr_eval(AVExpr *e, const double *const_values, void *opaque) { - Parser p; + Parser p = { 0 }; p.const_values = const_values; p.opaque = opaque; diff --git a/tests/ref/fate/eval b/tests/ref/fate/eval index bcc1a505b0..fb7a925b77 100644 --- a/tests/ref/fate/eval +++ b/tests/ref/fate/eval @@ -92,7 +92,7 @@ Evaluating 'st(1, 123); ld(1)' 'st(1, 123); ld(1)' -> 123.000000 Evaluating 'st(0, 1); while(lte(ld(0), 100), st(1, ld(1)+ld(0));st(0, ld(0)+1)); ld(1)' -'st(0, 1); while(lte(ld(0), 100), st(1, ld(1)+ld(0));st(0, ld(0)+1)); ld(1)' -> 5073.000000 +'st(0, 1); while(lte(ld(0), 100), st(1, ld(1)+ld(0));st(0, ld(0)+1)); ld(1)' -> 4950.000000 Evaluating 'st(1, 1); st(2, 2); st(0, 1); while(lte(ld(0),10), st(3, ld(1)+ld(2)); st(1, ld(2)); st(2, ld(3)); st(0, ld(0)+1)); ld(3)' 'st(1, 1); st(2, 2); st(0, 1); while(lte(ld(0),10), st(3, ld(1)+ld(2)); st(1, ld(2)); st(2, ld(3)); st(0, ld(0)+1)); ld(3)' -> 144.000000 From e589e4b82de49526e5d900fdda5b8321727be004 Mon Sep 17 00:00:00 2001 From: Diego Biurrun Date: Sun, 3 Jul 2011 16:58:55 +0200 Subject: [PATCH 27/36] Remove unused static tables and static inline functions. --- libavcodec/rv34.c | 20 -------------------- libavcodec/vc1dec.c | 1 - libswscale/swscale.c | 11 ----------- 3 files changed, 32 deletions(-) diff --git a/libavcodec/rv34.c b/libavcodec/rv34.c index c5dcfdcba4..98607ea7ff 100644 --- a/libavcodec/rv34.c +++ b/libavcodec/rv34.c @@ -423,17 +423,6 @@ static inline RV34VLC* choose_vlc_set(int quant, int mod, int type) : &intra_vlcs[rv34_quant_to_vlc_set[0][av_clip(quant, 0, 30)]]; } -/** - * Decode quantizer difference and return modified quantizer. - */ -static inline int rv34_decode_dquant(GetBitContext *gb, int quant) -{ - if(get_bits1(gb)) - return rv34_dquant_tab[get_bits1(gb)][quant]; - else - return get_bits(gb, 5); -} - /** * Decode macroblock header and return CBP in case of success, -1 otherwise. */ @@ -1255,15 +1244,6 @@ static int check_slice_end(RV34DecContext *r, MpegEncContext *s) return 0; } -static inline int slice_compare(SliceInfo *si1, SliceInfo *si2) -{ - return si1->type != si2->type || - si1->start >= si2->start || - si1->width != si2->width || - si1->height != si2->height|| - si1->pts != si2->pts; -} - static int rv34_decode_slice(RV34DecContext *r, int end, const uint8_t* buf, int buf_size) { MpegEncContext *s = &r->s; diff --git a/libavcodec/vc1dec.c b/libavcodec/vc1dec.c index 8fca2da738..cf828dd1f0 100644 --- a/libavcodec/vc1dec.c +++ b/libavcodec/vc1dec.c @@ -45,7 +45,6 @@ #define MB_INTRA_VLC_BITS 9 #define DC_VLC_BITS 9 #define AC_VLC_BITS 9 -static const uint16_t table_mb_intra[64][2]; static const uint16_t vlc_offs[] = { diff --git a/libswscale/swscale.c b/libswscale/swscale.c index dacf40ed8a..14807fdc46 100644 --- a/libswscale/swscale.c +++ b/libswscale/swscale.c @@ -80,17 +80,6 @@ untested special converters #define RV ( (int)(0.500*224/255*(1< Date: Mon, 4 Jul 2011 06:05:34 -0700 Subject: [PATCH 28/36] H.264: fix overreads of qscale_table filter_mb_fast assumed that qscale_table was padded like many of the other tables. --- libavcodec/mpegvideo.c | 5 +++-- libavcodec/mpegvideo.h | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index 4978d28b49..ceed41f230 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -285,9 +285,10 @@ int ff_alloc_picture(MpegEncContext *s, Picture *pic, int shared){ } FF_ALLOCZ_OR_GOTO(s->avctx, pic->mbskip_table , mb_array_size * sizeof(uint8_t)+2, fail) //the +2 is for the slice end check - FF_ALLOCZ_OR_GOTO(s->avctx, pic->qscale_table , mb_array_size * sizeof(uint8_t) , fail) + FF_ALLOCZ_OR_GOTO(s->avctx, pic->qscale_table_base , (big_mb_num + s->mb_stride) * sizeof(uint8_t) , fail) FF_ALLOCZ_OR_GOTO(s->avctx, pic->mb_type_base , (big_mb_num + s->mb_stride) * sizeof(uint32_t), fail) pic->mb_type= pic->mb_type_base + 2*s->mb_stride+1; + pic->qscale_table = pic->qscale_table_base + 2*s->mb_stride + 1; if(s->out_format == FMT_H264){ for(i=0; i<2; i++){ FF_ALLOCZ_OR_GOTO(s->avctx, pic->motion_val_base[i], 2 * (b4_array_size+4) * sizeof(int16_t), fail) @@ -339,7 +340,7 @@ static void free_picture(MpegEncContext *s, Picture *pic){ av_freep(&pic->mc_mb_var); av_freep(&pic->mb_mean); av_freep(&pic->mbskip_table); - av_freep(&pic->qscale_table); + av_freep(&pic->qscale_table_base); av_freep(&pic->mb_type_base); av_freep(&pic->dct_coeff); av_freep(&pic->pan_scan); diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h index e072aa7c33..d309fcb83b 100644 --- a/libavcodec/mpegvideo.h +++ b/libavcodec/mpegvideo.h @@ -88,6 +88,7 @@ typedef struct Picture{ * halfpel luma planes. */ uint8_t *interpolated[3]; + int8_t *qscale_table_base; int16_t (*motion_val_base[2])[2]; uint32_t *mb_type_base; #define MB_TYPE_INTRA MB_TYPE_INTRA4x4 //default mb_type if there is just one type From 9cec1bbd1477b1e38907b37779ab9a7f5800eca2 Mon Sep 17 00:00:00 2001 From: Nicolas George Date: Fri, 24 Jun 2011 12:02:41 +0200 Subject: [PATCH 29/36] ogg: propagate return values and return more meaningful error values Signed-off-by: Diego Biurrun --- libavformat/oggdec.c | 59 +++++++++++++++++++++++++------------------- 1 file changed, 34 insertions(+), 25 deletions(-) diff --git a/libavformat/oggdec.c b/libavformat/oggdec.c index 49f24e9b9b..e33de7d978 100644 --- a/libavformat/oggdec.c +++ b/libavformat/oggdec.c @@ -192,7 +192,7 @@ static int ogg_read_page(AVFormatContext *s, int *str) AVIOContext *bc = s->pb; struct ogg *ogg = s->priv_data; struct ogg_stream *os; - int i = 0; + int ret, i = 0; int flags, nsegs; uint64_t gp; uint32_t serial; @@ -200,8 +200,9 @@ static int ogg_read_page(AVFormatContext *s, int *str) uint8_t sync[4]; int sp = 0; - if (avio_read (bc, sync, 4) < 4) - return -1; + ret = avio_read(bc, sync, 4); + if (ret < 4) + return ret < 0 ? ret : AVERROR_EOF; do{ int c; @@ -213,17 +214,17 @@ static int ogg_read_page(AVFormatContext *s, int *str) c = avio_r8(bc); if (bc->eof_reached) - return -1; + return AVERROR_EOF; sync[sp++ & 3] = c; }while (i++ < MAX_PAGE_SIZE); if (i >= MAX_PAGE_SIZE){ av_log (s, AV_LOG_INFO, "ogg, can't find sync word\n"); - return -1; + return AVERROR_INVALIDDATA; } if (avio_r8(bc) != 0) /* version */ - return -1; + return AVERROR_INVALIDDATA; flags = avio_r8(bc); gp = avio_rl64 (bc); @@ -248,7 +249,7 @@ static int ogg_read_page(AVFormatContext *s, int *str) idx = ogg_new_stream(s, serial, 1); } if (idx < 0) - return -1; + return idx; } os = ogg->streams + idx; @@ -257,8 +258,9 @@ static int ogg_read_page(AVFormatContext *s, int *str) if(os->psize > 0) ogg_new_buf(ogg, idx); - if (avio_read (bc, os->segments, nsegs) < nsegs) - return -1; + ret = avio_read(bc, os->segments, nsegs); + if (ret < nsegs) + return ret < 0 ? ret : AVERROR_EOF; os->nsegs = nsegs; os->segp = 0; @@ -289,8 +291,9 @@ static int ogg_read_page(AVFormatContext *s, int *str) os->buf = nb; } - if (avio_read (bc, os->buf + os->bufpos, size) < size) - return -1; + ret = avio_read(bc, os->buf + os->bufpos, size); + if (ret < size) + return ret < 0 ? ret : AVERROR_EOF; os->bufpos += size; os->granule = gp; @@ -306,7 +309,7 @@ static int ogg_packet(AVFormatContext *s, int *str, int *dstart, int *dsize, int64_t *fpos) { struct ogg *ogg = s->priv_data; - int idx, i; + int idx, i, ret; struct ogg_stream *os; int complete = 0; int segp = 0, psize = 0; @@ -317,8 +320,9 @@ static int ogg_packet(AVFormatContext *s, int *str, int *dstart, int *dsize, idx = ogg->curidx; while (idx < 0){ - if (ogg_read_page (s, &idx) < 0) - return -1; + ret = ogg_read_page(s, &idx); + if (ret < 0) + return ret; } os = ogg->streams + idx; @@ -330,6 +334,7 @@ static int ogg_packet(AVFormatContext *s, int *str, int *dstart, int *dsize, if (os->header < 0){ os->codec = ogg_find_codec (os->buf, os->bufpos); if (!os->codec){ + av_log(s, AV_LOG_WARNING, "Codec not found\n"); os->header = 0; return 0; } @@ -428,10 +433,12 @@ static int ogg_packet(AVFormatContext *s, int *str, int *dstart, int *dsize, static int ogg_get_headers(AVFormatContext *s) { struct ogg *ogg = s->priv_data; + int ret; do{ - if (ogg_packet (s, NULL, NULL, NULL, NULL) < 0) - return -1; + ret = ogg_packet(s, NULL, NULL, NULL, NULL); + if (ret < 0) + return ret; }while (!ogg->headers); av_dlog(s, "found headers\n"); @@ -478,12 +485,12 @@ static int ogg_get_length(AVFormatContext *s) static int ogg_read_header(AVFormatContext *s, AVFormatParameters *ap) { struct ogg *ogg = s->priv_data; - int i; + int ret, i; ogg->curidx = -1; //linear headers seek from start - if (ogg_get_headers (s) < 0){ - return -1; - } + ret = ogg_get_headers(s); + if (ret < 0) + return ret; for (i = 0; i < ogg->nstreams; i++) if (ogg->streams[i].header < 0) @@ -530,15 +537,16 @@ static int ogg_read_packet(AVFormatContext *s, AVPacket *pkt) { struct ogg *ogg; struct ogg_stream *os; - int idx = -1; + int idx = -1, ret; int pstart, psize; int64_t fpos, pts, dts; //Get an ogg packet retry: do{ - if (ogg_packet (s, &idx, &pstart, &psize, &fpos) < 0) - return AVERROR(EIO); + ret = ogg_packet(s, &idx, &pstart, &psize, &fpos); + if (ret < 0) + return ret; }while (idx < 0 || !s->streams[idx]); ogg = s->priv_data; @@ -552,8 +560,9 @@ retry: os->keyframe_seek = 0; //Alloc a pkt - if (av_new_packet (pkt, psize) < 0) - return AVERROR(EIO); + ret = av_new_packet(pkt, psize); + if (ret < 0) + return ret; pkt->stream_index = idx; memcpy (pkt->data, os->buf + pstart, psize); From 66e2dd11876395c3ad053744b19fd46b0618155a Mon Sep 17 00:00:00 2001 From: Diego Biurrun Date: Sun, 3 Jul 2011 19:29:18 +0200 Subject: [PATCH 30/36] doxygen: Add qmul docs. --- libavcodec/h264idct_template.c | 1 + 1 file changed, 1 insertion(+) diff --git a/libavcodec/h264idct_template.c b/libavcodec/h264idct_template.c index e288f9bf1b..c024538db5 100644 --- a/libavcodec/h264idct_template.c +++ b/libavcodec/h264idct_template.c @@ -237,6 +237,7 @@ void FUNCC(ff_h264_idct_add8)(uint8_t **dest, const int *block_offset, DCTELEM * } /** * IDCT transforms the 16 dc values and dequantizes them. + * @param qmul quantization parameter */ void FUNCC(ff_h264_luma_dc_dequant_idct)(DCTELEM *_output, DCTELEM *_input, int qmul){ #define stride 16 From 75a24bef4a33a36d1bcd9dbd87c105d5893d0728 Mon Sep 17 00:00:00 2001 From: Mans Rullgard Date: Mon, 4 Jul 2011 16:26:03 +0100 Subject: [PATCH 31/36] iirfilter: add fate test Change the test program to output text instead of binary files so it can be compared easily in FATE. Signed-off-by: Mans Rullgard --- libavcodec/iirfilter.c | 13 +- tests/fate2.mak | 4 + tests/ref/fate/iirfilter | 1024 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 1033 insertions(+), 8 deletions(-) create mode 100644 tests/ref/fate/iirfilter diff --git a/libavcodec/iirfilter.c b/libavcodec/iirfilter.c index a942068aee..34d3962807 100644 --- a/libavcodec/iirfilter.c +++ b/libavcodec/iirfilter.c @@ -311,6 +311,9 @@ av_cold void ff_iir_filter_free_coeffs(struct FFIIRFilterCoeffs *coeffs) } #ifdef TEST +#undef printf +#include + #define FILT_ORDER 4 #define SIZE 1024 int main(void) @@ -320,7 +323,6 @@ int main(void) float cutoff_coeff = 0.4; int16_t x[SIZE], y[SIZE]; int i; - FILE* fd; fcoeffs = ff_iir_filter_init_coeffs(NULL, FF_FILTER_TYPE_BUTTERWORTH, FF_FILTER_MODE_LOWPASS, FILT_ORDER, @@ -333,13 +335,8 @@ int main(void) ff_iir_filter(fcoeffs, fstate, SIZE, x, 1, y, 1); - fd = fopen("in.bin", "w"); - fwrite(x, sizeof(x[0]), SIZE, fd); - fclose(fd); - - fd = fopen("out.bin", "w"); - fwrite(y, sizeof(y[0]), SIZE, fd); - fclose(fd); + for (i = 0; i < SIZE; i++) + printf("%6d %6d\n", x[i], y[i]); ff_iir_filter_free_coeffs(fcoeffs); ff_iir_filter_free_state(fstate); diff --git a/tests/fate2.mak b/tests/fate2.mak index ef8c3b8d5b..a743f0cd59 100644 --- a/tests/fate2.mak +++ b/tests/fate2.mak @@ -218,3 +218,7 @@ fate-musepack7: CMD = pcm -i $(SAMPLES)/musepack/inside-mp7.mpc fate-musepack7: CMP = oneoff fate-musepack7: REF = $(SAMPLES)/musepack/inside-mp7.pcm fate-musepack7: FUZZ = 1 + +FATE_TESTS += fate-iirfilter +fate-iirfilter: libavcodec/iirfilter-test$(EXESUF) +fate-iirfilter: CMD = run libavcodec/iirfilter-test diff --git a/tests/ref/fate/iirfilter b/tests/ref/fate/iirfilter new file mode 100644 index 0000000000..2e5902d766 --- /dev/null +++ b/tests/ref/fate/iirfilter @@ -0,0 +1,1024 @@ + 0 0 + 38 2 + 151 15 + 339 65 + 603 182 + 942 381 + 1356 664 + 1845 1021 + 2409 1450 + 3046 1953 + 3755 2530 + 4535 3182 + 5384 3907 + 6300 4700 + 7278 5563 + 8315 6491 + 9405 7481 + 10541 8529 + 11717 9629 + 12924 10773 + 14151 11956 + 15385 13167 + 16615 14396 + 17825 15630 + 18997 16857 + 20114 18060 + 21156 19222 + 22102 20325 + 22929 21349 + 23613 22273 + 24132 23073 + 24461 23726 + 24575 24208 + 24453 24495 + 24073 24564 + 23416 24392 + 22467 23959 + 21213 23245 + 19649 22236 + 17773 20922 + 15590 19296 + 13116 17360 + 10371 15119 + 7386 12591 + 4201 9797 + 867 6771 + -2559 3554 + -6008 199 + -9405 -3235 +-12667 -6678 +-15707 -10053 +-18435 -13277 +-20762 -16261 +-22602 -18916 +-23875 -21153 +-24511 -22887 +-24457 -24040 +-23675 -24546 +-22151 -24352 +-19895 -23428 +-16946 -21762 +-13370 -19370 + -9265 -16296 + -4757 -12613 + 0 -8423 + 4831 -3858 + 9544 923 + 13934 5743 + 17799 10406 + 20942 14708 + 23189 18447 + 24395 21430 + 24457 23488 + 23323 24483 + 21001 24321 + 17563 22963 + 13148 20426 + 7959 16795 + 2259 12223 + -3643 6922 + -9405 1166 +-14670 -4731 +-19092 -10421 +-22359 -15550 +-24213 -19777 +-24481 -22797 +-23087 -24368 +-20071 -24334 +-15590 -22639 + -9924 -19343 + -3457 -14629 + 3345 -8793 + 9959 -2236 + 15851 4563 + 20517 11078 + 23528 16779 + 24575 21171 + 23506 23846 + 20349 24522 + 15327 23076 + 8845 19572 + 1469 14264 + -6117 7589 +-13180 135 +-18997 -7403 +-22942 -14289 +-24553 -19814 +-23592 -23377 +-20092 -24551 +-14366 -23145 + -6989 -19239 + 1244 -13192 + 9405 -5620 + 16532 2656 + 21744 10697 + 24357 17548 + 23978 22356 + 20579 24483 + 14518 23593 + 6518 19723 + -2409 13293 +-11083 5078 +-18310 -3876 +-23048 -12378 +-24568 -19252 +-22573 -23500 +-17270 -24458 + -9370 -21908 + 0 -16140 + 9439 -7935 + 17484 1526 + 22832 10824 + 24568 18508 + 22327 23330 + 16392 24452 + 7673 21608 + -2409 15181 +-12146 6168 +-19828 -3955 +-24050 -13466 +-23978 -20689 +-19535 -24292 +-11451 -23552 + -1168 -18512 + 9405 -10015 + 18234 416 + 23560 10836 + 24257 19234 + 20092 23929 + 11817 23916 + 1055 19105 + -9993 10379 +-18997 -540 +-23986 -11413 +-23802 -19939 +-18385 -24246 + -8845 -23318 + 2746 -17260 + 13778 -7325 + 21691 4319 + 24575 15045 + 21656 22357 + 13528 24482 + 2071 20823 + -9959 12152 +-19581 484 +-24331 -11367 +-22915 -20460 +-15590 -24459 + -4164 -22257 + 8421 -14315 + 18828 -2603 + 24213 9857 + 23022 19756 + 15474 24383 + 3569 22388 + -9405 14211 +-19761 2031 +-24471 -10785 +-22069 -20591 +-13148 -24512 + -264 -21311 + 12763 -11818 + 21968 1241 + 24457 13990 + 19351 22545 + 8137 24211 + -5715 18362 +-17799 6720 +-24167 -7108 +-22646 -18722 +-13622 -24326 + 0 -21995 + 13685 -12382 + 22762 1409 + 24035 14788 + 16946 23188 + 3867 23644 +-10643 15884 +-21401 2514 +-24457 -11806 +-18584 -21960 + -5825 -24220 + 9160 -17649 + 20762 -4546 + 24527 10303 + 18901 21343 + 5935 24337 + -9405 18028 +-21098 4727 +-24442 -10470 +-17979 -21608 + -4201 -24206 + 11351 -17110 + 22280 -3064 + 23970 12287 + 15590 22636 + 565 23615 +-14760 14693 +-23773 -479 +-22467 -15504 +-11284 -23907 + 4942 -21954 + 19021 -10373 + 24575 5837 + 18973 19502 + 4646 24445 +-11883 18316 +-22929 3786 +-23226 -12541 +-12505 -23090 + 4239 -22841 + 18997 -11784 + 24567 4932 + 18107 19331 + 2671 24403 +-14151 17558 +-23919 2036 +-21602 -14549 + -8244 -23897 + 9405 -21206 + 22232 -7710 + 23473 9785 + 12342 22272 + -5384 23186 +-20286 11920 +-24287 -5693 +-15090 -20319 + 2409 -24060 + 18633 -14771 + 24538 2613 + 16698 18608 + -603 24329 +-17616 16471 +-24575 -682 +-17351 -17495 + 0 -24355 + 17404 -17211 + 24575 -65 + 17136 17163 + -603 24334 +-18031 17094 +-24538 -374 +-16023 -17660 + 2409 -24287 + 19397 -16108 + 24287 1992 + 13872 18902 + -5384 24066 +-21251 14131 +-23473 -4761 +-10473 -20664 + 9405 -23351 + 23151 -10967 + 21602 8573 + 5642 22543 +-14151 21682 +-24430 6431 +-18107 -13147 + 641 -23920 + 18997 -18514 + 24207 -475 + 12505 17922 + -8030 23970 +-22929 13357 +-21511 -6625 + -4646 -21972 + 15619 -21758 + 24575 -6009 + 15561 14083 + -4942 24019 +-21831 16485 +-22467 -3138 + -6227 -20474 + 14760 -22641 + 24569 -7904 + 15590 12791 + -5421 23839 +-22280 16760 +-21797 -3160 + -4201 -20666 + 16754 -22169 + 24442 -6381 + 12602 14430 + -9405 23865 +-23848 14348 +-18901 -6644 + 1545 -22308 + 20762 -19937 + 22804 -1339 + 5825 18365 +-16080 22954 +-24457 8529 +-12080 -13009 + 10643 -23650 + 24269 -14353 + 16946 7119 + -5127 22521 +-22762 18602 +-20413 -1370 + 0 -20152 + 20454 -21342 + 22646 -3797 + 4461 17096 +-17799 22804 +-23902 8148 + -8137 -13817 + 15149 -23296 + 24457 -11618 + 11016 10660 +-12763 23135 +-24574 14243 +-13148 -7861 + 10813 -22608 + 24471 -16124 + 14609 5565 + -9405 21949 +-24315 17379 +-15474 -3849 + 8598 -21336 + 24213 -18120 + 15793 2745 + -8421 20885 +-24220 18429 +-15590 -2263 + 8880 -20663 + 24331 -18359 + 14851 2398 + -9959 20685 +-24488 17917 +-13528 -3137 + 11618 -20918 + 24575 -17075 + 11551 4460 +-13778 21286 +-24421 15770 + -8845 -6328 + 16307 -21661 + 23802 -13916 + 5348 8671 +-18997 21868 +-22452 11421 + -1055 -11371 + 21548 -21685 + 20092 -8212 + -3941 14242 +-23560 20853 +-16476 4267 + 9405 -17009 + 24547 -19106 + 11451 343 +-14911 19309 +-23978 16208 + -5053 -5409 + 19828 -20699 + 21364 -12016 + -2409 10553 +-23347 20700 +-16392 6559 + 10268 -15211 + 24568 -18879 + 9090 -118 +-17484 18664 +-22690 14969 + 0 -6714 + 22719 -20134 + 17270 -9014 + -9717 13022 +-24568 18943 + -8527 1506 + 18310 -17662 + 21934 -14749 + -2409 6538 +-23695 19463 +-14518 7789 + 13433 -13633 + 23978 -17566 + 3270 935 +-21744 18075 +-18184 11812 + 9405 -9654 + 24544 -18394 + 6989 -3082 +-19939 16117 +-20092 13945 + 6881 -6613 + 24553 -18196 + 8809 -5437 +-18997 14458 +-20742 14731 + 6117 -4859 + 24531 -17657 + 8845 -6307 +-19210 13526 +-20349 14588 + 7170 -4444 + 24575 -17109 + 7098 -5874 +-20517 13412 +-18780 13691 + 9959 -5272 + 24347 -16558 + 3457 -4241 +-22482 13949 +-15590 11979 + 14181 -7142 + 23087 -15723 + -2146 -1459 +-24213 14726 +-10200 9228 + 19092 -9692 + 19717 -14108 + -9405 2343 +-24304 15085 + -2259 5221 + 23251 -12286 + 13148 -11127 +-17190 6746 +-21001 14161 + 7745 2 + 24457 -13938 + 2971 -6372 +-23189 10842 +-12860 11094 + 17799 -5795 + 20243 -13421 + -9544 -30 +-24096 13184 + 0 5498 + 24110 -10713 + 9265 -9718 +-20620 6673 +-16946 12155 + 14427 -1883 + 22151 -12653 + -6591 -2861 +-24457 11378 + -1770 6908 + 23875 -8726 + 9648 -9817 +-20762 5209 +-16251 11385 + 15707 -1358 + 21059 -11610 + -9405 -2353 +-23830 10656 + 2559 5560 + 24560 -8789 + 4201 -8028 +-23439 6314 +-10371 9643 + 20783 -3542 + 15590 -10404 +-16973 742 +-19649 10386 + 12407 1870 + 22467 -9720 + -7458 -4144 +-24073 8562 + 2446 5991 + 24575 -7072 + 2371 -7375 +-24132 5398 + -6808 8306 + 22929 -3667 + 10745 -8824 +-21156 1980 +-14120 8987 + 18997 -408 + 16918 -8863 +-16615 -1001 +-19163 8521 + 14151 2220 + 20902 -8027 +-11717 -3241 +-22200 7441 + 9405 4071 + 23126 -6811 + -7278 -4722 +-23754 6177 + 5384 5213 + 24153 -5571 + -3755 -5566 +-24386 5013 + 2409 5801 + 24506 -4521 + -1356 -5939 +-24557 4104 + 603 5999 + 24573 -3765 + -151 -5994 +-24575 3508 + 0 5937 + 24575 -3331 + -151 -5835 +-24573 3232 + 603 5694 + 24557 -3205 + -1356 -5517 +-24506 3244 + 2409 5303 + 24386 -3343 + -3755 -5049 +-24153 3494 + 5384 4752 + 23754 -3685 + -7278 -4407 +-23126 3906 + 9405 4007 + 22200 -4143 +-11717 -3547 +-20902 4380 + 14151 3025 + 19163 -4598 +-16615 -2434 +-16918 4778 + 18997 1780 + 14120 -4898 +-21156 -1066 +-10745 4934 + 22929 304 + 6808 -4862 +-24132 489 + -2371 4664 + 24575 -1288 + -2446 -4320 +-24073 2060 + 7458 3820 + 22467 -2767 +-12407 -3162 +-19649 3365 + 16973 2357 + 15590 -3808 +-20783 -1429 +-10371 4050 + 23439 419 + 4201 -4055 +-24560 616 + 2559 3795 + 23830 -1607 + -9405 -3266 +-21059 2473 + 15707 2486 + 16251 -3130 +-20762 -1499 + -9648 3505 + 23875 386 + 1770 -3539 +-24457 754 + 6591 3205 + 22151 -1798 +-14427 -2518 +-16946 2618 + 20620 1540 + 9265 -3101 +-24110 -381 + 0 3162 + 24096 -809 + -9544 -2775 +-20243 1859 + 17799 1978 + 12860 -2598 +-23189 -879 + -2971 2893 + 24457 -344 + -7745 -2674 +-21001 1478 + 17190 1966 + 13148 -2304 +-23251 -890 + -2259 2647 + 24304 -341 + -9405 -2421 +-19717 1467 + 19092 1662 + 10200 -2229 +-24213 -535 + 2146 2434 + 23087 -692 +-14181 -2022 +-15590 1706 + 22482 1090 + 3457 -2230 +-24347 115 + 9959 2111 + 18780 -1251 +-20517 -1374 + -7098 1975 + 24575 238 + -7170 -2057 +-20349 938 + 19210 1464 + 8845 -1763 +-24531 -392 + 6117 1949 + 20742 -783 +-18997 -1425 + -8809 1630 + 24553 385 + -6881 -1825 +-20092 770 + 19939 1291 + 6989 -1572 +-24544 -244 + 9405 1688 + 18184 -869 +-21744 -1069 + -3270 1559 + 23978 -7 +-13433 -1511 +-14518 1041 + 23695 753 + -2409 -1536 +-21934 344 + 18310 1251 + 8527 -1225 +-24568 -337 + 9717 1436 + 17270 -719 +-22719 -869 + 0 1342 + 22690 -157 +-17484 -1188 + -9090 1051 + 24568 353 +-10268 -1293 +-16392 658 + 23347 745 + -2409 -1224 +-21364 244 + 19828 996 + 5053 -1036 +-23978 -132 + 14911 1114 + 11451 -783 +-24547 -437 + 9405 1124 + 16476 -513 +-23560 -661 + 3941 1058 + 20092 -257 +-21548 -807 + -1055 945 + 22452 -37 +-18997 -887 + -5348 815 + 23802 142 +-16307 -917 + -8845 682 + 24421 276 +-13778 -913 +-11551 563 + 24575 371 +-11618 -888 +-13528 463 + 24488 431 + -9959 -854 +-14851 386 + 24331 462 + -8880 -815 +-15590 333 + 24220 471 + -8421 -779 +-15793 302 + 24213 460 + -8598 -746 +-15474 292 + 24315 433 + -9405 -717 +-14609 300 + 24471 391 +-10813 -689 +-13148 324 + 24574 336 +-12763 -660 +-11016 359 + 24457 267 +-15149 -627 + -8137 400 + 23902 184 +-17799 -584 + -4461 444 + 22646 90 +-20454 -527 + 0 483 + 20413 -15 +-22762 -452 + 5127 511 + 16946 -124 +-24269 -357 + 10643 517 + 12080 -232 +-24457 -241 + 16080 495 + 5825 -328 +-22804 -107 + 20762 440 + -1545 -400 +-18901 35 + 23848 347 + -9405 -437 +-12602 173 + 24442 220 +-16754 -426 + -4201 290 + 21797 69 +-22280 -362 + 5421 366 + 15590 -89 +-24569 -247 + 14760 384 + 6227 -228 +-22467 -95 + 21831 335 + -4942 -321 +-15561 71 + 24575 222 +-15619 -344 + -4646 214 + 21511 65 +-22929 -288 + 8030 300 + 12505 -102 +-24207 -162 + 18997 304 + -641 -232 +-18107 4 + 24430 218 +-14151 -286 + -5642 160 + 21602 68 +-23151 -244 + 9405 253 + 10473 -97 +-23473 -115 + 21251 247 + -5384 -216 +-13872 49 + 24287 142 +-19397 -238 + 2409 183 + 16023 -17 +-24538 -153 + 18031 224 + -603 -158 +-17136 0 + 24575 153 +-17404 -209 + 0 142 + 17351 6 +-24575 -144 + 17616 196 + -603 -133 +-16698 -1 + 24538 131 +-18633 -182 + 2409 132 + 15090 -11 +-24287 -111 + 20286 169 + -5384 -134 +-12342 30 + 23473 86 +-22232 -152 + 9405 138 + 8244 -53 +-21602 -56 + 23919 132 +-14151 -138 + -2671 76 + 18107 21 +-24567 -104 + 18997 134 + -4239 -98 +-12505 16 + 23226 69 +-22929 -119 + 11883 111 + 4646 -53 +-18973 -28 + 24575 92 +-19021 -113 + 4942 82 + 11284 -16 +-22467 -54 + 23773 97 +-14760 -97 + -565 56 + 15590 8 +-23970 -65 + 22280 93 +-11351 -82 + -4201 37 + 17979 21 +-24442 -67 + 21098 85 + -9405 -69 + -5935 26 + 18901 24 +-24527 -64 + 20762 77 + -9160 -61 + -5825 23 + 18584 21 +-24457 -56 + 21401 69 +-10643 -57 + -3867 25 + 16946 15 +-24035 -47 + 22762 62 +-13685 -55 + 0 29 + 13622 4 +-22646 -35 + 24167 53 +-17799 -52 + 5715 36 + 8137 -8 +-19351 -21 + 24457 41 +-21968 -49 + 12763 41 + 264 -21 +-13148 -4 + 22069 27 +-24471 -40 + 19761 42 + -9405 -31 + -3569 12 + 15474 9 +-23022 -27 + 24213 36 +-18828 -35 + 8421 25 + 4164 -9 +-15590 -9 + 22915 23 +-24331 -31 + 19581 31 + -9959 -23 + -2071 10 + 13528 5 +-21656 -18 + 24575 26 +-21691 -27 + 13778 22 + -2746 -12 + -8845 0 + 18385 11 +-23802 -20 + 23986 23 +-18997 -22 + 9993 15 + 1055 -7 +-11817 -3 + 20092 11 +-24257 -17 + 23560 19 +-18234 -17 + 9405 12 + 1168 -5 +-11451 -3 + 19535 10 +-23978 -14 + 24050 16 +-19828 -14 + 12146 11 + -2409 -5 + -7673 0 + 16392 6 +-22327 -10 + 24568 12 +-22832 -12 + 17484 11 + -9439 -7 + 0 3 + 9370 2 +-17270 -5 + 22573 8 +-24568 -9 + 23048 10 +-18310 -8 + 11083 5 + -2409 -3 + -6518 -1 + 14518 3 +-20579 -5 + 23978 7 +-24357 -7 + 21744 7 +-16532 -6 + 9405 3 + -1244 -1 + -6989 -1 + 14366 3 +-20092 -4 + 23592 5 +-24553 -5 + 22942 5 +-18997 -4 + 13180 3 + -6117 -2 + -1469 1 + 8845 2 +-15327 -2 + 20349 3 +-23506 -4 + 24575 3 +-23528 -4 + 20517 3 +-15851 -2 + 9959 1 + -3345 0 + -3457 0 + 9924 1 +-15590 -2 + 20071 2 +-23087 -2 + 24481 3 +-24213 -2 + 22359 2 +-19092 -1 + 14670 1 + -9405 0 + 3643 0 + 2259 0 + -7959 -1 + 13148 1 +-17563 -1 + 21001 1 +-23323 -1 + 24457 1 +-24395 -1 + 23189 1 +-20942 -1 + 17799 1 +-13934 0 + 9544 0 + -4831 0 + 0 0 + 4757 1 + -9265 0 + 13370 0 +-16946 -1 + 19895 0 +-22151 -1 + 23675 0 +-24457 -1 + 24511 0 +-23875 0 + 22602 0 +-20762 0 + 18435 0 +-15707 0 + 12667 0 + -9405 0 + 6008 0 + -2559 0 + -867 0 + 4201 0 + -7386 0 + 10371 0 +-13116 0 + 15590 0 +-17773 0 + 19649 0 +-21213 0 + 22467 0 +-23416 0 + 24073 0 +-24453 0 + 24575 0 +-24461 0 + 24132 0 +-23613 0 + 22929 0 +-22102 0 + 21156 0 +-20114 0 + 18997 0 +-17825 0 + 16615 0 +-15385 0 + 14151 0 +-12924 0 + 11717 0 +-10541 0 + 9405 0 + -8315 0 + 7278 0 + -6300 0 + 5384 0 + -4535 0 + 3755 0 + -3046 0 + 2409 0 + -1845 0 + 1356 0 + -942 0 + 603 0 + -339 0 + 151 0 + -38 0 From 567a32b5b26dcc9c27e2c5ecb9c6c60d65b0e78d Mon Sep 17 00:00:00 2001 From: Daniel Kang Date: Mon, 4 Jul 2011 11:44:59 -0400 Subject: [PATCH 32/36] x86_32: Fix build on x86_32 with --disable-yasm. Signed-off-by: Ronald S. Bultje --- libavcodec/x86/h264_qpel_mmx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libavcodec/x86/h264_qpel_mmx.c b/libavcodec/x86/h264_qpel_mmx.c index c313c0e079..91ba39f1da 100644 --- a/libavcodec/x86/h264_qpel_mmx.c +++ b/libavcodec/x86/h264_qpel_mmx.c @@ -1294,6 +1294,6 @@ QPEL16_OP(mc31, MMX)\ QPEL16_OP(mc32, MMX)\ QPEL16_OP(mc33, MMX) -#if ARCH_X86_32 // ARCH_X86_64 implies sse2+ +#if ARCH_X86_32 && HAVE_YASM // ARCH_X86_64 implies sse2+ QPEL16(mmxext) #endif From 3c7c16fde3c2b758bb3c9f038c9a7d3461664f98 Mon Sep 17 00:00:00 2001 From: Daniel Kang Date: Mon, 4 Jul 2011 11:53:21 -0400 Subject: [PATCH 33/36] YASM: Shut up unused variable compiler warning with --disable-yasm. Signed-off-by: Diego Biurrun --- libavcodec/x86/dsputil_mmx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libavcodec/x86/dsputil_mmx.c b/libavcodec/x86/dsputil_mmx.c index cfec97c8af..7842370fcd 100644 --- a/libavcodec/x86/dsputil_mmx.c +++ b/libavcodec/x86/dsputil_mmx.c @@ -2660,8 +2660,8 @@ void dsputil_init_mmx(DSPContext* c, AVCodecContext *avctx) SET_QPEL_FUNCS(avg_h264_qpel, 1, 8, mmx2, ); SET_QPEL_FUNCS(avg_h264_qpel, 2, 4, mmx2, ); } -#if HAVE_YASM else if (bit_depth == 10) { +#if HAVE_YASM #if !ARCH_X86_64 SET_QPEL_FUNCS(avg_h264_qpel, 0, 16, 10_mmxext, ff_); SET_QPEL_FUNCS(put_h264_qpel, 0, 16, 10_mmxext, ff_); @@ -2670,8 +2670,8 @@ void dsputil_init_mmx(DSPContext* c, AVCodecContext *avctx) #endif SET_QPEL_FUNCS(put_h264_qpel, 2, 4, 10_mmxext, ff_); SET_QPEL_FUNCS(avg_h264_qpel, 2, 4, 10_mmxext, ff_); - } #endif + } SET_QPEL_FUNCS(put_2tap_qpel, 0, 16, mmx2, ); SET_QPEL_FUNCS(put_2tap_qpel, 1, 8, mmx2, ); From 49c7006c7e815d4330247624a9e6ba30e288cd02 Mon Sep 17 00:00:00 2001 From: John Stebbins Date: Mon, 4 Jul 2011 09:55:19 -0700 Subject: [PATCH 34/36] dca: set AVCodecContext frame_size for DTS audio Set the frame size when decoding DTS audio. This has the side effect of fixing the computation of timestamps for DTS-HD in compute_pkt_fields. Since frame_size is not currently set, the duration of a frame is being guessed based on the streams bitrate. But for DTS-HD, the bitrate currently used is the rate of the DTS core which is much different than the whole DTS-HD stream and leads to a wildly inaccurate frame duration estimate. Signed-off-by: Ronald S. Bultje --- libavcodec/dca.c | 1 + 1 file changed, 1 insertion(+) diff --git a/libavcodec/dca.c b/libavcodec/dca.c index e87a9e3ed4..58f3420586 100644 --- a/libavcodec/dca.c +++ b/libavcodec/dca.c @@ -1650,6 +1650,7 @@ static int dca_decode_frame(AVCodecContext * avctx, //set AVCodec values with parsed data avctx->sample_rate = s->sample_rate; avctx->bit_rate = s->bit_rate; + avctx->frame_size = s->sample_blocks * 32; s->profile = FF_PROFILE_DTS; From 240c5d6f3b2d676888a873b0e5c1dc82a2493c65 Mon Sep 17 00:00:00 2001 From: Mans Rullgard Date: Mon, 4 Jul 2011 18:08:02 +0100 Subject: [PATCH 35/36] fate: test more FFT etc sizes This tests sizes from 16 to 4096, not only the default 512. Signed-off-by: Mans Rullgard --- tests/fate/fft.mak | 44 ++++++++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/tests/fate/fft.mak b/tests/fate/fft.mak index 042a7bf322..feb47afe00 100644 --- a/tests/fate/fft.mak +++ b/tests/fate/fft.mak @@ -1,28 +1,36 @@ -FATE_FFT = fate-fft fate-ifft \ - fate-mdct fate-imdct \ - fate-rdft fate-irdft \ - fate-dct1d fate-idct1d +define DEF_FFT +FATE_FFT += fate-fft-$(1) fate-ifft-$(1) \ + fate-mdct-$(1) fate-imdct-$(1) \ + fate-rdft-$(1) fate-irdft-$(1) \ + fate-dct1d-$(1) fate-idct1d-$(1) -fate-fft: CMD = run libavcodec/fft-test -fate-ifft: CMD = run libavcodec/fft-test -i -fate-mdct: CMD = run libavcodec/fft-test -m -fate-imdct: CMD = run libavcodec/fft-test -m -i -fate-rdft: CMD = run libavcodec/fft-test -r -fate-irdft: CMD = run libavcodec/fft-test -r -i -fate-dct1d: CMD = run libavcodec/fft-test -d -fate-idct1d: CMD = run libavcodec/fft-test -d -i +fate-fft-$(N): CMD = run libavcodec/fft-test -n$(1) +fate-ifft-$(N): CMD = run libavcodec/fft-test -n$(1) -i +fate-mdct-$(N): CMD = run libavcodec/fft-test -n$(1) -m +fate-imdct-$(N): CMD = run libavcodec/fft-test -n$(1) -m -i +fate-rdft-$(N): CMD = run libavcodec/fft-test -n$(1) -r +fate-irdft-$(N): CMD = run libavcodec/fft-test -n$(1) -r -i +fate-dct1d-$(N): CMD = run libavcodec/fft-test -n$(1) -d +fate-idct1d-$(N): CMD = run libavcodec/fft-test -n$(1) -d -i +endef + +$(foreach N, 4 5 6 7 8 9 10 11 12, $(eval $(call DEF_FFT,$(N)))) fate-fft-test: $(FATE_FFT) $(FATE_FFT): libavcodec/fft-test$(EXESUF) $(FATE_FFT): REF = /dev/null -FATE_FFT_FIXED = fate-fft-fixed fate-ifft-fixed \ - fate-mdct-fixed fate-imdct-fixed +define DEF_FFT_FIXED +FATE_FFT_FIXED += fate-fft-fixed-$(1) fate-ifft-fixed-$(1) \ + fate-mdct-fixed-$(1) fate-imdct-fixed-$(1) -fate-fft-fixed: CMD = run libavcodec/fft-fixed-test -fate-ifft-fixed: CMD = run libavcodec/fft-fixed-test -i -fate-mdct-fixed: CMD = run libavcodec/fft-fixed-test -m -fate-imdct-fixed: CMD = run libavcodec/fft-fixed-test -m -i +fate-fft-fixed-$(1): CMD = run libavcodec/fft-fixed-test -n$(1) +fate-ifft-fixed-$(1): CMD = run libavcodec/fft-fixed-test -n$(1) -i +fate-mdct-fixed-$(1): CMD = run libavcodec/fft-fixed-test -n$(1) -m +fate-imdct-fixed-$(1): CMD = run libavcodec/fft-fixed-test -n$(1) -m -i +endef + +$(foreach N, 4 5 6 7 8 9 10 11 12, $(eval $(call DEF_FFT_FIXED,$(N)))) fate-fft-fixed-test: $(FATE_FFT_FIXED) $(FATE_FFT_FIXED): libavcodec/fft-fixed-test$(EXESUF) From 3824ef08e0878aa9f100f33ef22b61daf68058c2 Mon Sep 17 00:00:00 2001 From: Mans Rullgard Date: Mon, 4 Jul 2011 20:36:35 +0100 Subject: [PATCH 36/36] ARM: allow unaligned buffer in fixed-point NEON FFT4 This function is called with only 8-byte alignment from imdct for size 16. The fft4 function is not called for the larger FFT or MDCT sizes, so this has no impact on typical uses. Signed-off-by: Mans Rullgard --- libavcodec/arm/fft_fixed_neon.S | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libavcodec/arm/fft_fixed_neon.S b/libavcodec/arm/fft_fixed_neon.S index 14884d3736..2cfd817fc9 100644 --- a/libavcodec/arm/fft_fixed_neon.S +++ b/libavcodec/arm/fft_fixed_neon.S @@ -75,9 +75,9 @@ .endm function fft4_neon - vld1.16 {d0-d1}, [r0,:128] + vld1.16 {d0-d1}, [r0] fft4 d0, d1, d2, d3 - vst1.16 {d0-d1}, [r0,:128] + vst1.16 {d0-d1}, [r0] bx lr endfunc