summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile2
-rw-r--r--libavcodec/arm/fft_fixed_neon.S4
-rw-r--r--libavcodec/dca.c1
-rw-r--r--libavcodec/dct-test.c471
-rw-r--r--libavcodec/h264idct_template.c1
-rw-r--r--libavcodec/high_bit_depth.h18
-rw-r--r--libavcodec/iirfilter.c13
-rw-r--r--libavcodec/libvorbis.c1
-rw-r--r--libavcodec/libvpxenc.c1
-rw-r--r--libavcodec/libxvidff.c1
-rw-r--r--libavcodec/mpegvideo.c5
-rw-r--r--libavcodec/mpegvideo.h1
-rw-r--r--libavcodec/opt.h18
-rw-r--r--libavcodec/rv34.c20
-rw-r--r--libavcodec/vc1dec.c1
-rw-r--r--libavcodec/vp8.c33
-rw-r--r--libavcodec/x86/dsputil_mmx.c4
-rw-r--r--libavcodec/x86/h264_qpel_mmx.c2
-rw-r--r--libavfilter/x86/gradfun.c20
-rw-r--r--libavformat/mxfenc.c2
-rw-r--r--libavformat/oggdec.c19
-rw-r--r--libavutil/aes.c41
-rw-r--r--libavutil/des.c8
-rw-r--r--libavutil/eval.c17
-rw-r--r--libavutil/sha.c4
-rw-r--r--libswscale/swscale.c11
-rw-r--r--tests/Makefile1
-rwxr-xr-xtests/fate-run.sh1
-rw-r--r--tests/fate/dct.mak5
-rw-r--r--tests/fate/fft.mak46
-rw-r--r--tests/fate/libavutil.mak4
-rw-r--r--tests/fate2.mak4
-rw-r--r--tests/ref/fate/eval161
-rw-r--r--tests/ref/fate/iirfilter1024
34 files changed, 1614 insertions, 351 deletions
diff --git a/Makefile b/Makefile
index 357b934a2b..5bc9c25b08 100644
--- a/Makefile
+++ b/Makefile
@@ -164,5 +164,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*
diff --git a/libavcodec/arm/fft_fixed_neon.S b/libavcodec/arm/fft_fixed_neon.S
index bd6c853ec8..565a9c0d20 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
diff --git a/libavcodec/dca.c b/libavcodec/dca.c
index b56005b7cf..e11439f939 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;
diff --git a/libavcodec/dct-test.c b/libavcodec/dct-test.c
index 2abb05bd3b..4bc59d3370 100644
--- a/libavcodec/dct-test.c
+++ b/libavcodec/dct-test.c
@@ -68,12 +68,12 @@ 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;
+ void (*func)(DCTELEM *block);
+ enum formattag { NO_PERM, MMX_PERM, MMX_SIMPLE_PERM, SCALE_PERM,
+ SSE2_PERM, PARTTRANS_PERM } format;
+ int mm_support;
+ int nonspec;
};
#ifndef FAAN_POSTSCALE
@@ -84,61 +84,69 @@ 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},
+static const struct algo fdct_tab[] = {
+ { "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", 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},
+ { "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 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},
+#if HAVE_ALTIVEC
+ { "altivecfdct", fdct_altivec, NO_PERM, AV_CPU_FLAG_ALTIVEC },
#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},
+
+#if ARCH_BFIN
+ { "BFINfdct", ff_bfin_fdct, NO_PERM },
#endif
-#if HAVE_ALTIVEC
- {"altivecfdct", 0, fdct_altivec, ff_ref_fdct, NO_PERM, AV_CPU_FLAG_ALTIVEC},
+ { 0 }
+};
+
+static const struct algo idct_tab[] = {
+ { "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, 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, 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
- {"BFINfdct", 0, ff_bfin_fdct, ff_ref_fdct, NO_PERM},
- {"BFINidct", 1, ff_bfin_idct, ff_ref_idct, NO_PERM},
+ { "BFINidct", ff_bfin_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, NO_PERM },
+ { "INT-ARM", ff_j_rev_dct_arm, MMX_PERM },
+#endif
#if HAVE_ARMV5TE
- {"SIMPLE-ARMV5TE", 1, ff_simple_idct_armv5te, ff_ref_idct, NO_PERM },
+ { "SIMPLE-ARMV5TE", ff_simple_idct_armv5te,NO_PERM },
#endif
#if HAVE_ARMV6
- {"SIMPLE-ARMV6", 1, ff_simple_idct_armv6, ff_ref_idct, MMX_PERM },
+ { "SIMPLE-ARMV6", ff_simple_idct_armv6, MMX_PERM },
#endif
#if HAVE_NEON
- {"SIMPLE-NEON", 1, ff_simple_idct_neon, ff_ref_idct, PARTTRANS_PERM },
+ { "SIMPLE-NEON", ff_simple_idct_neon, PARTTRANS_PERM },
#endif
-#endif /* ARCH_ARM */
#if ARCH_ALPHA
- {"SIMPLE-ALPHA", 1, ff_simple_idct_axp, ff_ref_idct, NO_PERM },
+ { "SIMPLE-ALPHA", ff_simple_idct_axp, NO_PERM },
#endif
- { 0 }
+ { 0 }
};
#define AANSCALE_BITS 12
@@ -148,7 +156,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 +165,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)
{
@@ -177,13 +185,12 @@ 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);
}
}
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,188 +200,177 @@ 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, const int bits)
+
+static int dct_error(const struct algo *dct, int test, int is_idct, int speed, const int bits)
{
+ 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;
- int64_t sysErr[64], sysErrMax=0;
- int maxout=0;
- int blockSumErrMax=0, blockSumErr;
+ int64_t err2, ti, ti1, it1, err_sum = 0;
+ int64_t sysErr[64], sysErrMax = 0;
+ int maxout = 0;
+ int blockSumErrMax = 0, blockSumErr;
AVLFG prng;
const int vals=1<<bits;
+ double omse, ome;
+ int spec_err;
av_lfg_init(&prng, 1);
err_inf = 0;
err2 = 0;
- for(i=0; i<64; i++) sysErr[i]=0;
- for(it=0;it<NB_ITS;it++) {
- for(i=0;i<64;i++)
+ for (i = 0; i < 64; i++)
+ sysErr[i] = 0;
+ for (it = 0; it < NB_ITS; it++) {
+ for (i = 0; i < 64; i++)
block1[i] = 0;
- switch(test){
+ switch (test) {
case 0:
- for(i=0;i<64;i++)
+ for (i = 0; i < 64; i++)
block1[i] = (av_lfg_get(&prng) % (2*vals)) -vals;
- if (is_idct){
+ if (is_idct) {
ff_ref_fdct(block1);
-
- for(i=0;i<64;i++)
- block1[i]>>=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<num;i++)
- block1[av_lfg_get(&prng) % 64] = av_lfg_get(&prng) % (2*vals) -vals;
- }break;
+ break;
+ case 1: {
+ int num = av_lfg_get(&prng) % 10 + 1;
+ for (i = 0; i < num; i++)
+ block1[av_lfg_get(&prng) % 64] = av_lfg_get(&prng) % (2*vals) -vals;
+ }
+ break;
case 2:
block1[0] = av_lfg_get(&prng) % (16*vals) - (8*vals);
- block1[63]= (block1[0]&1)^1;
- break;
+ block1[63] = (block1[0] & 1) ^ 1;
+ 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];
- for(i=0; i<64; i++)
- block_org[i]= block1[i];
-
- if (form == MMX_PERM) {
- for(i=0;i<64;i++)
+ if (dct->format == MMX_PERM) {
+ 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 (dct->format == MMX_SIMPLE_PERM) {
+ for (i = 0; i < 64; i++)
block[idct_simple_mmx_perm[i]] = block1[i];
-
- } else if (form == SSE2_PERM) {
- for(i=0; i<64; i++)
- block[(i&0x38) | idct_sse2_row_perm[i&7]] = block1[i];
- } else if (form == PARTTRANS_PERM) {
- for(i=0; i<64; i++)
- block[(i&0x24) | ((i&3)<<3) | ((i>>3)&3)] = block1[i];
+ } 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 (dct->format == PARTTRANS_PERM) {
+ 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];
}
-#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);
+ dct->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;
+ 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);
+ ref(block1);
- blockSumErr=0;
- for(i=0;i<64;i++) {
- v = abs(block[i] - block1[i]);
+ blockSumErr = 0;
+ for (i = 0; i < 64; i++) {
+ int err = block[i] - block1[i];
+ err_sum += err;
+ v = abs(err);
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 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
+ 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);
+ 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,
+ omse, ome, (double) sysErrMax / NB_ITS,
+ maxout, blockSumErrMax);
+
+ if (spec_err && !dct->nonspec)
+ return 1;
+
+ if (!speed)
+ return 0;
/* speed test */
- for(i=0;i<64;i++)
+ for (i = 0; i < 64; i++)
block1[i] = 0;
- switch(test){
+
+ switch (test) {
case 0:
- for(i=0;i<64;i++)
+ for (i = 0; i < 64; i++)
block1[i] = av_lfg_get(&prng) % (2*vals) -vals;
- if (is_idct){
+ if (is_idct) {
ff_ref_fdct(block1);
-
- for(i=0;i<64;i++)
- block1[i]>>=3;
+ for (i = 0; i < 64; i++)
+ block1[i] >>= 3;
}
- break;
- case 1:{
+ break;
+ case 1:
case 2:
block1[0] = av_lfg_get(&prng) % (2*vals) -vals;
block1[1] = av_lfg_get(&prng) % (2*vals) -vals;
block1[2] = av_lfg_get(&prng) % (2*vals) -vals;
block1[3] = av_lfg_get(&prng) % (2*vals) -vals;
- }break;
+ break;
}
- if (form == MMX_PERM) {
- for(i=0;i<64;i++)
+ if (dct->format == MMX_PERM) {
+ 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 (dct->format == 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<NB_ITS_SPEED;it++) {
- for(i=0; i<64; i++)
- block[i]= block1[i];
-// memcpy(block, block1, sizeof(DCTELEM) * 64);
-// do not memcpy especially not fastmemcpy because it does movntq !!!
- fdct_func(block);
+ for (it = 0; it < NB_ITS_SPEED; it++) {
+ for (i = 0; i < 64; i++)
+ block[i] = block1[i];
+ 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, (double)it1 * 1000.0 / (double)ti1);
+ 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];
@@ -392,19 +388,19 @@ static void idct248_ref(uint8_t *dest, int linesize, int16_t *block)
if (!init) {
init = 1;
- for(i=0;i<8;i++) {
+ for (i = 0; i < 8; i++) {
sum = 0;
- for(j=0;j<8;j++) {
- s = (i==0) ? sqrt(1.0/8.0) : sqrt(1.0/4.0);
+ for (j = 0; j < 8; j++) {
+ s = (i == 0) ? sqrt(1.0 / 8.0) : sqrt(1.0 / 4.0);
c8[i][j] = s * cos(M_PI * i * (j + 0.5) / 8.0);
sum += c8[i][j] * c8[i][j];
}
}
- for(i=0;i<4;i++) {
+ for (i = 0; i < 4; i++) {
sum = 0;
- for(j=0;j<4;j++) {
- s = (i==0) ? sqrt(1.0/4.0) : sqrt(1.0/2.0);
+ for (j = 0; j < 4; j++) {
+ s = (i == 0) ? sqrt(1.0 / 4.0) : sqrt(1.0 / 2.0);
c4[i][j] = s * cos(M_PI * i * (j + 0.5) / 4.0);
sum += c4[i][j] * c4[i][j];
}
@@ -413,58 +409,59 @@ static void idct248_ref(uint8_t *dest, int linesize, int16_t *block)
/* butterfly */
s = 0.5 * sqrt(2.0);
- for(i=0;i<4;i++) {
- for(j=0;j<8;j++) {
- block1[8*(2*i)+j] = (block[8*(2*i)+j] + block[8*(2*i+1)+j]) * s;
- block1[8*(2*i+1)+j] = (block[8*(2*i)+j] - block[8*(2*i+1)+j]) * s;
+ for (i = 0; i < 4; i++) {
+ for (j = 0; j < 8; j++) {
+ block1[8 * (2 * i) + j] =
+ (block[8 * (2 * i) + j] + block[8 * (2 * i + 1) + j]) * s;
+ block1[8 * (2 * i + 1) + j] =
+ (block[8 * (2 * i) + j] - block[8 * (2 * i + 1) + j]) * s;
}
}
/* idct8 on lines */
- for(i=0;i<8;i++) {
- for(j=0;j<8;j++) {
+ for (i = 0; i < 8; i++) {
+ for (j = 0; j < 8; j++) {
sum = 0;
- for(k=0;k<8;k++)
- sum += c8[k][j] * block1[8*i+k];
- block2[8*i+j] = sum;
+ for (k = 0; k < 8; k++)
+ sum += c8[k][j] * block1[8 * i + k];
+ block2[8 * i + j] = sum;
}
}
/* idct4 */
- for(i=0;i<8;i++) {
- for(j=0;j<4;j++) {
+ for (i = 0; i < 8; i++) {
+ for (j = 0; j < 4; j++) {
/* top */
sum = 0;
- for(k=0;k<4;k++)
- sum += c4[k][j] * block2[8*(2*k)+i];
- block3[8*(2*j)+i] = sum;
+ for (k = 0; k < 4; k++)
+ sum += c4[k][j] * block2[8 * (2 * k) + i];
+ block3[8 * (2 * j) + i] = sum;
/* bottom */
sum = 0;
- for(k=0;k<4;k++)
- sum += c4[k][j] * block2[8*(2*k+1)+i];
- block3[8*(2*j+1)+i] = sum;
+ for (k = 0; k < 4; k++)
+ sum += c4[k][j] * block2[8 * (2 * k + 1) + i];
+ block3[8 * (2 * j + 1) + i] = sum;
}
}
/* clamp and store the result */
- 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);
+ 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 speed)
{
int it, i, it1, ti, ti1, err_max, v;
-
AVLFG prng;
av_lfg_init(&prng, 1);
@@ -472,23 +469,22 @@ 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<NB_ITS;it++) {
-
+ for (it = 0; it < NB_ITS; it++) {
/* XXX: use forward transform to generate values */
- for(i=0;i<64;i++)
+ for (i = 0; i < 64; i++)
block1[i] = av_lfg_get(&prng) % 256 - 128;
block1[0] += 1024;
- for(i=0; i<64; i++)
- block[i]= block1[i];
+ for (i = 0; i < 64; i++)
+ block[i] = block1[i];
idct248_ref(img_dest1, 8, block);
- for(i=0; i<64; i++)
- block[i]= block1[i];
+ for (i = 0; i < 64; i++)
+ block[i] = block1[i];
idct248_put(img_dest, 8, block);
- for(i=0;i<64;i++) {
- v = abs((int)img_dest[i] - (int)img_dest1[i]);
+ for (i = 0; i < 64; i++) {
+ v = abs((int) img_dest[i] - (int) img_dest1[i]);
if (v == 255)
printf("%d %d\n", img_dest[i], img_dest1[i]);
if (v > err_max)
@@ -514,18 +510,17 @@ static void idct248_error(const char *name,
}
#endif
}
- 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);
+
+ if (!speed)
+ return;
ti = gettime();
it1 = 0;
do {
- for(it=0;it<NB_ITS_SPEED;it++) {
- for(i=0; i<64; i++)
- block[i]= block1[i];
-// memcpy(block, block1, sizeof(DCTELEM) * 64);
-// do not memcpy especially not fastmemcpy because it does movntq !!!
+ for (it = 0; it < NB_ITS_SPEED; it++) {
+ for (i = 0; i < 64; i++)
+ block[i] = block1[i];
idct248_put(img_dest, 8, block);
}
it1 += NB_ITS_SPEED;
@@ -533,9 +528,8 @@ static void idct248_error(const char *name,
} while (ti1 < 1000000);
mmx_emms();
- printf("%s %s: %0.1f kdct/s\n",
- 1 ? "IDCT248" : "DCT248",
- name, (double)it1 * 1000.0 / (double)ti1);
+ printf("%s %s: %0.1f kdct/s\n", 1 ? "IDCT248" : "DCT248", name,
+ (double) it1 * 1000.0 / (double) ti1);
}
static void help(void)
@@ -545,56 +539,67 @@ 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)
{
int test_idct = 0, test_248_dct = 0;
- int c,i;
- int test=1;
+ int c, i;
+ int test = 1;
+ int speed = 0;
+ int err = 0;
int bits=8;
+
cpu_flags = av_get_cpu_flags();
ff_ref_dct_init();
idct_mmx_init();
- for(i=0;i<256;i++) cropTbl[i + MAX_NEG_CROP] = i;
- for(i=0;i<MAX_NEG_CROP;i++) {
+ for (i = 0; i < 256; i++)
+ cropTbl[i + MAX_NEG_CROP] = i;
+ for (i = 0; i < MAX_NEG_CROP; i++) {
cropTbl[i] = 0;
cropTbl[i + MAX_NEG_CROP + 256] = 255;
}
- for(;;) {
- c = getopt(argc, argv, "ih4");
+ for (;;) {
+ c = getopt(argc, argv, "ih4t");
if (c == -1)
break;
- switch(c) {
+ switch (c) {
case 'i':
test_idct = 1;
break;
case '4':
test_248_dct = 1;
break;
- default :
+ case 't':
+ speed = 1;
+ break;
+ default:
case 'h':
help();
return 0;
}
}
- if(optind <argc) test= atoi(argv[optind]);
+ if (optind < argc)
+ test = atoi(argv[optind]);
if(optind+1 < argc) bits= atoi(argv[optind+1]);
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 {
- 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, bits);
- }
+ const struct algo *algos = test_idct ? idct_tab : fdct_tab;
+ for (i = 0; algos[i].name; i++)
+ if (!(~cpu_flags & algos[i].mm_support)) {
+ err |= dct_error(&algos[i], test, test_idct, speed, bits);
+ }
}
- return 0;
+
+ return err;
}
diff --git a/libavcodec/h264idct_template.c b/libavcodec/h264idct_template.c
index 2acdf47a2f..d198c10c5c 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 *p_output, DCTELEM *p_input, int qmul){
#define stride 16
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/iirfilter.c b/libavcodec/iirfilter.c
index 4b9aae2a5d..4785a7c7c2 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 <stdio.h>
+
#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/libavcodec/libvorbis.c b/libavcodec/libvorbis.c
index bc219ded9b..4e05268439 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 <assert.h>
diff --git a/libavcodec/libvpxenc.c b/libavcodec/libvpxenc.c
index f5c942e0fc..ac1b79fcc7 100644
--- a/libavcodec/libvpxenc.c
+++ b/libavcodec/libvpxenc.c
@@ -31,6 +31,7 @@
#include "avcodec.h"
#include "libavutil/base64.h"
#include "libavutil/opt.h"
+#include "libavutil/mathematics.h"
/**
* Portion of struct vpx_codec_cx_pkt from vpx_encoder.h.
diff --git a/libavcodec/libxvidff.c b/libavcodec/libxvidff.c
index effd2db158..c09d9a8ff8 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 <fcntl.h>
diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c
index c3c3e15033..d819cc083f 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 2a54329a49..ca11543f73 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
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
diff --git a/libavcodec/rv34.c b/libavcodec/rv34.c
index 241132e092..72635faccd 100644
--- a/libavcodec/rv34.c
+++ b/libavcodec/rv34.c
@@ -424,17 +424,6 @@ static inline RV34VLC* choose_vlc_set(int quant, int mod, int type)
}
/**
- * 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.
*/
static int rv34_decode_mb_header(RV34DecContext *r, int8_t *intra_types)
@@ -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 e82fba2fcb..172eb6f366 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/libavcodec/vp8.c b/libavcodec/vp8.c
index c7d5a56af4..beb4de3185 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,
diff --git a/libavcodec/x86/dsputil_mmx.c b/libavcodec/x86/dsputil_mmx.c
index 1fcce36f08..d98c6a0b85 100644
--- a/libavcodec/x86/dsputil_mmx.c
+++ b/libavcodec/x86/dsputil_mmx.c
@@ -2563,8 +2563,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_);
@@ -2573,8 +2573,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, );
diff --git a/libavcodec/x86/h264_qpel_mmx.c b/libavcodec/x86/h264_qpel_mmx.c
index 66dee45134..807d8548d6 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 HAVE_YASM && ARCH_X86_32 // ARCH_X86_64 implies sse2+
+#if ARCH_X86_32 && HAVE_YASM // ARCH_X86_64 implies sse2+
QPEL16(mmxext)
#endif
diff --git a/libavfilter/x86/gradfun.c b/libavfilter/x86/gradfun.c
index 05d4a6fd6e..e892117d67 100644
--- a/libavfilter/x86/gradfun.c
+++ b/libavfilter/x86/gradfun.c
@@ -1,19 +1,21 @@
/*
+ * Copyright (C) 2009 Loren Merritt <lorenm@u.washignton.edu>
+ *
* This file is part of FFmpeg.
*
- * FFmpeg 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.
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU 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 FFmpeg; 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 FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "libavutil/cpu.h"
diff --git a/libavformat/mxfenc.c b/libavformat/mxfenc.c
index c6532a3427..9b5b4b7455 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
}
diff --git a/libavformat/oggdec.c b/libavformat/oggdec.c
index 9722d62101..597ea3bd80 100644
--- a/libavformat/oggdec.c
+++ b/libavformat/oggdec.c
@@ -201,7 +201,7 @@ static int ogg_read_page(AVFormatContext *s, int *str)
uint8_t sync[4];
int sp = 0;
- ret = avio_read (bc, sync, 4);
+ ret = avio_read(bc, sync, 4);
if (ret < 4)
return ret < 0 ? ret : AVERROR_EOF;
@@ -259,7 +259,7 @@ static int ogg_read_page(AVFormatContext *s, int *str)
if(os->psize > 0)
ogg_new_buf(ogg, idx);
- ret = avio_read (bc, os->segments, nsegs);
+ ret = avio_read(bc, os->segments, nsegs);
if (ret < nsegs)
return ret < 0 ? ret : AVERROR_EOF;
@@ -292,7 +292,7 @@ static int ogg_read_page(AVFormatContext *s, int *str)
os->buf = nb;
}
- ret = avio_read (bc, os->buf + os->bufpos, size);
+ ret = avio_read(bc, os->buf + os->bufpos, size);
if (ret < size)
return ret < 0 ? ret : AVERROR_EOF;
@@ -321,7 +321,7 @@ static int ogg_packet(AVFormatContext *s, int *str, int *dstart, int *dsize,
idx = ogg->curidx;
while (idx < 0){
- ret = ogg_read_page (s, &idx);
+ ret = ogg_read_page(s, &idx);
if (ret < 0)
return ret;
}
@@ -437,7 +437,7 @@ static int ogg_get_headers(AVFormatContext *s)
int ret;
do{
- ret = ogg_packet (s, NULL, NULL, NULL, NULL);
+ ret = ogg_packet(s, NULL, NULL, NULL, NULL);
if (ret < 0)
return ret;
}while (!ogg->headers);
@@ -501,10 +501,9 @@ static int ogg_read_header(AVFormatContext *s, AVFormatParameters *ap)
int ret, i;
ogg->curidx = -1;
//linear headers seek from start
- ret = ogg_get_headers (s);
- if (ret < 0){
+ ret = ogg_get_headers(s);
+ if (ret < 0)
return ret;
- }
for (i = 0; i < ogg->nstreams; i++)
if (ogg->streams[i].header < 0)
@@ -558,7 +557,7 @@ static int ogg_read_packet(AVFormatContext *s, AVPacket *pkt)
//Get an ogg packet
retry:
do{
- ret = ogg_packet (s, &idx, &pstart, &psize, &fpos);
+ ret = ogg_packet(s, &idx, &pstart, &psize, &fpos);
if (ret < 0)
return ret;
}while (idx < 0 || !s->streams[idx]);
@@ -574,7 +573,7 @@ retry:
os->keyframe_seek = 0;
//Alloc a pkt
- ret = av_new_packet (pkt, psize);
+ ret = av_new_packet(pkt, psize);
if (ret < 0)
return ret;
pkt->stream_index = idx;
diff --git a/libavutil/aes.c b/libavutil/aes.c
index 7c92a2757f..49093efc53 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;
}
}
diff --git a/libavutil/des.c b/libavutil/des.c
index 15ae503466..c473a5f68b 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
diff --git a/libavutil/eval.c b/libavutil/eval.c
index faa74a05fd..066bf7bab5 100644
--- a/libavutil/eval.c
+++ b/libavutil/eval.c
@@ -472,7 +472,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;
@@ -517,7 +517,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;
@@ -576,6 +576,8 @@ void av_free_expr(AVExpr *e)
#ifdef TEST
#undef printf
+#include <string.h>
+
static double const_values[] = {
M_PI,
M_E,
@@ -588,7 +590,7 @@ static const char *const_names[] = {
0
};
-int main(void)
+int main(int argc, char **argv)
{
int i;
double d;
@@ -669,13 +671,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
diff --git a/libavutil/sha.c b/libavutil/sha.c
index ff9e55720f..301d1606b4 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;
diff --git a/libswscale/swscale.c b/libswscale/swscale.c
index 3a92db5c16..714ae178ae 100644
--- a/libswscale/swscale.c
+++ b/libswscale/swscale.c
@@ -80,17 +80,6 @@ untested special converters
#define RV ( (int)(0.500*224/255*(1<<RGB2YUV_SHIFT)+0.5))
#define RU (-(int)(0.169*224/255*(1<<RGB2YUV_SHIFT)+0.5))
-static const double rgb2yuv_table[8][9]={
- {0.7152, 0.0722, 0.2126, -0.386, 0.5, -0.115, -0.454, -0.046, 0.5}, //ITU709
- {0.7152, 0.0722, 0.2126, -0.386, 0.5, -0.115, -0.454, -0.046, 0.5}, //ITU709
- {0.587 , 0.114 , 0.299 , -0.331, 0.5, -0.169, -0.419, -0.081, 0.5}, //DEFAULT / ITU601 / ITU624 / SMPTE 170M
- {0.587 , 0.114 , 0.299 , -0.331, 0.5, -0.169, -0.419, -0.081, 0.5}, //DEFAULT / ITU601 / ITU624 / SMPTE 170M
- {0.59 , 0.11 , 0.30 , -0.331, 0.5, -0.169, -0.421, -0.079, 0.5}, //FCC
- {0.587 , 0.114 , 0.299 , -0.331, 0.5, -0.169, -0.419, -0.081, 0.5}, //DEFAULT / ITU601 / ITU624 / SMPTE 170M
- {0.587 , 0.114 , 0.299 , -0.331, 0.5, -0.169, -0.419, -0.081, 0.5}, //DEFAULT / ITU601 / ITU624 / SMPTE 170M
- {0.701 , 0.087 , 0.212 , -0.384, 0.5, -0.116, -0.445, -0.055, 0.5}, //SMPTE 240M
-};
-
/*
NOTES
Special versions: fast Y 1:1 scaling (no interpolation in y direction)
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-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
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
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
-
-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
+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-$(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-$(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
-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
+$(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)
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/fate2.mak b/tests/fate2.mak
index f749a84958..c5b91e246f 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/eval b/tests/ref/fate/eval
new file mode 100644
index 0000000000..278c282344
--- /dev/null
+++ b/tests/ref/fate/eval
@@ -0,0 +1,161 @@
+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)' -> 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
+
+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
+
+Evaluating 'sqrt(1764)'
+'sqrt(1764)' -> 42.000000
+
+Evaluating 'sqrt(-1)'
+'sqrt(-1)' -> -nan
+
+Evaluating 'not(1)'
+'not(1)' -> 0.000000
+
+Evaluating 'not(NAN)'
+'not(NAN)' -> 0.000000
+
+Evaluating 'not(0)'
+'not(0)' -> 1.000000
+
+Evaluating 'pow(0,1.23)'
+'pow(0,1.23)' -> 0.000000
+
+Evaluating 'pow(PI,1.23)'
+'pow(PI,1.23)' -> 4.087844
+
+Evaluating 'PI^1.23'
+'PI^1.23' -> 4.087844
+
+Evaluating 'pow(-1,1.23)'
+'pow(-1,1.23)' -> -nan
+
+12.700000 == 12.7
+0.931323 == 0.931322575
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