]> git.sesse.net Git - ffmpeg/commitdiff
Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Mon, 30 Jul 2012 21:04:28 +0000 (23:04 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Mon, 30 Jul 2012 21:28:31 +0000 (23:28 +0200)
* qatar/master:
  avformat: Drop pointless "format" from container long names
  swscale: bury one more piece of inline asm under HAVE_INLINE_ASM.
  wv: K&R formatting cosmetics
  configure: Add missing descriptions to help output
  h264_ps: declare array of colorspace strings on its own line.
  fate: amix: specify f32 sample format for comparison
  tiny_psnr: support 32-bit float samples
  eamad/eatgq/eatqi: call special EA IDCT directly
  eamad: remove use of MpegEncContext
  mpegvideo: remove unnecessary inclusions of faandct.h
  af_asyncts: avoid overflow in out_size with large delta values
  af_asyncts: add first_pts option

Conflicts:
configure
libavcodec/eamad.c
libavcodec/h264_ps.c
libavformat/crcenc.c
libavformat/ffmdec.c
libavformat/ffmenc.c
libavformat/framecrcenc.c
libavformat/md5enc.c
libavformat/nutdec.c
libavformat/rawenc.c
libavformat/yuv4mpeg.c
tests/tiny_psnr.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
104 files changed:
1  2 
configure
doc/filters.texi
libavcodec/dsputil.c
libavcodec/dsputil.h
libavcodec/eaidct.c
libavcodec/eaidct.h
libavcodec/eamad.c
libavcodec/eatgq.c
libavcodec/eatqi.c
libavcodec/h264_ps.c
libavcodec/mpegvideo.c
libavcodec/mpegvideo_common.h
libavfilter/af_asyncts.c
libavformat/4xm.c
libavformat/amr.c
libavformat/apc.c
libavformat/assdec.c
libavformat/assenc.c
libavformat/avs.c
libavformat/bethsoftvid.c
libavformat/cdg.c
libavformat/cdxl.c
libavformat/crcenc.c
libavformat/daud.c
libavformat/dsicin.c
libavformat/dv.c
libavformat/dvenc.c
libavformat/electronicarts.c
libavformat/ffmdec.c
libavformat/ffmenc.c
libavformat/ffmetadec.c
libavformat/ffmetaenc.c
libavformat/flic.c
libavformat/framecrcenc.c
libavformat/g723_1.c
libavformat/h264dec.c
libavformat/hls.c
libavformat/idcin.c
libavformat/idroqdec.c
libavformat/idroqenc.c
libavformat/ilbc.c
libavformat/ipmovie.c
libavformat/iss.c
libavformat/lmlm4.c
libavformat/lxfdec.c
libavformat/m4vdec.c
libavformat/matroskadec.c
libavformat/matroskaenc.c
libavformat/md5enc.c
libavformat/mm.c
libavformat/movenc.c
libavformat/mpegenc.c
libavformat/mpjpeg.c
libavformat/mtv.c
libavformat/mvi.c
libavformat/mxg.c
libavformat/ncdec.c
libavformat/nullenc.c
libavformat/nutdec.c
libavformat/nutenc.c
libavformat/nuv.c
libavformat/pcmdec.c
libavformat/pcmenc.c
libavformat/pmpdec.c
libavformat/psxstr.c
libavformat/pva.c
libavformat/qcp.c
libavformat/r3d.c
libavformat/rawenc.c
libavformat/rawvideodec.c
libavformat/rl2.c
libavformat/rmdec.c
libavformat/rmenc.c
libavformat/rpl.c
libavformat/rsodec.c
libavformat/rsoenc.c
libavformat/rtpenc.c
libavformat/rtsp.c
libavformat/rtspdec.c
libavformat/rtspenc.c
libavformat/sapdec.c
libavformat/sapenc.c
libavformat/segafilm.c
libavformat/sierravmd.c
libavformat/sol.c
libavformat/soxdec.c
libavformat/soxenc.c
libavformat/srtdec.c
libavformat/srtenc.c
libavformat/tiertexseq.c
libavformat/vc1test.c
libavformat/vocdec.c
libavformat/vocenc.c
libavformat/wav.c
libavformat/wc3movie.c
libavformat/westwood_aud.c
libavformat/westwood_vqa.c
libavformat/wv.c
libavformat/xa.c
libavformat/yop.c
libavformat/yuv4mpeg.c
libswscale/swscale.c
tests/fate/filter.mak
tests/tiny_psnr.c

diff --combined configure
index 54b2ce24bffea20b3a5d4c5cbcfafa4d704e8974,a39ead7b780ca9c6bfeafb3a000203b759ca3512..6203eca025599740d573c4f16a5d05ec89085aa6
+++ 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,31 -101,30 +101,33 @@@ 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-avfilter       disable video filter support [no]
 -  --disable-avresample     disable libavresample build [no]
 +  --disable-postproc       disable libpostproc build
 +  --disable-avfilter       disable libavfilter build
 +  --enable-avresample      enable libavresample build [no]
    --disable-pthreads       disable pthreads [auto]
    --disable-w32threads     disable Win32 threads [auto]
 +  --disable-os2threads     disable OS/2 threads [auto]
    --enable-x11grab         enable X11 grabbing [no]
    --disable-network        disable network support [no]
    --disable-dct            disable DCT code
+   --disable-dwt            disable DWT code
+   --disable-lsp            disable LSP code
    --disable-mdct           disable MDCT code
    --disable-rdft           disable RDFT code
    --disable-fft            disable FFT code
    --enable-dxva2           enable DXVA2 code
 -  --enable-vaapi           enable VAAPI code
 -  --enable-vda             enable VDA code
 -  --enable-vdpau           enable VDPAU code
 +  --enable-vaapi           enable VAAPI code [autodetect]
 +  --enable-vda             enable VDA code   [autodetect]
 +  --enable-vdpau           enable VDPAU code [autodetect]
  
  Individual component options:
    --disable-everything     disable all components listed below
  External library support:
    --enable-avisynth        enable reading of AVISynth script files [no]
    --enable-bzlib           enable bzlib [autodetect]
 +  --enable-fontconfig      enable fontconfig
    --enable-frei0r          enable frei0r video filtering
    --enable-gnutls          enable gnutls [no]
 +  --enable-libaacplus      enable AAC+ encoding via libaacplus [no]
 +  --enable-libass          enable libass subtitles rendering [no]
 +  --enable-libbluray       enable BluRay reading using libbluray [no]
 +  --enable-libcaca         enable textual display using libcaca
 +  --enable-libcelt         enable CELT decoding via libcelt [no]
    --enable-libcdio         enable audio CD grabbing with libcdio
    --enable-libdc1394       enable IIDC-1394 grabbing using libdc1394
                             and libraw1394 [no]
    --enable-libfaac         enable AAC encoding via libfaac [no]
    --enable-libfdk-aac      enable AAC encoding via libfdk-aac [no]
 +  --enable-libflite        enable flite (voice synthesis) support via libflite [no]
    --enable-libfreetype     enable libfreetype [no]
    --enable-libgsm          enable GSM de/encoding via libgsm [no]
 +  --enable-libiec61883     enable iec61883 via libiec61883 [no]
    --enable-libilbc         enable iLBC de/encoding via libilbc [no]
 +  --enable-libmodplug      enable ModPlug via libmodplug [no]
    --enable-libmp3lame      enable MP3 encoding via libmp3lame [no]
 +  --enable-libnut          enable NUT (de)muxing via libnut,
 +                           native (de)muxer exists [no]
    --enable-libopencore-amrnb enable AMR-NB de/encoding via libopencore-amrnb [no]
    --enable-libopencore-amrwb enable AMR-WB decoding via libopencore-amrwb [no]
    --enable-libopencv       enable video filtering via libopencv [no]
    --enable-libopenjpeg     enable JPEG 2000 de/encoding via OpenJPEG [no]
 +  --enable-libopus         enable Opus decoding via libopus [no]
    --enable-libpulse        enable Pulseaudio input via libpulse [no]
    --enable-librtmp         enable RTMP[E] support via librtmp [no]
    --enable-libschroedinger enable Dirac de/encoding via libschroedinger [no]
    --enable-libspeex        enable Speex de/encoding via libspeex [no]
 +  --enable-libstagefright-h264  enable H.264 decoding via libstagefright [no]
    --enable-libtheora       enable Theora encoding via libtheora [no]
 +  --enable-libutvideo      enable Ut Video encoding and decoding via libutvideo [no]
 +  --enable-libv4l2         enable libv4l2/v4l-utils [no]
    --enable-libvo-aacenc    enable AAC encoding via libvo-aacenc [no]
    --enable-libvo-amrwbenc  enable AMR-WB encoding via libvo-amrwbenc [no]
 -  --enable-libvorbis       enable Vorbis encoding via libvorbis [no]
 +  --enable-libvorbis       enable Vorbis en/decoding via libvorbis,
 +                           native implementation exists [no]
    --enable-libvpx          enable VP8 de/encoding via libvpx [no]
    --enable-libx264         enable H.264 encoding via x264 [no]
    --enable-libxavs         enable AVS encoding via xavs [no]
    --enable-libxvid         enable Xvid encoding via xvidcore,
                             native MPEG-4/Xvid encoder exists [no]
 +  --enable-openal          enable OpenAL 1.1 capture support [no]
    --enable-openssl         enable openssl [no]
    --enable-zlib            enable zlib [autodetect]
  
@@@ -223,31 -205,30 +225,34 @@@ 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]
+   --dep-cc=DEPCC           use dependency generator DEPCC [$cc_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
+   --host-os=OS             compiler host OS [$target_os]
    --extra-cflags=ECFLAGS   add ECFLAGS to CFLAGS [$CFLAGS]
 +  --extra-cxxflags=ECFLAGS add ECFLAGS to CXXFLAGS [$CXXFLAGS]
    --extra-ldflags=ELDFLAGS add ELDFLAGS to LDFLAGS [$LDFLAGS]
    --extra-libs=ELIBS       add ELIBS [$ELIBS]
    --extra-version=STRING   version string suffix []
-   --optflags               override optimization-related compiler flags
+   --optflags=OPTFLAGS      override optimization-related compiler flags
    --build-suffix=SUFFIX    library name suffix []
    --malloc-prefix=PREFIX   prefix malloc and related names with PREFIX
 +  --progs-suffix=SUFFIX    program name suffix []
    --arch=ARCH              select architecture [$arch]
    --cpu=CPU                select the minimum required CPU (affects
                             instruction selection, may crash on older CPUs)
    --enable-pic             build position-independent code
    --enable-sram            allow use of on-chip SRAM
+   --enable-thumb           compile for Thumb instruction set
    --disable-symver         disable symbol versioning
    --disable-fastdiv        disable table-based division
    --enable-hardcoded-tables use hardcoded tables instead of runtime generation
@@@ -275,39 -256,16 +280,39 @@@ Optimization options (experts only)
    --disable-neon           disable NEON optimizations
    --disable-vis            disable VIS optimizations
    --disable-yasm           disable use of yasm assembler
 -
 -Developer options (useful when working on Libav itself):
 +  --disable-mips32r2       disable MIPS32R2 optimizations
 +  --disable-mipsdspr1      disable MIPS DSP ASE R1 optimizations
 +  --disable-mipsdspr2      disable MIPS DSP ASE R2 optimizations
 +  --disable-mipsfpu        disable floating point MIPS optimizations
 +  --disable-fast-unaligned consider unaligned accesses slow
 +  --postproc-version=V     build libpostproc version V.
 +                           Where V can be '$ALT_PP_VER_MAJOR.$ALT_PP_VER_MINOR.$ALT_PP_VER_MICRO' or 'current'. [$postproc_version_default]
 +
 +Developer options (useful when working on FFmpeg itself):
 +  --enable-coverage        build with test coverage instrumentation
    --disable-debug          disable debugging symbols
    --enable-debug=LEVEL     set the debug level [$debuglevel]
    --disable-optimizations  disable compiler optimizations
    --enable-extra-warnings  enable more compiler warnings
 +  --disable-stripping      disable stripping of executables and shared libraries
 +  --assert-level=level     0(default), 1 or 2, amount of assertion testing,
 +                           2 causes a slowdown at runtime.
 +  --enable-memory-poisoning fill heap uninitialized allocated space with arbitrary data
 +  --valgrind=VALGRIND      run "make fate" tests through valgrind to detect memory
 +                           leaks and errors, using the specified valgrind binary.
 +                           Cannot be combined with --target-exec
    --samples=PATH           location of test samples for FATE, if not set use
 -                           \$LIBAV_SAMPLES at make invocation time.
 +                           \$FATE_SAMPLES at make invocation time.
    --enable-xmm-clobber-test check XMM registers for clobbering (Win64-only;
                             should be used only for debugging purposes)
 +  --enable-random          randomly enable/disable components
 +  --disable-random
 +  --enable-random=LIST     randomly enable/disable specific components or
 +  --disable-random=LIST    component groups. LIST is a comma-separated list
 +                           of NAME[:PROB] entries where NAME is a component
 +                           (group) and PROB the probability associated with
 +                           NAME (default 0.5).
 +  --random-seed=VALUE      seed value for --enable/disable-random
  
  NOTE: Object files are built at the place where configure is launched.
  EOF
@@@ -342,7 -300,7 +347,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
@@@ -640,10 -598,6 +645,10 @@@ add_cflags()
      append CFLAGS $($cflags_filter "$@")
  }
  
 +add_cxxflags(){
 +    append CXXFLAGS $($cflags_filter "$@")
 +}
 +
  add_asflags(){
      append ASFLAGS $($asflags_filter "$@")
  }
@@@ -684,13 -638,6 +689,13 @@@ check_cc()
      check_cmd $cc $CPPFLAGS $CFLAGS "$@" $CC_C $(cc_o $TMPO) $TMPC
  }
  
 +check_cxx(){
 +    log check_cxx "$@"
 +    cat > $TMPCPP
 +    log_file $TMPCPP
 +    check_cmd $cxx $CPPFLAGS $CFLAGS $CXXFLAGS "$@" $CXX_C -o $TMPO $TMPCPP
 +}
 +
  check_cpp(){
      log check_cpp "$@"
      cat > $TMPC
@@@ -726,14 -673,12 +731,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 $($cflags_filter $flags) || return
 +    check_$type $($cflags_filter $flags) || return
      flags=$($ldflags_filter $flags)
      libs=$($ldflags_filter $libs)
      check_cmd $ld $LDFLAGS $flags -o $TMPE $TMPO $libs $extralibs
@@@ -768,17 -713,9 +773,17 @@@ int x
  EOF
  }
  
 +check_cxxflags(){
 +    log check_cxxflags "$@"
 +    set -- $($cflags_filter "$@")
 +    check_cxx "$@" <<EOF && append CXXFLAGS "$@"
 +int x;
 +EOF
 +}
 +
  test_ldflags(){
      log test_ldflags "$@"
 -    check_ld "$@" <<EOF
 +    check_ld "cc" "$@" <<EOF
  int main(void){ return 0; }
  EOF
  }
@@@ -804,7 -741,7 +809,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
@@@ -815,10 -752,10 +820,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
  }
  
@@@ -835,26 -772,7 +840,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(){
@@@ -886,21 -804,13 +891,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
  }
@@@ -978,14 -884,6 +983,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"
@@@ -1038,10 -936,10 +1043,10 @@@ COMPONENT_LIST=
  "
  
  PROGRAM_LIST="
 -    avconv
 -    avplay
 -    avprobe
 -    avserver
 +    ffplay
 +    ffprobe
 +    ffserver
 +    ffmpeg
  "
  
  CONFIG_LIST="
      avresample
      avisynth
      bzlib
 +    crystalhd
      dct
      doc
      dwt
      dxva2
 +    fast_unaligned
      fastdiv
      fft
 +    fontconfig
      frei0r
      gnutls
      gpl
      gray
      hardcoded_tables
 +    libaacplus
 +    libass
 +    libbluray
 +    libcaca
      libcdio
 +    libcelt
      libdc1394
      libfaac
      libfdk_aac
 +    libflite
      libfreetype
      libgsm
 +    libiec61883
      libilbc
 +    libmodplug
      libmp3lame
 +    libnut
      libopencore_amrnb
      libopencore_amrwb
      libopencv
      libopenjpeg
 +    libopus
      libpulse
      librtmp
      libschroedinger
      libspeex
 +    libstagefright_h264
      libtheora
 +    libutvideo
 +    libv4l2
      libvo_aacenc
      libvo_amrwbenc
      libvorbis
      lsp
      mdct
      memalign_hack
 +    memory_poisoning
      network
      nonfree
 +    openal
      openssl
      pic
 +    postproc
      rdft
      runtime_cpudetect
      safe_bitstream_reader
      small
      sram
      static
 +    swresample
      swscale
      swscale_alpha
      thumb
  THREADS_LIST='
      pthreads
      w32threads
 +    os2threads
  '
  
  ARCH_LIST='
@@@ -1184,10 -1061,6 +1189,10 @@@ ARCH_EXT_LIST=
      ssse3
      vfpv3
      vis
 +    mipsfpu
 +    mips32r2
 +    mipsdspr1
 +    mipsdspr2
  '
  
  HAVE_LIST_PUB='
@@@ -1205,11 -1078,9 +1210,11 @@@ HAVE_LIST=
      altivec_h
      arpa_inet_h
      asm_mod_y
 +    asm_types_h
      attribute_may_alias
      attribute_packed
      cbrtf
 +    clock_gettime
      closesocket
      cmov
      cpuid
      GetSystemTimeAsFileTime
      getrusage
      gettimeofday
 +    glob
      gnu_as
      ibm_asm
      inet_aton
      inline_asm
 -    io_h
      isatty
      isinf
      isnan
      jack_port_get_latency_range
 +    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
      mmap
      nanosleep
      netinet_sctp_h
 +    PeekNamedPipe
 +    pod2man
      poll_h
      posix_memalign
 +    pthread_cancel
      rdtsc
      rint
      round
      soundcard_h
      strerror_r
      strptime
 -    strtok_r
      struct_addrinfo
      struct_group_source_req
      struct_ip_mreq_source
      sys_soundcard_h
      sys_time_h
      sys_videoio_h
 +    termios_h
 +    texi2html
      threads
      trunc
      truncf
@@@ -1363,13 -1227,11 +1368,13 @@@ CMDLINE_SELECT=
      $CONFIG_LIST
      $THREADS_LIST
      asm
 +    coverage
      cross_compile
      debug
      extra_warnings
      logging
      optimizations
 +    stripping
      symver
      yasm
  "
@@@ -1389,12 -1251,10 +1394,12 @@@ CMDLINE_SET=
      ar
      arch
      as
 +    assert_level
      build_suffix
      cc
      cpu
      cross_prefix
 +    cxx
      dep_cc
      extra_version
      host_cc
      host_ldflags
      host_libs
      host_os
 +    install
      ld
      logfile
      malloc_prefix
      nm
      optflags
      pkg_config
 +    postproc_version
 +    progs_suffix
 +    random_seed
      samples
 +    strip
      sysinclude
      sysroot
      target_exec
      target_os
      target_path
 +    valgrind
 +    yasmexe
  "
  
  CMDLINE_APPEND="
      extra_cflags
 +    extra_cxxflags
  "
  
  # code dependency declarations
@@@ -1439,10 -1291,6 +1444,10 @@@ armvfp_deps="arm
  neon_deps="arm"
  vfpv3_deps="armvfp"
  
 +mipsfpu_deps="mips"
 +mips32r2_deps="mips"
 +mipsdspr1_deps="mips"
 +mipsdspr2_deps="mips"
  mmi_deps="mips"
  
  altivec_deps="ppc"
@@@ -1486,7 -1334,6 +1491,7 @@@ ac3_fixed_encoder_select="mdct ac3dsp
  alac_encoder_select="lpc"
  amrnb_decoder_select="lsp"
  amrwb_decoder_select="lsp"
 +amv_encoder_select="aandcttables"
  atrac1_decoder_select="mdct sinewin"
  atrac3_decoder_select="mdct"
  binkaudio_dct_decoder_select="mdct rdft dct sinewin"
@@@ -1495,7 -1342,6 +1500,7 @@@ cavs_decoder_select="golomb
  cook_decoder_select="mdct sinewin"
  cscd_decoder_suggest="zlib"
  dca_decoder_select="mdct"
 +dirac_decoder_select="dwt golomb"
  dnxhd_encoder_select="aandcttables"
  dxa_decoder_select="zlib"
  eac3_decoder_select="ac3_decoder"
@@@ -1503,13 -1349,11 +1508,13 @@@ eac3_encoder_select="mdct ac3dsp
  eamad_decoder_select="aandcttables"
  eatgq_decoder_select="aandcttables"
  eatqi_decoder_select="aandcttables"
 +exr_decoder_select="zlib"
  ffv1_decoder_select="golomb"
  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"
@@@ -1520,12 -1364,10 +1525,12 @@@ h263_encoder_select="aandcttables
  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"
  iac_decoder_select="fft mdct sinewin"
@@@ -1552,20 -1394,15 +1557,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="aandcttables"
 +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="aandcttables"
 +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"
@@@ -1590,18 -1427,15 +1595,18 @@@ shorten_decoder_select="golomb
  sipr_decoder_select="lsp"
  snow_decoder_select="dwt"
  snow_encoder_select="aandcttables dwt"
 +sonic_decoder_select="golomb"
 +sonic_encoder_select="golomb"
 +sonic_ls_encoder_select="golomb"
  svq1_encoder_select="aandcttables"
  svq3_decoder_select="golomb h264chroma h264dsp h264pred h264qpel"
  svq3_decoder_suggest="zlib"
  theora_decoder_select="vp3_decoder"
  tiff_decoder_suggest="zlib"
  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"
@@@ -1627,7 -1461,6 +1632,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"
@@@ -1638,7 -1471,6 +1643,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"
  libfdk_aac_encoder_deps="libfdk_aac"
  libgsm_decoder_deps="libgsm"
@@@ -1657,32 -1487,25 +1662,32 @@@ libgsm_ms_decoder_deps="libgsm
  libgsm_ms_encoder_deps="libgsm"
  libilbc_decoder_deps="libilbc"
  libilbc_encoder_deps="libilbc"
 +libmodplug_demuxer_deps="libmodplug"
  libmp3lame_encoder_deps="libmp3lame"
  libopencore_amrnb_decoder_deps="libopencore_amrnb"
  libopencore_amrnb_encoder_deps="libopencore_amrnb"
  libopencore_amrwb_decoder_deps="libopencore_amrwb"
  libopenjpeg_decoder_deps="libopenjpeg"
  libopenjpeg_encoder_deps="libopenjpeg"
 +libopus_decoder_deps="libopus"
  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"
 +libvorbis_decoder_deps="libvorbis"
  libvorbis_encoder_deps="libvorbis"
  libvpx_decoder_deps="libvpx"
  libvpx_encoder_deps="libvpx"
  libx264_encoder_deps="libx264"
 +libx264rgb_encoder_deps="libx264"
  libxavs_encoder_deps="libxavs"
  libxvid_encoder_deps="libxvid"
 +libutvideo_decoder_deps="libutvideo"
 +libutvideo_encoder_deps="libutvideo"
  
  # demuxers / muxers
  ac3_demuxer_select="ac3_parser"
@@@ -1692,8 -1515,6 +1697,8 @@@ dirac_demuxer_select="dirac_parser
  eac3_demuxer_select="ac3_parser"
  flac_demuxer_select="flac_parser"
  ipod_muxer_select="mov_muxer"
 +libnut_demuxer_deps="libnut"
 +libnut_muxer_deps="libnut"
  matroska_audio_muxer_select="matroska_muxer"
  matroska_demuxer_suggest="zlib bzlib"
  mov_demuxer_suggest="zlib"
@@@ -1720,32 -1541,22 +1725,32 @@@ w64_demuxer_deps="wav_demuxer
  alsa_indev_deps="alsa_asoundlib_h snd_pcm_htimestamp"
  alsa_outdev_deps="alsa_asoundlib_h"
  bktr_indev_deps_any="dev_bktr_ioctl_bt848_h machine_ioctl_bt848_h dev_video_bktr_ioctl_bt848_h dev_ic_bt8xx_h"
 +caca_outdev_deps="libcaca"
 +dshow_indev_deps="IBaseFilter"
 +dshow_indev_extralibs="-lpsapi -lole32 -lstrmiids -luuid"
  dv1394_indev_deps="dv1394 dv_demuxer"
  fbdev_indev_deps="linux_fb_h"
 -jack_indev_deps="jack_jack_h"
 +iec61883_indev_deps="libiec61883"
 +jack_indev_deps="jack_jack_h sem_timedwait"
 +lavfi_indev_deps="avfilter"
  libcdio_indev_deps="libcdio"
  libdc1394_indev_deps="libdc1394"
 +libv4l2_indev_deps="libv4l2"
 +openal_indev_deps="openal"
  oss_indev_deps_any="soundcard_h sys_soundcard_h"
  oss_outdev_deps_any="soundcard_h sys_soundcard_h"
  pulse_indev_deps="libpulse"
 +sdl_outdev_deps="sdl"
  sndio_indev_deps="sndio_h"
  sndio_outdev_deps="sndio_h"
 +v4l_indev_deps="linux_videodev_h"
  v4l2_indev_deps_any="linux_videodev2_h sys_videoio_h"
  vfwcap_indev_deps="capCreateCaptureWindow vfwcap_defines"
  vfwcap_indev_extralibs="-lavicap32"
 -x11grab_indev_deps="x11grab XShmCreateImage"
 +x11grab_indev_deps="x11grab"
  
  # protocols
 +bluray_protocol_deps="libbluray"
  ffrtmpcrypt_protocol_deps="!librtmp_protocol"
  ffrtmpcrypt_protocol_deps_any="gcrypt nettle openssl"
  ffrtmpcrypt_protocol_select="tcp_protocol"
@@@ -1780,71 -1591,41 +1785,71 @@@ tls_protocol_select="tcp_protocol
  udp_protocol_deps="network"
  
  # filters
 +aconvert_filter_deps="swresample"
 +amovie_filter_deps="avcodec avformat"
 +aresample_filter_deps="swresample"
 +ass_filter_deps="libass"
 +asyncts_filter_deps="avresample"
 +atempo_filter_deps="avcodec rdft"
  blackframe_filter_deps="gpl"
  boxblur_filter_deps="gpl"
 +colormatrix_filter_deps="gpl"
  cropdetect_filter_deps="gpl"
  delogo_filter_deps="gpl"
 +deshake_filter_deps="avcodec"
  drawtext_filter_deps="libfreetype"
 -frei0r_filter_deps="frei0r dlopen strtok_r"
 +flite_filter_deps="libflite"
 +frei0r_filter_deps="frei0r dlopen"
  frei0r_filter_extralibs='$ldl'
 -frei0r_src_filter_deps="frei0r dlopen strtok_r"
 +frei0r_src_filter_deps="frei0r dlopen"
  frei0r_src_filter_extralibs='$ldl'
  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"
  resample_filter_deps="avresample"
  ocv_filter_deps="libopencv"
 +pan_filter_deps="swresample"
 +removelogo_filter_deps="avcodec avformat swscale"
  scale_filter_deps="swscale"
 +select_filter_deps="avcodec"
 +super2xsai_filter_deps="gpl"
 +tinterlace_filter_deps="gpl"
  yadif_filter_deps="gpl"
  
  # libraries
  avdevice_deps="avcodec avformat"
  avformat_deps="avcodec"
 +postproc_deps="gpl"
  
  # programs
 -avconv_deps="avcodec avfilter avformat avresample swscale
 -             aformat_filter asyncts_filter
 -             format_filter fps_filter scale_filter setpts_filter"
 -avplay_deps="avcodec avformat swscale sdl"
 -avplay_select="rdft"
 -avprobe_deps="avcodec avformat"
 -avserver_deps="avformat ffm_muxer fork rtp_protocol rtsp_demuxer !shared"
 -avserver_extralibs='$ldl'
 +ffmpeg_deps="avcodec avfilter avformat swscale swresample"
 +ffmpeg_select="buffersink_filter format_filter aformat_filter
 +               setpts_filter null_filter anull_filter abuffersink_filter"
 +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'
  
 -doc_deps="texi2html"
 +doc_deps_any="texi2html makeinfo pod2man"
  
  # tests
 -
 +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"
  seek_lavf_mxf_d10_test_deps="mxf_d10_test"
 +zlib_test_deps="zlib"
 +zmbv_test_deps="zlib"
  
  test_deps(){
      suf1=$1
@@@ -1871,11 -1652,11 +1876,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                                                                 \
@@@ -1891,26 -1672,22 +1896,26 @@@ logfile="config.log
  # installation paths
  prefix_default="/usr/local"
  bindir_default='${prefix}/bin'
 -datadir_default='${prefix}/share/avconv'
 +datadir_default='${prefix}/share/ffmpeg'
  incdir_default='${prefix}/include'
  libdir_default='${prefix}/lib'
  mandir_default='${prefix}/share/man'
  shlibdir_default="$libdir_default"
 +postproc_version_default="current"
  
  # toolchain
  ar_default="ar"
  cc_default="gcc"
 +cxx_default="g++"
  host_cc_default="gcc"
 +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=":"
@@@ -1923,12 -1700,6 +1928,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
  
@@@ -1936,10 -1707,8 +1941,10 @@@ enable avcode
  enable avdevice
  enable avfilter
  enable avformat
 -enable avresample
  enable avutil
 +enable postproc
 +enable stripping
 +enable swresample
  enable swscale
  
  enable asm
@@@ -1954,7 -1723,7 +1959,7 @@@ enable swscale_alph
  
  # build settings
  SHFLAGS='-shared -Wl,-soname,$$(@F)'
 -AVSERVERLDFLAGS=-Wl,-E
 +FFSERVERLDFLAGS=-Wl,-E
  LIBPREF="lib"
  LIBSUF=".a"
  FULLNAME='$(NAME)$(BUILDSUF)'
@@@ -1977,8 -1746,6 +1982,8 @@@ AS_O='-o $@
  CC_C='-c'
  CC_E='-E -o $@'
  CC_O='-o $@'
 +CXX_C='-c'
 +CXX_O='-o $@'
  LD_O='-o $@'
  HOSTCC_C='-c'
  HOSTCC_O='-o $@'
@@@ -2010,7 -1777,7 +2015,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(){
@@@ -2050,12 -1817,11 +2055,12 @@@ find_tests()
      map "echo ${2}\${v}_test" $(ls "$source_path"/tests/ref/$1 | grep -v '[^-a-z0-9_]')
  }
  
 +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="$LAVF_TESTS $LAVFI_TESTS $SEEK_TESTS"
 +ALL_TESTS="$LAVF_FATE_TESTS $LAVF_TESTS $LAVFI_TESTS $SEEK_TESTS"
  
  for n in $COMPONENT_LIST; do
      v=$(toupper ${n%s})_LIST
@@@ -2078,27 -1844,6 +2083,27 @@@ show_list() 
      exit 0
  }
  
 +rand_list(){
 +    IFS=', '
 +    set -- $*
 +    unset IFS
 +    for thing; do
 +        comp=${thing%:*}
 +        prob=${thing#$comp}
 +        prob=${prob#:}
 +        is_in ${comp} $COMPONENT_LIST && eval comp=\$$(toupper ${comp%s})_LIST
 +        echo "prob ${prob:-0.5}"
 +        printf '%s\n' $comp
 +    done
 +}
 +
 +do_random(){
 +    action=$1
 +    shift
 +    random_seed=$(awk "BEGIN { srand($random_seed); print srand() }")
 +    $action $(rand_list "$@" | awk "BEGIN { srand($random_seed) } \$1 == \"prob\" { prob = \$2; next } rand() < prob { print }")
 +}
 +
  for opt do
      optval="${opt#*=}"
      case "$opt" in
      --disable-everything)
      map 'eval unset \${$(toupper ${v%s})_LIST}' $COMPONENT_LIST
      ;;
 +    --enable-random|--disable-random)
 +    action=${opt%%-random}
 +    do_random ${action#--} $COMPONENT_LIST
 +    ;;
 +    --enable-random=*|--disable-random=*)
 +    action=${opt%%-random=*}
 +    do_random ${action#--} $optval
 +    ;;
      --enable-*=*|--disable-*=*)
      eval $(echo "${opt%%=*}" | sed 's/--/action=/;s/-/ thing=/')
      is_in "${thing}s" $COMPONENT_LIST || die_unknown "$opt"
@@@ -2164,7 -1901,7 +2169,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
@@@ -2174,29 -1911,17 +2179,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
  
@@@ -2239,7 -1964,6 +2244,7 @@@ trap 'rm -f -- $TMPFILES' EXI
  
  tmpfile TMPASM .asm
  tmpfile TMPC   .c
 +tmpfile TMPCPP .cpp
  tmpfile TMPE   $EXESUF
  tmpfile TMPH   .h
  tmpfile TMPO   .o
@@@ -2512,7 -2236,6 +2517,7 @@@ if [ -z "$CC_DEPFLAGS" ] && [ "$dep_cc
  fi
  
  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
@@@ -2706,28 -2433,6 +2711,28 @@@ elif enabled mips; the
  
      cpuflags="-march=$cpu"
  
 +    case $cpu in
 +        24kc)
 +            disable mipsfpu
 +            disable mipsdspr1
 +            disable mipsdspr2
 +        ;;
 +        24kf*)
 +            disable mipsdspr1
 +            disable mipsdspr2
 +        ;;
 +        24kec|34kc|1004kc)
 +            disable mipsfpu
 +            disable mipsdspr2
 +        ;;
 +        24kef*|34kf*|1004kf*)
 +            disable mipsdspr2
 +        ;;
 +        74kc)
 +            disable mipsfpu
 +        ;;
 +    esac
 +
  elif enabled avr32; then
  
      case $cpu in
@@@ -2768,7 -2473,6 +2773,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>
@@@ -2791,11 -2495,6 +2796,11 @@@ case "$arch" i
              spic=$shared
          fi
      ;;
 +    ppc)
 +        check_cc <<EOF && subarch="ppc64"
 +        int test[(int)sizeof(char*) - 7];
 +EOF
 +    ;;
  esac
  
  enable $subarch
@@@ -2809,7 -2508,7 +2814,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"
          oss_indev_extralibs="-lossaudio"
          oss_outdev_extralibs="-lossaudio"
          ;;
 -    openbsd)
 +    openbsd|bitrig)
          # On OpenBSD 4.5. the compiler does not use PIC unless
 -        # explicitly using -fPIC. Libav builds fine without PIC,
 +        # explicitly using -fPIC. FFmpeg builds fine without PIC,
          # however the generated executable will not do anything
          # (simply quits with exit-code 1, no crash, no output).
          # Thus explicitly enable PIC here.
          enable pic
          disable symver
          SHFLAGS='-shared'
 +        SLIBNAME_WITH_MAJOR='$(SLIBNAME).$(LIBVERSION)'
          oss_indev_extralibs="-lossaudio"
          oss_outdev_extralibs="-lossaudio"
          ;;
          ;;
      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
@@@ -2981,7 -2676,7 +2986,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
  
@@@ -3002,21 -2697,15 +3007,21 @@@ die_license_disabled() 
      enabled $1 || { enabled $2 && die "$2 is $1 and --enable-$1 is not specified."; }
  }
  
 +die_license_disabled_gpl() {
 +    enabled $1 || { enabled $2 && die "$2 is incompatible with the gpl and --enable-$1 is not specified."; }
 +}
 +
  die_license_disabled gpl libcdio
 +die_license_disabled gpl libutvideo
  die_license_disabled gpl libx264
  die_license_disabled gpl libxavs
  die_license_disabled gpl libxvid
  die_license_disabled gpl x11grab
  
 +die_license_disabled nonfree libaacplus
  die_license_disabled nonfree libfaac
 -die_license_disabled nonfree libfdk_aac
 -die_license_disabled nonfree openssl
 +enabled gpl && die_license_disabled_gpl nonfree libfdk_aac
 +enabled gpl && die_license_disabled_gpl nonfree openssl
  
  die_license_disabled version3 libopencore_amrnb
  die_license_disabled version3 libopencore_amrwb
@@@ -3080,7 -2769,7 +3085,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
@@@ -3103,15 -2792,6 +3108,15 @@@ elif enabled mips; the
  
      check_asm loongson '"dmult.g $1, $2, $3"'
      enabled mmi     && check_asm mmi     '"lq $2, 0($2)"'
 +    enabled mips32r2  && add_cflags "-mips32r2" &&
 +     check_asm mips32r2  '"rotr $t0, $t1, 1"'
 +    enabled mipsdspr1 && add_cflags "-mdsp" && add_asflags "-mdsp" &&
 +     check_asm mipsdspr1 '"addu.qb $t0, $t1, $t2"'
 +    enabled mipsdspr2 && add_cflags "-mdspr2" && add_asflags "-mdspr2" &&
 +     check_asm mipsdspr2 '"absq_s.qb $t0, $t1"'
 +    enabled mipsfpu   && add_cflags "-mhard-float" &&
 +     check_asm mipsfpu   '"madd.d $f0, $f2, $f4, $f6"'
 +
  
  elif enabled ppc; then
  
@@@ -3153,12 -2833,12 +3158,12 @@@ elif enabled sparc; the
  
  elif enabled x86; then
  
 -    check_code ld immintrin.h "__xgetbv(0)" && enable xgetbv
 -    check_code ld intrin.h "int info[4]; __cpuid(info, 0)" && enable cpuid
 -    check_code ld intrin.h "__rdtsc()" && enable rdtsc
 -    check_code ld intrin.h "unsigned int x = __readeflags()" && enable rweflags
 +    check_code ld immintrin.h "__xgetbv(0)" "cc" && enable xgetbv
 +    check_code ld intrin.h "int info[4]; __cpuid(info, 0)" "cc" && enable cpuid
 +    check_code ld intrin.h "__rdtsc()" "cc" && enable rdtsc
 +    check_code ld intrin.h "unsigned int x = __readeflags()" "cc" && enable rweflags
  
 -    check_code ld mmintrin.h "_mm_empty()" && enable mm_empty
 +    check_code ld mmintrin.h "_mm_empty()" "cc" && enable mm_empty
  
      enable local_aligned_8 local_aligned_16
  
  # Solaris has nanosleep in -lrt, OpenSolaris no longer needs that
  check_func nanosleep || { check_func nanosleep -lrt && add_extralibs -lrt; }
  
 +check_func  clock_gettime || { check_func clock_gettime -lrt && add_extralibs -lrt; }
  check_func  fcntl
  check_func  fork
  check_func  gethrtime
@@@ -3287,14 -2966,12 +3292,14 @@@ check_func_headers malloc.h _aligned_ma
  check_func  setrlimit
  check_func  strerror_r
  check_func  strptime
 -check_func  strtok_r
  check_func  sched_getaffinity
  check_func  sysconf
  check_func  sysctl
  check_func  usleep
 +check_func_headers conio.h kbhit
 +check_func_headers windows.h PeekNamedPipe
  check_func_headers io.h setmode
 +check_func_headers lzo/lzo1x.h lzo1x_999_compress
  check_lib2 "windows.h shellapi.h" CommandLineToArgvW -lshell32
  check_lib2 "windows.h psapi.h" GetProcessMemoryInfo -lpsapi
  check_func_headers windows.h GetProcessAffinityMask
@@@ -3303,12 -2980,11 +3308,12 @@@ check_func_headers windows.h GetSystemT
  check_func_headers windows.h MapViewOfFile
  check_func_headers windows.h Sleep
  check_func_headers windows.h VirtualAlloc
 +check_func_headers glob.h glob
  
  check_header dlfcn.h
  check_header dxva.h
 -check_header dxva2api.h
 -check_header io.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
@@@ -3316,32 -2992,22 +3321,32 @@@ check_header sys/param.
  check_header sys/resource.h
  check_header sys/select.h
  check_header sys/time.h
 +check_header termios.h
  check_header unistd.h
  check_header vdpau/vdpau.h
  check_header vdpau/vdpau_x11.h
  check_header windows.h
  check_header X11/extensions/XvMClib.h
 +check_header asm/types.h
  
  disabled  zlib || check_lib   zlib.h      zlibVersion -lz   || disable  zlib
  disabled bzlib || check_lib2 bzlib.h BZ2_bzlibVersion -lbz2 || disable bzlib
  
 +# check for VDA header
 +if ! disabled vda; 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
          :
@@@ -3366,12 -3032,7 +3371,12 @@@ for thread in $THREADS_LIST; d
      fi
  done
  
 +if enabled pthreads; then
 +  check_func pthread_cancel
 +fi
 +
  check_lib math.h sin -lm && LIBM="-lm"
 +disabled crystalhd || check_lib libcrystalhd/libcrystalhd_if.h DtsCrystalHDVersion -lcrystalhd || disable crystalhd
  enabled vaapi && require vaapi va/va.h vaInitialize -lva
  
  check_mathfunc cbrtf
@@@ -3393,60 -3054,36 +3398,60 @@@ 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 libiec61883 && require libiec61883 libiec61883/iec61883.h iec61883_cmp_connect -lraw1394 -lavc1394 -lrom1394 -liec61883
 +enabled libaacplus && require  "libaacplus >= 2.0.0" aacplus.h aacplusEncOpen -laacplus
 +enabled libass     && require_pkg_config libass ass/ass.h ass_library_init
 +enabled libbluray  && require libbluray libbluray/bluray.h bd_open -lbluray
 +enabled 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 libcaca    && require_pkg_config caca caca.h caca_create_canvas
  enabled libfaac    && require2 libfaac "stdint.h faac.h" faacEncGetVersion -lfaac
  enabled libfdk_aac && require  libfdk_aac fdk-aac/aacenc_lib.h aacEncOpen -lfdk-aac
 +flite_libs="-lflite_cmu_time_awb -lflite_cmu_us_awb -lflite_cmu_us_kal -lflite_cmu_us_kal16 -lflite_cmu_us_rms -lflite_cmu_us_slt -lflite_usenglish -lflite_cmulex -lflite"
 +enabled libflite   && require2 libflite "flite/flite.h" flite_init $flite_libs
  enabled libfreetype && require_pkg_config freetype2 "ft2build.h freetype/freetype.h" FT_Init_FreeType
  enabled libgsm     && require  libgsm gsm/gsm.h gsm_create -lgsm
  enabled libilbc    && require  libilbc ilbc.h WebRtcIlbcfix_InitDecode -lilbc
 +enabled libmodplug && require  libmodplug libmodplug/modplug.h ModPlug_Load -lmodplug
  enabled libmp3lame && require  "libmp3lame >= 3.98.3" lame/lame.h lame_set_VBR_quality -lmp3lame
 +enabled libnut     && require  libnut libnut.h nut_demuxer_init -lnut
  enabled libopencore_amrnb  && require libopencore_amrnb opencore-amrnb/interf_dec.h Decoder_Interface_init -lopencore-amrnb
  enabled libopencore_amrwb  && require libopencore_amrwb opencore-amrwb/dec_if.h D_IF_init -lopencore-amrwb
 -enabled libopencv  && require_pkg_config opencv opencv/cv.h cvCreateImageHeader
 +enabled libopencv  && require_pkg_config opencv opencv/cxcore.h cvCreateImageHeader
  enabled libopenjpeg && require libopenjpeg openjpeg.h opj_version -lopenjpeg
 +enabled libopus    && require_pkg_config opus opus_multistream.h opus_multistream_decoder_create
  enabled libpulse && require_pkg_config libpulse-simple pulse/simple.h pa_simple_new
  enabled librtmp    && require_pkg_config librtmp librtmp/rtmp.h RTMP_Socket
  enabled libschroedinger && require_pkg_config schroedinger-1.0 schroedinger/schro.h schro_init
  enabled libspeex   && require  libspeex speex/speex.h speex_decoder_init -lspeex
 +enabled libstagefright_h264  && require_cpp libstagefright_h264 "binder/ProcessState.h media/stagefright/MetaData.h
 +    media/stagefright/MediaBufferGroup.h media/stagefright/MediaDebug.h media/stagefright/MediaDefs.h
 +    media/stagefright/OMXClient.h media/stagefright/OMXCodec.h" android::OMXClient -lstagefright -lmedia -lutils -lbinder -lgnustl_static
  enabled libtheora  && require  libtheora theora/theoraenc.h th_info_init -ltheoraenc -ltheoradec -logg
 +enabled 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 VP8E_SET_MAX_INTRA_BITRATE_PCT" -lvpx ||
 +                                die "ERROR: libvpx encoder version must be >=0.9.7"; } }
  enabled libx264    && require  libx264 x264.h x264_encoder_encode -lx264 &&
                        { check_cpp_condition x264.h "X264_BUILD >= 118" ||
                          die "ERROR: libx264 version must be >= 0.118."; }
  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 ||
@@@ -3466,29 -3103,15 +3471,29 @@@ if enabled libdc1394; the
      die "ERROR: No version of libdc1394 found "
  fi
  
 +SDL_CONFIG="${cross_prefix}sdl-config"
  if check_pkg_config sdl SDL_events.h SDL_PollEvent; then
      check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) >= 0x010201" $sdl_cflags &&
      enable sdl &&
      check_struct SDL.h SDL_VideoInfo current_w $sdl_cflags && enable sdl_video_size
 +else
 +  if "${SDL_CONFIG}" --version > /dev/null 2>&1; then
 +    sdl_cflags=$("${SDL_CONFIG}" --cflags)
 +    sdl_libs=$("${SDL_CONFIG}" --libs)
 +    check_func_headers SDL_version.h SDL_Linked_Version $sdl_cflags $sdl_libs &&
 +    check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) >= 0x010201" $sdl_cflags &&
 +    enable sdl &&
 +    check_struct SDL.h SDL_VideoInfo current_w $sdl_cflags && enable sdl_video_size
 +  fi
  fi
 +enabled sdl && add_cflags $sdl_cflags && add_extralibs $sdl_libs
  
 -texi2html -version > /dev/null 2>&1 && enable texi2html || disable texi2html
 +texi2html --help 2> /dev/null | grep -q 'init-file' && enable texi2html || disable texi2html
 +makeinfo --version > /dev/null 2>&1 && enable makeinfo  || disable makeinfo
 +pod2man --help > /dev/null 2>&1 && enable pod2man || disable pod2man
  
  check_header linux/fb.h
 +check_header linux/videodev.h
  check_header linux/videodev2.h
  check_struct linux/videodev2.h "struct v4l2_frmivalenum" discrete
  
@@@ -3499,8 -3122,6 +3504,8 @@@ check_func_headers "windows.h vfw.h" ca
  # w32api 3.12 had it defined wrong
  check_cpp_condition vfw.h "WM_CAP_DRIVER_CONNECT > WM_USER" && enable vfwcap_defines
  
 +check_type "dshow.h" IBaseFilter
 +
  # check for ioctl_meteor.h, ioctl_bt848.h and alternatives
  { check_header dev/bktr/ioctl_meteor.h &&
    check_header dev/bktr/ioctl_bt848.h; } ||
  check_header dev/ic/bt8xx.h
  
  check_header sndio.h
 -check_header sys/soundcard.h
 +if check_struct sys/soundcard.h audio_buf_info bytes; then
 +    enable_safe sys/soundcard.h
 +else
 +    check_cc -D__BSD_VISIBLE -D__XSI_VISIBLE <<EOF && add_cppflags -D__BSD_VISIBLE -D__XSI_VISIBLE && enable_safe sys/soundcard.h
 +    #include <sys/soundcard.h>
 +    audio_buf_info abc;
 +EOF
 +fi
  check_header soundcard.h
  
  enabled_any alsa_indev alsa_outdev && check_lib2 alsa/asoundlib.h snd_pcm_htimestamp -lasound
  
 -enabled jack_indev && check_lib2 jack/jack.h jack_client_open -ljack &&
 +enabled jack_indev && check_lib2 jack/jack.h jack_client_open -ljack && check_func sem_timedwait &&
      check_func jack_port_get_latency_range -ljack
  
  enabled_any sndio_indev sndio_outdev && check_lib2 sndio.h sio_open -lsndio
@@@ -3536,11 -3150,9 +3541,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
@@@ -3551,8 -3163,6 +3556,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
@@@ -3564,17 -3174,17 +3569,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
@@@ -3653,6 -3259,7 +3658,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
@@@ -3682,41 -3289,9 +3687,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 aligned_malloc &&
      enabled_any $need_memalign && enable memalign_hack
  
 +# add_dep lib dep
 +# -> enable ${lib}_deps_${dep}
 +# -> add $dep to ${lib}_deps only once
 +add_dep() {
 +    lib=$1
 +    dep=$2
 +    enabled "${lib}_deps_${dep}" && return 0
 +    enable  "${lib}_deps_${dep}"
 +    prepend "${lib}_deps" $dep
 +}
 +
 +# merge deps lib components
 +# merge all ${component}_deps into ${lib}_deps and ${lib}_deps_*
 +merge_deps() {
 +    lib=$1
 +    shift
 +    for comp in $*; do
 +        enabled $comp || continue
 +        eval "dep=\"\$${comp}_deps\""
 +        for d in $dep; do
 +            add_dep $lib $d
 +        done
 +    done
 +}
 +
 +merge_deps libavfilter $FILTER_LIST
 +
  echo "install prefix            $prefix"
  echo "source path               $source_path"
  echo "C compiler                $cc"
@@@ -3724,9 -3299,6 +3729,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
@@@ -3756,10 -3328,6 +3761,10 @@@ if enabled arm; the
  fi
  if enabled mips; then
      echo "MMI enabled               ${mmi-no}"
 +    echo "MIPS FPU enabled          ${mipsfpu-no}"
 +    echo "MIPS32R2 enabled          ${mips32r2-no}"
 +    echo "MIPS DSP R1 enabled       ${mipsdspr1-no}"
 +    echo "MIPS DSP R2 enabled       ${mipsdspr2-no}"
  fi
  if enabled ppc; then
      echo "AltiVec enabled           ${altivec-no}"
@@@ -3770,12 -3338,10 +3775,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}"
@@@ -3787,33 -3353,22 +3792,33 @@@ echo "libvdpau enabled          ${vdpau
  echo "AVISynth enabled          ${avisynth-no}"
  echo "frei0r enabled            ${frei0r-no}"
  echo "gnutls enabled            ${gnutls-no}"
 +echo "libaacplus enabled        ${libaacplus-no}"
 +echo "libass enabled            ${libass-no}"
 +echo "libcaca enabled           ${libcaca-no}"
  echo "libcdio support           ${libcdio-no}"
 +echo "libcelt enabled           ${libcelt-no}"
  echo "libdc1394 support         ${libdc1394-no}"
  echo "libfaac enabled           ${libfaac-no}"
  echo "libfdk-aac enabled        ${libfdk_aac-no}"
  echo "libgsm enabled            ${libgsm-no}"
 +echo "libiec61883 support       ${libiec61883-no}"
  echo "libilbc enabled           ${libilbc-no}"
 +echo "libmodplug enabled        ${libmodplug-no}"
  echo "libmp3lame enabled        ${libmp3lame-no}"
 +echo "libnut enabled            ${libnut-no}"
  echo "libopencore-amrnb support ${libopencore_amrnb-no}"
  echo "libopencore-amrwb support ${libopencore_amrwb-no}"
  echo "libopencv support         ${libopencv-no}"
  echo "libopenjpeg enabled       ${libopenjpeg-no}"
 +echo "libopus enabled           ${libopus-no}"
  echo "libpulse enabled          ${libpulse-no}"
  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}"
@@@ -3821,15 -3376,9 +3826,15 @@@ echo "libvpx enabled            ${libvp
  echo "libx264 enabled           ${libx264-no}"
  echo "libxavs enabled           ${libxavs-no}"
  echo "libxvid enabled           ${libxvid-no}"
 +echo "openal enabled            ${openal-no}"
  echo "openssl enabled           ${openssl-no}"
  echo "zlib enabled              ${zlib-no}"
  echo "bzlib enabled             ${bzlib-no}"
 +echo "texi2html enabled         ${texi2html-no}"
 +echo "pod2man enabled           ${pod2man-no}"
 +echo "makeinfo enabled          ${makeinfo-no}"
 +test -n "$random_seed" &&
 +    echo "random seed               ${random_seed}"
  echo
  
  for type in decoder encoder hwaccel parser demuxer muxer protocol filter bsf indev outdev; do
@@@ -3856,15 -3405,11 +3861,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
@@@ -3873,13 -3418,9 +3878,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
@@@ -3890,26 -3431,21 +3895,26 @@@ YASM=$yasmex
  DEPYASM=$yasmexe
  AR=$ar
  RANLIB=$ranlib
 +CP=cp -p
  LN_S=$ln_s
 +STRIP=$strip
  CPPFLAGS=$CPPFLAGS
  CFLAGS=$CFLAGS
 +CXXFLAGS=$CXXFLAGS
  ASFLAGS=$ASFLAGS
  AS_C=$AS_C
  AS_O=$AS_O
  CC_C=$CC_C
  CC_O=$CC_O
 +CXX_C=$CXX_C
 +CXX_O=$CXX_O
  LD_O=$LD_O
 -DLLTOOL=$dlltool
  LDFLAGS=$LDFLAGS
 -AVSERVERLDFLAGS=$AVSERVERLDFLAGS
 +FFSERVERLDFLAGS=$FFSERVERLDFLAGS
  SHFLAGS=$SHFLAGS
  YASMFLAGS=$YASMFLAGS
  BUILDSUF=$build_suffix
 +PROGSSUF=$progs_suffix
  FULLNAME=$FULLNAME
  LIBPREF=$LIBPREF
  LIBSUF=$LIBSUF
@@@ -3919,7 -3455,6 +3924,7 @@@ SLIBSUF=$SLIBSU
  EXESUF=$EXESUF
  EXTRA_VERSION=$extra_version
  CCDEP=$CCDEP
 +CXXDEP=$CXXDEP
  CCDEP_FLAGS=$CCDEP_FLAGS
  ASDEP=$ASDEP
  ASDEP_FLAGS=$ASDEP_FLAGS
@@@ -3943,7 -3478,7 +3948,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}
@@@ -3954,8 -3489,7 +3959,8 @@@ SLIB_INSTALL_NAME=${SLIB_INSTALL_NAME
  SLIB_INSTALL_LINKS=${SLIB_INSTALL_LINKS}
  SLIB_INSTALL_EXTRA_LIB=${SLIB_INSTALL_EXTRA_LIB}
  SLIB_INSTALL_EXTRA_SHLIB=${SLIB_INSTALL_EXTRA_SHLIB}
 -SAMPLES:=${samples:-\$(LIBAV_SAMPLES)}
 +SAMPLES:=${samples:-\$(FATE_SAMPLES)}
 +NOREDZONE_FLAGS=$noredzone_flags
  EOF
  
  get_version(){
      eval echo "${lcname}_VERSION_MAJOR=\$${name}_VERSION_MAJOR" >> config.mak
  }
  
 +get_version_old(){
 +    name=$1
 +    file=$source_path/$2
 +# This condition will be removed when we stop supporting old libpostproc versions
 +if ! test "$name" = LIBPOSTPROC || test "$postproc_version" = current; then
 +    eval $(grep "#define ${name}_VERSION_M" "$file" | awk '{ print $2"="$3 }')
 +    eval ${name}_VERSION=\$${name}_VERSION_MAJOR.\$${name}_VERSION_MINOR.\$${name}_VERSION_MICRO
 +fi
 +    lcname=$(tolower $name)
 +    eval echo "${lcname}_VERSION=\$${name}_VERSION" >> config.mak
 +    eval echo "${lcname}_VERSION_MAJOR=\$${name}_VERSION_MAJOR" >> config.mak
 +}
 +
 +get_version_old LIBPOSTPROC libpostproc/postprocess.h
 +get_version_old LIBSWRESAMPLE libswresample/swresample.h
 +
  get_version libavcodec
  get_version libavdevice
  get_version libavfilter
@@@ -3994,22 -3512,18 +3999,22 @@@ get_version libswscal
  
  cat > $TMPH <<EOF
  /* Automatically generated by configure - do not modify! */
 -#ifndef LIBAV_CONFIG_H
 -#define LIBAV_CONFIG_H
 -#define LIBAV_CONFIGURATION "$(c_escape $LIBAV_CONFIGURATION)"
 -#define LIBAV_LICENSE "$(c_escape $license)"
 +#ifndef FFMPEG_CONFIG_H
 +#define FFMPEG_CONFIG_H
 +#define FFMPEG_CONFIGURATION "$(c_escape $FFMPEG_CONFIGURATION)"
 +#define FFMPEG_LICENSE "$(c_escape $license)"
 +#define FFMPEG_DATADIR "$(eval c_escape $datadir)"
  #define AVCONV_DATADIR "$(eval c_escape $datadir)"
  #define CC_IDENT "$(c_escape ${cc_ident:-Unknown compiler})"
 -#define restrict $_restrict
 +#define av_restrict $_restrict
  #define EXTERN_PREFIX "${extern_prefix}"
  #define EXTERN_ASM ${extern_prefix}
  #define SLIBSUF "$SLIBSUF"
  EOF
  
 +test -n "$assert_level" &&
 +    echo "#define ASSERT_LEVEL $assert_level" >>$TMPH
 +
  test -n "$malloc_prefix" &&
      echo "#define MALLOC_PREFIX $malloc_prefix" >>$TMPH
  
@@@ -4025,14 -3539,12 +4030,14 @@@ print_config CONFIG_ "$config_files" $C
                                       $ALL_COMPONENTS    \
  
  cat >>config.mak <<EOF
 +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
@@@ -4046,12 -3558,6 +4051,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
@@@ -4087,43 -3593,26 +4092,43 @@@ Libs: -L\${libdir} -l${shortname} $(ena
  Libs.private: $(enabled shared && echo $libs)
  Cflags: -I\${includedir}
  EOF
 -cat <<EOF > $name/$name-uninstalled.pc
 +
 +mkdir -p doc/examples/pc-uninstalled
 +includedir=${source_path}
 +[ "$includedir" = . ] && includedir="\${pcfiledir}/../../.."
 +cat <<EOF > doc/examples/pc-uninstalled/$name.pc
  prefix=
  exec_prefix=
 -libdir=\${pcfiledir}
 -includedir=${source_path}
 +libdir=\${pcfiledir}/../../../$name
 +includedir=${includedir}
  
  Name: $name
  Description: $comment
  Version: $version
  Requires: $requires
  Conflicts:
 -Libs: \${libdir}/${LIBPREF}${shortname}${LIBSUF} $libs
 +Libs: -L\${libdir} -l${shortname} $(enabled shared || echo $libs)
  Cflags: -I\${includedir}
  EOF
  }
  
 -pkgconfig_generate libavutil "Libav utility library" "$LIBAVUTIL_VERSION" "$LIBM"
 -pkgconfig_generate libavcodec "Libav codec library" "$LIBAVCODEC_VERSION" "$extralibs" "libavutil = $LIBAVUTIL_VERSION"
 -pkgconfig_generate libavformat "Libav container format library" "$LIBAVFORMAT_VERSION" "$extralibs" "libavcodec = $LIBAVCODEC_VERSION"
 -pkgconfig_generate libavdevice "Libav device handling library" "$LIBAVDEVICE_VERSION" "$extralibs" "libavformat = $LIBAVFORMAT_VERSION"
 -pkgconfig_generate libavfilter "Libav video filtering library" "$LIBAVFILTER_VERSION" "$extralibs"
 +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
index 73895ebc7fcd5a6768a173100ece76854dddca7d,58a690309aaccb7ebc1cc87893494bf74a6fdaec..cb325be90c96ff0808bb22d15f19fc7830975c84
@@@ -1,88 -1,3 +1,88 @@@
 +@chapter Filtering Introduction
 +@c man begin FILTERING INTRODUCTION
 +
 +Filtering in FFmpeg is enabled through the libavfilter library.
 +
 +Libavfilter is the filtering API of FFmpeg. It is the substitute of
 +the now deprecated 'vhooks' and started as a Google Summer of Code
 +project.
 +
 +Audio filtering integration into the main FFmpeg repository is a work in
 +progress, so audio API and ABI should not be considered stable yet.
 +
 +In libavfilter, it is possible for filters to have multiple inputs and
 +multiple outputs.
 +To illustrate the sorts of things that are possible, we can
 +use a complex filter graph. For example, the following one:
 +
 +@example
 +input --> split --> fifo -----------------------> overlay --> output
 +            |                                        ^
 +            |                                        |
 +            +------> fifo --> crop --> vflip --------+
 +@end example
 +
 +splits the stream in two streams, sends one stream through the crop filter
 +and the vflip filter before merging it back with the other stream by
 +overlaying it on top. You can use the following command to achieve this:
 +
 +@example
 +ffmpeg -i input -vf "[in] split [T1], fifo, [T2] overlay=0:H/2 [out]; [T1] fifo, crop=iw:ih/2:0:ih/2, vflip [T2]" output
 +@end example
 +
 +The result will be that in output the top half of the video is mirrored
 +onto the bottom half.
 +
 +Filters are loaded using the @var{-vf} or @var{-af} option passed to
 +@command{ffmpeg} or to @command{ffplay}. Filters in the same linear
 +chain are separated by commas. In our example, @var{split, fifo,
 +overlay} are in one linear chain, and @var{fifo, crop, vflip} are in
 +another. The points where the linear chains join are labeled by names
 +enclosed in square brackets. In our example, that is @var{[T1]} and
 +@var{[T2]}. The special labels @var{[in]} and @var{[out]} are the points
 +where video is input and output.
 +
 +Some filters take in input a list of parameters: they are specified
 +after the filter name and an equal sign, and are separated from each other
 +by a colon.
 +
 +There exist so-called @var{source filters} that do not have an
 +audio/video input, and @var{sink filters} that will not have audio/video
 +output.
 +
 +@c man end FILTERING INTRODUCTION
 +
 +@chapter graph2dot
 +@c man begin GRAPH2DOT
 +
 +The @file{graph2dot} program included in the FFmpeg @file{tools}
 +directory can be used to parse a filter graph description and issue a
 +corresponding textual representation in the dot language.
 +
 +Invoke the command:
 +@example
 +graph2dot -h
 +@end example
 +
 +to see how to use @file{graph2dot}.
 +
 +You can then pass the dot description to the @file{dot} program (from
 +the graphviz suite of programs) and obtain a graphical representation
 +of the filter graph.
 +
 +For example the sequence of commands:
 +@example
 +echo @var{GRAPH_DESCRIPTION} | \
 +tools/graph2dot -o graph.tmp && \
 +dot -Tpng graph.tmp -o graph.png && \
 +display graph.png
 +@end example
 +
 +can be used to create and display an image representing the graph
 +described by the @var{GRAPH_DESCRIPTION} string.
 +
 +@c man end GRAPH2DOT
 +
  @chapter Filtergraph description
  @c man begin FILTERGRAPH DESCRIPTION
  
@@@ -104,7 -19,7 +104,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}.
  
@@@ -185,46 -100,13 +185,46 @@@ 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
@@@ -251,65 -133,13 +251,65 @@@ For example to force the output to eith
  aformat=sample_fmts\=u8\,s16:channel_layouts\=stereo
  @end example
  
 +@section amerge
 +
 +Merge two or more audio streams into a single multi-channel stream.
 +
 +The filter accepts the following named options:
 +
 +@table @option
 +
 +@item inputs
 +Set the number of inputs. Default is 2.
 +
 +@end table
 +
 +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.
 +
 +All inputs must have the same sample rate, and format.
 +
 +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
 +
 +Example: multiple merges:
 +@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][a2][a3][a4][a5] amerge=inputs=6" -c:a pcm_s16le output.mkv
 +@end example
 +
  @section amix
  
  Mixes multiple audio inputs into a single output.
  
  For example
  @example
 -avconv -i INPUT1 -i INPUT2 -i INPUT3 -filter_complex amix=inputs=3:duration=first:dropout_transition=3 OUTPUT
 +ffmpeg -i INPUT1 -i INPUT2 -i INPUT3 -filter_complex amix=inputs=3:duration=first:dropout_transition=3 OUTPUT
  @end example
  will mix 3 input audio streams to a single output with the same duration as the
  first input and a dropout transition time of 3 seconds.
@@@ -345,97 -175,6 +345,97 @@@ stream ends. The default value is 2 sec
  
  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 asetnsamples
 +
 +Set the number of samples per each output audio frame.
 +
 +The last output packet may contain a different number of samples, as
 +the filter will flush all the remaining samples when the input audio
 +signal its end.
 +
 +The filter accepts parameters as a list of @var{key}=@var{value} pairs,
 +separated by ":".
 +
 +@table @option
 +
 +@item nb_out_samples, n
 +Set the number of frames per each output audio frame. The number is
 +intended as the number of samples @emph{per each channel}.
 +Default value is 1024.
 +
 +@item pad, p
 +If set to 1, the filter will pad the last audio frame with zeroes, so
 +that the last frame will contain the same number of samples as the
 +previous ones. Default value is 1.
 +@end table
 +
 +For example, to set the number of per-frame samples to 1234 and
 +disable padding for the last frame, use:
 +@example
 +asetnsamples=n=1234:p=0
 +@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 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
  
  Split input audio into several identical outputs.
  The filter accepts a single parameter which specifies the number of outputs. If
  unspecified, it defaults to 2.
  
 -For example
 +For example:
 +@example
 +[in] asplit [out0][out1]
 +@end example
 +
 +will create two separate outputs from the same input.
 +
 +To create 3 or more outputs, you need to specify the number of
 +outputs, like in:
 +@example
 +[in] asplit=3 [out0][out1][out2]
 +@end example
 +
  @example
 -avconv -i INPUT -filter_complex asplit=5 OUTPUT
 +ffmpeg -i INPUT -filter_complex asplit=5 OUTPUT
  @end example
  will create 5 copies of the input audio.
  
 +
 +@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 atempo
 +
 +Adjust audio tempo.
 +
 +The filter accepts exactly one parameter, the audio tempo. If not
 +specified then the filter will assume nominal 1.0 tempo. Tempo must
 +be in the [0.5, 2.0] range.
 +
 +For example, to slow down audio to 80% tempo:
 +@example
 +atempo=0.8
 +@end example
 +
 +For example, to speed up audio to 125% tempo:
 +@example
 +atempo=1.25
 +@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
 +
  @section asyncts
  Synchronize audio data with timestamps by squeezing/stretching it and/or
  dropping samples/adding silence when needed.
@@@ -707,6 -205,13 +707,13 @@@ adding/dropping samples
  @item max_comp
  Maximum compensation in samples per second.
  
+ @item first_pts
+ Assume the first pts should be this value.
+ This allows for padding/trimming at the start of stream. By default, no
+ assumption is made about the first frame's expected pts, so no padding or
+ trimming is done. For example, this could be set to 0 to pad the beginning with
+ silence if an audio stream starts after the video stream.
  @end table
  
  @section channelsplit
@@@ -720,14 -225,14 +727,14 @@@ Channel layout of the input stream. Def
  
  For example, assuming a stereo input MP3 file
  @example
 -avconv -i in.mp3 -filter_complex channelsplit out.mkv
 +ffmpeg -i in.mp3 -filter_complex channelsplit out.mkv
  @end example
  will create an output Matroska file with two audio streams, one containing only
  the left channel and the other the right channel.
  
  To split a 5.1 WAV file into per-channel files
  @example
 -avconv -i in.wav -filter_complex
 +ffmpeg -i in.wav -filter_complex
  'channelsplit=channel_layout=5.1[FL][FR][FC][LFE][SL][SR]'
  -map '[FL]' front_left.wav -map '[FR]' front_right.wav -map '[FC]'
  front_center.wav -map '[LFE]' lfe.wav -map '[SL]' side_left.wav -map '[SR]'
@@@ -757,14 -262,14 +764,14 @@@ output channels preserving index
  
  For example, assuming a 5.1+downmix input MOV file
  @example
 -avconv -i in.mov -filter 'channelmap=map=DL-FL\,DR-FR' out.wav
 +ffmpeg -i in.mov -filter 'channelmap=map=DL-FL\,DR-FR' out.wav
  @end example
  will create an output WAV file tagged as stereo from the downmix channels of
  the input.
  
  To fix a 5.1 WAV improperly encoded in AAC's native channel order
  @example
 -avconv -i in.wav -filter 'channelmap=1\,2\,0\,5\,3\,4:channel_layout=5.1' out.wav
 +ffmpeg -i in.wav -filter 'channelmap=1\,2\,0\,5\,3\,4:channel_layout=5.1' out.wav
  @end example
  
  @section join
@@@ -794,19 -299,21 +801,19 @@@ and if that fails it picks the first un
  
  E.g. to join 3 inputs (with properly set channel layouts)
  @example
 -avconv -i INPUT1 -i INPUT2 -i INPUT3 -filter_complex join=inputs=3 OUTPUT
 +ffmpeg -i INPUT1 -i INPUT2 -i INPUT3 -filter_complex join=inputs=3 OUTPUT
  @end example
  
  To build a 5.1 output from 6 single-channel streams:
  @example
 -avconv -i fl -i fr -i fc -i sl -i sr -i lfe -filter_complex
 +ffmpeg -i fl -i fr -i fc -i sl -i sr -i lfe -filter_complex
  'join=inputs=6:channel_layout=5.1:map=0.0-FL\,1.0-FR\,2.0-FC\,3.0-SL\,4.0-SR\,5.0-LFE'
  out
  @end example
  
  @section resample
  Convert the audio sample format, sample rate and channel layout. This filter is
 -not meant to be used directly, it is inserted automatically by libavfilter
 -whenever conversion is needed. Use the @var{aformat} filter to force a specific
 -conversion.
 +not meant to be used directly.
  
  @c man end AUDIO FILTERS
  
  
  Below is a description of the currently available audio sources.
  
 -@section anullsrc
 +@section abuffer
 +
 +Buffer audio frames, and make them available to the filter chain.
  
 -Null audio source, never return audio frames. It is mainly useful as a
 -template and to be employed in analysis / debugging tools.
 +This source is mainly intended for a programmatic use, in particular
 +through the interface defined in @file{libavfilter/asrc_abuffer.h}.
  
 -It accepts as optional parameter a string of the form
 -@var{sample_rate}:@var{channel_layout}.
 +It accepts the following mandatory parameters:
 +@var{sample_rate}:@var{sample_fmt}:@var{channel_layout}
  
 -@var{sample_rate} specify the sample rate, and defaults to 44100.
 +@table @option
  
 -@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.
 +@item sample_rate
 +The sample rate of the incoming audio buffers.
  
 -Check the channel_layout_map definition in
 -@file{libavcodec/audioconvert.c} for the mapping between strings and
 -channel layout values.
 +@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}
  
 -Follow some examples:
 +@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}
 +
 +@end table
 +
 +For example:
  @example
 -#  set the sample rate to 48000 Hz and the channel layout to CH_LAYOUT_MONO.
 -anullsrc=48000:4
 +abuffer=44100:s16p:stereo
 +@end example
  
 -# same as
 -anullsrc=48000:mono
 +will instruct the source to accept planar 16bit signed stereo at 44100Hz.
 +Since the sample format with name "s16p" corresponds to the number
 +6 and the "stereo" channel layout corresponds to the value 0x3, this is
 +equivalent to:
 +@example
 +abuffer=44100:6:0x3
  @end example
  
 -@section abuffer
 -Buffer audio frames, and make them available to the filter chain.
 +@section aevalsrc
  
 -This source is not intended to be part of user-supplied graph descriptions but
 -for insertion by calling programs through the interface defined in
 -@file{libavfilter/buffersrc.h}.
 +Generate an audio signal specified by an expression.
  
 -It accepts the following named parameters:
 -@table @option
 +This source accepts in input one or more expressions (one for each
 +channel), which are evaluated and used to generate a corresponding
 +audio signal.
  
 -@item time_base
 -Timebase which will be used for timestamps of submitted frames. It must be
 +It accepts the syntax: @var{exprs}[::@var{options}].
 +@var{exprs} is a list of expressions separated by ":", one for each
 +separate channel. In case the @var{channel_layout} is not
 +specified, the selected channel layout depends on the number of
 +provided expressions.
 +
 +@var{options} is an optional sequence of @var{key}=@var{value} pairs,
 +separated by ":".
 +
 +The description of the accepted options follows.
 +
 +@table @option
 +
 +@item channel_layout, c
 +Set the channel layout. The number of channels in the specified layout
 +must be equal to the number of specified expressions.
 +
 +@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 a two channels signal, specify the channel layout (Front
 +Center + Back Center) explicitly:
 +@example
 +aevalsrc="sin(420*2*PI*t):cos(430*2*PI*t)::c=FC|BC"
 +@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 anullsrc
 +
 +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
 +
 +@item sample_rate, s
 +Specify the sample rate, and defaults to 44100.
 +
 +@item channel_layout, cl
 +
 +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 AV_CH_LAYOUT_MONO.
 +anullsrc=r=48000:cl=4
 +
 +# same as
 +anullsrc=r=48000:cl=mono
 +@end example
 +
 +@section abuffer
 +Buffer audio frames, and make them available to the filter chain.
 +
 +This source is not intended to be part of user-supplied graph descriptions but
 +for insertion by calling programs through the interface defined in
 +@file{libavfilter/buffersrc.h}.
 +
 +It accepts the following named parameters:
 +@table @option
 +
 +@item time_base
 +Timebase which will be used for timestamps of submitted frames. It must be
  either a floating-point number or in @var{numerator}/@var{denominator} form.
  
  @item sample_rate
@@@ -1026,67 -376,6 +1033,67 @@@ Channel layout of the audio data, in th
  
  All the parameters need to be explicitly defined.
  
 +@section flite
 +
 +Synthesize a voice utterance using the libflite library.
 +
 +To enable compilation of this filter you need to configure FFmpeg with
 +@code{--enable-libflite}.
 +
 +Note that the flite library is not thread-safe.
 +
 +The source accepts parameters as a list of @var{key}=@var{value} pairs,
 +separated by ":".
 +
 +The description of the accepted parameters follows.
 +
 +@table @option
 +
 +@item list_voices
 +If set to 1, list the names of the available voices and exit
 +immediately. Default value is 0.
 +
 +@item nb_samples, n
 +Set the maximum number of samples per frame. Default value is 512.
 +
 +@item textfile
 +Set the filename containing the text to speak.
 +
 +@item text
 +Set the text to speak.
 +
 +@item voice, v
 +Set the voice to use for the speech synthesis. Default value is
 +@code{kal}. See also the @var{list_voices} option.
 +@end table
 +
 +@section Examples
 +
 +@itemize
 +@item
 +Read from file @file{speech.txt}, and synthetize the text using the
 +standard flite voice:
 +@example
 +flite=textfile=speech.txt
 +@end example
 +
 +@item
 +Read the specified text selecting the @code{slt} voice:
 +@example
 +flite=text='So fare thee well, poor devil of a Sub-Sub, whose commentator I am':voice=slt
 +@end example
 +
 +@item
 +Make @file{ffplay} speech the specified text, using @code{flite} and
 +the @code{lavfi} device:
 +@example
 +ffplay -f lavfi flite='No more be grieved for which that thou hast done.'
 +@end example
 +@end itemize
 +
 +For more information about libflite, check:
 +@url{http://www.speech.cs.cmu.edu/flite/}
 +
  @c man end AUDIO SOURCES
  
  @chapter Audio Sinks
  
  Below is a description of the currently available audio sinks.
  
 +@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
@@@ -1123,130 -401,13 +1130,130 @@@ This filter accepts no parameters
  @chapter Video Filters
  @c man begin VIDEO 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 video filters included in your
  build.
  
  Below is a description of the currently available video filters.
  
 +@section alphaextract
 +
 +Extract the alpha component from the input as a grayscale video. This
 +is especially useful with the @var{alphamerge} filter.
 +
 +@section alphamerge
 +
 +Add or replace the alpha component of the primary input with the
 +grayscale value of a second input. This is intended for use with
 +@var{alphaextract} to allow the transmission or storage of frame
 +sequences that have alpha in a format that doesn't support an alpha
 +channel.
 +
 +For example, to reconstruct full frames from a normal YUV-encoded video
 +and a separate video created with @var{alphaextract}, you might use:
 +@example
 +movie=in_alpha.mkv [alpha]; [in][alpha] alphamerge [out]
 +@end example
 +
 +Since this filter is designed for reconstruction, it operates on frame
 +sequences without considering timestamps, and terminates when either
 +input reaches end of stream. This will cause problems if your encoding
 +pipeline drops frames. If you're trying to apply an image as an
 +overlay to a video stream, consider the @var{overlay} filter instead.
 +
 +@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.
 +
 +@item pixel_black_th, pix_th
 +Set the threshold for considering a pixel "black".
 +
 +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
 +
 +@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.
 +
 +Default value is 0.10.
 +@end table
 +
 +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
  
  Detect frames that are (almost) completely black. Can be useful to
@@@ -1273,7 -434,7 +1280,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
@@@ -1328,18 -489,6 +1335,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
@@@ -1347,16 -496,15 +1354,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.
@@@ -1373,19 -521,6 +1380,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
  
@@@ -1544,76 -679,6 +1551,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.
@@@ -1651,7 -716,7 +1658,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
@@@ -1664,44 -729,89 +1671,44 @@@ 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 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 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 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 textfile
 -A text file containing text to be drawn. The text must be a sequence
 -of UTF-8 encoded characters.
 +@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.
  
 -This parameter is mandatory if no text string is specified with the
 -parameter @var{text}.
 +Default value is "1".
  
 -If both text and textfile are specified, an error is thrown.
 +See below for the list of accepted constants and functions.
  
 -@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 fix_bounds
 +If true, check and fix text coords to avoid clipping.
  
 -@item x, y
 -the computed values for @var{x} and @var{y}. They are evaluated for
 -each new frame.
 +@item fontcolor
 +The color to be used for drawing fonts.
 +Either a string (e.g. "red") or in 0xRRGGBB[AA] format
 +(e.g. "0xff000033"), possibly followed by an alpha specifier.
 +The default value of @var{fontcolor} is "black".
  
 -@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 n
 -the number of frames processed, starting from 0
 -
 -@item t
 -timestamp expressed in seconds, NAN if the input timestamp is unknown
 -
 -@end table
 -
 -The default value of @var{x} and @var{y} is 0.
 +@item fontfile
 +The font file to be used for drawing text. Path must be included.
 +This parameter is mandatory.
  
  @item fontsize
  The font size to be used for drawing text.
  The default value of @var{fontsize} is 16.
  
 -@item fontcolor
 -The color to be used for drawing fonts.
 -Either a string (e.g. "red") or in 0xRRGGBB[AA] format
 -(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 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 ft_load_flags
  Flags to be used for loading the fonts.
  
@@@ -1731,203 -841,45 +1738,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.
@@@ -1940,25 -892,6 +1947,25 @@@ effect has to last. At the end of the f
  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
  # fade in first 30 frames of video
@@@ -1972,9 -905,6 +1979,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
@@@ -2007,7 -937,7 +2014,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
@@@ -2056,7 -986,7 +2063,7 @@@ Desired output framerate
  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
@@@ -2084,37 -1014,27 +2091,37 @@@ The number and kind of parameters depen
  effect parameter is not specified the default value is set.
  
  Some examples follow:
 +
 +@itemize
 +@item
 +Apply the distort0r effect, set the first two double parameters:
  @example
 -# apply the distort0r effect, set the first two double parameters
  frei0r=distort0r:0.5:0.01
 +@end example
  
 -# apply the colordistance effect, takes a color as first parameter
 +@item
 +Apply the colordistance effect, takes a color as first parameter:
 +@example
  frei0r=colordistance:0.2/0.3/0.4
  frei0r=colordistance:violet
  frei0r=colordistance:0x112233
 +@end example
  
 -# apply the perspective effect, specify the top left and top right
 -# image positions
 +@item
 +Apply the perspective effect, specify the top left and top right image
 +positions:
 +@example
  frei0r=perspective:0.2/0.2:0.8/0.2
  @end example
 +@end itemize
  
  For more information see:
 -@url{http://piksel.org/frei0r}
 +@url{http://frei0r.dyne.org}
  
  @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.
  
@@@ -2148,9 -1068,9 +2155,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
@@@ -2180,11 -1100,6 +2187,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
@@@ -2200,14 -1115,10 +2207,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
@@@ -2216,32 -1127,28 +2223,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
  
@@@ -2287,7 -1194,7 +2294,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"
@@@ -2305,89 -1212,6 +2312,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.
  
@@@ -2422,7 -1244,7 +2429,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}.
  
@@@ -2522,10 -1344,10 +2529,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
@@@ -2542,17 -1364,6 +2549,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
@@@ -2566,23 -1377,16 +2573,23 @@@ 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,
  # WxH specifies the size of the main input to the overlay filter
  color=red@.3:WxH [over]; [in][over] overlay [out]
 +
 +# play an original video and a filtered version (here with the deshake filter)
 +# side by side
 +ffplay input.avi -vf 'split[a][b]; [a]pad=iw*2:ih[src]; [b]deshake[filt]; [src][filt]overlay=w'
 +
 +# the previous example is the same as:
 +ffplay input.avi -vf 'split[b], pad=iw*2[src], [b]deshake, [src]overlay=w'
  @end example
  
  You can chain together more overlays but the efficiency of such
@@@ -2600,6 -1404,10 +2607,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
  
@@@ -2618,13 -1426,7 +2625,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
@@@ -2684,12 -1486,6 +2691,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"
@@@ -2707,43 -1503,18 +2714,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
  
@@@ -2756,15 -1527,12 +2763,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.
@@@ -2783,19 -1551,6 +2790,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.
@@@ -2806,9 -1561,6 +2813,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
  
@@@ -2839,6 -1591,15 +2846,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
  
@@@ -2904,12 -1665,6 +2911,12 @@@ the frame is bottom-field-firs
  @item pos
  the position in the file of the filtered frame, -1 if the information
  is not available (e.g. for synthetic video)
 +
 +@item scene
 +value between 0 and 1 to indicate a new scene; a low value reflects a low
 +probability for the current frame to introduce a new scene, while a higher
 +value means the current frame is more likely to be one (see the example below)
 +
  @end table
  
  The default value of the select expression is "1".
@@@ -2942,99 -1697,55 +2949,99 @@@ 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
 +Complete example to create a mosaic of the first scenes:
 +
 +@example
 +ffmpeg -i video.avi -vf select='gt(scene\,0.4)',scale=160:120,tile -frames:v 1 preview.png
 +@end example
 +
 +Comparing @var{scene} against a value between 0.3 and 0.5 is generally a sane
 +choice.
 +
 +@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 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 @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 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{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 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 @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 setpts
 +@section setfield
  
 -Change the PTS (presentation timestamp) of the input video frames.
 +Force field for the output video frame.
  
 -Accept in input an expression evaluated through the eval API, which
 -can contain the following constants:
 +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}).
  
 -@table @option
 -@item PTS
 -the presentation timestamp in input
 +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 PI
 -Greek PI
 +@item tff
 +Mark the frame as top-field-first.
  
 -@item PHI
 -golden ratio
 +@item prog
 +Mark the frame as progressive.
 +@end table
 +
 +@section setpts
 +
 +Change the PTS (presentation timestamp) of the input video frames.
 +
 +Accept in input an expression evaluated through the eval API, which
 +can contain the following constants:
  
 -@item E
 -Euler number
 +@table @option
 +@item PTS
 +the presentation timestamp in input
  
  @item N
  the count of the input frame, starting from 0.
@@@ -3045,9 -1756,6 +3052,9 @@@ the PTS of the first video fram
  @item INTERLACED
  tell if the current frame is interlaced
  
 +@item TB
 +the time base
 +
  @item POS
  original position in the file of the frame, or undefined if undefined
  for the current frame
@@@ -3079,15 -1787,40 +3086,15 @@@ 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
 +@section settb, asettb
  
  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
 -default timebase), and "intb" (the input timebase).
 +The expression can contain the constants "AVTB" (the
 +default timebase), "intb" (the input timebase) and "sr" (the sample rate,
 +audio only).
  
  The default value for the input is "intb".
  
@@@ -3162,11 -1895,11 +3169,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
@@@ -3175,7 -1908,7 +3182,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
@@@ -3193,114 -1926,10 +3200,114 @@@ 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.
@@@ -3375,7 -2004,7 +3382,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.
  
@@@ -3388,8 -2017,8 +3395,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
@@@ -3465,37 -2094,35 +3472,37 @@@ Buffer video frames, and make them avai
  This source is mainly intended for a programmatic use, in particular
  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}
 -
 -All the parameters need to be explicitly defined.
 -
 -Follows the list of the accepted parameters.
 +It accepts a list of options in the form of @var{key}=@var{value} pairs
 +separated by ":". A descroption of the accepted options follows.
  
  @table @option
  
 -@item width, height
 -Specify the width and height of the buffered video frames.
 +@item video_size
 +Specify the size (width and height) of the buffered video frames.
  
 -@item pix_fmt_string
 +@item pix_fmt
  A string representing the pixel format of the buffered video frames.
  It may be a number corresponding to a pixel format, or a pixel format
  name.
  
 -@item timebase_num, timebase_den
 -Specify numerator and denomitor of the timebase assumed by the
 -timestamps of the buffered frames.
 +@item time_base
 +Specify the timebase assumed by the 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 time_base
 +Specify the frame rate expected for the video stream.
 +
 +@item pixel_aspect
 +Specify the sample aspect ratio assumed by the video frames.
 +
 +@item sws_param
 +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:
  @example
 -buffer=320:240:yuv410p:1:24:1:1
 +buffer=size=320x240:pix_fmt=yuv410p:time_base=1/24:pixel_aspect=1/1
  @end example
  
  will instruct the source to accept video frames with size 320x240 and
@@@ -3505,151 -2132,31 +3512,151 @@@ 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=size=320x240:pixfmt=6:time_base=1/24:pixel_aspect=1/1
 +@end example
 +
 +Alternatively, the options can be specified as a flat string, but this
 +syntax is deprecated:
 +
 +@var{width}:@var{height}:@var{pix_fmt}:@var{time_base.num}:@var{time_base.den}:@var{pixel_aspect.num}:@var{pixel_aspect.den}[:@var{sws_param}]
 +
 +@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.
  
 -It accepts the following parameters:
 -@var{color}:@var{frame_size}:@var{frame_rate}
 +This source accepts list of options in the form of
 +@var{key}=@var{value} pairs separated by ":".
  
  Follows the description of the accepted parameters.
  
  @table @option
  
 -@item color
 +@item color, c
  Specify the color of the source. It can be the name of a color (case
  insensitive match) or a 0xRRGGBB[AA] sequence, possibly followed by an
  alpha specifier. The default value is "black".
  
 -@item frame_size
 +@item size, s
  Specify the size of the sourced video, it may be a string of the form
  @var{width}x@var{height}, or the name of a size abbreviation. The
  default value is "320x240".
  
 -@item frame_rate
 +@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
@@@ -3664,72 -2171,86 +3671,72 @@@ frames per second, which will be overla
  to the pad with identifier "in".
  
  @example
 -"color=red@@0.2:qcif:10 [color]; [in][color] overlay [out]"
 +"color=c=red@@0.2:s=qcif:r=10 [color]; [in][color] overlay [out]"
  @end example
  
 -@section movie
 +@section mptestsrc
  
 -Read a video stream from a movie container.
 +Generate various test patterns, as generated by the MPlayer test filter.
  
 -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 size of the generated video is fixed, and is 256x256.
 +This source is useful in particular for testing encoding features.
  
 -The description of the accepted options follows.
 +This source accepts an optional sequence of @var{key}=@var{value} pairs,
 +separated by ":". The description of the accepted options follows.
  
  @table @option
  
 -@item format_name, f
 -Specifies 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
 -Specifies 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
 -Specifies the index of the video stream to read. If the value is -1,
 -the best suited video stream will be automatically selected. Default
 -value is "-1".
 -
 -@end table
 +@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".
  
 -This filter allows to overlay a second video on top of main input of
 -a filtergraph as shown in this graph:
 +@item duration, d
 +Set the video duration of the sourced video. The accepted syntax is:
  @example
 -input -----------> deltapts0 --> overlay --> output
 -                                    ^
 -                                    |
 -movie --> scale--> deltapts1 -------+
 +[-]HH:MM:SS[.m...]
 +[-]S+[.m...]
  @end example
 +See also the function @code{av_parse_time()}.
  
 -Some examples follow:
 -@example
 -# skip 3.2 seconds from the start of the avi file in.avi, and overlay it
 -# on top of the input labelled as "in".
 -movie=in.avi:seek_point=3.2, scale=180:-1, setpts=PTS-STARTPTS [movie];
 -[in] setpts=PTS-STARTPTS, [movie] overlay=16:16 [out]
 -
 -# read from a video4linux2 device, and overlay it on top of the input
 -# labelled as "in"
 -movie=/dev/video0:f=video4linux2, scale=180:-1, setpts=PTS-STARTPTS [movie];
 -[in] setpts=PTS-STARTPTS, [movie] overlay=16:16 [out]
 -
 -@end example
 +If not specified, or the expressed duration is negative, the video is
 +supposed to be generated forever.
  
 -@section nullsrc
 +@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
@@@ -3744,144 -2265,14 +3751,144 @@@ the form @var{num}/@var{den} or a fram
  information regarding frei0r and how to set the parameters read the
  section @ref{frei0r} in the description of the video filters.
  
 -Some examples follow:
 +For example, to generate a frei0r partik0l source with size 200x200
 +and frame rate 10 which is overlayed on the overlay filter main input:
  @example
 -# generate a frei0r partik0l source with size 200x200 and framerate 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
@@@ -3891,7 -2282,7 +3898,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
@@@ -3911,7 -2302,7 +3918,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...]]]
@@@ -3921,14 -2312,6 +3928,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:
@@@ -3937,14 -2320,7 +3944,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
  
@@@ -3958,13 -2334,8 +3965,13 @@@ Below is a description of the currentl
  Buffer video frames, and make them available to the end of the filter
  graph.
  
 -This sink is intended for a programmatic use through the interface defined in
 -@file{libavfilter/buffersink.h}.
 +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
  
@@@ -3973,221 -2344,3 +3980,221 @@@ mainly useful as a template and to be e
  tools.
  
  @c man end VIDEO SINKS
 +
 +@chapter Multimedia Filters
 +@c man begin MULTIMEDIA FILTERS
 +
 +Below is a description of the currently available multimedia filters.
 +
 +@section concat
 +
 +Concatenate audio and video streams, joining them together one after the
 +other.
 +
 +The filter works on segments of synchronized video and audio streams. All
 +segments must have the same number of streams of each type, and that will
 +also be the number of streams at output.
 +
 +The filter accepts the following named parameters:
 +@table @option
 +
 +@item n
 +Set the number of segments. Default is 2.
 +
 +@item v
 +Set the number of output video streams, that is also the number of video
 +streams in each segment. Default is 1.
 +
 +@item a
 +Set the number of output audio streams, that is also the number of video
 +streams in each segment. Default is 0.
 +
 +@end table
 +
 +The filter has @var{v}+@var{a} outputs: first @var{v} video outputs, then
 +@var{a} audio outputs.
 +
 +There are @var{n}×(@var{v}+@var{a}) inputs: first the inputs for the first
 +segment, in the same order as the outputs, then the inputs for the second
 +segment, etc.
 +
 +Related streams do not always have exactly the same duration, for various
 +reasons including codec frame size or sloppy authoring. For that reason,
 +related synchronized streams (e.g. a video and its audio track) should be
 +concatenated at once. The concat filter will use the duration of the longest
 +stream in each segment (except the last one), and if necessary pad shorter
 +audio streams with silence.
 +
 +For this filter to work correctly, all segments must start at timestamp 0.
 +
 +All corresponding streams must have the same parameters in all segments; the
 +filtering system will automatically select a common pixel format for video
 +streams, and a common sample format, sample rate and channel layout for
 +audio streams, but other settings, such as resolution, must be converted
 +explicitly by the user.
 +
 +Different frame rates are acceptable but will result in variable frame rate
 +at output; be sure to configure the output file to handle it.
 +
 +Examples:
 +@itemize
 +@item
 +Concatenate an opening, an episode and an ending, all in bilingual version
 +(video in stream 0, audio in streams 1 and 2):
 +@example
 +ffmpeg -i opening.mkv -i episode.mkv -i ending.mkv -filter_complex \
 +  '[0:0] [0:1] [0:2] [1:0] [1:1] [1:2] [2:0] [2:1] [2:2]
 +   concat=n=3:v=1:a=2 [v] [a1] [a2]' \
 +  -map '[v]' -map '[a1]' -map '[a2]' output.mkv
 +@end example
 +
 +@item
 +Concatenate two parts, handling audio and video separately, using the
 +(a)movie sources, and adjusting the resolution:
 +@example
 +movie=part1.mp4, scale=512:288 [v1] ; amovie=part1.mp4 [a1] ;
 +movie=part2.mp4, scale=512:288 [v2] ; amovie=part2.mp4 [a2] ;
 +[v1] [v2] concat [outv] ; [a1] [a2] concat=v=0:a=1 [outa]
 +@end example
 +Note that a desync will happen at the stitch if the audio and video streams
 +do not have exactly the same duration in the first file.
 +
 +@end itemize
 +
 +@section showwaves
 +
 +Convert input audio to a video output, representing the samples waves.
 +
 +The filter accepts the following named parameters:
 +@table @option
 +
 +@item n
 +Set the number of samples which are printed on the same column. A
 +larger value will decrease the frame rate. Must be a positive
 +integer. This option can be set only if the value for @var{rate}
 +is not explicitly specified.
 +
 +@item rate, r
 +Set the (approximate) output frame rate. This is done by setting the
 +option @var{n}. Default value is "25".
 +
 +@item size, s
 +Specify the video size for the output. Default value is "600x240".
 +@end table
 +
 +Some examples follow.
 +@itemize
 +@item
 +Output the input file audio and the corresponding video representation
 +at the same time:
 +@example
 +amovie=a.mp3,asplit[out0],showwaves[out1]
 +@end example
 +
 +@item
 +Create a synthetic signal and show it with showwaves, forcing a
 +framerate of 30 frames per second:
 +@example
 +aevalsrc=sin(1*2*PI*t)*sin(880*2*PI*t):cos(2*PI*200*t),asplit[out0],showwaves=r=30[out1]
 +@end example
 +@end itemize
 +
 +@c man end MULTIMEDIA FILTERS
 +
 +@chapter Multimedia Sources
 +@c man begin MULTIMEDIA SOURCES
 +
 +Below is a description of the currently available multimedia sources.
 +
 +@section amovie
 +
 +This is the same as @ref{src_movie} source, except it selects an audio
 +stream by default.
 +
 +@anchor{src_movie}
 +@section movie
 +
 +Read audio and/or video stream(s) 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
 +Specifies 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
 +Specifies 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 streams, s
 +Specifies the streams to read. Several streams can be specified, separated
 +by "+". The source will then have as many outputs, in the same order. The
 +syntax is explained in the @ref{Stream specifiers} chapter. Two special
 +names, "dv" and "da" specify respectively the default (best suited) video
 +and audio stream. Default is "dv", or "da" if the filter is called as
 +"amovie".
 +
 +@item stream_index, si
 +Specifies the index of the video stream to read. If the value is -1,
 +the best suited video stream will be automatically selected. Default
 +value is "-1". Deprecated. If the filter is called "amovie", it will select
 +audio instead of video.
 +
 +@item loop
 +Specifies how many times to read the 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
 +a filtergraph as shown in this graph:
 +@example
 +input -----------> deltapts0 --> overlay --> output
 +                                    ^
 +                                    |
 +movie --> scale--> deltapts1 -------+
 +@end example
 +
 +Some examples follow.
 +
 +@itemize
 +@item
 +Skip 3.2 seconds from the start of the avi file in.avi, and overlay it
 +on top of the input labelled as "in":
 +@example
 +movie=in.avi:seek_point=3.2, scale=180:-1, setpts=PTS-STARTPTS [movie];
 +[in] setpts=PTS-STARTPTS, [movie] overlay=16:16 [out]
 +@end example
 +
 +@item
 +Read from a video4linux2 device, and overlay it on top of the input
 +labelled as "in":
 +@example
 +movie=/dev/video0:f=video4linux2, scale=180:-1, setpts=PTS-STARTPTS [movie];
 +[in] setpts=PTS-STARTPTS, [movie] overlay=16:16 [out]
 +@end example
 +
 +@item
 +Read the first video stream and the audio stream with id 0x81 from
 +dvd.vob; the video is connected to the pad named "video" and the audio is
 +connected to the pad named "audio":
 +@example
 +movie=dvd.vob:s=v:0+#0x81 [video] [audio]
 +@end example
 +@end itemize
 +
 +@c man end MULTIMEDIA SOURCES
diff --combined libavcodec/dsputil.c
index ef3143132e8e4559af61755d5ef8904e66e3b48a,787a46d1eac2be81eebd5f2757040a2ca4995cec..3c9dd47c2f9dc7c823990be7390218a7986e9066
@@@ -5,20 -5,20 +5,20 @@@
   *
   * gmc & q-pel & 32/64 bit based MC by Michael Niedermayer <michaelni@gmx.at>
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
  #include "config.h"
  #include "ac3dec.h"
  #include "vorbis.h"
 +#include "diracdsp.h"
  
  uint8_t ff_cropTbl[256 + 2 * MAX_NEG_CROP] = {0, };
  uint32_t ff_squareTbl[512] = {0, };
  
 +#define pixeltmp int16_t
  #define BIT_DEPTH 9
  #include "dsputil_template.c"
  #undef BIT_DEPTH
  #include "dsputil_template.c"
  #undef BIT_DEPTH
  
 +#undef pixeltmp
 +#define pixeltmp int32_t
 +#define BIT_DEPTH 12
 +#include "dsputil_template.c"
 +#undef BIT_DEPTH
 +
 +#define BIT_DEPTH 14
 +#include "dsputil_template.c"
 +#undef BIT_DEPTH
 +
 +#undef pixeltmp
 +#define pixeltmp int16_t
  #define BIT_DEPTH 8
  #include "dsputil_template.c"
 +#undef pixeltmp
  
  // 0x7f7f7f7f or 0x7f7f7f7f7f7f7f7f or whatever, depending on the cpu's native arithmetic size
  #define pb_7f (~0UL/255 * 0x7f)
@@@ -395,38 -380,6 +395,38 @@@ void ff_put_pixels_clamped_c(const DCTE
      }
  }
  
 +static void put_pixels_clamped4_c(const DCTELEM *block, uint8_t *restrict pixels,
 +                                 int line_size)
 +{
 +    int i;
 +
 +    /* read the pixels */
 +    for(i=0;i<4;i++) {
 +        pixels[0] = av_clip_uint8(block[0]);
 +        pixels[1] = av_clip_uint8(block[1]);
 +        pixels[2] = av_clip_uint8(block[2]);
 +        pixels[3] = av_clip_uint8(block[3]);
 +
 +        pixels += line_size;
 +        block += 8;
 +    }
 +}
 +
 +static void put_pixels_clamped2_c(const DCTELEM *block, uint8_t *restrict pixels,
 +                                 int line_size)
 +{
 +    int i;
 +
 +    /* read the pixels */
 +    for(i=0;i<2;i++) {
 +        pixels[0] = av_clip_uint8(block[0]);
 +        pixels[1] = av_clip_uint8(block[1]);
 +
 +        pixels += line_size;
 +        block += 8;
 +    }
 +}
 +
  void ff_put_signed_pixels_clamped_c(const DCTELEM *block,
                                      uint8_t *restrict pixels,
                                      int line_size)
@@@ -468,36 -421,6 +468,36 @@@ void ff_add_pixels_clamped_c(const DCTE
      }
  }
  
 +static void add_pixels_clamped4_c(const DCTELEM *block, uint8_t *restrict pixels,
 +                          int line_size)
 +{
 +    int i;
 +
 +    /* read the pixels */
 +    for(i=0;i<4;i++) {
 +        pixels[0] = av_clip_uint8(pixels[0] + block[0]);
 +        pixels[1] = av_clip_uint8(pixels[1] + block[1]);
 +        pixels[2] = av_clip_uint8(pixels[2] + block[2]);
 +        pixels[3] = av_clip_uint8(pixels[3] + block[3]);
 +        pixels += line_size;
 +        block += 8;
 +    }
 +}
 +
 +static void add_pixels_clamped2_c(const DCTELEM *block, uint8_t *restrict pixels,
 +                          int line_size)
 +{
 +    int i;
 +
 +    /* read the pixels */
 +    for(i=0;i<2;i++) {
 +        pixels[0] = av_clip_uint8(pixels[0] + block[0]);
 +        pixels[1] = av_clip_uint8(pixels[1] + block[1]);
 +        pixels += line_size;
 +        block += 8;
 +    }
 +}
 +
  static int sum_abs_dctelem_c(DCTELEM *block)
  {
      int sum=0, i;
@@@ -1334,51 -1257,6 +1334,51 @@@ void ff_avg_rv40_qpel8_mc33_c(uint8_t *
  }
  #endif /* CONFIG_RV40_DECODER */
  
 +#if CONFIG_DIRAC_DECODER
 +#define DIRAC_MC(OPNAME)\
 +void ff_ ## OPNAME ## _dirac_pixels8_c(uint8_t *dst, const uint8_t *src[5], int stride, int h)\
 +{\
 +     OPNAME ## _pixels8_8_c(dst, src[0], stride, h);\
 +}\
 +void ff_ ## OPNAME ## _dirac_pixels16_c(uint8_t *dst, const uint8_t *src[5], int stride, int h)\
 +{\
 +    OPNAME ## _pixels16_8_c(dst, src[0], stride, h);\
 +}\
 +void ff_ ## OPNAME ## _dirac_pixels32_c(uint8_t *dst, const uint8_t *src[5], int stride, int h)\
 +{\
 +    OPNAME ## _pixels16_8_c(dst   , src[0]   , stride, h);\
 +    OPNAME ## _pixels16_8_c(dst+16, src[0]+16, stride, h);\
 +}\
 +void ff_ ## OPNAME ## _dirac_pixels8_l2_c(uint8_t *dst, const uint8_t *src[5], int stride, int h)\
 +{\
 +    OPNAME ## _pixels8_l2_8(dst, src[0], src[1], stride, stride, stride, h);\
 +}\
 +void ff_ ## OPNAME ## _dirac_pixels16_l2_c(uint8_t *dst, const uint8_t *src[5], int stride, int h)\
 +{\
 +    OPNAME ## _pixels16_l2_8(dst, src[0], src[1], stride, stride, stride, h);\
 +}\
 +void ff_ ## OPNAME ## _dirac_pixels32_l2_c(uint8_t *dst, const uint8_t *src[5], int stride, int h)\
 +{\
 +    OPNAME ## _pixels16_l2_8(dst   , src[0]   , src[1]   , stride, stride, stride, h);\
 +    OPNAME ## _pixels16_l2_8(dst+16, src[0]+16, src[1]+16, stride, stride, stride, h);\
 +}\
 +void ff_ ## OPNAME ## _dirac_pixels8_l4_c(uint8_t *dst, const uint8_t *src[5], int stride, int h)\
 +{\
 +    OPNAME ## _pixels8_l4_8(dst, src[0], src[1], src[2], src[3], stride, stride, stride, stride, stride, h);\
 +}\
 +void ff_ ## OPNAME ## _dirac_pixels16_l4_c(uint8_t *dst, const uint8_t *src[5], int stride, int h)\
 +{\
 +    OPNAME ## _pixels16_l4_8(dst, src[0], src[1], src[2], src[3], stride, stride, stride, stride, stride, h);\
 +}\
 +void ff_ ## OPNAME ## _dirac_pixels32_l4_c(uint8_t *dst, const uint8_t *src[5], int stride, int h)\
 +{\
 +    OPNAME ## _pixels16_l4_8(dst   , src[0]   , src[1]   , src[2]   , src[3]   , stride, stride, stride, stride, stride, h);\
 +    OPNAME ## _pixels16_l4_8(dst+16, src[0]+16, src[1]+16, src[2]+16, src[3]+16, stride, stride, stride, stride, stride, h);\
 +}
 +DIRAC_MC(put)
 +DIRAC_MC(avg)
 +#endif
 +
  static void wmv2_mspel8_v_lowpass(uint8_t *dst, uint8_t *src, int dstStride, int srcStride, int w){
      uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
      int i;
@@@ -1932,7 -1810,7 +1932,7 @@@ static void add_bytes_c(uint8_t *dst, u
          dst[i+0] += src[i+0];
  }
  
 -static void diff_bytes_c(uint8_t *dst, uint8_t *src1, uint8_t *src2, int w){
 +static void diff_bytes_c(uint8_t *dst, const uint8_t *src1, const uint8_t *src2, int w){
      long i;
  #if !HAVE_FAST_UNALIGNED
      if((long)src2 & (sizeof(long)-1)){
@@@ -2523,7 -2401,7 +2523,7 @@@ static void vector_fmul_scalar_c(float 
          dst[i] = src[i] * mul;
  }
  
 -static void butterflies_float_c(float *restrict v1, float *restrict v2,
 +static void butterflies_float_c(float *av_restrict v1, float *av_restrict v2,
                                  int len)
  {
      int i;
@@@ -2746,37 -2624,6 +2746,37 @@@ static void ff_jref_idct_add(uint8_t *d
      ff_add_pixels_clamped_c(block, dest, line_size);
  }
  
 +static void ff_jref_idct4_put(uint8_t *dest, int line_size, DCTELEM *block)
 +{
 +    ff_j_rev_dct4 (block);
 +    put_pixels_clamped4_c(block, dest, line_size);
 +}
 +static void ff_jref_idct4_add(uint8_t *dest, int line_size, DCTELEM *block)
 +{
 +    ff_j_rev_dct4 (block);
 +    add_pixels_clamped4_c(block, dest, line_size);
 +}
 +
 +static void ff_jref_idct2_put(uint8_t *dest, int line_size, DCTELEM *block)
 +{
 +    ff_j_rev_dct2 (block);
 +    put_pixels_clamped2_c(block, dest, line_size);
 +}
 +static void ff_jref_idct2_add(uint8_t *dest, int line_size, DCTELEM *block)
 +{
 +    ff_j_rev_dct2 (block);
 +    add_pixels_clamped2_c(block, dest, line_size);
 +}
 +
 +static void ff_jref_idct1_put(uint8_t *dest, int line_size, DCTELEM *block)
 +{
 +    dest[0] = av_clip_uint8((block[0] + 4)>>3);
 +}
 +static void ff_jref_idct1_add(uint8_t *dest, int line_size, DCTELEM *block)
 +{
 +    dest[0] = av_clip_uint8(dest[0] + ((block[0] + 4)>>3));
 +}
 +
  static void just_return(void *mem av_unused, int stride av_unused, int h av_unused) { return; }
  
  /* init static data */
@@@ -2808,7 -2655,7 +2808,7 @@@ int ff_check_alignment(void)
                  "Compiler did not align stack variables. Libavcodec has been miscompiled\n"
                  "and may be very slow or crash. This is not a bug in libavcodec,\n"
                  "but in the compiler. You may try recompiling using gcc >= 4.2.\n"
 -                "Do not report crashes to Libav developers.\n");
 +                "Do not report crashes to FFmpeg developers.\n");
  #endif
              did_fail=1;
          }
@@@ -2843,28 -2690,12 +2843,28 @@@ av_cold void ff_dsputil_init(DSPContext
      }
  #endif //CONFIG_ENCODERS
  
 -    if (avctx->bits_per_raw_sample == 10) {
 -        c->idct_put              = ff_simple_idct_put_10;
 -        c->idct_add              = ff_simple_idct_add_10;
 -        c->idct                  = ff_simple_idct_10;
 -        c->idct_permutation_type = FF_NO_IDCT_PERM;
 -    } else {
 +    if(avctx->lowres==1){
 +        c->idct_put= ff_jref_idct4_put;
 +        c->idct_add= ff_jref_idct4_add;
 +        c->idct    = ff_j_rev_dct4;
 +        c->idct_permutation_type= FF_NO_IDCT_PERM;
 +    }else if(avctx->lowres==2){
 +        c->idct_put= ff_jref_idct2_put;
 +        c->idct_add= ff_jref_idct2_add;
 +        c->idct    = ff_j_rev_dct2;
 +        c->idct_permutation_type= FF_NO_IDCT_PERM;
 +    }else if(avctx->lowres==3){
 +        c->idct_put= ff_jref_idct1_put;
 +        c->idct_add= ff_jref_idct1_add;
 +        c->idct    = ff_j_rev_dct1;
 +        c->idct_permutation_type= FF_NO_IDCT_PERM;
 +    }else{
 +        if (avctx->bits_per_raw_sample == 10) {
 +            c->idct_put              = ff_simple_idct_put_10;
 +            c->idct_add              = ff_simple_idct_add_10;
 +            c->idct                  = ff_simple_idct_10;
 +            c->idct_permutation_type = FF_NO_IDCT_PERM;
 +        } else {
          if(avctx->idct_algo==FF_IDCT_INT){
              c->idct_put= ff_jref_idct_put;
              c->idct_add= ff_jref_idct_add;
              c->idct_add= ff_faanidct_add;
              c->idct    = ff_faanidct;
              c->idct_permutation_type= FF_NO_IDCT_PERM;
-         }else if(CONFIG_EATGQ_DECODER && avctx->idct_algo==FF_IDCT_EA) {
-             c->idct_put= ff_ea_idct_put_c;
-             c->idct_permutation_type= FF_NO_IDCT_PERM;
          }else{ //accurate/default
              c->idct_put = ff_simple_idct_put_8;
              c->idct_add = ff_simple_idct_add_8;
              c->idct     = ff_simple_idct_8;
              c->idct_permutation_type= FF_NO_IDCT_PERM;
          }
 +        }
      }
  
      c->diff_pixels = diff_pixels_c;
              BIT_DEPTH_FUNCS(10, _16);
          }
          break;
 +    case 12:
 +        if (c->dct_bits == 32) {
 +            BIT_DEPTH_FUNCS(12, _32);
 +        } else {
 +            BIT_DEPTH_FUNCS(12, _16);
 +        }
 +        break;
 +    case 14:
 +        if (c->dct_bits == 32) {
 +            BIT_DEPTH_FUNCS(14, _32);
 +        } else {
 +            BIT_DEPTH_FUNCS(14, _16);
 +        }
 +        break;
      default:
 -        BIT_DEPTH_FUNCS(8, _16);
 +        if(avctx->bits_per_raw_sample<=8 || avctx->codec_type != AVMEDIA_TYPE_VIDEO) {
 +            BIT_DEPTH_FUNCS(8, _16);
 +        }
          break;
      }
  
      ff_init_scantable_permutation(c->idct_permutation,
                                    c->idct_permutation_type);
  }
 +
 +av_cold void dsputil_init(DSPContext* c, AVCodecContext *avctx)
 +{
 +    ff_dsputil_init(c, avctx);
 +}
diff --combined libavcodec/dsputil.h
index 7b533cc0abde5565c9e6125e167aac4167ba8f4b,e1b7efc45b88231c06b31da8bbcdae7c2ed9ac2f..42e1c9e61ed9107d2e0fb762d54f1d58b4d6325f
@@@ -3,20 -3,20 +3,20 @@@
   * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
   * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
   *
 - * 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
   */
  
@@@ -46,9 -46,6 +46,9 @@@ void ff_fdct248_islow_8(DCTELEM *data)
  void ff_fdct248_islow_10(DCTELEM *data);
  
  void ff_j_rev_dct (DCTELEM *data);
 +void ff_j_rev_dct4 (DCTELEM *data);
 +void ff_j_rev_dct2 (DCTELEM *data);
 +void ff_j_rev_dct1 (DCTELEM *data);
  void ff_wmv2_idct_c(DCTELEM *data);
  
  void ff_fdct_mmx(DCTELEM *block);
@@@ -72,8 -69,6 +72,8 @@@ void ff_h264_chroma_dc_dequant_idct_ #
  H264_IDCT( 8)
  H264_IDCT( 9)
  H264_IDCT(10)
 +H264_IDCT(12)
 +H264_IDCT(14)
  
  void ff_svq3_luma_dc_dequant_idct_c(DCTELEM *output, DCTELEM *input, int qp);
  void ff_svq3_add_idct_c(uint8_t *dst, DCTELEM *block, int stride, int qp, int dc);
@@@ -100,17 -95,12 +100,14 @@@ void ff_avg_pixels16x16_ ## depth ## _c
  PUTAVG_PIXELS( 8)
  PUTAVG_PIXELS( 9)
  PUTAVG_PIXELS(10)
 +PUTAVG_PIXELS(12)
 +PUTAVG_PIXELS(14)
  
  #define ff_put_pixels8x8_c ff_put_pixels8x8_8_c
  #define ff_avg_pixels8x8_c ff_avg_pixels8x8_8_c
  #define ff_put_pixels16x16_c ff_put_pixels16x16_8_c
  #define ff_avg_pixels16x16_c ff_avg_pixels16x16_8_c
  
- /* EA functions */
- void ff_ea_idct_put_c(uint8_t *dest, int linesize, DCTELEM *block);
  /* RV40 functions */
  void ff_put_rv40_qpel16_mc33_c(uint8_t *dst, uint8_t *src, int stride);
  void ff_avg_rv40_qpel16_mc33_c(uint8_t *dst, uint8_t *src, int stride);
@@@ -128,7 -118,7 +125,7 @@@ void ff_gmc_c(uint8_t *dst, uint8_t *sr
  /* minimum alignment rules ;)
  If you notice errors in the align stuff, need more alignment for some ASM code
  for some CPU or need to use a function with less aligned data then send a mail
 -to the libav-devel mailing list, ...
 +to the ffmpeg-devel mailing list, ...
  
  !warning These alignments might not match reality, (missing attribute((align))
  stuff somewhere possible).
@@@ -206,8 -196,6 +203,8 @@@ void ff_emulated_edge_mc_ ## depth (uin
  EMULATED_EDGE(8)
  EMULATED_EDGE(9)
  EMULATED_EDGE(10)
 +EMULATED_EDGE(12)
 +EMULATED_EDGE(14)
  
  void ff_add_pixels_clamped_c(const DCTELEM *block, uint8_t *dest, int linesize);
  void ff_put_pixels_clamped_c(const DCTELEM *block, uint8_t *dest, int linesize);
@@@ -371,7 -359,7 +368,7 @@@ typedef struct DSPContext 
  
      /* huffyuv specific */
      void (*add_bytes)(uint8_t *dst/*align 16*/, uint8_t *src/*align 16*/, int w);
 -    void (*diff_bytes)(uint8_t *dst/*align 16*/, uint8_t *src1/*align 16*/, uint8_t *src2/*align 1*/,int w);
 +    void (*diff_bytes)(uint8_t *dst/*align 16*/, const uint8_t *src1/*align 16*/, const uint8_t *src2/*align 1*/,int w);
      /**
       * subtract huffyuv's variant of median prediction
       * note, this might read from src1[-1], src2[-1]
      void (*add_hfyu_median_prediction)(uint8_t *dst, const uint8_t *top, const uint8_t *diff, int w, int *left, int *left_top);
      int  (*add_hfyu_left_prediction)(uint8_t *dst, const uint8_t *src, int w, int left);
      void (*add_hfyu_left_prediction_bgr32)(uint8_t *dst, const uint8_t *src, int w, int *red, int *green, int *blue, int *alpha);
 +    /* this might write to dst[w] */
      void (*bswap_buf)(uint32_t *dst, const uint32_t *src, int w);
      void (*bswap16_buf)(uint16_t *dst, const uint16_t *src, int len);
  
       * @param v2  second input vector, difference output, 16-byte aligned
       * @param len length of vectors, multiple of 4
       */
 -    void (*butterflies_float)(float *restrict v1, float *restrict v2, int len);
 +    void (*butterflies_float)(float *av_restrict v1, float *av_restrict v2, int len);
  
      /**
       * Calculate the sum and difference of two vectors of floats and interleave
  
  void ff_dsputil_static_init(void);
  void ff_dsputil_init(DSPContext* p, AVCodecContext *avctx);
 +attribute_deprecated void dsputil_init(DSPContext* c, AVCodecContext *avctx);
  
  int ff_check_alignment(void);
  
diff --combined libavcodec/eaidct.c
index 9972e422ed31152fcad82d56fdef9e162a1bd82c,5e628b09d0d715ac059dcf803dec05bee9148087..d1bc350098f01072bde0f10fcf4ca559f6519bf2
@@@ -2,20 -2,20 +2,20 @@@
   * Electronic Arts TGQ/TQI/MAD IDCT algorithm
   * Copyright (c) 2007-2008 Peter Ross <pross@xvid.org>
   *
 - * 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
   */
  
@@@ -26,6 -26,7 +26,7 @@@
   */
  
  #include "dsputil.h"
+ #include "eaidct.h"
  
  #define ASQRT 181 /* (1/sqrt(2))<<8 */
  #define A4    669 /* cos(pi/8)*sqrt(2)<<9 */
diff --combined libavcodec/eaidct.h
index 0000000000000000000000000000000000000000,4c0b5ae16eb0b1ce8e34cfc07b5baae4dfcbf44c..a436673e8851565cdde1733797badbc9ea732bb3
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,27 +1,27 @@@
 - * This file is part of Libav.
+ /*
 - * Libav is free software; you can redistribute it and/or
++ * This file is part of FFmpeg
+  *
 - * Libav is distributed in the hope that it will be useful,
++ * 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.
+  *
 - * License along with Libav; if not, write to the Free Software
++ * FFmpeg is distributed in the hope that it will be useful,
+  * but WITHOUT ANY WARRANTY; without even the implied warranty of
+  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  * Lesser General Public License for more details.
+  *
+  * You should have received a copy of the GNU Lesser General Public
++ * License along with FFmpeg; if not, write to the Free Software
+  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+  */
+ #ifndef AVCODEC_EAIDCT_H
+ #define AVCODEC_EAIDCT_H
+ #include <stdint.h>
+ #include "dsputil.h"
+ void ff_ea_idct_put_c(uint8_t *dest, int linesize, DCTELEM *block);
+ #endif /* AVCODEC_EAIDCT_H */
diff --combined libavcodec/eamad.c
index d36ef9afced6c8abce8684f6f436f582facefb38,ca7439397f4c42620b4d3975979c924b02eb9618..d6839b17ea89c62967939a293c33065f56b79e23
@@@ -2,20 -2,20 +2,20 @@@
   * Electronic Arts Madcow Video Decoder
   * Copyright (c) 2007-2009 Peter Ross
   *
 - * 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 St, Fifth Floor, Boston, MA  02110-1301  USA
   */
  
@@@ -32,6 -32,7 +32,7 @@@
  #include "get_bits.h"
  #include "dsputil.h"
  #include "aandcttab.h"
+ #include "eaidct.h"
  #include "mpeg12.h"
  #include "mpeg12data.h"
  #include "libavutil/imgutils.h"
  #define MADe_TAG MKTAG('M', 'A', 'D', 'e')    /* MAD lqp-frame */
  
  typedef struct MadContext {
-     MpegEncContext s;
+     AVCodecContext *avctx;
+     DSPContext dsp;
      AVFrame frame;
      AVFrame last_frame;
+     GetBitContext gb;
      void *bitstream_buf;
      unsigned int bitstream_buf_size;
      DECLARE_ALIGNED(16, DCTELEM, block)[64];
+     ScanTable scantable;
+     uint16_t quant_matrix[64];
+     int mb_x;
+     int mb_y;
  } MadContext;
  
  static void bswap16_buf(uint16_t *dst, const uint16_t *src, int count)
  
  static av_cold int decode_init(AVCodecContext *avctx)
  {
-     MadContext *t = avctx->priv_data;
-     MpegEncContext *s = &t->s;
+     MadContext *s = avctx->priv_data;
      s->avctx = avctx;
      avctx->pix_fmt = PIX_FMT_YUV420P;
-     if (avctx->idct_algo == FF_IDCT_AUTO)
-         avctx->idct_algo = FF_IDCT_EA;
      ff_dsputil_init(&s->dsp, avctx);
-     ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable, ff_zigzag_direct);
+     ff_init_scantable_permutation(s->dsp.idct_permutation, FF_NO_IDCT_PERM);
+     ff_init_scantable(s->dsp.idct_permutation, &s->scantable, ff_zigzag_direct);
      ff_mpeg12_init_vlcs();
      return 0;
  }
@@@ -83,49 -88,40 +88,46 @@@ static inline void comp(unsigned char *
  static inline void comp_block(MadContext *t, int mb_x, int mb_y,
                                int j, int mv_x, int mv_y, int add)
  {
-     MpegEncContext *s = &t->s;
      if (j < 4) {
-         if (offset >= (s->height - 7) * t->last_frame.linesize[0] - 7)
 +        unsigned offset = (mb_y*16 + ((j&2)<<2) + mv_y)*t->last_frame.linesize[0] + mb_x*16 + ((j&1)<<3) + mv_x;
++        if (offset >= (t->avctx->height - 7) * t->last_frame.linesize[0] - 7)
 +            return;
          comp(t->frame.data[0] + (mb_y*16 + ((j&2)<<2))*t->frame.linesize[0] + mb_x*16 + ((j&1)<<3),
               t->frame.linesize[0],
 -             t->last_frame.data[0] + (mb_y*16 + ((j&2)<<2) + mv_y)*t->last_frame.linesize[0] + mb_x*16 + ((j&1)<<3) + mv_x,
 +             t->last_frame.data[0] + offset,
               t->last_frame.linesize[0], add);
-     } else if (!(s->avctx->flags & CODEC_FLAG_GRAY)) {
+     } else if (!(t->avctx->flags & CODEC_FLAG_GRAY)) {
          int index = j - 3;
-         if (offset >= (s->height/2 - 7) * t->last_frame.linesize[index] - 7)
 +        unsigned offset = (mb_y * 8 + (mv_y/2))*t->last_frame.linesize[index] + mb_x * 8 + (mv_x/2);
++        if (offset >= (t->avctx->height/2 - 7) * t->last_frame.linesize[index] - 7)
 +            return;
          comp(t->frame.data[index] + (mb_y*8)*t->frame.linesize[index] + mb_x * 8,
               t->frame.linesize[index],
 -             t->last_frame.data[index] + (mb_y * 8 + (mv_y/2))*t->last_frame.linesize[index] + mb_x * 8 + (mv_x/2),
 +             t->last_frame.data[index] + offset,
               t->last_frame.linesize[index], add);
      }
  }
  
  static inline void idct_put(MadContext *t, DCTELEM *block, int mb_x, int mb_y, int j)
  {
-     MpegEncContext *s = &t->s;
      if (j < 4) {
-         s->dsp.idct_put(
+         ff_ea_idct_put_c(
              t->frame.data[0] + (mb_y*16 + ((j&2)<<2))*t->frame.linesize[0] + mb_x*16 + ((j&1)<<3),
              t->frame.linesize[0], block);
-     } else if (!(s->avctx->flags & CODEC_FLAG_GRAY)) {
+     } else if (!(t->avctx->flags & CODEC_FLAG_GRAY)) {
          int index = j - 3;
-         s->dsp.idct_put(
+         ff_ea_idct_put_c(
              t->frame.data[index] + (mb_y*8)*t->frame.linesize[index] + mb_x*8,
              t->frame.linesize[index], block);
      }
  }
  
- static inline int decode_block_intra(MadContext * t, DCTELEM * block)
 -static inline void decode_block_intra(MadContext *s, DCTELEM * block)
++static inline int decode_block_intra(MadContext *s, DCTELEM * block)
  {
-     MpegEncContext *s = &t->s;
      int level, i, j, run;
      RLTable *rl = &ff_rl_mpeg1;
-     const uint8_t *scantable = s->intra_scantable.permutated;
-     int16_t *quant_matrix = s->intra_matrix;
+     const uint8_t *scantable = s->scantable.permutated;
+     int16_t *quant_matrix = s->quant_matrix;
  
      block[0] = (128 + get_sbits(&s->gb, 8)) * quant_matrix[0];
  
              }
              if (i > 63) {
                  av_log(s->avctx, AV_LOG_ERROR, "ac-tex damaged at %d %d\n", s->mb_x, s->mb_y);
 -                return;
 +                return -1;
              }
  
              block[j] = level;
          }
          CLOSE_READER(re, &s->gb);
      }
 +    return 0;
  }
  
  static int decode_motion(GetBitContext *gb)
      return value;
  }
  
- static int decode_mb(MadContext *t, int inter)
 -static void decode_mb(MadContext *s, int inter)
++static int decode_mb(MadContext *s, int inter)
  {
-     MpegEncContext *s = &t->s;
      int mv_map = 0;
      int mv_x, mv_y;
      int j;
              mv_map = v ? get_bits(&s->gb, 6) : 63;
              mv_x = decode_motion(&s->gb);
              mv_y = decode_motion(&s->gb);
 -        } else {
 -            mv_map = 0;
          }
      }
  
      for (j=0; j<6; j++) {
          if (mv_map & (1<<j)) {  // mv_x and mv_y are guarded by mv_map
              int add = 2*decode_motion(&s->gb);
-             if (t->last_frame.data[0])
-                 comp_block(t, s->mb_x, s->mb_y, j, mv_x, mv_y, add);
 -            comp_block(s, s->mb_x, s->mb_y, j, mv_x, mv_y, add);
++            if (s->last_frame.data[0])
++                comp_block(s, s->mb_x, s->mb_y, j, mv_x, mv_y, add);
          } else {
-             s->dsp.clear_block(t->block);
-             if(decode_block_intra(t, t->block) < 0)
+             s->dsp.clear_block(s->block);
 -            decode_block_intra(s, s->block);
++            if(decode_block_intra(s, s->block) < 0)
 +                return -1;
-             idct_put(t, t->block, s->mb_x, s->mb_y, j);
+             idct_put(s, s->block, s->mb_x, s->mb_y, j);
          }
      }
 +    return 0;
  }
  
- static void calc_intra_matrix(MadContext *t, int qscale)
+ static void calc_quant_matrix(MadContext *s, int qscale)
  {
-     MpegEncContext *s = &t->s;
      int i;
  
-     if (s->avctx->idct_algo == FF_IDCT_EA) {
-         s->intra_matrix[0] = (ff_inv_aanscales[0]*ff_mpeg1_default_intra_matrix[0]) >> 11;
-         for (i=1; i<64; i++)
-             s->intra_matrix[i] = (ff_inv_aanscales[i]*ff_mpeg1_default_intra_matrix[i]*qscale + 32) >> 10;
-     } else {
-         s->intra_matrix[0] = ff_mpeg1_default_intra_matrix[0];
-         for (i=1; i<64; i++)
-             s->intra_matrix[i] = (ff_mpeg1_default_intra_matrix[i]*qscale) << 1;
-     }
+     s->quant_matrix[0] = (ff_inv_aanscales[0]*ff_mpeg1_default_intra_matrix[0]) >> 11;
+     for (i=1; i<64; i++)
+         s->quant_matrix[i] = (ff_inv_aanscales[i]*ff_mpeg1_default_intra_matrix[i]*qscale + 32) >> 10;
  }
  
  static int decode_frame(AVCodecContext *avctx,
      const uint8_t *buf = avpkt->data;
      int buf_size       = avpkt->size;
      const uint8_t *buf_end = buf+buf_size;
-     MadContext *t     = avctx->priv_data;
-     MpegEncContext *s = &t->s;
+     MadContext *s     = avctx->priv_data;
+     int width, height;
      int chunk_type;
      int inter;
  
      av_reduce(&avctx->time_base.num, &avctx->time_base.den,
                AV_RL16(&buf[6]), 1000, 1<<30);
  
-     s->width  = AV_RL16(&buf[8]);
-     s->height = AV_RL16(&buf[10]);
-     calc_intra_matrix(t, buf[13]);
+     width  = AV_RL16(&buf[8]);
+     height = AV_RL16(&buf[10]);
+     calc_quant_matrix(s, buf[13]);
      buf += 16;
  
-     if (avctx->width != s->width || avctx->height != s->height) {
-         if((s->width * s->height)/2048*7 > buf_end-buf)
+     if (avctx->width != width || avctx->height != height) {
++        if((width * height)/2048*7 > buf_end-buf)
 +            return -1;
-         if (av_image_check_size(s->width, s->height, 0, avctx) < 0)
+         if (av_image_check_size(width, height, 0, avctx) < 0)
              return -1;
-         avcodec_set_dimensions(avctx, s->width, s->height);
-         if (t->frame.data[0])
-             avctx->release_buffer(avctx, &t->frame);
-         if (t->last_frame.data[0])
-             avctx->release_buffer(avctx, &t->last_frame);
+         avcodec_set_dimensions(avctx, width, height);
+         if (s->frame.data[0])
+             avctx->release_buffer(avctx, &s->frame);
++        if (s->last_frame.data[0])
++            avctx->release_buffer(avctx, &s->last_frame);
      }
  
-     t->frame.reference = 3;
-     if (!t->frame.data[0]) {
-         if (avctx->get_buffer(avctx, &t->frame) < 0) {
 -    s->frame.reference = 1;
++    s->frame.reference = 3;
+     if (!s->frame.data[0]) {
+         if (avctx->get_buffer(avctx, &s->frame) < 0) {
              av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
              return -1;
          }
      }
  
-     av_fast_malloc(&t->bitstream_buf, &t->bitstream_buf_size, (buf_end-buf) + FF_INPUT_BUFFER_PADDING_SIZE);
-     if (!t->bitstream_buf)
+     av_fast_malloc(&s->bitstream_buf, &s->bitstream_buf_size, (buf_end-buf) + FF_INPUT_BUFFER_PADDING_SIZE);
+     if (!s->bitstream_buf)
          return AVERROR(ENOMEM);
-     bswap16_buf(t->bitstream_buf, (const uint16_t*)buf, (buf_end-buf)/2);
-     memset((uint8_t*)t->bitstream_buf + (buf_end-buf), 0, FF_INPUT_BUFFER_PADDING_SIZE);
-     init_get_bits(&s->gb, t->bitstream_buf, 8*(buf_end-buf));
+     bswap16_buf(s->bitstream_buf, (const uint16_t*)buf, (buf_end-buf)/2);
++    memset((uint8_t*)s->bitstream_buf + (buf_end-buf), 0, FF_INPUT_BUFFER_PADDING_SIZE);
+     init_get_bits(&s->gb, s->bitstream_buf, 8*(buf_end-buf));
  
      for (s->mb_y=0; s->mb_y < (avctx->height+15)/16; s->mb_y++)
          for (s->mb_x=0; s->mb_x < (avctx->width +15)/16; s->mb_x++)
-             if(decode_mb(t, inter) < 0)
 -            decode_mb(s, inter);
++            if(decode_mb(s, inter) < 0)
 +                return -1;
  
      *data_size = sizeof(AVFrame);
-     *(AVFrame*)data = t->frame;
+     *(AVFrame*)data = s->frame;
  
      if (chunk_type != MADe_TAG)
-         FFSWAP(AVFrame, t->frame, t->last_frame);
+         FFSWAP(AVFrame, s->frame, s->last_frame);
  
      return buf_size;
  }
diff --combined libavcodec/eatgq.c
index 69bed3d1b8aa3367d08eeb1d6d0373bfb8d4e1cf,a55b061a50cd4d6a380f85d9dba0bf4f9d0fedff..7326af388a67ec4daae4c69b27d221adf7978aad
@@@ -2,20 -2,20 +2,20 @@@
   * Electronic Arts TGQ Video Decoder
   * Copyright (c) 2007-2008 Peter Ross <pross@xvid.org>
   *
 - * 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 St, Fifth Floor, Boston, MA  02110-1301  USA
   */
  
  #include "bytestream.h"
  #include "dsputil.h"
  #include "aandcttab.h"
+ #include "eaidct.h"
  
  typedef struct TgqContext {
      AVCodecContext *avctx;
-     DSPContext dsp;
      AVFrame frame;
      int width,height;
      ScanTable scantable;
  
  static av_cold int tgq_decode_init(AVCodecContext *avctx){
      TgqContext *s = avctx->priv_data;
+     uint8_t idct_permutation[64];
      s->avctx = avctx;
-     if(avctx->idct_algo==FF_IDCT_AUTO)
-         avctx->idct_algo=FF_IDCT_EA;
-     ff_dsputil_init(&s->dsp, avctx);
-     ff_init_scantable(s->dsp.idct_permutation, &s->scantable, ff_zigzag_direct);
+     ff_init_scantable_permutation(idct_permutation, FF_NO_IDCT_PERM);
+     ff_init_scantable(idct_permutation, &s->scantable, ff_zigzag_direct);
      avctx->time_base = (AVRational){1, 15};
      avctx->pix_fmt = PIX_FMT_YUV420P;
      return 0;
@@@ -109,13 -108,13 +108,13 @@@ static void tgq_idct_put_mb(TgqContext 
      uint8_t *dest_cb = s->frame.data[1] + (mb_y * 8 * s->frame.linesize[1]) + mb_x * 8;
      uint8_t *dest_cr = s->frame.data[2] + (mb_y * 8 * s->frame.linesize[2]) + mb_x * 8;
  
-     s->dsp.idct_put(dest_y                 , linesize, block[0]);
-     s->dsp.idct_put(dest_y              + 8, linesize, block[1]);
-     s->dsp.idct_put(dest_y + 8*linesize    , linesize, block[2]);
-     s->dsp.idct_put(dest_y + 8*linesize + 8, linesize, block[3]);
+     ff_ea_idct_put_c(dest_y                 , linesize, block[0]);
+     ff_ea_idct_put_c(dest_y              + 8, linesize, block[1]);
+     ff_ea_idct_put_c(dest_y + 8*linesize    , linesize, block[2]);
+     ff_ea_idct_put_c(dest_y + 8*linesize + 8, linesize, block[3]);
      if(!(s->avctx->flags&CODEC_FLAG_GRAY)){
-          s->dsp.idct_put(dest_cb, s->frame.linesize[1], block[4]);
-          s->dsp.idct_put(dest_cr, s->frame.linesize[2], block[5]);
+          ff_ea_idct_put_c(dest_cb, s->frame.linesize[1], block[4]);
+          ff_ea_idct_put_c(dest_cr, s->frame.linesize[2], block[5]);
      }
  }
  
@@@ -150,7 -149,7 +149,7 @@@ static void tgq_decode_mb(TgqContext *s
      mode = bytestream2_get_byte(&s->gb);
      if (mode>12) {
          GetBitContext gb;
 -        init_get_bits(&gb, s->gb.buffer, FFMIN(s->gb.buffer_end - s->gb.buffer, mode) * 8);
 +        init_get_bits(&gb, s->gb.buffer, FFMIN(bytestream2_get_bytes_left(&s->gb), mode) * 8);
          for(i=0; i<6; i++)
              tgq_decode_block(s, s->block[i], &gb);
          tgq_idct_put_mb(s, s->block, mb_x, mb_y);
@@@ -180,10 -179,7 +179,7 @@@ static void tgq_calculate_qtable(TgqCon
      const int b = (11*(100-quant))/100 + 4;
      for(j=0;j<8;j++)
      for(i=0;i<8;i++)
-         if (s->avctx->idct_algo==FF_IDCT_EA)
-             s->qtable[j*8+i] = ((a*(j+i)/(7+7) + b)*ff_inv_aanscales[j*8+i])>>(14-4);
-         else
-             s->qtable[j*8+i] = (a*(j+i)/(7+7) + b)<<3;
+         s->qtable[j*8+i] = ((a*(j+i)/(7+7) + b)*ff_inv_aanscales[j*8+i])>>(14-4);
  }
  
  static int tgq_decode_frame(AVCodecContext *avctx,
diff --combined libavcodec/eatqi.c
index 55c080dea88b60963806b21e2e9d556cbaaac8f2,548a08404406faa46268bb347103e51befa92ad7..6ca4e51ecd5edbc402f7ace60a465c9124aaf95e
@@@ -2,20 -2,20 +2,20 @@@
   * Electronic Arts TQI Video Decoder
   * Copyright (c) 2007-2009 Peter Ross <pross@xvid.org>
   *
 - * 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 St, Fifth Floor, Boston, MA  02110-1301  USA
   */
  
@@@ -30,6 -30,7 +30,7 @@@
  #include "get_bits.h"
  #include "dsputil.h"
  #include "aandcttab.h"
+ #include "eaidct.h"
  #include "mpeg12.h"
  #include "mpegvideo.h"
  
@@@ -46,9 -47,8 +47,8 @@@ static av_cold int tqi_decode_init(AVCo
      TqiContext *t = avctx->priv_data;
      MpegEncContext *s = &t->s;
      s->avctx = avctx;
-     if(avctx->idct_algo==FF_IDCT_AUTO)
-         avctx->idct_algo=FF_IDCT_EA;
      ff_dsputil_init(&s->dsp, avctx);
+     ff_init_scantable_permutation(s->dsp.idct_permutation, FF_NO_IDCT_PERM);
      ff_init_scantable(s->dsp.idct_permutation, &s->intra_scantable, ff_zigzag_direct);
      s->qscale = 1;
      avctx->time_base = (AVRational){1, 15};
@@@ -76,13 -76,13 +76,13 @@@ static inline void tqi_idct_put(TqiCont
      uint8_t *dest_cb = t->frame.data[1] + (s->mb_y * 8 * t->frame.linesize[1]) + s->mb_x * 8;
      uint8_t *dest_cr = t->frame.data[2] + (s->mb_y * 8 * t->frame.linesize[2]) + s->mb_x * 8;
  
-     s->dsp.idct_put(dest_y                 , linesize, block[0]);
-     s->dsp.idct_put(dest_y              + 8, linesize, block[1]);
-     s->dsp.idct_put(dest_y + 8*linesize    , linesize, block[2]);
-     s->dsp.idct_put(dest_y + 8*linesize + 8, linesize, block[3]);
+     ff_ea_idct_put_c(dest_y                 , linesize, block[0]);
+     ff_ea_idct_put_c(dest_y              + 8, linesize, block[1]);
+     ff_ea_idct_put_c(dest_y + 8*linesize    , linesize, block[2]);
+     ff_ea_idct_put_c(dest_y + 8*linesize + 8, linesize, block[3]);
      if(!(s->avctx->flags&CODEC_FLAG_GRAY)) {
-         s->dsp.idct_put(dest_cb, t->frame.linesize[1], block[4]);
-         s->dsp.idct_put(dest_cr, t->frame.linesize[2], block[5]);
+         ff_ea_idct_put_c(dest_cb, t->frame.linesize[1], block[4]);
+         ff_ea_idct_put_c(dest_cr, t->frame.linesize[2], block[5]);
      }
  }
  
@@@ -90,15 -90,9 +90,9 @@@ static void tqi_calculate_qtable(MpegEn
  {
      const int qscale = (215 - 2*quant)*5;
      int i;
-     if (s->avctx->idct_algo==FF_IDCT_EA) {
-         s->intra_matrix[0] = (ff_inv_aanscales[0]*ff_mpeg1_default_intra_matrix[0])>>11;
-         for(i=1; i<64; i++)
-             s->intra_matrix[i] = (ff_inv_aanscales[i]*ff_mpeg1_default_intra_matrix[i]*qscale + 32)>>14;
-     }else{
-         s->intra_matrix[0] = ff_mpeg1_default_intra_matrix[0];
-         for(i=1; i<64; i++)
-             s->intra_matrix[i] = (ff_mpeg1_default_intra_matrix[i]*qscale + 32)>>3;
-     }
+     s->intra_matrix[0] = (ff_inv_aanscales[0]*ff_mpeg1_default_intra_matrix[0])>>11;
+     for(i=1; i<64; i++)
+         s->intra_matrix[i] = (ff_inv_aanscales[i]*ff_mpeg1_default_intra_matrix[i]*qscale + 32)>>14;
  }
  
  static int tqi_decode_frame(AVCodecContext *avctx,
      for (s->mb_x=0; s->mb_x<(avctx->width+15)/16; s->mb_x++)
      {
          if (tqi_decode_mb(s, t->block) < 0)
 -            break;
 +            goto end;
          tqi_idct_put(t, t->block);
      }
 +    end:
  
      *data_size = sizeof(AVFrame);
      *(AVFrame*)data = t->frame;
diff --combined libavcodec/h264_ps.c
index 28bee2e10551fd0db7b0b4e66a6ce1c7eec12271,7d9d59664f8778f5aa0da7bfe8394dbd9c785f17..2945948c41fbf68ae37e0aebe2ff7b8fd328a3a2
@@@ -2,20 -2,20 +2,20 @@@
   * H.26L/H.264/AVC/JVT/14496-10/... parameter set decoding
   * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
   *
 - * 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
   */
  
@@@ -70,7 -70,7 +70,7 @@@ static const AVRational pixel_aspect[17
      QP(37,d), QP(37,d), QP(37,d), QP(38,d), QP(38,d), QP(38,d),\
      QP(39,d), QP(39,d), QP(39,d), QP(39,d)
  
 -const uint8_t ff_h264_chroma_qp[3][QP_MAX_NUM+1] = {
 +const uint8_t ff_h264_chroma_qp[7][QP_MAX_NUM+1] = {
      {
          CHROMA_QP_TABLE_END(8)
      },
          6, 7, 8, 9, 10, 11,
          CHROMA_QP_TABLE_END(10)
      },
 +    {
 +        0,  1, 2, 3,  4,  5,
 +        6,  7, 8, 9, 10, 11,
 +        12,13,14,15, 16, 17,
 +        CHROMA_QP_TABLE_END(11)
 +    },
 +    {
 +        0,  1, 2, 3,  4,  5,
 +        6,  7, 8, 9, 10, 11,
 +        12,13,14,15, 16, 17,
 +        18,19,20,21, 22, 23,
 +        CHROMA_QP_TABLE_END(12)
 +    },
 +    {
 +        0,  1, 2, 3,  4,  5,
 +        6,  7, 8, 9, 10, 11,
 +        12,13,14,15, 16, 17,
 +        18,19,20,21, 22, 23,
 +        24,25,26,27, 28, 29,
 +        CHROMA_QP_TABLE_END(13)
 +    },
 +    {
 +        0,  1, 2, 3,  4,  5,
 +        6,  7, 8, 9, 10, 11,
 +        12,13,14,15, 16, 17,
 +        18,19,20,21, 22, 23,
 +        24,25,26,27, 28, 29,
 +        30,31,32,33, 34, 35,
 +        CHROMA_QP_TABLE_END(14)
 +    },
  };
  
  static const uint8_t default_scaling4[2][16]={
@@@ -246,8 -216,7 +246,8 @@@ static inline int decode_vui_parameters
      if(sps->nal_hrd_parameters_present_flag || sps->vcl_hrd_parameters_present_flag)
          get_bits1(&s->gb);     /* low_delay_hrd_flag */
      sps->pic_struct_present_flag = get_bits1(&s->gb);
 -
 +    if(!get_bits_left(&s->gb))
 +        return 0;
      sps->bitstream_restriction_flag = get_bits1(&s->gb);
      if(sps->bitstream_restriction_flag){
          get_bits1(&s->gb);     /* motion_vectors_over_pic_boundaries_flag */
              return -1;
          }
      }
 +
      if (get_bits_left(&s->gb) < 0) {
          av_log(h->s.avctx, AV_LOG_ERROR, "Overread VUI by %d bits\n", -get_bits_left(&s->gb));
          return AVERROR_INVALIDDATA;
@@@ -316,11 -284,13 +316,11 @@@ static void decode_scaling_matrices(H26
          decode_scaling_list(h,scaling_matrix4[5],16,default_scaling4[1],scaling_matrix4[4]); // Inter, Cb
          if(is_sps || pps->transform_8x8_mode){
              decode_scaling_list(h,scaling_matrix8[0],64,default_scaling8[0],fallback[2]);  // Intra, Y
 -            if(sps->chroma_format_idc == 3){
 -                decode_scaling_list(h,scaling_matrix8[1],64,default_scaling8[0],scaling_matrix8[0]);  // Intra, Cr
 -                decode_scaling_list(h,scaling_matrix8[2],64,default_scaling8[0],scaling_matrix8[1]);  // Intra, Cb
 -            }
              decode_scaling_list(h,scaling_matrix8[3],64,default_scaling8[1],fallback[3]);  // Inter, Y
              if(sps->chroma_format_idc == 3){
 +                decode_scaling_list(h,scaling_matrix8[1],64,default_scaling8[0],scaling_matrix8[0]);  // Intra, Cr
                  decode_scaling_list(h,scaling_matrix8[4],64,default_scaling8[1],scaling_matrix8[3]);  // Inter, Cr
 +                decode_scaling_list(h,scaling_matrix8[2],64,default_scaling8[0],scaling_matrix8[1]);  // Intra, Cb
                  decode_scaling_list(h,scaling_matrix8[5],64,default_scaling8[1],scaling_matrix8[4]);  // Inter, Cb
              }
          }
@@@ -339,9 -309,7 +339,9 @@@ int ff_h264_decode_seq_parameter_set(H2
      constraint_set_flags |= get_bits1(&s->gb) << 1;   //constraint_set1_flag
      constraint_set_flags |= get_bits1(&s->gb) << 2;   //constraint_set2_flag
      constraint_set_flags |= get_bits1(&s->gb) << 3;   //constraint_set3_flag
 -    get_bits(&s->gb, 4); // reserved
 +    constraint_set_flags |= get_bits1(&s->gb) << 4;   //constraint_set4_flag
 +    constraint_set_flags |= get_bits1(&s->gb) << 5;   //constraint_set5_flag
 +    get_bits(&s->gb, 2); // reserved
      level_idc= get_bits(&s->gb, 8);
      sps_id= get_ue_golomb_31(&s->gb);
  
      sps->profile_idc= profile_idc;
      sps->constraint_set_flags = constraint_set_flags;
      sps->level_idc= level_idc;
 +    sps->full_range = -1;
  
      memset(sps->scaling_matrix4, 16, sizeof(sps->scaling_matrix4));
      memset(sps->scaling_matrix8, 16, sizeof(sps->scaling_matrix8));
      sps->scaling_matrix_present = 0;
 +    sps->colorspace = 2; //AVCOL_SPC_UNSPECIFIED
  
 -    if(sps->profile_idc >= 100){ //high profile
 +    if(sps->profile_idc == 100 || sps->profile_idc == 110 ||
 +       sps->profile_idc == 122 || sps->profile_idc == 244 || sps->profile_idc ==  44 ||
 +       sps->profile_idc ==  83 || sps->profile_idc ==  86 || sps->profile_idc == 118 ||
 +       sps->profile_idc == 128 ) {
          sps->chroma_format_idc= get_ue_golomb_31(&s->gb);
 -        if(sps->chroma_format_idc > 3) {
 -            av_log(h->s.avctx, AV_LOG_ERROR, "chroma_format_idc (%u) out of range\n", sps->chroma_format_idc);
 +        if (sps->chroma_format_idc > 3U) {
 +            av_log(h->s.avctx, AV_LOG_ERROR, "chroma_format_idc %d is illegal\n", sps->chroma_format_idc);
              goto fail;
          } else if(sps->chroma_format_idc == 3) {
              sps->residual_color_transform_flag = get_bits1(&s->gb);
 +            if(sps->residual_color_transform_flag) {
 +                av_log(h->s.avctx, AV_LOG_ERROR, "separate color planes are not supported\n");
 +                goto fail;
 +            }
          }
          sps->bit_depth_luma   = get_ue_golomb(&s->gb) + 8;
          sps->bit_depth_chroma = get_ue_golomb(&s->gb) + 8;
 +        if (sps->bit_depth_luma > 14U || sps->bit_depth_chroma > 14U) {
 +            av_log(h->s.avctx, AV_LOG_ERROR, "illegal bit depth value (%d, %d)\n",
 +                   sps->bit_depth_luma, sps->bit_depth_chroma);
 +            goto fail;
 +        }
          sps->transform_bypass = get_bits1(&s->gb);
          decode_scaling_matrices(h, sps, NULL, 1, sps->scaling_matrix4, sps->scaling_matrix8);
      }else{
      }
  
      sps->log2_max_frame_num= get_ue_golomb(&s->gb) + 4;
 +    if (sps->log2_max_frame_num < 4 || sps->log2_max_frame_num > 16) {
 +        av_log(h->s.avctx, AV_LOG_ERROR, "illegal log2_max_frame_num %d\n",
 +               sps->log2_max_frame_num);
 +        goto fail;
 +    }
 +
      sps->poc_type= get_ue_golomb_31(&s->gb);
  
      if(sps->poc_type == 0){ //FIXME #define
 -        sps->log2_max_poc_lsb= get_ue_golomb(&s->gb) + 4;
 +        unsigned t = get_ue_golomb(&s->gb);
 +        if(t>12){
 +            av_log(h->s.avctx, AV_LOG_ERROR, "log2_max_poc_lsb (%d) is out of range\n", t);
 +            goto fail;
 +        }
 +        sps->log2_max_poc_lsb= t + 4;
      } else if(sps->poc_type == 1){//FIXME #define
          sps->delta_pic_order_always_zero_flag= get_bits1(&s->gb);
          sps->offset_for_non_ref_pic= get_se_golomb(&s->gb);
      }
  
      sps->ref_frame_count= get_ue_golomb_31(&s->gb);
 -    if(sps->ref_frame_count > MAX_PICTURE_COUNT-2 || sps->ref_frame_count >= 32U){
 +    if(sps->ref_frame_count > MAX_PICTURE_COUNT-2 || sps->ref_frame_count > 16U){
          av_log(h->s.avctx, AV_LOG_ERROR, "too many reference frames\n");
          goto fail;
      }
          sps->mb_aff= 0;
  
      sps->direct_8x8_inference_flag= get_bits1(&s->gb);
 -    if(!sps->frame_mbs_only_flag && !sps->direct_8x8_inference_flag){
 -        av_log(h->s.avctx, AV_LOG_ERROR, "This stream was generated by a broken encoder, invalid 8x8 inference\n");
 -        goto fail;
 -    }
  
  #ifndef ALLOW_INTERLACE
      if(sps->mb_aff)
          sps->crop_top   = get_ue_golomb(&s->gb);
          sps->crop_bottom= get_ue_golomb(&s->gb);
          if(sps->crop_left || sps->crop_top){
 -            av_log(h->s.avctx, AV_LOG_ERROR, "insane cropping not completely supported, this could look slightly wrong ...\n");
 +            av_log(h->s.avctx, AV_LOG_ERROR, "insane cropping not completely supported, this could look slightly wrong ... (left: %d, top: %d)\n", sps->crop_left, sps->crop_top);
          }
          if(sps->crop_right >= crop_horizontal_limit || sps->crop_bottom >= crop_vertical_limit){
 -            av_log(h->s.avctx, AV_LOG_ERROR, "brainfart cropping not supported, this could look slightly wrong ...\n");
 +            av_log(h->s.avctx, AV_LOG_ERROR, "brainfart cropping not supported, cropping disabled (right: %d, bottom: %d)\n", sps->crop_right, sps->crop_bottom);
 +        /* It is very unlikely that partial cropping will make anybody happy.
 +         * Not cropping at all fixes for example playback of Sisvel 3D streams
 +         * in applications supporting Sisvel 3D. */
 +        sps->crop_left  =
 +        sps->crop_right =
 +        sps->crop_top   =
 +        sps->crop_bottom= 0;
          }
      }else{
          sps->crop_left  =
          sps->sar.den= 1;
  
      if(s->avctx->debug&FF_DEBUG_PICT_INFO){
 -        av_log(h->s.avctx, AV_LOG_DEBUG, "sps:%u profile:%d/%d poc:%d ref:%d %dx%d %s %s crop:%d/%d/%d/%d %s %s %d/%d\n",
+         static const char csp[4][5] = { "Gray", "420", "422", "444" };
 +        av_log(h->s.avctx, AV_LOG_DEBUG, "sps:%u profile:%d/%d poc:%d ref:%d %dx%d %s %s crop:%d/%d/%d/%d %s %s %d/%d b%d\n",
                 sps_id, sps->profile_idc, sps->level_idc,
                 sps->poc_type,
                 sps->ref_frame_count,
                 sps->crop_left, sps->crop_right,
                 sps->crop_top, sps->crop_bottom,
                 sps->vui_parameters_present_flag ? "VUI" : "",
-                ((const char*[]){"Gray","420","422","444"})[sps->chroma_format_idc],
+                csp[sps->chroma_format_idc],
                 sps->timing_info_present_flag ? sps->num_units_in_tick : 0,
 -               sps->timing_info_present_flag ? sps->time_scale : 0
 +               sps->timing_info_present_flag ? sps->time_scale : 0,
 +               sps->bit_depth_luma
                 );
      }
  
@@@ -526,21 -466,6 +527,21 @@@ build_qp_table(PPS *pps, int t, int ind
          pps->chroma_qp_table[t][i] = ff_h264_chroma_qp[depth-8][av_clip(i + index, 0, max_qp)];
  }
  
 +static int more_rbsp_data_in_pps(H264Context *h, PPS *pps)
 +{
 +    const SPS *sps = h->sps_buffers[pps->sps_id];
 +    int profile_idc = sps->profile_idc;
 +
 +    if ((profile_idc == 66 || profile_idc == 77 ||
 +         profile_idc == 88) && (sps->constraint_set_flags & 7)) {
 +        av_log(h->s.avctx, AV_LOG_VERBOSE,
 +               "Current profile doesn't provide more RBSP data in PPS, skipping\n");
 +        return 0;
 +    }
 +
 +    return 1;
 +}
 +
  int ff_h264_decode_picture_parameter_set(H264Context *h, int bit_length){
      MpegEncContext * const s = &h->s;
      unsigned int pps_id= get_ue_golomb(&s->gb);
      if(pps_id >= MAX_PPS_COUNT) {
          av_log(h->s.avctx, AV_LOG_ERROR, "pps_id (%d) out of range\n", pps_id);
          return -1;
 -    } else if (h->sps.bit_depth_luma > 10) {
 -        av_log(h->s.avctx, AV_LOG_ERROR, "Unimplemented luma bit depth=%d (max=10)\n", h->sps.bit_depth_luma);
 +    } else if (h->sps.bit_depth_luma > 14) {
 +        av_log(h->s.avctx, AV_LOG_ERROR, "Invalid luma bit depth=%d\n", h->sps.bit_depth_luma);
 +        return AVERROR_INVALIDDATA;
 +    } else if (h->sps.bit_depth_luma == 11 || h->sps.bit_depth_luma == 13) {
 +        av_log(h->s.avctx, AV_LOG_ERROR, "Unimplemented luma bit depth=%d\n", h->sps.bit_depth_luma);
          return AVERROR_PATCHWELCOME;
      }
  
      memcpy(pps->scaling_matrix8, h->sps_buffers[pps->sps_id]->scaling_matrix8, sizeof(pps->scaling_matrix8));
  
      bits_left = bit_length - get_bits_count(&s->gb);
 -    if (bits_left && (bits_left > 8 ||
 -                      show_bits(&s->gb, bits_left) != 1 << (bits_left - 1))) {
 +    if(bits_left > 0 && more_rbsp_data_in_pps(h, pps)){
          pps->transform_8x8_mode= get_bits1(&s->gb);
          decode_scaling_matrices(h, h->sps_buffers[pps->sps_id], pps, 0, pps->scaling_matrix4, pps->scaling_matrix8);
          pps->chroma_qp_index_offset[1]= get_se_golomb(&s->gb); //second_chroma_qp_index_offset
diff --combined libavcodec/mpegvideo.c
index a3c55d048f9afea6c4d61a74144a6074bc2d9934,8b2a27f5e2bdf27ff494fc719485411eb2327904..ce5d40e8bf72db74922f5122c8bfe59cf952c73d
@@@ -5,20 -5,20 +5,20 @@@
   *
   * 4MV & hq & B-frame encoding stuff by Michael Niedermayer <michaelni@gmx.at>
   *
 - * 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
   */
  
@@@ -36,7 -36,6 +36,6 @@@
  #include "mpegvideo_common.h"
  #include "mjpegenc.h"
  #include "msmpeg4.h"
- #include "faandct.h"
  #include "xvmc_internal.h"
  #include "thread.h"
  #include <limits.h>
@@@ -140,9 -139,9 +139,9 @@@ const enum PixelFormat ff_hwaccel_pixfm
      PIX_FMT_NONE
  };
  
 -const uint8_t *avpriv_mpv_find_start_code(const uint8_t *restrict p,
 +const uint8_t *avpriv_mpv_find_start_code(const uint8_t *av_restrict p,
                                            const uint8_t *end,
 -                                          uint32_t * restrict state)
 +                                          uint32_t *av_restrict state)
  {
      int i;
  
@@@ -420,12 -419,12 +419,12 @@@ static int init_duplicate_context(MpegE
      // edge emu needs blocksize + filter length - 1
      // (= 17x17 for  halfpel / 21x21 for  h264)
      FF_ALLOCZ_OR_GOTO(s->avctx, s->edge_emu_buffer,
 -                      (s->width + 64) * 2 * 21 * 2, fail);    // (width + edge + align)*interlaced*MBsize*tolerance
 +                      (s->width + 95) * 2 * 21 * 4, fail);    // (width + edge + align)*interlaced*MBsize*tolerance
  
      // FIXME should be linesize instead of s->width * 2
      // but that is not known before get_buffer()
      FF_ALLOCZ_OR_GOTO(s->avctx, s->me.scratchpad,
 -                      (s->width + 64) * 4 * 16 * 2 * sizeof(uint8_t), fail)
 +                      (s->width + 95) * 4 * 16 * 2 * sizeof(uint8_t), fail)
      s->me.temp         = s->me.scratchpad;
      s->rd_scratchpad   = s->me.scratchpad;
      s->b_scratchpad    = s->me.scratchpad;
@@@ -529,7 -528,7 +528,7 @@@ int ff_mpeg_update_thread_context(AVCod
  {
      MpegEncContext *s = dst->priv_data, *s1 = src->priv_data;
  
 -    if (dst == src || !s1->context_initialized)
 +    if (dst == src)
          return 0;
  
      // FIXME can parameters change on I-frames?
          memcpy(s, s1, sizeof(MpegEncContext));
  
          s->avctx                 = dst;
 -        s->picture_range_start  += MAX_PICTURE_COUNT;
 -        s->picture_range_end    += MAX_PICTURE_COUNT;
          s->bitstream_buffer      = NULL;
          s->bitstream_buffer_size = s->allocated_bitstream_buffer_size = 0;
  
 -        ff_MPV_common_init(s);
 +        if (s1->context_initialized){
 +            s->picture_range_start  += MAX_PICTURE_COUNT;
 +            s->picture_range_end    += MAX_PICTURE_COUNT;
 +            ff_MPV_common_init(s);
 +        }
      }
  
      s->avctx->coded_height  = s1->avctx->coded_height;
      // Error/bug resilience
      s->next_p_frame_damaged = s1->next_p_frame_damaged;
      s->workaround_bugs      = s1->workaround_bugs;
 +    s->padding_bug_score    = s1->padding_bug_score;
  
      // MPEG4 timing info
      memcpy(&s->time_increment_bits, &s1->time_increment_bits,
@@@ -697,89 -693,116 +696,89 @@@ av_cold int ff_MPV_common_init(MpegEncC
      s->flags  = s->avctx->flags;
      s->flags2 = s->avctx->flags2;
  
 -    if (s->width && s->height) {
 -        s->mb_width   = (s->width + 15) / 16;
 -        s->mb_stride  = s->mb_width + 1;
 -        s->b8_stride  = s->mb_width * 2 + 1;
 -        s->b4_stride  = s->mb_width * 4 + 1;
 -        mb_array_size = s->mb_height * s->mb_stride;
 -        mv_table_size = (s->mb_height + 2) * s->mb_stride + 1;
 +    s->mb_width   = (s->width + 15) / 16;
 +    s->mb_stride  = s->mb_width + 1;
 +    s->b8_stride  = s->mb_width * 2 + 1;
 +    s->b4_stride  = s->mb_width * 4 + 1;
 +    mb_array_size = s->mb_height * s->mb_stride;
 +    mv_table_size = (s->mb_height + 2) * s->mb_stride + 1;
  
          /* set chroma shifts */
          avcodec_get_chroma_sub_sample(s->avctx->pix_fmt, &s->chroma_x_shift,
                                        &s->chroma_y_shift);
  
 -        /* set default edge pos, will be overriden
 -         * in decode_header if needed */
 -        s->h_edge_pos = s->mb_width * 16;
 -        s->v_edge_pos = s->mb_height * 16;
 +    /* set default edge pos, will be overridden in decode_header if needed */
 +    s->h_edge_pos = s->mb_width * 16;
 +    s->v_edge_pos = s->mb_height * 16;
  
 -        s->mb_num     = s->mb_width * s->mb_height;
 +    s->mb_num = s->mb_width * s->mb_height;
  
 -        s->block_wrap[0] =
 -        s->block_wrap[1] =
 -        s->block_wrap[2] =
 -        s->block_wrap[3] = s->b8_stride;
 -        s->block_wrap[4] =
 -        s->block_wrap[5] = s->mb_stride;
 +    s->block_wrap[0] =
 +    s->block_wrap[1] =
 +    s->block_wrap[2] =
 +    s->block_wrap[3] = s->b8_stride;
 +    s->block_wrap[4] =
 +    s->block_wrap[5] = s->mb_stride;
  
 -        y_size  = s->b8_stride * (2 * s->mb_height + 1);
 -        c_size  = s->mb_stride * (s->mb_height + 1);
 -        yc_size = y_size + 2   * c_size;
 +    y_size = s->b8_stride * (2 * s->mb_height + 1);
 +    c_size = s->mb_stride * (s->mb_height + 1);
 +    yc_size = y_size + 2 * c_size;
  
 -        /* convert fourcc to upper case */
 -        s->codec_tag          = avpriv_toupper4(s->avctx->codec_tag);
 +    /* convert fourcc to upper case */
 +    s->codec_tag        = avpriv_toupper4(s->avctx->codec_tag);
 +    s->stream_codec_tag = avpriv_toupper4(s->avctx->stream_codec_tag);
  
 -        s->stream_codec_tag   = avpriv_toupper4(s->avctx->stream_codec_tag);
 +    s->avctx->coded_frame = &s->current_picture.f;
  
 -        s->avctx->coded_frame = &s->current_picture.f;
 +    FF_ALLOCZ_OR_GOTO(s->avctx, s->mb_index2xy, (s->mb_num + 1) * sizeof(int), fail); // error ressilience code looks cleaner with this
 +    for (y = 0; y < s->mb_height; y++)
 +        for (x = 0; x < s->mb_width; x++)
 +            s->mb_index2xy[x + y * s->mb_width] = x + y * s->mb_stride;
  
 -        FF_ALLOCZ_OR_GOTO(s->avctx, s->mb_index2xy, (s->mb_num + 1) * sizeof(int),
 -                          fail); // error ressilience code looks cleaner with this
 -        for (y = 0; y < s->mb_height; y++)
 -            for (x = 0; x < s->mb_width; x++)
 -                s->mb_index2xy[x + y * s->mb_width] = x + y * s->mb_stride;
 +    s->mb_index2xy[s->mb_height * s->mb_width] = (s->mb_height - 1) * s->mb_stride + s->mb_width; // FIXME really needed?
  
 -        s->mb_index2xy[s->mb_height * s->mb_width] =
 -                       (s->mb_height - 1) * s->mb_stride + s->mb_width; // FIXME really needed?
 +    if (s->encoding) {
 +        /* Allocate MV tables */
 +        FF_ALLOCZ_OR_GOTO(s->avctx, s->p_mv_table_base            , mv_table_size * 2 * sizeof(int16_t), fail)
 +        FF_ALLOCZ_OR_GOTO(s->avctx, s->b_forw_mv_table_base       , mv_table_size * 2 * sizeof(int16_t), fail)
 +        FF_ALLOCZ_OR_GOTO(s->avctx, s->b_back_mv_table_base       , mv_table_size * 2 * sizeof(int16_t), fail)
 +        FF_ALLOCZ_OR_GOTO(s->avctx, s->b_bidir_forw_mv_table_base , mv_table_size * 2 * sizeof(int16_t), fail)
 +        FF_ALLOCZ_OR_GOTO(s->avctx, s->b_bidir_back_mv_table_base , mv_table_size * 2 * sizeof(int16_t), fail)
 +        FF_ALLOCZ_OR_GOTO(s->avctx, s->b_direct_mv_table_base     , mv_table_size * 2 * sizeof(int16_t), fail)
 +        s->p_mv_table           = s->p_mv_table_base            + s->mb_stride + 1;
 +        s->b_forw_mv_table      = s->b_forw_mv_table_base       + s->mb_stride + 1;
 +        s->b_back_mv_table      = s->b_back_mv_table_base       + s->mb_stride + 1;
 +        s->b_bidir_forw_mv_table= s->b_bidir_forw_mv_table_base + s->mb_stride + 1;
 +        s->b_bidir_back_mv_table= s->b_bidir_back_mv_table_base + s->mb_stride + 1;
 +        s->b_direct_mv_table    = s->b_direct_mv_table_base     + s->mb_stride + 1;
 +
 +        if(s->msmpeg4_version){
 +            FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_stats, 2*2*(MAX_LEVEL+1)*(MAX_RUN+1)*2*sizeof(int), fail);
 +        }
 +        FF_ALLOCZ_OR_GOTO(s->avctx, s->avctx->stats_out, 256, fail);
  
 -        if (s->encoding) {
 -            /* Allocate MV tables */
 -            FF_ALLOCZ_OR_GOTO(s->avctx, s->p_mv_table_base,
 -                              mv_table_size * 2 * sizeof(int16_t), fail);
 -            FF_ALLOCZ_OR_GOTO(s->avctx, s->b_forw_mv_table_base,
 -                              mv_table_size * 2 * sizeof(int16_t), fail);
 -            FF_ALLOCZ_OR_GOTO(s->avctx, s->b_back_mv_table_base,
 -                              mv_table_size * 2 * sizeof(int16_t), fail);
 -            FF_ALLOCZ_OR_GOTO(s->avctx, s->b_bidir_forw_mv_table_base,
 -                              mv_table_size * 2 * sizeof(int16_t), fail);
 -            FF_ALLOCZ_OR_GOTO(s->avctx, s->b_bidir_back_mv_table_base,
 -                              mv_table_size * 2 * sizeof(int16_t), fail);
 -            FF_ALLOCZ_OR_GOTO(s->avctx, s->b_direct_mv_table_base,
 -                              mv_table_size * 2 * sizeof(int16_t), fail);
 -            s->p_mv_table            = s->p_mv_table_base +
 -                                       s->mb_stride + 1;
 -            s->b_forw_mv_table       = s->b_forw_mv_table_base +
 -                                       s->mb_stride + 1;
 -            s->b_back_mv_table       = s->b_back_mv_table_base +
 -                                       s->mb_stride + 1;
 -            s->b_bidir_forw_mv_table = s->b_bidir_forw_mv_table_base +
 -                                       s->mb_stride + 1;
 -            s->b_bidir_back_mv_table = s->b_bidir_back_mv_table_base +
 -                                       s->mb_stride + 1;
 -            s->b_direct_mv_table     = s->b_direct_mv_table_base +
 -                                       s->mb_stride + 1;
 -
 -            if (s->msmpeg4_version) {
 -                FF_ALLOCZ_OR_GOTO(s->avctx, s->ac_stats,
 -                                  2 * 2 * (MAX_LEVEL + 1) *
 -                                  (MAX_RUN + 1) * 2 * sizeof(int), fail);
 -            }
 -            FF_ALLOCZ_OR_GOTO(s->avctx, s->avctx->stats_out, 256, fail);
 -
 -            /* Allocate MB type table */
 -            FF_ALLOCZ_OR_GOTO(s->avctx, s->mb_type, mb_array_size *
 -                              sizeof(uint16_t), fail); // needed for encoding
 -
 -            FF_ALLOCZ_OR_GOTO(s->avctx, s->lambda_table, mb_array_size *
 -                              sizeof(int), fail);
 -
 -            FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix,
 -                              64 * 32   * sizeof(int), fail);
 -            FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix,
 -                              64 * 32   * sizeof(int), fail);
 -            FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix16,
 -                              64 * 32 * 2 * sizeof(uint16_t), fail);
 -            FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix16,
 -                              64 * 32 * 2 * sizeof(uint16_t), fail);
 -            FF_ALLOCZ_OR_GOTO(s->avctx, s->input_picture,
 -                              MAX_PICTURE_COUNT * sizeof(Picture *), fail);
 -            FF_ALLOCZ_OR_GOTO(s->avctx, s->reordered_input_picture,
 -                              MAX_PICTURE_COUNT * sizeof(Picture *), fail);
 -
 -            if (s->avctx->noise_reduction) {
 -                FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_offset,
 -                                  2 * 64 * sizeof(uint16_t), fail);
 -            }
 +        /* Allocate MB type table */
 +        FF_ALLOCZ_OR_GOTO(s->avctx, s->mb_type  , mb_array_size * sizeof(uint16_t), fail) //needed for encoding
 +
 +        FF_ALLOCZ_OR_GOTO(s->avctx, s->lambda_table, mb_array_size * sizeof(int), fail)
 +
 +        FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix         , 64*32   * sizeof(int), fail)
 +        FF_ALLOCZ_OR_GOTO(s->avctx, s->q_chroma_intra_matrix  , 64*32   * sizeof(int), fail)
 +        FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix         , 64*32   * sizeof(int), fail)
 +        FF_ALLOCZ_OR_GOTO(s->avctx, s->q_intra_matrix16       , 64*32*2 * sizeof(uint16_t), fail)
 +        FF_ALLOCZ_OR_GOTO(s->avctx, s->q_chroma_intra_matrix16, 64*32*2 * sizeof(uint16_t), fail)
 +        FF_ALLOCZ_OR_GOTO(s->avctx, s->q_inter_matrix16       , 64*32*2 * sizeof(uint16_t), fail)
 +        FF_ALLOCZ_OR_GOTO(s->avctx, s->input_picture, MAX_PICTURE_COUNT * sizeof(Picture*), fail)
 +        FF_ALLOCZ_OR_GOTO(s->avctx, s->reordered_input_picture, MAX_PICTURE_COUNT * sizeof(Picture*), fail)
 +
 +        if(s->avctx->noise_reduction){
 +            FF_ALLOCZ_OR_GOTO(s->avctx, s->dct_offset, 2 * 64 * sizeof(uint16_t), fail)
 +        }
  
              FF_ALLOC_OR_GOTO(s->avctx, s->cplx_tab,
                               mb_array_size * sizeof(float), fail);
              FF_ALLOC_OR_GOTO(s->avctx, s->bits_tab,
                               mb_array_size * sizeof(float), fail);
 -        }
      }
  
      s->picture_count = MAX_PICTURE_COUNT * FFMAX(1, s->avctx->thread_count);
          avcodec_get_frame_defaults(&s->picture[i].f);
      }
  
 -    if (s->width && s->height) {
          FF_ALLOC_OR_GOTO(s->avctx, s->er_temp_buffer,
                           mb_array_size * sizeof(uint8_t), fail);
          FF_ALLOCZ_OR_GOTO(s->avctx, s->error_status_table,
                            mb_array_size * sizeof(uint8_t), fail);
  
 -        if (s->codec_id == CODEC_ID_MPEG4 ||
 -            (s->flags & CODEC_FLAG_INTERLACED_ME)) {
 +        if(s->codec_id==CODEC_ID_MPEG4 || (s->flags & CODEC_FLAG_INTERLACED_ME)){
              /* interlaced direct mode decoding tables */
              for (i = 0; i < 2; i++) {
                  int j, k;
                  for (j = 0; j < 2; j++) {
                      for (k = 0; k < 2; k++) {
 -                        FF_ALLOCZ_OR_GOTO(s->avctx,
 -                                          s->b_field_mv_table_base[i][j][k],
 -                                          mv_table_size * 2 * sizeof(int16_t),
 -                                          fail);
 -                        s->b_field_mv_table[i][j][k] = s->b_field_mv_table_base[i][j][k] +
 -                                                       s->mb_stride + 1;
 +                        FF_ALLOCZ_OR_GOTO(s->avctx, s->b_field_mv_table_base[i][j][k],  mv_table_size * 2 * sizeof(int16_t), fail)
 +                        s->b_field_mv_table[i][j][k] = s->b_field_mv_table_base[i][j][k] + s->mb_stride + 1;
                      }
 -                    FF_ALLOCZ_OR_GOTO(s->avctx, s->b_field_select_table [i][j],
 -                                      mb_array_size * 2 * sizeof(uint8_t),
 -                                      fail);
 -                    FF_ALLOCZ_OR_GOTO(s->avctx, s->p_field_mv_table_base[i][j],
 -                                      mv_table_size * 2 * sizeof(int16_t),
 -                                      fail);
 -                    s->p_field_mv_table[i][j] = s->p_field_mv_table_base[i][j]
 -                                                + s->mb_stride + 1;
 +                    FF_ALLOCZ_OR_GOTO(s->avctx, s->b_field_select_table [i][j], mb_array_size * 2 * sizeof(uint8_t), fail)
 +                    FF_ALLOCZ_OR_GOTO(s->avctx, s->p_field_mv_table_base[i][j], mv_table_size * 2 * sizeof(int16_t), fail)
 +                    s->p_field_mv_table[i][j] = s->p_field_mv_table_base[i][j] + s->mb_stride + 1;
                  }
 -                FF_ALLOCZ_OR_GOTO(s->avctx, s->p_field_select_table[i],
 -                                  mb_array_size * 2 * sizeof(uint8_t),
 -                                  fail);
 +                FF_ALLOCZ_OR_GOTO(s->avctx, s->p_field_select_table[i], mb_array_size * 2 * sizeof(uint8_t), fail)
              }
          }
          if (s->out_format == FMT_H263) {
              s->coded_block = s->coded_block_base + s->b8_stride + 1;
  
              /* cbp, ac_pred, pred_dir */
 -            FF_ALLOCZ_OR_GOTO(s->avctx, s->cbp_table,
 -                              mb_array_size * sizeof(uint8_t), fail);
 -            FF_ALLOCZ_OR_GOTO(s->avctx, s->pred_dir_table,
 -                              mb_array_size * sizeof(uint8_t), fail);
 +            FF_ALLOCZ_OR_GOTO(s->avctx, s->cbp_table     , mb_array_size * sizeof(uint8_t), fail);
 +            FF_ALLOCZ_OR_GOTO(s->avctx, s->pred_dir_table, mb_array_size * sizeof(uint8_t), fail);
          }
  
          if (s->h263_pred || s->h263_plus || !s->encoding) {
              /* dc values */
              // MN: we need these for  error resilience of intra-frames
 -            FF_ALLOCZ_OR_GOTO(s->avctx, s->dc_val_base,
 -                              yc_size * sizeof(int16_t), fail);
 +            FF_ALLOCZ_OR_GOTO(s->avctx, s->dc_val_base, yc_size * sizeof(int16_t), fail);
              s->dc_val[0] = s->dc_val_base + s->b8_stride + 1;
              s->dc_val[1] = s->dc_val_base + y_size + s->mb_stride + 1;
              s->dc_val[2] = s->dc_val[1] + c_size;
          // Note the + 1 is for  a quicker mpeg4 slice_end detection
  
          s->parse_context.state = -1;
 -        if ((s->avctx->debug & (FF_DEBUG_VIS_QP | FF_DEBUG_VIS_MB_TYPE)) ||
 -            s->avctx->debug_mv) {
 -            s->visualization_buffer[0] = av_malloc((s->mb_width * 16 +
 -                        2 * EDGE_WIDTH) * s->mb_height * 16 + 2 * EDGE_WIDTH);
 -            s->visualization_buffer[1] = av_malloc((s->mb_width * 16 +
 -                        2 * EDGE_WIDTH) * s->mb_height * 16 + 2 * EDGE_WIDTH);
 -            s->visualization_buffer[2] = av_malloc((s->mb_width * 16 +
 -                        2 * EDGE_WIDTH) * s->mb_height * 16 + 2 * EDGE_WIDTH);
 -        }
 -    }
  
 -    s->context_initialized = 1;
 -    s->thread_context[0]   = s;
 +        s->context_initialized = 1;
 +        s->thread_context[0]   = s;
  
 -    if (s->width && s->height) {
 +//     if (s->width && s->height) {
          if (nb_slices > 1) {
              for (i = 1; i < nb_slices; i++) {
                  s->thread_context[i] = av_malloc(sizeof(MpegEncContext));
              s->end_mb_y   = s->mb_height;
          }
          s->slice_context_count = nb_slices;
 -    }
 +//     }
  
      return 0;
   fail:
@@@ -934,10 -983,6 +933,10 @@@ void ff_MPV_common_end(MpegEncContext *
      av_freep(&s->er_temp_buffer);
      av_freep(&s->mb_index2xy);
      av_freep(&s->lambda_table);
 +    if(s->q_chroma_intra_matrix   != s->q_intra_matrix  ) av_freep(&s->q_chroma_intra_matrix);
 +    if(s->q_chroma_intra_matrix16 != s->q_intra_matrix16) av_freep(&s->q_chroma_intra_matrix16);
 +    s->q_chroma_intra_matrix=   NULL;
 +    s->q_chroma_intra_matrix16= NULL;
      av_freep(&s->q_intra_matrix);
      av_freep(&s->q_inter_matrix);
      av_freep(&s->q_intra_matrix16);
@@@ -1094,21 -1139,7 +1093,21 @@@ int ff_find_unused_picture(MpegEncConte
          }
      }
  
 -    return AVERROR_INVALIDDATA;
 +    av_log(s->avctx, AV_LOG_FATAL,
 +           "Internal error, picture buffer overflow\n");
 +    /* We could return -1, but the codec would crash trying to draw into a
 +     * non-existing frame anyway. This is safer than waiting for a random crash.
 +     * Also the return of this is never useful, an encoder must only allocate
 +     * as much as allowed in the specification. This has no relationship to how
 +     * much libavcodec could allocate (and MAX_PICTURE_COUNT is always large
 +     * enough for such valid streams).
 +     * Plus, a decoder has to check stream validity and remove frames if too
 +     * many reference frames are around. Waiting for "OOM" is not correct at
 +     * all. Similarly, missing reference frames have to be replaced by
 +     * interpolated/MC frames, anything else is a bug in the codec ...
 +     */
 +    abort();
 +    return -1;
  }
  
  static void update_noise_reduction(MpegEncContext *s)
@@@ -1145,11 -1176,6 +1144,11 @@@ int ff_MPV_frame_start(MpegEncContext *
      assert(s->last_picture_ptr == NULL || s->out_format != FMT_H264 ||
             s->codec_id == CODEC_ID_SVQ3);
  
 +    if (!ff_thread_can_start_frame(avctx)) {
 +        av_log(avctx, AV_LOG_ERROR, "Attempt to start a frame outside SETUP state\n");
 +        return -1;
 +    }
 +
      /* mark & release old frames */
      if (s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3) {
          if (s->pict_type != AV_PICTURE_TYPE_B && s->last_picture_ptr &&
              pic = s->current_picture_ptr;
          } else {
              i   = ff_find_unused_picture(s, 0);
 +            if (i < 0)
 +                return i;
              pic = &s->picture[i];
          }
  
  
              /* Allocate a dummy frame */
              i = ff_find_unused_picture(s, 0);
 +            if (i < 0)
 +                return i;
              s->last_picture_ptr = &s->picture[i];
 +            s->last_picture_ptr->f.key_frame = 0;
              if (ff_alloc_picture(s, s->last_picture_ptr, 0) < 0) {
                  s->last_picture_ptr = NULL;
                  return -1;
              }
 +
 +            if(s->codec_id == CODEC_ID_FLV1 || s->codec_id == CODEC_ID_H263){
 +                for(i=0; i<avctx->height; i++)
 +                    memset(s->last_picture_ptr->f.data[0] + s->last_picture_ptr->f.linesize[0]*i, 16, avctx->width);
 +            }
 +
              ff_thread_report_progress(&s->last_picture_ptr->f, INT_MAX, 0);
              ff_thread_report_progress(&s->last_picture_ptr->f, INT_MAX, 1);
              s->last_picture_ptr->f.reference = 3;
              s->pict_type == AV_PICTURE_TYPE_B) {
              /* Allocate a dummy frame */
              i = ff_find_unused_picture(s, 0);
 +            if (i < 0)
 +                return i;
              s->next_picture_ptr = &s->picture[i];
 +            s->next_picture_ptr->f.key_frame = 0;
              if (ff_alloc_picture(s, s->next_picture_ptr, 0) < 0) {
                  s->next_picture_ptr = NULL;
                  return -1;
@@@ -1353,7 -1365,7 +1352,7 @@@ void ff_MPV_frame_end(MpegEncContext *s
      // just to make sure that all data is rendered.
      if (CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration) {
          ff_xvmc_field_end(s);
 -   } else if ((s->error_count || s->encoding) &&
 +   } else if((s->error_count || s->encoding || !(s->avctx->codec->capabilities&CODEC_CAP_DRAW_HORIZ_BAND)) &&
                !s->avctx->hwaccel &&
                !(s->avctx->codec->capabilities & CODEC_CAP_HWACCEL_VDPAU) &&
                s->unrestricted_mv &&
                !(s->flags & CODEC_FLAG_EMU_EDGE)) {
          int hshift = av_pix_fmt_descriptors[s->avctx->pix_fmt].log2_chroma_w;
          int vshift = av_pix_fmt_descriptors[s->avctx->pix_fmt].log2_chroma_h;
 -        s->dsp.draw_edges(s->current_picture.f.data[0], s->linesize,
 +        s->dsp.draw_edges(s->current_picture.f.data[0], s->current_picture.f.linesize[0],
                            s->h_edge_pos, s->v_edge_pos,
                            EDGE_WIDTH, EDGE_WIDTH,
                            EDGE_TOP | EDGE_BOTTOM);
 -        s->dsp.draw_edges(s->current_picture.f.data[1], s->uvlinesize,
 +        s->dsp.draw_edges(s->current_picture.f.data[1], s->current_picture.f.linesize[1],
                            s->h_edge_pos >> hshift, s->v_edge_pos >> vshift,
                            EDGE_WIDTH >> hshift, EDGE_WIDTH >> vshift,
                            EDGE_TOP | EDGE_BOTTOM);
 -        s->dsp.draw_edges(s->current_picture.f.data[2], s->uvlinesize,
 +        s->dsp.draw_edges(s->current_picture.f.data[2], s->current_picture.f.linesize[2],
                            s->h_edge_pos >> hshift, s->v_edge_pos >> vshift,
                            EDGE_WIDTH >> hshift, EDGE_WIDTH >> vshift,
                            EDGE_TOP | EDGE_BOTTOM);
@@@ -1443,11 -1455,11 +1442,11 @@@ static void draw_line(uint8_t *buf, in
          buf += sx + sy * stride;
          ex  -= sx;
          f    = ((ey - sy) << 16) / ex;
 -        for (x = 0; x = ex; x++) {
 +        for(x= 0; x <= ex; x++){
              y  = (x * f) >> 16;
              fr = (x * f) & 0xFFFF;
              buf[y * stride + x]       += (color * (0x10000 - fr)) >> 16;
 -            buf[(y + 1) * stride + x] += (color *            fr ) >> 16;
 +            if(fr) buf[(y + 1) * stride + x] += (color *            fr ) >> 16;
          }
      } else {
          if (sy > ey) {
          buf += sx + sy * stride;
          ey  -= sy;
          if (ey)
 -            f  = ((ex - sx) << 16) / ey;
 +            f = ((ex - sx) << 16) / ey;
          else
              f = 0;
 -        for (y = 0; y = ey; y++) {
 -            x  = (y * f) >> 16;
 -            fr = (y * f) & 0xFFFF;
 +        for(y= 0; y <= ey; y++){
 +            x  = (y*f) >> 16;
 +            fr = (y*f) & 0xFFFF;
              buf[y * stride + x]     += (color * (0x10000 - fr)) >> 16;
 -            buf[y * stride + x + 1] += (color *            fr ) >> 16;
 +            if(fr) buf[y * stride + x + 1] += (color *            fr ) >> 16;
          }
      }
  }
@@@ -1515,8 -1527,27 +1514,8 @@@ void ff_print_debug_info(MpegEncContex
      if (s->avctx->debug & (FF_DEBUG_SKIP | FF_DEBUG_QP | FF_DEBUG_MB_TYPE)) {
          int x,y;
  
 -        av_log(s->avctx,AV_LOG_DEBUG,"New frame, type: ");
 -        switch (pict->pict_type) {
 -        case AV_PICTURE_TYPE_I:
 -            av_log(s->avctx,AV_LOG_DEBUG,"I\n");
 -            break;
 -        case AV_PICTURE_TYPE_P:
 -            av_log(s->avctx,AV_LOG_DEBUG,"P\n");
 -            break;
 -        case AV_PICTURE_TYPE_B:
 -            av_log(s->avctx,AV_LOG_DEBUG,"B\n");
 -            break;
 -        case AV_PICTURE_TYPE_S:
 -            av_log(s->avctx,AV_LOG_DEBUG,"S\n");
 -            break;
 -        case AV_PICTURE_TYPE_SI:
 -            av_log(s->avctx,AV_LOG_DEBUG,"SI\n");
 -            break;
 -        case AV_PICTURE_TYPE_SP:
 -            av_log(s->avctx,AV_LOG_DEBUG,"SP\n");
 -            break;
 -        }
 +        av_log(s->avctx, AV_LOG_DEBUG, "New frame, type: %c\n",
 +               av_get_picture_type_char(pict->pict_type));
          for (y = 0; y < s->mb_height; y++) {
              for (x = 0; x < s->mb_width; x++) {
                  if (s->avctx->debug & FF_DEBUG_SKIP) {
          avcodec_get_chroma_sub_sample(s->avctx->pix_fmt,
                                        &h_chroma_shift, &v_chroma_shift);
          for (i = 0; i < 3; i++) {
 -            memcpy(s->visualization_buffer[i], pict->data[i],
 -                   (i == 0) ? pict->linesize[i] * height:
 -                              pict->linesize[i] * height >> v_chroma_shift);
 +            size_t size= (i == 0) ? pict->linesize[i] * height:
 +                         pict->linesize[i] * height >> v_chroma_shift;
 +            s->visualization_buffer[i]= av_realloc(s->visualization_buffer[i], size);
 +            memcpy(s->visualization_buffer[i], pict->data[i], size);
              pict->data[i] = s->visualization_buffer[i];
          }
          pict->type   = FF_BUFFER_TYPE_COPY;
 +        pict->opaque= NULL;
          ptr          = pict->data[0];
          block_height = 16 >> v_chroma_shift;
  
                                             height, s->linesize, 100);
                              }
                          } else {
 -                              int sx = mb_x * 16 + 8;
 -                              int sy = mb_y * 16 + 8;
 -                              int xy = (mb_x + mb_y * mv_stride) << mv_sample_log2;
 -                              int mx = pict->motion_val[direction][xy][0] >> shift + sx;
 -                              int my = pict->motion_val[direction][xy][1] >> shift + sy;
 +                              int sx= mb_x * 16 + 8;
 +                              int sy= mb_y * 16 + 8;
 +                              int xy= (mb_x + mb_y * mv_stride) << mv_sample_log2;
 +                              int mx= (pict->motion_val[direction][xy][0]>>shift) + sx;
 +                              int my= (pict->motion_val[direction][xy][1]>>shift) + sy;
                                draw_arrow(ptr, sx, sy, mx, my, width, height, s->linesize, 100);
                          }
                      }
      }
  }
  
 +static inline int hpel_motion_lowres(MpegEncContext *s,
 +                                     uint8_t *dest, uint8_t *src,
 +                                     int field_based, int field_select,
 +                                     int src_x, int src_y,
 +                                     int width, int height, int stride,
 +                                     int h_edge_pos, int v_edge_pos,
 +                                     int w, int h, h264_chroma_mc_func *pix_op,
 +                                     int motion_x, int motion_y)
 +{
 +    const int lowres   = s->avctx->lowres;
 +    const int op_index = FFMIN(lowres, 2);
 +    const int s_mask   = (2 << lowres) - 1;
 +    int emu = 0;
 +    int sx, sy;
 +
 +    if (s->quarter_sample) {
 +        motion_x /= 2;
 +        motion_y /= 2;
 +    }
 +
 +    sx = motion_x & s_mask;
 +    sy = motion_y & s_mask;
 +    src_x += motion_x >> lowres + 1;
 +    src_y += motion_y >> lowres + 1;
 +
 +    src   += src_y * stride + src_x;
 +
 +    if ((unsigned)src_x > FFMAX( h_edge_pos - (!!sx) - w,                 0) ||
 +        (unsigned)src_y > FFMAX((v_edge_pos >> field_based) - (!!sy) - h, 0)) {
 +        s->dsp.emulated_edge_mc(s->edge_emu_buffer, src, s->linesize, w + 1,
 +                                (h + 1) << field_based, src_x,
 +                                src_y   << field_based,
 +                                h_edge_pos,
 +                                v_edge_pos);
 +        src = s->edge_emu_buffer;
 +        emu = 1;
 +    }
 +
 +    sx = (sx << 2) >> lowres;
 +    sy = (sy << 2) >> lowres;
 +    if (field_select)
 +        src += s->linesize;
 +    pix_op[op_index](dest, src, stride, h, sx, sy);
 +    return emu;
 +}
 +
 +/* apply one mpeg motion vector to the three components */
 +static av_always_inline void mpeg_motion_lowres(MpegEncContext *s,
 +                                                uint8_t *dest_y,
 +                                                uint8_t *dest_cb,
 +                                                uint8_t *dest_cr,
 +                                                int field_based,
 +                                                int bottom_field,
 +                                                int field_select,
 +                                                uint8_t **ref_picture,
 +                                                h264_chroma_mc_func *pix_op,
 +                                                int motion_x, int motion_y,
 +                                                int h, int mb_y)
 +{
 +    uint8_t *ptr_y, *ptr_cb, *ptr_cr;
 +    int mx, my, src_x, src_y, uvsrc_x, uvsrc_y, uvlinesize, linesize, sx, sy,
 +        uvsx, uvsy;
 +    const int lowres     = s->avctx->lowres;
 +    const int op_index   = FFMIN(lowres-1+s->chroma_x_shift, 2);
 +    const int block_s    = 8>>lowres;
 +    const int s_mask     = (2 << lowres) - 1;
 +    const int h_edge_pos = s->h_edge_pos >> lowres;
 +    const int v_edge_pos = s->v_edge_pos >> lowres;
 +    linesize   = s->current_picture.f.linesize[0] << field_based;
 +    uvlinesize = s->current_picture.f.linesize[1] << field_based;
 +
 +    // FIXME obviously not perfect but qpel will not work in lowres anyway
 +    if (s->quarter_sample) {
 +        motion_x /= 2;
 +        motion_y /= 2;
 +    }
 +
 +    if(field_based){
 +        motion_y += (bottom_field - field_select)*((1 << lowres)-1);
 +    }
 +
 +    sx = motion_x & s_mask;
 +    sy = motion_y & s_mask;
 +    src_x = s->mb_x * 2 * block_s + (motion_x >> lowres + 1);
 +    src_y = (mb_y * 2 * block_s >> field_based) + (motion_y >> lowres + 1);
 +
 +    if (s->out_format == FMT_H263) {
 +        uvsx    = ((motion_x >> 1) & s_mask) | (sx & 1);
 +        uvsy    = ((motion_y >> 1) & s_mask) | (sy & 1);
 +        uvsrc_x = src_x >> 1;
 +        uvsrc_y = src_y >> 1;
 +    } else if (s->out_format == FMT_H261) {
 +        // even chroma mv's are full pel in H261
 +        mx      = motion_x / 4;
 +        my      = motion_y / 4;
 +        uvsx    = (2 * mx) & s_mask;
 +        uvsy    = (2 * my) & s_mask;
 +        uvsrc_x = s->mb_x * block_s + (mx >> lowres);
 +        uvsrc_y =    mb_y * block_s + (my >> lowres);
 +    } else {
 +        if(s->chroma_y_shift){
 +            mx      = motion_x / 2;
 +            my      = motion_y / 2;
 +            uvsx    = mx & s_mask;
 +            uvsy    = my & s_mask;
 +            uvsrc_x = s->mb_x * block_s                 + (mx >> lowres + 1);
 +            uvsrc_y =   (mb_y * block_s >> field_based) + (my >> lowres + 1);
 +        } else {
 +            if(s->chroma_x_shift){
 +            //Chroma422
 +                mx = motion_x / 2;
 +                uvsx = mx & s_mask;
 +                uvsy = motion_y & s_mask;
 +                uvsrc_y = src_y;
 +                uvsrc_x = s->mb_x*block_s               + (mx >> (lowres+1));
 +            } else {
 +            //Chroma444
 +                uvsx = motion_x & s_mask;
 +                uvsy = motion_y & s_mask;
 +                uvsrc_x = src_x;
 +                uvsrc_y = src_y;
 +            }
 +        }
 +    }
 +
 +    ptr_y  = ref_picture[0] + src_y   * linesize   + src_x;
 +    ptr_cb = ref_picture[1] + uvsrc_y * uvlinesize + uvsrc_x;
 +    ptr_cr = ref_picture[2] + uvsrc_y * uvlinesize + uvsrc_x;
 +
 +    if ((unsigned) src_x > FFMAX( h_edge_pos - (!!sx) - 2 * block_s,       0) ||
 +        (unsigned) src_y > FFMAX((v_edge_pos >> field_based) - (!!sy) - h, 0)) {
 +        s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr_y,
 +                                s->linesize, 17, 17 + field_based,
 +                                src_x, src_y << field_based, h_edge_pos,
 +                                v_edge_pos);
 +        ptr_y = s->edge_emu_buffer;
 +        if (!CONFIG_GRAY || !(s->flags & CODEC_FLAG_GRAY)) {
 +            uint8_t *uvbuf = s->edge_emu_buffer + 18 * s->linesize;
 +            s->dsp.emulated_edge_mc(uvbuf , ptr_cb, s->uvlinesize, 9,
 +                                    9 + field_based,
 +                                    uvsrc_x, uvsrc_y << field_based,
 +                                    h_edge_pos >> 1, v_edge_pos >> 1);
 +            s->dsp.emulated_edge_mc(uvbuf + 16, ptr_cr, s->uvlinesize, 9,
 +                                    9 + field_based,
 +                                    uvsrc_x, uvsrc_y << field_based,
 +                                    h_edge_pos >> 1, v_edge_pos >> 1);
 +            ptr_cb = uvbuf;
 +            ptr_cr = uvbuf + 16;
 +        }
 +    }
 +
 +    // FIXME use this for field pix too instead of the obnoxious hack which changes picture.f.data
 +    if (bottom_field) {
 +        dest_y  += s->linesize;
 +        dest_cb += s->uvlinesize;
 +        dest_cr += s->uvlinesize;
 +    }
 +
 +    if (field_select) {
 +        ptr_y   += s->linesize;
 +        ptr_cb  += s->uvlinesize;
 +        ptr_cr  += s->uvlinesize;
 +    }
 +
 +    sx = (sx << 2) >> lowres;
 +    sy = (sy << 2) >> lowres;
 +    pix_op[lowres - 1](dest_y, ptr_y, linesize, h, sx, sy);
 +
 +    if (!CONFIG_GRAY || !(s->flags & CODEC_FLAG_GRAY)) {
 +        uvsx = (uvsx << 2) >> lowres;
 +        uvsy = (uvsy << 2) >> lowres;
 +        if (h >> s->chroma_y_shift) {
 +            pix_op[op_index](dest_cb, ptr_cb, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
 +            pix_op[op_index](dest_cr, ptr_cr, uvlinesize, h >> s->chroma_y_shift, uvsx, uvsy);
 +        }
 +    }
 +    // FIXME h261 lowres loop filter
 +}
 +
 +static inline void chroma_4mv_motion_lowres(MpegEncContext *s,
 +                                            uint8_t *dest_cb, uint8_t *dest_cr,
 +                                            uint8_t **ref_picture,
 +                                            h264_chroma_mc_func * pix_op,
 +                                            int mx, int my)
 +{
 +    const int lowres     = s->avctx->lowres;
 +    const int op_index   = FFMIN(lowres, 2);
 +    const int block_s    = 8 >> lowres;
 +    const int s_mask     = (2 << lowres) - 1;
 +    const int h_edge_pos = s->h_edge_pos >> lowres + 1;
 +    const int v_edge_pos = s->v_edge_pos >> lowres + 1;
 +    int emu = 0, src_x, src_y, offset, sx, sy;
 +    uint8_t *ptr;
 +
 +    if (s->quarter_sample) {
 +        mx /= 2;
 +        my /= 2;
 +    }
 +
 +    /* In case of 8X8, we construct a single chroma motion vector
 +       with a special rounding */
 +    mx = ff_h263_round_chroma(mx);
 +    my = ff_h263_round_chroma(my);
 +
 +    sx = mx & s_mask;
 +    sy = my & s_mask;
 +    src_x = s->mb_x * block_s + (mx >> lowres + 1);
 +    src_y = s->mb_y * block_s + (my >> lowres + 1);
 +
 +    offset = src_y * s->uvlinesize + src_x;
 +    ptr = ref_picture[1] + offset;
 +    if (s->flags & CODEC_FLAG_EMU_EDGE) {
 +        if ((unsigned) src_x > FFMAX(h_edge_pos - (!!sx) - block_s, 0) ||
 +            (unsigned) src_y > FFMAX(v_edge_pos - (!!sy) - block_s, 0)) {
 +            s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize,
 +                                    9, 9, src_x, src_y, h_edge_pos, v_edge_pos);
 +            ptr = s->edge_emu_buffer;
 +            emu = 1;
 +        }
 +    }
 +    sx = (sx << 2) >> lowres;
 +    sy = (sy << 2) >> lowres;
 +    pix_op[op_index](dest_cb, ptr, s->uvlinesize, block_s, sx, sy);
 +
 +    ptr = ref_picture[2] + offset;
 +    if (emu) {
 +        s->dsp.emulated_edge_mc(s->edge_emu_buffer, ptr, s->uvlinesize, 9, 9,
 +                                src_x, src_y, h_edge_pos, v_edge_pos);
 +        ptr = s->edge_emu_buffer;
 +    }
 +    pix_op[op_index](dest_cr, ptr, s->uvlinesize, block_s, sx, sy);
 +}
 +
 +/**
 + * motion compensation of a single macroblock
 + * @param s context
 + * @param dest_y luma destination pointer
 + * @param dest_cb chroma cb/u destination pointer
 + * @param dest_cr chroma cr/v destination pointer
 + * @param dir direction (0->forward, 1->backward)
 + * @param ref_picture array[3] of pointers to the 3 planes of the reference picture
 + * @param pix_op halfpel motion compensation function (average or put normally)
 + * the motion vectors are taken from s->mv and the MV type from s->mv_type
 + */
 +static inline void MPV_motion_lowres(MpegEncContext *s,
 +                                     uint8_t *dest_y, uint8_t *dest_cb,
 +                                     uint8_t *dest_cr,
 +                                     int dir, uint8_t **ref_picture,
 +                                     h264_chroma_mc_func *pix_op)
 +{
 +    int mx, my;
 +    int mb_x, mb_y, i;
 +    const int lowres  = s->avctx->lowres;
 +    const int block_s = 8 >>lowres;
 +
 +    mb_x = s->mb_x;
 +    mb_y = s->mb_y;
 +
 +    switch (s->mv_type) {
 +    case MV_TYPE_16X16:
 +        mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
 +                           0, 0, 0,
 +                           ref_picture, pix_op,
 +                           s->mv[dir][0][0], s->mv[dir][0][1],
 +                           2 * block_s, mb_y);
 +        break;
 +    case MV_TYPE_8X8:
 +        mx = 0;
 +        my = 0;
 +        for (i = 0; i < 4; i++) {
 +            hpel_motion_lowres(s, dest_y + ((i & 1) + (i >> 1) *
 +                               s->linesize) * block_s,
 +                               ref_picture[0], 0, 0,
 +                               (2 * mb_x + (i & 1)) * block_s,
 +                               (2 * mb_y + (i >> 1)) * block_s,
 +                               s->width, s->height, s->linesize,
 +                               s->h_edge_pos >> lowres, s->v_edge_pos >> lowres,
 +                               block_s, block_s, pix_op,
 +                               s->mv[dir][i][0], s->mv[dir][i][1]);
 +
 +            mx += s->mv[dir][i][0];
 +            my += s->mv[dir][i][1];
 +        }
 +
 +        if (!CONFIG_GRAY || !(s->flags & CODEC_FLAG_GRAY))
 +            chroma_4mv_motion_lowres(s, dest_cb, dest_cr, ref_picture,
 +                                     pix_op, mx, my);
 +        break;
 +    case MV_TYPE_FIELD:
 +        if (s->picture_structure == PICT_FRAME) {
 +            /* top field */
 +            mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
 +                               1, 0, s->field_select[dir][0],
 +                               ref_picture, pix_op,
 +                               s->mv[dir][0][0], s->mv[dir][0][1],
 +                               block_s, mb_y);
 +            /* bottom field */
 +            mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
 +                               1, 1, s->field_select[dir][1],
 +                               ref_picture, pix_op,
 +                               s->mv[dir][1][0], s->mv[dir][1][1],
 +                               block_s, mb_y);
 +        } else {
 +            if (s->picture_structure != s->field_select[dir][0] + 1 &&
 +                s->pict_type != AV_PICTURE_TYPE_B && !s->first_field) {
 +                ref_picture = s->current_picture_ptr->f.data;
 +
 +            }
 +            mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
 +                               0, 0, s->field_select[dir][0],
 +                               ref_picture, pix_op,
 +                               s->mv[dir][0][0],
 +                               s->mv[dir][0][1], 2 * block_s, mb_y >> 1);
 +            }
 +        break;
 +    case MV_TYPE_16X8:
 +        for (i = 0; i < 2; i++) {
 +            uint8_t **ref2picture;
 +
 +            if (s->picture_structure == s->field_select[dir][i] + 1 ||
 +                s->pict_type == AV_PICTURE_TYPE_B || s->first_field) {
 +                ref2picture = ref_picture;
 +            } else {
 +                ref2picture = s->current_picture_ptr->f.data;
 +            }
 +
 +            mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
 +                               0, 0, s->field_select[dir][i],
 +                               ref2picture, pix_op,
 +                               s->mv[dir][i][0], s->mv[dir][i][1] +
 +                               2 * block_s * i, block_s, mb_y >> 1);
 +
 +            dest_y  +=  2 * block_s *  s->linesize;
 +            dest_cb += (2 * block_s >> s->chroma_y_shift) * s->uvlinesize;
 +            dest_cr += (2 * block_s >> s->chroma_y_shift) * s->uvlinesize;
 +        }
 +        break;
 +    case MV_TYPE_DMV:
 +        if (s->picture_structure == PICT_FRAME) {
 +            for (i = 0; i < 2; i++) {
 +                int j;
 +                for (j = 0; j < 2; j++) {
 +                    mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
 +                                       1, j, j ^ i,
 +                                       ref_picture, pix_op,
 +                                       s->mv[dir][2 * i + j][0],
 +                                       s->mv[dir][2 * i + j][1],
 +                                       block_s, mb_y);
 +                }
 +                pix_op = s->dsp.avg_h264_chroma_pixels_tab;
 +            }
 +        } else {
 +            for (i = 0; i < 2; i++) {
 +                mpeg_motion_lowres(s, dest_y, dest_cb, dest_cr,
 +                                   0, 0, s->picture_structure != i + 1,
 +                                   ref_picture, pix_op,
 +                                   s->mv[dir][2 * i][0],s->mv[dir][2 * i][1],
 +                                   2 * block_s, mb_y >> 1);
 +
 +                // after put we make avg of the same block
 +                pix_op = s->dsp.avg_h264_chroma_pixels_tab;
 +
 +                // opposite parity is always in the same
 +                // frame if this is second field
 +                if (!s->first_field) {
 +                    ref_picture = s->current_picture_ptr->f.data;
 +                }
 +            }
 +        }
 +        break;
 +    default:
 +        assert(0);
 +    }
 +}
 +
  /**
   * find the lowest MB row referenced in the MVs
   */
@@@ -2279,7 -1933,7 +2278,7 @@@ void ff_clean_intra_table_entries(MpegE
   */
  static av_always_inline
  void MPV_decode_mb_internal(MpegEncContext *s, DCTELEM block[12][64],
 -                            int is_mpeg12)
 +                            int lowres_flag, int is_mpeg12)
  {
      const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
      if(CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration){
          qpel_mc_func (*op_qpix)[16];
          const int linesize   = s->current_picture.f.linesize[0]; //not s->linesize as this would be wrong for field pics
          const int uvlinesize = s->current_picture.f.linesize[1];
 -        const int readable= s->pict_type != AV_PICTURE_TYPE_B || s->encoding || s->avctx->draw_horiz_band;
 -        const int block_size = 8;
 +        const int readable= s->pict_type != AV_PICTURE_TYPE_B || s->encoding || s->avctx->draw_horiz_band || lowres_flag;
 +        const int block_size= lowres_flag ? 8>>s->avctx->lowres : 8;
  
          /* avoid copy if macroblock skipped in last frame too */
          /* skip only during decoding as we might trash the buffers during encoding a bit */
                      }
                  }
  
 -                op_qpix= s->me.qpel_put;
 -                if ((!s->no_rounding) || s->pict_type==AV_PICTURE_TYPE_B){
 -                    op_pix = s->dsp.put_pixels_tab;
 +                if(lowres_flag){
 +                    h264_chroma_mc_func *op_pix = s->dsp.put_h264_chroma_pixels_tab;
 +
 +                    if (s->mv_dir & MV_DIR_FORWARD) {
 +                        MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.f.data, op_pix);
 +                        op_pix = s->dsp.avg_h264_chroma_pixels_tab;
 +                    }
 +                    if (s->mv_dir & MV_DIR_BACKWARD) {
 +                        MPV_motion_lowres(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.f.data, op_pix);
 +                    }
                  }else{
 -                    op_pix = s->dsp.put_no_rnd_pixels_tab;
 -                }
 -                if (s->mv_dir & MV_DIR_FORWARD) {
 -                    MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.f.data, op_pix, op_qpix);
 -                    op_pix = s->dsp.avg_pixels_tab;
 -                    op_qpix= s->me.qpel_avg;
 -                }
 -                if (s->mv_dir & MV_DIR_BACKWARD) {
 -                    MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.f.data, op_pix, op_qpix);
 +                    op_qpix= s->me.qpel_put;
 +                    if ((!s->no_rounding) || s->pict_type==AV_PICTURE_TYPE_B){
 +                        op_pix = s->dsp.put_pixels_tab;
 +                    }else{
 +                        op_pix = s->dsp.put_no_rnd_pixels_tab;
 +                    }
 +                    if (s->mv_dir & MV_DIR_FORWARD) {
 +                        MPV_motion(s, dest_y, dest_cb, dest_cr, 0, s->last_picture.f.data, op_pix, op_qpix);
 +                        op_pix = s->dsp.avg_pixels_tab;
 +                        op_qpix= s->me.qpel_avg;
 +                    }
 +                    if (s->mv_dir & MV_DIR_BACKWARD) {
 +                        MPV_motion(s, dest_y, dest_cb, dest_cr, 1, s->next_picture.f.data, op_pix, op_qpix);
 +                    }
                  }
              }
  
                      }else{
                          //chroma422
                          dct_linesize = uvlinesize << s->interlaced_dct;
 -                        dct_offset   = s->interlaced_dct ? uvlinesize : uvlinesize * 8;
 +                        dct_offset   = s->interlaced_dct ? uvlinesize : uvlinesize*block_size;
  
                          add_dct(s, block[4], 4, dest_cb, dct_linesize);
                          add_dct(s, block[5], 5, dest_cr, dct_linesize);
                          add_dct(s, block[6], 6, dest_cb+dct_offset, dct_linesize);
                          add_dct(s, block[7], 7, dest_cr+dct_offset, dct_linesize);
                          if(!s->chroma_x_shift){//Chroma444
 -                            add_dct(s, block[8], 8, dest_cb+8, dct_linesize);
 -                            add_dct(s, block[9], 9, dest_cr+8, dct_linesize);
 -                            add_dct(s, block[10], 10, dest_cb+8+dct_offset, dct_linesize);
 -                            add_dct(s, block[11], 11, dest_cr+8+dct_offset, dct_linesize);
 +                            add_dct(s, block[8], 8, dest_cb+block_size, dct_linesize);
 +                            add_dct(s, block[9], 9, dest_cr+block_size, dct_linesize);
 +                            add_dct(s, block[10], 10, dest_cb+block_size+dct_offset, dct_linesize);
 +                            add_dct(s, block[11], 11, dest_cr+block_size+dct_offset, dct_linesize);
                          }
                      }
                  }//fi gray
                      }else{
  
                          dct_linesize = uvlinesize << s->interlaced_dct;
 -                        dct_offset   = s->interlaced_dct ? uvlinesize : uvlinesize * 8;
 +                        dct_offset   = s->interlaced_dct? uvlinesize : uvlinesize*block_size;
  
                          s->dsp.idct_put(dest_cb,              dct_linesize, block[4]);
                          s->dsp.idct_put(dest_cr,              dct_linesize, block[5]);
                          s->dsp.idct_put(dest_cb + dct_offset, dct_linesize, block[6]);
                          s->dsp.idct_put(dest_cr + dct_offset, dct_linesize, block[7]);
                          if(!s->chroma_x_shift){//Chroma444
 -                            s->dsp.idct_put(dest_cb + 8,              dct_linesize, block[8]);
 -                            s->dsp.idct_put(dest_cr + 8,              dct_linesize, block[9]);
 -                            s->dsp.idct_put(dest_cb + 8 + dct_offset, dct_linesize, block[10]);
 -                            s->dsp.idct_put(dest_cr + 8 + dct_offset, dct_linesize, block[11]);
 +                            s->dsp.idct_put(dest_cb + block_size,              dct_linesize, block[8]);
 +                            s->dsp.idct_put(dest_cr + block_size,              dct_linesize, block[9]);
 +                            s->dsp.idct_put(dest_cb + block_size + dct_offset, dct_linesize, block[10]);
 +                            s->dsp.idct_put(dest_cr + block_size + dct_offset, dct_linesize, block[11]);
                          }
                      }
                  }//gray
@@@ -2524,12 -2166,10 +2523,12 @@@ skip_idct
  void ff_MPV_decode_mb(MpegEncContext *s, DCTELEM block[12][64]){
  #if !CONFIG_SMALL
      if(s->out_format == FMT_MPEG1) {
 -        MPV_decode_mb_internal(s, block, 1);
 +        if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1, 1);
 +        else                 MPV_decode_mb_internal(s, block, 0, 1);
      } else
  #endif
 -        MPV_decode_mb_internal(s, block, 0);
 +    if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1, 0);
 +    else                  MPV_decode_mb_internal(s, block, 0, 0);
  }
  
  /**
@@@ -2604,7 -2244,7 +2603,7 @@@ void ff_draw_horiz_band(MpegEncContext 
  void ff_init_block_index(MpegEncContext *s){ //FIXME maybe rename
      const int linesize   = s->current_picture.f.linesize[0]; //not s->linesize as this would be wrong for field pics
      const int uvlinesize = s->current_picture.f.linesize[1];
 -    const int mb_size= 4;
 +    const int mb_size= 4 - s->avctx->lowres;
  
      s->block_index[0]= s->b8_stride*(s->mb_y*2    ) - 2 + s->mb_x*2;
      s->block_index[1]= s->b8_stride*(s->mb_y*2    ) - 1 + s->mb_x*2;
@@@ -2649,7 -2289,6 +2648,7 @@@ void ff_mpeg_flush(AVCodecContext *avct
      s->current_picture_ptr = s->last_picture_ptr = s->next_picture_ptr = NULL;
  
      s->mb_x= s->mb_y= 0;
 +    s->closed_gop= 0;
  
      s->parse_context.state= -1;
      s->parse_context.frame_start_found= 0;
@@@ -2669,7 -2308,10 +2668,7 @@@ static void dct_unquantize_mpeg1_intra_
  
      nCoeffs= s->block_last_index[n];
  
 -    if (n < 4)
 -        block[0] = block[0] * s->y_dc_scale;
 -    else
 -        block[0] = block[0] * s->c_dc_scale;
 +    block[0] *= n < 4 ? s->y_dc_scale : s->c_dc_scale;
      /* XXX: only mpeg1 */
      quant_matrix = s->intra_matrix;
      for(i=1;i<=nCoeffs;i++) {
@@@ -2728,7 -2370,10 +2727,7 @@@ static void dct_unquantize_mpeg2_intra_
      if(s->alternate_scan) nCoeffs= 63;
      else nCoeffs= s->block_last_index[n];
  
 -    if (n < 4)
 -        block[0] = block[0] * s->y_dc_scale;
 -    else
 -        block[0] = block[0] * s->c_dc_scale;
 +    block[0] *= n < 4 ? s->y_dc_scale : s->c_dc_scale;
      quant_matrix = s->intra_matrix;
      for(i=1;i<=nCoeffs;i++) {
          int j= s->intra_scantable.permutated[i];
@@@ -2756,8 -2401,10 +2755,8 @@@ static void dct_unquantize_mpeg2_intra_
      if(s->alternate_scan) nCoeffs= 63;
      else nCoeffs= s->block_last_index[n];
  
 -    if (n < 4)
 -        block[0] = block[0] * s->y_dc_scale;
 -    else
 -        block[0] = block[0] * s->c_dc_scale;
 +    block[0] *= n < 4 ? s->y_dc_scale : s->c_dc_scale;
 +    sum += block[0];
      quant_matrix = s->intra_matrix;
      for(i=1;i<=nCoeffs;i++) {
          int j= s->intra_scantable.permutated[i];
@@@ -2819,7 -2466,10 +2818,7 @@@ static void dct_unquantize_h263_intra_c
      qmul = qscale << 1;
  
      if (!s->h263_aic) {
 -        if (n < 4)
 -            block[0] = block[0] * s->y_dc_scale;
 -        else
 -            block[0] = block[0] * s->c_dc_scale;
 +        block[0] *= n < 4 ? s->y_dc_scale : s->c_dc_scale;
          qadd = (qscale - 1) | 1;
      }else{
          qadd = 0;
index 1802a9b0f513a727f477928622a35c209dd06f0b,bb39619637cef0995d4358dad051348b96137b16..9f7d0601b759361e910c34d1a879d37b6c1095da
@@@ -5,20 -5,20 +5,20 @@@
   *
   * 4MV & hq & B-frame encoding stuff by Michael Niedermayer <michaelni@gmx.at>
   *
 - * 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
   */
  
  #define AVCODEC_MPEGVIDEO_COMMON_H
  
  #include <string.h>
 +#include "libavutil/avassert.h"
  #include "avcodec.h"
  #include "dsputil.h"
  #include "mpegvideo.h"
  #include "mjpegenc.h"
  #include "msmpeg4.h"
- #include "faandct.h"
  #include <limits.h>
  
  int ff_dct_quantize_c(MpegEncContext *s, DCTELEM *block, int n, int qscale, int *overflow);
@@@ -440,7 -438,7 +439,7 @@@ static inline void obmc_motion(MpegEncC
      int i;
      uint8_t *ptr[5];
  
 -    assert(s->quarter_sample==0);
 +    av_assert2(s->quarter_sample==0);
  
      for(i=0; i<5; i++){
          if(i && mv[i][0]==mv[MID][0] && mv[i][1]==mv[MID][1]){
@@@ -650,7 -648,7 +649,7 @@@ static av_always_inline void MPV_motion
          const int mot_stride= s->b8_stride;
          const int mot_xy= mb_x*2 + mb_y*2*mot_stride;
  
 -        assert(!s->mb_skipped);
 +        av_assert2(!s->mb_skipped);
  
          memcpy(mv_cache[1][1], s->current_picture.f.motion_val[0][mot_xy             ], sizeof(int16_t) * 4);
          memcpy(mv_cache[2][1], s->current_picture.f.motion_val[0][mot_xy + mot_stride], sizeof(int16_t) * 4);
              }
          }
      break;
 -    default: assert(0);
 +    default: av_assert2(0);
      }
  }
  
diff --combined libavfilter/af_asyncts.c
index 7459610af85ae19ac5228da709a78a8e2a0f3009,21850dd1d2044b679750a2baf1aa2b8989ca513e..1737d6138d8d6b921ee3e2a2bd28cf8ea249f6da
@@@ -44,22 -44,28 +44,23 @@@ typedef struct ASyncContext 
  
  #define OFFSET(x) offsetof(ASyncContext, x)
  #define A AV_OPT_FLAG_AUDIO_PARAM
 -static const AVOption options[] = {
 +static const AVOption asyncts_options[] = {
      { "compensate", "Stretch/squeeze the data to make it match the timestamps", OFFSET(resample),      AV_OPT_TYPE_INT,   { 0 },   0, 1,       A },
      { "min_delta",  "Minimum difference between timestamps and audio data "
                      "(in seconds) to trigger padding/trimmin the data.",        OFFSET(min_delta_sec), AV_OPT_TYPE_FLOAT, { 0.1 }, 0, INT_MAX, A },
      { "max_comp",   "Maximum compensation in samples per second.",              OFFSET(max_comp),      AV_OPT_TYPE_INT,   { 500 }, 0, INT_MAX, A },
+     { "first_pts",  "Assume the first pts should be this value.",               OFFSET(pts),           AV_OPT_TYPE_INT64, { AV_NOPTS_VALUE }, INT64_MIN, INT64_MAX, A },
      { NULL },
  };
  
 -static const AVClass async_class = {
 -    .class_name = "asyncts filter",
 -    .item_name  = av_default_item_name,
 -    .option     = options,
 -    .version    = LIBAVUTIL_VERSION_INT,
 -};
 +AVFILTER_DEFINE_CLASS(asyncts);
  
  static int init(AVFilterContext *ctx, const char *args)
  {
      ASyncContext *s = ctx->priv;
      int ret;
  
 -    s->class = &async_class;
 +    s->class = &asyncts_class;
      av_opt_set_defaults(s);
  
      if ((ret = av_set_options_string(s, args, "=", ":")) < 0) {
@@@ -68,8 -74,6 +69,6 @@@
      }
      av_opt_free(s);
  
-     s->pts = AV_NOPTS_VALUE;
      return 0;
  }
  
@@@ -182,7 -186,7 +181,7 @@@ static int filter_samples(AVFilterLink 
  
      if (labs(delta) > s->min_delta) {
          av_log(ctx, AV_LOG_VERBOSE, "Discontinuity - %"PRId64" samples.\n", delta);
-         out_size += delta;
+         out_size = av_clipl_int32((int64_t)out_size + delta);
      } else {
          if (s->resample) {
              int comp = av_clip(delta, -s->max_comp, s->max_comp);
diff --combined libavformat/4xm.c
index a794e88916339066e94d965b386fc2da1960dd45,135721fd2547769af90e89e2be2bd9c9f8499760..61fa886e70dfd66991415bd0c23088c4e734e3bb
@@@ -2,20 -2,20 +2,20 @@@
   * 4X Technologies .4xm File Demuxer (no muxer)
   * Copyright (c) 2003  The ffmpeg Project
   *
 - * 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
   */
  
@@@ -128,10 -128,6 +128,10 @@@ static int fourxm_read_header(AVFormatC
      for (i = 0; i < header_size - 8; i++) {
          fourcc_tag = AV_RL32(&header[i]);
          size = AV_RL32(&header[i + 4]);
 +        if (size > header_size - i - 8 && (fourcc_tag == vtrk_TAG || fourcc_tag == strk_TAG)) {
 +            av_log(s, AV_LOG_ERROR, "chunk larger than array %d>%d\n", size, header_size - i - 8);
 +            return AVERROR_INVALIDDATA;
 +        }
  
          if (fourcc_tag == std__TAG) {
              fourxm->fps = av_int2float(AV_RL32(&header[i + 12]));
              current_track = AV_RL32(&header[i + 8]);
              if((unsigned)current_track >= UINT_MAX / sizeof(AudioTrack) - 1){
                  av_log(s, AV_LOG_ERROR, "current_track too large\n");
 -                ret= -1;
 +                ret = AVERROR_INVALIDDATA;
                  goto fail;
              }
              if (current_track + 1 > fourxm->track_count) {
 -                fourxm->tracks = av_realloc(fourxm->tracks,
 -                    (current_track + 1) * sizeof(AudioTrack));
 +                fourxm->tracks = av_realloc_f(fourxm->tracks,
 +                                              sizeof(AudioTrack),
 +                                              current_track + 1);
                  if (!fourxm->tracks) {
                      ret = AVERROR(ENOMEM);
                      goto fail;
                 || fourxm->tracks[current_track].sample_rate <= 0
                 || fourxm->tracks[current_track].bits        <  0){
                  av_log(s, AV_LOG_ERROR, "audio header invalid\n");
 -                ret= -1;
 +                ret = AVERROR_INVALIDDATA;
 +                goto fail;
 +            }
 +            if(!fourxm->tracks[current_track].adpcm && fourxm->tracks[current_track].bits<8){
 +                av_log(s, AV_LOG_ERROR, "bits unspecified for non ADPCM\n");
 +                ret = AVERROR_INVALIDDATA;
                  goto fail;
              }
              i += 8 + size;
@@@ -273,7 -263,7 +273,7 @@@ static int fourxm_read_packet(AVFormatC
              return ret;
          fourcc_tag = AV_RL32(&header[0]);
          size = AV_RL32(&header[4]);
 -        if (pb->eof_reached)
 +        if (url_feof(pb))
              return AVERROR(EIO);
          switch (fourcc_tag) {
  
@@@ -359,7 -349,7 +359,7 @@@ static int fourxm_read_close(AVFormatCo
  
  AVInputFormat ff_fourxm_demuxer = {
      .name           = "4xm",
-     .long_name      = NULL_IF_CONFIG_SMALL("4X Technologies format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("4X Technologies"),
      .priv_data_size = sizeof(FourxmDemuxContext),
      .read_probe     = fourxm_probe,
      .read_header    = fourxm_read_header,
diff --combined libavformat/amr.c
index 23272e4caa07481780d12ad52bd56ae9ca967b0c,0812e0f40c8c000c036bc5d64dad129d3c9860cc..299dbc91fc7d8aa868b838a63542c521aa72e65b
@@@ -2,20 -2,20 +2,20 @@@
   * amr file format
   * Copyright (c) 2001 ffmpeg project
   *
 - * 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
   */
  
@@@ -25,7 -25,6 +25,7 @@@ Write and read amr data according to RF
  Only mono files are supported.
  
  */
 +#include "libavutil/avassert.h"
  #include "avformat.h"
  #include "internal.h"
  
@@@ -110,7 -109,7 +110,7 @@@ static int amr_read_packet(AVFormatCont
      int read, size = 0, toc, mode;
      int64_t pos = avio_tell(s->pb);
  
 -    if (s->pb->eof_reached) {
 +    if (url_feof(s->pb)) {
          return AVERROR(EIO);
      }
  
  
          size = packed_size[mode];
      } else {
 -        assert(0);
 +        av_assert0(0);
      }
  
      if (!size || av_new_packet(pkt, size))
  #if CONFIG_AMR_DEMUXER
  AVInputFormat ff_amr_demuxer = {
      .name           = "amr",
-     .long_name      = NULL_IF_CONFIG_SMALL("3GPP AMR file format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("3GPP AMR"),
      .read_probe     = amr_probe,
      .read_header    = amr_read_header,
      .read_packet    = amr_read_packet,
  #if CONFIG_AMR_MUXER
  AVOutputFormat ff_amr_muxer = {
      .name              = "amr",
-     .long_name         = NULL_IF_CONFIG_SMALL("3GPP AMR file format"),
+     .long_name         = NULL_IF_CONFIG_SMALL("3GPP AMR"),
      .mime_type         = "audio/amr",
      .extensions        = "amr",
      .audio_codec       = CODEC_ID_AMR_NB,
diff --combined libavformat/apc.c
index 2e160ccab52184c303a95d4ff279a1fd1f5293d5,f6a3395cf467fd30042d571e14c0afcddd876a7b..c4774f137577d5e38306eeb11da79ad34ae56401
@@@ -2,20 -2,20 +2,20 @@@
   * CRYO APC audio format demuxer
   * Copyright (c) 2007 Anssi Hannula <anssi.hannula@gmail.com>
   *
 - * 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
   */
  
@@@ -76,14 -76,13 +76,14 @@@ static int apc_read_packet(AVFormatCont
  {
      if (av_get_packet(s->pb, pkt, MAX_READ_SIZE) <= 0)
          return AVERROR(EIO);
 +    pkt->flags &= ~AV_PKT_FLAG_CORRUPT;
      pkt->stream_index = 0;
      return 0;
  }
  
  AVInputFormat ff_apc_demuxer = {
      .name           = "apc",
-     .long_name      = NULL_IF_CONFIG_SMALL("CRYO APC format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("CRYO APC"),
      .read_probe     = apc_probe,
      .read_header    = apc_read_header,
      .read_packet    = apc_read_packet,
diff --combined libavformat/assdec.c
index f76424a36c8fe05a0721902dbe57d705a8b622ee,bb85f293042a40d3a3a182b30521895de3936186..157d2282bb6dfe7041ea5a387567e32d76584434
@@@ -2,20 -2,20 +2,20 @@@
   * SSA/ASS demuxer
   * Copyright (c) 2008 Michael Niedermayer
   *
 - * 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
   */
  
@@@ -93,7 -93,7 +93,7 @@@ static int read_header(AVFormatContext 
      header_remaining= INT_MAX;
      dst[0] = &st->codec->extradata;
      dst[1] = &ass->event_buffer;
 -    while(!pb->eof_reached){
 +    while(!url_feof(pb)){
          uint8_t line[MAX_LINESIZE];
  
          len = ff_get_line(pb, line, sizeof(line));
@@@ -205,7 -205,7 +205,7 @@@ static int read_seek2(AVFormatContext *
  
  AVInputFormat ff_ass_demuxer = {
      .name           = "ass",
-     .long_name      = NULL_IF_CONFIG_SMALL("Advanced SubStation Alpha subtitle format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("Advanced SubStation Alpha subtitle"),
      .priv_data_size = sizeof(ASSContext),
      .read_probe     = probe,
      .read_header    = read_header,
diff --combined libavformat/assenc.c
index b367668d2df667cb7f26f7c20071c0c6af9158f5,b3f422d8b96cfb1dbf7b7865e434fc6637602c03..515ee0447b58322be37c698c9e6803faa32885da
@@@ -2,20 -2,20 +2,20 @@@
   * SSA/ASS muxer
   * Copyright (c) 2008 Michael Niedermayer
   *
 - * 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
   */
  
@@@ -79,7 -79,7 +79,7 @@@ static int write_trailer(AVFormatContex
  
  AVOutputFormat ff_ass_muxer = {
      .name           = "ass",
-     .long_name      = NULL_IF_CONFIG_SMALL("Advanced SubStation Alpha subtitle format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("Advanced SubStation Alpha subtitle"),
      .mime_type      = "text/x-ssa",
      .extensions     = "ass,ssa",
      .priv_data_size = sizeof(ASSContext),
diff --combined libavformat/avs.c
index 7bd4bcf82c8b7a8f30f5d0867e8dc2cf86c39ad6,64c2289439d2a8f782ed8e4e700198015bc871a4..124d43f33faf0b7567527847583958d9af561229
@@@ -2,20 -2,20 +2,20 @@@
   * AVS demuxer.
   * Copyright (c) 2006  Aurelien Jacobs <aurel@gnuage.org>
   *
 - * 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
   */
  
@@@ -223,7 -223,7 +223,7 @@@ static int avs_read_close(AVFormatConte
  
  AVInputFormat ff_avs_demuxer = {
      .name           = "avs",
-     .long_name      = NULL_IF_CONFIG_SMALL("AVS format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("AVS"),
      .priv_data_size = sizeof(AvsFormat),
      .read_probe     = avs_probe,
      .read_header    = avs_read_header,
index a98b1bda2ce89685dd7e5c2b8c818cf9aedd42ea,5acc3fc4b7058c1cbc57cb4f62bcdf49cd1ebbc5..77c45eefa17f888923160230434b1379f9d372bb
@@@ -2,20 -2,20 +2,20 @@@
   * Bethsoft VID format Demuxer
   * Copyright (c) 2007 Nicholas Tung
   *
 - * 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
   */
  
@@@ -207,7 -207,7 +207,7 @@@ static int vid_read_packet(AVFormatCont
      int audio_length;
      int ret_value;
  
 -    if(vid->is_finished || pb->eof_reached)
 +    if(vid->is_finished || url_feof(pb))
          return AVERROR(EIO);
  
      block_type = avio_r8(pb);
@@@ -283,7 -283,7 +283,7 @@@ static int vid_read_close(AVFormatConte
  
  AVInputFormat ff_bethsoftvid_demuxer = {
      .name           = "bethsoftvid",
-     .long_name      = NULL_IF_CONFIG_SMALL("Bethesda Softworks VID format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("Bethesda Softworks VID"),
      .priv_data_size = sizeof(BVID_DemuxContext),
      .read_probe     = vid_probe,
      .read_header    = vid_read_header,
diff --combined libavformat/cdg.c
index e93a6b29d1ebec0b9172820b638ec7073f956b7e,3b7b739c6ced436d1da26dfab351819d52b04a1a..256fc21873c43466729a6c3e05ababbd7d8532be
@@@ -2,20 -2,20 +2,20 @@@
   * CD Graphics Demuxer
   * Copyright (c) 2009 Michael Tison
   *
 - * 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
   */
  
@@@ -60,20 -60,13 +60,20 @@@ static int read_packet(AVFormatContext 
      }
  
      pkt->stream_index = 0;
 +    pkt->dts=
 +    pkt->pts= pkt->pos / CDG_PACKET_SIZE;
 +
 +    if(ret>5 && (pkt->data[0]&0x3F) == 9 && (pkt->data[1]&0x3F)==1 && !(pkt->data[2+2+1] & 0x0F)){
 +        pkt->flags = AV_PKT_FLAG_KEY;
 +    }
      return ret;
  }
  
  AVInputFormat ff_cdg_demuxer = {
      .name           = "cdg",
-     .long_name      = NULL_IF_CONFIG_SMALL("CD Graphics Format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("CD Graphics"),
      .read_header    = read_header,
      .read_packet    = read_packet,
 +    .flags          = AVFMT_GENERIC_INDEX,
      .extensions     = "cdg",
  };
diff --combined libavformat/cdxl.c
index b8a4558d539e5a2547c251454865937940ee9932,809507fc055ea2fd43c2331516be12d195f49930..736ce3d6344a4da86616359698fac9a11f4a2ee0
@@@ -2,20 -2,20 +2,20 @@@
   * CDXL demuxer
   * Copyright (c) 2011-2012 Paul B Mahol
   *
 - * 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
   */
  
@@@ -171,7 -171,7 +171,7 @@@ static const AVClass cdxl_demuxer_clas
  
  AVInputFormat ff_cdxl_demuxer = {
      .name           = "cdxl",
-     .long_name      = NULL_IF_CONFIG_SMALL("Commodore CDXL video format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("Commodore CDXL video"),
      .priv_data_size = sizeof(CDXLDemuxContext),
      .read_header    = cdxl_read_header,
      .read_packet    = cdxl_read_packet,
diff --combined libavformat/crcenc.c
index 1f5854e08028a7f74ca4250daa1637cca93f6646,8c0c91d5a47198c7de76d5feb7467a1d2a29cb82..210ef2c4ddb4cdc5270035fe43ad1ec2f075d781
@@@ -2,20 -2,20 +2,20 @@@
   * CRC encoder (for codec/format testing)
   * Copyright (c) 2002 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
   */
  
@@@ -56,7 -56,8 +56,7 @@@ static int crc_write_trailer(struct AVF
  
  AVOutputFormat ff_crc_muxer = {
      .name              = "crc",
-     .long_name         = NULL_IF_CONFIG_SMALL("CRC testing format"),
+     .long_name         = NULL_IF_CONFIG_SMALL("CRC testing"),
 -    .extensions        = "",
      .priv_data_size    = sizeof(CRCState),
      .audio_codec       = CODEC_ID_PCM_S16LE,
      .video_codec       = CODEC_ID_RAWVIDEO,
diff --combined libavformat/daud.c
index 916489fc0ee84213f98fed64bd643d47823db1cc,1fd5c7ae8025e89f5fdf42ca2f4eeca7489fcc6d..a25c0bff4c21e6d89592cf9d1574fb44047a179d
@@@ -2,20 -2,20 +2,20 @@@
   * D-Cinema audio demuxer
   * Copyright (c) 2005 Reimar Döffinger
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  #include "avformat.h"
@@@ -38,7 -38,7 +38,7 @@@ static int daud_header(AVFormatContext 
  static int daud_packet(AVFormatContext *s, AVPacket *pkt) {
      AVIOContext *pb = s->pb;
      int ret, size;
 -    if (pb->eof_reached)
 +    if (url_feof(pb))
          return AVERROR(EIO);
      size = avio_rb16(pb);
      avio_rb16(pb); // unknown
@@@ -72,17 -72,17 +72,17 @@@ static int daud_write_packet(struct AVF
  #if CONFIG_DAUD_DEMUXER
  AVInputFormat ff_daud_demuxer = {
      .name           = "daud",
-     .long_name      = NULL_IF_CONFIG_SMALL("D-Cinema audio format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("D-Cinema audio"),
      .read_header    = daud_header,
      .read_packet    = daud_packet,
 -    .extensions     = "302",
 +    .extensions     = "302,daud",
  };
  #endif
  
  #if CONFIG_DAUD_MUXER
  AVOutputFormat ff_daud_muxer = {
      .name         = "daud",
-     .long_name    = NULL_IF_CONFIG_SMALL("D-Cinema audio format"),
+     .long_name    = NULL_IF_CONFIG_SMALL("D-Cinema audio"),
      .extensions   = "302",
      .audio_codec  = CODEC_ID_PCM_S24DAUD,
      .video_codec  = CODEC_ID_NONE,
diff --combined libavformat/dsicin.c
index d525da650d1265cb230e634432c4978e42fba173,24c58fcf040ab576af6428e6d8b46cb9ad85a7a7..5a97e7597159a6bfaa01f3eb2121466b9fbee96c
@@@ -2,20 -2,20 +2,20 @@@
   * Delphine Software International CIN File Demuxer
   * Copyright (c) 2006 Gregory Montoir (cyx@users.sourceforge.net)
   *
 - * 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
   */
  
@@@ -27,7 -27,6 +27,7 @@@
  #include "libavutil/intreadwrite.h"
  #include "avformat.h"
  #include "internal.h"
 +#include "avio_internal.h"
  
  
  typedef struct CinFileHeader {
@@@ -148,7 -147,7 +148,7 @@@ static int cin_read_frame_header(CinDem
      hdr->video_frame_size = avio_rl32(pb);
      hdr->audio_frame_size = avio_rl32(pb);
  
 -    if (pb->eof_reached || pb->error)
 +    if (url_feof(pb) || pb->error)
          return AVERROR(EIO);
  
      if (avio_rl32(pb) != 0xAA55AA55)
@@@ -180,8 -179,6 +180,8 @@@ static int cin_read_packet(AVFormatCont
          /* palette and video packet */
          pkt_size = (palette_type + 3) * hdr->pal_colors_count + hdr->video_frame_size;
  
 +        pkt_size = ffio_limit(pb, pkt_size);
 +
          ret = av_new_packet(pkt, 4 + pkt_size);
          if (ret < 0)
              return ret;
  
  AVInputFormat ff_dsicin_demuxer = {
      .name           = "dsicin",
-     .long_name      = NULL_IF_CONFIG_SMALL("Delphine Software International CIN format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("Delphine Software International CIN"),
      .priv_data_size = sizeof(CinDemuxContext),
      .read_probe     = cin_probe,
      .read_header    = cin_read_header,
diff --combined libavformat/dv.c
index 75b42b01abf0681b7305608a9af52fd2fef61991,c71863a3321a2a2d93786f8047bfb34e9cd91fb7..2faeb95897186794c754383451ee744b896cfbb1
   * Copyright (c) 2006 Daniel Maas <dmaas@maasdigital.com>
   * Funded by BBC Research & Development
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  #include <time.h>
@@@ -35,9 -35,7 +35,9 @@@
  #include "libavcodec/dvdata.h"
  #include "libavutil/intreadwrite.h"
  #include "libavutil/mathematics.h"
 +#include "libavutil/timecode.h"
  #include "dv.h"
 +#include "libavutil/avassert.h"
  
  struct DVDemuxContext {
      const DVprofile*  sys;    /* Current DV profile. E.g.: 525/60, 625/50 */
@@@ -90,9 -88,6 +90,9 @@@ static const uint8_t* dv_extract_pack(u
      case dv_video_control:
          offs = (80*5 + 48 + 5);
          break;
 +    case dv_timecode:
 +        offs = (80*1 + 3 + 3);
 +        break;
      default:
          return NULL;
      }
@@@ -143,7 -138,7 +143,7 @@@ static int dv_extract_audio(uint8_t* fr
  
      /* for each DIF channel */
      for (chan = 0; chan < sys->n_difchan; chan++) {
 -        /* next stereo channel (50Mbps and 100Mbps only) */
 +        av_assert0(ipcm<4);
          pcm = ppcm[ipcm++];
          if (!pcm)
              break;
              frame += 6 * 80; /* skip DIF segment header */
              if (quant == 1 && i == half_ch) {
                  /* next stereo channel (12bit mode only) */
 +                av_assert0(ipcm<4);
                  pcm = ppcm[ipcm++];
                  if (!pcm)
                      break;
@@@ -273,6 -267,11 +273,6 @@@ static int dv_extract_video_info(DVDemu
          avpriv_set_pts_info(c->vst, 64, c->sys->time_base.num,
                          c->sys->time_base.den);
          avctx->time_base= c->sys->time_base;
 -        if (!avctx->width){
 -            avctx->width = c->sys->width;
 -            avctx->height = c->sys->height;
 -        }
 -        avctx->pix_fmt = c->sys->pix_fmt;
  
          /* finding out SAR is a little bit messy */
          vsc_pack = dv_extract_pack(frame, dv_video_control);
      return size;
  }
  
 +static int dv_extract_timecode(DVDemuxContext* c, uint8_t* frame, char *tc)
 +{
 +    const uint8_t *tc_pack;
 +
 +    // For PAL systems, drop frame bit is replaced by an arbitrary
 +    // bit so its value should not be considered. Drop frame timecode
 +    // is only relevant for NTSC systems.
 +    int prevent_df = c->sys->ltc_divisor == 25 || c->sys->ltc_divisor == 50;
 +
 +    tc_pack = dv_extract_pack(frame, dv_timecode);
 +    if (!tc_pack)
 +        return 0;
 +    av_timecode_make_smpte_tc_string(tc, AV_RB32(tc_pack + 1), prevent_df);
 +    return 1;
 +}
 +
  /*
   * The following 3 functions constitute our interface to the world
   */
@@@ -348,7 -331,7 +348,7 @@@ int avpriv_dv_get_packet(DVDemuxContex
  }
  
  int avpriv_dv_produce_packet(DVDemuxContext *c, AVPacket *pkt,
 -                      uint8_t* buf, int buf_size)
 +                      uint8_t* buf, int buf_size, int64_t pos)
  {
      int size, i;
      uint8_t *ppcm[4] = {0};
      /* FIXME: in case of no audio/bad audio we have to do something */
      size = dv_extract_audio_info(c, buf);
      for (i = 0; i < c->ach; i++) {
 +       c->audio_pkt[i].pos  = pos;
         c->audio_pkt[i].size = size;
         c->audio_pkt[i].pts  = c->abytes * 30000*8 / c->ast[i]->codec->bit_rate;
         ppcm[i] = c->audio_buf[i];
      size = dv_extract_video_info(c, buf);
      av_init_packet(pkt);
      pkt->data         = buf;
 +    pkt->pos          = pos;
      pkt->size         = size;
      pkt->flags       |= AV_PKT_FLAG_KEY;
      pkt->stream_index = c->vst->id;
@@@ -435,38 -416,6 +435,38 @@@ typedef struct RawDVContext 
      uint8_t         buf[DV_MAX_FRAME_SIZE];
  } RawDVContext;
  
 +static int dv_read_timecode(AVFormatContext *s) {
 +    int ret;
 +    char timecode[AV_TIMECODE_STR_SIZE];
 +    int64_t pos = avio_tell(s->pb);
 +
 +    // Read 3 DIF blocks: Header block and 2 Subcode blocks.
 +    int partial_frame_size = 3 * 80;
 +    uint8_t *partial_frame = av_mallocz(sizeof(*partial_frame) *
 +                                        partial_frame_size);
 +
 +    RawDVContext *c = s->priv_data;
 +    ret = avio_read(s->pb, partial_frame, partial_frame_size);
 +    if (ret < 0)
 +        goto finish;
 +
 +    if (ret < partial_frame_size) {
 +        ret = -1;
 +        goto finish;
 +    }
 +
 +    ret = dv_extract_timecode(c->dv_demux, partial_frame, timecode);
 +    if (ret)
 +        av_dict_set(&s->metadata, "timecode", timecode, 0);
 +    else if (ret < 0)
 +        av_log(s, AV_LOG_ERROR, "Detected timecode is invalid");
 +
 +finish:
 +    av_free(partial_frame);
 +    avio_seek(s->pb, pos, SEEK_SET);
 +    return ret;
 +}
 +
  static int dv_read_header(AVFormatContext *s)
  {
      unsigned state, marker_pos = 0;
  
      state = avio_rb32(s->pb);
      while ((state & 0xffffff7f) != 0x1f07003f) {
 -        if (s->pb->eof_reached) {
 +        if (url_feof(s->pb)) {
              av_log(s, AV_LOG_ERROR, "Cannot find DV header.\n");
              return -1;
          }
      }
      AV_WB32(c->buf, state);
  
 -    if (avio_read(s->pb, c->buf + 4, DV_PROFILE_BYTES - 4) <= 0 ||
 +    if (avio_read(s->pb, c->buf + 4, DV_PROFILE_BYTES - 4) != DV_PROFILE_BYTES - 4 ||
          avio_seek(s->pb, -DV_PROFILE_BYTES, SEEK_CUR) < 0)
          return AVERROR(EIO);
  
      s->bit_rate = av_rescale_q(c->dv_demux->sys->frame_size, (AVRational){8,1},
                                 c->dv_demux->sys->time_base);
  
 +    if (s->pb->seekable)
 +        dv_read_timecode(s);
 +
      return 0;
  }
  
@@@ -521,14 -467,13 +521,14 @@@ static int dv_read_packet(AVFormatConte
      size = avpriv_dv_get_packet(c->dv_demux, pkt);
  
      if (size < 0) {
 +        int64_t pos = avio_tell(s->pb);
          if (!c->dv_demux->sys)
              return AVERROR(EIO);
          size = c->dv_demux->sys->frame_size;
          if (avio_read(s->pb, c->buf, size) <= 0)
              return AVERROR(EIO);
  
 -        size = avpriv_dv_produce_packet(c->dv_demux, pkt, c->buf, size);
 +        size = avpriv_dv_produce_packet(c->dv_demux, pkt, c->buf, size, pos);
      }
  
      return size;
@@@ -591,7 -536,7 +591,7 @@@ static int dv_probe(AVProbeData *p
  #if CONFIG_DV_DEMUXER
  AVInputFormat ff_dv_demuxer = {
      .name           = "dv",
-     .long_name      = NULL_IF_CONFIG_SMALL("DV video format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("DV video"),
      .priv_data_size = sizeof(RawDVContext),
      .read_probe     = dv_probe,
      .read_header    = dv_read_header,
diff --combined libavformat/dvenc.c
index f3056f7892f365a481441d3f8fe167efbc219b8e,fdb259c3f17b5a66079e03aa6f9dbb5aa275d6c2..b936c693b166b21555d73d5475a3c72a88a8888c
   * 50 Mbps (DVCPRO50) support
   * Copyright (c) 2006 Daniel Maas <dmaas@maasdigital.com>
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  #include <time.h>
  #include "dv.h"
  #include "libavutil/fifo.h"
  #include "libavutil/mathematics.h"
 +#include "libavutil/intreadwrite.h"
 +#include "libavutil/opt.h"
 +#include "libavutil/timecode.h"
  
  struct DVMuxContext {
 +    AVClass          *av_class;
      const DVprofile*  sys;           /* current DV profile, e.g.: 525/60, 625/50 */
      int               n_ast;         /* number of stereo audio streams (up to 2) */
      AVStream         *ast[2];        /* stereo audio streams */
@@@ -52,7 -48,6 +52,7 @@@
      int               has_audio;     /* frame under contruction has audio */
      int               has_video;     /* frame under contruction has video */
      uint8_t           frame_buf[DV_MAX_FRAME_SIZE]; /* frame under contruction */
 +    AVTimecode        tc;            /* timecode context */
  };
  
  static const int dv_aaux_packs_dist[12][9] = {
@@@ -80,15 -75,34 +80,15 @@@ static int dv_write_pack(enum dv_pack_t
  {
      struct tm tc;
      time_t ct;
 -    int ltc_frame;
 +    uint32_t timecode;
      va_list ap;
  
      buf[0] = (uint8_t)pack_id;
      switch (pack_id) {
      case dv_timecode:
 -        ct = (time_t)av_rescale_rnd(c->frames, c->sys->time_base.num,
 -                                    c->sys->time_base.den, AV_ROUND_DOWN);
 -        ff_brktimegm(ct, &tc);
 -        /*
 -         * LTC drop-frame frame counter drops two frames (0 and 1) every
 -         * minute, unless it is exactly divisible by 10
 -         */
 -        ltc_frame = (c->frames + 2 * ct / 60 - 2 * ct / 600) % c->sys->ltc_divisor;
 -        buf[1] = (0                 << 7) | /* color frame: 0 - unsync; 1 - sync mode */
 -                 (1                 << 6) | /* drop frame timecode: 0 - nondrop; 1 - drop */
 -                 ((ltc_frame / 10)  << 4) | /* tens of frames */
 -                 (ltc_frame % 10);          /* units of frames */
 -        buf[2] = (1                 << 7) | /* biphase mark polarity correction: 0 - even; 1 - odd */
 -                 ((tc.tm_sec / 10)  << 4) | /* tens of seconds */
 -                 (tc.tm_sec % 10);          /* units of seconds */
 -        buf[3] = (1                 << 7) | /* binary group flag BGF0 */
 -                 ((tc.tm_min / 10)  << 4) | /* tens of minutes */
 -                 (tc.tm_min % 10);          /* units of minutes */
 -        buf[4] = (1                 << 7) | /* binary group flag BGF2 */
 -                 (1                 << 6) | /* binary group flag BGF1 */
 -                 ((tc.tm_hour / 10) << 4) | /* tens of hours */
 -                 (tc.tm_hour % 10);         /* units of hours */
 +        timecode  = av_timecode_get_smpte_from_framenum(&c->tc, c->frames);
 +        timecode |= 1<<23 | 1<<15 | 1<<7 | 1<<6; // biphase and binary group flags
 +        AV_WB32(buf + 1, timecode);
          break;
      case dv_audio_source:  /* AAUX source pack */
          va_start(ap, buf);
@@@ -353,10 -367,6 +353,10 @@@ static void dv_delete_mux(DVMuxContext 
  
  static int dv_write_header(AVFormatContext *s)
  {
 +    AVRational rate;
 +    DVMuxContext *dvc = s->priv_data;
 +    AVDictionaryEntry *tcr = av_dict_get(s->metadata, "timecode", NULL, 0);
 +
      if (!dv_init_mux(s)) {
          av_log(s, AV_LOG_ERROR, "Can't initialize DV format!\n"
                      "Make sure that you supply exactly two streams:\n"
                      "     (50Mbps allows an optional second audio stream)\n");
          return -1;
      }
 -    return 0;
 +    rate.num = dvc->sys->ltc_divisor;
 +    rate.den = 1;
 +    if (!tcr) { // no global timecode, look into the streams
 +        int i;
 +        for (i = 0; i < s->nb_streams; i++) {
 +            tcr = av_dict_get(s->streams[i]->metadata, "timecode", NULL, 0);
 +            if (tcr)
 +                break;
 +        }
 +    }
 +    if (tcr)
 +        return av_timecode_init_from_string(&dvc->tc, rate, tcr->value, s);
 +    return av_timecode_init(&dvc->tc, rate, 0, 0, s);
  }
  
  static int dv_write_packet(struct AVFormatContext *s, AVPacket *pkt)
@@@ -407,7 -405,7 +407,7 @@@ static int dv_write_trailer(struct AVFo
  
  AVOutputFormat ff_dv_muxer = {
      .name              = "dv",
-     .long_name         = NULL_IF_CONFIG_SMALL("DV video format"),
+     .long_name         = NULL_IF_CONFIG_SMALL("DV video"),
      .extensions        = "dv",
      .priv_data_size    = sizeof(DVMuxContext),
      .audio_codec       = CODEC_ID_PCM_S16LE,
index d6dfd92f2f728d15e5cefd34c0144a88e270b890,716853e6caf370dc7548f0130736c42c4106592d..7c54ab6a9748f764f22589d30f635083e157bafb
@@@ -2,20 -2,20 +2,20 @@@
   * Copyright (c) 2004  The ffmpeg Project
   * Copyright (c) 2006-2008 Peter Ross
   *
 - * 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
   */
  
@@@ -66,7 -66,6 +66,7 @@@ typedef struct EaDemuxContext 
      enum CodecID video_codec;
      AVRational time_base;
      int width, height;
 +    int nb_frames;
      int video_stream_index;
  
      enum CodecID audio_codec;
@@@ -110,7 -109,7 +110,7 @@@ static int process_audio_header_element
      ea->sample_rate = -1;
      ea->num_channels = 1;
  
 -    while (!pb->eof_reached && inHeader) {
 +    while (!url_feof(pb) && inHeader) {
          int inSubheader;
          uint8_t byte;
          byte = avio_r8(pb);
          case 0xFD:
              av_log (s, AV_LOG_DEBUG, "entered audio subheader\n");
              inSubheader = 1;
 -            while (!pb->eof_reached && inSubheader) {
 +            while (!url_feof(pb) && inSubheader) {
                  uint8_t subbyte;
                  subbyte = avio_r8(pb);
  
@@@ -275,9 -274,7 +275,9 @@@ static int process_video_header_vp6(AVF
      EaDemuxContext *ea = s->priv_data;
      AVIOContext *pb = s->pb;
  
 -    avio_skip(pb, 16);
 +    avio_skip(pb, 8);
 +    ea->nb_frames = avio_rl32(pb);
 +    avio_skip(pb, 4);
      ea->time_base.den = avio_rl32(pb);
      ea->time_base.num = avio_rl32(pb);
      ea->video_codec = CODEC_ID_VP6;
@@@ -351,6 -348,7 +351,6 @@@ static int process_ea_header(AVFormatCo
  
              case kVGT_TAG:
                  ea->video_codec = CODEC_ID_TGV;
 -                ea->time_base = (AVRational){1, 15};
                  break;
  
              case mTCD_TAG :
@@@ -419,7 -417,7 +419,7 @@@ static int ea_read_header(AVFormatConte
      EaDemuxContext *ea = s->priv_data;
      AVStream *st;
  
 -    if (!process_ea_header(s))
 +    if (process_ea_header(s)<=0)
          return AVERROR(EIO);
  
      if (ea->video_codec) {
          ea->video_stream_index = st->index;
          st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
          st->codec->codec_id = ea->video_codec;
 +        // parsing is necessary to make FFmpeg generate correct timestamps
 +        if (st->codec->codec_id == CODEC_ID_MPEG2VIDEO)
 +            st->need_parsing = AVSTREAM_PARSE_HEADERS;
          st->codec->codec_tag = 0;  /* no fourcc */
          st->codec->width = ea->width;
          st->codec->height = ea->height;
 -        avpriv_set_pts_info(st, 33, ea->time_base.num, ea->time_base.den);
 -#if FF_API_R_FRAME_RATE
 +        st->duration = st->nb_frames = ea->nb_frames;
 +        if (ea->time_base.num)
 +            avpriv_set_pts_info(st, 64, ea->time_base.num, ea->time_base.den);
          st->r_frame_rate =
 -#endif
          st->avg_frame_rate = (AVRational){ea->time_base.den, ea->time_base.num};
      }
  
@@@ -488,12 -483,11 +488,12 @@@ static int ea_read_packet(AVFormatConte
      AVIOContext *pb = s->pb;
      int ret = 0;
      int packet_read = 0;
 +    int partial_packet = 0;
      unsigned int chunk_type, chunk_size;
      int key = 0;
      int av_uninit(num_samples);
  
 -    while (!packet_read) {
 +    while (!packet_read || partial_packet) {
          chunk_type = avio_rl32(pb);
          chunk_size = ea->big_endian ? avio_rb32(pb) : avio_rl32(pb);
          if (chunk_size <= 8)
                  avio_skip(pb, 8);
                  chunk_size -= 12;
              }
 +            if (partial_packet) {
 +                av_log_ask_for_sample(s, "video header followed by audio packet not supported.\n");
 +                av_free_packet(pkt);
 +                partial_packet = 0;
 +            }
              ret = av_get_packet(pb, pkt, chunk_size);
              if (ret < 0)
                  return ret;
              key = AV_PKT_FLAG_KEY;
          case MV0F_TAG:
  get_video_packet:
 -            ret = av_get_packet(pb, pkt, chunk_size);
 -            if (ret < 0)
 -                return ret;
 +            if (partial_packet) {
 +                ret = av_append_packet(pb, pkt, chunk_size);
 +            } else
 +                ret = av_get_packet(pb, pkt, chunk_size);
 +            if (ret < 0) {
 +                packet_read = 1;
 +                break;
 +            }
 +            partial_packet = chunk_type == MVIh_TAG;
              pkt->stream_index = ea->video_stream_index;
              pkt->flags |= key;
              packet_read = 1;
          }
      }
  
 +    if (ret < 0 && partial_packet)
 +        av_free_packet(pkt);
      return ret;
  }
  
  AVInputFormat ff_ea_demuxer = {
      .name           = "ea",
-     .long_name      = NULL_IF_CONFIG_SMALL("Electronic Arts Multimedia Format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("Electronic Arts Multimedia"),
      .priv_data_size = sizeof(EaDemuxContext),
      .read_probe     = ea_probe,
      .read_header    = ea_read_header,
diff --combined libavformat/ffmdec.c
index 0c943fbe098b93e7edd1c6d8d47cfe5cdb59ebc6,c4ee22e73a30fd656bf42c3e818e3f566937f56f..df9ac8d9fc126d5284cecfc5f1eaca15a8f1c4c2
@@@ -1,21 -1,21 +1,21 @@@
  /*
 - * FFM (avserver live feed) demuxer
 + * FFM (ffserver live feed) demuxer
   * Copyright (c) 2001 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
   */
  
@@@ -24,8 -24,7 +24,8 @@@
  #include "avformat.h"
  #include "internal.h"
  #include "ffm.h"
 -#if CONFIG_AVSERVER
 +#include "avio_internal.h"
 +#if CONFIG_FFSERVER
  #include <unistd.h>
  
  int64_t ffm_read_write_index(int fd)
@@@ -57,7 -56,7 +57,7 @@@ void ffm_set_write_index(AVFormatContex
      ffm->write_index = pos;
      ffm->file_size = file_size;
  }
 -#endif // CONFIG_AVSERVER
 +#endif // CONFIG_FFSERVER
  
  static int ffm_is_avail_data(AVFormatContext *s, int size)
  {
@@@ -94,7 -93,7 +94,7 @@@ static int ffm_resync(AVFormatContext *
  {
      av_log(s, AV_LOG_ERROR, "resyncing\n");
      while (state != PACKET_ID) {
 -        if (s->pb->eof_reached) {
 +        if (url_feof(s->pb)) {
              av_log(s, AV_LOG_ERROR, "cannot find FFM syncword\n");
              return -1;
          }
@@@ -123,11 -122,6 +123,11 @@@ static int ffm_read_data(AVFormatContex
              if (avio_tell(pb) == ffm->file_size)
                  avio_seek(pb, ffm->packet_size, SEEK_SET);
      retry_read:
 +            if (pb->buffer_size != ffm->packet_size) {
 +                int64_t tell = avio_tell(pb);
 +                ffio_set_buf_size(pb, ffm->packet_size);
 +                avio_seek(pb, tell, SEEK_SET);
 +            }
              id = avio_rb16(pb); /* PACKET_ID */
              if (id != PACKET_ID)
                  if (ffm_resync(s, id) < 0)
@@@ -285,7 -279,7 +285,7 @@@ static int ffm_read_header(AVFormatCont
      /* get also filesize */
      if (pb->seekable) {
          ffm->file_size = avio_size(pb);
 -        if (ffm->write_index)
 +        if (ffm->write_index && 0)
              adjust_write_index(s);
      } else {
          ffm->file_size = (UINT64_C(1) << 63) - 1;
@@@ -465,25 -459,11 +465,25 @@@ static int ffm_seek(AVFormatContext *s
      av_dlog(s, "wanted_pts=%0.6f\n", wanted_pts / 1000000.0);
      /* find the position using linear interpolation (better than
         dichotomy in typical cases) */
 -    pos_min = FFM_PACKET_SIZE;
 -    pos_max = ffm->file_size - FFM_PACKET_SIZE;
 +    if (ffm->write_index && ffm->write_index < ffm->file_size) {
 +        if (get_dts(s, FFM_PACKET_SIZE) < wanted_pts) {
 +            pos_min = FFM_PACKET_SIZE;
 +            pos_max = ffm->write_index - FFM_PACKET_SIZE;
 +        } else {
 +            pos_min = ffm->write_index;
 +            pos_max = ffm->file_size - FFM_PACKET_SIZE;
 +        }
 +    } else {
 +        pos_min = FFM_PACKET_SIZE;
 +        pos_max = ffm->file_size - FFM_PACKET_SIZE;
 +    }
      while (pos_min <= pos_max) {
          pts_min = get_dts(s, pos_min);
          pts_max = get_dts(s, pos_max);
 +        if (pts_min > wanted_pts || pts_max < wanted_pts) {
 +            pos = pts_min > wanted_pts ? pos_min : pos_max;
 +            goto found;
 +        }
          /* linear interpolation */
          pos1 = (double)(pos_max - pos_min) * (double)(wanted_pts - pts_min) /
              (double)(pts_max - pts_min);
@@@ -528,7 -508,7 +528,7 @@@ static int ffm_probe(AVProbeData *p
  
  AVInputFormat ff_ffm_demuxer = {
      .name           = "ffm",
-     .long_name      = NULL_IF_CONFIG_SMALL("FFM (FFserver live feed) format"),
 -    .long_name      = NULL_IF_CONFIG_SMALL("FFM (AVserver live feed)"),
++    .long_name      = NULL_IF_CONFIG_SMALL("FFM (FFserver live feed)"),
      .priv_data_size = sizeof(FFMContext),
      .read_probe     = ffm_probe,
      .read_header    = ffm_read_header,
diff --combined libavformat/ffmenc.c
index 74807d98131f812f97064cd2783ca6ca6c345670,7de6ec8b34fd770267fe7ba8f555ee18c57017ec..a8d038ac6817f6ae5c4de77395fba1b419f649a5
@@@ -1,27 -1,26 +1,27 @@@
  /*
 - * FFM (avserver live feed) muxer
 + * FFM (ffserver live feed) muxer
   * Copyright (c) 2001 Fabrice Bellard
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
  #include "libavutil/intreadwrite.h"
  #include "libavutil/intfloat.h"
 +#include "libavutil/avassert.h"
  #include "avformat.h"
  #include "internal.h"
  #include "ffm.h"
@@@ -190,7 -189,7 +190,7 @@@ static int ffm_write_header(AVFormatCon
      /* init packet mux */
      ffm->packet_ptr = ffm->packet;
      ffm->packet_end = ffm->packet + ffm->packet_size - FFM_HEADER_SIZE;
 -    assert(ffm->packet_end >= ffm->packet);
 +    av_assert0(ffm->packet_end >= ffm->packet);
      ffm->frame_offset = 0;
      ffm->dts = 0;
      ffm->first_packet = 1;
@@@ -240,7 -239,8 +240,7 @@@ static int ffm_write_trailer(AVFormatCo
  
  AVOutputFormat ff_ffm_muxer = {
      .name              = "ffm",
-     .long_name         = NULL_IF_CONFIG_SMALL("FFM (FFserver live feed) format"),
 -    .long_name         = NULL_IF_CONFIG_SMALL("FFM (AVserver live feed)"),
 -    .mime_type         = "",
++    .long_name         = NULL_IF_CONFIG_SMALL("FFM (FFserver live feed)"),
      .extensions        = "ffm",
      .priv_data_size    = sizeof(FFMContext),
      .audio_codec       = CODEC_ID_MP2,
diff --combined libavformat/ffmetadec.c
index 98620bd321deed0cf6f9bd7b4a789b81374872b6,69917d7604b69f7fd1691d83f61cdea7077c44c5..5a4bc82c99ba1d2c4ffe63bc4d3be07f183c4151
@@@ -2,20 -2,20 +2,20 @@@
   * Metadata demuxer
   * Copyright (c) 2010 Anton Khirnov
   *
 - * 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
   */
  
@@@ -50,7 -50,7 +50,7 @@@ static void get_line(AVIOContext *s, ui
                  buf[i++] = c;
          }
          buf[i] = 0;
 -    } while (!s->eof_reached && (buf[0] == ';' || buf[0] == '#' || buf[0] == 0));
 +    } while (!url_feof(s) && (buf[0] == ';' || buf[0] == '#' || buf[0] == 0));
  }
  
  static AVChapter *read_chapter(AVFormatContext *s)
@@@ -128,7 -128,7 +128,7 @@@ static int read_header(AVFormatContext 
      AVDictionary **m = &s->metadata;
      uint8_t line[1024];
  
 -    while(!s->pb->eof_reached) {
 +    while(!url_feof(s->pb)) {
          get_line(s->pb, line, sizeof(line));
  
          if (!memcmp(line, ID_STREAM, strlen(ID_STREAM))) {
@@@ -168,7 -168,7 +168,7 @@@ static int read_packet(AVFormatContext 
  
  AVInputFormat ff_ffmetadata_demuxer = {
      .name        = "ffmetadata",
-     .long_name   = NULL_IF_CONFIG_SMALL("FFmpeg metadata in text format"),
+     .long_name   = NULL_IF_CONFIG_SMALL("FFmpeg metadata in text"),
      .read_probe  = probe,
      .read_header = read_header,
      .read_packet = read_packet,
diff --combined libavformat/ffmetaenc.c
index 200c9940a4c4a75b4e57643a7e19eebbfed89cc2,f75efea8764ab0eca87abfc25a87a783e78eea8e..36107df2b358db9ae60339cdfc3f2971c435b0b5
@@@ -2,20 -2,20 +2,20 @@@
   * Metadata muxer
   * Copyright (c) 2010 Anton Khirnov
   *
 - * 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
   */
  
@@@ -92,7 -92,7 +92,7 @@@ static int write_packet(AVFormatContex
  
  AVOutputFormat ff_ffmetadata_muxer = {
      .name          = "ffmetadata",
-     .long_name     = NULL_IF_CONFIG_SMALL("FFmpeg metadata in text format"),
+     .long_name     = NULL_IF_CONFIG_SMALL("FFmpeg metadata in text"),
      .extensions    = "ffmeta",
      .write_header  = write_header,
      .write_packet  = write_packet,
diff --combined libavformat/flic.c
index 3ad7c86cdc4f5208908061ae282e9cf2d9a379b2,6c6c85ffee2c81a1c0d6dd98c3d838b6a39d65b1..85c5564f5e52b9efbae771add868ecdf2e9513e7
@@@ -2,20 -2,20 +2,20 @@@
   * FLI/FLC Animation File Demuxer
   * Copyright (c) 2003 The ffmpeg Project
   *
 - * 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
   */
  
@@@ -117,7 -117,7 +117,7 @@@ static int flic_read_header(AVFormatCon
  
      if (!st->codec->width || !st->codec->height) {
          /* Ugly hack needed for the following sample: */
 -        /* http://samples.libav.org/fli-flc/fli-bugs/specular.flc */
 +        /* http://samples.mplayerhq.hu/fli-flc/fli-bugs/specular.flc */
          av_log(s, AV_LOG_WARNING,
                 "File with no specified width/height. Trying 640x480.\n");
          st->codec->width  = 640;
@@@ -262,7 -262,7 +262,7 @@@ static int flic_read_packet(AVFormatCon
  
  AVInputFormat ff_flic_demuxer = {
      .name           = "flic",
-     .long_name      = NULL_IF_CONFIG_SMALL("FLI/FLC/FLX animation format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("FLI/FLC/FLX animation"),
      .priv_data_size = sizeof(FlicDemuxContext),
      .read_probe     = flic_probe,
      .read_header    = flic_read_header,
index 72eeba707b7cd2d4c19866c55da635b7b11bbe42,3018b726261fc337f30cf732143480d12bdb0812..78f7131a5d0d56598a97864d79cd03291061d7b7
@@@ -2,20 -2,20 +2,20 @@@
   * frame CRC encoder (for codec/format testing)
   * Copyright (c) 2002 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
   */
  
@@@ -37,7 -37,8 +37,7 @@@ static int framecrc_write_packet(struc
  
  AVOutputFormat ff_framecrc_muxer = {
      .name              = "framecrc",
-     .long_name         = NULL_IF_CONFIG_SMALL("framecrc testing format"),
+     .long_name         = NULL_IF_CONFIG_SMALL("framecrc testing"),
 -    .extensions        = "",
      .audio_codec       = CODEC_ID_PCM_S16LE,
      .video_codec       = CODEC_ID_RAWVIDEO,
      .write_header      = ff_framehash_write_header,
diff --combined libavformat/g723_1.c
index 388283f80e9be751e1ead31087a2f82c5f896875,e9ae10b0660508c1a283e5e804a4f563d248207e..fa8011cd28309195aa8d35e6935bb610154f3483
@@@ -2,20 -2,20 +2,20 @@@
   * G.723.1 demuxer
   * Copyright (c) 2010 Mohamed Naufal Basheer
   *
 - * 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
   */
  
@@@ -77,9 -77,9 +77,9 @@@ static int g723_1_read_packet(AVFormatC
  
  AVInputFormat ff_g723_1_demuxer = {
      .name        = "g723_1",
-     .long_name   = NULL_IF_CONFIG_SMALL("G.723.1 format"),
+     .long_name   = NULL_IF_CONFIG_SMALL("G.723.1"),
      .read_header = g723_1_init,
      .read_packet = g723_1_read_packet,
 -    .extensions  = "tco",
 +    .extensions  = "tco,rco,g723_1",
      .flags       = AVFMT_GENERIC_INDEX
  };
diff --combined libavformat/h264dec.c
index e7c6d70debfba1654b6699431f6f2256edcfc2c3,b741d78b03eedb61b357004e37e023f167cdf843..96f93e258ec7e68617b215394eb8aab128bb3ee9
@@@ -2,20 -2,20 +2,20 @@@
   * RAW H.264 video demuxer
   * Copyright (c) 2008 Michael Niedermayer <michaelni@gmx.at>
   *
 - * 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
   */
  
@@@ -54,7 -54,7 +54,7 @@@ static int h264_probe(AVProbeData *p
              case     1:   sli++; break;
              case     5:   idr++; break;
              case     7:
 -                if(p->buf[i+2]&0x0F)
 +                if(p->buf[i+2]&0x03)
                      return 0;
                  sps++;
                  break;
@@@ -67,4 -67,4 +67,4 @@@
      return 0;
  }
  
- FF_DEF_RAWVIDEO_DEMUXER(h264 , "raw H.264 video format", h264_probe, "h26l,h264,264", CODEC_ID_H264)
+ FF_DEF_RAWVIDEO_DEMUXER(h264 , "raw H.264 video", h264_probe, "h26l,h264,264", CODEC_ID_H264)
diff --combined libavformat/hls.c
index 11b6ab1273a1238e8a37efe1f55c95aa84859dee,1f6b7d56ed35b49d652e7ee9733aa7102a085301..b56b6918bb4197ea79bac1d2eaa4211a4034c5b5
@@@ -2,20 -2,20 +2,20 @@@
   * Apple HTTP Live Streaming demuxer
   * Copyright (c) 2010 Martin Storsjo
   *
 - * 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
   */
  
@@@ -42,7 -42,7 +42,7 @@@
   * An apple http stream consists of a playlist with media segment files,
   * played sequentially. There may be several playlists with the same
   * video content, in different bandwidth variants, that are played in
 - * parallel (preferrably only one bandwidth variant at a time). In this case,
 + * parallel (preferably only one bandwidth variant at a time). In this case,
   * the user supplied the url to a main playlist that only lists the variant
   * playlists.
   *
@@@ -228,7 -228,7 +228,7 @@@ static int parse_playlist(HLSContext *c
          free_segment_list(var);
          var->finished = 0;
      }
 -    while (!in->eof_reached) {
 +    while (!url_feof(in)) {
          read_chomp_line(in, line, sizeof(line));
          if (av_strstart(line, "#EXT-X-STREAM-INF:", &ptr)) {
              struct variant_info info = {{0}};
@@@ -517,18 -517,12 +517,18 @@@ static int hls_read_header(AVFormatCont
               * so avformat_close_input shouldn't be called. If
               * avformat_open_input fails below, it frees and zeros the
               * context, so it doesn't need any special treatment like this. */
 +            av_log(s, AV_LOG_ERROR, "Error when loading first segment '%s'\n", v->segments[0]->url);
              avformat_free_context(v->ctx);
              v->ctx = NULL;
              goto fail;
          }
          v->ctx->pb       = &v->pb;
          ret = avformat_open_input(&v->ctx, v->segments[0]->url, in_fmt, NULL);
 +        if (ret < 0)
 +            goto fail;
 +
 +        v->ctx->ctx_flags &= ~AVFMTCTX_NOHEADER;
 +        ret = avformat_find_stream_info(v->ctx, NULL);
          if (ret < 0)
              goto fail;
          v->stream_offset = stream_offset;
@@@ -566,7 -560,7 +566,7 @@@ static int recheck_discard_flags(AVForm
  
      /* Check if any new streams are needed */
      for (i = 0; i < c->n_variants; i++)
 -        c->variants[i]->cur_needed = 0;;
 +        c->variants[i]->cur_needed = 0;
  
      for (i = 0; i < s->nb_streams; i++) {
          AVStream *st = s->streams[i];
@@@ -616,7 -610,7 +616,7 @@@ start
                  AVStream *st;
                  ret = av_read_frame(var->ctx, &var->pkt);
                  if (ret < 0) {
 -                    if (!var->pb.eof_reached)
 +                    if (!url_feof(&var->pb))
                          return ret;
                      reset_packet(&var->pkt);
                      break;
@@@ -702,11 -696,10 +702,11 @@@ static int hls_read_seek(AVFormatContex
          /* Reset reading */
          struct variant *var = c->variants[i];
          int64_t pos = c->first_timestamp == AV_NOPTS_VALUE ? 0 :
 -                      av_rescale_rnd(c->first_timestamp, 1,
 -                          stream_index >= 0 ? s->streams[stream_index]->time_base.den : AV_TIME_BASE,
 -                          flags & AVSEEK_FLAG_BACKWARD ? AV_ROUND_DOWN : AV_ROUND_UP);
 -        if (var->input) {
 +                      av_rescale_rnd(c->first_timestamp, 1, stream_index >= 0 ?
 +                               s->streams[stream_index]->time_base.den :
 +                               AV_TIME_BASE, flags & AVSEEK_FLAG_BACKWARD ?
 +                               AV_ROUND_DOWN : AV_ROUND_UP);
 +         if (var->input) {
              ffurl_close(var->input);
              var->input = NULL;
          }
@@@ -749,7 -742,7 +749,7 @@@ static int hls_probe(AVProbeData *p
  
  AVInputFormat ff_hls_demuxer = {
      .name           = "hls,applehttp",
-     .long_name      = NULL_IF_CONFIG_SMALL("Apple HTTP Live Streaming format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("Apple HTTP Live Streaming"),
      .priv_data_size = sizeof(HLSContext),
      .read_probe     = hls_probe,
      .read_header    = hls_read_header,
diff --combined libavformat/idcin.c
index fd4504a5661b048911a45185cc5789ece707c0c7,6a9b0ca2a987438f9c4785bf9f444bc104864a23..81432c187ffd240775ab6af416771e380ea463ba
@@@ -2,20 -2,20 +2,20 @@@
   * id Quake II CIN File Demuxer
   * Copyright (c) 2003 The ffmpeg Project
   *
 - * 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
   */
  
@@@ -224,7 -224,7 +224,7 @@@ static int idcin_read_packet(AVFormatCo
      unsigned char palette_buffer[768];
      uint32_t palette[256];
  
 -    if (s->pb->eof_reached)
 +    if (url_feof(s->pb))
          return AVERROR(EIO);
  
      if (idcin->next_chunk_is_video) {
                  r = palette_buffer[i * 3    ] << palette_scale;
                  g = palette_buffer[i * 3 + 1] << palette_scale;
                  b = palette_buffer[i * 3 + 2] << palette_scale;
 -                palette[i] = (r << 16) | (g << 8) | (b);
 +                palette[i] = (0xFFU << 24) | (r << 16) | (g << 8) | (b);
 +                if (palette_scale == 2)
 +                    palette[i] |= palette[i] >> 6 & 0x30303;
              }
          }
  
  
              pal = av_packet_new_side_data(pkt, AV_PKT_DATA_PALETTE,
                                            AVPALETTE_SIZE);
 -            if (ret < 0)
 -                return ret;
 +            if (!pal)
 +                return AVERROR(ENOMEM);
              memcpy(pal, palette, AVPALETTE_SIZE);
          }
          pkt->stream_index = idcin->video_stream_index;
  
  AVInputFormat ff_idcin_demuxer = {
      .name           = "idcin",
-     .long_name      = NULL_IF_CONFIG_SMALL("id Cinematic format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("id Cinematic"),
      .priv_data_size = sizeof(IdcinDemuxContext),
      .read_probe     = idcin_probe,
      .read_header    = idcin_read_header,
diff --combined libavformat/idroqdec.c
index ab3ef9664776e0eed34697452c42f5690ffe63a0,b429b494f8b7ae31181e10148d0dbdd868ea0842..d832e354a3fff80cbf5f8b8fff465a38a8f270b8
@@@ -2,20 -2,20 +2,20 @@@
   * id RoQ (.roq) File Demuxer
   * Copyright (c) 2003 The ffmpeg Project
   *
 - * 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
   */
  
@@@ -30,7 -30,6 +30,7 @@@
  #include "libavutil/intreadwrite.h"
  #include "avformat.h"
  #include "internal.h"
 +#include "avio_internal.h"
  
  #define RoQ_MAGIC_NUMBER 0x1084
  #define RoQ_CHUNK_PREAMBLE_SIZE 8
@@@ -105,7 -104,7 +105,7 @@@ static int roq_read_packet(AVFormatCont
  
      while (!packet_read) {
  
 -        if (s->pb->eof_reached)
 +        if (url_feof(s->pb))
              return AVERROR(EIO);
  
          /* get the next chunk preamble */
          if(chunk_size > INT_MAX)
              return AVERROR_INVALIDDATA;
  
 +        chunk_size = ffio_limit(pb, chunk_size);
 +
          switch (chunk_type) {
  
          case RoQ_INFO:
  
  AVInputFormat ff_roq_demuxer = {
      .name           = "roq",
-     .long_name      = NULL_IF_CONFIG_SMALL("id RoQ format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("id RoQ"),
      .priv_data_size = sizeof(RoqDemuxContext),
      .read_probe     = roq_probe,
      .read_header    = roq_read_header,
diff --combined libavformat/idroqenc.c
index dba9c84c20ec198f5d78b9f9f96bab2bb00468d0,df44bb67c48112aa8de0f86c81fc6f6a126beaf1..58bf7e98adc516a26c1996e0a370b3536b58555a
@@@ -2,20 -2,20 +2,20 @@@
   * id RoQ (.roq) File muxer
   * Copyright (c) 2007 Vitor Sessak
   *
 - * 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
   */
  
@@@ -37,7 -37,7 +37,7 @@@ static int roq_write_header(struct AVFo
  
  AVOutputFormat ff_roq_muxer = {
      .name         = "roq",
-     .long_name    = NULL_IF_CONFIG_SMALL("raw id RoQ format"),
+     .long_name    = NULL_IF_CONFIG_SMALL("raw id RoQ"),
      .extensions   = "roq",
      .audio_codec  = CODEC_ID_ROQ_DPCM,
      .video_codec  = CODEC_ID_ROQ,
diff --combined libavformat/ilbc.c
index d4f458354522431b9ba4b1822a618ea981a948c4,b6be5abfbb8b6bea95103650d4d6e79a6d25d831..11959f4028bb6e858e6c34a0633a96ae91600cea
@@@ -2,20 -2,20 +2,20 @@@
   * iLBC storage file format
   * Copyright (c) 2012 Martin Storsjo
   *
 - * 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
   */
  
@@@ -122,7 -122,7 +122,7 @@@ static int ilbc_read_packet(AVFormatCon
  
  AVInputFormat ff_ilbc_demuxer = {
      .name         = "ilbc",
-     .long_name    = NULL_IF_CONFIG_SMALL("iLBC storage file format"),
+     .long_name    = NULL_IF_CONFIG_SMALL("iLBC storage"),
      .read_probe   = ilbc_probe,
      .read_header  = ilbc_read_header,
      .read_packet  = ilbc_read_packet,
  
  AVOutputFormat ff_ilbc_muxer = {
      .name         = "ilbc",
-     .long_name    = NULL_IF_CONFIG_SMALL("iLBC storage file format"),
+     .long_name    = NULL_IF_CONFIG_SMALL("iLBC storage"),
      .mime_type    = "audio/iLBC",
      .extensions   = "lbc",
      .audio_codec  = CODEC_ID_ILBC,
diff --combined libavformat/ipmovie.c
index 30ed16dd7891c257920c8500c655ee5dc5f5fb2a,5557fc90867aa25a7d25f5254fb21c5816108377..4886b8260b87464fdf7fe4a369c78019be3d35b3
@@@ -2,20 -2,20 +2,20 @@@
   * Interplay MVE File Demuxer
   * Copyright (c) 2003 The ffmpeg Project
   *
 - * 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
   */
  
@@@ -116,7 -116,7 +116,7 @@@ static int load_ipmovie_packet(IPMVECon
  
      int chunk_type;
  
 -    if (s->audio_chunk_offset) {
 +    if (s->audio_chunk_offset && s->audio_channels && s->audio_bits) {
          if (s->audio_type == CODEC_ID_NONE) {
              av_log(NULL, AV_LOG_ERROR, "Can not read audio packet before"
                     "audio codec is known\n");
@@@ -236,7 -236,7 +236,7 @@@ static int process_ipmovie_chunk(IPMVEC
          return chunk_type;
  
      /* read the next chunk, wherever the file happens to be pointing */
 -    if (pb->eof_reached)
 +    if (url_feof(pb))
          return CHUNK_EOF;
      if (avio_read(pb, chunk_preamble, CHUNK_PREAMBLE_SIZE) !=
          CHUNK_PREAMBLE_SIZE)
      while ((chunk_size > 0) && (chunk_type != CHUNK_BAD)) {
  
          /* read the next chunk, wherever the file happens to be pointing */
 -        if (pb->eof_reached) {
 +        if (url_feof(pb)) {
              chunk_type = CHUNK_EOF;
              break;
          }
                  r = scratch[j++] * 4;
                  g = scratch[j++] * 4;
                  b = scratch[j++] * 4;
 -                s->palette[i] = (r << 16) | (g << 8) | (b);
 +                s->palette[i] = (0xFFU << 24) | (r << 16) | (g << 8) | (b);
 +                s->palette[i] |= s->palette[i] >> 6 & 0x30303;
              }
              s->has_palette = 1;
              break;
@@@ -529,9 -528,8 +529,9 @@@ static int ipmovie_probe(AVProbeData *p
      uint8_t *b = p->buf;
      uint8_t *b_end = p->buf + p->buf_size - sizeof(signature);
      do {
 -        if (memcmp(b++, signature, sizeof(signature)) == 0)
 +        if (b[0] == signature[0] && memcmp(b, signature, sizeof(signature)) == 0)
              return AVPROBE_SCORE_MAX;
 +        b++;
      } while (b < b_end);
  
      return 0;
@@@ -544,14 -542,14 +544,14 @@@ static int ipmovie_read_header(AVFormat
      AVPacket pkt;
      AVStream *st;
      unsigned char chunk_preamble[CHUNK_PREAMBLE_SIZE];
 -    int chunk_type;
 +    int chunk_type, i;
      uint8_t signature_buffer[sizeof(signature)];
  
      avio_read(pb, signature_buffer, sizeof(signature_buffer));
      while (memcmp(signature_buffer, signature, sizeof(signature))) {
          memmove(signature_buffer, signature_buffer + 1, sizeof(signature_buffer) - 1);
          signature_buffer[sizeof(signature_buffer) - 1] = avio_r8(pb);
 -        if (pb->eof_reached)
 +        if (url_feof(pb))
              return AVERROR_EOF;
      }
      /* initialize private context members */
      /* on the first read, this will position the stream at the first chunk */
      ipmovie->next_chunk_offset = avio_tell(pb) + 4;
  
 +    for (i = 0; i < 256; i++)
 +        ipmovie->palette[i] = 0xFFU << 24;
 +
      /* process the first chunk which should be CHUNK_INIT_VIDEO */
      if (process_ipmovie_chunk(ipmovie, pb, &pkt) != CHUNK_INIT_VIDEO)
          return AVERROR_INVALIDDATA;
@@@ -624,7 -619,6 +624,7 @@@ static int ipmovie_read_packet(AVFormat
      AVIOContext *pb = s->pb;
      int ret;
  
 +    for (;;) {
      ret = process_ipmovie_chunk(ipmovie, pb, pkt);
      if (ret == CHUNK_BAD)
          ret = AVERROR_INVALIDDATA;
          ret = AVERROR(ENOMEM);
      else if (ret == CHUNK_VIDEO)
          ret = 0;
 +    else if (ret == CHUNK_INIT_VIDEO || ret == CHUNK_INIT_AUDIO)
 +        continue;
      else
          ret = -1;
  
      return ret;
 +    }
  }
  
  AVInputFormat ff_ipmovie_demuxer = {
      .name           = "ipmovie",
-     .long_name      = NULL_IF_CONFIG_SMALL("Interplay MVE format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("Interplay MVE"),
      .priv_data_size = sizeof(IPMVEContext),
      .read_probe     = ipmovie_probe,
      .read_header    = ipmovie_read_header,
diff --combined libavformat/iss.c
index f8ec119356b18445a46f27d86d24ecf5bd5c9ed8,1fd9f552d82fc3577292091a40c124f82f255f54..c9b7dc2d3ead85c398ed93a8a51eb83fa74977fc
@@@ -2,20 -2,20 +2,20 @@@
   * ISS (.iss) file demuxer
   * Copyright (c) 2008 Jaikrishnan Menon <realityman@gmx.net>
   *
 - * 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
   */
  
@@@ -87,11 -87,6 +87,11 @@@ static av_cold int iss_read_header(AVFo
      get_token(pb, token, sizeof(token)); //Version ID
      get_token(pb, token, sizeof(token)); //Size
  
 +    if (iss->packet_size <= 0) {
 +        av_log(s, AV_LOG_ERROR, "packet_size %d is invalid\n", iss->packet_size);
 +        return AVERROR_INVALIDDATA;
 +    }
 +
      iss->sample_start_pos = avio_tell(pb);
  
      st = avformat_new_stream(s, NULL);
@@@ -129,7 -124,7 +129,7 @@@ static int iss_read_packet(AVFormatCont
  
  AVInputFormat ff_iss_demuxer = {
      .name           = "iss",
-     .long_name      = NULL_IF_CONFIG_SMALL("Funcom ISS format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("Funcom ISS"),
      .priv_data_size = sizeof(IssDemuxContext),
      .read_probe     = iss_probe,
      .read_header    = iss_read_header,
diff --combined libavformat/lmlm4.c
index 24ae289cbef11fb32ecb9b4a9d1a35cfc47d3c42,e0c4e294868d365aaa54fcaeaf768142ab93c0a2..4d68eea2b802865fe70a40199a3da9f2d66061a7
@@@ -5,20 -5,20 +5,20 @@@
   * Due to a lack of sample files, only files with one channel are supported.
   * u-law and ADPCM audio are unsupported for the same reason.
   *
 - * 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
   */
  
@@@ -120,7 -120,7 +120,7 @@@ static int lmlm4_read_packet(AVFormatCo
  
  AVInputFormat ff_lmlm4_demuxer = {
      .name           = "lmlm4",
-     .long_name      = NULL_IF_CONFIG_SMALL("lmlm4 raw format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("raw lmlm4"),
      .read_probe     = lmlm4_probe,
      .read_header    = lmlm4_read_header,
      .read_packet    = lmlm4_read_packet,
diff --combined libavformat/lxfdec.c
index 21e7290665276ee2238f8b5ebbd1847969df5e34,22d80725d07ff5b5c88bf739b13c8f445cdd0444..e3b7bea625822cf99a9abbd9fa4afd9d1bfeb81a
@@@ -2,30 -2,29 +2,30 @@@
   * LXF demuxer
   * Copyright (c) 2010 Tomas Härdin
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
  #include "libavutil/intreadwrite.h"
 +#include "libavcodec/bytestream.h"
  #include "avformat.h"
  #include "internal.h"
  #include "riff.h"
  
 -#define LXF_PACKET_HEADER_SIZE  60
 +#define LXF_MAX_PACKET_HEADER_SIZE 256
  #define LXF_HEADER_DATA_SIZE    120
  #define LXF_IDENT               "LEITCH\0"
  #define LXF_IDENT_LENGTH        8
@@@ -50,7 -49,6 +50,7 @@@ typedef struct 
      int channels;                       ///< number of audio channels. zero means no audio
      uint8_t temp[LXF_MAX_AUDIO_PACKET]; ///< temp buffer for de-planarizing the audio data
      int frame_number;                   ///< current video frame
 +    uint32_t video_format, packet_type, extended_size;
  } LXFDemuxContext;
  
  static int lxf_probe(AVProbeData *p)
   * @param[in] header the packet header to check
   * @return zero if the checksum is OK, non-zero otherwise
   */
 -static int check_checksum(const uint8_t *header)
 +static int check_checksum(const uint8_t *header, int size)
  {
      int x;
      uint32_t sum = 0;
  
 -    for (x = 0; x < LXF_PACKET_HEADER_SIZE; x += 4)
 +    for (x = 0; x < size; x += 4)
          sum += AV_RL32(&header[x]);
  
      return sum;
@@@ -93,7 -91,7 +93,7 @@@ static int sync(AVFormatContext *s, uin
          return ret < 0 ? ret : AVERROR_EOF;
  
      while (memcmp(buf, LXF_IDENT, LXF_IDENT_LENGTH)) {
 -        if (s->pb->eof_reached)
 +        if (url_feof(s->pb))
              return AVERROR_EOF;
  
          memmove(buf, &buf[1], LXF_IDENT_LENGTH-1);
  /**
   * Read and checksum the next packet header
   *
 - * @param[out] header the read packet header
 - * @param[out] format context dependent format information
   * @return the size of the payload following the header or < 0 on failure
   */
 -static int get_packet_header(AVFormatContext *s, uint8_t *header, uint32_t *format)
 +static int get_packet_header(AVFormatContext *s)
  {
 +    LXFDemuxContext *lxf = s->priv_data;
      AVIOContext   *pb  = s->pb;
      int track_size, samples, ret;
 +    uint32_t version, audio_format, header_size, channels, tmp;
      AVStream *st;
 +    uint8_t header[LXF_MAX_PACKET_HEADER_SIZE];
 +    const uint8_t *p;
  
      //find and read the ident
      if ((ret = sync(s, header)) < 0)
          return ret;
  
 +    ret = avio_read(pb, header + LXF_IDENT_LENGTH, 8);
 +    if (ret != 8)
 +        return ret < 0 ? ret : AVERROR_EOF;
 +
 +    p = header + LXF_IDENT_LENGTH;
 +    version     = bytestream_get_le32(&p);
 +    header_size = bytestream_get_le32(&p);
 +    if (version > 1)
 +        av_log_ask_for_sample(s, "Unknown format version %i\n", version);
 +    if (header_size < (version ? 72 : 60) ||
 +        header_size > LXF_MAX_PACKET_HEADER_SIZE ||
 +        (header_size & 3)) {
 +        av_log(s, AV_LOG_ERROR, "Invalid header size 0x%x\n", header_size);
 +        return AVERROR_INVALIDDATA;
 +    }
 +
      //read the rest of the packet header
 -    if ((ret = avio_read(pb, header + LXF_IDENT_LENGTH,
 -                          LXF_PACKET_HEADER_SIZE - LXF_IDENT_LENGTH)) !=
 -                          LXF_PACKET_HEADER_SIZE - LXF_IDENT_LENGTH) {
 +    if ((ret = avio_read(pb, header + (p - header),
 +                          header_size - (p - header))) !=
 +                          header_size - (p - header)) {
          return ret < 0 ? ret : AVERROR_EOF;
      }
  
 -    if (check_checksum(header))
 +    if (check_checksum(header, header_size))
          av_log(s, AV_LOG_ERROR, "checksum error\n");
  
 -    *format = AV_RL32(&header[32]);
 -    ret     = AV_RL32(&header[36]);
 +    lxf->packet_type = bytestream_get_le32(&p);
 +    p += version ? 20 : 12;
  
 -    //type
 -    switch (AV_RL32(&header[16])) {
 +    lxf->extended_size = 0;
 +    switch (lxf->packet_type) {
      case 0:
          //video
 +        lxf->video_format = bytestream_get_le32(&p);
 +        ret               = bytestream_get_le32(&p);
          //skip VBI data and metadata
 -        avio_skip(pb, (int64_t)(uint32_t)AV_RL32(&header[44]) +
 -                      (int64_t)(uint32_t)AV_RL32(&header[52]));
 +        avio_skip(pb, (int64_t)(uint32_t)AV_RL32(p + 4) +
 +                      (int64_t)(uint32_t)AV_RL32(p + 12));
          break;
      case 1:
          //audio
              break;
          }
  
 +        if (version == 0) p += 8;
 +        audio_format = bytestream_get_le32(&p);
 +        channels     = bytestream_get_le32(&p);
 +        track_size   = bytestream_get_le32(&p);
 +
          //set codec based on specified audio bitdepth
          //we only support tightly packed 16-, 20-, 24- and 32-bit PCM at the moment
 -        *format                          = AV_RL32(&header[40]);
 -        st->codec->bits_per_coded_sample = (*format >> 6) & 0x3F;
 +        st->codec->bits_per_coded_sample = (audio_format >> 6) & 0x3F;
  
 -        if (st->codec->bits_per_coded_sample != (*format & 0x3F)) {
 +        if (st->codec->bits_per_coded_sample != (audio_format & 0x3F)) {
              av_log(s, AV_LOG_WARNING, "only tightly packed PCM currently supported\n");
              return AVERROR_PATCHWELCOME;
          }
              return AVERROR_PATCHWELCOME;
          }
  
 -        track_size = AV_RL32(&header[48]);
          samples = track_size * 8 / st->codec->bits_per_coded_sample;
  
          //use audio packet size to determine video standard
          }
  
          //TODO: warning if track mask != (1 << channels) - 1?
 -        ret = av_popcount(AV_RL32(&header[44])) * track_size;
 +        ret = av_popcount(channels) * track_size;
  
          break;
      default:
 +        tmp = bytestream_get_le32(&p);
 +        ret = bytestream_get_le32(&p);
 +        if (tmp == 1)
 +            lxf->extended_size = bytestream_get_le32(&p);
          break;
      }
  
@@@ -229,13 -200,13 +229,13 @@@ static int lxf_read_header(AVFormatCont
  {
      LXFDemuxContext *lxf = s->priv_data;
      AVIOContext   *pb  = s->pb;
 -    uint8_t header[LXF_PACKET_HEADER_SIZE], header_data[LXF_HEADER_DATA_SIZE];
 +    uint8_t header_data[LXF_HEADER_DATA_SIZE];
      int ret;
      AVStream *st;
 -    uint32_t format, video_params, disk_params;
 +    uint32_t video_params, disk_params;
      uint16_t record_date, expiration_date;
  
 -    if ((ret = get_packet_header(s, header, &format)) < 0)
 +    if ((ret = get_packet_header(s)) < 0)
          return ret;
  
      if (ret != LXF_HEADER_DATA_SIZE) {
          avpriv_set_pts_info(st, 64, 1, st->codec->sample_rate);
      }
  
 -    if (format == 1) {
 -        //skip extended field data
 -        avio_skip(s->pb, (uint32_t)AV_RL32(&header[40]));
 -    }
 +    avio_skip(s->pb, lxf->extended_size);
  
      return 0;
  }
@@@ -309,15 -283,15 +309,15 @@@ static int lxf_read_packet(AVFormatCont
  {
      LXFDemuxContext *lxf = s->priv_data;
      AVIOContext   *pb  = s->pb;
 -    uint8_t header[LXF_PACKET_HEADER_SIZE], *buf;
 +    uint8_t *buf;
      AVStream *ast = NULL;
 -    uint32_t stream, format;
 +    uint32_t stream;
      int ret, ret2;
  
 -    if ((ret = get_packet_header(s, header, &format)) < 0)
 +    if ((ret = get_packet_header(s)) < 0)
          return ret;
  
 -    stream = AV_RL32(&header[16]);
 +    stream = lxf->packet_type;
  
      if (stream > 1) {
          av_log(s, AV_LOG_WARNING, "got packet with illegal stream index %u\n", stream);
              deplanarize(lxf, ast, pkt->data, ret);
      } else {
          //picture type (0 = closed I, 1 = open I, 2 = P, 3 = B)
 -        if (((format >> 22) & 0x3) < 2)
 +        if (((lxf->video_format >> 22) & 0x3) < 2)
              pkt->flags |= AV_PKT_FLAG_KEY;
  
          pkt->dts = lxf->frame_number++;
  
  AVInputFormat ff_lxf_demuxer = {
      .name           = "lxf",
-     .long_name      = NULL_IF_CONFIG_SMALL("VR native stream format (LXF)"),
+     .long_name      = NULL_IF_CONFIG_SMALL("VR native stream (LXF)"),
      .priv_data_size = sizeof(LXFDemuxContext),
      .read_probe     = lxf_probe,
      .read_header    = lxf_read_header,
diff --combined libavformat/m4vdec.c
index 88f838022e67362de755262b24f4924179dbe8ca,02d26f6cce86bb7c341f4a626dd9638597f56878..cc8c11b9b08ff8e4dfee1dbda6b253847c39b5e3
@@@ -2,20 -2,20 +2,20 @@@
   * RAW MPEG-4 video demuxer
   * Copyright (c) 2006  Thijs Vermeir <thijs.vermeir@barco.com>
   *
 - * 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
   */
  
@@@ -45,8 -45,8 +45,8 @@@ static int mpeg4video_probe(AVProbeDat
      }
  
      if (VOP >= VISO && VOP >= VOL && VO >= VOL && VOL > 0 && res==0)
 -        return AVPROBE_SCORE_MAX/2;
 +        return VOP+VO > 3 ? AVPROBE_SCORE_MAX/2 : AVPROBE_SCORE_MAX/4;
      return 0;
  }
  
- FF_DEF_RAWVIDEO_DEMUXER(m4v, "raw MPEG-4 video format", mpeg4video_probe, "m4v", CODEC_ID_MPEG4)
+ FF_DEF_RAWVIDEO_DEMUXER(m4v, "raw MPEG-4 video", mpeg4video_probe, "m4v", CODEC_ID_MPEG4)
index 8640aeeee05fb21be32616574759db5d455c8c36,3ac0635ebb1c0508fbe47f53a3ecc118fc27c931..f75763284b6a75ed3fedaafe66015a9ad67976a8
@@@ -1,21 -1,21 +1,21 @@@
  /*
   * Matroska file demuxer
 - * Copyright (c) 2003-2008 The Libav Project
 + * Copyright (c) 2003-2008 The FFmpeg Project
   *
 - * 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
   */
  
@@@ -112,8 -112,7 +112,8 @@@ typedef struct 
      uint64_t display_height;
      uint64_t pixel_width;
      uint64_t pixel_height;
 -    uint64_t fourcc;
 +    EbmlBin color_space;
 +    uint64_t stereo_mode;
  } MatroskaTrackVideo;
  
  typedef struct {
      uint8_t *buf;
  } MatroskaTrackAudio;
  
 +typedef struct {
 +    uint64_t uid;
 +    uint64_t type;
 +} MatroskaTrackPlane;
 +
 +typedef struct {
 +    EbmlList combine_planes;
 +} MatroskaTrackOperation;
 +
  typedef struct {
      uint64_t num;
      uint64_t uid;
      uint64_t flag_forced;
      MatroskaTrackVideo video;
      MatroskaTrackAudio audio;
 +    MatroskaTrackOperation operation;
      EbmlList encodings;
  
      AVStream *stream;
@@@ -240,7 -229,6 +240,7 @@@ typedef struct 
      uint64_t time_scale;
      double   duration;
      char    *title;
 +    EbmlBin date_utc;
      EbmlList tracks;
      EbmlList attachments;
      EbmlList chapters;
@@@ -302,7 -290,7 +302,7 @@@ static EbmlSyntax matroska_info[] = 
      { MATROSKA_ID_TITLE,              EBML_UTF8,  0, offsetof(MatroskaDemuxContext,title) },
      { MATROSKA_ID_WRITINGAPP,         EBML_NONE },
      { MATROSKA_ID_MUXINGAPP,          EBML_NONE },
 -    { MATROSKA_ID_DATEUTC,            EBML_NONE },
 +    { MATROSKA_ID_DATEUTC,            EBML_BIN,  0, offsetof(MatroskaDemuxContext,date_utc) },
      { MATROSKA_ID_SEGMENTUID,         EBML_NONE },
      { 0 }
  };
@@@ -313,14 -301,14 +313,14 @@@ static EbmlSyntax matroska_track_video[
      { MATROSKA_ID_VIDEODISPLAYHEIGHT, EBML_UINT, 0, offsetof(MatroskaTrackVideo,display_height) },
      { MATROSKA_ID_VIDEOPIXELWIDTH,    EBML_UINT, 0, offsetof(MatroskaTrackVideo,pixel_width) },
      { MATROSKA_ID_VIDEOPIXELHEIGHT,   EBML_UINT, 0, offsetof(MatroskaTrackVideo,pixel_height) },
 -    { MATROSKA_ID_VIDEOCOLORSPACE,    EBML_UINT, 0, offsetof(MatroskaTrackVideo,fourcc) },
 +    { MATROSKA_ID_VIDEOCOLORSPACE,    EBML_BIN,  0, offsetof(MatroskaTrackVideo,color_space) },
 +    { MATROSKA_ID_VIDEOSTEREOMODE,    EBML_UINT, 0, offsetof(MatroskaTrackVideo,stereo_mode) },
      { MATROSKA_ID_VIDEOPIXELCROPB,    EBML_NONE },
      { MATROSKA_ID_VIDEOPIXELCROPT,    EBML_NONE },
      { MATROSKA_ID_VIDEOPIXELCROPL,    EBML_NONE },
      { MATROSKA_ID_VIDEOPIXELCROPR,    EBML_NONE },
      { MATROSKA_ID_VIDEODISPLAYUNIT,   EBML_NONE },
      { MATROSKA_ID_VIDEOFLAGINTERLACED,EBML_NONE },
 -    { MATROSKA_ID_VIDEOSTEREOMODE,    EBML_NONE },
      { MATROSKA_ID_VIDEOASPECTRATIO,   EBML_NONE },
      { 0 }
  };
@@@ -352,22 -340,6 +352,22 @@@ static EbmlSyntax matroska_track_encodi
      { 0 }
  };
  
 +static EbmlSyntax matroska_track_plane[] = {
 +    { MATROSKA_ID_TRACKPLANEUID,  EBML_UINT, 0, offsetof(MatroskaTrackPlane,uid) },
 +    { MATROSKA_ID_TRACKPLANETYPE, EBML_UINT, 0, offsetof(MatroskaTrackPlane,type) },
 +    { 0 }
 +};
 +
 +static EbmlSyntax matroska_track_combine_planes[] = {
 +    { MATROSKA_ID_TRACKPLANE, EBML_NEST, sizeof(MatroskaTrackPlane), offsetof(MatroskaTrackOperation,combine_planes), {.n=matroska_track_plane} },
 +    { 0 }
 +};
 +
 +static EbmlSyntax matroska_track_operation[] = {
 +    { MATROSKA_ID_TRACKCOMBINEPLANES, EBML_NEST, 0, 0, {.n=matroska_track_combine_planes} },
 +    { 0 }
 +};
 +
  static EbmlSyntax matroska_track[] = {
      { MATROSKA_ID_TRACKNUMBER,          EBML_UINT, 0, offsetof(MatroskaTrack,num) },
      { MATROSKA_ID_TRACKNAME,            EBML_UTF8, 0, offsetof(MatroskaTrack,name) },
      { MATROSKA_ID_TRACKFLAGFORCED,      EBML_UINT, 0, offsetof(MatroskaTrack,flag_forced), {.u=0} },
      { MATROSKA_ID_TRACKVIDEO,           EBML_NEST, 0, offsetof(MatroskaTrack,video), {.n=matroska_track_video} },
      { MATROSKA_ID_TRACKAUDIO,           EBML_NEST, 0, offsetof(MatroskaTrack,audio), {.n=matroska_track_audio} },
 +    { MATROSKA_ID_TRACKOPERATION,       EBML_NEST, 0, offsetof(MatroskaTrack,operation), {.n=matroska_track_operation} },
      { MATROSKA_ID_TRACKCONTENTENCODINGS,EBML_NEST, 0, 0, {.n=matroska_track_encodings} },
      { MATROSKA_ID_TRACKFLAGENABLED,     EBML_NONE },
      { MATROSKA_ID_TRACKFLAGLACING,      EBML_NONE },
@@@ -526,7 -497,7 +526,7 @@@ static EbmlSyntax matroska_segments[] 
  static EbmlSyntax matroska_blockgroup[] = {
      { MATROSKA_ID_BLOCK,          EBML_BIN,  0, offsetof(MatroskaBlock,bin) },
      { MATROSKA_ID_SIMPLEBLOCK,    EBML_BIN,  0, offsetof(MatroskaBlock,bin) },
 -    { MATROSKA_ID_BLOCKDURATION,  EBML_UINT, 0, offsetof(MatroskaBlock,duration), {.u=AV_NOPTS_VALUE} },
 +    { MATROSKA_ID_BLOCKDURATION,  EBML_UINT, 0, offsetof(MatroskaBlock,duration) },
      { MATROSKA_ID_BLOCKREFERENCE, EBML_UINT, 0, offsetof(MatroskaBlock,reference) },
      { 1,                          EBML_UINT, 0, offsetof(MatroskaBlock,non_simple), {.u=1} },
      { 0 }
@@@ -584,36 -555,6 +584,36 @@@ static EbmlSyntax matroska_clusters_inc
  
  static const char *const matroska_doctypes[] = { "matroska", "webm" };
  
 +static int matroska_resync(MatroskaDemuxContext *matroska, int64_t last_pos)
 +{
 +    AVIOContext *pb = matroska->ctx->pb;
 +    uint32_t id;
 +    matroska->current_id = 0;
 +    matroska->num_levels = 0;
 +
 +    // seek to next position to resync from
 +    if (avio_seek(pb, last_pos + 1, SEEK_SET) < 0 || avio_tell(pb) <= last_pos)
 +        goto eof;
 +
 +    id = avio_rb32(pb);
 +
 +    // try to find a toplevel element
 +    while (!url_feof(pb)) {
 +        if (id == MATROSKA_ID_INFO || id == MATROSKA_ID_TRACKS ||
 +            id == MATROSKA_ID_CUES || id == MATROSKA_ID_TAGS ||
 +            id == MATROSKA_ID_SEEKHEAD || id == MATROSKA_ID_ATTACHMENTS ||
 +            id == MATROSKA_ID_CLUSTER || id == MATROSKA_ID_CHAPTERS)
 +        {
 +            matroska->current_id = id;
 +            return 0;
 +        }
 +        id = (id << 8) | avio_r8(pb);
 +    }
 +eof:
 +    matroska->done = 1;
 +    return AVERROR_EOF;
 +}
 +
  /*
   * Return: Whether we reached the end of a level in the hierarchy or not.
   */
@@@ -651,7 -592,7 +651,7 @@@ static int ebml_read_num(MatroskaDemuxC
       * use it safely here to catch EOS. */
      if (!(total = avio_r8(pb))) {
          /* we might encounter EOS here */
 -        if (!pb->eof_reached) {
 +        if (!url_feof(pb)) {
              int64_t pos = avio_tell(pb);
              av_log(matroska->ctx, AV_LOG_ERROR,
                     "Read error at pos. %"PRIu64" (0x%"PRIx64")\n",
@@@ -1049,15 -990,11 +1049,15 @@@ static int matroska_decode_buffer(uint8
      int result = 0;
      int olen;
  
 -    if (pkt_size >= 10000000)
 +    if (pkt_size >= 10000000U)
          return -1;
  
      switch (encodings[0].compression.algo) {
      case MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP:
 +        if (encodings[0].compression.settings.size && !encodings[0].compression.settings.data) {
 +            av_log(0, AV_LOG_ERROR, "Compression size but no data in headerstrip\n");
 +            return -1;
 +        }
          return encodings[0].compression.settings.size;
      case MATROSKA_TRACK_ENCODING_COMP_LZO:
          do {
              pkt_data = newpktdata;
              zstream.avail_out = pkt_size - zstream.total_out;
              zstream.next_out = pkt_data + zstream.total_out;
 -            result = inflate(&zstream, Z_NO_FLUSH);
 +            if (pkt_data) {
 +                result = inflate(&zstream, Z_NO_FLUSH);
 +            } else
 +                result = Z_MEM_ERROR;
          } while (result==Z_OK && pkt_size<10000000);
          pkt_size = zstream.total_out;
          inflateEnd(&zstream);
              pkt_data = newpktdata;
              bzstream.avail_out = pkt_size - bzstream.total_out_lo32;
              bzstream.next_out = pkt_data + bzstream.total_out_lo32;
 -            result = BZ2_bzDecompress(&bzstream);
 +            if (pkt_data) {
 +                result = BZ2_bzDecompress(&bzstream);
 +            } else
 +                result = BZ_MEM_ERROR;
          } while (result==BZ_OK && pkt_size<10000000);
          pkt_size = bzstream.total_out_lo32;
          BZ2_bzDecompressEnd(&bzstream);
@@@ -1145,8 -1076,7 +1145,8 @@@ static void matroska_fix_ass_packet(Mat
      char *line, *layer, *ptr = pkt->data, *end = ptr+pkt->size;
      for (; *ptr!=',' && ptr<end-1; ptr++);
      if (*ptr == ',')
 -        layer = ++ptr;
 +        ptr++;
 +    layer = ptr;
      for (; *ptr!=',' && ptr<end-1; ptr++);
      if (*ptr == ',') {
          int64_t end_pts = pkt->pts + display_duration;
  
  static int matroska_merge_packets(AVPacket *out, AVPacket *in)
  {
 -    void *newdata = av_realloc(out->data, out->size+in->size);
 -    if (!newdata)
 -        return AVERROR(ENOMEM);
 -    out->data = newdata;
 -    memcpy(out->data+out->size, in->data, in->size);
 -    out->size += in->size;
 +    int ret = av_grow_packet(out, in->size);
 +    if (ret < 0)
 +        return ret;
 +    memcpy(out->data + out->size - in->size, in->data, in->size);
      av_destruct_packet(in);
      av_free(in);
      return 0;
@@@ -1190,7 -1122,7 +1190,7 @@@ static void matroska_convert_tag(AVForm
      int i;
  
      for (i=0; i < list->nb_elem; i++) {
 -        const char *lang = strcmp(tags[i].lang, "und") ? tags[i].lang : NULL;
 +        const char *lang= (tags[i].lang && strcmp(tags[i].lang, "und")) ? tags[i].lang : NULL;
  
          if (!tags[i].name) {
              av_log(s, AV_LOG_WARNING, "Skipping invalid tag with no TagName.\n");
@@@ -1321,20 -1253,26 +1321,20 @@@ static void matroska_execute_seekhead(M
              continue;
          }
  
 -        if (matroska_parse_seekhead_entry(matroska, i) < 0)
 +        if (matroska_parse_seekhead_entry(matroska, i) < 0) {
 +            // mark index as broken
 +            matroska->cues_parsing_deferred = -1;
              break;
 +        }
      }
  }
  
 -static void matroska_parse_cues(MatroskaDemuxContext *matroska) {
 -    EbmlList *seekhead_list = &matroska->seekhead;
 -    MatroskaSeekhead *seekhead = seekhead_list->elem;
 +static void matroska_add_index_entries(MatroskaDemuxContext *matroska) {
      EbmlList *index_list;
      MatroskaIndex *index;
      int index_scale = 1;
      int i, j;
  
 -    for (i = 0; i < seekhead_list->nb_elem; i++)
 -        if (seekhead[i].id == MATROSKA_ID_CUES)
 -            break;
 -    assert(i <= seekhead_list->nb_elem);
 -
 -    matroska_parse_seekhead_entry(matroska, i);
 -
      index_list = &matroska->index;
      index = index_list->elem;
      if (index_list->nb_elem
      }
  }
  
 +static void matroska_parse_cues(MatroskaDemuxContext *matroska) {
 +    EbmlList *seekhead_list = &matroska->seekhead;
 +    MatroskaSeekhead *seekhead = seekhead_list->elem;
 +    int i;
 +
 +    for (i = 0; i < seekhead_list->nb_elem; i++)
 +        if (seekhead[i].id == MATROSKA_ID_CUES)
 +            break;
 +    assert(i <= seekhead_list->nb_elem);
 +
 +    if (matroska_parse_seekhead_entry(matroska, i) < 0)
 +       matroska->cues_parsing_deferred = -1;
 +    matroska_add_index_entries(matroska);
 +}
 +
  static int matroska_aac_profile(char *codec_id)
  {
      static const char * const aac_profiles[] = { "MAIN", "LC", "SSR" };
@@@ -1392,17 -1315,6 +1392,17 @@@ static int matroska_aac_sri(int sampler
      return sri;
  }
  
 +static void matroska_metadata_creation_time(AVDictionary **metadata, int64_t date_utc)
 +{
 +    char buffer[32];
 +    /* Convert to seconds and adjust by number of seconds between 2001-01-01 and Epoch */
 +    time_t creation_time = date_utc / 1000000000 + 978307200;
 +    struct tm *ptm = gmtime(&creation_time);
 +    if (!ptm) return;
 +    strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", ptm);
 +    av_dict_set(metadata, "creation_time", buffer, 0);
 +}
 +
  static int matroska_read_header(AVFormatContext *s)
  {
      MatroskaDemuxContext *matroska = s->priv_data;
      MatroskaChapter *chapters;
      MatroskaTrack *tracks;
      uint64_t max_start = 0;
 +    int64_t pos;
      Ebml ebml = { 0 };
      AVStream *st;
 -    int i, j, res;
 +    int i, j, k, res;
  
      matroska->ctx = s;
  
      /* First read the EBML header. */
      if (ebml_parse(matroska, ebml_syntax, &ebml)
          || ebml.version > EBML_VERSION       || ebml.max_size > sizeof(uint64_t)
 -        || ebml.id_length > sizeof(uint32_t) || ebml.doctype_version > 2) {
 +        || ebml.id_length > sizeof(uint32_t) || ebml.doctype_version > 3 || !ebml.doctype) {
          av_log(matroska->ctx, AV_LOG_ERROR,
                 "EBML header using unsupported features\n"
                 "(EBML version %"PRIu64", doctype %s, doc version %"PRIu64")\n",
                 ebml.version, ebml.doctype, ebml.doctype_version);
          ebml_free(ebml_syntax, &ebml);
          return AVERROR_PATCHWELCOME;
 +    } else if (ebml.doctype_version == 3) {
 +        av_log(matroska->ctx, AV_LOG_WARNING,
 +               "EBML header using unsupported features\n"
 +               "(EBML version %"PRIu64", doctype %s, doc version %"PRIu64")\n",
 +               ebml.version, ebml.doctype, ebml.doctype_version);
      }
      for (i = 0; i < FF_ARRAY_ELEMS(matroska_doctypes); i++)
          if (!strcmp(ebml.doctype, matroska_doctypes[i]))
      ebml_free(ebml_syntax, &ebml);
  
      /* The next thing is a segment. */
 -    if ((res = ebml_parse(matroska, matroska_segments, matroska)) < 0)
 -        return res;
 +    pos = avio_tell(matroska->ctx->pb);
 +    res = ebml_parse(matroska, matroska_segments, matroska);
 +    // try resyncing until we find a EBML_STOP type element.
 +    while (res != 1) {
 +        res = matroska_resync(matroska, pos);
 +        if (res < 0)
 +            return res;
 +        pos = avio_tell(matroska->ctx->pb);
 +        res = ebml_parse(matroska, matroska_segment, matroska);
 +    }
      matroska_execute_seekhead(matroska);
  
      if (!matroska->time_scale)
                                    * 1000 / AV_TIME_BASE;
      av_dict_set(&s->metadata, "title", matroska->title, 0);
  
 +    if (matroska->date_utc.size == 8)
 +        matroska_metadata_creation_time(&s->metadata, AV_RB64(matroska->date_utc.data));
 +
      tracks = matroska->tracks.elem;
      for (i=0; i < matroska->tracks.nb_elem; i++) {
          MatroskaTrack *track = &tracks[i];
          enum CodecID codec_id = CODEC_ID_NONE;
 -        EbmlList *encodings_list = &tracks->encodings;
 +        EbmlList *encodings_list = &track->encodings;
          MatroskaTrackEncoding *encodings = encodings_list->elem;
          uint8_t *extradata = NULL;
          int extradata_size = 0;
          int extradata_offset = 0;
 +        uint32_t fourcc = 0;
          AVIOContext b;
  
          /* Apply some sanity checks. */
                  track->video.display_width = track->video.pixel_width;
              if (!track->video.display_height)
                  track->video.display_height = track->video.pixel_height;
 +            if (track->video.color_space.size == 4)
 +                fourcc = AV_RL32(track->video.color_space.data);
          } else if (track->type == MATROSKA_TRACK_TYPE_AUDIO) {
              if (!track->audio.out_samplerate)
                  track->audio.out_samplerate = track->audio.samplerate;
              && track->codec_priv.size >= 40
              && track->codec_priv.data != NULL) {
              track->ms_compat = 1;
 -            track->video.fourcc = AV_RL32(track->codec_priv.data + 16);
 -            codec_id = ff_codec_get_id(ff_codec_bmp_tags, track->video.fourcc);
 +            fourcc = AV_RL32(track->codec_priv.data + 16);
 +            codec_id = ff_codec_get_id(ff_codec_bmp_tags, fourcc);
              extradata_offset = 40;
          } else if (!strcmp(track->codec_id, "A_MS/ACM")
                     && track->codec_priv.size >= 14
          } else if (!strcmp(track->codec_id, "V_QUICKTIME")
                     && (track->codec_priv.size >= 86)
                     && (track->codec_priv.data != NULL)) {
 -            track->video.fourcc = AV_RL32(track->codec_priv.data);
 -            codec_id=ff_codec_get_id(ff_codec_movvideo_tags, track->video.fourcc);
 +            fourcc = AV_RL32(track->codec_priv.data);
 +            codec_id = ff_codec_get_id(ff_codec_movvideo_tags, fourcc);
          } else if (codec_id == CODEC_ID_PCM_S16BE) {
              switch (track->audio.bitdepth) {
              case  8:  codec_id = CODEC_ID_PCM_U8;     break;
                  extradata_size = 2;
          } else if (codec_id == CODEC_ID_TTA) {
              extradata_size = 30;
 -            extradata = av_mallocz(extradata_size);
 +            extradata = av_mallocz(extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
              if (extradata == NULL)
                  return AVERROR(ENOMEM);
              ffio_init_context(&b, extradata, extradata_size, 1,
          } else if (codec_id == CODEC_ID_RA_144) {
              track->audio.out_samplerate = 8000;
              track->audio.channels = 1;
 -        } else if (codec_id == CODEC_ID_RA_288 || codec_id == CODEC_ID_COOK ||
 -                   codec_id == CODEC_ID_ATRAC3 || codec_id == CODEC_ID_SIPR) {
 +        } else if ((codec_id == CODEC_ID_RA_288 || codec_id == CODEC_ID_COOK ||
 +                    codec_id == CODEC_ID_ATRAC3 || codec_id == CODEC_ID_SIPR)
 +                    && track->codec_priv.data) {
              int flavor;
 +
              ffio_init_context(&b, track->codec_priv.data,track->codec_priv.size,
                            0, NULL, NULL, NULL, NULL);
              avio_skip(&b, 22);
          }
  
          if (track->type == MATROSKA_TRACK_TYPE_VIDEO) {
 +            MatroskaTrackPlane *planes = track->operation.combine_planes.elem;
 +
              st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
 -            st->codec->codec_tag  = track->video.fourcc;
 +            st->codec->codec_tag  = fourcc;
              st->codec->width  = track->video.pixel_width;
              st->codec->height = track->video.pixel_height;
              av_reduce(&st->sample_aspect_ratio.num,
                        st->codec->height * track->video.display_width,
                        st->codec-> width * track->video.display_height,
                        255);
 -            if (st->codec->codec_id != CODEC_ID_H264)
              st->need_parsing = AVSTREAM_PARSE_HEADERS;
              if (track->default_duration) {
                  av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den,
                  st->r_frame_rate = st->avg_frame_rate;
  #endif
              }
 +
 +            /* export stereo mode flag as metadata tag */
 +            if (track->video.stereo_mode && track->video.stereo_mode < MATROSKA_VIDEO_STEREO_MODE_COUNT)
 +                av_dict_set(&st->metadata, "stereo_mode", matroska_video_stereo_mode[track->video.stereo_mode], 0);
 +
 +            /* if we have virtual track, mark the real tracks */
 +            for (j=0; j < track->operation.combine_planes.nb_elem; j++) {
 +                char buf[32];
 +                if (planes[j].type >= MATROSKA_VIDEO_STEREO_PLANE_COUNT)
 +                    continue;
 +                snprintf(buf, sizeof(buf), "%s_%d",
 +                         matroska_video_stereo_plane[planes[j].type], i);
 +                for (k=0; k < matroska->tracks.nb_elem; k++)
 +                    if (planes[j].uid == tracks[k].uid) {
 +                        av_dict_set(&s->streams[k]->metadata,
 +                                    "stereo_mode", buf, 0);
 +                        break;
 +                    }
 +            }
          } else if (track->type == MATROSKA_TRACK_TYPE_AUDIO) {
              st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
              st->codec->sample_rate = track->audio.out_samplerate;
              av_dict_set(&st->metadata, "mimetype", attachements[j].mime, 0);
              st->codec->codec_id = CODEC_ID_NONE;
              st->codec->codec_type = AVMEDIA_TYPE_ATTACHMENT;
 -            st->codec->extradata  = av_malloc(attachements[j].bin.size);
 +            st->codec->extradata  = av_malloc(attachements[j].bin.size + FF_INPUT_BUFFER_PADDING_SIZE);
              if(st->codec->extradata == NULL)
                  break;
              st->codec->extradata_size = attachements[j].bin.size;
              max_start = chapters[i].start;
          }
  
 +    matroska_add_index_entries(matroska);
 +
      matroska_convert_tags(s);
  
      return 0;
@@@ -1870,8 -1738,7 +1870,8 @@@ static int matroska_parse_block(Matrosk
      st = track->stream;
      if (st->discard >= AVDISCARD_ALL)
          return res;
 -    if (duration == AV_NOPTS_VALUE)
 +    av_assert1(duration != AV_NOPTS_VALUE);
 +    if (!duration)
          duration = track->default_duration / matroska->time_scale;
  
      block_time = AV_RB16(data);
      }
  
      if (matroska->skip_to_keyframe && track->type != MATROSKA_TRACK_TYPE_SUBTITLE) {
 -        if (!is_keyframe || timecode < matroska->skip_to_timecode)
 +        if (timecode < matroska->skip_to_timecode)
              return res;
 -        matroska->skip_to_keyframe = 0;
 +        if (!st->skip_to_keyframe) {
 +            av_log(matroska->ctx, AV_LOG_ERROR, "File is broken, keyframes not correctly marked!\n");
 +            matroska->skip_to_keyframe = 0;
 +        }
 +        if (is_keyframe)
 +            matroska->skip_to_keyframe = 0;
      }
  
      switch ((flags & 0x06) >> 1) {
          case 0x1: /* Xiph lacing */
          case 0x2: /* fixed-size lacing */
          case 0x3: /* EBML lacing */
 -            assert(size>0); // size <=3 is checked before size-=3 above
 +            av_assert0(size>0); // size <=3 is checked before size-=3 above
              laces = (*data) + 1;
              data += 1;
              size -= 1;
  
      if (res == 0) {
          for (n = 0; n < laces; n++) {
 +            if (lace_size[n] > size) {
 +                av_log(matroska->ctx, AV_LOG_ERROR, "Invalid packet size\n");
 +                break;
 +            }
 +
              if ((st->codec->codec_id == CODEC_ID_RA_288 ||
                   st->codec->codec_id == CODEC_ID_COOK ||
                   st->codec->codec_id == CODEC_ID_SIPR ||
                  }
              } else {
                  MatroskaTrackEncoding *encodings = track->encodings.elem;
 -                int offset = 0, pkt_size = lace_size[n];
 +                int offset = 0;
 +                uint32_t pkt_size = lace_size[n];
                  uint8_t *pkt_data = data;
  
 -                if (pkt_size > size) {
 -                    av_log(matroska->ctx, AV_LOG_ERROR, "Invalid packet size\n");
 -                    break;
 -                }
 -
                  if (encodings && encodings->scope & 1) {
                      offset = matroska_decode_buffer(&pkt_data,&pkt_size, track);
                      if (offset < 0)
                          continue;
 +                    av_assert0(offset + pkt_size >= pkt_size);
                  }
  
                  pkt = av_mallocz(sizeof(AVPacket));
@@@ -2158,7 -2018,7 +2158,7 @@@ static int matroska_parse_cluster_incre
          if (blocks[i].bin.size > 0 && blocks[i].bin.data) {
              int is_keyframe = blocks[i].non_simple ? !blocks[i].reference : -1;
              if (!blocks[i].non_simple)
 -                blocks[i].duration = AV_NOPTS_VALUE;
 +                blocks[i].duration = 0;
              res = matroska_parse_block(matroska,
                                         blocks[i].bin.data, blocks[i].bin.size,
                                         blocks[i].bin.pos,
@@@ -2188,9 -2048,11 +2188,9 @@@ static int matroska_parse_cluster(Matro
      res = ebml_parse(matroska, matroska_clusters, &cluster);
      blocks_list = &cluster.blocks;
      blocks = blocks_list->elem;
 -    for (i=0; i<blocks_list->nb_elem && !res; i++)
 +    for (i=0; i<blocks_list->nb_elem; i++)
          if (blocks[i].bin.size > 0 && blocks[i].bin.data) {
              int is_keyframe = blocks[i].non_simple ? !blocks[i].reference : -1;
 -            if (!blocks[i].non_simple)
 -                blocks[i].duration = AV_NOPTS_VALUE;
              res=matroska_parse_block(matroska,
                                       blocks[i].bin.data, blocks[i].bin.size,
                                       blocks[i].bin.pos,  cluster.timecode,
                                       pos);
          }
      ebml_free(matroska_cluster, &cluster);
 -    if (res < 0)  matroska->done = 1;
      return res;
  }
  
  static int matroska_read_packet(AVFormatContext *s, AVPacket *pkt)
  {
      MatroskaDemuxContext *matroska = s->priv_data;
 -    int ret = 0;
  
 -    while (!ret && matroska_deliver_packet(matroska, pkt)) {
 +    while (matroska_deliver_packet(matroska, pkt)) {
 +        int64_t pos = avio_tell(matroska->ctx->pb);
          if (matroska->done)
              return AVERROR_EOF;
 -        ret = matroska_parse_cluster(matroska);
 +        if (matroska_parse_cluster(matroska) < 0)
 +            matroska_resync(matroska, pos);
      }
  
 -    if (ret == AVERROR_INVALIDDATA) {
 -        pkt->flags |= AV_PKT_FLAG_CORRUPT;
 -        return 0;
 -    }
 -
 -    return ret;
 +    return 0;
  }
  
  static int matroska_read_seek(AVFormatContext *s, int stream_index,
      int i, index, index_sub, index_min;
  
      /* Parse the CUES now since we need the index data to seek. */
 -    if (matroska->cues_parsing_deferred) {
 -        matroska_parse_cues(matroska);
 +    if (matroska->cues_parsing_deferred > 0) {
          matroska->cues_parsing_deferred = 0;
 +        matroska_parse_cues(matroska);
      }
  
      if (!st->nb_index_entries)
 -        return 0;
 +        goto err;
      timestamp = FFMAX(timestamp, st->index_entries[0].timestamp);
  
      if ((index = av_index_search_timestamp(st, timestamp, flags)) < 0) {
      }
  
      matroska_clear_queue(matroska);
 -    if (index < 0)
 -        return 0;
 +    if (index < 0 || (matroska->cues_parsing_deferred < 0 && index == st->nb_index_entries - 1))
 +        goto err;
  
      index_min = index;
      for (i=0; i < matroska->tracks.nb_elem; i++) {
  
      avio_seek(s->pb, st->index_entries[index_min].pos, SEEK_SET);
      matroska->current_id = 0;
 +    st->skip_to_keyframe =
      matroska->skip_to_keyframe = !(flags & AVSEEK_FLAG_ANY);
      matroska->skip_to_timecode = st->index_entries[index].timestamp;
      matroska->done = 0;
 +    matroska->num_levels = 0;
      ff_update_cur_dts(s, st, st->index_entries[index].timestamp);
      return 0;
 +err:
 +    // slightly hackish but allows proper fallback to
 +    // the generic seeking code.
 +    matroska_clear_queue(matroska);
 +    matroska->current_id = 0;
 +    st->skip_to_keyframe =
 +    matroska->skip_to_keyframe = 0;
 +    matroska->done = 0;
 +    matroska->num_levels = 0;
 +    return -1;
  }
  
  static int matroska_read_close(AVFormatContext *s)
  
  AVInputFormat ff_matroska_demuxer = {
      .name           = "matroska,webm",
-     .long_name      = NULL_IF_CONFIG_SMALL("Matroska/WebM file format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("Matroska / WebM"),
      .priv_data_size = sizeof(MatroskaDemuxContext),
      .read_probe     = matroska_probe,
      .read_header    = matroska_read_header,
index bbab728ba704a46c56d2145fee71797f6d7d4f2a,440bc4644a15f53cdca02feab1b5078b591e1a18..f5fdaae2cd8c77afa1498a723ca2735e6a789b31
@@@ -2,20 -2,20 +2,20 @@@
   * Matroska muxer
   * Copyright (c) 2007 David Conrad
   *
 - * 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
   */
  
@@@ -128,7 -128,7 +128,7 @@@ static void put_ebml_id(AVIOContext *pb
   */
  static void put_ebml_size_unknown(AVIOContext *pb, int bytes)
  {
 -    assert(bytes <= 8);
 +    av_assert0(bytes <= 8);
      avio_w8(pb, 0x1ff >> bytes);
      while (--bytes)
          avio_w8(pb, 0xff);
@@@ -155,14 -155,14 +155,14 @@@ static void put_ebml_num(AVIOContext *p
      int i, needed_bytes = ebml_num_size(num);
  
      // sizes larger than this are currently undefined in EBML
 -    assert(num < (1ULL<<56)-1);
 +    av_assert0(num < (1ULL<<56)-1);
  
      if (bytes == 0)
          // don't care how many bytes are used, so use the min
          bytes = needed_bytes;
      // the bytes needed to write the given size would exceed the bytes
      // that we need to use, so write unknown size. This shouldn't happen.
 -    assert(bytes >= needed_bytes);
 +    av_assert0(bytes >= needed_bytes);
  
      num |= 1ULL << bytes*7;
      for (i = bytes - 1; i >= 0; i--)
@@@ -211,7 -211,7 +211,7 @@@ static void put_ebml_void(AVIOContext *
  {
      int64_t currentpos = avio_tell(pb);
  
 -    assert(size >= 2);
 +    av_assert0(size >= 2);
  
      put_ebml_id(pb, EBML_ID_VOID);
      // we need to subtract the length needed to store the size from the
@@@ -580,10 -580,7 +580,10 @@@ static int mkv_write_tracks(AVFormatCon
          switch (codec->codec_type) {
              case AVMEDIA_TYPE_VIDEO:
                  put_ebml_uint(pb, MATROSKA_ID_TRACKTYPE, MATROSKA_TRACK_TYPE_VIDEO);
 -                put_ebml_uint(pb, MATROSKA_ID_TRACKDEFAULTDURATION, av_q2d(codec->time_base)*1E9);
 +                if(st->avg_frame_rate.num && st->avg_frame_rate.den && 1.0/av_q2d(st->avg_frame_rate) > av_q2d(codec->time_base))
 +                    put_ebml_uint(pb, MATROSKA_ID_TRACKDEFAULTDURATION, 1E9/av_q2d(st->avg_frame_rate));
 +                else
 +                    put_ebml_uint(pb, MATROSKA_ID_TRACKDEFAULTDURATION, av_q2d(codec->time_base)*1E9);
  
                  if (!native_id &&
                        ff_codec_get_tag(ff_codec_movvideo_tags, codec->codec_id) &&
                  // XXX: interlace flag?
                  put_ebml_uint (pb, MATROSKA_ID_VIDEOPIXELWIDTH , codec->width);
                  put_ebml_uint (pb, MATROSKA_ID_VIDEOPIXELHEIGHT, codec->height);
 -                if ((tag = av_dict_get(s->metadata, "stereo_mode", NULL, 0))) {
 -                    uint8_t stereo_fmt = atoi(tag->value);
 -                    int valid_fmt = 0;
 -
 -                    switch (mkv->mode) {
 -                    case MODE_WEBM:
 -                        if (stereo_fmt <= MATROSKA_VIDEO_STEREOMODE_TYPE_TOP_BOTTOM
 -                            || stereo_fmt == MATROSKA_VIDEO_STEREOMODE_TYPE_RIGHT_LEFT)
 -                            valid_fmt = 1;
 -                        break;
 -                    case MODE_MATROSKAv2:
 -                        if (stereo_fmt <= MATROSKA_VIDEO_STEREOMODE_TYPE_BOTH_EYES_BLOCK_RL)
 -                            valid_fmt = 1;
 -                        break;
 -                    }
 -
 -                    if (valid_fmt)
 -                        put_ebml_uint (pb, MATROSKA_ID_VIDEOSTEREOMODE, stereo_fmt);
 +
 +                if ((tag = av_dict_get(st->metadata, "stereo_mode", NULL, 0)) ||
 +                    (tag = av_dict_get( s->metadata, "stereo_mode", NULL, 0))) {
 +                    // save stereo mode flag
 +                    uint64_t st_mode = MATROSKA_VIDEO_STEREO_MODE_COUNT;
 +
 +                    for (j=0; j<MATROSKA_VIDEO_STEREO_MODE_COUNT; j++)
 +                        if (!strcmp(tag->value, matroska_video_stereo_mode[j])){
 +                            st_mode = j;
 +                            break;
 +                        }
 +
 +                    if ((mkv->mode == MODE_WEBM && st_mode > 3 && st_mode != 11)
 +                        || st_mode >= MATROSKA_VIDEO_STEREO_MODE_COUNT) {
 +                        av_log(s, AV_LOG_ERROR,
 +                               "The specified stereo mode is not valid.\n");
 +                        return AVERROR(EINVAL);
 +                    } else
 +                        put_ebml_uint(pb, MATROSKA_ID_VIDEOSTEREOMODE, st_mode);
                  }
 +
                  if (st->sample_aspect_ratio.num) {
                      int d_width = codec->width*av_q2d(st->sample_aspect_ratio);
                      put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYWIDTH , d_width);
                      put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYHEIGHT, codec->height);
                      put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYUNIT, 3);
                  }
 +
 +                if (codec->codec_id == CODEC_ID_RAWVIDEO) {
 +                    uint32_t color_space = av_le2ne32(codec->codec_tag);
 +                    put_ebml_binary(pb, MATROSKA_ID_VIDEOCOLORSPACE, &color_space, sizeof(color_space));
 +                }
                  end_ebml_master(pb, subinfo);
                  break;
  
@@@ -776,7 -766,7 +776,7 @@@ static int mkv_write_tag(AVFormatContex
      end_ebml_master(s->pb, targets);
  
      while ((t = av_dict_get(m, "", t, AV_DICT_IGNORE_SUFFIX)))
 -        if (av_strcasecmp(t->key, "title"))
 +        if (av_strcasecmp(t->key, "title") && av_strcasecmp(t->key, "stereo_mode"))
              mkv_write_simpletag(s->pb, t);
  
      end_ebml_master(s->pb, tag);
@@@ -940,14 -930,6 +940,14 @@@ static int mkv_write_header(AVFormatCon
          put_ebml_binary(pb, MATROSKA_ID_SEGMENTUID, segment_uid, 16);
      }
  
 +    if (tag = av_dict_get(s->metadata, "creation_time", NULL, 0)) {
 +        // Adjust time so it's relative to 2001-01-01 and convert to nanoseconds.
 +        int64_t date_utc = (ff_iso8601_to_unix_time(tag->value) - 978307200) * 1000000000;
 +        uint8_t date_utc_buf[8];
 +        AV_WB64(date_utc_buf, date_utc);
 +        put_ebml_binary(pb, MATROSKA_ID_DATEUTC, date_utc_buf, 8);
 +    }
 +
      // reserve space for the duration
      mkv->duration = 0;
      mkv->duration_offset = avio_tell(pb);
      av_init_packet(&mkv->cur_audio_pkt);
      mkv->cur_audio_pkt.size = 0;
      mkv->audio_buffer_size  = 0;
 +    mkv->cluster_pos = -1;
  
      avio_flush(pb);
      return 0;
@@@ -1151,7 -1132,7 +1151,7 @@@ static int mkv_write_packet_internal(AV
          pb = mkv->dyn_bc;
      }
  
 -    if (!mkv->cluster_pos) {
 +    if (mkv->cluster_pos == -1) {
          mkv->cluster_pos = avio_tell(s->pb);
          mkv->cluster = start_ebml_master(pb, MATROSKA_ID_CLUSTER, 0);
          put_ebml_uint(pb, MATROSKA_ID_CLUSTERTIMECODE, FFMAX(0, ts));
@@@ -1205,14 -1186,14 +1205,14 @@@ static int mkv_write_packet(AVFormatCon
  
      // start a new cluster every 5 MB or 5 sec, or 32k / 1 sec for streaming or
      // after 4k and on a keyframe
 -    if (mkv->cluster_pos &&
 +    if (mkv->cluster_pos != -1 &&
          ((!s->pb->seekable && (cluster_size > 32*1024 || ts > mkv->cluster_pts + 1000))
           ||                      cluster_size > 5*1024*1024 || ts > mkv->cluster_pts + 5000
           || (codec->codec_type == AVMEDIA_TYPE_VIDEO && keyframe && cluster_size > 4*1024))) {
          av_log(s, AV_LOG_DEBUG, "Starting new cluster at offset %" PRIu64
                 " bytes, pts %" PRIu64 "\n", avio_tell(pb), ts);
          end_ebml_master(pb, mkv->cluster);
 -        mkv->cluster_pos = 0;
 +        mkv->cluster_pos = -1;
          if (mkv->dyn_bc)
              mkv_flush_dynbuf(s);
      }
@@@ -1256,7 -1237,7 +1256,7 @@@ static int mkv_write_trailer(AVFormatCo
      if (mkv->dyn_bc) {
          end_ebml_master(mkv->dyn_bc, mkv->cluster);
          mkv_flush_dynbuf(s);
 -    } else if (mkv->cluster_pos) {
 +    } else if (mkv->cluster_pos != -1) {
          end_ebml_master(pb, mkv->cluster);
      }
  
@@@ -1307,7 -1288,7 +1307,7 @@@ static int mkv_query_codec(enum CodecI
  #if CONFIG_MATROSKA_MUXER
  AVOutputFormat ff_matroska_muxer = {
      .name              = "matroska",
-     .long_name         = NULL_IF_CONFIG_SMALL("Matroska file format"),
+     .long_name         = NULL_IF_CONFIG_SMALL("Matroska"),
      .mime_type         = "video/x-matroska",
      .extensions        = "mkv",
      .priv_data_size    = sizeof(MatroskaMuxContext),
      .write_trailer     = mkv_write_trailer,
      .flags             = AVFMT_GLOBALHEADER | AVFMT_VARIABLE_FPS |
                           AVFMT_TS_NONSTRICT,
 -    .codec_tag         = (const AVCodecTag* const []){
 -         ff_codec_bmp_tags, ff_codec_wav_tags, 0
 -    },
      .subtitle_codec    = CODEC_ID_SSA,
      .query_codec       = mkv_query_codec,
  };
  #if CONFIG_WEBM_MUXER
  AVOutputFormat ff_webm_muxer = {
      .name              = "webm",
-     .long_name         = NULL_IF_CONFIG_SMALL("WebM file format"),
+     .long_name         = NULL_IF_CONFIG_SMALL("WebM"),
      .mime_type         = "video/webm",
      .extensions        = "webm",
      .priv_data_size    = sizeof(MatroskaMuxContext),
  #if CONFIG_MATROSKA_AUDIO_MUXER
  AVOutputFormat ff_matroska_audio_muxer = {
      .name              = "matroska",
-     .long_name         = NULL_IF_CONFIG_SMALL("Matroska file format"),
+     .long_name         = NULL_IF_CONFIG_SMALL("Matroska"),
      .mime_type         = "audio/x-matroska",
      .extensions        = "mka",
      .priv_data_size    = sizeof(MatroskaMuxContext),
      .write_packet      = mkv_write_packet,
      .write_trailer     = mkv_write_trailer,
      .flags             = AVFMT_GLOBALHEADER | AVFMT_TS_NONSTRICT,
 -    .codec_tag         = (const AVCodecTag* const []){ ff_codec_wav_tags, 0 },
  };
  #endif
diff --combined libavformat/md5enc.c
index 4ea7924a3404a998af29c3c1a0a3063d5335d9de,aaac5a97b2e68f78090d7c13198adc5cb586918b..9c51cf1d437ec2434a79b020a2e83b55baa46d9f
@@@ -2,20 -2,20 +2,20 @@@
   * MD5 encoder (for codec/format testing)
   * Copyright (c) 2009 Reimar Döffinger, based on crcenc (c) 2002 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
   */
  
@@@ -68,7 -68,8 +68,7 @@@ static int write_trailer(struct AVForma
  
  AVOutputFormat ff_md5_muxer = {
      .name              = "md5",
-     .long_name         = NULL_IF_CONFIG_SMALL("MD5 testing format"),
+     .long_name         = NULL_IF_CONFIG_SMALL("MD5 testing"),
 -    .extensions        = "",
      .priv_data_size    = PRIVSIZE,
      .audio_codec       = CODEC_ID_PCM_S16LE,
      .video_codec       = CODEC_ID_RAWVIDEO,
@@@ -98,7 -99,8 +98,7 @@@ static int framemd5_write_packet(struc
  
  AVOutputFormat ff_framemd5_muxer = {
      .name              = "framemd5",
-     .long_name         = NULL_IF_CONFIG_SMALL("Per-frame MD5 testing format"),
+     .long_name         = NULL_IF_CONFIG_SMALL("Per-frame MD5 testing"),
 -    .extensions        = "",
      .priv_data_size    = PRIVSIZE,
      .audio_codec       = CODEC_ID_PCM_S16LE,
      .video_codec       = CODEC_ID_RAWVIDEO,
diff --combined libavformat/mm.c
index d7308b9a907c409049c00985ac9c07a1beda46c5,421c21641cd1ba853a156bdd58fe5c33540c605b..889aa12e865267814b39fda857cb904d34922e1d
@@@ -2,20 -2,20 +2,20 @@@
   * American Laser Games MM Format Demuxer
   * Copyright (c) 2006 Peter Ross
   *
 - * 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
   */
  
@@@ -174,6 -174,7 +174,6 @@@ static int read_packet(AVFormatContext 
          case MM_TYPE_AUDIO :
              if (av_get_packet(s->pb, pkt, length)<0)
                  return AVERROR(ENOMEM);
 -            pkt->size = length;
              pkt->stream_index = 1;
              pkt->pts = mm->audio_pts++;
              return 0;
  
  AVInputFormat ff_mm_demuxer = {
      .name           = "mm",
-     .long_name      = NULL_IF_CONFIG_SMALL("American Laser Games MM format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("American Laser Games MM"),
      .priv_data_size = sizeof(MmDemuxContext),
      .read_probe     = probe,
      .read_header    = read_header,
diff --combined libavformat/movenc.c
index b50218cd996e6243987aa6ef9a12efab9f62a459,3778e6bee11ce50736540fdfe7f3ab4a21c94e13..48b7e6ae37ab1d4b506267d2f3756dbc855ee5f2
@@@ -4,20 -4,20 +4,20 @@@
   * Copyright (c) 2004 Gildas Bazin <gbazin at videolan dot org>
   * Copyright (c) 2009 Baptiste Coudurier <baptiste dot coudurier at gmail dot com>
   *
 - * 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
   */
  
  static const AVOption options[] = {
      { "movflags", "MOV muxer flags", offsetof(MOVMuxContext, flags), AV_OPT_TYPE_FLAGS, {.dbl = 0}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "movflags" },
      { "rtphint", "Add RTP hint tracks", 0, AV_OPT_TYPE_CONST, {.dbl = FF_MOV_FLAG_RTP_HINT}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "movflags" },
 +    { "moov_size", "maximum moov size so it can be placed at the begin", offsetof(MOVMuxContext, reserved_moov_size), AV_OPT_TYPE_INT, {.dbl = 0}, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, 0 },
      { "empty_moov", "Make the initial moov atom empty (not supported by QuickTime)", 0, AV_OPT_TYPE_CONST, {.dbl = FF_MOV_FLAG_EMPTY_MOOV}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "movflags" },
      { "frag_keyframe", "Fragment at video keyframes", 0, AV_OPT_TYPE_CONST, {.dbl = FF_MOV_FLAG_FRAG_KEYFRAME}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "movflags" },
      { "separate_moof", "Write separate moof/mdat atoms for each track", 0, AV_OPT_TYPE_CONST, {.dbl = FF_MOV_FLAG_SEPARATE_MOOF}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "movflags" },
      { "frag_custom", "Flush fragments on caller requests", 0, AV_OPT_TYPE_CONST, {.dbl = FF_MOV_FLAG_FRAG_CUSTOM}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "movflags" },
      { "isml", "Create a live smooth streaming feed (for pushing to a publishing point)", 0, AV_OPT_TYPE_CONST, {.dbl = FF_MOV_FLAG_ISML}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "movflags" },
      FF_RTP_FLAG_OPTS(MOVMuxContext, rtp_flags),
 -    { "skip_iods", "Skip writing iods atom.", offsetof(MOVMuxContext, iods_skip), AV_OPT_TYPE_INT, {.dbl = 0}, 0, 1, AV_OPT_FLAG_ENCODING_PARAM},
 +    { "skip_iods", "Skip writing iods atom.", offsetof(MOVMuxContext, iods_skip), AV_OPT_TYPE_INT, {.dbl = 1}, 0, 1, AV_OPT_FLAG_ENCODING_PARAM},
      { "iods_audio_profile", "iods audio profile atom.", offsetof(MOVMuxContext, iods_audio_profile), AV_OPT_TYPE_INT, {.dbl = -1}, -1, 255, AV_OPT_FLAG_ENCODING_PARAM},
      { "iods_video_profile", "iods video profile atom.", offsetof(MOVMuxContext, iods_video_profile), AV_OPT_TYPE_INT, {.dbl = -1}, -1, 255, AV_OPT_FLAG_ENCODING_PARAM},
      { "frag_duration", "Maximum fragment duration", offsetof(MOVMuxContext, max_fragment_duration), AV_OPT_TYPE_INT, {.dbl = 0}, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM},
@@@ -95,10 -94,8 +95,10 @@@ static int mov_write_stco_tag(AVIOConte
      } else
          ffio_wfourcc(pb, "stco");
      avio_wb32(pb, 0); /* version & flags */
 -    avio_wb32(pb, track->entry); /* entry count */
 +    avio_wb32(pb, track->chunkCount); /* entry count */
      for (i=0; i<track->entry; i++) {
 +        if(!track->cluster[i].chunkNum)
 +            continue;
          if(mode64 == 1)
              avio_wb64(pb, track->cluster[i].pos + track->data_offset);
          else
@@@ -156,11 -153,11 +156,11 @@@ static int mov_write_stsc_tag(AVIOConte
      ffio_wfourcc(pb, "stsc");
      avio_wb32(pb, 0); // version & flags
      entryPos = avio_tell(pb);
 -    avio_wb32(pb, track->entry); // entry count
 +    avio_wb32(pb, track->chunkCount); // entry count
      for (i=0; i<track->entry; i++) {
 -        if (oldval != track->cluster[i].samples_in_chunk)
 +        if (oldval != track->cluster[i].samples_in_chunk && track->cluster[i].chunkNum)
          {
 -            avio_wb32(pb, i+1); // first chunk
 +            avio_wb32(pb, track->cluster[i].chunkNum); // first chunk
              avio_wb32(pb, track->cluster[i].samples_in_chunk); // samples per chunk
              avio_wb32(pb, 0x1); // sample description index
              oldval = track->cluster[i].samples_in_chunk;
@@@ -267,14 -264,6 +267,14 @@@ static int mov_write_extradata_tag(AVIO
      return track->enc->extradata_size;
  }
  
 +static int mov_write_enda_tag(AVIOContext *pb)
 +{
 +    avio_wb32(pb, 10);
 +    ffio_wfourcc(pb, "enda");
 +    avio_wb16(pb, 1); /* little endian */
 +    return 10;
 +}
 +
  static void put_descr(AVIOContext *pb, int tag, unsigned int size)
  {
      int i = 3;
      avio_w8(pb, size & 0x7F);
  }
  
 +static unsigned compute_avg_bitrate(MOVTrack *track)
 +{
 +    uint64_t size = 0;
 +    int i;
 +    if (!track->track_duration)
 +        return 0;
 +    for (i = 0; i < track->entry; i++)
 +        size += track->cluster[i].size;
 +    return size * 8 * track->timescale / track->track_duration;
 +}
 +
  static int mov_write_esds_tag(AVIOContext *pb, MOVTrack *track) // Basic
  {
      int64_t pos = avio_tell(pb);
      int decoder_specific_info_len = track->vos_len ? 5 + track->vos_len : 0;
 +    unsigned avg_bitrate;
  
      avio_wb32(pb, 0); // size
      ffio_wfourcc(pb, "esds");
      avio_w8(pb,  track->enc->rc_buffer_size>>(3+16));      // Buffersize DB (24 bits)
      avio_wb16(pb, (track->enc->rc_buffer_size>>3)&0xFFFF); // Buffersize DB
  
 -    avio_wb32(pb, FFMAX(track->enc->bit_rate, track->enc->rc_max_rate)); // maxbitrate (FIXME should be max rate in any 1 sec window)
 -    if(track->enc->rc_max_rate != track->enc->rc_min_rate || track->enc->rc_min_rate==0)
 -        avio_wb32(pb, 0); // vbr
 -    else
 -        avio_wb32(pb, track->enc->rc_max_rate); // avg bitrate
 +    avg_bitrate = compute_avg_bitrate(track);
 +    // maxbitrate (FIXME should be max rate in any 1 sec window)
 +    avio_wb32(pb, FFMAX3(track->enc->bit_rate, track->enc->rc_max_rate, avg_bitrate));
 +    avio_wb32(pb, avg_bitrate);
  
      if (track->vos_len) {
          // DecoderSpecific info descriptor
      return update_size(pb, pos);
  }
  
 +static int mov_pcm_le_gt16(enum CodecID codec_id)
 +{
 +    return codec_id == CODEC_ID_PCM_S24LE ||
 +           codec_id == CODEC_ID_PCM_S32LE ||
 +           codec_id == CODEC_ID_PCM_F32LE ||
 +           codec_id == CODEC_ID_PCM_F64LE;
 +}
 +
  static int mov_write_ms_tag(AVIOContext *pb, MOVTrack *track)
  {
      int64_t pos = avio_tell(pb);
@@@ -417,8 -387,6 +417,8 @@@ static int mov_write_wave_tag(AVIOConte
          ffio_wfourcc(pb, "mp4a");
          avio_wb32(pb, 0);
          mov_write_esds_tag(pb, track);
 +    } else if (mov_pcm_le_gt16(track->enc->codec_id)) {
 +        mov_write_enda_tag(pb);
      } else if (track->enc->codec_id == CODEC_ID_AMR_NB) {
          mov_write_amr_tag(pb, track);
      } else if (track->enc->codec_id == CODEC_ID_AC3) {
@@@ -584,8 -552,6 +584,8 @@@ static int get_samples_per_packet(MOVTr
  {
      int i, first_duration;
  
 +// return track->enc->frame_size;
 +
      /* use 1 for raw PCM */
      if (!track->audio_vbr)
          return 1;
@@@ -608,15 -574,9 +608,15 @@@ static int mov_write_audio_tag(AVIOCont
      uint32_t tag = track->tag;
  
      if (track->mode == MODE_MOV) {
 -        if (mov_get_lpcm_flags(track->enc->codec_id))
 -            tag = AV_RL32("lpcm");
 -        version = 2;
 +        if (track->timescale > UINT16_MAX) {
 +            if (mov_get_lpcm_flags(track->enc->codec_id))
 +                tag = AV_RL32("lpcm");
 +            version = 2;
 +        } else if (track->audio_vbr || mov_pcm_le_gt16(track->enc->codec_id) ||
 +                   track->enc->codec_id == CODEC_ID_ADPCM_MS ||
 +                   track->enc->codec_id == CODEC_ID_ADPCM_IMA_WAV) {
 +            version = 1;
 +        }
      }
  
      avio_wb32(pb, 0); /* size */
          avio_wb32(pb, track->sample_size);
          avio_wb32(pb, get_samples_per_packet(track));
      } else {
 -        /* reserved for mp4/3gp */
 -        avio_wb16(pb, 2);
 -        avio_wb16(pb, 16);
 -        avio_wb16(pb, 0);
 +        if (track->mode == MODE_MOV) {
 +            avio_wb16(pb, track->enc->channels);
 +            if (track->enc->codec_id == CODEC_ID_PCM_U8 ||
 +                track->enc->codec_id == CODEC_ID_PCM_S8)
 +                avio_wb16(pb, 8); /* bits per sample */
 +            else
 +                avio_wb16(pb, 16);
 +            avio_wb16(pb, track->audio_vbr ? -2 : 0); /* compression ID */
 +        } else { /* reserved for mp4/3gp */
 +            avio_wb16(pb, 2);
 +            avio_wb16(pb, 16);
 +            avio_wb16(pb, 0);
 +        }
  
          avio_wb16(pb, 0); /* packet size (= 0) */
          avio_wb16(pb, track->enc->sample_rate <= UINT16_MAX ?
          avio_wb16(pb, 0); /* Reserved */
      }
  
 +    if(version == 1) { /* SoundDescription V1 extended info */
 +        avio_wb32(pb, track->enc->frame_size); /* Samples per packet */
 +        avio_wb32(pb, track->sample_size / track->enc->channels); /* Bytes per packet */
 +        avio_wb32(pb, track->sample_size); /* Bytes per frame */
 +        avio_wb32(pb, 2); /* Bytes per sample */
 +    }
 +
      if(track->mode == MODE_MOV &&
         (track->enc->codec_id == CODEC_ID_AAC ||
          track->enc->codec_id == CODEC_ID_AC3 ||
          track->enc->codec_id == CODEC_ID_AMR_NB ||
          track->enc->codec_id == CODEC_ID_ALAC ||
          track->enc->codec_id == CODEC_ID_ADPCM_MS ||
 -        track->enc->codec_id == CODEC_ID_ADPCM_IMA_WAV))
 +        track->enc->codec_id == CODEC_ID_ADPCM_IMA_WAV ||
 +        (mov_pcm_le_gt16(track->enc->codec_id) && version==1)))
          mov_write_wave_tag(pb, track);
      else if(track->tag == MKTAG('m','p','4','a'))
          mov_write_esds_tag(pb, track);
@@@ -859,7 -802,6 +859,7 @@@ static const struct 
      uint32_t tag;
      unsigned bps;
  } mov_pix_fmt_tags[] = {
 +    { PIX_FMT_YUYV422, MKTAG('y','u','v','2'),  0 },
      { PIX_FMT_YUYV422, MKTAG('y','u','v','s'),  0 },
      { PIX_FMT_UYVY422, MKTAG('2','v','u','y'),  0 },
      { PIX_FMT_RGB555BE,MKTAG('r','a','w',' '), 16 },
@@@ -882,7 -824,7 +882,7 @@@ static int mov_get_rawvideo_codec_tag(A
      int i;
  
      for (i = 0; i < FF_ARRAY_ELEMS(mov_pix_fmt_tags); i++) {
 -        if (track->enc->pix_fmt == mov_pix_fmt_tags[i].pix_fmt) {
 +        if (track->enc->codec_tag == mov_pix_fmt_tags[i].tag && track->enc->pix_fmt == mov_pix_fmt_tags[i].pix_fmt) {
              tag = mov_pix_fmt_tags[i].tag;
              track->enc->bits_per_coded_sample = mov_pix_fmt_tags[i].bps;
              break;
@@@ -1073,10 -1015,7 +1073,10 @@@ static int mov_write_video_tag(AVIOCont
          mov_write_d263_tag(pb);
      else if(track->enc->codec_id == CODEC_ID_SVQ3)
          mov_write_svq3_tag(pb);
 -    else if(track->enc->codec_id == CODEC_ID_DNXHD)
 +    else if(track->enc->codec_id == CODEC_ID_AVUI) {
 +        mov_write_extradata_tag(pb, track);
 +        avio_wb32(pb, 0);
 +    } else if(track->enc->codec_id == CODEC_ID_DNXHD)
          mov_write_avid_tag(pb, track);
      else if(track->enc->codec_id == CODEC_ID_H264) {
          mov_write_avcc_tag(pb, track);
      return update_size(pb, pos);
  }
  
 +static int mov_write_tmcd_tag(AVIOContext *pb, MOVTrack *track)
 +{
 +    int64_t pos = avio_tell(pb);
 +    int frame_duration = track->enc->time_base.num;
 +    int nb_frames = (track->timescale + frame_duration/2) / frame_duration;
 +
 +    avio_wb32(pb, 0); /* size */
 +    ffio_wfourcc(pb, "tmcd");               /* Data format */
 +    avio_wb32(pb, 0);                       /* Reserved */
 +    avio_wb32(pb, 1);                       /* Data reference index */
 +    avio_wb32(pb, 0);                       /* Flags */
 +    avio_wb32(pb, track->timecode_flags);   /* Flags (timecode) */
 +    avio_wb32(pb, track->timescale);        /* Timescale */
 +    avio_wb32(pb, frame_duration);          /* Frame duration */
 +    avio_w8(pb, nb_frames);                 /* Number of frames */
 +    avio_wb24(pb, 0);                       /* Reserved */
 +    /* TODO: source reference string */
 +    return update_size(pb, pos);
 +}
 +
  static int mov_write_rtp_tag(AVIOContext *pb, MOVTrack *track)
  {
      int64_t pos = avio_tell(pb);
@@@ -1152,8 -1071,6 +1152,8 @@@ static int mov_write_stsd_tag(AVIOConte
          mov_write_subtitle_tag(pb, track);
      else if (track->enc->codec_tag == MKTAG('r','t','p',' '))
          mov_write_rtp_tag(pb, track);
 +    else if (track->enc->codec_tag == MKTAG('t','m','c','d'))
 +        mov_write_tmcd_tag(pb, track);
      return update_size(pb, pos);
  }
  
@@@ -1240,7 -1157,6 +1240,7 @@@ static int mov_write_dref_tag(AVIOConte
      avio_wb32(pb, 1); /* entry count */
  
      avio_wb32(pb, 0xc); /* size */
 +    //FIXME add the alis and rsrc atom
      ffio_wfourcc(pb, "url ");
      avio_wb32(pb, 1); /* version & flags */
  
@@@ -1286,32 -1202,9 +1286,32 @@@ static int mov_write_nmhd_tag(AVIOConte
      return 12;
  }
  
 -static int mov_write_gmhd_tag(AVIOContext *pb)
 +static int mov_write_tcmi_tag(AVIOContext *pb, MOVTrack *track)
  {
 -    avio_wb32(pb, 0x20);   /* size */
 +    int64_t pos = avio_tell(pb);
 +    const char *font = "Lucida Grande";
 +    avio_wb32(pb, 0);                   /* size */
 +    ffio_wfourcc(pb, "tcmi");           /* timecode media information atom */
 +    avio_wb32(pb, 0);                   /* version & flags */
 +    avio_wb16(pb, 0);                   /* text font */
 +    avio_wb16(pb, 0);                   /* text face */
 +    avio_wb16(pb, 12);                  /* text size */
 +    avio_wb16(pb, 0);                   /* (unknown, not in the QT specs...) */
 +    avio_wb16(pb, 0x0000);              /* text color (red) */
 +    avio_wb16(pb, 0x0000);              /* text color (green) */
 +    avio_wb16(pb, 0x0000);              /* text color (blue) */
 +    avio_wb16(pb, 0xffff);              /* background color (red) */
 +    avio_wb16(pb, 0xffff);              /* background color (green) */
 +    avio_wb16(pb, 0xffff);              /* background color (blue) */
 +    avio_w8(pb, strlen(font));          /* font len (part of the pascal string) */
 +    avio_write(pb, font, strlen(font)); /* font name */
 +    return update_size(pb, pos);
 +}
 +
 +static int mov_write_gmhd_tag(AVIOContext *pb, MOVTrack *track)
 +{
 +    int64_t pos = avio_tell(pb);
 +    avio_wb32(pb, 0);      /* size */
      ffio_wfourcc(pb, "gmhd");
      avio_wb32(pb, 0x18);   /* gmin size */
      ffio_wfourcc(pb, "gmin");/* generic media info */
      avio_wb16(pb, 0x8000); /* opColor (b?) */
      avio_wb16(pb, 0);      /* balance */
      avio_wb16(pb, 0);      /* reserved */
 -    return 0x20;
 +
 +    /*
 +     * This special text atom is required for
 +     * Apple Quicktime chapters. The contents
 +     * don't appear to be documented, so the
 +     * bytes are copied verbatim.
 +     */
 +    avio_wb32(pb, 0x2C);   /* size */
 +    ffio_wfourcc(pb, "text");
 +    avio_wb16(pb, 0x01);
 +    avio_wb32(pb, 0x00);
 +    avio_wb32(pb, 0x00);
 +    avio_wb32(pb, 0x00);
 +    avio_wb32(pb, 0x01);
 +    avio_wb32(pb, 0x00);
 +    avio_wb32(pb, 0x00);
 +    avio_wb32(pb, 0x00);
 +    avio_wb32(pb, 0x00004000);
 +    avio_wb16(pb, 0x0000);
 +
 +    if (track->enc->codec_tag == MKTAG('t','m','c','d')) {
 +        int64_t tmcd_pos = avio_tell(pb);
 +        avio_wb32(pb, 0); /* size */
 +        ffio_wfourcc(pb, "tmcd");
 +        mov_write_tcmi_tag(pb, track);
 +        update_size(pb, tmcd_pos);
 +    }
 +    return update_size(pb, pos);
  }
  
  static int mov_write_smhd_tag(AVIOContext *pb)
@@@ -1392,16 -1258,9 +1392,16 @@@ static int mov_write_hdlr_tag(AVIOConte
              if (track->tag == MKTAG('t','x','3','g')) hdlr_type = "sbtl";
              else                                      hdlr_type = "text";
              descr = "SubtitleHandler";
 +        } else if (track->enc->codec_tag == MKTAG('t','m','c','d')) {
 +            hdlr_type = "tmcd";
 +            descr = "TimeCodeHandler";
          } else if (track->enc->codec_tag == MKTAG('r','t','p',' ')) {
              hdlr_type = "hint";
              descr = "HintHandler";
 +        } else {
 +            hdlr = "dhlr";
 +            hdlr_type = "url ";
 +            descr = "DataHandler";
          }
      }
  
@@@ -1446,10 -1305,8 +1446,10 @@@ static int mov_write_minf_tag(AVIOConte
      else if (track->enc->codec_type == AVMEDIA_TYPE_AUDIO)
          mov_write_smhd_tag(pb);
      else if (track->enc->codec_type == AVMEDIA_TYPE_SUBTITLE) {
 -        if (track->tag == MKTAG('t','e','x','t')) mov_write_gmhd_tag(pb);
 +        if (track->tag == MKTAG('t','e','x','t')) mov_write_gmhd_tag(pb, track);
          else                                      mov_write_nmhd_tag(pb);
 +    } else if (track->tag == MKTAG('t','m','c','d')) {
 +        mov_write_gmhd_tag(pb, track);
      } else if (track->tag == MKTAG('r','t','p',' ')) {
          mov_write_hmhd_tag(pb);
      }
@@@ -1507,30 -1364,11 +1507,30 @@@ static int mov_write_mdia_tag(AVIOConte
      return update_size(pb, pos);
  }
  
 +/* transformation matrix
 +     |a  b  u|
 +     |c  d  v|
 +     |tx ty w| */
 +static void write_matrix(AVIOContext *pb, int16_t a, int16_t b, int16_t c,
 +                         int16_t d, int16_t tx, int16_t ty)
 +{
 +    avio_wb32(pb, a << 16);  /* 16.16 format */
 +    avio_wb32(pb, b << 16);  /* 16.16 format */
 +    avio_wb32(pb, 0);        /* u in 2.30 format */
 +    avio_wb32(pb, c << 16);  /* 16.16 format */
 +    avio_wb32(pb, d << 16);  /* 16.16 format */
 +    avio_wb32(pb, 0);        /* v in 2.30 format */
 +    avio_wb32(pb, tx << 16); /* 16.16 format */
 +    avio_wb32(pb, ty << 16); /* 16.16 format */
 +    avio_wb32(pb, 1 << 30);  /* w in 2.30 format */
 +}
 +
  static int mov_write_tkhd_tag(AVIOContext *pb, MOVTrack *track, AVStream *st)
  {
      int64_t duration = av_rescale_rnd(track->track_duration, MOV_TIMESCALE,
                                        track->timescale, AV_ROUND_UP);
      int version = duration < INT32_MAX ? 0 : 1;
 +    int rotation = 0;
  
      if (track->mode == MODE_ISM)
          version = 1;
      avio_wb16(pb, 0); /* reserved */
  
      /* Matrix structure */
 -    avio_wb32(pb, 0x00010000); /* reserved */
 -    avio_wb32(pb, 0x0); /* reserved */
 -    avio_wb32(pb, 0x0); /* reserved */
 -    avio_wb32(pb, 0x0); /* reserved */
 -    avio_wb32(pb, 0x00010000); /* reserved */
 -    avio_wb32(pb, 0x0); /* reserved */
 -    avio_wb32(pb, 0x0); /* reserved */
 -    avio_wb32(pb, 0x0); /* reserved */
 -    avio_wb32(pb, 0x40000000); /* reserved */
 -
 +    if (st && st->metadata) {
 +        AVDictionaryEntry *rot = av_dict_get(st->metadata, "rotate", NULL, 0);
 +        rotation = (rot && rot->value) ? atoi(rot->value) : 0;
 +    }
 +    if (rotation == 90) {
 +        write_matrix(pb,  0,  1, -1,  0, track->enc->height, 0);
 +    } else if (rotation == 180) {
 +        write_matrix(pb, -1,  0,  0, -1, track->enc->width, track->enc->height);
 +    } else if (rotation == 270) {
 +        write_matrix(pb,  0, -1,  1,  0, 0, track->enc->width);
 +    } else {
 +        write_matrix(pb,  1,  0,  0,  1, 0, 0);
 +    }
      /* Track width and height, for visual only */
      if(st && (track->enc->codec_type == AVMEDIA_TYPE_VIDEO ||
                track->enc->codec_type == AVMEDIA_TYPE_SUBTITLE)) {
@@@ -1727,8 -1562,11 +1727,8 @@@ static int mov_write_trak_tag(AVIOConte
      avio_wb32(pb, 0); /* size */
      ffio_wfourcc(pb, "trak");
      mov_write_tkhd_tag(pb, track, st);
 -    if (track->mode == MODE_PSP || track->flags & MOV_TRACK_CTTS ||
 -        (track->entry && track->cluster[0].dts)) {
 -        if (!(mov->flags & FF_MOV_FLAG_FRAGMENT))
 -            mov_write_edts_tag(pb, track);  // PSP Movies require edts box
 -    }
 +    if (!(mov->flags & FF_MOV_FLAG_FRAGMENT)) // EDTS with fragments is tricky as we dont know the duration when its written
 +        mov_write_edts_tag(pb, track);  // PSP Movies and several other cases require edts box
      if (track->tref_tag)
          mov_write_tref_tag(pb, track);
      mov_write_mdia_tag(pb, track);
          mov_write_udta_sdp(pb, track->rtp_ctx, track->track_id);
      if (track->enc->codec_type == AVMEDIA_TYPE_VIDEO && track->mode == MODE_MOV) {
          double sample_aspect_ratio = av_q2d(st->sample_aspect_ratio);
 -        if (0.0 != sample_aspect_ratio && 1.0 != sample_aspect_ratio)
 +        if (st->sample_aspect_ratio.num && 1.0 != sample_aspect_ratio)
              mov_write_tapt_tag(pb, track);
      };
      return update_size(pb, pos);
@@@ -1838,7 -1676,15 +1838,7 @@@ static int mov_write_mvhd_tag(AVIOConte
      avio_wb32(pb, 0); /* reserved */
  
      /* Matrix structure */
 -    avio_wb32(pb, 0x00010000); /* reserved */
 -    avio_wb32(pb, 0x0); /* reserved */
 -    avio_wb32(pb, 0x0); /* reserved */
 -    avio_wb32(pb, 0x0); /* reserved */
 -    avio_wb32(pb, 0x00010000); /* reserved */
 -    avio_wb32(pb, 0x0); /* reserved */
 -    avio_wb32(pb, 0x0); /* reserved */
 -    avio_wb32(pb, 0x0); /* reserved */
 -    avio_wb32(pb, 0x40000000); /* reserved */
 +    write_matrix(pb, 1, 0, 0, 1, 0, 0);
  
      avio_wb32(pb, 0); /* reserved (preview time) */
      avio_wb32(pb, 0); /* reserved (preview duration) */
@@@ -2078,35 -1924,32 +2078,35 @@@ static int mov_write_udta_tag(AVIOConte
      if(ret < 0)
          return ret;
  
 -        if (mov->mode & MODE_3GP) {
 -            mov_write_3gp_udta_tag(pb_buf, s, "perf", "artist");
 -            mov_write_3gp_udta_tag(pb_buf, s, "titl", "title");
 -            mov_write_3gp_udta_tag(pb_buf, s, "auth", "author");
 -            mov_write_3gp_udta_tag(pb_buf, s, "gnre", "genre");
 -            mov_write_3gp_udta_tag(pb_buf, s, "dscp", "comment");
 -            mov_write_3gp_udta_tag(pb_buf, s, "albm", "album");
 -            mov_write_3gp_udta_tag(pb_buf, s, "cprt", "copyright");
 -            mov_write_3gp_udta_tag(pb_buf, s, "yrrc", "date");
 -        } else if (mov->mode == MODE_MOV) { // the title field breaks gtkpod with mp4 and my suspicion is that stuff is not valid in mp4
 -            mov_write_string_metadata(s, pb_buf, "\251ART", "artist"     , 0);
 -            mov_write_string_metadata(s, pb_buf, "\251nam", "title"      , 0);
 -            mov_write_string_metadata(s, pb_buf, "\251aut", "author"     , 0);
 -            mov_write_string_metadata(s, pb_buf, "\251alb", "album"      , 0);
 -            mov_write_string_metadata(s, pb_buf, "\251day", "date"       , 0);
 -            mov_write_string_metadata(s, pb_buf, "\251swr", "encoder"    , 0);
 -            mov_write_string_metadata(s, pb_buf, "\251des", "comment"    , 0);
 -            mov_write_string_metadata(s, pb_buf, "\251gen", "genre"      , 0);
 -            mov_write_string_metadata(s, pb_buf, "\251cpy", "copyright"  , 0);
 -        } else {
 -            /* iTunes meta data */
 -            mov_write_meta_tag(pb_buf, mov, s);
 -        }
 +    if (mov->mode & MODE_3GP) {
 +        mov_write_3gp_udta_tag(pb_buf, s, "perf", "artist");
 +        mov_write_3gp_udta_tag(pb_buf, s, "titl", "title");
 +        mov_write_3gp_udta_tag(pb_buf, s, "auth", "author");
 +        mov_write_3gp_udta_tag(pb_buf, s, "gnre", "genre");
 +        mov_write_3gp_udta_tag(pb_buf, s, "dscp", "comment");
 +        mov_write_3gp_udta_tag(pb_buf, s, "albm", "album");
 +        mov_write_3gp_udta_tag(pb_buf, s, "cprt", "copyright");
 +        mov_write_3gp_udta_tag(pb_buf, s, "yrrc", "date");
 +    } else if (mov->mode == MODE_MOV) { // the title field breaks gtkpod with mp4 and my suspicion is that stuff is not valid in mp4
 +        mov_write_string_metadata(s, pb_buf, "\251ART", "artist"     , 0);
 +        mov_write_string_metadata(s, pb_buf, "\251nam", "title"      , 0);
 +        mov_write_string_metadata(s, pb_buf, "\251aut", "author"     , 0);
 +        mov_write_string_metadata(s, pb_buf, "\251alb", "album"      , 0);
 +        mov_write_string_metadata(s, pb_buf, "\251day", "date"       , 0);
 +        mov_write_string_metadata(s, pb_buf, "\251swr", "encoder"    , 0);
 +        // currently ignored by mov.c
 +        mov_write_string_metadata(s, pb_buf, "\251des", "comment"    , 0);
 +        // add support for libquicktime, this atom is also actually read by mov.c
 +        mov_write_string_metadata(s, pb_buf, "\251cmt", "comment"    , 0);
 +        mov_write_string_metadata(s, pb_buf, "\251gen", "genre"      , 0);
 +        mov_write_string_metadata(s, pb_buf, "\251cpy", "copyright"  , 0);
 +    } else {
 +        /* iTunes meta data */
 +        mov_write_meta_tag(pb_buf, mov, s);
 +    }
  
 -        if (s->nb_chapters)
 -            mov_write_chpl_tag(pb_buf, s);
 +    if (s->nb_chapters)
 +        mov_write_chpl_tag(pb_buf, s);
  
      if ((size = avio_close_dyn_buf(pb_buf, &buf)) > 0) {
          avio_wb32(pb, size+8);
@@@ -2169,29 -2012,6 +2169,29 @@@ static int mov_write_uuidusmt_tag(AVIOC
      return 0;
  }
  
 +static void build_chunks(MOVTrack *trk)
 +{
 +    int i;
 +    MOVIentry *chunk= &trk->cluster[0];
 +    uint64_t chunkSize = chunk->size;
 +    chunk->chunkNum= 1;
 +    if (trk->chunkCount)
 +        return;
 +    trk->chunkCount= 1;
 +    for(i=1; i<trk->entry; i++){
 +        if(chunk->pos + chunkSize == trk->cluster[i].pos &&
 +            chunkSize + trk->cluster[i].size < (1<<20)){
 +            chunkSize             += trk->cluster[i].size;
 +            chunk->samples_in_chunk += trk->cluster[i].entries;
 +        }else{
 +            trk->cluster[i].chunkNum = chunk->chunkNum+1;
 +            chunk=&trk->cluster[i];
 +            chunkSize = chunk->size;
 +            trk->chunkCount++;
 +        }
 +    }
 +}
 +
  static int mov_write_moov_tag(AVIOContext *pb, MOVMuxContext *mov,
                                AVFormatContext *s)
  {
  
          mov->tracks[i].time = mov->time;
          mov->tracks[i].track_id = i+1;
 +
 +        if (mov->tracks[i].entry)
 +            build_chunks(&mov->tracks[i]);
      }
  
      if (mov->chapter_track)
                  mov->tracks[mov->tracks[i].src_track].track_id;
          }
      }
 +    for (i = 0; i < mov->nb_streams; i++) {
 +        if (mov->tracks[i].tag == MKTAG('t','m','c','d')) {
 +            int src_trk = mov->tracks[i].src_track;
 +            mov->tracks[src_trk].tref_tag = mov->tracks[i].tag;
 +            mov->tracks[src_trk].tref_id  = mov->tracks[i].track_id;
 +            mov->tracks[i].track_duration = mov->tracks[src_trk].track_duration;
 +        }
 +    }
  
      mov_write_mvhd_tag(pb, mov);
      if (mov->mode != MODE_MOV && !mov->iods_skip)
@@@ -3021,9 -2830,6 +3021,9 @@@ int ff_mov_write_packet(AVFormatContex
              av_log(s, AV_LOG_ERROR, "fatal error, input is not a single packet, implement a AVParser for it\n");
              return -1;
          }
 +    } else if (enc->codec_id == CODEC_ID_ADPCM_MS ||
 +               enc->codec_id == CODEC_ID_ADPCM_IMA_WAV) {
 +        samples_in_chunk = enc->frame_size;
      } else if (trk->sample_size)
          samples_in_chunk = size / trk->sample_size;
      else
          } else {
              size = ff_avc_parse_nal_units(pb, pkt->data, pkt->size);
          }
 +    } else if (enc->codec_id == CODEC_ID_AAC && pkt->size > 2 &&
 +               (AV_RB16(pkt->data) & 0xfff0) == 0xfff0) {
 +        av_log(s, AV_LOG_ERROR, "malformated aac bitstream, use -absf aac_adtstoasc\n");
 +        return -1;
      } else {
          avio_write(pb, pkt->data, size);
      }
      }
  
      if (!(trk->entry % MOV_INDEX_CLUSTER_SIZE)) {
 -        trk->cluster = av_realloc(trk->cluster, (trk->entry + MOV_INDEX_CLUSTER_SIZE) * sizeof(*trk->cluster));
 +        trk->cluster = av_realloc_f(trk->cluster, sizeof(*trk->cluster), (trk->entry + MOV_INDEX_CLUSTER_SIZE));
          if (!trk->cluster)
              return -1;
      }
  
      trk->cluster[trk->entry].pos = avio_tell(pb) - size;
      trk->cluster[trk->entry].samples_in_chunk = samples_in_chunk;
 +    trk->cluster[trk->entry].chunkNum = 0;
      trk->cluster[trk->entry].size = size;
      trk->cluster[trk->entry].entries = samples_in_chunk;
      trk->cluster[trk->entry].dts = pkt->dts;
@@@ -3136,7 -2937,7 +3136,7 @@@ static int mov_write_packet(AVFormatCon
  
          if (!pkt->size) return 0; /* Discard 0 sized packets */
  
 -        if (trk->entry)
 +        if (trk->entry && pkt->stream_index < s->nb_streams)
              frag_duration = av_rescale_q(pkt->dts - trk->cluster[0].dts,
                                           s->streams[pkt->stream_index]->time_base,
                                           AV_TIME_BASE_Q);
  // as samples, and a tref pointing from the other tracks to the chapter one.
  static void mov_create_chapter_track(AVFormatContext *s, int tracknum)
  {
 +    AVIOContext *pb;
 +
      MOVMuxContext *mov = s->priv_data;
      MOVTrack *track = &mov->tracks[tracknum];
      AVPacket pkt = { .stream_index = tracknum, .flags = AV_PKT_FLAG_KEY };
      track->enc = avcodec_alloc_context3(NULL);
      track->enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
  
 +    if (avio_open_dyn_buf(&pb) >= 0) {
 +        int size;
 +        uint8_t *buf;
 +
 +        /* Stub header (usually for Quicktime chapter track) */
 +        // TextSampleEntry
 +        avio_wb32(pb, 0x01); // displayFlags
 +        avio_w8(pb, 0x00);   // horizontal justification
 +        avio_w8(pb, 0x00);   // vertical justification
 +        avio_w8(pb, 0x00);   // bgColourRed
 +        avio_w8(pb, 0x00);   // bgColourGreen
 +        avio_w8(pb, 0x00);   // bgColourBlue
 +        avio_w8(pb, 0x00);   // bgColourAlpha
 +        // BoxRecord
 +        avio_wb16(pb, 0x00); // defTextBoxTop
 +        avio_wb16(pb, 0x00); // defTextBoxLeft
 +        avio_wb16(pb, 0x00); // defTextBoxBottom
 +        avio_wb16(pb, 0x00); // defTextBoxRight
 +        // StyleRecord
 +        avio_wb16(pb, 0x00); // startChar
 +        avio_wb16(pb, 0x00); // endChar
 +        avio_wb16(pb, 0x01); // fontID
 +        avio_w8(pb, 0x00);   // fontStyleFlags
 +        avio_w8(pb, 0x00);   // fontSize
 +        avio_w8(pb, 0x00);   // fgColourRed
 +        avio_w8(pb, 0x00);   // fgColourGreen
 +        avio_w8(pb, 0x00);   // fgColourBlue
 +        avio_w8(pb, 0x00);   // fgColourAlpha
 +        // FontTableBox
 +        avio_wb32(pb, 0x0D); // box size
 +        ffio_wfourcc(pb, "ftab"); // box atom name
 +        avio_wb16(pb, 0x01); // entry count
 +        // FontRecord
 +        avio_wb16(pb, 0x01); // font ID
 +        avio_w8(pb, 0x00);   // font name length
 +
 +        if ((size = avio_close_dyn_buf(pb, &buf)) > 0) {
 +            track->enc->extradata = buf;
 +            track->enc->extradata_size = size;
 +        } else {
 +            av_free(&buf);
 +        }
 +    }
 +
      for (i = 0; i < s->nb_chapters; i++) {
          AVChapter *c = s->chapters[i];
          AVDictionaryEntry *t;
      }
  }
  
 +static int mov_create_timecode_track(AVFormatContext *s, int index, int src_index, const char *tcstr)
 +{
 +    MOVMuxContext *mov  = s->priv_data;
 +    MOVTrack *track     = &mov->tracks[index];
 +    AVStream *src_st    = s->streams[src_index];
 +    AVTimecode tc;
 +    AVPacket pkt    = {.stream_index = index, .flags = AV_PKT_FLAG_KEY, .size = 4};
 +    AVRational rate = {src_st->codec->time_base.den, src_st->codec->time_base.num};
 +
 +    /* compute the frame number */
 +    int ret = av_timecode_init_from_string(&tc, rate, tcstr, s);
 +    if (ret < 0)
 +        return ret;
 +
 +    /* tmcd track based on video stream */
 +    track->mode      = mov->mode;
 +    track->tag       = MKTAG('t','m','c','d');
 +    track->src_track = src_index;
 +    track->timescale = src_st->codec->time_base.den;
 +    if (tc.flags & AV_TIMECODE_FLAG_DROPFRAME)
 +        track->timecode_flags |= MOV_TIMECODE_FLAG_DROPFRAME;
 +
 +    /* encode context: tmcd data stream */
 +    track->enc = avcodec_alloc_context3(NULL);
 +    track->enc->codec_type = AVMEDIA_TYPE_DATA;
 +    track->enc->codec_tag  = track->tag;
 +    track->enc->time_base  = src_st->codec->time_base;
 +
 +    /* the tmcd track just contains one packet with the frame number */
 +    pkt.data = av_malloc(pkt.size);
 +    AV_WB32(pkt.data, tc.start);
 +    ret = ff_mov_write_packet(s, &pkt);
 +    av_free(pkt.data);
 +    return ret;
 +}
 +
  static int mov_write_header(AVFormatContext *s)
  {
      AVIOContext *pb = s->pb;
      MOVMuxContext *mov = s->priv_data;
 -    AVDictionaryEntry *t;
 -    int i, hint_track = 0;
 +    AVDictionaryEntry *t, *global_tcr = av_dict_get(s->metadata, "timecode", NULL, 0);
 +    int i, hint_track = 0, tmcd_track = 0;
  
      /* Set the FRAGMENT flag if any of the fragmentation methods are
       * enabled. */
          }
      }
  
 +    if (mov->mode == MODE_MOV) {
 +        /* Add a tmcd track for each video stream with a timecode */
 +        tmcd_track = mov->nb_streams;
 +        for (i = 0; i < s->nb_streams; i++) {
 +            AVStream *st = s->streams[i];
 +            if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
 +                (global_tcr || av_dict_get(st->metadata, "timecode", NULL, 0)))
 +                mov->nb_streams++;
 +        }
 +    }
 +
      mov->tracks = av_mallocz(mov->nb_streams*sizeof(*mov->tracks));
      if (!mov->tracks)
          return AVERROR(ENOMEM);
                         "or choose different container.\n");
          }else if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO){
              track->timescale = st->codec->sample_rate;
 -            /* set sample_size for PCM and ADPCM */
 -            if (av_get_bits_per_sample(st->codec->codec_id) ||
 -                st->codec->codec_id == CODEC_ID_ILBC) {
 +            if(!st->codec->frame_size && !av_get_bits_per_sample(st->codec->codec_id)) {
 +                av_log(s, AV_LOG_WARNING, "track %d: codec frame size is not set\n", i);
 +                track->audio_vbr = 1;
 +            }else if(st->codec->codec_id == CODEC_ID_ADPCM_MS ||
 +                     st->codec->codec_id == CODEC_ID_ADPCM_IMA_WAV ||
 +                     st->codec->codec_id == CODEC_ID_ILBC){
                  if (!st->codec->block_align) {
 -                    av_log(s, AV_LOG_ERROR, "track %d: codec block align is not set\n", i);
 +                    av_log(s, AV_LOG_ERROR, "track %d: codec block align is not set for adpcm\n", i);
                      goto error;
                  }
                  track->sample_size = st->codec->block_align;
 -            }
 -            /* set audio_vbr for compressed audio */
 -            if (av_get_bits_per_sample(st->codec->codec_id) < 8) {
 +            }else if(st->codec->frame_size > 1){ /* assume compressed audio */
                  track->audio_vbr = 1;
 +            }else{
 +                track->sample_size = (av_get_bits_per_sample(st->codec->codec_id) >> 3) * st->codec->channels;
              }
              if (track->mode != MODE_MOV &&
                  track->enc->codec_id == CODEC_ID_MP3 && track->timescale < 16000) {
              }
          }else if(st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE){
              track->timescale = st->codec->time_base.den;
 +        }else{
 +            track->timescale = MOV_TIMESCALE;
          }
          if (!track->height)
              track->height = st->codec->height;
                        FF_MOV_FLAG_FRAGMENT;
      }
  
 +    if(mov->reserved_moov_size){
 +        mov->reserved_moov_pos= avio_tell(pb);
 +        avio_skip(pb, mov->reserved_moov_size);
 +    }
 +
      if (!(mov->flags & FF_MOV_FLAG_FRAGMENT))
          mov_write_mdat_tag(pb, mov);
  
          }
      }
  
 +    if (mov->mode == MODE_MOV) {
 +        /* Initialize the tmcd tracks */
 +        for (i = 0; i < s->nb_streams; i++) {
 +            AVStream *st = s->streams[i];
 +            t = global_tcr;
 +
 +            if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
 +                if (!t)
 +                    t = av_dict_get(st->metadata, "timecode", NULL, 0);
 +                if (!t)
 +                    continue;
 +                if (mov_create_timecode_track(s, tmcd_track, i, t->value) < 0)
 +                    goto error;
 +                tmcd_track++;
 +            }
 +        }
 +    }
 +
      avio_flush(pb);
  
      if (mov->flags & FF_MOV_FLAG_ISML)
@@@ -3525,21 -3205,9 +3525,21 @@@ static int mov_write_trailer(AVFormatCo
              ffio_wfourcc(pb, "mdat");
              avio_wb64(pb, mov->mdat_size + 16);
          }
 -        avio_seek(pb, moov_pos, SEEK_SET);
 +        avio_seek(pb, mov->reserved_moov_size ? mov->reserved_moov_pos : moov_pos, SEEK_SET);
  
          mov_write_moov_tag(pb, mov, s);
 +        if(mov->reserved_moov_size){
 +            int64_t size=  mov->reserved_moov_size - (avio_tell(pb) - mov->reserved_moov_pos);
 +            if(size < 8){
 +                av_log(s, AV_LOG_ERROR, "reserved_moov_size is too small, needed %"PRId64" additional\n", 8-size);
 +                return -1;
 +            }
 +            avio_wb32(pb, size);
 +            ffio_wfourcc(pb, "free");
 +            for(i=0; i<size; i++)
 +                avio_w8(pb, 0);
 +            avio_seek(pb, moov_pos, SEEK_SET);
 +        }
      } else {
          mov_flush_fragment(s);
          mov_write_mfra_tag(pb, mov);
      for (i=0; i<mov->nb_streams; i++) {
          if (mov->tracks[i].tag == MKTAG('r','t','p',' '))
              ff_mov_close_hinting(&mov->tracks[i]);
 +        else if (mov->tracks[i].tag == MKTAG('t','m','c','d'))
 +            av_freep(&mov->tracks[i].enc);
          if (mov->flags & FF_MOV_FLAG_FRAGMENT &&
              mov->tracks[i].vc1_info.struct_offset && s->pb->seekable) {
              int64_t off = avio_tell(pb);
@@@ -3691,7 -3357,7 +3691,7 @@@ AVOutputFormat ff_ipod_muxer = 
  MOV_CLASS(ismv)
  AVOutputFormat ff_ismv_muxer = {
      .name              = "ismv",
-     .long_name         = NULL_IF_CONFIG_SMALL("ISMV/ISMA (Smooth Streaming) format"),
+     .long_name         = NULL_IF_CONFIG_SMALL("ISMV/ISMA (Smooth Streaming)"),
      .mime_type         = "application/mp4",
      .extensions        = "ismv,isma",
      .priv_data_size    = sizeof(MOVMuxContext),
diff --combined libavformat/mpegenc.c
index d07a0471bf15314ad0d5e47f969aeee9799cb432,4a1630b1a469696458679dfd75a34cd71d81cf6e..cf9263143358be08524cd418798ead8b2bfaf162
@@@ -2,20 -2,20 +2,20 @@@
   * MPEG1/2 muxer
   * Copyright (c) 2000, 2001, 2002 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
   */
  
@@@ -65,7 -65,6 +65,7 @@@ typedef struct 
      int pack_header_freq;     /* frequency (in packets^-1) at which we send pack headers */
      int system_header_freq;
      int system_header_size;
 +    int user_mux_rate; /* bitrate in units of bits/s */
      int mux_rate; /* bitrate in units of 50 bytes/s */
      /* stream info */
      int audio_bound;
@@@ -416,9 -415,7 +416,9 @@@ static int mpeg_mux_init(AVFormatContex
              video_bitrate += codec_rate;
      }
  
 -    if (!s->mux_rate) {
 +    if (s->user_mux_rate) {
 +        s->mux_rate = (s->user_mux_rate + (8 * 50) - 1) / (8 * 50);
 +    } else {
          /* we increase slightly the bitrate to take into account the
             headers. XXX: compute it exactly */
          bitrate += bitrate / 20;
@@@ -840,7 -837,7 +840,7 @@@ static int flush_packet(AVFormatContex
  
          /* output data */
          assert(payload_size - stuffing_size <= av_fifo_size(stream->fifo));
 -        av_fifo_generic_read(stream->fifo, ctx->pb, payload_size - stuffing_size, &avio_write);
 +        av_fifo_generic_read(stream->fifo, ctx->pb, payload_size - stuffing_size, (void*)avio_write);
          stream->bytes_to_iframe -= payload_size - stuffing_size;
      }else{
          payload_size=
@@@ -937,7 -934,7 +937,7 @@@ retry
          StreamInfo *stream = st->priv_data;
          const int avail_data=  av_fifo_size(stream->fifo);
          const int space= stream->max_buffer_size - stream->buffer_index;
 -        int rel_space= 1024*space / stream->max_buffer_size;
 +        int rel_space= 1024LL*space / stream->max_buffer_size;
          PacketDesc *next_pkt= stream->premux_packet;
  
          /* for subtitle, a single PES packet must be generated,
@@@ -1130,7 -1127,7 +1130,7 @@@ static int mpeg_mux_end(AVFormatContex
  #define OFFSET(x) offsetof(MpegMuxContext, x)
  #define E AV_OPT_FLAG_ENCODING_PARAM
  static const AVOption options[] = {
 -    { "muxrate", NULL, OFFSET(mux_rate), AV_OPT_TYPE_INT, {0}, 0, INT_MAX, E },
 +    { "muxrate", NULL, OFFSET(user_mux_rate), AV_OPT_TYPE_INT, {0}, 0, INT_MAX, E },
      { "preload", "Initial demux-decode delay in microseconds.", OFFSET(preload),  AV_OPT_TYPE_INT, {500000}, 0, INT_MAX, E},
      { NULL },
  };
@@@ -1178,7 -1175,7 +1178,7 @@@ AVOutputFormat ff_mpeg1vcd_muxer = 
  MPEGENC_CLASS(vob)
  AVOutputFormat ff_mpeg2vob_muxer = {
      .name              = "vob",
-     .long_name         = NULL_IF_CONFIG_SMALL("MPEG-2 PS format (VOB)"),
+     .long_name         = NULL_IF_CONFIG_SMALL("MPEG-2 PS (VOB)"),
      .mime_type         = "video/mpeg",
      .extensions        = "vob",
      .priv_data_size    = sizeof(MpegMuxContext),
@@@ -1214,7 -1211,7 +1214,7 @@@ AVOutputFormat ff_mpeg2svcd_muxer = 
  MPEGENC_CLASS(dvd)
  AVOutputFormat ff_mpeg2dvd_muxer = {
      .name              = "dvd",
-     .long_name         = NULL_IF_CONFIG_SMALL("MPEG-2 PS format (DVD VOB)"),
+     .long_name         = NULL_IF_CONFIG_SMALL("MPEG-2 PS (DVD VOB)"),
      .mime_type         = "video/mpeg",
      .extensions        = "dvd",
      .priv_data_size    = sizeof(MpegMuxContext),
diff --combined libavformat/mpjpeg.c
index dce53ce3ded3a55196502eb6e5cea3e43f5347f0,01bc1d98c5d770b1e033b64f640bfdf77bc32186..3e5a18fada6e63e96c3c7fe821d620b36fff2500
@@@ -2,33 -2,33 +2,33 @@@
   * Multipart JPEG format
   * Copyright (c) 2000, 2001, 2002, 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
   */
  #include "avformat.h"
  
  /* Multipart JPEG */
  
 -#define BOUNDARY_TAG "avserver"
 +#define BOUNDARY_TAG "ffserver"
  
  static int mpjpeg_write_header(AVFormatContext *s)
  {
      uint8_t buf1[256];
  
 -    snprintf(buf1, sizeof(buf1), "--%s\n", BOUNDARY_TAG);
 +    snprintf(buf1, sizeof(buf1), "--%s\r\n", BOUNDARY_TAG);
      avio_write(s->pb, buf1, strlen(buf1));
      avio_flush(s->pb);
      return 0;
@@@ -38,14 -38,11 +38,14 @@@ static int mpjpeg_write_packet(AVFormat
  {
      uint8_t buf1[256];
  
 -    snprintf(buf1, sizeof(buf1), "Content-type: image/jpeg\n\n");
 +    snprintf(buf1, sizeof(buf1), "Content-type: image/jpeg\r\n");
 +    avio_write(s->pb, buf1, strlen(buf1));
 +
 +    snprintf(buf1, sizeof(buf1), "Content-length: %d\r\n\r\n", pkt->size);
      avio_write(s->pb, buf1, strlen(buf1));
      avio_write(s->pb, pkt->data, pkt->size);
  
 -    snprintf(buf1, sizeof(buf1), "\n--%s\n", BOUNDARY_TAG);
 +    snprintf(buf1, sizeof(buf1), "\r\n--%s\r\n", BOUNDARY_TAG);
      avio_write(s->pb, buf1, strlen(buf1));
      avio_flush(s->pb);
      return 0;
@@@ -58,7 -55,7 +58,7 @@@ static int mpjpeg_write_trailer(AVForma
  
  AVOutputFormat ff_mpjpeg_muxer = {
      .name              = "mpjpeg",
-     .long_name         = NULL_IF_CONFIG_SMALL("MIME multipart JPEG format"),
+     .long_name         = NULL_IF_CONFIG_SMALL("MIME multipart JPEG"),
      .mime_type         = "multipart/x-mixed-replace;boundary=" BOUNDARY_TAG,
      .extensions        = "mjpg",
      .audio_codec       = CODEC_ID_NONE,
diff --combined libavformat/mtv.c
index 30c8ed791118573c78c158f1896d59ee0ddfd2da,8c77afe1631e92ddc8f570afedb4046bf892ddc1..37719caacfc5bd73bd54394c86ee0287a5c8a249
@@@ -2,20 -2,20 +2,20 @@@
   * mtv demuxer
   * Copyright (c) 2006 Reynaldo H. Verdejo Pinochet
   *
 - * 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
   */
  
@@@ -57,7 -57,7 +57,7 @@@ static int mtv_probe(AVProbeData *p
          return 0;
  
      /* Check for nonzero in bpp and (width|height) header fields */
 -    if(!(p->buf[51] && AV_RL16(&p->buf[52]) | AV_RL16(&p->buf[54])))
 +    if(p->buf_size < 57 || !(p->buf[51] && AV_RL16(&p->buf[52]) | AV_RL16(&p->buf[54])))
          return 0;
  
      /* If width or height are 0 then imagesize header field should not */
@@@ -96,19 -96,13 +96,19 @@@ static int mtv_read_header(AVFormatCont
  
      /* Calculate width and height if missing from header */
  
 -    if(!mtv->img_width)
 +    if(mtv->img_bpp>>3){
 +    if(!mtv->img_width && mtv->img_height)
          mtv->img_width=mtv->img_segment_size / (mtv->img_bpp>>3)
                          / mtv->img_height;
  
 -    if(!mtv->img_height)
 +    if(!mtv->img_height && mtv->img_width)
          mtv->img_height=mtv->img_segment_size / (mtv->img_bpp>>3)
                          / mtv->img_width;
 +    }
 +    if(!mtv->img_height || !mtv->img_width){
 +        av_log(s, AV_LOG_ERROR, "width or height is invalid and I cannot calculate them from other information\n");
 +        return AVERROR(EINVAL);
 +    }
  
      avio_skip(pb, 4);
      audio_subsegments = avio_rl16(pb);
@@@ -195,7 -189,7 +195,7 @@@ static int mtv_read_packet(AVFormatCont
  
  AVInputFormat ff_mtv_demuxer = {
      .name           = "mtv",
-     .long_name      = NULL_IF_CONFIG_SMALL("MTV format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("MTV"),
      .priv_data_size = sizeof(MTVDemuxContext),
      .read_probe     = mtv_probe,
      .read_header    = mtv_read_header,
diff --combined libavformat/mvi.c
index 0444b4a00c3924773ab6b8473970c6cddfde4b71,14685262beb7649c97afef8539832e0227ba4743..9a6e9d76321a4770039e79125374f561e480f75f
@@@ -2,20 -2,20 +2,20 @@@
   * Motion Pixels MVI Demuxer
   * Copyright (c) 2008 Gregory Montoir (cyx@users.sourceforge.net)
   *
 - * 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
   */
  
@@@ -126,7 -126,7 +126,7 @@@ static int read_packet(AVFormatContext 
  
  AVInputFormat ff_mvi_demuxer = {
      .name           = "mvi",
-     .long_name      = NULL_IF_CONFIG_SMALL("Motion Pixels MVI format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("Motion Pixels MVI"),
      .priv_data_size = sizeof(MviDemuxContext),
      .read_header    = read_header,
      .read_packet    = read_packet,
diff --combined libavformat/mxg.c
index 2ad611062ed54c93fa85a9fb9ca0916ca7414290,d0510d5fe57e2c3d851354e03ecdfdf542e9467b..6ecde121c660e325b48852fdeffa3f0886d96a0a
@@@ -2,20 -2,20 +2,20 @@@
   * MxPEG clip file demuxer
   * Copyright (c) 2010 Anatoly Nenashev
   *
 - * 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
   */
  
@@@ -104,7 -104,7 +104,7 @@@ static int mxg_update_cache(AVFormatCon
      /* reallocate internal buffer */
      if (current_pos > current_pos + cache_size)
          return AVERROR(ENOMEM);
 -    if (mxg->soi_ptr) soi_pos = mxg->soi_ptr - mxg->buffer;
 +    soi_pos = mxg->soi_ptr - mxg->buffer;
      mxg->buffer = av_fast_realloc(mxg->buffer, &mxg->buffer_size,
                                    current_pos + cache_size +
                                    FF_INPUT_BUFFER_PADDING_SIZE);
@@@ -131,7 -131,7 +131,7 @@@ static int mxg_read_packet(AVFormatCont
      uint8_t *startmarker_ptr, *end, *search_end, marker;
      MXGContext *mxg = s->priv_data;
  
 -    while (!s->pb->eof_reached && !s->pb->error){
 +    while (!url_feof(s->pb) && !s->pb->error){
          if (mxg->cache_size <= OVERREAD_SIZE) {
              /* update internal buffer */
              ret = mxg_update_cache(s, DEFAULT_PACKET_SIZE + OVERREAD_SIZE);
@@@ -241,7 -241,7 +241,7 @@@ static int mxg_close(struct AVFormatCon
  
  AVInputFormat ff_mxg_demuxer = {
      .name           = "mxg",
-     .long_name      = NULL_IF_CONFIG_SMALL("MxPEG clip file format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("MxPEG clip"),
      .priv_data_size = sizeof(MXGContext),
      .read_header    = mxg_read_header,
      .read_packet    = mxg_read_packet,
diff --combined libavformat/ncdec.c
index bd4ff6827b5cd16821834b17b8d8a7d45c3583e4,0bdd6157c34d32a484460aa67fef7e68d9d2be8e..7d7b390373a3f692ce60e43207cf6767f7699662
@@@ -3,20 -3,20 +3,20 @@@
   * Copyright (c) 2009  Nicolas Martin (martinic at iro dot umontreal dot ca)
   *                     Edouard Auvinet
   *
 - * 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
   */
  
@@@ -67,7 -67,7 +67,7 @@@ static int nc_read_packet(AVFormatConte
  
      uint32_t state=-1;
      while (state != NC_VIDEO_FLAG) {
 -        if (s->pb->eof_reached)
 +        if (url_feof(s->pb))
              return AVERROR(EIO);
          state = (state<<8) + avio_r8(s->pb);
      }
@@@ -93,7 -93,7 +93,7 @@@
  
  AVInputFormat ff_nc_demuxer = {
      .name           = "nc",
-     .long_name      = NULL_IF_CONFIG_SMALL("NC camera feed format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("NC camera feed"),
      .read_probe     = nc_probe,
      .read_header    = nc_read_header,
      .read_packet    = nc_read_packet,
diff --combined libavformat/nullenc.c
index de863ab0c5b12198265e6da6fca87e757062327d,bb6671d5182ea1821ff80e45bce48d569030cc07..99899923e297c83ab7fb4931937f8045e8a85436
@@@ -2,20 -2,20 +2,20 @@@
   * RAW null muxer
   * Copyright (c) 2002 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
   */
  
@@@ -28,7 -28,7 +28,7 @@@ static int null_write_packet(struct AVF
  
  AVOutputFormat ff_null_muxer = {
      .name              = "null",
-     .long_name         = NULL_IF_CONFIG_SMALL("raw null video format"),
+     .long_name         = NULL_IF_CONFIG_SMALL("raw null video"),
      .audio_codec       = AV_NE(CODEC_ID_PCM_S16BE, CODEC_ID_PCM_S16LE),
      .video_codec       = CODEC_ID_RAWVIDEO,
      .write_packet      = null_write_packet,
diff --combined libavformat/nutdec.c
index f3da58acfa1ca245d68813043b9a207d45783e14,e78de7fce8a94a112bb2e46cbdddce6b80da3f30..c02545122144e7f494b2d74ef7d143099e2eef0a
@@@ -3,25 -3,24 +3,25 @@@
   * Copyright (c) 2004-2006 Michael Niedermayer
   * Copyright (c) 2003 Alex Beregszaszi
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
  #include "libavutil/avstring.h"
 +#include "libavutil/avassert.h"
  #include "libavutil/bswap.h"
  #include "libavutil/dict.h"
  #include "libavutil/mathematics.h"
  #include "avio_internal.h"
  #include "nut.h"
  
 -#undef NDEBUG
 -#include <assert.h>
 -
  #define NUT_MAX_STREAMS 256    /* arbitrary sanity check value */
  
 +static int64_t nut_read_timestamp(AVFormatContext *s, int stream_index,
 +                                  int64_t *pos_arg, int64_t pos_limit);
 +
  static int get_str(AVIOContext *bc, char *string, unsigned int maxlen)
  {
      unsigned int len = ffio_read_varlen(bc);
@@@ -140,7 -139,7 +140,7 @@@ static uint64_t find_any_startcode(AVIO
          /* Note, this may fail if the stream is not seekable, but that should
           * not matter, as in this case we simply start where we currently are */
          avio_seek(bc, pos, SEEK_SET);
 -    while (!bc->eof_reached) {
 +    while (!url_feof(bc)) {
          state = (state << 8) | avio_r8(bc);
          if ((state >> 56) != 'N')
              continue;
@@@ -299,7 -298,7 +299,7 @@@ static int decode_main_header(NUTContex
              nut->frame_code[i].header_idx     = tmp_head_idx;
          }
      }
 -    assert(nut->frame_code['N'].flags == FLAG_INVALID);
 +    av_assert0(nut->frame_code['N'].flags == FLAG_INVALID);
  
      if (end > avio_tell(bc) + 4) {
          int rem = 1024;
              avio_read(bc, hdr, nut->header_len[i]);
              nut->header[i] = hdr;
          }
 -        assert(nut->header_len[0] == 0);
 +        av_assert0(nut->header_len[0] == 0);
      }
  
      if (skip_reserved(bc, end) || ffio_get_checksum(bc)) {
@@@ -554,25 -553,6 +554,25 @@@ static int decode_syncpoint(NUTContext 
      return 0;
  }
  
 +//FIXME calculate exactly, this is just a good approximation.
 +static int64_t find_duration(NUTContext *nut, int64_t filesize)
 +{
 +    AVFormatContext *s = nut->avf;
 +    int64_t duration = 0;
 +
 +    int64_t pos = FFMAX(0, filesize - 2*nut->max_distance);
 +    for(;;){
 +        int64_t ts = nut_read_timestamp(s, -1, &pos, INT64_MAX);
 +        if(ts < 0)
 +            break;
 +        duration = FFMAX(duration, ts);
 +        pos++;
 +    }
 +    if(duration > 0)
 +        s->duration_estimation_method = AVFMT_DURATION_FROM_PTS;
 +    return duration;
 +}
 +
  static int find_and_decode_index(NUTContext *nut)
  {
      AVFormatContext *s = nut->avf;
      int8_t *has_keyframe;
      int ret = -1;
  
 +    if(filesize <= 0)
 +        return -1;
 +
      avio_seek(bc, filesize - 12, SEEK_SET);
      avio_seek(bc, filesize - avio_rb64(bc), SEEK_SET);
      if (avio_rb64(bc) != INDEX_STARTCODE) {
          av_log(s, AV_LOG_ERROR, "no index at the end\n");
 +
 +        if(s->duration<=0)
 +            s->duration = find_duration(nut, filesize);
          return -1;
      }
  
                  av_log(s, AV_LOG_ERROR, "keyframe before first syncpoint in index\n");
                  goto fail;
              }
 -            assert(n <= syncpoint_count + 1);
 +            av_assert0(n <= syncpoint_count + 1);
              for (; j < n && j < syncpoint_count; j++) {
                  if (has_keyframe[j]) {
                      uint64_t B, A = ffio_read_varlen(bc);
@@@ -730,7 -704,7 +730,7 @@@ static int nut_read_header(AVFormatCont
          find_and_decode_index(nut);
          avio_seek(bc, orig_pos, SEEK_SET);
      }
 -    assert(nut->next_startcode == SYNCPOINT_STARTCODE);
 +    av_assert0(nut->next_startcode == SYNCPOINT_STARTCODE);
  
      ff_metadata_conv_ctx(s, NULL, ff_nut_metadata_conv);
  
@@@ -869,7 -843,7 +869,7 @@@ static int nut_read_packet(AVFormatCont
              pos -= 8;
          } else {
              frame_code = avio_r8(bc);
 -            if (bc->eof_reached)
 +            if (url_feof(bc))
                  return -1;
              if (frame_code == 'N') {
                  tmp = frame_code;
@@@ -923,18 -897,21 +923,18 @@@ static int64_t nut_read_timestamp(AVFor
      do {
          pos = find_startcode(bc, SYNCPOINT_STARTCODE, pos) + 1;
          if (pos < 1) {
 -            assert(nut->next_startcode == 0);
              av_log(s, AV_LOG_ERROR, "read_timestamp failed.\n");
              return AV_NOPTS_VALUE;
          }
      } while (decode_syncpoint(nut, &pts, &back_ptr) < 0);
      *pos_arg = pos - 1;
 -    assert(nut->last_syncpoint_pos == *pos_arg);
 +    av_assert0(nut->last_syncpoint_pos == *pos_arg);
  
      av_log(s, AV_LOG_DEBUG, "return %"PRId64" %"PRId64"\n", pts, back_ptr);
 -    if (stream_index == -1)
 -        return pts;
 -    else if (stream_index == -2)
 +    if (stream_index == -2)
          return back_ptr;
 -
 -    assert(0);
 +    av_assert0(stream_index == -1);
 +    return pts;
  }
  
  static int read_seek(AVFormatContext *s, int stream_index,
          sp = av_tree_find(nut->syncpoints, &dummy, (void *) ff_nut_sp_pos_cmp,
                            NULL);
  
 -        assert(sp);
 +        av_assert0(sp);
          pos2 = sp->back_ptr - 15;
      }
      av_log(NULL, AV_LOG_DEBUG, "SEEKTO: %"PRId64"\n", pos2);
@@@ -1014,8 -991,7 +1014,8 @@@ static int nut_read_close(AVFormatConte
  
  AVInputFormat ff_nut_demuxer = {
      .name           = "nut",
-     .long_name      = NULL_IF_CONFIG_SMALL("NUT format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("NUT"),
 +    .flags          = AVFMT_SEEK_TO_PTS,
      .priv_data_size = sizeof(NUTContext),
      .read_probe     = nut_probe,
      .read_header    = nut_read_header,
diff --combined libavformat/nutenc.c
index 326da1caba995110f064d1911bf4a76f7ab46bc9,86c98bc86a71b270c6f4d98955dda56bcaadfc6d..6ace0d0bc28b8be347ad2dc64f465f758d388d44
@@@ -2,20 -2,20 +2,20 @@@
   * nut muxer
   * Copyright (c) 2004-2007 Michael Niedermayer
   *
 - * 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
   */
  
@@@ -23,7 -23,6 +23,7 @@@
  #include "libavutil/mathematics.h"
  #include "libavutil/tree.h"
  #include "libavutil/dict.h"
 +#include "libavutil/avassert.h"
  #include "libavcodec/mpegaudiodata.h"
  #include "nut.h"
  #include "internal.h"
@@@ -178,7 -177,6 +178,7 @@@ static void build_frame_code(AVFormatCo
          }
  
          key_frame= intra_only;
 +#if 1
          if(is_audio){
              int frame_bytes= codec->frame_size*(int64_t)codec->bit_rate / (8*codec->sample_rate);
              int pts;
              ft->pts_delta=1;
              start2++;
          }
 +#endif
  
          if(codec->has_b_frames){
              pred_count=5;
@@@ -589,10 -586,11 +589,10 @@@ static int nut_write_header(AVFormatCon
      nut->avf= s;
  
      nut->stream   = av_mallocz(sizeof(StreamContext)*s->nb_streams);
 -    if (s->nb_chapters)
 -        nut->chapter  = av_mallocz(sizeof(ChapterContext)*s->nb_chapters);
 +    nut->chapter  = av_mallocz(sizeof(ChapterContext)*s->nb_chapters);
      nut->time_base= av_mallocz(sizeof(AVRational   )*(s->nb_streams +
                                                        s->nb_chapters));
 -    if (!nut->stream || (s->nb_chapters && !nut->chapter) || !nut->time_base) {
 +    if (!nut->stream || !nut->chapter || !nut->time_base) {
          av_freep(&nut->stream);
          av_freep(&nut->chapter);
          av_freep(&nut->time_base);
      nut->max_distance = MAX_DISTANCE;
      build_elision_headers(s);
      build_frame_code(s);
 -    assert(nut->frame_code['N'].flags == FLAG_INVALID);
 +    av_assert0(nut->frame_code['N'].flags == FLAG_INVALID);
  
      avio_write(bc, ID_STRING, strlen(ID_STRING));
      avio_w8(bc, 0);
@@@ -704,10 -702,8 +704,10 @@@ static int nut_write_packet(AVFormatCon
      int store_sp=0;
      int ret;
  
 -    if(pkt->pts < 0)
 -        return -1;
 +    if (pkt->pts < 0) {
 +        av_log(s, AV_LOG_ERROR, "Invalid negative packet pts %"PRId64" in input\n", pkt->pts);
 +        return AVERROR(EINVAL);
 +    }
  
      if(1LL<<(20+3*nut->header_count) <= avio_tell(bc))
          write_headers(s, bc);
  
          ff_nut_add_sp(nut, nut->last_syncpoint_pos, 0/*unused*/, pkt->dts);
      }
 -    assert(nus->last_pts != AV_NOPTS_VALUE);
 +    av_assert0(nus->last_pts != AV_NOPTS_VALUE);
  
      coded_pts = pkt->pts & ((1<<nus->msb_pts_shift)-1);
      if(ff_lsb2full(nus, coded_pts) != pkt->pts)
              frame_code=i;
          }
      }
 -    assert(frame_code != -1);
 +    av_assert0(frame_code != -1);
      fc= &nut->frame_code[frame_code];
      flags= fc->flags;
      needed_flags= get_needed_flags(nut, nus, fc, pkt);
@@@ -866,7 -862,7 +866,7 @@@ static int nut_write_trailer(AVFormatCo
  
  AVOutputFormat ff_nut_muxer = {
      .name           = "nut",
-     .long_name      = NULL_IF_CONFIG_SMALL("NUT format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("NUT"),
      .mime_type      = "video/x-nut",
      .extensions     = "nut",
      .priv_data_size = sizeof(NUTContext),
diff --combined libavformat/nuv.c
index 928f856c88eca8bfd71f7c2487a36a9fd17ec1d1,0cf5f72100d8d74cf77915890e5c25684d454507..21df6d285652a5450912328efd149735bee69cdf
@@@ -2,20 -2,20 +2,20 @@@
   * NuppelVideo demuxer.
   * Copyright (c) 2006 Reimar Doeffinger
   *
 - * 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
   */
  
@@@ -62,7 -62,7 +62,7 @@@ static int get_codec_data(AVIOContext *
      nuv_frametype frametype;
      if (!vst && !myth)
          return 1; // no codec data needed
 -    while (!pb->eof_reached) {
 +    while (!url_feof(pb)) {
          int size, subtype;
          frametype = avio_r8(pb);
          switch (frametype) {
@@@ -200,7 -200,7 +200,7 @@@ static int nuv_packet(AVFormatContext *
      uint8_t hdr[HDRSIZE];
      nuv_frametype frametype;
      int ret, size;
 -    while (!pb->eof_reached) {
 +    while (!url_feof(pb)) {
          int copyhdrsize = ctx->rtjpg_video ? HDRSIZE : 0;
          uint64_t pos = avio_tell(pb);
          ret = avio_read(pb, hdr, HDRSIZE);
                  ret = av_new_packet(pkt, copyhdrsize + size);
                  if (ret < 0)
                      return ret;
 -                // HACK: we have no idea if it is a keyframe,
 -                // but if we mark none seeking will not work at all.
 -                pkt->flags |= AV_PKT_FLAG_KEY;
 +
                  pkt->pos = pos;
 +                pkt->flags |= hdr[2] == 0 ? AV_PKT_FLAG_KEY : 0;
                  pkt->pts = AV_RL32(&hdr[4]);
                  pkt->stream_index = ctx->v_id;
                  memcpy(pkt->data, hdr, copyhdrsize);
      return AVERROR(EIO);
  }
  
 +/**
 + * \brief looks for the string RTjjjjjjjjjj in the stream too resync reading
 + * \return 1 if the syncword is found 0 otherwise.
 + */
 +static int nuv_resync(AVFormatContext *s, int64_t pos_limit) {
 +    AVIOContext *pb = s->pb;
 +    uint32_t tag = 0;
 +    while(!url_feof(pb) && avio_tell(pb) < pos_limit) {
 +        tag = (tag << 8) | avio_r8(pb);
 +        if (tag                  == MKBETAG('R','T','j','j') &&
 +           (tag = avio_rb32(pb)) == MKBETAG('j','j','j','j') &&
 +           (tag = avio_rb32(pb)) == MKBETAG('j','j','j','j'))
 +            return 1;
 +    }
 +    return 0;
 +}
 +
 +/**
 + * \brief attempts to read a timestamp from stream at the given stream position
 + * \return timestamp if successful and AV_NOPTS_VALUE if failure
 + */
 +static int64_t nuv_read_dts(AVFormatContext *s, int stream_index,
 +                            int64_t *ppos, int64_t pos_limit)
 +{
 +    NUVContext *ctx = s->priv_data;
 +    AVIOContext *pb = s->pb;
 +    uint8_t hdr[HDRSIZE];
 +    nuv_frametype frametype;
 +    int size, key, idx;
 +    int64_t pos, dts;
 +
 +    if (avio_seek(pb, *ppos, SEEK_SET) < 0)
 +        return AV_NOPTS_VALUE;
 +
 +    if (!nuv_resync(s, pos_limit))
 +        return AV_NOPTS_VALUE;
 +
 +    while (!url_feof(pb) && avio_tell(pb) < pos_limit) {
 +        if (avio_read(pb, hdr, HDRSIZE) < HDRSIZE)
 +            return AV_NOPTS_VALUE;
 +        frametype = hdr[0];
 +        size = PKTSIZE(AV_RL32(&hdr[8]));
 +        switch (frametype) {
 +            case NUV_SEEKP:
 +                break;
 +            case NUV_AUDIO:
 +            case NUV_VIDEO:
 +                if (frametype == NUV_VIDEO) {
 +                    idx = ctx->v_id;
 +                    key = hdr[2] == 0;
 +                } else {
 +                    idx = ctx->a_id;
 +                    key = 1;
 +                }
 +                if (stream_index == idx) {
 +
 +                    pos = avio_tell(s->pb) - HDRSIZE;
 +                    dts = AV_RL32(&hdr[4]);
 +
 +                    // TODO - add general support in av_gen_search, so it adds positions after reading timestamps
 +                    av_add_index_entry(s->streams[stream_index], pos, dts, size + HDRSIZE, 0,
 +                            key ? AVINDEX_KEYFRAME : 0);
 +
 +                    *ppos = pos;
 +                    return dts;
 +                }
 +            default:
 +                avio_skip(pb, size);
 +                break;
 +        }
 +    }
 +    return AV_NOPTS_VALUE;
 +}
 +
 +
  AVInputFormat ff_nuv_demuxer = {
      .name           = "nuv",
-     .long_name      = NULL_IF_CONFIG_SMALL("NuppelVideo format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("NuppelVideo"),
      .priv_data_size = sizeof(NUVContext),
      .read_probe     = nuv_probe,
      .read_header    = nuv_header,
      .read_packet    = nuv_packet,
 +    .read_timestamp = nuv_read_dts,
      .flags          = AVFMT_GENERIC_INDEX,
  };
diff --combined libavformat/pcmdec.c
index 4eb3c73ff95a78df3d569388079b87dcaa05a93d,fce0418f3798d6bc7143ed70d5e0f668397b9e6b..7a1eb416248d47d0e8e41928c52b0d1071969651
@@@ -2,20 -2,20 +2,20 @@@
   * RAW PCM demuxers
   * Copyright (c) 2002 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
   */
  
@@@ -24,7 -24,6 +24,7 @@@
  #include "pcm.h"
  #include "libavutil/log.h"
  #include "libavutil/opt.h"
 +#include "libavutil/avassert.h"
  
  #define RAW_SAMPLES     1024
  
@@@ -37,13 -36,12 +37,13 @@@ static int raw_read_packet(AVFormatCont
  
      ret= av_get_packet(s->pb, pkt, size);
  
 +    pkt->flags &= ~AV_PKT_FLAG_CORRUPT;
      pkt->stream_index = 0;
      if (ret < 0)
          return ret;
  
      bps= av_get_bits_per_sample(s->streams[0]->codec->codec_id);
 -    assert(bps); // if false there IS a bug elsewhere (NOT in this function)
 +    av_assert1(bps); // if false there IS a bug elsewhere (NOT in this function)
      pkt->dts=
      pkt->pts= pkt->pos*8 / (bps * s->streams[0]->codec->channels);
  
@@@ -76,62 -74,62 +76,62 @@@ AVInputFormat ff_pcm_ ## name_ ## _demu
      .priv_class     = &name_ ## _demuxer_class,             \
  };
  
- PCMDEF(f64be, "PCM 64 bit floating-point big-endian format",
+ PCMDEF(f64be, "PCM 64-bit floating-point big-endian",
         NULL, CODEC_ID_PCM_F64BE)
  
- PCMDEF(f64le, "PCM 64 bit floating-point little-endian format",
+ PCMDEF(f64le, "PCM 64-bit floating-point little-endian",
         NULL, CODEC_ID_PCM_F64LE)
  
- PCMDEF(f32be, "PCM 32 bit floating-point big-endian format",
+ PCMDEF(f32be, "PCM 32-bit floating-point big-endian",
         NULL, CODEC_ID_PCM_F32BE)
  
- PCMDEF(f32le, "PCM 32 bit floating-point little-endian format",
+ PCMDEF(f32le, "PCM 32-bit floating-point little-endian",
         NULL, CODEC_ID_PCM_F32LE)
  
- PCMDEF(s32be, "PCM signed 32 bit big-endian format",
+ PCMDEF(s32be, "PCM signed 32-bit big-endian",
         NULL, CODEC_ID_PCM_S32BE)
  
- PCMDEF(s32le, "PCM signed 32 bit little-endian format",
+ PCMDEF(s32le, "PCM signed 32-bit little-endian",
         NULL, CODEC_ID_PCM_S32LE)
  
- PCMDEF(s24be, "PCM signed 24 bit big-endian format",
+ PCMDEF(s24be, "PCM signed 24-bit big-endian",
         NULL, CODEC_ID_PCM_S24BE)
  
- PCMDEF(s24le, "PCM signed 24 bit little-endian format",
+ PCMDEF(s24le, "PCM signed 24-bit little-endian",
         NULL, CODEC_ID_PCM_S24LE)
  
- PCMDEF(s16be, "PCM signed 16 bit big-endian format",
+ PCMDEF(s16be, "PCM signed 16-bit big-endian",
         AV_NE("sw", NULL), CODEC_ID_PCM_S16BE)
  
- PCMDEF(s16le, "PCM signed 16 bit little-endian format",
+ PCMDEF(s16le, "PCM signed 16-bit little-endian",
         AV_NE(NULL, "sw"), CODEC_ID_PCM_S16LE)
  
- PCMDEF(s8, "PCM signed 8 bit format",
+ PCMDEF(s8, "PCM signed 8-bit",
         "sb", CODEC_ID_PCM_S8)
  
- PCMDEF(u32be, "PCM unsigned 32 bit big-endian format",
+ PCMDEF(u32be, "PCM unsigned 32-bit big-endian",
         NULL, CODEC_ID_PCM_U32BE)
  
- PCMDEF(u32le, "PCM unsigned 32 bit little-endian format",
+ PCMDEF(u32le, "PCM unsigned 32-bit little-endian",
         NULL, CODEC_ID_PCM_U32LE)
  
- PCMDEF(u24be, "PCM unsigned 24 bit big-endian format",
+ PCMDEF(u24be, "PCM unsigned 24-bit big-endian",
         NULL, CODEC_ID_PCM_U24BE)
  
- PCMDEF(u24le, "PCM unsigned 24 bit little-endian format",
+ PCMDEF(u24le, "PCM unsigned 24-bit little-endian",
         NULL, CODEC_ID_PCM_U24LE)
  
- PCMDEF(u16be, "PCM unsigned 16 bit big-endian format",
+ PCMDEF(u16be, "PCM unsigned 16-bit big-endian",
         AV_NE("uw", NULL), CODEC_ID_PCM_U16BE)
  
- PCMDEF(u16le, "PCM unsigned 16 bit little-endian format",
+ PCMDEF(u16le, "PCM unsigned 16-bit little-endian",
         AV_NE(NULL, "uw"), CODEC_ID_PCM_U16LE)
  
- PCMDEF(u8, "PCM unsigned 8 bit format",
+ PCMDEF(u8, "PCM unsigned 8-bit",
         "ub", CODEC_ID_PCM_U8)
  
- PCMDEF(alaw, "PCM A-law format",
+ PCMDEF(alaw, "PCM A-law",
         "al", CODEC_ID_PCM_ALAW)
  
- PCMDEF(mulaw, "PCM mu-law format",
+ PCMDEF(mulaw, "PCM mu-law",
         "ul", CODEC_ID_PCM_MULAW)
diff --combined libavformat/pcmenc.c
index 12e64b0fb83bc1d5d4640d015489fa4d59bda850,34b1c53b40daf17bc7798c300aa2b3bcb9feeb59..b7877ddd32d91446fc620e871ded653c9e7ee31c
@@@ -2,20 -2,20 +2,20 @@@
   * RAW PCM muxers
   * Copyright (c) 2002 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
   */
  
@@@ -33,62 -33,62 +33,62 @@@ AVOutputFormat ff_pcm_ ## name_ ## _mux
      .flags        = AVFMT_NOTIMESTAMPS,                     \
  };
  
- PCMDEF(f64be, "PCM 64 bit floating-point big-endian format",
+ PCMDEF(f64be, "PCM 64-bit floating-point big-endian",
         NULL, CODEC_ID_PCM_F64BE)
  
- PCMDEF(f64le, "PCM 64 bit floating-point little-endian format",
+ PCMDEF(f64le, "PCM 64-bit floating-point little-endian",
         NULL, CODEC_ID_PCM_F64LE)
  
- PCMDEF(f32be, "PCM 32 bit floating-point big-endian format",
+ PCMDEF(f32be, "PCM 32-bit floating-point big-endian",
         NULL, CODEC_ID_PCM_F32BE)
  
- PCMDEF(f32le, "PCM 32 bit floating-point little-endian format",
+ PCMDEF(f32le, "PCM 32-bit floating-point little-endian",
         NULL, CODEC_ID_PCM_F32LE)
  
- PCMDEF(s32be, "PCM signed 32 bit big-endian format",
+ PCMDEF(s32be, "PCM signed 32-bit big-endian",
         NULL, CODEC_ID_PCM_S32BE)
  
- PCMDEF(s32le, "PCM signed 32 bit little-endian format",
+ PCMDEF(s32le, "PCM signed 32-bit little-endian",
         NULL, CODEC_ID_PCM_S32LE)
  
- PCMDEF(s24be, "PCM signed 24 bit big-endian format",
+ PCMDEF(s24be, "PCM signed 24-bit big-endian",
         NULL, CODEC_ID_PCM_S24BE)
  
- PCMDEF(s24le, "PCM signed 24 bit little-endian format",
+ PCMDEF(s24le, "PCM signed 24-bit little-endian",
         NULL, CODEC_ID_PCM_S24LE)
  
- PCMDEF(s16be, "PCM signed 16 bit big-endian format",
+ PCMDEF(s16be, "PCM signed 16-bit big-endian",
         AV_NE("sw", NULL), CODEC_ID_PCM_S16BE)
  
- PCMDEF(s16le, "PCM signed 16 bit little-endian format",
+ PCMDEF(s16le, "PCM signed 16-bit little-endian",
         AV_NE(NULL, "sw"), CODEC_ID_PCM_S16LE)
  
- PCMDEF(s8, "PCM signed 8 bit format",
+ PCMDEF(s8, "PCM signed 8-bit",
         "sb", CODEC_ID_PCM_S8)
  
- PCMDEF(u32be, "PCM unsigned 32 bit big-endian format",
+ PCMDEF(u32be, "PCM unsigned 32-bit big-endian",
         NULL, CODEC_ID_PCM_U32BE)
  
- PCMDEF(u32le, "PCM unsigned 32 bit little-endian format",
+ PCMDEF(u32le, "PCM unsigned 32-bit little-endian",
         NULL, CODEC_ID_PCM_U32LE)
  
- PCMDEF(u24be, "PCM unsigned 24 bit big-endian format",
+ PCMDEF(u24be, "PCM unsigned 24-bit big-endian",
         NULL, CODEC_ID_PCM_U24BE)
  
- PCMDEF(u24le, "PCM unsigned 24 bit little-endian format",
+ PCMDEF(u24le, "PCM unsigned 24-bit little-endian",
         NULL, CODEC_ID_PCM_U24LE)
  
- PCMDEF(u16be, "PCM unsigned 16 bit big-endian format",
+ PCMDEF(u16be, "PCM unsigned 16-bit big-endian",
         AV_NE("uw", NULL), CODEC_ID_PCM_U16BE)
  
- PCMDEF(u16le, "PCM unsigned 16 bit little-endian format",
+ PCMDEF(u16le, "PCM unsigned 16-bit little-endian",
         AV_NE(NULL, "uw"), CODEC_ID_PCM_U16LE)
  
- PCMDEF(u8, "PCM unsigned 8 bit format",
+ PCMDEF(u8, "PCM unsigned 8-bit",
         "ub", CODEC_ID_PCM_U8)
  
- PCMDEF(alaw, "PCM A-law format",
+ PCMDEF(alaw, "PCM A-law",
         "al", CODEC_ID_PCM_ALAW)
  
- PCMDEF(mulaw, "PCM mu-law format",
+ PCMDEF(mulaw, "PCM mu-law",
         "ul", CODEC_ID_PCM_MULAW)
diff --combined libavformat/pmpdec.c
index 315e58c184f273c589eeafa7df9ff399d138a4df,ca3b33597a3066750e1eaa6967bf37cc551707f3..593a355b6beaa7a5602660c5adbe3fdb6f0879d1
@@@ -1,21 -1,21 +1,21 @@@
  /*
 - * PMP demuxer
 + * PMP demuxer.
   * Copyright (c) 2011 Reimar Döffinger
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
  #include "avformat.h"
  #include "internal.h"
  
 -typedef struct PMPContext {
 -    int       cur_stream;
 -    int       num_streams;
 -    int       audio_packets;
 -    int       current_packet;
 +typedef struct {
 +    int cur_stream;
 +    int num_streams;
 +    int audio_packets;
 +    int current_packet;
      uint32_t *packet_sizes;
 -    int       packet_sizes_alloc;
 +    int packet_sizes_alloc;
  } PMPContext;
  
 -static int pmp_probe(AVProbeData *p)
 -{
 -    if (!memcmp(p->buf, "pmpm\1\0\0\0", 8))
 +static int pmp_probe(AVProbeData *p) {
 +    if (AV_RN32(p->buf) == AV_RN32("pmpm") &&
 +        AV_RL32(p->buf + 4) == 1)
          return AVPROBE_SCORE_MAX;
      return 0;
  }
@@@ -65,7 -65,7 +65,7 @@@ static int pmp_header(AVFormatContext *
          av_log(s, AV_LOG_ERROR, "Unsupported video format\n");
          break;
      }
 -    index_cnt          = avio_rl32(pb);
 +    index_cnt = avio_rl32(pb);
      vst->codec->width  = avio_rl32(pb);
      vst->codec->height = avio_rl32(pb);
  
      tb_den = avio_rl32(pb);
      avpriv_set_pts_info(vst, 32, tb_num, tb_den);
      vst->nb_frames = index_cnt;
 -    vst->duration  = index_cnt;
 +    vst->duration = index_cnt;
  
      switch (avio_rl32(pb)) {
      case 0:
          audio_codec_id = CODEC_ID_MP3;
          break;
      case 1:
 -        av_log(s, AV_LOG_WARNING, "AAC is not yet correctly supported\n");
 +        av_log(s, AV_LOG_ERROR, "AAC not yet correctly supported\n");
          audio_codec_id = CODEC_ID_AAC;
          break;
      default:
      }
      pmp->num_streams = avio_rl16(pb) + 1;
      avio_skip(pb, 10);
 -    srate    = avio_rl32(pb);
 +    srate = avio_rl32(pb);
      channels = avio_rl32(pb) + 1;
      for (i = 1; i < pmp->num_streams; i++) {
          AVStream *ast = avformat_new_stream(s, NULL);
          if (!ast)
              return AVERROR(ENOMEM);
 -        ast->codec->codec_type  = AVMEDIA_TYPE_AUDIO;
 -        ast->codec->codec_id    = audio_codec_id;
 -        ast->codec->channels    = channels;
 +        ast->codec->codec_type = AVMEDIA_TYPE_AUDIO;
 +        ast->codec->codec_id = audio_codec_id;
 +        ast->codec->channels = channels;
          ast->codec->sample_rate = srate;
          avpriv_set_pts_info(ast, 32, 1, srate);
      }
 -    pos = avio_tell(pb) + 4 * index_cnt;
 +    pos = avio_tell(pb) + 4*index_cnt;
      for (i = 0; i < index_cnt; i++) {
 -        int size  = avio_rl32(pb);
 +        int size = avio_rl32(pb);
          int flags = size & 1 ? AVINDEX_KEYFRAME : 0;
          size >>= 1;
          av_add_index_entry(vst, pos, i, size, 0, flags);
@@@ -119,15 -119,11 +119,15 @@@ static int pmp_packet(AVFormatContext *
      int ret = 0;
      int i;
  
 -    if (pb->eof_reached)
 +    if (url_feof(pb))
          return AVERROR_EOF;
      if (pmp->cur_stream == 0) {
          int num_packets;
          pmp->audio_packets = avio_r8(pb);
 +        if (!pmp->audio_packets) {
 +            av_log_ask_for_sample(s, "0 audio packets\n");
 +            return AVERROR_PATCHWELCOME;
 +        }
          num_packets = (pmp->num_streams - 1) * pmp->audio_packets + 1;
          avio_skip(pb, 8);
          pmp->current_packet = 0;
              pmp->packet_sizes[i] = avio_rl32(pb);
      }
      ret = av_get_packet(pb, pkt, pmp->packet_sizes[pmp->current_packet]);
 -    if (ret > 0) {
 +    if (ret >= 0) {
          ret = 0;
          // FIXME: this is a hack that should be removed once
          // compute_pkt_fields() can handle timestamps properly
              pkt->dts = s->streams[0]->cur_dts++;
          pkt->stream_index = pmp->cur_stream;
      }
 -    pmp->current_packet++;
 -    if (pmp->current_packet == 1 || pmp->current_packet > pmp->audio_packets)
 +    if (pmp->current_packet % pmp->audio_packets == 0)
          pmp->cur_stream = (pmp->cur_stream + 1) % pmp->num_streams;
 -
 +    pmp->current_packet++;
      return ret;
  }
  
 -static int pmp_seek(AVFormatContext *s, int stream_idx, int64_t ts, int flags)
 +static int pmp_seek(AVFormatContext *s, int stream_index, int64_t ts, int flags)
  {
      PMPContext *pmp = s->priv_data;
      pmp->cur_stream = 0;
@@@ -173,7 -170,7 +173,7 @@@ static int pmp_close(AVFormatContext *s
  
  AVInputFormat ff_pmp_demuxer = {
      .name           = "pmp",
-     .long_name      = NULL_IF_CONFIG_SMALL("Playstation Portable PMP format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("Playstation Portable PMP"),
      .priv_data_size = sizeof(PMPContext),
      .read_probe     = pmp_probe,
      .read_header    = pmp_header,
diff --combined libavformat/psxstr.c
index ff9b7edceb35f0f1b269dc557105670de7c163f7,f49e356a4bfe8c9cf512e117ec2ff0d255037a04..b978e01f418c39c8370f40ef9d448e19d125b5c2
@@@ -2,20 -2,20 +2,20 @@@
   * Sony Playstation (PSX) STR File Demuxer
   * Copyright (c) 2003 The ffmpeg Project
   *
 - * 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
   */
  
@@@ -69,8 -69,6 +69,8 @@@ static const char sync_header[12] = {0x
  static int str_probe(AVProbeData *p)
  {
      uint8_t *sector= p->buf;
 +    uint8_t *end= sector + p->buf_size;
 +    int aud=0, vid=0;
  
      if (p->buf_size < RAW_CD_SECTOR_SIZE)
          return 0;
          sector += RIFF_HEADER_SIZE;
      }
  
 -    /* look for CD sync header (00, 0xFF x 10, 00) */
 -    if (memcmp(sector,sync_header,sizeof(sync_header)))
 -        return 0;
 +    while (end - sector >= RAW_CD_SECTOR_SIZE) {
 +        /* look for CD sync header (00, 0xFF x 10, 00) */
 +        if (memcmp(sector,sync_header,sizeof(sync_header)))
 +            return 0;
  
 -    if(sector[0x11] >= 32)
 -        return 0;
 -    if(   (sector[0x12] & CDXA_TYPE_MASK) != CDXA_TYPE_VIDEO
 -       && (sector[0x12] & CDXA_TYPE_MASK) != CDXA_TYPE_AUDIO
 -       && (sector[0x12] & CDXA_TYPE_MASK) != CDXA_TYPE_DATA)
 -        return 0;
 +        if (sector[0x11] >= 32)
 +            return 0;
 +
 +        switch (sector[0x12] & CDXA_TYPE_MASK) {
 +        case CDXA_TYPE_DATA:
 +        case CDXA_TYPE_VIDEO: {
 +                int current_sector = AV_RL16(&sector[0x1C]);
 +                int sector_count   = AV_RL16(&sector[0x1E]);
 +                int frame_size = AV_RL32(&sector[0x24]);
 +
 +                if(!(   frame_size>=0
 +                     && current_sector < sector_count
 +                     && sector_count*VIDEO_DATA_CHUNK_SIZE >=frame_size)){
 +                    return 0;
 +                }
  
 +                /*st->codec->width      = AV_RL16(&sector[0x28]);
 +                st->codec->height     = AV_RL16(&sector[0x2A]);*/
 +
 +//                 if (current_sector == sector_count-1) {
 +                    vid++;
 +//                 }
 +
 +            }
 +            break;
 +        case CDXA_TYPE_AUDIO:
 +            if(sector[0x13]&0x2A)
 +                return 0;
 +            aud++;
 +            break;
 +        default:
 +            if(sector[0x12] & CDXA_TYPE_MASK)
 +                return 0;
 +        }
 +        sector += RAW_CD_SECTOR_SIZE;
 +    }
      /* MPEG files (like those ripped from VCDs) can also look like this;
       * only return half certainty */
 -    return 50;
 +    if(vid+aud > 3)  return 50;
 +    else if(vid+aud) return 1;
 +    else             return 0;
  }
  
  static int str_read_header(AVFormatContext *s)
@@@ -277,7 -243,7 +277,7 @@@ static int str_read_packet(AVFormatCont
              break;
          }
  
 -        if (pb->eof_reached)
 +        if (url_feof(pb))
              return AVERROR(EIO);
      }
  }
@@@ -296,7 -262,7 +296,7 @@@ static int str_read_close(AVFormatConte
  
  AVInputFormat ff_str_demuxer = {
      .name           = "psxstr",
-     .long_name      = NULL_IF_CONFIG_SMALL("Sony Playstation STR format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("Sony Playstation STR"),
      .priv_data_size = sizeof(StrDemuxContext),
      .read_probe     = str_probe,
      .read_header    = str_read_header,
diff --combined libavformat/pva.c
index 97efa61e4cf24c16435c9ad1b14911d472484b7c,bfb6987c287bdf71318860f3944d0ef8576cf4d2..0e1605d326f08ddc21ddfda1e5c54c2869c65875
@@@ -2,20 -2,20 +2,20 @@@
   * TechnoTrend PVA (.pva) demuxer
   * Copyright (c) 2007, 2008 Ivo van Poorten
   *
 - * 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
   */
  
@@@ -32,26 -32,13 +32,26 @@@ typedef struct 
      int continue_pes;
  } PVAContext;
  
 +static int pva_check(uint8_t *p) {
 +    int length = AV_RB16(p + 6);
 +    if (AV_RB16(p) != PVA_MAGIC || !p[2] || p[2] > 2 || p[4] != 0x55 ||
 +        (p[5] & 0xe0) || length > PVA_MAX_PAYLOAD_LENGTH)
 +        return -1;
 +    return length + 8;
 +}
 +
  static int pva_probe(AVProbeData * pd) {
      unsigned char *buf = pd->buf;
 +    int len = pva_check(buf);
 +
 +    if (len < 0)
 +        return 0;
  
 -    if (AV_RB16(buf) == PVA_MAGIC && buf[2] && buf[2] < 3 && buf[4] == 0x55)
 +    if (pd->buf_size >= len + 8 &&
 +        pva_check(buf + len) >= 0)
          return AVPROBE_SCORE_MAX / 2;
  
 -    return 0;
 +    return AVPROBE_SCORE_MAX / 4;
  }
  
  static int pva_read_header(AVFormatContext *s) {
@@@ -216,7 -203,7 +216,7 @@@ static int64_t pva_read_timestamp(struc
  
  AVInputFormat ff_pva_demuxer = {
      .name           = "pva",
-     .long_name      = NULL_IF_CONFIG_SMALL("TechnoTrend PVA file and stream format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("TechnoTrend PVA"),
      .priv_data_size = sizeof(PVAContext),
      .read_probe     = pva_probe,
      .read_header    = pva_read_header,
diff --combined libavformat/qcp.c
index 929fce48e9aee4b566c20887d37049a58d94e4e2,de0490650218cca34301d703ed54673d2efa310a..4d91c05e6e50b8541a097717089c88a0a616ef5b
@@@ -2,20 -2,20 +2,20 @@@
   * QCP format (.qcp) demuxer
   * Copyright (c) 2009 Kenan Gillet
   *
 - * 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
   */
  
@@@ -139,7 -139,7 +139,7 @@@ static int qcp_read_packet(AVFormatCont
      QCPContext    *c  = s->priv_data;
      unsigned int  chunk_size, tag;
  
 -    while(!pb->eof_reached) {
 +    while(!url_feof(pb)) {
          if (c->data_size) {
              int pkt_size, ret, mode = avio_r8(pb);
  
  
  AVInputFormat ff_qcp_demuxer = {
      .name           = "qcp",
-     .long_name      = NULL_IF_CONFIG_SMALL("QCP format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("QCP"),
      .priv_data_size = sizeof(QCPContext),
      .read_probe     = qcp_probe,
      .read_header    = qcp_read_header,
diff --combined libavformat/r3d.c
index 4c32d90af57bd5c45e8a8625c47e25f2f788dfb5,a5e5d1c4f6e8a3f39b282859a0839232d4f15c2a..bd456baaab586911cd6f07d68e5dac4694b39a70
@@@ -2,20 -2,20 +2,20 @@@
   * R3D REDCODE demuxer
   * Copyright (c) 2008 Baptiste Coudurier <baptiste dot coudurier at gmail dot com>
   *
 - * 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
   */
  
@@@ -396,7 -396,7 +396,7 @@@ static int r3d_close(AVFormatContext *s
  
  AVInputFormat ff_r3d_demuxer = {
      .name           = "r3d",
-     .long_name      = NULL_IF_CONFIG_SMALL("REDCODE R3D format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("REDCODE R3D"),
      .priv_data_size = sizeof(R3DContext),
      .read_probe     = r3d_probe,
      .read_header    = r3d_read_header,
diff --combined libavformat/rawenc.c
index 8be3cc999e2167899d4bb257c25d7963145f39a1,fde5b24e65ac6bf405b3020930b6c19dcdb0fb08..d14824839b6c5d48c9ca5e5d80386ccba86f7b7d
@@@ -3,20 -3,20 +3,20 @@@
   * Copyright (c) 2001 Fabrice Bellard
   * Copyright (c) 2005 Alex Beregszaszi
   *
 - * 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
   */
  
@@@ -132,19 -132,6 +132,19 @@@ AVOutputFormat ff_g722_muxer = 
  };
  #endif
  
 +#if CONFIG_G723_1_MUXER
 +AVOutputFormat ff_g723_1_muxer = {
 +    .name              = "g723_1",
 +    .long_name         = NULL_IF_CONFIG_SMALL("raw G.723.1"),
 +    .mime_type         = "audio/g723",
 +    .extensions        = "tco,rco",
 +    .audio_codec       = CODEC_ID_G723_1,
 +    .video_codec       = CODEC_ID_NONE,
 +    .write_packet      = ff_raw_write_packet,
 +    .flags= AVFMT_NOTIMESTAMPS,
 +};
 +#endif
 +
  #if CONFIG_H261_MUXER
  AVOutputFormat ff_h261_muxer = {
      .name              = "h261",
@@@ -174,7 -161,7 +174,7 @@@ AVOutputFormat ff_h263_muxer = 
  #if CONFIG_H264_MUXER
  AVOutputFormat ff_h264_muxer = {
      .name              = "h264",
-     .long_name         = NULL_IF_CONFIG_SMALL("raw H.264 video format"),
+     .long_name         = NULL_IF_CONFIG_SMALL("raw H.264 video"),
      .extensions        = "h264",
      .audio_codec       = CODEC_ID_NONE,
      .video_codec       = CODEC_ID_H264,
  #if CONFIG_M4V_MUXER
  AVOutputFormat ff_m4v_muxer = {
      .name              = "m4v",
-     .long_name         = NULL_IF_CONFIG_SMALL("raw MPEG-4 video format"),
+     .long_name         = NULL_IF_CONFIG_SMALL("raw MPEG-4 video"),
      .extensions        = "m4v",
      .audio_codec       = CODEC_ID_NONE,
      .video_codec       = CODEC_ID_MPEG4,
@@@ -248,7 -235,7 +248,7 @@@ AVOutputFormat ff_mpeg2video_muxer = 
  #if CONFIG_RAWVIDEO_MUXER
  AVOutputFormat ff_rawvideo_muxer = {
      .name              = "rawvideo",
-     .long_name         = NULL_IF_CONFIG_SMALL("raw video format"),
+     .long_name         = NULL_IF_CONFIG_SMALL("raw video"),
      .extensions        = "yuv,rgb",
      .audio_codec       = CODEC_ID_NONE,
      .video_codec       = CODEC_ID_RAWVIDEO,
  };
  #endif
  
 -#if CONFIG_SRT_MUXER
 -AVOutputFormat ff_srt_muxer = {
 -    .name              = "srt",
 -    .long_name         = NULL_IF_CONFIG_SMALL("SubRip subtitle"),
 -    .mime_type         = "application/x-subrip",
 -    .extensions        = "srt",
 -    .write_packet      = ff_raw_write_packet,
 -    .flags             = AVFMT_NOTIMESTAMPS,
 -    .subtitle_codec    = CODEC_ID_SRT,
 -};
 -#endif
 -
  #if CONFIG_TRUEHD_MUXER
  AVOutputFormat ff_truehd_muxer = {
      .name              = "truehd",
index da80ae9c19af6ceb9a7a1f39359b40ff7e91ecc8,5c1593e3c13486c71473b89415e9c9cc8c05a8f3..c349a5338f849131c8b4d12a789ba013c6346c85
@@@ -2,20 -2,20 +2,20 @@@
   * RAW video demuxer
   * Copyright (c) 2001 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
   */
  
@@@ -62,7 -62,7 +62,7 @@@ static const AVClass rawvideo_demuxer_c
  
  AVInputFormat ff_rawvideo_demuxer = {
      .name           = "rawvideo",
-     .long_name      = NULL_IF_CONFIG_SMALL("raw video format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("raw video"),
      .priv_data_size = sizeof(FFRawVideoDemuxerContext),
      .read_header    = ff_raw_read_header,
      .read_packet    = rawvideo_read_packet,
diff --combined libavformat/rl2.c
index fbf52f4660d5e310fe894f2d59e461b6e93ca1fe,2f0ef118ae64194892b15ca616cbd813581a55cf..e9c961b3f1c41900bb4254ea90d730a741712998
@@@ -2,20 -2,20 +2,20 @@@
   * RL2 Format Demuxer
   * Copyright (c) 2008 Sascha Sommer (saschasommer@freenet.de)
   *
 - * 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
   */
  
@@@ -136,9 -136,6 +136,9 @@@ static av_cold int rl2_read_header(AVFo
  
      /** setup audio stream if present */
      if(sound_rate){
 +        if(channels <= 0)
 +            return AVERROR_INVALIDDATA;
 +
          pts_num = def_sound_size;
          pts_den = rate;
  
@@@ -289,7 -286,7 +289,7 @@@ static int rl2_read_seek(AVFormatContex
  
  AVInputFormat ff_rl2_demuxer = {
      .name           = "rl2",
-     .long_name      = NULL_IF_CONFIG_SMALL("RL2 format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("RL2"),
      .priv_data_size = sizeof(Rl2DemuxContext),
      .read_probe     = rl2_probe,
      .read_header    = rl2_read_header,
diff --combined libavformat/rmdec.c
index 24d80c820c5db54b3ad8e705a2c5db74bc09afc0,484a986553d5e5389c343dae3f6186c57a6437e0..cce43319c19d81ca3849fc6cee771f7088009eba
@@@ -2,20 -2,20 +2,20 @@@
   * "Real" compatible demuxer.
   * Copyright (c) 2000, 2001 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
   */
  
@@@ -234,7 -234,6 +234,7 @@@ static int rm_read_audio_stream_info(AV
              }
              if ((ret = rm_read_extradata(pb, st->codec, codecdata_length)) < 0)
                  return ret;
 +
              break;
          case CODEC_ID_AAC:
              avio_rb16(pb); avio_r8(pb);
@@@ -325,7 -324,7 +325,7 @@@ ff_rm_read_mdpr_codecdata (AVFormatCont
          int fps;
          if (avio_rl32(pb) != MKTAG('V', 'I', 'D', 'O')) {
          fail1:
 -            av_log(st->codec, AV_LOG_ERROR, "Unsupported video codec\n");
 +            av_log(s, AV_LOG_WARNING, "Unsupported stream type %08x\n", v);
              goto skip;
          }
          st->codec->codec_tag = avio_rl32(pb);
@@@ -455,7 -454,7 +455,7 @@@ static int rm_read_header(AVFormatConte
      avio_skip(pb, tag_size - 8);
  
      for(;;) {
 -        if (pb->eof_reached)
 +        if (url_feof(pb))
              return -1;
          tag = avio_rl32(pb);
          tag_size = avio_rb32(pb);
              avio_rb32(pb); /* max packet size */
              avio_rb32(pb); /* avg packet size */
              avio_rb32(pb); /* nb packets */
 -            avio_rb32(pb); /* duration */
 +            duration = avio_rb32(pb); /* duration */
 +            s->duration = av_rescale(duration, AV_TIME_BASE, 1000);
              avio_rb32(pb); /* preroll */
              indx_off = avio_rb32(pb); /* index offset */
              data_off = avio_rb32(pb); /* data offset */
              duration = avio_rb32(pb); /* duration */
              st->start_time = start_time;
              st->duration = duration;
 +            if(duration>0)
 +                s->duration = AV_NOPTS_VALUE;
              get_str8(pb, buf, sizeof(buf)); /* desc */
              get_str8(pb, buf, sizeof(buf)); /* mimetype */
              st->codec->codec_type = AVMEDIA_TYPE_DATA;
@@@ -562,7 -558,7 +562,7 @@@ static int sync(AVFormatContext *s, int
      AVStream *st;
      uint32_t state=0xFFFFFFFF;
  
 -    while(!pb->eof_reached){
 +    while(!url_feof(pb)){
          int len, num, i;
          *pos= avio_tell(pb) - 3;
          if(rm->remaining_len > 0){
@@@ -898,7 -894,7 +898,7 @@@ static int rm_read_packet(AVFormatConte
                      st = s->streams[i];
              }
  
 -            if(len<0 || s->pb->eof_reached)
 +            if(len<0 || url_feof(s->pb))
                  return AVERROR(EIO);
  
              res = ff_rm_parse_packet (s, s->pb, st, st->priv_data, len, pkt,
@@@ -954,9 -950,7 +954,9 @@@ static int64_t rm_read_dts(AVFormatCont
      if(rm->old_format)
          return AV_NOPTS_VALUE;
  
 -    avio_seek(s->pb, pos, SEEK_SET);
 +    if (avio_seek(s->pb, pos, SEEK_SET) < 0)
 +        return AV_NOPTS_VALUE;
 +
      rm->remaining_len=0;
      for(;;){
          int seq=1;
  
  AVInputFormat ff_rm_demuxer = {
      .name           = "rm",
-     .long_name      = NULL_IF_CONFIG_SMALL("RealMedia format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("RealMedia"),
      .priv_data_size = sizeof(RMDemuxContext),
      .read_probe     = rm_probe,
      .read_header    = rm_read_header,
diff --combined libavformat/rmenc.c
index 3919ee9219759082ba6ecb60889ce24a1b87e130,4b339642343347414d46f2f2b07fd7ee77f959fd..390b7f62158402e815075756d1de4b3339932bc4
@@@ -2,20 -2,20 +2,20 @@@
   * "Real" compatible muxer.
   * Copyright (c) 2000, 2001 Fabrice Bellard
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  #include "avformat.h"
@@@ -309,11 -309,6 +309,11 @@@ static int rm_write_header(AVFormatCont
      int n;
      AVCodecContext *codec;
  
 +    if (s->nb_streams > 2) {
 +        av_log(s, AV_LOG_ERROR, "At most 2 streams are currently supported for muxing in RM\n");
 +        return AVERROR_PATCHWELCOME;
 +    }
 +
      for(n=0;n<s->nb_streams;n++) {
          s->streams[n]->id = n;
          codec = s->streams[n]->codec;
@@@ -467,7 -462,7 +467,7 @@@ static int rm_write_trailer(AVFormatCon
  
  AVOutputFormat ff_rm_muxer = {
      .name              = "rm",
-     .long_name         = NULL_IF_CONFIG_SMALL("RealMedia format"),
+     .long_name         = NULL_IF_CONFIG_SMALL("RealMedia"),
      .mime_type         = "application/vnd.rn-realmedia",
      .extensions        = "rm,ra",
      .priv_data_size    = sizeof(RMMuxContext),
diff --combined libavformat/rpl.c
index c1c66b77b40243d8c4017ef70f561e1ed396fca2,07d6895ee2937d973b3c899596e8d45bbb663b42..96af67d5218d40b22108087a0858fcb0cf6a2f7e
@@@ -2,20 -2,20 +2,20 @@@
   * ARMovie/RPL demuxer
   * Copyright (c) 2007 Christian Ohm, 2008 Eli Friedman
   *
 - * 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
   */
  
@@@ -58,7 -58,7 +58,7 @@@ static int read_line(AVIOContext * pb, 
              break;
          if (b == '\n') {
              line[i] = '\0';
 -            return 0;
 +            return url_feof(pb) ? -1 : 0;
          }
          line[i] = b;
      }
@@@ -164,9 -164,11 +164,9 @@@ static int rpl_read_header(AVFormatCont
              // The header is wrong here, at least sometimes
              vst->codec->bits_per_coded_sample = 16;
              break;
 -#if 0
          case 130:
              vst->codec->codec_id = CODEC_ID_ESCAPE130;
              break;
 -#endif
          default:
              av_log(s, AV_LOG_WARNING,
                     "RPL video format %i not supported yet!\n",
      // Read the index
      avio_seek(pb, chunk_catalog_offset, SEEK_SET);
      total_audio_size = 0;
 -    for (i = 0; i < number_of_chunks; i++) {
 +    for (i = 0; !error && i < number_of_chunks; i++) {
          int64_t offset, video_size, audio_size;
          error |= read_line(pb, line, sizeof(line));
          if (3 != sscanf(line, "%"PRId64" , %"PRId64" ; %"PRId64,
@@@ -351,7 -353,7 +351,7 @@@ static int rpl_read_packet(AVFormatCont
  
  AVInputFormat ff_rpl_demuxer = {
      .name           = "rpl",
-     .long_name      = NULL_IF_CONFIG_SMALL("RPL/ARMovie format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("RPL / ARMovie"),
      .priv_data_size = sizeof(RPLContext),
      .read_probe     = rpl_probe,
      .read_header    = rpl_read_header,
diff --combined libavformat/rsodec.c
index 3fa85be163d7c45c6b274fbf56a28f7bfd56e8ad,eed81af88463b01f2d302960d7870fdfa409ddaa..e07d5f5179af7225f2c14882dac91b3cfc791045
@@@ -3,20 -3,20 +3,20 @@@
   * Copyright (c) 2001 Fabrice Bellard (original AU code)
   * Copyright (c) 2010 Rafael Carre
   *
 - * 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
   */
  
@@@ -80,15 -80,17 +80,15 @@@ static int rso_read_packet(AVFormatCont
      if (ret < 0)
          return ret;
  
 +    pkt->flags &= ~AV_PKT_FLAG_CORRUPT;
      pkt->stream_index = 0;
  
 -    /* note: we need to modify the packet size here to handle the last packet */
 -    pkt->size = ret;
 -
      return 0;
  }
  
  AVInputFormat ff_rso_demuxer = {
      .name           =   "rso",
-     .long_name      =   NULL_IF_CONFIG_SMALL("Lego Mindstorms RSO format"),
+     .long_name      =   NULL_IF_CONFIG_SMALL("Lego Mindstorms RSO"),
      .extensions     =   "rso",
      .read_header    =   rso_read_header,
      .read_packet    =   rso_read_packet,
diff --combined libavformat/rsoenc.c
index ef4350b970ce7aed9c4b6e59d84a43427e11e436,eabb2d563521333074d302480c82c1c489d31a61..3d18c6022f556edf08c8ae1926112fac97cd61e2
@@@ -3,20 -3,20 +3,20 @@@
   * Copyright (c) 2001 Fabrice Bellard (original AU code)
   * Copyright (c) 2010 Rafael Carre
   *
 - * 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
   */
  
@@@ -102,7 -102,7 +102,7 @@@ static int rso_write_trailer(AVFormatCo
  
  AVOutputFormat ff_rso_muxer = {
      .name           =   "rso",
-     .long_name      =   NULL_IF_CONFIG_SMALL("Lego Mindstorms RSO format"),
+     .long_name      =   NULL_IF_CONFIG_SMALL("Lego Mindstorms RSO"),
      .extensions     =   "rso",
      .audio_codec    =   CODEC_ID_PCM_U8,
      .video_codec    =   CODEC_ID_NONE,
diff --combined libavformat/rtpenc.c
index 0a3071d190aabbc96e0c9a61a4873befe482eacc,d173cf3eb3f5378f1d509ebf71e3a9b2992bf015..bda43a095cbe7bf223d9eaa76eaf57a5a3b21b4d
@@@ -2,20 -2,20 +2,20 @@@
   * RTP output format
   * Copyright (c) 2002 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
   */
  
@@@ -93,7 -93,7 +93,7 @@@ static int rtp_write_header(AVFormatCon
      }
      st = s1->streams[0];
      if (!is_supported(st->codec->codec_id)) {
 -        av_log(s1, AV_LOG_ERROR, "Unsupported codec %x\n", st->codec->codec_id);
 +        av_log(s1, AV_LOG_ERROR, "Unsupported codec %s\n", avcodec_get_name(st->codec->codec_id));
  
          return -1;
      }
@@@ -546,7 -546,7 +546,7 @@@ static int rtp_write_trailer(AVFormatCo
  
  AVOutputFormat ff_rtp_muxer = {
      .name              = "rtp",
-     .long_name         = NULL_IF_CONFIG_SMALL("RTP output format"),
+     .long_name         = NULL_IF_CONFIG_SMALL("RTP output"),
      .priv_data_size    = sizeof(RTPMuxContext),
      .audio_codec       = CODEC_ID_PCM_MULAW,
      .video_codec       = CODEC_ID_MPEG4,
diff --combined libavformat/rtsp.c
index cbcda2e71df502232a294641b1e227c28ed8663e,4b1e804805e94edb0faa07ae186cd78b36935ad4..7c6e24e1076e4aa146d65752f9b576db6927b54f
@@@ -2,20 -2,20 +2,20 @@@
   * RTSP/SDP client
   * Copyright (c) 2002 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
   */
  
@@@ -1193,6 -1193,10 +1193,6 @@@ int ff_rtsp_make_setup_request(AVFormat
      /* default timeout: 1 minute */
      rt->timeout = 60;
  
 -    /* for each stream, make the setup request */
 -    /* XXX: we assume the same server is used for the control of each
 -     * RTSP stream */
 -
      /* Choose a random starting offset within the first half of the
       * port range, to allow for a number of ports to try even if the offset
       * happens to be at the end of the random range. */
                                 &s->interrupt_callback, NULL))
                      goto rtp_opened;
              }
 -
              av_log(s, AV_LOG_ERROR, "Unable to open an input RTP port\n");
              err = AVERROR(EIO);
              goto fail;
@@@ -2076,7 -2081,7 +2076,7 @@@ static const AVClass rtp_demuxer_class 
  
  AVInputFormat ff_rtp_demuxer = {
      .name           = "rtp",
-     .long_name      = NULL_IF_CONFIG_SMALL("RTP input format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("RTP input"),
      .priv_data_size = sizeof(RTSPState),
      .read_probe     = rtp_probe,
      .read_header    = rtp_read_header,
diff --combined libavformat/rtspdec.c
index f642a56644bfc88156cfb307d2eeb8abd1ed5681,a891837eb1dd5ae57aa497f6881c26f1049406c1..856be5678893e1f0eb670918ccddb8ec7692e59a
@@@ -2,20 -2,20 +2,20 @@@
   * RTSP demuxer
   * Copyright (c) 2002 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
   */
  
@@@ -733,7 -733,7 +733,7 @@@ redo
      id  = buf[0];
      len = AV_RB16(buf + 1);
      av_dlog(s, "id=%d len=%d\n", id, len);
 -    if (len > buf_size || len < 12)
 +    if (len > buf_size || len < 8)
          goto redo;
      /* get the data */
      ret = ffurl_read_complete(rt->rtsp_hd, buf, len);
@@@ -919,7 -919,7 +919,7 @@@ static const AVClass rtsp_demuxer_clas
  
  AVInputFormat ff_rtsp_demuxer = {
      .name           = "rtsp",
-     .long_name      = NULL_IF_CONFIG_SMALL("RTSP input format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("RTSP input"),
      .priv_data_size = sizeof(RTSPState),
      .read_probe     = rtsp_probe,
      .read_header    = rtsp_read_header,
diff --combined libavformat/rtspenc.c
index 927dd38d567543f89c5967de40f638b80a066df9,1d4780fa9ebcc8c4bd500fb27bd0aed21c08d7ea..b89eb02956a4da67736e046484eef9ceb73a15dd
@@@ -2,20 -2,20 +2,20 @@@
   * RTSP muxer
   * Copyright (c) 2010 Martin Storsjo
   *
 - * 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
   */
  
@@@ -235,7 -235,7 +235,7 @@@ static int rtsp_write_close(AVFormatCon
  
  AVOutputFormat ff_rtsp_muxer = {
      .name              = "rtsp",
-     .long_name         = NULL_IF_CONFIG_SMALL("RTSP output format"),
+     .long_name         = NULL_IF_CONFIG_SMALL("RTSP output"),
      .priv_data_size    = sizeof(RTSPState),
      .audio_codec       = CODEC_ID_AAC,
      .video_codec       = CODEC_ID_MPEG4,
diff --combined libavformat/sapdec.c
index 4626af7410811ec13862e2fc8cdd6eb7ca2d6143,c1cdc8fb72f31944be06d50ace6ac4fb12537ce0..ed3e8578d50882ea648461fd13b20ce73e645e5b
@@@ -2,20 -2,20 +2,20 @@@
   * Session Announcement Protocol (RFC 2974) demuxer
   * Copyright (c) 2010 Martin Storsjo
   *
 - * 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
   */
  
@@@ -227,7 -227,7 +227,7 @@@ static int sap_fetch_packet(AVFormatCon
  
  AVInputFormat ff_sap_demuxer = {
      .name           = "sap",
-     .long_name      = NULL_IF_CONFIG_SMALL("SAP input format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("SAP input"),
      .priv_data_size = sizeof(struct SAPState),
      .read_probe     = sap_probe,
      .read_header    = sap_read_header,
diff --combined libavformat/sapenc.c
index c1d8db3761bf4816ec3e5ca2c1c03c4fe4abbf65,37ce0e5eea01311c97942e65b807d99fec7fdfc1..ba5ce1baeb6a996ac1835ad5f814307b1c94b188
@@@ -2,20 -2,20 +2,20 @@@
   * Session Announcement Protocol (RFC 2974) muxer
   * Copyright (c) 2010 Martin Storsjo
   *
 - * 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
   */
  
@@@ -254,7 -254,7 +254,7 @@@ static int sap_write_packet(AVFormatCon
  
  AVOutputFormat ff_sap_muxer = {
      .name              = "sap",
-     .long_name         = NULL_IF_CONFIG_SMALL("SAP output format"),
+     .long_name         = NULL_IF_CONFIG_SMALL("SAP output"),
      .priv_data_size    = sizeof(struct SAPState),
      .audio_codec       = CODEC_ID_AAC,
      .video_codec       = CODEC_ID_MPEG4,
diff --combined libavformat/segafilm.c
index 9c171f0b502acc075f5105059ab19e23ae7ae2fb,bb26cf69e4d80f51284fe0ee88f19fc37fa6a0b0..dea1afa3f04ae7161a5985e7587b9db83ffef75a
@@@ -2,20 -2,20 +2,20 @@@
   * Sega FILM Format (CPK) Demuxer
   * Copyright (c) 2003 The ffmpeg Project
   *
 - * 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
   */
  
@@@ -30,7 -30,6 +30,7 @@@
  #include "libavutil/intreadwrite.h"
  #include "avformat.h"
  #include "internal.h"
 +#include "avio_internal.h"
  
  #define FILM_TAG MKBETAG('F', 'I', 'L', 'M')
  #define FDSC_TAG MKBETAG('F', 'D', 'S', 'C')
@@@ -267,8 -266,6 +267,8 @@@ static int film_read_packet(AVFormatCon
          (film->audio_type != CODEC_ID_ADPCM_ADX)) {
          /* stereo PCM needs to be interleaved */
  
 +        if (ffio_limit(pb, sample->sample_size) != sample->sample_size)
 +            return AVERROR(EIO);
          if (av_new_packet(pkt, sample->sample_size))
              return AVERROR(ENOMEM);
  
  
          left = 0;
          right = sample->sample_size / 2;
 -        for (i = 0; i < sample->sample_size; ) {
 +        for (i = 0; i + 1 + 2*(film->audio_bits != 8) < sample->sample_size; ) {
              if (film->audio_bits == 8) {
                  pkt->data[i++] = film->stereo_buffer[left++];
                  pkt->data[i++] = film->stereo_buffer[right++];
@@@ -327,7 -324,7 +327,7 @@@ static int film_read_close(AVFormatCont
  
  AVInputFormat ff_segafilm_demuxer = {
      .name           = "film_cpk",
-     .long_name      = NULL_IF_CONFIG_SMALL("Sega FILM/CPK format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("Sega FILM / CPK"),
      .priv_data_size = sizeof(FilmDemuxContext),
      .read_probe     = film_probe,
      .read_header    = film_read_header,
diff --combined libavformat/sierravmd.c
index 18bcb38bbf9f68c0852ee5d4590612717d2a906c,300d43596d005f27e8272524f62b99a38034714d..cdeb1740ca5b9ea413b6704601fba77eb4b1db54
@@@ -2,20 -2,20 +2,20 @@@
   * Sierra VMD Format Demuxer
   * Copyright (c) 2004 The ffmpeg Project
   *
 - * 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
   */
  
@@@ -30,7 -30,6 +30,7 @@@
  #include "libavutil/intreadwrite.h"
  #include "avformat.h"
  #include "internal.h"
 +#include "avio_internal.h"
  
  #define VMD_HEADER_SIZE 0x0330
  #define BYTES_PER_FRAME_RECORD 16
@@@ -246,8 -245,6 +246,8 @@@ static int vmd_read_packet(AVFormatCont
      /* position the stream (will probably be there already) */
      avio_seek(pb, frame->frame_offset, SEEK_SET);
  
 +    if(ffio_limit(pb, frame->frame_size) != frame->frame_size)
 +        return AVERROR(EIO);
      if (av_new_packet(pkt, frame->frame_size + BYTES_PER_FRAME_RECORD))
          return AVERROR(ENOMEM);
      pkt->pos= avio_tell(pb);
@@@ -285,7 -282,7 +285,7 @@@ static int vmd_read_close(AVFormatConte
  
  AVInputFormat ff_vmd_demuxer = {
      .name           = "vmd",
-     .long_name      = NULL_IF_CONFIG_SMALL("Sierra VMD format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("Sierra VMD"),
      .priv_data_size = sizeof(VmdDemuxContext),
      .read_probe     = vmd_probe,
      .read_header    = vmd_read_header,
diff --combined libavformat/sol.c
index 8650f0b355c581e16bf1c82b220e6c5cc90a34f0,ed1e41b07d36263d9cf40050f8f71a3ae4b8debd..7df107a946cc096c5f713fda7e83e9301a569ab2
@@@ -2,20 -2,20 +2,20 @@@
   * Sierra SOL demuxer
   * Copyright Konstantin Shishkov
   *
 - * 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
   */
  
@@@ -128,19 -128,22 +128,19 @@@ static int sol_read_packet(AVFormatCont
  {
      int ret;
  
 -    if (s->pb->eof_reached)
 +    if (url_feof(s->pb))
          return AVERROR(EIO);
      ret= av_get_packet(s->pb, pkt, MAX_SIZE);
      if (ret < 0)
          return ret;
 +    pkt->flags &= ~AV_PKT_FLAG_CORRUPT;
      pkt->stream_index = 0;
 -
 -    /* note: we need to modify the packet size here to handle the last
 -       packet */
 -    pkt->size = ret;
      return 0;
  }
  
  AVInputFormat ff_sol_demuxer = {
      .name           = "sol",
-     .long_name      = NULL_IF_CONFIG_SMALL("Sierra SOL format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("Sierra SOL"),
      .read_probe     = sol_probe,
      .read_header    = sol_read_header,
      .read_packet    = sol_read_packet,
diff --combined libavformat/soxdec.c
index 46b07b73c8dfee4cea2e53139050a992657a25e6,d116b2c9c47d90be6044ca59f996ab15cd79e811..fe59fd47a26d5596b8f2d91486c96f46bcc573af
@@@ -5,20 -5,20 +5,20 @@@
   * Based on libSoX sox-fmt.c
   * Copyright (c) 2008 robs@users.sourceforge.net
   *
 - * 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
   */
  
@@@ -97,8 -97,6 +97,8 @@@ static int sox_read_header(AVFormatCont
  
      if (comment_size && comment_size < UINT_MAX) {
          char *comment = av_malloc(comment_size+1);
 +        if(!comment)
 +            return AVERROR(ENOMEM);
          if (avio_read(pb, comment, comment_size) != comment_size) {
              av_freep(&comment);
              return AVERROR(EIO);
@@@ -131,22 -129,22 +131,22 @@@ static int sox_read_packet(AVFormatCont
  {
      int ret, size;
  
 -    if (s->pb->eof_reached)
 +    if (url_feof(s->pb))
          return AVERROR_EOF;
  
      size = SOX_SAMPLES*s->streams[0]->codec->block_align;
      ret = av_get_packet(s->pb, pkt, size);
      if (ret < 0)
          return AVERROR(EIO);
 +    pkt->flags &= ~AV_PKT_FLAG_CORRUPT;
      pkt->stream_index = 0;
 -    pkt->size = ret;
  
      return 0;
  }
  
  AVInputFormat ff_sox_demuxer = {
      .name           = "sox",
-     .long_name      = NULL_IF_CONFIG_SMALL("SoX native format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("SoX native"),
      .read_probe     = sox_probe,
      .read_header    = sox_read_header,
      .read_packet    = sox_read_packet,
diff --combined libavformat/soxenc.c
index 811cb0e97d4a3d2c95cf08944fc64889203e6cd4,750a0a05a87095443d01c8d8c3ab22db628a1c86..e68b7e568ffd1f8ab6fdd47b0c548298e3f98405
@@@ -5,20 -5,20 +5,20 @@@
   * Based on libSoX sox-fmt.c
   * Copyright (c) 2008 robs@users.sourceforge.net
   *
 - * 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
   */
  
@@@ -117,7 -117,7 +117,7 @@@ static int sox_write_trailer(AVFormatCo
  
  AVOutputFormat ff_sox_muxer = {
      .name              = "sox",
-     .long_name         = NULL_IF_CONFIG_SMALL("SoX native format"),
+     .long_name         = NULL_IF_CONFIG_SMALL("SoX native"),
      .extensions        = "sox",
      .priv_data_size    = sizeof(SoXContext),
      .audio_codec       = CODEC_ID_PCM_S32LE,
diff --combined libavformat/srtdec.c
index 9cd393ef7f83fc60599a57c748ee6758c66a596b,8d951f8f0a09f313fb4e367907ba03e595d85576..8eba5abf9a20283c5e95c4e23efb518001a0df78
@@@ -2,20 -2,20 +2,20 @@@
   * SubRip subtitle demuxer
   * Copyright (c) 2010  Aurelien Jacobs <aurel@gnuage.org>
   *
 - * 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
   */
  
@@@ -44,7 -44,7 +44,7 @@@ static int srt_read_header(AVFormatCont
  {
      AVStream *st = avformat_new_stream(s, NULL);
      if (!st)
 -        return -1;
 +        return AVERROR(ENOMEM);
      avpriv_set_pts_info(st, 64, 1, 1000);
      st->codec->codec_type = AVMEDIA_TYPE_SUBTITLE;
      st->codec->codec_id   = CODEC_ID_SRT;
@@@ -81,7 -81,7 +81,7 @@@ static int srt_read_packet(AVFormatCont
      do {
          ptr2 = ptr;
          ptr += ff_get_line(s->pb, ptr, sizeof(buffer)+buffer-ptr);
 -    } while (!is_eol(*ptr2) && !s->pb->eof_reached && ptr-buffer<sizeof(buffer)-1);
 +    } while (!is_eol(*ptr2) && !url_feof(s->pb) && ptr-buffer<sizeof(buffer)-1);
  
      if (buffer[0] && !(res = av_new_packet(pkt, ptr-buffer))) {
          memcpy(pkt->data, buffer, pkt->size);
@@@ -94,7 -94,7 +94,7 @@@
  
  AVInputFormat ff_srt_demuxer = {
      .name        = "srt",
-     .long_name   = NULL_IF_CONFIG_SMALL("SubRip subtitle format"),
+     .long_name   = NULL_IF_CONFIG_SMALL("SubRip subtitle"),
      .read_probe  = srt_probe,
      .read_header = srt_read_header,
      .read_packet = srt_read_packet,
diff --combined libavformat/srtenc.c
index b8fc8fac7e12103a8a0318d54168ca17062efab8,0000000000000000000000000000000000000000..171c45b4458c9a684a2557ef3485d89b6bc01fcf
mode 100644,000000..100644
--- /dev/null
@@@ -1,99 -1,0 +1,99 @@@
-     .long_name      = NULL_IF_CONFIG_SMALL("SubRip subtitle format"),
 +/*
 + * SubRip subtitle muxer
 + * Copyright (c) 2012  Nicolas George <nicolas.george@normalesup.org>
 + *
 + * This file is part of FFmpeg.
 + *
 + * FFmpeg is free software; you can redistribute it and/or
 + * modify it under the terms of the GNU Lesser General Public
 + * License as published by the Free Software Foundation; either
 + * version 2.1 of the License, or (at your option) any later version.
 + *
 + * FFmpeg is distributed in the hope that it will be useful,
 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 + * Lesser General Public License for more details.
 + *
 + * You should have received a copy of the GNU Lesser General Public
 + * License along with FFmpeg; if not, write to the Free Software
 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 + */
 +
 +#include "avformat.h"
 +#include "internal.h"
 +#include "libavutil/log.h"
 +
 +/* TODO: add options for:
 +   - character encoding;
 +   - LF / CRLF;
 +   - byte order mark.
 + */
 +
 +typedef struct SRTContext{
 +    unsigned index;
 +} SRTContext;
 +
 +static int srt_write_header(AVFormatContext *avf)
 +{
 +    if (avf->nb_streams != 1 ||
 +        avf->streams[0]->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) {
 +        av_log(avf, AV_LOG_ERROR,
 +               "SRT supports only a single subtitles stream.\n");
 +        return AVERROR(EINVAL);
 +    }
 +    if (avf->streams[0]->codec->codec_id != CODEC_ID_TEXT &&
 +        avf->streams[0]->codec->codec_id != CODEC_ID_SRT) {
 +        av_log(avf, AV_LOG_ERROR,
 +               "Unsupported subtitles codec: %s\n",
 +               avcodec_get_name(avf->streams[0]->codec->codec_id));
 +        return AVERROR(EINVAL);
 +    }
 +    avpriv_set_pts_info(avf->streams[0], 64, 1, 1000);
 +    return 0;
 +}
 +
 +static int srt_write_packet(AVFormatContext *avf, AVPacket *pkt)
 +{
 +    SRTContext *srt = avf->priv_data;
 +    int write_ts = avf->streams[0]->codec->codec_id != CODEC_ID_SRT;
 +
 +    srt->index++;
 +    if (write_ts) {
 +        char buf[64];
 +        int64_t s = pkt->pts, e, d = pkt->duration;
 +        int len;
 +
 +        if (d <= 0)
 +            d = pkt->convergence_duration;
 +        if (s == AV_NOPTS_VALUE || d <= 0) {
 +            av_log(avf, AV_LOG_ERROR, "Insufficient timestamps.\n");
 +            return AVERROR(EINVAL);
 +        }
 +        e = s + d;
 +        len = snprintf(buf, sizeof(buf),
 +                       "%d\n%02d:%02d:%02d,%03d --> %02d:%02d:%02d,%03d\n",
 +                       srt->index,
 +                       (int)(s / 3600000),      (int)(s / 60000) % 60,
 +                       (int)(s /    1000) % 60, (int)(s %  1000),
 +                       (int)(e / 3600000),      (int)(e / 60000) % 60,
 +                       (int)(e /    1000) % 60, (int)(e %  1000));
 +        avio_write(avf->pb, buf, len);
 +    }
 +    avio_write(avf->pb, pkt->data, pkt->size);
 +    if (write_ts)
 +        avio_write(avf->pb, "\n\n", 2);
 +    avio_flush(avf->pb);
 +    return 0;
 +}
 +
 +AVOutputFormat ff_srt_muxer = {
 +    .name           = "srt",
++    .long_name      = NULL_IF_CONFIG_SMALL("SubRip subtitle"),
 +    .mime_type      = "application/x-subrip",
 +    .extensions     = "srt",
 +    .priv_data_size = sizeof(SRTContext),
 +    .write_header   = srt_write_header,
 +    .write_packet   = srt_write_packet,
 +    .flags          = AVFMT_VARIABLE_FPS,
 +    .subtitle_codec = CODEC_ID_TEXT,
 +};
diff --combined libavformat/tiertexseq.c
index a0c06deab6d8bbd323b2ec212ee42e4a2d174002,45a8482ab9eec8bbcd48d6902c8fdebf0fe79314..f7a9ff3bb37c01976d408abbe39789e632a99e2a
@@@ -2,20 -2,20 +2,20 @@@
   * Tiertex Limited SEQ File Demuxer
   * Copyright (c) 2006 Gregory Montoir (cyx@users.sourceforge.net)
   *
 - * 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
   */
  
@@@ -306,7 -306,7 +306,7 @@@ static int seq_read_close(AVFormatConte
  
  AVInputFormat ff_tiertexseq_demuxer = {
      .name           = "tiertexseq",
-     .long_name      = NULL_IF_CONFIG_SMALL("Tiertex Limited SEQ format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("Tiertex Limited SEQ"),
      .priv_data_size = sizeof(SeqDemuxContext),
      .read_probe     = seq_probe,
      .read_header    = seq_read_header,
diff --combined libavformat/vc1test.c
index 1b662af5bb5d1c17220db0bd51faf4c6cf37689a,7a7c8b67628fc98c7223575bf2d3eac08ed92c3c..1f1ec222b7b36b675308704ff8228b55ca5d1655
@@@ -2,20 -2,20 +2,20 @@@
   * VC1 Test Bitstreams Format Demuxer
   * Copyright (c) 2006, 2008 Konstantin Shishkov
   *
 - * 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
   */
  
@@@ -92,7 -92,7 +92,7 @@@ static int vc1t_read_packet(AVFormatCon
      int keyframe = 0;
      uint32_t pts;
  
 -    if(pb->eof_reached)
 +    if(url_feof(pb))
          return AVERROR(EIO);
  
      frame_size = avio_rl24(pb);
  
  AVInputFormat ff_vc1t_demuxer = {
      .name           = "vc1test",
-     .long_name      = NULL_IF_CONFIG_SMALL("VC-1 test bitstream format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("VC-1 test bitstream"),
      .read_probe     = vc1t_probe,
      .read_header    = vc1t_read_header,
      .read_packet    = vc1t_read_packet,
diff --combined libavformat/vocdec.c
index 8060864406b68007009a68b557dd820190e6b7c4,77f424701054065d29f7638fe53c5822ba27ef48..91e787ea1098d2544de9b0dc6394262a33bbaae7
@@@ -2,20 -2,20 +2,20 @@@
   * Creative Voice File demuxer.
   * Copyright (c) 2006  Aurelien Jacobs <aurel@gnuage.org>
   *
 - * 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
   */
  
@@@ -150,7 -150,7 +150,7 @@@ ff_voc_get_packet(AVFormatContext *s, A
          }
      }
  
 -    dec->bit_rate = dec->sample_rate * dec->bits_per_coded_sample;
 +    dec->bit_rate = dec->sample_rate * dec->channels * dec->bits_per_coded_sample;
  
      if (max_size <= 0)
          max_size = 2048;
@@@ -166,7 -166,7 +166,7 @@@ static int voc_read_packet(AVFormatCont
  
  AVInputFormat ff_voc_demuxer = {
      .name           = "voc",
-     .long_name      = NULL_IF_CONFIG_SMALL("Creative Voice file format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("Creative Voice"),
      .priv_data_size = sizeof(VocDecContext),
      .read_probe     = voc_probe,
      .read_header    = voc_read_header,
diff --combined libavformat/vocenc.c
index 4e382bf26fa5486a3b540e209302938049e0e849,06d88a8c5f87b5f9537dc9f31906957cde461323..5deda785792f89d3e67292a5f81276c87f88bcda
@@@ -2,20 -2,20 +2,20 @@@
   * Creative Voice File muxer.
   * Copyright (c) 2006  Aurelien Jacobs <aurel@gnuage.org>
   *
 - * 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
   */
  
@@@ -52,7 -52,7 +52,7 @@@ static int voc_write_packet(AVFormatCon
      AVIOContext *pb = s->pb;
  
      if (!voc->param_written) {
 -        if (enc->codec_tag > 0xFF) {
 +        if (enc->codec_tag > 3) {
              avio_w8(pb, VOC_TYPE_NEW_VOICE_DATA);
              avio_wl24(pb, pkt->size + 12);
              avio_wl32(pb, enc->sample_rate);
              if (s->streams[0]->codec->channels > 1) {
                  avio_w8(pb, VOC_TYPE_EXTENDED);
                  avio_wl24(pb, 4);
 -                avio_wl16(pb, 65536-256000000/(enc->sample_rate*enc->channels));
 +                avio_wl16(pb, 65536-(256000000 + enc->sample_rate*enc->channels/2)/(enc->sample_rate*enc->channels));
                  avio_w8(pb, enc->codec_tag);
                  avio_w8(pb, enc->channels - 1);
              }
              avio_w8(pb, VOC_TYPE_VOICE_DATA);
              avio_wl24(pb, pkt->size + 2);
 -            avio_w8(pb, 256 - 1000000 / enc->sample_rate);
 +            avio_w8(pb, 256 - (1000000 + enc->sample_rate/2) / enc->sample_rate);
              avio_w8(pb, enc->codec_tag);
          }
          voc->param_written = 1;
@@@ -91,11 -91,11 +91,11 @@@ static int voc_write_trailer(AVFormatCo
  
  AVOutputFormat ff_voc_muxer = {
      .name              = "voc",
-     .long_name         = NULL_IF_CONFIG_SMALL("Creative Voice file format"),
+     .long_name         = NULL_IF_CONFIG_SMALL("Creative Voice"),
      .mime_type         = "audio/x-voc",
      .extensions        = "voc",
      .priv_data_size    = sizeof(VocEncContext),
 -    .audio_codec       = CODEC_ID_PCM_U8,
 +    .audio_codec       = CODEC_ID_PCM_S16LE,
      .video_codec       = CODEC_ID_NONE,
      .write_header      = voc_write_header,
      .write_packet      = voc_write_packet,
diff --combined libavformat/wav.c
index cb0f7bbd1b3721e632445cb4126633ddb7c4230f,4ff2c389fca9125239374a65c2f4de9dbbbd34b0..749b2c5808028efb281900e2bc95cf3adccbf27a
@@@ -6,20 -6,20 +6,20 @@@
   * RF64 demuxer
   * Copyright (c) 2009 Daniel Verkamp
   *
 - * 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
   */
  
@@@ -45,14 -45,6 +45,14 @@@ typedef struct 
      int last_duration;
      int w64;
      int write_bext;
 +    int64_t smv_data_ofs;
 +    int smv_block_size;
 +    int smv_frames_per_jpeg;
 +    int smv_block;
 +    int smv_last_stream;
 +    int smv_eof;
 +    int audio_eof;
 +    int ignore_length;
  } WAVContext;
  
  #if CONFIG_WAV_MUXER
@@@ -246,7 -238,7 +246,7 @@@ static int64_t find_tag(AVIOContext *pb
      int64_t size;
  
      for (;;) {
 -        if (pb->eof_reached)
 +        if (url_feof(pb))
              return -1;
          size = next_tag(pb, &tag);
          if (tag == tag1)
@@@ -289,7 -281,7 +289,7 @@@ static int wav_parse_fmt_tag(AVFormatCo
      ret = ff_get_wav_header(pb, (*st)->codec, size);
      if (ret < 0)
          return ret;
 -    (*st)->need_parsing = AVSTREAM_PARSE_FULL;
 +    (*st)->need_parsing = AVSTREAM_PARSE_FULL_RAW;
  
      avpriv_set_pts_info(*st, 64, 1, (*st)->codec->sample_rate);
  
@@@ -347,7 -339,7 +347,7 @@@ static int wav_parse_bext_tag(AVFormatC
              } else {
                  /* extended UMID */
                  snprintf(temp, sizeof(temp), "0x%016"PRIX64"%016"PRIX64"%016"PRIX64"%016"PRIX64
 -                                             "0x%016"PRIX64"%016"PRIX64"%016"PRIX64"%016"PRIX64,
 +                                               "%016"PRIX64"%016"PRIX64"%016"PRIX64"%016"PRIX64,
                           umid_parts[0], umid_parts[1], umid_parts[2], umid_parts[3],
                           umid_parts[4], umid_parts[5], umid_parts[6], umid_parts[7]);
              }
@@@ -400,8 -392,6 +400,8 @@@ static int wav_read_header(AVFormatCont
      int ret, got_fmt = 0;
      int64_t next_tag_ofs, data_ofs = -1;
  
 +    wav->smv_data_ofs = -1;
 +
      /* check RIFF header */
      tag = avio_rl32(pb);
  
          if (avio_rl32(pb) != MKTAG('d', 's', '6', '4'))
              return -1;
          size = avio_rl32(pb);
 -        if (size < 16)
 +        if (size < 24)
              return -1;
          avio_rl64(pb); /* RIFF size */
          data_size = avio_rl64(pb);
                     data_size, sample_count);
              return AVERROR_INVALIDDATA;
          }
 -        avio_skip(pb, size - 16); /* skip rest of ds64 chunk */
 +        avio_skip(pb, size - 24); /* skip rest of ds64 chunk */
 +
      }
  
      for (;;) {
 +        AVStream *vst;
          size = next_tag(pb, &tag);
          next_tag_ofs = avio_tell(pb) + size;
  
 -        if (pb->eof_reached)
 +        if (url_feof(pb))
              break;
  
          switch (tag) {
          case MKTAG('f', 'm', 't', ' '):
              /* only parse the first 'fmt ' tag found */
 -            if (!got_fmt && (ret = wav_parse_fmt_tag(s, size, &st) < 0)) {
 +            if (!got_fmt && (ret = wav_parse_fmt_tag(s, size, &st)) < 0) {
                  return ret;
              } else if (got_fmt)
                  av_log(s, AV_LOG_WARNING, "found more than one 'fmt ' tag\n");
              if ((ret = wav_parse_bext_tag(s, size)) < 0)
                  return ret;
              break;
 +        case MKTAG('S','M','V','0'):
 +            if (!got_fmt) {
 +                av_log(s, AV_LOG_ERROR, "found no 'fmt ' tag before the 'SMV0' tag\n");
 +                return AVERROR_INVALIDDATA;
 +            }
 +            // SMV file, a wav file with video appended.
 +            if (size != MKTAG('0','2','0','0')) {
 +                av_log(s, AV_LOG_ERROR, "Unknown SMV version found\n");
 +                goto break_loop;
 +            }
 +            av_log(s, AV_LOG_DEBUG, "Found SMV data\n");
 +            vst = avformat_new_stream(s, NULL);
 +            if (!vst)
 +                return AVERROR(ENOMEM);
 +            avio_r8(pb);
 +            vst->id = 1;
 +            vst->codec->codec_type = AVMEDIA_TYPE_VIDEO;
 +            vst->codec->codec_id = CODEC_ID_MJPEG;
 +            vst->codec->width  = avio_rl24(pb);
 +            vst->codec->height = avio_rl24(pb);
 +            size = avio_rl24(pb);
 +            wav->smv_data_ofs = avio_tell(pb) + (size - 5) * 3;
 +            avio_rl24(pb);
 +            wav->smv_block_size = avio_rl24(pb);
 +            avpriv_set_pts_info(vst, 32, 1, avio_rl24(pb));
 +            vst->duration = avio_rl24(pb);
 +            avio_rl24(pb);
 +            avio_rl24(pb);
 +            wav->smv_frames_per_jpeg = avio_rl24(pb);
 +            goto break_loop;
          case MKTAG('L', 'I', 'S', 'T'):
              list_type = avio_rl32(pb);
 -            if (size <= 4) {
 -                av_log(s, AV_LOG_ERROR, "too short LIST");
 +            if (size < 4) {
 +                av_log(s, AV_LOG_ERROR, "too short LIST tag\n");
                  return AVERROR_INVALIDDATA;
              }
              switch (list_type) {
@@@ -556,7 -514,7 +556,7 @@@ static int64_t find_guid(AVIOContext *p
      uint8_t guid[16];
      int64_t size;
  
 -    while (!pb->eof_reached) {
 +    while (!url_feof(pb)) {
          avio_read(pb, guid, 16);
          size = avio_rl64(pb);
          if (size <= 24)
@@@ -581,61 -539,16 +581,61 @@@ static int wav_read_packet(AVFormatCont
      AVStream *st;
      WAVContext *wav = s->priv_data;
  
 +    if (wav->smv_data_ofs > 0) {
 +        int64_t audio_dts, video_dts;
 +smv_retry:
 +        audio_dts = s->streams[0]->cur_dts;
 +        video_dts = s->streams[1]->cur_dts;
 +        if (audio_dts != AV_NOPTS_VALUE && video_dts != AV_NOPTS_VALUE) {
 +            audio_dts = av_rescale_q(audio_dts, s->streams[0]->time_base, AV_TIME_BASE_Q);
 +            video_dts = av_rescale_q(video_dts, s->streams[1]->time_base, AV_TIME_BASE_Q);
 +            wav->smv_last_stream = video_dts >= audio_dts;
 +        }
 +        wav->smv_last_stream = !wav->smv_last_stream;
 +        wav->smv_last_stream |= wav->audio_eof;
 +        wav->smv_last_stream &= !wav->smv_eof;
 +        if (wav->smv_last_stream) {
 +            uint64_t old_pos = avio_tell(s->pb);
 +            uint64_t new_pos = wav->smv_data_ofs +
 +                wav->smv_block * wav->smv_block_size;
 +            if (avio_seek(s->pb, new_pos, SEEK_SET) < 0) {
 +                ret = AVERROR_EOF;
 +                goto smv_out;
 +            }
 +            size = avio_rl24(s->pb);
 +            ret  = av_get_packet(s->pb, pkt, size);
 +            if (ret < 0)
 +                goto smv_out;
 +            pkt->pos -= 3;
 +            pkt->pts = wav->smv_block * wav->smv_frames_per_jpeg;
 +            wav->smv_block++;
 +            pkt->stream_index = 1;
 +smv_out:
 +            avio_seek(s->pb, old_pos, SEEK_SET);
 +            if (ret == AVERROR_EOF) {
 +                wav->smv_eof = 1;
 +                goto smv_retry;
 +            }
 +            return ret;
 +        }
 +    }
 +
      st = s->streams[0];
  
      left = wav->data_end - avio_tell(s->pb);
 +    if (wav->ignore_length)
 +        left= INT_MAX;
      if (left <= 0){
          if (CONFIG_W64_DEMUXER && wav->w64)
              left = find_guid(s->pb, guid_data) - 24;
          else
              left = find_tag(s->pb, MKTAG('d', 'a', 't', 'a'));
 -        if (left < 0)
 +        if (left < 0) {
 +            wav->audio_eof = 1;
 +            if (wav->smv_data_ofs > 0 && !wav->smv_eof)
 +                goto smv_retry;
              return AVERROR_EOF;
 +        }
          wav->data_end= avio_tell(s->pb) + left;
      }
  
  static int wav_read_seek(AVFormatContext *s,
                           int stream_index, int64_t timestamp, int flags)
  {
 +    WAVContext *wav = s->priv_data;
      AVStream *st;
 +    wav->smv_eof = 0;
 +    wav->audio_eof = 0;
 +    if (wav->smv_data_ofs > 0) {
 +        int64_t smv_timestamp = timestamp;
 +        if (stream_index == 0)
 +            smv_timestamp = av_rescale_q(timestamp, s->streams[0]->time_base, s->streams[1]->time_base);
 +        else
 +            timestamp = av_rescale_q(smv_timestamp, s->streams[1]->time_base, s->streams[0]->time_base);
 +        wav->smv_block = smv_timestamp / wav->smv_frames_per_jpeg;
 +    }
  
      st = s->streams[0];
      switch (st->codec->codec_id) {
      return ff_pcm_read_seek(s, stream_index, timestamp, flags);
  }
  
 +#define OFFSET(x) offsetof(WAVContext, x)
 +#define DEC AV_OPT_FLAG_DECODING_PARAM
 +static const AVOption demux_options[] = {
 +    { "ignore_length", "Ignore length", OFFSET(ignore_length), AV_OPT_TYPE_INT, { 0 }, 0, 1, DEC },
 +    { NULL },
 +};
 +
 +static const AVClass wav_demuxer_class = {
 +    .class_name = "WAV demuxer",
 +    .item_name  = av_default_item_name,
 +    .option     = demux_options,
 +    .version    = LIBAVUTIL_VERSION_INT,
 +};
  AVInputFormat ff_wav_demuxer = {
      .name           = "wav",
      .long_name      = NULL_IF_CONFIG_SMALL("WAV format"),
      .read_seek      = wav_read_seek,
      .flags          = AVFMT_GENERIC_INDEX,
      .codec_tag      = (const AVCodecTag* const []){ ff_codec_wav_tags, 0 },
 +    .priv_class     = &wav_demuxer_class,
  };
  #endif /* CONFIG_WAV_DEMUXER */
  
@@@ -771,7 -659,7 +771,7 @@@ static int w64_read_header(AVFormatCont
          return ret;
      avio_skip(pb, FFALIGN(size, INT64_C(8)) - size);
  
 -    st->need_parsing = AVSTREAM_PARSE_FULL;
 +    st->need_parsing = AVSTREAM_PARSE_FULL_RAW;
  
      avpriv_set_pts_info(st, 64, 1, st->codec->sample_rate);
  
  
  AVInputFormat ff_w64_demuxer = {
      .name           = "w64",
-     .long_name      = NULL_IF_CONFIG_SMALL("Sony Wave64 format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("Sony Wave64"),
      .priv_data_size = sizeof(WAVContext),
      .read_probe     = w64_probe,
      .read_header    = w64_read_header,
diff --combined libavformat/wc3movie.c
index d79d7687f49b8b2255a30aaabca85b4d31f0c825,e4fefcff1ce4c7cd59b732a91e5a98ce9238465d..45bdde0c57c890f445b4a5291b1cd945ee168524
@@@ -2,20 -2,20 +2,20 @@@
   * Wing Commander III Movie (.mve) File Demuxer
   * Copyright (c) 2003 The ffmpeg Project
   *
 - * 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
   */
  
@@@ -157,7 -157,7 +157,7 @@@ static int wc3_read_header(AVFormatCont
          fourcc_tag = avio_rl32(pb);
          /* chunk sizes are 16-bit aligned */
          size = (avio_rb32(pb) + 1) & (~1);
 -        if (pb->eof_reached)
 +        if (url_feof(pb))
              return AVERROR(EIO);
  
      } while (fourcc_tag != BRCH_TAG);
@@@ -208,7 -208,7 +208,7 @@@ static int wc3_read_packet(AVFormatCont
          fourcc_tag = avio_rl32(pb);
          /* chunk sizes are 16-bit aligned */
          size = (avio_rb32(pb) + 1) & (~1);
 -        if (pb->eof_reached)
 +        if (url_feof(pb))
              return AVERROR(EIO);
  
          switch (fourcc_tag) {
@@@ -293,7 -293,7 +293,7 @@@ static int wc3_read_close(AVFormatConte
  
  AVInputFormat ff_wc3_demuxer = {
      .name           = "wc3movie",
-     .long_name      = NULL_IF_CONFIG_SMALL("Wing Commander III movie format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("Wing Commander III movie"),
      .priv_data_size = sizeof(Wc3DemuxContext),
      .read_probe     = wc3_probe,
      .read_header    = wc3_read_header,
index 37d3ced94f3659ea6cc8dd5b54d95de22a08d33b,ae49184a47af19349bb07682e27f6ed1f711801b..6dee8b535f20bc32850446ef25ce6c2795ce5a7f
@@@ -2,20 -2,20 +2,20 @@@
   * Westwood Studios AUD Format Demuxer
   * Copyright (c) 2003 The ffmpeg Project
   *
 - * 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
   */
  
@@@ -173,7 -173,7 +173,7 @@@ static int wsaud_read_packet(AVFormatCo
  
  AVInputFormat ff_wsaud_demuxer = {
      .name           = "wsaud",
-     .long_name      = NULL_IF_CONFIG_SMALL("Westwood Studios audio format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("Westwood Studios audio"),
      .read_probe     = wsaud_probe,
      .read_header    = wsaud_read_header,
      .read_packet    = wsaud_read_packet,
index c3bd0df6a9e9254ddb756a124747b493201ed176,c431d5356c234cc99b65944e836ae5ca1a1564d1..89a985605ec18e47eee1708bbb9f09f7a8458f8f
@@@ -2,20 -2,20 +2,20 @@@
   * Westwood Studios VQA Format Demuxer
   * Copyright (c) 2003 The ffmpeg Project
   *
 - * 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
   */
  
@@@ -131,8 -131,10 +131,8 @@@ static int wsvqa_read_header(AVFormatCo
      /* there are 0 or more chunks before the FINF chunk; iterate until
       * FINF has been skipped and the file will be ready to be demuxed */
      do {
 -        if (avio_read(pb, scratch, VQA_PREAMBLE_SIZE) != VQA_PREAMBLE_SIZE) {
 -            av_free(st->codec->extradata);
 +        if (avio_read(pb, scratch, VQA_PREAMBLE_SIZE) != VQA_PREAMBLE_SIZE)
              return AVERROR(EIO);
 -        }
          chunk_tag = AV_RB32(&scratch[0]);
          chunk_size = AV_RB32(&scratch[4]);
  
@@@ -175,15 -177,18 +175,15 @@@ static int wsvqa_read_packet(AVFormatCo
      while (avio_read(pb, preamble, VQA_PREAMBLE_SIZE) == VQA_PREAMBLE_SIZE) {
          chunk_type = AV_RB32(&preamble[0]);
          chunk_size = AV_RB32(&preamble[4]);
 +
          skip_byte = chunk_size & 0x01;
  
          if ((chunk_type == SND0_TAG) || (chunk_type == SND1_TAG) ||
              (chunk_type == SND2_TAG) || (chunk_type == VQFR_TAG)) {
  
 -            if (av_new_packet(pkt, chunk_size))
 -                return AVERROR(EIO);
 -            ret = avio_read(pb, pkt->data, chunk_size);
 -            if (ret != chunk_size) {
 -                av_free_packet(pkt);
 +            ret= av_get_packet(pb, pkt, chunk_size);
 +            if (ret<0)
                  return AVERROR(EIO);
 -            }
  
              switch (chunk_type) {
              case SND0_TAG:
  
  AVInputFormat ff_wsvqa_demuxer = {
      .name           = "wsvqa",
-     .long_name      = NULL_IF_CONFIG_SMALL("Westwood Studios VQA format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("Westwood Studios VQA"),
      .priv_data_size = sizeof(WsVqaDemuxContext),
      .read_probe     = wsvqa_probe,
      .read_header    = wsvqa_read_header,
diff --combined libavformat/wv.c
index a80cad776dadd4f8e7cc5f4b96658fdce985c3e2,3fd1abcb87d80b74a1cf7fd3a4f324aa2871ae39..cc01ff16f435ef27bc3617a0d6e4c92860d6ae6d
@@@ -2,20 -2,20 +2,20 @@@
   * WavPack demuxer
   * Copyright (c) 2006,2011 Konstantin Shishkov
   *
 - * 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
   */
  
@@@ -36,7 -36,7 +36,7 @@@
  #define WV_END_BLOCK    0x1000
  #define WV_SINGLE_BLOCK (WV_START_BLOCK | WV_END_BLOCK)
  
- enum WV_FLAGS{
+ enum WV_FLAGS {
      WV_MONO   = 0x0004,
      WV_HYBRID = 0x0008,
      WV_JOINT  = 0x0010,
  };
  
  static const int wv_rates[16] = {
-      6000,  8000,  9600, 11025, 12000, 16000, 22050, 24000,
-     32000, 44100, 48000, 64000, 88200, 96000, 192000, -1
+      6000,  8000,  9600, 11025, 12000, 16000,  22050, 24000,
+     32000, 44100, 48000, 64000, 88200, 96000, 192000,    -1
  };
  
- typedef struct{
+ typedef struct {
      uint32_t blksize, flags;
      int rate, chan, bpp;
      uint32_t chmask;
@@@ -64,7 -64,7 +64,7 @@@
      int block_parsed;
      uint8_t extra[WV_EXTRA_SIZE];
      int64_t pos;
- }WVContext;
+ } WVContext;
  
  static int wv_probe(AVProbeData *p)
  {
@@@ -78,7 -78,8 +78,8 @@@
          return 0;
  }
  
- static int wv_read_block_header(AVFormatContext *ctx, AVIOContext *pb, int append)
+ static int wv_read_block_header(AVFormatContext *ctx, AVIOContext *pb,
+                                 int append)
  {
      WVContext *wc = ctx->priv_data;
      uint32_t tag, ver;
      uint32_t chmask;
  
      wc->pos = avio_tell(pb);
-     if(!append){
+     if (!append) {
          tag = avio_rl32(pb);
          if (tag != MKTAG('w', 'v', 'p', 'k'))
              return AVERROR_INVALIDDATA;
          size = avio_rl32(pb);
-         if(size < 24 || size > WV_BLOCK_LIMIT){
+         if (size < 24 || size > WV_BLOCK_LIMIT) {
              av_log(ctx, AV_LOG_ERROR, "Incorrect block size %i\n", size);
              return AVERROR_INVALIDDATA;
          }
          wc->blksize = size;
          ver = avio_rl16(pb);
-         if(ver < 0x402 || ver > 0x410){
+         if (ver < 0x402 || ver > 0x410) {
              av_log(ctx, AV_LOG_ERROR, "Unsupported version %03X\n", ver);
              return AVERROR_PATCHWELCOME;
          }
          avio_r8(pb); // track no
          avio_r8(pb); // track sub index
          wc->samples = avio_rl32(pb); // total samples in file
-         wc->soff = avio_rl32(pb); // offset in samples of current block
+         wc->soff    = avio_rl32(pb); // offset in samples of current block
          avio_read(pb, wc->extra, WV_EXTRA_SIZE);
-     }else{
+     } else {
          size = wc->blksize;
      }
      wc->flags = AV_RL32(wc->extra + 4);
-     // blocks with zero samples don't contain actual audio information and should be ignored
+     /* Blocks with zero samples don't contain actual audio information
+      * and should be ignored */
      if (!AV_RN32(wc->extra))
          return 0;
-     //parse flags
-     bpp = ((wc->flags & 3) + 1) << 3;
-     chan = 1 + !(wc->flags & WV_MONO);
+     // parse flags
+     bpp    = ((wc->flags & 3) + 1) << 3;
+     chan   = 1 + !(wc->flags & WV_MONO);
      chmask = wc->flags & WV_MONO ? AV_CH_LAYOUT_MONO : AV_CH_LAYOUT_STEREO;
-     rate = wv_rates[(wc->flags >> 23) & 0xF];
+     rate   = wv_rates[(wc->flags >> 23) & 0xF];
      wc->multichannel = !!((wc->flags & WV_SINGLE_BLOCK) != WV_SINGLE_BLOCK);
-     if(wc->multichannel){
-         chan = wc->chan;
+     if (wc->multichannel) {
+         chan   = wc->chan;
          chmask = wc->chmask;
      }
-     if((rate == -1 || !chan) && !wc->block_parsed){
+     if ((rate == -1 || !chan) && !wc->block_parsed) {
          int64_t block_end = avio_tell(pb) + wc->blksize - 24;
-         if(!pb->seekable){
-             av_log(ctx, AV_LOG_ERROR, "Cannot determine additional parameters\n");
+         if (!pb->seekable) {
+             av_log(ctx, AV_LOG_ERROR,
+                    "Cannot determine additional parameters\n");
              return AVERROR_INVALIDDATA;
          }
-         while(avio_tell(pb) < block_end){
+         while (avio_tell(pb) < block_end) {
              int id, size;
-             id = avio_r8(pb);
+             id   = avio_r8(pb);
              size = (id & 0x80) ? avio_rl24(pb) : avio_r8(pb);
              size <<= 1;
-             if(id&0x40)
+             if (id & 0x40)
                  size--;
-             switch(id&0x3F){
+             switch (id & 0x3F) {
              case 0xD:
-                 if(size <= 1){
-                     av_log(ctx, AV_LOG_ERROR, "Insufficient channel information\n");
+                 if (size <= 1) {
+                     av_log(ctx, AV_LOG_ERROR,
+                            "Insufficient channel information\n");
                      return AVERROR_INVALIDDATA;
                  }
                  chan = avio_r8(pb);
-                 switch(size - 2){
+                 switch (size - 2) {
                  case 0:
                      chmask = avio_r8(pb);
                      break;
                      break;
                  case 5:
                      avio_skip(pb, 1);
-                     chan |= (avio_r8(pb) & 0xF) << 8;
+                     chan  |= (avio_r8(pb) & 0xF) << 8;
                      chmask = avio_rl24(pb);
                      break;
                  default:
-                     av_log(ctx, AV_LOG_ERROR, "Invalid channel info size %d\n", size);
+                     av_log(ctx, AV_LOG_ERROR,
+                            "Invalid channel info size %d\n", size);
                      return AVERROR_INVALIDDATA;
                  }
                  break;
              default:
                  avio_skip(pb, size);
              }
-             if(id&0x40)
+             if (id & 0x40)
                  avio_skip(pb, 1);
          }
-         if(rate == -1){
-             av_log(ctx, AV_LOG_ERROR, "Cannot determine custom sampling rate\n");
+         if (rate == -1) {
+             av_log(ctx, AV_LOG_ERROR,
+                    "Cannot determine custom sampling rate\n");
              return AVERROR_INVALIDDATA;
          }
          avio_seek(pb, block_end - wc->blksize + 24, SEEK_SET);
      }
-     if(!wc->bpp) wc->bpp = bpp;
-     if(!wc->chan) wc->chan = chan;
-     if(!wc->chmask) wc->chmask = chmask;
-     if(!wc->rate) wc->rate = rate;
+     if (!wc->bpp)
+         wc->bpp    = bpp;
+     if (!wc->chan)
+         wc->chan   = chan;
+     if (!wc->chmask)
+         wc->chmask = chmask;
+     if (!wc->rate)
+         wc->rate   = rate;
  
-     if(wc->flags && bpp != wc->bpp){
-         av_log(ctx, AV_LOG_ERROR, "Bits per sample differ, this block: %i, header block: %i\n", bpp, wc->bpp);
+     if (wc->flags && bpp != wc->bpp) {
+         av_log(ctx, AV_LOG_ERROR,
+                "Bits per sample differ, this block: %i, header block: %i\n",
+                bpp, wc->bpp);
          return AVERROR_INVALIDDATA;
      }
-     if(wc->flags && !wc->multichannel && chan != wc->chan){
-         av_log(ctx, AV_LOG_ERROR, "Channels differ, this block: %i, header block: %i\n", chan, wc->chan);
+     if (wc->flags && !wc->multichannel && chan != wc->chan) {
+         av_log(ctx, AV_LOG_ERROR,
+                "Channels differ, this block: %i, header block: %i\n",
+                chan, wc->chan);
          return AVERROR_INVALIDDATA;
      }
-     if(wc->flags && rate != -1 && rate != wc->rate){
-         av_log(ctx, AV_LOG_ERROR, "Sampling rate differ, this block: %i, header block: %i\n", rate, wc->rate);
+     if (wc->flags && rate != -1 && rate != wc->rate) {
+         av_log(ctx, AV_LOG_ERROR,
+                "Sampling rate differ, this block: %i, header block: %i\n",
+                rate, wc->rate);
          return AVERROR_INVALIDDATA;
      }
      wc->blksize = size - 24;
@@@ -211,10 -227,10 +227,10 @@@ static int wv_read_header(AVFormatConte
      int ret;
  
      wc->block_parsed = 0;
-     for(;;){
+     for (;;) {
          if ((ret = wv_read_block_header(s, pb, 0)) < 0)
              return ret;
-         if(!AV_RN32(wc->extra))
+         if (!AV_RN32(wc->extra))
              avio_skip(pb, wc->blksize - 24);
          else
              break;
      st = avformat_new_stream(s, NULL);
      if (!st)
          return AVERROR(ENOMEM);
-     st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
-     st->codec->codec_id = CODEC_ID_WAVPACK;
-     st->codec->channels = wc->chan;
-     st->codec->channel_layout = wc->chmask;
-     st->codec->sample_rate = wc->rate;
+     st->codec->codec_type            = AVMEDIA_TYPE_AUDIO;
+     st->codec->codec_id              = CODEC_ID_WAVPACK;
+     st->codec->channels              = wc->chan;
+     st->codec->channel_layout        = wc->chmask;
+     st->codec->sample_rate           = wc->rate;
      st->codec->bits_per_coded_sample = wc->bpp;
      avpriv_set_pts_info(st, 64, 1, wc->rate);
      st->start_time = 0;
-     st->duration = wc->samples;
+     st->duration   = wc->samples;
  
-     if(s->pb->seekable) {
+     if (s->pb->seekable) {
          int64_t cur = avio_tell(s->pb);
          ff_ape_parse_tag(s);
-         if(!av_dict_get(s->metadata, "", NULL, AV_DICT_IGNORE_SUFFIX))
+         if (!av_dict_get(s->metadata, "", NULL, AV_DICT_IGNORE_SUFFIX))
              ff_id3v1_read(s);
          avio_seek(s->pb, cur, SEEK_SET);
      }
      return 0;
  }
  
- static int wv_read_packet(AVFormatContext *s,
-                           AVPacket *pkt)
+ static int wv_read_packet(AVFormatContext *s, AVPacket *pkt)
  {
      WVContext *wc = s->priv_data;
      int ret;
      int64_t pos;
      uint32_t block_samples;
  
 -    if (s->pb->eof_reached)
 +    if (url_feof(s->pb))
          return AVERROR_EOF;
-     if(wc->block_parsed){
+     if (wc->block_parsed) {
          if ((ret = wv_read_block_header(s, s->pb, 0)) < 0)
              return ret;
      }
  
      pos = wc->pos;
      off = wc->multichannel ? 4 : 0;
-     if(av_new_packet(pkt, wc->blksize + WV_EXTRA_SIZE + off) < 0)
+     if (av_new_packet(pkt, wc->blksize + WV_EXTRA_SIZE + off) < 0)
          return AVERROR(ENOMEM);
-     if(wc->multichannel)
+     if (wc->multichannel)
          AV_WL32(pkt->data, wc->blksize + WV_EXTRA_SIZE + 12);
      memcpy(pkt->data + off, wc->extra, WV_EXTRA_SIZE);
      ret = avio_read(s->pb, pkt->data + WV_EXTRA_SIZE + off, wc->blksize);
-     if(ret != wc->blksize){
+     if (ret != wc->blksize) {
          av_free_packet(pkt);
          return AVERROR(EIO);
      }
-     while(!(wc->flags & WV_END_BLOCK)){
-         if(avio_rl32(s->pb) != MKTAG('w', 'v', 'p', 'k')){
+     while (!(wc->flags & WV_END_BLOCK)) {
+         if (avio_rl32(s->pb) != MKTAG('w', 'v', 'p', 'k')) {
              av_free_packet(pkt);
              return AVERROR_INVALIDDATA;
          }
-         if((ret = av_append_packet(s->pb, pkt, 4)) < 0){
+         if ((ret = av_append_packet(s->pb, pkt, 4)) < 0) {
              av_free_packet(pkt);
              return ret;
          }
          size = AV_RL32(pkt->data + pkt->size - 4);
-         if(size < 24 || size > WV_BLOCK_LIMIT){
+         if (size < 24 || size > WV_BLOCK_LIMIT) {
              av_free_packet(pkt);
              av_log(s, AV_LOG_ERROR, "Incorrect block size %d\n", size);
              return AVERROR_INVALIDDATA;
          }
          wc->blksize = size;
-         ver = avio_rl16(s->pb);
-         if(ver < 0x402 || ver > 0x410){
+         ver         = avio_rl16(s->pb);
+         if (ver < 0x402 || ver > 0x410) {
              av_free_packet(pkt);
              av_log(s, AV_LOG_ERROR, "Unsupported version %03X\n", ver);
              return AVERROR_PATCHWELCOME;
          avio_r8(s->pb); // track no
          avio_r8(s->pb); // track sub index
          wc->samples = avio_rl32(s->pb); // total samples in file
-         wc->soff = avio_rl32(s->pb); // offset in samples of current block
-         if((ret = av_append_packet(s->pb, pkt, WV_EXTRA_SIZE)) < 0){
+         wc->soff    = avio_rl32(s->pb); // offset in samples of current block
+         if ((ret = av_append_packet(s->pb, pkt, WV_EXTRA_SIZE)) < 0) {
              av_free_packet(pkt);
              return ret;
          }
          memcpy(wc->extra, pkt->data + pkt->size - WV_EXTRA_SIZE, WV_EXTRA_SIZE);
  
-         if ((ret = wv_read_block_header(s, s->pb, 1)) < 0){
+         if ((ret = wv_read_block_header(s, s->pb, 1)) < 0) {
              av_free_packet(pkt);
              return ret;
          }
          ret = av_append_packet(s->pb, pkt, wc->blksize);
-         if(ret < 0){
+         if (ret < 0) {
              av_free_packet(pkt);
              return ret;
          }
      }
      pkt->stream_index = 0;
-     wc->block_parsed = 1;
-     pkt->pts = wc->soff;
-     block_samples = AV_RN32(wc->extra);
+     wc->block_parsed  = 1;
+     pkt->pts          = wc->soff;
+     block_samples     = AV_RN32(wc->extra);
      if (block_samples > INT32_MAX)
-         av_log(s, AV_LOG_WARNING, "Too many samples in block: %"PRIu32"\n", block_samples);
+         av_log(s, AV_LOG_WARNING,
+                "Too many samples in block: %"PRIu32"\n", block_samples);
      else
          pkt->duration = block_samples;
  
      return 0;
  }
  
- static int wv_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
+ static int wv_read_seek(AVFormatContext *s, int stream_index,
+                         int64_t timestamp, int flags)
  {
-     AVStream *st = s->streams[stream_index];
+     AVStream  *st = s->streams[stream_index];
      WVContext *wc = s->priv_data;
      AVPacket pkt1, *pkt = &pkt1;
      int ret;
          return 0;
      }
      /* if timestamp is out of bounds, return error */
-     if(timestamp < 0 || timestamp >= s->duration)
+     if (timestamp < 0 || timestamp >= s->duration)
          return AVERROR(EINVAL);
  
      pos = avio_tell(s->pb);
-     do{
+     do {
          ret = av_read_frame(s, pkt);
-         if (ret < 0){
+         if (ret < 0) {
              avio_seek(s->pb, pos, SEEK_SET);
              return ret;
          }
          pts = pkt->pts;
          av_free_packet(pkt);
-     }while(pts < timestamp);
+     } while(pts < timestamp);
      return 0;
  }
  
diff --combined libavformat/xa.c
index c54d7f8b9c0b2654a4a221af10e0e1680e19d2e1,4c209656b2e929bbb88cf88cdaeaa8ebcb2091ed..f9d9f47ba3033bb2d45d21c87c81dd7e0b12f3cb
@@@ -2,20 -2,20 +2,20 @@@
   * Maxis XA (.xa) File Demuxer
   * Copyright (c) 2008 Robert Marston
   *
 - * 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
   */
  
@@@ -120,7 -120,7 +120,7 @@@ static int xa_read_packet(AVFormatConte
  
  AVInputFormat ff_xa_demuxer = {
      .name           = "xa",
-     .long_name      = NULL_IF_CONFIG_SMALL("Maxis XA File Format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("Maxis XA"),
      .priv_data_size = sizeof(MaxisXADemuxContext),
      .read_probe     = xa_probe,
      .read_header    = xa_read_header,
diff --combined libavformat/yop.c
index c7d3f651925a80a1072e757441e255a1b1d77dab,bffbe181753a0ea7f0e7b62e929e971521858b5e..7fd28af0e2009c89a4501f6ea321aeb31f289ed7
@@@ -5,20 -5,20 +5,20 @@@
   * derived from the code by
   * Copyright (C) 2009 Thomas P. Higdon <thomas.p.higdon@gmail.com>
   *
 - * 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
   */
  
@@@ -38,15 -38,10 +38,15 @@@ typedef struct yop_dec_context 
  static int yop_probe(AVProbeData *probe_packet)
  {
      if (AV_RB16(probe_packet->buf) == AV_RB16("YO")  &&
 +        probe_packet->buf[2]<10                      &&
 +        probe_packet->buf[3]<10                      &&
          probe_packet->buf[6]                         &&
          probe_packet->buf[7]                         &&
          !(probe_packet->buf[8] & 1)                  &&
 -        !(probe_packet->buf[10] & 1))
 +        !(probe_packet->buf[10] & 1)                 &&
 +        AV_RL16(probe_packet->buf + 12 + 6) >= 920    &&
 +        AV_RL16(probe_packet->buf + 12 + 6) < probe_packet->buf[12] * 3 + 4 + probe_packet->buf[7] * 2048
 +    )
          return AVPROBE_SCORE_MAX * 3 / 4;
  
      return 0;
@@@ -211,7 -206,7 +211,7 @@@ static int yop_read_seek(AVFormatContex
  
  AVInputFormat ff_yop_demuxer = {
      .name           = "yop",
-     .long_name      = NULL_IF_CONFIG_SMALL("Psygnosis YOP Format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("Psygnosis YOP"),
      .priv_data_size = sizeof(YopDecContext),
      .read_probe     = yop_probe,
      .read_header    = yop_read_header,
diff --combined libavformat/yuv4mpeg.c
index 21967505d95d4380bd0bafea33a8b4a479eb1f87,f4a9c60168ce3d62e779a47aa6199a349a234ba0..547b0dfcc02595956aea45a854a7e2f8f9573ba0
@@@ -2,25 -2,24 +2,25 @@@
   * YUV4MPEG format
   * Copyright (c) 2001, 2002, 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
   */
  #include "avformat.h"
  #include "internal.h"
 +#include "libavutil/pixdesc.h"
  
  #define Y4M_MAGIC "YUV4MPEG2"
  #define Y4M_FRAME_MAGIC "FRAME"
@@@ -61,9 -60,6 +61,9 @@@ static int yuv4_generate_header(AVForma
      case PIX_FMT_GRAY8:
          colorspace = " Cmono";
          break;
 +    case PIX_FMT_GRAY16:
 +        colorspace = " Cmono16";
 +        break;
      case PIX_FMT_YUV411P:
          colorspace = " C411 XYSCSS=411";
          break;
      case PIX_FMT_YUV444P:
          colorspace = " C444 XYSCSS=444";
          break;
 +    case PIX_FMT_YUV420P9:
 +        colorspace = " C420p9 XYSCSS=420P9";
 +        break;
 +    case PIX_FMT_YUV422P9:
 +        colorspace = " C422p9 XYSCSS=422P9";
 +        break;
 +    case PIX_FMT_YUV444P9:
 +        colorspace = " C444p9 XYSCSS=444P9";
 +        break;
 +    case PIX_FMT_YUV420P10:
 +        colorspace = " C420p10 XYSCSS=420P10";
 +        break;
 +    case PIX_FMT_YUV422P10:
 +        colorspace = " C422p10 XYSCSS=422P10";
 +        break;
 +    case PIX_FMT_YUV444P10:
 +        colorspace = " C444p10 XYSCSS=444P10";
 +        break;
 +    case PIX_FMT_YUV420P16:
 +        colorspace = " C420p16 XYSCSS=420P16";
 +        break;
 +    case PIX_FMT_YUV422P16:
 +        colorspace = " C422p16 XYSCSS=422P16";
 +        break;
 +    case PIX_FMT_YUV444P16:
 +        colorspace = " C444p16 XYSCSS=444P16";
 +        break;
      }
  
      /* construct stream header, if this is the first frame */
@@@ -152,39 -121,12 +152,39 @@@ static int yuv4_write_packet(AVFormatCo
      height = st->codec->height;
  
      ptr = picture->data[0];
 +
 +    switch (st->codec->pix_fmt) {
 +    case PIX_FMT_GRAY8:
 +    case PIX_FMT_YUV411P:
 +    case PIX_FMT_YUV420P:
 +    case PIX_FMT_YUV422P:
 +    case PIX_FMT_YUV444P:
 +        break;
 +    case PIX_FMT_GRAY16:
 +    case PIX_FMT_YUV420P9:
 +    case PIX_FMT_YUV422P9:
 +    case PIX_FMT_YUV444P9:
 +    case PIX_FMT_YUV420P10:
 +    case PIX_FMT_YUV422P10:
 +    case PIX_FMT_YUV444P10:
 +    case PIX_FMT_YUV420P16:
 +    case PIX_FMT_YUV422P16:
 +    case PIX_FMT_YUV444P16:
 +        width *= 2;
 +        break;
 +    default:
 +        av_log(s, AV_LOG_ERROR, "The pixel format '%s' is not supported.\n",
 +               av_get_pix_fmt_name(st->codec->pix_fmt));
 +        return AVERROR(EINVAL);
 +    }
 +
      for (i = 0; i < height; i++) {
          avio_write(pb, ptr, width);
          ptr += picture->linesize[0];
      }
  
 -    if (st->codec->pix_fmt != PIX_FMT_GRAY8) {
 +    if (st->codec->pix_fmt != PIX_FMT_GRAY8 &&
 +        st->codec->pix_fmt != PIX_FMT_GRAY16) {
          // Adjust for smaller Cb and Cr planes
          avcodec_get_chroma_sub_sample(st->codec->pix_fmt, &h_chroma_shift,
                                        &v_chroma_shift);
              ptr2 += picture->linesize[2];
          }
      }
 +
      avio_flush(pb);
      return 0;
  }
@@@ -214,48 -155,15 +214,48 @@@ static int yuv4_write_header(AVFormatCo
      if (s->nb_streams != 1)
          return AVERROR(EIO);
  
 -    if (s->streams[0]->codec->pix_fmt == PIX_FMT_YUV411P) {
 -        av_log(s, AV_LOG_ERROR, "Warning: generating rarely used 4:1:1 YUV "
 +    if (s->streams[0]->codec->codec_id != CODEC_ID_RAWVIDEO) {
 +        av_log(s, AV_LOG_ERROR,
 +               "A non-rawvideo stream was selected, but yuv4mpeg only handles rawvideo streams\n");
 +        return AVERROR(EINVAL);
 +    }
 +
 +    switch (s->streams[0]->codec->pix_fmt) {
 +    case PIX_FMT_YUV411P:
 +        av_log(s, AV_LOG_WARNING, "Warning: generating rarely used 4:1:1 YUV "
                 "stream, some mjpegtools might not work.\n");
 -    } else if ((s->streams[0]->codec->pix_fmt != PIX_FMT_YUV420P) &&
 -               (s->streams[0]->codec->pix_fmt != PIX_FMT_YUV422P) &&
 -               (s->streams[0]->codec->pix_fmt != PIX_FMT_GRAY8)   &&
 -               (s->streams[0]->codec->pix_fmt != PIX_FMT_YUV444P)) {
 -        av_log(s, AV_LOG_ERROR, "ERROR: yuv4mpeg only handles yuv444p, "
 -               "yuv422p, yuv420p, yuv411p and gray pixel formats. "
 +        break;
 +    case PIX_FMT_GRAY8:
 +    case PIX_FMT_GRAY16:
 +    case PIX_FMT_YUV420P:
 +    case PIX_FMT_YUV422P:
 +    case PIX_FMT_YUV444P:
 +        break;
 +    case PIX_FMT_YUV420P9:
 +    case PIX_FMT_YUV422P9:
 +    case PIX_FMT_YUV444P9:
 +    case PIX_FMT_YUV420P10:
 +    case PIX_FMT_YUV422P10:
 +    case PIX_FMT_YUV444P10:
 +    case PIX_FMT_YUV420P16:
 +    case PIX_FMT_YUV422P16:
 +    case PIX_FMT_YUV444P16:
 +        if (s->streams[0]->codec->strict_std_compliance >= FF_COMPLIANCE_NORMAL) {
 +            av_log(s, AV_LOG_ERROR, "'%s' is not a official yuv4mpegpipe pixel format. "
 +                   "Use '-strict -1' to encode to this pixel format.\n",
 +                   av_get_pix_fmt_name(s->streams[0]->codec->pix_fmt));
 +            return AVERROR(EINVAL);
 +        }
 +        av_log(s, AV_LOG_WARNING, "Warning: generating non standart YUV stream. "
 +               "Mjpegtools will not work.\n");
 +        break;
 +    default:
 +        av_log(s, AV_LOG_ERROR, "ERROR: yuv4mpeg can only handle "
 +               "yuv444p, yuv422p, yuv420p, yuv411p and gray8 pixel formats. "
 +               "And using 'strict -1' also yuv444p9, yuv422p9, yuv420p9, "
 +               "yuv444p10, yuv422p10, yuv420p10, "
 +               "yuv444p16, yuv422p16, yuv420p16 "
 +               "and gray16 pixel formats. "
                 "Use -pix_fmt to select one.\n");
          return AVERROR(EIO);
      }
  
  AVOutputFormat ff_yuv4mpegpipe_muxer = {
      .name              = "yuv4mpegpipe",
-     .long_name         = NULL_IF_CONFIG_SMALL("YUV4MPEG pipe format"),
+     .long_name         = NULL_IF_CONFIG_SMALL("YUV4MPEG pipe"),
 -    .mime_type         = "",
      .extensions        = "y4m",
      .priv_data_size    = sizeof(int),
      .audio_codec       = CODEC_ID_NONE,
@@@ -335,40 -244,20 +335,40 @@@ static int yuv4_read_header(AVFormatCon
              } else if (strncmp("420paldv", tokstart, 8) == 0) {
                  pix_fmt = PIX_FMT_YUV420P;
                  chroma_sample_location = AVCHROMA_LOC_TOPLEFT;
 +            } else if (strncmp("420p16", tokstart, 6) == 0) {
 +                pix_fmt = PIX_FMT_YUV420P16;
 +            } else if (strncmp("422p16", tokstart, 6) == 0) {
 +                pix_fmt = PIX_FMT_YUV422P16;
 +            } else if (strncmp("444p16", tokstart, 6) == 0) {
 +                pix_fmt = PIX_FMT_YUV444P16;
 +            } else if (strncmp("420p10", tokstart, 6) == 0) {
 +                pix_fmt = PIX_FMT_YUV420P10;
 +            } else if (strncmp("422p10", tokstart, 6) == 0) {
 +                pix_fmt = PIX_FMT_YUV422P10;
 +            } else if (strncmp("444p10", tokstart, 6) == 0) {
 +                pix_fmt = PIX_FMT_YUV444P10;
 +            } else if (strncmp("420p9", tokstart, 5) == 0) {
 +                pix_fmt = PIX_FMT_YUV420P9;
 +            } else if (strncmp("422p9", tokstart, 5) == 0) {
 +                pix_fmt = PIX_FMT_YUV422P9;
 +            } else if (strncmp("444p9", tokstart, 5) == 0) {
 +                pix_fmt = PIX_FMT_YUV444P9;
              } else if (strncmp("420", tokstart, 3) == 0) {
                  pix_fmt = PIX_FMT_YUV420P;
                  chroma_sample_location = AVCHROMA_LOC_CENTER;
 -            } else if (strncmp("411", tokstart, 3) == 0)
 +            } else if (strncmp("411", tokstart, 3) == 0) {
                  pix_fmt = PIX_FMT_YUV411P;
 -            else if (strncmp("422", tokstart, 3) == 0)
 +            } else if (strncmp("422", tokstart, 3) == 0) {
                  pix_fmt = PIX_FMT_YUV422P;
 -            else if (strncmp("444alpha", tokstart, 8) == 0 ) {
 +            else if (strncmp("444alpha", tokstart, 8) == 0 ) {
                  av_log(s, AV_LOG_ERROR, "Cannot handle 4:4:4:4 "
                         "YUV4MPEG stream.\n");
                  return -1;
 -            } else if (strncmp("444", tokstart, 3) == 0)
 +            } else if (strncmp("444", tokstart, 3) == 0) {
                  pix_fmt = PIX_FMT_YUV444P;
 -            else if (strncmp("mono", tokstart, 4) == 0) {
 +            } else if (strncmp("mono16", tokstart, 6) == 0) {
 +                pix_fmt = PIX_FMT_GRAY16;
 +            } else if (strncmp("mono", tokstart, 4) == 0) {
                  pix_fmt = PIX_FMT_GRAY8;
              } else {
                  av_log(s, AV_LOG_ERROR, "YUV4MPEG stream contains an unknown "
                      alt_pix_fmt = PIX_FMT_YUV420P;
                  else if (strncmp("420PALDV", tokstart, 8) == 0)
                      alt_pix_fmt = PIX_FMT_YUV420P;
 +                else if (strncmp("420P9", tokstart, 5) == 0)
 +                    alt_pix_fmt = PIX_FMT_YUV420P9;
 +                else if (strncmp("422P9", tokstart, 5) == 0)
 +                    alt_pix_fmt = PIX_FMT_YUV422P9;
 +                else if (strncmp("444P9", tokstart, 5) == 0)
 +                    alt_pix_fmt = PIX_FMT_YUV444P9;
 +                else if (strncmp("420P10", tokstart, 6) == 0)
 +                    alt_pix_fmt = PIX_FMT_YUV420P10;
 +                else if (strncmp("422P10", tokstart, 6) == 0)
 +                    alt_pix_fmt = PIX_FMT_YUV422P10;
 +                else if (strncmp("444P10", tokstart, 6) == 0)
 +                    alt_pix_fmt = PIX_FMT_YUV444P10;
 +                else if (strncmp("420P16", tokstart, 6) == 0)
 +                    alt_pix_fmt = PIX_FMT_YUV420P16;
 +                else if (strncmp("422P16", tokstart, 6) == 0)
 +                    alt_pix_fmt = PIX_FMT_YUV422P16;
 +                else if (strncmp("444P16", tokstart, 6) == 0)
 +                    alt_pix_fmt = PIX_FMT_YUV444P16;
                  else if (strncmp("411", tokstart, 3) == 0)
                      alt_pix_fmt = PIX_FMT_YUV411P;
                  else if (strncmp("422", tokstart, 3) == 0)
@@@ -543,7 -414,7 +543,7 @@@ static int yuv4_probe(AVProbeData *pd
  #if CONFIG_YUV4MPEGPIPE_DEMUXER
  AVInputFormat ff_yuv4mpegpipe_demuxer = {
      .name           = "yuv4mpegpipe",
-     .long_name      = NULL_IF_CONFIG_SMALL("YUV4MPEG pipe format"),
+     .long_name      = NULL_IF_CONFIG_SMALL("YUV4MPEG pipe"),
      .priv_data_size = sizeof(struct frame_attributes),
      .read_probe     = yuv4_probe,
      .read_header    = yuv4_read_header,
diff --combined libswscale/swscale.c
index 8c4c934dd09b607f2d4c49d6125e7bfeef32a1b5,0f8ef2b15cbdb1714f26a8ed49b08cc150525d25..5a28ce1d5873101f006e3bf10acb4eb37f802052
@@@ -1,20 -1,20 +1,20 @@@
  /*
 - * Copyright (C) 2001-2003 Michael Niedermayer <michaelni@gmx.at>
 + * Copyright (C) 2001-2011 Michael Niedermayer <michaelni@gmx.at>
   *
 - * 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
   */
  
@@@ -24,7 -24,6 +24,7 @@@
  #include <stdio.h>
  #include <string.h>
  
 +#include "libavutil/avassert.h"
  #include "libavutil/avutil.h"
  #include "libavutil/bswap.h"
  #include "libavutil/cpu.h"
@@@ -72,9 -71,6 +72,9 @@@ static void hScale16To19_c(SwsContext *
      int bits            = av_pix_fmt_descriptors[c->srcFormat].comp[0].depth_minus1;
      int sh              = bits - 4;
  
 +    if((isAnyRGB(c->srcFormat) || c->srcFormat==PIX_FMT_PAL8) && av_pix_fmt_descriptors[c->srcFormat].comp[0].depth_minus1<15)
 +        sh= 9;
 +
      for (i = 0; i < dstW; i++) {
          int j;
          int srcPos = filterPos[i];
@@@ -96,9 -92,6 +96,9 @@@ static void hScale16To15_c(SwsContext *
      const uint16_t *src = (const uint16_t *) _src;
      int sh              = av_pix_fmt_descriptors[c->srcFormat].comp[0].depth_minus1;
  
 +    if(sh<15)
 +        sh= isAnyRGB(c->srcFormat) || c->srcFormat==PIX_FMT_PAL8 ? 13 : av_pix_fmt_descriptors[c->srcFormat].comp[0].depth_minus1;
 +
      for (i = 0; i < dstW; i++) {
          int j;
          int srcPos = filterPos[i];
@@@ -215,7 -208,7 +215,7 @@@ static void lumRangeFromJpeg16_c(int16_
      int i;
      int32_t *dst = (int32_t *) _dst;
      for (i = 0; i < width; i++)
 -        dst[i] = (dst[i] * 14071 + (33561947 << 4)) >> 14;
 +        dst[i] = (dst[i]*(14071/4) + (33561947<<4)/4)>>12;
  }
  
  static void hyscale_fast_c(SwsContext *c, int16_t *dst, int dstWidth,
          dst[i] = (src[xx] << 7) + (src[xx + 1] - src[xx]) * xalpha;
          xpos  += xInc;
      }
 +    for (i=dstWidth-1; (i*xInc)>>16 >=srcW-1; i--)
 +        dst[i] = src[srcW-1]*128;
  }
  
  // *** horizontal scale Y line to temp buffer
@@@ -243,13 -234,13 +243,13 @@@ static av_always_inline void hyscale(Sw
                                       uint8_t *formatConvBuffer,
                                       uint32_t *pal, int isAlpha)
  {
 -    void (*toYV12)(uint8_t *, const uint8_t *, int, uint32_t *) =
 +    void (*toYV12)(uint8_t *, const uint8_t *, const uint8_t *, const uint8_t *, int, uint32_t *) =
          isAlpha ? c->alpToYV12 : c->lumToYV12;
      void (*convertRange)(int16_t *, int) = isAlpha ? NULL : c->lumConvertRange;
      const uint8_t *src = src_in[isAlpha ? 3 : 0];
  
      if (toYV12) {
 -        toYV12(formatConvBuffer, src, srcW, pal);
 +        toYV12(formatConvBuffer, src, src_in[1], src_in[2], srcW, pal);
          src = formatConvBuffer;
      } else if (c->readLumPlanar && !isAlpha) {
          c->readLumPlanar(formatConvBuffer, src_in, srcW);
@@@ -280,10 -271,6 +280,10 @@@ static void hcscale_fast_c(SwsContext *
          dst2[i] = (src2[xx] * (xalpha ^ 127) + src2[xx + 1] * xalpha);
          xpos   += xInc;
      }
 +    for (i=dstWidth-1; (i*xInc)>>16 >=srcW-1; i--) {
 +        dst1[i] = src1[srcW-1]*128;
 +        dst2[i] = src2[srcW-1]*128;
 +    }
  }
  
  static av_always_inline void hcscale(SwsContext *c, int16_t *dst1,
      const uint8_t *src1 = src_in[1], *src2 = src_in[2];
      if (c->chrToYV12) {
          uint8_t *buf2 = formatConvBuffer +
 -                        FFALIGN(srcW * FFALIGN(c->srcBpc, 8) >> 3, 16);
 -        c->chrToYV12(formatConvBuffer, buf2, src1, src2, srcW, pal);
 -        src1 = formatConvBuffer;
 -        src2 = buf2;
 +                        FFALIGN(srcW*2+78, 16);
 +        c->chrToYV12(formatConvBuffer, buf2, src_in[0], src1, src2, srcW, pal);
 +        src1= formatConvBuffer;
 +        src2= buf2;
      } else if (c->readChrPlanar) {
          uint8_t *buf2 = formatConvBuffer +
 -                        FFALIGN(srcW * FFALIGN(c->srcBpc, 8) >> 3, 16);
 +                        FFALIGN(srcW*2+78, 16);
          c->readChrPlanar(formatConvBuffer, buf2, src_in, srcW);
          src1 = formatConvBuffer;
          src2 = buf2;
@@@ -405,8 -392,8 +405,8 @@@ static int swScale(SwsContext *c, cons
      DEBUG_BUFFERS("vLumFilterSize: %d vLumBufSize: %d vChrFilterSize: %d vChrBufSize: %d\n",
                    vLumFilterSize, vLumBufSize, vChrFilterSize, vChrBufSize);
  
 -    if (dstStride[0] % 8 != 0 || dstStride[1] % 8 != 0 ||
 -        dstStride[2] % 8 != 0 || dstStride[3] % 8 != 0) {
 +    if (dstStride[0]%16 !=0 || dstStride[1]%16 !=0 ||
 +        dstStride[2]%16 !=0 || dstStride[3]%16 != 0) {
          static int warnedAlready = 0; // FIXME maybe move this into the context
          if (flags & SWS_PRINT_INFO && !warnedAlready) {
              av_log(c, AV_LOG_WARNING,
          }
      }
  
 +    if ((int)dst[0]%16 || (int)dst[1]%16 || (int)dst[2]%16 || (int)src[0]%16 || (int)src[1]%16 || (int)src[2]%16
 +        || dstStride[0]%16 || dstStride[1]%16 || dstStride[2]%16 || dstStride[3]%16
 +        || srcStride[0]%16 || srcStride[1]%16 || srcStride[2]%16 || srcStride[3]%16
 +    ) {
 +        static int warnedAlready=0;
 +        int cpu_flags = av_get_cpu_flags();
 +        if (HAVE_MMX2 && (cpu_flags & AV_CPU_FLAG_SSE2) && !warnedAlready){
 +            av_log(c, AV_LOG_WARNING, "Warning: data is not aligned! This can lead to a speedloss\n");
 +            warnedAlready=1;
 +        }
 +    }
 +
      /* Note the user might start scaling the picture in the middle so this
       * will not get executed. This is not really intended but works
       * currently, so people might do it. */
              dst[2] + dstStride[2] * chrDstY,
              (CONFIG_SWSCALE_ALPHA && alpPixBuf) ? dst[3] + dstStride[3] * dstY : NULL,
          };
 +        int use_mmx_vfilter= c->use_mmx_vfilter;
  
          // First line needed as input
          const int firstLumSrcY  = FFMAX(1 - vLumFilterSize, vLumFilterPos[dstY]);
               * this array's tail */
              ff_sws_init_output_funcs(c, &yuv2plane1, &yuv2planeX, &yuv2nv12cX,
                                       &yuv2packed1, &yuv2packed2, &yuv2packedX);
 +            use_mmx_vfilter= 0;
          }
  
          {
 -            const int16_t **lumSrcPtr  = (const int16_t **)lumPixBuf  + lumBufIndex + firstLumSrcY - lastInLumBuf + vLumBufSize;
 -            const int16_t **chrUSrcPtr = (const int16_t **)chrUPixBuf + chrBufIndex + firstChrSrcY - lastInChrBuf + vChrBufSize;
 -            const int16_t **chrVSrcPtr = (const int16_t **)chrVPixBuf + chrBufIndex + firstChrSrcY - lastInChrBuf + vChrBufSize;
 +            const int16_t **lumSrcPtr  = (const int16_t **)(void*) lumPixBuf  + lumBufIndex + firstLumSrcY - lastInLumBuf + vLumBufSize;
 +            const int16_t **chrUSrcPtr = (const int16_t **)(void*) chrUPixBuf + chrBufIndex + firstChrSrcY - lastInChrBuf + vChrBufSize;
 +            const int16_t **chrVSrcPtr = (const int16_t **)(void*) chrVPixBuf + chrBufIndex + firstChrSrcY - lastInChrBuf + vChrBufSize;
              const int16_t **alpSrcPtr  = (CONFIG_SWSCALE_ALPHA && alpPixBuf) ?
 -                                         (const int16_t **)alpPixBuf  + lumBufIndex + firstLumSrcY - lastInLumBuf + vLumBufSize : NULL;
 -
 -            if (firstLumSrcY < 0 || firstLumSrcY + vLumFilterSize > c->srcH) {
 -                const int16_t **tmpY = (const int16_t **)lumPixBuf +
 -                                       2 * vLumBufSize;
 -                int neg = -firstLumSrcY, i;
 -                int end = FFMIN(c->srcH - firstLumSrcY, vLumFilterSize);
 -                for (i = 0; i < neg; i++)
 -                    tmpY[i] = lumSrcPtr[neg];
 -                for (; i < end; i++)
 -                    tmpY[i] = lumSrcPtr[i];
 -                for (; i < vLumFilterSize; i++)
 -                    tmpY[i] = tmpY[i - 1];
 -                lumSrcPtr = tmpY;
 -
 -                if (alpSrcPtr) {
 -                    const int16_t **tmpA = (const int16_t **)alpPixBuf +
 -                                           2 * vLumBufSize;
 -                    for (i = 0; i < neg; i++)
 -                        tmpA[i] = alpSrcPtr[neg];
 -                    for (; i < end; i++)
 -                        tmpA[i] = alpSrcPtr[i];
 -                    for (; i < vLumFilterSize; i++)
 -                        tmpA[i] = tmpA[i - 1];
 -                    alpSrcPtr = tmpA;
 -                }
 -            }
 -            if (firstChrSrcY < 0 ||
 -                firstChrSrcY + vChrFilterSize > c->chrSrcH) {
 -                const int16_t **tmpU = (const int16_t **)chrUPixBuf + 2 * vChrBufSize,
 -                **tmpV               = (const int16_t **)chrVPixBuf + 2 * vChrBufSize;
 -                int neg = -firstChrSrcY, i;
 -                int end = FFMIN(c->chrSrcH - firstChrSrcY, vChrFilterSize);
 -                for (i = 0; i < neg; i++) {
 -                    tmpU[i] = chrUSrcPtr[neg];
 -                    tmpV[i] = chrVSrcPtr[neg];
 -                }
 -                for (; i < end; i++) {
 -                    tmpU[i] = chrUSrcPtr[i];
 -                    tmpV[i] = chrVSrcPtr[i];
 -                }
 -                for (; i < vChrFilterSize; i++) {
 -                    tmpU[i] = tmpU[i - 1];
 -                    tmpV[i] = tmpV[i - 1];
 -                }
 -                chrUSrcPtr = tmpU;
 -                chrVSrcPtr = tmpV;
 -            }
 +                                         (const int16_t **)(void*) alpPixBuf + lumBufIndex + firstLumSrcY - lastInLumBuf + vLumBufSize : NULL;
 +            int16_t *vLumFilter = c->vLumFilter;
 +            int16_t *vChrFilter = c->vChrFilter;
  
              if (isPlanarYUV(dstFormat) ||
                  (isGray(dstFormat) && !isALPHA(dstFormat))) { // YV12 like
                  const int chrSkipMask = (1 << c->chrDstVSubSample) - 1;
  
 +                vLumFilter +=    dstY * vLumFilterSize;
 +                vChrFilter += chrDstY * vChrFilterSize;
 +
 +//                 av_assert0(use_mmx_vfilter != (
 +//                                yuv2planeX == yuv2planeX_10BE_c
 +//                             || yuv2planeX == yuv2planeX_10LE_c
 +//                             || yuv2planeX == yuv2planeX_9BE_c
 +//                             || yuv2planeX == yuv2planeX_9LE_c
 +//                             || yuv2planeX == yuv2planeX_16BE_c
 +//                             || yuv2planeX == yuv2planeX_16LE_c
 +//                             || yuv2planeX == yuv2planeX_8_c) || !ARCH_X86);
 +
 +                if(use_mmx_vfilter){
 +                    vLumFilter= c->lumMmxFilter;
 +                    vChrFilter= c->chrMmxFilter;
 +                }
 +
                  if (vLumFilterSize == 1) {
                      yuv2plane1(lumSrcPtr[0], dest[0], dstW, c->lumDither8, 0);
                  } else {
 -                    yuv2planeX(vLumFilter + dstY * vLumFilterSize,
 -                               vLumFilterSize, lumSrcPtr, dest[0],
 +                    yuv2planeX(vLumFilter, vLumFilterSize,
 +                               lumSrcPtr, dest[0],
                                 dstW, c->lumDither8, 0);
                  }
  
                  if (!((dstY & chrSkipMask) || isGray(dstFormat))) {
                      if (yuv2nv12cX) {
 -                        yuv2nv12cX(c, vChrFilter + chrDstY * vChrFilterSize,
 +                        yuv2nv12cX(c, vChrFilter,
                                     vChrFilterSize, chrUSrcPtr, chrVSrcPtr,
                                     dest[1], chrDstW);
                      } else if (vChrFilterSize == 1) {
                          yuv2plane1(chrUSrcPtr[0], dest[1], chrDstW, c->chrDither8, 0);
                          yuv2plane1(chrVSrcPtr[0], dest[2], chrDstW, c->chrDither8, 3);
                      } else {
 -                        yuv2planeX(vChrFilter + chrDstY * vChrFilterSize,
 +                        yuv2planeX(vChrFilter,
                                     vChrFilterSize, chrUSrcPtr, dest[1],
                                     chrDstW, c->chrDither8, 0);
 -                        yuv2planeX(vChrFilter + chrDstY * vChrFilterSize,
 +                        yuv2planeX(vChrFilter,
                                     vChrFilterSize, chrVSrcPtr, dest[2],
 -                                   chrDstW, c->chrDither8, 3);
 +                                   chrDstW, c->chrDither8, use_mmx_vfilter ? (c->uv_offx2 >> 1) : 3);
                      }
                  }
  
                  if (CONFIG_SWSCALE_ALPHA && alpPixBuf) {
 +                    if(use_mmx_vfilter){
 +                        vLumFilter= c->alpMmxFilter;
 +                    }
                      if (vLumFilterSize == 1) {
                          yuv2plane1(alpSrcPtr[0], dest[3], dstW,
                                     c->lumDither8, 0);
                      } else {
 -                        yuv2planeX(vLumFilter + dstY * vLumFilterSize,
 +                        yuv2planeX(vLumFilter,
                                     vLumFilterSize, alpSrcPtr, dest[3],
                                     dstW, c->lumDither8, 0);
                      }
      if (isPlanar(dstFormat) && isALPHA(dstFormat) && !alpPixBuf)
          fillPlane(dst[3], dstStride[3], dstW, dstY - lastDstY, lastDstY, 255);
  
- #if HAVE_MMX2
+ #if HAVE_MMX2 && HAVE_INLINE_ASM
      if (av_get_cpu_flags() & AV_CPU_FLAG_MMX2)
          __asm__ volatile ("sfence" ::: "memory");
  #endif
@@@ -689,9 -687,8 +689,9 @@@ static av_cold void sws_init_swScale_c(
  
      ff_sws_init_input_funcs(c);
  
 +
      if (c->srcBpc == 8) {
 -        if (c->dstBpc <= 10) {
 +        if (c->dstBpc <= 14) {
              c->hyScale = c->hcScale = hScale8To15_c;
              if (c->flags & SWS_FAST_BILINEAR) {
                  c->hyscale_fast = hyscale_fast_c;
              c->hyScale = c->hcScale = hScale8To19_c;
          }
      } else {
 -        c->hyScale = c->hcScale = c->dstBpc > 10 ? hScale16To19_c
 +        c->hyScale = c->hcScale = c->dstBpc > 14 ? hScale16To19_c
                                                   : hScale16To15_c;
      }
  
      if (c->srcRange != c->dstRange && !isAnyRGB(c->dstFormat)) {
 -        if (c->dstBpc <= 10) {
 +        if (c->dstBpc <= 14) {
              if (c->srcRange) {
                  c->lumConvertRange = lumRangeFromJpeg_c;
                  c->chrConvertRange = chrRangeFromJpeg_c;
diff --combined tests/fate/filter.mak
index c3e368cc24857a952b9cccc9a99e502c02448936,35b65588c8662bfb8d36a52e98f8bfe5469dba8a..73b317b347b62c7f59bb2fb11df61ea4c7be3a8f
@@@ -1,28 -1,29 +1,29 @@@
  FATE_AMIX += fate-filter-amix-simple
 -fate-filter-amix-simple: CMD = avconv -filter_complex amix -i $(SRC) -ss 3 -i $(SRC1) -f f32le -
 +fate-filter-amix-simple: CMD = ffmpeg -filter_complex amix -i $(SRC) -ss 3 -i $(SRC1) -f f32le -
  fate-filter-amix-simple: REF = $(SAMPLES)/filter/amix_simple.pcm
  
  FATE_AMIX += fate-filter-amix-first
 -fate-filter-amix-first: CMD = avconv -filter_complex amix=duration=first -ss 4 -i $(SRC) -i $(SRC1) -f f32le -
 +fate-filter-amix-first: CMD = ffmpeg -filter_complex amix=duration=first -ss 4 -i $(SRC) -i $(SRC1) -f f32le -
  fate-filter-amix-first: REF = $(SAMPLES)/filter/amix_first.pcm
  
  FATE_AMIX += fate-filter-amix-transition
  fate-filter-amix-transition: tests/data/asynth-44100-2-3.wav
  fate-filter-amix-transition: SRC2 = $(TARGET_PATH)/tests/data/asynth-44100-2-3.wav
 -fate-filter-amix-transition: CMD = avconv -filter_complex amix=inputs=3:dropout_transition=0.5 -i $(SRC) -ss 2 -i $(SRC1) -ss 4 -i $(SRC2) -f f32le -
 +fate-filter-amix-transition: CMD = ffmpeg -filter_complex amix=inputs=3:dropout_transition=0.5 -i $(SRC) -ss 2 -i $(SRC1) -ss 4 -i $(SRC2) -f f32le -
  fate-filter-amix-transition: REF = $(SAMPLES)/filter/amix_transition.pcm
  
  $(FATE_AMIX): tests/data/asynth-44100-2.wav tests/data/asynth-44100-2-2.wav
  $(FATE_AMIX): SRC  = $(TARGET_PATH)/tests/data/asynth-44100-2.wav
  $(FATE_AMIX): SRC1 = $(TARGET_PATH)/tests/data/asynth-44100-2-2.wav
  $(FATE_AMIX): CMP  = oneoff
+ $(FATE_AMIX): CMP_UNIT = f32
  
  FATE_FILTER += $(FATE_AMIX)
  FATE_SAMPLES_AVCONV += $(FATE_AMIX)
  
  FATE_ASYNCTS += fate-filter-asyncts
  fate-filter-asyncts: SRC = $(SAMPLES)/nellymoser/nellymoser-discont.flv
 -fate-filter-asyncts: CMD = pcm -analyzeduration 10000000 -i $(SRC) -af asyncts
 +fate-filter-asyncts: CMD = pcm -i $(SRC) -af aresample=min_comp=0.001:min_hard_comp=0.1
  fate-filter-asyncts: CMP = oneoff
  fate-filter-asyncts: REF = $(SAMPLES)/nellymoser/nellymoser-discont.pcm
  
diff --combined tests/tiny_psnr.c
index 4f307b02b2b8fe126a0ebae44892bc2ada990ee6,5db266247823c72f9d2866031eae99710269cc23..b4d05d300d24567ce9ddf7f1037d73b52ee1edda
@@@ -1,20 -1,20 +1,20 @@@
  /*
   * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
   *
 - * 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
   */
  
@@@ -24,6 -24,8 +24,8 @@@
  #include <inttypes.h>
  #include <assert.h>
  
+ #include "libavutil/intfloat.h"
  #define FFMIN(a, b) ((a) > (b) ? (b) : (a))
  #define F 100
  #define SIZE 2048
@@@ -52,21 -54,6 +54,21 @@@ uint64_t exp16_table[21] = 
      582360139072LL,
  };
  
 +#if 0
 +// 16.16 fixpoint exp()
 +static unsigned int exp16(unsigned int a){
 +    int i;
 +    int out= 1<<16;
 +
 +    for(i=19;i>=0;i--){
 +        if(a&(1<<i))
 +            out= (out*exp16_table[i] + (1<<15))>>16;
 +    }
 +
 +    return out;
 +}
 +#endif
 +
  // 16.16 fixpoint log()
  static int64_t log16(uint64_t a)
  {
@@@ -103,59 -90,112 +105,82 @@@ static uint64_t int_sqrt(uint64_t a
      return ret;
  }
  
 -int main(int argc, char *argv[])
+ static int16_t get_s16l(uint8_t *p)
+ {
+     union {
+         uint16_t u;
+         int16_t  s;
+     } v;
+     v.u = p[0] | p[1] << 8;
+     return v.s;
+ }
+ static float get_f32l(uint8_t *p)
+ {
+     union av_intfloat32 v;
+     v.i = p[0] | p[1] << 8 | p[2] << 16 | p[3] << 24;
+     return v.f;
+ }
 +static int run_psnr(FILE *f[2], int len, int shift, int skip_bytes)
  {
      int i, j;
      uint64_t sse = 0;
      uint64_t dev;
 -    FILE *f[2];
      uint8_t buf[2][SIZE];
      uint64_t psnr;
 -    int len = 1;
 -    int64_t max;
 -    int shift      = argc < 5 ? 0 : atoi(argv[4]);
 -    int skip_bytes = argc < 6 ? 0 : atoi(argv[5]);
 +    int64_t max    = (1 << (8 * len)) - 1;
      int size0      = 0;
      int size1      = 0;
      int maxdist    = 0;
 +    int noseek;
  
 -    if (argc < 3) {
 -        printf("tiny_psnr <file1> <file2> [<elem size> [<shift> [<skip bytes>]]]\n");
 -        printf("WAV headers are skipped automatically.\n");
 -        return 1;
 -    }
 -
 -    if (argc > 3) {
 -        if (!strcmp(argv[3], "u8")) {
 -            len = 1;
 -        } else if (!strcmp(argv[3], "s16")) {
 -            len = 2;
 -        } else if (!strcmp(argv[3], "f32")) {
 -            len = 4;
 -        } else {
 -            char *end;
 -            len = strtol(argv[3], &end, 0);
 -            if (*end || len > 2) {
 -                fprintf(stderr, "Unsupported sample format: %s\n", argv[3]);
 -                return 1;
 -            }
 -        }
 -    }
 -
 -    max = (1 << (8 * len)) - 1;
 -
 -    f[0] = fopen(argv[1], "rb");
 -    f[1] = fopen(argv[2], "rb");
 -    if (!f[0] || !f[1]) {
 -        fprintf(stderr, "Could not open input files.\n");
 -        return 1;
 -    }
 +    noseek = fseek(f[0], 0, SEEK_SET) ||
 +             fseek(f[1], 0, SEEK_SET);
  
 -    for (i = 0; i < 2; i++) {
 -        uint8_t *p = buf[i];
 -        if (fread(p, 1, 12, f[i]) != 12)
 -            return 1;
 -        if (!memcmp(p, "RIFF", 4) &&
 -            !memcmp(p + 8, "WAVE", 4)) {
 -            if (fread(p, 1, 8, f[i]) != 8)
 +    if (!noseek) {
 +        for (i = 0; i < 2; i++) {
 +            uint8_t *p = buf[i];
 +            if (fread(p, 1, 12, f[i]) != 12)
                  return 1;
 -            while (memcmp(p, "data", 4)) {
 -                int s = p[4] | p[5] << 8 | p[6] << 16 | p[7] << 24;
 -                fseek(f[i], s, SEEK_CUR);
 +            if (!memcmp(p, "RIFF", 4) &&
 +                !memcmp(p + 8, "WAVE", 4)) {
                  if (fread(p, 1, 8, f[i]) != 8)
                      return 1;
 +                while (memcmp(p, "data", 4)) {
 +                    int s = p[4] | p[5] << 8 | p[6] << 16 | p[7] << 24;
 +                    fseek(f[i], s, SEEK_CUR);
 +                    if (fread(p, 1, 8, f[i]) != 8)
 +                        return 1;
 +                }
 +            } else {
 +                fseek(f[i], -12, SEEK_CUR);
              }
 -        } else {
 -            fseek(f[i], -12, SEEK_CUR);
          }
 -    }
  
 -    fseek(f[shift < 0], abs(shift), SEEK_CUR);
 +        fseek(f[shift < 0], abs(shift), SEEK_CUR);
  
 -    fseek(f[0], skip_bytes, SEEK_CUR);
 -    fseek(f[1], skip_bytes, SEEK_CUR);
 +        fseek(f[0], skip_bytes, SEEK_CUR);
 +        fseek(f[1], skip_bytes, SEEK_CUR);
 +    }
  
      for (;;) {
          int s0 = fread(buf[0], 1, SIZE, f[0]);
          int s1 = fread(buf[1], 1, SIZE, f[1]);
  
-         for (j = 0; j < FFMIN(s0, s1); j++) {
+         for (j = 0; j < FFMIN(s0, s1); j += len) {
              int64_t a = buf[0][j];
              int64_t b = buf[1][j];
              int dist;
              if (len == 2) {
-                 a = (int16_t)(a | (buf[0][++j] << 8));
-                 b = (int16_t)(b | (buf[1][  j] << 8));
+                 a = get_s16l(buf[0] + j);
+                 b = get_s16l(buf[1] + j);
+             } else if (len == 4) {
+                 a = get_f32l(buf[0] + j) * (1 << 24);
+                 b = get_f32l(buf[1] + j) * (1 << 24);
+             } else {
+                 a = buf[0][j];
+                 b = buf[1][j];
              }
              sse += (a - b) * (a - b);
              dist = abs(a - b);
             (int)(dev / F), (int)(dev % F),
             (int)(psnr / F), (int)(psnr % F),
             maxdist, size0, size1);
-     int len        = argc < 4 ? 1 : atoi(argv[3]);
 +    return psnr;
 +}
 +
 +int main(int argc, char *argv[])
 +{
 +    FILE *f[2];
++    int len = 1;
 +    int shift_first= argc < 5 ? 0 : atoi(argv[4]);
 +    int skip_bytes = argc < 6 ? 0 : atoi(argv[5]);
 +    int shift_last = shift_first + (argc < 7 ? 0 : atoi(argv[6]));
 +    int shift;
 +    int max_psnr   = -1;
 +    int max_psnr_shift = 0;
 +
++    if (argc > 3) {
++        if (!strcmp(argv[3], "u8")) {
++            len = 1;
++        } else if (!strcmp(argv[3], "s16")) {
++            len = 2;
++        } else if (!strcmp(argv[3], "f32")) {
++            len = 4;
++        } else {
++            char *end;
++            len = strtol(argv[3], &end, 0);
++            if (*end || len > 2) {
++                fprintf(stderr, "Unsupported sample format: %s\n", argv[3]);
++                return 1;
++            }
++        }
++    }
++
 +    if (argc < 3) {
 +        printf("tiny_psnr <file1> <file2> [<elem size> [<shift> [<skip bytes> [<shift search range>]]]]\n");
 +        printf("WAV headers are skipped automatically.\n");
 +        return 1;
 +    }
 +
 +    f[0] = fopen(argv[1], "rb");
 +    f[1] = fopen(argv[2], "rb");
 +    if (!f[0] || !f[1]) {
 +        fprintf(stderr, "Could not open input files.\n");
 +        return 1;
 +    }
 +
 +    for (shift = shift_first; shift <= shift_last; shift++) {
 +        int psnr = run_psnr(f, len, shift, skip_bytes);
 +        if (psnr > max_psnr || (shift < 0 && psnr == max_psnr)) {
 +            max_psnr = psnr;
 +            max_psnr_shift = shift;
 +        }
 +    }
 +    if (shift_last > shift_first)
 +        printf("Best PSNR is %3d.%02d for shift %i\n", (int)(max_psnr / F), (int)(max_psnr % F), max_psnr_shift);
      return 0;
  }