Merge commit 'a6a750c7ef240b72ce01e9653343a0ddf247d196'
authorClément Bœsch <clement@stupeflix.com>
Wed, 22 Jun 2016 11:44:29 +0000 (13:44 +0200)
committerClément Bœsch <clement@stupeflix.com>
Wed, 22 Jun 2016 11:44:34 +0000 (13:44 +0200)
* commit 'a6a750c7ef240b72ce01e9653343a0ddf247d196':
  tests: Move all test programs to a subdirectory

Merged-by: Clément Bœsch <clement@stupeflix.com>
178 files changed:
.gitignore
common.mak
libavcodec/Makefile
libavcodec/arm/dct-test.c [deleted file]
libavcodec/avfft-test.c [deleted file]
libavcodec/cabac-test.c [deleted file]
libavcodec/dct-test.c [deleted file]
libavcodec/fft-fixed-test.c [deleted file]
libavcodec/fft-fixed32-test.c [deleted file]
libavcodec/fft-test.c [deleted file]
libavcodec/golomb-test.c [deleted file]
libavcodec/iirfilter-test.c [deleted file]
libavcodec/imgconvert-test.c [deleted file]
libavcodec/jpeg2000dwt-test.c [deleted file]
libavcodec/mathops-test.c [deleted file]
libavcodec/motion-test.c [deleted file]
libavcodec/options-test.c [deleted file]
libavcodec/ppc/dct-test.c [deleted file]
libavcodec/rangecoder-test.c [deleted file]
libavcodec/snowenc-test.c [deleted file]
libavcodec/tests/.gitignore [new file with mode: 0644]
libavcodec/tests/arm/dct.c [new file with mode: 0644]
libavcodec/tests/avfft.c [new file with mode: 0644]
libavcodec/tests/cabac.c [new file with mode: 0644]
libavcodec/tests/dct.c [new file with mode: 0644]
libavcodec/tests/fft-fixed.c [new file with mode: 0644]
libavcodec/tests/fft-fixed32.c [new file with mode: 0644]
libavcodec/tests/fft.c [new file with mode: 0644]
libavcodec/tests/golomb.c [new file with mode: 0644]
libavcodec/tests/iirfilter.c [new file with mode: 0644]
libavcodec/tests/imgconvert.c [new file with mode: 0644]
libavcodec/tests/jpeg2000dwt.c [new file with mode: 0644]
libavcodec/tests/mathops.c [new file with mode: 0644]
libavcodec/tests/motion.c [new file with mode: 0644]
libavcodec/tests/options.c [new file with mode: 0644]
libavcodec/tests/ppc/dct.c [new file with mode: 0644]
libavcodec/tests/rangecoder.c [new file with mode: 0644]
libavcodec/tests/snowenc.c [new file with mode: 0644]
libavcodec/tests/utils.c [new file with mode: 0644]
libavcodec/tests/x86/dct.c [new file with mode: 0644]
libavcodec/utils-test.c [deleted file]
libavcodec/x86/dct-test.c [deleted file]
libavdevice/tests/.gitignore [new file with mode: 0644]
libavdevice/tests/timefilter.c [new file with mode: 0644]
libavdevice/timefilter-test.c [deleted file]
libavfilter/drawutils-test.c [deleted file]
libavfilter/filtfmts-test.c [deleted file]
libavfilter/formats-test.c [deleted file]
libavfilter/tests/.gitignore [new file with mode: 0644]
libavfilter/tests/drawutils.c [new file with mode: 0644]
libavfilter/tests/filtfmts.c [new file with mode: 0644]
libavfilter/tests/formats.c [new file with mode: 0644]
libavformat/matroskaenc.c
libavformat/movenc-test.c [deleted file]
libavformat/noproxy-test.c [deleted file]
libavformat/rtmpdh-test.c [deleted file]
libavformat/seek-test.c [deleted file]
libavformat/srtp-test.c [deleted file]
libavformat/tests/.gitignore [new file with mode: 0644]
libavformat/tests/movenc.c [new file with mode: 0644]
libavformat/tests/noproxy.c [new file with mode: 0644]
libavformat/tests/rtmpdh.c [new file with mode: 0644]
libavformat/tests/seek.c [new file with mode: 0644]
libavformat/tests/srtp.c [new file with mode: 0644]
libavformat/tests/url.c [new file with mode: 0644]
libavformat/url-test.c [deleted file]
libavresample/avresample-test.c [deleted file]
libavresample/tests/.gitignore [new file with mode: 0644]
libavresample/tests/avresample.c [new file with mode: 0644]
libavutil/Makefile
libavutil/adler32-test.c [deleted file]
libavutil/aes-test.c [deleted file]
libavutil/atomic-test.c [deleted file]
libavutil/avstring-test.c [deleted file]
libavutil/base64-test.c [deleted file]
libavutil/blowfish-test.c [deleted file]
libavutil/bprint-test.c [deleted file]
libavutil/camellia-test.c [deleted file]
libavutil/cast5-test.c [deleted file]
libavutil/color_utils-test.c [deleted file]
libavutil/cpu-test.c [deleted file]
libavutil/crc-test.c [deleted file]
libavutil/des-test.c [deleted file]
libavutil/des.c
libavutil/dict-test.c [deleted file]
libavutil/display-test.c [deleted file]
libavutil/error-test.c [deleted file]
libavutil/eval-test.c [deleted file]
libavutil/fifo-test.c [deleted file]
libavutil/file-test.c [deleted file]
libavutil/float_dsp-test.c [deleted file]
libavutil/hash-test.c [deleted file]
libavutil/hmac-test.c [deleted file]
libavutil/lfg-test.c [deleted file]
libavutil/lls-test.c [deleted file]
libavutil/log-test.c [deleted file]
libavutil/lzo-test.c [deleted file]
libavutil/md5-test.c [deleted file]
libavutil/murmur3-test.c [deleted file]
libavutil/opt-test.c [deleted file]
libavutil/parseutils-test.c [deleted file]
libavutil/pca-test.c [deleted file]
libavutil/pixdesc-test.c [deleted file]
libavutil/pixelutils-test.c [deleted file]
libavutil/random_seed-test.c [deleted file]
libavutil/rational-test.c [deleted file]
libavutil/ripemd-test.c [deleted file]
libavutil/sha-test.c [deleted file]
libavutil/sha512-test.c [deleted file]
libavutil/softfloat-test.c [deleted file]
libavutil/tea-test.c [deleted file]
libavutil/tests/.gitignore [new file with mode: 0644]
libavutil/tests/adler32.c [new file with mode: 0644]
libavutil/tests/aes.c [new file with mode: 0644]
libavutil/tests/atomic.c [new file with mode: 0644]
libavutil/tests/avstring.c [new file with mode: 0644]
libavutil/tests/base64.c [new file with mode: 0644]
libavutil/tests/blowfish.c [new file with mode: 0644]
libavutil/tests/bprint.c [new file with mode: 0644]
libavutil/tests/camellia.c [new file with mode: 0644]
libavutil/tests/cast5.c [new file with mode: 0644]
libavutil/tests/color_utils.c [new file with mode: 0644]
libavutil/tests/cpu.c [new file with mode: 0644]
libavutil/tests/crc.c [new file with mode: 0644]
libavutil/tests/des.c [new file with mode: 0644]
libavutil/tests/dict.c [new file with mode: 0644]
libavutil/tests/display.c [new file with mode: 0644]
libavutil/tests/error.c [new file with mode: 0644]
libavutil/tests/eval.c [new file with mode: 0644]
libavutil/tests/fifo.c [new file with mode: 0644]
libavutil/tests/file.c [new file with mode: 0644]
libavutil/tests/float_dsp.c [new file with mode: 0644]
libavutil/tests/hash.c [new file with mode: 0644]
libavutil/tests/hmac.c [new file with mode: 0644]
libavutil/tests/lfg.c [new file with mode: 0644]
libavutil/tests/lls.c [new file with mode: 0644]
libavutil/tests/log.c [new file with mode: 0644]
libavutil/tests/lzo.c [new file with mode: 0644]
libavutil/tests/md5.c [new file with mode: 0644]
libavutil/tests/murmur3.c [new file with mode: 0644]
libavutil/tests/opt.c [new file with mode: 0644]
libavutil/tests/parseutils.c [new file with mode: 0644]
libavutil/tests/pca.c [new file with mode: 0644]
libavutil/tests/pixdesc.c [new file with mode: 0644]
libavutil/tests/pixelutils.c [new file with mode: 0644]
libavutil/tests/random_seed.c [new file with mode: 0644]
libavutil/tests/rational.c [new file with mode: 0644]
libavutil/tests/ripemd.c [new file with mode: 0644]
libavutil/tests/sha.c [new file with mode: 0644]
libavutil/tests/sha512.c [new file with mode: 0644]
libavutil/tests/softfloat.c [new file with mode: 0644]
libavutil/tests/tea.c [new file with mode: 0644]
libavutil/tests/tree.c [new file with mode: 0644]
libavutil/tests/twofish.c [new file with mode: 0644]
libavutil/tests/utf8.c [new file with mode: 0644]
libavutil/tests/xtea.c [new file with mode: 0644]
libavutil/tree-test.c [deleted file]
libavutil/twofish-test.c [deleted file]
libavutil/utf8-test.c [deleted file]
libavutil/xtea-test.c [deleted file]
library.mak
libswresample/swresample-test.c [deleted file]
libswresample/tests/.gitignore [new file with mode: 0644]
libswresample/tests/swresample.c [new file with mode: 0644]
libswscale/colorspace-test.c [deleted file]
libswscale/swscale-test.c [deleted file]
libswscale/tests/.gitignore [new file with mode: 0644]
libswscale/tests/colorspace.c [new file with mode: 0644]
libswscale/tests/swscale.c [new file with mode: 0644]
tests/fate-run.sh
tests/fate/fft.mak
tests/fate/filter-audio.mak
tests/fate/filter-video.mak
tests/fate/libavcodec.mak
tests/fate/libavdevice.mak
tests/fate/libavformat.mak
tests/fate/libavutil.mak
tests/fate/seek.mak

index 0eca7a1..2b251c9 100644 (file)
@@ -18,7 +18,6 @@
 *.so.*
 *.swp
 *.ver
-*-test
 *_g
 \#*
 .\#*
index 700e4c1..59b039f 100644 (file)
@@ -114,8 +114,8 @@ FFEXTRALIBS := $(LDLIBS:%=$(LD_LIB)) $(EXTRALIBS)
 
 OBJS      := $(sort $(OBJS:%=$(SUBDIR)%))
 SLIBOBJS  := $(sort $(SLIBOBJS:%=$(SUBDIR)%))
-TESTOBJS  := $(TESTOBJS:%=$(SUBDIR)%) $(TESTPROGS:%=$(SUBDIR)%-test.o)
-TESTPROGS := $(TESTPROGS:%=$(SUBDIR)%-test$(EXESUF))
+TESTOBJS  := $(TESTOBJS:%=$(SUBDIR)tests/%) $(TESTPROGS:%=$(SUBDIR)tests/%.o)
+TESTPROGS := $(TESTPROGS:%=$(SUBDIR)tests/%$(EXESUF))
 HOSTOBJS  := $(HOSTPROGS:%=$(SUBDIR)%.o)
 HOSTPROGS := $(HOSTPROGS:%=$(SUBDIR)%$(HOSTEXESUF))
 TOOLS     += $(TOOLS-yes)
@@ -158,8 +158,7 @@ LIBSUFFIXES       = *.a *.lib *.so *.so.* *.dylib *.dll *.def *.dll.a
 
 define RULES
 clean::
-       $(RM) $(HOSTPROGS)
-       $(RM) $(TOOLS)
+       $(RM) $(HOSTPROGS) $(TESTPROGS) $(TOOLS)
 endef
 
 $(eval $(RULES))
index 91df1ac..7c3aa69 100644 (file)
@@ -1042,7 +1042,7 @@ HOSTPROGS = aacps_tablegen                                              \
 
 CLEANFILES = *_tables.c *_tables.h *_tablegen$(HOSTEXESUF)
 
-$(SUBDIR)dct-test$(EXESUF): $(SUBDIR)dctref.o $(SUBDIR)aandcttab.o
+$(SUBDIR)tests/dct$(EXESUF): $(SUBDIR)dctref.o $(SUBDIR)aandcttab.o
 $(SUBDIR)dv_tablegen$(HOSTEXESUF): $(SUBDIR)dvdata_host.o
 
 TRIG_TABLES  = cos cos_fixed sin
diff --git a/libavcodec/arm/dct-test.c b/libavcodec/arm/dct-test.c
deleted file mode 100644 (file)
index f9076b3..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * This file is part of FFmpeg.
- *
- * 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
- * Lesser General Public License for more details.
- *
- * 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 "config.h"
-
-#include "idct.h"
-
-static const struct algo fdct_tab_arch[] = {
-    { 0 }
-};
-
-static const struct algo idct_tab_arch[] = {
-    { "SIMPLE-ARM",     ff_simple_idct_arm,     FF_IDCT_PERM_NONE },
-    { "INT-ARM",        ff_j_rev_dct_arm,       FF_IDCT_PERM_LIBMPEG2 },
-#if HAVE_ARMV5TE
-    { "SIMPLE-ARMV5TE", ff_simple_idct_armv5te, FF_IDCT_PERM_NONE,      AV_CPU_FLAG_ARMV5TE },
-#endif
-#if HAVE_ARMV6
-    { "SIMPLE-ARMV6",   ff_simple_idct_armv6,   FF_IDCT_PERM_LIBMPEG2,  AV_CPU_FLAG_ARMV6 },
-#endif
-#if HAVE_NEON
-    { "SIMPLE-NEON",    ff_simple_idct_neon,    FF_IDCT_PERM_PARTTRANS, AV_CPU_FLAG_NEON },
-#endif
-    { 0 }
-};
diff --git a/libavcodec/avfft-test.c b/libavcodec/avfft-test.c
deleted file mode 100644 (file)
index c2d4cc4..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * This file is part of FFmpeg.
- *
- * 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
- * Lesser General Public License for more details.
- *
- * 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 "config.h"
-#include "libavutil/mem.h"
-#include "avfft.h"
-
-int main(int argc, char **argv)
-{
-    int i;
-#define LEN 1024
-    FFTSample *ref  = av_malloc_array(LEN, sizeof(*ref));
-    FFTSample *data = av_malloc_array(LEN, sizeof(*data));
-    RDFTContext *rdft_context  = av_rdft_init(10, DFT_R2C);
-    RDFTContext *irdft_context = av_rdft_init(10, IDFT_C2R);
-
-    if (!ref || !data || !rdft_context || !irdft_context)
-        return 2;
-    for (i=0; i<LEN; i++) {
-        ref[i] = data[i] = i*456 + 123 + i*i;
-    }
-    av_rdft_calc(rdft_context, data);
-    av_rdft_calc(irdft_context, data);
-
-    for (i=0; i<LEN; i++) {
-        if (fabs(ref[i] - data[i]/LEN*2) > 1) {
-            fprintf(stderr, "Failed at %d (%f %f)\n", i, ref[i], data[i]/LEN*2);
-            return 1;
-        }
-    }
-
-    av_rdft_end(rdft_context);
-    av_rdft_end(irdft_context);
-    av_free(data);
-    av_free(ref);
-
-    return 0;
-}
diff --git a/libavcodec/cabac-test.c b/libavcodec/cabac-test.c
deleted file mode 100644 (file)
index 47f31e9..0000000
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
- *
- * This file is part of FFmpeg.
- *
- * 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
- * Lesser General Public License for more details.
- *
- * 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 "cabac.c"
-
-#define SIZE 10240
-
-#include "libavutil/lfg.h"
-#include "avcodec.h"
-
-static inline void put_cabac_bit(CABACContext *c, int b){
-    put_bits(&c->pb, 1, b);
-    for(;c->outstanding_count; c->outstanding_count--){
-        put_bits(&c->pb, 1, 1-b);
-    }
-}
-
-static inline void renorm_cabac_encoder(CABACContext *c){
-    while(c->range < 0x100){
-        //FIXME optimize
-        if(c->low<0x100){
-            put_cabac_bit(c, 0);
-        }else if(c->low<0x200){
-            c->outstanding_count++;
-            c->low -= 0x100;
-        }else{
-            put_cabac_bit(c, 1);
-            c->low -= 0x200;
-        }
-
-        c->range+= c->range;
-        c->low += c->low;
-    }
-}
-
-static void put_cabac(CABACContext *c, uint8_t * const state, int bit){
-    int RangeLPS= ff_h264_lps_range[2*(c->range&0xC0) + *state];
-
-    if(bit == ((*state)&1)){
-        c->range -= RangeLPS;
-        *state    = ff_h264_mlps_state[128 + *state];
-    }else{
-        c->low += c->range - RangeLPS;
-        c->range = RangeLPS;
-        *state= ff_h264_mlps_state[127 - *state];
-    }
-
-    renorm_cabac_encoder(c);
-}
-
-/**
- * @param bit 0 -> write zero bit, !=0 write one bit
- */
-static void put_cabac_bypass(CABACContext *c, int bit){
-    c->low += c->low;
-
-    if(bit){
-        c->low += c->range;
-    }
-//FIXME optimize
-    if(c->low<0x200){
-        put_cabac_bit(c, 0);
-    }else if(c->low<0x400){
-        c->outstanding_count++;
-        c->low -= 0x200;
-    }else{
-        put_cabac_bit(c, 1);
-        c->low -= 0x400;
-    }
-}
-
-/**
- *
- * @return the number of bytes written
- */
-static int put_cabac_terminate(CABACContext *c, int bit){
-    c->range -= 2;
-
-    if(!bit){
-        renorm_cabac_encoder(c);
-    }else{
-        c->low += c->range;
-        c->range= 2;
-
-        renorm_cabac_encoder(c);
-
-        av_assert0(c->low <= 0x1FF);
-        put_cabac_bit(c, c->low>>9);
-        put_bits(&c->pb, 2, ((c->low>>7)&3)|1);
-
-        flush_put_bits(&c->pb); //FIXME FIXME FIXME XXX wrong
-    }
-
-    return (put_bits_count(&c->pb)+7)>>3;
-}
-
-int main(void){
-    CABACContext c;
-    uint8_t b[9*SIZE];
-    uint8_t r[9*SIZE];
-    int i, ret = 0;
-    uint8_t state[10]= {0};
-    AVLFG prng;
-
-    av_lfg_init(&prng, 1);
-    ff_init_cabac_encoder(&c, b, SIZE);
-
-    for(i=0; i<SIZE; i++){
-        if(2*i<SIZE) r[i] = av_lfg_get(&prng) % 7;
-        else         r[i] = (i>>8)&1;
-    }
-
-    for(i=0; i<SIZE; i++){
-        put_cabac_bypass(&c, r[i]&1);
-    }
-
-    for(i=0; i<SIZE; i++){
-        put_cabac(&c, state, r[i]&1);
-    }
-
-    i= put_cabac_terminate(&c, 1);
-    b[i++] = av_lfg_get(&prng);
-    b[i  ] = av_lfg_get(&prng);
-
-    ff_init_cabac_decoder(&c, b, SIZE);
-
-    memset(state, 0, sizeof(state));
-
-    for(i=0; i<SIZE; i++){
-        if( (r[i]&1) != get_cabac_bypass(&c) ) {
-            av_log(NULL, AV_LOG_ERROR, "CABAC bypass failure at %d\n", i);
-            ret = 1;
-        }
-    }
-
-    for(i=0; i<SIZE; i++){
-        if( (r[i]&1) != get_cabac_noinline(&c, state) ) {
-            av_log(NULL, AV_LOG_ERROR, "CABAC failure at %d\n", i);
-            ret = 1;
-        }
-    }
-    if(!get_cabac_terminate(&c)) {
-        av_log(NULL, AV_LOG_ERROR, "where's the Terminator?\n");
-        ret = 1;
-    }
-
-    return ret;
-}
diff --git a/libavcodec/dct-test.c b/libavcodec/dct-test.c
deleted file mode 100644 (file)
index df1b75d..0000000
+++ /dev/null
@@ -1,522 +0,0 @@
-/*
- * (c) 2001 Fabrice Bellard
- *     2007 Marc Hoffman <marc.hoffman@analog.com>
- *
- * This file is part of FFmpeg.
- *
- * 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
- * Lesser General Public License for more details.
- *
- * 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
- */
-
-/**
- * @file
- * DCT test (c) 2001 Fabrice Bellard
- * Started from sample code by Juan J. Sierralta P.
- */
-
-#include "config.h"
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#if HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <math.h>
-
-#include "libavutil/cpu.h"
-#include "libavutil/common.h"
-#include "libavutil/lfg.h"
-#include "libavutil/time.h"
-
-#include "dct.h"
-#include "idctdsp.h"
-#include "simple_idct.h"
-#include "xvididct.h"
-#include "aandcttab.h"
-#include "faandct.h"
-#include "faanidct.h"
-#include "dctref.h"
-
-struct algo {
-    const char *name;
-    void (*func)(int16_t *block);
-    enum idct_permutation_type perm_type;
-    int cpu_flag;
-    int nonspec;
-};
-
-static const struct algo fdct_tab[] = {
-    { "REF-DBL",     ff_ref_fdct,          FF_IDCT_PERM_NONE },
-    { "IJG-AAN-INT", ff_fdct_ifast,        FF_IDCT_PERM_NONE },
-    { "IJG-LLM-INT", ff_jpeg_fdct_islow_8, FF_IDCT_PERM_NONE },
-#if CONFIG_FAANDCT
-    { "FAAN",        ff_faandct,           FF_IDCT_PERM_NONE },
-#endif /* CONFIG_FAANDCT */
-};
-
-static void ff_prores_idct_wrap(int16_t *dst){
-    LOCAL_ALIGNED(16, int16_t, qmat, [64]);
-    int i;
-
-    for(i=0; i<64; i++){
-        qmat[i]=4;
-    }
-    ff_prores_idct(dst, qmat);
-    for(i=0; i<64; i++) {
-         dst[i] -= 512;
-    }
-}
-
-static const struct algo idct_tab[] = {
-    { "REF-DBL",     ff_ref_idct,          FF_IDCT_PERM_NONE },
-    { "INT",         ff_j_rev_dct,         FF_IDCT_PERM_LIBMPEG2 },
-    { "SIMPLE-C",    ff_simple_idct_8,     FF_IDCT_PERM_NONE },
-    { "SIMPLE-C10",  ff_simple_idct_10,    FF_IDCT_PERM_NONE },
-    { "SIMPLE-C12",  ff_simple_idct_12,    FF_IDCT_PERM_NONE, 0, 1 },
-    { "PR-C",        ff_prores_idct_wrap,  FF_IDCT_PERM_NONE, 0, 1 },
-#if CONFIG_FAANIDCT
-    { "FAANI",       ff_faanidct,          FF_IDCT_PERM_NONE },
-#endif /* CONFIG_FAANIDCT */
-#if CONFIG_MPEG4_DECODER
-    { "XVID",        ff_xvid_idct,         FF_IDCT_PERM_NONE, 0, 1 },
-#endif /* CONFIG_MPEG4_DECODER */
-};
-
-#if ARCH_ARM
-#include "arm/dct-test.c"
-#elif ARCH_PPC
-#include "ppc/dct-test.c"
-#elif ARCH_X86
-#include "x86/dct-test.c"
-#else
-static const struct algo fdct_tab_arch[] = { { 0 } };
-static const struct algo idct_tab_arch[] = { { 0 } };
-#endif
-
-#define AANSCALE_BITS 12
-
-#define NB_ITS 20000
-#define NB_ITS_SPEED 50000
-
-DECLARE_ALIGNED(16, static int16_t, block)[64];
-DECLARE_ALIGNED(8,  static int16_t, block1)[64];
-
-static void init_block(int16_t block[64], int test, int is_idct, AVLFG *prng, int vals)
-{
-    int i, j;
-
-    memset(block, 0, 64 * sizeof(*block));
-
-    switch (test) {
-    case 0:
-        for (i = 0; i < 64; i++)
-            block[i] = (av_lfg_get(prng) % (2*vals)) -vals;
-        if (is_idct) {
-            ff_ref_fdct(block);
-            for (i = 0; i < 64; i++)
-                block[i] >>= 3;
-        }
-        break;
-    case 1:
-        j = av_lfg_get(prng) % 10 + 1;
-        for (i = 0; i < j; i++) {
-            int idx = av_lfg_get(prng) % 64;
-            block[idx] = av_lfg_get(prng) % (2*vals) -vals;
-        }
-        break;
-    case 2:
-        block[ 0] = av_lfg_get(prng) % (16*vals) - (8*vals);
-        block[63] = (block[0] & 1) ^ 1;
-        break;
-    }
-}
-
-static void permute(int16_t dst[64], const int16_t src[64],
-                    enum idct_permutation_type perm_type)
-{
-    int i;
-
-#if ARCH_X86
-    if (permute_x86(dst, src, perm_type))
-        return;
-#endif
-
-    switch (perm_type) {
-    case FF_IDCT_PERM_LIBMPEG2:
-        for (i = 0; i < 64; i++)
-            dst[(i & 0x38) | ((i & 6) >> 1) | ((i & 1) << 2)] = src[i];
-        break;
-    case FF_IDCT_PERM_PARTTRANS:
-        for (i = 0; i < 64; i++)
-            dst[(i & 0x24) | ((i & 3) << 3) | ((i >> 3) & 3)] = src[i];
-        break;
-    case FF_IDCT_PERM_TRANSPOSE:
-        for (i = 0; i < 64; i++)
-            dst[(i>>3) | ((i<<3)&0x38)] = src[i];
-        break;
-    default:
-        for (i = 0; i < 64; i++)
-            dst[i] = src[i];
-        break;
-    }
-}
-
-static int dct_error(const struct algo *dct, int test, int is_idct, int speed, const int bits)
-{
-    void (*ref)(int16_t *block) = is_idct ? ff_ref_idct : ff_ref_fdct;
-    int it, i, scale;
-    int err_inf, v;
-    int64_t err2, ti, ti1, it1, err_sum = 0;
-    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++) {
-        init_block(block1, test, is_idct, &prng, vals);
-        permute(block, block1, dct->perm_type);
-
-        dct->func(block);
-        emms_c();
-
-        if (!strcmp(dct->name, "IJG-AAN-INT")) {
-            for (i = 0; i < 64; i++) {
-                scale = 8 * (1 << (AANSCALE_BITS + 11)) / ff_aanscales[i];
-                block[i] = (block[i] * scale) >> AANSCALE_BITS;
-            }
-        }
-
-        ref(block1);
-        if (!strcmp(dct->name, "PR-SSE2"))
-            for (i = 0; i < 64; i++)
-                block1[i] = av_clip(block1[i], 4-512, 1019-512);
-
-        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 (blockSumErrMax < blockSumErr)
-            blockSumErrMax = blockSumErr;
-    }
-    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]);
-    }
-    printf("\n");
-
-    omse = (double) err2 / NB_ITS / 64;
-    ome  = (double) err_sum / NB_ITS / 64;
-
-    spec_err = is_idct && (err_inf > 1 || omse > 0.02 || fabs(ome) > 0.0015);
-
-    printf("%s %s: max_err=%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) {
-        printf("Failed!\n");
-        return 1;
-    }
-
-    if (!speed)
-        return 0;
-
-    /* speed test */
-
-    init_block(block, test, is_idct, &prng, vals);
-    permute(block1, block, dct->perm_type);
-
-    ti = av_gettime_relative();
-    it1 = 0;
-    do {
-        for (it = 0; it < NB_ITS_SPEED; it++) {
-            memcpy(block, block1, sizeof(block));
-            dct->func(block);
-        }
-        emms_c();
-        it1 += NB_ITS_SPEED;
-        ti1 = av_gettime_relative() - ti;
-    } while (ti1 < 1000000);
-
-    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];
-DECLARE_ALIGNED(8, static uint8_t, img_dest1)[64];
-
-static void idct248_ref(uint8_t *dest, int linesize, int16_t *block)
-{
-    static int init;
-    static double c8[8][8];
-    static double c4[4][4];
-    double block1[64], block2[64], block3[64];
-    double s, sum, v;
-    int i, j, k;
-
-    if (!init) {
-        init = 1;
-
-        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);
-                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++) {
-            sum = 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];
-            }
-        }
-    }
-
-    /* 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;
-        }
-    }
-
-    /* idct8 on lines */
-    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;
-        }
-    }
-
-    /* idct4 */
-    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;
-
-            /* 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;
-        }
-    }
-
-    /* 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);
-        }
-    }
-}
-
-static void idct248_error(const char *name,
-                          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);
-
-    /* just one test to see if code is correct (precision is less
-       important here) */
-    err_max = 0;
-    for (it = 0; it < NB_ITS; it++) {
-        /* XXX: use forward transform to generate values */
-        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];
-        idct248_ref(img_dest1, 8, block);
-
-        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]);
-            if (v == 255)
-                printf("%d %d\n", img_dest[i], img_dest1[i]);
-            if (v > err_max)
-                err_max = v;
-        }
-#if 0
-        printf("ref=\n");
-        for(i=0;i<8;i++) {
-            int j;
-            for(j=0;j<8;j++) {
-                printf(" %3d", img_dest1[i*8+j]);
-            }
-            printf("\n");
-        }
-
-        printf("out=\n");
-        for(i=0;i<8;i++) {
-            int j;
-            for(j=0;j<8;j++) {
-                printf(" %3d", img_dest[i*8+j]);
-            }
-            printf("\n");
-        }
-#endif
-    }
-    printf("%s %s: err_inf=%d\n", 1 ? "IDCT248" : "DCT248", name, err_max);
-
-    if (!speed)
-        return;
-
-    ti = av_gettime_relative();
-    it1 = 0;
-    do {
-        for (it = 0; it < NB_ITS_SPEED; it++) {
-            for (i = 0; i < 64; i++)
-                block[i] = block1[i];
-            idct248_put(img_dest, 8, block);
-        }
-        emms_c();
-        it1 += NB_ITS_SPEED;
-        ti1 = av_gettime_relative() - ti;
-    } while (ti1 < 1000000);
-
-    printf("%s %s: %0.1f kdct/s\n", 1 ? "IDCT248" : "DCT248", name,
-           (double) it1 * 1000.0 / (double) ti1);
-}
-
-static void help(void)
-{
-    printf("dct-test [-i] [<test-number>] [<bits>]\n"
-           "test-number 0 -> test with random matrixes\n"
-           "            1 -> test with random sparse matrixes\n"
-           "            2 -> do 3. test from MPEG-4 std\n"
-           "bits        Number of time domain bits to use, 8 is default\n"
-           "-i          test IDCT implementations\n"
-           "-4          test IDCT248 implementations\n"
-           "-t          speed test\n");
-}
-
-#if !HAVE_GETOPT
-#include "compat/getopt.c"
-#endif
-
-int main(int argc, char **argv)
-{
-    int test_idct = 0, test_248_dct = 0;
-    int c, i;
-    int test = 1;
-    int speed = 0;
-    int err = 0;
-    int bits=8;
-
-    ff_ref_dct_init();
-
-    for (;;) {
-        c = getopt(argc, argv, "ih4t");
-        if (c == -1)
-            break;
-        switch (c) {
-        case 'i':
-            test_idct = 1;
-            break;
-        case '4':
-            test_248_dct = 1;
-            break;
-        case 't':
-            speed = 1;
-            break;
-        default:
-        case 'h':
-            help();
-            return 0;
-        }
-    }
-
-    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, speed);
-    } else {
-        const int cpu_flags = av_get_cpu_flags();
-        if (test_idct) {
-            for (i = 0; i < FF_ARRAY_ELEMS(idct_tab); i++)
-                err |= dct_error(&idct_tab[i], test, test_idct, speed, bits);
-
-            for (i = 0; idct_tab_arch[i].name; i++)
-                if (!(~cpu_flags & idct_tab_arch[i].cpu_flag))
-                    err |= dct_error(&idct_tab_arch[i], test, test_idct, speed, bits);
-        }
-#if CONFIG_FDCTDSP
-        else {
-            for (i = 0; i < FF_ARRAY_ELEMS(fdct_tab); i++)
-                err |= dct_error(&fdct_tab[i], test, test_idct, speed, bits);
-
-            for (i = 0; fdct_tab_arch[i].name; i++)
-                if (!(~cpu_flags & fdct_tab_arch[i].cpu_flag))
-                    err |= dct_error(&fdct_tab_arch[i], test, test_idct, speed, bits);
-        }
-#endif /* CONFIG_FDCTDSP */
-    }
-
-    if (err)
-        printf("Error: %d.\n", err);
-
-    return !!err;
-}
diff --git a/libavcodec/fft-fixed-test.c b/libavcodec/fft-fixed-test.c
deleted file mode 100644 (file)
index 330211e..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * This file is part of FFmpeg.
- *
- * 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
- * Lesser General Public License for more details.
- *
- * 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
- */
-
-#define FFT_FLOAT 0
-#include "fft-test.c"
diff --git a/libavcodec/fft-fixed32-test.c b/libavcodec/fft-fixed32-test.c
deleted file mode 100644 (file)
index 4bd11ce..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * This file is part of FFmpeg.
- *
- * 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
- * Lesser General Public License for more details.
- *
- * 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
- */
-
-#define FFT_FLOAT 0
-#define FFT_FIXED_32 1
-#include "fft-test.c"
diff --git a/libavcodec/fft-test.c b/libavcodec/fft-test.c
deleted file mode 100644 (file)
index d647fde..0000000
+++ /dev/null
@@ -1,519 +0,0 @@
-/*
- * (c) 2002 Fabrice Bellard
- *
- * This file is part of FFmpeg.
- *
- * 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
- * Lesser General Public License for more details.
- *
- * 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
- */
-
-/**
- * @file
- * FFT and MDCT tests.
- */
-
-#include "config.h"
-
-#include <math.h>
-#if HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "libavutil/cpu.h"
-#include "libavutil/lfg.h"
-#include "libavutil/log.h"
-#include "libavutil/mathematics.h"
-#include "libavutil/time.h"
-
-#include "fft.h"
-#if FFT_FLOAT
-#include "dct.h"
-#include "rdft.h"
-#endif
-
-/* reference fft */
-
-#define MUL16(a, b) ((a) * (b))
-
-#define CMAC(pre, pim, are, aim, bre, bim)          \
-    {                                               \
-        pre += (MUL16(are, bre) - MUL16(aim, bim)); \
-        pim += (MUL16(are, bim) + MUL16(bre, aim)); \
-    }
-
-#if FFT_FLOAT
-#define RANGE 1.0
-#define REF_SCALE(x, bits)  (x)
-#define FMT "%10.6f"
-#elif FFT_FIXED_32
-#define RANGE 8388608
-#define REF_SCALE(x, bits) (x)
-#define FMT "%6d"
-#else
-#define RANGE 16384
-#define REF_SCALE(x, bits) ((x) / (1 << (bits)))
-#define FMT "%6d"
-#endif
-
-static struct {
-    float re, im;
-} *exptab;
-
-static int fft_ref_init(int nbits, int inverse)
-{
-    int i, n = 1 << nbits;
-
-    exptab = av_malloc_array((n / 2), sizeof(*exptab));
-    if (!exptab)
-        return AVERROR(ENOMEM);
-
-    for (i = 0; i < (n / 2); i++) {
-        double alpha = 2 * M_PI * (float) i / (float) n;
-        double c1 = cos(alpha), s1 = sin(alpha);
-        if (!inverse)
-            s1 = -s1;
-        exptab[i].re = c1;
-        exptab[i].im = s1;
-    }
-    return 0;
-}
-
-static void fft_ref(FFTComplex *tabr, FFTComplex *tab, int nbits)
-{
-    int i, j;
-    int n  = 1 << nbits;
-    int n2 = n >> 1;
-
-    for (i = 0; i < n; i++) {
-        double tmp_re = 0, tmp_im = 0;
-        FFTComplex *q = tab;
-        for (j = 0; j < n; j++) {
-            double s, c;
-            int k = (i * j) & (n - 1);
-            if (k >= n2) {
-                c = -exptab[k - n2].re;
-                s = -exptab[k - n2].im;
-            } else {
-                c = exptab[k].re;
-                s = exptab[k].im;
-            }
-            CMAC(tmp_re, tmp_im, c, s, q->re, q->im);
-            q++;
-        }
-        tabr[i].re = REF_SCALE(tmp_re, nbits);
-        tabr[i].im = REF_SCALE(tmp_im, nbits);
-    }
-}
-
-#if CONFIG_MDCT
-static void imdct_ref(FFTSample *out, FFTSample *in, int nbits)
-{
-    int i, k, n = 1 << nbits;
-
-    for (i = 0; i < n; i++) {
-        double sum = 0;
-        for (k = 0; k < n / 2; k++) {
-            int a = (2 * i + 1 + (n / 2)) * (2 * k + 1);
-            double f = cos(M_PI * a / (double) (2 * n));
-            sum += f * in[k];
-        }
-        out[i] = REF_SCALE(-sum, nbits - 2);
-    }
-}
-
-/* NOTE: no normalisation by 1 / N is done */
-static void mdct_ref(FFTSample *output, FFTSample *input, int nbits)
-{
-    int i, k, n = 1 << nbits;
-
-    /* do it by hand */
-    for (k = 0; k < n / 2; k++) {
-        double s = 0;
-        for (i = 0; i < n; i++) {
-            double a = (2 * M_PI * (2 * i + 1 + n / 2) * (2 * k + 1) / (4 * n));
-            s += input[i] * cos(a);
-        }
-        output[k] = REF_SCALE(s, nbits - 1);
-    }
-}
-#endif /* CONFIG_MDCT */
-
-#if FFT_FLOAT
-#if CONFIG_DCT
-static void idct_ref(FFTSample *output, FFTSample *input, int nbits)
-{
-    int i, k, n = 1 << nbits;
-
-    /* do it by hand */
-    for (i = 0; i < n; i++) {
-        double s = 0.5 * input[0];
-        for (k = 1; k < n; k++) {
-            double a = M_PI * k * (i + 0.5) / n;
-            s += input[k] * cos(a);
-        }
-        output[i] = 2 * s / n;
-    }
-}
-
-static void dct_ref(FFTSample *output, FFTSample *input, int nbits)
-{
-    int i, k, n = 1 << nbits;
-
-    /* do it by hand */
-    for (k = 0; k < n; k++) {
-        double s = 0;
-        for (i = 0; i < n; i++) {
-            double a = M_PI * k * (i + 0.5) / n;
-            s += input[i] * cos(a);
-        }
-        output[k] = s;
-    }
-}
-#endif /* CONFIG_DCT */
-#endif /* FFT_FLOAT */
-
-static FFTSample frandom(AVLFG *prng)
-{
-    return (int16_t) av_lfg_get(prng) / 32768.0 * RANGE;
-}
-
-static int check_diff(FFTSample *tab1, FFTSample *tab2, int n, double scale)
-{
-    int i, err = 0;
-    double error = 0, max = 0;
-
-    for (i = 0; i < n; i++) {
-        double e = fabs(tab1[i] - (tab2[i] / scale)) / RANGE;
-        if (e >= 1e-3) {
-            av_log(NULL, AV_LOG_ERROR, "ERROR %5d: "FMT" "FMT"\n",
-                   i, tab1[i], tab2[i]);
-            err = 1;
-        }
-        error += e * e;
-        if (e > max)
-            max = e;
-    }
-    av_log(NULL, AV_LOG_INFO, "max:%f e:%g\n", max, sqrt(error / n));
-    return err;
-}
-
-static void help(void)
-{
-    av_log(NULL, AV_LOG_INFO,
-           "usage: fft-test [-h] [-s] [-i] [-n b]\n"
-           "-h     print this help\n"
-           "-s     speed test\n"
-           "-m     (I)MDCT test\n"
-           "-d     (I)DCT test\n"
-           "-r     (I)RDFT test\n"
-           "-i     inverse transform test\n"
-           "-n b   set the transform size to 2^b\n"
-           "-f x   set scale factor for output data of (I)MDCT to x\n");
-}
-
-enum tf_transform {
-    TRANSFORM_FFT,
-    TRANSFORM_MDCT,
-    TRANSFORM_RDFT,
-    TRANSFORM_DCT,
-};
-
-#if !HAVE_GETOPT
-#include "compat/getopt.c"
-#endif
-
-int main(int argc, char **argv)
-{
-    FFTComplex *tab, *tab1, *tab_ref;
-    FFTSample *tab2;
-    enum tf_transform transform = TRANSFORM_FFT;
-    FFTContext m, s;
-#if FFT_FLOAT
-    RDFTContext r;
-    DCTContext d;
-#endif /* FFT_FLOAT */
-    int it, i, err = 1;
-    int do_speed = 0, do_inverse = 0;
-    int fft_nbits = 9, fft_size;
-    double scale = 1.0;
-    AVLFG prng;
-
-    av_lfg_init(&prng, 1);
-
-    for (;;) {
-        int c = getopt(argc, argv, "hsimrdn:f:c:");
-        if (c == -1)
-            break;
-        switch (c) {
-        case 'h':
-            help();
-            return 1;
-        case 's':
-            do_speed = 1;
-            break;
-        case 'i':
-            do_inverse = 1;
-            break;
-        case 'm':
-            transform = TRANSFORM_MDCT;
-            break;
-        case 'r':
-            transform = TRANSFORM_RDFT;
-            break;
-        case 'd':
-            transform = TRANSFORM_DCT;
-            break;
-        case 'n':
-            fft_nbits = atoi(optarg);
-            break;
-        case 'f':
-            scale = atof(optarg);
-            break;
-        case 'c':
-        {
-            unsigned cpuflags = av_get_cpu_flags();
-
-            if (av_parse_cpu_caps(&cpuflags, optarg) < 0)
-                return 1;
-
-            av_force_cpu_flags(cpuflags);
-            break;
-        }
-        }
-    }
-
-    fft_size = 1 << fft_nbits;
-    tab      = av_malloc_array(fft_size, sizeof(FFTComplex));
-    tab1     = av_malloc_array(fft_size, sizeof(FFTComplex));
-    tab_ref  = av_malloc_array(fft_size, sizeof(FFTComplex));
-    tab2     = av_malloc_array(fft_size, sizeof(FFTSample));
-
-    if (!(tab && tab1 && tab_ref && tab2))
-        goto cleanup;
-
-    switch (transform) {
-#if CONFIG_MDCT
-    case TRANSFORM_MDCT:
-        av_log(NULL, AV_LOG_INFO, "Scale factor is set to %f\n", scale);
-        if (do_inverse)
-            av_log(NULL, AV_LOG_INFO, "IMDCT");
-        else
-            av_log(NULL, AV_LOG_INFO, "MDCT");
-        ff_mdct_init(&m, fft_nbits, do_inverse, scale);
-        break;
-#endif /* CONFIG_MDCT */
-    case TRANSFORM_FFT:
-        if (do_inverse)
-            av_log(NULL, AV_LOG_INFO, "IFFT");
-        else
-            av_log(NULL, AV_LOG_INFO, "FFT");
-        ff_fft_init(&s, fft_nbits, do_inverse);
-        if ((err = fft_ref_init(fft_nbits, do_inverse)) < 0)
-            goto cleanup;
-        break;
-#if FFT_FLOAT
-#    if CONFIG_RDFT
-    case TRANSFORM_RDFT:
-        if (do_inverse)
-            av_log(NULL, AV_LOG_INFO, "IDFT_C2R");
-        else
-            av_log(NULL, AV_LOG_INFO, "DFT_R2C");
-        ff_rdft_init(&r, fft_nbits, do_inverse ? IDFT_C2R : DFT_R2C);
-        if ((err = fft_ref_init(fft_nbits, do_inverse)) < 0)
-            goto cleanup;
-        break;
-#    endif /* CONFIG_RDFT */
-#    if CONFIG_DCT
-    case TRANSFORM_DCT:
-        if (do_inverse)
-            av_log(NULL, AV_LOG_INFO, "DCT_III");
-        else
-            av_log(NULL, AV_LOG_INFO, "DCT_II");
-        ff_dct_init(&d, fft_nbits, do_inverse ? DCT_III : DCT_II);
-        break;
-#    endif /* CONFIG_DCT */
-#endif /* FFT_FLOAT */
-    default:
-        av_log(NULL, AV_LOG_ERROR, "Requested transform not supported\n");
-        goto cleanup;
-    }
-    av_log(NULL, AV_LOG_INFO, " %d test\n", fft_size);
-
-    /* generate random data */
-
-    for (i = 0; i < fft_size; i++) {
-        tab1[i].re = frandom(&prng);
-        tab1[i].im = frandom(&prng);
-    }
-
-    /* checking result */
-    av_log(NULL, AV_LOG_INFO, "Checking...\n");
-
-    switch (transform) {
-#if CONFIG_MDCT
-    case TRANSFORM_MDCT:
-        if (do_inverse) {
-            imdct_ref(&tab_ref->re, &tab1->re, fft_nbits);
-            m.imdct_calc(&m, tab2, &tab1->re);
-            err = check_diff(&tab_ref->re, tab2, fft_size, scale);
-        } else {
-            mdct_ref(&tab_ref->re, &tab1->re, fft_nbits);
-            m.mdct_calc(&m, tab2, &tab1->re);
-            err = check_diff(&tab_ref->re, tab2, fft_size / 2, scale);
-        }
-        break;
-#endif /* CONFIG_MDCT */
-    case TRANSFORM_FFT:
-        memcpy(tab, tab1, fft_size * sizeof(FFTComplex));
-        s.fft_permute(&s, tab);
-        s.fft_calc(&s, tab);
-
-        fft_ref(tab_ref, tab1, fft_nbits);
-        err = check_diff(&tab_ref->re, &tab->re, fft_size * 2, 1.0);
-        break;
-#if FFT_FLOAT
-#if CONFIG_RDFT
-    case TRANSFORM_RDFT:
-    {
-        int fft_size_2 = fft_size >> 1;
-        if (do_inverse) {
-            tab1[0].im          = 0;
-            tab1[fft_size_2].im = 0;
-            for (i = 1; i < fft_size_2; i++) {
-                tab1[fft_size_2 + i].re =  tab1[fft_size_2 - i].re;
-                tab1[fft_size_2 + i].im = -tab1[fft_size_2 - i].im;
-            }
-
-            memcpy(tab2, tab1, fft_size * sizeof(FFTSample));
-            tab2[1] = tab1[fft_size_2].re;
-
-            r.rdft_calc(&r, tab2);
-            fft_ref(tab_ref, tab1, fft_nbits);
-            for (i = 0; i < fft_size; i++) {
-                tab[i].re = tab2[i];
-                tab[i].im = 0;
-            }
-            err = check_diff(&tab_ref->re, &tab->re, fft_size * 2, 0.5);
-        } else {
-            for (i = 0; i < fft_size; i++) {
-                tab2[i]    = tab1[i].re;
-                tab1[i].im = 0;
-            }
-            r.rdft_calc(&r, tab2);
-            fft_ref(tab_ref, tab1, fft_nbits);
-            tab_ref[0].im = tab_ref[fft_size_2].re;
-            err = check_diff(&tab_ref->re, tab2, fft_size, 1.0);
-        }
-        break;
-    }
-#endif /* CONFIG_RDFT */
-#if CONFIG_DCT
-    case TRANSFORM_DCT:
-        memcpy(tab, tab1, fft_size * sizeof(FFTComplex));
-        d.dct_calc(&d, &tab->re);
-        if (do_inverse)
-            idct_ref(&tab_ref->re, &tab1->re, fft_nbits);
-        else
-            dct_ref(&tab_ref->re, &tab1->re, fft_nbits);
-        err = check_diff(&tab_ref->re, &tab->re, fft_size, 1.0);
-        break;
-#endif /* CONFIG_DCT */
-#endif /* FFT_FLOAT */
-    }
-
-    /* do a speed test */
-
-    if (do_speed) {
-        int64_t time_start, duration;
-        int nb_its;
-
-        av_log(NULL, AV_LOG_INFO, "Speed test...\n");
-        /* we measure during about 1 seconds */
-        nb_its = 1;
-        for (;;) {
-            time_start = av_gettime_relative();
-            for (it = 0; it < nb_its; it++) {
-                switch (transform) {
-                case TRANSFORM_MDCT:
-                    if (do_inverse)
-                        m.imdct_calc(&m, &tab->re, &tab1->re);
-                    else
-                        m.mdct_calc(&m, &tab->re, &tab1->re);
-                    break;
-                case TRANSFORM_FFT:
-                    memcpy(tab, tab1, fft_size * sizeof(FFTComplex));
-                    s.fft_calc(&s, tab);
-                    break;
-#if FFT_FLOAT
-                case TRANSFORM_RDFT:
-                    memcpy(tab2, tab1, fft_size * sizeof(FFTSample));
-                    r.rdft_calc(&r, tab2);
-                    break;
-                case TRANSFORM_DCT:
-                    memcpy(tab2, tab1, fft_size * sizeof(FFTSample));
-                    d.dct_calc(&d, tab2);
-                    break;
-#endif /* FFT_FLOAT */
-                }
-            }
-            duration = av_gettime_relative() - time_start;
-            if (duration >= 1000000)
-                break;
-            nb_its *= 2;
-        }
-        av_log(NULL, AV_LOG_INFO,
-               "time: %0.1f us/transform [total time=%0.2f s its=%d]\n",
-               (double) duration / nb_its,
-               (double) duration / 1000000.0,
-               nb_its);
-    }
-
-    switch (transform) {
-#if CONFIG_MDCT
-    case TRANSFORM_MDCT:
-        ff_mdct_end(&m);
-        break;
-#endif /* CONFIG_MDCT */
-    case TRANSFORM_FFT:
-        ff_fft_end(&s);
-        break;
-#if FFT_FLOAT
-#    if CONFIG_RDFT
-    case TRANSFORM_RDFT:
-        ff_rdft_end(&r);
-        break;
-#    endif /* CONFIG_RDFT */
-#    if CONFIG_DCT
-    case TRANSFORM_DCT:
-        ff_dct_end(&d);
-        break;
-#    endif /* CONFIG_DCT */
-#endif /* FFT_FLOAT */
-    }
-
-cleanup:
-    av_free(tab);
-    av_free(tab1);
-    av_free(tab2);
-    av_free(tab_ref);
-    av_free(exptab);
-
-    if (err)
-        printf("Error: %d.\n", err);
-
-    return !!err;
-}
diff --git a/libavcodec/golomb-test.c b/libavcodec/golomb-test.c
deleted file mode 100644 (file)
index 2dfe917..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
- *
- * This file is part of FFmpeg.
- *
- * 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
- * Lesser General Public License for more details.
- *
- * 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 <stdint.h>
-#include <stdio.h>
-
-#include "libavutil/mem.h"
-
-#include "get_bits.h"
-#include "golomb.h"
-#include "put_bits.h"
-
-#define COUNT 8191
-#define SIZE (COUNT * 4)
-
-int main(void)
-{
-    int i, ret = 0;
-    uint8_t *temp;
-    PutBitContext pb;
-    GetBitContext gb;
-
-    temp = av_malloc(SIZE);
-    if (!temp)
-        return 2;
-
-    init_put_bits(&pb, temp, SIZE);
-    for (i = 0; i < COUNT; i++)
-        set_ue_golomb(&pb, i);
-    flush_put_bits(&pb);
-
-    init_get_bits(&gb, temp, 8 * SIZE);
-    for (i = 0; i < COUNT; i++) {
-        int j, s = show_bits(&gb, 25);
-
-        j = get_ue_golomb(&gb);
-        if (j != i) {
-            fprintf(stderr, "get_ue_golomb: expected %d, got %d. bits: %7x\n",
-                    i, j, s);
-            ret = 1;
-        }
-    }
-
-#define EXTEND(i) ((i) << 3 | (i) & 7)
-    init_put_bits(&pb, temp, SIZE);
-    for (i = 0; i < COUNT; i++)
-        set_ue_golomb(&pb, EXTEND(i));
-    flush_put_bits(&pb);
-
-    init_get_bits(&gb, temp, 8 * SIZE);
-    for (i = 0; i < COUNT; i++) {
-        int j, s = show_bits_long(&gb, 32);
-
-        j = get_ue_golomb_long(&gb);
-        if (j != EXTEND(i)) {
-            fprintf(stderr, "get_ue_golomb_long: expected %d, got %d. "
-                    "bits: %8x\n", EXTEND(i), j, s);
-            ret = 1;
-        }
-    }
-
-    init_put_bits(&pb, temp, SIZE);
-    for (i = 0; i < COUNT; i++)
-        set_se_golomb(&pb, i - COUNT / 2);
-    flush_put_bits(&pb);
-
-    init_get_bits(&gb, temp, 8 * SIZE);
-    for (i = 0; i < COUNT; i++) {
-        int j, s = show_bits(&gb, 25);
-
-        j = get_se_golomb(&gb);
-        if (j != i - COUNT / 2) {
-            fprintf(stderr, "get_se_golomb: expected %d, got %d. bits: %7x\n",
-                    i - COUNT / 2, j, s);
-            ret = 1;
-        }
-    }
-
-    av_free(temp);
-
-    return ret;
-}
diff --git a/libavcodec/iirfilter-test.c b/libavcodec/iirfilter-test.c
deleted file mode 100644 (file)
index cd250a3..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * This file is part of FFmpeg.
- *
- * 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
- * Lesser General Public License for more details.
- *
- * 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 <math.h>
-#include <stdint.h>
-#include <stdio.h>
-
-#include "libavutil/libm.h"
-
-#include "iirfilter.h"
-
-#define FILT_ORDER 4
-#define SIZE 1024
-
-int main(void)
-{
-    struct FFIIRFilterCoeffs *fcoeffs = NULL;
-    struct FFIIRFilterState  *fstate  = NULL;
-    float cutoff_coeff = 0.4;
-    int16_t x[SIZE], y[SIZE];
-    int i;
-
-    fcoeffs = ff_iir_filter_init_coeffs(NULL, FF_FILTER_TYPE_BUTTERWORTH,
-                                        FF_FILTER_MODE_LOWPASS, FILT_ORDER,
-                                        cutoff_coeff, 0.0, 0.0);
-    fstate  = ff_iir_filter_init_state(FILT_ORDER);
-
-    for (i = 0; i < SIZE; i++)
-        x[i] = lrint(0.75 * INT16_MAX * sin(0.5 * M_PI * i * i / SIZE));
-
-    ff_iir_filter(fcoeffs, fstate, SIZE, x, 1, y, 1);
-
-    for (i = 0; i < SIZE; i++)
-        printf("%6d %6d\n", x[i], y[i]);
-
-    ff_iir_filter_free_coeffsp(&fcoeffs);
-    ff_iir_filter_free_statep(&fstate);
-    return 0;
-}
diff --git a/libavcodec/imgconvert-test.c b/libavcodec/imgconvert-test.c
deleted file mode 100644 (file)
index 96004d7..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Misc image conversion routines
- * Copyright (c) 2001, 2002, 2003 Fabrice Bellard
- *
- * This file is part of FFmpeg.
- *
- * 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
- * Lesser General Public License for more details.
- *
- * 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 "imgconvert.c"
-
-#if FF_API_AVPICTURE
-FF_DISABLE_DEPRECATION_WARNINGS
-int main(void){
-    int i;
-    int err=0;
-    int skip = 0;
-
-    for (i=0; i<AV_PIX_FMT_NB*2; i++) {
-        const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(i);
-        if(!desc || !desc->name) {
-            skip ++;
-            continue;
-        }
-        if (skip) {
-            av_log(NULL, AV_LOG_INFO, "%3d unused pixel format values\n", skip);
-            skip = 0;
-        }
-        av_log(NULL, AV_LOG_INFO, "pix fmt %s yuv_plan:%d avg_bpp:%d\n", desc->name, is_yuv_planar(desc), av_get_padded_bits_per_pixel(desc));
-        if ((!(desc->flags & AV_PIX_FMT_FLAG_ALPHA)) != (desc->nb_components != 2 && desc->nb_components != 4)) {
-            av_log(NULL, AV_LOG_ERROR, "Alpha flag mismatch\n");
-            err = 1;
-        }
-    }
-    return err;
-}
-FF_ENABLE_DEPRECATION_WARNINGS
-#endif /* FF_API_AVPICTURE */
diff --git a/libavcodec/jpeg2000dwt-test.c b/libavcodec/jpeg2000dwt-test.c
deleted file mode 100644 (file)
index 30f1ce1..0000000
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Discrete wavelet transform
- * Copyright (c) 2007 Kamil Nowosad
- * Copyright (c) 2013 Nicolas Bertrand <nicoinattendu@gmail.com>
- *
- * This file is part of FFmpeg.
- *
- * 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
- * Lesser General Public License for more details.
- *
- * 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 "jpeg2000dwt.c"
-
-#include "libavutil/lfg.h"
-
-#define MAX_W 256
-
-static int test_dwt(int *array, int *ref, int border[2][2], int decomp_levels, int type, int max_diff) {
-    int ret, j;
-    DWTContext s1={{{0}}}, *s= &s1;
-    int64_t err2 = 0;
-
-    ret = ff_jpeg2000_dwt_init(s,  border, decomp_levels, type);
-    if (ret < 0) {
-        fprintf(stderr, "ff_jpeg2000_dwt_init failed\n");
-        return 1;
-    }
-    ret = ff_dwt_encode(s, array);
-    if (ret < 0) {
-        fprintf(stderr, "ff_dwt_encode failed\n");
-        return 1;
-    }
-    ret = ff_dwt_decode(s, array);
-    if (ret < 0) {
-        fprintf(stderr, "ff_dwt_encode failed\n");
-        return 1;
-    }
-    for (j = 0; j<MAX_W * MAX_W; j++) {
-        if (FFABS(array[j] - ref[j]) > max_diff) {
-            fprintf(stderr, "missmatch at %d (%d != %d) decomp:%d border %d %d %d %d\n",
-                    j, array[j], ref[j],decomp_levels, border[0][0], border[0][1], border[1][0], border[1][1]);
-            return 2;
-        }
-        err2 += (array[j] - ref[j]) * (array[j] - ref[j]);
-        array[j] = ref[j];
-    }
-    ff_dwt_destroy(s);
-
-    printf("%s, decomp:%2d border %3d %3d %3d %3d milli-err2:%9"PRId64"\n",
-           type == FF_DWT53 ? "5/3i" : "9/7i",
-           decomp_levels, border[0][0], border[0][1], border[1][0], border[1][1],
-           1000*err2 / ((border[0][1] - border[0][0])*(border[1][1] - border[1][0])));
-
-    return 0;
-}
-
-static int test_dwtf(float *array, float *ref, int border[2][2], int decomp_levels, float max_diff) {
-    int ret, j;
-    DWTContext s1={{{0}}}, *s= &s1;
-    double err2 = 0;
-
-    ret = ff_jpeg2000_dwt_init(s,  border, decomp_levels, FF_DWT97);
-    if (ret < 0) {
-        fprintf(stderr, "ff_jpeg2000_dwt_init failed\n");
-        return 1;
-    }
-    ret = ff_dwt_encode(s, array);
-    if (ret < 0) {
-        fprintf(stderr, "ff_dwt_encode failed\n");
-        return 1;
-    }
-    ret = ff_dwt_decode(s, array);
-    if (ret < 0) {
-        fprintf(stderr, "ff_dwt_encode failed\n");
-        return 1;
-    }
-    for (j = 0; j<MAX_W * MAX_W; j++) {
-        if (FFABS(array[j] - ref[j]) > max_diff) {
-            fprintf(stderr, "missmatch at %d (%f != %f) decomp:%d border %d %d %d %d\n",
-                    j, array[j], ref[j],decomp_levels, border[0][0], border[0][1], border[1][0], border[1][1]);
-            return 2;
-        }
-        err2 += (array[j] - ref[j]) * (array[j] - ref[j]);
-        array[j] = ref[j];
-    }
-    ff_dwt_destroy(s);
-
-    printf("9/7f, decomp:%2d border %3d %3d %3d %3d err2:%20.3f\n",
-           decomp_levels, border[0][0], border[0][1], border[1][0], border[1][1],
-           err2 / ((border[0][1] - border[0][0])*(border[1][1] - border[1][0])));
-
-    return 0;
-}
-
-static int array[MAX_W * MAX_W];
-static int ref  [MAX_W * MAX_W];
-static float arrayf[MAX_W * MAX_W];
-static float reff  [MAX_W * MAX_W];
-
-int main(void) {
-    AVLFG prng;
-    int i,j;
-    int border[2][2];
-    int ret, decomp_levels;
-
-    av_lfg_init(&prng, 1);
-
-    for (i = 0; i<MAX_W * MAX_W; i++)
-        arrayf[i] = reff[i] = array[i] = ref[i] =  av_lfg_get(&prng) % 2048;
-
-    for (i = 0; i < 100; i++) {
-        for (j=0; j<4; j++)
-            border[j>>1][j&1] = av_lfg_get(&prng) % MAX_W;
-        if (border[0][0] >= border[0][1] || border[1][0] >= border[1][1])
-            continue;
-        decomp_levels = av_lfg_get(&prng) % FF_DWT_MAX_DECLVLS;
-
-        ret = test_dwt(array, ref, border, decomp_levels, FF_DWT53, 0);
-        if (ret)
-            return ret;
-        ret = test_dwt(array, ref, border, decomp_levels, FF_DWT97_INT, FFMIN(7+5*decomp_levels, 15+3*decomp_levels));
-        if (ret)
-            return ret;
-        ret = test_dwtf(arrayf, reff, border, decomp_levels, 0.05);
-        if (ret)
-            return ret;
-    }
-
-    return 0;
-}
diff --git a/libavcodec/mathops-test.c b/libavcodec/mathops-test.c
deleted file mode 100644 (file)
index d47f144..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * This file is part of FFmpeg.
- *
- * 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
- * Lesser General Public License for more details.
- *
- * 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 "mathops.h"
-
-#include <stdlib.h>
-
-int main(void)
-{
-    unsigned u;
-
-    for(u=0; u<65536; u++) {
-        unsigned s = u*u;
-        unsigned root = ff_sqrt(s);
-        unsigned root_m1 = ff_sqrt(s-1);
-        if (s && root != u) {
-            fprintf(stderr, "ff_sqrt failed at %u with %u\n", s, root);
-            return 1;
-        }
-        if (u && root_m1 != u - 1) {
-            fprintf(stderr, "ff_sqrt failed at %u with %u\n", s, root);
-            return 1;
-        }
-    }
-    return 0;
-}
diff --git a/libavcodec/motion-test.c b/libavcodec/motion-test.c
deleted file mode 100644 (file)
index ebcf4aa..0000000
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * (c) 2001 Fabrice Bellard
- *
- * This file is part of FFmpeg.
- *
- * 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
- * Lesser General Public License for more details.
- *
- * 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
- */
-
-/**
- * @file
- * motion test.
- */
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "config.h"
-#include "me_cmp.h"
-#include "libavutil/internal.h"
-#include "libavutil/lfg.h"
-#include "libavutil/mem.h"
-#include "libavutil/time.h"
-
-#undef printf
-
-#define WIDTH 64
-#define HEIGHT 64
-
-static uint8_t img1[WIDTH * HEIGHT];
-static uint8_t img2[WIDTH * HEIGHT];
-
-static void fill_random(uint8_t *tab, int size)
-{
-    int i;
-    AVLFG prng;
-
-    av_lfg_init(&prng, 1);
-    for(i=0;i<size;i++) {
-        tab[i] = av_lfg_get(&prng) % 256;
-    }
-}
-
-static void help(void)
-{
-    printf("motion-test [-h]\n"
-           "test motion implementations\n");
-}
-
-#define NB_ITS 500
-
-int dummy;
-
-static void test_motion(const char *name,
-                 me_cmp_func test_func, me_cmp_func ref_func)
-{
-    int x, y, d1, d2, it;
-    uint8_t *ptr;
-    int64_t ti;
-    printf("testing '%s'\n", name);
-
-    /* test correctness */
-    for(it=0;it<20;it++) {
-
-        fill_random(img1, WIDTH * HEIGHT);
-        fill_random(img2, WIDTH * HEIGHT);
-
-        for(y=0;y<HEIGHT-17;y++) {
-            for(x=0;x<WIDTH-17;x++) {
-                ptr = img2 + y * WIDTH + x;
-                d1 = test_func(NULL, img1, ptr, WIDTH, 8);
-                d2 = ref_func(NULL, img1, ptr, WIDTH, 8);
-                if (d1 != d2) {
-                    printf("error: mmx=%d c=%d\n", d1, d2);
-                }
-            }
-        }
-    }
-    emms_c();
-
-    /* speed test */
-    ti = av_gettime_relative();
-    d1 = 0;
-    for(it=0;it<NB_ITS;it++) {
-        for(y=0;y<HEIGHT-17;y++) {
-            for(x=0;x<WIDTH-17;x++) {
-                ptr = img2 + y * WIDTH + x;
-                d1 += test_func(NULL, img1, ptr, WIDTH, 8);
-            }
-        }
-    }
-    emms_c();
-    dummy = d1; /* avoid optimization */
-    ti = av_gettime_relative() - ti;
-
-    printf("  %0.0f kop/s\n",
-           (double)NB_ITS * (WIDTH - 16) * (HEIGHT - 16) /
-           (double)(ti / 1000.0));
-}
-
-
-int main(int argc, char **argv)
-{
-    AVCodecContext *ctx;
-    int c;
-    MECmpContext cctx, mmxctx;
-    int flags[2] = { AV_CPU_FLAG_MMX, AV_CPU_FLAG_MMXEXT };
-    int flags_size = HAVE_MMXEXT ? 2 : 1;
-
-    if (argc > 1) {
-        help();
-        return 1;
-    }
-
-    printf("ffmpeg motion test\n");
-
-    ctx = avcodec_alloc_context3(NULL);
-    ctx->flags |= AV_CODEC_FLAG_BITEXACT;
-    av_force_cpu_flags(0);
-    memset(&cctx, 0, sizeof(cctx));
-    ff_me_cmp_init(&cctx, ctx);
-    for (c = 0; c < flags_size; c++) {
-        int x;
-        av_force_cpu_flags(flags[c]);
-        memset(&mmxctx, 0, sizeof(mmxctx));
-        ff_me_cmp_init(&mmxctx, ctx);
-
-        for (x = 0; x < 2; x++) {
-            printf("%s for %dx%d pixels\n", c ? "mmx2" : "mmx",
-                   x ? 8 : 16, x ? 8 : 16);
-            test_motion("mmx",     mmxctx.pix_abs[x][0], cctx.pix_abs[x][0]);
-            test_motion("mmx_x2",  mmxctx.pix_abs[x][1], cctx.pix_abs[x][1]);
-            test_motion("mmx_y2",  mmxctx.pix_abs[x][2], cctx.pix_abs[x][2]);
-            test_motion("mmx_xy2", mmxctx.pix_abs[x][3], cctx.pix_abs[x][3]);
-        }
-    }
-    av_free(ctx);
-
-    return 0;
-}
diff --git a/libavcodec/options-test.c b/libavcodec/options-test.c
deleted file mode 100644 (file)
index 0b064e6..0000000
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * Copyright (c) 2001 Fabrice Bellard
- * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
- *
- * This file is part of FFmpeg.
- *
- * 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
- * Lesser General Public License for more details.
- *
- * 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 "options.c"
-
-static int dummy_init(AVCodecContext *ctx)
-{
-    //TODO: this code should set every possible pointer that could be set by codec and is not an option;
-    ctx->extradata_size = 8;
-    ctx->extradata = av_malloc(ctx->extradata_size);
-    return 0;
-}
-
-static int dummy_close(AVCodecContext *ctx)
-{
-    av_freep(&ctx->extradata);
-    ctx->extradata_size = 0;
-    return 0;
-}
-
-static int dummy_encode(AVCodecContext *ctx, AVPacket *pkt, const AVFrame *frame, int *got_packet)
-{
-    return AVERROR(ENOSYS);
-}
-
-typedef struct Dummy12Context {
-    AVClass  *av_class;
-    int      num;
-    char*    str;
-} Dummy12Context;
-
-typedef struct Dummy3Context {
-    void     *fake_av_class;
-    int      num;
-    char*    str;
-} Dummy3Context;
-
-#define OFFSET(x) offsetof(Dummy12Context, x)
-#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
-static const AVOption dummy_options[] = {
-    { "str", "set str", OFFSET(str), AV_OPT_TYPE_STRING, { .str = "i'm src default value" }, 0, 0, VE},
-    { "num", "set num", OFFSET(num), AV_OPT_TYPE_INT,    { .i64 = 1500100900 },    0, INT_MAX, VE},
-    { NULL },
-};
-
-static const AVClass dummy_v1_class = {
-    .class_name = "dummy_v1_class",
-    .item_name  = av_default_item_name,
-    .option     = dummy_options,
-    .version    = LIBAVUTIL_VERSION_INT,
-};
-
-static const AVClass dummy_v2_class = {
-    .class_name = "dummy_v2_class",
-    .item_name  = av_default_item_name,
-    .option     = dummy_options,
-    .version    = LIBAVUTIL_VERSION_INT,
-};
-
-/* codec with options */
-static AVCodec dummy_v1_encoder = {
-    .name             = "dummy_v1_codec",
-    .type             = AVMEDIA_TYPE_VIDEO,
-    .id               = AV_CODEC_ID_NONE - 1,
-    .encode2          = dummy_encode,
-    .init             = dummy_init,
-    .close            = dummy_close,
-    .priv_class       = &dummy_v1_class,
-    .priv_data_size   = sizeof(Dummy12Context),
-};
-
-/* codec with options, different class */
-static AVCodec dummy_v2_encoder = {
-    .name             = "dummy_v2_codec",
-    .type             = AVMEDIA_TYPE_VIDEO,
-    .id               = AV_CODEC_ID_NONE - 2,
-    .encode2          = dummy_encode,
-    .init             = dummy_init,
-    .close            = dummy_close,
-    .priv_class       = &dummy_v2_class,
-    .priv_data_size   = sizeof(Dummy12Context),
-};
-
-/* codec with priv data, but no class */
-static AVCodec dummy_v3_encoder = {
-    .name             = "dummy_v3_codec",
-    .type             = AVMEDIA_TYPE_VIDEO,
-    .id               = AV_CODEC_ID_NONE - 3,
-    .encode2          = dummy_encode,
-    .init             = dummy_init,
-    .close            = dummy_close,
-    .priv_data_size   = sizeof(Dummy3Context),
-};
-
-/* codec without priv data */
-static AVCodec dummy_v4_encoder = {
-    .name             = "dummy_v4_codec",
-    .type             = AVMEDIA_TYPE_VIDEO,
-    .id               = AV_CODEC_ID_NONE - 4,
-    .encode2          = dummy_encode,
-    .init             = dummy_init,
-    .close            = dummy_close,
-};
-
-static void test_copy_print_codec(const AVCodecContext *ctx)
-{
-    printf("%-14s: %dx%d prv: %s",
-           ctx->codec ? ctx->codec->name : "NULL",
-           ctx->width, ctx->height,
-           ctx->priv_data ? "set" : "null");
-    if (ctx->codec && ctx->codec->priv_class && ctx->codec->priv_data_size) {
-        int64_t i64;
-        char *str = NULL;
-        av_opt_get_int(ctx->priv_data, "num", 0, &i64);
-        av_opt_get(ctx->priv_data, "str", 0, (uint8_t**)&str);
-        printf(" opts: %"PRId64" %s", i64, str);
-        av_free(str);
-    }
-    printf("\n");
-}
-
-static void test_copy(const AVCodec *c1, const AVCodec *c2)
-{
-    AVCodecContext *ctx1, *ctx2;
-    printf("%s -> %s\nclosed:\n", c1 ? c1->name : "NULL", c2 ? c2->name : "NULL");
-    ctx1 = avcodec_alloc_context3(c1);
-    ctx2 = avcodec_alloc_context3(c2);
-    ctx1->width = ctx1->height = 128;
-    if (ctx2->codec && ctx2->codec->priv_class && ctx2->codec->priv_data_size) {
-        av_opt_set(ctx2->priv_data, "num", "667", 0);
-        av_opt_set(ctx2->priv_data, "str", "i'm dest value before copy", 0);
-    }
-    avcodec_copy_context(ctx2, ctx1);
-    test_copy_print_codec(ctx1);
-    test_copy_print_codec(ctx2);
-    if (ctx1->codec) {
-        int ret;
-        printf("opened:\n");
-        ret = avcodec_open2(ctx1, ctx1->codec, NULL);
-        if (ret < 0) {
-            fprintf(stderr, "avcodec_open2 failed\n");
-            exit(1);
-        }
-        if (ctx2->codec && ctx2->codec->priv_class && ctx2->codec->priv_data_size) {
-            av_opt_set(ctx2->priv_data, "num", "667", 0);
-            av_opt_set(ctx2->priv_data, "str", "i'm dest value before copy", 0);
-        }
-        avcodec_copy_context(ctx2, ctx1);
-        test_copy_print_codec(ctx1);
-        test_copy_print_codec(ctx2);
-        avcodec_close(ctx1);
-    }
-    avcodec_free_context(&ctx1);
-    avcodec_free_context(&ctx2);
-}
-
-int main(void)
-{
-    AVCodec *dummy_codec[] = {
-        &dummy_v1_encoder,
-        &dummy_v2_encoder,
-        &dummy_v3_encoder,
-        &dummy_v4_encoder,
-        NULL,
-    };
-    int i, j;
-
-    for (i = 0; dummy_codec[i]; i++)
-        avcodec_register(dummy_codec[i]);
-
-    printf("testing avcodec_copy_context()\n");
-    for (i = 0; i < FF_ARRAY_ELEMS(dummy_codec); i++)
-        for (j = 0; j < FF_ARRAY_ELEMS(dummy_codec); j++)
-            test_copy(dummy_codec[i], dummy_codec[j]);
-    return 0;
-}
diff --git a/libavcodec/ppc/dct-test.c b/libavcodec/ppc/dct-test.c
deleted file mode 100644 (file)
index 2328516..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * This file is part of FFmpeg.
- *
- * 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
- * Lesser General Public License for more details.
- *
- * 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 "config.h"
-
-#include "fdct.h"
-
-static const struct algo fdct_tab_arch[] = {
-#if HAVE_ALTIVEC
-    { "altivecfdct", ff_fdct_altivec, FF_IDCT_PERM_NONE, AV_CPU_FLAG_ALTIVEC },
-#endif
-    { 0 }
-};
-
-static const struct algo idct_tab_arch[] = {
-    { 0 }
-};
diff --git a/libavcodec/rangecoder-test.c b/libavcodec/rangecoder-test.c
deleted file mode 100644 (file)
index 2892949..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * This file is part of FFmpeg.
- *
- * 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
- * Lesser General Public License for more details.
- *
- * 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 <stdint.h>
-#include <string.h>
-
-#include "libavutil/lfg.h"
-#include "libavutil/log.h"
-
-#include "rangecoder.h"
-
-#define SIZE 10240
-
-int main(void)
-{
-    RangeCoder c;
-    uint8_t b[9 * SIZE];
-    uint8_t r[9 * SIZE];
-    int i;
-    uint8_t state[10];
-    AVLFG prng;
-
-    av_lfg_init(&prng, 1);
-
-    ff_init_range_encoder(&c, b, SIZE);
-    ff_build_rac_states(&c, (1LL << 32) / 20, 128 + 64 + 32 + 16);
-
-    memset(state, 128, sizeof(state));
-
-    for (i = 0; i < SIZE; i++)
-        r[i] = av_lfg_get(&prng) % 7;
-
-    for (i = 0; i < SIZE; i++)
-        put_rac(&c, state, r[i] & 1);
-
-    ff_rac_terminate(&c);
-
-    ff_init_range_decoder(&c, b, SIZE);
-
-    memset(state, 128, sizeof(state));
-
-    for (i = 0; i < SIZE; i++)
-        if ((r[i] & 1) != get_rac(&c, state)) {
-            av_log(NULL, AV_LOG_ERROR, "rac failure at %d\n", i);
-            return 1;
-        }
-
-    return 0;
-}
diff --git a/libavcodec/snowenc-test.c b/libavcodec/snowenc-test.c
deleted file mode 100644 (file)
index e1ed86f..0000000
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright (C) 2004 Michael Niedermayer <michaelni@gmx.at>
- *
- * This file is part of FFmpeg.
- *
- * 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
- * Lesser General Public License for more details.
- *
- * 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 "snowenc.c"
-
-#undef malloc
-#undef free
-#undef printf
-
-#include "libavutil/lfg.h"
-#include "libavutil/mathematics.h"
-
-int main(void){
-#define width  256
-#define height 256
-    int buffer[2][width*height];
-    SnowContext s;
-    int i;
-    AVLFG prng;
-    s.spatial_decomposition_count=6;
-    s.spatial_decomposition_type=1;
-
-    s.temp_dwt_buffer  = av_mallocz_array(width, sizeof(DWTELEM));
-    s.temp_idwt_buffer = av_mallocz_array(width, sizeof(IDWTELEM));
-
-    if (!s.temp_dwt_buffer || !s.temp_idwt_buffer) {
-        fprintf(stderr, "Failed to allocate memory\n");
-        return 1;
-    }
-
-    av_lfg_init(&prng, 1);
-
-    printf("testing 5/3 DWT\n");
-    for(i=0; i<width*height; i++)
-        buffer[0][i] = buffer[1][i] = av_lfg_get(&prng) % 54321 - 12345;
-
-    ff_spatial_dwt(buffer[0], s.temp_dwt_buffer, width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count);
-    ff_spatial_idwt((IDWTELEM*)buffer[0], s.temp_idwt_buffer, width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count);
-
-    for(i=0; i<width*height; i++)
-        if(buffer[0][i]!= buffer[1][i]) printf("fsck: %6d %12d %7d\n",i, buffer[0][i], buffer[1][i]);
-
-    printf("testing 9/7 DWT\n");
-    s.spatial_decomposition_type=0;
-    for(i=0; i<width*height; i++)
-        buffer[0][i] = buffer[1][i] = av_lfg_get(&prng) % 54321 - 12345;
-
-    ff_spatial_dwt(buffer[0], s.temp_dwt_buffer, width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count);
-    ff_spatial_idwt((IDWTELEM*)buffer[0], s.temp_idwt_buffer, width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count);
-
-    for(i=0; i<width*height; i++)
-        if(FFABS(buffer[0][i] - buffer[1][i])>20) printf("fsck: %6d %12d %7d\n",i, buffer[0][i], buffer[1][i]);
-
-    {
-    int level, orientation, x, y;
-    int64_t errors[8][4];
-    int64_t g=0;
-
-        memset(errors, 0, sizeof(errors));
-        s.spatial_decomposition_count=3;
-        s.spatial_decomposition_type=0;
-        for(level=0; level<s.spatial_decomposition_count; level++){
-            for(orientation=level ? 1 : 0; orientation<4; orientation++){
-                int w= width  >> (s.spatial_decomposition_count-level);
-                int h= height >> (s.spatial_decomposition_count-level);
-                int stride= width  << (s.spatial_decomposition_count-level);
-                DWTELEM *buf= buffer[0];
-                int64_t error=0;
-
-                if(orientation&1) buf+=w;
-                if(orientation>1) buf+=stride>>1;
-
-                memset(buffer[0], 0, sizeof(int)*width*height);
-                buf[w/2 + h/2*stride]= 256*256;
-                ff_spatial_idwt((IDWTELEM*)buffer[0], s.temp_idwt_buffer, width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count);
-                for(y=0; y<height; y++){
-                    for(x=0; x<width; x++){
-                        int64_t d= buffer[0][x + y*width];
-                        error += d*d;
-                        if(FFABS(width/2-x)<9 && FFABS(height/2-y)<9 && level==2) printf("%8"PRId64" ", d);
-                    }
-                    if(FFABS(height/2-y)<9 && level==2) printf("\n");
-                }
-                error= (int)(sqrt(error)+0.5);
-                errors[level][orientation]= error;
-                if(g) g=av_gcd(g, error);
-                else g= error;
-            }
-        }
-        printf("static int const visual_weight[][4]={\n");
-        for(level=0; level<s.spatial_decomposition_count; level++){
-            printf("  {");
-            for(orientation=0; orientation<4; orientation++){
-                printf("%8"PRId64",", errors[level][orientation]/g);
-            }
-            printf("},\n");
-        }
-        printf("};\n");
-        {
-            int level=2;
-            int w= width  >> (s.spatial_decomposition_count-level);
-            //int h= height >> (s.spatial_decomposition_count-level);
-            int stride= width  << (s.spatial_decomposition_count-level);
-            DWTELEM *buf= buffer[0];
-            int64_t error=0;
-
-            buf+=w;
-            buf+=stride>>1;
-
-            memset(buffer[0], 0, sizeof(int)*width*height);
-            for(y=0; y<height; y++){
-                for(x=0; x<width; x++){
-                    int tab[4]={0,2,3,1};
-                    buffer[0][x+width*y]= 256*256*tab[(x&1) + 2*(y&1)];
-                }
-            }
-            ff_spatial_dwt(buffer[0], s.temp_dwt_buffer, width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count);
-            for(y=0; y<height; y++){
-                for(x=0; x<width; x++){
-                    int64_t d= buffer[0][x + y*width];
-                    error += d*d;
-                    if(FFABS(width/2-x)<9 && FFABS(height/2-y)<9) printf("%8"PRId64" ", d);
-                }
-                if(FFABS(height/2-y)<9) printf("\n");
-            }
-        }
-
-    }
-    return 0;
-}
diff --git a/libavcodec/tests/.gitignore b/libavcodec/tests/.gitignore
new file mode 100644 (file)
index 0000000..d8ab947
--- /dev/null
@@ -0,0 +1,16 @@
+/avfft
+/cabac
+/dct
+/fft
+/fft-fixed
+/fft-fixed32
+/golomb
+/iirfilter
+/imgconvert
+/jpeg2000dwt
+/mathops
+/motion
+/options
+/rangecoder
+/snowenc
+/utils
diff --git a/libavcodec/tests/arm/dct.c b/libavcodec/tests/arm/dct.c
new file mode 100644 (file)
index 0000000..596d369
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * 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 "config.h"
+
+#include "libavcodec/arm/idct.h"
+
+static const struct algo fdct_tab_arch[] = {
+    { 0 }
+};
+
+static const struct algo idct_tab_arch[] = {
+    { "SIMPLE-ARM",     ff_simple_idct_arm,     FF_IDCT_PERM_NONE },
+    { "INT-ARM",        ff_j_rev_dct_arm,       FF_IDCT_PERM_LIBMPEG2 },
+#if HAVE_ARMV5TE
+    { "SIMPLE-ARMV5TE", ff_simple_idct_armv5te, FF_IDCT_PERM_NONE,      AV_CPU_FLAG_ARMV5TE },
+#endif
+#if HAVE_ARMV6
+    { "SIMPLE-ARMV6",   ff_simple_idct_armv6,   FF_IDCT_PERM_LIBMPEG2,  AV_CPU_FLAG_ARMV6 },
+#endif
+#if HAVE_NEON
+    { "SIMPLE-NEON",    ff_simple_idct_neon,    FF_IDCT_PERM_PARTTRANS, AV_CPU_FLAG_NEON },
+#endif
+    { 0 }
+};
diff --git a/libavcodec/tests/avfft.c b/libavcodec/tests/avfft.c
new file mode 100644 (file)
index 0000000..6bc48ea
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * 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 "config.h"
+#include "libavutil/mem.h"
+#include "libavcodec/avfft.h"
+
+int main(int argc, char **argv)
+{
+    int i;
+#define LEN 1024
+    FFTSample *ref  = av_malloc_array(LEN, sizeof(*ref));
+    FFTSample *data = av_malloc_array(LEN, sizeof(*data));
+    RDFTContext *rdft_context  = av_rdft_init(10, DFT_R2C);
+    RDFTContext *irdft_context = av_rdft_init(10, IDFT_C2R);
+
+    if (!ref || !data || !rdft_context || !irdft_context)
+        return 2;
+    for (i=0; i<LEN; i++) {
+        ref[i] = data[i] = i*456 + 123 + i*i;
+    }
+    av_rdft_calc(rdft_context, data);
+    av_rdft_calc(irdft_context, data);
+
+    for (i=0; i<LEN; i++) {
+        if (fabs(ref[i] - data[i]/LEN*2) > 1) {
+            fprintf(stderr, "Failed at %d (%f %f)\n", i, ref[i], data[i]/LEN*2);
+            return 1;
+        }
+    }
+
+    av_rdft_end(rdft_context);
+    av_rdft_end(irdft_context);
+    av_free(data);
+    av_free(ref);
+
+    return 0;
+}
diff --git a/libavcodec/tests/cabac.c b/libavcodec/tests/cabac.c
new file mode 100644 (file)
index 0000000..affe4eb
--- /dev/null
@@ -0,0 +1,165 @@
+/*
+ * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of FFmpeg.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * 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 "libavcodec/cabac.c"
+
+#define SIZE 10240
+
+#include "libavutil/lfg.h"
+#include "libavcodec/avcodec.h"
+
+static inline void put_cabac_bit(CABACContext *c, int b){
+    put_bits(&c->pb, 1, b);
+    for(;c->outstanding_count; c->outstanding_count--){
+        put_bits(&c->pb, 1, 1-b);
+    }
+}
+
+static inline void renorm_cabac_encoder(CABACContext *c){
+    while(c->range < 0x100){
+        //FIXME optimize
+        if(c->low<0x100){
+            put_cabac_bit(c, 0);
+        }else if(c->low<0x200){
+            c->outstanding_count++;
+            c->low -= 0x100;
+        }else{
+            put_cabac_bit(c, 1);
+            c->low -= 0x200;
+        }
+
+        c->range+= c->range;
+        c->low += c->low;
+    }
+}
+
+static void put_cabac(CABACContext *c, uint8_t * const state, int bit){
+    int RangeLPS= ff_h264_lps_range[2*(c->range&0xC0) + *state];
+
+    if(bit == ((*state)&1)){
+        c->range -= RangeLPS;
+        *state    = ff_h264_mlps_state[128 + *state];
+    }else{
+        c->low += c->range - RangeLPS;
+        c->range = RangeLPS;
+        *state= ff_h264_mlps_state[127 - *state];
+    }
+
+    renorm_cabac_encoder(c);
+}
+
+/**
+ * @param bit 0 -> write zero bit, !=0 write one bit
+ */
+static void put_cabac_bypass(CABACContext *c, int bit){
+    c->low += c->low;
+
+    if(bit){
+        c->low += c->range;
+    }
+//FIXME optimize
+    if(c->low<0x200){
+        put_cabac_bit(c, 0);
+    }else if(c->low<0x400){
+        c->outstanding_count++;
+        c->low -= 0x200;
+    }else{
+        put_cabac_bit(c, 1);
+        c->low -= 0x400;
+    }
+}
+
+/**
+ *
+ * @return the number of bytes written
+ */
+static int put_cabac_terminate(CABACContext *c, int bit){
+    c->range -= 2;
+
+    if(!bit){
+        renorm_cabac_encoder(c);
+    }else{
+        c->low += c->range;
+        c->range= 2;
+
+        renorm_cabac_encoder(c);
+
+        av_assert0(c->low <= 0x1FF);
+        put_cabac_bit(c, c->low>>9);
+        put_bits(&c->pb, 2, ((c->low>>7)&3)|1);
+
+        flush_put_bits(&c->pb); //FIXME FIXME FIXME XXX wrong
+    }
+
+    return (put_bits_count(&c->pb)+7)>>3;
+}
+
+int main(void){
+    CABACContext c;
+    uint8_t b[9*SIZE];
+    uint8_t r[9*SIZE];
+    int i, ret = 0;
+    uint8_t state[10]= {0};
+    AVLFG prng;
+
+    av_lfg_init(&prng, 1);
+    ff_init_cabac_encoder(&c, b, SIZE);
+
+    for(i=0; i<SIZE; i++){
+        if(2*i<SIZE) r[i] = av_lfg_get(&prng) % 7;
+        else         r[i] = (i>>8)&1;
+    }
+
+    for(i=0; i<SIZE; i++){
+        put_cabac_bypass(&c, r[i]&1);
+    }
+
+    for(i=0; i<SIZE; i++){
+        put_cabac(&c, state, r[i]&1);
+    }
+
+    i= put_cabac_terminate(&c, 1);
+    b[i++] = av_lfg_get(&prng);
+    b[i  ] = av_lfg_get(&prng);
+
+    ff_init_cabac_decoder(&c, b, SIZE);
+
+    memset(state, 0, sizeof(state));
+
+    for(i=0; i<SIZE; i++){
+        if( (r[i]&1) != get_cabac_bypass(&c) ) {
+            av_log(NULL, AV_LOG_ERROR, "CABAC bypass failure at %d\n", i);
+            ret = 1;
+        }
+    }
+
+    for(i=0; i<SIZE; i++){
+        if( (r[i]&1) != get_cabac_noinline(&c, state) ) {
+            av_log(NULL, AV_LOG_ERROR, "CABAC failure at %d\n", i);
+            ret = 1;
+        }
+    }
+    if(!get_cabac_terminate(&c)) {
+        av_log(NULL, AV_LOG_ERROR, "where's the Terminator?\n");
+        ret = 1;
+    }
+
+    return ret;
+}
diff --git a/libavcodec/tests/dct.c b/libavcodec/tests/dct.c
new file mode 100644 (file)
index 0000000..5303fdf
--- /dev/null
@@ -0,0 +1,523 @@
+/*
+ * (c) 2001 Fabrice Bellard
+ *     2007 Marc Hoffman <marc.hoffman@analog.com>
+ *
+ * This file is part of FFmpeg.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * 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
+ */
+
+/**
+ * @file
+ * DCT test (c) 2001 Fabrice Bellard
+ * Started from sample code by Juan J. Sierralta P.
+ */
+
+#include "config.h"
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <math.h>
+
+#include "libavutil/cpu.h"
+#include "libavutil/common.h"
+#include "libavutil/internal.h"
+#include "libavutil/lfg.h"
+#include "libavutil/time.h"
+
+#include "libavcodec/dct.h"
+#include "libavcodec/idctdsp.h"
+#include "libavcodec/simple_idct.h"
+#include "libavcodec/xvididct.h"
+#include "libavcodec/aandcttab.h"
+#include "libavcodec/faandct.h"
+#include "libavcodec/faanidct.h"
+#include "libavcodec/dctref.h"
+
+struct algo {
+    const char *name;
+    void (*func)(int16_t *block);
+    enum idct_permutation_type perm_type;
+    int cpu_flag;
+    int nonspec;
+};
+
+static const struct algo fdct_tab[] = {
+    { "REF-DBL",     ff_ref_fdct,          FF_IDCT_PERM_NONE },
+    { "IJG-AAN-INT", ff_fdct_ifast,        FF_IDCT_PERM_NONE },
+    { "IJG-LLM-INT", ff_jpeg_fdct_islow_8, FF_IDCT_PERM_NONE },
+#if CONFIG_FAANDCT
+    { "FAAN",        ff_faandct,           FF_IDCT_PERM_NONE },
+#endif /* CONFIG_FAANDCT */
+};
+
+static void ff_prores_idct_wrap(int16_t *dst){
+    LOCAL_ALIGNED(16, int16_t, qmat, [64]);
+    int i;
+
+    for(i=0; i<64; i++){
+        qmat[i]=4;
+    }
+    ff_prores_idct(dst, qmat);
+    for(i=0; i<64; i++) {
+         dst[i] -= 512;
+    }
+}
+
+static const struct algo idct_tab[] = {
+    { "REF-DBL",     ff_ref_idct,          FF_IDCT_PERM_NONE },
+    { "INT",         ff_j_rev_dct,         FF_IDCT_PERM_LIBMPEG2 },
+    { "SIMPLE-C",    ff_simple_idct_8,     FF_IDCT_PERM_NONE },
+    { "SIMPLE-C10",  ff_simple_idct_10,    FF_IDCT_PERM_NONE },
+    { "SIMPLE-C12",  ff_simple_idct_12,    FF_IDCT_PERM_NONE, 0, 1 },
+    { "PR-C",        ff_prores_idct_wrap,  FF_IDCT_PERM_NONE, 0, 1 },
+#if CONFIG_FAANIDCT
+    { "FAANI",       ff_faanidct,          FF_IDCT_PERM_NONE },
+#endif /* CONFIG_FAANIDCT */
+#if CONFIG_MPEG4_DECODER
+    { "XVID",        ff_xvid_idct,         FF_IDCT_PERM_NONE, 0, 1 },
+#endif /* CONFIG_MPEG4_DECODER */
+};
+
+#if ARCH_ARM
+#include "arm/dct.c"
+#elif ARCH_PPC
+#include "ppc/dct.c"
+#elif ARCH_X86
+#include "x86/dct.c"
+#else
+static const struct algo fdct_tab_arch[] = { { 0 } };
+static const struct algo idct_tab_arch[] = { { 0 } };
+#endif
+
+#define AANSCALE_BITS 12
+
+#define NB_ITS 20000
+#define NB_ITS_SPEED 50000
+
+DECLARE_ALIGNED(16, static int16_t, block)[64];
+DECLARE_ALIGNED(8,  static int16_t, block1)[64];
+
+static void init_block(int16_t block[64], int test, int is_idct, AVLFG *prng, int vals)
+{
+    int i, j;
+
+    memset(block, 0, 64 * sizeof(*block));
+
+    switch (test) {
+    case 0:
+        for (i = 0; i < 64; i++)
+            block[i] = (av_lfg_get(prng) % (2*vals)) -vals;
+        if (is_idct) {
+            ff_ref_fdct(block);
+            for (i = 0; i < 64; i++)
+                block[i] >>= 3;
+        }
+        break;
+    case 1:
+        j = av_lfg_get(prng) % 10 + 1;
+        for (i = 0; i < j; i++) {
+            int idx = av_lfg_get(prng) % 64;
+            block[idx] = av_lfg_get(prng) % (2*vals) -vals;
+        }
+        break;
+    case 2:
+        block[ 0] = av_lfg_get(prng) % (16*vals) - (8*vals);
+        block[63] = (block[0] & 1) ^ 1;
+        break;
+    }
+}
+
+static void permute(int16_t dst[64], const int16_t src[64],
+                    enum idct_permutation_type perm_type)
+{
+    int i;
+
+#if ARCH_X86
+    if (permute_x86(dst, src, perm_type))
+        return;
+#endif
+
+    switch (perm_type) {
+    case FF_IDCT_PERM_LIBMPEG2:
+        for (i = 0; i < 64; i++)
+            dst[(i & 0x38) | ((i & 6) >> 1) | ((i & 1) << 2)] = src[i];
+        break;
+    case FF_IDCT_PERM_PARTTRANS:
+        for (i = 0; i < 64; i++)
+            dst[(i & 0x24) | ((i & 3) << 3) | ((i >> 3) & 3)] = src[i];
+        break;
+    case FF_IDCT_PERM_TRANSPOSE:
+        for (i = 0; i < 64; i++)
+            dst[(i>>3) | ((i<<3)&0x38)] = src[i];
+        break;
+    default:
+        for (i = 0; i < 64; i++)
+            dst[i] = src[i];
+        break;
+    }
+}
+
+static int dct_error(const struct algo *dct, int test, int is_idct, int speed, const int bits)
+{
+    void (*ref)(int16_t *block) = is_idct ? ff_ref_idct : ff_ref_fdct;
+    int it, i, scale;
+    int err_inf, v;
+    int64_t err2, ti, ti1, it1, err_sum = 0;
+    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++) {
+        init_block(block1, test, is_idct, &prng, vals);
+        permute(block, block1, dct->perm_type);
+
+        dct->func(block);
+        emms_c();
+
+        if (!strcmp(dct->name, "IJG-AAN-INT")) {
+            for (i = 0; i < 64; i++) {
+                scale = 8 * (1 << (AANSCALE_BITS + 11)) / ff_aanscales[i];
+                block[i] = (block[i] * scale) >> AANSCALE_BITS;
+            }
+        }
+
+        ref(block1);
+        if (!strcmp(dct->name, "PR-SSE2"))
+            for (i = 0; i < 64; i++)
+                block1[i] = av_clip(block1[i], 4-512, 1019-512);
+
+        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 (blockSumErrMax < blockSumErr)
+            blockSumErrMax = blockSumErr;
+    }
+    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]);
+    }
+    printf("\n");
+
+    omse = (double) err2 / NB_ITS / 64;
+    ome  = (double) err_sum / NB_ITS / 64;
+
+    spec_err = is_idct && (err_inf > 1 || omse > 0.02 || fabs(ome) > 0.0015);
+
+    printf("%s %s: max_err=%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) {
+        printf("Failed!\n");
+        return 1;
+    }
+
+    if (!speed)
+        return 0;
+
+    /* speed test */
+
+    init_block(block, test, is_idct, &prng, vals);
+    permute(block1, block, dct->perm_type);
+
+    ti = av_gettime_relative();
+    it1 = 0;
+    do {
+        for (it = 0; it < NB_ITS_SPEED; it++) {
+            memcpy(block, block1, sizeof(block));
+            dct->func(block);
+        }
+        emms_c();
+        it1 += NB_ITS_SPEED;
+        ti1 = av_gettime_relative() - ti;
+    } while (ti1 < 1000000);
+
+    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];
+DECLARE_ALIGNED(8, static uint8_t, img_dest1)[64];
+
+static void idct248_ref(uint8_t *dest, int linesize, int16_t *block)
+{
+    static int init;
+    static double c8[8][8];
+    static double c4[4][4];
+    double block1[64], block2[64], block3[64];
+    double s, sum, v;
+    int i, j, k;
+
+    if (!init) {
+        init = 1;
+
+        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);
+                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++) {
+            sum = 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];
+            }
+        }
+    }
+
+    /* 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;
+        }
+    }
+
+    /* idct8 on lines */
+    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;
+        }
+    }
+
+    /* idct4 */
+    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;
+
+            /* 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;
+        }
+    }
+
+    /* 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);
+        }
+    }
+}
+
+static void idct248_error(const char *name,
+                          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);
+
+    /* just one test to see if code is correct (precision is less
+       important here) */
+    err_max = 0;
+    for (it = 0; it < NB_ITS; it++) {
+        /* XXX: use forward transform to generate values */
+        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];
+        idct248_ref(img_dest1, 8, block);
+
+        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]);
+            if (v == 255)
+                printf("%d %d\n", img_dest[i], img_dest1[i]);
+            if (v > err_max)
+                err_max = v;
+        }
+#if 0
+        printf("ref=\n");
+        for(i=0;i<8;i++) {
+            int j;
+            for(j=0;j<8;j++) {
+                printf(" %3d", img_dest1[i*8+j]);
+            }
+            printf("\n");
+        }
+
+        printf("out=\n");
+        for(i=0;i<8;i++) {
+            int j;
+            for(j=0;j<8;j++) {
+                printf(" %3d", img_dest[i*8+j]);
+            }
+            printf("\n");
+        }
+#endif
+    }
+    printf("%s %s: err_inf=%d\n", 1 ? "IDCT248" : "DCT248", name, err_max);
+
+    if (!speed)
+        return;
+
+    ti = av_gettime_relative();
+    it1 = 0;
+    do {
+        for (it = 0; it < NB_ITS_SPEED; it++) {
+            for (i = 0; i < 64; i++)
+                block[i] = block1[i];
+            idct248_put(img_dest, 8, block);
+        }
+        emms_c();
+        it1 += NB_ITS_SPEED;
+        ti1 = av_gettime_relative() - ti;
+    } while (ti1 < 1000000);
+
+    printf("%s %s: %0.1f kdct/s\n", 1 ? "IDCT248" : "DCT248", name,
+           (double) it1 * 1000.0 / (double) ti1);
+}
+
+static void help(void)
+{
+    printf("dct-test [-i] [<test-number>] [<bits>]\n"
+           "test-number 0 -> test with random matrixes\n"
+           "            1 -> test with random sparse matrixes\n"
+           "            2 -> do 3. test from MPEG-4 std\n"
+           "bits        Number of time domain bits to use, 8 is default\n"
+           "-i          test IDCT implementations\n"
+           "-4          test IDCT248 implementations\n"
+           "-t          speed test\n");
+}
+
+#if !HAVE_GETOPT
+#include "compat/getopt.c"
+#endif
+
+int main(int argc, char **argv)
+{
+    int test_idct = 0, test_248_dct = 0;
+    int c, i;
+    int test = 1;
+    int speed = 0;
+    int err = 0;
+    int bits=8;
+
+    ff_ref_dct_init();
+
+    for (;;) {
+        c = getopt(argc, argv, "ih4t");
+        if (c == -1)
+            break;
+        switch (c) {
+        case 'i':
+            test_idct = 1;
+            break;
+        case '4':
+            test_248_dct = 1;
+            break;
+        case 't':
+            speed = 1;
+            break;
+        default:
+        case 'h':
+            help();
+            return 0;
+        }
+    }
+
+    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, speed);
+    } else {
+        const int cpu_flags = av_get_cpu_flags();
+        if (test_idct) {
+            for (i = 0; i < FF_ARRAY_ELEMS(idct_tab); i++)
+                err |= dct_error(&idct_tab[i], test, test_idct, speed, bits);
+
+            for (i = 0; idct_tab_arch[i].name; i++)
+                if (!(~cpu_flags & idct_tab_arch[i].cpu_flag))
+                    err |= dct_error(&idct_tab_arch[i], test, test_idct, speed, bits);
+        }
+#if CONFIG_FDCTDSP
+        else {
+            for (i = 0; i < FF_ARRAY_ELEMS(fdct_tab); i++)
+                err |= dct_error(&fdct_tab[i], test, test_idct, speed, bits);
+
+            for (i = 0; fdct_tab_arch[i].name; i++)
+                if (!(~cpu_flags & fdct_tab_arch[i].cpu_flag))
+                    err |= dct_error(&fdct_tab_arch[i], test, test_idct, speed, bits);
+        }
+#endif /* CONFIG_FDCTDSP */
+    }
+
+    if (err)
+        printf("Error: %d.\n", err);
+
+    return !!err;
+}
diff --git a/libavcodec/tests/fft-fixed.c b/libavcodec/tests/fft-fixed.c
new file mode 100644 (file)
index 0000000..fe1b57a
--- /dev/null
@@ -0,0 +1,20 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * 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
+ */
+
+#define FFT_FLOAT 0
+#include "fft.c"
diff --git a/libavcodec/tests/fft-fixed32.c b/libavcodec/tests/fft-fixed32.c
new file mode 100644 (file)
index 0000000..f33494f
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * 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
+ */
+
+#define FFT_FLOAT 0
+#define FFT_FIXED_32 1
+#include "fft.c"
diff --git a/libavcodec/tests/fft.c b/libavcodec/tests/fft.c
new file mode 100644 (file)
index 0000000..4717303
--- /dev/null
@@ -0,0 +1,519 @@
+/*
+ * (c) 2002 Fabrice Bellard
+ *
+ * This file is part of FFmpeg.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * 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
+ */
+
+/**
+ * @file
+ * FFT and MDCT tests.
+ */
+
+#include "config.h"
+
+#include <math.h>
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "libavutil/cpu.h"
+#include "libavutil/lfg.h"
+#include "libavutil/log.h"
+#include "libavutil/mathematics.h"
+#include "libavutil/time.h"
+
+#include "libavcodec/fft.h"
+#if FFT_FLOAT
+#include "libavcodec/dct.h"
+#include "libavcodec/rdft.h"
+#endif
+
+/* reference fft */
+
+#define MUL16(a, b) ((a) * (b))
+
+#define CMAC(pre, pim, are, aim, bre, bim)          \
+    {                                               \
+        pre += (MUL16(are, bre) - MUL16(aim, bim)); \
+        pim += (MUL16(are, bim) + MUL16(bre, aim)); \
+    }
+
+#if FFT_FLOAT
+#define RANGE 1.0
+#define REF_SCALE(x, bits)  (x)
+#define FMT "%10.6f"
+#elif FFT_FIXED_32
+#define RANGE 8388608
+#define REF_SCALE(x, bits) (x)
+#define FMT "%6d"
+#else
+#define RANGE 16384
+#define REF_SCALE(x, bits) ((x) / (1 << (bits)))
+#define FMT "%6d"
+#endif
+
+static struct {
+    float re, im;
+} *exptab;
+
+static int fft_ref_init(int nbits, int inverse)
+{
+    int i, n = 1 << nbits;
+
+    exptab = av_malloc_array((n / 2), sizeof(*exptab));
+    if (!exptab)
+        return AVERROR(ENOMEM);
+
+    for (i = 0; i < (n / 2); i++) {
+        double alpha = 2 * M_PI * (float) i / (float) n;
+        double c1 = cos(alpha), s1 = sin(alpha);
+        if (!inverse)
+            s1 = -s1;
+        exptab[i].re = c1;
+        exptab[i].im = s1;
+    }
+    return 0;
+}
+
+static void fft_ref(FFTComplex *tabr, FFTComplex *tab, int nbits)
+{
+    int i, j;
+    int n  = 1 << nbits;
+    int n2 = n >> 1;
+
+    for (i = 0; i < n; i++) {
+        double tmp_re = 0, tmp_im = 0;
+        FFTComplex *q = tab;
+        for (j = 0; j < n; j++) {
+            double s, c;
+            int k = (i * j) & (n - 1);
+            if (k >= n2) {
+                c = -exptab[k - n2].re;
+                s = -exptab[k - n2].im;
+            } else {
+                c = exptab[k].re;
+                s = exptab[k].im;
+            }
+            CMAC(tmp_re, tmp_im, c, s, q->re, q->im);
+            q++;
+        }
+        tabr[i].re = REF_SCALE(tmp_re, nbits);
+        tabr[i].im = REF_SCALE(tmp_im, nbits);
+    }
+}
+
+#if CONFIG_MDCT
+static void imdct_ref(FFTSample *out, FFTSample *in, int nbits)
+{
+    int i, k, n = 1 << nbits;
+
+    for (i = 0; i < n; i++) {
+        double sum = 0;
+        for (k = 0; k < n / 2; k++) {
+            int a = (2 * i + 1 + (n / 2)) * (2 * k + 1);
+            double f = cos(M_PI * a / (double) (2 * n));
+            sum += f * in[k];
+        }
+        out[i] = REF_SCALE(-sum, nbits - 2);
+    }
+}
+
+/* NOTE: no normalisation by 1 / N is done */
+static void mdct_ref(FFTSample *output, FFTSample *input, int nbits)
+{
+    int i, k, n = 1 << nbits;
+
+    /* do it by hand */
+    for (k = 0; k < n / 2; k++) {
+        double s = 0;
+        for (i = 0; i < n; i++) {
+            double a = (2 * M_PI * (2 * i + 1 + n / 2) * (2 * k + 1) / (4 * n));
+            s += input[i] * cos(a);
+        }
+        output[k] = REF_SCALE(s, nbits - 1);
+    }
+}
+#endif /* CONFIG_MDCT */
+
+#if FFT_FLOAT
+#if CONFIG_DCT
+static void idct_ref(FFTSample *output, FFTSample *input, int nbits)
+{
+    int i, k, n = 1 << nbits;
+
+    /* do it by hand */
+    for (i = 0; i < n; i++) {
+        double s = 0.5 * input[0];
+        for (k = 1; k < n; k++) {
+            double a = M_PI * k * (i + 0.5) / n;
+            s += input[k] * cos(a);
+        }
+        output[i] = 2 * s / n;
+    }
+}
+
+static void dct_ref(FFTSample *output, FFTSample *input, int nbits)
+{
+    int i, k, n = 1 << nbits;
+
+    /* do it by hand */
+    for (k = 0; k < n; k++) {
+        double s = 0;
+        for (i = 0; i < n; i++) {
+            double a = M_PI * k * (i + 0.5) / n;
+            s += input[i] * cos(a);
+        }
+        output[k] = s;
+    }
+}
+#endif /* CONFIG_DCT */
+#endif /* FFT_FLOAT */
+
+static FFTSample frandom(AVLFG *prng)
+{
+    return (int16_t) av_lfg_get(prng) / 32768.0 * RANGE;
+}
+
+static int check_diff(FFTSample *tab1, FFTSample *tab2, int n, double scale)
+{
+    int i, err = 0;
+    double error = 0, max = 0;
+
+    for (i = 0; i < n; i++) {
+        double e = fabs(tab1[i] - (tab2[i] / scale)) / RANGE;
+        if (e >= 1e-3) {
+            av_log(NULL, AV_LOG_ERROR, "ERROR %5d: "FMT" "FMT"\n",
+                   i, tab1[i], tab2[i]);
+            err = 1;
+        }
+        error += e * e;
+        if (e > max)
+            max = e;
+    }
+    av_log(NULL, AV_LOG_INFO, "max:%f e:%g\n", max, sqrt(error / n));
+    return err;
+}
+
+static void help(void)
+{
+    av_log(NULL, AV_LOG_INFO,
+           "usage: fft-test [-h] [-s] [-i] [-n b]\n"
+           "-h     print this help\n"
+           "-s     speed test\n"
+           "-m     (I)MDCT test\n"
+           "-d     (I)DCT test\n"
+           "-r     (I)RDFT test\n"
+           "-i     inverse transform test\n"
+           "-n b   set the transform size to 2^b\n"
+           "-f x   set scale factor for output data of (I)MDCT to x\n");
+}
+
+enum tf_transform {
+    TRANSFORM_FFT,
+    TRANSFORM_MDCT,
+    TRANSFORM_RDFT,
+    TRANSFORM_DCT,
+};
+
+#if !HAVE_GETOPT
+#include "compat/getopt.c"
+#endif
+
+int main(int argc, char **argv)
+{
+    FFTComplex *tab, *tab1, *tab_ref;
+    FFTSample *tab2;
+    enum tf_transform transform = TRANSFORM_FFT;
+    FFTContext m, s;
+#if FFT_FLOAT
+    RDFTContext r;
+    DCTContext d;
+#endif /* FFT_FLOAT */
+    int it, i, err = 1;
+    int do_speed = 0, do_inverse = 0;
+    int fft_nbits = 9, fft_size;
+    double scale = 1.0;
+    AVLFG prng;
+
+    av_lfg_init(&prng, 1);
+
+    for (;;) {
+        int c = getopt(argc, argv, "hsimrdn:f:c:");
+        if (c == -1)
+            break;
+        switch (c) {
+        case 'h':
+            help();
+            return 1;
+        case 's':
+            do_speed = 1;
+            break;
+        case 'i':
+            do_inverse = 1;
+            break;
+        case 'm':
+            transform = TRANSFORM_MDCT;
+            break;
+        case 'r':
+            transform = TRANSFORM_RDFT;
+            break;
+        case 'd':
+            transform = TRANSFORM_DCT;
+            break;
+        case 'n':
+            fft_nbits = atoi(optarg);
+            break;
+        case 'f':
+            scale = atof(optarg);
+            break;
+        case 'c':
+        {
+            unsigned cpuflags = av_get_cpu_flags();
+
+            if (av_parse_cpu_caps(&cpuflags, optarg) < 0)
+                return 1;
+
+            av_force_cpu_flags(cpuflags);
+            break;
+        }
+        }
+    }
+
+    fft_size = 1 << fft_nbits;
+    tab      = av_malloc_array(fft_size, sizeof(FFTComplex));
+    tab1     = av_malloc_array(fft_size, sizeof(FFTComplex));
+    tab_ref  = av_malloc_array(fft_size, sizeof(FFTComplex));
+    tab2     = av_malloc_array(fft_size, sizeof(FFTSample));
+
+    if (!(tab && tab1 && tab_ref && tab2))
+        goto cleanup;
+
+    switch (transform) {
+#if CONFIG_MDCT
+    case TRANSFORM_MDCT:
+        av_log(NULL, AV_LOG_INFO, "Scale factor is set to %f\n", scale);
+        if (do_inverse)
+            av_log(NULL, AV_LOG_INFO, "IMDCT");
+        else
+            av_log(NULL, AV_LOG_INFO, "MDCT");
+        ff_mdct_init(&m, fft_nbits, do_inverse, scale);
+        break;
+#endif /* CONFIG_MDCT */
+    case TRANSFORM_FFT:
+        if (do_inverse)
+            av_log(NULL, AV_LOG_INFO, "IFFT");
+        else
+            av_log(NULL, AV_LOG_INFO, "FFT");
+        ff_fft_init(&s, fft_nbits, do_inverse);
+        if ((err = fft_ref_init(fft_nbits, do_inverse)) < 0)
+            goto cleanup;
+        break;
+#if FFT_FLOAT
+#    if CONFIG_RDFT
+    case TRANSFORM_RDFT:
+        if (do_inverse)
+            av_log(NULL, AV_LOG_INFO, "IDFT_C2R");
+        else
+            av_log(NULL, AV_LOG_INFO, "DFT_R2C");
+        ff_rdft_init(&r, fft_nbits, do_inverse ? IDFT_C2R : DFT_R2C);
+        if ((err = fft_ref_init(fft_nbits, do_inverse)) < 0)
+            goto cleanup;
+        break;
+#    endif /* CONFIG_RDFT */
+#    if CONFIG_DCT
+    case TRANSFORM_DCT:
+        if (do_inverse)
+            av_log(NULL, AV_LOG_INFO, "DCT_III");
+        else
+            av_log(NULL, AV_LOG_INFO, "DCT_II");
+        ff_dct_init(&d, fft_nbits, do_inverse ? DCT_III : DCT_II);
+        break;
+#    endif /* CONFIG_DCT */
+#endif /* FFT_FLOAT */
+    default:
+        av_log(NULL, AV_LOG_ERROR, "Requested transform not supported\n");
+        goto cleanup;
+    }
+    av_log(NULL, AV_LOG_INFO, " %d test\n", fft_size);
+
+    /* generate random data */
+
+    for (i = 0; i < fft_size; i++) {
+        tab1[i].re = frandom(&prng);
+        tab1[i].im = frandom(&prng);
+    }
+
+    /* checking result */
+    av_log(NULL, AV_LOG_INFO, "Checking...\n");
+
+    switch (transform) {
+#if CONFIG_MDCT
+    case TRANSFORM_MDCT:
+        if (do_inverse) {
+            imdct_ref(&tab_ref->re, &tab1->re, fft_nbits);
+            m.imdct_calc(&m, tab2, &tab1->re);
+            err = check_diff(&tab_ref->re, tab2, fft_size, scale);
+        } else {
+            mdct_ref(&tab_ref->re, &tab1->re, fft_nbits);
+            m.mdct_calc(&m, tab2, &tab1->re);
+            err = check_diff(&tab_ref->re, tab2, fft_size / 2, scale);
+        }
+        break;
+#endif /* CONFIG_MDCT */
+    case TRANSFORM_FFT:
+        memcpy(tab, tab1, fft_size * sizeof(FFTComplex));
+        s.fft_permute(&s, tab);
+        s.fft_calc(&s, tab);
+
+        fft_ref(tab_ref, tab1, fft_nbits);
+        err = check_diff(&tab_ref->re, &tab->re, fft_size * 2, 1.0);
+        break;
+#if FFT_FLOAT
+#if CONFIG_RDFT
+    case TRANSFORM_RDFT:
+    {
+        int fft_size_2 = fft_size >> 1;
+        if (do_inverse) {
+            tab1[0].im          = 0;
+            tab1[fft_size_2].im = 0;
+            for (i = 1; i < fft_size_2; i++) {
+                tab1[fft_size_2 + i].re =  tab1[fft_size_2 - i].re;
+                tab1[fft_size_2 + i].im = -tab1[fft_size_2 - i].im;
+            }
+
+            memcpy(tab2, tab1, fft_size * sizeof(FFTSample));
+            tab2[1] = tab1[fft_size_2].re;
+
+            r.rdft_calc(&r, tab2);
+            fft_ref(tab_ref, tab1, fft_nbits);
+            for (i = 0; i < fft_size; i++) {
+                tab[i].re = tab2[i];
+                tab[i].im = 0;
+            }
+            err = check_diff(&tab_ref->re, &tab->re, fft_size * 2, 0.5);
+        } else {
+            for (i = 0; i < fft_size; i++) {
+                tab2[i]    = tab1[i].re;
+                tab1[i].im = 0;
+            }
+            r.rdft_calc(&r, tab2);
+            fft_ref(tab_ref, tab1, fft_nbits);
+            tab_ref[0].im = tab_ref[fft_size_2].re;
+            err = check_diff(&tab_ref->re, tab2, fft_size, 1.0);
+        }
+        break;
+    }
+#endif /* CONFIG_RDFT */
+#if CONFIG_DCT
+    case TRANSFORM_DCT:
+        memcpy(tab, tab1, fft_size * sizeof(FFTComplex));
+        d.dct_calc(&d, &tab->re);
+        if (do_inverse)
+            idct_ref(&tab_ref->re, &tab1->re, fft_nbits);
+        else
+            dct_ref(&tab_ref->re, &tab1->re, fft_nbits);
+        err = check_diff(&tab_ref->re, &tab->re, fft_size, 1.0);
+        break;
+#endif /* CONFIG_DCT */
+#endif /* FFT_FLOAT */
+    }
+
+    /* do a speed test */
+
+    if (do_speed) {
+        int64_t time_start, duration;
+        int nb_its;
+
+        av_log(NULL, AV_LOG_INFO, "Speed test...\n");
+        /* we measure during about 1 seconds */
+        nb_its = 1;
+        for (;;) {
+            time_start = av_gettime_relative();
+            for (it = 0; it < nb_its; it++) {
+                switch (transform) {
+                case TRANSFORM_MDCT:
+                    if (do_inverse)
+                        m.imdct_calc(&m, &tab->re, &tab1->re);
+                    else
+                        m.mdct_calc(&m, &tab->re, &tab1->re);
+                    break;
+                case TRANSFORM_FFT:
+                    memcpy(tab, tab1, fft_size * sizeof(FFTComplex));
+                    s.fft_calc(&s, tab);
+                    break;
+#if FFT_FLOAT
+                case TRANSFORM_RDFT:
+                    memcpy(tab2, tab1, fft_size * sizeof(FFTSample));
+                    r.rdft_calc(&r, tab2);
+                    break;
+                case TRANSFORM_DCT:
+                    memcpy(tab2, tab1, fft_size * sizeof(FFTSample));
+                    d.dct_calc(&d, tab2);
+                    break;
+#endif /* FFT_FLOAT */
+                }
+            }
+            duration = av_gettime_relative() - time_start;
+            if (duration >= 1000000)
+                break;
+            nb_its *= 2;
+        }
+        av_log(NULL, AV_LOG_INFO,
+               "time: %0.1f us/transform [total time=%0.2f s its=%d]\n",
+               (double) duration / nb_its,
+               (double) duration / 1000000.0,
+               nb_its);
+    }
+
+    switch (transform) {
+#if CONFIG_MDCT
+    case TRANSFORM_MDCT:
+        ff_mdct_end(&m);
+        break;
+#endif /* CONFIG_MDCT */
+    case TRANSFORM_FFT:
+        ff_fft_end(&s);
+        break;
+#if FFT_FLOAT
+#    if CONFIG_RDFT
+    case TRANSFORM_RDFT:
+        ff_rdft_end(&r);
+        break;
+#    endif /* CONFIG_RDFT */
+#    if CONFIG_DCT
+    case TRANSFORM_DCT:
+        ff_dct_end(&d);
+        break;
+#    endif /* CONFIG_DCT */
+#endif /* FFT_FLOAT */
+    }
+
+cleanup:
+    av_free(tab);
+    av_free(tab1);
+    av_free(tab2);
+    av_free(tab_ref);
+    av_free(exptab);
+
+    if (err)
+        printf("Error: %d.\n", err);
+
+    return !!err;
+}
diff --git a/libavcodec/tests/golomb.c b/libavcodec/tests/golomb.c
new file mode 100644 (file)
index 0000000..965367b
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of FFmpeg.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * 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 <stdint.h>
+#include <stdio.h>
+
+#include "libavutil/mem.h"
+
+#include "libavcodec/get_bits.h"
+#include "libavcodec/golomb.h"
+#include "libavcodec/put_bits.h"
+
+#define COUNT 8191
+#define SIZE (COUNT * 4)
+
+int main(void)
+{
+    int i, ret = 0;
+    uint8_t *temp;
+    PutBitContext pb;
+    GetBitContext gb;
+
+    temp = av_malloc(SIZE);
+    if (!temp)
+        return 2;
+
+    init_put_bits(&pb, temp, SIZE);
+    for (i = 0; i < COUNT; i++)
+        set_ue_golomb(&pb, i);
+    flush_put_bits(&pb);
+
+    init_get_bits(&gb, temp, 8 * SIZE);
+    for (i = 0; i < COUNT; i++) {
+        int j, s = show_bits(&gb, 25);
+
+        j = get_ue_golomb(&gb);
+        if (j != i) {
+            fprintf(stderr, "get_ue_golomb: expected %d, got %d. bits: %7x\n",
+                    i, j, s);
+            ret = 1;
+        }
+    }
+
+#define EXTEND(i) ((i) << 3 | (i) & 7)
+    init_put_bits(&pb, temp, SIZE);
+    for (i = 0; i < COUNT; i++)
+        set_ue_golomb(&pb, EXTEND(i));
+    flush_put_bits(&pb);
+
+    init_get_bits(&gb, temp, 8 * SIZE);
+    for (i = 0; i < COUNT; i++) {
+        int j, s = show_bits_long(&gb, 32);
+
+        j = get_ue_golomb_long(&gb);
+        if (j != EXTEND(i)) {
+            fprintf(stderr, "get_ue_golomb_long: expected %d, got %d. "
+                    "bits: %8x\n", EXTEND(i), j, s);
+            ret = 1;
+        }
+    }
+
+    init_put_bits(&pb, temp, SIZE);
+    for (i = 0; i < COUNT; i++)
+        set_se_golomb(&pb, i - COUNT / 2);
+    flush_put_bits(&pb);
+
+    init_get_bits(&gb, temp, 8 * SIZE);
+    for (i = 0; i < COUNT; i++) {
+        int j, s = show_bits(&gb, 25);
+
+        j = get_se_golomb(&gb);
+        if (j != i - COUNT / 2) {
+            fprintf(stderr, "get_se_golomb: expected %d, got %d. bits: %7x\n",
+                    i - COUNT / 2, j, s);
+            ret = 1;
+        }
+    }
+
+    av_free(temp);
+
+    return ret;
+}
diff --git a/libavcodec/tests/iirfilter.c b/libavcodec/tests/iirfilter.c
new file mode 100644 (file)
index 0000000..60cc6fc
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * 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 <math.h>
+#include <stdint.h>
+#include <stdio.h>
+
+#include "libavutil/libm.h"
+
+#include "libavcodec/iirfilter.h"
+
+#define FILT_ORDER 4
+#define SIZE 1024
+
+int main(void)
+{
+    struct FFIIRFilterCoeffs *fcoeffs = NULL;
+    struct FFIIRFilterState  *fstate  = NULL;
+    float cutoff_coeff = 0.4;
+    int16_t x[SIZE], y[SIZE];
+    int i;
+
+    fcoeffs = ff_iir_filter_init_coeffs(NULL, FF_FILTER_TYPE_BUTTERWORTH,
+                                        FF_FILTER_MODE_LOWPASS, FILT_ORDER,
+                                        cutoff_coeff, 0.0, 0.0);
+    fstate  = ff_iir_filter_init_state(FILT_ORDER);
+
+    for (i = 0; i < SIZE; i++)
+        x[i] = lrint(0.75 * INT16_MAX * sin(0.5 * M_PI * i * i / SIZE));
+
+    ff_iir_filter(fcoeffs, fstate, SIZE, x, 1, y, 1);
+
+    for (i = 0; i < SIZE; i++)
+        printf("%6d %6d\n", x[i], y[i]);
+
+    ff_iir_filter_free_coeffsp(&fcoeffs);
+    ff_iir_filter_free_statep(&fstate);
+    return 0;
+}
diff --git a/libavcodec/tests/imgconvert.c b/libavcodec/tests/imgconvert.c
new file mode 100644 (file)
index 0000000..c598d46
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Misc image conversion routines
+ * Copyright (c) 2001, 2002, 2003 Fabrice Bellard
+ *
+ * This file is part of FFmpeg.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * 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 "libavcodec/imgconvert.c"
+
+#if FF_API_AVPICTURE
+FF_DISABLE_DEPRECATION_WARNINGS
+int main(void){
+    int i;
+    int err=0;
+    int skip = 0;
+
+    for (i=0; i<AV_PIX_FMT_NB*2; i++) {
+        const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(i);
+        if(!desc || !desc->name) {
+            skip ++;
+            continue;
+        }
+        if (skip) {
+            av_log(NULL, AV_LOG_INFO, "%3d unused pixel format values\n", skip);
+            skip = 0;
+        }
+        av_log(NULL, AV_LOG_INFO, "pix fmt %s yuv_plan:%d avg_bpp:%d\n", desc->name, is_yuv_planar(desc), av_get_padded_bits_per_pixel(desc));
+        if ((!(desc->flags & AV_PIX_FMT_FLAG_ALPHA)) != (desc->nb_components != 2 && desc->nb_components != 4)) {
+            av_log(NULL, AV_LOG_ERROR, "Alpha flag mismatch\n");
+            err = 1;
+        }
+    }
+    return err;
+}
+FF_ENABLE_DEPRECATION_WARNINGS
+#endif /* FF_API_AVPICTURE */
diff --git a/libavcodec/tests/jpeg2000dwt.c b/libavcodec/tests/jpeg2000dwt.c
new file mode 100644 (file)
index 0000000..80b33be
--- /dev/null
@@ -0,0 +1,141 @@
+/*
+ * Discrete wavelet transform
+ * Copyright (c) 2007 Kamil Nowosad
+ * Copyright (c) 2013 Nicolas Bertrand <nicoinattendu@gmail.com>
+ *
+ * This file is part of FFmpeg.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * 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 "libavcodec/jpeg2000dwt.c"
+
+#include "libavutil/lfg.h"
+
+#define MAX_W 256
+
+static int test_dwt(int *array, int *ref, int border[2][2], int decomp_levels, int type, int max_diff) {
+    int ret, j;
+    DWTContext s1={{{0}}}, *s= &s1;
+    int64_t err2 = 0;
+
+    ret = ff_jpeg2000_dwt_init(s,  border, decomp_levels, type);
+    if (ret < 0) {
+        fprintf(stderr, "ff_jpeg2000_dwt_init failed\n");
+        return 1;
+    }
+    ret = ff_dwt_encode(s, array);
+    if (ret < 0) {
+        fprintf(stderr, "ff_dwt_encode failed\n");
+        return 1;
+    }
+    ret = ff_dwt_decode(s, array);
+    if (ret < 0) {
+        fprintf(stderr, "ff_dwt_encode failed\n");
+        return 1;
+    }
+    for (j = 0; j<MAX_W * MAX_W; j++) {
+        if (FFABS(array[j] - ref[j]) > max_diff) {
+            fprintf(stderr, "missmatch at %d (%d != %d) decomp:%d border %d %d %d %d\n",
+                    j, array[j], ref[j],decomp_levels, border[0][0], border[0][1], border[1][0], border[1][1]);
+            return 2;
+        }
+        err2 += (array[j] - ref[j]) * (array[j] - ref[j]);
+        array[j] = ref[j];
+    }
+    ff_dwt_destroy(s);
+
+    printf("%s, decomp:%2d border %3d %3d %3d %3d milli-err2:%9"PRId64"\n",
+           type == FF_DWT53 ? "5/3i" : "9/7i",
+           decomp_levels, border[0][0], border[0][1], border[1][0], border[1][1],
+           1000*err2 / ((border[0][1] - border[0][0])*(border[1][1] - border[1][0])));
+
+    return 0;
+}
+
+static int test_dwtf(float *array, float *ref, int border[2][2], int decomp_levels, float max_diff) {
+    int ret, j;
+    DWTContext s1={{{0}}}, *s= &s1;
+    double err2 = 0;
+
+    ret = ff_jpeg2000_dwt_init(s,  border, decomp_levels, FF_DWT97);
+    if (ret < 0) {
+        fprintf(stderr, "ff_jpeg2000_dwt_init failed\n");
+        return 1;
+    }
+    ret = ff_dwt_encode(s, array);
+    if (ret < 0) {
+        fprintf(stderr, "ff_dwt_encode failed\n");
+        return 1;
+    }
+    ret = ff_dwt_decode(s, array);
+    if (ret < 0) {
+        fprintf(stderr, "ff_dwt_encode failed\n");
+        return 1;
+    }
+    for (j = 0; j<MAX_W * MAX_W; j++) {
+        if (FFABS(array[j] - ref[j]) > max_diff) {
+            fprintf(stderr, "missmatch at %d (%f != %f) decomp:%d border %d %d %d %d\n",
+                    j, array[j], ref[j],decomp_levels, border[0][0], border[0][1], border[1][0], border[1][1]);
+            return 2;
+        }
+        err2 += (array[j] - ref[j]) * (array[j] - ref[j]);
+        array[j] = ref[j];
+    }
+    ff_dwt_destroy(s);
+
+    printf("9/7f, decomp:%2d border %3d %3d %3d %3d err2:%20.3f\n",
+           decomp_levels, border[0][0], border[0][1], border[1][0], border[1][1],
+           err2 / ((border[0][1] - border[0][0])*(border[1][1] - border[1][0])));
+
+    return 0;
+}
+
+static int array[MAX_W * MAX_W];
+static int ref  [MAX_W * MAX_W];
+static float arrayf[MAX_W * MAX_W];
+static float reff  [MAX_W * MAX_W];
+
+int main(void) {
+    AVLFG prng;
+    int i,j;
+    int border[2][2];
+    int ret, decomp_levels;
+
+    av_lfg_init(&prng, 1);
+
+    for (i = 0; i<MAX_W * MAX_W; i++)
+        arrayf[i] = reff[i] = array[i] = ref[i] =  av_lfg_get(&prng) % 2048;
+
+    for (i = 0; i < 100; i++) {
+        for (j=0; j<4; j++)
+            border[j>>1][j&1] = av_lfg_get(&prng) % MAX_W;
+        if (border[0][0] >= border[0][1] || border[1][0] >= border[1][1])
+            continue;
+        decomp_levels = av_lfg_get(&prng) % FF_DWT_MAX_DECLVLS;
+
+        ret = test_dwt(array, ref, border, decomp_levels, FF_DWT53, 0);
+        if (ret)
+            return ret;
+        ret = test_dwt(array, ref, border, decomp_levels, FF_DWT97_INT, FFMIN(7+5*decomp_levels, 15+3*decomp_levels));
+        if (ret)
+            return ret;
+        ret = test_dwtf(arrayf, reff, border, decomp_levels, 0.05);
+        if (ret)
+            return ret;
+    }
+
+    return 0;
+}
diff --git a/libavcodec/tests/mathops.c b/libavcodec/tests/mathops.c
new file mode 100644 (file)
index 0000000..33a059c
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * 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 "libavcodec/mathops.h"
+
+#include <stdlib.h>
+
+int main(void)
+{
+    unsigned u;
+
+    for(u=0; u<65536; u++) {
+        unsigned s = u*u;
+        unsigned root = ff_sqrt(s);
+        unsigned root_m1 = ff_sqrt(s-1);
+        if (s && root != u) {
+            fprintf(stderr, "ff_sqrt failed at %u with %u\n", s, root);
+            return 1;
+        }
+        if (u && root_m1 != u - 1) {
+            fprintf(stderr, "ff_sqrt failed at %u with %u\n", s, root);
+            return 1;
+        }
+    }
+    return 0;
+}
diff --git a/libavcodec/tests/motion.c b/libavcodec/tests/motion.c
new file mode 100644 (file)
index 0000000..d89f940
--- /dev/null
@@ -0,0 +1,152 @@
+/*
+ * (c) 2001 Fabrice Bellard
+ *
+ * This file is part of FFmpeg.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * 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
+ */
+
+/**
+ * @file
+ * motion test.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "config.h"
+#include "libavcodec/me_cmp.h"
+#include "libavutil/internal.h"
+#include "libavutil/lfg.h"
+#include "libavutil/mem.h"
+#include "libavutil/time.h"
+
+#undef printf
+
+#define WIDTH 64
+#define HEIGHT 64
+
+static uint8_t img1[WIDTH * HEIGHT];
+static uint8_t img2[WIDTH * HEIGHT];
+
+static void fill_random(uint8_t *tab, int size)
+{
+    int i;
+    AVLFG prng;
+
+    av_lfg_init(&prng, 1);
+    for(i=0;i<size;i++) {
+        tab[i] = av_lfg_get(&prng) % 256;
+    }
+}
+
+static void help(void)
+{
+    printf("motion-test [-h]\n"
+           "test motion implementations\n");
+}
+
+#define NB_ITS 500
+
+int dummy;
+
+static void test_motion(const char *name,
+                 me_cmp_func test_func, me_cmp_func ref_func)
+{
+    int x, y, d1, d2, it;
+    uint8_t *ptr;
+    int64_t ti;
+    printf("testing '%s'\n", name);
+
+    /* test correctness */
+    for(it=0;it<20;it++) {
+
+        fill_random(img1, WIDTH * HEIGHT);
+        fill_random(img2, WIDTH * HEIGHT);
+
+        for(y=0;y<HEIGHT-17;y++) {
+            for(x=0;x<WIDTH-17;x++) {
+                ptr = img2 + y * WIDTH + x;
+                d1 = test_func(NULL, img1, ptr, WIDTH, 8);
+                d2 = ref_func(NULL, img1, ptr, WIDTH, 8);
+                if (d1 != d2) {
+                    printf("error: mmx=%d c=%d\n", d1, d2);
+                }
+            }
+        }
+    }
+    emms_c();
+
+    /* speed test */
+    ti = av_gettime_relative();
+    d1 = 0;
+    for(it=0;it<NB_ITS;it++) {
+        for(y=0;y<HEIGHT-17;y++) {
+            for(x=0;x<WIDTH-17;x++) {
+                ptr = img2 + y * WIDTH + x;
+                d1 += test_func(NULL, img1, ptr, WIDTH, 8);
+            }
+        }
+    }
+    emms_c();
+    dummy = d1; /* avoid optimization */
+    ti = av_gettime_relative() - ti;
+
+    printf("  %0.0f kop/s\n",
+           (double)NB_ITS * (WIDTH - 16) * (HEIGHT - 16) /
+           (double)(ti / 1000.0));
+}
+
+
+int main(int argc, char **argv)
+{
+    AVCodecContext *ctx;
+    int c;
+    MECmpContext cctx, mmxctx;
+    int flags[2] = { AV_CPU_FLAG_MMX, AV_CPU_FLAG_MMXEXT };
+    int flags_size = HAVE_MMXEXT ? 2 : 1;
+
+    if (argc > 1) {
+        help();
+        return 1;
+    }
+
+    printf("ffmpeg motion test\n");
+
+    ctx = avcodec_alloc_context3(NULL);
+    ctx->flags |= AV_CODEC_FLAG_BITEXACT;
+    av_force_cpu_flags(0);
+    memset(&cctx, 0, sizeof(cctx));
+    ff_me_cmp_init(&cctx, ctx);
+    for (c = 0; c < flags_size; c++) {
+        int x;
+        av_force_cpu_flags(flags[c]);
+        memset(&mmxctx, 0, sizeof(mmxctx));
+        ff_me_cmp_init(&mmxctx, ctx);
+
+        for (x = 0; x < 2; x++) {
+            printf("%s for %dx%d pixels\n", c ? "mmx2" : "mmx",
+                   x ? 8 : 16, x ? 8 : 16);
+            test_motion("mmx",     mmxctx.pix_abs[x][0], cctx.pix_abs[x][0]);
+            test_motion("mmx_x2",  mmxctx.pix_abs[x][1], cctx.pix_abs[x][1]);
+            test_motion("mmx_y2",  mmxctx.pix_abs[x][2], cctx.pix_abs[x][2]);
+            test_motion("mmx_xy2", mmxctx.pix_abs[x][3], cctx.pix_abs[x][3]);
+        }
+    }
+    av_free(ctx);
+
+    return 0;
+}
diff --git a/libavcodec/tests/options.c b/libavcodec/tests/options.c
new file mode 100644 (file)
index 0000000..7f0ee1d
--- /dev/null
@@ -0,0 +1,194 @@
+/*
+ * Copyright (c) 2001 Fabrice Bellard
+ * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of FFmpeg.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * 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 "libavcodec/options.c"
+
+static int dummy_init(AVCodecContext *ctx)
+{
+    //TODO: this code should set every possible pointer that could be set by codec and is not an option;
+    ctx->extradata_size = 8;
+    ctx->extradata = av_malloc(ctx->extradata_size);
+    return 0;
+}
+
+static int dummy_close(AVCodecContext *ctx)
+{
+    av_freep(&ctx->extradata);
+    ctx->extradata_size = 0;
+    return 0;
+}
+
+static int dummy_encode(AVCodecContext *ctx, AVPacket *pkt, const AVFrame *frame, int *got_packet)
+{
+    return AVERROR(ENOSYS);
+}
+
+typedef struct Dummy12Context {
+    AVClass  *av_class;
+    int      num;
+    char*    str;
+} Dummy12Context;
+
+typedef struct Dummy3Context {
+    void     *fake_av_class;
+    int      num;
+    char*    str;
+} Dummy3Context;
+
+#define OFFSET(x) offsetof(Dummy12Context, x)
+#define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
+static const AVOption dummy_options[] = {
+    { "str", "set str", OFFSET(str), AV_OPT_TYPE_STRING, { .str = "i'm src default value" }, 0, 0, VE},
+    { "num", "set num", OFFSET(num), AV_OPT_TYPE_INT,    { .i64 = 1500100900 },    0, INT_MAX, VE},
+    { NULL },
+};
+
+static const AVClass dummy_v1_class = {
+    .class_name = "dummy_v1_class",
+    .item_name  = av_default_item_name,
+    .option     = dummy_options,
+    .version    = LIBAVUTIL_VERSION_INT,
+};
+
+static const AVClass dummy_v2_class = {
+    .class_name = "dummy_v2_class",
+    .item_name  = av_default_item_name,
+    .option     = dummy_options,
+    .version    = LIBAVUTIL_VERSION_INT,
+};
+
+/* codec with options */
+static AVCodec dummy_v1_encoder = {
+    .name             = "dummy_v1_codec",
+    .type             = AVMEDIA_TYPE_VIDEO,
+    .id               = AV_CODEC_ID_NONE - 1,
+    .encode2          = dummy_encode,
+    .init             = dummy_init,
+    .close            = dummy_close,
+    .priv_class       = &dummy_v1_class,
+    .priv_data_size   = sizeof(Dummy12Context),
+};
+
+/* codec with options, different class */
+static AVCodec dummy_v2_encoder = {
+    .name             = "dummy_v2_codec",
+    .type             = AVMEDIA_TYPE_VIDEO,
+    .id               = AV_CODEC_ID_NONE - 2,
+    .encode2          = dummy_encode,
+    .init             = dummy_init,
+    .close            = dummy_close,
+    .priv_class       = &dummy_v2_class,
+    .priv_data_size   = sizeof(Dummy12Context),
+};
+
+/* codec with priv data, but no class */
+static AVCodec dummy_v3_encoder = {
+    .name             = "dummy_v3_codec",
+    .type             = AVMEDIA_TYPE_VIDEO,
+    .id               = AV_CODEC_ID_NONE - 3,
+    .encode2          = dummy_encode,
+    .init             = dummy_init,
+    .close            = dummy_close,
+    .priv_data_size   = sizeof(Dummy3Context),
+};
+
+/* codec without priv data */
+static AVCodec dummy_v4_encoder = {
+    .name             = "dummy_v4_codec",
+    .type             = AVMEDIA_TYPE_VIDEO,
+    .id               = AV_CODEC_ID_NONE - 4,
+    .encode2          = dummy_encode,
+    .init             = dummy_init,
+    .close            = dummy_close,
+};
+
+static void test_copy_print_codec(const AVCodecContext *ctx)
+{
+    printf("%-14s: %dx%d prv: %s",
+           ctx->codec ? ctx->codec->name : "NULL",
+           ctx->width, ctx->height,
+           ctx->priv_data ? "set" : "null");
+    if (ctx->codec && ctx->codec->priv_class && ctx->codec->priv_data_size) {
+        int64_t i64;
+        char *str = NULL;
+        av_opt_get_int(ctx->priv_data, "num", 0, &i64);
+        av_opt_get(ctx->priv_data, "str", 0, (uint8_t**)&str);
+        printf(" opts: %"PRId64" %s", i64, str);
+        av_free(str);
+    }
+    printf("\n");
+}
+
+static void test_copy(const AVCodec *c1, const AVCodec *c2)
+{
+    AVCodecContext *ctx1, *ctx2;
+    printf("%s -> %s\nclosed:\n", c1 ? c1->name : "NULL", c2 ? c2->name : "NULL");
+    ctx1 = avcodec_alloc_context3(c1);
+    ctx2 = avcodec_alloc_context3(c2);
+    ctx1->width = ctx1->height = 128;
+    if (ctx2->codec && ctx2->codec->priv_class && ctx2->codec->priv_data_size) {
+        av_opt_set(ctx2->priv_data, "num", "667", 0);
+        av_opt_set(ctx2->priv_data, "str", "i'm dest value before copy", 0);
+    }
+    avcodec_copy_context(ctx2, ctx1);
+    test_copy_print_codec(ctx1);
+    test_copy_print_codec(ctx2);
+    if (ctx1->codec) {
+        int ret;
+        printf("opened:\n");
+        ret = avcodec_open2(ctx1, ctx1->codec, NULL);
+        if (ret < 0) {
+            fprintf(stderr, "avcodec_open2 failed\n");
+            exit(1);
+        }
+        if (ctx2->codec && ctx2->codec->priv_class && ctx2->codec->priv_data_size) {
+            av_opt_set(ctx2->priv_data, "num", "667", 0);
+            av_opt_set(ctx2->priv_data, "str", "i'm dest value before copy", 0);
+        }
+        avcodec_copy_context(ctx2, ctx1);
+        test_copy_print_codec(ctx1);
+        test_copy_print_codec(ctx2);
+        avcodec_close(ctx1);
+    }
+    avcodec_free_context(&ctx1);
+    avcodec_free_context(&ctx2);
+}
+
+int main(void)
+{
+    AVCodec *dummy_codec[] = {
+        &dummy_v1_encoder,
+        &dummy_v2_encoder,
+        &dummy_v3_encoder,
+        &dummy_v4_encoder,
+        NULL,
+    };
+    int i, j;
+
+    for (i = 0; dummy_codec[i]; i++)
+        avcodec_register(dummy_codec[i]);
+
+    printf("testing avcodec_copy_context()\n");
+    for (i = 0; i < FF_ARRAY_ELEMS(dummy_codec); i++)
+        for (j = 0; j < FF_ARRAY_ELEMS(dummy_codec); j++)
+            test_copy(dummy_codec[i], dummy_codec[j]);
+    return 0;
+}
diff --git a/libavcodec/tests/ppc/dct.c b/libavcodec/tests/ppc/dct.c
new file mode 100644 (file)
index 0000000..d95db52
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * 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 "config.h"
+
+#include "libavcodec/ppc/fdct.h"
+
+static const struct algo fdct_tab_arch[] = {
+#if HAVE_ALTIVEC
+    { "altivecfdct", ff_fdct_altivec, FF_IDCT_PERM_NONE, AV_CPU_FLAG_ALTIVEC },
+#endif
+    { 0 }
+};
+
+static const struct algo idct_tab_arch[] = {
+    { 0 }
+};
diff --git a/libavcodec/tests/rangecoder.c b/libavcodec/tests/rangecoder.c
new file mode 100644 (file)
index 0000000..2da5c0c
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * 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 <stdint.h>
+#include <string.h>
+
+#include "libavutil/lfg.h"
+#include "libavutil/log.h"
+
+#include "libavcodec/rangecoder.h"
+
+#define SIZE 10240
+
+int main(void)
+{
+    RangeCoder c;
+    uint8_t b[9 * SIZE];
+    uint8_t r[9 * SIZE];
+    int i;
+    uint8_t state[10];
+    AVLFG prng;
+
+    av_lfg_init(&prng, 1);
+
+    ff_init_range_encoder(&c, b, SIZE);
+    ff_build_rac_states(&c, (1LL << 32) / 20, 128 + 64 + 32 + 16);
+
+    memset(state, 128, sizeof(state));
+
+    for (i = 0; i < SIZE; i++)
+        r[i] = av_lfg_get(&prng) % 7;
+
+    for (i = 0; i < SIZE; i++)
+        put_rac(&c, state, r[i] & 1);
+
+    ff_rac_terminate(&c);
+
+    ff_init_range_decoder(&c, b, SIZE);
+
+    memset(state, 128, sizeof(state));
+
+    for (i = 0; i < SIZE; i++)
+        if ((r[i] & 1) != get_rac(&c, state)) {
+            av_log(NULL, AV_LOG_ERROR, "rac failure at %d\n", i);
+            return 1;
+        }
+
+    return 0;
+}
diff --git a/libavcodec/tests/snowenc.c b/libavcodec/tests/snowenc.c
new file mode 100644 (file)
index 0000000..d5f94e8
--- /dev/null
@@ -0,0 +1,147 @@
+/*
+ * Copyright (C) 2004 Michael Niedermayer <michaelni@gmx.at>
+ *
+ * This file is part of FFmpeg.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * 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 "libavcodec/snowenc.c"
+
+#undef malloc
+#undef free
+#undef printf
+
+#include "libavutil/lfg.h"
+#include "libavutil/mathematics.h"
+
+int main(void){
+#define width  256
+#define height 256
+    int buffer[2][width*height];
+    SnowContext s;
+    int i;
+    AVLFG prng;
+    s.spatial_decomposition_count=6;
+    s.spatial_decomposition_type=1;
+
+    s.temp_dwt_buffer  = av_mallocz_array(width, sizeof(DWTELEM));
+    s.temp_idwt_buffer = av_mallocz_array(width, sizeof(IDWTELEM));
+
+    if (!s.temp_dwt_buffer || !s.temp_idwt_buffer) {
+        fprintf(stderr, "Failed to allocate memory\n");
+        return 1;
+    }
+
+    av_lfg_init(&prng, 1);
+
+    printf("testing 5/3 DWT\n");
+    for(i=0; i<width*height; i++)
+        buffer[0][i] = buffer[1][i] = av_lfg_get(&prng) % 54321 - 12345;
+
+    ff_spatial_dwt(buffer[0], s.temp_dwt_buffer, width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count);
+    ff_spatial_idwt((IDWTELEM*)buffer[0], s.temp_idwt_buffer, width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count);
+
+    for(i=0; i<width*height; i++)
+        if(buffer[0][i]!= buffer[1][i]) printf("fsck: %6d %12d %7d\n",i, buffer[0][i], buffer[1][i]);
+
+    printf("testing 9/7 DWT\n");
+    s.spatial_decomposition_type=0;
+    for(i=0; i<width*height; i++)
+        buffer[0][i] = buffer[1][i] = av_lfg_get(&prng) % 54321 - 12345;
+
+    ff_spatial_dwt(buffer[0], s.temp_dwt_buffer, width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count);
+    ff_spatial_idwt((IDWTELEM*)buffer[0], s.temp_idwt_buffer, width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count);
+
+    for(i=0; i<width*height; i++)
+        if(FFABS(buffer[0][i] - buffer[1][i])>20) printf("fsck: %6d %12d %7d\n",i, buffer[0][i], buffer[1][i]);
+
+    {
+    int level, orientation, x, y;
+    int64_t errors[8][4];
+    int64_t g=0;
+
+        memset(errors, 0, sizeof(errors));
+        s.spatial_decomposition_count=3;
+        s.spatial_decomposition_type=0;
+        for(level=0; level<s.spatial_decomposition_count; level++){
+            for(orientation=level ? 1 : 0; orientation<4; orientation++){
+                int w= width  >> (s.spatial_decomposition_count-level);
+                int h= height >> (s.spatial_decomposition_count-level);
+                int stride= width  << (s.spatial_decomposition_count-level);
+                DWTELEM *buf= buffer[0];
+                int64_t error=0;
+
+                if(orientation&1) buf+=w;
+                if(orientation>1) buf+=stride>>1;
+
+                memset(buffer[0], 0, sizeof(int)*width*height);
+                buf[w/2 + h/2*stride]= 256*256;
+                ff_spatial_idwt((IDWTELEM*)buffer[0], s.temp_idwt_buffer, width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count);
+                for(y=0; y<height; y++){
+                    for(x=0; x<width; x++){
+                        int64_t d= buffer[0][x + y*width];
+                        error += d*d;
+                        if(FFABS(width/2-x)<9 && FFABS(height/2-y)<9 && level==2) printf("%8"PRId64" ", d);
+                    }
+                    if(FFABS(height/2-y)<9 && level==2) printf("\n");
+                }
+                error= (int)(sqrt(error)+0.5);
+                errors[level][orientation]= error;
+                if(g) g=av_gcd(g, error);
+                else g= error;
+            }
+        }
+        printf("static int const visual_weight[][4]={\n");
+        for(level=0; level<s.spatial_decomposition_count; level++){
+            printf("  {");
+            for(orientation=0; orientation<4; orientation++){
+                printf("%8"PRId64",", errors[level][orientation]/g);
+            }
+            printf("},\n");
+        }
+        printf("};\n");
+        {
+            int level=2;
+            int w= width  >> (s.spatial_decomposition_count-level);
+            //int h= height >> (s.spatial_decomposition_count-level);
+            int stride= width  << (s.spatial_decomposition_count-level);
+            DWTELEM *buf= buffer[0];
+            int64_t error=0;
+
+            buf+=w;
+            buf+=stride>>1;
+
+            memset(buffer[0], 0, sizeof(int)*width*height);
+            for(y=0; y<height; y++){
+                for(x=0; x<width; x++){
+                    int tab[4]={0,2,3,1};
+                    buffer[0][x+width*y]= 256*256*tab[(x&1) + 2*(y&1)];
+                }
+            }
+            ff_spatial_dwt(buffer[0], s.temp_dwt_buffer, width, height, width, s.spatial_decomposition_type, s.spatial_decomposition_count);
+            for(y=0; y<height; y++){
+                for(x=0; x<width; x++){
+                    int64_t d= buffer[0][x + y*width];
+                    error += d*d;
+                    if(FFABS(width/2-x)<9 && FFABS(height/2-y)<9) printf("%8"PRId64" ", d);
+                }
+                if(FFABS(height/2-y)<9) printf("\n");
+            }
+        }
+
+    }
+    return 0;
+}
diff --git a/libavcodec/tests/utils.c b/libavcodec/tests/utils.c
new file mode 100644 (file)
index 0000000..e2891fb
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * 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 "libavcodec/avcodec.h"
+
+int main(void){
+    AVCodec *codec = NULL;
+    int ret = 0;
+    avcodec_register_all();
+
+    while (codec = av_codec_next(codec)) {
+        if (av_codec_is_encoder(codec)) {
+            if (codec->type == AVMEDIA_TYPE_AUDIO) {
+                if (!codec->sample_fmts) {
+                    av_log(NULL, AV_LOG_FATAL, "Encoder %s is missing the sample_fmts field\n", codec->name);
+                    ret = 1;
+                }
+            }
+        }
+    }
+    return ret;
+}
diff --git a/libavcodec/tests/x86/dct.c b/libavcodec/tests/x86/dct.c
new file mode 100644 (file)
index 0000000..b6cdfb3
--- /dev/null
@@ -0,0 +1,133 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * 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 "config.h"
+
+#include "libavcodec/x86/fdct.h"
+#include "libavcodec/x86/xvididct.h"
+#include "libavcodec/x86/simple_idct.h"
+
+#if (CONFIG_PRORES_DECODER || CONFIG_PRORES_LGPL_DECODER) && ARCH_X86_64 && HAVE_YASM
+void ff_prores_idct_put_10_sse2(uint16_t *dst, int linesize,
+                                int16_t *block, int16_t *qmat);
+
+#define PR_WRAP(INSN) \
+static void ff_prores_idct_put_10_##INSN##_wrap(int16_t *dst){ \
+    LOCAL_ALIGNED(16, int16_t, qmat, [64]); \
+    LOCAL_ALIGNED(16, int16_t, tmp, [64]); \
+    int i; \
+ \
+    for(i=0; i<64; i++){ \
+        qmat[i]=4; \
+        tmp[i]= dst[i]; \
+    } \
+    ff_prores_idct_put_10_##INSN (dst, 16, tmp, qmat); \
+ \
+    for(i=0; i<64; i++) { \
+         dst[i] -= 512; \
+    } \
+}
+
+PR_WRAP(sse2)
+
+# if HAVE_AVX_EXTERNAL
+void ff_prores_idct_put_10_avx(uint16_t *dst, int linesize,
+                               int16_t *block, int16_t *qmat);
+PR_WRAP(avx)
+# endif
+
+#endif
+
+static const struct algo fdct_tab_arch[] = {
+#if HAVE_MMX_INLINE
+    { "MMX",    ff_fdct_mmx,    FF_IDCT_PERM_NONE, AV_CPU_FLAG_MMX },
+#endif
+#if HAVE_MMXEXT_INLINE
+    { "MMXEXT", ff_fdct_mmxext, FF_IDCT_PERM_NONE, AV_CPU_FLAG_MMXEXT },
+#endif
+#if HAVE_SSE2_INLINE
+    { "SSE2",   ff_fdct_sse2,   FF_IDCT_PERM_NONE, AV_CPU_FLAG_SSE2 },
+#endif
+    { 0 }
+};
+
+static const struct algo idct_tab_arch[] = {
+#if HAVE_MMX_INLINE
+    { "SIMPLE-MMX",  ff_simple_idct_mmx,  FF_IDCT_PERM_SIMPLE, AV_CPU_FLAG_MMX },
+#endif
+#if CONFIG_MPEG4_DECODER && HAVE_YASM
+#if ARCH_X86_32
+    { "XVID-MMX",    ff_xvid_idct_mmx,    FF_IDCT_PERM_NONE,   AV_CPU_FLAG_MMX,    1 },
+    { "XVID-MMXEXT", ff_xvid_idct_mmxext, FF_IDCT_PERM_NONE,   AV_CPU_FLAG_MMXEXT, 1 },
+#endif
+#if HAVE_SSE2_EXTERNAL
+    { "XVID-SSE2",   ff_xvid_idct_sse2,   FF_IDCT_PERM_SSE2,   AV_CPU_FLAG_SSE2,   1 },
+#endif
+#endif /* CONFIG_MPEG4_DECODER && HAVE_YASM */
+#if (CONFIG_PRORES_DECODER || CONFIG_PRORES_LGPL_DECODER) && ARCH_X86_64 && HAVE_YASM
+    { "PR-SSE2",     ff_prores_idct_put_10_sse2_wrap, FF_IDCT_PERM_TRANSPOSE, AV_CPU_FLAG_SSE2, 1 },
+# if HAVE_AVX_EXTERNAL
+    { "PR-AVX",      ff_prores_idct_put_10_avx_wrap, FF_IDCT_PERM_TRANSPOSE, AV_CPU_FLAG_AVX, 1 },
+# endif
+#endif
+#if HAVE_YASM
+#if ARCH_X86_64
+#if HAVE_SSE2_EXTERNAL
+    { "SIMPLE10-SSE2",  ff_simple_idct10_sse2, FF_IDCT_PERM_TRANSPOSE, AV_CPU_FLAG_SSE2},
+    { "SIMPLE12-SSE2",  ff_simple_idct12_sse2, FF_IDCT_PERM_TRANSPOSE, AV_CPU_FLAG_SSE2, 1 },
+#endif
+#if HAVE_AVX_EXTERNAL
+    { "SIMPLE10-AVX",   ff_simple_idct10_avx,  FF_IDCT_PERM_TRANSPOSE, AV_CPU_FLAG_AVX},
+    { "SIMPLE12-AVX",   ff_simple_idct12_avx,  FF_IDCT_PERM_TRANSPOSE, AV_CPU_FLAG_AVX,  1 },
+#endif
+#endif
+#endif
+    { 0 }
+};
+
+static const uint8_t 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 int permute_x86(int16_t dst[64], const int16_t src[64],
+                       enum idct_permutation_type perm_type)
+{
+    int i;
+
+    switch (perm_type) {
+    case FF_IDCT_PERM_SIMPLE:
+        for (i = 0; i < 64; i++)
+            dst[idct_simple_mmx_perm[i]] = src[i];
+        return 1;
+    case FF_IDCT_PERM_SSE2:
+        for (i = 0; i < 64; i++)
+            dst[(i & 0x38) | idct_sse2_row_perm[i & 7]] = src[i];
+        return 1;
+    }
+
+    return 0;
+}
diff --git a/libavcodec/utils-test.c b/libavcodec/utils-test.c
deleted file mode 100644 (file)
index 7b3b718..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * This file is part of FFmpeg.
- *
- * 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
- * Lesser General Public License for more details.
- *
- * 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 "avcodec.h"
-
-int main(void){
-    AVCodec *codec = NULL;
-    int ret = 0;
-    avcodec_register_all();
-
-    while (codec = av_codec_next(codec)) {
-        if (av_codec_is_encoder(codec)) {
-            if (codec->type == AVMEDIA_TYPE_AUDIO) {
-                if (!codec->sample_fmts) {
-                    av_log(NULL, AV_LOG_FATAL, "Encoder %s is missing the sample_fmts field\n", codec->name);
-                    ret = 1;
-                }
-            }
-        }
-    }
-    return ret;
-}
diff --git a/libavcodec/x86/dct-test.c b/libavcodec/x86/dct-test.c
deleted file mode 100644 (file)
index 28ede16..0000000
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * This file is part of FFmpeg.
- *
- * 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
- * Lesser General Public License for more details.
- *
- * 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 "config.h"
-
-#include "fdct.h"
-#include "xvididct.h"
-#include "simple_idct.h"
-
-#if (CONFIG_PRORES_DECODER || CONFIG_PRORES_LGPL_DECODER) && ARCH_X86_64 && HAVE_YASM
-void ff_prores_idct_put_10_sse2(uint16_t *dst, int linesize,
-                                int16_t *block, int16_t *qmat);
-
-#define PR_WRAP(INSN) \
-static void ff_prores_idct_put_10_##INSN##_wrap(int16_t *dst){ \
-    LOCAL_ALIGNED(16, int16_t, qmat, [64]); \
-    LOCAL_ALIGNED(16, int16_t, tmp, [64]); \
-    int i; \
- \
-    for(i=0; i<64; i++){ \
-        qmat[i]=4; \
-        tmp[i]= dst[i]; \
-    } \
-    ff_prores_idct_put_10_##INSN (dst, 16, tmp, qmat); \
- \
-    for(i=0; i<64; i++) { \
-         dst[i] -= 512; \
-    } \
-}
-
-PR_WRAP(sse2)
-
-# if HAVE_AVX_EXTERNAL
-void ff_prores_idct_put_10_avx(uint16_t *dst, int linesize,
-                               int16_t *block, int16_t *qmat);
-PR_WRAP(avx)
-# endif
-
-#endif
-
-static const struct algo fdct_tab_arch[] = {
-#if HAVE_MMX_INLINE
-    { "MMX",    ff_fdct_mmx,    FF_IDCT_PERM_NONE, AV_CPU_FLAG_MMX },
-#endif
-#if HAVE_MMXEXT_INLINE
-    { "MMXEXT", ff_fdct_mmxext, FF_IDCT_PERM_NONE, AV_CPU_FLAG_MMXEXT },
-#endif
-#if HAVE_SSE2_INLINE
-    { "SSE2",   ff_fdct_sse2,   FF_IDCT_PERM_NONE, AV_CPU_FLAG_SSE2 },
-#endif
-    { 0 }
-};
-
-static const struct algo idct_tab_arch[] = {
-#if HAVE_MMX_INLINE
-    { "SIMPLE-MMX",  ff_simple_idct_mmx,  FF_IDCT_PERM_SIMPLE, AV_CPU_FLAG_MMX },
-#endif
-#if CONFIG_MPEG4_DECODER && HAVE_YASM
-#if ARCH_X86_32
-    { "XVID-MMX",    ff_xvid_idct_mmx,    FF_IDCT_PERM_NONE,   AV_CPU_FLAG_MMX,    1 },
-    { "XVID-MMXEXT", ff_xvid_idct_mmxext, FF_IDCT_PERM_NONE,   AV_CPU_FLAG_MMXEXT, 1 },
-#endif
-#if HAVE_SSE2_EXTERNAL
-    { "XVID-SSE2",   ff_xvid_idct_sse2,   FF_IDCT_PERM_SSE2,   AV_CPU_FLAG_SSE2,   1 },
-#endif
-#endif /* CONFIG_MPEG4_DECODER && HAVE_YASM */
-#if (CONFIG_PRORES_DECODER || CONFIG_PRORES_LGPL_DECODER) && ARCH_X86_64 && HAVE_YASM
-    { "PR-SSE2",     ff_prores_idct_put_10_sse2_wrap, FF_IDCT_PERM_TRANSPOSE, AV_CPU_FLAG_SSE2, 1 },
-# if HAVE_AVX_EXTERNAL
-    { "PR-AVX",      ff_prores_idct_put_10_avx_wrap, FF_IDCT_PERM_TRANSPOSE, AV_CPU_FLAG_AVX, 1 },
-# endif
-#endif
-#if HAVE_YASM
-#if ARCH_X86_64
-#if HAVE_SSE2_EXTERNAL
-    { "SIMPLE10-SSE2",  ff_simple_idct10_sse2, FF_IDCT_PERM_TRANSPOSE, AV_CPU_FLAG_SSE2},
-    { "SIMPLE12-SSE2",  ff_simple_idct12_sse2, FF_IDCT_PERM_TRANSPOSE, AV_CPU_FLAG_SSE2, 1 },
-#endif
-#if HAVE_AVX_EXTERNAL
-    { "SIMPLE10-AVX",   ff_simple_idct10_avx,  FF_IDCT_PERM_TRANSPOSE, AV_CPU_FLAG_AVX},
-    { "SIMPLE12-AVX",   ff_simple_idct12_avx,  FF_IDCT_PERM_TRANSPOSE, AV_CPU_FLAG_AVX,  1 },
-#endif
-#endif
-#endif
-    { 0 }
-};
-
-static const uint8_t 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 int permute_x86(int16_t dst[64], const int16_t src[64],
-                       enum idct_permutation_type perm_type)
-{
-    int i;
-
-    switch (perm_type) {
-    case FF_IDCT_PERM_SIMPLE:
-        for (i = 0; i < 64; i++)
-            dst[idct_simple_mmx_perm[i]] = src[i];
-        return 1;
-    case FF_IDCT_PERM_SSE2:
-        for (i = 0; i < 64; i++)
-            dst[(i & 0x38) | idct_sse2_row_perm[i & 7]] = src[i];
-        return 1;
-    }
-
-    return 0;
-}
diff --git a/libavdevice/tests/.gitignore b/libavdevice/tests/.gitignore
new file mode 100644 (file)
index 0000000..b4a2281
--- /dev/null
@@ -0,0 +1 @@
+/timefilter
diff --git a/libavdevice/tests/timefilter.c b/libavdevice/tests/timefilter.c
new file mode 100644 (file)
index 0000000..7c1ed0a
--- /dev/null
@@ -0,0 +1,98 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * 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 <stdio.h>
+
+#include "libavutil/common.h"
+#include "libavutil/lfg.h"
+
+#include "libavdevice/timefilter.h"
+
+#define LFG_MAX ((1LL << 32) - 1)
+
+int main(void)
+{
+    AVLFG prng;
+    double n0, n1;
+#define SAMPLES 1000
+    double ideal[SAMPLES];
+    double samples[SAMPLES];
+    double samplet[SAMPLES];
+    for (n0 = 0; n0 < 40; n0 = 2 * n0 + 1) {
+        for (n1 = 0; n1 < 10; n1 = 2 * n1 + 1) {
+            double best_error = 1000000000;
+            double bestpar0   = n0 ? 1 : 100000;
+            double bestpar1   = 1;
+            int better, i;
+
+            av_lfg_init(&prng, 123);
+            for (i = 0; i < SAMPLES; i++) {
+                samplet[i] = 10 + i + (av_lfg_get(&prng) < LFG_MAX/2 ? 0 : 0.999);
+                ideal[i]   = samplet[i] + n1 * i / (1000);
+                samples[i] = ideal[i] + n0 * (av_lfg_get(&prng) - LFG_MAX / 2) / (LFG_MAX * 10LL);
+                if(i && samples[i]<samples[i-1])
+                    samples[i]=samples[i-1]+0.001;
+            }
+
+            do {
+                double par0, par1;
+                better = 0;
+                for (par0 = bestpar0 * 0.8; par0 <= bestpar0 * 1.21; par0 += bestpar0 * 0.05) {
+                    for (par1 = bestpar1 * 0.8; par1 <= bestpar1 * 1.21; par1 += bestpar1 * 0.05) {
+                        double error   = 0;
+                        TimeFilter *tf = ff_timefilter_new(1, par0, par1);
+                        if (!tf) {
+                            printf("Could not allocate memory for timefilter.\n");
+                            exit(1);
+                        }
+                        for (i = 0; i < SAMPLES; i++) {
+                            double filtered;
+                            filtered = ff_timefilter_update(tf, samples[i], i ? (samplet[i] - samplet[i-1]) : 1);
+                            if(filtered < 0 || filtered > 1000000000)
+                                printf("filter is unstable\n");
+                            error   += (filtered - ideal[i]) * (filtered - ideal[i]);
+                        }
+                        ff_timefilter_destroy(tf);
+                        if (error < best_error) {
+                            best_error = error;
+                            bestpar0   = par0;
+                            bestpar1   = par1;
+                            better     = 1;
+                        }
+                    }
+                }
+            } while (better);
+#if 0
+            double lastfil = 9;
+            TimeFilter *tf = ff_timefilter_new(1, bestpar0, bestpar1);
+            for (i = 0; i < SAMPLES; i++) {
+                double filtered;
+                filtered = ff_timefilter_update(tf, samples[i], 1);
+                printf("%f %f %f %f\n", i - samples[i] + 10, filtered - samples[i],
+                       samples[FFMAX(i, 1)] - samples[FFMAX(i - 1, 0)], filtered - lastfil);
+                lastfil = filtered;
+            }
+            ff_timefilter_destroy(tf);
+#else
+            printf(" [%12f %11f %9f]", bestpar0, bestpar1, best_error);
+#endif
+        }
+        printf("\n");
+    }
+    return 0;
+}
diff --git a/libavdevice/timefilter-test.c b/libavdevice/timefilter-test.c
deleted file mode 100644 (file)
index 39432d5..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * This file is part of FFmpeg.
- *
- * 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
- * Lesser General Public License for more details.
- *
- * 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 <stdio.h>
-
-#include "libavutil/common.h"
-#include "libavutil/lfg.h"
-
-#include "timefilter.h"
-
-#define LFG_MAX ((1LL << 32) - 1)
-
-int main(void)
-{
-    AVLFG prng;
-    double n0, n1;
-#define SAMPLES 1000
-    double ideal[SAMPLES];
-    double samples[SAMPLES];
-    double samplet[SAMPLES];
-    for (n0 = 0; n0 < 40; n0 = 2 * n0 + 1) {
-        for (n1 = 0; n1 < 10; n1 = 2 * n1 + 1) {
-            double best_error = 1000000000;
-            double bestpar0   = n0 ? 1 : 100000;
-            double bestpar1   = 1;
-            int better, i;
-
-            av_lfg_init(&prng, 123);
-            for (i = 0; i < SAMPLES; i++) {
-                samplet[i] = 10 + i + (av_lfg_get(&prng) < LFG_MAX/2 ? 0 : 0.999);
-                ideal[i]   = samplet[i] + n1 * i / (1000);
-                samples[i] = ideal[i] + n0 * (av_lfg_get(&prng) - LFG_MAX / 2) / (LFG_MAX * 10LL);
-                if(i && samples[i]<samples[i-1])
-                    samples[i]=samples[i-1]+0.001;
-            }
-
-            do {
-                double par0, par1;
-                better = 0;
-                for (par0 = bestpar0 * 0.8; par0 <= bestpar0 * 1.21; par0 += bestpar0 * 0.05) {
-                    for (par1 = bestpar1 * 0.8; par1 <= bestpar1 * 1.21; par1 += bestpar1 * 0.05) {
-                        double error   = 0;
-                        TimeFilter *tf = ff_timefilter_new(1, par0, par1);
-                        if (!tf) {
-                            printf("Could not allocate memory for timefilter.\n");
-                            exit(1);
-                        }
-                        for (i = 0; i < SAMPLES; i++) {
-                            double filtered;
-                            filtered = ff_timefilter_update(tf, samples[i], i ? (samplet[i] - samplet[i-1]) : 1);
-                            if(filtered < 0 || filtered > 1000000000)
-                                printf("filter is unstable\n");
-                            error   += (filtered - ideal[i]) * (filtered - ideal[i]);
-                        }
-                        ff_timefilter_destroy(tf);
-                        if (error < best_error) {
-                            best_error = error;
-                            bestpar0   = par0;
-                            bestpar1   = par1;
-                            better     = 1;
-                        }
-                    }
-                }
-            } while (better);
-#if 0
-            double lastfil = 9;
-            TimeFilter *tf = ff_timefilter_new(1, bestpar0, bestpar1);
-            for (i = 0; i < SAMPLES; i++) {
-                double filtered;
-                filtered = ff_timefilter_update(tf, samples[i], 1);
-                printf("%f %f %f %f\n", i - samples[i] + 10, filtered - samples[i],
-                       samples[FFMAX(i, 1)] - samples[FFMAX(i - 1, 0)], filtered - lastfil);
-                lastfil = filtered;
-            }
-            ff_timefilter_destroy(tf);
-#else
-            printf(" [%12f %11f %9f]", bestpar0, bestpar1, best_error);
-#endif
-        }
-        printf("\n");
-    }
-    return 0;
-}
diff --git a/libavfilter/drawutils-test.c b/libavfilter/drawutils-test.c
deleted file mode 100644 (file)
index 7b9f89f..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * This file is part of FFmpeg.
- *
- * 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
- * Lesser General Public License for more details.
- *
- * 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 <stdio.h>
-
-#include "libavutil/pixdesc.h"
-#include "drawutils.h"
-
-int main(void)
-{
-    enum AVPixelFormat f;
-    const AVPixFmtDescriptor *desc;
-    FFDrawContext draw;
-    FFDrawColor color;
-    int r, i;
-
-    for (f = 0; av_pix_fmt_desc_get(f); f++) {
-        desc = av_pix_fmt_desc_get(f);
-        if (!desc->name)
-            continue;
-        printf("Testing %s...%*s", desc->name,
-               (int)(16 - strlen(desc->name)), "");
-        r = ff_draw_init(&draw, f, 0);
-        if (r < 0) {
-            char buf[128];
-            av_strerror(r, buf, sizeof(buf));
-            printf("no: %s\n", buf);
-            continue;
-        }
-        ff_draw_color(&draw, &color, (uint8_t[]) { 1, 0, 0, 1 });
-        for (i = 0; i < sizeof(color); i++)
-            if (((uint8_t *)&color)[i] != 128)
-                break;
-        if (i == sizeof(color)) {
-            printf("fallback color\n");
-            continue;
-        }
-        printf("ok\n");
-    }
-    return 0;
-}
diff --git a/libavfilter/filtfmts-test.c b/libavfilter/filtfmts-test.c
deleted file mode 100644 (file)
index 46a2d94..0000000
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright (c) 2009 Stefano Sabatini
- *
- * This file is part of FFmpeg.
- *
- * 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
- * Lesser General Public License for more details.
- *
- * 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 <stdio.h>
-
-#include "libavutil/channel_layout.h"
-#include "libavutil/mem.h"
-#include "libavutil/pixdesc.h"
-#include "libavutil/samplefmt.h"
-
-#include "libavfilter/avfilter.h"
-#include "libavfilter/formats.h"
-
-static void print_formats(AVFilterContext *filter_ctx)
-{
-    int i, j;
-
-#define PRINT_FMTS(inout, outin, INOUT)                                 \
-    for (i = 0; i < filter_ctx->nb_##inout##puts; i++) {                     \
-        if (filter_ctx->inout##puts[i]->type == AVMEDIA_TYPE_VIDEO) {   \
-            AVFilterFormats *fmts =                                     \
-                filter_ctx->inout##puts[i]->outin##_formats;            \
-            for (j = 0; j < fmts->nb_formats; j++)                    \
-                if(av_get_pix_fmt_name(fmts->formats[j]))               \
-                printf(#INOUT "PUT[%d] %s: fmt:%s\n",                   \
-                       i, avfilter_pad_get_name(filter_ctx->inout##put_pads, i),      \
-                       av_get_pix_fmt_name(fmts->formats[j]));          \
-        } else if (filter_ctx->inout##puts[i]->type == AVMEDIA_TYPE_AUDIO) { \
-            AVFilterFormats *fmts;                                      \
-            AVFilterChannelLayouts *layouts;                            \
-                                                                        \
-            fmts = filter_ctx->inout##puts[i]->outin##_formats;         \
-            for (j = 0; j < fmts->nb_formats; j++)                    \
-                printf(#INOUT "PUT[%d] %s: fmt:%s\n",                   \
-                       i, avfilter_pad_get_name(filter_ctx->inout##put_pads, i),      \
-                       av_get_sample_fmt_name(fmts->formats[j]));       \
-                                                                        \
-            layouts = filter_ctx->inout##puts[i]->outin##_channel_layouts; \
-            for (j = 0; j < layouts->nb_channel_layouts; j++) {                  \
-                char buf[256];                                          \
-                av_get_channel_layout_string(buf, sizeof(buf), -1,      \
-                                             layouts->channel_layouts[j]);         \
-                printf(#INOUT "PUT[%d] %s: chlayout:%s\n",              \
-                       i, avfilter_pad_get_name(filter_ctx->inout##put_pads, i), buf); \
-            }                                                           \
-        }                                                               \
-    }                                                                   \
-
-    PRINT_FMTS(in,  out, IN);
-    PRINT_FMTS(out, in,  OUT);
-}
-
-int main(int argc, char **argv)
-{
-    AVFilter *filter;
-    AVFilterContext *filter_ctx;
-    AVFilterGraph *graph_ctx;
-    const char *filter_name;
-    const char *filter_args = NULL;
-    int i;
-    int ret = 0;
-
-    av_log_set_level(AV_LOG_DEBUG);
-
-    if (argc < 2) {
-        fprintf(stderr, "Missing filter name as argument\n");
-        return 1;
-    }
-
-    filter_name = argv[1];
-    if (argc > 2)
-        filter_args = argv[2];
-
-    /* allocate graph */
-    graph_ctx = avfilter_graph_alloc();
-    if (!graph_ctx)
-        return 1;
-
-    avfilter_register_all();
-
-    /* get a corresponding filter and open it */
-    if (!(filter = avfilter_get_by_name(filter_name))) {
-        fprintf(stderr, "Unrecognized filter with name '%s'\n", filter_name);
-        return 1;
-    }
-
-    /* open filter and add it to the graph */
-    if (!(filter_ctx = avfilter_graph_alloc_filter(graph_ctx, filter, filter_name))) {
-        fprintf(stderr, "Impossible to open filter with name '%s'\n",
-                filter_name);
-        return 1;
-    }
-    if (avfilter_init_str(filter_ctx, filter_args) < 0) {
-        fprintf(stderr, "Impossible to init filter '%s' with arguments '%s'\n",
-                filter_name, filter_args);
-        return 1;
-    }
-
-    /* create a link for each of the input pads */
-    for (i = 0; i < filter_ctx->nb_inputs; i++) {
-        AVFilterLink *link = av_mallocz(sizeof(AVFilterLink));
-        if (!link) {
-            fprintf(stderr, "Unable to allocate memory for filter input link\n");
-            ret = 1;
-            goto fail;
-        }
-        link->type = avfilter_pad_get_type(filter_ctx->input_pads, i);
-        filter_ctx->inputs[i] = link;
-    }
-    for (i = 0; i < filter_ctx->nb_outputs; i++) {
-        AVFilterLink *link = av_mallocz(sizeof(AVFilterLink));
-        if (!link) {
-            fprintf(stderr, "Unable to allocate memory for filter output link\n");
-            ret = 1;
-            goto fail;
-        }
-        link->type = avfilter_pad_get_type(filter_ctx->output_pads, i);
-        filter_ctx->outputs[i] = link;
-    }
-
-    if (filter->query_formats)
-        filter->query_formats(filter_ctx);
-    else
-        ff_default_query_formats(filter_ctx);
-
-    print_formats(filter_ctx);
-
-fail:
-    avfilter_free(filter_ctx);
-    avfilter_graph_free(&graph_ctx);
-    fflush(stdout);
-    return ret;
-}
diff --git a/libavfilter/formats-test.c b/libavfilter/formats-test.c
deleted file mode 100644 (file)
index a891638..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (c) 2007 Bobby Bingham
- *
- * This file is part of FFmpeg.
- *
- * 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
- * Lesser General Public License for more details.
- *
- * 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 "formats.c"
-
-#undef printf
-
-int main(void)
-{
-    const int64_t *cl;
-    char buf[512];
-    int i;
-    const char *teststrings[] ={
-        "blah",
-        "1",
-        "2",
-        "-1",
-        "60",
-        "65",
-        "1c",
-        "2c",
-        "-1c",
-        "60c",
-        "65c",
-        "5.1",
-        "stereo",
-        "1+1+1+1",
-        "1c+1c+1c+1c",
-        "2c+1c",
-        "0x3",
-    };
-
-    for (cl = avfilter_all_channel_layouts; *cl != -1; cl++) {
-        av_get_channel_layout_string(buf, sizeof(buf), -1, *cl);
-        printf("%s\n", buf);
-    }
-
-    for ( i = 0; i<FF_ARRAY_ELEMS(teststrings); i++) {
-        int64_t layout = -1;
-        int count = -1;
-        int ret;
-        ret = ff_parse_channel_layout(&layout, &count, teststrings[i], NULL);
-
-        printf ("%d = ff_parse_channel_layout(%016"PRIX64", %2d, %s);\n", ret ? -1 : 0, layout, count, teststrings[i]);
-    }
-
-    return 0;
-}
diff --git a/libavfilter/tests/.gitignore b/libavfilter/tests/.gitignore
new file mode 100644 (file)
index 0000000..b605afa
--- /dev/null
@@ -0,0 +1,3 @@
+/drawutils
+/filtfmts
+/formats
diff --git a/libavfilter/tests/drawutils.c b/libavfilter/tests/drawutils.c
new file mode 100644 (file)
index 0000000..7fe53dd
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * 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 <stdio.h>
+
+#include "libavutil/pixdesc.h"
+#include "libavfilter/drawutils.h"
+
+int main(void)
+{
+    enum AVPixelFormat f;
+    const AVPixFmtDescriptor *desc;
+    FFDrawContext draw;
+    FFDrawColor color;
+    int r, i;
+
+    for (f = 0; av_pix_fmt_desc_get(f); f++) {
+        desc = av_pix_fmt_desc_get(f);
+        if (!desc->name)
+            continue;
+        printf("Testing %s...%*s", desc->name,
+               (int)(16 - strlen(desc->name)), "");
+        r = ff_draw_init(&draw, f, 0);
+        if (r < 0) {
+            char buf[128];
+            av_strerror(r, buf, sizeof(buf));
+            printf("no: %s\n", buf);
+            continue;
+        }
+        ff_draw_color(&draw, &color, (uint8_t[]) { 1, 0, 0, 1 });
+        for (i = 0; i < sizeof(color); i++)
+            if (((uint8_t *)&color)[i] != 128)
+                break;
+        if (i == sizeof(color)) {
+            printf("fallback color\n");
+            continue;
+        }
+        printf("ok\n");
+    }
+    return 0;
+}
diff --git a/libavfilter/tests/filtfmts.c b/libavfilter/tests/filtfmts.c
new file mode 100644 (file)
index 0000000..46a2d94
--- /dev/null
@@ -0,0 +1,150 @@
+/*
+ * Copyright (c) 2009 Stefano Sabatini
+ *
+ * This file is part of FFmpeg.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * 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 <stdio.h>
+
+#include "libavutil/channel_layout.h"
+#include "libavutil/mem.h"
+#include "libavutil/pixdesc.h"
+#include "libavutil/samplefmt.h"
+
+#include "libavfilter/avfilter.h"
+#include "libavfilter/formats.h"
+
+static void print_formats(AVFilterContext *filter_ctx)
+{
+    int i, j;
+
+#define PRINT_FMTS(inout, outin, INOUT)                                 \
+    for (i = 0; i < filter_ctx->nb_##inout##puts; i++) {                     \
+        if (filter_ctx->inout##puts[i]->type == AVMEDIA_TYPE_VIDEO) {   \
+            AVFilterFormats *fmts =                                     \
+                filter_ctx->inout##puts[i]->outin##_formats;            \
+            for (j = 0; j < fmts->nb_formats; j++)                    \
+                if(av_get_pix_fmt_name(fmts->formats[j]))               \
+                printf(#INOUT "PUT[%d] %s: fmt:%s\n",                   \
+                       i, avfilter_pad_get_name(filter_ctx->inout##put_pads, i),      \
+                       av_get_pix_fmt_name(fmts->formats[j]));          \
+        } else if (filter_ctx->inout##puts[i]->type == AVMEDIA_TYPE_AUDIO) { \
+            AVFilterFormats *fmts;                                      \
+            AVFilterChannelLayouts *layouts;                            \
+                                                                        \
+            fmts = filter_ctx->inout##puts[i]->outin##_formats;         \
+            for (j = 0; j < fmts->nb_formats; j++)                    \
+                printf(#INOUT "PUT[%d] %s: fmt:%s\n",                   \
+                       i, avfilter_pad_get_name(filter_ctx->inout##put_pads, i),      \
+                       av_get_sample_fmt_name(fmts->formats[j]));       \
+                                                                        \
+            layouts = filter_ctx->inout##puts[i]->outin##_channel_layouts; \
+            for (j = 0; j < layouts->nb_channel_layouts; j++) {                  \
+                char buf[256];                                          \
+                av_get_channel_layout_string(buf, sizeof(buf), -1,      \
+                                             layouts->channel_layouts[j]);         \
+                printf(#INOUT "PUT[%d] %s: chlayout:%s\n",              \
+                       i, avfilter_pad_get_name(filter_ctx->inout##put_pads, i), buf); \
+            }                                                           \
+        }                                                               \
+    }                                                                   \
+
+    PRINT_FMTS(in,  out, IN);
+    PRINT_FMTS(out, in,  OUT);
+}
+
+int main(int argc, char **argv)
+{
+    AVFilter *filter;
+    AVFilterContext *filter_ctx;
+    AVFilterGraph *graph_ctx;
+    const char *filter_name;
+    const char *filter_args = NULL;
+    int i;
+    int ret = 0;
+
+    av_log_set_level(AV_LOG_DEBUG);
+
+    if (argc < 2) {
+        fprintf(stderr, "Missing filter name as argument\n");
+        return 1;
+    }
+
+    filter_name = argv[1];
+    if (argc > 2)
+        filter_args = argv[2];
+
+    /* allocate graph */
+    graph_ctx = avfilter_graph_alloc();
+    if (!graph_ctx)
+        return 1;
+
+    avfilter_register_all();
+
+    /* get a corresponding filter and open it */
+    if (!(filter = avfilter_get_by_name(filter_name))) {
+        fprintf(stderr, "Unrecognized filter with name '%s'\n", filter_name);
+        return 1;
+    }
+
+    /* open filter and add it to the graph */
+    if (!(filter_ctx = avfilter_graph_alloc_filter(graph_ctx, filter, filter_name))) {
+        fprintf(stderr, "Impossible to open filter with name '%s'\n",
+                filter_name);
+        return 1;
+    }
+    if (avfilter_init_str(filter_ctx, filter_args) < 0) {
+        fprintf(stderr, "Impossible to init filter '%s' with arguments '%s'\n",
+                filter_name, filter_args);
+        return 1;
+    }
+
+    /* create a link for each of the input pads */
+    for (i = 0; i < filter_ctx->nb_inputs; i++) {
+        AVFilterLink *link = av_mallocz(sizeof(AVFilterLink));
+        if (!link) {
+            fprintf(stderr, "Unable to allocate memory for filter input link\n");
+            ret = 1;
+            goto fail;
+        }
+        link->type = avfilter_pad_get_type(filter_ctx->input_pads, i);
+        filter_ctx->inputs[i] = link;
+    }
+    for (i = 0; i < filter_ctx->nb_outputs; i++) {
+        AVFilterLink *link = av_mallocz(sizeof(AVFilterLink));
+        if (!link) {
+            fprintf(stderr, "Unable to allocate memory for filter output link\n");
+            ret = 1;
+            goto fail;
+        }
+        link->type = avfilter_pad_get_type(filter_ctx->output_pads, i);
+        filter_ctx->outputs[i] = link;
+    }
+
+    if (filter->query_formats)
+        filter->query_formats(filter_ctx);
+    else
+        ff_default_query_formats(filter_ctx);
+
+    print_formats(filter_ctx);
+
+fail:
+    avfilter_free(filter_ctx);
+    avfilter_graph_free(&graph_ctx);
+    fflush(stdout);
+    return ret;
+}
diff --git a/libavfilter/tests/formats.c b/libavfilter/tests/formats.c
new file mode 100644 (file)
index 0000000..0e8ba4a
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2007 Bobby Bingham
+ *
+ * This file is part of FFmpeg.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * 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 "libavfilter/formats.c"
+
+#undef printf
+
+int main(void)
+{
+    const int64_t *cl;
+    char buf[512];
+    int i;
+    const char *teststrings[] ={
+        "blah",
+        "1",
+        "2",
+        "-1",
+        "60",
+        "65",
+        "1c",
+        "2c",
+        "-1c",
+        "60c",
+        "65c",
+        "5.1",
+        "stereo",
+        "1+1+1+1",
+        "1c+1c+1c+1c",
+        "2c+1c",
+        "0x3",
+    };
+
+    for (cl = avfilter_all_channel_layouts; *cl != -1; cl++) {
+        av_get_channel_layout_string(buf, sizeof(buf), -1, *cl);
+        printf("%s\n", buf);
+    }
+
+    for ( i = 0; i<FF_ARRAY_ELEMS(teststrings); i++) {
+        int64_t layout = -1;
+        int count = -1;
+        int ret;
+        ret = ff_parse_channel_layout(&layout, &count, teststrings[i], NULL);
+
+        printf ("%d = ff_parse_channel_layout(%016"PRIX64", %2d, %s);\n", ret ? -1 : 0, layout, count, teststrings[i]);
+    }
+
+    return 0;
+}
index ddac2d3..6252de8 100644 (file)
@@ -1559,23 +1559,20 @@ static int mkv_write_header(AVFormatContext *s)
     if ((tag = av_dict_get(s->metadata, "title", NULL, 0)))
         put_ebml_string(pb, MATROSKA_ID_TITLE, tag->value);
     if (!(s->flags & AVFMT_FLAG_BITEXACT)) {
+        uint32_t segment_uid[4];
+        AVLFG lfg;
+
+        av_lfg_init(&lfg, av_get_random_seed());
+
+        for (i = 0; i < 4; i++)
+            segment_uid[i] = av_lfg_get(&lfg);
+
         put_ebml_string(pb, MATROSKA_ID_MUXINGAPP, LIBAVFORMAT_IDENT);
         if ((tag = av_dict_get(s->metadata, "encoding_tool", NULL, 0)))
             put_ebml_string(pb, MATROSKA_ID_WRITINGAPP, tag->value);
         else
             put_ebml_string(pb, MATROSKA_ID_WRITINGAPP, LIBAVFORMAT_IDENT);
-
-        if (mkv->mode != MODE_WEBM) {
-            uint32_t segment_uid[4];
-            AVLFG lfg;
-
-            av_lfg_init(&lfg, av_get_random_seed());
-
-            for (i = 0; i < 4; i++)
-                segment_uid[i] = av_lfg_get(&lfg);
-
-            put_ebml_binary(pb, MATROSKA_ID_SEGMENTUID, segment_uid, 16);
-        }
+        put_ebml_binary(pb, MATROSKA_ID_SEGMENTUID, segment_uid, 16);
     } else {
         const char *ident = "Lavf";
         put_ebml_string(pb, MATROSKA_ID_MUXINGAPP , ident);
diff --git a/libavformat/movenc-test.c b/libavformat/movenc-test.c
deleted file mode 100644 (file)
index 6c7f0f6..0000000
+++ /dev/null
@@ -1,676 +0,0 @@
-/*
- * Copyright (c) 2015 Martin Storsjo
- *
- * This file is part of FFmpeg.
- *
- * 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
- * Lesser General Public License for more details.
- *
- * 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 "config.h"
-
-#include "libavutil/intreadwrite.h"
-#include "libavutil/mathematics.h"
-#include "libavutil/md5.h"
-
-#include "avformat.h"
-
-#if HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-
-#if !HAVE_GETOPT
-#include "compat/getopt.c"
-#endif
-
-#define HASH_SIZE 16
-
-static const uint8_t h264_extradata[] = {
-    0x01, 0x4d, 0x40, 0x1e, 0xff, 0xe1, 0x00, 0x02, 0x67, 0x4d, 0x01, 0x00, 0x02, 0x68, 0xef
-};
-static const uint8_t aac_extradata[] = {
-    0x12, 0x10
-};
-
-
-static const char *format = "mp4";
-AVFormatContext *ctx;
-uint8_t iobuf[32768];
-AVDictionary *opts;
-
-int write_file;
-const char *cur_name;
-FILE* out;
-int out_size;
-struct AVMD5* md5;
-uint8_t hash[HASH_SIZE];
-
-AVStream *video_st, *audio_st;
-int64_t audio_dts, video_dts;
-
-int bframes;
-int64_t duration;
-int64_t audio_duration;
-int frames;
-int gop_size;
-int64_t next_p_pts;
-enum AVPictureType last_picture;
-int skip_write;
-int skip_write_audio;
-int clear_duration;
-
-int num_warnings;
-
-int check_faults;
-
-
-static void count_warnings(void *avcl, int level, const char *fmt, va_list vl)
-{
-    if (level == AV_LOG_WARNING)
-        num_warnings++;
-}
-
-static void init_count_warnings(void)
-{
-    av_log_set_callback(count_warnings);
-    num_warnings = 0;
-}
-
-static void reset_count_warnings(void)
-{
-    av_log_set_callback(av_log_default_callback);
-}
-
-static int io_write(void *opaque, uint8_t *buf, int size)
-{
-    out_size += size;
-    av_md5_update(md5, buf, size);
-    if (out)
-        fwrite(buf, 1, size, out);
-    return size;
-}
-
-static void init_out(const char *name)
-{
-    char buf[100];
-    cur_name = name;
-    snprintf(buf, sizeof(buf), "%s.%s", cur_name, format);
-
-    av_md5_init(md5);
-    if (write_file) {
-        out = fopen(buf, "wb");
-        if (!out)
-            perror(buf);
-    }
-    out_size = 0;
-}
-
-static void close_out(void)
-{
-    int i;
-    av_md5_final(md5, hash);
-    for (i = 0; i < HASH_SIZE; i++)
-        printf("%02x", hash[i]);
-    printf(" %d %s\n", out_size, cur_name);
-    if (out)
-        fclose(out);
-    out = NULL;
-}
-
-static void check_func(int value, int line, const char *msg, ...)
-{
-    if (!value) {
-        va_list ap;
-        va_start(ap, msg);
-        printf("%d: ", line);
-        vprintf(msg, ap);
-        printf("\n");
-        check_faults++;
-        va_end(ap);
-    }
-}
-#define check(value, ...) check_func(value, __LINE__, __VA_ARGS__)
-
-static void init_fps(int bf, int audio_preroll, int fps)
-{
-    AVStream *st;
-    ctx = avformat_alloc_context();
-    if (!ctx)
-        exit(1);
-    ctx->oformat = av_guess_format(format, NULL, NULL);
-    if (!ctx->oformat)
-        exit(1);
-    ctx->pb = avio_alloc_context(iobuf, sizeof(iobuf), AVIO_FLAG_WRITE, NULL, NULL, io_write, NULL);
-    if (!ctx->pb)
-        exit(1);
-    ctx->flags |= AVFMT_FLAG_BITEXACT;
-
-    st = avformat_new_stream(ctx, NULL);
-    if (!st)
-        exit(1);
-    st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
-    st->codecpar->codec_id = AV_CODEC_ID_H264;
-    st->codecpar->width = 640;
-    st->codecpar->height = 480;
-    st->time_base.num = 1;
-    st->time_base.den = 30;
-    st->codecpar->extradata_size = sizeof(h264_extradata);
-    st->codecpar->extradata = av_mallocz(st->codecpar->extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
-    if (!st->codecpar->extradata)
-        exit(1);
-    memcpy(st->codecpar->extradata, h264_extradata, sizeof(h264_extradata));
-    video_st = st;
-
-    st = avformat_new_stream(ctx, NULL);
-    if (!st)
-        exit(1);
-    st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO;
-    st->codecpar->codec_id = AV_CODEC_ID_AAC;
-    st->codecpar->sample_rate = 44100;
-    st->codecpar->channels = 2;
-    st->time_base.num = 1;
-    st->time_base.den = 44100;
-    st->codecpar->extradata_size = sizeof(aac_extradata);
-    st->codecpar->extradata = av_mallocz(st->codecpar->extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
-    if (!st->codecpar->extradata)
-        exit(1);
-    memcpy(st->codecpar->extradata, aac_extradata, sizeof(aac_extradata));
-    audio_st = st;
-
-    if (avformat_write_header(ctx, &opts) < 0)
-        exit(1);
-    av_dict_free(&opts);
-
-    frames = 0;
-    gop_size = 30;
-    duration = video_st->time_base.den / fps;
-    audio_duration = 1024LL * audio_st->time_base.den / audio_st->codecpar->sample_rate;
-    if (audio_preroll)
-        audio_preroll = 2048LL * audio_st->time_base.den / audio_st->codecpar->sample_rate;
-
-    bframes = bf;
-    video_dts = bframes ? -duration : 0;
-    audio_dts = -audio_preroll;
-}
-
-static void init(int bf, int audio_preroll)
-{
-    init_fps(bf, audio_preroll, 30);
-}
-
-static void mux_frames(int n)
-{
-    int end_frames = frames + n;
-    while (1) {
-        AVPacket pkt;
-        uint8_t pktdata[8] = { 0 };
-        av_init_packet(&pkt);
-
-        if (av_compare_ts(audio_dts, audio_st->time_base, video_dts, video_st->time_base) < 0) {
-            pkt.dts = pkt.pts = audio_dts;
-            pkt.stream_index = 1;
-            pkt.duration = audio_duration;
-            audio_dts += audio_duration;
-        } else {
-            if (frames == end_frames)
-                break;
-            pkt.dts = video_dts;
-            pkt.stream_index = 0;
-            pkt.duration = duration;
-            if ((frames % gop_size) == 0) {
-                pkt.flags |= AV_PKT_FLAG_KEY;
-                last_picture = AV_PICTURE_TYPE_I;
-                pkt.pts = pkt.dts + duration;
-                video_dts = pkt.pts;
-            } else {
-                if (last_picture == AV_PICTURE_TYPE_P) {
-                    last_picture = AV_PICTURE_TYPE_B;
-                    pkt.pts = pkt.dts;
-                    video_dts = next_p_pts;
-                } else {
-                    last_picture = AV_PICTURE_TYPE_P;
-                    if (((frames + 1) % gop_size) == 0) {
-                        pkt.pts = pkt.dts + duration;
-                        video_dts = pkt.pts;
-                    } else {
-                        next_p_pts = pkt.pts = pkt.dts + 2 * duration;
-                        video_dts += duration;
-                    }
-                }
-            }
-            if (!bframes)
-                pkt.pts = pkt.dts;
-            frames++;
-        }
-
-        if (clear_duration)
-            pkt.duration = 0;
-        AV_WB32(pktdata + 4, pkt.pts);
-        pkt.data = pktdata;
-        pkt.size = 8;
-        if (skip_write)
-            continue;
-        if (skip_write_audio && pkt.stream_index == 1)
-            continue;
-        av_write_frame(ctx, &pkt);
-    }
-}
-
-static void mux_gops(int n)
-{
-    mux_frames(gop_size * n);
-}
-
-static void skip_gops(int n)
-{
-    skip_write = 1;
-    mux_gops(n);
-    skip_write = 0;
-}
-
-static void signal_init_ts(void)
-{
-    AVPacket pkt;
-    av_init_packet(&pkt);
-    pkt.size = 0;
-    pkt.data = NULL;
-
-    pkt.stream_index = 0;
-    pkt.dts = video_dts;
-    pkt.pts = 0;
-    av_write_frame(ctx, &pkt);
-
-    pkt.stream_index = 1;
-    pkt.dts = pkt.pts = audio_dts;
-    av_write_frame(ctx, &pkt);
-}
-
-static void finish(void)
-{
-    av_write_trailer(ctx);
-    av_free(ctx->pb);
-    avformat_free_context(ctx);
-    ctx = NULL;
-}
-
-static void help(void)
-{
-    printf("movenc-test [-w]\n"
-           "-w          write output into files\n");
-}
-
-int main(int argc, char **argv)
-{
-    int c;
-    uint8_t header[HASH_SIZE];
-    uint8_t content[HASH_SIZE];
-    int empty_moov_pos;
-    int prev_pos;
-
-    for (;;) {
-        c = getopt(argc, argv, "wh");
-        if (c == -1)
-            break;
-        switch (c) {
-        case 'w':
-            write_file = 1;
-            break;
-        default:
-        case 'h':
-            help();
-            return 0;
-        }
-    }
-
-    av_register_all();
-
-    md5 = av_md5_alloc();
-    if (!md5)
-        return 1;
-
-    // Write a fragmented file with an initial moov that actually contains some
-    // samples. One moov+mdat with 1 second of data and one moof+mdat with 1
-    // second of data.
-    init_out("non-empty-moov");
-    av_dict_set(&opts, "movflags", "frag_keyframe", 0);
-    init(0, 0);
-    mux_gops(2);
-    finish();
-    close_out();
-
-    // Write a similar file, but with B-frames and audio preroll, handled
-    // via an edit list.
-    init_out("non-empty-moov-elst");
-    av_dict_set(&opts, "movflags", "frag_keyframe", 0);
-    av_dict_set(&opts, "use_editlist", "1", 0);
-    init(1, 1);
-    mux_gops(2);
-    finish();
-    close_out();
-
-    // Use B-frames but no audio-preroll, but without an edit list.
-    // Due to avoid_negative_ts == AVFMT_AVOID_NEG_TS_MAKE_ZERO, the dts
-    // of the first audio packet is > 0, but it is set to zero since edit
-    // lists aren't used, increasing the duration of the first packet instead.
-    init_out("non-empty-moov-no-elst");
-    av_dict_set(&opts, "movflags", "frag_keyframe", 0);
-    av_dict_set(&opts, "use_editlist", "0", 0);
-    init(1, 0);
-    mux_gops(2);
-    finish();
-    close_out();
-
-    format = "ismv";
-    // Write an ISMV, with B-frames and audio preroll.
-    init_out("ismv");
-    av_dict_set(&opts, "movflags", "frag_keyframe", 0);
-    init(1, 1);
-    mux_gops(2);
-    finish();
-    close_out();
-    format = "mp4";
-
-    // An initial moov that doesn't contain any samples, followed by two
-    // moof+mdat pairs.
-    init_out("empty-moov");
-    av_dict_set(&opts, "movflags", "frag_keyframe+empty_moov", 0);
-    av_dict_set(&opts, "use_editlist", "0", 0);
-    init(0, 0);
-    mux_gops(2);
-    finish();
-    close_out();
-    memcpy(content, hash, HASH_SIZE);
-
-    // Similar to the previous one, but with input that doesn't start at
-    // pts/dts 0. avoid_negative_ts behaves in the same way as
-    // in non-empty-moov-no-elst above.
-    init_out("empty-moov-no-elst");
-    av_dict_set(&opts, "movflags", "frag_keyframe+empty_moov", 0);
-    init(1, 0);
-    mux_gops(2);
-    finish();
-    close_out();
-
-    // Same as the previous one, but disable avoid_negative_ts (which
-    // would require using an edit list, but with empty_moov, one can't
-    // write a sensible edit list, when the start timestamps aren't known).
-    // This should trigger a warning - we check that the warning is produced.
-    init_count_warnings();
-    init_out("empty-moov-no-elst-no-adjust");
-    av_dict_set(&opts, "movflags", "frag_keyframe+empty_moov", 0);
-    av_dict_set(&opts, "avoid_negative_ts", "0", 0);
-    init(1, 0);
-    mux_gops(2);
-    finish();
-    close_out();
-
-    reset_count_warnings();
-    check(num_warnings > 0, "No warnings printed for unhandled start offset");
-
-    // Verify that delay_moov produces the same as empty_moov for
-    // simple input
-    init_out("delay-moov");
-    av_dict_set(&opts, "movflags", "frag_keyframe+delay_moov", 0);
-    av_dict_set(&opts, "use_editlist", "0", 0);
-    init(0, 0);
-    mux_gops(2);
-    finish();
-    close_out();
-    check(!memcmp(hash, content, HASH_SIZE), "delay_moov differs from empty_moov");
-
-    // Test writing content that requires an edit list using delay_moov
-    init_out("delay-moov-elst");
-    av_dict_set(&opts, "movflags", "frag_keyframe+delay_moov", 0);
-    init(1, 1);
-    mux_gops(2);
-    finish();
-    close_out();
-
-    // Test writing a file with one track lacking packets, with delay_moov.
-    skip_write_audio = 1;
-    init_out("delay-moov-empty-track");
-    av_dict_set(&opts, "movflags", "frag_keyframe+delay_moov", 0);
-    init(0, 0);
-    mux_gops(2);
-    // The automatic flushing shouldn't output anything, since we're still
-    // waiting for data for some tracks
-    check(out_size == 0, "delay_moov flushed prematurely");
-    // When closed (or manually flushed), all the written data should still
-    // be output.
-    finish();
-    close_out();
-    check(out_size > 0, "delay_moov didn't output anything");
-
-    // Check that manually flushing still outputs things as expected. This
-    // produces two fragments, while the one above produces only one.
-    init_out("delay-moov-empty-track-flush");
-    av_dict_set(&opts, "movflags", "frag_custom+delay_moov", 0);
-    init(0, 0);
-    mux_gops(1);
-    av_write_frame(ctx, NULL); // Force writing the moov
-    check(out_size > 0, "No moov written");
-    av_write_frame(ctx, NULL);
-    mux_gops(1);
-    av_write_frame(ctx, NULL);
-    finish();
-    close_out();
-
-    skip_write_audio = 0;
-
-
-
-    // Verify that the header written by delay_moov when manually flushed
-    // is identical to the one by empty_moov.
-    init_out("empty-moov-header");
-    av_dict_set(&opts, "movflags", "frag_keyframe+empty_moov", 0);
-    av_dict_set(&opts, "use_editlist", "0", 0);
-    init(0, 0);
-    close_out();
-    memcpy(header, hash, HASH_SIZE);
-    init_out("empty-moov-content");
-    mux_gops(2);
-    // Written 2 seconds of content, with an automatic flush after 1 second.
-    check(out_size > 0, "No automatic flush?");
-    empty_moov_pos = prev_pos = out_size;
-    // Manually flush the second fragment
-    av_write_frame(ctx, NULL);
-    check(out_size > prev_pos, "No second fragment flushed?");
-    prev_pos = out_size;
-    // Check that an extra flush doesn't output any more data
-    av_write_frame(ctx, NULL);
-    check(out_size == prev_pos, "More data written?");
-    close_out();
-    memcpy(content, hash, HASH_SIZE);
-    // Ignore the trailer written here
-    finish();
-
-    init_out("delay-moov-header");
-    av_dict_set(&opts, "movflags", "frag_custom+delay_moov", 0);
-    av_dict_set(&opts, "use_editlist", "0", 0);
-    init(0, 0);
-    check(out_size == 0, "Output written during init with delay_moov");
-    mux_gops(1); // Write 1 second of content
-    av_write_frame(ctx, NULL); // Force writing the moov
-    close_out();
-    check(!memcmp(hash, header, HASH_SIZE), "delay_moov header differs from empty_moov");
-    init_out("delay-moov-content");
-    av_write_frame(ctx, NULL); // Flush the first fragment
-    check(out_size == empty_moov_pos, "Manually flushed content differs from automatically flushed, %d vs %d", out_size, empty_moov_pos);
-    mux_gops(1); // Write the rest of the content
-    av_write_frame(ctx, NULL); // Flush the second fragment
-    close_out();
-    check(!memcmp(hash, content, HASH_SIZE), "delay_moov content differs from empty_moov");
-    finish();
-
-
-    // Verify that we can produce an identical second fragment without
-    // writing the first one. First write the reference fragments that
-    // we want to reproduce.
-    av_dict_set(&opts, "movflags", "frag_custom+empty_moov+dash", 0);
-    init(0, 0);
-    mux_gops(1);
-    av_write_frame(ctx, NULL); // Output the first fragment
-    init_out("empty-moov-second-frag");
-    mux_gops(1);
-    av_write_frame(ctx, NULL); // Output the second fragment
-    close_out();
-    memcpy(content, hash, HASH_SIZE);
-    finish();
-
-    // Produce the same second fragment without actually writing the first
-    // one before.
-    av_dict_set(&opts, "movflags", "frag_custom+empty_moov+dash+frag_discont", 0);
-    av_dict_set(&opts, "fragment_index", "2", 0);
-    av_dict_set(&opts, "avoid_negative_ts", "0", 0);
-    av_dict_set(&opts, "use_editlist", "0", 0);
-    init(0, 0);
-    skip_gops(1);
-    init_out("empty-moov-second-frag-discont");
-    mux_gops(1);
-    av_write_frame(ctx, NULL); // Output the second fragment
-    close_out();
-    check(!memcmp(hash, content, HASH_SIZE), "discontinuously written fragment differs");
-    finish();
-
-    // Produce the same thing by using delay_moov, which requires a slightly
-    // different call sequence.
-    av_dict_set(&opts, "movflags", "frag_custom+delay_moov+dash+frag_discont", 0);
-    av_dict_set(&opts, "fragment_index", "2", 0);
-    init(0, 0);
-    skip_gops(1);
-    mux_gops(1);
-    av_write_frame(ctx, NULL); // Output the moov
-    init_out("delay-moov-second-frag-discont");
-    av_write_frame(ctx, NULL); // Output the second fragment
-    close_out();
-    check(!memcmp(hash, content, HASH_SIZE), "discontinuously written fragment differs");
-    finish();
-
-
-    // Test discontinuously written fragments with B-frames (where the
-    // assumption of starting at pts=0 works) but not with audio preroll
-    // (which can't be guessed).
-    av_dict_set(&opts, "movflags", "frag_custom+delay_moov+dash", 0);
-    init(1, 0);
-    mux_gops(1);
-    init_out("delay-moov-elst-init");
-    av_write_frame(ctx, NULL); // Output the moov
-    close_out();
-    memcpy(header, hash, HASH_SIZE);
-    av_write_frame(ctx, NULL); // Output the first fragment
-    init_out("delay-moov-elst-second-frag");
-    mux_gops(1);
-    av_write_frame(ctx, NULL); // Output the second fragment
-    close_out();
-    memcpy(content, hash, HASH_SIZE);
-    finish();
-
-    av_dict_set(&opts, "movflags", "frag_custom+delay_moov+dash+frag_discont", 0);
-    av_dict_set(&opts, "fragment_index", "2", 0);
-    init(1, 0);
-    skip_gops(1);
-    mux_gops(1); // Write the second fragment
-    init_out("delay-moov-elst-init-discont");
-    av_write_frame(ctx, NULL); // Output the moov
-    close_out();
-    check(!memcmp(hash, header, HASH_SIZE), "discontinuously written header differs");
-    init_out("delay-moov-elst-second-frag-discont");
-    av_write_frame(ctx, NULL); // Output the second fragment
-    close_out();
-    check(!memcmp(hash, content, HASH_SIZE), "discontinuously written fragment differs");
-    finish();
-
-
-    // Test discontinuously written fragments with B-frames and audio preroll,
-    // properly signaled.
-    av_dict_set(&opts, "movflags", "frag_custom+delay_moov+dash", 0);
-    init(1, 1);
-    mux_gops(1);
-    init_out("delay-moov-elst-signal-init");
-    av_write_frame(ctx, NULL); // Output the moov
-    close_out();
-    memcpy(header, hash, HASH_SIZE);
-    av_write_frame(ctx, NULL); // Output the first fragment
-    init_out("delay-moov-elst-signal-second-frag");
-    mux_gops(1);
-    av_write_frame(ctx, NULL); // Output the second fragment
-    close_out();
-    memcpy(content, hash, HASH_SIZE);
-    finish();
-
-    av_dict_set(&opts, "movflags", "frag_custom+delay_moov+dash+frag_discont", 0);
-    av_dict_set(&opts, "fragment_index", "2", 0);
-    init(1, 1);
-    signal_init_ts();
-    skip_gops(1);
-    mux_gops(1); // Write the second fragment
-    init_out("delay-moov-elst-signal-init-discont");
-    av_write_frame(ctx, NULL); // Output the moov
-    close_out();
-    check(!memcmp(hash, header, HASH_SIZE), "discontinuously written header differs");
-    init_out("delay-moov-elst-signal-second-frag-discont");
-    av_write_frame(ctx, NULL); // Output the second fragment
-    close_out();
-    check(!memcmp(hash, content, HASH_SIZE), "discontinuously written fragment differs");
-    finish();
-
-
-    // Test VFR content, with sidx atoms (which declare the pts duration
-    // of a fragment, forcing overriding the start pts of the next one).
-    // Here, the fragment duration in pts is significantly different from
-    // the duration in dts. The video stream starts at dts=-10,pts=0, and
-    // the second fragment starts at dts=155,pts=156. The trun duration sum
-    // of the first fragment is 165, which also is written as
-    // baseMediaDecodeTime in the tfdt in the second fragment. The sidx for
-    // the first fragment says earliest_presentation_time = 0 and
-    // subsegment_duration = 156, which also matches the sidx in the second
-    // fragment. For the audio stream, the pts and dts durations also don't
-    // match - the input stream starts at pts=-2048, but that part is excluded
-    // by the edit list.
-    init_out("vfr");
-    av_dict_set(&opts, "movflags", "frag_keyframe+delay_moov+dash", 0);
-    init_fps(1, 1, 3);
-    mux_frames(gop_size/2);
-    duration /= 10;
-    mux_frames(gop_size/2);
-    mux_gops(1);
-    finish();
-    close_out();
-
-    // Test VFR content, with cleared duration fields. In these cases,
-    // the muxer must guess the duration of the last packet of each
-    // fragment. As long as the framerate doesn't vary (too much) at the
-    // fragment edge, it works just fine. Additionally, when automatically
-    // cutting fragments, the muxer already know the timestamps of the next
-    // packet for one stream (in most cases the video stream), avoiding
-    // having to use guesses for that one.
-    init_count_warnings();
-    clear_duration = 1;
-    init_out("vfr-noduration");
-    av_dict_set(&opts, "movflags", "frag_keyframe+delay_moov+dash", 0);
-    init_fps(1, 1, 3);
-    mux_frames(gop_size/2);
-    duration /= 10;
-    mux_frames(gop_size/2);
-    mux_gops(1);
-    finish();
-    close_out();
-    clear_duration = 0;
-    reset_count_warnings();
-    check(num_warnings > 0, "No warnings printed for filled in durations");
-
-    av_free(md5);
-
-    return check_faults > 0 ? 1 : 0;
-}
diff --git a/libavformat/noproxy-test.c b/libavformat/noproxy-test.c
deleted file mode 100644 (file)
index 4524764..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (c) 2013 Martin Storsjo
- *
- * This file is part of FFmpeg.
- *
- * 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
- * Lesser General Public License for more details.
- *
- * 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 "network.h"
-
-static void test(const char *pattern, const char *host)
-{
-    int res = ff_http_match_no_proxy(pattern, host);
-    printf("The pattern \"%s\" %s the hostname %s\n",
-           pattern ? pattern : "(null)", res ? "matches" : "does not match",
-           host);
-}
-
-int main(void)
-{
-    test(NULL, "domain.com");
-    test("example.com domain.com", "domain.com");
-    test("example.com other.com", "domain.com");
-    test("example.com,domain.com", "domain.com");
-    test("example.com,domain.com", "otherdomain.com");
-    test("example.com, *.domain.com", "sub.domain.com");
-    test("example.com, *.domain.com", "domain.com");
-    test("example.com, .domain.com", "domain.com");
-    test("*", "domain.com");
-    return 0;
-}
diff --git a/libavformat/rtmpdh-test.c b/libavformat/rtmpdh-test.c
deleted file mode 100644 (file)
index e86fb18..0000000
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * This file is part of FFmpeg.
- *
- * 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
- * Lesser General Public License for more details.
- *
- * 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 "rtmpdh.c"
-
-#include <stdio.h>
-
-static int test_random_shared_secret(void)
-{
-    FF_DH *peer1 = NULL, *peer2 = NULL;
-    int ret;
-    uint8_t pubkey1[128], pubkey2[128];
-    uint8_t sharedkey1[128], sharedkey2[128];
-
-    peer1 = ff_dh_init(1024);
-    peer2 = ff_dh_init(1024);
-    if (!peer1 || !peer2) {
-        ret = AVERROR(ENOMEM);
-        goto fail;
-    }
-    if ((ret = ff_dh_generate_public_key(peer1)) < 0)
-        goto fail;
-    if ((ret = ff_dh_generate_public_key(peer2)) < 0)
-        goto fail;
-    if ((ret = ff_dh_write_public_key(peer1, pubkey1, sizeof(pubkey1))) < 0)
-        goto fail;
-    if ((ret = ff_dh_write_public_key(peer2, pubkey2, sizeof(pubkey2))) < 0)
-        goto fail;
-    if ((ret = ff_dh_compute_shared_secret_key(peer1, pubkey2, sizeof(pubkey2),
-                                               sharedkey1, sizeof(sharedkey1))) < 0)
-        goto fail;
-    if ((ret = ff_dh_compute_shared_secret_key(peer2, pubkey1, sizeof(pubkey1),
-                                               sharedkey2, sizeof(sharedkey2))) < 0)
-        goto fail;
-    if (memcmp(sharedkey1, sharedkey2, sizeof(sharedkey1))) {
-        printf("Mismatched generated shared key\n");
-        ret = AVERROR_INVALIDDATA;
-    } else {
-        printf("Generated shared key ok\n");
-    }
-fail:
-    ff_dh_free(peer1);
-    ff_dh_free(peer2);
-    return ret;
-}
-
-static const char *private_key =
-    "976C18FCADC255B456564F74F3EEDA59D28AF6B744D743F2357BFD2404797EF896EF1A"
-    "7C1CBEAAA3AB60AF3192D189CFF3F991C9CBBFD78119FCA2181384B94011943B6D6F28"
-    "9E1B708E2D1A0C7771169293F03DA27E561F15F16F0AC9BC858C77A80FA98FD088A232"
-    "19D08BE6F165DE0B02034B18705829FAD0ACB26A5B75EF";
-static const char *public_key =
-    "F272ECF8362257C5D2C3CC2229CF9C0A03225BC109B1DBC76A68C394F256ACA3EF5F64"
-    "FC270C26382BF315C19E97A76104A716FC998A651E8610A3AE6CF65D8FAE5D3F32EEA0"
-    "0B32CB9609B494116A825D7142D17B88E3D20EDD98743DE29CF37A23A9F6A58B960591"
-    "3157D5965FCB46DDA73A1F08DD897BAE88DFE6FC937CBA";
-static const uint8_t public_key_bin[] = {
-    0xf2, 0x72, 0xec, 0xf8, 0x36, 0x22, 0x57, 0xc5, 0xd2, 0xc3, 0xcc, 0x22,
-    0x29, 0xcf, 0x9c, 0x0a, 0x03, 0x22, 0x5b, 0xc1, 0x09, 0xb1, 0xdb, 0xc7,
-    0x6a, 0x68, 0xc3, 0x94, 0xf2, 0x56, 0xac, 0xa3, 0xef, 0x5f, 0x64, 0xfc,
-    0x27, 0x0c, 0x26, 0x38, 0x2b, 0xf3, 0x15, 0xc1, 0x9e, 0x97, 0xa7, 0x61,
-    0x04, 0xa7, 0x16, 0xfc, 0x99, 0x8a, 0x65, 0x1e, 0x86, 0x10, 0xa3, 0xae,
-    0x6c, 0xf6, 0x5d, 0x8f, 0xae, 0x5d, 0x3f, 0x32, 0xee, 0xa0, 0x0b, 0x32,
-    0xcb, 0x96, 0x09, 0xb4, 0x94, 0x11, 0x6a, 0x82, 0x5d, 0x71, 0x42, 0xd1,
-    0x7b, 0x88, 0xe3, 0xd2, 0x0e, 0xdd, 0x98, 0x74, 0x3d, 0xe2, 0x9c, 0xf3,
-    0x7a, 0x23, 0xa9, 0xf6, 0xa5, 0x8b, 0x96, 0x05, 0x91, 0x31, 0x57, 0xd5,
-    0x96, 0x5f, 0xcb, 0x46, 0xdd, 0xa7, 0x3a, 0x1f, 0x08, 0xdd, 0x89, 0x7b,
-    0xae, 0x88, 0xdf, 0xe6, 0xfc, 0x93, 0x7c, 0xba
-};
-static const uint8_t peer_public_key[] = {
-    0x58, 0x66, 0x05, 0x49, 0x94, 0x23, 0x2b, 0x66, 0x52, 0x13, 0xff, 0x46,
-    0xf2, 0xb3, 0x79, 0xa9, 0xee, 0xae, 0x1a, 0x13, 0xf0, 0x71, 0x52, 0xfb,
-    0x93, 0x4e, 0xee, 0x97, 0x05, 0x73, 0x50, 0x7d, 0xaf, 0x02, 0x07, 0x72,
-    0xac, 0xdc, 0xa3, 0x95, 0x78, 0xee, 0x9a, 0x19, 0x71, 0x7e, 0x99, 0x9f,
-    0x2a, 0xd4, 0xb3, 0xe2, 0x0c, 0x1d, 0x1a, 0x78, 0x4c, 0xde, 0xf1, 0xad,
-    0xb4, 0x60, 0xa8, 0x51, 0xac, 0x71, 0xec, 0x86, 0x70, 0xa2, 0x63, 0x36,
-    0x92, 0x7c, 0xe3, 0x87, 0xee, 0xe4, 0xf1, 0x62, 0x24, 0x74, 0xb4, 0x04,
-    0xfa, 0x5c, 0xdf, 0xba, 0xfa, 0xa3, 0xc2, 0xbb, 0x62, 0x27, 0xd0, 0xf4,
-    0xe4, 0x43, 0xda, 0x8a, 0x88, 0x69, 0x60, 0xe2, 0xdb, 0x75, 0x2a, 0x98,
-    0x9d, 0xb5, 0x50, 0xe3, 0x99, 0xda, 0xe0, 0xa6, 0x14, 0xc9, 0x80, 0x12,
-    0xf9, 0x3c, 0xac, 0x06, 0x02, 0x7a, 0xde, 0x74
-};
-static const uint8_t shared_secret[] = {
-    0xb2, 0xeb, 0xcb, 0x71, 0xf3, 0x61, 0xfb, 0x5b, 0x4e, 0x5c, 0x4c, 0xcf,
-    0x5c, 0x08, 0x5f, 0x96, 0x26, 0x77, 0x1d, 0x31, 0xf1, 0xe1, 0xf7, 0x4b,
-    0x92, 0xac, 0x82, 0x2a, 0x88, 0xc7, 0x83, 0xe1, 0xc7, 0xf3, 0xd3, 0x1a,
-    0x7d, 0xc8, 0x31, 0xe3, 0x97, 0xe4, 0xec, 0x31, 0x0e, 0x8f, 0x73, 0x1a,
-    0xe4, 0xf6, 0xd8, 0xc8, 0x94, 0xff, 0xa0, 0x03, 0x84, 0x03, 0x0f, 0xa5,
-    0x30, 0x5d, 0x67, 0xe0, 0x7a, 0x3b, 0x5f, 0xed, 0x4c, 0xf5, 0xbc, 0x18,
-    0xea, 0xd4, 0x77, 0xa9, 0x07, 0xb3, 0x54, 0x0b, 0x02, 0xd9, 0xc6, 0xb8,
-    0x66, 0x5e, 0xec, 0xa4, 0xcd, 0x47, 0xed, 0xc9, 0x38, 0xc6, 0x91, 0x08,
-    0xf3, 0x85, 0x9b, 0x69, 0x16, 0x78, 0x0d, 0xb7, 0x74, 0x51, 0xaa, 0x5b,
-    0x4d, 0x74, 0xe4, 0x29, 0x2e, 0x9e, 0x8e, 0xf7, 0xe5, 0x42, 0x83, 0xb0,
-    0x65, 0xb0, 0xce, 0xc6, 0xb2, 0x8f, 0x5b, 0xb0
-};
-
-static int test_ref_data(void)
-{
-    FF_DH *dh;
-    int ret = AVERROR(ENOMEM);
-    uint8_t pubkey_test[128];
-    uint8_t sharedkey_test[128];
-
-    dh = ff_dh_init(1024);
-    if (!dh)
-        goto fail;
-    bn_hex2bn(dh->priv_key, private_key, ret);
-    if (!ret)
-        goto fail;
-    bn_hex2bn(dh->pub_key, public_key, ret);
-    if (!ret)
-        goto fail;
-    if ((ret = ff_dh_write_public_key(dh, pubkey_test, sizeof(pubkey_test))) < 0)
-        goto fail;
-    if (memcmp(pubkey_test, public_key_bin, sizeof(pubkey_test))) {
-        printf("Mismatched generated public key\n");
-        ret = AVERROR_INVALIDDATA;
-        goto fail;
-    } else {
-        printf("Generated public key ok\n");
-    }
-    if ((ret = ff_dh_compute_shared_secret_key(dh, peer_public_key, sizeof(peer_public_key),
-                                               sharedkey_test, sizeof(sharedkey_test))) < 0)
-        goto fail;
-    if (memcmp(shared_secret, sharedkey_test, sizeof(sharedkey_test))) {
-        printf("Mismatched generated shared key\n");
-        ret = AVERROR_INVALIDDATA;
-    } else {
-        printf("Generated shared key ok\n");
-    }
-fail:
-    ff_dh_free(dh);
-    return ret;
-}
-
-int main(void)
-{
-    if (test_random_shared_secret() < 0)
-        return 1;
-    if (test_ref_data() < 0)
-        return 1;
-    return 0;
-}
diff --git a/libavformat/seek-test.c b/libavformat/seek-test.c
deleted file mode 100644 (file)
index 904b435..0000000
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * Copyright (c) 2003 Fabrice Bellard
- * Copyright (c) 2007 Michael Niedermayer
- *
- * This file is part of FFmpeg.
- *
- * 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
- * Lesser General Public License for more details.
- *
- * 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 <stdint.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "libavutil/common.h"
-#include "libavutil/mathematics.h"
-#include "libavformat/avformat.h"
-
-static char buffer[20];
-
-static const char *ret_str(int v)
-{
-    switch (v) {
-    case AVERROR_EOF:     return "-EOF";
-    case AVERROR(EIO):    return "-EIO";
-    case AVERROR(ENOMEM): return "-ENOMEM";
-    case AVERROR(EINVAL): return "-EINVAL";
-    default:
-        snprintf(buffer, sizeof(buffer), "%2d", v);
-        return buffer;
-    }
-}
-
-static void ts_str(char buffer[60], int64_t ts, AVRational base)
-{
-    if (ts == AV_NOPTS_VALUE) {
-        strcpy(buffer, " NOPTS   ");
-        return;
-    }
-    ts= av_rescale_q(ts, base, (AVRational){1, 1000000});
-    snprintf(buffer, 60, "%c%"PRId64".%06"PRId64"", ts<0 ? '-' : ' ', FFABS(ts)/1000000, FFABS(ts)%1000000);
-}
-
-int main(int argc, char **argv)
-{
-    const char *filename;
-    AVFormatContext *ic = avformat_alloc_context();
-    int i, ret, stream_id;
-    int j;
-    int64_t timestamp;
-    AVDictionary *format_opts = NULL;
-    int64_t seekfirst = AV_NOPTS_VALUE;
-    int firstback=0;
-    int frame_count = 1;
-    int duration = 4;
-
-    for(i=2; i<argc; i+=2){
-        if       (!strcmp(argv[i], "-seekforw")){
-            seekfirst = atoi(argv[i+1]);
-        } else if(!strcmp(argv[i], "-seekback")){
-            seekfirst = atoi(argv[i+1]);
-            firstback = 1;
-        } else if(!strcmp(argv[i], "-frames")){
-            frame_count = atoi(argv[i+1]);
-        } else if(!strcmp(argv[i], "-duration")){
-            duration = atoi(argv[i+1]);
-        } else if(!strcmp(argv[i], "-fastseek")) {
-            if (atoi(argv[i+1])) {
-                ic->flags |= AVFMT_FLAG_FAST_SEEK;
-            }
-        } else if(argv[i][0] == '-' && argv[i+1]) {
-            av_dict_set(&format_opts, argv[i] + 1, argv[i+1], 0);
-        } else {
-            argc = 1;
-        }
-    }
-
-    av_dict_set(&format_opts, "channels", "1", 0);
-    av_dict_set(&format_opts, "sample_rate", "22050", 0);
-
-    /* initialize libavcodec, and register all codecs and formats */
-    av_register_all();
-
-    if (argc < 2) {
-        printf("usage: %s input_file\n"
-               "\n", argv[0]);
-        return 1;
-    }
-
-    filename = argv[1];
-
-    ret = avformat_open_input(&ic, filename, NULL, &format_opts);
-    av_dict_free(&format_opts);
-    if (ret < 0) {
-        fprintf(stderr, "cannot open %s\n", filename);
-        return 1;
-    }
-
-    ret = avformat_find_stream_info(ic, NULL);
-    if (ret < 0) {
-        fprintf(stderr, "%s: could not find codec parameters\n", filename);
-        return 1;
-    }
-
-    if(seekfirst != AV_NOPTS_VALUE){
-        if(firstback)   avformat_seek_file(ic, -1, INT64_MIN, seekfirst, seekfirst, 0);
-        else            avformat_seek_file(ic, -1, seekfirst, seekfirst, INT64_MAX, 0);
-    }
-    for(i=0; ; i++){
-        AVPacket pkt = { 0 };
-        AVStream *av_uninit(st);
-        char ts_buf[60];
-
-        if(ret>=0){
-            for(j=0; j<frame_count; j++) {
-            ret= av_read_frame(ic, &pkt);
-            if(ret>=0){
-                char dts_buf[60];
-                st= ic->streams[pkt.stream_index];
-                ts_str(dts_buf, pkt.dts, st->time_base);
-                ts_str(ts_buf,  pkt.pts, st->time_base);
-                printf("ret:%-10s st:%2d flags:%d dts:%s pts:%s pos:%7" PRId64 " size:%6d", ret_str(ret), pkt.stream_index, pkt.flags, dts_buf, ts_buf, pkt.pos, pkt.size);
-                av_packet_unref(&pkt);
-            } else
-                printf("ret:%s", ret_str(ret)); // necessary to avoid trailing whitespace
-            printf("\n");
-            }
-        }
-
-        if(i>25) break;
-
-        stream_id= (i>>1)%(ic->nb_streams+1) - 1;
-        timestamp= (i*19362894167LL) % (duration*AV_TIME_BASE) - AV_TIME_BASE;
-        if(stream_id>=0){
-            st= ic->streams[stream_id];
-            timestamp= av_rescale_q(timestamp, AV_TIME_BASE_Q, st->time_base);
-        }
-        //FIXME fully test the new seek API
-        if(i&1) ret = avformat_seek_file(ic, stream_id, INT64_MIN, timestamp, timestamp, 0);
-        else    ret = avformat_seek_file(ic, stream_id, timestamp, timestamp, INT64_MAX, 0);
-        ts_str(ts_buf, timestamp, stream_id < 0 ? AV_TIME_BASE_Q : st->time_base);
-        printf("ret:%-10s st:%2d flags:%d  ts:%s\n", ret_str(ret), stream_id, i&1, ts_buf);
-    }
-
-    avformat_close_input(&ic);
-
-    return 0;
-}
diff --git a/libavformat/srtp-test.c b/libavformat/srtp-test.c
deleted file mode 100644 (file)
index 1198f59..0000000
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * This file is part of FFmpeg.
- *
- * 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
- * Lesser General Public License for more details.
- *
- * 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 <stdint.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "rtpdec.h"
-#include "srtp.h"
-
-static const char *aes128_80_key = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmn";
-
-static const uint8_t rtp_aes128_80[] = {
-    // RTP header
-    0x80, 0xe0, 0x12, 0x34, 0x12, 0x34, 0x56, 0x78, 0x12, 0x34, 0x56, 0x78,
-    // encrypted payload
-    0x62, 0x69, 0x76, 0xca, 0xc5,
-    // HMAC
-    0xa1, 0xac, 0x1b, 0xb4, 0xa0, 0x1c, 0xd5, 0x49, 0x28, 0x99,
-};
-
-static const uint8_t rtcp_aes128_80[] = {
-    // RTCP header
-    0x81, 0xc9, 0x00, 0x07, 0x12, 0x34, 0x56, 0x78,
-    // encrypted payload
-    0x8a, 0xac, 0xdc, 0xa5, 0x4c, 0xf6, 0x78, 0xa6, 0x62, 0x8f, 0x24, 0xda,
-    0x6c, 0x09, 0x3f, 0xa9, 0x28, 0x7a, 0xb5, 0x7f, 0x1f, 0x0f, 0xc9, 0x35,
-    // RTCP index
-    0x80, 0x00, 0x00, 0x03,
-    // HMAC
-    0xe9, 0x3b, 0xc0, 0x5c, 0x0c, 0x06, 0x9f, 0xab, 0xc0, 0xde,
-};
-
-static const char *aes128_32_key = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmn";
-
-static const uint8_t rtp_aes128_32[] = {
-    // RTP header
-    0x80, 0xe0, 0x12, 0x34, 0x12, 0x34, 0x56, 0x78, 0x12, 0x34, 0x56, 0x78,
-    // encrypted payload
-    0x62, 0x69, 0x76, 0xca, 0xc5,
-    // HMAC
-    0xa1, 0xac, 0x1b, 0xb4,
-};
-
-static const uint8_t rtcp_aes128_32[] = {
-    // RTCP header
-    0x81, 0xc9, 0x00, 0x07, 0x12, 0x34, 0x56, 0x78,
-    // encrypted payload
-    0x35, 0xe9, 0xb5, 0xff, 0x0d, 0xd1, 0xde, 0x70, 0x74, 0x10, 0xaa, 0x1b,
-    0xb2, 0x8d, 0xf0, 0x20, 0x02, 0x99, 0x6b, 0x1b, 0x0b, 0xd0, 0x47, 0x34,
-    // RTCP index
-    0x80, 0x00, 0x00, 0x04,
-    // HMAC
-    0x5b, 0xd2, 0xa9, 0x9d,
-};
-
-static const char *aes128_80_32_key = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmn";
-
-static const uint8_t rtp_aes128_80_32[] = {
-    // RTP header
-    0x80, 0xe0, 0x12, 0x34, 0x12, 0x34, 0x56, 0x78, 0x12, 0x34, 0x56, 0x78,
-    // encrypted payload
-    0x62, 0x69, 0x76, 0xca, 0xc5,
-    // HMAC
-    0xa1, 0xac, 0x1b, 0xb4,
-};
-
-static const uint8_t rtcp_aes128_80_32[] = {
-    // RTCP header
-    0x81, 0xc9, 0x00, 0x07, 0x12, 0x34, 0x56, 0x78,
-    // encrypted payload
-    0xd6, 0xae, 0xc1, 0x58, 0x63, 0x70, 0xc9, 0x88, 0x66, 0x26, 0x1c, 0x53,
-    0xff, 0x5d, 0x5d, 0x2b, 0x0f, 0x8c, 0x72, 0x3e, 0xc9, 0x1d, 0x43, 0xf9,
-    // RTCP index
-    0x80, 0x00, 0x00, 0x05,
-    // HMAC
-    0x09, 0x16, 0xb4, 0x27, 0x9a, 0xe9, 0x92, 0x26, 0x4e, 0x10,
-};
-
-static void print_data(const uint8_t *buf, int len)
-{
-    int i;
-    for (i = 0; i < len; i++)
-        printf("%02x", buf[i]);
-    printf("\n");
-}
-
-static int test_decrypt(struct SRTPContext *srtp, const uint8_t *in, int len,
-                        uint8_t *out)
-{
-    memcpy(out, in, len);
-    if (!ff_srtp_decrypt(srtp, out, &len)) {
-        print_data(out, len);
-        return len;
-    } else
-        return -1;
-}
-
-static void test_encrypt(const uint8_t *data, int in_len, const char *suite,
-                         const char *key)
-{
-    struct SRTPContext enc = { 0 }, dec = { 0 };
-    int len;
-    char buf[RTP_MAX_PACKET_LENGTH];
-    ff_srtp_set_crypto(&enc, suite, key);
-    ff_srtp_set_crypto(&dec, suite, key);
-    len = ff_srtp_encrypt(&enc, data, in_len, buf, sizeof(buf));
-    if (!ff_srtp_decrypt(&dec, buf, &len)) {
-        if (len == in_len && !memcmp(buf, data, len))
-            printf("Decrypted content matches input\n");
-        else
-            printf("Decrypted content doesn't match input\n");
-    } else {
-        printf("Decryption failed\n");
-    }
-    ff_srtp_free(&enc);
-    ff_srtp_free(&dec);
-}
-
-int main(void)
-{
-    static const char *aes128_80_suite = "AES_CM_128_HMAC_SHA1_80";
-    static const char *aes128_32_suite = "AES_CM_128_HMAC_SHA1_32";
-    static const char *aes128_80_32_suite = "SRTP_AES128_CM_HMAC_SHA1_32";
-    static const char *test_key = "abcdefghijklmnopqrstuvwxyz1234567890ABCD";
-    uint8_t buf[RTP_MAX_PACKET_LENGTH];
-    struct SRTPContext srtp = { 0 };
-    int len;
-    ff_srtp_set_crypto(&srtp, aes128_80_suite, aes128_80_key);
-    len = test_decrypt(&srtp, rtp_aes128_80, sizeof(rtp_aes128_80), buf);
-    test_encrypt(buf, len, aes128_80_suite, test_key);
-    test_encrypt(buf, len, aes128_32_suite, test_key);
-    test_encrypt(buf, len, aes128_80_32_suite, test_key);
-    test_decrypt(&srtp, rtcp_aes128_80, sizeof(rtcp_aes128_80), buf);
-    test_encrypt(buf, len, aes128_80_suite, test_key);
-    test_encrypt(buf, len, aes128_32_suite, test_key);
-    test_encrypt(buf, len, aes128_80_32_suite, test_key);
-    ff_srtp_free(&srtp);
-
-    memset(&srtp, 0, sizeof(srtp)); // Clear the context
-    ff_srtp_set_crypto(&srtp, aes128_32_suite, aes128_32_key);
-    test_decrypt(&srtp, rtp_aes128_32, sizeof(rtp_aes128_32), buf);
-    test_decrypt(&srtp, rtcp_aes128_32, sizeof(rtcp_aes128_32), buf);
-    ff_srtp_free(&srtp);
-
-    memset(&srtp, 0, sizeof(srtp)); // Clear the context
-    ff_srtp_set_crypto(&srtp, aes128_80_32_suite, aes128_80_32_key);
-    test_decrypt(&srtp, rtp_aes128_80_32, sizeof(rtp_aes128_80_32), buf);
-    test_decrypt(&srtp, rtcp_aes128_80_32, sizeof(rtcp_aes128_80_32), buf);
-    ff_srtp_free(&srtp);
-    return 0;
-}
diff --git a/libavformat/tests/.gitignore b/libavformat/tests/.gitignore
new file mode 100644 (file)
index 0000000..c8adb86
--- /dev/null
@@ -0,0 +1,6 @@
+/movenc
+/noproxy
+/rtmpdh
+/seek
+/srtp
+/url
diff --git a/libavformat/tests/movenc.c b/libavformat/tests/movenc.c
new file mode 100644 (file)
index 0000000..786f1dc
--- /dev/null
@@ -0,0 +1,676 @@
+/*
+ * Copyright (c) 2015 Martin Storsjo
+ *
+ * This file is part of FFmpeg.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * 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 "config.h"
+
+#include "libavutil/intreadwrite.h"
+#include "libavutil/mathematics.h"
+#include "libavutil/md5.h"
+
+#include "libavformat/avformat.h"
+
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#if !HAVE_GETOPT
+#include "compat/getopt.c"
+#endif
+
+#define HASH_SIZE 16
+
+static const uint8_t h264_extradata[] = {
+    0x01, 0x4d, 0x40, 0x1e, 0xff, 0xe1, 0x00, 0x02, 0x67, 0x4d, 0x01, 0x00, 0x02, 0x68, 0xef
+};
+static const uint8_t aac_extradata[] = {
+    0x12, 0x10
+};
+
+
+static const char *format = "mp4";
+AVFormatContext *ctx;
+uint8_t iobuf[32768];
+AVDictionary *opts;
+
+int write_file;
+const char *cur_name;
+FILE* out;
+int out_size;
+struct AVMD5* md5;
+uint8_t hash[HASH_SIZE];
+
+AVStream *video_st, *audio_st;
+int64_t audio_dts, video_dts;
+
+int bframes;
+int64_t duration;
+int64_t audio_duration;
+int frames;
+int gop_size;
+int64_t next_p_pts;
+enum AVPictureType last_picture;
+int skip_write;
+int skip_write_audio;
+int clear_duration;
+
+int num_warnings;
+
+int check_faults;
+
+
+static void count_warnings(void *avcl, int level, const char *fmt, va_list vl)
+{
+    if (level == AV_LOG_WARNING)
+        num_warnings++;
+}
+
+static void init_count_warnings(void)
+{
+    av_log_set_callback(count_warnings);
+    num_warnings = 0;
+}
+
+static void reset_count_warnings(void)
+{
+    av_log_set_callback(av_log_default_callback);
+}
+
+static int io_write(void *opaque, uint8_t *buf, int size)
+{
+    out_size += size;
+    av_md5_update(md5, buf, size);
+    if (out)
+        fwrite(buf, 1, size, out);
+    return size;
+}
+
+static void init_out(const char *name)
+{
+    char buf[100];
+    cur_name = name;
+    snprintf(buf, sizeof(buf), "%s.%s", cur_name, format);
+
+    av_md5_init(md5);
+    if (write_file) {
+        out = fopen(buf, "wb");
+        if (!out)
+            perror(buf);
+    }
+    out_size = 0;
+}
+
+static void close_out(void)
+{
+    int i;
+    av_md5_final(md5, hash);
+    for (i = 0; i < HASH_SIZE; i++)
+        printf("%02x", hash[i]);
+    printf(" %d %s\n", out_size, cur_name);
+    if (out)
+        fclose(out);
+    out = NULL;
+}
+
+static void check_func(int value, int line, const char *msg, ...)
+{
+    if (!value) {
+        va_list ap;
+        va_start(ap, msg);
+        printf("%d: ", line);
+        vprintf(msg, ap);
+        printf("\n");
+        check_faults++;
+        va_end(ap);
+    }
+}
+#define check(value, ...) check_func(value, __LINE__, __VA_ARGS__)
+
+static void init_fps(int bf, int audio_preroll, int fps)
+{
+    AVStream *st;
+    ctx = avformat_alloc_context();
+    if (!ctx)
+        exit(1);
+    ctx->oformat = av_guess_format(format, NULL, NULL);
+    if (!ctx->oformat)
+        exit(1);
+    ctx->pb = avio_alloc_context(iobuf, sizeof(iobuf), AVIO_FLAG_WRITE, NULL, NULL, io_write, NULL);
+    if (!ctx->pb)
+        exit(1);
+    ctx->flags |= AVFMT_FLAG_BITEXACT;
+
+    st = avformat_new_stream(ctx, NULL);
+    if (!st)
+        exit(1);
+    st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
+    st->codecpar->codec_id = AV_CODEC_ID_H264;
+    st->codecpar->width = 640;
+    st->codecpar->height = 480;
+    st->time_base.num = 1;
+    st->time_base.den = 30;
+    st->codecpar->extradata_size = sizeof(h264_extradata);
+    st->codecpar->extradata = av_mallocz(st->codecpar->extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
+    if (!st->codecpar->extradata)
+        exit(1);
+    memcpy(st->codecpar->extradata, h264_extradata, sizeof(h264_extradata));
+    video_st = st;
+
+    st = avformat_new_stream(ctx, NULL);
+    if (!st)
+        exit(1);
+    st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO;
+    st->codecpar->codec_id = AV_CODEC_ID_AAC;
+    st->codecpar->sample_rate = 44100;
+    st->codecpar->channels = 2;
+    st->time_base.num = 1;
+    st->time_base.den = 44100;
+    st->codecpar->extradata_size = sizeof(aac_extradata);
+    st->codecpar->extradata = av_mallocz(st->codecpar->extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
+    if (!st->codecpar->extradata)
+        exit(1);
+    memcpy(st->codecpar->extradata, aac_extradata, sizeof(aac_extradata));
+    audio_st = st;
+
+    if (avformat_write_header(ctx, &opts) < 0)
+        exit(1);
+    av_dict_free(&opts);
+
+    frames = 0;
+    gop_size = 30;
+    duration = video_st->time_base.den / fps;
+    audio_duration = 1024LL * audio_st->time_base.den / audio_st->codecpar->sample_rate;
+    if (audio_preroll)
+        audio_preroll = 2048LL * audio_st->time_base.den / audio_st->codecpar->sample_rate;
+
+    bframes = bf;
+    video_dts = bframes ? -duration : 0;
+    audio_dts = -audio_preroll;
+}
+
+static void init(int bf, int audio_preroll)
+{
+    init_fps(bf, audio_preroll, 30);
+}
+
+static void mux_frames(int n)
+{
+    int end_frames = frames + n;
+    while (1) {
+        AVPacket pkt;
+        uint8_t pktdata[8] = { 0 };
+        av_init_packet(&pkt);
+
+        if (av_compare_ts(audio_dts, audio_st->time_base, video_dts, video_st->time_base) < 0) {
+            pkt.dts = pkt.pts = audio_dts;
+            pkt.stream_index = 1;
+            pkt.duration = audio_duration;
+            audio_dts += audio_duration;
+        } else {
+            if (frames == end_frames)
+                break;
+            pkt.dts = video_dts;
+            pkt.stream_index = 0;
+            pkt.duration = duration;
+            if ((frames % gop_size) == 0) {
+                pkt.flags |= AV_PKT_FLAG_KEY;
+                last_picture = AV_PICTURE_TYPE_I;
+                pkt.pts = pkt.dts + duration;
+                video_dts = pkt.pts;
+            } else {
+                if (last_picture == AV_PICTURE_TYPE_P) {
+                    last_picture = AV_PICTURE_TYPE_B;
+                    pkt.pts = pkt.dts;
+                    video_dts = next_p_pts;
+                } else {
+                    last_picture = AV_PICTURE_TYPE_P;
+                    if (((frames + 1) % gop_size) == 0) {
+                        pkt.pts = pkt.dts + duration;
+                        video_dts = pkt.pts;
+                    } else {
+                        next_p_pts = pkt.pts = pkt.dts + 2 * duration;
+                        video_dts += duration;
+                    }
+                }
+            }
+            if (!bframes)
+                pkt.pts = pkt.dts;
+            frames++;
+        }
+
+        if (clear_duration)
+            pkt.duration = 0;
+        AV_WB32(pktdata + 4, pkt.pts);
+        pkt.data = pktdata;
+        pkt.size = 8;
+        if (skip_write)
+            continue;
+        if (skip_write_audio && pkt.stream_index == 1)
+            continue;
+        av_write_frame(ctx, &pkt);
+    }
+}
+
+static void mux_gops(int n)
+{
+    mux_frames(gop_size * n);
+}
+
+static void skip_gops(int n)
+{
+    skip_write = 1;
+    mux_gops(n);
+    skip_write = 0;
+}
+
+static void signal_init_ts(void)
+{
+    AVPacket pkt;
+    av_init_packet(&pkt);
+    pkt.size = 0;
+    pkt.data = NULL;
+
+    pkt.stream_index = 0;
+    pkt.dts = video_dts;
+    pkt.pts = 0;
+    av_write_frame(ctx, &pkt);
+
+    pkt.stream_index = 1;
+    pkt.dts = pkt.pts = audio_dts;
+    av_write_frame(ctx, &pkt);
+}
+
+static void finish(void)
+{
+    av_write_trailer(ctx);
+    av_free(ctx->pb);
+    avformat_free_context(ctx);
+    ctx = NULL;
+}
+
+static void help(void)
+{
+    printf("movenc-test [-w]\n"
+           "-w          write output into files\n");
+}
+
+int main(int argc, char **argv)
+{
+    int c;
+    uint8_t header[HASH_SIZE];
+    uint8_t content[HASH_SIZE];
+    int empty_moov_pos;
+    int prev_pos;
+
+    for (;;) {
+        c = getopt(argc, argv, "wh");
+        if (c == -1)
+            break;
+        switch (c) {
+        case 'w':
+            write_file = 1;
+            break;
+        default:
+        case 'h':
+            help();
+            return 0;
+        }
+    }
+
+    av_register_all();
+
+    md5 = av_md5_alloc();
+    if (!md5)
+        return 1;
+
+    // Write a fragmented file with an initial moov that actually contains some
+    // samples. One moov+mdat with 1 second of data and one moof+mdat with 1
+    // second of data.
+    init_out("non-empty-moov");
+    av_dict_set(&opts, "movflags", "frag_keyframe", 0);
+    init(0, 0);
+    mux_gops(2);
+    finish();
+    close_out();
+
+    // Write a similar file, but with B-frames and audio preroll, handled
+    // via an edit list.
+    init_out("non-empty-moov-elst");
+    av_dict_set(&opts, "movflags", "frag_keyframe", 0);
+    av_dict_set(&opts, "use_editlist", "1", 0);
+    init(1, 1);
+    mux_gops(2);
+    finish();
+    close_out();
+
+    // Use B-frames but no audio-preroll, but without an edit list.
+    // Due to avoid_negative_ts == AVFMT_AVOID_NEG_TS_MAKE_ZERO, the dts
+    // of the first audio packet is > 0, but it is set to zero since edit
+    // lists aren't used, increasing the duration of the first packet instead.
+    init_out("non-empty-moov-no-elst");
+    av_dict_set(&opts, "movflags", "frag_keyframe", 0);
+    av_dict_set(&opts, "use_editlist", "0", 0);
+    init(1, 0);
+    mux_gops(2);
+    finish();
+    close_out();
+
+    format = "ismv";
+    // Write an ISMV, with B-frames and audio preroll.
+    init_out("ismv");
+    av_dict_set(&opts, "movflags", "frag_keyframe", 0);
+    init(1, 1);
+    mux_gops(2);
+    finish();
+    close_out();
+    format = "mp4";
+
+    // An initial moov that doesn't contain any samples, followed by two
+    // moof+mdat pairs.
+    init_out("empty-moov");
+    av_dict_set(&opts, "movflags", "frag_keyframe+empty_moov", 0);
+    av_dict_set(&opts, "use_editlist", "0", 0);
+    init(0, 0);
+    mux_gops(2);
+    finish();
+    close_out();
+    memcpy(content, hash, HASH_SIZE);
+
+    // Similar to the previous one, but with input that doesn't start at
+    // pts/dts 0. avoid_negative_ts behaves in the same way as
+    // in non-empty-moov-no-elst above.
+    init_out("empty-moov-no-elst");
+    av_dict_set(&opts, "movflags", "frag_keyframe+empty_moov", 0);
+    init(1, 0);
+    mux_gops(2);
+    finish();
+    close_out();
+
+    // Same as the previous one, but disable avoid_negative_ts (which
+    // would require using an edit list, but with empty_moov, one can't
+    // write a sensible edit list, when the start timestamps aren't known).
+    // This should trigger a warning - we check that the warning is produced.
+    init_count_warnings();
+    init_out("empty-moov-no-elst-no-adjust");
+    av_dict_set(&opts, "movflags", "frag_keyframe+empty_moov", 0);
+    av_dict_set(&opts, "avoid_negative_ts", "0", 0);
+    init(1, 0);
+    mux_gops(2);
+    finish();
+    close_out();
+
+    reset_count_warnings();
+    check(num_warnings > 0, "No warnings printed for unhandled start offset");
+
+    // Verify that delay_moov produces the same as empty_moov for
+    // simple input
+    init_out("delay-moov");
+    av_dict_set(&opts, "movflags", "frag_keyframe+delay_moov", 0);
+    av_dict_set(&opts, "use_editlist", "0", 0);
+    init(0, 0);
+    mux_gops(2);
+    finish();
+    close_out();
+    check(!memcmp(hash, content, HASH_SIZE), "delay_moov differs from empty_moov");
+
+    // Test writing content that requires an edit list using delay_moov
+    init_out("delay-moov-elst");
+    av_dict_set(&opts, "movflags", "frag_keyframe+delay_moov", 0);
+    init(1, 1);
+    mux_gops(2);
+    finish();
+    close_out();
+
+    // Test writing a file with one track lacking packets, with delay_moov.
+    skip_write_audio = 1;
+    init_out("delay-moov-empty-track");
+    av_dict_set(&opts, "movflags", "frag_keyframe+delay_moov", 0);
+    init(0, 0);
+    mux_gops(2);
+    // The automatic flushing shouldn't output anything, since we're still
+    // waiting for data for some tracks
+    check(out_size == 0, "delay_moov flushed prematurely");
+    // When closed (or manually flushed), all the written data should still
+    // be output.
+    finish();
+    close_out();
+    check(out_size > 0, "delay_moov didn't output anything");
+
+    // Check that manually flushing still outputs things as expected. This
+    // produces two fragments, while the one above produces only one.
+    init_out("delay-moov-empty-track-flush");
+    av_dict_set(&opts, "movflags", "frag_custom+delay_moov", 0);
+    init(0, 0);
+    mux_gops(1);
+    av_write_frame(ctx, NULL); // Force writing the moov
+    check(out_size > 0, "No moov written");
+    av_write_frame(ctx, NULL);
+    mux_gops(1);
+    av_write_frame(ctx, NULL);
+    finish();
+    close_out();
+
+    skip_write_audio = 0;
+
+
+
+    // Verify that the header written by delay_moov when manually flushed
+    // is identical to the one by empty_moov.
+    init_out("empty-moov-header");
+    av_dict_set(&opts, "movflags", "frag_keyframe+empty_moov", 0);
+    av_dict_set(&opts, "use_editlist", "0", 0);
+    init(0, 0);
+    close_out();
+    memcpy(header, hash, HASH_SIZE);
+    init_out("empty-moov-content");
+    mux_gops(2);
+    // Written 2 seconds of content, with an automatic flush after 1 second.
+    check(out_size > 0, "No automatic flush?");
+    empty_moov_pos = prev_pos = out_size;
+    // Manually flush the second fragment
+    av_write_frame(ctx, NULL);
+    check(out_size > prev_pos, "No second fragment flushed?");
+    prev_pos = out_size;
+    // Check that an extra flush doesn't output any more data
+    av_write_frame(ctx, NULL);
+    check(out_size == prev_pos, "More data written?");
+    close_out();
+    memcpy(content, hash, HASH_SIZE);
+    // Ignore the trailer written here
+    finish();
+
+    init_out("delay-moov-header");
+    av_dict_set(&opts, "movflags", "frag_custom+delay_moov", 0);
+    av_dict_set(&opts, "use_editlist", "0", 0);
+    init(0, 0);
+    check(out_size == 0, "Output written during init with delay_moov");
+    mux_gops(1); // Write 1 second of content
+    av_write_frame(ctx, NULL); // Force writing the moov
+    close_out();
+    check(!memcmp(hash, header, HASH_SIZE), "delay_moov header differs from empty_moov");
+    init_out("delay-moov-content");
+    av_write_frame(ctx, NULL); // Flush the first fragment
+    check(out_size == empty_moov_pos, "Manually flushed content differs from automatically flushed, %d vs %d", out_size, empty_moov_pos);
+    mux_gops(1); // Write the rest of the content
+    av_write_frame(ctx, NULL); // Flush the second fragment
+    close_out();
+    check(!memcmp(hash, content, HASH_SIZE), "delay_moov content differs from empty_moov");
+    finish();
+
+
+    // Verify that we can produce an identical second fragment without
+    // writing the first one. First write the reference fragments that
+    // we want to reproduce.
+    av_dict_set(&opts, "movflags", "frag_custom+empty_moov+dash", 0);
+    init(0, 0);
+    mux_gops(1);
+    av_write_frame(ctx, NULL); // Output the first fragment
+    init_out("empty-moov-second-frag");
+    mux_gops(1);
+    av_write_frame(ctx, NULL); // Output the second fragment
+    close_out();
+    memcpy(content, hash, HASH_SIZE);
+    finish();
+
+    // Produce the same second fragment without actually writing the first
+    // one before.
+    av_dict_set(&opts, "movflags", "frag_custom+empty_moov+dash+frag_discont", 0);
+    av_dict_set(&opts, "fragment_index", "2", 0);
+    av_dict_set(&opts, "avoid_negative_ts", "0", 0);
+    av_dict_set(&opts, "use_editlist", "0", 0);
+    init(0, 0);
+    skip_gops(1);
+    init_out("empty-moov-second-frag-discont");
+    mux_gops(1);
+    av_write_frame(ctx, NULL); // Output the second fragment
+    close_out();
+    check(!memcmp(hash, content, HASH_SIZE), "discontinuously written fragment differs");
+    finish();
+
+    // Produce the same thing by using delay_moov, which requires a slightly
+    // different call sequence.
+    av_dict_set(&opts, "movflags", "frag_custom+delay_moov+dash+frag_discont", 0);
+    av_dict_set(&opts, "fragment_index", "2", 0);
+    init(0, 0);
+    skip_gops(1);
+    mux_gops(1);
+    av_write_frame(ctx, NULL); // Output the moov
+    init_out("delay-moov-second-frag-discont");
+    av_write_frame(ctx, NULL); // Output the second fragment
+    close_out();
+    check(!memcmp(hash, content, HASH_SIZE), "discontinuously written fragment differs");
+    finish();
+
+
+    // Test discontinuously written fragments with B-frames (where the
+    // assumption of starting at pts=0 works) but not with audio preroll
+    // (which can't be guessed).
+    av_dict_set(&opts, "movflags", "frag_custom+delay_moov+dash", 0);
+    init(1, 0);
+    mux_gops(1);
+    init_out("delay-moov-elst-init");
+    av_write_frame(ctx, NULL); // Output the moov
+    close_out();
+    memcpy(header, hash, HASH_SIZE);
+    av_write_frame(ctx, NULL); // Output the first fragment
+    init_out("delay-moov-elst-second-frag");
+    mux_gops(1);
+    av_write_frame(ctx, NULL); // Output the second fragment
+    close_out();
+    memcpy(content, hash, HASH_SIZE);
+    finish();
+
+    av_dict_set(&opts, "movflags", "frag_custom+delay_moov+dash+frag_discont", 0);
+    av_dict_set(&opts, "fragment_index", "2", 0);
+    init(1, 0);
+    skip_gops(1);
+    mux_gops(1); // Write the second fragment
+    init_out("delay-moov-elst-init-discont");
+    av_write_frame(ctx, NULL); // Output the moov
+    close_out();
+    check(!memcmp(hash, header, HASH_SIZE), "discontinuously written header differs");
+    init_out("delay-moov-elst-second-frag-discont");
+    av_write_frame(ctx, NULL); // Output the second fragment
+    close_out();
+    check(!memcmp(hash, content, HASH_SIZE), "discontinuously written fragment differs");
+    finish();
+
+
+    // Test discontinuously written fragments with B-frames and audio preroll,
+    // properly signaled.
+    av_dict_set(&opts, "movflags", "frag_custom+delay_moov+dash", 0);
+    init(1, 1);
+    mux_gops(1);
+    init_out("delay-moov-elst-signal-init");
+    av_write_frame(ctx, NULL); // Output the moov
+    close_out();
+    memcpy(header, hash, HASH_SIZE);
+    av_write_frame(ctx, NULL); // Output the first fragment
+    init_out("delay-moov-elst-signal-second-frag");
+    mux_gops(1);
+    av_write_frame(ctx, NULL); // Output the second fragment
+    close_out();
+    memcpy(content, hash, HASH_SIZE);
+    finish();
+
+    av_dict_set(&opts, "movflags", "frag_custom+delay_moov+dash+frag_discont", 0);
+    av_dict_set(&opts, "fragment_index", "2", 0);
+    init(1, 1);
+    signal_init_ts();
+    skip_gops(1);
+    mux_gops(1); // Write the second fragment
+    init_out("delay-moov-elst-signal-init-discont");
+    av_write_frame(ctx, NULL); // Output the moov
+    close_out();
+    check(!memcmp(hash, header, HASH_SIZE), "discontinuously written header differs");
+    init_out("delay-moov-elst-signal-second-frag-discont");
+    av_write_frame(ctx, NULL); // Output the second fragment
+    close_out();
+    check(!memcmp(hash, content, HASH_SIZE), "discontinuously written fragment differs");
+    finish();
+
+
+    // Test VFR content, with sidx atoms (which declare the pts duration
+    // of a fragment, forcing overriding the start pts of the next one).
+    // Here, the fragment duration in pts is significantly different from
+    // the duration in dts. The video stream starts at dts=-10,pts=0, and
+    // the second fragment starts at dts=155,pts=156. The trun duration sum
+    // of the first fragment is 165, which also is written as
+    // baseMediaDecodeTime in the tfdt in the second fragment. The sidx for
+    // the first fragment says earliest_presentation_time = 0 and
+    // subsegment_duration = 156, which also matches the sidx in the second
+    // fragment. For the audio stream, the pts and dts durations also don't
+    // match - the input stream starts at pts=-2048, but that part is excluded
+    // by the edit list.
+    init_out("vfr");
+    av_dict_set(&opts, "movflags", "frag_keyframe+delay_moov+dash", 0);
+    init_fps(1, 1, 3);
+    mux_frames(gop_size/2);
+    duration /= 10;
+    mux_frames(gop_size/2);
+    mux_gops(1);
+    finish();
+    close_out();
+
+    // Test VFR content, with cleared duration fields. In these cases,
+    // the muxer must guess the duration of the last packet of each
+    // fragment. As long as the framerate doesn't vary (too much) at the
+    // fragment edge, it works just fine. Additionally, when automatically
+    // cutting fragments, the muxer already know the timestamps of the next
+    // packet for one stream (in most cases the video stream), avoiding
+    // having to use guesses for that one.
+    init_count_warnings();
+    clear_duration = 1;
+    init_out("vfr-noduration");
+    av_dict_set(&opts, "movflags", "frag_keyframe+delay_moov+dash", 0);
+    init_fps(1, 1, 3);
+    mux_frames(gop_size/2);
+    duration /= 10;
+    mux_frames(gop_size/2);
+    mux_gops(1);
+    finish();
+    close_out();
+    clear_duration = 0;
+    reset_count_warnings();
+    check(num_warnings > 0, "No warnings printed for filled in durations");
+
+    av_free(md5);
+
+    return check_faults > 0 ? 1 : 0;
+}
diff --git a/libavformat/tests/noproxy.c b/libavformat/tests/noproxy.c
new file mode 100644 (file)
index 0000000..782356c
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2013 Martin Storsjo
+ *
+ * This file is part of FFmpeg.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * 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 "libavformat/network.h"
+
+static void test(const char *pattern, const char *host)
+{
+    int res = ff_http_match_no_proxy(pattern, host);
+    printf("The pattern \"%s\" %s the hostname %s\n",
+           pattern ? pattern : "(null)", res ? "matches" : "does not match",
+           host);
+}
+
+int main(void)
+{
+    test(NULL, "domain.com");
+    test("example.com domain.com", "domain.com");
+    test("example.com other.com", "domain.com");
+    test("example.com,domain.com", "domain.com");
+    test("example.com,domain.com", "otherdomain.com");
+    test("example.com, *.domain.com", "sub.domain.com");
+    test("example.com, *.domain.com", "domain.com");
+    test("example.com, .domain.com", "domain.com");
+    test("*", "domain.com");
+    return 0;
+}
diff --git a/libavformat/tests/rtmpdh.c b/libavformat/tests/rtmpdh.c
new file mode 100644 (file)
index 0000000..929b3f3
--- /dev/null
@@ -0,0 +1,158 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * 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 "libavformat/rtmpdh.c"
+
+#include <stdio.h>
+
+static int test_random_shared_secret(void)
+{
+    FF_DH *peer1 = NULL, *peer2 = NULL;
+    int ret;
+    uint8_t pubkey1[128], pubkey2[128];
+    uint8_t sharedkey1[128], sharedkey2[128];
+
+    peer1 = ff_dh_init(1024);
+    peer2 = ff_dh_init(1024);
+    if (!peer1 || !peer2) {
+        ret = AVERROR(ENOMEM);
+        goto fail;
+    }
+    if ((ret = ff_dh_generate_public_key(peer1)) < 0)
+        goto fail;
+    if ((ret = ff_dh_generate_public_key(peer2)) < 0)
+        goto fail;
+    if ((ret = ff_dh_write_public_key(peer1, pubkey1, sizeof(pubkey1))) < 0)
+        goto fail;
+    if ((ret = ff_dh_write_public_key(peer2, pubkey2, sizeof(pubkey2))) < 0)
+        goto fail;
+    if ((ret = ff_dh_compute_shared_secret_key(peer1, pubkey2, sizeof(pubkey2),
+                                               sharedkey1, sizeof(sharedkey1))) < 0)
+        goto fail;
+    if ((ret = ff_dh_compute_shared_secret_key(peer2, pubkey1, sizeof(pubkey1),
+                                               sharedkey2, sizeof(sharedkey2))) < 0)
+        goto fail;
+    if (memcmp(sharedkey1, sharedkey2, sizeof(sharedkey1))) {
+        printf("Mismatched generated shared key\n");
+        ret = AVERROR_INVALIDDATA;
+    } else {
+        printf("Generated shared key ok\n");
+    }
+fail:
+    ff_dh_free(peer1);
+    ff_dh_free(peer2);
+    return ret;
+}
+
+static const char *private_key =
+    "976C18FCADC255B456564F74F3EEDA59D28AF6B744D743F2357BFD2404797EF896EF1A"
+    "7C1CBEAAA3AB60AF3192D189CFF3F991C9CBBFD78119FCA2181384B94011943B6D6F28"
+    "9E1B708E2D1A0C7771169293F03DA27E561F15F16F0AC9BC858C77A80FA98FD088A232"
+    "19D08BE6F165DE0B02034B18705829FAD0ACB26A5B75EF";
+static const char *public_key =
+    "F272ECF8362257C5D2C3CC2229CF9C0A03225BC109B1DBC76A68C394F256ACA3EF5F64"
+    "FC270C26382BF315C19E97A76104A716FC998A651E8610A3AE6CF65D8FAE5D3F32EEA0"
+    "0B32CB9609B494116A825D7142D17B88E3D20EDD98743DE29CF37A23A9F6A58B960591"
+    "3157D5965FCB46DDA73A1F08DD897BAE88DFE6FC937CBA";
+static const uint8_t public_key_bin[] = {
+    0xf2, 0x72, 0xec, 0xf8, 0x36, 0x22, 0x57, 0xc5, 0xd2, 0xc3, 0xcc, 0x22,
+    0x29, 0xcf, 0x9c, 0x0a, 0x03, 0x22, 0x5b, 0xc1, 0x09, 0xb1, 0xdb, 0xc7,
+    0x6a, 0x68, 0xc3, 0x94, 0xf2, 0x56, 0xac, 0xa3, 0xef, 0x5f, 0x64, 0xfc,
+    0x27, 0x0c, 0x26, 0x38, 0x2b, 0xf3, 0x15, 0xc1, 0x9e, 0x97, 0xa7, 0x61,
+    0x04, 0xa7, 0x16, 0xfc, 0x99, 0x8a, 0x65, 0x1e, 0x86, 0x10, 0xa3, 0xae,
+    0x6c, 0xf6, 0x5d, 0x8f, 0xae, 0x5d, 0x3f, 0x32, 0xee, 0xa0, 0x0b, 0x32,
+    0xcb, 0x96, 0x09, 0xb4, 0x94, 0x11, 0x6a, 0x82, 0x5d, 0x71, 0x42, 0xd1,
+    0x7b, 0x88, 0xe3, 0xd2, 0x0e, 0xdd, 0x98, 0x74, 0x3d, 0xe2, 0x9c, 0xf3,
+    0x7a, 0x23, 0xa9, 0xf6, 0xa5, 0x8b, 0x96, 0x05, 0x91, 0x31, 0x57, 0xd5,
+    0x96, 0x5f, 0xcb, 0x46, 0xdd, 0xa7, 0x3a, 0x1f, 0x08, 0xdd, 0x89, 0x7b,
+    0xae, 0x88, 0xdf, 0xe6, 0xfc, 0x93, 0x7c, 0xba
+};
+static const uint8_t peer_public_key[] = {
+    0x58, 0x66, 0x05, 0x49, 0x94, 0x23, 0x2b, 0x66, 0x52, 0x13, 0xff, 0x46,
+    0xf2, 0xb3, 0x79, 0xa9, 0xee, 0xae, 0x1a, 0x13, 0xf0, 0x71, 0x52, 0xfb,
+    0x93, 0x4e, 0xee, 0x97, 0x05, 0x73, 0x50, 0x7d, 0xaf, 0x02, 0x07, 0x72,
+    0xac, 0xdc, 0xa3, 0x95, 0x78, 0xee, 0x9a, 0x19, 0x71, 0x7e, 0x99, 0x9f,
+    0x2a, 0xd4, 0xb3, 0xe2, 0x0c, 0x1d, 0x1a, 0x78, 0x4c, 0xde, 0xf1, 0xad,
+    0xb4, 0x60, 0xa8, 0x51, 0xac, 0x71, 0xec, 0x86, 0x70, 0xa2, 0x63, 0x36,
+    0x92, 0x7c, 0xe3, 0x87, 0xee, 0xe4, 0xf1, 0x62, 0x24, 0x74, 0xb4, 0x04,
+    0xfa, 0x5c, 0xdf, 0xba, 0xfa, 0xa3, 0xc2, 0xbb, 0x62, 0x27, 0xd0, 0xf4,
+    0xe4, 0x43, 0xda, 0x8a, 0x88, 0x69, 0x60, 0xe2, 0xdb, 0x75, 0x2a, 0x98,
+    0x9d, 0xb5, 0x50, 0xe3, 0x99, 0xda, 0xe0, 0xa6, 0x14, 0xc9, 0x80, 0x12,
+    0xf9, 0x3c, 0xac, 0x06, 0x02, 0x7a, 0xde, 0x74
+};
+static const uint8_t shared_secret[] = {
+    0xb2, 0xeb, 0xcb, 0x71, 0xf3, 0x61, 0xfb, 0x5b, 0x4e, 0x5c, 0x4c, 0xcf,
+    0x5c, 0x08, 0x5f, 0x96, 0x26, 0x77, 0x1d, 0x31, 0xf1, 0xe1, 0xf7, 0x4b,
+    0x92, 0xac, 0x82, 0x2a, 0x88, 0xc7, 0x83, 0xe1, 0xc7, 0xf3, 0xd3, 0x1a,
+    0x7d, 0xc8, 0x31, 0xe3, 0x97, 0xe4, 0xec, 0x31, 0x0e, 0x8f, 0x73, 0x1a,
+    0xe4, 0xf6, 0xd8, 0xc8, 0x94, 0xff, 0xa0, 0x03, 0x84, 0x03, 0x0f, 0xa5,
+    0x30, 0x5d, 0x67, 0xe0, 0x7a, 0x3b, 0x5f, 0xed, 0x4c, 0xf5, 0xbc, 0x18,
+    0xea, 0xd4, 0x77, 0xa9, 0x07, 0xb3, 0x54, 0x0b, 0x02, 0xd9, 0xc6, 0xb8,
+    0x66, 0x5e, 0xec, 0xa4, 0xcd, 0x47, 0xed, 0xc9, 0x38, 0xc6, 0x91, 0x08,
+    0xf3, 0x85, 0x9b, 0x69, 0x16, 0x78, 0x0d, 0xb7, 0x74, 0x51, 0xaa, 0x5b,
+    0x4d, 0x74, 0xe4, 0x29, 0x2e, 0x9e, 0x8e, 0xf7, 0xe5, 0x42, 0x83, 0xb0,
+    0x65, 0xb0, 0xce, 0xc6, 0xb2, 0x8f, 0x5b, 0xb0
+};
+
+static int test_ref_data(void)
+{
+    FF_DH *dh;
+    int ret = AVERROR(ENOMEM);
+    uint8_t pubkey_test[128];
+    uint8_t sharedkey_test[128];
+
+    dh = ff_dh_init(1024);
+    if (!dh)
+        goto fail;
+    bn_hex2bn(dh->priv_key, private_key, ret);
+    if (!ret)
+        goto fail;
+    bn_hex2bn(dh->pub_key, public_key, ret);
+    if (!ret)
+        goto fail;
+    if ((ret = ff_dh_write_public_key(dh, pubkey_test, sizeof(pubkey_test))) < 0)
+        goto fail;
+    if (memcmp(pubkey_test, public_key_bin, sizeof(pubkey_test))) {
+        printf("Mismatched generated public key\n");
+        ret = AVERROR_INVALIDDATA;
+        goto fail;
+    } else {
+        printf("Generated public key ok\n");
+    }
+    if ((ret = ff_dh_compute_shared_secret_key(dh, peer_public_key, sizeof(peer_public_key),
+                                               sharedkey_test, sizeof(sharedkey_test))) < 0)
+        goto fail;
+    if (memcmp(shared_secret, sharedkey_test, sizeof(sharedkey_test))) {
+        printf("Mismatched generated shared key\n");
+        ret = AVERROR_INVALIDDATA;
+    } else {
+        printf("Generated shared key ok\n");
+    }
+fail:
+    ff_dh_free(dh);
+    return ret;
+}
+
+int main(void)
+{
+    if (test_random_shared_secret() < 0)
+        return 1;
+    if (test_ref_data() < 0)
+        return 1;
+    return 0;
+}
diff --git a/libavformat/tests/seek.c b/libavformat/tests/seek.c
new file mode 100644 (file)
index 0000000..7ed56ba
--- /dev/null
@@ -0,0 +1,161 @@
+/*
+ * Copyright (c) 2003 Fabrice Bellard
+ * Copyright (c) 2007 Michael Niedermayer
+ *
+ * This file is part of FFmpeg.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * 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 <stdint.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "libavutil/common.h"
+#include "libavutil/mathematics.h"
+
+#include "libavformat/avformat.h"
+
+static char buffer[20];
+
+static const char *ret_str(int v)
+{
+    switch (v) {
+    case AVERROR_EOF:     return "-EOF";
+    case AVERROR(EIO):    return "-EIO";
+    case AVERROR(ENOMEM): return "-ENOMEM";
+    case AVERROR(EINVAL): return "-EINVAL";
+    default:
+        snprintf(buffer, sizeof(buffer), "%2d", v);
+        return buffer;
+    }
+}
+
+static void ts_str(char buffer[60], int64_t ts, AVRational base)
+{
+    if (ts == AV_NOPTS_VALUE) {
+        strcpy(buffer, " NOPTS   ");
+        return;
+    }
+    ts= av_rescale_q(ts, base, (AVRational){1, 1000000});
+    snprintf(buffer, 60, "%c%"PRId64".%06"PRId64"", ts<0 ? '-' : ' ', FFABS(ts)/1000000, FFABS(ts)%1000000);
+}
+
+int main(int argc, char **argv)
+{
+    const char *filename;
+    AVFormatContext *ic = avformat_alloc_context();
+    int i, ret, stream_id;
+    int j;
+    int64_t timestamp;
+    AVDictionary *format_opts = NULL;
+    int64_t seekfirst = AV_NOPTS_VALUE;
+    int firstback=0;
+    int frame_count = 1;
+    int duration = 4;
+
+    for(i=2; i<argc; i+=2){
+        if       (!strcmp(argv[i], "-seekforw")){
+            seekfirst = atoi(argv[i+1]);
+        } else if(!strcmp(argv[i], "-seekback")){
+            seekfirst = atoi(argv[i+1]);
+            firstback = 1;
+        } else if(!strcmp(argv[i], "-frames")){
+            frame_count = atoi(argv[i+1]);
+        } else if(!strcmp(argv[i], "-duration")){
+            duration = atoi(argv[i+1]);
+        } else if(!strcmp(argv[i], "-fastseek")) {
+            if (atoi(argv[i+1])) {
+                ic->flags |= AVFMT_FLAG_FAST_SEEK;
+            }
+        } else if(argv[i][0] == '-' && argv[i+1]) {
+            av_dict_set(&format_opts, argv[i] + 1, argv[i+1], 0);
+        } else {
+            argc = 1;
+        }
+    }
+
+    av_dict_set(&format_opts, "channels", "1", 0);
+    av_dict_set(&format_opts, "sample_rate", "22050", 0);
+
+    /* initialize libavcodec, and register all codecs and formats */
+    av_register_all();
+
+    if (argc < 2) {
+        printf("usage: %s input_file\n"
+               "\n", argv[0]);
+        return 1;
+    }
+
+    filename = argv[1];
+
+    ret = avformat_open_input(&ic, filename, NULL, &format_opts);
+    av_dict_free(&format_opts);
+    if (ret < 0) {
+        fprintf(stderr, "cannot open %s\n", filename);
+        return 1;
+    }
+
+    ret = avformat_find_stream_info(ic, NULL);
+    if (ret < 0) {
+        fprintf(stderr, "%s: could not find codec parameters\n", filename);
+        return 1;
+    }
+
+    if(seekfirst != AV_NOPTS_VALUE){
+        if(firstback)   avformat_seek_file(ic, -1, INT64_MIN, seekfirst, seekfirst, 0);
+        else            avformat_seek_file(ic, -1, seekfirst, seekfirst, INT64_MAX, 0);
+    }
+    for(i=0; ; i++){
+        AVPacket pkt = { 0 };
+        AVStream *av_uninit(st);
+        char ts_buf[60];
+
+        if(ret>=0){
+            for(j=0; j<frame_count; j++) {
+            ret= av_read_frame(ic, &pkt);
+            if(ret>=0){
+                char dts_buf[60];
+                st= ic->streams[pkt.stream_index];
+                ts_str(dts_buf, pkt.dts, st->time_base);
+                ts_str(ts_buf,  pkt.pts, st->time_base);
+                printf("ret:%-10s st:%2d flags:%d dts:%s pts:%s pos:%7" PRId64 " size:%6d", ret_str(ret), pkt.stream_index, pkt.flags, dts_buf, ts_buf, pkt.pos, pkt.size);
+                av_packet_unref(&pkt);
+            } else
+                printf("ret:%s", ret_str(ret)); // necessary to avoid trailing whitespace
+            printf("\n");
+            }
+        }
+
+        if(i>25) break;
+
+        stream_id= (i>>1)%(ic->nb_streams+1) - 1;
+        timestamp= (i*19362894167LL) % (duration*AV_TIME_BASE) - AV_TIME_BASE;
+        if(stream_id>=0){
+            st= ic->streams[stream_id];
+            timestamp= av_rescale_q(timestamp, AV_TIME_BASE_Q, st->time_base);
+        }
+        //FIXME fully test the new seek API
+        if(i&1) ret = avformat_seek_file(ic, stream_id, INT64_MIN, timestamp, timestamp, 0);
+        else    ret = avformat_seek_file(ic, stream_id, timestamp, timestamp, INT64_MAX, 0);
+        ts_str(ts_buf, timestamp, stream_id < 0 ? AV_TIME_BASE_Q : st->time_base);
+        printf("ret:%-10s st:%2d flags:%d  ts:%s\n", ret_str(ret), stream_id, i&1, ts_buf);
+    }
+
+    avformat_close_input(&ic);
+
+    return 0;
+}
diff --git a/libavformat/tests/srtp.c b/libavformat/tests/srtp.c
new file mode 100644 (file)
index 0000000..89450ce
--- /dev/null
@@ -0,0 +1,167 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * 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 <stdint.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "libavformat/rtpdec.h"
+#include "libavformat/srtp.h"
+
+static const char *aes128_80_key = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmn";
+
+static const uint8_t rtp_aes128_80[] = {
+    // RTP header
+    0x80, 0xe0, 0x12, 0x34, 0x12, 0x34, 0x56, 0x78, 0x12, 0x34, 0x56, 0x78,
+    // encrypted payload
+    0x62, 0x69, 0x76, 0xca, 0xc5,
+    // HMAC
+    0xa1, 0xac, 0x1b, 0xb4, 0xa0, 0x1c, 0xd5, 0x49, 0x28, 0x99,
+};
+
+static const uint8_t rtcp_aes128_80[] = {
+    // RTCP header
+    0x81, 0xc9, 0x00, 0x07, 0x12, 0x34, 0x56, 0x78,
+    // encrypted payload
+    0x8a, 0xac, 0xdc, 0xa5, 0x4c, 0xf6, 0x78, 0xa6, 0x62, 0x8f, 0x24, 0xda,
+    0x6c, 0x09, 0x3f, 0xa9, 0x28, 0x7a, 0xb5, 0x7f, 0x1f, 0x0f, 0xc9, 0x35,
+    // RTCP index
+    0x80, 0x00, 0x00, 0x03,
+    // HMAC
+    0xe9, 0x3b, 0xc0, 0x5c, 0x0c, 0x06, 0x9f, 0xab, 0xc0, 0xde,
+};
+
+static const char *aes128_32_key = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmn";
+
+static const uint8_t rtp_aes128_32[] = {
+    // RTP header
+    0x80, 0xe0, 0x12, 0x34, 0x12, 0x34, 0x56, 0x78, 0x12, 0x34, 0x56, 0x78,
+    // encrypted payload
+    0x62, 0x69, 0x76, 0xca, 0xc5,
+    // HMAC
+    0xa1, 0xac, 0x1b, 0xb4,
+};
+
+static const uint8_t rtcp_aes128_32[] = {
+    // RTCP header
+    0x81, 0xc9, 0x00, 0x07, 0x12, 0x34, 0x56, 0x78,
+    // encrypted payload
+    0x35, 0xe9, 0xb5, 0xff, 0x0d, 0xd1, 0xde, 0x70, 0x74, 0x10, 0xaa, 0x1b,
+    0xb2, 0x8d, 0xf0, 0x20, 0x02, 0x99, 0x6b, 0x1b, 0x0b, 0xd0, 0x47, 0x34,
+    // RTCP index
+    0x80, 0x00, 0x00, 0x04,
+    // HMAC
+    0x5b, 0xd2, 0xa9, 0x9d,
+};
+
+static const char *aes128_80_32_key = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmn";
+
+static const uint8_t rtp_aes128_80_32[] = {
+    // RTP header
+    0x80, 0xe0, 0x12, 0x34, 0x12, 0x34, 0x56, 0x78, 0x12, 0x34, 0x56, 0x78,
+    // encrypted payload
+    0x62, 0x69, 0x76, 0xca, 0xc5,
+    // HMAC
+    0xa1, 0xac, 0x1b, 0xb4,
+};
+
+static const uint8_t rtcp_aes128_80_32[] = {
+    // RTCP header
+    0x81, 0xc9, 0x00, 0x07, 0x12, 0x34, 0x56, 0x78,
+    // encrypted payload
+    0xd6, 0xae, 0xc1, 0x58, 0x63, 0x70, 0xc9, 0x88, 0x66, 0x26, 0x1c, 0x53,
+    0xff, 0x5d, 0x5d, 0x2b, 0x0f, 0x8c, 0x72, 0x3e, 0xc9, 0x1d, 0x43, 0xf9,
+    // RTCP index
+    0x80, 0x00, 0x00, 0x05,
+    // HMAC
+    0x09, 0x16, 0xb4, 0x27, 0x9a, 0xe9, 0x92, 0x26, 0x4e, 0x10,
+};
+
+static void print_data(const uint8_t *buf, int len)
+{
+    int i;
+    for (i = 0; i < len; i++)
+        printf("%02x", buf[i]);
+    printf("\n");
+}
+
+static int test_decrypt(struct SRTPContext *srtp, const uint8_t *in, int len,
+                        uint8_t *out)
+{
+    memcpy(out, in, len);
+    if (!ff_srtp_decrypt(srtp, out, &len)) {
+        print_data(out, len);
+        return len;
+    } else
+        return -1;
+}
+
+static void test_encrypt(const uint8_t *data, int in_len, const char *suite,
+                         const char *key)
+{
+    struct SRTPContext enc = { 0 }, dec = { 0 };
+    int len;
+    char buf[RTP_MAX_PACKET_LENGTH];
+    ff_srtp_set_crypto(&enc, suite, key);
+    ff_srtp_set_crypto(&dec, suite, key);
+    len = ff_srtp_encrypt(&enc, data, in_len, buf, sizeof(buf));
+    if (!ff_srtp_decrypt(&dec, buf, &len)) {
+        if (len == in_len && !memcmp(buf, data, len))
+            printf("Decrypted content matches input\n");
+        else
+            printf("Decrypted content doesn't match input\n");
+    } else {
+        printf("Decryption failed\n");
+    }
+    ff_srtp_free(&enc);
+    ff_srtp_free(&dec);
+}
+
+int main(void)
+{
+    static const char *aes128_80_suite = "AES_CM_128_HMAC_SHA1_80";
+    static const char *aes128_32_suite = "AES_CM_128_HMAC_SHA1_32";
+    static const char *aes128_80_32_suite = "SRTP_AES128_CM_HMAC_SHA1_32";
+    static const char *test_key = "abcdefghijklmnopqrstuvwxyz1234567890ABCD";
+    uint8_t buf[RTP_MAX_PACKET_LENGTH];
+    struct SRTPContext srtp = { 0 };
+    int len;
+    ff_srtp_set_crypto(&srtp, aes128_80_suite, aes128_80_key);
+    len = test_decrypt(&srtp, rtp_aes128_80, sizeof(rtp_aes128_80), buf);
+    test_encrypt(buf, len, aes128_80_suite, test_key);
+    test_encrypt(buf, len, aes128_32_suite, test_key);
+    test_encrypt(buf, len, aes128_80_32_suite, test_key);
+    test_decrypt(&srtp, rtcp_aes128_80, sizeof(rtcp_aes128_80), buf);
+    test_encrypt(buf, len, aes128_80_suite, test_key);
+    test_encrypt(buf, len, aes128_32_suite, test_key);
+    test_encrypt(buf, len, aes128_80_32_suite, test_key);
+    ff_srtp_free(&srtp);
+
+    memset(&srtp, 0, sizeof(srtp)); // Clear the context
+    ff_srtp_set_crypto(&srtp, aes128_32_suite, aes128_32_key);
+    test_decrypt(&srtp, rtp_aes128_32, sizeof(rtp_aes128_32), buf);
+    test_decrypt(&srtp, rtcp_aes128_32, sizeof(rtcp_aes128_32), buf);
+    ff_srtp_free(&srtp);
+
+    memset(&srtp, 0, sizeof(srtp)); // Clear the context
+    ff_srtp_set_crypto(&srtp, aes128_80_32_suite, aes128_80_32_key);
+    test_decrypt(&srtp, rtp_aes128_80_32, sizeof(rtp_aes128_80_32), buf);
+    test_decrypt(&srtp, rtcp_aes128_80_32, sizeof(rtcp_aes128_80_32), buf);
+    ff_srtp_free(&srtp);
+    return 0;
+}
diff --git a/libavformat/tests/url.c b/libavformat/tests/url.c
new file mode 100644 (file)
index 0000000..1623179
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2012 Martin Storsjo
+ *
+ * This file is part of FFmpeg.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * 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 "libavformat/url.h"
+
+static void test(const char *base, const char *rel)
+{
+    char buf[200], buf2[200];
+    ff_make_absolute_url(buf, sizeof(buf), base, rel);
+    printf("%s\n", buf);
+    if (base) {
+        /* Test in-buffer replacement */
+        snprintf(buf2, sizeof(buf2), "%s", base);
+        ff_make_absolute_url(buf2, sizeof(buf2), buf2, rel);
+        if (strcmp(buf, buf2)) {
+            printf("In-place handling of %s + %s failed\n", base, rel);
+            exit(1);
+        }
+    }
+}
+
+int main(void)
+{
+    test(NULL, "baz");
+    test("/foo/bar", "baz");
+    test("/foo/bar", "../baz");
+    test("/foo/bar", "/baz");
+    test("http://server/foo/", "baz");
+    test("http://server/foo/bar", "baz");
+    test("http://server/foo/", "../baz");
+    test("http://server/foo/bar/123", "../../baz");
+    test("http://server/foo/bar/123", "/baz");
+    test("http://server/foo/bar/123", "https://other/url");
+    test("http://server/foo/bar?param=value/with/slashes", "/baz");
+    test("http://server/foo/bar?param&otherparam", "?someparam");
+    test("http://server/foo/bar", "//other/url");
+    return 0;
+}
diff --git a/libavformat/url-test.c b/libavformat/url-test.c
deleted file mode 100644 (file)
index a1da82e..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (c) 2012 Martin Storsjo
- *
- * This file is part of FFmpeg.
- *
- * 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
- * Lesser General Public License for more details.
- *
- * 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 "url.h"
-
-static void test(const char *base, const char *rel)
-{
-    char buf[200], buf2[200];
-    ff_make_absolute_url(buf, sizeof(buf), base, rel);
-    printf("%s\n", buf);
-    if (base) {
-        /* Test in-buffer replacement */
-        snprintf(buf2, sizeof(buf2), "%s", base);
-        ff_make_absolute_url(buf2, sizeof(buf2), buf2, rel);
-        if (strcmp(buf, buf2)) {
-            printf("In-place handling of %s + %s failed\n", base, rel);
-            exit(1);
-        }
-    }
-}
-
-int main(void)
-{
-    test(NULL, "baz");
-    test("/foo/bar", "baz");
-    test("/foo/bar", "../baz");
-    test("/foo/bar", "/baz");
-    test("http://server/foo/", "baz");
-    test("http://server/foo/bar", "baz");
-    test("http://server/foo/", "../baz");
-    test("http://server/foo/bar/123", "../../baz");
-    test("http://server/foo/bar/123", "/baz");
-    test("http://server/foo/bar/123", "https://other/url");
-    test("http://server/foo/bar?param=value/with/slashes", "/baz");
-    test("http://server/foo/bar?param&otherparam", "?someparam");
-    test("http://server/foo/bar", "//other/url");
-    return 0;
-}
diff --git a/libavresample/avresample-test.c b/libavresample/avresample-test.c
deleted file mode 100644 (file)
index 290ae94..0000000
+++ /dev/null
@@ -1,341 +0,0 @@
-/*
- * Copyright (c) 2002 Fabrice Bellard
- * Copyright (c) 2012 Justin Ruggles <justin.ruggles@gmail.com>
- *
- * This file is part of FFmpeg.
- *
- * FFmpeg is free software; you can redistribute it and/or
- * mod