Commit 5d4fd1d1 authored by Michael Niedermayer's avatar Michael Niedermayer

Merge remote-tracking branch 'qatar/master'

* qatar/master: (36 commits)
  ARM: allow unaligned buffer in fixed-point NEON FFT4
  fate: test more FFT etc sizes
  dca: set AVCodecContext frame_size for DTS audio
  YASM: Shut up unused variable compiler warning with --disable-yasm.
  x86_32: Fix build on x86_32 with --disable-yasm.
  iirfilter: add fate test
  doxygen: Add qmul docs.
  ogg: propagate return values and return more meaningful error values
  H.264: fix overreads of qscale_table
  Remove unused static tables and static inline functions.
  eval: clear Parser instances before using
  dct-test: remove 'ref' function pointer from tables
  build: Remove deleted 'check' target from .PHONY list.
  oggdec: Abort Ogg header parsing when encountering a data packet.
  Add LGPL license boilerplate to files lacking it.
  mxfenc: small typo fix
  doxygen: Fix documentation for some VP8 functions.
  sha: use AV_RB32() instead of assuming buffer can be cast to uint32_t*
  des: allow unaligned input and output buffers
  aes: allow unaligned input and output buffers
  ...

Conflicts:
	libavcodec/dct-test.c
	libavcodec/libvpxenc.c
	libavcodec/x86/dsputil_mmx.c
	libavcodec/x86/h264_qpel_mmx.c
	libavfilter/x86/gradfun.c
	libavformat/oggdec.c
Merged-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parents 96676e1a 3824ef08
...@@ -164,5 +164,5 @@ $(sort $(OBJDIRS)): ...@@ -164,5 +164,5 @@ $(sort $(OBJDIRS)):
# so this saves some time on slow systems. # so this saves some time on slow systems.
.SUFFIXES: .SUFFIXES:
.PHONY: all all-yes alltools *clean check config examples install* .PHONY: all all-yes alltools *clean config examples install*
.PHONY: testprogs uninstall* .PHONY: testprogs uninstall*
...@@ -75,9 +75,9 @@ ...@@ -75,9 +75,9 @@
.endm .endm
function fft4_neon function fft4_neon
vld1.16 {d0-d1}, [r0,:128] vld1.16 {d0-d1}, [r0]
fft4 d0, d1, d2, d3 fft4 d0, d1, d2, d3
vst1.16 {d0-d1}, [r0,:128] vst1.16 {d0-d1}, [r0]
bx lr bx lr
endfunc endfunc
......
...@@ -1650,6 +1650,7 @@ static int dca_decode_frame(AVCodecContext * avctx, ...@@ -1650,6 +1650,7 @@ static int dca_decode_frame(AVCodecContext * avctx,
//set AVCodec values with parsed data //set AVCodec values with parsed data
avctx->sample_rate = s->sample_rate; avctx->sample_rate = s->sample_rate;
avctx->bit_rate = s->bit_rate; avctx->bit_rate = s->bit_rate;
avctx->frame_size = s->sample_blocks * 32;
s->profile = FF_PROFILE_DTS; s->profile = FF_PROFILE_DTS;
......
...@@ -68,12 +68,12 @@ void ff_simple_idct_neon(DCTELEM *data); ...@@ -68,12 +68,12 @@ void ff_simple_idct_neon(DCTELEM *data);
void ff_simple_idct_axp(DCTELEM *data); void ff_simple_idct_axp(DCTELEM *data);
struct algo { struct algo {
const char *name; const char *name;
enum { FDCT, IDCT } is_idct; void (*func)(DCTELEM *block);
void (* func) (DCTELEM *block); enum formattag { NO_PERM, MMX_PERM, MMX_SIMPLE_PERM, SCALE_PERM,
void (* ref) (DCTELEM *block); SSE2_PERM, PARTTRANS_PERM } format;
enum formattag { NO_PERM,MMX_PERM, MMX_SIMPLE_PERM, SCALE_PERM, SSE2_PERM, PARTTRANS_PERM } format; int mm_support;
int mm_support; int nonspec;
}; };
#ifndef FAAN_POSTSCALE #ifndef FAAN_POSTSCALE
...@@ -84,61 +84,69 @@ struct algo { ...@@ -84,61 +84,69 @@ struct algo {
static int cpu_flags; static int cpu_flags;
struct algo algos[] = { static const struct algo fdct_tab[] = {
{"REF-DBL", 0, ff_ref_fdct, ff_ref_fdct, NO_PERM}, { "REF-DBL", ff_ref_fdct, NO_PERM },
{"FAAN", 0, ff_faandct, ff_ref_fdct, FAAN_SCALE}, { "FAAN", ff_faandct, FAAN_SCALE },
{"FAANI", 1, ff_faanidct, ff_ref_idct, NO_PERM}, { "IJG-AAN-INT", fdct_ifast, SCALE_PERM },
{"IJG-AAN-INT", 0, fdct_ifast, ff_ref_fdct, SCALE_PERM}, { "IJG-LLM-INT", ff_jpeg_fdct_islow, NO_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 #if HAVE_MMX
{"MMX", 0, ff_fdct_mmx, ff_ref_fdct, NO_PERM, AV_CPU_FLAG_MMX}, { "MMX", ff_fdct_mmx, NO_PERM, AV_CPU_FLAG_MMX },
#if HAVE_MMX2 { "MMX2", ff_fdct_mmx2, NO_PERM, AV_CPU_FLAG_MMX2 },
{"MMX2", 0, ff_fdct_mmx2, ff_ref_fdct, NO_PERM, AV_CPU_FLAG_MMX2}, { "SSE2", ff_fdct_sse2, NO_PERM, AV_CPU_FLAG_SSE2 },
{"SSE2", 0, ff_fdct_sse2, ff_ref_fdct, NO_PERM, AV_CPU_FLAG_SSE2},
#endif #endif
#if CONFIG_GPL #if HAVE_ALTIVEC
{"LIBMPEG2-MMX", 1, ff_mmx_idct, ff_ref_idct, MMX_PERM, AV_CPU_FLAG_MMX}, { "altivecfdct", fdct_altivec, NO_PERM, AV_CPU_FLAG_ALTIVEC },
{"LIBMPEG2-MMX2", 1, ff_mmxext_idct, ff_ref_idct, MMX_PERM, AV_CPU_FLAG_MMX2},
#endif #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}, #if ARCH_BFIN
{"XVID-MMX2", 1, ff_idct_xvid_mmx2, ff_ref_idct, NO_PERM, AV_CPU_FLAG_MMX2}, { "BFINfdct", ff_bfin_fdct, NO_PERM },
{"XVID-SSE2", 1, ff_idct_xvid_sse2, ff_ref_idct, SSE2_PERM, AV_CPU_FLAG_SSE2},
#endif #endif
#if HAVE_ALTIVEC { 0 }
{"altivecfdct", 0, fdct_altivec, ff_ref_fdct, NO_PERM, AV_CPU_FLAG_ALTIVEC}, };
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 #endif
#if ARCH_BFIN #if ARCH_BFIN
{"BFINfdct", 0, ff_bfin_fdct, ff_ref_fdct, NO_PERM}, { "BFINidct", ff_bfin_idct, NO_PERM },
{"BFINidct", 1, ff_bfin_idct, ff_ref_idct, NO_PERM},
#endif #endif
#if ARCH_ARM #if ARCH_ARM
{"SIMPLE-ARM", 1, ff_simple_idct_arm, ff_ref_idct, NO_PERM }, { "SIMPLE-ARM", ff_simple_idct_arm, NO_PERM },
{"INT-ARM", 1, ff_j_rev_dct_arm, ff_ref_idct, MMX_PERM }, { "INT-ARM", ff_j_rev_dct_arm, MMX_PERM },
#endif
#if HAVE_ARMV5TE #if HAVE_ARMV5TE
{"SIMPLE-ARMV5TE", 1, ff_simple_idct_armv5te, ff_ref_idct, NO_PERM }, { "SIMPLE-ARMV5TE", ff_simple_idct_armv5te,NO_PERM },
#endif #endif
#if HAVE_ARMV6 #if HAVE_ARMV6
{"SIMPLE-ARMV6", 1, ff_simple_idct_armv6, ff_ref_idct, MMX_PERM }, { "SIMPLE-ARMV6", ff_simple_idct_armv6, MMX_PERM },
#endif #endif
#if HAVE_NEON #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
#endif /* ARCH_ARM */
#if ARCH_ALPHA #if ARCH_ALPHA
{"SIMPLE-ALPHA", 1, ff_simple_idct_axp, ff_ref_idct, NO_PERM }, { "SIMPLE-ALPHA", ff_simple_idct_axp, NO_PERM },
#endif #endif
{ 0 } { 0 }
}; };
#define AANSCALE_BITS 12 #define AANSCALE_BITS 12
...@@ -148,7 +156,7 @@ uint8_t cropTbl[256 + 2 * MAX_NEG_CROP]; ...@@ -148,7 +156,7 @@ uint8_t cropTbl[256 + 2 * MAX_NEG_CROP];
static int64_t gettime(void) static int64_t gettime(void)
{ {
struct timeval tv; struct timeval tv;
gettimeofday(&tv,NULL); gettimeofday(&tv, NULL);
return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec; return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
} }
...@@ -157,18 +165,18 @@ static int64_t gettime(void) ...@@ -157,18 +165,18 @@ static int64_t gettime(void)
static short idct_mmx_perm[64]; static short idct_mmx_perm[64];
static short idct_simple_mmx_perm[64]={ static short idct_simple_mmx_perm[64] = {
0x00, 0x08, 0x04, 0x09, 0x01, 0x0C, 0x05, 0x0D, 0x00, 0x08, 0x04, 0x09, 0x01, 0x0C, 0x05, 0x0D,
0x10, 0x18, 0x14, 0x19, 0x11, 0x1C, 0x15, 0x1D, 0x10, 0x18, 0x14, 0x19, 0x11, 0x1C, 0x15, 0x1D,
0x20, 0x28, 0x24, 0x29, 0x21, 0x2C, 0x25, 0x2D, 0x20, 0x28, 0x24, 0x29, 0x21, 0x2C, 0x25, 0x2D,
0x12, 0x1A, 0x16, 0x1B, 0x13, 0x1E, 0x17, 0x1F, 0x12, 0x1A, 0x16, 0x1B, 0x13, 0x1E, 0x17, 0x1F,
0x02, 0x0A, 0x06, 0x0B, 0x03, 0x0E, 0x07, 0x0F, 0x02, 0x0A, 0x06, 0x0B, 0x03, 0x0E, 0x07, 0x0F,
0x30, 0x38, 0x34, 0x39, 0x31, 0x3C, 0x35, 0x3D, 0x30, 0x38, 0x34, 0x39, 0x31, 0x3C, 0x35, 0x3D,
0x22, 0x2A, 0x26, 0x2B, 0x23, 0x2E, 0x27, 0x2F, 0x22, 0x2A, 0x26, 0x2B, 0x23, 0x2E, 0x27, 0x2F,
0x32, 0x3A, 0x36, 0x3B, 0x33, 0x3E, 0x37, 0x3F, 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) static void idct_mmx_init(void)
{ {
...@@ -177,13 +185,12 @@ 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 */ /* the mmx/mmxext idct uses a reordered input, so we patch scan tables */
for (i = 0; i < 64; i++) { for (i = 0; i < 64; i++) {
idct_mmx_perm[i] = (i & 0x38) | ((i & 6) >> 1) | ((i & 1) << 2); 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(16, static DCTELEM, block)[64];
DECLARE_ALIGNED(8, static DCTELEM, block1)[64]; DECLARE_ALIGNED(8, static DCTELEM, block1)[64];
DECLARE_ALIGNED(8, static DCTELEM, block_org)[64]; DECLARE_ALIGNED(8, static DCTELEM, block_org)[64];
static inline void mmx_emms(void) static inline void mmx_emms(void)
{ {
...@@ -193,188 +200,177 @@ static inline void mmx_emms(void) ...@@ -193,188 +200,177 @@ static inline void mmx_emms(void)
#endif #endif
} }
static void dct_error(const char *name, int is_idct,
void (*fdct_func)(DCTELEM *block), static int dct_error(const struct algo *dct, int test, int is_idct, int speed, const int bits)
void (*fdct_ref)(DCTELEM *block), int form, int test, const int bits)
{ {
void (*ref)(DCTELEM *block) = is_idct ? ff_ref_idct : ff_ref_fdct;
int it, i, scale; int it, i, scale;
int err_inf, v; 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; int64_t sysErr[64], sysErrMax = 0;
int maxout=0; int maxout = 0;
int blockSumErrMax=0, blockSumErr; int blockSumErrMax = 0, blockSumErr;
AVLFG prng; AVLFG prng;
const int vals=1<<bits; const int vals=1<<bits;
double omse, ome;
int spec_err;
av_lfg_init(&prng, 1); av_lfg_init(&prng, 1);
err_inf = 0; err_inf = 0;
err2 = 0; err2 = 0;
for(i=0; i<64; i++) sysErr[i]=0; for (i = 0; i < 64; i++)
for(it=0;it<NB_ITS;it++) { sysErr[i] = 0;
for(i=0;i<64;i++) for (it = 0; it < NB_ITS; it++) {
for (i = 0; i < 64; i++)
block1[i] = 0; block1[i] = 0;
switch(test){ switch (test) {
case 0: case 0:
for(i=0;i<64;i++) for (i = 0; i < 64; i++)
block1[i] = (av_lfg_get(&prng) % (2*vals)) -vals; block1[i] = (av_lfg_get(&prng) % (2*vals)) -vals;
if (is_idct){ if (is_idct) {
ff_ref_fdct(block1); ff_ref_fdct(block1);
for (i = 0; i < 64; i++)
for(i=0;i<64;i++) block1[i] >>= 3;
block1[i]>>=3;
} }
break; break;
case 1:{ case 1: {
int num = av_lfg_get(&prng) % 10 + 1; int num = av_lfg_get(&prng) % 10 + 1;
for(i=0;i<num;i++) for (i = 0; i < num; i++)
block1[av_lfg_get(&prng) % 64] = av_lfg_get(&prng) % (2*vals) -vals; block1[av_lfg_get(&prng) % 64] = av_lfg_get(&prng) % (2*vals) -vals;
}break; }
break;
case 2: case 2:
block1[0] = av_lfg_get(&prng) % (16*vals) - (8*vals); block1[0] = av_lfg_get(&prng) % (16*vals) - (8*vals);
block1[63]= (block1[0]&1)^1; block1[63] = (block1[0] & 1) ^ 1;
break; break;
} }
#if 0 // simulate mismatch control for (i = 0; i < 64; i++)
{ int sum=0; block_org[i] = block1[i];
for(i=0;i<64;i++)
sum+=block1[i];
if((sum&1)==0) block1[63]^=1;
}
#endif
for(i=0; i<64; i++) if (dct->format == MMX_PERM) {
block_org[i]= block1[i]; for (i = 0; i < 64; i++)
if (form == MMX_PERM) {
for(i=0;i<64;i++)
block[idct_mmx_perm[i]] = block1[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++) for (i = 0; i < 64; i++)
block[idct_simple_mmx_perm[i]] = block1[i]; block[idct_simple_mmx_perm[i]] = block1[i];
} else if (dct->format == SSE2_PERM) {
} else if (form == SSE2_PERM) { for (i = 0; i < 64; i++)
for(i=0; i<64; i++) block[(i & 0x38) | idct_sse2_row_perm[i & 7]] = block1[i];
block[(i&0x38) | idct_sse2_row_perm[i&7]] = block1[i]; } else if (dct->format == PARTTRANS_PERM) {
} else if (form == PARTTRANS_PERM) { for (i = 0; i < 64; i++)
for(i=0; i<64; i++) block[(i & 0x24) | ((i & 3) << 3) | ((i >> 3) & 3)] = block1[i];
block[(i&0x24) | ((i&3)<<3) | ((i>>3)&3)] = block1[i];
} else { } else {
for(i=0; i<64; i++) for (i = 0; i < 64; i++)
block[i]= block1[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(); mmx_emms();
if (form == SCALE_PERM) { if (dct->format == SCALE_PERM) {
for(i=0; i<64; i++) { for (i = 0; i < 64; i++) {
scale = 8*(1 << (AANSCALE_BITS + 11)) / ff_aanscales[i]; scale = 8 * (1 << (AANSCALE_BITS + 11)) / ff_aanscales[i];
block[i] = (block[i] * scale /*+ (1<<(AANSCALE_BITS-1))*/) >> AANSCALE_BITS; block[i] = (block[i] * scale) >> AANSCALE_BITS;
} }
} }
fdct_ref(block1); ref(block1);
blockSumErr=0; blockSumErr = 0;
for(i=0;i<64;i++) { 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) if (v > err_inf)
err_inf = v; err_inf = v;
err2 += v * v; err2 += v * v;
sysErr[i] += block[i] - block1[i]; sysErr[i] += block[i] - block1[i];
blockSumErr += v; 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)
#if 0 // print different matrix pairs blockSumErrMax = blockSumErr;
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])); for (i = 0; i < 64; i++)
sysErrMax = FFMAX(sysErrMax, FFABS(sysErr[i]));
for(i=0; i<64; i++){ for (i = 0; i < 64; i++) {
if(i%8==0) printf("\n"); if (i % 8 == 0)
printf("%7d ", (int)sysErr[i]); printf("\n");
printf("%7d ", (int) sysErr[i]);
} }
printf("\n"); 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;
is_idct ? "IDCT" : "DCT", ome = (double) err_sum / NB_ITS / 64;
name, err_inf, (double)err2 / NB_ITS / 64.0, (double)sysErrMax / NB_ITS, maxout, blockSumErrMax);
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 */ /* speed test */
for(i=0;i<64;i++) for (i = 0; i < 64; i++)
block1[i] = 0; block1[i] = 0;
switch(test){
switch (test) {
case 0: case 0:
for(i=0;i<64;i++) for (i = 0; i < 64; i++)
block1[i] = av_lfg_get(&prng) % (2*vals) -vals; block1[i] = av_lfg_get(&prng) % (2*vals) -vals;
if (is_idct){ if (is_idct) {
ff_ref_fdct(block1); ff_ref_fdct(block1);
for (i = 0; i < 64; i++)
for(i=0;i<64;i++) block1[i] >>= 3;
block1[i]>>=3;
} }
break; break;
case 1:{ case 1:
case 2: case 2:
block1[0] = av_lfg_get(&prng) % (2*vals) -vals; block1[0] = av_lfg_get(&prng) % (2*vals) -vals;
block1[1] = 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[2] = av_lfg_get(&prng) % (2*vals) -vals;
block1[3] = av_lfg_get(&prng) % (2*vals) -vals; block1[3] = av_lfg_get(&prng) % (2*vals) -vals;
}break; break;
} }
if (form == MMX_PERM) { if (dct->format == MMX_PERM) {
for(i=0;i<64;i++) for (i = 0; i < 64; i++)
block[idct_mmx_perm[i]] = block1[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++) for (i = 0; i < 64; i++)
block[idct_simple_mmx_perm[i]] = block1[i]; block[idct_simple_mmx_perm[i]] = block1[i];
} else { } else {
for(i=0; i<64; i++) for (i = 0; i < 64; i++)
block[i]= block1[i]; block[i] = block1[i];
} }
ti = gettime(); ti = gettime();
it1 = 0; it1 = 0;
do { do {
for(it=0;it<NB_ITS_SPEED;it++) { for (it = 0; it < NB_ITS_SPEED; it++) {
for(i=0; i<64; i++) for (i = 0; i < 64; i++)
block[i]= block1[i]; block[i] = block1[i];
// memcpy(block, block1, sizeof(DCTELEM) * 64); dct->func(block);
// do not memcpy especially not fastmemcpy because it does movntq !!!
fdct_func(block);
} }
it1 += NB_ITS_SPEED; it1 += NB_ITS_SPEED;
ti1 = gettime() - ti; ti1 = gettime() - ti;
} while (ti1 < 1000000); } while (ti1 < 1000000);
mmx_emms(); mmx_emms();
printf("%s %s: %0.1f kdct/s\n", printf("%s %s: %0.1f kdct/s\n", is_idct ? "IDCT" : "DCT", dct->name,
is_idct ? "IDCT" : "DCT", (double) it1 * 1000.0 / (double) ti1);
name, (double)it1 * 1000.0 / (double)ti1);
return 0;
} }
DECLARE_ALIGNED(8, static uint8_t, img_dest)[64]; 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) ...@@ -392,19 +388,19 @@ static void idct248_ref(uint8_t *dest, int linesize, int16_t *block)
if (!init) { if (!init) {
init = 1; init = 1;
for(i=0;i<8;i++) { for (i = 0; i < 8; i++) {
sum = 0; sum = 0;
for(j=0;j<8;j++) { for (j = 0; j < 8; j++) {
s = (i==0) ? sqrt(1.0/8.0) : sqrt(1.0/4.0); 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); c8[i][j] = s * cos(M_PI * i * (j + 0.5) / 8.0);
sum += c8[i][j] * c8[i][j]; sum += c8[i][j] * c8[i][j];
} }
} }
for(i=0;i<4;i++) { for (i = 0; i < 4; i++) {
sum = 0; sum = 0;
for(j=0;j<4;j++) { for (j = 0; j < 4; j++) {
s = (i==0) ? sqrt(1.0/4.0) : sqrt(1.0/2.0); 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); c4[i][j] = s * cos(M_PI * i * (j + 0.5) / 4.0);
sum += c4[i][j] * c4[i][j]; sum += c4[i][j] * c4[i][j];
} }
...@@ -413,58 +409,59 @@ static void idct248_ref(uint8_t *dest, int linesize, int16_t *block) ...@@ -413,58 +409,59 @@ static void idct248_ref(uint8_t *dest, int linesize, int16_t *block)
/* butterfly */ /* butterfly */
s = 0.5 * sqrt(2.0); s = 0.5 * sqrt(2.0);
for(i=0;i<4;i++) { for (i = 0; i < 4; i++) {
for(j=0;j<8;j++) { 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) + j] =
block1[8*(2*i+1)+j] = (block[8*(2*i)+j] - block[8*(2*i+1)+j]) * s; (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 */ /* idct8 on lines */
for(i=0;i<8;i++) { for (i = 0; i < 8; i++) {
for(j=0;j<8;j++) { for (j = 0; j < 8; j++) {
sum = 0; sum = 0;
for(k=0;k<8;k++) for (k = 0; k < 8; k++)
sum += c8[k][j] * block1[8*i+k]; sum += c8[k][j] * block1[8 * i + k];
block2[8*i+j] = sum; block2[8 * i + j] = sum;
} }
} }
/* idct4 */ /* idct4 */
for(i=0;i<8;i++) { for (i = 0; i < 8; i++) {
for(j=0;j<4;j++) { for (j = 0; j < 4; j++) {
/* top */ /* top */
sum = 0; sum = 0;
for(k=0;k<4;k++) for (k = 0; k < 4; k++)
sum += c4[k][j] * block2[8*(2*k)+i]; sum += c4[k][j] * block2[8 * (2 * k) + i];
block3[8*(2*j)+i] = sum; block3[8 * (2 * j) + i] = sum;
/* bottom */ /* bottom */
sum = 0; sum = 0;
for(k=0;k<4;k++) for (k = 0; k < 4; k++)
sum += c4[k][j] * block2[8*(2*k+1)+i]; sum += c4[k][j] * block2[8 * (2 * k + 1) + i];
block3[8*(2*j+1)+i] = sum; block3[8 * (2 * j + 1) + i] = sum;
} }
} }
/* clamp and store the result */ /* clamp and store the result */
for(i=0;i<8;i++) { for (i = 0; i < 8; i++) {
for(j=0;j<8;j++) { for (j = 0; j < 8; j++) {
v = block3[8*i+j]; v = block3[8 * i + j];
if (v < 0) if (v < 0) v = 0;
v = 0; else if (v > 255) v = 255;
else if (v > 255) dest[i * linesize + j] = (int) rint(v);
v = 255;
dest[i * linesize + j] = (int)rint(v);
} }
} }
} }
static void idct248_error(const char *name, 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; int it, i, it1, ti, ti1, err_max, v;
AVLFG prng; AVLFG prng;
av_lfg_init(&prng, 1); av_lfg_init(&prng, 1);
...@@ -472,23 +469,22 @@ static void idct248_error(const char *name, ...@@ -472,23 +469,22 @@ static void idct248_error(const char *name,
/* just one test to see if code is correct (precision is less /* just one test to see if code is correct (precision is less
important here) */ important here) */
err_max = 0; err_max = 0;
for(it=0;it<NB_ITS;it++) { for (it = 0; it < NB_ITS; it++) {
/* XXX: use forward transform to generate values */ /* 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[i] = av_lfg_get(&prng) % 256 - 128;
block1[0] += 1024; block1[0] += 1024;
for(i=0; i<64; i++) for (i = 0; i < 64; i++)
block[i]= block1[i]; block[i] = block1[i];
idct248_ref(img_dest1, 8, block); idct248_ref(img_dest1, 8, block);
for(i=0; i<64; i++) for (i = 0; i < 64; i++)
block[i]= block1[i]; block[i] = block1[i];
idct248_put(img_dest, 8, block); idct248_put(img_dest, 8, block);
for(i=0;i<64;i++) { for (i = 0; i < 64; i++) {
v = abs((int)img_dest[i] - (int)img_dest1[i]); v = abs((int) img_dest[i] - (int) img_dest1[i]);
if (v == 255) if (v == 255)
printf("%d %d\n", img_dest[i], img_dest1[i]); printf("%d %d\n", img_dest[i], img_dest1[i]);
if (v > err_max) if (v > err_max)
...@@ -514,18 +510,17 @@ static void idct248_error(const char *name, ...@@ -514,18 +510,17 @@ static void idct248_error(const char *name,
} }
#endif #endif
} }
printf("%s %s: err_inf=%d\n", printf("%s %s: err_inf=%d\n", 1 ? "IDCT248" : "DCT248", name, err_max);
1 ? "IDCT248" : "DCT248",
name, err_max); if (!speed)
return;
ti = gettime(); ti = gettime();
it1 = 0; it1 = 0;
do { do {
for(it=0;it<NB_ITS_SPEED;it++) { for (it = 0; it < NB_ITS_SPEED; it++) {
for(i=0; i<64; i++) for (i = 0; i < 64; i++)
block[i]= block1[i]; block[i] = block1[i];
// memcpy(block, block1, sizeof(DCTELEM) * 64);
// do not memcpy especially not fastmemcpy because it does movntq !!!
idct248_put(img_dest, 8, block); idct248_put(img_dest, 8, block);
} }
it1 += NB_ITS_SPEED; it1 += NB_ITS_SPEED;
...@@ -533,9 +528,8 @@ static void idct248_error(const char *name, ...@@ -533,9 +528,8 @@ static void idct248_error(const char *name,
} while (ti1 < 1000000); } while (ti1 < 1000000);
mmx_emms(); mmx_emms();
printf("%s %s: %0.1f kdct/s\n", printf("%s %s: %0.1f kdct/s\n", 1 ? "IDCT248" : "DCT248", name,
1 ? "IDCT248" : "DCT248", (double) it1 * 1000.0 / (double) ti1);
name, (double)it1 * 1000.0 / (double)ti1);
} }
static void help(void) static void help(void)
...@@ -545,56 +539,67 @@ static void help(void) ...@@ -545,56 +539,67 @@ static void help(void)
" 1 -> test with random sparse matrixes\n" " 1 -> test with random sparse matrixes\n"
" 2 -> do 3. test from mpeg4 std\n" " 2 -> do 3. test from mpeg4 std\n"
"-i test IDCT implementations\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 main(int argc, char **argv)
{ {
int test_idct = 0, test_248_dct = 0; int test_idct = 0, test_248_dct = 0;
int c,i; int c, i;
int test=1; int test = 1;
int speed = 0;
int err = 0;
int bits=8; int bits=8;
cpu_flags = av_get_cpu_flags(); cpu_flags = av_get_cpu_flags();
ff_ref_dct_init(); ff_ref_dct_init();
idct_mmx_init(); idct_mmx_init();
for(i=0;i<256;i++) cropTbl[i + MAX_NEG_CROP] = i; for (i = 0; i < 256; i++)
for(i=0;i<MAX_NEG_CROP;i++) { cropTbl[i + MAX_NEG_CROP] = i;
for (i = 0; i < MAX_NEG_CROP; i++) {
cropTbl[i] = 0; cropTbl[i] = 0;
cropTbl[i + MAX_NEG_CROP + 256] = 255; cropTbl[i + MAX_NEG_CROP + 256] = 255;
} }
for(;;) { for (;;) {
c = getopt(argc, argv, "ih4"); c = getopt(argc, argv, "ih4t");
if (c == -1) if (c == -1)
break; break;
switch(c) { switch (c) {
case 'i': case 'i':
test_idct = 1; test_idct = 1;
break; break;
case '4': case '4':
test_248_dct = 1; test_248_dct = 1;
break; break;
default : case 't':
speed = 1;
break;
default:
case 'h': case 'h':
help(); help();
return 0; 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]); if(optind+1 < argc) bits= atoi(argv[optind+1]);
printf("ffmpeg DCT/IDCT test\n"); printf("ffmpeg DCT/IDCT test\n");
if (test_248_dct) { if (test_248_dct) {
idct248_error("SIMPLE-C", ff_simple_idct248_put); idct248_error("SIMPLE-C", ff_simple_idct248_put, speed);
} else { } else {
for (i=0;algos[i].name;i++) const struct algo *algos = test_idct ? idct_tab : fdct_tab;
if (algos[i].is_idct == test_idct && !(~cpu_flags & algos[i].mm_support)) { for (i = 0; algos[i].name; i++)
dct_error (algos[i].name, algos[i].is_idct, algos[i].func, algos[i].ref, algos[i].format, test, bits); if (!(~cpu_flags & algos[i].mm_support)) {
} err |= dct_error(&algos[i], test, test_idct, speed, bits);
}
} }
return 0;
return err;
} }
...@@ -237,6 +237,7 @@ void FUNCC(ff_h264_idct_add8)(uint8_t **dest, const int *block_offset, DCTELEM * ...@@ -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. * 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){ void FUNCC(ff_h264_luma_dc_dequant_idct)(DCTELEM *p_output, DCTELEM *p_input, int qmul){
#define stride 16 #define stride 16
......
/*
* 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" #include "dsputil.h"
#ifndef BIT_DEPTH #ifndef BIT_DEPTH
......
...@@ -311,6 +311,9 @@ av_cold void ff_iir_filter_free_coeffs(struct FFIIRFilterCoeffs *coeffs) ...@@ -311,6 +311,9 @@ av_cold void ff_iir_filter_free_coeffs(struct FFIIRFilterCoeffs *coeffs)
} }
#ifdef TEST #ifdef TEST
#undef printf
#include <stdio.h>
#define FILT_ORDER 4 #define FILT_ORDER 4
#define SIZE 1024 #define SIZE 1024
int main(void) int main(void)
...@@ -320,7 +323,6 @@ int main(void) ...@@ -320,7 +323,6 @@ int main(void)
float cutoff_coeff = 0.4; float cutoff_coeff = 0.4;
int16_t x[SIZE], y[SIZE]; int16_t x[SIZE], y[SIZE];
int i; int i;
FILE* fd;
fcoeffs = ff_iir_filter_init_coeffs(NULL, FF_FILTER_TYPE_BUTTERWORTH, fcoeffs = ff_iir_filter_init_coeffs(NULL, FF_FILTER_TYPE_BUTTERWORTH,
FF_FILTER_MODE_LOWPASS, FILT_ORDER, FF_FILTER_MODE_LOWPASS, FILT_ORDER,
...@@ -333,13 +335,8 @@ int main(void) ...@@ -333,13 +335,8 @@ int main(void)
ff_iir_filter(fcoeffs, fstate, SIZE, x, 1, y, 1); ff_iir_filter(fcoeffs, fstate, SIZE, x, 1, y, 1);
fd = fopen("in.bin", "w"); for (i = 0; i < SIZE; i++)
fwrite(x, sizeof(x[0]), SIZE, fd); printf("%6d %6d\n", x[i], y[i]);
fclose(fd);
fd = fopen("out.bin", "w");
fwrite(y, sizeof(y[0]), SIZE, fd);
fclose(fd);
ff_iir_filter_free_coeffs(fcoeffs); ff_iir_filter_free_coeffs(fcoeffs);
ff_iir_filter_free_state(fstate); ff_iir_filter_free_state(fstate);
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include "avcodec.h" #include "avcodec.h"
#include "bytestream.h" #include "bytestream.h"
#include "vorbis.h" #include "vorbis.h"
#include "libavutil/mathematics.h"
#undef NDEBUG #undef NDEBUG
#include <assert.h> #include <assert.h>
......
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#include "avcodec.h" #include "avcodec.h"
#include "libavutil/base64.h" #include "libavutil/base64.h"
#include "libavutil/opt.h" #include "libavutil/opt.h"
#include "libavutil/mathematics.h"
/** /**
* Portion of struct vpx_codec_cx_pkt from vpx_encoder.h. * Portion of struct vpx_codec_cx_pkt from vpx_encoder.h.
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include "avcodec.h" #include "avcodec.h"
#include "libavutil/cpu.h" #include "libavutil/cpu.h"
#include "libavutil/intreadwrite.h" #include "libavutil/intreadwrite.h"
#include "libavutil/mathematics.h"
#include "libxvid_internal.h" #include "libxvid_internal.h"
#if !HAVE_MKSTEMP #if !HAVE_MKSTEMP
#include <fcntl.h> #include <fcntl.h>
......
...@@ -285,9 +285,10 @@ int ff_alloc_picture(MpegEncContext *s, Picture *pic, int shared){ ...@@ -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->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) 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->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){ if(s->out_format == FMT_H264){
for(i=0; i<2; i++){ 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) 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){ ...@@ -339,7 +340,7 @@ static void free_picture(MpegEncContext *s, Picture *pic){
av_freep(&pic->mc_mb_var); av_freep(&pic->mc_mb_var);
av_freep(&pic->mb_mean); av_freep(&pic->mb_mean);
av_freep(&pic->mbskip_table); 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->mb_type_base);
av_freep(&pic->dct_coeff); av_freep(&pic->dct_coeff);
av_freep(&pic->pan_scan); av_freep(&pic->pan_scan);
......
...@@ -88,6 +88,7 @@ typedef struct Picture{ ...@@ -88,6 +88,7 @@ typedef struct Picture{
* halfpel luma planes. * halfpel luma planes.
*/ */
uint8_t *interpolated[3]; uint8_t *interpolated[3];
int8_t *qscale_table_base;
int16_t (*motion_val_base[2])[2]; int16_t (*motion_val_base[2])[2];
uint32_t *mb_type_base; uint32_t *mb_type_base;
#define MB_TYPE_INTRA MB_TYPE_INTRA4x4 //default mb_type if there is just one type #define MB_TYPE_INTRA MB_TYPE_INTRA4x4 //default mb_type if there is just one type
......
/*
* 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 * @file
* This header is provided for compatibility only and will be removed * This header is provided for compatibility only and will be removed
......
...@@ -423,17 +423,6 @@ static inline RV34VLC* choose_vlc_set(int quant, int mod, int type) ...@@ -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)]]; : &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. * 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) ...@@ -1255,15 +1244,6 @@ static int check_slice_end(RV34DecContext *r, MpegEncContext *s)
return 0; 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) static int rv34_decode_slice(RV34DecContext *r, int end, const uint8_t* buf, int buf_size)
{ {
MpegEncContext *s = &r->s; MpegEncContext *s = &r->s;
......
...@@ -45,7 +45,6 @@ ...@@ -45,7 +45,6 @@
#define MB_INTRA_VLC_BITS 9 #define MB_INTRA_VLC_BITS 9
#define DC_VLC_BITS 9 #define DC_VLC_BITS 9
#define AC_VLC_BITS 9 #define AC_VLC_BITS 9
static const uint16_t table_mb_intra[64][2];
static const uint16_t vlc_offs[] = { static const uint16_t vlc_offs[] = {
......
...@@ -641,8 +641,6 @@ void decode_mb_mode(VP8Context *s, VP8Macroblock *mb, int mb_x, int mb_y, uint8_ ...@@ -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 block destination for block coefficients
* @param probs probabilities to use when reading trees from the bitstream * @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 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 * @param qmul array holding the dc/ac dequant factor at position 0/1
* @return 0 if no coeffs were decoded * @return 0 if no coeffs were decoded
* otherwise, the index of the last coeff decoded plus one * otherwise, the index of the last coeff decoded plus one
...@@ -701,6 +699,17 @@ skip_eob: ...@@ -701,6 +699,17 @@ skip_eob:
} }
#endif #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 static av_always_inline
int decode_block_coeffs(VP56RangeCoder *c, DCTELEM block[16], int decode_block_coeffs(VP56RangeCoder *c, DCTELEM block[16],
uint8_t probs[16][3][NUM_DCT_TOKENS-1], uint8_t probs[16][3][NUM_DCT_TOKENS-1],
...@@ -1034,10 +1043,9 @@ static const uint8_t subpel_idx[3][8] = { ...@@ -1034,10 +1043,9 @@ static const uint8_t subpel_idx[3][8] = {
}; };
/** /**
* Generic MC function. * luma MC function
* *
* @param s VP8 decoding context * @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 dst target buffer for block data at block position
* @param ref reference picture buffer at origin (0, 0) * @param ref reference picture buffer at origin (0, 0)
* @param mv motion vector (relative to block position) to get pixel data from * @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, ...@@ -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 static av_always_inline
void vp8_mc_chroma(VP8Context *s, uint8_t *dst1, uint8_t *dst2, AVFrame *ref, void vp8_mc_chroma(VP8Context *s, uint8_t *dst1, uint8_t *dst2, AVFrame *ref,
const VP56mv *mv, int x_off, int y_off, const VP56mv *mv, int x_off, int y_off,
......
...@@ -2563,8 +2563,8 @@ void dsputil_init_mmx(DSPContext* c, AVCodecContext *avctx) ...@@ -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, 1, 8, mmx2, );
SET_QPEL_FUNCS(avg_h264_qpel, 2, 4, mmx2, ); SET_QPEL_FUNCS(avg_h264_qpel, 2, 4, mmx2, );
} }
#if HAVE_YASM
else if (bit_depth == 10) { else if (bit_depth == 10) {
#if HAVE_YASM
#if !ARCH_X86_64 #if !ARCH_X86_64
SET_QPEL_FUNCS(avg_h264_qpel, 0, 16, 10_mmxext, ff_); SET_QPEL_FUNCS(avg_h264_qpel, 0, 16, 10_mmxext, ff_);
SET_QPEL_FUNCS(put_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) ...@@ -2573,8 +2573,8 @@ void dsputil_init_mmx(DSPContext* c, AVCodecContext *avctx)
#endif #endif
SET_QPEL_FUNCS(put_h264_qpel, 2, 4, 10_mmxext, ff_); SET_QPEL_FUNCS(put_h264_qpel, 2, 4, 10_mmxext, ff_);
SET_QPEL_FUNCS(avg_h264_qpel, 2, 4, 10_mmxext, ff_); SET_QPEL_FUNCS(avg_h264_qpel, 2, 4, 10_mmxext, ff_);
}
#endif #endif
}
SET_QPEL_FUNCS(put_2tap_qpel, 0, 16, mmx2, ); SET_QPEL_FUNCS(put_2tap_qpel, 0, 16, mmx2, );
SET_QPEL_FUNCS(put_2tap_qpel, 1, 8, mmx2, ); SET_QPEL_FUNCS(put_2tap_qpel, 1, 8, mmx2, );
......
...@@ -1294,6 +1294,6 @@ QPEL16_OP(mc31, MMX)\ ...@@ -1294,6 +1294,6 @@ QPEL16_OP(mc31, MMX)\
QPEL16_OP(mc32, MMX)\ QPEL16_OP(mc32, MMX)\
QPEL16_OP(mc33, 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) QPEL16(mmxext)
#endif #endif
/* /*
* Copyright (C) 2009 Loren Merritt <lorenm@u.washignton.edu>
*
* This file is part of FFmpeg. * This file is part of FFmpeg.
* *
* FFmpeg is free software; you can redistribute it and/or modify * FFmpeg is free software; you can redistribute it and/or
* it under the terms of the GNU General Public License as published by * modify it under the terms of the GNU Lesser General Public
* the Free Software Foundation; either version 2 of the License, or * License as published by the Free Software Foundation; either
* (at your option) any later version. * version 2.1 of the License, or (at your option) any later version.
* *
* FFmpeg is distributed in the hope that it will be useful, * FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* GNU General Public License for more details. * Lesser General Public License for more details.
* *
* You should have received a copy of the GNU General Public License along * You should have received a copy of the GNU Lesser General Public
* with FFmpeg; if not, write to the Free Software Foundation, Inc., * License along with FFmpeg; if not, write to the Free Software
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
#include "libavutil/cpu.h" #include "libavutil/cpu.h"
......
...@@ -1549,7 +1549,7 @@ static uint32_t ff_framenum_to_12m_time_code(unsigned frame, int drop, int fps) ...@@ -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) << 12) | // tens of minutes
((((frame / (fps * 60)) % 60) % 10) << 8) | // units of minutes ((((frame / (fps * 60)) % 60) % 10) << 8) | // units of minutes
(0 << 7) | // b1 (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) << 4) | // tens of hours
( (frame / (fps * 3600) % 24)) % 10; // units of hours ( (frame / (fps * 3600) % 24)) % 10; // units of hours
} }
......
...@@ -201,7 +201,7 @@ static int ogg_read_page(AVFormatContext *s, int *str) ...@@ -201,7 +201,7 @@ static int ogg_read_page(AVFormatContext *s, int *str)
uint8_t sync[4]; uint8_t sync[4];
int sp = 0; int sp = 0;
ret = avio_read (bc, sync, 4); ret = avio_read(bc, sync, 4);
if (ret < 4) if (ret < 4)
return ret < 0 ? ret : AVERROR_EOF; return ret < 0 ? ret : AVERROR_EOF;
...@@ -259,7 +259,7 @@ static int ogg_read_page(AVFormatContext *s, int *str) ...@@ -259,7 +259,7 @@ static int ogg_read_page(AVFormatContext *s, int *str)
if(os->psize > 0) if(os->psize > 0)
ogg_new_buf(ogg, idx); ogg_new_buf(ogg, idx);
ret = avio_read (bc, os->segments, nsegs); ret = avio_read(bc, os->segments, nsegs);
if (ret < nsegs) if (ret < nsegs)
return ret < 0 ? ret : AVERROR_EOF; return ret < 0 ? ret : AVERROR_EOF;
...@@ -292,7 +292,7 @@ static int ogg_read_page(AVFormatContext *s, int *str) ...@@ -292,7 +292,7 @@ static int ogg_read_page(AVFormatContext *s, int *str)
os->buf = nb; os->buf = nb;
} }
ret = avio_read (bc, os->buf + os->bufpos, size); ret = avio_read(bc, os->buf + os->bufpos, size);
if (ret < size) if (ret < size)
return ret < 0 ? ret : AVERROR_EOF; return ret < 0 ? ret : AVERROR_EOF;
...@@ -321,7 +321,7 @@ static int ogg_packet(AVFormatContext *s, int *str, int *dstart, int *dsize, ...@@ -321,7 +321,7 @@ static int ogg_packet(AVFormatContext *s, int *str, int *dstart, int *dsize,
idx = ogg->curidx; idx = ogg->curidx;
while (idx < 0){ while (idx < 0){
ret = ogg_read_page (s, &idx); ret = ogg_read_page(s, &idx);
if (ret < 0) if (ret < 0)
return ret; return ret;
} }
...@@ -437,7 +437,7 @@ static int ogg_get_headers(AVFormatContext *s) ...@@ -437,7 +437,7 @@ static int ogg_get_headers(AVFormatContext *s)
int ret; int ret;
do{ do{
ret = ogg_packet (s, NULL, NULL, NULL, NULL); ret = ogg_packet(s, NULL, NULL, NULL, NULL);
if (ret < 0) if (ret < 0)
return ret; return ret;
}while (!ogg->headers); }while (!ogg->headers);
...@@ -501,10 +501,9 @@ static int ogg_read_header(AVFormatContext *s, AVFormatParameters *ap) ...@@ -501,10 +501,9 @@ static int ogg_read_header(AVFormatContext *s, AVFormatParameters *ap)
int ret, i; int ret, i;
ogg->curidx = -1; ogg->curidx = -1;
//linear headers seek from start //linear headers seek from start
ret = ogg_get_headers (s); ret = ogg_get_headers(s);
if (ret < 0){ if (ret < 0)
return ret; return ret;
}
for (i = 0; i < ogg->nstreams; i++) for (i = 0; i < ogg->nstreams; i++)
if (ogg->streams[i].header < 0) if (ogg->streams[i].header < 0)
...@@ -558,7 +557,7 @@ static int ogg_read_packet(AVFormatContext *s, AVPacket *pkt) ...@@ -558,7 +557,7 @@ static int ogg_read_packet(AVFormatContext *s, AVPacket *pkt)
//Get an ogg packet //Get an ogg packet
retry: retry:
do{ do{
ret = ogg_packet (s, &idx, &pstart, &psize, &fpos); ret = ogg_packet(s, &idx, &pstart, &psize, &fpos);
if (ret < 0) if (ret < 0)
return ret; return ret;
}while (idx < 0 || !s->streams[idx]); }while (idx < 0 || !s->streams[idx]);
...@@ -574,7 +573,7 @@ retry: ...@@ -574,7 +573,7 @@ retry:
os->keyframe_seek = 0; os->keyframe_seek = 0;
//Alloc a pkt //Alloc a pkt
ret = av_new_packet (pkt, psize); ret = av_new_packet(pkt, psize);
if (ret < 0) if (ret < 0)
return ret; return ret;
pkt->stream_index = idx; pkt->stream_index = idx;
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include "common.h" #include "common.h"
#include "aes.h" #include "aes.h"
#include "intreadwrite.h"
typedef union { typedef union {
uint64_t u64[2]; uint64_t u64[2];
...@@ -67,6 +68,20 @@ static inline void addkey(av_aes_block *dst, const av_aes_block *src, ...@@ -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]; 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) 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); 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, ...@@ -119,32 +134,28 @@ static inline void crypt(AVAES *a, int s, const uint8_t *sbox,
subshift(&a->state[0], s, sbox); subshift(&a->state[0], s, sbox);
} }
void av_aes_crypt(AVAES *a, uint8_t *dst_, const uint8_t *src_, void av_aes_crypt(AVAES *a, uint8_t *dst, const uint8_t *src,
int count, uint8_t *iv_, int decrypt) 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--) { 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) { if (decrypt) {
crypt(a, 0, inv_sbox, dec_multbl); crypt(a, 0, inv_sbox, dec_multbl);
if (iv) { if (iv) {
addkey(&a->state[0], &a->state[0], iv); addkey_s(&a->state[0], iv, &a->state[0]);
*iv = *src; memcpy(iv, src, 16);
} }
addkey(dst, &a->state[0], &a->round_key[0]); addkey_d(dst, &a->state[0], &a->round_key[0]);
} else { } else {
if (iv) 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); 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) if (iv)
*iv = *dst; memcpy(iv, dst, 16);
} }
src++; src += 16;
dst++; dst += 16;
} }
} }
......
...@@ -299,10 +299,10 @@ int av_des_init(AVDES *d, const uint8_t *key, int key_bits, int decrypt) { ...@@ -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) { 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) { while (count-- > 0) {
uint64_t dst_val; 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) { if (decrypt) {
uint64_t tmp = src_val; uint64_t tmp = src_val;
if (d->triple_des) { 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 ...@@ -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; iv_val = iv ? dst_val : 0;
} }
*(uint64_t *)dst = av_be2ne64(dst_val); AV_WB64(dst, dst_val);
src += 8; src += 8;
dst += 8; dst += 8;
} }
if (iv) if (iv)
*(uint64_t *)iv = av_be2ne64(iv_val); AV_WB64(iv, iv_val);
} }
#ifdef TEST #ifdef TEST
......
...@@ -472,7 +472,7 @@ int av_expr_parse(AVExpr **expr, const char *s, ...@@ -472,7 +472,7 @@ int av_expr_parse(AVExpr **expr, const char *s,
const char * const *func2_names, double (* const *funcs2)(void *, double, double), const char * const *func2_names, double (* const *funcs2)(void *, double, double),
int log_offset, void *log_ctx) int log_offset, void *log_ctx)
{ {
Parser p; Parser p = { 0 };
AVExpr *e = NULL; AVExpr *e = NULL;
char *w = av_malloc(strlen(s) + 1); char *w = av_malloc(strlen(s) + 1);
char *wp = w; char *wp = w;
...@@ -517,7 +517,7 @@ end: ...@@ -517,7 +517,7 @@ end:
double av_expr_eval(AVExpr *e, const double *const_values, void *opaque) double av_expr_eval(AVExpr *e, const double *const_values, void *opaque)
{ {
Parser p; Parser p = { 0 };
p.const_values = const_values; p.const_values = const_values;
p.opaque = opaque; p.opaque = opaque;
...@@ -576,6 +576,8 @@ void av_free_expr(AVExpr *e) ...@@ -576,6 +576,8 @@ void av_free_expr(AVExpr *e)
#ifdef TEST #ifdef TEST
#undef printf #undef printf
#include <string.h>
static double const_values[] = { static double const_values[] = {
M_PI, M_PI,
M_E, M_E,
...@@ -588,7 +590,7 @@ static const char *const_names[] = { ...@@ -588,7 +590,7 @@ static const char *const_names[] = {
0 0
}; };
int main(void) int main(int argc, char **argv)
{ {
int i; int i;
double d; double d;
...@@ -669,13 +671,16 @@ int main(void) ...@@ -669,13 +671,16 @@ int main(void)
NULL, NULL, NULL, NULL, NULL, 0, NULL); NULL, NULL, NULL, NULL, NULL, 0, NULL);
printf("%f == 0.931322575\n", d); printf("%f == 0.931322575\n", d);
for (i=0; i<1050; i++) { if (argc > 1 && !strcmp(argv[1], "-t")) {
START_TIMER 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)", av_expr_parse_and_eval(&d, "1+(5-2)^(3-1)+1/2+sin(PI)-max(-2.2,-3.1)",
const_names, const_values, const_names, const_values,
NULL, NULL, NULL, NULL, NULL, 0, NULL); NULL, NULL, NULL, NULL, NULL, 0, NULL);
STOP_TIMER("av_expr_parse_and_eval") STOP_TIMER("av_expr_parse_and_eval");
}
} }
return 0; return 0;
} }
#endif #endif
...@@ -42,7 +42,7 @@ const int av_sha_size = sizeof(AVSHA); ...@@ -42,7 +42,7 @@ const int av_sha_size = sizeof(AVSHA);
#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits)))) #define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))
/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */ /* (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 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); #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]) ...@@ -67,7 +67,7 @@ static void sha1_transform(uint32_t state[5], const uint8_t buffer[64])
for (i = 0; i < 80; i++) { for (i = 0; i < 80; i++) {
int t; int t;
if (i < 16) if (i < 16)
t = av_be2ne32(((uint32_t*)buffer)[i]); t = AV_RB32(buffer + 4 * i);
else else
t = rol(block[i-3] ^ block[i-8] ^ block[i-14] ^ block[i-16], 1); t = rol(block[i-3] ^ block[i-8] ^ block[i-14] ^ block[i-16], 1);
block[i] = t; block[i] = t;
......
...@@ -80,17 +80,6 @@ untested special converters ...@@ -80,17 +80,6 @@ untested special converters
#define RV ( (int)(0.500*224/255*(1<<RGB2YUV_SHIFT)+0.5)) #define RV ( (int)(0.500*224/255*(1<<RGB2YUV_SHIFT)+0.5))
#define RU (-(int)(0.169*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 NOTES
Special versions: fast Y 1:1 scaling (no interpolation in y direction) Special versions: fast Y 1:1 scaling (no interpolation in y direction)
......
...@@ -41,6 +41,7 @@ include $(SRC_PATH)/tests/fate/aac.mak ...@@ -41,6 +41,7 @@ include $(SRC_PATH)/tests/fate/aac.mak
include $(SRC_PATH)/tests/fate/als.mak include $(SRC_PATH)/tests/fate/als.mak
include $(SRC_PATH)/tests/fate/amrnb.mak include $(SRC_PATH)/tests/fate/amrnb.mak
include $(SRC_PATH)/tests/fate/amrwb.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/fft.mak
include $(SRC_PATH)/tests/fate/h264.mak include $(SRC_PATH)/tests/fate/h264.mak
include $(SRC_PATH)/tests/fate/libavutil.mak include $(SRC_PATH)/tests/fate/libavutil.mak
......
...@@ -123,6 +123,7 @@ if test -e "$ref"; then ...@@ -123,6 +123,7 @@ if test -e "$ref"; then
diff) diff -u -w "$ref" "$outfile" >$cmpfile ;; diff) diff -u -w "$ref" "$outfile" >$cmpfile ;;
oneoff) oneoff "$ref" "$outfile" "$fuzz" >$cmpfile ;; oneoff) oneoff "$ref" "$outfile" "$fuzz" >$cmpfile ;;
stddev) stddev "$ref" "$outfile" "$fuzz" >$cmpfile ;; stddev) stddev "$ref" "$outfile" "$fuzz" >$cmpfile ;;
null) cat "$outfile" >$cmpfile ;;
esac esac
cmperr=$? cmperr=$?
test $err = 0 && err=$cmperr test $err = 0 && err=$cmperr
......
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
FATE_FFT = fate-fft fate-ifft \ define DEF_FFT
fate-mdct fate-imdct \ FATE_FFT += fate-fft-$(1) fate-ifft-$(1) \
fate-rdft fate-irdft \ fate-mdct-$(1) fate-imdct-$(1) \
fate-dct1d fate-idct1d 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-fft-$(N): CMD = run libavcodec/fft-test -n$(1)
fate-mdct: CMD = run libavcodec/fft-test -m fate-ifft-$(N): CMD = run libavcodec/fft-test -n$(1) -i
fate-imdct: CMD = run libavcodec/fft-test -m -i fate-mdct-$(N): CMD = run libavcodec/fft-test -n$(1) -m
fate-rdft: CMD = run libavcodec/fft-test -r fate-imdct-$(N): CMD = run libavcodec/fft-test -n$(1) -m -i
fate-irdft: CMD = run libavcodec/fft-test -r -i fate-rdft-$(N): CMD = run libavcodec/fft-test -n$(1) -r
fate-dct1d: CMD = run libavcodec/fft-test -d fate-irdft-$(N): CMD = run libavcodec/fft-test -n$(1) -r -i
fate-idct1d: CMD = run libavcodec/fft-test -d -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-test: $(FATE_FFT)
$(FATE_FFT): libavcodec/fft-test$(EXESUF) $(FATE_FFT): libavcodec/fft-test$(EXESUF)
$(FATE_FFT): REF = /dev/null $(FATE_FFT): REF = /dev/null
FATE_FFT_FIXED = fate-fft-fixed fate-ifft-fixed \ define DEF_FFT_FIXED
fate-mdct-fixed fate-imdct-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 $(foreach N, 4 5 6 7 8 9 10 11 12, $(eval $(call DEF_FFT_FIXED,$(N))))
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-test: $(FATE_FFT_FIXED) fate-fft-fixed-test: $(FATE_FFT_FIXED)
$(FATE_FFT_FIXED): libavcodec/fft-fixed-test$(EXESUF) $(FATE_FFT_FIXED): libavcodec/fft-fixed-test$(EXESUF)
......
...@@ -21,6 +21,10 @@ fate-des: libavutil/des-test$(EXESUF) ...@@ -21,6 +21,10 @@ fate-des: libavutil/des-test$(EXESUF)
fate-des: CMD = run libavutil/des-test fate-des: CMD = run libavutil/des-test
fate-des: REF = /dev/null 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_TESTS += fate-md5
fate-md5: libavutil/md5-test$(EXESUF) fate-md5: libavutil/md5-test$(EXESUF)
fate-md5: CMD = run libavutil/md5-test fate-md5: CMD = run libavutil/md5-test
......
...@@ -218,3 +218,7 @@ fate-musepack7: CMD = pcm -i $(SAMPLES)/musepack/inside-mp7.mpc ...@@ -218,3 +218,7 @@ fate-musepack7: CMD = pcm -i $(SAMPLES)/musepack/inside-mp7.mpc
fate-musepack7: CMP = oneoff fate-musepack7: CMP = oneoff
fate-musepack7: REF = $(SAMPLES)/musepack/inside-mp7.pcm fate-musepack7: REF = $(SAMPLES)/musepack/inside-mp7.pcm
fate-musepack7: FUZZ = 1 fate-musepack7: FUZZ = 1
FATE_TESTS += fate-iirfilter
fate-iirfilter: libavcodec/iirfilter-test$(EXESUF)
fate-iirfilter: CMD = run libavcodec/iirfilter-test
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
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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment