Merge commit '28c8e288fa0342fdef532a7522a4707bebf831cc'
authorMichael Niedermayer <michaelni@gmx.at>
Sun, 25 Nov 2012 23:43:45 +0000 (00:43 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Sun, 25 Nov 2012 23:43:45 +0000 (00:43 +0100)
* commit '28c8e288fa0342fdef532a7522a4707bebf831cc':
  x86: h264_chromamc: port to cpuflags
  yop: fix typo
  avconv: fix copying per-stream metadata.
  doc: avtools-common-opts: Fix terminology concerning metric prefixes
  configure: suncc: Add compiler arch support for Nehalem & Sandy Bridge
  riff: Make ff_riff_tags static and move under appropriate #ifdef

Conflicts:
libavformat/riff.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
configure
doc/avtools-common-opts.texi
ffmpeg_opt.c
libavcodec/x86/h264_chromamc.asm
libavformat/riff.c

diff --combined configure
+++ b/configure
@@@ -1,6 -1,6 +1,6 @@@
  #!/bin/sh
  #
 -# Libav configure script
 +# FFmpeg configure script
  #
  # Copyright (c) 2000-2002 Fabrice Bellard
  # Copyright (c) 2005-2008 Diego Biurrun
@@@ -44,9 -44,9 +44,9 @@@ if test "$E1" != 0 || test "$E2" = 0; t
      echo "No compatible shell script interpreter found."
      echo "This configure script requires a POSIX-compatible shell"
      echo "such as bash or ksh."
 -    echo "THIS IS NOT A BUG IN LIBAV, DO NOT REPORT IT AS SUCH."
 +    echo "THIS IS NOT A BUG IN FFMPEG, DO NOT REPORT IT AS SUCH."
      echo "Instead, install a working POSIX-compatible shell."
 -    echo "Disabling this configure test will create a broken Libav."
 +    echo "Disabling this configure test will create a broken FFmpeg."
      if test "$BASH_VERSION" = '2.04.0(1)-release'; then
          echo "This bash version ($BASH_VERSION) is broken on your platform."
          echo "Upgrade to a later version if available."
@@@ -78,10 -78,9 +78,10 @@@ Help options
  Standard options:
    --logfile=FILE           log tests and output to FILE [config.log]
    --disable-logging        do not log configure debug information
 +  --fatal-warnings         fail if any configure warning is generated
    --prefix=PREFIX          install in PREFIX [$prefix]
    --bindir=DIR             install binaries in DIR [PREFIX/bin]
 -  --datadir=DIR            install data files in DIR [PREFIX/share/avconv]
 +  --datadir=DIR            install data files in DIR [PREFIX/share/ffmpeg]
    --libdir=DIR             install libs in DIR [PREFIX/lib]
    --shlibdir=DIR           install shared libs in DIR [PREFIX/lib]
    --incdir=DIR             install includes in DIR [PREFIX/include]
@@@ -98,36 -97,27 +98,36 @@@ Configuration options
    --disable-static         do not build static libraries [no]
    --enable-shared          build shared libraries [no]
    --enable-small           optimize for size instead of speed
 -  --enable-runtime-cpudetect detect cpu capabilities at runtime (bigger binary)
 +  --disable-runtime-cpudetect disable detecting cpu capabilities at runtime (smaller binary)
    --enable-gray            enable full grayscale support (slower color)
    --disable-swscale-alpha  disable alpha channel support in swscale
  
  Program options:
    --disable-programs       do not build command line programs
 -  --disable-avconv         disable avconv build
 -  --disable-avplay         disable avplay build
 -  --disable-avprobe        disable avprobe build
 -  --disable-avserver       disable avserver build
 +  --disable-ffmpeg         disable ffmpeg build
 +  --disable-ffplay         disable ffplay build
 +  --disable-ffprobe        disable ffprobe build
 +  --disable-ffserver       disable ffserver build
  
 -Component options:
 +Documentation options:
    --disable-doc            do not build documentation
 +  --disable-htmlpages      do not build HTML documentation pages
 +  --disable-manpages       do not build man documentation pages
 +  --disable-podpages       do not build POD documentation pages
 +  --disable-txtpages       do not build text documentation pages
 +
 +Component options:
    --disable-avdevice       disable libavdevice build
    --disable-avcodec        disable libavcodec build
    --disable-avformat       disable libavformat build
 +  --disable-swresample     disable libswresample build
    --disable-swscale        disable libswscale build
 -  --disable-avfilter       disable video filter support [no]
 -  --disable-avresample     disable libavresample build [no]
 +  --disable-postproc       disable libpostproc build
 +  --disable-avfilter       disable libavfilter build
 +  --enable-avresample      enable libavresample build [no]
    --disable-pthreads       disable pthreads [auto]
    --disable-w32threads     disable Win32 threads [auto]
 +  --disable-os2threads     disable OS/2 threads [auto]
    --enable-x11grab         enable X11 grabbing [no]
    --disable-network        disable network support [no]
    --disable-dct            disable DCT code
    --disable-rdft           disable RDFT code
    --disable-fft            disable FFT code
    --enable-dxva2           enable DXVA2 code
 -  --enable-vaapi           enable VAAPI code
 -  --enable-vda             enable VDA code
 -  --enable-vdpau           enable VDPAU code
 +  --enable-vaapi           enable VAAPI code [autodetect]
 +  --enable-vda             enable VDA code   [autodetect]
 +  --enable-vdpau           enable VDPAU code [autodetect]
  
  Individual component options:
    --disable-everything     disable all components listed below
  External library support:
    --enable-avisynth        enable reading of AVISynth script files [no]
    --enable-bzlib           enable bzlib [autodetect]
 +  --enable-fontconfig      enable fontconfig
    --enable-frei0r          enable frei0r video filtering
    --enable-gnutls          enable gnutls [no]
 +  --enable-libaacplus      enable AAC+ encoding via libaacplus [no]
 +  --enable-libass          enable libass subtitles rendering [no]
 +  --enable-libbluray       enable BluRay reading using libbluray [no]
 +  --enable-libcaca         enable textual display using libcaca
 +  --enable-libcelt         enable CELT decoding via libcelt [no]
    --enable-libcdio         enable audio CD grabbing with libcdio
    --enable-libdc1394       enable IIDC-1394 grabbing using libdc1394
                             and libraw1394 [no]
    --enable-libfaac         enable AAC encoding via libfaac [no]
    --enable-libfdk-aac      enable AAC encoding via libfdk-aac [no]
 +  --enable-libflite        enable flite (voice synthesis) support via libflite [no]
    --enable-libfreetype     enable libfreetype [no]
    --enable-libgsm          enable GSM de/encoding via libgsm [no]
 +  --enable-libiec61883     enable iec61883 via libiec61883 [no]
    --enable-libilbc         enable iLBC de/encoding via libilbc [no]
 +  --enable-libmodplug      enable ModPlug via libmodplug [no]
    --enable-libmp3lame      enable MP3 encoding via libmp3lame [no]
 +  --enable-libnut          enable NUT (de)muxing via libnut,
 +                           native (de)muxer exists [no]
    --enable-libopencore-amrnb enable AMR-NB de/encoding via libopencore-amrnb [no]
    --enable-libopencore-amrwb enable AMR-WB decoding via libopencore-amrwb [no]
    --enable-libopencv       enable video filtering via libopencv [no]
    --enable-librtmp         enable RTMP[E] support via librtmp [no]
    --enable-libschroedinger enable Dirac de/encoding via libschroedinger [no]
    --enable-libspeex        enable Speex de/encoding via libspeex [no]
 +  --enable-libstagefright-h264  enable H.264 decoding via libstagefright [no]
    --enable-libtheora       enable Theora encoding via libtheora [no]
 +  --enable-libtwolame      enable MP2 encoding via libtwolame [no]
 +  --enable-libutvideo      enable Ut Video encoding and decoding via libutvideo [no]
 +  --enable-libv4l2         enable libv4l2/v4l-utils [no]
    --enable-libvo-aacenc    enable AAC encoding via libvo-aacenc [no]
    --enable-libvo-amrwbenc  enable AMR-WB encoding via libvo-amrwbenc [no]
 -  --enable-libvorbis       enable Vorbis encoding via libvorbis [no]
 +  --enable-libvorbis       enable Vorbis en/decoding via libvorbis,
 +                           native implementation exists [no]
    --enable-libvpx          enable VP8 de/encoding via libvpx [no]
    --enable-libx264         enable H.264 encoding via x264 [no]
    --enable-libxavs         enable AVS encoding via xavs [no]
    --enable-libxvid         enable Xvid encoding via xvidcore,
                             native MPEG-4/Xvid encoder exists [no]
 +  --enable-openal          enable OpenAL 1.1 capture support [no]
    --enable-openssl         enable openssl [no]
    --enable-zlib            enable zlib [autodetect]
  
@@@ -240,14 -213,12 +240,14 @@@ Advanced options (experts only)
    --target-exec=CMD        command to run executables on target
    --target-path=DIR        path to view of build directory on target
    --toolchain=NAME         set tool defaults according to NAME
 -  --nm=NM                  use nm tool
 +  --nm=NM                  use nm tool NM [$nm_default]
    --ar=AR                  use archive tool AR [$ar_default]
    --as=AS                  use assembler AS [$as_default]
 +  --yasmexe=EXE            use yasm-compatible assembler EXE [$yasmexe_default]
    --cc=CC                  use C compiler CC [$cc_default]
 +  --cxx=CXX                use C compiler CXX [$cxx_default]
    --dep-cc=DEPCC           use dependency generator DEPCC [$cc_default]
 -  --ld=LD                  use linker LD
 +  --ld=LD                  use linker LD [$ld_default]
    --host-cc=HOSTCC         use host C compiler HOSTCC
    --host-cflags=HCFLAGS    use HCFLAGS when compiling for host
    --host-ld=HOSTLD         use host linker HOSTLD
    --host-libs=HLIBS        use libs HLIBS when linking for host
    --host-os=OS             compiler host OS [$target_os]
    --extra-cflags=ECFLAGS   add ECFLAGS to CFLAGS [$CFLAGS]
 +  --extra-cxxflags=ECFLAGS add ECFLAGS to CXXFLAGS [$CXXFLAGS]
    --extra-ldflags=ELDFLAGS add ELDFLAGS to LDFLAGS [$LDFLAGS]
    --extra-libs=ELIBS       add ELIBS [$ELIBS]
    --extra-version=STRING   version string suffix []
    --optflags=OPTFLAGS      override optimization-related compiler flags
    --build-suffix=SUFFIX    library name suffix []
    --malloc-prefix=PREFIX   prefix malloc and related names with PREFIX
 +  --progs-suffix=SUFFIX    program name suffix []
    --arch=ARCH              select architecture [$arch]
    --cpu=CPU                select the minimum required CPU (affects
                             instruction selection, may crash on older CPUs)
@@@ -300,30 -269,14 +300,30 @@@ Optimization options (experts only)
    --disable-vis            disable VIS optimizations
    --disable-inline-asm     disable use of inline assembler
    --disable-yasm           disable use of yasm assembler
 -
 -Developer options (useful when working on Libav itself):
 +  --disable-mips32r2       disable MIPS32R2 optimizations
 +  --disable-mipsdspr1      disable MIPS DSP ASE R1 optimizations
 +  --disable-mipsdspr2      disable MIPS DSP ASE R2 optimizations
 +  --disable-mipsfpu        disable floating point MIPS optimizations
 +  --disable-fast-unaligned consider unaligned accesses slow
 +  --postproc-version=V     build libpostproc version V.
 +                           Where V can be '$ALT_PP_VER_MAJOR.$ALT_PP_VER_MINOR.$ALT_PP_VER_MICRO' or 'current'. [$postproc_version_default]
 +
 +Developer options (useful when working on FFmpeg itself):
 +  --enable-coverage        build with test coverage instrumentation
    --disable-debug          disable debugging symbols
    --enable-debug=LEVEL     set the debug level [$debuglevel]
    --disable-optimizations  disable compiler optimizations
    --enable-extra-warnings  enable more compiler warnings
 +  --disable-stripping      disable stripping of executables and shared libraries
 +  --assert-level=level     0(default), 1 or 2, amount of assertion testing,
 +                           2 causes a slowdown at runtime.
 +  --enable-memory-poisoning fill heap uninitialized allocated space with arbitrary data
 +  --valgrind=VALGRIND      run "make fate" tests through valgrind to detect memory
 +                           leaks and errors, using the specified valgrind binary.
 +                           Cannot be combined with --target-exec
 +  --enable-ftrapv          Trap arithmetic overflows
    --samples=PATH           location of test samples for FATE, if not set use
 -                           \$LIBAV_SAMPLES at make invocation time.
 +                           \$FATE_SAMPLES at make invocation time.
    --enable-xmm-clobber-test check XMM registers for clobbering (Win64-only;
                             should be used only for debugging purposes)
    --enable-random          randomly enable/disable components
@@@ -368,7 -321,7 +368,7 @@@ die()
  
  If you think configure made a mistake, make sure you are using the latest
  version from Git.  If the latest version fails, report the problem to the
 -libav-user@libav.org mailing list or IRC #libav on irc.freenode.net.
 +ffmpeg-user@ffmpeg.org mailing list or IRC #ffmpeg on irc.freenode.net.
  EOF
      if disabled logging; then
          cat <<EOF
@@@ -669,10 -622,6 +669,10 @@@ add_cflags()
      append CFLAGS $($cflags_filter "$@")
  }
  
 +add_cxxflags(){
 +    append CXXFLAGS $($cflags_filter "$@")
 +}
 +
  add_asflags(){
      append ASFLAGS $($asflags_filter "$@")
  }
@@@ -719,13 -668,6 +719,13 @@@ check_cc()
      check_cmd $cc $CPPFLAGS $CFLAGS "$@" $CC_C $(cc_o $TMPO) $TMPC
  }
  
 +check_cxx(){
 +    log check_cxx "$@"
 +    cat > $TMPCPP
 +    log_file $TMPCPP
 +    check_cmd $cxx $CPPFLAGS $CFLAGS $CXXFLAGS "$@" $CXX_C -o $TMPO $TMPCPP
 +}
 +
  check_cpp(){
      log check_cpp "$@"
      cat > $TMPC
@@@ -760,7 -702,7 +760,7 @@@ check_yasm()
      echo "$1" > $TMPS
      log_file $TMPS
      shift 1
 -    check_cmd $yasmexe $YASMFLAGS "$@" -o $TMPO $TMPS
 +    check_cmd $yasmexe $YASMFLAGS -Werror "$@" -o $TMPO $TMPS
  }
  
  ld_o(){
  
  check_ld(){
      log check_ld "$@"
 -    flags=$(filter_out '-l*' "$@")
 -    libs=$(filter '-l*' "$@")
 -    check_cc $($cflags_filter $flags) || return
 +    type=$1
 +    shift 1
 +    flags=$(filter_out '-l*' $@)
 +    libs=$(filter '-l*' $@)
 +    check_$type $($cflags_filter $flags) || return
      flags=$($ldflags_filter $flags)
      libs=$($ldflags_filter $libs)
      check_cmd $ld $LDFLAGS $flags $(ld_o $TMPE) $TMPO $libs $extralibs
@@@ -808,17 -748,9 +808,17 @@@ int x
  EOF
  }
  
 +check_cxxflags(){
 +    log check_cxxflags "$@"
 +    set -- $($cflags_filter "$@")
 +    check_cxx "$@" <<EOF && append CXXFLAGS "$@"
 +int x;
 +EOF
 +}
 +
  test_ldflags(){
      log test_ldflags "$@"
 -    check_ld "$@" <<EOF
 +    check_ld "cc" "$@" <<EOF
  int main(void){ return 0; }
  EOF
  }
@@@ -844,7 -776,7 +844,7 @@@ check_func()
      func=$1
      shift
      disable $func
 -    check_ld "$@" <<EOF && enable $func
 +    check_ld "cc" "$@" <<EOF && enable $func
  extern int $func();
  int main(void){ $func(); }
  EOF
@@@ -857,10 -789,10 +857,10 @@@ check_mathfunc()
      shift 2
      test $narg = 2 && args="f, g" || args="f"
      disable $func
 -    check_ld "$@" <<EOF && enable $func
 +    check_ld "cc" "$@" <<EOF && enable $func
  #include <math.h>
  float foo(float f, float g) { return $func($args); }
 -int main(void){ return 0; }
 +int main(void){ return (int) foo; }
  EOF
  }
  
@@@ -877,26 -809,7 +877,26 @@@ check_func_headers()
              echo "long check_$func(void) { return (long) $func; }"
          done
          echo "int main(void) { return 0; }"
 -    } | check_ld "$@" && enable $funcs && enable_safe $headers
 +    } | check_ld "cc" "$@" && enable $funcs && enable_safe $headers
 +}
 +
 +check_class_headers_cpp(){
 +    log check_class_headers_cpp "$@"
 +    headers=$1
 +    classes=$2
 +    shift 2
 +    {
 +        for hdr in $headers; do
 +            echo "#include <$hdr>"
 +        done
 +        echo "int main(void) { "
 +        i=1
 +        for class in $classes; do
 +            echo "$class obj$i;"
 +            i=$(expr $i + 1)
 +        done
 +        echo "return 0; }"
 +    } | check_ld "cxx" "$@" && enable $funcs && enable_safe $headers
  }
  
  check_cpp_condition(){
@@@ -928,21 -841,13 +928,21 @@@ check_lib2()
      check_func_headers "$headers" "$funcs" "$@" && add_extralibs "$@"
  }
  
 +check_lib_cpp(){
 +    log check_lib_cpp "$@"
 +    headers="$1"
 +    classes="$2"
 +    shift 2
 +    check_class_headers_cpp "$headers" "$classes" "$@" && add_extralibs "$@"
 +}
 +
  check_pkg_config(){
      log check_pkg_config "$@"
      pkg="$1"
      headers="$2"
      funcs="$3"
      shift 3
 -    $pkg_config --exists $pkg || return
 +    $pkg_config --exists $pkg 2>/dev/null || return
      pkg_cflags=$($pkg_config --cflags $pkg)
      pkg_libs=$($pkg_config --libs $pkg)
      check_func_headers "$headers" "$funcs" $pkg_cflags $pkg_libs "$@" &&
  }
  
  check_exec(){
 -    check_ld "$@" && { enabled cross_compile || $TMPE >> $logfile 2>&1; }
 +    check_ld "cc" "$@" && { enabled cross_compile || $TMPE >> $logfile 2>&1; }
  }
  
  check_exec_crash(){
  static void sighandler(int sig){
      raise(SIGTERM);
  }
 -int foo(void){
 +int func(void){
      $code
  }
 +int (*func_ptr)(void) = func;
  int main(void){
      signal(SIGILL, sighandler);
      signal(SIGFPE, sighandler);
  #ifdef SIGBUS
      signal(SIGBUS, sighandler);
  #endif
 -    foo();
 +    return func_ptr();
  }
  EOF
  }
@@@ -1020,14 -924,6 +1020,14 @@@ require2()
      check_lib2 "$headers" $func "$@" || die "ERROR: $name not found"
  }
  
 +require_cpp(){
 +    name="$1"
 +    headers="$2"
 +    classes="$3"
 +    shift 3
 +    check_lib_cpp "$headers" "$classes" "$@" || die "ERROR: $name not found"
 +}
 +
  require_pkg_config(){
      pkg="$1"
      check_pkg_config "$@" || die "ERROR: $pkg not found"
@@@ -1083,24 -979,15 +1083,24 @@@ COMPONENT_LIST=
      protocols
  "
  
 +DOCUMENT_LIST="
 +    doc
 +    htmlpages
 +    manpages
 +    podpages
 +    txtpages
 +"
 +
  PROGRAM_LIST="
 -    avconv
 -    avplay
 -    avprobe
 -    avserver
 +    ffplay
 +    ffprobe
 +    ffserver
 +    ffmpeg
  "
  
  CONFIG_LIST="
      $COMPONENT_LIST
 +    $DOCUMENT_LIST
      $PROGRAM_LIST
      avcodec
      avdevice
      avresample
      avisynth
      bzlib
 +    crystalhd
      dct
 -    doc
      dwt
      dxva2
 +    fast_unaligned
      fft
 +    fontconfig
      frei0r
 +    ftrapv
      gnutls
      gpl
      gray
      hardcoded_tables
 +    incompatible_fork_abi
 +    libaacplus
 +    libass
 +    libbluray
 +    libcaca
      libcdio
 +    libcelt
      libdc1394
      libfaac
      libfdk_aac
 +    libflite
      libfreetype
      libgsm
 +    libiec61883
      libilbc
 +    libmodplug
      libmp3lame
 +    libnut
      libopencore_amrnb
      libopencore_amrwb
      libopencv
      librtmp
      libschroedinger
      libspeex
 +    libstagefright_h264
      libtheora
 +    libtwolame
 +    libutvideo
 +    libv4l2
      libvo_aacenc
      libvo_amrwbenc
      libvorbis
      lzo
      mdct
      memalign_hack
 +    memory_poisoning
      network
      nonfree
 +    openal
      openssl
      pic
 +    postproc
      rdft
      runtime_cpudetect
      safe_bitstream_reader
      small
      sram
      static
 +    swresample
      swscale
      swscale_alpha
      thumb
  THREADS_LIST='
      pthreads
      w32threads
 +    os2threads
  '
  
  ARCH_LIST='
@@@ -1251,10 -1116,6 +1251,10 @@@ ARCH_EXT_LIST=
      ppc4xx
      vfpv3
      vis
 +    mipsfpu
 +    mips32r2
 +    mipsdspr1
 +    mipsdspr2
  "
  
  HAVE_LIST_CMDLINE='
  HAVE_LIST_PUB='
      bigendian
      fast_unaligned
 +    incompatible_fork_abi
  '
  
  MATH_FUNCS="
@@@ -1311,10 -1171,8 +1311,10 @@@ HAVE_LIST=
      arpa_inet_h
      asm_mod_q
      asm_mod_y
 +    asm_types_h
      attribute_may_alias
      attribute_packed
 +    clock_gettime
      closesocket
      cmov
      cpunop
      getrusage
      getservbyport
      gettimeofday
 +    glob
      gnu_as
      ibm_asm
      inet_aton
      io_h
      isatty
      jack_port_get_latency_range
 +    kbhit
      ldbrx
      libdc1394_1
      libdc1394_2
      local_aligned_8
      localtime_r
      loongson
 +    lzo1x_999_compress
      machine_ioctl_bt848_h
      machine_ioctl_meteor_h
 +    makeinfo
      malloc_h
      MapViewOfFile
      memalign
      mprotect
      msvcrt
      nanosleep
 +    PeekNamedPipe
 +    perl
 +    pod2man
      poll_h
      posix_memalign
 +    pthread_cancel
      rdtsc
      sched_getaffinity
      sdl
      socklen_t
      soundcard_h
      strerror_r
 -    strptime
 -    strtok_r
      struct_addrinfo
      struct_group_source_req
      struct_ip_mreq_source
      struct_ipv6_mreq
      struct_pollfd
      struct_rusage_ru_maxrss
 +    struct_sctp_event_subscribe
      struct_sockaddr_in6
      struct_sockaddr_sa_len
      struct_sockaddr_storage
      sys_soundcard_h
      sys_time_h
      sys_videoio_h
 +    termios_h
 +    texi2html
      threads
      unistd_h
      usleep
@@@ -1460,14 -1309,12 +1460,14 @@@ CMDLINE_SELECT=
      $HAVE_LIST_CMDLINE
      $THREADS_LIST
      asm
 +    coverage
      cross_compile
      debug
      extra_warnings
      logging
      lto
      optimizations
 +    stripping
  "
  
  PATHS_LIST='
@@@ -1485,12 -1332,10 +1485,12 @@@ CMDLINE_SET=
      ar
      arch
      as
 +    assert_level
      build_suffix
      cc
      cpu
      cross_prefix
 +    cxx
      dep_cc
      extra_version
      host_cc
      host_ldflags
      host_libs
      host_os
 +    install
      ld
      logfile
      malloc_prefix
      nm
      optflags
      pkg_config
 +    postproc_version
 +    progs_suffix
      random_seed
      samples
 +    strip
      sysinclude
      sysroot
      target_exec
      target_os
      target_path
      toolchain
 +    valgrind
 +    yasmexe
  "
  
  CMDLINE_APPEND="
      extra_cflags
 +    extra_cxxflags
  "
  
  # code dependency declarations
@@@ -1537,11 -1375,6 +1537,11 @@@ armvfp_deps="arm
  neon_deps="arm"
  vfpv3_deps="armvfp"
  
 +mipsfpu_deps="mips"
 +mips32r2_deps="mips"
 +mipsdspr1_deps="mips"
 +mipsdspr2_deps="mips"
 +
  altivec_deps="ppc"
  ppc4xx_deps="ppc"
  
@@@ -1603,7 -1436,6 +1603,7 @@@ ac3_fixed_encoder_select="mdct ac3dsp
  alac_encoder_select="lpc"
  amrnb_decoder_select="lsp"
  amrwb_decoder_select="lsp"
 +amv_encoder_select="aandcttables"
  atrac1_decoder_select="mdct sinewin"
  atrac3_decoder_select="mdct"
  binkaudio_dct_decoder_select="mdct rdft dct sinewin"
@@@ -1614,7 -1446,6 +1614,7 @@@ cook_decoder_select="mdct sinewin
  cscd_decoder_select="lzo"
  cscd_decoder_suggest="zlib"
  dca_decoder_select="mdct"
 +dirac_decoder_select="dwt golomb"
  dnxhd_encoder_select="aandcttables mpegvideoenc"
  dxa_decoder_select="zlib"
  eac3_decoder_select="ac3_decoder"
@@@ -1622,7 -1453,6 +1622,7 @@@ eac3_encoder_select="ac3_encoder
  eamad_decoder_select="aandcttables error_resilience mpegvideo"
  eatgq_decoder_select="aandcttables"
  eatqi_decoder_select="aandcttables error_resilience mpegvideo"
 +exr_decoder_select="zlib"
  ffv1_decoder_select="golomb rangecoder"
  ffv1_encoder_select="rangecoder"
  ffvhuff_encoder_select="huffman"
@@@ -1630,7 -1460,6 +1630,7 @@@ flac_decoder_select="golomb
  flac_encoder_select="golomb lpc"
  flashsv_decoder_select="zlib"
  flashsv_encoder_select="zlib"
 +flashsv2_encoder_select="zlib"
  flashsv2_decoder_select="zlib"
  flv_decoder_select="h263_decoder"
  flv_encoder_select="h263_encoder"
@@@ -1642,13 -1471,10 +1642,13 @@@ h263_encoder_select="aandcttables error
  h263_vaapi_hwaccel_select="vaapi h263_decoder"
  h263i_decoder_select="h263_decoder"
  h263p_encoder_select="h263_encoder"
 +h264_crystalhd_decoder_select="crystalhd h264_mp4toannexb_bsf h264_parser"
  h264_decoder_select="error_resilience golomb h264chroma h264dsp h264pred h264qpel mpegvideo"
  h264_dxva2_hwaccel_deps="dxva2api_h"
  h264_dxva2_hwaccel_select="dxva2 h264_decoder"
  h264_vaapi_hwaccel_select="vaapi h264_decoder"
 +h264_vda_decoder_select="vda h264_parser h264_decoder"
 +h264_vda_hwaccel_deps="VideoDecodeAcceleration_VDADecoder_h pthreads"
  h264_vda_hwaccel_select="vda h264_decoder"
  h264_vdpau_decoder_select="vdpau h264_decoder"
  huffyuv_encoder_select="huffman"
@@@ -1677,22 -1503,17 +1677,22 @@@ mpeg_vdpau_decoder_select="vdpau mpegvi
  mpeg_xvmc_decoder_deps="X11_extensions_XvMClib_h"
  mpeg_xvmc_decoder_select="mpegvideo_decoder"
  mpeg1_vdpau_decoder_select="vdpau mpeg1video_decoder"
 +mpeg1_vdpau_hwaccel_select="vdpau mpeg1video_decoder"
  mpeg1video_decoder_select="error_resilience mpegvideo"
  mpeg1video_encoder_select="aandcttables error_resilience mpegvideoenc"
 +mpeg2_crystalhd_decoder_select="crystalhd"
  mpeg2_dxva2_hwaccel_deps="dxva2api_h"
  mpeg2_dxva2_hwaccel_select="dxva2 mpeg2video_decoder"
 +mpeg2_vdpau_hwaccel_select="vdpau mpeg2video_decoder"
  mpeg2_vaapi_hwaccel_select="vaapi mpeg2video_decoder"
  mpeg2video_decoder_select="error_resilience mpegvideo"
  mpeg2video_encoder_select="aandcttables error_resilience mpegvideoenc"
 +mpeg4_crystalhd_decoder_select="crystalhd"
  mpeg4_decoder_select="h263_decoder mpeg4video_parser"
  mpeg4_encoder_select="h263_encoder"
  mpeg4_vaapi_hwaccel_select="vaapi mpeg4_decoder"
  mpeg4_vdpau_decoder_select="vdpau mpeg4_decoder"
 +msmpeg4_crystalhd_decoder_select="crystalhd"
  msmpeg4v1_decoder_select="h263_decoder"
  msmpeg4v1_encoder_select="h263_encoder"
  msmpeg4v2_decoder_select="h263_decoder"
@@@ -1719,9 -1540,6 +1719,9 @@@ shorten_decoder_select="golomb
  sipr_decoder_select="lsp"
  snow_decoder_select="dwt rangecoder"
  snow_encoder_select="aandcttables dwt error_resilience mpegvideoenc rangecoder"
 +sonic_decoder_select="golomb"
 +sonic_encoder_select="golomb"
 +sonic_ls_encoder_select="golomb"
  svq1_decoder_select="error_resilience mpegvideo"
  svq1_encoder_select="aandcttables error_resilience mpegvideoenc"
  svq3_decoder_select="error_resilience golomb h264chroma h264dsp h264pred h264qpel mpegvideo"
@@@ -1729,11 -1547,10 +1729,11 @@@ svq3_decoder_suggest="zlib
  theora_decoder_select="vp3_decoder"
  tiff_decoder_suggest="zlib"
  tiff_encoder_suggest="zlib"
 -truehd_decoder_select="mlp_decoder"
 +truehd_decoder_select="mlp_parser"
  tscc_decoder_select="zlib"
  twinvq_decoder_select="mdct lsp sinewin"
  utvideo_encoder_select="huffman"
 +vc1_crystalhd_decoder_select="crystalhd"
  vc1_decoder_select="h263_decoder h264chroma h264qpel"
  vc1_dxva2_hwaccel_deps="dxva2api_h"
  vc1_dxva2_hwaccel_select="dxva2 vc1_decoder"
@@@ -1759,7 -1576,6 +1759,7 @@@ wmv1_encoder_select="h263_encoder
  wmv2_decoder_select="h263_decoder"
  wmv2_encoder_select="h263_encoder"
  wmv3_decoder_select="vc1_decoder"
 +wmv3_crystalhd_decoder_select="crystalhd"
  wmv3_dxva2_hwaccel_select="vc1_dxva2_hwaccel"
  wmv3_vaapi_hwaccel_select="vc1_vaapi_hwaccel"
  wmv3_vdpau_decoder_select="vc1_vdpau_decoder"
@@@ -1770,7 -1586,6 +1770,7 @@@ zlib_encoder_select="zlib
  zmbv_decoder_select="zlib"
  zmbv_encoder_select="zlib"
  
 +crystalhd_deps="libcrystalhd_libcrystalhd_if_h"
  vaapi_deps="va_va_h"
  vda_deps="VideoDecodeAcceleration_VDADecoder_h pthreads"
  vdpau_deps="vdpau_vdpau_h vdpau_vdpau_x11_h"
@@@ -1782,8 -1597,6 +1782,8 @@@ mpegvideo_parser_select="error_resilien
  vc1_parser_select="error_resilience mpegvideo"
  
  # external libraries
 +libaacplus_encoder_deps="libaacplus"
 +libcelt_decoder_deps="libcelt"
  libfaac_encoder_deps="libfaac"
  libfdk_aac_encoder_deps="libfdk_aac"
  libgsm_decoder_deps="libgsm"
@@@ -1792,7 -1605,6 +1792,7 @@@ libgsm_ms_decoder_deps="libgsm
  libgsm_ms_encoder_deps="libgsm"
  libilbc_decoder_deps="libilbc"
  libilbc_encoder_deps="libilbc"
 +libmodplug_demuxer_deps="libmodplug"
  libmp3lame_encoder_deps="libmp3lame"
  libopencore_amrnb_decoder_deps="libopencore_amrnb"
  libopencore_amrnb_encoder_deps="libopencore_amrnb"
@@@ -1805,35 -1617,24 +1805,35 @@@ libschroedinger_decoder_deps="libschroe
  libschroedinger_encoder_deps="libschroedinger"
  libspeex_decoder_deps="libspeex"
  libspeex_encoder_deps="libspeex"
 +libstagefright_h264_decoder_deps="libstagefright_h264"
  libtheora_encoder_deps="libtheora"
 +libtwolame_encoder_deps="libtwolame"
  libvo_aacenc_encoder_deps="libvo_aacenc"
  libvo_amrwbenc_encoder_deps="libvo_amrwbenc"
 +libvorbis_decoder_deps="libvorbis"
  libvorbis_encoder_deps="libvorbis"
  libvpx_decoder_deps="libvpx"
  libvpx_encoder_deps="libvpx"
  libx264_encoder_deps="libx264"
 +libx264rgb_encoder_deps="libx264"
  libxavs_encoder_deps="libxavs"
  libxvid_encoder_deps="libxvid"
 +libutvideo_decoder_deps="libutvideo"
 +libutvideo_encoder_deps="libutvideo"
  
  # demuxers / muxers
  ac3_demuxer_select="ac3_parser"
  asf_stream_muxer_select="asf_muxer"
  avisynth_demuxer_deps="avisynth"
  dirac_demuxer_select="dirac_parser"
 +dts_demuxer_select="dca_parser"
 +dtshd_demuxer_select="dca_parser"
  eac3_demuxer_select="ac3_parser"
 +f4v_muxer_select="mov_muxer"
  flac_demuxer_select="flac_parser"
  ipod_muxer_select="mov_muxer"
 +libnut_demuxer_deps="libnut"
 +libnut_muxer_deps="libnut"
  matroska_audio_muxer_select="matroska_muxer"
  matroska_demuxer_suggest="bzlib lzo zlib"
  mov_demuxer_suggest="zlib"
@@@ -1854,7 -1655,6 +1854,7 @@@ sap_muxer_select="rtp_muxer rtp_protoco
  sdp_demuxer_select="rtpdec"
  smoothstreaming_muxer_select="ismv_muxer"
  spdif_muxer_select="aac_parser"
 +tak_demuxer_select="tak_parser"
  tg2_muxer_select="mov_muxer"
  tgp_muxer_select="mov_muxer"
  w64_demuxer_deps="wav_demuxer"
  alsa_indev_deps="alsa_asoundlib_h snd_pcm_htimestamp"
  alsa_outdev_deps="alsa_asoundlib_h"
  bktr_indev_deps_any="dev_bktr_ioctl_bt848_h machine_ioctl_bt848_h dev_video_bktr_ioctl_bt848_h dev_ic_bt8xx_h"
 +caca_outdev_deps="libcaca"
 +dshow_indev_deps="IBaseFilter"
 +dshow_indev_extralibs="-lpsapi -lole32 -lstrmiids -luuid"
  dv1394_indev_deps="dv1394 dv_demuxer"
  fbdev_indev_deps="linux_fb_h"
 -jack_indev_deps="jack_jack_h"
 +iec61883_indev_deps="libiec61883"
 +jack_indev_deps="jack_jack_h sem_timedwait"
 +lavfi_indev_deps="avfilter"
  libcdio_indev_deps="libcdio"
  libdc1394_indev_deps="libdc1394"
 +libv4l2_indev_deps="libv4l2"
 +openal_indev_deps="openal"
  oss_indev_deps_any="soundcard_h sys_soundcard_h"
  oss_outdev_deps_any="soundcard_h sys_soundcard_h"
  pulse_indev_deps="libpulse"
 +sdl_outdev_deps="sdl"
  sndio_indev_deps="sndio_h"
  sndio_outdev_deps="sndio_h"
 +v4l_indev_deps="linux_videodev_h"
  v4l2_indev_deps_any="linux_videodev2_h sys_videoio_h"
  vfwcap_indev_deps="capCreateCaptureWindow vfwcap_defines"
  vfwcap_indev_extralibs="-lavicap32"
 -x11grab_indev_deps="x11grab XShmCreateImage"
 +x11grab_indev_deps="x11grab"
  
  # protocols
 +bluray_protocol_deps="libbluray"
  ffrtmpcrypt_protocol_deps="!librtmp_protocol"
  ffrtmpcrypt_protocol_deps_any="gcrypt nettle openssl"
  ffrtmpcrypt_protocol_select="tcp_protocol"
@@@ -1923,68 -1713,36 +1923,68 @@@ tls_protocol_select="tcp_protocol
  udp_protocol_deps="network"
  
  # filters
 +aconvert_filter_deps="swresample"
 +amovie_filter_deps="avcodec avformat"
 +aresample_filter_deps="swresample"
 +ass_filter_deps="libass"
 +asyncts_filter_deps="avresample"
 +atempo_filter_deps="avcodec rdft"
  blackframe_filter_deps="gpl"
  boxblur_filter_deps="gpl"
 +colormatrix_filter_deps="gpl"
  cropdetect_filter_deps="gpl"
 +decimate_filter_deps="gpl avcodec"
  delogo_filter_deps="gpl"
 +deshake_filter_deps="avcodec"
  drawtext_filter_deps="libfreetype"
 -frei0r_filter_deps="frei0r dlopen strtok_r"
 +ebur128_filter_deps="gpl"
 +flite_filter_deps="libflite"
 +frei0r_filter_deps="frei0r dlopen"
  frei0r_filter_extralibs='$ldl'
 -frei0r_src_filter_deps="frei0r dlopen strtok_r"
 +frei0r_src_filter_deps="frei0r dlopen"
  frei0r_src_filter_extralibs='$ldl'
 +geq_filter_deps="gpl"
  hqdn3d_filter_deps="gpl"
 +hue_filter_deps="gpl"
 +movie_filter_deps="avcodec avformat"
 +mp_filter_deps="gpl avcodec swscale postproc inline_asm"
 +mptestsrc_filter_deps="gpl"
 +negate_filter_deps="lut_filter"
  resample_filter_deps="avresample"
  ocv_filter_deps="libopencv"
 +pan_filter_deps="swresample"
 +removelogo_filter_deps="avcodec avformat swscale"
  scale_filter_deps="swscale"
 +smartblur_filter_deps="gpl swscale"
 +showspectrum_filter_deps="avcodec rdft"
 +super2xsai_filter_deps="gpl"
 +tinterlace_filter_deps="gpl"
  yadif_filter_deps="gpl"
 +pixfmts_super2xsai_test_deps="super2xsai_filter"
 +tinterlace_merge_test_deps="tinterlace_filter"
 +tinterlace_pad_test_deps="tinterlace_filter"
  
  # libraries
  avdevice_deps="avcodec avformat"
  avformat_deps="avcodec"
 +postproc_deps="gpl"
  
  # programs
 -avconv_deps="avcodec avfilter avformat avresample swscale
 -             aformat_filter asyncts_filter
 -             format_filter fps_filter scale_filter setpts_filter"
 -avplay_deps="avcodec avformat swscale sdl"
 -avplay_select="rdft"
 -avprobe_deps="avcodec avformat"
 -avserver_deps="avformat ffm_muxer fork rtp_protocol rtsp_demuxer !shared"
 -avserver_extralibs='$ldl'
 -
 -doc_deps="texi2html"
 +ffmpeg_deps="avcodec avfilter avformat swscale swresample"
 +ffmpeg_select="ffbuffersink_filter format_filter aformat_filter
 +               setpts_filter null_filter anull_filter ffabuffersink_filter"
 +ffplay_deps="avcodec avformat swscale swresample sdl"
 +ffplay_select="ffbuffersink_filter rdft crop_filter"
 +ffprobe_deps="avcodec avformat"
 +ffserver_deps="avformat ffm_muxer fork rtp_protocol rtsp_demuxer"
 +ffserver_extralibs='$ldl'
 +
 +# documentation
 +podpages_deps="perl"
 +manpages_deps="perl pod2man"
 +htmlpages_deps="texi2html"
 +txtpages_deps="makeinfo"
 +doc_deps_any="manpages htmlpages podpages txtpages"
  
  # default parameters
  
@@@ -1993,27 -1751,23 +1993,27 @@@ logfile="config.log
  # installation paths
  prefix_default="/usr/local"
  bindir_default='${prefix}/bin'
 -datadir_default='${prefix}/share/avconv'
 +datadir_default='${prefix}/share/ffmpeg'
  incdir_default='${prefix}/include'
  libdir_default='${prefix}/lib'
  mandir_default='${prefix}/share/man'
  shlibdir_default="$libdir_default"
 +postproc_version_default="current"
  
  # toolchain
  ar_default="ar"
  cc_default="gcc"
 +cxx_default="g++"
  host_cc_default="gcc"
  cp_f="cp -f"
 +install="install"
  ln_s="ln -sf"
  nm_default="nm -g"
  objformat="elf"
  pkg_config_default=pkg-config
  ranlib="ranlib"
 -yasmexe="yasm"
 +strip_default="strip"
 +yasmexe_default="yasm"
  
  nogas=":"
  
@@@ -2025,24 -1779,15 +2025,24 @@@ cpu="generic
  target_os_default=$(tolower $(uname -s))
  host_os=$target_os_default
  
 +# alternative libpostproc version
 +ALT_PP_VER_MAJOR=51
 +ALT_PP_VER_MINOR=2
 +ALT_PP_VER_MICRO=101
 +ALT_PP_VER=$ALT_PP_VER_MAJOR.$ALT_PP_VER_MINOR.$ALT_PP_VER_MICRO
 +
  # configurable options
  enable $PROGRAM_LIST
 +enable $DOCUMENT_LIST
  
  enable avcodec
  enable avdevice
  enable avfilter
  enable avformat
 -enable avresample
  enable avutil
 +enable postproc
 +enable stripping
 +enable swresample
  enable swscale
  
  enable asm
@@@ -2050,14 -1795,13 +2050,14 @@@ enable debu
  enable doc
  enable network
  enable optimizations
 +enable runtime_cpudetect
  enable safe_bitstream_reader
  enable static
  enable swscale_alpha
  
  # build settings
  SHFLAGS='-shared -Wl,-soname,$$(@F)'
 -AVSERVERLDFLAGS=-Wl,-E
 +FFSERVERLDFLAGS=-Wl,-E
  LIBPREF="lib"
  LIBSUF=".a"
  FULLNAME='$(NAME)$(BUILDSUF)'
@@@ -2080,8 -1824,6 +2080,8 @@@ AS_O='-o $@
  CC_C='-c'
  CC_E='-E -o $@'
  CC_O='-o $@'
 +CXX_C='-c'
 +CXX_O='-o $@'
  LD_O='-o $@'
  LD_LIB='-l%'
  LD_PATH='-L'
@@@ -2116,7 -1858,7 +2116,7 @@@ for v in "$@"; d
      r=${v#*=}
      l=${v%"$r"}
      r=$(sh_quote "$r")
 -    LIBAV_CONFIGURATION="${LIBAV_CONFIGURATION# } ${l}${r}"
 +    FFMPEG_CONFIGURATION="${FFMPEG_CONFIGURATION# } ${l}${r}"
  done
  
  find_things(){
@@@ -2158,6 -1900,8 +2158,6 @@@ for n in $COMPONENT_LIST; d
      eval ${n}_if_any="\$$v"
  done
  
 -disable snow_decoder snow_encoder
 -
  enable $ARCH_EXT_LIST
  
  die_unknown(){
@@@ -2224,9 -1968,7 +2224,9 @@@ for opt d
      is_in "${thing}s" $COMPONENT_LIST || die_unknown "$opt"
      eval list=\$$(toupper $thing)_LIST
      name=$(echo "${optval}" | sed "s/,/_${thing}|/g")_${thing}
 -    $action $(filter "$name" $list)
 +    list=$(filter "$name" $list)
 +    [ "$list" = "" ] && warn "Option $opt did not match anything"
 +    $action $list
      ;;
      --enable-?*|--disable-?*)
      eval $(echo "$opt" | sed 's/--/action=/;s/-/ option=/;s/-/_/g')
      ;;
      --help|-h) show_help
      ;;
 +    --fatal-warnings) enable fatal_warnings
 +    ;;
      *)
      optname="${opt%%=*}"
      optname="${optname#--}"
@@@ -2266,7 -2006,7 +2266,7 @@@ don
  
  disabled logging && logfile=/dev/null
  
 -echo "# $0 $LIBAV_CONFIGURATION" > $logfile
 +echo "# $0 $FFMPEG_CONFIGURATION" > $logfile
  set >> $logfile
  
  test -n "$cross_prefix" && enable cross_compile
@@@ -2276,25 -2016,11 +2276,25 @@@ if enabled cross_compile; the
          die "Must specify target arch and OS when cross-compiling"
  fi
  
 +set_default postproc_version
 +
 +# Check if we should build alternative libpostproc version instead of current
 +if   test "$postproc_version" = $ALT_PP_VER; then
 +  LIBPOSTPROC_VERSION=$ALT_PP_VER
 +  LIBPOSTPROC_VERSION_MAJOR=$ALT_PP_VER_MAJOR
 +  LIBPOSTPROC_VERSION_MINOR=$ALT_PP_VER_MINOR
 +  LIBPOSTPROC_VERSION_MICRO=$ALT_PP_VER_MICRO
 +elif test "$postproc_version" != current; then
 +  die "Invalid argument to --postproc-version. See --help output."
 +fi
 +
  ar_default="${cross_prefix}${ar_default}"
  cc_default="${cross_prefix}${cc_default}"
 +cxx_default="${cross_prefix}${cxx_default}"
  nm_default="${cross_prefix}${nm_default}"
  pkg_config_default="${cross_prefix}${pkg_config_default}"
  ranlib="${cross_prefix}${ranlib}"
 +strip_default="${cross_prefix}${strip_default}"
  
  sysinclude_default="${sysroot}/usr/include"
  
@@@ -2321,7 -2047,7 +2321,7 @@@ case "$toolchain" i
      ;;
  esac
  
 -set_default arch cc pkg_config sysinclude target_os
 +set_default arch cc cxx pkg_config strip sysinclude target_os yasmexe
  enabled cross_compile || host_cc_default=$cc
  set_default host_cc
  
@@@ -2364,7 -2090,6 +2364,7 @@@ trap 'rm -f -- $TMPFILES' EXI
  
  tmpfile TMPASM .asm
  tmpfile TMPC   .c
 +tmpfile TMPCPP .cpp
  tmpfile TMPE   $EXESUF
  tmpfile TMPH   .h
  tmpfile TMPO   .o
@@@ -2415,7 -2140,6 +2415,7 @@@ msvc_flags()
              -Wall)                echo -W4 -wd4244 -wd4127 -wd4018 -wd4389 \
                                         -wd4146 -wd4057 -wd4204 -wd4706 -wd4305 \
                                         -wd4152 -wd4324 -we4013 -wd4100 -wd4214 \
 +                                       -wd4554 \
                                         -wd4996 -wd4273 ;;
              -std=c99)             ;;
              -fno-math-errno)      ;;
@@@ -2458,6 -2182,8 +2458,8 @@@ suncc_flags()
                      prescott|nocona)    echo -xarch=sse3 -xchip=pentium4 ;;
                      *-sse3)             echo -xarch=sse3                 ;;
                      core2)              echo -xarch=ssse3 -xchip=core2   ;;
+                     corei7)           echo -xarch=sse4_2 -xchip=nehalem  ;;
+                     corei7-avx)       echo -xarch=avx -xchip=sandybridge ;;
                      amdfam10|barcelona|bdver*) echo -xarch=sse4_1        ;;
                      athlon-4|athlon-[mx]p)    echo -xarch=ssea           ;;
                      k8|opteron|athlon64|athlon-fx)
@@@ -2637,7 -2363,6 +2639,7 @@@ probe_cc()
          if [ $pfx = hostcc ]; then
              append _cflags -Dsnprintf=_snprintf
          fi
 +        disable stripping
      fi
  
      eval ${pfx}_type=\$_type
@@@ -2718,7 -2443,6 +2720,7 @@@ els
  fi
  
  add_cflags $extra_cflags
 +add_cxxflags $extra_cxxflags
  add_asflags $extra_cflags
  
  if test -n "$sysroot"; then
@@@ -2759,7 -2483,7 +2761,7 @@@ case "$arch" i
      aarch64|arm64)
          arch="aarch64"
      ;;
 -    arm*)
 +    arm*|iPad*)
          arch="arm"
      ;;
      mips*|IP*)
      tilegx|tile-gx)
          arch="tilegx"
      ;;
 -    i[3-6]86|i86pc|BePC|x86pc|x86_64|amd64)
 +    i[3-6]86|i86pc|BePC|x86pc|x86_64|x86_32|amd64)
          arch="x86"
      ;;
  esac
@@@ -2859,28 -2583,6 +2861,28 @@@ elif enabled mips; the
  
      cpuflags="-march=$cpu"
  
 +    case $cpu in
 +        24kc)
 +            disable mipsfpu
 +            disable mipsdspr1
 +            disable mipsdspr2
 +        ;;
 +        24kf*)
 +            disable mipsdspr1
 +            disable mipsdspr2
 +        ;;
 +        24kec|34kc|1004kc)
 +            disable mipsfpu
 +            disable mipsdspr2
 +        ;;
 +        24kef*|34kf*|1004kf*)
 +            disable mipsdspr2
 +        ;;
 +        74kc)
 +            disable mipsfpu
 +        ;;
 +    esac
 +
  elif enabled ppc; then
  
      case $(tolower $cpu) in
@@@ -2955,7 -2657,7 +2957,7 @@@ elif enabled x86; the
              disable cmov
          ;;
          # targets that do support conditional mov (cmov)
-         i686|pentiumpro|pentium[23]|pentium-m|athlon|athlon-tbird|athlon-4|athlon-[mx]p|athlon64*|k8*|opteron*|athlon-fx|core2|amdfam10|barcelona|atom|bdver*)
+         i686|pentiumpro|pentium[23]|pentium-m|athlon|athlon-tbird|athlon-4|athlon-[mx]p|athlon64*|k8*|opteron*|athlon-fx|core2|corei7*|amdfam10|barcelona|atom|bdver*)
              cpuflags="-march=$cpu"
              enable cmov
              enable fast_cmov
@@@ -2987,7 -2689,6 +2989,7 @@@ if test "$?" != 0; the
  fi
  
  add_cppflags -D_ISOC99_SOURCE
 +add_cxxflags -D__STDC_CONSTANT_MACROS
  check_cflags -std=c99
  check_cc -D_FILE_OFFSET_BITS=64 <<EOF && add_cppflags -D_FILE_OFFSET_BITS=64
  #include <stdlib.h>
@@@ -3032,11 -2733,6 +3034,11 @@@ case "$arch" i
              spic=$shared
          fi
      ;;
 +    ppc)
 +        check_cc <<EOF && subarch="ppc64"
 +        int test[(int)sizeof(char*) - 7];
 +EOF
 +    ;;
  esac
  
  enable $subarch
@@@ -3050,7 -2746,7 +3052,7 @@@ case $target_os i
          host_libs=
          ;;
      sunos)
 -        AVSERVERLDFLAGS=""
 +        FFSERVERLDFLAGS=""
          SHFLAGS='-shared -Wl,-h,$$(@F)'
          enabled x86 && SHFLAGS="-mimpure-text $SHFLAGS"
          network_extralibs="-lsocket -lnsl"
          disable symver
          oss_indev_extralibs="-lossaudio"
          oss_outdev_extralibs="-lossaudio"
 +        enabled gcc || check_ldflags -Wl,-zmuldefs
          ;;
      openbsd|bitrig)
          # On OpenBSD 4.5. the compiler does not use PIC unless
 -        # explicitly using -fPIC. Libav builds fine without PIC,
 +        # explicitly using -fPIC. FFmpeg builds fine without PIC,
          # however the generated executable will not do anything
          # (simply quits with exit-code 1, no crash, no output).
          # Thus explicitly enable PIC here.
          ;;
      bsd/os)
          add_extralibs -lpoll -lgnugetopt
 +        strip="strip -d"
          ;;
      darwin)
          gas="gas-preprocessor.pl $cc"
          enabled ppc && add_asflags -force_cpusubtype_ALL
          SHFLAGS='-dynamiclib -Wl,-single_module -Wl,-install_name,$(SHLIBDIR)/$(SLIBNAME_WITH_MAJOR),-current_version,$(LIBVERSION),-compatibility_version,$(LIBMAJOR)'
          enabled x86_32 && append SHFLAGS -Wl,-read_only_relocs,suppress
 +        strip="${strip} -x"
          add_ldflags -Wl,-dynamic,-search_paths_first
          SLIBSUF=".dylib"
          SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME).$(LIBVERSION)$(SLIBSUF)'
          SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME).$(LIBMAJOR)$(SLIBSUF)'
 -        AVSERVERLDFLAGS=-Wl,-bind_at_load
 +        FFSERVERLDFLAGS=-Wl,-bind_at_load
          objformat="macho"
          enabled x86_64 && objformat="macho64"
          enabled_any pic shared ||
          SLIBSUF=".dll"
          SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME)-$(LIBVERSION)$(SLIBSUF)'
          SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF)'
 -        SLIB_EXTRA_CMD=-'$(DLLTOOL) -m $(LIBTARGET) -d $$(@:$(SLIBSUF)=.def) -l $(SUBDIR)$(SLIBNAME:$(SLIBSUF)=.lib) -D $(SLIBNAME_WITH_MAJOR)'
 +        dlltool="${cross_prefix}dlltool"
 +        if check_cmd lib.exe -list; then
 +            SLIB_EXTRA_CMD='-lib.exe /machine:$(LIBTARGET) /def:$$(@:$(SLIBSUF)=.def) /out:$(SUBDIR)$(SLIBNAME:$(SLIBSUF)=.lib)'
 +            if enabled x86_64; then
 +                LIBTARGET=x64
 +            fi
 +        elif check_cmd $dlltool --version; then
 +            SLIB_EXTRA_CMD=-'$(DLLTOOL) -m $(LIBTARGET) -d $$(@:$(SLIBSUF)=.def) -l $(SUBDIR)$(SLIBNAME:$(SLIBSUF)=.lib) -D $(SLIBNAME_WITH_MAJOR)'
 +        fi
          SLIB_INSTALL_NAME='$(SLIBNAME_WITH_MAJOR)'
          SLIB_INSTALL_LINKS=
          SLIB_INSTALL_EXTRA_SHLIB='$(SLIBNAME:$(SLIBSUF)=.lib)'
          SLIB_INSTALL_EXTRA_LIB='lib$(SLIBNAME:$(SLIBSUF)=.dll.a) $(SLIBNAME_WITH_MAJOR:$(SLIBSUF)=.def)'
          SHFLAGS='-shared -Wl,--output-def,$$(@:$(SLIBSUF)=.def) -Wl,--out-implib,$(SUBDIR)lib$(SLIBNAME:$(SLIBSUF)=.dll.a) -Wl,--enable-runtime-pseudo-reloc -Wl,--enable-auto-image-base'
          objformat="win32"
 -        dlltool="${cross_prefix}dlltool"
          ranlib=:
          enable dos_paths
          add_cppflags -U__STRICT_ANSI__
          ranlib="echo ignoring ranlib"
          ;;
      os/2*)
 +        strip="lxlite -CS"
          ln_s="cp -f"
          objformat="aout"
          add_cppflags -D_GNU_SOURCE
          add_ldflags -Zomf -Zbin-files -Zargs-wild -Zmap
          SHFLAGS='$(SUBDIR)$(NAME).def -Zdll -Zomf'
 -        AVSERVERLDFLAGS=""
 +        FFSERVERLDFLAGS=""
          LIBSUF="_s.a"
          SLIBPREF=""
          SLIBSUF=".dll"
              emximp -o $(SUBDIR)$(LIBPREF)$(NAME)_dll.lib $(SUBDIR)$(NAME).def;'
          SLIB_INSTALL_EXTRA_LIB='$(LIBPREF)$(NAME)_dll.a $(LIBPREF)$(NAME)_dll.lib'
          enable dos_paths
 +        enable_weak os2threads
          ;;
      gnu/kfreebsd)
          add_cppflags -D_BSD_SOURCE
          ;;
      osf1)
          add_cppflags -D_OSF_SOURCE -D_POSIX_PII -D_REENTRANT
 -        AVSERVERLDFLAGS=
 +        FFSERVERLDFLAGS=
          ;;
      minix)
          ;;
          add_compat strtod.o strtod=avpriv_strtod
          network_extralibs='-lbsd'
          exeobjs=compat/plan9/main.o
 -        disable avserver
 +        disable ffserver
          ln_s='ln -s -f'
          cp_f='cp'
          ;;
@@@ -3281,11 -2965,6 +3283,11 @@@ elif check_header _mingw.h; the
          "defined (__MINGW64_VERSION_MAJOR) || (__MINGW32_MAJOR_VERSION > 3) || \
              (__MINGW32_MAJOR_VERSION == 3 && __MINGW32_MINOR_VERSION >= 15)" ||
          die "ERROR: MinGW runtime version must be >= 3.15."
 +    if check_cpp_condition _mingw.h "defined(__MINGW64_VERSION_MAJOR) && \
 +            __MINGW64_VERSION_MAJOR < 3"; then
 +        add_compat msvcrt/snprintf.o
 +        add_cflags "-include $source_path/compat/msvcrt/snprintf.h"
 +    fi
  elif check_cpp_condition newlib.h "defined _NEWLIB_VERSION"; then
      libc_type=newlib
      add_cppflags -U__STRICT_ANSI__
@@@ -3319,7 -2998,7 +3321,7 @@@ esc()
      echo "$*" | sed 's/%/%25/g;s/:/%3a/g'
  }
  
 -echo "config:$arch:$subarch:$cpu:$target_os:$(esc $cc_ident):$(esc $LIBAV_CONFIGURATION)" >config.fate
 +echo "config:$arch:$subarch:$cpu:$target_os:$(esc $cc_ident):$(esc $FFMPEG_CONFIGURATION)" >config.fate
  
  check_cpp_condition stdlib.h "defined(__PIC__) || defined(__pic__) || defined(PIC)" && enable pic
  
@@@ -3341,21 -3020,15 +3343,21 @@@ die_license_disabled() 
      enabled $1 || { enabled $2 && die "$2 is $1 and --enable-$1 is not specified."; }
  }
  
 +die_license_disabled_gpl() {
 +    enabled $1 || { enabled $2 && die "$2 is incompatible with the gpl and --enable-$1 is not specified."; }
 +}
 +
  die_license_disabled gpl libcdio
 +die_license_disabled gpl libutvideo
  die_license_disabled gpl libx264
  die_license_disabled gpl libxavs
  die_license_disabled gpl libxvid
  die_license_disabled gpl x11grab
  
 +die_license_disabled nonfree libaacplus
  die_license_disabled nonfree libfaac
 -die_license_disabled nonfree libfdk_aac
 -die_license_disabled nonfree openssl
 +enabled gpl && die_license_disabled_gpl nonfree libfdk_aac
 +enabled gpl && die_license_disabled_gpl nonfree openssl
  
  die_license_disabled version3 libopencore_amrnb
  die_license_disabled version3 libopencore_amrwb
@@@ -3419,7 -3092,7 +3421,7 @@@ elif enabled arm; the
      elif ! check_cpp_condition stddef.h "defined __ARM_PCS || defined __SOFTFP__"; then
          case "${cross_prefix:-$cc}" in
              *hardfloat*)         enable vfp_args;   fpabi=vfp ;;
 -            *) check_ld <<EOF && enable vfp_args && fpabi=vfp || fpabi=soft ;;
 +            *) check_ld "cc" <<EOF && enable vfp_args && fpabi=vfp || fpabi=soft ;;
  __asm__ (".eabi_attribute 28, 1");
  int main(void) { return 0; }
  EOF
  elif enabled mips; then
  
      check_inline_asm loongson '"dmult.g $1, $2, $3"'
 +    enabled mips32r2  && add_cflags "-mips32r2" && add_asflags "-mips32r2" &&
 +     check_inline_asm mips32r2  '"rotr $t0, $t1, 1"'
 +    enabled mipsdspr1 && add_cflags "-mdsp" && add_asflags "-mdsp" &&
 +     check_inline_asm mipsdspr1 '"addu.qb $t0, $t1, $t2"'
 +    enabled mipsdspr2 && add_cflags "-mdspr2" && add_asflags "-mdspr2" &&
 +     check_inline_asm mipsdspr2 '"absq_s.qb $t0, $t1"'
 +    enabled mipsfpu   && add_cflags "-mhard-float" && add_asflags "-mhard-float" &&
 +     check_inline_asm mipsfpu   '"madd.d $f0, $f2, $f4, $f6"'
  
  elif enabled parisc; then
  
@@@ -3495,9 -3160,9 +3497,9 @@@ elif enabled sparc; the
  
  elif enabled x86; then
  
 -    check_code ld intrin.h "__rdtsc()" && enable rdtsc
 +    check_code ld intrin.h "__rdtsc()" "cc" && enable rdtsc
  
 -    check_code ld mmintrin.h "_mm_empty()" && enable mm_empty
 +    check_code ld mmintrin.h "_mm_empty()" "cc" && enable mm_empty
  
      enable local_aligned_8 local_aligned_16
  
@@@ -3539,9 -3204,8 +3541,9 @@@ EO
              elf*) enabled debug && append YASMFLAGS $yasm_debug ;;
          esac
  
 -        check_yasm "vextractf128 xmm0, ymm0, 0" && enable yasm ||
 +        check_yasm "pextrd [eax], xmm0, 1" && enable yasm ||
              die "yasm not found, use --disable-yasm for a crippled build"
 +        check_yasm "vextractf128 xmm0, ymm0, 0"      || disable avx_external
          check_yasm "vfmaddps ymm0, ymm1, ymm2, ymm3" || disable fma4_external
          check_yasm "CPU amdnop" && enable cpunop
      fi
  # Solaris has nanosleep in -lrt, OpenSolaris no longer needs that
  check_func nanosleep || { check_func nanosleep -lrt && add_extralibs -lrt; }
  
 +check_func  clock_gettime || { check_func clock_gettime -lrt && add_extralibs -lrt; }
  check_func  fcntl
  check_func  fork
  check_func  gethrtime
@@@ -3626,14 -3289,13 +3628,14 @@@ check_func  ${malloc_prefix}posix_memal
  check_func_headers malloc.h _aligned_malloc     && enable aligned_malloc
  check_func  setrlimit
  check_func  strerror_r
 -check_func  strptime
 -check_func  strtok_r
  check_func  sched_getaffinity
  check_func  sysconf
  check_func  sysctl
  check_func  usleep
 +check_func_headers conio.h kbhit
 +check_func_headers windows.h PeekNamedPipe
  check_func_headers io.h setmode
 +check_func_headers lzo/lzo1x.h lzo1x_999_compress
  check_lib2 "windows.h shellapi.h" CommandLineToArgvW -lshell32
  check_lib2 "windows.h wincrypt.h" CryptGenRandom -ladvapi32
  check_lib2 "windows.h psapi.h" GetProcessMemoryInfo -lpsapi
@@@ -3643,14 -3305,12 +3645,14 @@@ check_func_headers windows.h GetSystemT
  check_func_headers windows.h MapViewOfFile
  check_func_headers windows.h Sleep
  check_func_headers windows.h VirtualAlloc
 +check_func_headers glob.h glob
  
  check_header direct.h
  check_header dlfcn.h
  check_header dxva.h
 -check_header dxva2api.h
 +check_header dxva2api.h -D_WIN32_WINNT=0x0600
  check_header io.h
 +check_header libcrystalhd/libcrystalhd_if.h
  check_header malloc.h
  check_header poll.h
  check_header sys/mman.h
@@@ -3658,32 -3318,22 +3660,32 @@@ check_header sys/param.
  check_header sys/resource.h
  check_header sys/select.h
  check_header sys/time.h
 +check_header termios.h
  check_header unistd.h
  check_header vdpau/vdpau.h
  check_header vdpau/vdpau_x11.h
  check_header windows.h
  check_header X11/extensions/XvMClib.h
 +check_header asm/types.h
  
  disabled  zlib || check_lib   zlib.h      zlibVersion -lz   || disable  zlib
  disabled bzlib || check_lib2 bzlib.h BZ2_bzlibVersion -lbz2 || disable bzlib
  
 +# check for VDA header
 +if ! disabled vda && ! enabled ppc; then
 +    if check_header VideoDecodeAcceleration/VDADecoder.h; then
 +        enable vda
 +        add_extralibs -framework CoreFoundation -framework VideoDecodeAcceleration -framework QuartzCore
 +    fi
 +fi
 +
  if ! disabled w32threads && ! enabled pthreads; then
      check_func _beginthreadex && enable w32threads
  fi
  
  # check for some common methods of building with pthread support
  # do this before the optional library checks as some of them require pthreads
 -if ! disabled pthreads && ! enabled w32threads; then
 +if ! disabled pthreads && ! enabled w32threads && ! enabled os2threads; then
      enable pthreads
      if check_func pthread_create; then
          :
@@@ -3708,12 -3358,7 +3710,12 @@@ for thread in $THREADS_LIST; d
      fi
  done
  
 +if enabled pthreads; then
 +  check_func pthread_cancel
 +fi
 +
  check_lib math.h sin -lm && LIBM="-lm"
 +disabled crystalhd || check_lib libcrystalhd/libcrystalhd_if.h DtsCrystalHDVersion -lcrystalhd || disable crystalhd
  enabled vaapi && require vaapi va/va.h vaInitialize -lva
  
  atan2f_args=2
  
  # these are off by default, so fail if requested and not available
  enabled avisynth   && require2 vfw32 "windows.h vfw.h" AVIFileInit -lavifil32
 +enabled fontconfig && require_pkg_config fontconfig "fontconfig/fontconfig.h" FcInit
  enabled frei0r     && { check_header frei0r.h || die "ERROR: frei0r.h header not found"; }
  enabled gnutls     && require_pkg_config gnutls gnutls/gnutls.h gnutls_global_init
 +enabled libiec61883 && require libiec61883 libiec61883/iec61883.h iec61883_cmp_connect -lraw1394 -lavc1394 -lrom1394 -liec61883
 +enabled libaacplus && require  "libaacplus >= 2.0.0" aacplus.h aacplusEncOpen -laacplus
 +enabled libass     && require_pkg_config libass ass/ass.h ass_library_init
 +enabled libbluray  && require libbluray libbluray/bluray.h bd_open -lbluray
 +enabled libcdio    && require2 libcdio "cdio/cdda.h cdio/paranoia.h" cdio_cddap_open -lcdio_paranoia -lcdio_cdda -lcdio
 +enabled libcelt    && require libcelt celt/celt.h celt_decode -lcelt0 &&
 +                      { check_lib celt/celt.h celt_decoder_create_custom -lcelt0 ||
 +                        die "ERROR: libcelt must be installed and version must be >= 0.11.0."; }
 +enabled libcaca    && require_pkg_config caca caca.h caca_create_canvas
  enabled libfaac    && require2 libfaac "stdint.h faac.h" faacEncGetVersion -lfaac
  enabled libfdk_aac && require  libfdk_aac fdk-aac/aacenc_lib.h aacEncOpen -lfdk-aac
 +flite_libs="-lflite_cmu_time_awb -lflite_cmu_us_awb -lflite_cmu_us_kal -lflite_cmu_us_kal16 -lflite_cmu_us_rms -lflite_cmu_us_slt -lflite_usenglish -lflite_cmulex -lflite"
 +enabled libflite   && require2 libflite "flite/flite.h" flite_init $flite_libs
  enabled libfreetype && require_pkg_config freetype2 "ft2build.h freetype/freetype.h" FT_Init_FreeType
  enabled libgsm     && require  libgsm gsm/gsm.h gsm_create -lgsm
  enabled libilbc    && require  libilbc ilbc.h WebRtcIlbcfix_InitDecode -lilbc
 +enabled libmodplug && require  libmodplug libmodplug/modplug.h ModPlug_Load -lmodplug
  enabled libmp3lame && require  "libmp3lame >= 3.98.3" lame/lame.h lame_set_VBR_quality -lmp3lame
 +enabled libnut     && require  libnut libnut.h nut_demuxer_init -lnut
  enabled libopencore_amrnb  && require libopencore_amrnb opencore-amrnb/interf_dec.h Decoder_Interface_init -lopencore-amrnb
  enabled libopencore_amrwb  && require libopencore_amrwb opencore-amrwb/dec_if.h D_IF_init -lopencore-amrwb
 -enabled libopencv  && require_pkg_config opencv opencv/cv.h cvCreateImageHeader
 +enabled libopencv  && require_pkg_config opencv opencv/cxcore.h cvCreateImageHeader
  enabled libopenjpeg && require libopenjpeg openjpeg.h opj_version -lopenjpeg
  enabled libopus    && require_pkg_config opus opus_multistream.h opus_multistream_decoder_create
  enabled libpulse && require_pkg_config libpulse-simple pulse/simple.h pa_simple_new
  enabled librtmp    && require_pkg_config librtmp librtmp/rtmp.h RTMP_Socket
  enabled libschroedinger && require_pkg_config schroedinger-1.0 schroedinger/schro.h schro_init
  enabled libspeex   && require  libspeex speex/speex.h speex_decoder_init -lspeex
 +enabled libstagefright_h264  && require_cpp libstagefright_h264 "binder/ProcessState.h media/stagefright/MetaData.h
 +    media/stagefright/MediaBufferGroup.h media/stagefright/MediaDebug.h media/stagefright/MediaDefs.h
 +    media/stagefright/OMXClient.h media/stagefright/OMXCodec.h" android::OMXClient -lstagefright -lmedia -lutils -lbinder -lgnustl_static
  enabled libtheora  && require  libtheora theora/theoraenc.h th_info_init -ltheoraenc -ltheoradec -logg
 +enabled libtwolame && require  libtwolame twolame.h twolame_init -ltwolame &&
 +                      { check_lib twolame.h twolame_encode_buffer_float32_interleaved -ltwolame ||
 +                        die "ERROR: libtwolame must be installed and version must be >= 0.3.10"; }
 +enabled libutvideo    && require_cpp utvideo "stdint.h stdlib.h utvideo/utvideo.h utvideo/Codec.h" 'CCodec*' -lutvideo -lstdc++
 +enabled libv4l2    && require_pkg_config libv4l2 libv4l2.h v4l2_ioctl
  enabled libvo_aacenc && require libvo_aacenc vo-aacenc/voAAC.h voGetAACEncAPI -lvo-aacenc
  enabled libvo_amrwbenc && require libvo_amrwbenc vo-amrwbenc/enc_if.h E_IF_init -lvo-amrwbenc
  enabled libvorbis  && require  libvorbis vorbis/vorbisenc.h vorbis_info_init -lvorbisenc -lvorbis -logg
  enabled libvpx     && {
      enabled libvpx_decoder && { check_lib2 "vpx/vpx_decoder.h vpx/vp8dx.h" vpx_codec_dec_init_ver -lvpx ||
 -                                die "ERROR: libvpx decoder version must be >=0.9.1"; }
 -    enabled libvpx_encoder && { check_lib2 "vpx/vpx_encoder.h vpx/vp8cx.h" "vpx_codec_enc_init_ver VPX_CQ" -lvpx ||
 -                                die "ERROR: libvpx encoder version must be >=0.9.6"; } }
 +                                die "ERROR: libvpx decoder must be installed and version must be >=0.9.1"; }
 +    enabled libvpx_encoder && { check_lib2 "vpx/vpx_encoder.h vpx/vp8cx.h" "vpx_codec_enc_init_ver VP8E_SET_MAX_INTRA_BITRATE_PCT" -lvpx ||
 +                                die "ERROR: libvpx encoder version must be >=0.9.7"; } }
  enabled libx264    && require  libx264 x264.h x264_encoder_encode -lx264 &&
                        { check_cpp_condition x264.h "X264_BUILD >= 118" ||
 -                        die "ERROR: libx264 version must be >= 0.118."; }
 +                        die "ERROR: libx264 must be installed and version must be >= 0.118."; }
  enabled libxavs    && require  libxavs xavs.h xavs_encoder_encode -lxavs
  enabled libxvid    && require  libxvid xvid.h xvid_global -lxvidcore
 +enabled openal     && { { for al_libs in "${OPENAL_LIBS}" "-lopenal" "-lOpenAL32"; do
 +                        check_lib 'AL/al.h' alGetError "${al_libs}" && break; done } ||
 +                        die "ERROR: openal not found"; } &&
 +                      { check_cpp_condition "AL/al.h" "defined(AL_VERSION_1_1)" ||
 +                        die "ERROR: openal must be installed and version must be 1.1 or compatible"; }
  enabled openssl    && { check_lib openssl/ssl.h SSL_library_init -lssl -lcrypto ||
                          check_lib openssl/ssl.h SSL_library_init -lssl32 -leay32 ||
                          check_lib openssl/ssl.h SSL_library_init -lssl -lcrypto -lws2_32 -lgdi32 ||
@@@ -3803,30 -3421,15 +3805,30 @@@ if enabled libdc1394; the
      die "ERROR: No version of libdc1394 found "
  fi
  
 +SDL_CONFIG="${cross_prefix}sdl-config"
  if check_pkg_config sdl SDL_events.h SDL_PollEvent; then
      check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) >= 0x010201" $sdl_cflags &&
      enable sdl &&
      check_struct SDL.h SDL_VideoInfo current_w $sdl_cflags && enable sdl_video_size
 +else
 +  if "${SDL_CONFIG}" --version > /dev/null 2>&1; then
 +    sdl_cflags=$("${SDL_CONFIG}" --cflags)
 +    sdl_libs=$("${SDL_CONFIG}" --libs)
 +    check_func_headers SDL_version.h SDL_Linked_Version $sdl_cflags $sdl_libs &&
 +    check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) >= 0x010201" $sdl_cflags &&
 +    enable sdl &&
 +    check_struct SDL.h SDL_VideoInfo current_w $sdl_cflags && enable sdl_video_size
 +  fi
  fi
 +enabled sdl && add_cflags $sdl_cflags && add_extralibs $sdl_libs
  
 -texi2html -version > /dev/null 2>&1 && enable texi2html || disable texi2html
 +texi2html --help 2> /dev/null | grep -q 'init-file' && enable texi2html || disable texi2html
 +makeinfo --version > /dev/null 2>&1 && enable makeinfo  || disable makeinfo
 +perl --version > /dev/null 2>&1 && enable perl || disable perl
 +pod2man --help > /dev/null 2>&1 && enable pod2man || disable pod2man
  
  check_header linux/fb.h
 +check_header linux/videodev.h
  check_header linux/videodev2.h
  check_struct linux/videodev2.h "struct v4l2_frmivalenum" discrete
  
@@@ -3837,8 -3440,6 +3839,8 @@@ check_func_headers "windows.h vfw.h" ca
  # w32api 3.12 had it defined wrong
  check_cpp_condition vfw.h "WM_CAP_DRIVER_CONNECT > WM_USER" && enable vfwcap_defines
  
 +check_type "dshow.h" IBaseFilter
 +
  # check for ioctl_meteor.h, ioctl_bt848.h and alternatives
  { check_header dev/bktr/ioctl_meteor.h &&
    check_header dev/bktr/ioctl_bt848.h; } ||
  check_header dev/ic/bt8xx.h
  
  check_header sndio.h
 -check_header sys/soundcard.h
 +if check_struct sys/soundcard.h audio_buf_info bytes; then
 +    enable_safe sys/soundcard.h
 +else
 +    check_cc -D__BSD_VISIBLE -D__XSI_VISIBLE <<EOF && add_cppflags -D__BSD_VISIBLE -D__XSI_VISIBLE && enable_safe sys/soundcard.h
 +    #include <sys/soundcard.h>
 +    audio_buf_info abc;
 +EOF
 +fi
  check_header soundcard.h
  
  enabled_any alsa_indev alsa_outdev && check_lib2 alsa/asoundlib.h snd_pcm_htimestamp -lasound
  
 -enabled jack_indev && check_lib2 jack/jack.h jack_client_open -ljack &&
 +enabled jack_indev && check_lib2 jack/jack.h jack_client_open -ljack && check_func sem_timedwait &&
      check_func jack_port_get_latency_range -ljack
  
  enabled_any sndio_indev sndio_outdev && check_lib2 sndio.h sio_open -lsndio
  
 -enabled libcdio &&
 -    check_lib2 "cdio/cdda.h cdio/paranoia.h" cdio_cddap_open -lcdio_paranoia -lcdio_cdda -lcdio
  
  enabled x11grab                                           &&
  require X11 X11/Xlib.h XOpenDisplay -lX11                 &&
  require Xext X11/extensions/XShm.h XShmCreateImage -lXext &&
  require Xfixes X11/extensions/Xfixes.h XFixesGetCursorImage -lXfixes
  
 -# check for VDA header
 -if ! disabled vda && check_header VideoDecodeAcceleration/VDADecoder.h; then
 -    enable vda && add_extralibs -framework CoreFoundation -framework VideoDecodeAcceleration -framework QuartzCore
 +if ! disabled vaapi; then
 +    check_lib va/va.h vaInitialize -lva && {
 +        check_cpp_condition va/va_version.h "VA_CHECK_VERSION(0,32,0)" ||
 +        warn "Please upgrade to VA-API >= 0.32 if you would like full VA-API support.";
 +    } || disable vaapi
  fi
  
  if ! disabled vdpau && enabled vdpau_vdpau_h; then
  fi
  
  enabled debug && add_cflags -g"$debuglevel" && add_asflags -g"$debuglevel"
 +enabled coverage && add_cflags "-fprofile-arcs -ftest-coverage" && add_ldflags "-fprofile-arcs -ftest-coverage"
 +test -n "$valgrind" && target_exec="$valgrind --error-exitcode=1 --malloc-fill=0x2a --track-origins=yes --leak-check=full --gen-suppressions=all --suppressions=$source_path/tests/fate-valgrind.supp"
  
  # add some useful compiler flags if supported
  check_cflags -Wdeclaration-after-statement
@@@ -3898,17 -3490,17 +3900,17 @@@ check_cflags -Wdisabled-optimizatio
  check_cflags -Wpointer-arith
  check_cflags -Wredundant-decls
  check_cflags -Wno-pointer-sign
 -check_cflags -Wcast-qual
  check_cflags -Wwrite-strings
  check_cflags -Wtype-limits
  check_cflags -Wundef
  check_cflags -Wmissing-prototypes
 +check_cflags -Wno-pointer-to-int-cast
  check_cflags -Wstrict-prototypes
  enabled extra_warnings && check_cflags -Winline
  
  # add some linker flags
  check_ldflags -Wl,--warn-common
 -check_ldflags -Wl,-rpath-link=libswscale:libavfilter:libavdevice:libavformat:libavcodec:libavutil:libavresample
 +check_ldflags -Wl,-rpath-link=libpostproc:libswresample:libswscale:libavfilter:libavdevice:libavformat:libavcodec:libavutil:libavresample
  test_ldflags -Wl,-Bsymbolic && append SHFLAGS -Wl,-Bsymbolic
  
  enabled xmm_clobber_test &&
@@@ -3961,13 -3553,6 +3963,13 @@@ check_optflags $optflag
  check_optflags -fno-math-errno
  check_optflags -fno-signed-zeros
  
 +enabled ftrapv && check_cflags -ftrapv
 +
 +check_cc -mno-red-zone <<EOF && noredzone_flags="-mno-red-zone"
 +int x;
 +EOF
 +
 +
  if enabled icc; then
      # Just warnings, no remarks
      check_cflags -w1
@@@ -4002,6 -3587,7 +4004,6 @@@ elif enabled gcc; the
      check_optflags -fno-tree-vectorize
      check_cflags -Werror=implicit-function-declaration
      check_cflags -Werror=missing-prototypes
 -    check_cflags -Werror=declaration-after-statement
      check_cflags -Werror=vla
  elif enabled llvm_gcc; then
      check_cflags -mllvm -stack-alignment=16
@@@ -4044,42 -3630,9 +4046,42 @@@ check_deps $CONFIG_LIST       
             $HAVE_LIST         \
             $ALL_COMPONENTS    \
  
 +
 +if test $target_os = "haiku"; then
 +    disable memalign
 +    disable posix_memalign
 +fi
 +
  ! enabled_any memalign posix_memalign aligned_malloc &&
      enabled_any $need_memalign && enable memalign_hack
  
 +# add_dep lib dep
 +# -> enable ${lib}_deps_${dep}
 +# -> add $dep to ${lib}_deps only once
 +add_dep() {
 +    lib=$1
 +    dep=$2
 +    enabled "${lib}_deps_${dep}" && return 0
 +    enable  "${lib}_deps_${dep}"
 +    prepend "${lib}_deps" $dep
 +}
 +
 +# merge deps lib components
 +# merge all ${component}_deps into ${lib}_deps and ${lib}_deps_*
 +merge_deps() {
 +    lib=$1
 +    shift
 +    for comp in $*; do
 +        enabled $comp || continue
 +        eval "dep=\"\$${comp}_deps\""
 +        for d in $dep; do
 +            add_dep $lib $d
 +        done
 +    done
 +}
 +
 +merge_deps libavfilter $FILTER_LIST
 +
  echo "install prefix            $prefix"
  echo "source path               $source_path"
  echo "C compiler                $cc"
@@@ -4087,9 -3640,6 +4089,9 @@@ echo "ARCH                      $arch (
  if test "$build_suffix" != ""; then
      echo "build suffix              $build_suffix"
  fi
 +if test "$progs_suffix" != ""; then
 +    echo "progs suffix              $progs_suffix"
 +fi
  if test "$extra_version" != ""; then
      echo "version string suffix     $extra_version"
  fi
@@@ -4117,12 -3667,6 +4119,12 @@@ if enabled arm; the
      echo "ARM VFP enabled           ${armvfp-no}"
      echo "NEON enabled              ${neon-no}"
  fi
 +if enabled mips; then
 +    echo "MIPS FPU enabled          ${mipsfpu-no}"
 +    echo "MIPS32R2 enabled          ${mips32r2-no}"
 +    echo "MIPS DSP R1 enabled       ${mipsdspr1-no}"
 +    echo "MIPS DSP R2 enabled       ${mipsdspr2-no}"
 +fi
  if enabled ppc; then
      echo "AltiVec enabled           ${altivec-no}"
      echo "PPC 4xx optimizations     ${ppc4xx-no}"
@@@ -4132,12 -3676,10 +4134,12 @@@ if enabled sparc; the
      echo "VIS enabled               ${vis-no}"
  fi
  echo "debug symbols             ${debug-no}"
 +echo "strip symbols             ${stripping-no}"
  echo "optimize for size         ${small-no}"
  echo "optimizations             ${optimizations-no}"
  echo "static                    ${static-no}"
  echo "shared                    ${shared-no}"
 +echo "postprocessing support    ${postproc-no}"
  echo "new filter support        ${avfilter-no}"
  echo "network support           ${network-no}"
  echo "threading support         ${thread_type-no}"
@@@ -4149,20 -3691,13 +4151,20 @@@ echo "libvdpau enabled          ${vdpau
  echo "AVISynth enabled          ${avisynth-no}"
  echo "frei0r enabled            ${frei0r-no}"
  echo "gnutls enabled            ${gnutls-no}"
 +echo "libaacplus enabled        ${libaacplus-no}"
 +echo "libass enabled            ${libass-no}"
 +echo "libcaca enabled           ${libcaca-no}"
  echo "libcdio support           ${libcdio-no}"
 +echo "libcelt enabled           ${libcelt-no}"
  echo "libdc1394 support         ${libdc1394-no}"
  echo "libfaac enabled           ${libfaac-no}"
  echo "libfdk-aac enabled        ${libfdk_aac-no}"
  echo "libgsm enabled            ${libgsm-no}"
 +echo "libiec61883 support       ${libiec61883-no}"
  echo "libilbc enabled           ${libilbc-no}"
 +echo "libmodplug enabled        ${libmodplug-no}"
  echo "libmp3lame enabled        ${libmp3lame-no}"
 +echo "libnut enabled            ${libnut-no}"
  echo "libopencore-amrnb support ${libopencore_amrnb-no}"
  echo "libopencore-amrwb support ${libopencore_amrwb-no}"
  echo "libopencv support         ${libopencv-no}"
@@@ -4172,11 -3707,7 +4174,11 @@@ echo "libpulse enabled          ${libpu
  echo "librtmp enabled           ${librtmp-no}"
  echo "libschroedinger enabled   ${libschroedinger-no}"
  echo "libspeex enabled          ${libspeex-no}"
 +echo "libstagefright-h264 enabled    ${libstagefright_h264-no}"
  echo "libtheora enabled         ${libtheora-no}"
 +echo "libtwolame enabled        ${libtwolame-no}"
 +echo "libutvideo enabled        ${libutvideo-no}"
 +echo "libv4l2 enabled           ${libv4l2-no}"
  echo "libvo-aacenc support      ${libvo_aacenc-no}"
  echo "libvo-amrwbenc support    ${libvo_amrwbenc-no}"
  echo "libvorbis enabled         ${libvorbis-no}"
@@@ -4184,14 -3715,9 +4186,14 @@@ echo "libvpx enabled            ${libvp
  echo "libx264 enabled           ${libx264-no}"
  echo "libxavs enabled           ${libxavs-no}"
  echo "libxvid enabled           ${libxvid-no}"
 +echo "openal enabled            ${openal-no}"
  echo "openssl enabled           ${openssl-no}"
  echo "zlib enabled              ${zlib-no}"
  echo "bzlib enabled             ${bzlib-no}"
 +echo "texi2html enabled         ${texi2html-no}"
 +echo "perl enabled              ${perl-no}"
 +echo "pod2man enabled           ${pod2man-no}"
 +echo "makeinfo enabled          ${makeinfo-no}"
  test -n "$random_seed" &&
      echo "random seed               ${random_seed}"
  echo
@@@ -4220,15 -3746,11 +4222,15 @@@ echo "Creating config.mak and config.h.
  
  test -e Makefile || $ln_s "$source_path/Makefile" .
  
 +enabled stripping || strip="echo skipping strip"
 +
  config_files="$TMPH config.mak"
  
  cat > config.mak <<EOF
  # Automatically generated by configure - do not modify!
 -LIBAV_CONFIGURATION=$LIBAV_CONFIGURATION
 +ifndef FFMPEG_CONFIG_MAK
 +FFMPEG_CONFIG_MAK=1
 +FFMPEG_CONFIGURATION=$FFMPEG_CONFIGURATION
  prefix=$prefix
  LIBDIR=\$(DESTDIR)$libdir
  SHLIBDIR=\$(DESTDIR)$shlibdir
@@@ -4237,13 -3759,9 +4239,13 @@@ BINDIR=\$(DESTDIR)$bindi
  DATADIR=\$(DESTDIR)$datadir
  MANDIR=\$(DESTDIR)$mandir
  SRC_PATH=$source_path
 +ifndef MAIN_MAKEFILE
 +SRC_PATH:=\$(SRC_PATH:.%=..%)
 +endif
  CC_IDENT=$cc_ident
  ARCH=$arch
  CC=$cc
 +CXX=$cxx
  AS=$as
  LD=$ld
  DEPCC=$dep_cc
@@@ -4256,30 -3774,24 +4258,30 @@@ AR=$a
  ARFLAGS=$arflags
  AR_O=$ar_o
  RANLIB=$ranlib
 +CP=cp -p
  LN_S=$ln_s
 +STRIP=$strip
  CPPFLAGS=$CPPFLAGS
  CFLAGS=$CFLAGS
 +CXXFLAGS=$CXXFLAGS
  ASFLAGS=$ASFLAGS
  AS_C=$AS_C
  AS_O=$AS_O
  CC_C=$CC_C
  CC_E=$CC_E
  CC_O=$CC_O
 +CXX_C=$CXX_C
 +CXX_O=$CXX_O
  LD_O=$LD_O
  LD_LIB=$LD_LIB
  LD_PATH=$LD_PATH
  DLLTOOL=$dlltool
  LDFLAGS=$LDFLAGS
 -LDFLAGS-avserver=$AVSERVERLDFLAGS
 +LDFLAGS-ffserver=$FFSERVERLDFLAGS
  SHFLAGS=$SHFLAGS
  YASMFLAGS=$YASMFLAGS
  BUILDSUF=$build_suffix
 +PROGSSUF=$progs_suffix
  FULLNAME=$FULLNAME
  LIBPREF=$LIBPREF
  LIBSUF=$LIBSUF
@@@ -4289,7 -3801,6 +4291,7 @@@ SLIBSUF=$SLIBSU
  EXESUF=$EXESUF
  EXTRA_VERSION=$extra_version
  CCDEP=$CCDEP
 +CXXDEP=$CXXDEP
  CCDEP_FLAGS=$CCDEP_FLAGS
  ASDEP=$ASDEP
  ASDEP_FLAGS=$ASDEP_FLAGS
@@@ -4311,14 -3822,14 +4313,14 @@@ HOSTCC_O=$HOSTCC_
  HOSTLD_O=$HOSTLD_O
  TARGET_EXEC=$target_exec
  TARGET_PATH=$target_path
 -LIBS-avplay=$sdl_libs
 -CFLAGS-avplay=$sdl_cflags
 +LIBS-ffplay=$sdl_libs
 +CFLAGS-ffplay=$sdl_cflags
  ZLIB=$($ldflags_filter -lz)
  LIB_INSTALL_EXTRA_CMD=$LIB_INSTALL_EXTRA_CMD
  EXTRALIBS=$extralibs
  COMPAT_OBJS=$compat_objs
  EXEOBJS=$exeobjs
 -INSTALL=install
 +INSTALL=$install
  LIBTARGET=${LIBTARGET}
  SLIBNAME=${SLIBNAME}
  SLIBNAME_WITH_VERSION=${SLIBNAME_WITH_VERSION}
@@@ -4329,8 -3840,7 +4331,8 @@@ SLIB_INSTALL_NAME=${SLIB_INSTALL_NAME
  SLIB_INSTALL_LINKS=${SLIB_INSTALL_LINKS}
  SLIB_INSTALL_EXTRA_LIB=${SLIB_INSTALL_EXTRA_LIB}
  SLIB_INSTALL_EXTRA_SHLIB=${SLIB_INSTALL_EXTRA_SHLIB}
 -SAMPLES:=${samples:-\$(LIBAV_SAMPLES)}
 +SAMPLES:=${samples:-\$(FATE_SAMPLES)}
 +NOREDZONE_FLAGS=$noredzone_flags
  EOF
  
  get_version(){
      eval echo "${lcname}_VERSION_MAJOR=\$${name}_VERSION_MAJOR" >> config.mak
  }
  
 +get_version_old(){
 +    name=$1
 +    file=$source_path/$2
 +# This condition will be removed when we stop supporting old libpostproc versions
 +if ! test "$name" = LIBPOSTPROC || test "$postproc_version" = current; then
 +    eval $(grep "#define ${name}_VERSION_M" "$file" | awk '{ print $2"="$3 }')
 +    eval ${name}_VERSION=\$${name}_VERSION_MAJOR.\$${name}_VERSION_MINOR.\$${name}_VERSION_MICRO
 +fi
 +    lcname=$(tolower $name)
 +    eval echo "${lcname}_VERSION=\$${name}_VERSION" >> config.mak
 +    eval echo "${lcname}_VERSION_MAJOR=\$${name}_VERSION_MAJOR" >> config.mak
 +}
 +
 +get_version_old LIBPOSTPROC libpostproc/version.h
 +
  get_version libavcodec
  get_version libavdevice
  get_version libavfilter
  get_version libavformat
  get_version libavresample
  get_version libavutil
 +get_version libswresample
  get_version libswscale
  
  cat > $TMPH <<EOF
  /* Automatically generated by configure - do not modify! */
 -#ifndef LIBAV_CONFIG_H
 -#define LIBAV_CONFIG_H
 -#define LIBAV_CONFIGURATION "$(c_escape $LIBAV_CONFIGURATION)"
 -#define LIBAV_LICENSE "$(c_escape $license)"
 +#ifndef FFMPEG_CONFIG_H
 +#define FFMPEG_CONFIG_H
 +#define FFMPEG_CONFIGURATION "$(c_escape $FFMPEG_CONFIGURATION)"
 +#define FFMPEG_LICENSE "$(c_escape $license)"
 +#define FFMPEG_DATADIR "$(eval c_escape $datadir)"
  #define AVCONV_DATADIR "$(eval c_escape $datadir)"
  #define CC_IDENT "$(c_escape ${cc_ident:-Unknown compiler})"
 -#define restrict $_restrict
 +#define av_restrict $_restrict
  #define EXTERN_PREFIX "${extern_prefix}"
  #define EXTERN_ASM ${extern_prefix}
  #define SLIBSUF "$SLIBSUF"
 +#define HAVE_MMX2 HAVE_MMXEXT
  EOF
  
 +test -n "$assert_level" &&
 +    echo "#define ASSERT_LEVEL $assert_level" >>$TMPH
 +
  test -n "$malloc_prefix" &&
      echo "#define MALLOC_PREFIX $malloc_prefix" >>$TMPH
  
@@@ -4400,8 -3889,7 +4402,8 @@@ print_config CONFIG_ "$config_files" $C
                                       $CONFIG_EXTRA      \
                                       $ALL_COMPONENTS    \
  
 -echo "#endif /* LIBAV_CONFIG_H */" >> $TMPH
 +echo "#endif /* FFMPEG_CONFIG_H */" >> $TMPH
 +echo "endif # FFMPEG_CONFIG_MAK" >> config.mak
  
  # Do not overwrite an unchanged config.h to avoid superfluous rebuilds.
  cp_if_changed $TMPH config.h
@@@ -4415,22 -3903,13 +4417,22 @@@ cat > $TMPH <<EO
  #define AVUTIL_AVCONFIG_H
  EOF
  
 +test "$postproc_version" != current && cat >> $TMPH <<EOF
 +#define LIBPOSTPROC_VERSION_MAJOR $LIBPOSTPROC_VERSION_MAJOR
 +#define LIBPOSTPROC_VERSION_MINOR $LIBPOSTPROC_VERSION_MINOR
 +#define LIBPOSTPROC_VERSION_MICRO $LIBPOSTPROC_VERSION_MICRO
 +EOF
 +
  print_config AV_HAVE_ $TMPH $HAVE_LIST_PUB
  
  echo "#endif /* AVUTIL_AVCONFIG_H */" >> $TMPH
  
  cp_if_changed $TMPH libavutil/avconfig.h
  
 -test -n "$WARNINGS" && printf "\n$WARNINGS"
 +if test -n "$WARNINGS"; then
 +    printf "\n$WARNINGS"
 +    enabled fatal_warnings && exit 1
 +fi
  
  # build pkg-config files
  
@@@ -4459,66 -3938,26 +4461,66 @@@ Libs: -L\${libdir} -l${shortname} $(ena
  Libs.private: $(enabled shared && echo $libs)
  Cflags: -I\${includedir}
  EOF
 -    cat <<EOF > $name/$name-uninstalled.pc
 +
 +mkdir -p doc/examples/pc-uninstalled
 +includedir=${source_path}
 +[ "$includedir" = . ] && includedir="\${pcfiledir}/../../.."
 +    cat <<EOF > doc/examples/pc-uninstalled/$name.pc
  prefix=
  exec_prefix=
 -libdir=\${pcfiledir}
 -includedir=${source_path}
 +libdir=\${pcfiledir}/../../../$name
 +includedir=${includedir}
  
  Name: $name
  Description: $comment
  Version: $version
  Requires: $requires
  Conflicts:
 -Libs: \${libdir}/${LIBPREF}${shortname}${LIBSUF} $libs
 +Libs: -L\${libdir} -l${shortname} $(enabled shared || echo $libs)
  Cflags: -I\${includedir}
  EOF
  }
  
 -pkgconfig_generate libavutil "Libav utility library" "$LIBAVUTIL_VERSION" "$LIBM"
 -pkgconfig_generate libavcodec "Libav codec library" "$LIBAVCODEC_VERSION" "$extralibs" "libavutil = $LIBAVUTIL_VERSION"
 -pkgconfig_generate libavformat "Libav container format library" "$LIBAVFORMAT_VERSION" "$extralibs" "libavcodec = $LIBAVCODEC_VERSION"
 -pkgconfig_generate libavdevice "Libav device handling library" "$LIBAVDEVICE_VERSION" "$extralibs" "libavformat = $LIBAVFORMAT_VERSION"
 -pkgconfig_generate libavfilter "Libav video filtering library" "$LIBAVFILTER_VERSION" "$extralibs" "libavutil = $LIBAVUTIL_VERSION"
 +libavfilter_pc_deps="libavutil = $LIBAVUTIL_VERSION"
 +enabled libavfilter_deps_avcodec    && prepend libavfilter_pc_deps "libavcodec = $LIBAVCODEC_VERSION,"
 +enabled libavfilter_deps_avformat   && prepend libavfilter_pc_deps "libavformat = $LIBAVFORMAT_VERSION,"
 +enabled libavfilter_deps_swscale    && prepend libavfilter_pc_deps "libswscale = $LIBSWSCALE_VERSION,"
 +enabled libavfilter_deps_swresample && prepend libavfilter_pc_deps "libswresample = $LIBSWRESAMPLE_VERSION,"
 +enabled libavfilter_deps_postproc   && prepend libavfilter_pc_deps "libpostproc = $LIBPOSTPROC_VERSION,"
 +libavfilter_pc_deps=${libavfilter_pc_deps%, }
 +
 +libavdevice_pc_deps="libavformat = $LIBAVFORMAT_VERSION"
 +enabled lavfi_indev && prepend libavdevice_pc_deps "libavfilter = $LIBAVFILTER_VERSION,"
 +
 +pkgconfig_generate libavutil "FFmpeg utility library" "$LIBAVUTIL_VERSION" "$LIBM"
 +pkgconfig_generate libavcodec "FFmpeg codec library" "$LIBAVCODEC_VERSION" "$extralibs" "libavutil = $LIBAVUTIL_VERSION"
 +pkgconfig_generate libavformat "FFmpeg container format library" "$LIBAVFORMAT_VERSION" "$extralibs" "libavcodec = $LIBAVCODEC_VERSION"
 +pkgconfig_generate libavdevice "FFmpeg device handling library" "$LIBAVDEVICE_VERSION" "$extralibs" "$libavdevice_pc_deps"
 +pkgconfig_generate libavfilter "FFmpeg video filtering library" "$LIBAVFILTER_VERSION" "$extralibs" "$libavfilter_pc_deps"
 +pkgconfig_generate libpostproc "FFmpeg postprocessing library" "$LIBPOSTPROC_VERSION" "" "libavutil = $LIBAVUTIL_VERSION"
  pkgconfig_generate libavresample "Libav audio resampling library" "$LIBAVRESAMPLE_VERSION" "$extralibs" "libavutil = $LIBAVUTIL_VERSION"
 -pkgconfig_generate libswscale "Libav image rescaling library" "$LIBSWSCALE_VERSION" "$LIBM" "libavutil = $LIBAVUTIL_VERSION"
 +pkgconfig_generate libswscale "FFmpeg image rescaling library" "$LIBSWSCALE_VERSION" "$LIBM" "libavutil = $LIBAVUTIL_VERSION"
 +pkgconfig_generate libswresample "FFmpeg audio resampling library" "$LIBSWRESAMPLE_VERSION" "$LIBM" "libavutil = $LIBAVUTIL_VERSION"
 +
 +fix_ffmpeg_remote(){
 +    git_remote_from=$1
 +    git_remote_to=$2
 +    fixme_remote=$(git --git-dir=$source_path/.git --work-tree=$source_path remote -v | grep $git_remote_from | cut -f 1 | sort | uniq)
 +    if [ "$fixme_remote" != "" ]; then
 +        echolog "
 +Outdated domain in git config, the official domain for ffmpeg git is since
 +November 2011, source.ffmpeg.org, both the old and the new point to the same
 +repository and server. To update it enter the following commands:
 +"
 +        for remote in $fixme_remote; do
 +            echolog "git remote set-url $remote $git_remote_to"
 +        done
 +    fi
 +}
 +
 +if test -f "$source_path/.git/config"; then
 +    remote_from=git.videolan.org
 +    remote_to=source.ffmpeg.org
 +    fix_ffmpeg_remote git@$remote_from:ffmpeg   git@$remote_to:ffmpeg
 +    fix_ffmpeg_remote git://$remote_from/ffmpeg git://$remote_to/ffmpeg
 +fi
@@@ -1,10 -1,11 +1,11 @@@
  All the numerical options, if not specified otherwise, accept in input
  a string representing a number, which may contain one of the
- International System number postfixes, for example 'K', 'M', 'G'.
- If 'i' is appended after the postfix, powers of 2 are used instead of
- powers of 10. The 'B' postfix multiplies the value for 8, and can be
- appended after another postfix or used alone. This allows using for
- example 'KB', 'MiB', 'G' and 'B' as postfix.
+ SI unit prefixes, for example 'K', 'M', 'G'.
+ If 'i' is appended after the prefix, binary prefixes are used,
+ which are based on powers of 1024 instead of powers of 1000.
+ The 'B' postfix multiplies the value by 8, and can be
+ appended after a unit prefix or used alone. This allows using for
+ example 'KB', 'MiB', 'G' and 'B' as number postfix.
  
  Options which do not take arguments are boolean options, and set the
  corresponding value to true. They can be set to false by prefixing
@@@ -18,10 -19,10 +19,10 @@@ are used to precisely specify which str
  
  A stream specifier is a string generally appended to the option name and
  separated from it by a colon. E.g. @code{-codec:a:1 ac3} option contains
 -@code{a:1} stream specifer, which matches the second audio stream. Therefore it
 +@code{a:1} stream specifier, which matches the second audio stream. Therefore it
  would select the ac3 codec for the second audio stream.
  
 -A stream specifier can match several stream, the option is then applied to all
 +A stream specifier can match several streams, the option is then applied to all
  of them. E.g. the stream specifier in @code{-b:a 128k} matches all audio
  streams.
  
@@@ -41,10 -42,7 +42,10 @@@ streams of this type
  @item p:@var{program_id}[:@var{stream_index}]
  If @var{stream_index} is given, then matches stream number @var{stream_index} in
  program with id @var{program_id}. Otherwise matches all streams in this program.
 +@item #@var{stream_id}
 +Matches the stream by format-specific ID.
  @end table
 +
  @section Generic options
  
  These options are shared amongst the av* tools.
@@@ -119,9 -117,6 +120,9 @@@ Show available pixel formats
  @item -sample_fmts
  Show available sample formats.
  
 +@item -layouts
 +Show channel names and standard channel layouts.
 +
  @item -loglevel @var{loglevel} | -v @var{loglevel}
  Set the logging level used by the library.
  @var{loglevel} is a number or a string containing one of the following values:
@@@ -142,38 -137,7 +143,38 @@@ can be disabled setting the environmen
  @env{AV_LOG_FORCE_NOCOLOR} or @env{NO_COLOR}, or can be forced setting
  the environment variable @env{AV_LOG_FORCE_COLOR}.
  The use of the environment variable @env{NO_COLOR} is deprecated and
 -will be dropped in a following Libav version.
 +will be dropped in a following FFmpeg version.
 +
 +@item -report
 +Dump full command line and console output to a file named
 +@code{@var{program}-@var{YYYYMMDD}-@var{HHMMSS}.log} in the current
 +directory.
 +This file can be useful for bug reports.
 +It also implies @code{-loglevel verbose}.
 +
 +Setting the environment variable @code{FFREPORT} to any value has the same
 +effect. If the value is a ':'-separated key=value sequence, these options
 +will affect the report; options values must be
 +@ref{quoting_and_escaping, escaped} if they contain special characters or
 +the options delimiter ':'. The following option is recognized:
 +@table @option
 +@item file
 +set the file name to use for the report; @code{%p} is expanded to the name
 +of the program, @code{%t} is expanded to a timestamp, @code{%%} is expanded
 +to a plain @code{%}
 +@end table
 +
 +Errors in parsing the environment variable are not fatal, and will not
 +appear in the report.
 +
 +@item -cpuflags flags (@emph{global})
 +Allows setting and clearing cpu flags. This option is intended
 +for testing. Do not use it unless you know what you're doing.
 +@example
 +ffmpeg -cpuflags -sse+mmx ...
 +ffmpeg -cpuflags mmx ...
 +ffmpeg -cpuflags 0 ...
 +@end example
  
  @end table
  
@@@ -196,7 -160,7 +197,7 @@@ For example to write an ID3v2.3 header 
  an MP3 file, use the @option{id3v2_version} private option of the MP3
  muxer:
  @example
 -avconv -i input.flac -id3v2_version 3 out.mp3
 +ffmpeg -i input.flac -id3v2_version 3 out.mp3
  @end example
  
  All codec AVOptions are obviously per-stream, so the chapter on stream
diff --combined ffmpeg_opt.c
@@@ -1,26 -1,26 +1,26 @@@
  /*
 - * avconv option parsing
 + * ffmpeg option parsing
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * 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.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * 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 "avconv.h"
 +#include "ffmpeg.h"
  #include "cmdutils.h"
  
  #include "libavformat/avformat.h"
      }\
  }
  
 +#define MATCH_PER_TYPE_OPT(name, type, outvar, fmtctx, mediatype)\
 +{\
 +    int i;\
 +    for (i = 0; i < o->nb_ ## name; i++) {\
 +        char *spec = o->name[i].specifier;\
 +        if (!strcmp(spec, mediatype))\
 +            outvar = o->name[i].u.type;\
 +    }\
 +}
  char *vstats_filename;
  
  float audio_drift_threshold = 0.1;
  float dts_delta_threshold   = 10;
 +float dts_error_threshold   = 3600*30;
  
  int audio_volume      = 256;
  int audio_sync_method = 0;
  int video_sync_method = VSYNC_AUTO;
  int do_deinterlace    = 0;
  int do_benchmark      = 0;
 +int do_benchmark_all  = 0;
  int do_hex_dump       = 0;
  int do_pkt_dump       = 0;
  int copy_ts           = 0;
 -int copy_tb           = 1;
 +int copy_tb           = -1;
 +int debug_ts          = 0;
  int exit_on_error     = 0;
  int print_stats       = 1;
  int qp_hist           = 0;
 +int stdin_interaction = 1;
 +int frame_bits_per_raw_sample = 0;
  
 +
 +static int intra_only         = 0;
  static int file_overwrite     = 0;
 +static int no_file_overwrite  = 0;
  static int video_discard      = 0;
  static int intra_dc_precision = 8;
 -static int using_stdin        = 0;
 +static int do_psnr            = 0;
  static int input_sync;
  
 -void reset_options(OptionsContext *o)
 +void reset_options(OptionsContext *o, int is_input)
  {
      const OptionDef *po = options;
 +    OptionsContext bak= *o;
      int i;
  
      /* all OPT_SPEC and OPT_STRING can be freed in generic way */
      for (i = 0; i < o->nb_stream_maps; i++)
          av_freep(&o->stream_maps[i].linklabel);
      av_freep(&o->stream_maps);
 -    av_freep(&o->meta_data_maps);
 +    av_freep(&o->audio_channel_maps);
      av_freep(&o->streamid_map);
  
      memset(o, 0, sizeof(*o));
  
 -    o->mux_max_delay  = 0.7;
 +    if (is_input) {
 +        o->recording_time = bak.recording_time;
 +        if (o->recording_time != INT64_MAX)
 +            av_log(NULL, AV_LOG_WARNING,
 +                   "-t is not an input option, keeping it for the next output;"
 +                   " consider fixing your command line.\n");
 +    } else
      o->recording_time = INT64_MAX;
 +    o->mux_max_delay  = 0.7;
      o->limit_filesize = UINT64_MAX;
      o->chapters_input_file = INT_MAX;
  
  }
  
  
 -static double parse_frame_aspect_ratio(const char *arg)
 +static int opt_frame_crop(void *optctx, const char *opt, const char *arg)
  {
 -    int x = 0, y = 0;
 -    double ar = 0;
 -    const char *p;
 -    char *end;
 -
 -    p = strchr(arg, ':');
 -    if (p) {
 -        x = strtol(arg, &end, 10);
 -        if (end == p)
 -            y = strtol(end + 1, &end, 10);
 -        if (x > 0 && y > 0)
 -            ar = (double)x / (double)y;
 -    } else
 -        ar = strtod(arg, NULL);
 +    av_log(NULL, AV_LOG_FATAL, "Option '%s' has been removed, use the crop filter instead\n", opt);
 +    return AVERROR(EINVAL);
 +}
  
 -    if (!ar) {
 -        av_log(NULL, AV_LOG_FATAL, "Incorrect aspect ratio specification.\n");
 -        exit(1);
 -    }
 -    return ar;
 +static int opt_pad(void *optctx, const char *opt, const char *arg)
 +{
 +    av_log(NULL, AV_LOG_FATAL, "Option '%s' has been removed, use the pad filter instead\n", opt);
 +    return -1;
 +}
 +
 +static int opt_sameq(void *optctx, const char *opt, const char *arg)
 +{
 +    av_log(NULL, AV_LOG_ERROR, "Option '%s' was removed. "
 +           "If you are looking for an option to preserve the quality (which is not "
 +           "what -%s was for), use -qscale 0 or an equivalent quality factor option.\n",
 +           opt, opt);
 +    return AVERROR(EINVAL);
 +}
 +
 +static int opt_video_channel(void *optctx, const char *opt, const char *arg)
 +{
 +    av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
 +    return opt_default(optctx, "channel", arg);
 +}
 +
 +static int opt_video_standard(void *optctx, const char *opt, const char *arg)
 +{
 +    av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
 +    return opt_default(optctx, "standard", arg);
  }
  
  static int opt_audio_codec(void *optctx, const char *opt, const char *arg)
@@@ -207,7 -173,7 +207,7 @@@ static int opt_map(void *optctx, const 
      OptionsContext *o = optctx;
      StreamMap *m = NULL;
      int i, negative = 0, file_idx;
 -    int sync_file_idx = -1, sync_stream_idx;
 +    int sync_file_idx = -1, sync_stream_idx = 0;
      char *p, *sync;
      char *map;
  
@@@ -308,67 -274,6 +308,67 @@@ static int opt_attach(void *optctx, con
      return 0;
  }
  
 +static int opt_map_channel(void *optctx, const char *opt, const char *arg)
 +{
 +    OptionsContext *o = optctx;
 +    int n;
 +    AVStream *st;
 +    AudioChannelMap *m;
 +
 +    o->audio_channel_maps =
 +        grow_array(o->audio_channel_maps, sizeof(*o->audio_channel_maps),
 +                   &o->nb_audio_channel_maps, o->nb_audio_channel_maps + 1);
 +    m = &o->audio_channel_maps[o->nb_audio_channel_maps - 1];
 +
 +    /* muted channel syntax */
 +    n = sscanf(arg, "%d:%d.%d", &m->channel_idx, &m->ofile_idx, &m->ostream_idx);
 +    if ((n == 1 || n == 3) && m->channel_idx == -1) {
 +        m->file_idx = m->stream_idx = -1;
 +        if (n == 1)
 +            m->ofile_idx = m->ostream_idx = -1;
 +        return 0;
 +    }
 +
 +    /* normal syntax */
 +    n = sscanf(arg, "%d.%d.%d:%d.%d",
 +               &m->file_idx,  &m->stream_idx, &m->channel_idx,
 +               &m->ofile_idx, &m->ostream_idx);
 +
 +    if (n != 3 && n != 5) {
 +        av_log(NULL, AV_LOG_FATAL, "Syntax error, mapchan usage: "
 +               "[file.stream.channel|-1][:syncfile:syncstream]\n");
 +        exit(1);
 +    }
 +
 +    if (n != 5) // only file.stream.channel specified
 +        m->ofile_idx = m->ostream_idx = -1;
 +
 +    /* check input */
 +    if (m->file_idx < 0 || m->file_idx >= nb_input_files) {
 +        av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file index: %d\n",
 +               m->file_idx);
 +        exit(1);
 +    }
 +    if (m->stream_idx < 0 ||
 +        m->stream_idx >= input_files[m->file_idx]->nb_streams) {
 +        av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file stream index #%d.%d\n",
 +               m->file_idx, m->stream_idx);
 +        exit(1);
 +    }
 +    st = input_files[m->file_idx]->ctx->streams[m->stream_idx];
 +    if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO) {
 +        av_log(NULL, AV_LOG_FATAL, "mapchan: stream #%d.%d is not an audio stream.\n",
 +               m->file_idx, m->stream_idx);
 +        exit(1);
 +    }
 +    if (m->channel_idx < 0 || m->channel_idx >= st->codec->channels) {
 +        av_log(NULL, AV_LOG_FATAL, "mapchan: invalid audio channel #%d.%d.%d\n",
 +               m->file_idx, m->stream_idx, m->channel_idx);
 +        exit(1);
 +    }
 +    return 0;
 +}
 +
  /**
   * Parse a metadata specifier passed as 'arg' parameter.
   * @param arg  metadata string to parse
@@@ -406,7 -311,7 +406,7 @@@ static void parse_meta_type(char *arg, 
  static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
  {
      AVDictionary **meta_in = NULL;
 -    AVDictionary **meta_out;
 +    AVDictionary **meta_out = NULL;
      int i, ret = 0;
      char type_in, type_out;
      const char *istream_spec = NULL, *ostream_spec = NULL;
      parse_meta_type(inspec,  &type_in,  &idx_in,  &istream_spec);
      parse_meta_type(outspec, &type_out, &idx_out, &ostream_spec);
  
 +    if (!ic) {
 +        if (type_out == 'g' || !*outspec)
 +            o->metadata_global_manual = 1;
 +        if (type_out == 's' || !*outspec)
 +            o->metadata_streams_manual = 1;
 +        if (type_out == 'c' || !*outspec)
 +            o->metadata_chapters_manual = 1;
 +        return 0;
 +    }
 +
      if (type_in == 'g' || type_out == 'g')
          o->metadata_global_manual = 1;
      if (type_in == 's' || type_out == 's')
              METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
              meta = &context->programs[index]->metadata;\
              break;\
-         default: av_assert0(0);\
          case 's':\
-             break;\
+             break; /* handled separately below */ \
+         default: av_assert0(0);\
          }\
  
      SET_DICT(type_in, meta_in, ic, idx_in);
      return 0;
  }
  
 +static int opt_recording_timestamp(void *optctx, const char *opt, const char *arg)
 +{
 +    OptionsContext *o = optctx;
 +    char buf[128];
 +    int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
 +    struct tm time = *gmtime((time_t*)&recording_timestamp);
 +    strftime(buf, sizeof(buf), "creation_time=%FT%T%z", &time);
 +    parse_option(o, "metadata", buf, options);
 +
 +    av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
 +                                 "tag instead.\n", opt);
 +    return 0;
 +}
 +
  static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
  {
      const AVCodecDescriptor *desc;
@@@ -554,7 -435,6 +554,7 @@@ static AVCodec *choose_decoder(OptionsC
  static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
  {
      int i;
 +    char *next, *codec_tag = NULL;
  
      for (i = 0; i < ic->nb_streams; i++) {
          AVStream *st = ic->streams[i];
          ist->file_index = nb_input_files;
          ist->discard = 1;
          st->discard  = AVDISCARD_ALL;
 -        ist->opts = filter_codec_opts(codec_opts, ist->st->codec->codec_id, ic, st, NULL);
 +        ist->opts = filter_codec_opts(codec_opts, ist->st->codec->codec_id, ic, st, choose_decoder(o, ic, st));
  
          ist->ts_scale = 1.0;
          MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
  
 +        MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
 +        if (codec_tag) {
 +            uint32_t tag = strtol(codec_tag, &next, 0);
 +            if (*next)
 +                tag = AV_RL32(codec_tag);
 +            st->codec->codec_tag = tag;
 +        }
 +
          ist->dec = choose_decoder(o, ic, st);
  
 +        ist->reinit_filters = -1;
 +        MATCH_PER_STREAM_OPT(reinit_filters, i, ist->reinit_filters, ic, st);
 +
 +        ist->filter_in_rescale_delta_last = AV_NOPTS_VALUE;
 +
          switch (dec->codec_type) {
          case AVMEDIA_TYPE_VIDEO:
 +            if(!ist->dec)
 +                ist->dec = avcodec_find_decoder(dec->codec_id);
 +            if (dec->lowres) {
 +                dec->flags |= CODEC_FLAG_EMU_EDGE;
 +            }
 +
              ist->resample_height  = dec->height;
              ist->resample_width   = dec->width;
              ist->resample_pix_fmt = dec->pix_fmt;
                  exit(1);
              }
  
 +            ist->top_field_first = -1;
 +            MATCH_PER_STREAM_OPT(top_field_first, i, ist->top_field_first, ic, st);
 +
              break;
          case AVMEDIA_TYPE_AUDIO:
              guess_input_channel_layout(ist);
              break;
          case AVMEDIA_TYPE_DATA:
          case AVMEDIA_TYPE_SUBTITLE:
 +            if(!ist->dec)
 +                ist->dec = avcodec_find_decoder(dec->codec_id);
 +            MATCH_PER_STREAM_OPT(fix_sub_duration, i, ist->fix_sub_duration, ic, st);
 +            break;
          case AVMEDIA_TYPE_ATTACHMENT:
          case AVMEDIA_TYPE_UNKNOWN:
              break;
  
  static void assert_file_overwrite(const char *filename)
  {
 -    if (!file_overwrite &&
 +    if ((!file_overwrite || no_file_overwrite) &&
          (strchr(filename, ':') == NULL || filename[1] == ':' ||
           av_strstart(filename, "file:", NULL))) {
          if (avio_check(filename, 0) == 0) {
 -            if (!using_stdin) {
 +            if (stdin_interaction && (!no_file_overwrite || file_overwrite)) {
                  fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
                  fflush(stderr);
 +                term_exit();
 +                signal(SIGINT, SIG_DFL);
                  if (!read_yesno()) {
 -                    fprintf(stderr, "Not overwriting - exiting\n");
 +                    av_log(NULL, AV_LOG_FATAL, "Not overwriting - exiting\n");
                      exit(1);
                  }
 +                term_init();
              }
              else {
 -                fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
 +                av_log(NULL, AV_LOG_FATAL, "File '%s' already exists. Exiting.\n", filename);
                  exit(1);
              }
          }
@@@ -707,9 -558,6 +707,9 @@@ static int opt_input_file(void *optctx
      uint8_t buf[128];
      AVDictionary **opts;
      int orig_nb_streams;                     // number of streams before avformat_find_stream_info
 +    char *   video_codec_name = NULL;
 +    char *   audio_codec_name = NULL;
 +    char *subtitle_codec_name = NULL;
  
      if (o->format) {
          if (!(file_iformat = av_find_input_format(o->format))) {
      if (!strcmp(filename, "-"))
          filename = "pipe:";
  
 -    using_stdin |= !strncmp(filename, "pipe:", 5) ||
 -                    !strcmp(filename, "/dev/stdin");
 +    stdin_interaction &= strncmp(filename, "pipe:", 5) &&
 +                         strcmp(filename, "/dev/stdin");
  
      /* get default parameters from command line */
      ic = avformat_alloc_context();
      if (o->nb_frame_pix_fmts)
          av_dict_set(&format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
  
 +    MATCH_PER_TYPE_OPT(codec_names, str,    video_codec_name, ic, "v");
 +    MATCH_PER_TYPE_OPT(codec_names, str,    audio_codec_name, ic, "a");
 +    MATCH_PER_TYPE_OPT(codec_names, str, subtitle_codec_name, ic, "s");
 +
 +    ic->video_codec_id   = video_codec_name ?
 +        find_codec_or_die(video_codec_name   , AVMEDIA_TYPE_VIDEO   , 0)->id : AV_CODEC_ID_NONE;
 +    ic->audio_codec_id   = audio_codec_name ?
 +        find_codec_or_die(audio_codec_name   , AVMEDIA_TYPE_AUDIO   , 0)->id : AV_CODEC_ID_NONE;
 +    ic->subtitle_codec_id= subtitle_codec_name ?
 +        find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0)->id : AV_CODEC_ID_NONE;
      ic->flags |= AVFMT_FLAG_NONBLOCK;
      ic->interrupt_callback = int_cb;
  
 -    /* open the input file with generic libav function */
 +    /* open the input file with generic avformat function */
      err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
      if (err < 0) {
          print_error(filename, err);
          av_dict_free(&opts[i]);
      av_freep(&opts);
  
 -    reset_options(o);
 +    reset_options(o, 1);
      return 0;
  }
  
@@@ -911,7 -749,7 +911,7 @@@ static void choose_encoder(OptionsConte
      }
  }
  
 -static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type)
 +static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type, int source_index)
  {
      OutputStream *ost;
      AVStream *st = avformat_new_stream(oc, NULL);
      ost->max_frames = INT64_MAX;
      MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
  
 +    ost->copy_prior_start = -1;
 +    MATCH_PER_STREAM_OPT(copy_prior_start, i, ost->copy_prior_start, oc ,st);
 +
      MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
      while (bsf) {
          if (next = strchr(bsf, ','))
          st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
  
      av_opt_get_int(sws_opts, "sws_flags", 0, &ost->sws_flags);
 -
 -    ost->pix_fmts[0] = ost->pix_fmts[1] = AV_PIX_FMT_NONE;
 +    av_opt_get_int   (swr_opts, "dither_method", 0, &ost->swr_dither_method);
 +    av_opt_get_double(swr_opts, "dither_scale" , 0, &ost->swr_dither_scale);
 +
 +    ost->source_index = source_index;
 +    if (source_index >= 0) {
 +        ost->sync_ist = input_streams[source_index];
 +        input_streams[source_index]->discard = 0;
 +        input_streams[source_index]->st->discard = AVDISCARD_NONE;
 +    }
  
      return ost;
  }
@@@ -1045,32 -873,31 +1045,32 @@@ static void parse_matrix_coeffs(uint16_
      }
  }
  
 -static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc)
 +static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
  {
      AVStream *st;
      OutputStream *ost;
      AVCodecContext *video_enc;
 +    char *frame_rate = NULL;
  
 -    ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO);
 +    ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO, source_index);
      st  = ost->st;
      video_enc = st->codec;
  
 +    MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
 +    if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
 +        av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
 +        exit(1);
 +    }
 +
      if (!ost->stream_copy) {
          const char *p = NULL;
 -        char *frame_rate = NULL, *frame_size = NULL;
 +        char *frame_size = NULL;
          char *frame_aspect_ratio = NULL, *frame_pix_fmt = NULL;
          char *intra_matrix = NULL, *inter_matrix = NULL;
          const char *filters = "null";
          int do_pass = 0;
          int i;
  
 -        MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
 -        if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
 -            av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
 -            exit(1);
 -        }
 -
          MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
          if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
              av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
          }
  
          MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
 -        if (frame_aspect_ratio)
 -            ost->frame_aspect_ratio = parse_frame_aspect_ratio(frame_aspect_ratio);
 +        if (frame_aspect_ratio) {
 +            AVRational q;
 +            if (av_parse_ratio(&q, frame_aspect_ratio, 255, 0, NULL) < 0 ||
 +                q.num <= 0 || q.den <= 0) {
 +                av_log(NULL, AV_LOG_FATAL, "Invalid aspect ratio: %s\n", frame_aspect_ratio);
 +                exit(1);
 +            }
 +            ost->frame_aspect_ratio = av_q2d(q);
 +        }
  
 +        video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
          MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
 +        if (frame_pix_fmt && *frame_pix_fmt == '+') {
 +            ost->keep_pix_fmt = 1;
 +            if (!*++frame_pix_fmt)
 +                frame_pix_fmt = NULL;
 +        }
          if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == AV_PIX_FMT_NONE) {
              av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
              exit(1);
          }
          st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
  
 +        if (intra_only)
 +            video_enc->gop_size = 0;
          MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
          if (intra_matrix) {
              if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
                  av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
                  exit(1);
              }
 +            /* FIXME realloc failure */
              video_enc->rc_override =
                  av_realloc(video_enc->rc_override,
                             sizeof(RcOverride) * (i + 1));
              video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size * 3 / 4;
          video_enc->intra_dc_precision = intra_dc_precision - 8;
  
 +        if (do_psnr)
 +            video_enc->flags|= CODEC_FLAG_PSNR;
 +
          /* two pass mode */
          MATCH_PER_STREAM_OPT(pass, i, do_pass, oc, st);
          if (do_pass) {
 -            if (do_pass == 1) {
 +            if (do_pass & 1) {
                  video_enc->flags |= CODEC_FLAG_PASS1;
 -            } else {
 +            }
 +            if (do_pass & 2) {
                  video_enc->flags |= CODEC_FLAG_PASS2;
              }
          }
      return ost;
  }
  
 -static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
 +static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
  {
 +    int n;
      AVStream *st;
      OutputStream *ost;
      AVCodecContext *audio_enc;
  
 -    ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO);
 +    ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO, source_index);
      st  = ost->st;
  
      audio_enc = st->codec;
          MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
  
          MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
 +
 +        av_assert1(filters);
          ost->avfilter = av_strdup(filters);
 +
 +        /* check for channel mapping for this audio stream */
 +        for (n = 0; n < o->nb_audio_channel_maps; n++) {
 +            AudioChannelMap *map = &o->audio_channel_maps[n];
 +            InputStream *ist = input_streams[ost->source_index];
 +            if ((map->channel_idx == -1 || (ist->file_index == map->file_idx && ist->st->index == map->stream_idx)) &&
 +                (map->ofile_idx   == -1 || ost->file_index == map->ofile_idx) &&
 +                (map->ostream_idx == -1 || ost->st->index  == map->ostream_idx)) {
 +                if (ost->audio_channels_mapped < FF_ARRAY_ELEMS(ost->audio_channels_map))
 +                    ost->audio_channels_map[ost->audio_channels_mapped++] = map->channel_idx;
 +                else
 +                    av_log(NULL, AV_LOG_FATAL, "Max channel mapping for output %d.%d reached\n",
 +                           ost->file_index, ost->st->index);
 +            }
 +        }
      }
  
      return ost;
  }
  
 -static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
 +static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
  {
      OutputStream *ost;
  
 -    ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA);
 +    ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA, source_index);
      if (!ost->stream_copy) {
          av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
          exit(1);
      return ost;
  }
  
 -static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc)
 +static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
  {
 -    OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT);
 +    OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT, source_index);
      ost->stream_copy = 1;
      return ost;
  }
  
 -static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc)
 +static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
  {
      AVStream *st;
      OutputStream *ost;
      AVCodecContext *subtitle_enc;
  
 -    ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE);
 +    ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE, source_index);
      st  = ost->st;
      subtitle_enc = st->codec;
  
      subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
  
 +    MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc, st);
 +
 +    if (!ost->stream_copy) {
 +        char *frame_size = NULL;
 +
 +        MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
 +        if (frame_size && av_parse_video_size(&subtitle_enc->width, &subtitle_enc->height, frame_size) < 0) {
 +            av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
 +            exit(1);
 +        }
 +    }
 +
      return ost;
  }
  
@@@ -1303,7 -1080,7 +1303,7 @@@ static int opt_streamid(void *optctx, c
          exit(1);
      }
      *p++ = '\0';
 -    idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, INT_MAX);
 +    idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
      o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
      o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
      return 0;
@@@ -1316,7 -1093,7 +1316,7 @@@ static int copy_chapters(InputFile *ifi
      AVChapter **tmp;
      int i;
  
 -    tmp = av_realloc(os->chapters, sizeof(*os->chapters) * (is->nb_chapters + os->nb_chapters));
 +    tmp = av_realloc_f(os->chapters, is->nb_chapters + os->nb_chapters, sizeof(*os->chapters));
      if (!tmp)
          return AVERROR(ENOMEM);
      os->chapters = tmp;
      return 0;
  }
  
 +static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
 +{
 +    int i, err;
 +    AVFormatContext *ic = avformat_alloc_context();
 +
 +    ic->interrupt_callback = int_cb;
 +    err = avformat_open_input(&ic, filename, NULL, NULL);
 +    if (err < 0)
 +        return err;
 +    /* copy stream format */
 +    for(i=0;i<ic->nb_streams;i++) {
 +        AVStream *st;
 +        OutputStream *ost;
 +        AVCodec *codec;
 +        AVCodecContext *avctx;
 +
 +        codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
 +        ost   = new_output_stream(o, s, codec->type, -1);
 +        st    = ost->st;
 +        avctx = st->codec;
 +        ost->enc = codec;
 +
 +        // FIXME: a more elegant solution is needed
 +        memcpy(st, ic->streams[i], sizeof(AVStream));
 +        st->cur_dts = 0;
 +        st->info = av_malloc(sizeof(*st->info));
 +        memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
 +        st->codec= avctx;
 +        avcodec_copy_context(st->codec, ic->streams[i]->codec);
 +
 +        if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !ost->stream_copy)
 +            choose_sample_fmt(st, codec);
 +        else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !ost->stream_copy)
 +            choose_pixel_fmt(st, codec, st->codec->pix_fmt);
 +    }
 +
 +    /* ffserver seeking with date=... needs a date reference */
 +    err = parse_option(o, "metadata", "creation_time=now", options);
 +
 +    avformat_close_input(&ic);
 +    return err;
 +}
 +
  static void init_output_filter(OutputFilter *ofilter, OptionsContext *o,
                                 AVFormatContext *oc)
  {
  
      switch (avfilter_pad_get_type(ofilter->out_tmp->filter_ctx->output_pads,
                                    ofilter->out_tmp->pad_idx)) {
 -    case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
 -    case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
 +    case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc, -1); break;
 +    case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc, -1); break;
      default:
          av_log(NULL, AV_LOG_FATAL, "Only video and audio filters are supported "
                 "currently.\n");
@@@ -1456,13 -1190,30 +1456,13 @@@ void opt_output_file(void *optctx, cons
      if (!strcmp(filename, "-"))
          filename = "pipe:";
  
 -    oc = avformat_alloc_context();
 +    err = avformat_alloc_output_context2(&oc, NULL, o->format, filename);
      if (!oc) {
 -        print_error(filename, AVERROR(ENOMEM));
 +        print_error(filename, err);
          exit(1);
      }
 -
 -    if (o->format) {
 -        file_oformat = av_guess_format(o->format, NULL, NULL);
 -        if (!file_oformat) {
 -            av_log(NULL, AV_LOG_FATAL, "Requested output format '%s' is not a suitable output format\n", o->format);
 -            exit(1);
 -        }
 -    } else {
 -        file_oformat = av_guess_format(NULL, filename, NULL);
 -        if (!file_oformat) {
 -            av_log(NULL, AV_LOG_FATAL, "Unable to find a suitable output format for '%s'\n",
 -                   filename);
 -            exit(1);
 -        }
 -    }
 -
 -    oc->oformat = file_oformat;
 +    file_oformat= oc->oformat;
      oc->interrupt_callback = int_cb;
 -    av_strlcpy(oc->filename, filename, sizeof(oc->filename));
  
      /* create streams for all unlabeled output pads */
      for (i = 0; i < nb_filtergraphs; i++) {
          }
      }
  
 -    if (!o->nb_stream_maps) {
 -        /* pick the "best" stream of each type */
 -#define NEW_STREAM(type, index)\
 -        if (index >= 0) {\
 -            ost = new_ ## type ## _stream(o, oc);\
 -            ost->source_index = index;\
 -            ost->sync_ist     = input_streams[index];\
 -            input_streams[index]->discard = 0;\
 -            input_streams[index]->st->discard = AVDISCARD_NONE;\
 +    if (!strcmp(file_oformat->name, "ffm") &&
 +        av_strstart(filename, "http:", NULL)) {
 +        int j;
 +        /* special case for files sent to ffserver: we get the stream
 +           parameters from ffserver */
 +        int err = read_ffserver_streams(o, oc, filename);
 +        if (err < 0) {
 +            print_error(filename, err);
 +            exit(1);
 +        }
 +        for(j = nb_output_streams - oc->nb_streams; j < nb_output_streams; j++) {
 +            ost = output_streams[j];
 +            for (i = 0; i < nb_input_streams; i++) {
 +                ist = input_streams[i];
 +                if(ist->st->codec->codec_type == ost->st->codec->codec_type){
 +                    ost->sync_ist= ist;
 +                    ost->source_index= i;
 +                    if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) ost->avfilter = av_strdup("anull");
 +                    if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) ost->avfilter = av_strdup("null");
 +                    ist->discard = 0;
 +                    ist->st->discard = AVDISCARD_NONE;
 +                    break;
 +                }
 +            }
 +            if(!ost->sync_ist){
 +                av_log(NULL, AV_LOG_FATAL, "Missing %s stream which is required by this ffm\n", av_get_media_type_string(ost->st->codec->codec_type));
 +                exit(1);
 +            }
          }
 +    } else if (!o->nb_stream_maps) {
 +        char *subtitle_codec_name = NULL;
 +        /* pick the "best" stream of each type */
  
          /* video: highest resolution */
          if (!o->video_disable && oc->oformat->video_codec != AV_CODEC_ID_NONE) {
              int area = 0, idx = -1;
 +            int qcr = avformat_query_codec(oc->oformat, oc->oformat->video_codec, 0);
              for (i = 0; i < nb_input_streams; i++) {
 +                int new_area;
                  ist = input_streams[i];
 +                new_area = ist->st->codec->width * ist->st->codec->height;
 +                if((qcr!=MKTAG('A', 'P', 'I', 'C')) && (ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
 +                    new_area = 1;
                  if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
 -                    ist->st->codec->width * ist->st->codec->height > area) {
 -                    area = ist->st->codec->width * ist->st->codec->height;
 +                    new_area > area) {
 +                    if((qcr==MKTAG('A', 'P', 'I', 'C')) && !(ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC))
 +                        continue;
 +                    area = new_area;
                      idx = i;
                  }
              }
 -            NEW_STREAM(video, idx);
 +            if (idx >= 0)
 +                new_video_stream(o, oc, idx);
          }
  
          /* audio: most channels */
                      idx = i;
                  }
              }
 -            NEW_STREAM(audio, idx);
 +            if (idx >= 0)
 +                new_audio_stream(o, oc, idx);
          }
  
          /* subtitles: pick first */
 -        if (!o->subtitle_disable && oc->oformat->subtitle_codec != AV_CODEC_ID_NONE) {
 +        MATCH_PER_TYPE_OPT(codec_names, str, subtitle_codec_name, oc, "s");
 +        if (!o->subtitle_disable && (oc->oformat->subtitle_codec != AV_CODEC_ID_NONE || subtitle_codec_name)) {
              for (i = 0; i < nb_input_streams; i++)
                  if (input_streams[i]->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
 -                    NEW_STREAM(subtitle, i);
 +                    new_subtitle_stream(o, oc, i);
                      break;
                  }
          }
      } else {
          for (i = 0; i < o->nb_stream_maps; i++) {
              StreamMap *map = &o->stream_maps[i];
 +            int src_idx = input_files[map->file_index]->ist_index + map->stream_index;
  
              if (map->disabled)
                  continue;
@@@ -1595,42 -1313,27 +1595,42 @@@ loop_end
                  init_output_filter(ofilter, o, oc);
              } else {
                  ist = input_streams[input_files[map->file_index]->ist_index + map->stream_index];
 +                if(o->subtitle_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE)
 +                    continue;
 +                if(o->   audio_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
 +                    continue;
 +                if(o->   video_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
 +                    continue;
 +                if(o->    data_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_DATA)
 +                    continue;
 +
                  switch (ist->st->codec->codec_type) {
 -                case AVMEDIA_TYPE_VIDEO:    ost = new_video_stream(o, oc);    break;
 -                case AVMEDIA_TYPE_AUDIO:    ost = new_audio_stream(o, oc);    break;
 -                case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(o, oc); break;
 -                case AVMEDIA_TYPE_DATA:     ost = new_data_stream(o, oc);     break;
 -                case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc); break;
 +                case AVMEDIA_TYPE_VIDEO:      ost = new_video_stream     (o, oc, src_idx); break;
 +                case AVMEDIA_TYPE_AUDIO:      ost = new_audio_stream     (o, oc, src_idx); break;
 +                case AVMEDIA_TYPE_SUBTITLE:   ost = new_subtitle_stream  (o, oc, src_idx); break;
 +                case AVMEDIA_TYPE_DATA:       ost = new_data_stream      (o, oc, src_idx); break;
 +                case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc, src_idx); break;
                  default:
                      av_log(NULL, AV_LOG_FATAL, "Cannot map stream #%d:%d - unsupported type.\n",
                             map->file_index, map->stream_index);
                      exit(1);
                  }
 -
 -                ost->source_index = input_files[map->file_index]->ist_index + map->stream_index;
 -                ost->sync_ist     = input_streams[input_files[map->sync_file_index]->ist_index +
 -                                               map->sync_stream_index];
 -                ist->discard = 0;
 -                ist->st->discard = AVDISCARD_NONE;
              }
          }
      }
  
 +
 +    for (i = nb_output_streams - oc->nb_streams; i < nb_output_streams; i++) { //for all streams of this output file
 +        AVDictionaryEntry *e;
 +        ost = output_streams[i];
 +
 +        if (   ost->stream_copy
 +            && (e = av_dict_get(codec_opts, "flags", NULL, AV_DICT_IGNORE_SUFFIX))
 +            && (!e->key[5] || check_stream_specifier(oc, ost->st, e->key+6)))
 +            if (av_opt_set(ost->st->codec, "flags", e->value, 0) < 0)
 +                exit(1);
 +    }
 +
      /* handle attached files */
      for (i = 0; i < o->nb_attachments; i++) {
          AVIOContext *pb;
          }
          avio_read(pb, attachment, len);
  
 -        ost = new_attachment_stream(o, oc);
 +        ost = new_attachment_stream(o, oc, -1);
          ost->stream_copy               = 0;
 -        ost->source_index              = -1;
          ost->attachment_filename       = o->attachments[i];
          ost->st->codec->extradata      = attachment;
          ost->st->codec->extradata_size = len;
          av_dict_set(&output_files[nb_output_files - 1]->opts, "preload", buf, 0);
      }
      oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
 -    oc->flags |= AVFMT_FLAG_NONBLOCK;
  
      /* copy metadata */
      for (i = 0; i < o->nb_metadata_map; i++) {
                        !o->metadata_chapters_manual);
  
      /* copy global metadata by default */
 -    if (!o->metadata_global_manual && nb_input_files)
 +    if (!o->metadata_global_manual && nb_input_files){
          av_dict_copy(&oc->metadata, input_files[0]->ctx->metadata,
                       AV_DICT_DONT_OVERWRITE);
 +        if(o->recording_time != INT64_MAX)
 +            av_dict_set(&oc->metadata, "duration", NULL, 0);
 +        av_dict_set(&oc->metadata, "creation_time", NULL, 0);
 +    }
      if (!o->metadata_streams_manual)
          for (i = output_files[nb_output_files - 1]->ost_index; i < nb_output_streams; i++) {
              InputStream *ist;
          AVDictionary **m;
          char type, *val;
          const char *stream_spec;
 -        int index = 0, j, ret;
 +        int index = 0, j, ret = 0;
  
          val = strchr(o->metadata[i].u.str, '=');
          if (!val) {
          }
      }
  
 -    reset_options(o);
 +    reset_options(o, 0);
  }
  
  static int opt_target(void *optctx, const char *opt, const char *arg)
          parse_option(o, "r", frame_rates[norm], options);
          opt_default(NULL, "g", norm == PAL ? "15" : "18");
  
 -        opt_default(NULL, "b", "1150000");
 +        opt_default(NULL, "b:v", "1150000");
          opt_default(NULL, "maxrate", "1150000");
          opt_default(NULL, "minrate", "1150000");
          opt_default(NULL, "bufsize", "327680"); // 40*1024*8;
  
          parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
          parse_option(o, "r", frame_rates[norm], options);
 +        parse_option(o, "pix_fmt", "yuv420p", options);
          opt_default(NULL, "g", norm == PAL ? "15" : "18");
  
 -        opt_default(NULL, "b", "2040000");
 +        opt_default(NULL, "b:v", "2040000");
          opt_default(NULL, "maxrate", "2516000");
          opt_default(NULL, "minrate", "0"); // 1145000;
          opt_default(NULL, "bufsize", "1835008"); // 224*1024*8;
 -        opt_default(NULL, "flags", "+scan_offset");
 -
 +        opt_default(NULL, "scan_offset", "1");
  
          opt_default(NULL, "b:a", "224000");
          parse_option(o, "ar", "44100", options);
  
          parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
          parse_option(o, "r", frame_rates[norm], options);
 +        parse_option(o, "pix_fmt", "yuv420p", options);
          opt_default(NULL, "g", norm == PAL ? "15" : "18");
  
 -        opt_default(NULL, "b", "6000000");
 +        opt_default(NULL, "b:v", "6000000");
          opt_default(NULL, "maxrate", "9000000");
          opt_default(NULL, "minrate", "0"); // 1500000;
          opt_default(NULL, "bufsize", "1835008"); // 224*1024*8;
@@@ -1980,97 -1680,22 +1980,97 @@@ static int opt_data_frames(void *optctx
      return parse_option(o, "frames:d", arg, options);
  }
  
 -static int opt_video_tag(void *optctx, const char *opt, const char *arg)
 +static int opt_preset(void *optctx, const char *opt, const char *arg)
  {
      OptionsContext *o = optctx;
 -    return parse_option(o, "tag:v", arg, options);
 +    FILE *f=NULL;
 +    char filename[1000], line[1000], tmp_line[1000];
 +    const char *codec_name = NULL;
 +
 +    tmp_line[0] = *opt;
 +    tmp_line[1] = 0;
 +    MATCH_PER_TYPE_OPT(codec_names, str, codec_name, NULL, tmp_line);
 +
 +    if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
 +        if(!strncmp(arg, "libx264-lossless", strlen("libx264-lossless"))){
 +            av_log(NULL, AV_LOG_FATAL, "Please use -preset <speed> -qp 0\n");
 +        }else
 +            av_log(NULL, AV_LOG_FATAL, "File for preset '%s' not found\n", arg);
 +        exit(1);
  }
  
 -static int opt_audio_tag(void *optctx, const char *opt, const char *arg)
 +    while (fgets(line, sizeof(line), f)) {
 +        char *key = tmp_line, *value, *endptr;
 +
 +        if (strcspn(line, "#\n\r") == 0)
 +            continue;
 +        strcpy(tmp_line, line);
 +        if (!av_strtok(key,   "=",    &value) ||
 +            !av_strtok(value, "\r\n", &endptr)) {
 +            av_log(NULL, AV_LOG_FATAL, "%s: Invalid syntax: '%s'\n", filename, line);
 +            exit(1);
 +        }
 +        av_log(NULL, AV_LOG_DEBUG, "ffpreset[%s]: set '%s' = '%s'\n", filename, key, value);
 +
 +        if      (!strcmp(key, "acodec")) opt_audio_codec   (o, key, value);
 +        else if (!strcmp(key, "vcodec")) opt_video_codec   (o, key, value);
 +        else if (!strcmp(key, "scodec")) opt_subtitle_codec(o, key, value);
 +        else if (!strcmp(key, "dcodec")) opt_data_codec    (o, key, value);
 +        else if (opt_default(NULL, key, value) < 0) {
 +            av_log(NULL, AV_LOG_FATAL, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n",
 +                   filename, line, key, value);
 +            exit(1);
 +        }
 +    }
 +
 +    fclose(f);
 +
 +    return 0;
 +}
 +
 +static int opt_old2new(void *optctx, const char *opt, const char *arg)
  {
      OptionsContext *o = optctx;
 -    return parse_option(o, "tag:a", arg, options);
 +    char *s = av_asprintf("%s:%c", opt + 1, *opt);
 +    int ret = parse_option(o, s, arg, options);
 +    av_free(s);
 +    return ret;
  }
  
 -static int opt_subtitle_tag(void *optctx, const char *opt, const char *arg)
 +static int opt_bitrate(void *optctx, const char *opt, const char *arg)
  {
      OptionsContext *o = optctx;
 -    return parse_option(o, "tag:s", arg, options);
 +    if(!strcmp(opt, "b")){
 +        av_log(NULL, AV_LOG_WARNING, "Please use -b:a or -b:v, -b is ambiguous\n");
 +        return parse_option(o, "b:v", arg, options);
 +    }
 +    return opt_default(optctx, opt, arg);
 +}
 +
 +static int opt_qscale(void *optctx, const char *opt, const char *arg)
 +{
 +    OptionsContext *o = optctx;
 +    char *s;
 +    int ret;
 +    if(!strcmp(opt, "qscale")){
 +        av_log(NULL, AV_LOG_WARNING, "Please use -q:a or -q:v, -qscale is ambiguous\n");
 +        return parse_option(o, "q:v", arg, options);
 +    }
 +    s = av_asprintf("q%s", opt + 6);
 +    ret = parse_option(o, s, arg, options);
 +    av_free(s);
 +    return ret;
 +}
 +
 +static int opt_profile(void *optctx, const char *opt, const char *arg)
 +{
 +    OptionsContext *o = optctx;
 +    if(!strcmp(opt, "profile")){
 +        av_log(NULL, AV_LOG_WARNING, "Please use -profile:a or -profile:v, -profile is ambiguous\n");
 +        return parse_option(o, "profile:v", arg, options);
 +    }
 +    return opt_default(optctx, opt, arg);
 +
  }
  
  static int opt_video_filters(void *optctx, const char *opt, const char *arg)
@@@ -2090,7 -1715,6 +2090,7 @@@ static int opt_vsync(void *optctx, cons
      if      (!av_strcasecmp(arg, "cfr"))         video_sync_method = VSYNC_CFR;
      else if (!av_strcasecmp(arg, "vfr"))         video_sync_method = VSYNC_VFR;
      else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
 +    else if (!av_strcasecmp(arg, "drop"))        video_sync_method = VSYNC_DROP;
  
      if (video_sync_method == VSYNC_AUTO)
          video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
@@@ -2104,15 -1728,15 +2104,15 @@@ static int opt_deinterlace(void *optctx
      return 0;
  }
  
 -int opt_cpuflags(void *optctx, const char *opt, const char *arg)
 +static int opt_timecode(void *optctx, const char *opt, const char *arg)
  {
 -    int flags = av_parse_cpu_flags(arg);
 -
 -    if (flags < 0)
 -        return flags;
 -
 -    av_set_cpu_flags_mask(flags);
 -    return 0;
 +    OptionsContext *o = optctx;
 +    char *tcr = av_asprintf("timecode=%s", arg);
 +    int ret = parse_option(o, "metadata:g", tcr, options);
 +    if (ret >= 0)
 +        ret = opt_default(optctx, "gop_timecode", arg);
 +    av_free(tcr);
 +    return ret;
  }
  
  static int opt_channel_layout(void *optctx, const char *opt, const char *arg)
@@@ -2229,36 -1853,17 +2229,36 @@@ void show_help_default(const char *opt
          show_help_children(avcodec_get_class(), flags);
          show_help_children(avformat_get_class(), flags);
          show_help_children(sws_get_class(), flags);
 +        show_help_children(swr_get_class(), AV_OPT_FLAG_AUDIO_PARAM);
 +        show_help_children(avfilter_get_class(), AV_OPT_FLAG_FILTERING_PARAM);
      }
  }
  
  void show_usage(void)
  {
 -    printf("Hyper fast Audio and Video encoder\n");
 -    printf("usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
 -    printf("\n");
 +    av_log(NULL, AV_LOG_INFO, "Hyper fast Audio and Video encoder\n");
 +    av_log(NULL, AV_LOG_INFO, "usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
 +    av_log(NULL, AV_LOG_INFO, "\n");
  }
  
  
 +static int opt_progress(void *optctx, const char *opt, const char *arg)
 +{
 +    AVIOContext *avio = NULL;
 +    int ret;
 +
 +    if (!strcmp(arg, "-"))
 +        arg = "pipe:";
 +    ret = avio_open2(&avio, arg, AVIO_FLAG_WRITE, &int_cb, NULL);
 +    if (ret < 0) {
 +        av_log(NULL, AV_LOG_ERROR, "Failed to open progress URL \"%s\": %s\n",
 +               arg, av_err2str(ret));
 +        return ret;
 +    }
 +    progress_avio = avio;
 +    return 0;
 +}
 +
  #define OFFSET(x) offsetof(OptionsContext, x)
  const OptionDef options[] = {
      /* main options */
          "input file name", "filename" },
      { "y",              OPT_BOOL,                                    {              &file_overwrite },
          "overwrite output files" },
 +    { "n",              OPT_BOOL,                                    {              &no_file_overwrite },
 +        "do not overwrite output files" },
      { "c",              HAS_ARG | OPT_STRING | OPT_SPEC,             { .off       = OFFSET(codec_names) },
          "codec name", "codec" },
      { "codec",          HAS_ARG | OPT_STRING | OPT_SPEC,             { .off       = OFFSET(codec_names) },
      { "map",            HAS_ARG | OPT_EXPERT | OPT_PERFILE,          { .func_arg = opt_map },
          "set input stream mapping",
          "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
 +    { "map_channel",    HAS_ARG | OPT_EXPERT | OPT_PERFILE,          { .func_arg = opt_map_channel },
 +        "map an audio channel from one stream to another", "file.stream.channel[:syncfile.syncstream]" },
      { "map_metadata",   HAS_ARG | OPT_STRING | OPT_SPEC,             { .off       = OFFSET(metadata_map) },
          "set metadata information of outfile from infile",
          "outfile[,metadata]:infile[,metadata]" },
          "set the input ts offset", "time_off" },
      { "itsscale",       HAS_ARG | OPT_DOUBLE | OPT_SPEC | OPT_EXPERT,{ .off = OFFSET(ts_scale) },
          "set the input ts scale", "scale" },
 +    { "timestamp",      HAS_ARG | OPT_PERFILE,                       { .func_arg = opt_recording_timestamp },
 +        "set the recording timestamp ('now' to set the current time)", "time" },
      { "metadata",       HAS_ARG | OPT_STRING | OPT_SPEC,             { .off = OFFSET(metadata) },
          "add metadata", "string=string" },
      { "dframes",        HAS_ARG | OPT_PERFILE | OPT_EXPERT,          { .func_arg = opt_data_frames },
          "set the number of data frames to record", "number" },
      { "benchmark",      OPT_BOOL | OPT_EXPERT,                       { &do_benchmark },
          "add timings for benchmarking" },
 +    { "benchmark_all",  OPT_BOOL | OPT_EXPERT,                       { &do_benchmark_all },
 +      "add timings for each task" },
 +    { "progress",       HAS_ARG | OPT_EXPERT,                        { .func_arg = opt_progress },
 +      "write program-readable progress information", "url" },
 +    { "stdin",          OPT_BOOL | OPT_EXPERT,                       { &stdin_interaction },
 +      "enable or disable interaction on standard input" },
      { "timelimit",      HAS_ARG | OPT_EXPERT,                        { .func_arg = opt_timelimit },
          "set max runtime in seconds", "limit" },
      { "dump",           OPT_BOOL | OPT_EXPERT,                       { &do_pkt_dump },
          "audio drift threshold", "threshold" },
      { "copyts",         OPT_BOOL | OPT_EXPERT,                       { &copy_ts },
          "copy timestamps" },
 -    { "copytb",         OPT_BOOL | OPT_EXPERT,                       { &copy_tb },
 -        "copy input stream time base when stream copying" },
 +    { "copytb",         HAS_ARG | OPT_INT | OPT_EXPERT,              { &copy_tb },
 +        "copy input stream time base when stream copying", "mode" },
      { "shortest",       OPT_BOOL | OPT_EXPERT | OPT_OFFSET,          { .off = OFFSET(shortest) },
          "finish encoding within shortest input" },
      { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT,       { &dts_delta_threshold },
          "timestamp discontinuity delta threshold", "threshold" },
 +    { "dts_error_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT,       { &dts_error_threshold },
 +        "timestamp error delta threshold", "threshold" },
      { "xerror",         OPT_BOOL | OPT_EXPERT,                       { &exit_on_error },
          "exit on error", "error" },
      { "copyinkf",       OPT_BOOL | OPT_EXPERT | OPT_SPEC,            { .off = OFFSET(copy_initial_nonkeyframes) },
          "copy initial non-keyframes" },
 +    { "copypriorss",    OPT_INT | HAS_ARG | OPT_EXPERT | OPT_SPEC,   { .off = OFFSET(copy_prior_start) },
 +        "copy or discard frames before start time" },
      { "frames",         OPT_INT64 | HAS_ARG | OPT_SPEC,              { .off = OFFSET(max_frames) },
          "set the number of frames to record", "number" },
      { "tag",            OPT_STRING | HAS_ARG | OPT_SPEC | OPT_EXPERT,{ .off = OFFSET(codec_tags) },
          "force codec tag/fourcc", "fourcc/tag" },
      { "q",              HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC,{ .off = OFFSET(qscale) },
          "use fixed quality scale (VBR)", "q" },
 -    { "qscale",         HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC,{ .off = OFFSET(qscale) },
 +    { "qscale",         HAS_ARG | OPT_EXPERT | OPT_PERFILE,          { .func_arg = opt_qscale },
          "use fixed quality scale (VBR)", "q" },
 +    { "profile",        HAS_ARG | OPT_EXPERT | OPT_PERFILE,          { .func_arg = opt_profile },
 +        "set profile", "profile" },
      { "filter",         HAS_ARG | OPT_STRING | OPT_SPEC,             { .off = OFFSET(filters) },
          "set stream filterchain", "filter_list" },
 +    { "reinit_filter",  HAS_ARG | OPT_INT | OPT_SPEC,                { .off = OFFSET(reinit_filters) },
 +        "reinit filtergraph on input parameter changes", "" },
      { "filter_complex", HAS_ARG | OPT_EXPERT,                        { .func_arg = opt_filter_complex },
          "create a complex filtergraph", "graph_description" },
      { "stats",          OPT_BOOL,                                    { &print_stats },
          "add an attachment to the output file", "filename" },
      { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC |OPT_EXPERT,{ .off = OFFSET(dump_attachment) },
          "extract an attachment into a file", "filename" },
 -    { "cpuflags",       HAS_ARG | OPT_EXPERT,                        { .func_arg = opt_cpuflags },
 -        "set CPU flags mask", "mask" },
 +    { "debug_ts",       OPT_BOOL | OPT_EXPERT,                       { &debug_ts },
 +        "print timestamp debugging info" },
  
      /* video options */
      { "vframes",      OPT_VIDEO | HAS_ARG  | OPT_PERFILE,                        { .func_arg = opt_video_frames },
          "set the number of video frames to record", "number" },
      { "r",            OPT_VIDEO | HAS_ARG  | OPT_STRING | OPT_SPEC,              { .off = OFFSET(frame_rates) },
          "set frame rate (Hz value, fraction or abbreviation)", "rate" },
 -    { "s",            OPT_VIDEO | HAS_ARG  | OPT_STRING | OPT_SPEC,              { .off = OFFSET(frame_sizes) },
 +    { "s",            OPT_VIDEO | HAS_ARG | OPT_SUBTITLE | OPT_STRING | OPT_SPEC,{ .off = OFFSET(frame_sizes) },
          "set frame size (WxH or abbreviation)", "size" },
      { "aspect",       OPT_VIDEO | HAS_ARG  | OPT_STRING | OPT_SPEC,              { .off = OFFSET(frame_aspect_ratios) },
          "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
      { "pix_fmt",      OPT_VIDEO | HAS_ARG | OPT_EXPERT  | OPT_STRING | OPT_SPEC, { .off = OFFSET(frame_pix_fmts) },
          "set pixel format", "format" },
 +    { "bits_per_raw_sample", OPT_VIDEO | OPT_INT | HAS_ARG,                      { &frame_bits_per_raw_sample },
 +        "set the number of bits per raw sample", "number" },
 +    { "croptop",      OPT_VIDEO | HAS_ARG,                                       { .func_arg = opt_frame_crop },
 +        "Removed, use the crop filter instead", "size" },
 +    { "cropbottom",   OPT_VIDEO | HAS_ARG,                                       { .func_arg = opt_frame_crop },
 +        "Removed, use the crop filter instead", "size" },
 +    { "cropleft",     OPT_VIDEO | HAS_ARG,                                       { .func_arg = opt_frame_crop },
 +        "Removed, use the crop filter instead", "size" },
 +    { "cropright",    OPT_VIDEO | HAS_ARG,                                       { .func_arg = opt_frame_crop },
 +        "Removed, use the crop filter instead", "size" },
 +    { "padtop",       OPT_VIDEO | HAS_ARG,                                       { .func_arg = opt_pad },
 +        "Removed, use the pad filter instead", "size" },
 +    { "padbottom",    OPT_VIDEO | HAS_ARG,                                       { .func_arg = opt_pad },
 +        "Removed, use the pad filter instead", "size" },
 +    { "padleft",      OPT_VIDEO | HAS_ARG,                                       { .func_arg = opt_pad },
 +        "Removed, use the pad filter instead", "size" },
 +    { "padright",     OPT_VIDEO | HAS_ARG,                                       { .func_arg = opt_pad },
 +        "Removed, use the pad filter instead", "size" },
 +    { "padcolor",     OPT_VIDEO | HAS_ARG,                                       { .func_arg = opt_pad },
 +        "Removed, use the pad filter instead", "color" },
 +    { "intra",        OPT_VIDEO | OPT_BOOL | OPT_EXPERT,                         { &intra_only },
 +        "deprecated use -g 1" },
      { "vn",           OPT_VIDEO | OPT_BOOL  | OPT_OFFSET,                        { .off = OFFSET(video_disable) },
          "disable video" },
      { "vdt",          OPT_VIDEO | OPT_INT | HAS_ARG | OPT_EXPERT ,               { &video_discard },
          "rate control override for specific intervals", "override" },
      { "vcodec",       OPT_VIDEO | HAS_ARG  | OPT_PERFILE,                        { .func_arg = opt_video_codec },
          "force video codec ('copy' to copy stream)", "codec" },
 +    { "sameq",        OPT_VIDEO | OPT_EXPERT ,                                   { .func_arg = opt_sameq },
 +        "Removed" },
 +    { "same_quant",   OPT_VIDEO | OPT_EXPERT ,                                   { .func_arg = opt_sameq },
 +        "Removed" },
 +    { "timecode",     OPT_VIDEO | HAS_ARG | OPT_PERFILE,                         { .func_arg = opt_timecode },
 +        "set initial TimeCode value.", "hh:mm:ss[:;.]ff" },
      { "pass",         OPT_VIDEO | HAS_ARG | OPT_SPEC | OPT_INT,                  { .off = OFFSET(pass) },
 -        "select the pass number (1 or 2)", "n" },
 +        "select the pass number (1 to 3)", "n" },
      { "passlogfile",  OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_EXPERT | OPT_SPEC,  { .off = OFFSET(passlogfiles) },
          "select two pass log file name prefix", "prefix" },
      { "deinterlace",  OPT_VIDEO | OPT_EXPERT ,                                   { .func_arg = opt_deinterlace },
          "this option is deprecated, use the yadif filter instead" },
 +    { "psnr",         OPT_VIDEO | OPT_BOOL | OPT_EXPERT,                         { &do_psnr },
 +        "calculate PSNR of compressed frames" },
      { "vstats",       OPT_VIDEO | OPT_EXPERT ,                                   { &opt_vstats },
          "dump video coding statistics to file" },
      { "vstats_file",  OPT_VIDEO | HAS_ARG | OPT_EXPERT ,                         { opt_vstats_file },
          "top=1/bottom=0/auto=-1 field first", "" },
      { "dc",           OPT_VIDEO | OPT_INT | HAS_ARG | OPT_EXPERT ,               { &intra_dc_precision },
          "intra_dc_precision", "precision" },
 -    { "vtag",         OPT_VIDEO | HAS_ARG | OPT_EXPERT  | OPT_PERFILE,           { .func_arg = opt_video_tag },
 +    { "vtag",         OPT_VIDEO | HAS_ARG | OPT_EXPERT  | OPT_PERFILE,           { .func_arg = opt_old2new },
          "force video tag/fourcc", "fourcc/tag" },
      { "qphist",       OPT_VIDEO | OPT_BOOL | OPT_EXPERT ,                        { &qp_hist },
          "show QP histogram" },
      { "streamid",     OPT_VIDEO | HAS_ARG | OPT_EXPERT | OPT_PERFILE,            { .func_arg = opt_streamid },
          "set the value of an outfile streamid", "streamIndex:value" },
      { "force_key_frames", OPT_VIDEO | OPT_STRING | HAS_ARG | OPT_EXPERT  | OPT_SPEC,
 -        { .off = OFFSET(forced_key_frames) }, "force key frames at specified timestamps", "timestamps" },
 +        { .off = OFFSET(forced_key_frames) },
 +        "force key frames at specified timestamps", "timestamps" },
 +    { "b",            OPT_VIDEO | HAS_ARG | OPT_PERFILE,                         { .func_arg = opt_bitrate },
 +        "video bitrate (please use -b:v)", "bitrate" },
  
      /* audio options */
      { "aframes",        OPT_AUDIO | HAS_ARG  | OPT_PERFILE,                        { .func_arg = opt_audio_frames },
          "disable audio" },
      { "acodec",         OPT_AUDIO | HAS_ARG  | OPT_PERFILE,                        { .func_arg = opt_audio_codec },
          "force audio codec ('copy' to copy stream)", "codec" },
 -    { "atag",           OPT_AUDIO | HAS_ARG  | OPT_EXPERT | OPT_PERFILE,           { .func_arg = opt_audio_tag },
 +    { "atag",           OPT_AUDIO | HAS_ARG  | OPT_EXPERT | OPT_PERFILE,           { .func_arg = opt_old2new },
          "force audio tag/fourcc", "fourcc/tag" },
      { "vol",            OPT_AUDIO | HAS_ARG  | OPT_INT,                            { &audio_volume },
          "change audio volume (256=normal)" , "volume" },
          "disable subtitle" },
      { "scodec", OPT_SUBTITLE | HAS_ARG  | OPT_PERFILE, { .func_arg = opt_subtitle_codec },
          "force subtitle codec ('copy' to copy stream)", "codec" },
 -    { "stag",   OPT_SUBTITLE | HAS_ARG  | OPT_EXPERT  | OPT_PERFILE, { .func_arg = opt_subtitle_tag }
 +    { "stag",   OPT_SUBTITLE | HAS_ARG  | OPT_EXPERT  | OPT_PERFILE, { .func_arg = opt_old2new }
          , "force subtitle tag/fourcc", "fourcc/tag" },
 +    { "fix_sub_duration", OPT_BOOL | OPT_EXPERT | OPT_SUBTITLE | OPT_SPEC, { .off = OFFSET(fix_sub_duration) },
 +        "fix subtitles duration" },
  
      /* grab options */
 +    { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_video_channel },
 +        "deprecated, use -channel", "channel" },
 +    { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO, { .func_arg = opt_video_standard },
 +        "deprecated, use -standard", "standard" },
      { "isync", OPT_BOOL | OPT_EXPERT, { &input_sync }, "this option is deprecated and does nothing", "" },
  
      /* muxer options */
  
      { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC | OPT_EXPERT, { .off = OFFSET(bitstream_filters) },
          "A comma-separated list of bitstream filters", "bitstream_filters" },
 -
 +    { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_PERFILE, { .func_arg = opt_old2new },
 +        "deprecated", "audio bitstream_filters" },
 +    { "vbsf", OPT_VIDEO | HAS_ARG | OPT_EXPERT| OPT_PERFILE, { .func_arg = opt_old2new },
 +        "deprecated", "video bitstream_filters" },
 +
 +    { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_PERFILE,    { .func_arg = opt_preset },
 +        "set the audio options to the indicated preset", "preset" },
 +    { "vpre", OPT_VIDEO | HAS_ARG | OPT_EXPERT| OPT_PERFILE,    { .func_arg = opt_preset },
 +        "set the video options to the indicated preset", "preset" },
 +    { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT| OPT_PERFILE, { .func_arg = opt_preset },
 +        "set the subtitle options to the indicated preset", "preset" },
 +    { "fpre", HAS_ARG | OPT_EXPERT| OPT_PERFILE,                { .func_arg = opt_preset },
 +        "set options from indicated preset file", "filename" },
      /* data codec support */
      { "dcodec", HAS_ARG | OPT_DATA | OPT_PERFILE | OPT_EXPERT, { .func_arg = opt_data_codec },
          "force data codec ('copy' to copy stream)", "codec" },
 +    { "dn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, { .off = OFFSET(data_disable) },
 +        "disable data" },
  
      { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, { .func_arg = opt_default },
          "generic catch all option", "" },
@@@ -3,20 -3,20 +3,20 @@@
  ;* Copyright (c) 2005 Zoltan Hidvegi <hzoli -a- hzoli -d- com>,
  ;*               2005-2008 Loren Merritt
  ;*
 -;* This file is part of Libav.
 +;* This file is part of FFmpeg.
  ;*
 -;* Libav is free software; you can redistribute it and/or
 +;* 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.
  ;*
 -;* Libav is distributed in the hope that it will be useful,
 +;* FFmpeg is distributed in the hope that it will be useful,
  ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
  ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  ;* Lesser General Public License for more details.
  ;*
  ;* You should have received a copy of the GNU Lesser General Public
 -;* License along with Libav; if not, write to the Free Software
 +;* License along with FFmpeg; if not, write to the Free Software
  ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  ;******************************************************************************
  
@@@ -89,7 -89,7 +89,7 @@@ SECTION .tex
      jne .next4rows
  %endmacro
  
- %macro chroma_mc8_mmx_func 3
+ %macro chroma_mc8_mmx_func 2-3
  %ifidn %2, rv40
  %ifdef PIC
  %define rnd_1d_rv40 r8
  %else
  %define extra_regs 0
  %endif ; rv40
- ; put/avg_h264_chroma_mc8_mmx_*(uint8_t *dst /*align 8*/, uint8_t *src /*align 1*/,
- ;                              int stride, int h, int mx, int my)
- cglobal %1_%2_chroma_mc8_%3, 6, 7 + extra_regs, 0
+ ; put/avg_h264_chroma_mc8_*(uint8_t *dst /*align 8*/, uint8_t *src /*align 1*/,
+ ;                           int stride, int h, int mx, int my)
+ cglobal %1_%2_chroma_mc8%3, 6, 7 + extra_regs, 0
  %if ARCH_X86_64
      movsxd        r2, r2d
  %endif
      RET
  %endmacro
  
- %macro chroma_mc4_mmx_func 3
+ %macro chroma_mc4_mmx_func 2
  %define extra_regs 0
  %ifidn %2, rv40
  %ifdef PIC
  %define extra_regs 1
  %endif ; PIC
  %endif ; rv40
- cglobal %1_%2_chroma_mc4_%3, 6, 6 + extra_regs, 0
+ cglobal %1_%2_chroma_mc4, 6, 6 + extra_regs, 0
  %if ARCH_X86_64
      movsxd        r2, r2d
  %endif
      REP_RET
  %endmacro
  
- %macro chroma_mc2_mmx_func 3
- cglobal %1_%2_chroma_mc2_%3, 6, 7, 0
+ %macro chroma_mc2_mmx_func 2
+ cglobal %1_%2_chroma_mc2, 6, 7, 0
  %if ARCH_X86_64
      movsxd        r2, r2d
  %endif
      PAVG          %1, %2
  %endmacro
  
- INIT_MMX
+ INIT_MMX mmx
  %define CHROMAMC_AVG  NOTHING
  %define CHROMAMC_AVG4 NOTHING
- chroma_mc8_mmx_func put, h264, rnd_mmx
- chroma_mc8_mmx_func put, vc1,  nornd_mmx
- chroma_mc8_mmx_func put, rv40, mmx
- chroma_mc4_mmx_func put, h264, mmx
- chroma_mc4_mmx_func put, rv40, mmx
- chroma_mc2_mmx_func put, h264, mmxext
+ chroma_mc8_mmx_func put, h264, _rnd
+ chroma_mc8_mmx_func put, vc1,  _nornd
+ chroma_mc8_mmx_func put, rv40
+ chroma_mc4_mmx_func put, h264
+ chroma_mc4_mmx_func put, rv40
+ INIT_MMX mmxext
+ chroma_mc2_mmx_func put, h264
  
  %define CHROMAMC_AVG  DIRECT_AVG
  %define CHROMAMC_AVG4 COPY_AVG
  %define PAVG          pavgb
- chroma_mc8_mmx_func avg, h264, rnd_mmxext
- chroma_mc8_mmx_func avg, vc1,  nornd_mmxext
- chroma_mc8_mmx_func avg, rv40, mmxext
- chroma_mc4_mmx_func avg, h264, mmxext
- chroma_mc4_mmx_func avg, rv40, mmxext
- chroma_mc2_mmx_func avg, h264, mmxext
+ chroma_mc8_mmx_func avg, h264, _rnd
+ chroma_mc8_mmx_func avg, vc1,  _nornd
+ chroma_mc8_mmx_func avg, rv40
+ chroma_mc4_mmx_func avg, h264
+ chroma_mc4_mmx_func avg, rv40
+ chroma_mc2_mmx_func avg, h264
  
  %define PAVG          pavgusb
- chroma_mc8_mmx_func avg, h264, rnd_3dnow
- chroma_mc8_mmx_func avg, vc1,  nornd_3dnow
- chroma_mc8_mmx_func avg, rv40, 3dnow
- chroma_mc4_mmx_func avg, h264, 3dnow
- chroma_mc4_mmx_func avg, rv40, 3dnow
- %macro chroma_mc8_ssse3_func 3
- cglobal %1_%2_chroma_mc8_%3, 6, 7, 8
+ INIT_MMX 3dnow
+ chroma_mc8_mmx_func avg, h264, _rnd
+ chroma_mc8_mmx_func avg, vc1,  _nornd
+ chroma_mc8_mmx_func avg, rv40
+ chroma_mc4_mmx_func avg, h264
+ chroma_mc4_mmx_func avg, rv40
+ %macro chroma_mc8_ssse3_func 2-3
+ cglobal %1_%2_chroma_mc8%3, 6, 7, 8
  %if ARCH_X86_64
      movsxd        r2, r2d
  %endif
      REP_RET
  %endmacro
  
- %macro chroma_mc4_ssse3_func 3
- cglobal %1_%2_chroma_mc4_%3, 6, 7, 0
+ %macro chroma_mc4_ssse3_func 2
+ cglobal %1_%2_chroma_mc4, 6, 7, 0
  %if ARCH_X86_64
      movsxd        r2, r2d
  %endif
  %endmacro
  
  %define CHROMAMC_AVG NOTHING
- INIT_XMM
- chroma_mc8_ssse3_func put, h264, rnd_ssse3
- chroma_mc8_ssse3_func put, vc1,  nornd_ssse3
- INIT_MMX
- chroma_mc4_ssse3_func put, h264, ssse3
+ INIT_XMM ssse3
+ chroma_mc8_ssse3_func put, h264, _rnd
+ chroma_mc8_ssse3_func put, vc1,  _nornd
+ INIT_MMX ssse3
+ chroma_mc4_ssse3_func put, h264
  
  %define CHROMAMC_AVG DIRECT_AVG
  %define PAVG         pavgb
- INIT_XMM
- chroma_mc8_ssse3_func avg, h264, rnd_ssse3
- chroma_mc8_ssse3_func avg, vc1,  nornd_ssse3
- INIT_MMX
- chroma_mc4_ssse3_func avg, h264, ssse3
+ INIT_XMM ssse3
+ chroma_mc8_ssse3_func avg, h264, _rnd
+ chroma_mc8_ssse3_func avg, vc1,  _nornd
+ INIT_MMX ssse3
+ chroma_mc4_ssse3_func avg, h264
diff --combined libavformat/riff.c
@@@ -2,20 -2,20 +2,20 @@@
   * RIFF common functions and data
   * Copyright (c) 2000 Fabrice Bellard
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * 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.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
  #include "avio_internal.h"
  #include "riff.h"
  #include "libavcodec/bytestream.h"
 +#include "libavutil/avassert.h"
  
  /* Note: when encoding, the first matching tag is used, so order is
 -   important if multiple tags possible for a given codec. */
 +   important if multiple tags possible for a given codec.
 +   Note also that this list is used for more than just riff, other
 +   files use it as well.
 +*/
  const AVCodecTag ff_codec_bmp_tags[] = {
      { AV_CODEC_ID_H264,         MKTAG('H', '2', '6', '4') },
      { AV_CODEC_ID_H264,         MKTAG('h', '2', '6', '4') },
@@@ -39,9 -35,7 +39,9 @@@
      { AV_CODEC_ID_H264,         MKTAG('x', '2', '6', '4') },
      { AV_CODEC_ID_H264,         MKTAG('a', 'v', 'c', '1') },
      { AV_CODEC_ID_H264,         MKTAG('D', 'A', 'V', 'C') },
 +    { AV_CODEC_ID_H264,         MKTAG('S', 'M', 'V', '2') },
      { AV_CODEC_ID_H264,         MKTAG('V', 'S', 'S', 'H') },
 +    { AV_CODEC_ID_H264,         MKTAG('Q', '2', '6', '4') }, /* QNAP surveillance system */
      { AV_CODEC_ID_H263,         MKTAG('H', '2', '6', '3') },
      { AV_CODEC_ID_H263,         MKTAG('X', '2', '6', '3') },
      { AV_CODEC_ID_H263,         MKTAG('T', '2', '6', '3') },
      { AV_CODEC_ID_H263,         MKTAG('V', 'X', '1', 'K') },
      { AV_CODEC_ID_H263,         MKTAG('Z', 'y', 'G', 'o') },
      { AV_CODEC_ID_H263,         MKTAG('M', '2', '6', '3') },
 +    { AV_CODEC_ID_H263,         MKTAG('l', 's', 'v', 'm') },
      { AV_CODEC_ID_H263P,        MKTAG('H', '2', '6', '3') },
      { AV_CODEC_ID_H263I,        MKTAG('I', '2', '6', '3') }, /* intel h263 */
      { AV_CODEC_ID_H261,         MKTAG('H', '2', '6', '1') },
 -    { AV_CODEC_ID_H263P,        MKTAG('U', '2', '6', '3') },
 -    { AV_CODEC_ID_H263P,        MKTAG('v', 'i', 'v', '1') },
 +    { AV_CODEC_ID_H263,         MKTAG('U', '2', '6', '3') },
      { AV_CODEC_ID_MPEG4,        MKTAG('F', 'M', 'P', '4') },
      { AV_CODEC_ID_MPEG4,        MKTAG('D', 'I', 'V', 'X') },
      { AV_CODEC_ID_MPEG4,        MKTAG('D', 'X', '5', '0') },
      { AV_CODEC_ID_MPEG4,        MKTAG('U', 'L', 'D', 'X') },
      { AV_CODEC_ID_MPEG4,        MKTAG('G', 'E', 'O', 'V') },
      { AV_CODEC_ID_MPEG4,        MKTAG('S', 'I', 'P', 'P') }, /* Samsung SHR-6040 */
 +    { AV_CODEC_ID_MPEG4,        MKTAG('S', 'M', '4', 'V') },
      { AV_CODEC_ID_MPEG4,        MKTAG('X', 'V', 'I', 'X') },
      { AV_CODEC_ID_MPEG4,        MKTAG('D', 'r', 'e', 'X') },
 +    { AV_CODEC_ID_MPEG4,        MKTAG('Q', 'M', 'P', '4') }, /* QNAP Systems */
 +    { AV_CODEC_ID_MPEG4,        MKTAG('P', 'L', 'V', '1') }, /* Pelco DVR MPEG-4 */
      { AV_CODEC_ID_MSMPEG4V3,    MKTAG('M', 'P', '4', '3') },
      { AV_CODEC_ID_MSMPEG4V3,    MKTAG('D', 'I', 'V', '3') },
      { AV_CODEC_ID_MSMPEG4V3,    MKTAG('M', 'P', 'G', '3') },
      { AV_CODEC_ID_MSMPEG4V1,    MKTAG('M', 'P', '4', '1') },
      { AV_CODEC_ID_WMV1,         MKTAG('W', 'M', 'V', '1') },
      { AV_CODEC_ID_WMV2,         MKTAG('W', 'M', 'V', '2') },
 +    { AV_CODEC_ID_WMV2,         MKTAG('G', 'X', 'V', 'E') },
      { AV_CODEC_ID_DVVIDEO,      MKTAG('d', 'v', 's', 'd') },
      { AV_CODEC_ID_DVVIDEO,      MKTAG('d', 'v', 'h', 'd') },
      { AV_CODEC_ID_DVVIDEO,      MKTAG('d', 'v', 'h', '1') },
      { AV_CODEC_ID_DVVIDEO,      MKTAG('d', 'v', 'c', ' ') },
      { AV_CODEC_ID_DVVIDEO,      MKTAG('d', 'v', 'c', 's') },
      { AV_CODEC_ID_DVVIDEO,      MKTAG('d', 'v', 'h', '1') },
 +    { AV_CODEC_ID_DVVIDEO,      MKTAG('d', 'v', 'i', 's') },
 +    { AV_CODEC_ID_DVVIDEO,      MKTAG('p', 'd', 'v', 'c') },
 +    { AV_CODEC_ID_DVVIDEO,      MKTAG('S', 'L', '2', '5') },
 +    { AV_CODEC_ID_DVVIDEO,      MKTAG('S', 'L', 'D', 'V') },
      { AV_CODEC_ID_MPEG1VIDEO,   MKTAG('m', 'p', 'g', '1') },
      { AV_CODEC_ID_MPEG1VIDEO,   MKTAG('m', 'p', 'g', '2') },
      { AV_CODEC_ID_MPEG2VIDEO,   MKTAG('m', 'p', 'g', '2') },
      { AV_CODEC_ID_MPEG2VIDEO,   MKTAG('E', 'M', '2', 'V') },
      { AV_CODEC_ID_MPEG2VIDEO,   MKTAG('M', '7', '0', '1') }, /* Matrox MPEG2 intra-only */
      { AV_CODEC_ID_MPEG2VIDEO,   MKTAG('m', 'p', 'g', 'v') },
 +    { AV_CODEC_ID_MPEG1VIDEO,   MKTAG('B', 'W', '1', '0') },
 +    { AV_CODEC_ID_MPEG1VIDEO,   MKTAG('X', 'M', 'P', 'G') }, /* Xing MPEG intra only */
      { AV_CODEC_ID_MJPEG,        MKTAG('M', 'J', 'P', 'G') },
      { AV_CODEC_ID_MJPEG,        MKTAG('L', 'J', 'P', 'G') },
      { AV_CODEC_ID_MJPEG,        MKTAG('d', 'm', 'b', '1') },
      { AV_CODEC_ID_MJPEG,        MKTAG('M', 'J', 'L', 'S') }, /* JPEG-LS custom FOURCC for avi - decoder */
      { AV_CODEC_ID_MJPEG,        MKTAG('j', 'p', 'e', 'g') },
      { AV_CODEC_ID_MJPEG,        MKTAG('I', 'J', 'P', 'G') },
 -    { AV_CODEC_ID_MJPEG,        MKTAG('A', 'V', 'R', 'n') },
 +    { AV_CODEC_ID_AVRN,         MKTAG('A', 'V', 'R', 'n') },
      { AV_CODEC_ID_MJPEG,        MKTAG('A', 'C', 'D', 'V') },
      { AV_CODEC_ID_MJPEG,        MKTAG('Q', 'I', 'V', 'G') },
      { AV_CODEC_ID_MJPEG,        MKTAG('S', 'L', 'M', 'J') }, /* SL M-JPEG */
      { AV_CODEC_ID_RAWVIDEO,     MKTAG('Y', 'U', 'V', '9') },
      { AV_CODEC_ID_RAWVIDEO,     MKTAG('Y', 'V', 'U', '9') },
      { AV_CODEC_ID_RAWVIDEO,     MKTAG('a', 'u', 'v', '2') },
 +    { AV_CODEC_ID_RAWVIDEO,     MKTAG('Y', 'V', 'Y', 'U') },
      { AV_CODEC_ID_FRWU,         MKTAG('F', 'R', 'W', 'U') },
      { AV_CODEC_ID_R10K,         MKTAG('R', '1', '0', 'k') },
      { AV_CODEC_ID_R210,         MKTAG('r', '2', '1', '0') },
      { AV_CODEC_ID_V210,         MKTAG('v', '2', '1', '0') },
 +    { AV_CODEC_ID_V308,         MKTAG('v', '3', '0', '8') },
 +    { AV_CODEC_ID_V408,         MKTAG('v', '4', '0', '8') },
 +    { AV_CODEC_ID_AYUV,         MKTAG('A', 'Y', 'U', 'V') },
      { AV_CODEC_ID_V410,         MKTAG('v', '4', '1', '0') },
 +    { AV_CODEC_ID_YUV4,         MKTAG('y', 'u', 'v', '4') },
      { AV_CODEC_ID_INDEO3,       MKTAG('I', 'V', '3', '1') },
      { AV_CODEC_ID_INDEO3,       MKTAG('I', 'V', '3', '2') },
      { AV_CODEC_ID_INDEO4,       MKTAG('I', 'V', '4', '1') },
      { AV_CODEC_ID_SNOW,         MKTAG('S', 'N', 'O', 'W') },
      { AV_CODEC_ID_4XM,          MKTAG('4', 'X', 'M', 'V') },
      { AV_CODEC_ID_FLV1,         MKTAG('F', 'L', 'V', '1') },
 +    { AV_CODEC_ID_FLV1,         MKTAG('S', '2', '6', '3') },
      { AV_CODEC_ID_FLASHSV,      MKTAG('F', 'S', 'V', '1') },
      { AV_CODEC_ID_SVQ1,         MKTAG('s', 'v', 'q', '1') },
      { AV_CODEC_ID_TSCC,         MKTAG('t', 's', 'c', 'c') },
      { AV_CODEC_ID_VC1IMAGE,     MKTAG('W', 'V', 'P', '2') },
      { AV_CODEC_ID_LOCO,         MKTAG('L', 'O', 'C', 'O') },
      { AV_CODEC_ID_WNV1,         MKTAG('W', 'N', 'V', '1') },
 +    { AV_CODEC_ID_WNV1,         MKTAG('Y', 'U', 'V', '8') },
 +    { AV_CODEC_ID_AASC,         MKTAG('A', 'A', 'S', '4') },
      { AV_CODEC_ID_AASC,         MKTAG('A', 'A', 'S', 'C') },
      { AV_CODEC_ID_INDEO2,       MKTAG('R', 'T', '2', '1') },
      { AV_CODEC_ID_FRAPS,        MKTAG('F', 'P', 'S', '1') },
      { AV_CODEC_ID_JPEG2000,     MKTAG('M', 'J', '2', 'C') },
      { AV_CODEC_ID_JPEG2000,     MKTAG('L', 'J', '2', 'C') },
      { AV_CODEC_ID_JPEG2000,     MKTAG('L', 'J', '2', 'K') },
 +    { AV_CODEC_ID_JPEG2000,     MKTAG('I', 'P', 'J', '2') },
      { AV_CODEC_ID_VMNC,         MKTAG('V', 'M', 'n', 'c') },
      { AV_CODEC_ID_TARGA,        MKTAG('t', 'g', 'a', ' ') },
      { AV_CODEC_ID_PNG,          MKTAG('M', 'P', 'N', 'G') },
      { AV_CODEC_ID_DPX,          MKTAG('d', 'p', 'x', ' ') },
      { AV_CODEC_ID_KGV1,         MKTAG('K', 'G', 'V', '1') },
      { AV_CODEC_ID_LAGARITH,     MKTAG('L', 'A', 'G', 'S') },
 +    { AV_CODEC_ID_G2M,          MKTAG('G', '2', 'M', '2') },
 +    { AV_CODEC_ID_G2M,          MKTAG('G', '2', 'M', '3') },
 +    { AV_CODEC_ID_G2M,          MKTAG('G', '2', 'M', '4') },
 +    { AV_CODEC_ID_AMV,          MKTAG('A', 'M', 'V', 'F') },
      { AV_CODEC_ID_UTVIDEO,      MKTAG('U', 'L', 'R', 'A') },
      { AV_CODEC_ID_UTVIDEO,      MKTAG('U', 'L', 'R', 'G') },
      { AV_CODEC_ID_UTVIDEO,      MKTAG('U', 'L', 'Y', '0') },
      { AV_CODEC_ID_UTVIDEO,      MKTAG('U', 'L', 'Y', '2') },
      { AV_CODEC_ID_VBLE,         MKTAG('V', 'B', 'L', 'E') },
 +    { AV_CODEC_ID_ESCAPE130,    MKTAG('E', '1', '3', '0') },
      { AV_CODEC_ID_DXTORY,       MKTAG('x', 't', 'o', 'r') },
      { AV_CODEC_ID_ZEROCODEC,    MKTAG('Z', 'E', 'C', 'O') },
 +    { AV_CODEC_ID_Y41P,         MKTAG('Y', '4', '1', 'P') },
 +    { AV_CODEC_ID_FLIC,         MKTAG('A', 'F', 'L', 'C') },
 +    { AV_CODEC_ID_EXR,          MKTAG('e', 'x', 'r', ' ') },
      { AV_CODEC_ID_MSS1,         MKTAG('M', 'S', 'S', '1') },
      { AV_CODEC_ID_MSA1,         MKTAG('M', 'S', 'A', '1') },
      { AV_CODEC_ID_TSCC2,        MKTAG('T', 'S', 'C', '2') },
@@@ -338,15 -305,11 +338,15 @@@ const AVCodecTag ff_codec_wav_tags[] = 
      { AV_CODEC_ID_PCM_ALAW,        0x0006 },
      { AV_CODEC_ID_PCM_MULAW,       0x0007 },
      { AV_CODEC_ID_WMAVOICE,        0x000A },
 +    { AV_CODEC_ID_ADPCM_IMA_OKI,   0x0010 },
      { AV_CODEC_ID_ADPCM_IMA_WAV,   0x0011 },
      { AV_CODEC_ID_PCM_ZORK,        0x0011 }, /* must come after adpcm_ima_wav in this list */
 +    { AV_CODEC_ID_ADPCM_IMA_OKI,   0x0017 },
      { AV_CODEC_ID_ADPCM_YAMAHA,    0x0020 },
      { AV_CODEC_ID_TRUESPEECH,      0x0022 },
      { AV_CODEC_ID_GSM_MS,          0x0031 },
 +    { AV_CODEC_ID_AMR_NB,          0x0038 },  /* rogue format number */
 +    { AV_CODEC_ID_G723_1,          0x0042 },
      { AV_CODEC_ID_ADPCM_G726,      0x0045 },
      { AV_CODEC_ID_MP2,             0x0050 },
      { AV_CODEC_ID_MP3,             0x0055 },
      { AV_CODEC_ID_AAC_LATM,        0x1602 },
      { AV_CODEC_ID_AC3,             0x2000 },
      { AV_CODEC_ID_DTS,             0x2001 },
 +    { AV_CODEC_ID_SONIC,           0x2048 },
 +    { AV_CODEC_ID_SONIC_LS,        0x2048 },
      { AV_CODEC_ID_PCM_MULAW,       0x6c75 },
      { AV_CODEC_ID_AAC,             0x706d },
      { AV_CODEC_ID_AAC,             0x4143 },
 +    { AV_CODEC_ID_G723_1,          0xA100 },
 +    { AV_CODEC_ID_AAC,             0xA106 },
      { AV_CODEC_ID_SPEEX,           0xA109 },
      { AV_CODEC_ID_FLAC,            0xF1AC },
      { AV_CODEC_ID_ADPCM_SWF,       ('S'<<8)+'F' },
      { AV_CODEC_ID_NONE,      0 },
  };
  
 +const AVCodecGuid ff_codec_wav_guids[] = {
 +    {AV_CODEC_ID_AC3,        {0x2C,0x80,0x6D,0xE0,0x46,0xDB,0xCF,0x11,0xB4,0xD1,0x00,0x80,0x5F,0x6C,0xBB,0xEA}},
 +    {AV_CODEC_ID_ATRAC3P,    {0xBF,0xAA,0x23,0xE9,0x58,0xCB,0x71,0x44,0xA1,0x19,0xFF,0xFA,0x01,0xE4,0xCE,0x62}},
 +    {AV_CODEC_ID_EAC3,       {0xAF,0x87,0xFB,0xA7,0x02,0x2D,0xFB,0x42,0xA4,0xD4,0x05,0xCD,0x93,0x84,0x3B,0xDD}},
 +    {AV_CODEC_ID_MP2,        {0x2B,0x80,0x6D,0xE0,0x46,0xDB,0xCF,0x11,0xB4,0xD1,0x00,0x80,0x5F,0x6C,0xBB,0xEA}},
 +    {AV_CODEC_ID_NONE}
 +};
 +
  const AVMetadataConv ff_riff_info_conv[] = {
      { "IART", "artist"    },
      { "ICMT", "comment"   },
      { "IPRD", "album"     },
      { "IPRT", "track"     },
      { "ISFT", "encoder"   },
 +    { "ISMP", "timecode"  },
      { "ITCH", "encoded_by"},
      { 0 },
  };
  
- const char ff_riff_tags[][5] = {
-     "IARL", "IART", "ICMS", "ICMT", "ICOP", "ICRD", "ICRP", "IDIM", "IDPI",
-     "IENG", "IGNR", "IKEY", "ILGT", "ILNG", "IMED", "INAM", "IPLT", "IPRD",
-     "IPRT", "ISBJ", "ISFT", "ISHP", "ISMP", "ISRC", "ISRF", "ITCH",
-     {0}
- };
  #if CONFIG_MUXERS
  int64_t ff_start_tag(AVIOContext *pb, const char *tag)
  {
@@@ -474,11 -417,7 +467,11 @@@ int ff_put_wav_header(AVIOContext *pb, 
      }
      avio_wl16(pb, enc->channels);
      avio_wl32(pb, enc->sample_rate);
 -    if (enc->codec_id == AV_CODEC_ID_MP2 || enc->codec_id == AV_CODEC_ID_MP3 || enc->codec_id == AV_CODEC_ID_GSM_MS) {
 +    if (enc->codec_id == CODEC_ID_ATRAC3 ||
 +        enc->codec_id == CODEC_ID_G723_1 ||
 +        enc->codec_id == CODEC_ID_GSM_MS ||
 +        enc->codec_id == CODEC_ID_MP2    ||
 +        enc->codec_id == CODEC_ID_MP3) {
          bps = 0;
      } else {
          if (!(bps = av_get_bits_per_sample(enc->codec_id))) {
          //blkalign = 144 * enc->bit_rate/enc->sample_rate;
      } else if (enc->codec_id == AV_CODEC_ID_AC3) {
              blkalign = 3840; //maximum bytes per frame
 +    } else if (enc->codec_id == AV_CODEC_ID_AAC) {
 +            blkalign = 768 * enc->channels; //maximum bytes per frame
 +    } else if (enc->codec_id == AV_CODEC_ID_G723_1) {
 +            blkalign = 24;
      } else if (enc->block_align != 0) { /* specified by the codec */
          blkalign = enc->block_align;
      } else
          enc->codec_id == AV_CODEC_ID_PCM_F64LE ||
          enc->codec_id == AV_CODEC_ID_PCM_S16LE) {
          bytespersec = enc->sample_rate * blkalign;
 +    } else if (enc->codec_id == AV_CODEC_ID_G723_1) {
 +        bytespersec = 800;
      } else {
          bytespersec = enc->bit_rate / 8;
      }
          bytestream_put_le16(&riff_extradata, 16);                         /* fwHeadFlags */
          bytestream_put_le32(&riff_extradata, 0);                          /* dwPTSLow */
          bytestream_put_le32(&riff_extradata, 0);                          /* dwPTSHigh */
 +    } else if (enc->codec_id == AV_CODEC_ID_G723_1) {
 +        hdrsize += 20;
 +        bytestream_put_le32(&riff_extradata, 0x9ace0002); /* extradata needed for msacm g723.1 codec */
 +        bytestream_put_le32(&riff_extradata, 0xaea2f732);
 +        bytestream_put_le16(&riff_extradata, 0xacde);
      } else if (enc->codec_id == AV_CODEC_ID_GSM_MS || enc->codec_id == AV_CODEC_ID_ADPCM_IMA_WAV) {
          hdrsize += 2;
          bytestream_put_le16(&riff_extradata, frame_size); /* wSamplesPerBlock */
@@@ -585,7 -513,7 +578,7 @@@ void ff_put_bmp_header(AVIOContext *pb
      avio_wl16(pb, enc->bits_per_coded_sample ? enc->bits_per_coded_sample : 24); /* depth */
      /* compression type */
      avio_wl32(pb, enc->codec_tag);
 -    avio_wl32(pb, enc->width * enc->height * 3);
 +    avio_wl32(pb, (enc->width * enc->height * (enc->bits_per_coded_sample ? enc->bits_per_coded_sample : 24)+7) / 8);
      avio_wl32(pb, 0);
      avio_wl32(pb, 0);
      avio_wl32(pb, 0);
@@@ -640,12 -568,19 +633,19 @@@ void ff_riff_write_info_tag(AVIOContex
      }
  }
  
 -    "IPRT", "ISBJ", "ISFT", "ISHP", "ISRC", "ISRF", "ITCH",
+ static const char riff_tags[][5] = {
+     "IARL", "IART", "ICMS", "ICMT", "ICOP", "ICRD", "ICRP", "IDIM", "IDPI",
+     "IENG", "IGNR", "IKEY", "ILGT", "ILNG", "IMED", "INAM", "IPLT", "IPRD",
++    "IPRT", "ISBJ", "ISFT", "ISHP", "ISMP", "ISRC", "ISRF", "ITCH",
+     {0}
+ };
  static int riff_has_valid_tags(AVFormatContext *s)
  {
      int i;
  
-     for (i = 0; *ff_riff_tags[i]; i++) {
-         if (av_dict_get(s->metadata, ff_riff_tags[i], NULL, AV_DICT_MATCH_CASE))
+     for (i = 0; *riff_tags[i]; i++) {
+         if (av_dict_get(s->metadata, riff_tags[i], NULL, AV_DICT_MATCH_CASE))
              return 1;
      }
  
@@@ -667,8 -602,8 +667,8 @@@ void ff_riff_write_info(AVFormatContex
  
      list_pos = ff_start_tag(pb, "LIST");
      ffio_wfourcc(pb, "INFO");
-     for (i = 0; *ff_riff_tags[i]; i++) {
-         if ((t = av_dict_get(s->metadata, ff_riff_tags[i], NULL, AV_DICT_MATCH_CASE)))
+     for (i = 0; *riff_tags[i]; i++) {
+         if ((t = av_dict_get(s->metadata, riff_tags[i], NULL, AV_DICT_MATCH_CASE)))
              ff_riff_write_info_tag(s->pb, t->key, t->value);
      }
      ff_end_tag(pb, list_pos);
@@@ -689,6 -624,7 +689,6 @@@ int ff_get_wav_header(AVIOContext *pb, 
  
      id = avio_rl16(pb);
      codec->codec_type = AVMEDIA_TYPE_AUDIO;
 -    codec->codec_tag = id;
      codec->channels = avio_rl16(pb);
      codec->sample_rate = avio_rl32(pb);
      codec->bit_rate = avio_rl32(pb) * 8;
          codec->bits_per_coded_sample = 8;
      }else
          codec->bits_per_coded_sample = avio_rl16(pb);
 +    if (id == 0xFFFE) {
 +        codec->codec_tag = 0;
 +    } else {
 +        codec->codec_tag = id;
 +        codec->codec_id = ff_wav_codec_get_id(id, codec->bits_per_coded_sample);
 +    }
      if (size >= 18) {  /* We're obviously dealing with WAVEFORMATEX */
          int cbSize = avio_rl16(pb); /* cbSize */
          size -= 18;
          cbSize = FFMIN(size, cbSize);
          if (cbSize >= 22 && id == 0xfffe) { /* WAVEFORMATEXTENSIBLE */
 -            codec->bits_per_coded_sample = avio_rl16(pb);
 +            ff_asf_guid subformat;
 +            int bps = avio_rl16(pb);
 +            if (bps)
 +                codec->bits_per_coded_sample = bps;
              codec->channel_layout = avio_rl32(pb); /* dwChannelMask */
 -            id = avio_rl32(pb); /* 4 first bytes of GUID */
 -            avio_skip(pb, 12); /* skip end of GUID */
 +            ff_get_guid(pb, &subformat);
 +            if (!memcmp(subformat + 4, (const uint8_t[]){FF_MEDIASUBTYPE_BASE_GUID}, 12)) {
 +                codec->codec_tag = AV_RL32(subformat);
 +                codec->codec_id = ff_wav_codec_get_id(codec->codec_tag, codec->bits_per_coded_sample);
 +            } else {
 +                codec->codec_id = ff_codec_guid_get_id(ff_codec_wav_guids, subformat);
 +                if (!codec->codec_id)
 +                    av_log(codec, AV_LOG_WARNING, "unknown subformat:"FF_PRI_GUID"\n", FF_ARG_GUID(subformat));
 +            }
              cbSize -= 22;
              size -= 22;
          }
          if (size > 0)
              avio_skip(pb, size);
      }
 -    codec->codec_id = ff_wav_codec_get_id(id, codec->bits_per_coded_sample);
      if (codec->codec_id == AV_CODEC_ID_AAC_LATM) {
          /* channels and sample_rate values are those prior to applying SBR and/or PS */
          codec->channels    = 0;
          codec->sample_rate = 0;
      }
      /* override bits_per_coded_sample for G.726 */
 -    if (codec->codec_id == AV_CODEC_ID_ADPCM_G726)
 +    if (codec->codec_id == AV_CODEC_ID_ADPCM_G726 && codec->sample_rate)
          codec->bits_per_coded_sample = codec->bit_rate / codec->sample_rate;
  
      return 0;
@@@ -761,8 -682,7 +761,8 @@@ enum AVCodecID ff_wav_codec_get_id(unsi
      /* handle specific u8 codec */
      if (id == AV_CODEC_ID_PCM_S16LE && bps == 8)
          id = AV_CODEC_ID_PCM_U8;
 -    if (id == AV_CODEC_ID_PCM_S16LE && bps == 24)
 +    if (id == AV_CODEC_ID_PCM_S16LE && bps == 20 ||
 +        id == AV_CODEC_ID_PCM_S16LE && bps == 24)
          id = AV_CODEC_ID_PCM_S24LE;
      if (id == AV_CODEC_ID_PCM_S16LE && bps == 32)
          id = AV_CODEC_ID_PCM_S32LE;
      return id;
  }
  
 -int ff_get_bmp_header(AVIOContext *pb, AVStream *st)
 +int ff_get_bmp_header(AVIOContext *pb, AVStream *st, unsigned *esize)
  {
      int tag1;
 -    avio_rl32(pb); /* size */
 +    if(esize) *esize = avio_rl32(pb);
 +    else               avio_rl32(pb);
      st->codec->width = avio_rl32(pb);
      st->codec->height = (int32_t)avio_rl32(pb);
      avio_rl16(pb); /* planes */
      return tag1;
  }
  
 +void ff_get_guid(AVIOContext *s, ff_asf_guid *g)
 +{
 +    av_assert0(sizeof(*g) == 16); //compiler will optimize this out
 +    if (avio_read(s, *g, sizeof(*g)) < (int)sizeof(*g))
 +        memset(*g, 0, sizeof(*g));
 +}
 +
 +enum AVCodecID ff_codec_guid_get_id(const AVCodecGuid *guids, ff_asf_guid guid)
 +{
 +    int i;
 +    for (i = 0; guids[i].id != AV_CODEC_ID_NONE; i++) {
 +        if (!ff_guidcmp(guids[i].guid, guid))
 +            return guids[i].id;
 +    }
 +    return AV_CODEC_ID_NONE;
 +}
 +
  int ff_read_riff_info(AVFormatContext *s, int64_t size)
  {
      int64_t start, end, cur;
          chunk_code = avio_rl32(pb);
          chunk_size = avio_rl32(pb);
          if (chunk_size > end || end - chunk_size < cur || chunk_size == UINT_MAX) {
 -            av_log(s, AV_LOG_ERROR, "too big INFO subchunk\n");
 -            return AVERROR_INVALIDDATA;
 +            avio_seek(pb, -9, SEEK_CUR);
 +            chunk_code = avio_rl32(pb);
 +            chunk_size = avio_rl32(pb);
 +            if (chunk_size > end || end - chunk_size < cur || chunk_size == UINT_MAX) {
 +                av_log(s, AV_LOG_ERROR, "too big INFO subchunk\n");
 +                return AVERROR_INVALIDDATA;
 +            }
          }
  
          chunk_size += (chunk_size & 1);
  
 -        value = av_malloc(chunk_size + 1);
 +        value = av_mallocz(chunk_size + 1);
          if (!value) {
              av_log(s, AV_LOG_ERROR, "out of memory, unable to read INFO tag\n");
              return AVERROR(ENOMEM);
          AV_WL32(key, chunk_code);
  
          if (avio_read(pb, value, chunk_size) != chunk_size) {
 -            av_free(value);
 -            av_log(s, AV_LOG_ERROR, "premature end of file while reading INFO tag\n");
 -            return AVERROR_INVALIDDATA;
 +            av_log(s, AV_LOG_WARNING, "premature end of file while reading INFO tag\n");
          }
  
 -        value[chunk_size] = 0;
 -
          av_dict_set(&s->metadata, key, value, AV_DICT_DONT_STRDUP_VAL);
      }