From eba9ae3cfcfb924e2dd6e6c45838e73181bd1430 Mon Sep 17 00:00:00 2001 From: Gildas Bazin Date: Tue, 28 Jun 2005 22:46:36 +0000 Subject: [PATCH] IWMMXT configure support + runtime selection patch by (Gildas Bazin, gbazin : altern org) Originally committed as revision 4409 to svn://svn.ffmpeg.org/ffmpeg/trunk --- configure | 35 ++++++++++++++++++++++++---- libavcodec/armv4l/dsputil_arm.c | 2 -- libavcodec/armv4l/dsputil_iwmmxt.c | 18 ++++++++++++++ libavcodec/armv4l/mpegvideo_iwmmxt.c | 2 ++ libavcodec/avcodec.h | 7 ++++-- libavcodec/dsputil.h | 4 ++++ 6 files changed, 59 insertions(+), 9 deletions(-) diff --git a/configure b/configure index a479dee9fe..ae2aef4fe2 100755 --- a/configure +++ b/configure @@ -53,6 +53,7 @@ echo " --cpu=CPU force cpu to CPU [$cpu]" echo " --tune=PROCESSOR tune code for a particular CPU (may fails or misperforms on other CPUs)" echo " --powerpc-perf-enable enable performance report on PPC (requires enabling PMC)" echo " --disable-mmx disable mmx usage" +echo " --disable-iwmmxt disable iwmmxt usage" echo " --disable-altivec disable AltiVec usage" echo " --disable-audio-oss disable OSS audio support [default=no]" echo " --disable-audio-beos disable BeOS audio support [default=no]" @@ -112,6 +113,7 @@ cpu=`uname -m` tune="generic" powerpc_perf="no" mmx="default" +iwmmxt="default" altivec="default" mmi="default" case "$cpu" in @@ -403,9 +405,9 @@ CODEC_LIST=`grep 'register_avcodec(&[a-z]' $source_path/libavcodec/allcodecs.c for opt do case "$opt" in - --prefix=*) prefix=`echo $opt | cut -d '=' -f 2` + --prefix=*) prefix=`echo $opt | cut -d '=' -f 2`; force_prefix=yes ;; - --libdir=*) libdir=`echo $opt | cut -d '=' -f 2` + --libdir=*) libdir=`echo $opt | cut -d '=' -f 2`; force_libdir=yes ;; --mandir=*) mandir=`echo $opt | cut -d '=' -f 2` ;; @@ -413,7 +415,7 @@ for opt do ;; --cross-prefix=*) cross_prefix=`echo $opt | cut -d '=' -f 2` ;; - --cc=*) cc=`echo $opt | cut -d '=' -f 2` + --cc=*) cc=`echo $opt | cut -d '=' -f 2-` ;; --make=*) make=`echo $opt | cut -d '=' -f 2` ;; @@ -433,6 +435,8 @@ for opt do ;; --disable-mmx) mmx="no" ;; + --disable-iwmmxt) iwmmxt="no" + ;; --disable-altivec) altivec="no" ;; --enable-gprof) gprof="yes" @@ -614,6 +618,20 @@ if test $mmx = "default"; then fi fi +# check iwmmxt support +if test $iwmmxt = "default" -a $cpu = "armv4l"; then + cat > $TMPC << EOF + int main(void) { + __asm__ __volatile__ ("wunpckelub wr6, wr4"); + } +EOF + + iwmmxt=no + if ${cross_prefix}${cc} -o $TMPO $TMPC 2> /dev/null ; then + iwmmxt=yes + fi +fi + #Darwin CC versions needmdynamicnopic="no" if test $targetos = Darwin; then @@ -792,8 +810,8 @@ if test "$mingw32" = "yes" ; then SLIBPREF="" SLIBSUF=".dll" EXESUF=".exe" - prefix="/c/Program Files/FFmpeg" - bindir="$prefix" + if test "$force_prefix" != yes; then prefix="/c/Program Files/FFmpeg"; fi + if test "$force_libdir" != yes; then bindir="$prefix"; fi fi cc="${cross_prefix}${cc}" @@ -1144,6 +1162,9 @@ if test $cpu = "x86" -o $cpu = "x86_64"; then echo "MMX enabled $mmx" echo "Vector Builtins $builtin_vector" fi +if test $cpu = "armv4l"; then +echo "IWMMXT enabled $iwmmxt" +fi if test $cpu = "mips"; then echo "MMI enabled $mmi" fi @@ -1299,6 +1320,10 @@ if test "$builtin_vector" = "yes" ; then echo "TARGET_BUILTIN_VECTOR=yes" >> config.mak echo "#define HAVE_BUILTIN_VECTOR 1" >> $TMPH fi +if test "$iwmmxt" = "yes" ; then + echo "TARGET_IWMMXT=yes" >> config.mak + echo "#define HAVE_IWMMXT 1" >> $TMPH +fi if test "$mmi" = "yes" ; then echo "TARGET_MMI=yes" >> config.mak echo "#define HAVE_MMI 1" >> $TMPH diff --git a/libavcodec/armv4l/dsputil_arm.c b/libavcodec/armv4l/dsputil_arm.c index 4ba6280963..0195c3ca6f 100644 --- a/libavcodec/armv4l/dsputil_arm.c +++ b/libavcodec/armv4l/dsputil_arm.c @@ -240,9 +240,7 @@ void dsputil_init_armv4l(DSPContext* c, AVCodecContext *avctx) c->put_no_rnd_pixels_tab[1][2] = put_no_rnd_pixels8_y2_arm; //OK /* c->put_no_rnd_pixels_tab[1][3] = put_no_rnd_pixels8_xy2_arm;//NG */ -#if 1 #ifdef HAVE_IWMMXT dsputil_init_iwmmxt(c, avctx); #endif -#endif } diff --git a/libavcodec/armv4l/dsputil_iwmmxt.c b/libavcodec/armv4l/dsputil_iwmmxt.c index 6e2465d7c8..99a55e7905 100644 --- a/libavcodec/armv4l/dsputil_iwmmxt.c +++ b/libavcodec/armv4l/dsputil_iwmmxt.c @@ -126,8 +126,26 @@ static void nop(uint8_t *block, const uint8_t *pixels, int line_size, int h) return; } +int mm_flags; /* multimedia extension flags */ + +int mm_support(void) +{ + return 0; /* TODO, implement proper detection */ +} + void dsputil_init_iwmmxt(DSPContext* c, AVCodecContext *avctx) { + mm_flags = mm_support(); + + if (avctx->dsp_mask) { + if (avctx->dsp_mask & FF_MM_FORCE) + mm_flags |= (avctx->dsp_mask & 0xffff); + else + mm_flags &= ~(avctx->dsp_mask & 0xffff); + } + + if (!(mm_flags & MM_IWMMXT)) return; + c->add_pixels_clamped = add_pixels_clamped_iwmmxt; c->put_pixels_tab[0][0] = put_pixels16_iwmmxt; diff --git a/libavcodec/armv4l/mpegvideo_iwmmxt.c b/libavcodec/armv4l/mpegvideo_iwmmxt.c index 0f4c99e3ac..9724de8c4c 100644 --- a/libavcodec/armv4l/mpegvideo_iwmmxt.c +++ b/libavcodec/armv4l/mpegvideo_iwmmxt.c @@ -90,6 +90,8 @@ static void dct_unquantize_h263_inter_iwmmxt(MpegEncContext *s, void MPV_common_init_iwmmxt(MpegEncContext *s) { + if (!(mm_flags & MM_IWMMXT)) return; + s->dct_unquantize_h263_intra = dct_unquantize_h263_intra_iwmmxt; #if 0 s->dct_unquantize_h263_inter = dct_unquantize_h263_inter_iwmmxt; diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 6f644f6493..c6ebbb190d 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -17,7 +17,7 @@ extern "C" { #define FFMPEG_VERSION_INT 0x000409 #define FFMPEG_VERSION "0.4.9-pre1" -#define LIBAVCODEC_BUILD 4756 +#define LIBAVCODEC_BUILD 4757 #define LIBAVCODEC_VERSION_INT FFMPEG_VERSION_INT #define LIBAVCODEC_VERSION FFMPEG_VERSION @@ -1193,7 +1193,7 @@ typedef struct AVCodecContext { #define FF_IDCT_SIMPLEARM 10 #define FF_IDCT_H264 11 #define FF_IDCT_VP3 12 -#define FP_IDCT_IPP 13 +#define FF_IDCT_IPP 13 /** * slice count. @@ -1236,6 +1236,9 @@ typedef struct AVCodecContext { #define FF_MM_SSE2 0x0010 /* PIV SSE2 functions */ #define FF_MM_3DNOWEXT 0x0020 /* AMD 3DNowExt */ #endif /* HAVE_MMX */ +#ifdef HAVE_IWMMXT +#define FF_MM_IWMMXT 0x0100 /* XScale IWMMXT */ +#endif /* HAVE_IWMMXT */ /** * bits per sample/pixel from the demuxer (needed for huffyuv). diff --git a/libavcodec/dsputil.h b/libavcodec/dsputil.h index b9de38648b..cad32660db 100644 --- a/libavcodec/dsputil.h +++ b/libavcodec/dsputil.h @@ -432,6 +432,10 @@ void dsputil_init_pix_mmx(DSPContext* c, AVCodecContext *avctx); #define __align8 __attribute__ ((aligned (4))) #define STRIDE_ALIGN 4 +#define MM_IWMMXT 0x0100 /* XScale IWMMXT */ + +extern int mm_flags; + void dsputil_init_armv4l(DSPContext* c, AVCodecContext *avctx); #elif defined(HAVE_MLIB)