diff --git a/configure b/configure
index 96f98aaa0b42eeb27f8db4428fd3a31ecdb6ae2f..d7069909bf86ee1a277be597e8f81a2c1d6e50fe 100755
--- a/configure
+++ b/configure
@@ -1,50 +1,41 @@
 #!/bin/sh
-
-TMPC="ffmpeg-conf-${RANDOM}-$$-${RANDOM}.c"
-TMPO="ffmpeg-conf-${RANDOM}-$$-${RANDOM}.o"
-TMPS="ffmpeg-conf-${RANDOM}-$$-${RANDOM}.S"
-TMPH="ffmpeg-conf-${RANDOM}-$$-${RANDOM}.h"
-
+#
+# ffmpeg configure script (c) 2000, 2001, 2002 Gerard Lantau
+#
+# set temporary file name
 if test ! -z "$TMPDIR" ; then
-	TMPC="${TMPDIR}/${TMPC}"
-	TMPCPP="${TMPDIR}/${TMPCPP}"
-	TMPO="${TMPDIR}/${TMPO}"
-	TMPS="${TMPDIR}/${TMPS}"
-	TMPH="${TMPDIR}/${TMPH}"
+    TMPDIR1="${TMPDIR}"
 elif test ! -z "$TEMPDIR" ; then
-	TMPC="${TEMPDIR}/${TMPC}"
-	TMPCPP="${TEMPDIR}/${TMPCPP}"
-	TMPO="${TEMPDIR}/${TMPO}"
-	TMPS="${TEMPDIR}/${TMPS}"
-	TMPH="${TEMPDIR}/${TMPH}"
+    TMPDIR1="${TEMPDIR}"
 else
-	TMPC="/tmp/${TMPC}"
-	TMPCPP="/tmp/${TMPCPP}"
-	TMPO="/tmp/${TMPO}"
-	TMPS="/tmp/${TMPS}"
-	TMPH="/tmp/${TMPH}"
+    TMPDIR1="/tmp"
 fi
 
+TMPC="${TMPDIR1}/ffmpeg-conf-${RANDOM}-$$-${RANDOM}.c"
+TMPO="${TMPDIR1}/ffmpeg-conf-${RANDOM}-$$-${RANDOM}.o"
+TMPS="${TMPDIR1}/ffmpeg-conf-${RANDOM}-$$-${RANDOM}.S"
+TMPH="${TMPDIR1}/ffmpeg-conf-${RANDOM}-$$-${RANDOM}.h"
+
 # default parameters
 prefix="/usr/local"
+cross_prefix=""
 cc="gcc"
 ar="ar"
+strip="strip"
 cpu=`uname -m`
+mmx="default"
 case "$cpu" in
   i386|i486|i586|i686|i86pc|BePC)
     cpu="x86"
-    mmx="yes"
   ;;
   armv4l)
     cpu="armv4l"
-    mmx="no"
   ;;
   alpha)
     cpu="alpha"
-    mmx="no"
   ;;
   *)
-    mmx="no"
+    cpu="unknown"
   ;;
 esac
 gprof="no"
@@ -55,6 +46,7 @@ win32="no"
 lshared="no"
 extralibs="-lm"
 simpleidct="yes"
+bigendian="no"
 
 # OS specific
 targetos=`uname -s`
@@ -75,34 +67,33 @@ fi ;;
 *) ;;
 esac
 
-if test "$1" = "-h" -o "$1" = "--help" ; then
-cat << EOF
-
-Usage: configure [options]
-Options: [defaults in brackets after descriptions]
-
-  --help                  print this message
-EOF
-echo "  --prefix=PREFIX         install in PREFIX [$prefix]"
-echo "  --cc=CC                 use C compiler CC [$cc]"
-echo "  --cpu=CPU               force cpu to CPU  [$cpu]"
-echo "  --disable-mmx           disable mmx usage"
-echo "  --enable-gprof          enable profiling with gprof [$gprof]"
-echo "  --disable-grab          disable audio/video grabbing code"
-echo "  --disable-simple_idct   disable simple IDCT routines [default=no]"
-echo "  --enable-mp3lame        enable mp3 encoding via libmp3lame [default=no]"
-echo "  --enable-win32          enable win32 cross compile"
-echo "  --enable-a52bin         open liba52.so.0 at runtime [default=no]"
-echo "  --enable-shared         build shared libraries [default=no]"
-exit 1
+# find source path
+# XXX: we assume an absolute path is given when launching configure, 
+# except in './configure' case.
+source_path=${0%configure}
+source_path=${source_path%/}
+source_path_used="yes"
+if test -z "$source_path" -o "$source_path" = "." ; then
+    source_path=`pwd`
+    source_path_used="no"
 fi
 
 for opt do
   case "$opt" in
   --prefix=*) prefix=`echo $opt | cut -d '=' -f 2`
   ;;
+  --source-path=*) source_path=`echo $opt | cut -d '=' -f 2`
+  ;;
+  --cross-prefix=*) cross_prefix=`echo $opt | cut -d '=' -f 2`
+  ;;
   --cc=*) cc=`echo $opt | cut -d '=' -f 2`
   ;;
+  --extra-cflags=*) CFLAGS="${opt#--extra-cflags=}"
+  ;;
+  --extra-ldflags=*) LDFLAGS=${opt#--extra-ldflags=}
+  ;;
+  --extra-libs=*) extralibs=${opt#--extra-libs=}
+  ;;
   --cpu=*) cpu=`echo $opt | cut -d '=' -f 2`
   ;;
   --disable-mmx) mmx="no"
@@ -124,6 +115,15 @@ for opt do
   esac
 done
 
+# compute mmx state
+if test $mmx = "default"; then
+    if test $cpu = "x86"; then
+        mmx="yes"
+    else
+        mmx="no"
+    fi
+fi
+
 # Checking for CFLAGS
 if test -z "$CFLAGS"; then
     CFLAGS="-O2"
@@ -131,11 +131,18 @@ fi
 
 if test "$win32" = "yes" ; then
     cross_prefix="i386-mingw32msvc-"
-    cc="${cross_prefix}gcc"
-    ar="${cross_prefix}ar"
     grab="no"
 fi
 
+# endianness : guess with cpu type. Should also use prefix
+if test "$cpu" = "powerpc"; then
+    bigendian="yes"
+fi
+
+cc="${cross_prefix}${cc}"
+ar="${cross_prefix}${ar}"
+strip="${cross_prefix}${strip}"
+
 # ---
 # check availability of some header files
 
@@ -161,9 +168,43 @@ EOF
 $cc -o $TMPO $TMPC 2> /dev/null || _memalign=no
 fi
 
+if test "$1" = "-h" -o "$1" = "--help" ; then
+cat << EOF
+
+Usage: configure [options]
+Options: [defaults in brackets after descriptions]
+
+EOF
+echo "Standard options:"
+echo "  --help                   print this message"
+echo "  --prefix=PREFIX          install in PREFIX [$prefix]"
+echo "  --disable-grab           disable audio/video grabbing code"
+echo "  --disable-simple_idct    disable simple IDCT routines [default=no]"
+echo "  --enable-mp3lame         enable mp3 encoding via libmp3lame [default=no]"
+echo "  --enable-win32           enable win32 cross compile"
+echo "  --enable-a52bin          open liba52.so.0 at runtime [default=no]"
+echo "  --enable-shared          build shared libraries [default=no]"
+echo ""
+echo "Advanced options (experts only):"
+echo "  --source-path=PATH       path of source code [$source_path]"
+echo "  --cross-prefix=PREFIX    use PREFIX for compile tools [$cross_prefix]"
+echo "  --cc=CC                  use C compiler CC [$cc]"
+echo "  --extra-cflags=ECFLAGS   add ECFLAGS to CFLAGS [$CFLAGS]"
+echo "  --extra-ldflags=ELDFLAGS add ELDFLAGS to LDFLAGS [$LDFLAGS]"
+echo "  --extra-libs=ELIBS       add ELIBS [$ELIBS]"
+echo "  --cpu=CPU                force cpu to CPU  [$cpu]"
+echo "  --disable-mmx            disable mmx usage"
+echo "  --enable-gprof           enable profiling with gprof [$gprof]"
+echo ""
+echo "NOTE: The object files are build at the place where configure is launched"
+exit 1
+fi
+
 echo "Install prefix   $prefix"
+echo "Source path      $source_path"
 echo "C compiler       $cc"
 echo "CPU              $cpu"
+echo "Big Endian       $bigendian"
 echo "MMX enabled      $mmx"
 echo "gprof enabled    $gprof"
 echo "grab enabled     $grab"
@@ -179,18 +220,25 @@ echo "prefix=$prefix" >> config.mak
 echo "MAKE=make" >> config.mak
 echo "CC=$cc" >> config.mak
 echo "AR=$ar" >> config.mak
+echo "STRIP=$strip" >> config.mak
 echo "OPTFLAGS=$CFLAGS" >> config.mak
+echo "LDFLAGS=$LDFLAGS" >> config.mak
 if test "$cpu" = "x86" ; then
   echo "TARGET_ARCH_X86=yes" >> config.mak
   echo "#define ARCH_X86 1" >> $TMPH
-fi
-if test "$cpu" = "armv4l" ; then
+elif test "$cpu" = "armv4l" ; then
   echo "TARGET_ARCH_ARMV4L=yes" >> config.mak
   echo "#define ARCH_ARMV4L 1" >> $TMPH
-fi
-if test "$cpu" = "alpha" ; then
+elif test "$cpu" = "alpha" ; then
   echo "TARGET_ARCH_ALPHA=yes" >> config.mak
   echo "#define ARCH_ALPHA 1" >> $TMPH
+elif test "$cpu" = "powerpc" ; then
+  echo "TARGET_ARCH_POWERPC=yes" >> config.mak
+  echo "#define ARCH_POWERPC 1" >> $TMPH
+fi
+if test "$bigendian" = "yes" ; then
+  echo "WORDS_BIGENDIAN=yes" >> config.mak
+  echo "#define WORDS_BIGENDIAN 1" >> $TMPH
 fi
 if test "$mmx" = "yes" ; then
   echo "TARGET_MMX=yes" >> config.mak
@@ -207,7 +255,7 @@ else
 fi
 echo "EXTRALIBS=$extralibs" >> config.mak
 echo -n "VERSION=" >>config.mak
-head VERSION >>config.mak
+head $source_path/VERSION >>config.mak
 echo "" >>config.mak
 # if you do not want to use encoders, disable that.
 echo "#define CONFIG_ENCODERS 1" >> $TMPH
@@ -260,6 +308,20 @@ if test "$simpleidct" = "yes" ; then
   echo "#define SIMPLE_IDCT 1" >> $TMPH
 fi
 
+# build tree in object directory if source path is different from current one
+if test "$source_path_used" = "yes" ; then
+    DIRS="libav libavcodec libavcodec/alpha libavcodec/armv4l libavcodec/i386 \
+          libavcodec/liba52 libavcodec/mlib tests"
+    FILES="Makefile libav/Makefile libavcodec/Makefile tests/Makefile"
+    for dir in $DIRS ; do
+            mkdir -p $dir
+    done
+    for f in $FILES ; do
+        ln -sf $source_path/$f $f
+    done
+fi
+echo "SRC_PATH=$source_path" >> config.mak
+
 diff $TMPH config.h >/dev/null 2>&1
 if test $? -ne 0 ; then
 	mv -f $TMPH config.h