Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Sun, 6 May 2012 19:31:08 +0000 (21:31 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Sun, 6 May 2012 19:53:19 +0000 (21:53 +0200)
* qatar/master: (28 commits)
  dfa: use more meaningful return codes
  eatgv: check vector_bits
  eatgv: check motion vectors
  Mark a number of variables only used in av_dlog() calls as av_unused.
  dvdec: drop const qualifier from variable to eliminate a warning
  avcodec: Improve comment for thread_safe_callbacks to avoid misinterpretation.
  tests/utils: don't ignore the return value of fwrite()
  lavfi/formats: use sizeof(var) instead of sizeof(type).
  lavfi: remove avfilter_default_config_input_link() declaration
  lavfi: always enable the scale filter and depend on sws.
  vf_split: support user-specifiable number of outputs.
  avconv: remove stray useless comment.
  mpegmux: add stuffing to avoid incomplete PCM frames
  rtsp: avoid const warnings from strtol() call
  avserver: check return value of ftruncate()
  lagarith: make offset array type unsigned
  dfa: add some checks to ensure that decoder won't write past frame end
  aacps: NEON optimisations
  aacps: align some arrays
  aacps: move some loops to function pointers
  ...

Conflicts:
configure
doc/filters.texi
libavcodec/dfa.c
libavcodec/eatgv.c
libavfilter/Makefile
libavfilter/allfilters.c
libavfilter/avfilter.h
libavfilter/formats.c
libavfilter/vf_split.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
25 files changed:
1  2 
configure
doc/filters.texi
ffmpeg.c
ffserver.c
libavcodec/Makefile
libavcodec/aacps.c
libavcodec/aacps.h
libavcodec/aacps_tablegen.c
libavcodec/aacps_tablegen.h
libavcodec/avcodec.h
libavcodec/dfa.c
libavcodec/dvdec.c
libavcodec/eatgv.c
libavcodec/lagarith.c
libavcodec/wmalosslessdec.c
libavfilter/Makefile
libavfilter/allfilters.c
libavfilter/formats.c
libavfilter/vf_split.c
libavformat/mov.c
libavformat/mpegenc.c
libavformat/nsvdec.c
libavformat/rtpdec_h264.c
libavformat/rtsp.c
tests/utils.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,7 -78,7 +78,7 @@@ Standard options
    --disable-logging        do not log configure debug information
    --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]
@@@ -101,21 -101,18 +101,21 @@@ Configuration options
  
  Component options:
    --disable-doc            do not build documentation
 -  --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
    --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-postproc       disable libpostproc build
    --disable-avfilter       disable video filter support [no]
    --disable-avresample     disable 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-libcelt         enable CELT decoding via libcelt [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-libfaac         enable FAAC support via libfaac [no]
    --enable-libfreetype     enable libfreetype [no]
    --enable-libgsm          enable GSM support via libgsm [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-libopenjpeg     enable JPEG 2000 decoding via OpenJPEG [no]
 +  --enable-libopenjpeg     enable JPEG 2000 encoding/decoding via OpenJPEG [no]
    --enable-libpulse        enable Pulseaudio input via libpulse [no]
    --enable-librtmp         enable RTMP[E] support via librtmp [no]
    --enable-libschroedinger enable Dirac support via libschroedinger [no]
    --enable-libspeex        enable Speex support via libspeex [no]
 +  --enable-libstagefright-h264  enable H.264 decoding via libstagefright [no]
    --enable-libtheora       enable Theora encoding via libtheora [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,
    --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]
  
@@@ -217,26 -204,22 +217,26 @@@ Advanced options (experts only)
    --target-os=OS           compiler targets OS [$target_os]
    --target-exec=CMD        command to run executables on target
    --target-path=DIR        path to view of build directory on target
 -  --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]
 -  --ld=LD                  use linker LD
 +  --cxx=CXX                use C compiler CXX [$cxx_default]
 +  --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-ldflags=HLDFLAGS  use HLDFLAGS when linking for host
    --host-libs=HLIBS        use libs HLIBS when linking for host
    --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               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)
@@@ -268,21 -251,12 +268,21 @@@ Optimization options (experts only)
    --disable-neon           disable NEON optimizations
    --disable-vis            disable VIS optimizations
    --disable-yasm           disable use of yasm assembler
 +  --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 Libav itself):
 +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.
 +  --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
    --samples=PATH           location of test samples for FATE, if not set use
                             \$FATE_SAMPLES at make invocation time.
    --enable-xmm-clobber-test check XMM registers for clobbering (Win64-only;
@@@ -321,7 -295,7 +321,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
@@@ -619,10 -593,6 +619,10 @@@ add_cflags()
      append CFLAGS $($filter_cflags "$@")
  }
  
 +add_cxxflags(){
 +    append CXXFLAGS $($filter_cflags "$@")
 +}
 +
  add_asflags(){
      append ASFLAGS $($filter_asflags "$@")
  }
@@@ -647,13 -617,6 +647,13 @@@ check_cc()
      check_cmd $cc $CPPFLAGS $CFLAGS "$@" -c -o $TMPO $TMPC
  }
  
 +check_cxx(){
 +    log check_cxx "$@"
 +    cat > $TMPCPP
 +    log_file $TMPCPP
 +    check_cmd $cxx $CPPFLAGS $CFLAGS $CXXFLAGS "$@" -c -o $TMPO $TMPCPP
 +}
 +
  check_cpp(){
      log check_cpp "$@"
      cat > $TMPC
@@@ -689,14 -652,12 +689,14 @@@ check_yasm()
  
  check_ld(){
      log check_ld "$@"
 +    type=$1
 +    shift 1
      flags=''
      libs=''
      for f; do
          test "${f}" = "${f#-l}" && flags="$flags $f" || libs="$libs $f"
      done
 -    check_cc $($filter_cflags $flags) || return
 +    check_$type $($filter_cflags $flags) || return
      check_cmd $ld $LDFLAGS $flags -o $TMPE $TMPO $libs $extralibs
  }
  
@@@ -716,17 -677,9 +716,17 @@@ int x
  EOF
  }
  
 +check_cxxflags(){
 +    log check_cxxflags "$@"
 +    set -- $($filter_cflags "$@")
 +    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
  }
@@@ -752,7 -705,7 +752,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
@@@ -763,10 -716,10 +763,10 @@@ check_mathfunc()
      func=$1
      shift
      disable $func
 -    check_ld "$@" <<EOF && enable $func
 +    check_ld "cc" "$@" <<EOF && enable $func
  #include <math.h>
  float foo(float f) { return $func(f); }
 -int main(void){ return 0; }
 +int main(void){ return (int) foo; }
  EOF
  }
  
@@@ -783,26 -736,7 +783,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(){
@@@ -834,21 -768,13 +834,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 func(void){
 +    $code
 +}
 +int (*func_ptr)(void) = func;
  int main(void){
      signal(SIGILL, sighandler);
      signal(SIGFPE, sighandler);
  #ifdef SIGBUS
      signal(SIGBUS, sighandler);
  #endif
 -    { $code }
 +    return func_ptr();
  }
  EOF
  }
@@@ -941,14 -863,6 +941,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"
@@@ -1000,10 -914,10 +1000,10 @@@ COMPONENT_LIST=
  "
  
  PROGRAM_LIST="
 -    avconv
 -    avplay
 -    avprobe
 -    avserver
 +    ffplay
 +    ffprobe
 +    ffserver
 +    ffmpeg
  "
  
  CONFIG_LIST="
      avresample
      avisynth
      bzlib
 +    crystalhd
      dct
      doc
      dwt
      dxva2
      fastdiv
      fft
 +    fontconfig
      frei0r
      gnutls
      gpl
      gray
      hardcoded_tables
 +    libaacplus
 +    libass
 +    libbluray
      libcdio
 +    libcelt
      libdc1394
      libfaac
      libfreetype
      libgsm
 +    libmodplug
      libmp3lame
      libnut
      libopencore_amrnb
      librtmp
      libschroedinger
      libspeex
 +    libstagefright_h264
      libtheora
 +    libutvideo
 +    libv4l2
      libvo_aacenc
      libvo_amrwbenc
      libvorbis
      mpegaudiodsp
      network
      nonfree
 +    openal
      openssl
      pic
 +    postproc
      rdft
      rtpdec
      runtime_cpudetect
      small
      sram
      static
 +    swresample
      swscale
      swscale_alpha
      thumb
  THREADS_LIST='
      pthreads
      w32threads
 +    os2threads
  '
  
  ARCH_LIST='
@@@ -1157,11 -1057,8 +1157,11 @@@ HAVE_LIST=
      altivec_h
      arpa_inet_h
      asm_mod_y
 +    asm_types_h
      attribute_may_alias
      attribute_packed
 +    cbrtf
 +    clock_gettime
      closesocket
      cmov
      dcbzl
      GetProcessMemoryInfo
      GetProcessTimes
      getrusage
 +    glob
      gnu_as
      ibm_asm
      inet_aton
      inline_asm
      isatty
 +    kbhit
      ldbrx
      libdc1394_1
      libdc1394_2
      loongson
      lrint
      lrintf
 +    lzo1x_999_compress
      machine_ioctl_bt848_h
      machine_ioctl_meteor_h
 +    makeinfo
      malloc_h
      MapViewOfFile
      memalign
      mkstemp
      mmap
 +    PeekNamedPipe
      poll_h
      posix_memalign
      round
      soundcard_h
      strerror_r
      strptime
 -    strtok_r
      struct_addrinfo
      struct_ipv6_mreq
      struct_rusage_ru_maxrss
      sys_select_h
      sys_soundcard_h
      sys_videoio_h
 +    termios_h
      threads
      trunc
      truncf
@@@ -1282,13 -1174,11 +1282,13 @@@ CMDLINE_SELECT=
      $CONFIG_LIST
      $THREADS_LIST
      asm
 +    coverage
      cross_compile
      debug
      extra_warnings
      logging
      optimizations
 +    stripping
      symver
      yasm
  "
@@@ -1308,12 -1198,10 +1308,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
      samples
 +    strip
      sysinclude
      sysroot
      target_exec
      target_os
      target_path
 +    valgrind
 +    yasmexe
  "
  
  CMDLINE_APPEND="
      extra_cflags
 +    extra_cxxflags
  "
  
  # code dependency declarations
@@@ -1419,7 -1300,6 +1419,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"
@@@ -1430,12 -1310,10 +1430,12 @@@ h263_encoder_select="aandct
  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="golomb h264chroma h264dsp h264pred h264qpel"
  h264_dxva2_hwaccel_deps="dxva2api_h"
  h264_dxva2_hwaccel_select="dxva2 h264_decoder"
  h264_vaapi_hwaccel_select="vaapi h264_decoder"
 +h264_vda_hwaccel_deps="VideoDecodeAcceleration_VDADecoder_h pthreads"
  h264_vda_hwaccel_select="vda h264_decoder"
  h264_vdpau_decoder_select="vdpau h264_decoder"
  imc_decoder_select="fft mdct sinewin"
@@@ -1461,20 -1339,15 +1461,20 @@@ 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_encoder_select="aandct"
 +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_encoder_select="aandct"
 +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"
@@@ -1499,9 -1372,6 +1499,9 @@@ shorten_decoder_select="golomb
  sipr_decoder_select="lsp"
  snow_decoder_select="dwt"
  snow_encoder_select="aandct dwt"
 +sonic_decoder_select="golomb"
 +sonic_encoder_select="golomb"
 +sonic_ls_encoder_select="golomb"
  svq1_encoder_select="aandct"
  svq3_decoder_select="golomb h264chroma h264dsp h264pred h264qpel"
  svq3_decoder_suggest="zlib"
@@@ -1511,7 -1381,6 +1511,7 @@@ tiff_encoder_suggest="zlib
  truehd_decoder_select="mlp_decoder"
  tscc_decoder_select="zlib"
  twinvq_decoder_select="mdct lsp sinewin"
 +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"
@@@ -1535,7 -1404,6 +1535,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"
@@@ -1546,7 -1414,6 +1546,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"
  h264_parser_select="golomb h264dsp h264pred"
  
  # external libraries
 +libaacplus_encoder_deps="libaacplus"
 +libcelt_decoder_deps="libcelt"
  libfaac_encoder_deps="libfaac"
  libgsm_decoder_deps="libgsm"
  libgsm_encoder_deps="libgsm"
  libgsm_ms_decoder_deps="libgsm"
  libgsm_ms_encoder_deps="libgsm"
 +libmodplug_demuxer_deps="libmodplug"
  libmp3lame_encoder_deps="libmp3lame"
  libopencore_amrnb_decoder_deps="libopencore_amrnb"
  libopencore_amrnb_encoder_deps="libopencore_amrnb"
  libopencore_amrwb_decoder_deps="libopencore_amrwb"
  libopenjpeg_decoder_deps="libopenjpeg"
 +libopenjpeg_encoder_deps="libopenjpeg"
  libschroedinger_decoder_deps="libschroedinger"
  libschroedinger_encoder_deps="libschroedinger"
  libspeex_decoder_deps="libspeex"
  libspeex_encoder_deps="libspeex"
 +libstagefright_h264_decoder_deps="libstagefright_h264"
  libtheora_encoder_deps="libtheora"
  libvo_aacenc_encoder_deps="libvo_aacenc"
  libvo_amrwbenc_encoder_deps="libvo_amrwbenc"
@@@ -1581,11 -1443,8 +1581,11 @@@ 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"
@@@ -1622,30 -1481,22 +1622,30 @@@ 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"
 +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"
 +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"
  x11_grab_device_indev_deps="x11grab XShmCreateImage"
  
  # protocols
 +bluray_protocol_deps="libbluray"
  gopher_protocol_deps="network"
  httpproxy_protocol_deps="network"
  httpproxy_protocol_select="tcp_protocol"
@@@ -1668,46 -1519,31 +1668,47 @@@ 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"
  blackframe_filter_deps="gpl"
  boxblur_filter_deps="gpl"
 +colormatrix_filter_deps="gpl"
  cropdetect_filter_deps="gpl"
  delogo_filter_deps="gpl"
  drawtext_filter_deps="libfreetype"
 -frei0r_filter_deps="frei0r dlopen strtok_r"
 +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'
  hqdn3d_filter_deps="gpl"
 +movie_filter_deps="avcodec avformat"
 +mp_filter_deps="gpl avcodec swscale postproc"
 +mptestsrc_filter_deps="gpl"
 +negate_filter_deps="lut_filter"
  ocv_filter_deps="libopencv"
 +pan_filter_deps="swresample"
 +removelogo_filter_deps="avcodec avformat swscale"
 +scale_filter_deps="swscale"
 +super2xsai_filter_deps="gpl"
 +tinterlace_filter_deps="gpl"
  yadif_filter_deps="gpl"
  
  # libraries
  avdevice_deps="avcodec avformat"
+ avfilter_deps="swscale"
  avformat_deps="avcodec"
 +postproc_deps="gpl"
  
  # programs
 -avconv_deps="avcodec avfilter avformat avresample swscale"
 -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'
 +ffplay_deps="avcodec avformat swscale swresample sdl"
 +ffplay_select="buffersink_filter rdft"
 +ffprobe_deps="avcodec avformat"
 +ffserver_deps="avformat ffm_muxer fork rtp_protocol rtsp_demuxer"
 +ffserver_extralibs='$ldl'
 +ffmpeg_deps="avcodec avfilter avformat swscale swresample"
 +ffmpeg_select="buffersink_filter"
  
  doc_deps="texi2html"
  
@@@ -1791,11 -1627,11 +1792,11 @@@ test_deps _muxer _demuxe
      gxf                                                                 \
      matroska=mkv                                                        \
      mmf                                                                 \
 -    mov                                                                 \
 +    mov="mov ismv"                                                      \
      pcm_mulaw=mulaw                                                     \
      mxf="mxf mxf_d10"                                                   \
      nut                                                                 \
 -    ogg                                                                 \
 +    ogg="ogg ogg_vp3"                                                   \
      rawvideo=pixfmt                                                     \
      rm                                                                  \
      swf                                                                 \
      yuv4mpegpipe=yuv4mpeg                                               \
  
  ac3_fixed_test_deps="ac3_fixed_encoder ac3_decoder"
 +colormatrix1_test_deps="colormatrix_filter"
 +colormatrix2_test_deps="colormatrix_filter"
 +flashsv2_test_deps="zlib"
  mpg_test_deps="mpeg1system_muxer mpegps_demuxer"
 +mpng_test_deps="zlib"
 +pp_test_deps="mp_filter"
 +pp2_test_deps="mp_filter"
 +pp3_test_deps="mp_filter"
 +pp4_test_deps="mp_filter"
 +pp5_test_deps="mp_filter"
 +pp6_test_deps="mp_filter"
 +zlib_test_deps="zlib"
 +zmbv_test_deps="zlib"
  
  # default parameters
  
@@@ -1826,27 -1650,23 +1827,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++"
  cc_version=\"unknown\"
  host_cc_default="gcc"
 +install="install"
  ln_s="ln -sf"
  nm_default="nm"
  objformat="elf"
  pkg_config_default=pkg-config
  ranlib="ranlib"
 -yasmexe="yasm"
 +strip_default="strip"
 +yasmexe_default="yasm"
  
  nm_opts='-g'
  nogas=":"
@@@ -1859,12 -1679,6 +1860,12 @@@ 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
  
@@@ -1874,9 -1688,6 +1875,9 @@@ enable avfilte
  enable avformat
  enable avresample
  enable avutil
 +enable postproc
 +enable stripping
 +enable swresample
  enable swscale
  
  enable asm
@@@ -1891,7 -1702,7 +1892,7 @@@ enable swscale_alph
  
  # build settings
  SHFLAGS='-shared -Wl,-soname,$$(@F)'
 -AVSERVERLDFLAGS=-Wl,-E
 +FFSERVERLDFLAGS=-Wl,-E
  LIBPREF="lib"
  LIBSUF=".a"
  FULLNAME='$(NAME)$(BUILDSUF)'
@@@ -1907,7 -1718,6 +1908,7 @@@ SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJ
  
  AS_O='-o $@'
  CC_O='-o $@'
 +CXX_O='-o $@'
  
  host_cflags='-D_ISOC99_SOURCE -O3 -g'
  host_libs='-lm'
@@@ -1934,7 -1744,7 +1935,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(){
@@@ -1976,12 -1786,11 +1977,12 @@@ find_tests()
  
  ACODEC_TESTS=$(find_tests acodec)
  VCODEC_TESTS=$(find_tests vsynth1)
 +LAVF_FATE_TESTS=$(find_tests lavf-fate)
  LAVF_TESTS=$(find_tests lavf)
  LAVFI_TESTS=$(find_tests lavfi)
  SEEK_TESTS=$(find_tests seek seek_)
  
 -ALL_TESTS="$ACODEC_TESTS $VCODEC_TESTS $LAVF_TESTS $LAVFI_TESTS $SEEK_TESTS"
 +ALL_TESTS="$ACODEC_TESTS $VCODEC_TESTS $LAVF_FATE_TESTS $LAVF_TESTS $LAVFI_TESTS $SEEK_TESTS"
  
  pcm_test_deps=$(map 'echo ${v%_*}_decoder $v' $(filter pcm_* $ENCODER_LIST))
  
@@@ -2063,7 -1872,7 +2064,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
@@@ -2073,29 -1882,17 +2074,29 @@@ if enabled cross_compile; the
          die "Must specify target arch and OS when cross-compiling"
  fi
  
 -set_default arch target_os
 +set_default arch target_os 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"
  
 -set_default cc nm pkg_config sysinclude
 +set_default cc cxx nm pkg_config strip sysinclude yasmexe
  enabled cross_compile || host_cc_default=$cc
  set_default host_cc
  
@@@ -2138,7 -1935,6 +2139,7 @@@ trap 'rm -f -- $TMPFILES' EXI
  
  tmpfile TMPASM .asm
  tmpfile TMPC   .c
 +tmpfile TMPCPP .cpp
  tmpfile TMPE   $EXESUF
  tmpfile TMPH   .h
  tmpfile TMPO   .o
@@@ -2373,11 -2169,9 +2374,11 @@@ test -n "$cc_type" && enable $cc_type |
  set_default ar as dep_cc ld
  
  test -n "$CC_DEPFLAGS" || CCDEP=$DEPEND_CMD
 +test -n "$CXX_DEPFLAGS" || CXXDEP=$DEPEND_CMD
  test -n "$AS_DEPFLAGS" || ASDEP=$DEPEND_CMD
  
  add_cflags $extra_cflags
 +add_cxxflags $extra_cxxflags
  add_asflags $extra_cflags
  
  if test -n "$sysroot"; then
  
  # Deal with common $arch aliases
  case "$arch" in
 -    arm*)
 +    arm*|iPad*)
          arch="arm"
      ;;
      mips|mipsel|IP*)
          arch="parisc"
          subarch="parisc64"
      ;;
 -    "Power Macintosh"|ppc|powerpc)
 -        arch="ppc"
 -    ;;
 -    ppc64|powerpc64)
 +    "Power Macintosh"|ppc|powerpc|ppc64|powerpc64)
          arch="ppc"
 -        subarch="ppc64"
      ;;
      s390|s390x)
          arch="s390"
          arch="sparc"
          subarch="sparc64"
      ;;
 -    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
@@@ -2611,7 -2409,6 +2612,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>
              spic=$shared
          fi
      ;;
 +    ppc)
 +        check_cc <<EOF && subarch="ppc64"
 +        int test[(int)sizeof(char*) - 7];
 +EOF
 +    ;;
  esac
  
  enable $subarch
@@@ -2654,7 -2446,7 +2655,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"
          ;;
      openbsd)
          # 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 ||
          fi
          LIBTARGET=i386
          if enabled x86_64; then
 -            LIBTARGET="i386:x86-64"
 +            LIBTARGET=x64
          elif enabled arm; then
              LIBTARGET=arm-wince
          fi
          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)'
 +        SLIB_EXTRA_CMD='-lib.exe /machine:$(LIBTARGET) /def:$$(@:$(SLIBSUF)=.def) /out:$(SUBDIR)$(SLIBNAME:$(SLIBSUF)=.lib)'
          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"
          enable dos_paths
          check_cflags -fno-common
          check_cpp_condition _mingw.h "defined (__MINGW64_VERSION_MAJOR) || (__MINGW32_MAJOR_VERSION > 3) \
          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_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -D_BSD_SOURCE
@@@ -2825,7 -2614,7 +2826,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
  
@@@ -2847,13 -2636,11 +2848,13 @@@ die_license_disabled() 
  }
  
  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 openssl
  
@@@ -2919,7 -2706,7 +2920,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
  # 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  getaddrinfo $network_extralibs
@@@ -3098,53 -2884,39 +3099,53 @@@ check_func  ${malloc_prefix}posix_memal
  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_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 psapi.h" GetProcessMemoryInfo -lpsapi
  check_func_headers windows.h GetProcessAffinityMask
  check_func_headers windows.h GetProcessTimes
  check_func_headers windows.h MapViewOfFile
  check_func_headers windows.h VirtualAlloc
 +check_func_headers glob.h glob
  
  check_header dlfcn.h
 -check_header dxva2api.h
 +check_header dxva2api.h -D_WIN32_WINNT=0x0600
 +check_header libcrystalhd/libcrystalhd_if.h
  check_header malloc.h
  check_header poll.h
  check_header sys/mman.h
  check_header sys/param.h
  check_header sys/resource.h
  check_header sys/select.h
 +check_header termios.h
  check_header vdpau/vdpau.h
  check_header vdpau/vdpau_x11.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; 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
          :
@@@ -3170,10 -2942,8 +3171,10 @@@ for thread in $THREADS_LIST; d
  done
  
  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
  
 +check_mathfunc cbrtf
  check_mathfunc exp2
  check_mathfunc exp2f
  check_mathfunc llrint
@@@ -3189,53 -2959,35 +3190,53 @@@ check_mathfunc trunc
  
  # 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 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 libcelt    && require libcelt celt/celt.h celt_decode -lcelt0 &&
 +                      { check_lib celt/celt.h celt_decoder_create_custom -lcelt0 ||
 +                        die "ERROR: libcelt version must be >= 0.11.0."; }
  enabled libfaac    && require2 libfaac "stdint.h faac.h" faacEncGetVersion -lfaac
  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 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 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 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 -lvpx ||
 -                                die "ERROR: libvpx encoder 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"; } }
  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."; }
  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 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 ||
@@@ -3250,28 -3002,15 +3251,28 @@@ 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
 +makeinfo --version > /dev/null 2>&1 && enable makeinfo  || disable makeinfo
  
  check_header linux/fb.h
 +check_header linux/videodev.h
  check_header linux/videodev2.h
  check_struct linux/videodev2.h "struct v4l2_frmivalenum" discrete
  
@@@ -3282,8 -3021,6 +3283,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
  
  enabled_any sndio_indev sndio_outdev && check_lib2 sndio.h sio_open -lsndio
  
@@@ -3318,11 -3048,9 +3319,11 @@@ require X11 X11/Xlib.h XOpenDisplay -lX
  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
@@@ -3333,8 -3061,6 +3334,8 @@@ check_cpp_condition 
  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
@@@ -3346,17 -3072,17 +3347,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 &&                             \
  fi
  check_cflags -fno-math-errno
  check_cflags -fno-signed-zeros
 +check_cc -mno-red-zone <<EOF && noredzone_flags="-mno-red-zone"
 +int x;
 +EOF
 +
  
  if enabled icc; then
      # Just warnings, no remarks
@@@ -3434,6 -3156,7 +3435,6 @@@ elif enabled gcc; the
      check_cflags -fno-tree-vectorize
      check_cflags -Werror=implicit-function-declaration
      check_cflags -Werror=missing-prototypes
 -    check_cflags -Werror=declaration-after-statement
  elif enabled llvm_gcc; then
      check_cflags -mllvm -stack-alignment=16
  elif enabled clang; then
@@@ -3463,41 -3186,9 +3464,41 @@@ check_deps $CONFIG_LIST       
  
  enabled asm || { arch=c; disable $ARCH_LIST $ARCH_EXT_LIST; }
  
 +if test $target_os = "haiku"; then
 +    disable memalign
 +    disable posix_memalign
 +fi
 +
  ! enabled_any memalign posix_memalign &&
      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"
@@@ -3505,9 -3196,6 +3506,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
@@@ -3546,12 -3234,10 +3547,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}"
@@@ -3563,14 -3249,10 +3564,14 @@@ 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 "libcdio support           ${libcdio-no}"
 +echo "libcelt enabled           ${libcelt-no}"
  echo "libdc1394 support         ${libdc1394-no}"
  echo "libfaac enabled           ${libfaac-no}"
  echo "libgsm enabled            ${libgsm-no}"
 +echo "libmodplug enabled        ${libmodplug-no}"
  echo "libmp3lame enabled        ${libmp3lame-no}"
  echo "libnut enabled            ${libnut-no}"
  echo "libopencore-amrnb support ${libopencore_amrnb-no}"
@@@ -3581,10 -3263,7 +3582,10 @@@ 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 "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}"
@@@ -3592,7 -3271,6 +3593,7 @@@ 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}"
@@@ -3622,15 -3300,11 +3623,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
@@@ -3639,13 -3313,9 +3640,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
@@@ -3653,22 -3323,18 +3654,22 @@@ YASM=$yasmex
  YASMDEP=$yasmexe
  AR=$ar
  RANLIB=$ranlib
 +CP=cp -p
  LN_S=$ln_s
 +STRIP=$strip
  CPPFLAGS=$CPPFLAGS
  CFLAGS=$CFLAGS
 +CXXFLAGS=$CXXFLAGS
  ASFLAGS=$ASFLAGS
  AS_O=$CC_O
  CC_O=$CC_O
 -DLLTOOL=$dlltool
 +CXX_O=$CXX_O
  LDFLAGS=$LDFLAGS
 -AVSERVERLDFLAGS=$AVSERVERLDFLAGS
 +FFSERVERLDFLAGS=$FFSERVERLDFLAGS
  SHFLAGS=$SHFLAGS
  YASMFLAGS=$YASMFLAGS
  BUILDSUF=$build_suffix
 +PROGSSUF=$progs_suffix
  FULLNAME=$FULLNAME
  LIBPREF=$LIBPREF
  LIBSUF=$LIBSUF
@@@ -3679,7 -3345,6 +3680,7 @@@ EXESUF=$EXESU
  EXTRA_VERSION=$extra_version
  DEPFLAGS=$DEPFLAGS
  CCDEP=$CCDEP
 +CXXDEP=$CXXDEP
  ASDEP=$ASDEP
  CC_DEPFLAGS=$CC_DEPFLAGS
  AS_DEPFLAGS=$AS_DEPFLAGS
@@@ -3694,7 -3359,7 +3695,7 @@@ SDL_LIBS=$sdl_lib
  SDL_CFLAGS=$sdl_cflags
  LIB_INSTALL_EXTRA_CMD=$LIB_INSTALL_EXTRA_CMD
  EXTRALIBS=$extralibs
 -INSTALL=install
 +INSTALL=$install
  LIBTARGET=${LIBTARGET}
  SLIBNAME=${SLIBNAME}
  SLIBNAME_WITH_VERSION=${SLIBNAME_WITH_VERSION}
@@@ -3706,17 -3371,13 +3707,17 @@@ SLIB_INSTALL_LINKS=${SLIB_INSTALL_LINKS
  SLIB_INSTALL_EXTRA_LIB=${SLIB_INSTALL_EXTRA_LIB}
  SLIB_INSTALL_EXTRA_SHLIB=${SLIB_INSTALL_EXTRA_SHLIB}
  SAMPLES:=${samples:-\$(FATE_SAMPLES)}
 +NOREDZONE_FLAGS=$noredzone_flags
  EOF
  
  get_version(){
      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
@@@ -3728,17 -3389,14 +3729,17 @@@ get_version LIBAVFILTER libavfilter/ver
  get_version LIBAVFORMAT libavformat/version.h
  get_version LIBAVRESAMPLE libavresample/version.h
  get_version LIBAVUTIL   libavutil/avutil.h
 +get_version LIBPOSTPROC libpostproc/postprocess.h
 +get_version LIBSWRESAMPLE libswresample/swresample.h
  get_version LIBSWSCALE  libswscale/swscale.h
  
  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_TYPE "$cc_type"
  #define CC_VERSION $cc_version
  #define SLIBSUF "$SLIBSUF"
  EOF
  
 +test -n "$assert_level" &&
 +    echo "#define ASSERT_LEVEL $assert_level" >>$TMPH
 +
  test -n "$malloc_prefix" &&
      echo "#define MALLOC_PREFIX $malloc_prefix" >>$TMPH
  
@@@ -3777,14 -3432,12 +3778,14 @@@ print_config CONFIG_ "$config_files" $C
  cat >>config.mak <<EOF
  ACODEC_TESTS=$(print_enabled -n _test $ACODEC_TESTS)
  VCODEC_TESTS=$(print_enabled -n _test $VCODEC_TESTS)
 +LAVF_FATE_TESTS=$(print_enabled -n _test $LAVF_FATE_TESTS)
  LAVF_TESTS=$(print_enabled   -n _test $LAVF_TESTS)
  LAVFI_TESTS=$(print_enabled  -n _test $LAVFI_TESTS)
  SEEK_TESTS=$(print_enabled   -n _test $SEEK_TESTS)
  EOF
  
 -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
@@@ -3798,12 -3451,6 +3799,12 @@@ 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
@@@ -3855,23 -3502,10 +3856,23 @@@ 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"
 +libavfilter_pc_deps=""
 +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"
 -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 rescaling library" "$LIBSWRESAMPLE_VERSION" "$LIBM" "libavutil = $LIBAVUTIL_VERSION"
diff --combined doc/filters.texi
@@@ -19,7 -19,7 +19,7 @@@ output pads is called a "sink"
  
  A filtergraph can be represented using a textual representation, which is
  recognized by the @option{-filter}/@option{-vf} and @option{-filter_complex}
 -options in @command{avconv} and @option{-vf} in @command{avplay}, and by the
 +options in @command{ffmpeg} and @option{-vf} in @command{ffplay}, and by the
  @code{avfilter_graph_parse()}/@code{avfilter_graph_parse2()} function defined in
  @file{libavfilter/avfiltergraph.h}.
  
@@@ -100,408 -100,17 +100,408 @@@ Follows a BNF description for the filte
  @chapter Audio Filters
  @c man begin AUDIO FILTERS
  
 -When you configure your Libav build, you can disable any of the
 -existing filters using --disable-filters.
 +When you configure your FFmpeg build, you can disable any of the
 +existing filters using @code{--disable-filters}.
  The configure output will show the audio filters included in your
  build.
  
  Below is a description of the currently available audio filters.
  
 +@section aconvert
 +
 +Convert the input audio format to the specified formats.
 +
 +The filter accepts a string of the form:
 +"@var{sample_format}:@var{channel_layout}".
 +
 +@var{sample_format} specifies the sample format, and can be a string or the
 +corresponding numeric value defined in @file{libavutil/samplefmt.h}. Use 'p'
 +suffix for a planar sample format.
 +
 +@var{channel_layout} specifies the channel layout, and can be a string
 +or the corresponding number value defined in @file{libavutil/audioconvert.h}.
 +
 +The special parameter "auto", signifies that the filter will
 +automatically select the output format depending on the output filter.
 +
 +Some examples follow.
 +
 +@itemize
 +@item
 +Convert input to float, planar, stereo:
 +@example
 +aconvert=fltp:stereo
 +@end example
 +
 +@item
 +Convert input to unsigned 8-bit, automatically select out channel layout:
 +@example
 +aconvert=u8:auto
 +@end example
 +@end itemize
 +
 +@section aformat
 +
 +Convert the input audio to one of the specified formats. The framework will
 +negotiate the most appropriate format to minimize conversions.
 +
 +The filter accepts three lists of formats, separated by ":", in the form:
 +"@var{sample_formats}:@var{channel_layouts}:@var{packing_formats}".
 +
 +Elements in each list are separated by "," which has to be escaped in the
 +filtergraph specification.
 +
 +The special parameter "all", in place of a list of elements, signifies all
 +supported formats.
 +
 +Some examples follow:
 +@example
 +aformat=u8\\,s16:mono:packed
 +
 +aformat=s16:mono\\,stereo:all
 +@end example
 +
 +@section amerge
 +
 +Merge two audio streams into a single multi-channel stream.
 +
 +This filter does not need any argument.
 +
 +If the channel layouts of the inputs are disjoint, and therefore compatible,
 +the channel layout of the output will be set accordingly and the channels
 +will be reordered as necessary. If the channel layouts of the inputs are not
 +disjoint, the output will have all the channels of the first input then all
 +the channels of the second input, in that order, and the channel layout of
 +the output will be the default value corresponding to the total number of
 +channels.
 +
 +For example, if the first input is in 2.1 (FL+FR+LF) and the second input
 +is FC+BL+BR, then the output will be in 5.1, with the channels in the
 +following order: a1, a2, b1, a3, b2, b3 (a1 is the first channel of the
 +first input, b1 is the first channel of the second input).
 +
 +On the other hand, if both input are in stereo, the output channels will be
 +in the default order: a1, a2, b1, b2, and the channel layout will be
 +arbitrarily set to 4.0, which may or may not be the expected value.
 +
 +Both inputs must have the same sample rate, format and packing.
 +
 +If inputs do not have the same duration, the output will stop with the
 +shortest.
 +
 +Example: merge two mono files into a stereo stream:
 +@example
 +amovie=left.wav [l] ; amovie=right.mp3 [r] ; [l] [r] amerge
 +@end example
 +
 +If you need to do multiple merges (for instance multiple mono audio streams in
 +a single video media), you can do:
 +@example
 +ffmpeg -f lavfi -i "
 +amovie=input.mkv:si=0 [a0];
 +amovie=input.mkv:si=1 [a1];
 +amovie=input.mkv:si=2 [a2];
 +amovie=input.mkv:si=3 [a3];
 +amovie=input.mkv:si=4 [a4];
 +amovie=input.mkv:si=5 [a5];
 +[a0][a1] amerge [x0];
 +[x0][a2] amerge [x1];
 +[x1][a3] amerge [x2];
 +[x2][a4] amerge [x3];
 +[x3][a5] amerge" -c:a pcm_s16le output.mkv
 +@end example
 +
  @section anull
  
  Pass the audio source unchanged to the output.
  
 +@section aresample
 +
 +Resample the input audio to the specified sample rate.
 +
 +The filter accepts exactly one parameter, the output sample rate. If not
 +specified then the filter will automatically convert between its input
 +and output sample rates.
 +
 +For example, to resample the input audio to 44100Hz:
 +@example
 +aresample=44100
 +@end example
 +
 +@section ashowinfo
 +
 +Show a line containing various information for each input audio frame.
 +The input audio is not modified.
 +
 +The shown line contains a sequence of key/value pairs of the form
 +@var{key}:@var{value}.
 +
 +A description of each shown parameter follows:
 +
 +@table @option
 +@item n
 +sequential number of the input frame, starting from 0
 +
 +@item pts
 +presentation TimeStamp of the input frame, expressed as a number of
 +time base units. The time base unit depends on the filter input pad, and
 +is usually 1/@var{sample_rate}.
 +
 +@item pts_time
 +presentation TimeStamp of the input frame, expressed as a number of
 +seconds
 +
 +@item pos
 +position of the frame in the input stream, -1 if this information in
 +unavailable and/or meaningless (for example in case of synthetic audio)
 +
 +@item fmt
 +sample format name
 +
 +@item chlayout
 +channel layout description
 +
 +@item nb_samples
 +number of samples (per each channel) contained in the filtered frame
 +
 +@item rate
 +sample rate for the audio frame
 +
 +@item planar
 +if the packing format is planar, 0 if packed
 +
 +@item checksum
 +Adler-32 checksum (printed in hexadecimal) of all the planes of the input frame
 +
 +@item plane_checksum
 +Adler-32 checksum (printed in hexadecimal) for each input frame plane,
 +expressed in the form "[@var{c0} @var{c1} @var{c2} @var{c3} @var{c4} @var{c5}
 +@var{c6} @var{c7}]"
 +@end table
 +
 +@section asplit
 +
 +Pass on the input audio to two outputs. Both outputs are identical to
 +the input audio.
 +
 +For example:
 +@example
 +[in] asplit[out0], showaudio[out1]
 +@end example
 +
 +will create two separate outputs from the same input, one cropped and
 +one padded.
 +
 +@section astreamsync
 +
 +Forward two audio streams and control the order the buffers are forwarded.
 +
 +The argument to the filter is an expression deciding which stream should be
 +forwarded next: if the result is negative, the first stream is forwarded; if
 +the result is positive or zero, the second stream is forwarded. It can use
 +the following variables:
 +
 +@table @var
 +@item b1 b2
 +number of buffers forwarded so far on each stream
 +@item s1 s2
 +number of samples forwarded so far on each stream
 +@item t1 t2
 +current timestamp of each stream
 +@end table
 +
 +The default value is @code{t1-t2}, which means to always forward the stream
 +that has a smaller timestamp.
 +
 +Example: stress-test @code{amerge} by randomly sending buffers on the wrong
 +input, while avoiding too much of a desynchronization:
 +@example
 +amovie=file.ogg [a] ; amovie=file.mp3 [b] ;
 +[a] [b] astreamsync=(2*random(1))-1+tanh(5*(t1-t2)) [a2] [b2] ;
 +[a2] [b2] amerge
 +@end example
 +
 +@section earwax
 +
 +Make audio easier to listen to on headphones.
 +
 +This filter adds `cues' to 44.1kHz stereo (i.e. audio CD format) audio
 +so that when listened to on headphones the stereo image is moved from
 +inside your head (standard for headphones) to outside and in front of
 +the listener (standard for speakers).
 +
 +Ported from SoX.
 +
 +@section pan
 +
 +Mix channels with specific gain levels. The filter accepts the output
 +channel layout followed by a set of channels definitions.
 +
 +This filter is also designed to remap efficiently the channels of an audio
 +stream.
 +
 +The filter accepts parameters of the form:
 +"@var{l}:@var{outdef}:@var{outdef}:..."
 +
 +@table @option
 +@item l
 +output channel layout or number of channels
 +
 +@item outdef
 +output channel specification, of the form:
 +"@var{out_name}=[@var{gain}*]@var{in_name}[+[@var{gain}*]@var{in_name}...]"
 +
 +@item out_name
 +output channel to define, either a channel name (FL, FR, etc.) or a channel
 +number (c0, c1, etc.)
 +
 +@item gain
 +multiplicative coefficient for the channel, 1 leaving the volume unchanged
 +
 +@item in_name
 +input channel to use, see out_name for details; it is not possible to mix
 +named and numbered input channels
 +@end table
 +
 +If the `=' in a channel specification is replaced by `<', then the gains for
 +that specification will be renormalized so that the total is 1, thus
 +avoiding clipping noise.
 +
 +@subsection Mixing examples
 +
 +For example, if you want to down-mix from stereo to mono, but with a bigger
 +factor for the left channel:
 +@example
 +pan=1:c0=0.9*c0+0.1*c1
 +@end example
 +
 +A customized down-mix to stereo that works automatically for 3-, 4-, 5- and
 +7-channels surround:
 +@example
 +pan=stereo: FL < FL + 0.5*FC + 0.6*BL + 0.6*SL : FR < FR + 0.5*FC + 0.6*BR + 0.6*SR
 +@end example
 +
 +Note that @command{ffmpeg} integrates a default down-mix (and up-mix) system
 +that should be preferred (see "-ac" option) unless you have very specific
 +needs.
 +
 +@subsection Remapping examples
 +
 +The channel remapping will be effective if, and only if:
 +
 +@itemize
 +@item gain coefficients are zeroes or ones,
 +@item only one input per channel output,
 +@end itemize
 +
 +If all these conditions are satisfied, the filter will notify the user ("Pure
 +channel mapping detected"), and use an optimized and lossless method to do the
 +remapping.
 +
 +For example, if you have a 5.1 source and want a stereo audio stream by
 +dropping the extra channels:
 +@example
 +pan="stereo: c0=FL : c1=FR"
 +@end example
 +
 +Given the same source, you can also switch front left and front right channels
 +and keep the input channel layout:
 +@example
 +pan="5.1: c0=c1 : c1=c0 : c2=c2 : c3=c3 : c4=c4 : c5=c5"
 +@end example
 +
 +If the input is a stereo audio stream, you can mute the front left channel (and
 +still keep the stereo channel layout) with:
 +@example
 +pan="stereo:c1=c1"
 +@end example
 +
 +Still with a stereo audio stream input, you can copy the right channel in both
 +front left and right:
 +@example
 +pan="stereo: c0=FR : c1=FR"
 +@end example
 +
 +@section silencedetect
 +
 +Detect silence in an audio stream.
 +
 +This filter logs a message when it detects that the input audio volume is less
 +or equal to a noise tolerance value for a duration greater or equal to the
 +minimum detected noise duration.
 +
 +The printed times and duration are expressed in seconds.
 +
 +@table @option
 +@item duration, d
 +Set silence duration until notification (default is 2 seconds).
 +
 +@item noise, n
 +Set noise tolerance. Can be specified in dB (in case "dB" is appended to the
 +specified value) or amplitude ratio. Default is -60dB, or 0.001.
 +@end table
 +
 +Detect 5 seconds of silence with -50dB noise tolerance:
 +@example
 +silencedetect=n=-50dB:d=5
 +@end example
 +
 +Complete example with @command{ffmpeg} to detect silence with 0.0001 noise
 +tolerance in @file{silence.mp3}:
 +@example
 +ffmpeg -f lavfi -i amovie=silence.mp3,silencedetect=noise=0.0001 -f null -
 +@end example
 +
 +@section volume
 +
 +Adjust the input audio volume.
 +
 +The filter accepts exactly one parameter @var{vol}, which expresses
 +how the audio volume will be increased or decreased.
 +
 +Output values are clipped to the maximum value.
 +
 +If @var{vol} is expressed as a decimal number, the output audio
 +volume is given by the relation:
 +@example
 +@var{output_volume} = @var{vol} * @var{input_volume}
 +@end example
 +
 +If @var{vol} is expressed as a decimal number followed by the string
 +"dB", the value represents the requested change in decibels of the
 +input audio power, and the output audio volume is given by the
 +relation:
 +@example
 +@var{output_volume} = 10^(@var{vol}/20) * @var{input_volume}
 +@end example
 +
 +Otherwise @var{vol} is considered an expression and its evaluated
 +value is used for computing the output audio volume according to the
 +first relation.
 +
 +Default value for @var{vol} is 1.0.
 +
 +@subsection Examples
 +
 +@itemize
 +@item
 +Half the input audio volume:
 +@example
 +volume=0.5
 +@end example
 +
 +The above example is equivalent to:
 +@example
 +volume=1/2
 +@end example
 +
 +@item
 +Decrease input audio power by 12 decibels:
 +@example
 +volume=-12dB
 +@end example
 +@end itemize
 +
  @c man end AUDIO FILTERS
  
  @chapter Audio Sources
  
  Below is a description of the currently available audio sources.
  
 +@section abuffer
 +
 +Buffer audio frames, and make them available to the filter chain.
 +
 +This source is mainly intended for a programmatic use, in particular
 +through the interface defined in @file{libavfilter/asrc_abuffer.h}.
 +
 +It accepts the following mandatory parameters:
 +@var{sample_rate}:@var{sample_fmt}:@var{channel_layout}:@var{packing}
 +
 +@table @option
 +
 +@item sample_rate
 +The sample rate of the incoming audio buffers.
 +
 +@item sample_fmt
 +The sample format of the incoming audio buffers.
 +Either a sample format name or its corresponging integer representation from
 +the enum AVSampleFormat in @file{libavutil/samplefmt.h}
 +
 +@item channel_layout
 +The channel layout of the incoming audio buffers.
 +Either a channel layout name from channel_layout_map in
 +@file{libavutil/audioconvert.c} or its corresponding integer representation
 +from the AV_CH_LAYOUT_* macros in @file{libavutil/audioconvert.h}
 +
 +@item packing
 +Either "packed" or "planar", or their integer representation: 0 or 1
 +respectively.
 +
 +@end table
 +
 +For example:
 +@example
 +abuffer=44100:s16:stereo:planar
 +@end example
 +
 +will instruct the source to accept planar 16bit signed stereo at 44100Hz.
 +Since the sample format with name "s16" corresponds to the number
 +1 and the "stereo" channel layout corresponds to the value 0x3, this is
 +equivalent to:
 +@example
 +abuffer=44100:1:0x3:1
 +@end example
 +
 +@section aevalsrc
 +
 +Generate an audio signal specified by an expression.
 +
 +This source accepts in input one or more expressions (one for each
 +channel), which are evaluated and used to generate a corresponding
 +audio signal.
 +
 +It accepts the syntax: @var{exprs}[::@var{options}].
 +@var{exprs} is a list of expressions separated by ":", one for each
 +separate channel. The output channel layout depends on the number of
 +provided expressions, up to 8 channels are supported.
 +
 +@var{options} is an optional sequence of @var{key}=@var{value} pairs,
 +separated by ":".
 +
 +The description of the accepted options follows.
 +
 +@table @option
 +
 +@item duration, d
 +Set the minimum duration of the sourced audio. See the function
 +@code{av_parse_time()} for the accepted format.
 +Note that the resulting duration may be greater than the specified
 +duration, as the generated audio is always cut at the end of a
 +complete frame.
 +
 +If not specified, or the expressed duration is negative, the audio is
 +supposed to be generated forever.
 +
 +@item nb_samples, n
 +Set the number of samples per channel per each output frame,
 +default to 1024.
 +
 +@item sample_rate, s
 +Specify the sample rate, default to 44100.
 +@end table
 +
 +Each expression in @var{exprs} can contain the following constants:
 +
 +@table @option
 +@item n
 +number of the evaluated sample, starting from 0
 +
 +@item t
 +time of the evaluated sample expressed in seconds, starting from 0
 +
 +@item s
 +sample rate
 +
 +@end table
 +
 +@subsection Examples
 +
 +@itemize
 +
 +@item
 +Generate silence:
 +@example
 +aevalsrc=0
 +@end example
 +
 +@item
 +
 +Generate a sin signal with frequency of 440 Hz, set sample rate to
 +8000 Hz:
 +@example
 +aevalsrc="sin(440*2*PI*t)::s=8000"
 +@end example
 +
 +@item
 +Generate white noise:
 +@example
 +aevalsrc="-2+random(0)"
 +@end example
 +
 +@item
 +Generate an amplitude modulated signal:
 +@example
 +aevalsrc="sin(10*2*PI*t)*sin(880*2*PI*t)"
 +@end example
 +
 +@item
 +Generate 2.5 Hz binaural beats on a 360 Hz carrier:
 +@example
 +aevalsrc="0.1*sin(2*PI*(360-2.5/2)*t) : 0.1*sin(2*PI*(360+2.5/2)*t)"
 +@end example
 +
 +@end itemize
 +
 +@section amovie
 +
 +Read an audio stream from a movie container.
 +
 +It accepts the syntax: @var{movie_name}[:@var{options}] where
 +@var{movie_name} is the name of the resource to read (not necessarily
 +a file but also a device or a stream accessed through some protocol),
 +and @var{options} is an optional sequence of @var{key}=@var{value}
 +pairs, separated by ":".
 +
 +The description of the accepted options follows.
 +
 +@table @option
 +
 +@item format_name, f
 +Specify the format assumed for the movie to read, and can be either
 +the name of a container or an input device. If not specified the
 +format is guessed from @var{movie_name} or by probing.
 +
 +@item seek_point, sp
 +Specify the seek point in seconds, the frames will be output
 +starting from this seek point, the parameter is evaluated with
 +@code{av_strtod} so the numerical value may be suffixed by an IS
 +postfix. Default value is "0".
 +
 +@item stream_index, si
 +Specify the index of the audio stream to read. If the value is -1,
 +the best suited audio stream will be automatically selected. Default
 +value is "-1".
 +
 +@end table
 +
  @section anullsrc
  
 -Null audio source, never return audio frames. It is mainly useful as a
 -template and to be employed in analysis / debugging tools.
 +Null audio source, return unprocessed audio frames. It is mainly useful
 +as a template and to be employed in analysis / debugging tools, or as
 +the source for filters which ignore the input data (for example the sox
 +synth filter).
 +
 +It accepts an optional sequence of @var{key}=@var{value} pairs,
 +separated by ":".
 +
 +The description of the accepted options follows.
 +
 +@table @option
  
 -It accepts as optional parameter a string of the form
 -@var{sample_rate}:@var{channel_layout}.
 +@item sample_rate, s
 +Specify the sample rate, and defaults to 44100.
  
 -@var{sample_rate} specify the sample rate, and defaults to 44100.
 +@item channel_layout, cl
  
 -@var{channel_layout} specify the channel layout, and can be either an
 -integer or a string representing a channel layout. The default value
 -of @var{channel_layout} is 3, which corresponds to CH_LAYOUT_STEREO.
 +Specify the channel layout, and can be either an integer or a string
 +representing a channel layout. The default value of @var{channel_layout}
 +is "stereo".
  
  Check the channel_layout_map definition in
  @file{libavcodec/audioconvert.c} for the mapping between strings and
  channel layout values.
  
 +@item nb_samples, n
 +Set the number of samples per requested frames.
 +
 +@end table
 +
  Follow some examples:
  @example
 -#  set the sample rate to 48000 Hz and the channel layout to CH_LAYOUT_MONO.
 -anullsrc=48000:4
 +#  set the sample rate to 48000 Hz and the channel layout to AV_CH_LAYOUT_MONO.
 +anullsrc=r=48000:cl=4
  
  # same as
 -anullsrc=48000:mono
 +anullsrc=r=48000:cl=mono
  @end example
  
  @c man end AUDIO SOURCES
  
  Below is a description of the currently available audio sinks.
  
 -@section anullsink
 +@section abuffersink
 +
 +Buffer audio frames, and make them available to the end of filter chain.
 +
 +This sink is mainly intended for programmatic use, in particular
 +through the interface defined in @file{libavfilter/buffersink.h}.
 +
 +It requires a pointer to an AVABufferSinkContext structure, which
 +defines the incoming buffers' formats, to be passed as the opaque
 +parameter to @code{avfilter_init_filter} for initialization.
 +
 +@section anullsink
 +
 +Null audio sink, do absolutely nothing with the input audio. It is
 +mainly useful as a template and to be employed in analysis / debugging
 +tools.
 +
 +@c man end AUDIO SINKS
 +
 +@chapter Video Filters
 +@c man begin VIDEO FILTERS
 +
 +When you configure your FFmpeg build, you can disable any of the
 +existing filters using @code{--disable-filters}.
 +The configure output will show the video filters included in your
 +build.
 +
 +Below is a description of the currently available video filters.
 +
 +@section ass
 +
 +Draw ASS (Advanced Substation Alpha) subtitles on top of input video
 +using the libass library.
 +
 +To enable compilation of this filter you need to configure FFmpeg with
 +@code{--enable-libass}.
 +
 +This filter accepts the syntax: @var{ass_filename}[:@var{options}],
 +where @var{ass_filename} is the filename of the ASS file to read, and
 +@var{options} is an optional sequence of @var{key}=@var{value} pairs,
 +separated by ":".
 +
 +A description of the accepted options follows.
 +
 +@table @option
 +@item original_size
 +Specifies the size of the original video, the video for which the ASS file
 +was composed. Due to a misdesign in ASS aspect ratio arithmetic, this is
 +necessary to correctly scale the fonts if the aspect ratio has been changed.
 +@end table
 +
 +For example, to render the file @file{sub.ass} on top of the input
 +video, use the command:
 +@example
 +ass=sub.ass
 +@end example
 +
 +@section bbox
 +
 +Compute the bounding box for the non-black pixels in the input frame
 +luminance plane.
 +
 +This filter computes the bounding box containing all the pixels with a
 +luminance value greater than the minimum allowed value.
 +The parameters describing the bounding box are printed on the filter
 +log.
 +
 +@section blackdetect
 +
 +Detect video intervals that are (almost) completely black. Can be
 +useful to detect chapter transitions, commercials, or invalid
 +recordings. Output lines contains the time for the start, end and
 +duration of the detected black interval expressed in seconds.
 +
 +In order to display the output lines, you need to set the loglevel at
 +least to the AV_LOG_INFO value.
 +
 +This filter accepts a list of options in the form of
 +@var{key}=@var{value} pairs separated by ":". A description of the
 +accepted options follows.
 +
 +@table @option
 +@item black_min_duration, d
 +Set the minimum detected black duration expressed in seconds. It must
 +be a non-negative floating point number.
 +
 +Default value is 2.0.
 +
 +@item picture_black_ratio_th, pic_th
 +Set the threshold for considering a picture "black".
 +Express the minimum value for the ratio:
 +@example
 +@var{nb_black_pixels} / @var{nb_pixels}
 +@end example
 +
 +for which a picture is considered black.
 +Default value is 0.98.
  
 -Null audio sink, do absolutely nothing with the input audio. It is
 -mainly useful as a template and to be employed in analysis / debugging
 -tools.
 +@item pixel_black_th, pix_th
 +Set the threshold for considering a pixel "black".
  
 -@c man end AUDIO SINKS
 +The threshold expresses the maximum pixel luminance value for which a
 +pixel is considered "black". The provided value is scaled according to
 +the following equation:
 +@example
 +@var{absolute_threshold} = @var{luminance_minimum_value} + @var{pixel_black_th} * @var{luminance_range_size}
 +@end example
  
 -@chapter Video Filters
 -@c man begin VIDEO FILTERS
 +@var{luminance_range_size} and @var{luminance_minimum_value} depend on
 +the input video format, the range is [0-255] for YUV full-range
 +formats and [16-235] for YUV non full-range formats.
  
 -When you configure your Libav build, you can disable any of the
 -existing filters using --disable-filters.
 -The configure output will show the video filters included in your
 -build.
 +Default value is 0.10.
 +@end table
  
 -Below is a description of the currently available video filters.
 +The following example sets the maximum pixel threshold to the minimum
 +value, and detects only black intervals of 2 or more seconds:
 +@example
 +blackdetect=d=2:pix_th=0.00
 +@end example
  
  @section blackframe
  
@@@ -871,7 -196,7 +871,7 @@@ considered black, and defaults to 32
  Apply boxblur algorithm to the input video.
  
  This filter accepts the parameters:
 -@var{luma_power}:@var{luma_radius}:@var{chroma_radius}:@var{chroma_power}:@var{alpha_radius}:@var{alpha_power}
 +@var{luma_radius}:@var{luma_power}:@var{chroma_radius}:@var{chroma_power}:@var{alpha_radius}:@var{alpha_power}
  
  Chroma and alpha parameters are optional, if not specified they default
  to the corresponding values set for @var{luma_radius} and
@@@ -926,18 -251,6 +926,18 @@@ boxblur=min(h\,w)/10:1:min(cw\,ch)/10:
  
  @end itemize
  
 +@section colormatrix
 +
 +The colormatrix filter allows conversion between any of the following color
 +space: BT.709 (@var{bt709}), BT.601 (@var{bt601}), SMPTE-240M (@var{smpte240m})
 +and FCC (@var{fcc}).
 +
 +The syntax of the parameters is @var{source}:@var{destination}:
 +
 +@example
 +colormatrix=bt601:smpte240m
 +@end example
 +
  @section copy
  
  Copy the input source unchanged to the output. Mainly useful for
@@@ -945,16 -258,15 +945,16 @@@ testing purposes
  
  @section crop
  
 -Crop the input video to @var{out_w}:@var{out_h}:@var{x}:@var{y}.
 +Crop the input video to @var{out_w}:@var{out_h}:@var{x}:@var{y}:@var{keep_aspect}
  
 -The parameters are expressions containing the following constants:
 +The @var{keep_aspect} parameter is optional, if specified and set to a
 +non-zero value will force the output display aspect ratio to be the
 +same of the input, by changing the output sample aspect ratio.
  
 -@table @option
 -@item E, PI, PHI
 -the corresponding mathematical approximated values for e
 -(euler number), pi (greek PI), PHI (golden ratio)
 +The @var{out_w}, @var{out_h}, @var{x}, @var{y} parameters are
 +expressions containing the following constants:
  
 +@table @option
  @item x, y
  the computed values for @var{x} and @var{y}. They are evaluated for
  each new frame.
@@@ -971,19 -283,6 +971,19 @@@ the output (cropped) width and heigh
  @item ow, oh
  same as @var{out_w} and @var{out_h}
  
 +@item a
 +same as @var{iw} / @var{ih}
 +
 +@item sar
 +input sample aspect ratio
 +
 +@item dar
 +input display aspect ratio, it is the same as (@var{iw} / @var{ih}) * @var{sar}
 +
 +@item hsub, vsub
 +horizontal and vertical chroma subsample values. For example for the
 +pixel format "yuv422p" @var{hsub} is 2 and @var{vsub} is 1.
 +
  @item n
  the number of input frame, starting from 0
  
@@@ -1142,76 -441,6 +1142,76 @@@ delogo=x=0:y=0:w=100:h=77:band=1
  
  @end itemize
  
 +@section deshake
 +
 +Attempt to fix small changes in horizontal and/or vertical shift. This
 +filter helps remove camera shake from hand-holding a camera, bumping a
 +tripod, moving on a vehicle, etc.
 +
 +The filter accepts parameters as a string of the form
 +"@var{x}:@var{y}:@var{w}:@var{h}:@var{rx}:@var{ry}:@var{edge}:@var{blocksize}:@var{contrast}:@var{search}:@var{filename}"
 +
 +A description of the accepted parameters follows.
 +
 +@table @option
 +
 +@item x, y, w, h
 +Specify a rectangular area where to limit the search for motion
 +vectors.
 +If desired the search for motion vectors can be limited to a
 +rectangular area of the frame defined by its top left corner, width
 +and height. These parameters have the same meaning as the drawbox
 +filter which can be used to visualise the position of the bounding
 +box.
 +
 +This is useful when simultaneous movement of subjects within the frame
 +might be confused for camera motion by the motion vector search.
 +
 +If any or all of @var{x}, @var{y}, @var{w} and @var{h} are set to -1
 +then the full frame is used. This allows later options to be set
 +without specifying the bounding box for the motion vector search.
 +
 +Default - search the whole frame.
 +
 +@item rx, ry
 +Specify the maximum extent of movement in x and y directions in the
 +range 0-64 pixels. Default 16.
 +
 +@item edge
 +Specify how to generate pixels to fill blanks at the edge of the
 +frame. An integer from 0 to 3 as follows:
 +@table @option
 +@item 0
 +Fill zeroes at blank locations
 +@item 1
 +Original image at blank locations
 +@item 2
 +Extruded edge value at blank locations
 +@item 3
 +Mirrored edge at blank locations
 +@end table
 +
 +The default setting is mirror edge at blank locations.
 +
 +@item blocksize
 +Specify the blocksize to use for motion search. Range 4-128 pixels,
 +default 8.
 +
 +@item contrast
 +Specify the contrast threshold for blocks. Only blocks with more than
 +the specified contrast (difference between darkest and lightest
 +pixels) will be considered. Range 1-255, default 125.
 +
 +@item search
 +Specify the search strategy 0 = exhaustive search, 1 = less exhaustive
 +search. Default - exhaustive search.
 +
 +@item filename
 +If set then a detailed log of the motion search is written to the
 +specified file.
 +
 +@end table
 +
  @section drawbox
  
  Draw a colored box on the input image.
@@@ -1249,7 -478,7 +1249,7 @@@ drawbox=10:20:200:60:red@@0.5
  Draw text string or text from specified file on top of video using the
  libfreetype library.
  
 -To enable compilation of this filter you need to configure Libav with
 +To enable compilation of this filter you need to configure FFmpeg with
  @code{--enable-libfreetype}.
  
  The filter also recognizes strftime() sequences in the provided text
@@@ -1262,29 -491,60 +1262,29 @@@ The description of the accepted paramet
  
  @table @option
  
 -@item fontfile
 -The font file to be used for drawing text. Path must be included.
 -This parameter is mandatory.
 -
 -@item text
 -The text string to be drawn. The text must be a sequence of UTF-8
 -encoded characters.
 -This parameter is mandatory if no file is specified with the parameter
 -@var{textfile}.
 -
 -@item textfile
 -A text file containing text to be drawn. The text must be a sequence
 -of UTF-8 encoded characters.
 -
 -This parameter is mandatory if no text string is specified with the
 -parameter @var{text}.
 -
 -If both text and textfile are specified, an error is thrown.
 -
 -@item x, y
 -The offsets where text will be drawn within the video frame.
 -Relative to the top/left border of the output image.
 -They accept expressions similar to the @ref{overlay} filter:
 -@table @option
 -
 -@item x, y
 -the computed values for @var{x} and @var{y}. They are evaluated for
 -each new frame.
 -
 -@item main_w, main_h
 -main input width and height
 -
 -@item W, H
 -same as @var{main_w} and @var{main_h}
 -
 -@item text_w, text_h
 -rendered text width and height
 -
 -@item w, h
 -same as @var{text_w} and @var{text_h}
 +@item box
 +Used to draw a box around text using background color.
 +Value should be either 1 (enable) or 0 (disable).
 +The default value of @var{box} is 0.
  
 -@item n
 -the number of frames processed, starting from 0
 +@item boxcolor
 +The color to be used for drawing box around text.
 +Either a string (e.g. "yellow") or in 0xRRGGBB[AA] format
 +(e.g. "0xff00ff"), possibly followed by an alpha specifier.
 +The default value of @var{boxcolor} is "white".
  
 -@item t
 -timestamp expressed in seconds, NAN if the input timestamp is unknown
 +@item draw
 +Set an expression which specifies if the text should be drawn. If the
 +expression evaluates to 0, the text is not drawn. This is useful for
 +specifying that the text should be drawn only when specific conditions
 +are met.
  
 -@end table
 +Default value is "1".
  
 -The default value of @var{x} and @var{y} is 0.
 +See below for the list of accepted constants and functions.
  
 -@item fontsize
 -The font size to be used for drawing text.
 -The default value of @var{fontsize} is 16.
 +@item fix_bounds
 +If true, check and fix text coords to avoid clipping.
  
  @item fontcolor
  The color to be used for drawing fonts.
@@@ -1292,13 -552,27 +1292,13 @@@ Either a string (e.g. "red") or in 0xRR
  (e.g. "0xff000033"), possibly followed by an alpha specifier.
  The default value of @var{fontcolor} is "black".
  
 -@item boxcolor
 -The color to be used for drawing box around text.
 -Either a string (e.g. "yellow") or in 0xRRGGBB[AA] format
 -(e.g. "0xff00ff"), possibly followed by an alpha specifier.
 -The default value of @var{boxcolor} is "white".
 -
 -@item box
 -Used to draw a box around text using background color.
 -Value should be either 1 (enable) or 0 (disable).
 -The default value of @var{box} is 0.
 -
 -@item shadowx, shadowy
 -The x and y offsets for the text shadow position with respect to the
 -position of the text. They can be either positive or negative
 -values. Default value for both is "0".
 +@item fontfile
 +The font file to be used for drawing text. Path must be included.
 +This parameter is mandatory.
  
 -@item shadowcolor
 -The color to be used for drawing a shadow behind the drawn text.  It
 -can be a color name (e.g. "yellow") or a string in the 0xRRGGBB[AA]
 -form (e.g. "0xff00ff"), possibly followed by an alpha specifier.
 -The default value of @var{shadowcolor} is "black".
 +@item fontsize
 +The font size to be used for drawing text.
 +The default value of @var{fontsize} is 16.
  
  @item ft_load_flags
  Flags to be used for loading the fonts.
@@@ -1329,203 -603,45 +1329,203 @@@ Default value is "render"
  For more information consult the documentation for the FT_LOAD_*
  libfreetype flags.
  
 +@item shadowcolor
 +The color to be used for drawing a shadow behind the drawn text.  It
 +can be a color name (e.g. "yellow") or a string in the 0xRRGGBB[AA]
 +form (e.g. "0xff00ff"), possibly followed by an alpha specifier.
 +The default value of @var{shadowcolor} is "black".
 +
 +@item shadowx, shadowy
 +The x and y offsets for the text shadow position with respect to the
 +position of the text. They can be either positive or negative
 +values. Default value for both is "0".
 +
  @item tabsize
  The size in number of spaces to use for rendering the tab.
  Default value is 4.
  
 -@item fix_bounds
 -If true, check and fix text coords to avoid clipping.
 +@item timecode
 +Set the initial timecode representation in "hh:mm:ss[:;.]ff"
 +format. It can be used with or without text parameter. @var{timecode_rate}
 +option must be specified.
 +
 +@item timecode_rate, rate, r
 +Set the timecode frame rate (timecode only).
 +
 +@item text
 +The text string to be drawn. The text must be a sequence of UTF-8
 +encoded characters.
 +This parameter is mandatory if no file is specified with the parameter
 +@var{textfile}.
 +
 +@item textfile
 +A text file containing text to be drawn. The text must be a sequence
 +of UTF-8 encoded characters.
 +
 +This parameter is mandatory if no text string is specified with the
 +parameter @var{text}.
 +
 +If both @var{text} and @var{textfile} are specified, an error is thrown.
 +
 +@item x, y
 +The expressions which specify the offsets where text will be drawn
 +within the video frame. They are relative to the top/left border of the
 +output image.
 +
 +The default value of @var{x} and @var{y} is "0".
 +
 +See below for the list of accepted constants and functions.
 +@end table
 +
 +The parameters for @var{x} and @var{y} are expressions containing the
 +following constants and functions:
 +
 +@table @option
 +@item dar
 +input display aspect ratio, it is the same as (@var{w} / @var{h}) * @var{sar}
 +
 +@item hsub, vsub
 +horizontal and vertical chroma subsample values. For example for the
 +pixel format "yuv422p" @var{hsub} is 2 and @var{vsub} is 1.
 +
 +@item line_h, lh
 +the height of each text line
 +
 +@item main_h, h, H
 +the input height
 +
 +@item main_w, w, W
 +the input width
 +
 +@item max_glyph_a, ascent
 +the maximum distance from the baseline to the highest/upper grid
 +coordinate used to place a glyph outline point, for all the rendered
 +glyphs.
 +It is a positive value, due to the grid's orientation with the Y axis
 +upwards.
 +
 +@item max_glyph_d, descent
 +the maximum distance from the baseline to the lowest grid coordinate
 +used to place a glyph outline point, for all the rendered glyphs.
 +This is a negative value, due to the grid's orientation, with the Y axis
 +upwards.
 +
 +@item max_glyph_h
 +maximum glyph height, that is the maximum height for all the glyphs
 +contained in the rendered text, it is equivalent to @var{ascent} -
 +@var{descent}.
 +
 +@item max_glyph_w
 +maximum glyph width, that is the maximum width for all the glyphs
 +contained in the rendered text
 +
 +@item n
 +the number of input frame, starting from 0
 +
 +@item rand(min, max)
 +return a random number included between @var{min} and @var{max}
 +
 +@item sar
 +input sample aspect ratio
 +
 +@item t
 +timestamp expressed in seconds, NAN if the input timestamp is unknown
 +
 +@item text_h, th
 +the height of the rendered text
 +
 +@item text_w, tw
 +the width of the rendered text
 +
 +@item x, y
 +the x and y offset coordinates where the text is drawn.
 +
 +These parameters allow the @var{x} and @var{y} expressions to refer
 +each other, so you can for example specify @code{y=x/dar}.
  @end table
  
 -For example the command:
 +If libavfilter was built with @code{--enable-fontconfig}, then
 +@option{fontfile} can be a fontconfig pattern or omitted.
 +
 +Some examples follow.
 +
 +@itemize
 +
 +@item
 +Draw "Test Text" with font FreeSerif, using the default values for the
 +optional parameters.
 +
  @example
  drawtext="fontfile=/usr/share/fonts/truetype/freefont/FreeSerif.ttf: text='Test Text'"
  @end example
  
 -will draw "Test Text" with font FreeSerif, using the default values
 -for the optional parameters.
 +@item
 +Draw 'Test Text' with font FreeSerif of size 24 at position x=100
 +and y=50 (counting from the top-left corner of the screen), text is
 +yellow with a red box around it. Both the text and the box have an
 +opacity of 20%.
  
 -The command:
  @example
  drawtext="fontfile=/usr/share/fonts/truetype/freefont/FreeSerif.ttf: text='Test Text':\
            x=100: y=50: fontsize=24: fontcolor=yellow@@0.2: box=1: boxcolor=red@@0.2"
  @end example
  
 -will draw 'Test Text' with font FreeSerif of size 24 at position x=100
 -and y=50 (counting from the top-left corner of the screen), text is
 -yellow with a red box around it. Both the text and the box have an
 -opacity of 20%.
 -
  Note that the double quotes are not necessary if spaces are not used
  within the parameter list.
  
 +@item
 +Show the text at the center of the video frame:
 +@example
 +drawtext="fontsize=30:fontfile=FreeSerif.ttf:text='hello world':x=(w-text_w)/2:y=(h-text_h-line_h)/2"
 +@end example
 +
 +@item
 +Show a text line sliding from right to left in the last row of the video
 +frame. The file @file{LONG_LINE} is assumed to contain a single line
 +with no newlines.
 +@example
 +drawtext="fontsize=15:fontfile=FreeSerif.ttf:text=LONG_LINE:y=h-line_h:x=-50*t"
 +@end example
 +
 +@item
 +Show the content of file @file{CREDITS} off the bottom of the frame and scroll up.
 +@example
 +drawtext="fontsize=20:fontfile=FreeSerif.ttf:textfile=CREDITS:y=h-20*t"
 +@end example
 +
 +@item
 +Draw a single green letter "g", at the center of the input video.
 +The glyph baseline is placed at half screen height.
 +@example
 +drawtext="fontsize=60:fontfile=FreeSerif.ttf:fontcolor=green:text=g:x=(w-max_glyph_w)/2:y=h/2-ascent"
 +@end example
 +
 +@item
 +Show text for 1 second every 3 seconds:
 +@example
 +drawtext="fontfile=FreeSerif.ttf:fontcolor=white:x=100:y=x/dar:draw=lt(mod(t\\,3)\\,1):text='blink'"
 +@end example
 +
 +@item
 +Use fontconfig to set the font. Note that the colons need to be escaped.
 +@example
 +drawtext='fontfile=Linux Libertine O-40\\:style=Semibold:text=FFmpeg'
 +@end example
 +
 +@end itemize
 +
  For more information about libfreetype, check:
  @url{http://www.freetype.org/}.
  
 +For more information about fontconfig, check:
 +@url{http://freedesktop.org/software/fontconfig/fontconfig-user.html}.
 +
  @section fade
  
  Apply fade-in/out effect to input video.
  
  It accepts the parameters:
 -@var{type}:@var{start_frame}:@var{nb_frames}
 +@var{type}:@var{start_frame}:@var{nb_frames}[:@var{options}]
  
  @var{type} specifies if the effect type, can be either "in" for
  fade-in, or "out" for a fade-out effect.
  @var{start_frame} specifies the number of the start frame for starting
  to apply the fade effect.
  
 -@var{nb_frames} specifies the number of frames for which the fade
 -effect has to last. At the end of the fade-in effect the output video
 -will have the same intensity as the input video, at the end of the
 -fade-out transition the output video will be completely black.
 +@var{nb_frames} specifies the number of frames for which the fade
 +effect has to last. At the end of the fade-in effect the output video
 +will have the same intensity as the input video, at the end of the
 +fade-out transition the output video will be completely black.
 +
 +@var{options} is an optional sequence of @var{key}=@var{value} pairs,
 +separated by ":". The description of the accepted options follows.
 +
 +@table @option
 +
 +@item type, t
 +See @var{type}.
 +
 +@item start_frame, s
 +See @var{start_frame}.
 +
 +@item nb_frames, n
 +See @var{nb_frames}.
 +
 +@item alpha
 +If set to 1, fade only alpha channel, if one exists on the input.
 +Default value is 0.
 +@end table
  
  A few usage examples follow, usable too as test scenarios.
  @example
@@@ -1570,9 -667,6 +1570,9 @@@ fade=in:0:25, fade=out:975:2
  
  # make first 5 frames black, then fade in from frame 5-24
  fade=in:5:20
 +
 +# fade in alpha over first 25 frames of video
 +fade=in:0:25:alpha=1
  @end example
  
  @section fieldorder
@@@ -1605,7 -699,7 +1605,7 @@@ which is bottom field first
  
  For example:
  @example
 -./avconv -i in.vob -vf "fieldorder=bff" out.dv
 +ffmpeg -i in.vob -vf "fieldorder=bff" out.dv
  @end example
  
  @section fifo
@@@ -1641,7 -735,7 +1641,7 @@@ format=yuv420p:yuv444p:yuv410
  Apply a frei0r effect to the input video.
  
  To enable compilation of this filter you need to install the frei0r
 -header and configure Libav with --enable-frei0r.
 +header and configure FFmpeg with @code{--enable-frei0r}.
  
  The filter supports the syntax:
  @example
@@@ -1689,7 -783,7 +1689,7 @@@ For more information see
  @section gradfun
  
  Fix the banding artifacts that are sometimes introduced into nearly flat
 -regions by truncation to 8bit colordepth.
 +regions by truncation to 8bit color depth.
  Interpolate the gradients that should go where the bands are, and
  dither them.
  
@@@ -1723,9 -817,9 +1723,9 @@@ gradfun=1.
  
  Flip the input video horizontally.
  
 -For example to horizontally flip the input video with @command{avconv}:
 +For example to horizontally flip the input video with @command{ffmpeg}:
  @example
 -avconv -i in.avi -vf "hflip" out.avi
 +ffmpeg -i in.avi -vf "hflip" out.avi
  @end example
  
  @section hqdn3d
@@@ -1755,11 -849,6 +1755,11 @@@ a float number which specifies chroma t
  @var{luma_tmp}*@var{chroma_spatial}/@var{luma_spatial}
  @end table
  
 +@section idet
 +
 +Interlaceing detect filter. This filter tries to detect if the input is
 +interlaced or progressive. Top or bottom field first.
 +
  @section lut, lutrgb, lutyuv
  
  Compute a look-up table for binding each pixel component input value
@@@ -1775,14 -864,10 +1775,14 @@@ corresponding pixel component values
  The @var{lut} filter requires either YUV or RGB pixel formats in
  input, and accepts the options:
  @table @option
 -@var{c0} (first  pixel component)
 -@var{c1} (second pixel component)
 -@var{c2} (third  pixel component)
 -@var{c3} (fourth pixel component, corresponds to the alpha component)
 +@item c0
 +first  pixel component
 +@item c1
 +second pixel component
 +@item c2
 +third  pixel component
 +@item c3
 +fourth pixel component, corresponds to the alpha component
  @end table
  
  The exact component associated to each option depends on the format in
@@@ -1791,32 -876,28 +1791,32 @@@ input
  The @var{lutrgb} filter requires RGB pixel formats in input, and
  accepts the options:
  @table @option
 -@var{r} (red component)
 -@var{g} (green component)
 -@var{b} (blue component)
 -@var{a} (alpha component)
 +@item r
 +red component
 +@item g
 +green component
 +@item b
 +blue component
 +@item a
 +alpha component
  @end table
  
  The @var{lutyuv} filter requires YUV pixel formats in input, and
  accepts the options:
  @table @option
 -@var{y} (Y/luminance component)
 -@var{u} (U/Cb component)
 -@var{v} (V/Cr component)
 -@var{a} (alpha component)
 +@item y
 +Y/luminance component
 +@item u
 +U/Cb component
 +@item v
 +V/Cr component
 +@item a
 +alpha component
  @end table
  
  The expressions can contain the following constants and functions:
  
  @table @option
 -@item E, PI, PHI
 -the corresponding mathematical approximated values for e
 -(euler number), pi (greek PI), PHI (golden ratio)
 -
  @item w, h
  the input width and height
  
@@@ -1862,7 -943,7 +1862,7 @@@ lutrgb="r=negval:g=negval:b=negval
  lutyuv="y=negval:u=negval:v=negval"
  
  # negate luminance
 -lutyuv=negval
 +lutyuv=y=negval
  
  # remove chroma components, turns the video into a graytone image
  lutyuv="u=128:v=128"
@@@ -1880,89 -961,6 +1880,89 @@@ format=rgba,lutrgb=a="maxval-minval/2
  lutyuv=y=gammaval(0.5)
  @end example
  
 +@section mp
 +
 +Apply an MPlayer filter to the input video.
 +
 +This filter provides a wrapper around most of the filters of
 +MPlayer/MEncoder.
 +
 +This wrapper is considered experimental. Some of the wrapped filters
 +may not work properly and we may drop support for them, as they will
 +be implemented natively into FFmpeg. Thus you should avoid
 +depending on them when writing portable scripts.
 +
 +The filters accepts the parameters:
 +@var{filter_name}[:=]@var{filter_params}
 +
 +@var{filter_name} is the name of a supported MPlayer filter,
 +@var{filter_params} is a string containing the parameters accepted by
 +the named filter.
 +
 +The list of the currently supported filters follows:
 +@table @var
 +@item decimate
 +@item denoise3d
 +@item detc
 +@item dint
 +@item divtc
 +@item down3dright
 +@item dsize
 +@item eq2
 +@item eq
 +@item field
 +@item fil
 +@item fixpts
 +@item framestep
 +@item fspp
 +@item geq
 +@item harddup
 +@item hqdn3d
 +@item hue
 +@item il
 +@item ilpack
 +@item ivtc
 +@item kerndeint
 +@item mcdeint
 +@item noise
 +@item ow
 +@item palette
 +@item perspective
 +@item phase
 +@item pp7
 +@item pullup
 +@item qp
 +@item rectangle
 +@item rotate
 +@item sab
 +@item smartblur
 +@item softpulldown
 +@item softskip
 +@item spp
 +@item telecine
 +@item tile
 +@item tinterlace
 +@item unsharp
 +@item uspp
 +@item yuvcsp
 +@item yvu9
 +@end table
 +
 +The parameter syntax and behavior for the listed filters are the same
 +of the corresponding MPlayer filters. For detailed instructions check
 +the "VIDEO FILTERS" section in the MPlayer manual.
 +
 +Some examples follow:
 +@example
 +# adjust gamma, brightness, contrast
 +mp=eq2=1.0:2:0.5
 +
 +# tweak hue and saturation
 +mp=hue=100:-10
 +@end example
 +
 +See also mplayer(1), @url{http://www.mplayerhq.hu/}.
 +
  @section negate
  
  Negate input video.
  This filter accepts an integer in input, if non-zero it negates the
  alpha component (if available). The default value in input is 0.
  
 +@section noformat
 +
  Force libavfilter not to use any of the specified pixel formats for the
  input to the next filter.
  
@@@ -1997,7 -993,7 +1997,7 @@@ Pass the video source unchanged to the 
  Apply video transform using libopencv.
  
  To enable this filter install libopencv library and headers and
 -configure Libav with --enable-libopencv.
 +configure FFmpeg with @code{--enable-libopencv}.
  
  The filter takes the parameters: @var{filter_name}@{:=@}@var{filter_params}.
  
@@@ -2097,10 -1093,10 +2097,10 @@@ Overlay one video on top of another
  It takes two inputs and one output, the first input is the "main"
  video on which the second input is overlayed.
  
 -It accepts the parameters: @var{x}:@var{y}.
 +It accepts the parameters: @var{x}:@var{y}[:@var{options}].
  
  @var{x} is the x coordinate of the overlayed video on the main video,
 -@var{y} is the y coordinate. The parameters are expressions containing
 +@var{y} is the y coordinate. @var{x} and @var{y} are expressions containing
  the following parameters:
  
  @table @option
@@@ -2117,17 -1113,6 +2117,17 @@@ overlay input width and heigh
  same as @var{overlay_w} and @var{overlay_h}
  @end table
  
 +@var{options} is an optional list of @var{key}=@var{value} pairs,
 +separated by ":".
 +
 +The description of the accepted options follows.
 +
 +@table @option
 +@item rgb
 +If set to 1, force the filter to accept inputs in the RGB
 +color space. Default value is 0.
 +@end table
 +
  Be aware that frames are taken from each input video in timestamp
  order, hence, if their initial timestamps differ, it is a a good idea
  to pass the two inputs through a @var{setpts=PTS-STARTPTS} filter to
@@@ -2141,11 -1126,11 +2141,11 @@@ Follow some examples
  overlay=main_w-overlay_w-10:main_h-overlay_h-10
  
  # insert a transparent PNG logo in the bottom left corner of the input
 -avconv -i input -i logo -filter_complex 'overlay=10:main_h-overlay_h-10' output
 +ffmpeg -i input -i logo -filter_complex 'overlay=10:main_h-overlay_h-10' output
  
  # insert 2 different transparent PNG logos (second logo on bottom
  # right corner):
 -avconv -i input -i logo1 -i logo2 -filter_complex
 +ffmpeg -i input -i logo1 -i logo2 -filter_complex
  'overlay=10:H-h-10,overlay=W-w-10:H-h-10' output
  
  # add a transparent color layer on top of the main video,
@@@ -2168,6 -1153,10 +2168,6 @@@ The parameters @var{width}, @var{height
  expressions containing the following constants:
  
  @table @option
 -@item E, PI, PHI
 -the corresponding mathematical approximated values for e
 -(euler number), pi (greek PI), phi (golden ratio)
 -
  @item in_w, in_h
  the input video width and height
  
@@@ -2186,13 -1175,7 +2186,13 @@@ x and y offsets as specified by the @va
  expressions, or NAN if not yet specified
  
  @item a
 -input display aspect ratio, same as @var{iw} / @var{ih}
 +same as @var{iw} / @var{ih}
 +
 +@item sar
 +input sample aspect ratio
 +
 +@item dar
 +input display aspect ratio, it is the same as (@var{iw} / @var{ih}) * @var{sar}
  
  @item hsub, vsub
  horizontal and vertical chroma subsample values. For example for the
@@@ -2252,12 -1235,6 +2252,12 @@@ pad="max(iw\,ih):ow:(ow-iw)/2:(oh-ih)/2
  # pad the input to get a final w/h ratio of 16:9
  pad="ih*16/9:ih:(ow-iw)/2:(oh-ih)/2"
  
 +# for anamorphic video, in order to set the output display aspect ratio,
 +# it is necessary to use sar in the expression, according to the relation:
 +# (ih * X / ih) * sar = output_dar
 +# X = output_dar / sar
 +pad="ih*16/9/sar:ih:(ow-iw)/2:(oh-ih)/2"
 +
  # double output size and put the input video in the bottom-right
  # corner of the output padded area
  pad="2*iw:2*ih:ow-iw:oh-ih"
@@@ -2275,43 -1252,18 +2275,43 @@@ format=monow, pixdesctes
  
  can be used to test the monowhite pixel format descriptor definition.
  
 +@section removelogo
 +
 +Suppress a TV station logo, using an image file to determine which
 +pixels comprise the logo. It works by filling in the pixels that
 +comprise the logo with neighboring pixels.
 +
 +This filter requires one argument which specifies the filter bitmap
 +file, which can be any image format supported by libavformat. The
 +width and height of the image file must match those of the video
 +stream being processed.
 +
 +Pixels in the provided bitmap image with a value of zero are not
 +considered part of the logo, non-zero pixels are considered part of
 +the logo. If you use white (255) for the logo and black (0) for the
 +rest, you will be safe. For making the filter bitmap, it is
 +recommended to take a screen capture of a black frame with the logo
 +visible, and then using a threshold filter followed by the erode
 +filter once or twice.
 +
 +If needed, little splotches can be fixed manually. Remember that if
 +logo pixels are not covered, the filter quality will be much
 +reduced. Marking too many pixels as part of the logo does not hurt as
 +much, but it will increase the amount of blurring needed to cover over
 +the image and will destroy more information than necessary, and extra
 +pixels will slow things down on a large logo.
 +
  @section scale
  
 -Scale the input video to @var{width}:@var{height} and/or convert the image format.
 +Scale the input video to @var{width}:@var{height}[:@var{interl}=@{1|-1@}] and/or convert the image format.
 +
 +The scale filter forces the output display aspect ratio to be the same
 +of the input, by changing the output sample aspect ratio.
  
  The parameters @var{width} and @var{height} are expressions containing
  the following constants:
  
  @table @option
 -@item E, PI, PHI
 -the corresponding mathematical approximated values for e
 -(euler number), pi (greek PI), phi (golden ratio)
 -
  @item in_w, in_h
  the input width and height
  
@@@ -2324,15 -1276,12 +2324,15 @@@ the output (cropped) width and heigh
  @item ow, oh
  same as @var{out_w} and @var{out_h}
  
 -@item dar, a
 -input display aspect ratio, same as @var{iw} / @var{ih}
 +@item a
 +same as @var{iw} / @var{ih}
  
  @item sar
  input sample aspect ratio
  
 +@item dar
 +input display aspect ratio, it is the same as (@var{iw} / @var{ih}) * @var{sar}
 +
  @item hsub, vsub
  horizontal and vertical chroma subsample values. For example for the
  pixel format "yuv422p" @var{hsub} is 2 and @var{vsub} is 1.
@@@ -2351,19 -1300,6 +2351,19 @@@ ratio of the input image
  
  The default value of @var{width} and @var{height} is 0.
  
 +Valid values for the optional parameter @var{interl} are:
 +
 +@table @option
 +@item 1
 +force interlaced aware scaling
 +
 +@item -1
 +select interlaced aware scaling depending on whether the source frames
 +are flagged as interlaced or not
 +@end table
 +
 +Unless @var{interl} is set to one of the above options, interlaced scaling will not be used.
 +
  Some examples follow:
  @example
  # scale the input video to a size of 200x100.
@@@ -2374,9 -1310,6 +2374,9 @@@ scale=2*iw:2*i
  # the above is the same as
  scale=2*in_w:2*in_h
  
 +# scale the input to 2x with forced interlaced scaling
 +scale=2*iw:2*ih:interl=1
 +
  # scale the input to half size
  scale=iw/2:ih/2
  
@@@ -2407,6 -1340,15 +2407,6 @@@ is selected and passed to the output, o
  The expression can contain the following constants:
  
  @table @option
 -@item PI
 -Greek PI
 -
 -@item PHI
 -golden ratio
 -
 -@item E
 -Euler number
 -
  @item n
  the sequential number of the filtered frame, starting from 0
  
@@@ -2504,79 -1446,35 +2504,79 @@@ select='gte(t\,10)*lte(t\,20)*eq(pict_t
  select='isnan(prev_selected_t)+gte(t-prev_selected_t\,10)'
  @end example
  
 -@anchor{setdar}
 -@section setdar
 +@section setdar, setsar
  
 -Set the Display Aspect Ratio for the filter output video.
 +The @code{setdar} filter sets the Display Aspect Ratio for the filter
 +output video.
  
  This is done by changing the specified Sample (aka Pixel) Aspect
  Ratio, according to the following equation:
 -@math{DAR = HORIZONTAL_RESOLUTION / VERTICAL_RESOLUTION * SAR}
 +@example
 +@var{DAR} = @var{HORIZONTAL_RESOLUTION} / @var{VERTICAL_RESOLUTION} * @var{SAR}
 +@end example
 +
 +Keep in mind that the @code{setdar} filter does not modify the pixel
 +dimensions of the video frame. Also the display aspect ratio set by
 +this filter may be changed by later filters in the filterchain,
 +e.g. in case of scaling or if another "setdar" or a "setsar" filter is
 +applied.
 +
 +The @code{setsar} filter sets the Sample (aka Pixel) Aspect Ratio for
 +the filter output video.
 +
 +Note that as a consequence of the application of this filter, the
 +output display aspect ratio will change according to the equation
 +above.
  
 -Keep in mind that this filter does not modify the pixel dimensions of
 -the video frame. Also the display aspect ratio set by this filter may
 -be changed by later filters in the filterchain, e.g. in case of
 -scaling or if another "setdar" or a "setsar" filter is applied.
 +Keep in mind that the sample aspect ratio set by the @code{setsar}
 +filter may be changed by later filters in the filterchain, e.g. if
 +another "setsar" or a "setdar" filter is applied.
  
 -The filter accepts a parameter string which represents the wanted
 -display aspect ratio.
 -The parameter can be a floating point number string, or an expression
 -of the form @var{num}:@var{den}, where @var{num} and @var{den} are the
 -numerator and denominator of the aspect ratio.
 -If the parameter is not specified, it is assumed the value "0:1".
 +The @code{setdar} and @code{setsar} filters accept a parameter string
 +which represents the wanted aspect ratio.  The parameter can
 +be a floating point number string, an expression, or a string of the form
 +@var{num}:@var{den}, where @var{num} and @var{den} are the numerator
 +and denominator of the aspect ratio. If the parameter is not
 +specified, it is assumed the value "0:1".
  
  For example to change the display aspect ratio to 16:9, specify:
  @example
  setdar=16:9
 -# the above is equivalent to
 +@end example
 +
 +The example above is equivalent to:
 +@example
  setdar=1.77777
  @end example
  
 -See also the @ref{setsar} filter documentation.
 +To change the sample aspect ratio to 10:11, specify:
 +@example
 +setsar=10:11
 +@end example
 +
 +@section setfield
 +
 +Force field for the output video frame.
 +
 +The @code{setfield} filter marks the interlace type field for the
 +output frames. It does not change the input frame, but only sets the
 +corresponding property, which affects how the frame is treated by
 +following filters (e.g. @code{fieldorder} or @code{yadif}).
 +
 +It accepts a string parameter, which can assume the following values:
 +@table @samp
 +@item auto
 +Keep the same field property.
 +
 +@item bff
 +Mark the frame as bottom-field-first.
 +
 +@item tff
 +Mark the frame as top-field-first.
 +
 +@item prog
 +Mark the frame as progressive.
 +@end table
  
  @section setpts
  
@@@ -2589,6 -1487,15 +2589,6 @@@ can contain the following constants
  @item PTS
  the presentation timestamp in input
  
 -@item PI
 -Greek PI
 -
 -@item PHI
 -golden ratio
 -
 -@item E
 -Euler number
 -
  @item N
  the count of the input frame, starting from 0.
  
@@@ -2629,13 -1536,39 +2629,13 @@@ setpts=N/(25*TB
  setpts='1/(25*TB) * (N + 0.05 * sin(N*2*PI/25))'
  @end example
  
 -@anchor{setsar}
 -@section setsar
 -
 -Set the Sample (aka Pixel) Aspect Ratio for the filter output video.
 -
 -Note that as a consequence of the application of this filter, the
 -output display aspect ratio will change according to the following
 -equation:
 -@math{DAR = HORIZONTAL_RESOLUTION / VERTICAL_RESOLUTION * SAR}
 -
 -Keep in mind that the sample aspect ratio set by this filter may be
 -changed by later filters in the filterchain, e.g. if another "setsar"
 -or a "setdar" filter is applied.
 -
 -The filter accepts a parameter string which represents the wanted
 -sample aspect ratio.
 -The parameter can be a floating point number string, or an expression
 -of the form @var{num}:@var{den}, where @var{num} and @var{den} are the
 -numerator and denominator of the aspect ratio.
 -If the parameter is not specified, it is assumed the value "0:1".
 -
 -For example to change the sample aspect ratio to 10:11, specify:
 -@example
 -setsar=10:11
 -@end example
 -
  @section settb
  
  Set the timebase to use for the output frames timestamps.
  It is mainly useful for testing timebase configuration.
  
  It accepts in input an arithmetic expression representing a rational.
 -The expression can contain the constants "PI", "E", "PHI", "AVTB" (the
 +The expression can contain the constants "AVTB" (the
  default timebase), and "intb" (the input timebase).
  
  The default value for the input is "intb".
@@@ -2711,11 -1644,11 +2711,11 @@@ the @code{av_get_picture_type_char} fun
  @file{libavutil/avutil.h}.
  
  @item checksum
 -Adler-32 checksum of all the planes of the input frame
 +Adler-32 checksum (printed in hexadecimal) of all the planes of the input frame
  
  @item plane_checksum
 -Adler-32 checksum of each plane of the input frame, expressed in the form
 -"[@var{c0} @var{c1} @var{c2} @var{c3}]"
 +Adler-32 checksum (printed in hexadecimal) of each plane of the input frame,
 +expressed in the form "[@var{c0} @var{c1} @var{c2} @var{c3}]"
  @end table
  
  @section slicify
@@@ -2724,7 -1657,7 +2724,7 @@@ Pass the images of input video on to ne
  slices.
  
  @example
 -./avconv -i in.avi -vf "slicify=32" out.avi
 +ffmpeg -i in.avi -vf "slicify=32" out.avi
  @end example
  
  The filter accepts the slice height as parameter. If the parameter is
@@@ -2735,113 -1668,17 +2735,121 @@@ faster due to better use of the memory 
  
  @section split
  
- Pass on the input video to two outputs. Both outputs are identical to
- the input video.
+ Split input video into several identical outputs.
+ The filter accepts a single parameter which specifies the number of outputs. If
+ unspecified, it defaults to 2.
+ For example
+ @example
 -avconv -i INPUT -filter_complex split=5 OUTPUT
++ffmpeg -i INPUT -filter_complex split=5 OUTPUT
+ @end example
+ will create 5 copies of the input video.
  
 +For example:
 +@example
 +[in] split [splitout1][splitout2];
 +[splitout1] crop=100:100:0:0    [cropout];
 +[splitout2] pad=200:200:100:100 [padout];
 +@end example
 +
 +will create two separate outputs from the same input, one cropped and
 +one padded.
 +
 +@section super2xsai
 +
 +Scale the input by 2x and smooth using the Super2xSaI (Scale and
 +Interpolate) pixel art scaling algorithm.
 +
 +Useful for enlarging pixel art images without reducing sharpness.
 +
 +@section swapuv
 +Swap U & V plane.
 +
 +@section thumbnail
 +Select the most representative frame in a given sequence of consecutive frames.
 +
 +It accepts as argument the frames batch size to analyze (default @var{N}=100);
 +in a set of @var{N} frames, the filter will pick one of them, and then handle
 +the next batch of @var{N} frames until the end.
 +
 +Since the filter keeps track of the whole frames sequence, a bigger @var{N}
 +value will result in a higher memory usage, so a high value is not recommended.
 +
 +The following example extract one picture each 50 frames:
 +@example
 +thumbnail=50
 +@end example
 +
 +Complete example of a thumbnail creation with @command{ffmpeg}:
 +@example
 +ffmpeg -i in.avi -vf thumbnail,scale=300:200 -frames:v 1 out.png
 +@end example
 +
 +@section tile
 +
 +Tile several successive frames together.
 +
 +It accepts as argument the tile size (i.e. the number of lines and columns)
 +in the form "@var{w}x@var{h}".
 +
 +For example, produce 8×8 PNG tiles of all keyframes (@option{-skip_frame
 +nokey}) in a movie:
 +@example
 +ffmpeg -skip_frame nokey -i file.avi -vf 'scale=128:72,tile=8x8' -an -vsync 0 keyframes%03d.png
 +@end example
 +The @option{-vsync 0} is necessary to prevent @command{ffmpeg} from
 +duplicating each output frame to accomodate the originally detected frame
 +rate.
 +
 +@section tinterlace
 +
 +Perform various types of temporal field interlacing.
 +
 +Frames are counted starting from 1, so the first input frame is
 +considered odd.
 +
 +This filter accepts a single parameter specifying the mode. Available
 +modes are:
 +
 +@table @samp
 +@item merge, 0
 +Move odd frames into the upper field, even into the lower field,
 +generating a double height frame at half framerate.
 +
 +@item drop_odd, 1
 +Only output even frames, odd frames are dropped, generating a frame with
 +unchanged height at half framerate.
 +
 +@item drop_even, 2
 +Only output odd frames, even frames are dropped, generating a frame with
 +unchanged height at half framerate.
 +
 +@item pad, 3
 +Expand each frame to full height, but pad alternate lines with black,
 +generating a frame with double height at the same input framerate.
 +
 +@item interleave_top, 4
 +Interleave the upper field from odd frames with the lower field from
 +even frames, generating a frame with unchanged height at half framerate.
 +
 +@item interleave_bottom, 5
 +Interleave the lower field from odd frames with the upper field from
 +even frames, generating a frame with unchanged height at half framerate.
 +
 +@item interlacex2, 6
 +Double frame rate with unchanged height. Frames are inserted each
 +containing the second temporal field from the previous input frame and
 +the first temporal field from the next input frame. This mode relies on
 +the top_field_first flag. Useful for interlaced video displays with no
 +field synchronisation.
 +@end table
 +
 +Numeric values are deprecated but are accepted for backward
 +compatibility reasons.
 +
 +Default mode is @code{merge}.
 +
  @section transpose
  
  Transpose rows with columns in the input video and optionally flip it.
@@@ -2916,7 -1753,7 +2924,7 @@@ and 13, default value is 5
  Set the chroma matrix vertical size. It can be an integer between 3
  and 13, default value is 5.
  
 -@item luma_amount
 +@item chroma_amount
  Set the chroma effect strength. It can be a float number between -2.0
  and 5.0, default value is 0.0.
  
@@@ -2929,8 -1766,8 +2937,8 @@@ unsharp=7:7:2.
  # Strong blur of both luma and chroma parameters
  unsharp=7:7:-2:7:7:-2
  
 -# Use the default values with @command{avconv}
 -./avconv -i in.avi -vf "unsharp" out.mp4
 +# Use the default values with @command{ffmpeg}
 +ffmpeg -i in.avi -vf "unsharp" out.mp4
  @end example
  
  @section vflip
  Flip the input video vertically.
  
  @example
 -./avconv -i in.avi -vf "vflip" out.avi
 +ffmpeg -i in.avi -vf "vflip" out.avi
  @end example
  
  @section yadif
@@@ -3007,10 -1844,9 +3015,10 @@@ This source is mainly intended for a pr
  through the interface defined in @file{libavfilter/vsrc_buffer.h}.
  
  It accepts the following parameters:
 -@var{width}:@var{height}:@var{pix_fmt_string}:@var{timebase_num}:@var{timebase_den}:@var{sample_aspect_ratio_num}:@var{sample_aspect_ratio.den}
 +@var{width}:@var{height}:@var{pix_fmt_string}:@var{timebase_num}:@var{timebase_den}:@var{sample_aspect_ratio_num}:@var{sample_aspect_ratio.den}:@var{scale_params}
  
 -All the parameters need to be explicitly defined.
 +All the parameters but @var{scale_params} need to be explicitly
 +defined.
  
  Follows the list of the accepted parameters.
  
@@@ -3031,11 -1867,6 +3039,11 @@@ timestamps of the buffered frames
  @item sample_aspect_ratio.num, sample_aspect_ratio.den
  Specify numerator and denominator of the sample aspect ratio assumed
  by the video frames.
 +
 +@item scale_params
 +Specify the optional parameters to be used for the scale filter which
 +is automatically inserted when an input change is detected in the
 +input size or format.
  @end table
  
  For example:
@@@ -3050,124 -1881,9 +3058,124 @@@ Since the pixel format with name "yuv41
  (check the enum PixelFormat definition in @file{libavutil/pixfmt.h}),
  this example corresponds to:
  @example
 -buffer=320:240:6:1:24
 +buffer=320:240:6:1:24:1:1
 +@end example
 +
 +@section cellauto
 +
 +Create a pattern generated by an elementary cellular automaton.
 +
 +The initial state of the cellular automaton can be defined through the
 +@option{filename}, and @option{pattern} options. If such options are
 +not specified an initial state is created randomly.
 +
 +At each new frame a new row in the video is filled with the result of
 +the cellular automaton next generation. The behavior when the whole
 +frame is filled is defined by the @option{scroll} option.
 +
 +This source accepts a list of options in the form of
 +@var{key}=@var{value} pairs separated by ":". A description of the
 +accepted options follows.
 +
 +@table @option
 +@item filename, f
 +Read the initial cellular automaton state, i.e. the starting row, from
 +the specified file.
 +In the file, each non-whitespace character is considered an alive
 +cell, a newline will terminate the row, and further characters in the
 +file will be ignored.
 +
 +@item pattern, p
 +Read the initial cellular automaton state, i.e. the starting row, from
 +the specified string.
 +
 +Each non-whitespace character in the string is considered an alive
 +cell, a newline will terminate the row, and further characters in the
 +string will be ignored.
 +
 +@item rate, r
 +Set the video rate, that is the number of frames generated per second.
 +Default is 25.
 +
 +@item random_fill_ratio, ratio
 +Set the random fill ratio for the initial cellular automaton row. It
 +is a floating point number value ranging from 0 to 1, defaults to
 +1/PHI.
 +
 +This option is ignored when a file or a pattern is specified.
 +
 +@item random_seed, seed
 +Set the seed for filling randomly the initial row, must be an integer
 +included between 0 and UINT32_MAX. If not specified, or if explicitly
 +set to -1, the filter will try to use a good random seed on a best
 +effort basis.
 +
 +@item rule
 +Set the cellular automaton rule, it is a number ranging from 0 to 255.
 +Default value is 110.
 +
 +@item size, s
 +Set the size of the output video.
 +
 +If @option{filename} or @option{pattern} is specified, the size is set
 +by default to the width of the specified initial state row, and the
 +height is set to @var{width} * PHI.
 +
 +If @option{size} is set, it must contain the width of the specified
 +pattern string, and the specified pattern will be centered in the
 +larger row.
 +
 +If a filename or a pattern string is not specified, the size value
 +defaults to "320x518" (used for a randomly generated initial state).
 +
 +@item scroll
 +If set to 1, scroll the output upward when all the rows in the output
 +have been already filled. If set to 0, the new generated row will be
 +written over the top row just after the bottom row is filled.
 +Defaults to 1.
 +
 +@item start_full, full
 +If set to 1, completely fill the output with generated rows before
 +outputting the first frame.
 +This is the default behavior, for disabling set the value to 0.
 +
 +@item stitch
 +If set to 1, stitch the left and right row edges together.
 +This is the default behavior, for disabling set the value to 0.
 +@end table
 +
 +@subsection Examples
 +
 +@itemize
 +@item
 +Read the initial state from @file{pattern}, and specify an output of
 +size 200x400.
 +@example
 +cellauto=f=pattern:s=200x400
 +@end example
 +
 +@item
 +Generate a random initial row with a width of 200 cells, with a fill
 +ratio of 2/3:
 +@example
 +cellauto=ratio=2/3:s=200x200
 +@end example
 +
 +@item
 +Create a pattern generated by rule 18 starting by a single alive cell
 +centered on an initial row with width 100:
 +@example
 +cellauto=p=@@:s=100x400:full=0:rule=18
 +@end example
 +
 +@item
 +Specify a more elaborated initial pattern:
 +@example
 +cellauto=p='@@@@ @@ @@@@':s=100x400:full=0:rule=18
  @end example
  
 +@end itemize
 +
  @section color
  
  Provide an uniformly colored input.
@@@ -3237,13 -1953,6 +3245,13 @@@ Specifies the index of the video strea
  the best suited video stream will be automatically selected. Default
  value is "-1".
  
 +@item loop
 +Specifies how many times to read the video stream in sequence.
 +If the value is less than 1, the stream will be read again and again.
 +Default value is "1".
 +
 +Note that when the movie is looped the source timestamps are not
 +changed, so it will generate non monotonically increasing timestamps.
  @end table
  
  This filter allows to overlay a second video on top of main input of
@@@ -3269,69 -1978,28 +3277,69 @@@ movie=/dev/video0:f=video4linux2, scale
  
  @end example
  
 -@section nullsrc
 +@section mptestsrc
 +
 +Generate various test patterns, as generated by the MPlayer test filter.
 +
 +The size of the generated video is fixed, and is 256x256.
 +This source is useful in particular for testing encoding features.
 +
 +This source accepts an optional sequence of @var{key}=@var{value} pairs,
 +separated by ":". The description of the accepted options follows.
 +
 +@table @option
 +
 +@item rate, r
 +Specify the frame rate of the sourced video, as the number of frames
 +generated per second. It has to be a string in the format
 +@var{frame_rate_num}/@var{frame_rate_den}, an integer number, a float
 +number or a valid video frame rate abbreviation. The default value is
 +"25".
 +
 +@item duration, d
 +Set the video duration of the sourced video. The accepted syntax is:
 +@example
 +[-]HH:MM:SS[.m...]
 +[-]S+[.m...]
 +@end example
 +See also the function @code{av_parse_time()}.
 +
 +If not specified, or the expressed duration is negative, the video is
 +supposed to be generated forever.
 +
 +@item test, t
  
 -Null video source, never return images. It is mainly useful as a
 -template and to be employed in analysis / debugging tools.
 +Set the number or the name of the test to perform. Supported tests are:
 +@table @option
 +@item dc_luma
 +@item dc_chroma
 +@item freq_luma
 +@item freq_chroma
 +@item amp_luma
 +@item amp_chroma
 +@item cbp
 +@item mv
 +@item ring1
 +@item ring2
 +@item all
 +@end table
  
 -It accepts as optional parameter a string of the form
 -@var{width}:@var{height}:@var{timebase}.
 +Default value is "all", which will cycle through the list of all tests.
 +@end table
  
 -@var{width} and @var{height} specify the size of the configured
 -source. The default values of @var{width} and @var{height} are
 -respectively 352 and 288 (corresponding to the CIF size format).
 +For example the following:
 +@example
 +testsrc=t=dc_luma
 +@end example
  
 -@var{timebase} specifies an arithmetic expression representing a
 -timebase. The expression can contain the constants "PI", "E", "PHI",
 -"AVTB" (the default timebase), and defaults to the value "AVTB".
 +will generate a "dc_luma" test pattern.
  
  @section frei0r_src
  
  Provide a frei0r source.
  
  To enable compilation of this filter you need to install the frei0r
 -header and configure Libav with --enable-frei0r.
 +header and configure FFmpeg with @code{--enable-frei0r}.
  
  The source supports the syntax:
  @example
@@@ -3348,143 -2016,12 +3356,143 @@@ section @ref{frei0r} in the descriptio
  
  Some examples follow:
  @example
 -# generate a frei0r partik0l source with size 200x200 and framerate 10
 +# generate a frei0r partik0l source with size 200x200 and frame rate 10
  # which is overlayed on the overlay filter main input
  frei0r_src=200x200:10:partik0l=1234 [overlay]; [in][overlay] overlay
  @end example
  
 -@section rgbtestsrc, testsrc
 +@section life
 +
 +Generate a life pattern.
 +
 +This source is based on a generalization of John Conway's life game.
 +
 +The sourced input represents a life grid, each pixel represents a cell
 +which can be in one of two possible states, alive or dead. Every cell
 +interacts with its eight neighbours, which are the cells that are
 +horizontally, vertically, or diagonally adjacent.
 +
 +At each interaction the grid evolves according to the adopted rule,
 +which specifies the number of neighbor alive cells which will make a
 +cell stay alive or born. The @option{rule} option allows to specify
 +the rule to adopt.
 +
 +This source accepts a list of options in the form of
 +@var{key}=@var{value} pairs separated by ":". A description of the
 +accepted options follows.
 +
 +@table @option
 +@item filename, f
 +Set the file from which to read the initial grid state. In the file,
 +each non-whitespace character is considered an alive cell, and newline
 +is used to delimit the end of each row.
 +
 +If this option is not specified, the initial grid is generated
 +randomly.
 +
 +@item rate, r
 +Set the video rate, that is the number of frames generated per second.
 +Default is 25.
 +
 +@item random_fill_ratio, ratio
 +Set the random fill ratio for the initial random grid. It is a
 +floating point number value ranging from 0 to 1, defaults to 1/PHI.
 +It is ignored when a file is specified.
 +
 +@item random_seed, seed
 +Set the seed for filling the initial random grid, must be an integer
 +included between 0 and UINT32_MAX. If not specified, or if explicitly
 +set to -1, the filter will try to use a good random seed on a best
 +effort basis.
 +
 +@item rule
 +Set the life rule.
 +
 +A rule can be specified with a code of the kind "S@var{NS}/B@var{NB}",
 +where @var{NS} and @var{NB} are sequences of numbers in the range 0-8,
 +@var{NS} specifies the number of alive neighbor cells which make a
 +live cell stay alive, and @var{NB} the number of alive neighbor cells
 +which make a dead cell to become alive (i.e. to "born").
 +"s" and "b" can be used in place of "S" and "B", respectively.
 +
 +Alternatively a rule can be specified by an 18-bits integer. The 9
 +high order bits are used to encode the next cell state if it is alive
 +for each number of neighbor alive cells, the low order bits specify
 +the rule for "borning" new cells. Higher order bits encode for an
 +higher number of neighbor cells.
 +For example the number 6153 = @code{(12<<9)+9} specifies a stay alive
 +rule of 12 and a born rule of 9, which corresponds to "S23/B03".
 +
 +Default value is "S23/B3", which is the original Conway's game of life
 +rule, and will keep a cell alive if it has 2 or 3 neighbor alive
 +cells, and will born a new cell if there are three alive cells around
 +a dead cell.
 +
 +@item size, s
 +Set the size of the output video.
 +
 +If @option{filename} is specified, the size is set by default to the
 +same size of the input file. If @option{size} is set, it must contain
 +the size specified in the input file, and the initial grid defined in
 +that file is centered in the larger resulting area.
 +
 +If a filename is not specified, the size value defaults to "320x240"
 +(used for a randomly generated initial grid).
 +
 +@item stitch
 +If set to 1, stitch the left and right grid edges together, and the
 +top and bottom edges also. Defaults to 1.
 +
 +@item mold
 +Set cell mold speed. If set, a dead cell will go from @option{death_color} to
 +@option{mold_color} with a step of @option{mold}. @option{mold} can have a
 +value from 0 to 255.
 +
 +@item life_color
 +Set the color of living (or new born) cells.
 +
 +@item death_color
 +Set the color of dead cells. If @option{mold} is set, this is the first color
 +used to represent a dead cell.
 +
 +@item mold_color
 +Set mold color, for definitely dead and moldy cells.
 +@end table
 +
 +@subsection Examples
 +
 +@itemize
 +@item
 +Read a grid from @file{pattern}, and center it on a grid of size
 +300x300 pixels:
 +@example
 +life=f=pattern:s=300x300
 +@end example
 +
 +@item
 +Generate a random grid of size 200x200, with a fill ratio of 2/3:
 +@example
 +life=ratio=2/3:s=200x200
 +@end example
 +
 +@item
 +Specify a custom rule for evolving a randomly generated grid:
 +@example
 +life=rule=S14/B34
 +@end example
 +
 +@item
 +Full example with slow death effect (mold) using @command{ffplay}:
 +@example
 +ffplay -f lavfi life=s=300x200:mold=10:r=60:ratio=0.1:death_color=#C83232:life_color=#00ff00,scale=1200:800:flags=16
 +@end example
 +@end itemize
 +
 +@section nullsrc, rgbtestsrc, testsrc
 +
 +The @code{nullsrc} source returns unprocessed video frames. It is
 +mainly useful to be employed in analysis / debugging tools, or as the
 +source for filters which ignore the input data.
  
  The @code{rgbtestsrc} source generates an RGB test pattern useful for
  detecting RGB vs BGR issues. You should see a red, green and blue
@@@ -3494,7 -2031,7 +3502,7 @@@ The @code{testsrc} source generates a t
  color pattern, a scrolling gradient and a timestamp. This is mainly
  intended for testing purposes.
  
 -Both sources accept an optional sequence of @var{key}=@var{value} pairs,
 +These sources accept an optional sequence of @var{key}=@var{value} pairs,
  separated by ":". The description of the accepted options follows.
  
  @table @option
@@@ -3514,7 -2051,7 +3522,7 @@@ number or a valid video frame rate abbr
  @item sar
  Set the sample aspect ratio of the sourced video.
  
 -@item duration
 +@item duration, d
  Set the video duration of the sourced video. The accepted syntax is:
  @example
  [-]HH[:MM[:SS[.m...]]]
@@@ -3524,14 -2061,6 +3532,14 @@@ See also the function @code{av_parse_ti
  
  If not specified, or the expressed duration is negative, the video is
  supposed to be generated forever.
 +
 +@item decimals, n
 +Set the number of decimals to show in the timestamp, only used in the
 +@code{testsrc} source.
 +
 +The displayed timestamp value will correspond to the original
 +timestamp value multiplied by the power of 10 of the specified
 +value. Default value is 0.
  @end table
  
  For example the following:
@@@ -3540,14 -2069,7 +3548,14 @@@ testsrc=duration=5.3:size=qcif:rate=1
  @end example
  
  will generate a video with a duration of 5.3 seconds, with size
 -176x144 and a framerate of 10 frames per second.
 +176x144 and a frame rate of 10 frames per second.
 +
 +If the input content is to be ignored, @code{nullsrc} can be used. The
 +following command generates noise in the luminance plane by employing
 +the @code{mp=geq} filter:
 +@example
 +nullsrc=s=256x256, mp=geq=random(1)*255:128:128
 +@end example
  
  @c man end VIDEO SOURCES
  
  
  Below is a description of the currently available video sinks.
  
 +@section buffersink
 +
 +Buffer video frames, and make them available to the end of the filter
 +graph.
 +
 +This sink is mainly intended for a programmatic use, in particular
 +through the interface defined in @file{libavfilter/buffersink.h}.
 +
 +It does not require a string parameter in input, but you need to
 +specify a pointer to a list of supported pixel formats terminated by
 +-1 in the opaque parameter provided to @code{avfilter_init_filter}
 +when initializing this sink.
 +
  @section nullsink
  
  Null video sink, do absolutely nothing with the input video. It is
diff --combined ffmpeg.c
+++ b/ffmpeg.c
@@@ -1,28 -1,24 +1,28 @@@
  /*
 - * avconv main
 - * Copyright (c) 2000-2011 The libav developers.
 + * Copyright (c) 2000-2003 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
   */
  
 +/**
 + * @file
 + * multimedia converter based on the FFmpeg libraries
 + */
 +
  #include "config.h"
  #include <ctype.h>
  #include <string.h>
@@@ -35,6 -31,7 +35,6 @@@
  #include "libavformat/avformat.h"
  #include "libavdevice/avdevice.h"
  #include "libswscale/swscale.h"
 -#include "libavresample/avresample.h"
  #include "libavutil/opt.h"
  #include "libavutil/audioconvert.h"
  #include "libavutil/parseutils.h"
  #include "libavutil/avstring.h"
  #include "libavutil/libm.h"
  #include "libavutil/imgutils.h"
 +#include "libavutil/timestamp.h"
  #include "libavformat/os_support.h"
 +#include "libswresample/swresample.h"
  
 +#include "libavformat/ffm.h" // not public API
 +
 +# include "libavfilter/avcodec.h"
  # include "libavfilter/avfilter.h"
  # include "libavfilter/avfiltergraph.h"
 +# include "libavfilter/buffersink.h"
  # include "libavfilter/buffersrc.h"
 -# include "libavfilter/vsrc_buffer.h"
  
  #if HAVE_SYS_RESOURCE_H
  #include <sys/types.h>
  #include <sys/select.h>
  #endif
  
 +#if HAVE_TERMIOS_H
 +#include <fcntl.h>
 +#include <sys/ioctl.h>
 +#include <sys/time.h>
 +#include <termios.h>
 +#elif HAVE_KBHIT
 +#include <conio.h>
 +#endif
  #include <time.h>
  
  #include "cmdutils.h"
@@@ -94,9 -78,8 +94,9 @@@
  #define VSYNC_PASSTHROUGH 0
  #define VSYNC_CFR         1
  #define VSYNC_VFR         2
 +#define VSYNC_DROP        0xff
  
 -const char program_name[] = "avconv";
 +const char program_name[] = "ffmpeg";
  const int program_birth_year = 2000;
  
  /* select an input stream for an output stream */
@@@ -109,40 -92,34 +109,40 @@@ typedef struct StreamMap 
      char *linklabel;       /** name of an output link, for mapping lavfi outputs */
  } StreamMap;
  
 -/**
 - * select an input file for an output file
 - */
 -typedef struct MetadataMap {
 -    int  file;      ///< file index
 -    char type;      ///< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
 -    int  index;     ///< stream/chapter/program number
 -} MetadataMap;
 +typedef struct {
 +    int  file_idx,  stream_idx,  channel_idx; // input
 +    int ofile_idx, ostream_idx;               // output
 +} AudioChannelMap;
  
  static const OptionDef options[];
  
 +#define MAX_STREAMS 1024    /* arbitrary sanity check value */
 +
 +static int frame_bits_per_raw_sample = 0;
  static int video_discard = 0;
  static int same_quant = 0;
  static int do_deinterlace = 0;
  static int intra_dc_precision = 8;
  static int qp_hist = 0;
 +static int intra_only = 0;
 +static const char *video_codec_name    = NULL;
 +static const char *audio_codec_name    = NULL;
 +static const char *subtitle_codec_name = NULL;
  
  static int file_overwrite = 0;
 +static int no_file_overwrite = 0;
  static int do_benchmark = 0;
 +static int do_benchmark_all = 0;
  static int do_hex_dump = 0;
  static int do_pkt_dump = 0;
 +static int do_psnr = 0;
  static int do_pass = 0;
 -static char *pass_logfilename_prefix = NULL;
 +static const char *pass_logfilename_prefix;
  static int video_sync_method = VSYNC_AUTO;
  static int audio_sync_method = 0;
  static float audio_drift_threshold = 0.1;
  static int copy_ts = 0;
 -static int copy_tb = 1;
 +static int copy_tb = -1;
  static int opt_shortest = 0;
  static char *vstats_filename;
  static FILE *vstats_file;
@@@ -151,8 -128,6 +151,8 @@@ static int audio_volume = 256
  
  static int exit_on_error = 0;
  static int using_stdin = 0;
 +static int run_as_daemon  = 0;
 +static volatile int received_nb_signals = 0;
  static int64_t video_size = 0;
  static int64_t audio_size = 0;
  static int64_t extra_size = 0;
@@@ -161,18 -136,15 +161,18 @@@ static int nb_frames_drop = 0
  static int input_sync;
  
  static float dts_delta_threshold = 10;
 +static float dts_error_threshold = 3600*30;
  
  static int print_stats = 1;
 +static int debug_ts = 0;
 +static int current_time;
  
  static uint8_t *audio_buf;
  static unsigned int allocated_audio_buf_size;
  static uint8_t *async_buf;
  static unsigned int allocated_async_buf_size;
  
 -#define DEFAULT_PASS_LOGFILENAME_PREFIX "av2pass"
 +#define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
  
  typedef struct InputFilter {
      AVFilterContext    *filter;
@@@ -227,13 -199,10 +227,13 @@@ typedef struct InputStream 
       * several frames in a packet) of the next frame in current packet */
      int64_t       next_dts;
      /* dts of the last packet read for this stream */
 -    int64_t       last_dts;
 -    PtsCorrectionContext pts_ctx;
 +    int64_t       dts;
 +
 +    int64_t       next_pts;  ///< synthetic pts for the next decode frame
 +    int64_t       pts;       ///< current pts of the decoded frame
      double ts_scale;
      int is_start;            /* is 1 at the start and after a discontinuity */
 +    int saw_first_ts;
      int showed_multi_packet_warning;
      AVDictionary *opts;
  
  
      /* a pool of free buffers for decoded data */
      FrameBuffer *buffer_pool;
 +    int dr1;
  
      /* decoded data from this stream goes into all those filters
       * currently video only */
  typedef struct InputFile {
      AVFormatContext *ctx;
      int eof_reached;      /* true if eof reached */
 -    int ist_index;        /* index of first stream in ist_table */
 +    int ist_index;        /* index of first stream in input_streams */
      int buffer_size;      /* current total buffer size */
      int64_t ts_offset;
 -    int nb_streams;       /* number of stream that avconv is aware of; may be different
 +    int nb_streams;       /* number of stream that ffmpeg is aware of; may be different
                               from ctx.nb_streams if new streams appear during av_read_frame() */
      int rate_emu;
  } InputFile;
@@@ -271,8 -239,12 +271,8 @@@ typedef struct OutputStream 
      int frame_number;
      /* input pts and corresponding output pts
         for A/V sync */
 -    // double sync_ipts;        /* dts from the AVPacket of the demuxer in second units */
      struct InputStream *sync_ist; /* input stream to sync against */
      int64_t sync_opts;       /* output frame counter, could be changed to some true timestamp */ // FIXME look at frame_number
 -    /* pts of the first frame encoded for this stream, used for limiting
 -     * recording time */
 -    int64_t first_pts;
      AVBitStreamFilterContext *bitstream_filters;
      AVCodec *enc;
      int64_t max_frames;
  
      /* audio only */
      int audio_resample;
 -    AVAudioResampleContext *avr;
 +    int audio_channels_map[SWR_CH_MAX];  ///< list of the channels id to pick from the source stream
 +    int audio_channels_mapped;           ///< number of channels in audio_channels_map
      int resample_sample_fmt;
      int resample_channels;
      uint64_t resample_channel_layout;
      int resample_sample_rate;
 +    float rematrix_volume;
      AVFifoBuffer *fifo;     /* for compression: one audio fifo per codec */
      FILE *logfile;
  
 +    SwrContext *swr;
 +
      OutputFilter *filter;
      char *avfilter;
  
      int64_t sws_flags;
 +    int64_t swr_dither_method;
 +    double swr_dither_scale;
      AVDictionary *opts;
      int is_past_recording_time;
      int stream_copy;
  } OutputStream;
  
  
 +#if HAVE_TERMIOS_H
 +
 +/* init terminal so that we can grab keys */
 +static struct termios oldtty;
 +static int restore_tty;
 +#endif
 +
  typedef struct OutputFile {
      AVFormatContext *ctx;
      AVDictionary *opts;
      int ost_index;       /* index of the first stream in output_streams */
      int64_t recording_time; /* desired length of the resulting file in microseconds */
      int64_t start_time;     /* start time in microseconds */
 -    uint64_t limit_filesize;
 +    uint64_t limit_filesize; /* filesize limit expressed in bytes */
  } OutputFile;
  
  static InputStream **input_streams = NULL;
@@@ -362,8 -321,6 +362,8 @@@ typedef struct OptionsContext 
      int        nb_audio_channels;
      SpecifierOpt *audio_sample_rate;
      int        nb_audio_sample_rate;
 +    SpecifierOpt *rematrix_volume;
 +    int        nb_rematrix_volume;
      SpecifierOpt *frame_rates;
      int        nb_frame_rates;
      SpecifierOpt *frame_sizes;
      /* output options */
      StreamMap *stream_maps;
      int     nb_stream_maps;
 -    /* first item specifies output metadata, second is input */
 -    MetadataMap (*meta_data_maps)[2];
 -    int nb_meta_data_maps;
 +    AudioChannelMap *audio_channel_maps; ///< one info entry per -map_channel
 +    int           nb_audio_channel_maps; ///< number of (valid) -map_channel settings
      int metadata_global_manual;
      int metadata_streams_manual;
      int metadata_chapters_manual;
      }\
  }
  
 -static void reset_options(OptionsContext *o)
 +static int64_t getutime(void)
 +{
 +#if HAVE_GETRUSAGE
 +    struct rusage rusage;
 +
 +    getrusage(RUSAGE_SELF, &rusage);
 +    return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
 +#elif HAVE_GETPROCESSTIMES
 +    HANDLE proc;
 +    FILETIME c, e, k, u;
 +    proc = GetCurrentProcess();
 +    GetProcessTimes(proc, &c, &e, &k, &u);
 +    return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
 +#else
 +    return av_gettime();
 +#endif
 +}
 +
 +static void update_benchmark(const char *fmt, ...)
 +{
 +    if (do_benchmark_all) {
 +        int64_t t = getutime();
 +        va_list va;
 +        char buf[1024];
 +
 +        if (fmt) {
 +            va_start(va, fmt);
 +            vsnprintf(buf, sizeof(buf), fmt, va);
 +            va_end(va);
 +            printf("bench: %8"PRIu64" %s \n", t - current_time, buf);
 +        }
 +        current_time = t;
 +    }
 +}
 +
 +static 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));
  
 +    if(is_input) o->recording_time = bak.recording_time;
 +    else         o->recording_time = INT64_MAX;
      o->mux_max_delay  = 0.7;
 -    o->recording_time = INT64_MAX;
      o->limit_filesize = UINT64_MAX;
      o->chapters_input_file = INT_MAX;
  
@@@ -545,13 -466,12 +545,13 @@@ static int alloc_buffer(InputStream *is
      if (!buf)
          return AVERROR(ENOMEM);
  
 +    avcodec_align_dimensions(s, &w, &h);
 +
      if (!(s->flags & CODEC_FLAG_EMU_EDGE)) {
          w += 2*edge;
          h += 2*edge;
      }
  
 -    avcodec_align_dimensions(s, &w, &h);
      if ((ret = av_image_alloc(buf->base, buf->linesize, w, h,
                                s->pix_fmt, 32)) < 0) {
          av_freep(&buf);
      for (i = 0; i < FF_ARRAY_ELEMS(buf->data); i++) {
          const int h_shift = i==0 ? 0 : h_chroma_shift;
          const int v_shift = i==0 ? 0 : v_chroma_shift;
 -        if (s->flags & CODEC_FLAG_EMU_EDGE)
 +        if ((s->flags & CODEC_FLAG_EMU_EDGE) || !buf->linesize[1] || !buf->base[i])
              buf->data[i] = buf->base[i];
          else
              buf->data[i] = buf->base[i] +
@@@ -597,12 -517,9 +597,12 @@@ static void free_buffer_pool(InputStrea
  
  static void unref_buffer(InputStream *ist, FrameBuffer *buf)
  {
 -    av_assert0(buf->refcount);
 +    av_assert0(buf->refcount > 0);
      buf->refcount--;
      if (!buf->refcount) {
 +        FrameBuffer *tmp;
 +        for(tmp= ist->buffer_pool; tmp; tmp= tmp->next)
 +            av_assert1(tmp != buf);
          buf->next = ist->buffer_pool;
          ist->buffer_pool = buf;
      }
@@@ -614,9 -531,6 +614,9 @@@ static int codec_get_buffer(AVCodecCont
      FrameBuffer *buf;
      int ret, i;
  
 +    if(av_image_check_size(s->width, s->height, 0, s) || s->pix_fmt<0)
 +        return -1;
 +
      if (!ist->buffer_pool && (ret = alloc_buffer(ist, s, &ist->buffer_pool)) < 0)
          return ret;
  
          if ((ret = alloc_buffer(ist, s, &buf)) < 0)
              return ret;
      }
 +    av_assert0(!buf->refcount);
      buf->refcount++;
  
      frame->opaque        = buf;
@@@ -656,9 -569,6 +656,9 @@@ static void codec_release_buffer(AVCode
      FrameBuffer *buf = frame->opaque;
      int i;
  
 +    if(frame->type!=FF_BUFFER_TYPE_USER)
 +        return avcodec_default_release_buffer(s, frame);
 +
      for (i = 0; i < FF_ARRAY_ELEMS(frame->data); i++)
          frame->data[i] = NULL;
  
@@@ -672,54 -582,14 +672,54 @@@ static void filter_release_buffer(AVFil
      unref_buffer(buf->ist, buf);
  }
  
 +static enum PixelFormat choose_pixel_fmt(AVStream *st, AVCodec *codec, enum PixelFormat target)
 +{
 +    if (codec && codec->pix_fmts) {
 +        const enum PixelFormat *p = codec->pix_fmts;
 +        int has_alpha= av_pix_fmt_descriptors[target].nb_components % 2 == 0;
 +        enum PixelFormat best= PIX_FMT_NONE;
 +        if (st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) {
 +            if (st->codec->codec_id == CODEC_ID_MJPEG) {
 +                p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE };
 +            } else if (st->codec->codec_id == CODEC_ID_LJPEG) {
 +                p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUVJ444P, PIX_FMT_YUV420P,
 +                                                 PIX_FMT_YUV422P, PIX_FMT_YUV444P, PIX_FMT_BGRA, PIX_FMT_NONE };
 +            }
 +        }
 +        for (; *p != PIX_FMT_NONE; p++) {
 +            best= avcodec_find_best_pix_fmt2(best, *p, target, has_alpha, NULL);
 +            if (*p == target)
 +                break;
 +        }
 +        if (*p == PIX_FMT_NONE) {
 +            if (target != PIX_FMT_NONE)
 +                av_log(NULL, AV_LOG_WARNING,
 +                       "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
 +                       av_pix_fmt_descriptors[target].name,
 +                       codec->name,
 +                       av_pix_fmt_descriptors[best].name);
 +            return best;
 +        }
 +    }
 +    return target;
 +}
 +
  static const enum PixelFormat *choose_pixel_fmts(OutputStream *ost)
  {
      if (ost->st->codec->pix_fmt != PIX_FMT_NONE) {
 -        ost->pix_fmts[0] = ost->st->codec->pix_fmt;
 +        ost->pix_fmts[0] = choose_pixel_fmt(ost->st, ost->enc, ost->st->codec->pix_fmt);
          return ost->pix_fmts;
 -    } else if (ost->enc->pix_fmts)
 +    } else if (ost->enc->pix_fmts) {
 +        if (ost->st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) {
 +            if (ost->st->codec->codec_id == CODEC_ID_MJPEG) {
 +                return (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE };
 +            } else if (ost->st->codec->codec_id == CODEC_ID_LJPEG) {
 +                return (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUVJ444P, PIX_FMT_YUV420P,
 +                                                    PIX_FMT_YUV422P, PIX_FMT_YUV444P, PIX_FMT_BGRA, PIX_FMT_NONE };
 +            }
 +        }
          return ost->enc->pix_fmts;
 -    else
 +    else
          return NULL;
  }
  
@@@ -728,44 -598,31 +728,43 @@@ static int configure_video_filters(Filt
      InputStream  *ist = fg->inputs[0]->ist;
      OutputStream *ost = fg->outputs[0]->ost;
      AVFilterContext *last_filter, *filter;
-     /** filter graph containing all filters including input & output */
      AVCodecContext *codec = ost->st->codec;
 -    SinkContext sink_ctx = { .pix_fmts = choose_pixel_fmts(ost) };
 +    enum PixelFormat *pix_fmts = choose_pixel_fmts(ost);
 +    AVBufferSinkParams *buffersink_params = av_buffersink_params_alloc();
      AVRational sample_aspect_ratio;
      char args[255];
      int ret;
  
      avfilter_graph_free(&fg->graph);
      fg->graph = avfilter_graph_alloc();
 +    if (!fg->graph)
 +        return AVERROR(ENOMEM);
  
      if (ist->st->sample_aspect_ratio.num) {
          sample_aspect_ratio = ist->st->sample_aspect_ratio;
      } else
          sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
  
 -    snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
 +    snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d:flags=%d", ist->st->codec->width,
               ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
 -             sample_aspect_ratio.num, sample_aspect_ratio.den);
 +             sample_aspect_ratio.num, sample_aspect_ratio.den, SWS_BILINEAR + ((ist->st->codec->flags&CODEC_FLAG_BITEXACT) ? SWS_BITEXACT:0));
  
      ret = avfilter_graph_create_filter(&fg->inputs[0]->filter,
                                         avfilter_get_by_name("buffer"),
                                         "src", args, NULL, fg->graph);
      if (ret < 0)
          return ret;
 -    ret = avfilter_graph_create_filter(&fg->outputs[0]->filter, &sink,
 -                                       "out", NULL, &sink_ctx, fg->graph);
 +
 +#if FF_API_OLD_VSINK_API
 +    ret = avfilter_graph_create_filter(&fg->outputs[0]->filter, avfilter_get_by_name("buffersink"),
 +                                       "out", NULL, pix_fmts, fg->graph);
 +#else
 +    buffersink_params->pixel_fmts = pix_fmts;
 +    ret = avfilter_graph_create_filter(&fg->outputs[0]->filter, avfilter_get_by_name("buffersink"),
 +                                       "out", NULL, buffersink_params, fg->graph);
 +#endif
 +    av_freep(&buffersink_params);
 +
      if (ret < 0)
          return ret;
      last_filter = fg->inputs[0]->filter;
          inputs->pad_idx = 0;
          inputs->next    = NULL;
  
 -        if ((ret = avfilter_graph_parse(fg->graph, ost->avfilter, inputs, outputs, NULL)) < 0)
 +        if ((ret = avfilter_graph_parse(fg->graph, ost->avfilter, &inputs, &outputs, NULL)) < 0)
              return ret;
 +        av_freep(&ost->avfilter);
      } else {
          if ((ret = avfilter_link(last_filter, 0, fg->outputs[0]->filter, 0)) < 0)
              return ret;
@@@ -868,7 -724,7 +867,7 @@@ static void init_input_filter(FilterGra
          int file_idx = strtol(in->name, &p, 0);
  
          if (file_idx < 0 || file_idx >= nb_input_files) {
 -            av_log(NULL, AV_LOG_FATAL, "Invalid file index %d in filtegraph description %s.\n",
 +            av_log(NULL, AV_LOG_FATAL, "Invalid file index %d in filtergraph description %s.\n",
                     file_idx, fg->graph_desc);
              exit_program(1);
          }
  
  static int configure_output_filter(FilterGraph *fg, OutputFilter *ofilter, AVFilterInOut *out)
  {
 -    SinkContext  sink_ctx;
      AVCodecContext *codec = ofilter->ost->st->codec;
      AVFilterContext *last_filter = out->filter_ctx;
      int pad_idx = out->pad_idx;
      int ret;
 +    enum PixelFormat *pix_fmts = choose_pixel_fmts(ofilter->ost);
 +    AVBufferSinkParams *buffersink_params = av_buffersink_params_alloc();
  
 -    sink_ctx.pix_fmts = choose_pixel_fmts(ofilter->ost);
 +#if FF_API_OLD_VSINK_API
 +    ret = avfilter_graph_create_filter(&ofilter->filter, avfilter_get_by_name("buffersink"),
 +                                       "out", NULL, pix_fmts, fg->graph);
 +#else
 +    buffersink_params->pixel_fmts = pix_fmts;
 +    ret = avfilter_graph_create_filter(&ofilter->filter, avfilter_get_by_name("buffersink"),
 +                                       "out", NULL, buffersink_params, fg->graph);
 +#endif
 +    av_freep(&buffersink_params);
  
 -    ret = avfilter_graph_create_filter(&ofilter->filter, &sink,
 -                                       "out", NULL, &sink_ctx, fg->graph);
      if (ret < 0)
          return ret;
  
@@@ -1050,51 -899,22 +1049,51 @@@ static int ist_in_filtergraph(FilterGra
  
  static void term_exit(void)
  {
 -    av_log(NULL, AV_LOG_QUIET, "");
 +    av_log(NULL, AV_LOG_QUIET, "%s", "");
 +#if HAVE_TERMIOS_H
 +    if(restore_tty)
 +        tcsetattr (0, TCSANOW, &oldtty);
 +#endif
  }
  
  static volatile int received_sigterm = 0;
 -static volatile int received_nb_signals = 0;
  
 -static void
 -sigterm_handler(int sig)
 +static void sigterm_handler(int sig)
  {
      received_sigterm = sig;
      received_nb_signals++;
      term_exit();
 +    if(received_nb_signals > 3)
 +        exit(123);
  }
  
  static void term_init(void)
  {
 +#if HAVE_TERMIOS_H
 +    if(!run_as_daemon){
 +        struct termios tty;
 +
 +        if (tcgetattr (0, &tty) == 0) {
 +            oldtty = tty;
 +            restore_tty = 1;
 +            atexit(term_exit);
 +
 +            tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
 +                             |INLCR|IGNCR|ICRNL|IXON);
 +            tty.c_oflag |= OPOST;
 +            tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
 +            tty.c_cflag &= ~(CSIZE|PARENB);
 +            tty.c_cflag |= CS8;
 +            tty.c_cc[VMIN] = 1;
 +            tty.c_cc[VTIME] = 0;
 +
 +            tcsetattr (0, TCSANOW, &tty);
 +        }
 +        signal(SIGQUIT, sigterm_handler); /* Quit (POSIX).  */
 +    }
 +#endif
 +    avformat_network_deinit();
 +
      signal(SIGINT , sigterm_handler); /* Interrupt (ANSI).    */
      signal(SIGTERM, sigterm_handler); /* Termination (ANSI).  */
  #ifdef SIGXCPU
  #endif
  }
  
 +/* read a key without blocking */
 +static int read_key(void)
 +{
 +    unsigned char ch;
 +#if HAVE_TERMIOS_H
 +    int n = 1;
 +    struct timeval tv;
 +    fd_set rfds;
 +
 +    FD_ZERO(&rfds);
 +    FD_SET(0, &rfds);
 +    tv.tv_sec = 0;
 +    tv.tv_usec = 0;
 +    n = select(1, &rfds, NULL, NULL, &tv);
 +    if (n > 0) {
 +        n = read(0, &ch, 1);
 +        if (n == 1)
 +            return ch;
 +
 +        return n;
 +    }
 +#elif HAVE_KBHIT
 +#    if HAVE_PEEKNAMEDPIPE
 +    static int is_pipe;
 +    static HANDLE input_handle;
 +    DWORD dw, nchars;
 +    if(!input_handle){
 +        input_handle = GetStdHandle(STD_INPUT_HANDLE);
 +        is_pipe = !GetConsoleMode(input_handle, &dw);
 +    }
 +
 +    if (stdin->_cnt > 0) {
 +        read(0, &ch, 1);
 +        return ch;
 +    }
 +    if (is_pipe) {
 +        /* When running under a GUI, you will end here. */
 +        if (!PeekNamedPipe(input_handle, NULL, 0, NULL, &nchars, NULL))
 +            return -1;
 +        //Read it
 +        if(nchars != 0) {
 +            read(0, &ch, 1);
 +            return ch;
 +        }else{
 +            return -1;
 +        }
 +    }
 +#    endif
 +    if(kbhit())
 +        return(getch());
 +#endif
 +    return -1;
 +}
 +
  static int decode_interrupt_cb(void *ctx)
  {
      return received_nb_signals > 1;
  
  static const AVIOInterruptCB int_cb = { decode_interrupt_cb, NULL };
  
 -void exit_program(int ret)
 +void av_noreturn exit_program(int ret)
  {
      int i, j;
  
                  av_freep(&frame->extended_data);
              av_freep(&frame);
          }
 -
 -        av_freep(&output_streams[i]->avfilter);
          av_freep(&output_streams[i]->filtered_frame);
          av_freep(&output_streams[i]);
      }
      av_freep(&output_files);
  
      uninit_opts();
 -    av_free(audio_buf);
 +    av_freep(&audio_buf);
      allocated_audio_buf_size = 0;
 -    av_free(async_buf);
 +    av_freep(&async_buf);
      allocated_async_buf_size = 0;
  
      avfilter_uninit();
          exit (255);
      }
  
 -    exit(ret);
 +    exit(ret); /* not all OS-es handle main() return value */
  }
  
  static void assert_avoptions(AVDictionary *m)
@@@ -1280,9 -1048,6 +1279,9 @@@ static void choose_sample_fmt(AVStream 
                  break;
          }
          if (*p == -1) {
 +            if((codec->capabilities & CODEC_CAP_LOSSLESS) && av_get_sample_fmt_name(st->codec->sample_fmt) > av_get_sample_fmt_name(codec->sample_fmts[0]))
 +                av_log(NULL, AV_LOG_ERROR, "Conversion will not be lossless.\n");
 +            if(av_get_sample_fmt_name(st->codec->sample_fmt))
              av_log(NULL, AV_LOG_WARNING,
                     "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
                     av_get_sample_fmt_name(st->codec->sample_fmt),
      }
  }
  
 -/**
 - * Update the requested input sample format based on the output sample format.
 - * This is currently only used to request float output from decoders which
 - * support multiple sample formats, one of which is AV_SAMPLE_FMT_FLT.
 - * Ideally this will be removed in the future when decoders do not do format
 - * conversion and only output in their native format.
 - */
 -static void update_sample_fmt(AVCodecContext *dec, AVCodec *dec_codec,
 -                              AVCodecContext *enc)
 -{
 -    /* if sample formats match or a decoder sample format has already been
 -       requested, just return */
 -    if (enc->sample_fmt == dec->sample_fmt ||
 -        dec->request_sample_fmt > AV_SAMPLE_FMT_NONE)
 -        return;
 -
 -    /* if decoder supports more than one output format */
 -    if (dec_codec && dec_codec->sample_fmts &&
 -        dec_codec->sample_fmts[0] != AV_SAMPLE_FMT_NONE &&
 -        dec_codec->sample_fmts[1] != AV_SAMPLE_FMT_NONE) {
 -        const enum AVSampleFormat *p;
 -        int min_dec = -1, min_inc = -1;
 -
 -        /* find a matching sample format in the encoder */
 -        for (p = dec_codec->sample_fmts; *p != AV_SAMPLE_FMT_NONE; p++) {
 -            if (*p == enc->sample_fmt) {
 -                dec->request_sample_fmt = *p;
 -                return;
 -            } else if (*p > enc->sample_fmt) {
 -                min_inc = FFMIN(min_inc, *p - enc->sample_fmt);
 -            } else
 -                min_dec = FFMIN(min_dec, enc->sample_fmt - *p);
 -        }
 -
 -        /* if none match, provide the one that matches quality closest */
 -        dec->request_sample_fmt = min_inc > 0 ? enc->sample_fmt + min_inc :
 -                                  enc->sample_fmt - min_dec;
 -    }
 -}
 -
  static void choose_sample_rate(AVStream *st, AVCodec *codec)
  {
      if (codec && codec->supported_samplerates) {
              }
          }
          if (best_dist) {
 -            av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
 +            int i;
 +            const int *sample_rates = codec->supported_samplerates;
 +            av_log(st->codec, AV_LOG_WARNING,
 +                   "Requested sampling rate (%dHz) unsupported, using %dHz instead\n"
 +                   "Available sampling rates for %s:",
 +                   st->codec->sample_rate, best, codec->name);
 +            for (i = 0; sample_rates[i]; i++) {
 +                if (!sample_rates[i + 1]) av_log(st->codec, AV_LOG_WARNING, " and");
 +                else if (i)               av_log(st->codec, AV_LOG_WARNING, ",");
 +                av_log(st->codec, AV_LOG_WARNING, " %d", sample_rates[i]);
 +            }
 +            av_log(st->codec, AV_LOG_WARNING, ".\n");
          }
          st->codec->sample_rate = best;
      }
@@@ -1337,10 -1131,6 +1336,10 @@@ static void write_frame(AVFormatContex
      AVCodecContext          *avctx = ost->st->codec;
      int ret;
  
 +    if ((avctx->codec_type == AVMEDIA_TYPE_VIDEO && video_sync_method == VSYNC_DROP) ||
 +        (avctx->codec_type == AVMEDIA_TYPE_AUDIO && audio_sync_method < 0))
 +        pkt->pts = pkt->dts = AV_NOPTS_VALUE;
 +
      /*
       * Audio encoders may split the packets --  #frames in != #packets out.
       * But there is no reordering, so we can limit the number of output packets
              av_free_packet(pkt);
              new_pkt.destruct = av_destruct_packet;
          } else if (a < 0) {
 -            av_log(NULL, AV_LOG_ERROR, "%s failed for stream %d, codec %s",
 +            av_log(NULL, AV_LOG_ERROR, "Failed to open bitstream filter %s for stream %d with codec %s",
                     bsfc->filter->name, pkt->stream_index,
                     avctx->codec ? avctx->codec->name : "copy");
              print_error("", a);
      }
  }
  
 -static int check_recording_time(OutputStream *ost)
 -{
 -    OutputFile *of = output_files[ost->file_index];
 -
 -    if (of->recording_time != INT64_MAX &&
 -        av_compare_ts(ost->sync_opts - ost->first_pts, ost->st->codec->time_base, of->recording_time,
 -                      AV_TIME_BASE_Q) >= 0) {
 -        ost->is_past_recording_time = 1;
 -        return 0;
 -    }
 -    return 1;
 -}
 -
  static void get_default_channel_layouts(OutputStream *ost, InputStream *ist)
  {
      char layout_name[256];
@@@ -1458,7 -1261,7 +1457,7 @@@ static int encode_audio_frame(AVFormatC
      pkt.data = NULL;
      pkt.size = 0;
  
 -    if (buf) {
 +    if (buf && buf_size) {
          if (!ost->output_frame) {
              ost->output_frame = avcodec_alloc_frame();
              if (!ost->output_frame) {
                               (enc->channels * av_get_bytes_per_sample(enc->sample_fmt));
          if ((ret = avcodec_fill_audio_frame(frame, enc->channels, enc->sample_fmt,
                                              buf, buf_size, 1)) < 0) {
 -            av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
 +            av_log(NULL, AV_LOG_FATAL, "Audio encoding failed (avcodec_fill_audio_frame)\n");
              exit_program(1);
          }
  
 -        if (!check_recording_time(ost))
 -            return 0;
 -
          frame->pts = ost->sync_opts;
          ost->sync_opts += frame->nb_samples;
      }
  
      got_packet = 0;
 +    update_benchmark(NULL);
      if (avcodec_encode_audio2(enc, &pkt, frame, &got_packet) < 0) {
 -        av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
 +        av_log(NULL, AV_LOG_FATAL, "Audio encoding failed (avcodec_encode_audio2)\n");
          exit_program(1);
      }
 +    update_benchmark("encode_audio %d.%d", ost->file_index, ost->index);
 +
 +    ret = pkt.size;
  
      if (got_packet) {
          if (pkt.pts != AV_NOPTS_VALUE)
              pkt.pts      = av_rescale_q(pkt.pts,      enc->time_base, ost->st->time_base);
 -        if (pkt.dts != AV_NOPTS_VALUE)
 +        if (pkt.dts != AV_NOPTS_VALUE) {
 +            int64_t max = ost->st->cur_dts + !(s->oformat->flags & AVFMT_TS_NONSTRICT);
              pkt.dts      = av_rescale_q(pkt.dts,      enc->time_base, ost->st->time_base);
 +            if (ost->st->cur_dts && ost->st->cur_dts != AV_NOPTS_VALUE &&  max > pkt.dts) {
 +                av_log(s, max - pkt.dts > 2 ? AV_LOG_WARNING : AV_LOG_DEBUG, "Audio timestamp %"PRId64" < %"PRId64" invalid, cliping\n", pkt.dts, max);
 +                pkt.pts = pkt.dts = max;
 +            }
 +        }
          if (pkt.duration > 0)
              pkt.duration = av_rescale_q(pkt.duration, enc->time_base, ost->st->time_base);
  
          write_frame(s, &pkt, ost);
  
          audio_size += pkt.size;
 +
 +        av_free_packet(&pkt);
 +    }
 +
 +    if (debug_ts) {
 +        av_log(NULL, AV_LOG_INFO, "encoder -> type:audio "
 +               "pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s\n",
 +               av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &ost->st->time_base),
 +               av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &ost->st->time_base));
      }
  
 -    return pkt.size;
 +    return ret;
  }
  
  static int alloc_audio_output_buf(AVCodecContext *dec, AVCodecContext *enc,
      /* calculate required number of samples to allocate */
      audio_buf_samples = ((int64_t)nb_samples * enc->sample_rate + dec->sample_rate) /
                          dec->sample_rate;
 -    audio_buf_samples = 4 * audio_buf_samples + 16; // safety factors for resampling
 +    audio_buf_samples = 4 * audio_buf_samples + 10000; // safety factors for resampling
      audio_buf_samples = FFMAX(audio_buf_samples, enc->frame_size);
      if (audio_buf_samples > INT_MAX)
          return AVERROR(EINVAL);
@@@ -1555,26 -1342,17 +1554,26 @@@ static void do_audio_out(AVFormatContex
                           InputStream *ist, AVFrame *decoded_frame)
  {
      uint8_t *buftmp;
 +    int64_t size_out;
  
 -    int size_out, frame_bytes, resample_changed, ret;
 +    int frame_bytes, resample_changed, ret;
      AVCodecContext *enc = ost->st->codec;
      AVCodecContext *dec = ist->st->codec;
      int osize = av_get_bytes_per_sample(enc->sample_fmt);
      int isize = av_get_bytes_per_sample(dec->sample_fmt);
 -    uint8_t *buf = decoded_frame->data[0];
 +    uint8_t *buf[AV_NUM_DATA_POINTERS];
      int size     = decoded_frame->nb_samples * dec->channels * isize;
 +    int planes   = av_sample_fmt_is_planar(dec->sample_fmt) ? dec->channels : 1;
 +    int i;
      int out_linesize = 0;
      int buf_linesize = decoded_frame->linesize[0];
  
 +    av_assert0(planes <= AV_NUM_DATA_POINTERS);
 +
 +    for(i=0; i<planes; i++)
 +        buf[i]= decoded_frame->data[i];
 +
 +
      get_default_channel_layouts(ost, ist);
  
      if (alloc_audio_output_buf(dec, enc, decoded_frame->nb_samples, &out_linesize) < 0) {
                         ost->resample_channel_layout != dec->channel_layout ||
                         ost->resample_sample_rate != dec->sample_rate;
  
 -    if ((ost->audio_resample && !ost->avr) || resample_changed) {
 +    if ((ost->audio_resample && !ost->swr) || resample_changed || ost->audio_channels_mapped) {
 +
          if (resample_changed) {
              av_log(NULL, AV_LOG_INFO, "Input stream #%d:%d frame changed from rate:%d fmt:%s ch:%d chl:0x%"PRIx64" to rate:%d fmt:%s ch:%d chl:0x%"PRIx64"\n",
                     ist->file_index, ist->st->index,
              ost->resample_channels    = dec->channels;
              ost->resample_channel_layout = dec->channel_layout;
              ost->resample_sample_rate = dec->sample_rate;
 -            if (ost->avr)
 -                avresample_close(ost->avr);
 +            swr_free(&ost->swr);
          }
          /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
 -        if (audio_sync_method <= 1 &&
 +        if (audio_sync_method <= 1 && !ost->audio_channels_mapped &&
              ost->resample_sample_fmt  == enc->sample_fmt &&
              ost->resample_channels    == enc->channels   &&
              ost->resample_channel_layout == enc->channel_layout &&
              ost->resample_sample_rate == enc->sample_rate) {
 +            //ost->swr = NULL;
              ost->audio_resample = 0;
 -        } else if (ost->audio_resample) {
 -            if (!ost->avr) {
 -                ost->avr = avresample_alloc_context();
 -                if (!ost->avr) {
 -                    av_log(NULL, AV_LOG_FATAL, "Error allocating context for libavresample\n");
 -                    exit_program(1);
 -                }
 +        } else {
 +            ost->swr = swr_alloc_set_opts(ost->swr,
 +                                          enc->channel_layout, enc->sample_fmt, enc->sample_rate,
 +                                          dec->channel_layout, dec->sample_fmt, dec->sample_rate,
 +                                          0, NULL);
 +            av_opt_set_int(ost->swr, "dither_method", ost->swr_dither_method,0);
 +            av_opt_set_double(ost->swr, "dither_scale", ost->swr_dither_scale,0);
 +            if (ost->audio_channels_mapped)
 +                swr_set_channel_mapping(ost->swr, ost->audio_channels_map);
 +            av_opt_set_double(ost->swr, "rmvol", ost->rematrix_volume, 0);
 +            if (ost->audio_channels_mapped) {
 +                av_opt_set_int(ost->swr, "icl", av_get_default_channel_layout(ost->audio_channels_mapped), 0);
 +                av_opt_set_int(ost->swr, "uch", ost->audio_channels_mapped, 0);
              }
 -
 -            av_opt_set_int(ost->avr, "in_channel_layout",  dec->channel_layout, 0);
 -            av_opt_set_int(ost->avr, "in_sample_fmt",      dec->sample_fmt,     0);
 -            av_opt_set_int(ost->avr, "in_sample_rate",     dec->sample_rate,    0);
 -            av_opt_set_int(ost->avr, "out_channel_layout", enc->channel_layout, 0);
 -            av_opt_set_int(ost->avr, "out_sample_fmt",     enc->sample_fmt,     0);
 -            av_opt_set_int(ost->avr, "out_sample_rate",    enc->sample_rate,    0);
 -            if (audio_sync_method > 1)
 -                av_opt_set_int(ost->avr, "force_resampling", 1, 0);
 -
 -            /* if both the input and output formats are s16 or u8, use s16 as
 -               the internal sample format */
 -            if (av_get_bytes_per_sample(dec->sample_fmt) <= 2 &&
 -                av_get_bytes_per_sample(enc->sample_fmt) <= 2) {
 -                av_opt_set_int(ost->avr, "internal_sample_fmt", AV_SAMPLE_FMT_S16P, 0);
 +            if (av_opt_set_int(ost->swr, "ich", dec->channels, 0) < 0) {
 +                av_log(NULL, AV_LOG_FATAL, "Unsupported number of input channels\n");
 +                exit_program(1);
 +            }
 +            if (av_opt_set_int(ost->swr, "och", enc->channels, 0) < 0) {
 +                av_log(NULL, AV_LOG_FATAL, "Unsupported number of output channels\n");
 +                exit_program(1);
 +            }
 +            if(audio_sync_method>1) av_opt_set_int(ost->swr, "flags", SWR_FLAG_RESAMPLE, 0);
 +            if(ost->swr && swr_init(ost->swr) < 0){
 +                av_log(NULL, AV_LOG_FATAL, "swr_init() failed\n");
 +                swr_free(&ost->swr);
              }
  
 -            ret = avresample_open(ost->avr);
 -            if (ret < 0) {
 -                av_log(NULL, AV_LOG_FATAL, "Error opening libavresample\n");
 +            if (!ost->swr) {
 +                av_log(NULL, AV_LOG_FATAL, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
 +                        dec->channels, dec->sample_rate,
 +                        enc->channels, enc->sample_rate);
                  exit_program(1);
              }
          }
      }
  
 +    av_assert0(ost->audio_resample || dec->sample_fmt==enc->sample_fmt);
 +
      if (audio_sync_method > 0) {
 -        double delta = get_sync_ipts(ost, ist->last_dts) * enc->sample_rate - ost->sync_opts -
 +        double delta = get_sync_ipts(ost, ist->pts) * enc->sample_rate - ost->sync_opts -
                         av_fifo_size(ost->fifo) / (enc->channels * osize);
          int idelta = delta * dec->sample_rate / enc->sample_rate;
          int byte_delta = idelta * isize * dec->channels;
                  if (byte_delta < 0) {
                      byte_delta = FFMAX(byte_delta, -size);
                      size += byte_delta;
 -                    buf  -= byte_delta;
 +                    for (i=0; i<planes; i++)
 +                        buf[i]  -= byte_delta/planes;
                      av_log(NULL, AV_LOG_VERBOSE, "discarding %d audio samples\n",
                             -byte_delta / (isize * dec->channels));
                      if (!size)
                      }
                      ist->is_start = 0;
  
 -                    generate_silence(async_buf, dec->sample_fmt, byte_delta);
 -                    memcpy(async_buf + byte_delta, buf, size);
 -                    buf = async_buf;
 +                    for (i=0; i<planes; i++) {
 +                        uint8_t *t = async_buf + i*((byte_delta + size)/planes);
 +                        generate_silence(t, dec->sample_fmt, byte_delta/planes);
 +                        memcpy(t + byte_delta/planes, buf[i], size/planes);
 +                        buf[i] = t;
 +                    }
                      size += byte_delta;
                      buf_linesize = allocated_async_buf_size;
                      av_log(NULL, AV_LOG_VERBOSE, "adding %d audio samples of silence\n", idelta);
                  av_log(NULL, AV_LOG_VERBOSE, "compensating audio timestamp drift:%f compensation:%d in:%d\n",
                         delta, comp, enc->sample_rate);
  //                fprintf(stderr, "drift:%f len:%d opts:%"PRId64" ipts:%"PRId64" fifo:%d\n", delta, -1, ost->sync_opts, (int64_t)(get_sync_ipts(ost) * enc->sample_rate), av_fifo_size(ost->fifo)/(ost->st->codec->channels * 2));
 -                avresample_set_compensation(ost->avr, comp, enc->sample_rate);
 +                swr_set_compensation(ost->swr, comp, enc->sample_rate);
              }
          }
      } else if (audio_sync_method == 0)
 -        ost->sync_opts = lrintf(get_sync_ipts(ost, ist->last_dts) * enc->sample_rate) -
 +        ost->sync_opts = lrintf(get_sync_ipts(ost, ist->pts) * enc->sample_rate) -
                                  av_fifo_size(ost->fifo) / (enc->channels * osize); // FIXME wrong
  
 -    if (ost->audio_resample) {
 +    if (ost->audio_resample || ost->audio_channels_mapped) {
          buftmp = audio_buf;
 -        size_out = avresample_convert(ost->avr, (void **)&buftmp,
 -                                      allocated_audio_buf_size, out_linesize,
 -                                      (void **)&buf, buf_linesize,
 +        size_out = swr_convert(ost->swr, (      uint8_t*[]){buftmp},
 +                                      allocated_audio_buf_size / (enc->channels * osize),
 +                                      buf,
                                        size / (dec->channels * isize));
 +        if (size_out < 0) {
 +            av_log(NULL, AV_LOG_FATAL, "swr_convert failed\n");
 +            exit_program(1);
 +        }
          size_out = size_out * enc->channels * osize;
      } else {
 -        buftmp = buf;
 +        buftmp = buf[0];
          size_out = size;
      }
  
 +    av_assert0(ost->audio_resample || dec->sample_fmt==enc->sample_fmt);
 +
      /* now encode as many frames as possible */
      if (!(enc->codec->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE)) {
          /* output resampled raw samples */
@@@ -1823,6 -1584,8 +1822,6 @@@ static void do_subtitle_out(AVFormatCon
  
      for (i = 0; i < nb; i++) {
          ost->sync_opts = av_rescale_q(pts, ist->st->time_base, enc->time_base);
 -        if (!check_recording_time(ost))
 -            return;
  
          sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
          // start_display_time is required to be 0
      }
  }
  
 -static void do_video_out(AVFormatContext *s,
 -                         OutputStream *ost,
 -                         AVFrame *in_picture,
 -                         int *frame_size, float quality)
 +static double psnr(double d)
 +{
 +    return -10.0 * log(d) / log(10.0);
 +}
 +
 +static void do_video_stats(AVFormatContext *os, OutputStream *ost,
 +                           int frame_size)
 +{
 +    AVCodecContext *enc;
 +    int frame_number;
 +    double ti1, bitrate, avg_bitrate;
 +
 +    /* this is executed just the first time do_video_stats is called */
 +    if (!vstats_file) {
 +        vstats_file = fopen(vstats_filename, "w");
 +        if (!vstats_file) {
 +            perror("fopen");
 +            exit_program(1);
 +        }
 +    }
 +
 +    enc = ost->st->codec;
 +    if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
 +        frame_number = ost->frame_number;
 +        fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality / (float)FF_QP2LAMBDA);
 +        if (enc->flags&CODEC_FLAG_PSNR)
 +            fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0] / (enc->width * enc->height * 255.0 * 255.0)));
 +
 +        fprintf(vstats_file,"f_size= %6d ", frame_size);
 +        /* compute pts value */
 +        ti1 = ost->sync_opts * av_q2d(enc->time_base);
 +        if (ti1 < 0.01)
 +            ti1 = 0.01;
 +
 +        bitrate     = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
 +        avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
 +        fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
 +               (double)video_size / 1024, ti1, bitrate, avg_bitrate);
 +        fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
 +    }
 +}
 +
 +
 +static void do_video_out(AVFormatContext *s, OutputStream *ost,
 +                         AVFrame *in_picture, float quality)
  {
      int nb_frames, i, ret, format_video_sync;
      AVCodecContext *enc;
      double sync_ipts, delta;
 +    double duration = 0;
 +    int frame_size = 0;
 +    InputStream *ist = NULL;
 +
 +    if (ost->source_index >= 0)
 +        ist = input_streams[ost->source_index];
  
      enc = ost->st->codec;
  
 +    if (ist && ist->st->start_time != AV_NOPTS_VALUE && ist->st->first_dts != AV_NOPTS_VALUE) {
 +        duration = FFMAX(av_q2d(ist->st->time_base), av_q2d(ist->st->codec->time_base));
 +        if(ist->st->r_frame_rate.num)
 +            duration= FFMAX(duration, 1/av_q2d(ist->st->r_frame_rate));
 +        if(ist->st->avg_frame_rate.num && 0)
 +            duration= FFMAX(duration, 1/av_q2d(ist->st->avg_frame_rate));
 +
 +        duration /= av_q2d(enc->time_base);
 +    }
 +
      sync_ipts = get_sync_ipts(ost, in_picture->pts) / av_q2d(enc->time_base);
 -    delta = sync_ipts - ost->sync_opts;
 +    delta = sync_ipts - ost->sync_opts + duration;
  
      /* by default, we output a single frame */
      nb_frames = 1;
  
 -    *frame_size = 0;
 -
      format_video_sync = video_sync_method;
      if (format_video_sync == VSYNC_AUTO)
 -        format_video_sync = (s->oformat->flags & AVFMT_NOTIMESTAMPS) ? VSYNC_PASSTHROUGH :
 -                            (s->oformat->flags & AVFMT_VARIABLE_FPS) ? VSYNC_VFR : VSYNC_CFR;
 +        format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? ((s->oformat->flags & AVFMT_NOTIMESTAMPS) ? VSYNC_PASSTHROUGH : VSYNC_VFR) : 1;
  
      switch (format_video_sync) {
      case VSYNC_CFR:
          else if (delta > 0.6)
              ost->sync_opts = lrintf(sync_ipts);
          break;
 +    case VSYNC_DROP:
      case VSYNC_PASSTHROUGH:
          ost->sync_opts = lrintf(sync_ipts);
          break;
          av_log(NULL, AV_LOG_VERBOSE, "*** %d dup!\n", nb_frames - 1);
      }
  
 -    if (!ost->frame_number)
 -        ost->first_pts = ost->sync_opts;
 -
      /* duplicates frame if needed */
      for (i = 0; i < nb_frames; i++) {
          AVPacket pkt;
          pkt.data = NULL;
          pkt.size = 0;
  
 -        if (!check_recording_time(ost))
 -            return;
 -
          if (s->oformat->flags & AVFMT_RAWPICTURE &&
              enc->codec->id == CODEC_ID_RAWVIDEO) {
              /* raw pictures are written as AVPicture structure to
                  big_picture.pict_type = AV_PICTURE_TYPE_I;
                  ost->forced_kf_index++;
              }
 +            update_benchmark(NULL);
              ret = avcodec_encode_video2(enc, &pkt, &big_picture, &got_packet);
 +            update_benchmark("encode_video %d.%d", ost->file_index, ost->index);
              if (ret < 0) {
                  av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
                  exit_program(1);
              }
  
              if (got_packet) {
 +                if (pkt.pts == AV_NOPTS_VALUE && !(enc->codec->capabilities & CODEC_CAP_DELAY))
 +                    pkt.pts = ost->sync_opts;
 +
                  if (pkt.pts != AV_NOPTS_VALUE)
                      pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
                  if (pkt.dts != AV_NOPTS_VALUE)
                      pkt.dts = av_rescale_q(pkt.dts, enc->time_base, ost->st->time_base);
  
 +                if (debug_ts) {
 +                    av_log(NULL, AV_LOG_INFO, "encoder -> type:video "
 +                           "pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s\n",
 +                           av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &ost->st->time_base),
 +                           av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &ost->st->time_base));
 +                }
 +
                  write_frame(s, &pkt, ost);
 -                *frame_size = pkt.size;
 +                frame_size = pkt.size;
                  video_size += pkt.size;
 +                av_free_packet(&pkt);
  
                  /* if two pass, output log */
                  if (ost->logfile && enc->stats_out) {
           */
          ost->frame_number++;
      }
 -}
 -
 -static double psnr(double d)
 -{
 -    return -10.0 * log(d) / log(10.0);
 -}
 -
 -static void do_video_stats(AVFormatContext *os, OutputStream *ost,
 -                           int frame_size)
 -{
 -    AVCodecContext *enc;
 -    int frame_number;
 -    double ti1, bitrate, avg_bitrate;
 -
 -    /* this is executed just the first time do_video_stats is called */
 -    if (!vstats_file) {
 -        vstats_file = fopen(vstats_filename, "w");
 -        if (!vstats_file) {
 -            perror("fopen");
 -            exit_program(1);
 -        }
 -    }
 -
 -    enc = ost->st->codec;
 -    if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
 -        frame_number = ost->frame_number;
 -        fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality / (float)FF_QP2LAMBDA);
 -        if (enc->flags&CODEC_FLAG_PSNR)
 -            fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0] / (enc->width * enc->height * 255.0 * 255.0)));
 -
 -        fprintf(vstats_file,"f_size= %6d ", frame_size);
 -        /* compute pts value */
 -        ti1 = ost->sync_opts * av_q2d(enc->time_base);
 -        if (ti1 < 0.01)
 -            ti1 = 0.01;
 -
 -        bitrate     = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
 -        avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
 -        fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
 -               (double)video_size / 1024, ti1, bitrate, avg_bitrate);
 -        fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
 -    }
 +    if (vstats_filename && frame_size)
 +        do_video_stats(output_files[ost->file_index]->ctx, ost, frame_size);
  }
  
  /* check for new output on any of the filtergraphs */
@@@ -2060,86 -1801,55 +2059,86 @@@ static int poll_filters(void
  {
      AVFilterBufferRef *picref;
      AVFrame *filtered_frame = NULL;
 -    int i, frame_size, ret;
 -
 -    for (i = 0; i < nb_output_streams; i++) {
 -        OutputStream *ost = output_streams[i];
 -        OutputFile    *of = output_files[ost->file_index];
 +    int i, ret, ret_all;
 +    unsigned nb_success, nb_eof;
  
 -        if (!ost->filter || ost->is_past_recording_time)
 -            continue;
 +    while (1) {
 +        /* Reap all buffers present in the buffer sinks */
 +        for (i = 0; i < nb_output_streams; i++) {
 +            OutputStream *ost = output_streams[i];
 +            OutputFile    *of = output_files[ost->file_index];
  
 -        if (!ost->filtered_frame && !(ost->filtered_frame = avcodec_alloc_frame())) {
 -            return AVERROR(ENOMEM);
 -        } else
 -            avcodec_get_frame_defaults(ost->filtered_frame);
 -        filtered_frame = ost->filtered_frame;
 +            if (!ost->filter || ost->is_past_recording_time)
 +                continue;
  
 -        while (avfilter_poll_frame(ost->filter->filter->inputs[0])) {
 -            AVRational ist_pts_tb;
 -            if ((ret = get_filtered_video_frame(ost->filter->filter,
 -                                                filtered_frame, &picref,
 -                                                &ist_pts_tb)) < 0)
 -                return ret;
 -            filtered_frame->pts = av_rescale_q(picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
 +            if (!ost->filtered_frame && !(ost->filtered_frame = avcodec_alloc_frame())) {
 +                return AVERROR(ENOMEM);
 +            } else
 +                avcodec_get_frame_defaults(ost->filtered_frame);
 +            filtered_frame = ost->filtered_frame;
  
 -            if (of->start_time && filtered_frame->pts < of->start_time)
 -                return 0;
 +            while (1) {
 +                AVRational ist_pts_tb = ost->filter->filter->inputs[0]->time_base;
 +                ret = av_buffersink_get_buffer_ref(ost->filter->filter, &picref,
 +                                                   AV_BUFFERSINK_FLAG_NO_REQUEST);
 +                if (ret < 0) {
 +                    if (ret != AVERROR(EAGAIN)) {
 +                        char buf[256];
 +                        av_strerror(ret, buf, sizeof(buf));
 +                        av_log(NULL, AV_LOG_WARNING,
 +                               "Error in av_buffersink_get_buffer_ref(): %s\n", buf);
 +                    }
 +                    break;
 +                }
 +                filtered_frame->pts = av_rescale_q(picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
 +                //if (ost->source_index >= 0)
 +                //    *filtered_frame= *input_streams[ost->source_index]->decoded_frame; //for me_threshold
 +
 +                if (of->start_time && filtered_frame->pts < of->start_time)
 +                    return 0;
 +
 +                switch (ost->filter->filter->inputs[0]->type) {
 +                case AVMEDIA_TYPE_VIDEO:
 +                    avfilter_fill_frame_from_video_buffer_ref(filtered_frame, picref);
 +                    if (!ost->frame_aspect_ratio)
 +                        ost->st->codec->sample_aspect_ratio = picref->video->sample_aspect_ratio;
 +
 +                    do_video_out(of->ctx, ost, filtered_frame,
 +                                 same_quant ? ost->last_quality :
 +                                              ost->st->codec->global_quality);
 +                    break;
 +                default:
 +                    // TODO support audio/subtitle filters
 +                    av_assert0(0);
 +                }
  
 -            switch (ost->filter->filter->inputs[0]->type) {
 -            case AVMEDIA_TYPE_VIDEO:
 -                if (!ost->frame_aspect_ratio)
 -                    ost->st->codec->sample_aspect_ratio = picref->video->pixel_aspect;
 -
 -                do_video_out(of->ctx, ost, filtered_frame, &frame_size,
 -                             same_quant ? ost->last_quality :
 -                                          ost->st->codec->global_quality);
 -                if (vstats_filename && frame_size)
 -                    do_video_stats(of->ctx, ost, frame_size);
 -                break;
 -            default:
 -                // TODO support audio/subtitle filters
 -                av_assert0(0);
 +                avfilter_unref_buffer(picref);
 +            }
 +        }
 +        /* Request frames through all the graphs */
 +        ret_all = nb_success = nb_eof = 0;
 +        for (i = 0; i < nb_filtergraphs; i++) {
 +            ret = avfilter_graph_request_oldest(filtergraphs[i]->graph);
 +            if (!ret) {
 +                nb_success++;
 +            } else if (ret == AVERROR_EOF) {
 +                nb_eof++;
 +            } else if (ret != AVERROR(EAGAIN)) {
 +                char buf[256];
 +                av_strerror(ret, buf, sizeof(buf));
 +                av_log(NULL, AV_LOG_WARNING,
 +                       "Error in request_frame(): %s\n", buf);
 +                ret_all = ret;
              }
 -
 -            avfilter_unref_buffer(picref);
          }
 +        if (!nb_success)
 +            break;
 +        /* Try again if anything succeeded */
      }
 -    return 0;
 +    return nb_eof == nb_filtergraphs ? AVERROR_EOF : ret_all;
  }
  
 -static void print_report(int is_last_report, int64_t timer_start)
 +static void print_report(int is_last_report, int64_t timer_start, int64_t cur_time)
  {
      char buf[1024];
      OutputStream *ost;
      int64_t total_size;
      AVCodecContext *enc;
      int frame_number, vid, i;
 -    double bitrate, ti1, pts;
 +    double bitrate;
 +    int64_t pts = INT64_MAX;
      static int64_t last_time = -1;
      static int qp_histogram[52];
 +    int hours, mins, secs, us;
  
      if (!print_stats && !is_last_report)
          return;
  
      if (!is_last_report) {
 -        int64_t cur_time;
 -        /* display the report every 0.5 seconds */
 -        cur_time = av_gettime();
          if (last_time == -1) {
              last_time = cur_time;
              return;
      oc = output_files[0]->ctx;
  
      total_size = avio_size(oc->pb);
 -    if (total_size < 0) // FIXME improve avio_size() so it works with non seekable output too
 +    if (total_size < 0) // FIXME improve avio_size() so it works with non seekable output too
          total_size = avio_tell(oc->pb);
 +        if (total_size < 0)
 +            total_size = 0;
 +    }
  
      buf[0] = '\0';
 -    ti1 = 1e10;
      vid = 0;
      for (i = 0; i < nb_output_streams; i++) {
          float q = -1;
              snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
          }
          if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
 -            float t = (av_gettime() - timer_start) / 1000000.0;
 +            float fps, t = (cur_time-timer_start) / 1000000.0;
  
              frame_number = ost->frame_number;
 -            snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
 -                     frame_number, (t > 1) ? (int)(frame_number / t + 0.5) : 0, q);
 +            fps = t > 1 ? frame_number / t : 0;
 +            snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3.*f q=%3.1f ",
 +                     frame_number, fps < 9.95, fps, q);
              if (is_last_report)
                  snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
              if (qp_hist) {
              vid = 1;
          }
          /* compute min output value */
 -        pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
 -        if ((pts < ti1) && (pts > 0))
 -            ti1 = pts;
 +        pts = FFMIN(pts, av_rescale_q(ost->st->pts.val,
 +                                      ost->st->time_base, AV_TIME_BASE_Q));
      }
 -    if (ti1 < 0.01)
 -        ti1 = 0.01;
  
 -    bitrate = (double)(total_size * 8) / ti1 / 1000.0;
 +    secs = pts / AV_TIME_BASE;
 +    us = pts % AV_TIME_BASE;
 +    mins = secs / 60;
 +    secs %= 60;
 +    hours = mins / 60;
 +    mins %= 60;
  
 +    bitrate = pts ? total_size * 8 / (pts / 1000.0) : 0;
 +
 +    snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
 +             "size=%8.0fkB time=", total_size / 1024.0);
      snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
 -            "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
 -            (double)total_size / 1024, ti1, bitrate);
 +             "%02d:%02d:%02d.%02d ", hours, mins, secs,
 +             (100 * us) / AV_TIME_BASE);
 +    snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
 +             "bitrate=%6.1fkbits/s", bitrate);
  
      if (nb_frames_dup || nb_frames_drop)
          snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
                 extra_size / 1024.0,
                 100.0 * (total_size - raw) / raw
          );
 +        if(video_size + audio_size + extra_size == 0){
 +            av_log(NULL, AV_LOG_WARNING, "Output file is empty, nothing was encoded (check -ss / -t / -frames parameters if used)\n");
 +        }
      }
  }
  
@@@ -2326,14 -2023,12 +2325,14 @@@ static void flush_encoders(void
                  }
                  break;
              case AVMEDIA_TYPE_VIDEO:
 +                update_benchmark(NULL);
                  ret = avcodec_encode_video2(enc, &pkt, NULL, &got_packet);
 +                update_benchmark("encode_video %d.%d", ost->file_index, ost->index);
                  if (ret < 0) {
                      av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
                      exit_program(1);
                  }
 -                video_size += ret;
 +                video_size += pkt.size;
                  if (ost->logfile && enc->stats_out) {
                      fprintf(ost->logfile, "%s", enc->stats_out);
                  }
@@@ -2367,15 -2062,8 +2366,15 @@@ static int check_output_constraints(Inp
      if (ost->source_index != ist_index)
          return 0;
  
 -    if (of->start_time && ist->last_dts < of->start_time)
 +    if (of->start_time && ist->pts < of->start_time)
 +        return 0;
 +
 +    if (of->recording_time != INT64_MAX &&
 +        av_compare_ts(ist->pts, AV_TIME_BASE_Q, of->recording_time + of->start_time,
 +                      (AVRational){ 1, 1000000 }) >= 0) {
 +        ost->is_past_recording_time = 1;
          return 0;
 +    }
  
      return 1;
  }
@@@ -2384,7 -2072,6 +2383,7 @@@ static void do_streamcopy(InputStream *
  {
      OutputFile *of = output_files[ost->file_index];
      int64_t ost_tb_start_time = av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
 +    AVPicture pict;
      AVPacket opkt;
  
      av_init_packet(&opkt);
          !ost->copy_initial_nonkeyframes)
          return;
  
 -    if (of->recording_time != INT64_MAX &&
 -        ist->last_dts >= of->recording_time + of->start_time) {
 -        ost->is_past_recording_time = 1;
 -        return;
 -    }
 -
      /* force the input stream PTS */
      if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
          audio_size += pkt->size;
          opkt.pts = AV_NOPTS_VALUE;
  
      if (pkt->dts == AV_NOPTS_VALUE)
 -        opkt.dts = av_rescale_q(ist->last_dts, AV_TIME_BASE_Q, ost->st->time_base);
 +        opkt.dts = av_rescale_q(ist->dts, AV_TIME_BASE_Q, ost->st->time_base);
      else
          opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
      opkt.dts -= ost_tb_start_time;
          opkt.data = pkt->data;
          opkt.size = pkt->size;
      }
 +    if (of->ctx->oformat->flags & AVFMT_RAWPICTURE) {
 +        /* store AVPicture in AVPacket, as expected by the output format */
 +        avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height);
 +        opkt.data = (uint8_t *)&pict;
 +        opkt.size = sizeof(AVPicture);
 +        opkt.flags |= AV_PKT_FLAG_KEY;
 +    }
  
      write_frame(of->ctx, &opkt, ost);
      ost->st->codec->frame_number++;
  static void rate_emu_sleep(InputStream *ist)
  {
      if (input_files[ist->file_index]->rate_emu) {
 -        int64_t pts = av_rescale(ist->last_dts, 1000000, AV_TIME_BASE);
 +        int64_t pts = av_rescale(ist->dts, 1000000, AV_TIME_BASE);
          int64_t now = av_gettime() - ist->start;
          if (pts > now)
              usleep(pts - now);
@@@ -2463,16 -2149,10 +2462,16 @@@ static int transcode_audio(InputStream 
          avcodec_get_frame_defaults(ist->decoded_frame);
      decoded_frame = ist->decoded_frame;
  
 +    update_benchmark(NULL);
      ret = avcodec_decode_audio4(avctx, decoded_frame, got_output, pkt);
 +    update_benchmark("decode_audio %d.%d", ist->file_index, ist->st->index);
      if (ret < 0) {
          return ret;
      }
 +    if (avctx->sample_rate <= 0) {
 +        av_log(avctx, AV_LOG_ERROR, "Sample rate %d invalid\n", avctx->sample_rate);
 +        return AVERROR_INVALIDDATA;
 +    }
  
      if (!*got_output) {
          /* no audio frame */
      /* if the decoder provides a pts, use it instead of the last packet pts.
         the decoder could be delaying output by a packet or more. */
      if (decoded_frame->pts != AV_NOPTS_VALUE)
 -        ist->next_dts = decoded_frame->pts;
 +        ist->dts = ist->next_dts = ist->pts = ist->next_pts = decoded_frame->pts;
  
      /* increment next_dts to use for the case where the input stream does not
         have timestamps or there are multiple frames in the packet */
 +    ist->next_pts += ((int64_t)AV_TIME_BASE * decoded_frame->nb_samples) /
 +                     avctx->sample_rate;
      ist->next_dts += ((int64_t)AV_TIME_BASE * decoded_frame->nb_samples) /
                       avctx->sample_rate;
  
 +
      // preprocess audio (volume)
      if (audio_volume != 256) {
          int decoded_data_size = decoded_frame->nb_samples * avctx->channels * bps;
@@@ -2568,8 -2245,6 +2567,8 @@@ static int transcode_video(InputStream 
      AVFrame *decoded_frame;
      void *buffer_to_free = NULL;
      int i, ret = 0, resample_changed;
 +    int64_t best_effort_timestamp;
 +    AVRational *frame_sample_aspect;
      float quality;
  
      if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame()))
          avcodec_get_frame_defaults(ist->decoded_frame);
      decoded_frame = ist->decoded_frame;
      pkt->pts  = *pkt_pts;
 -    pkt->dts  = ist->last_dts;
 +    pkt->dts  = ist->dts;
      *pkt_pts  = AV_NOPTS_VALUE;
  
 +    update_benchmark(NULL);
      ret = avcodec_decode_video2(ist->st->codec,
                                  decoded_frame, got_output, pkt);
 +    update_benchmark("decode_video %d.%d", ist->file_index, ist->st->index);
      if (ret < 0)
          return ret;
  
          /* no picture yet */
          if (!pkt->size)
              for (i = 0; i < ist->nb_filters; i++)
 -                av_buffersrc_buffer(ist->filters[i]->filter, NULL);
 +                av_buffersrc_add_ref(ist->filters[i]->filter, NULL, 0);
          return ret;
      }
 -    decoded_frame->pts = guess_correct_pts(&ist->pts_ctx, decoded_frame->pkt_pts,
 -                                           decoded_frame->pkt_dts);
 +
 +    best_effort_timestamp= av_frame_get_best_effort_timestamp(decoded_frame);
 +    if(best_effort_timestamp != AV_NOPTS_VALUE)
 +        ist->next_pts = ist->pts = decoded_frame->pts = best_effort_timestamp;
 +
      pkt->size = 0;
 +
      pre_process_video_frame(ist, (AVPicture *)decoded_frame, &buffer_to_free);
  
      rate_emu_sleep(ist);
              }
      }
  
 +    frame_sample_aspect= av_opt_ptr(avcodec_get_frame_class(), decoded_frame, "sample_aspect_ratio");
      for (i = 0; i < ist->nb_filters; i++) {
 +        int changed =      ist->st->codec->width   != ist->filters[i]->filter->outputs[0]->w
 +                        || ist->st->codec->height  != ist->filters[i]->filter->outputs[0]->h
 +                        || ist->st->codec->pix_fmt != ist->filters[i]->filter->outputs[0]->format;
          // XXX what an ugly hack
          if (ist->filters[i]->graph->nb_outputs == 1)
              ist->filters[i]->graph->outputs[0]->ost->last_quality = quality;
  
 -        if (ist->st->codec->codec->capabilities & CODEC_CAP_DR1) {
 +        if (!frame_sample_aspect->num)
 +            *frame_sample_aspect = ist->st->sample_aspect_ratio;
 +        if (ist->dr1 && decoded_frame->type==FF_BUFFER_TYPE_USER && !changed) {
              FrameBuffer      *buf = decoded_frame->opaque;
              AVFilterBufferRef *fb = avfilter_get_video_buffer_ref_from_arrays(
                                          decoded_frame->data, decoded_frame->linesize,
              fb->buf->priv           = buf;
              fb->buf->free           = filter_release_buffer;
  
 +            av_assert0(buf->refcount>0);
              buf->refcount++;
 -            av_buffersrc_buffer(ist->filters[i]->filter, fb);
 +            av_buffersrc_add_ref(ist->filters[i]->filter, fb,
 +                                 AV_BUFFERSRC_FLAG_NO_CHECK_FORMAT |
 +                                 AV_BUFFERSRC_FLAG_NO_COPY);
          } else
 -            av_vsrc_buffer_add_frame(ist->filters[i]->filter, decoded_frame,
 -                                     decoded_frame->pts, decoded_frame->sample_aspect_ratio);
 +        if(av_buffersrc_add_frame(ist->filters[i]->filter, decoded_frame, 0)<0) {
 +            av_log(NULL, AV_LOG_FATAL, "Failed to inject frame into filter network\n");
 +            exit_program(1);
 +        }
 +
      }
  
      av_free(buffer_to_free);
@@@ -2700,25 -2357,13 +2699,25 @@@ static int transcode_subtitles(InputStr
  /* pkt = NULL means EOF (needed to flush decoder buffers) */
  static int output_packet(InputStream *ist, const AVPacket *pkt)
  {
 -    int i;
 +    int ret = 0, i;
      int got_output;
      int64_t pkt_pts = AV_NOPTS_VALUE;
 +
      AVPacket avpkt;
 +    if (!ist->saw_first_ts) {
 +        ist->dts = ist->st->avg_frame_rate.num ? - ist->st->codec->has_b_frames * AV_TIME_BASE / av_q2d(ist->st->avg_frame_rate) : 0;
 +        ist->pts = 0;
 +        if (pkt != NULL && pkt->pts != AV_NOPTS_VALUE && !ist->decoding_needed) {
 +            ist->dts += av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
 +            ist->pts = ist->dts; //unused but better to set it to a value thats not totally wrong
 +        }
 +        ist->saw_first_ts = 1;
 +    }
  
      if (ist->next_dts == AV_NOPTS_VALUE)
 -        ist->next_dts = ist->last_dts;
 +        ist->next_dts = ist->dts;
 +    if (ist->next_pts == AV_NOPTS_VALUE)
 +        ist->next_pts = ist->pts;
  
      if (pkt == NULL) {
          /* EOF handling */
          avpkt = *pkt;
      }
  
 -    if (pkt->dts != AV_NOPTS_VALUE)
 -        ist->next_dts = ist->last_dts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
 -    if (pkt->pts != AV_NOPTS_VALUE)
 +    if (pkt->dts != AV_NOPTS_VALUE) {
 +        ist->next_dts = ist->dts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
 +        if (ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO || !ist->decoding_needed)
 +            ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
 +    }
 +    if(pkt->pts != AV_NOPTS_VALUE)
          pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
  
      // while we have more to decode or while the decoder did output something on EOF
      while (ist->decoding_needed && (avpkt.size > 0 || (!pkt && got_output))) {
 -        int ret = 0;
 +        int duration;
      handle_eof:
  
 -        ist->last_dts = ist->next_dts;
 +        ist->pts = ist->next_pts;
 +        ist->dts = ist->next_dts;
  
          if (avpkt.size && avpkt.size != pkt->size) {
              av_log(NULL, ist->showed_multi_packet_warning ? AV_LOG_VERBOSE : AV_LOG_WARNING,
              break;
          case AVMEDIA_TYPE_VIDEO:
              ret = transcode_video    (ist, &avpkt, &got_output, &pkt_pts);
 -            if (avpkt.duration)
 -                ist->next_dts += av_rescale_q(avpkt.duration, ist->st->time_base, AV_TIME_BASE_Q);
 -            else if (ist->st->r_frame_rate.num)
 -                ist->next_dts += av_rescale_q(1, (AVRational){ist->st->r_frame_rate.den,
 -                                                              ist->st->r_frame_rate.num},
 -                                              AV_TIME_BASE_Q);
 -            else if (ist->st->codec->time_base.num != 0) {
 -                int ticks      = ist->st->parser ? ist->st->parser->repeat_pict + 1 :
 -                                                   ist->st->codec->ticks_per_frame;
 -                ist->next_dts += av_rescale_q(ticks, ist->st->codec->time_base, AV_TIME_BASE_Q);
 -            }
 +            if (avpkt.duration) {
 +                duration = av_rescale_q(avpkt.duration, ist->st->time_base, AV_TIME_BASE_Q);
 +            } else if(ist->st->codec->time_base.num != 0 && ist->st->codec->time_base.den != 0) {
 +                int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
 +                duration = ((int64_t)AV_TIME_BASE *
 +                                ist->st->codec->time_base.num * ticks) /
 +                                ist->st->codec->time_base.den;
 +            } else
 +                duration = 0;
 +
 +            if(ist->dts != AV_NOPTS_VALUE && duration) {
 +                ist->next_dts += duration;
 +            }else
 +                ist->next_dts = AV_NOPTS_VALUE;
 +
 +            if (got_output)
 +                ist->next_pts += duration; //FIXME the duration is not correct in some cases
              break;
          case AVMEDIA_TYPE_SUBTITLE:
              ret = transcode_subtitles(ist, &avpkt, &got_output);
  
          if (ret < 0)
              return ret;
 +
 +        avpkt.dts=
 +        avpkt.pts= AV_NOPTS_VALUE;
 +
          // touch data and size only if not EOF
          if (pkt) {
 +            if(ist->st->codec->codec_type != AVMEDIA_TYPE_AUDIO)
 +                ret = avpkt.size;
              avpkt.data += ret;
              avpkt.size -= ret;
          }
      /* handle stream copy */
      if (!ist->decoding_needed) {
          rate_emu_sleep(ist);
 -        ist->last_dts = ist->next_dts;
 +        ist->dts = ist->next_dts;
          switch (ist->st->codec->codec_type) {
          case AVMEDIA_TYPE_AUDIO:
              ist->next_dts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
                               ist->st->codec->sample_rate;
              break;
          case AVMEDIA_TYPE_VIDEO:
 -            if (ist->st->codec->time_base.num != 0) {
 -                int ticks = ist->st->parser ? ist->st->parser->repeat_pict + 1 : ist->st->codec->ticks_per_frame;
 +            if (pkt->duration) {
 +                ist->next_dts += av_rescale_q(pkt->duration, ist->st->time_base, AV_TIME_BASE_Q);
 +            } else if(ist->st->codec->time_base.num != 0) {
 +                int ticks= ist->st->parser ? ist->st->parser->repeat_pict + 1 : ist->st->codec->ticks_per_frame;
                  ist->next_dts += ((int64_t)AV_TIME_BASE *
                                    ist->st->codec->time_base.num * ticks) /
                                    ist->st->codec->time_base.den;
              }
              break;
          }
 +        ist->pts = ist->dts;
 +        ist->next_pts = ist->next_dts;
      }
      for (i = 0; pkt && i < nb_output_streams; i++) {
          OutputStream *ost = output_streams[i];
@@@ -2857,17 -2482,25 +2856,17 @@@ static int init_input_stream(int ist_in
  {
      int i;
      InputStream *ist = input_streams[ist_index];
 +
      if (ist->decoding_needed) {
          AVCodec *codec = ist->dec;
          if (!codec) {
 -            snprintf(error, error_len, "Decoder (codec id %d) not found for input stream #%d:%d",
 -                    ist->st->codec->codec_id, ist->file_index, ist->st->index);
 +            snprintf(error, error_len, "Decoder (codec %s) not found for input stream #%d:%d",
 +                    avcodec_get_name(ist->st->codec->codec_id), ist->file_index, ist->st->index);
              return AVERROR(EINVAL);
          }
  
 -        /* update requested sample format for the decoder based on the
 -           corresponding encoder sample format */
 -        for (i = 0; i < nb_output_streams; i++) {
 -            OutputStream *ost = output_streams[i];
 -            if (ost->source_index == ist_index) {
 -                update_sample_fmt(ist->st->codec, codec, ost->st->codec);
 -                break;
 -            }
 -        }
 -
 -        if (codec->type == AVMEDIA_TYPE_VIDEO && codec->capabilities & CODEC_CAP_DR1) {
 +        ist->dr1 = codec->capabilities & CODEC_CAP_DR1;
 +        if (codec->type == AVMEDIA_TYPE_VIDEO && ist->dr1) {
              ist->st->codec->get_buffer     = codec_get_buffer;
              ist->st->codec->release_buffer = codec_release_buffer;
              ist->st->codec->opaque         = ist;
          }
      }
  
 -    ist->last_dts = ist->st->avg_frame_rate.num ? - ist->st->codec->has_b_frames * AV_TIME_BASE / av_q2d(ist->st->avg_frame_rate) : 0;
 +    ist->next_pts = AV_NOPTS_VALUE;
      ist->next_dts = AV_NOPTS_VALUE;
 -    init_pts_correction(&ist->pts_ctx);
      ist->is_start = 1;
  
      return 0;
@@@ -3002,36 -2636,14 +3001,36 @@@ static int transcode_init(void
                  return AVERROR(ENOMEM);
              }
              memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
 -            codec->extradata_size = icodec->extradata_size;
 -            if (!copy_tb) {
 -                codec->time_base      = icodec->time_base;
 -                codec->time_base.num *= icodec->ticks_per_frame;
 -                av_reduce(&codec->time_base.num, &codec->time_base.den,
 -                          codec->time_base.num, codec->time_base.den, INT_MAX);
 -            } else
 -                codec->time_base = ist->st->time_base;
 +            codec->extradata_size= icodec->extradata_size;
 +
 +            codec->time_base = ist->st->time_base;
 +            /*
 +             * Avi is a special case here because it supports variable fps but
 +             * having the fps and timebase differe significantly adds quite some
 +             * overhead
 +             */
 +            if(!strcmp(oc->oformat->name, "avi")) {
 +                if (   copy_tb<0 && av_q2d(icodec->time_base)*icodec->ticks_per_frame > 2*av_q2d(ist->st->time_base)
 +                                 && av_q2d(ist->st->time_base) < 1.0/500
 +                    || copy_tb==0){
 +                    codec->time_base = icodec->time_base;
 +                    codec->time_base.num *= icodec->ticks_per_frame;
 +                    codec->time_base.den *= 2;
 +                    codec->ticks_per_frame = 2;
 +                }
 +            } else if(!(oc->oformat->flags & AVFMT_VARIABLE_FPS)
 +                      && strcmp(oc->oformat->name, "mov") && strcmp(oc->oformat->name, "mp4") && strcmp(oc->oformat->name, "3gp")
 +                      && strcmp(oc->oformat->name, "3g2") && strcmp(oc->oformat->name, "psp") && strcmp(oc->oformat->name, "ipod")
 +            ) {
 +                if(   copy_tb<0 && av_q2d(icodec->time_base)*icodec->ticks_per_frame > av_q2d(ist->st->time_base)
 +                                && av_q2d(ist->st->time_base) < 1.0/500
 +                   || copy_tb==0){
 +                    codec->time_base = icodec->time_base;
 +                    codec->time_base.num *= icodec->ticks_per_frame;
 +                }
 +            }
 +            av_reduce(&codec->time_base.num, &codec->time_base.den,
 +                        codec->time_base.num, codec->time_base.den, INT_MAX);
  
              switch (codec->codec_type) {
              case AVMEDIA_TYPE_AUDIO:
                          ist->st->codec->sample_aspect_ratio.num ?
                          ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
                  }
 +                ost->st->avg_frame_rate = ist->st->avg_frame_rate;
                  break;
              case AVMEDIA_TYPE_SUBTITLE:
                  codec->width  = icodec->width;
                  abort();
              }
          } else {
 +            if (!ost->enc)
 +                ost->enc = avcodec_find_encoder(codec->codec_id);
              if (!ost->enc) {
                  /* should only happen when a default codec is not present. */
 -                snprintf(error, sizeof(error), "Automatic encoder selection "
 -                         "failed for output stream #%d:%d. Default encoder for "
 -                         "format %s is probably disabled. Please choose an "
 -                         "encoder manually.\n", ost->file_index, ost->index,
 -                         oc->oformat->name);
 +                snprintf(error, sizeof(error), "Encoder (codec %s) not found for output stream #%d:%d",
 +                         avcodec_get_name(ost->st->codec->codec_id), ost->file_index, ost->index);
                  ret = AVERROR(EINVAL);
                  goto dump_format;
              }
                      codec->sample_fmt = icodec->sample_fmt;
                  choose_sample_fmt(ost->st, ost->enc);
  
 -                if (!codec->channels)
 +                if (ost->audio_channels_mapped) {
 +                    /* the requested output channel is set to the number of
 +                     * -map_channel only if no -ac are specified */
 +                    if (!codec->channels) {
 +                        codec->channels       = ost->audio_channels_mapped;
 +                        codec->channel_layout = av_get_default_channel_layout(codec->channels);
 +                        if (!codec->channel_layout) {
 +                            av_log(NULL, AV_LOG_FATAL, "Unable to find an appropriate channel layout for requested number of channel\n");
 +                            exit_program(1);
 +                        }
 +                    }
 +                    /* fill unused channel mapping with -1 (which means a muted
 +                     * channel in case the number of output channels is bigger
 +                     * than the number of mapped channel) */
 +                    for (j = ost->audio_channels_mapped; j < FF_ARRAY_ELEMS(ost->audio_channels_map); j++)
 +                        ost->audio_channels_map[j] = -1;
 +                } else if (!codec->channels) {
                      codec->channels = icodec->channels;
 -                if (!codec->channel_layout)
                      codec->channel_layout = icodec->channel_layout;
 +                }
                  if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
                      codec->channel_layout = 0;
  
 +
 +//                 ost->audio_resample       = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
 +//                 ost->audio_resample      |=    codec->sample_fmt     != icodec->sample_fmt
 +//                                             || codec->channel_layout != icodec->channel_layout;
                  icodec->request_channels  = codec-> channels;
                  ost->resample_sample_fmt  = icodec->sample_fmt;
                  ost->resample_sample_rate = icodec->sample_rate;
                      }
                  }
  
 -                /*
 -                 * We want CFR output if and only if one of those is true:
 -                 * 1) user specified output framerate with -r
 -                 * 2) user specified -vsync cfr
 -                 * 3) output format is CFR and the user didn't force vsync to
 -                 *    something else than CFR
 -                 *
 -                 * in such a case, set ost->frame_rate
 -                 */
 -                if (!ost->frame_rate.num && ist &&
 -                    (video_sync_method ==  VSYNC_CFR ||
 -                     (video_sync_method ==  VSYNC_AUTO &&
 -                      !(oc->oformat->flags & (AVFMT_NOTIMESTAMPS | AVFMT_VARIABLE_FPS))))) {
 -                    ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25, 1};
 -                    if (ost->enc && ost->enc->supported_framerates && !ost->force_fps) {
 -                        int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
 -                        ost->frame_rate = ost->enc->supported_framerates[idx];
 -                    }
 +                if (ist && !ost->frame_rate.num)
 +                    ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational) { 25, 1 };
 +                if (ost->enc && ost->enc->supported_framerates && !ost->force_fps) {
 +                    int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
 +                    ost->frame_rate = ost->enc->supported_framerates[idx];
                  }
 -                if (ost->frame_rate.num) {
 -                    codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
 -                    video_sync_method = VSYNC_CFR;
 -                } else if (ist)
 -                    codec->time_base = ist->st->time_base;
 -                else
 -                    codec->time_base = ost->filter->filter->inputs[0]->time_base;
 +                codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
 +                if (   av_q2d(codec->time_base) < 0.001 && video_sync_method != VSYNC_PASSTHROUGH
 +                   && (video_sync_method == VSYNC_CFR || (video_sync_method == VSYNC_AUTO && !(oc->oformat->flags & AVFMT_VARIABLE_FPS)))){
 +                    av_log(oc, AV_LOG_WARNING, "Frame rate very high for a muxer not efficiently supporting it.\n"
 +                                               "Please consider specifying a lower framerate, a different muxer or -vsync 2\n");
 +                }
 +                for (j = 0; j < ost->forced_kf_count; j++)
 +                    ost->forced_kf_pts[j] = av_rescale_q(ost->forced_kf_pts[j],
 +                                                         AV_TIME_BASE_Q,
 +                                                         codec->time_base);
  
                  codec->width  = ost->filter->filter->inputs[0]->w;
                  codec->height = ost->filter->filter->inputs[0]->h;
                  if (codec->width   != icodec->width  ||
                      codec->height  != icodec->height ||
                      codec->pix_fmt != icodec->pix_fmt) {
 -                    codec->bits_per_raw_sample = 0;
 +                    codec->bits_per_raw_sample = frame_bits_per_raw_sample;
                  }
  
                  break;
                  break;
              }
              /* two pass mode */
 -            if ((codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
 +            if (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2)) {
                  char logfilename[1024];
                  FILE *f;
  
                  if (!strcmp(ost->enc->name, "libx264")) {
                      av_dict_set(&ost->opts, "stats", logfilename, AV_DICT_DONT_OVERWRITE);
                  } else {
 -                    if (codec->flags & CODEC_FLAG_PASS1) {
 -                        f = fopen(logfilename, "wb");
 -                        if (!f) {
 -                            av_log(NULL, AV_LOG_FATAL, "Cannot write log file '%s' for pass-1 encoding: %s\n",
 -                                   logfilename, strerror(errno));
 -                            exit_program(1);
 -                        }
 -                        ost->logfile = f;
 -                    } else {
 +                    if (codec->flags & CODEC_FLAG_PASS2) {
                          char  *logbuffer;
                          size_t logbuffer_size;
                          if (cmdutils_read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
                              av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
 -                                   logfilename);
 +                                logfilename);
                              exit_program(1);
                          }
                          codec->stats_in = logbuffer;
                      }
 +                    if (codec->flags & CODEC_FLAG_PASS1) {
 +                        f = fopen(logfilename, "wb");
 +                        if (!f) {
 +                            av_log(NULL, AV_LOG_FATAL, "Cannot write log file '%s' for pass-1 encoding: %s\n",
 +                                logfilename, strerror(errno));
 +                            exit_program(1);
 +                        }
 +                        ost->logfile = f;
 +                    }
                  }
              }
          }
              assert_avoptions(ost->opts);
              if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
                  av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
 -                                             "It takes bits/s as argument, not kbits/s\n");
 +                                             " It takes bits/s as argument, not kbits/s\n");
              extra_size += ost->st->codec->extradata_size;
  
              if (ost->st->codec->me_threshold)
              ret = AVERROR(EINVAL);
              goto dump_format;
          }
 -        assert_avoptions(output_files[i]->opts);
 +//         assert_avoptions(output_files[i]->opts);
          if (strcmp(oc->oformat->name, "rtp")) {
              want_sdp = 0;
          }
                 input_streams[ost->source_index]->st->index,
                 ost->file_index,
                 ost->index);
 +        if (ost->audio_channels_mapped) {
 +            av_log(NULL, AV_LOG_INFO, " [ch:");
 +            for (j = 0; j < ost->audio_channels_mapped; j++)
 +                if (ost->audio_channels_map[j] == -1)
 +                    av_log(NULL, AV_LOG_INFO, " M");
 +                else
 +                    av_log(NULL, AV_LOG_INFO, " %d", ost->audio_channels_map[j]);
 +            av_log(NULL, AV_LOG_INFO, "]");
 +        }
          if (ost->sync_ist != input_streams[ost->source_index])
              av_log(NULL, AV_LOG_INFO, " [sync #%d:%d]",
                     ost->sync_ist->file_index,
@@@ -3394,7 -2986,6 +3393,7 @@@ static int transcode(void
      uint8_t *no_packet;
      int no_packet_count = 0;
      int64_t timer_start;
 +    int key;
  
      if (!(no_packet = av_mallocz(nb_input_files)))
          exit_program(1);
      if (ret < 0)
          goto fail;
  
 -    av_log(NULL, AV_LOG_INFO, "Press ctrl-c to stop encoding\n");
 -    term_init();
 +    if (!using_stdin) {
 +        av_log(NULL, AV_LOG_INFO, "Press [q] to stop, [?] for help\n");
 +    }
  
      timer_start = av_gettime();
  
          int file_index, ist_index, past_recording_time = 1;
          AVPacket pkt;
          int64_t ipts_min;
 +        int64_t cur_time= av_gettime();
  
          ipts_min = INT64_MAX;
 +        /* if 'q' pressed, exits */
 +        if (!using_stdin) {
 +            static int64_t last_time;
 +            if (received_nb_signals)
 +                break;
 +            /* read_key() returns 0 on EOF */
 +            if(cur_time - last_time >= 100000 && !run_as_daemon){
 +                key =  read_key();
 +                last_time = cur_time;
 +            }else
 +                key = -1;
 +            if (key == 'q')
 +                break;
 +            if (key == '+') av_log_set_level(av_log_get_level()+10);
 +            if (key == '-') av_log_set_level(av_log_get_level()-10);
 +            if (key == 's') qp_hist     ^= 1;
 +            if (key == 'h'){
 +                if (do_hex_dump){
 +                    do_hex_dump = do_pkt_dump = 0;
 +                } else if(do_pkt_dump){
 +                    do_hex_dump = 1;
 +                } else
 +                    do_pkt_dump = 1;
 +                av_log_set_level(AV_LOG_DEBUG);
 +            }
 +            if (key == 'c' || key == 'C'){
 +                char buf[4096], target[64], command[256], arg[256] = {0};
 +                double time;
 +                int k, n = 0;
 +                fprintf(stderr, "\nEnter command: <target> <time> <command>[ <argument>]\n");
 +                i = 0;
 +                while ((k = read_key()) != '\n' && k != '\r' && i < sizeof(buf)-1)
 +                    if (k > 0)
 +                        buf[i++] = k;
 +                buf[i] = 0;
 +                if (k > 0 &&
 +                    (n = sscanf(buf, "%63[^ ] %lf %255[^ ] %255[^\n]", target, &time, command, arg)) >= 3) {
 +                    av_log(NULL, AV_LOG_DEBUG, "Processing command target:%s time:%f command:%s arg:%s",
 +                           target, time, command, arg);
 +                    for (i = 0; i < nb_filtergraphs; i++) {
 +                        FilterGraph *fg = filtergraphs[i];
 +                        if (fg->graph) {
 +                            if (time < 0) {
 +                                ret = avfilter_graph_send_command(fg->graph, target, command, arg, buf, sizeof(buf),
 +                                                                  key == 'c' ? AVFILTER_CMD_FLAG_ONE : 0);
 +                                fprintf(stderr, "Command reply for stream %d: ret:%d res:%s\n", i, ret, buf);
 +                            } else {
 +                                ret = avfilter_graph_queue_command(fg->graph, target, command, arg, 0, time);
 +                            }
 +                        }
 +                    }
 +                } else {
 +                    av_log(NULL, AV_LOG_ERROR,
 +                           "Parse error, at least 3 arguments were expected, "
 +                           "only %d given in string '%s'\n", n, buf);
 +                }
 +            }
 +            if (key == 'd' || key == 'D'){
 +                int debug=0;
 +                if(key == 'D') {
 +                    debug = input_streams[0]->st->codec->debug<<1;
 +                    if(!debug) debug = 1;
 +                    while(debug & (FF_DEBUG_DCT_COEFF|FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) //unsupported, would just crash
 +                        debug += debug;
 +                }else
 +                    if(scanf("%d", &debug)!=1)
 +                        fprintf(stderr,"error parsing debug value\n");
 +                for(i=0;i<nb_input_streams;i++) {
 +                    input_streams[i]->st->codec->debug = debug;
 +                }
 +                for(i=0;i<nb_output_streams;i++) {
 +                    ost = output_streams[i];
 +                    ost->st->codec->debug = debug;
 +                }
 +                if(debug) av_log_set_level(AV_LOG_DEBUG);
 +                fprintf(stderr,"debug=%d\n", debug);
 +            }
 +            if (key == '?'){
 +                fprintf(stderr, "key    function\n"
 +                                "?      show this help\n"
 +                                "+      increase verbosity\n"
 +                                "-      decrease verbosity\n"
 +                                "c      Send command to filtergraph\n"
 +                                "D      cycle through available debug modes\n"
 +                                "h      dump packets/hex press to cycle through the 3 states\n"
 +                                "q      quit\n"
 +                                "s      Show QP histogram\n"
 +                );
 +            }
 +        }
  
          /* check if there's any stream where output is still needed */
          for (i = 0; i < nb_output_streams; i++) {
              if (ost->is_past_recording_time ||
                  (os->pb && avio_tell(os->pb) >= of->limit_filesize))
                  continue;
 -            if (ost->frame_number > ost->max_frames) {
 +            if (ost->frame_number >= ost->max_frames) {
                  int j;
                  for (j = 0; j < of->ctx->nb_streams; j++)
                      output_streams[of->ost_index + j]->is_past_recording_time = 1;
          for (i = 0; i < nb_input_streams; i++) {
              int64_t ipts;
              ist = input_streams[i];
 -            ipts = ist->last_dts;
 +            ipts = ist->pts;
              if (ist->discard || no_packet[ist->file_index])
                  continue;
              if (!input_files[ist->file_index]->eof_reached) {
          if (pkt.dts != AV_NOPTS_VALUE)
              pkt.dts *= ist->ts_scale;
  
 -        //fprintf(stderr, "next:%"PRId64" dts:%"PRId64" off:%"PRId64" %d\n",
 -        //        ist->next_dts,
 -        //        pkt.dts, input_files[ist->file_index].ts_offset,
 -        //        ist->st->codec->codec_type);
 -        if (pkt.dts != AV_NOPTS_VALUE && ist->next_dts != AV_NOPTS_VALUE
 -            && (is->iformat->flags & AVFMT_TS_DISCONT)) {
 +        if (debug_ts) {
 +            av_log(NULL, AV_LOG_INFO, "demuxer -> ist_index:%d type:%s "
 +                    "next_pts:%s next_pts_time:%s pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s off:%"PRId64"\n",
 +                    ist_index, av_get_media_type_string(ist->st->codec->codec_type),
 +                    av_ts2str(ist->next_pts), av_ts2timestr(ist->next_pts, &ist->st->time_base),
 +                    av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &ist->st->time_base),
 +                    av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &ist->st->time_base),
 +                    input_files[ist->file_index]->ts_offset);
 +        }
 +
 +        if (pkt.dts != AV_NOPTS_VALUE && ist->next_dts != AV_NOPTS_VALUE && !copy_ts) {
              int64_t pkt_dts = av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
              int64_t delta   = pkt_dts - ist->next_dts;
 -            if ((FFABS(delta) > 1LL * dts_delta_threshold * AV_TIME_BASE || pkt_dts + 1 < ist->last_dts) && !copy_ts) {
 +            if (is->iformat->flags & AVFMT_TS_DISCONT) {
 +            if(delta < -1LL*dts_delta_threshold*AV_TIME_BASE ||
 +                (delta > 1LL*dts_delta_threshold*AV_TIME_BASE &&
 +                 ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
 +                pkt_dts+1<ist->pts){
                  input_files[ist->file_index]->ts_offset -= delta;
                  av_log(NULL, AV_LOG_DEBUG,
                         "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
                  if (pkt.pts != AV_NOPTS_VALUE)
                      pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
              }
 +            } else {
 +                if ( delta < -1LL*dts_error_threshold*AV_TIME_BASE ||
 +                    (delta > 1LL*dts_error_threshold*AV_TIME_BASE && ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
 +                     pkt_dts+1<ist->pts){
 +                    av_log(NULL, AV_LOG_WARNING, "DTS %"PRId64", next:%"PRId64" st:%d invalid dropping\n", pkt.dts, ist->next_dts, pkt.stream_index);
 +                    pkt.dts = AV_NOPTS_VALUE;
 +                }
 +                if (pkt.pts != AV_NOPTS_VALUE){
 +                    int64_t pkt_pts = av_rescale_q(pkt.pts, ist->st->time_base, AV_TIME_BASE_Q);
 +                    delta   = pkt_pts - ist->next_dts;
 +                    if ( delta < -1LL*dts_error_threshold*AV_TIME_BASE ||
 +                        (delta > 1LL*dts_error_threshold*AV_TIME_BASE && ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
 +                        pkt_pts+1<ist->pts) {
 +                        av_log(NULL, AV_LOG_WARNING, "PTS %"PRId64", next:%"PRId64" invalid dropping st:%d\n", pkt.pts, ist->next_dts, pkt.stream_index);
 +                        pkt.pts = AV_NOPTS_VALUE;
 +                    }
 +                }
 +            }
          }
  
          // fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
 -        if (output_packet(ist, &pkt) < 0 || poll_filters() < 0) {
 +        if (output_packet(ist, &pkt) < 0 ||
 +            ((ret = poll_filters()) < 0 && ret != AVERROR_EOF)) {
              av_log(NULL, AV_LOG_ERROR, "Error while decoding stream #%d:%d\n",
                     ist->file_index, ist->st->index);
              if (exit_on_error)
          av_free_packet(&pkt);
  
          /* dump report by using the output first video and audio streams */
 -        print_report(0, timer_start);
 +        print_report(0, timer_start, cur_time);
      }
  
      /* at the end of stream, we must flush the decoder buffers */
      }
  
      /* dump report by using the first video and audio streams */
 -    print_report(1, timer_start);
 +    print_report(1, timer_start, av_gettime());
  
      /* close each encoder */
      for (i = 0; i < nb_output_streams; i++) {
                                               initialized but set to zero */
                  av_freep(&ost->st->codec->subtitle_header);
                  av_free(ost->forced_kf_pts);
 -                if (ost->avr)
 -                    avresample_free(&ost->avr);
 +                swr_free(&ost->swr);
                  av_dict_free(&ost->opts);
              }
          }
      return ret;
  }
  
 -static double parse_frame_aspect_ratio(const char *arg)
 +static int opt_frame_crop(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_program(1);
 -    }
 -    return ar;
 +static int opt_pad(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_video_channel(const char *opt, const char *arg)
 +{
 +    av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
 +    return opt_default("channel", arg);
 +}
 +
 +static int opt_video_standard(const char *opt, const char *arg)
 +{
 +    av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
 +    return opt_default("standard", arg);
  }
  
  static int opt_audio_codec(OptionsContext *o, const char *opt, const char *arg)
  {
 +    audio_codec_name = arg;
      return parse_option(o, "codec:a", arg, options);
  }
  
  static int opt_video_codec(OptionsContext *o, const char *opt, const char *arg)
  {
 +    video_codec_name = arg;
      return parse_option(o, "codec:v", arg, options);
  }
  
  static int opt_subtitle_codec(OptionsContext *o, const char *opt, const char *arg)
  {
 +    subtitle_codec_name = arg;
      return parse_option(o, "codec:s", arg, options);
  }
  
@@@ -3784,7 -3253,7 +3783,7 @@@ static int opt_map(OptionsContext *o, c
  {
      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;
  
@@@ -3884,66 -3353,6 +3883,66 @@@ static int opt_attach(OptionsContext *o
      return 0;
  }
  
 +static int opt_map_channel(OptionsContext *o, const char *opt, const char *arg)
 +{
 +    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_program(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_program(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_program(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_program(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_program(1);
 +    }
 +    return 0;
 +}
 +
  /**
   * Parse a metadata specifier in arg.
   * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
@@@ -3980,7 -3389,7 +3979,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')
      return 0;
  }
  
 +static int opt_recording_timestamp(OptionsContext *o, const char *opt, const char *arg)
 +{
 +    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 char *codec_string = encoder ? "encoder" : "decoder";
@@@ -4112,7 -3498,6 +4111,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);
 +        ist->opts = filter_codec_opts(codec_opts, choose_decoder(o, ic, st), 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);
  
          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;
          case AVMEDIA_TYPE_AUDIO:
          case AVMEDIA_TYPE_DATA:
          case AVMEDIA_TYPE_SUBTITLE:
 +            if(!ist->dec)
 +                ist->dec = avcodec_find_decoder(dec->codec_id);
 +            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 (!using_stdin && (!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_program(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_program(1);
              }
          }
@@@ -4283,16 -3648,10 +4282,16 @@@ static int opt_input_file(OptionsContex
      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);
  
 +    ic->video_codec_id   = video_codec_name ?
 +        find_codec_or_die(video_codec_name   , AVMEDIA_TYPE_VIDEO   , 0)->id : CODEC_ID_NONE;
 +    ic->audio_codec_id   = audio_codec_name ?
 +        find_codec_or_die(audio_codec_name   , AVMEDIA_TYPE_AUDIO   , 0)->id : CODEC_ID_NONE;
 +    ic->subtitle_codec_id= subtitle_codec_name ?
 +        find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0)->id : 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;
  }
  
 -static void parse_forced_key_frames(char *kf, OutputStream *ost,
 -                                    AVCodecContext *avctx)
 +static void parse_forced_key_frames(char *kf, OutputStream *ost)
  {
      char *p;
      int n = 1, i;
 -    int64_t t;
  
      for (p = kf; *p; p++)
          if (*p == ',')
          av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
          exit_program(1);
      }
 +    p = kf;
      for (i = 0; i < n; i++) {
 -        p = i ? strchr(p, ',') + 1 : kf;
 -        t = parse_time_or_die("force_key_frames", p, 1);
 -        ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
 +        char *next = strchr(p, ',');
 +        if (next) *next++ = 0;
 +        ost->forced_kf_pts[i] = parse_time_or_die("force_key_frames", p, 1);
 +        p = next;
      }
  }
  
@@@ -4451,7 -3810,7 +4450,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);
      st->codec->codec_type = type;
      choose_encoder(o, oc, ost);
      if (ost->enc) {
 -        ost->opts  = filter_codec_opts(codec_opts, ost->enc->id, oc, st);
 +        ost->opts  = filter_codec_opts(codec_opts, ost->enc, oc, st);
      }
  
      avcodec_get_context_defaults3(st->codec, ost->enc);
          st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
  
      av_opt_get_int(sws_opts, "sws_flags", 0, &ost->sws_flags);
 +    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;
 +    }
  
      ost->pix_fmts[0] = ost->pix_fmts[1] = PIX_FMT_NONE;
  
@@@ -4583,13 -3933,13 +4582,13 @@@ 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;
  
 -    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_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_program(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 && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == PIX_FMT_NONE) {
              av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
          }
          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_program(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 */
          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;
              }
          }
  
          MATCH_PER_STREAM_OPT(forced_key_frames, str, forced_key_frames, oc, st);
          if (forced_key_frames)
 -            parse_forced_key_frames(forced_key_frames, ost, video_enc);
 +            parse_forced_key_frames(forced_key_frames, ost);
  
          MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
  
      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);
 +
 +        ost->rematrix_volume=1.0;
 +        MATCH_PER_STREAM_OPT(rematrix_volume, f, ost->rematrix_volume, oc, st);
 +    }
 +
 +    /* 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_program(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);
 +
      return ost;
  }
  
@@@ -4814,7 -4128,7 +4813,7 @@@ static int opt_streamid(OptionsContext 
          exit_program(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;
@@@ -4852,7 -4166,7 +4851,7 @@@ static int copy_chapters(InputFile *ifi
              av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
  
          os->nb_chapters++;
 -        os->chapters = av_realloc(os->chapters, sizeof(AVChapter) * os->nb_chapters);
 +        os->chapters = av_realloc_f(os->chapters, os->nb_chapters, sizeof(AVChapter));
          if (!os->chapters)
              return AVERROR(ENOMEM);
          os->chapters[os->nb_chapters - 1] = out_ch;
      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);
 +    }
 +
 +    avformat_close_input(&ic);
 +    return 0;
 +}
 +
  static void init_output_filter(OutputFilter *ofilter, OptionsContext *o,
                                 AVFormatContext *oc)
  {
          exit_program(1);
      }
  
 -    ost               = new_video_stream(o, oc);
 +    ost               = new_video_stream(o, oc, -1);
      ost->source_index = -1;
      ost->filter       = ofilter;
  
@@@ -4947,13 -4221,30 +4946,13 @@@ static void opt_output_file(void *optct
      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_program(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_program(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_program(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_program(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;
 +                    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_program(1);
 +            }
          }
 +    } else if (!o->nb_stream_maps) {
 +        /* pick the "best" stream of each type */
  
          /* video: highest resolution */
          if (!o->video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
                      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 != CODEC_ID_NONE) {
 +        if (!o->subtitle_disable && (oc->oformat->subtitle_codec != 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;
@@@ -5074,42 -4343,27 +5073,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);
 +                        map->file_index, map->stream_index);
                      exit_program(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_program(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++) {
          char *p;
          int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
  
 -        if (in_file_index < 0)
 -            continue;
          if (in_file_index >= nb_input_files) {
              av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index);
              exit_program(1);
          }
 -        copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc, input_files[in_file_index]->ctx, o);
 +        copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc, in_file_index >= 0 ? input_files[in_file_index]->ctx : NULL, o);
      }
  
      /* copy chapters */
                        !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);
 +    }
      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);
  }
  
  /* same option as mencoder */
  static int opt_pass(const char *opt, const char *arg)
  {
 -    do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
 +    do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 3);
      return 0;
  }
  
 -static int64_t getutime(void)
 -{
 -#if HAVE_GETRUSAGE
 -    struct rusage rusage;
 -
 -    getrusage(RUSAGE_SELF, &rusage);
 -    return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
 -#elif HAVE_GETPROCESSTIMES
 -    HANDLE proc;
 -    FILETIME c, e, k, u;
 -    proc = GetCurrentProcess();
 -    GetProcessTimes(proc, &c, &e, &k, &u);
 -    return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
 -#else
 -    return av_gettime();
 -#endif
 -}
 -
  static int64_t getmaxrss(void)
  {
  #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
@@@ -5314,12 -4587,12 +5313,12 @@@ static int opt_audio_qscale(OptionsCont
  
  static 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 void show_help(void)
 +static int opt_help(const char *opt, const char *arg)
  {
      int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
      av_log_set_callback(log_callback_help);
      show_help_children(avcodec_get_class(), flags);
      show_help_children(avformat_get_class(), flags);
      show_help_children(sws_get_class(), flags);
 +
 +    return 0;
  }
  
  static int opt_target(OptionsContext *o, const char *opt, const char *arg)
          parse_option(o, "r", frame_rates[norm], options);
          opt_default("g", norm == PAL ? "15" : "18");
  
 -        opt_default("b", "1150000");
 +        opt_default("b:v", "1150000");
          opt_default("maxrate", "1150000");
          opt_default("minrate", "1150000");
          opt_default("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("g", norm == PAL ? "15" : "18");
  
 -        opt_default("b", "2040000");
 +        opt_default("b:v", "2040000");
          opt_default("maxrate", "2516000");
          opt_default("minrate", "0"); // 1145000;
          opt_default("bufsize", "1835008"); // 224*1024*8;
 -        opt_default("flags", "+scan_offset");
 +        opt_default("scan_offset", "1");
  
  
          opt_default("b:a", "224000");
  
          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("g", norm == PAL ? "15" : "18");
  
 -        opt_default("b", "6000000");
 +        opt_default("b:v", "6000000");
          opt_default("maxrate", "9000000");
          opt_default("minrate", "0"); // 1500000;
          opt_default("bufsize", "1835008"); // 224*1024*8;
@@@ -5526,103 -4795,19 +5525,103 @@@ static int opt_data_frames(OptionsConte
      return parse_option(o, "frames:d", arg, options);
  }
  
 -static int opt_video_tag(OptionsContext *o, const char *opt, const char *arg)
 +static int opt_preset(OptionsContext *o, const char *opt, const char *arg)
 +{
 +    FILE *f=NULL;
 +    char filename[1000], line[1000], tmp_line[1000];
 +    const char *codec_name = *opt == 'v' ? video_codec_name :
 +                             *opt == 'a' ? audio_codec_name :
 +                                           subtitle_codec_name;
 +
 +    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_program(1);
 +    }
 +
 +    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_program(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(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_program(1);
 +        }
 +    }
 +
 +    fclose(f);
 +
 +    return 0;
 +}
 +
 +static void log_callback_null(void *ptr, int level, const char *fmt, va_list vl)
 +{
 +}
 +
 +static int opt_passlogfile(const char *opt, const char *arg)
 +{
 +    pass_logfilename_prefix = arg;
 +#if CONFIG_LIBX264_ENCODER
 +    return opt_default(opt, arg);
 +#else
 +    return 0;
 +#endif
 +}
 +
 +static int opt_old2new(OptionsContext *o, const char *opt, const char *arg)
 +{
 +    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_bitrate(OptionsContext *o, const char *opt, const char *arg)
  {
 -    return parse_option(o, "tag:v", 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(opt, arg);
  }
  
 -static int opt_audio_tag(OptionsContext *o, const char *opt, const char *arg)
 +static int opt_qscale(OptionsContext *o, const char *opt, const char *arg)
  {
 -    return parse_option(o, "tag:a", arg, options);
 +    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_subtitle_tag(OptionsContext *o, const char *opt, const char *arg)
 +static int opt_profile(OptionsContext *o, const char *opt, const char *arg)
  {
 -    return parse_option(o, "tag:s", arg, options);
 +    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(opt, arg);
  }
  
  static int opt_video_filters(OptionsContext *o, const char *opt, const char *arg)
@@@ -5635,7 -4820,6 +5634,7 @@@ static int opt_vsync(const char *opt, c
      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);
@@@ -5649,6 -4833,17 +5648,6 @@@ static int opt_deinterlace(const char *
      return 0;
  }
  
 -static int opt_cpuflags(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;
 -}
 -
  static void parse_cpuflags(int argc, char **argv, const OptionDef *options)
  {
      int idx = locate_option(argc, argv, options, "cpuflags");
@@@ -5709,12 -4904,10 +5708,12 @@@ static const OptionDef options[] = 
      { "f", HAS_ARG | OPT_STRING | OPT_OFFSET, {.off = OFFSET(format)}, "force format", "fmt" },
      { "i", HAS_ARG | OPT_FUNC2, {(void*)opt_input_file}, "input file name", "filename" },
      { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
 +    { "n", OPT_BOOL, {(void*)&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)}, "codec name", "codec" },
      { "pre", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(presets)}, "preset name", "preset" },
      { "map", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map}, "set input stream mapping", "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
 +    { "map_channel", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)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]" },
      { "map_chapters",  OPT_INT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(chapters_input_file)},  "set chapters mapping", "input_file_index" },
      { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(start_time)}, "set the start time offset", "time_off" },
      { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(input_ts_offset)}, "set the input ts offset", "time_off" },
      { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(ts_scale)}, "set the input ts scale", "scale" },
 +    { "timestamp", HAS_ARG | OPT_FUNC2, {(void*)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_FUNC2, {(void*)opt_data_frames}, "set the number of data frames to record", "number" },
      { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
        "add timings for benchmarking" },
 +    { "benchmark_all", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark_all},
 +      "add timings for each task" },
      { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
      { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
        "dump each input packet" },
      { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
      { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
      { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)&copy_ts}, "copy timestamps" },
 -    { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)&copy_tb}, "copy input stream time base when stream copying" },
 +    { "copytb", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&copy_tb}, "copy input stream time base when stream copying", "mode" },
      { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
      { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
 +    { "dts_error_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_error_threshold}, "timestamp error delta threshold", "threshold" },
      { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
      { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC, {.off = OFFSET(copy_initial_nonkeyframes)}, "copy initial non-keyframes" },
      { "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, {.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)}, "use fixed quality scale (VBR)", "q" },
 +    { "qscale", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_qscale}, "use fixed quality scale (VBR)", "q" },
 +    { "profile", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_profile}, "set profile", "profile" },
      { "filter", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(filters)}, "set stream filterchain", "filter_list" },
      { "filter_complex", HAS_ARG | OPT_EXPERT, {(void*)opt_filter_complex}, "create a complex filtergraph", "graph_description" },
      { "stats", OPT_BOOL, {&print_stats}, "print progress report during encoding", },
      { "attach", HAS_ARG | OPT_FUNC2, {(void*)opt_attach}, "add an attachment to the output file", "filename" },
      { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(dump_attachment)}, "extract an attachment into a file", "filename" },
 -    { "cpuflags", HAS_ARG | OPT_EXPERT, {(void*)opt_cpuflags}, "set CPU flags mask", "mask" },
 +    { "debug_ts", OPT_BOOL | OPT_EXPERT, {&debug_ts}, "print timestamp debugging info" },
  
      /* video options */
      { "vframes", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_frames}, "set the number of video frames to record", "number" },
      { "s", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_sizes)}, "set frame size (WxH or abbreviation)", "size" },
      { "aspect", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_aspect_ratios)}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
      { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_pix_fmts)}, "set pixel format", "format" },
 +    { "bits_per_raw_sample", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&frame_bits_per_raw_sample}, "set the number of bits per raw sample", "number" },
 +    { "croptop",  HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
 +    { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
 +    { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
 +    { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
 +    { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
 +    { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
 +    { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
 +    { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
 +    { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
 +    { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "deprecated use -g 1"},
      { "vn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(video_disable)}, "disable video" },
      { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
      { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(rc_overrides)}, "rate control override for specific intervals", "override" },
      { "vcodec", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
 +    { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant}, "use same quantizer as source (implies VBR)" },
      { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
        "use same quantizer as source (implies VBR)" },
      { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
 -    { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
 +    { "passlogfile", HAS_ARG | OPT_VIDEO, {(void*)&opt_passlogfile}, "select two pass log file name prefix", "prefix" },
      { "deinterlace", OPT_EXPERT | OPT_VIDEO, {(void*)opt_deinterlace},
        "this option is deprecated, use the yadif filter instead" },
 +    { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
      { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
      { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
      { "vf", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_filters}, "video filters", "filter list" },
      { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(inter_matrices)}, "specify inter matrix coeffs", "matrix" },
      { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_INT| OPT_SPEC, {.off = OFFSET(top_field_first)}, "top=1/bottom=0/auto=-1 field first", "" },
      { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
 -    { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
 +    { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_FUNC2, {(void*)opt_old2new}, "force video tag/fourcc", "fourcc/tag" },
      { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
      { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO | OPT_SPEC, {.off = OFFSET(force_fps)}, "force the selected framerate, disable the best supported framerate selection" },
      { "streamid", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
      { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_SPEC, {.off = OFFSET(forced_key_frames)}, "force key frames at specified timestamps", "timestamps" },
 +    { "b", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_bitrate}, "video bitrate (please use -b:v)", "bitrate" },
  
      /* audio options */
      { "aframes", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_frames}, "set the number of audio frames to record", "number" },
      { "ac", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_channels)}, "set number of audio channels", "channels" },
      { "an", OPT_BOOL | OPT_AUDIO | OPT_OFFSET, {.off = OFFSET(audio_disable)}, "disable audio" },
      { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
 -    { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
 +    { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_old2new}, "force audio tag/fourcc", "fourcc/tag" },
      { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
      { "sample_fmt", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_SPEC | OPT_STRING, {.off = OFFSET(sample_fmts)}, "set sample format", "format" },
 +    { "rmvol", HAS_ARG | OPT_AUDIO | OPT_FLOAT | OPT_SPEC, {.off = OFFSET(rematrix_volume)}, "rematrix volume (as factor)", "volume" },
      { "channel_layout", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_channel_layout}, "set channel