Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Wed, 21 Dec 2011 23:48:38 +0000 (00:48 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Thu, 22 Dec 2011 00:51:53 +0000 (01:51 +0100)
* qatar/master: (27 commits)
  asfdec: add side data to ASFStream packet instead of output packet.
  idroqdec: set AVFMTCTX_NOHEADER and create streams as they occur.
  nellymoserdec: Indicate that the decoder can handle changed parameters
  libavcodec: Apply parameter change side data when decoding audio
  flvdec: Add param change side data if the sample rate or channels have changed
  libavformat: Add a utility function for adding parameter change side data
  libavcodec: Define a side data type for parameter changes
  aacdec: Handle new extradata passed as side data
  flvdec: Export new AAC/H.264 extradata as side data on the next packet
  libavcodec: Define a side data type for new extradata
  flacdec: skip all track indices at once instead of looping.
  mxf: Add PictureEssenceCoding UL for V210.
  mxfdec: consider QuantizationBits between 17 and 24 to be pcm_s24*
  mxfenc: Add support for MPEG-2 MP@HL-14 in mxf container.
  mxf: H.264/MPEG-4 AVC Intra support
  configure: Show whether the safe bitstream reader is enabled
  x86: Tighten register constraints for decode_significance*_x86.
  Replace Subversion revisions in comments by Git hashes.
  h264_cabac: synchronize decode_significance_*_x86 conditionals
  w32threads: wait for the waked thread in pthread_cond_signal.
  ...

Conflicts:
libavcodec/avcodec.h
libavcodec/version.h
libavformat/flvdec.c
libavformat/utils.c
tests/ref/lavfi/pixdesc
tests/ref/lavfi/pixfmts_copy
tests/ref/lavfi/pixfmts_null
tests/ref/lavfi/pixfmts_scale
tests/ref/lavfi/pixfmts_vflip

Merged-by: Michael Niedermayer <michaelni@gmx.at>
22 files changed:
1  2 
configure
libavcodec/aacdec.c
libavcodec/avcodec.h
libavcodec/h264.c
libavcodec/h264_cabac.c
libavcodec/lpc.c
libavcodec/nellymoserdec.c
libavcodec/utils.c
libavcodec/version.h
libavcodec/wmalosslessdec.c
libavcodec/x86/h264_i386.h
libavformat/asfdec.c
libavformat/flacdec.c
libavformat/flv.h
libavformat/flvdec.c
libavformat/idroqdec.c
libavformat/internal.h
libavformat/network.c
libavformat/utils.c
libavutil/aes.c
libpostproc/postprocess_altivec_template.c
libpostproc/postprocess_template.c

diff --combined configure
+++ b/configure
@@@ -1,6 -1,6 +1,6 @@@
  #!/bin/sh
  #
 -# Libav configure script
 +# FFmpeg configure script
  #
  # Copyright (c) 2000-2002 Fabrice Bellard
  # Copyright (c) 2005-2008 Diego Biurrun
@@@ -44,9 -44,9 +44,9 @@@ if test "$E1" != 0 || test "$E2" = 0; t
      echo "No compatible shell script interpreter found."
      echo "This configure script requires a POSIX-compatible shell"
      echo "such as bash or ksh."
 -    echo "THIS IS NOT A BUG IN LIBAV, DO NOT REPORT IT AS SUCH."
 +    echo "THIS IS NOT A BUG IN FFMPEG, DO NOT REPORT IT AS SUCH."
      echo "Instead, install a working POSIX-compatible shell."
 -    echo "Disabling this configure test will create a broken Libav."
 +    echo "Disabling this configure test will create a broken FFmpeg."
      if test "$BASH_VERSION" = '2.04.0(1)-release'; then
          echo "This bash version ($BASH_VERSION) is broken on your platform."
          echo "Upgrade to a later version if available."
@@@ -65,7 -65,7 +65,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]
@@@ -81,20 -81,18 +81,20 @@@ Configuration options
                             and binaries will be unredistributable [no]
    --disable-doc            do not build documentation
    --disable-ffmpeg         disable ffmpeg build
 -  --disable-avconv         disable avconv build
 -  --disable-avplay         disable avplay build
 -  --disable-avprobe        disable avprobe build
 -  --disable-avserver       disable avserver build
 +  --enable-avconv          enable  avconv build
 +  --disable-ffplay         disable ffplay build
 +  --disable-ffprobe        disable ffprobe build
 +  --disable-ffserver       disable ffserver build
    --disable-avdevice       disable libavdevice build
    --disable-avcodec        disable libavcodec build
    --disable-avformat       disable libavformat build
 +  --disable-swresample     disable libswresample build
    --disable-swscale        disable libswscale build
    --disable-postproc       disable libpostproc build
    --disable-avfilter       disable video filter support [no]
    --disable-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]
    --enable-gray            enable full grayscale support (slower color)
    --disable-lpc            disable LPC code
    --disable-mdct           disable MDCT code
    --disable-rdft           disable RDFT 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]
    --disable-dxva2          disable DXVA2 code
 +  --disable-vda            disable VDA code
    --enable-runtime-cpudetect detect cpu capabilities at runtime (bigger binary)
    --enable-hardcoded-tables use hardcoded tables instead of runtime generation
    --disable-safe-bitstream-reader
@@@ -170,9 -167,6 +170,9 @@@ External library support
    --enable-bzlib           enable bzlib [autodetect]
    --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-libcelt         enable CELT decoding via libcelt [no]
    --enable-libopencore-amrnb enable AMR-NB de/encoding via libopencore-amrnb [no]
    --enable-libopencore-amrwb enable AMR-WB decoding via libopencore-amrwb [no]
    --enable-libopencv       enable video filtering via libopencv [no]
    --enable-libfaac         enable FAAC support via libfaac [no]
    --enable-libfreetype     enable libfreetype [no]
    --enable-libgsm          enable GSM support via libgsm [no]
 +  --enable-libmodplug      enable ModPlug via libmodplug [no]
    --enable-libmp3lame      enable MP3 encoding via libmp3lame [no]
    --enable-libnut          enable NUT (de)muxing via libnut,
                             native (de)muxer exists [no]
 -  --enable-libopenjpeg     enable JPEG 2000 decoding via OpenJPEG [no]
 +  --enable-libopenjpeg     enable JPEG 2000 encoding/decoding via OpenJPEG [no]
    --enable-libpulse        enable Pulseaudio input via libpulse [no]
    --enable-librtmp         enable RTMP[E] support via librtmp [no]
    --enable-libschroedinger enable Dirac support via libschroedinger [no]
    --enable-libspeex        enable Speex support via libspeex [no]
 +  --enable-libstagefright-h264  enable H.264 decoding via libstagefright [no]
    --enable-libtheora       enable Theora encoding via libtheora [no]
 +  --enable-libutvideo      enable Ut Video decoding via libutvideo [no]
 +  --enable-libv4l2         enable libv4l2/v4l-utils [no]
    --enable-libvo-aacenc    enable AAC encoding via libvo-aacenc [no]
    --enable-libvo-amrwbenc  enable AMR-WB encoding via libvo-amrwbenc [no]
    --enable-libvorbis       enable Vorbis encoding via libvorbis,
    --enable-libxavs         enable AVS encoding via xavs [no]
    --enable-libxvid         enable Xvid encoding via xvidcore,
                             native MPEG-4/Xvid encoder exists [no]
 +  --enable-openal          enable OpenAL 1.1 capture support [no]
    --enable-mlib            enable Sun medialib [no]
    --enable-openssl         enable openssl [no]
    --enable-zlib            enable zlib [autodetect]
@@@ -222,19 -211,16 +222,19 @@@ Advanced options (experts only)
    --ar=AR                  use archive tool AR [$ar_default]
    --as=AS                  use assembler AS [$as_default]
    --cc=CC                  use C compiler CC [$cc_default]
 +  --cxx=CXX                use C compiler CXX [$cxx_default]
    --ld=LD                  use linker LD
    --host-cc=HOSTCC         use host C compiler HOSTCC
    --host-cflags=HCFLAGS    use HCFLAGS when compiling for host
    --host-ldflags=HLDFLAGS  use HLDFLAGS when linking for host
    --host-libs=HLIBS        use libs HLIBS when linking for host
    --extra-cflags=ECFLAGS   add ECFLAGS to CFLAGS [$CFLAGS]
 +  --extra-cxxflags=ECFLAGS add ECFLAGS to CXXFLAGS [$CXXFLAGS]
    --extra-ldflags=ELDFLAGS add ELDFLAGS to LDFLAGS [$LDFLAGS]
    --extra-libs=ELIBS       add ELIBS [$ELIBS]
    --extra-version=STRING   version string suffix []
    --build-suffix=SUFFIX    library name suffix []
 +  --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)
    --disable-symver         disable symbol versioning
    --optflags               override optimization-related compiler flags
  
 -Developer options (useful when working on Libav itself):
 +Developer options (useful when working on FFmpeg itself):
 +  --enable-coverage        build with test coverage instrumentation
    --disable-debug          disable debugging symbols
    --enable-debug=LEVEL     set the debug level [$debuglevel]
    --disable-optimizations  disable compiler optimizations
    --enable-extra-warnings  enable more compiler warnings
 +  --disable-stripping      disable stripping of executables and shared libraries
    --samples=PATH           location of test samples for FATE, if not set use
                             \$FATE_SAMPLES at make invocation time.
  
@@@ -305,7 -289,7 +305,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
@@@ -602,10 -586,6 +602,10 @@@ add_cflags()
      append CFLAGS $($filter_cflags "$@")
  }
  
 +add_cxxflags(){
 +    append CXXFLAGS $($filter_cflags "$@")
 +}
 +
  add_asflags(){
      append ASFLAGS $($filter_asflags "$@")
  }
@@@ -630,13 -610,6 +630,13 @@@ check_cc()
      check_cmd $cc $CPPFLAGS $CFLAGS "$@" -c -o $TMPO $TMPC
  }
  
 +check_cxx(){
 +    log check_cxx "$@"
 +    cat > $TMPCPP
 +    log_file $TMPCPP
 +    check_cmd $cxx $CPPFLAGS $CFLAGS $CXXFLAGS "$@" -c -o $TMPO $TMPCPP
 +}
 +
  check_cpp(){
      log check_cpp "$@"
      cat > $TMPC
@@@ -672,14 -645,12 +672,14 @@@ check_yasm()
  
  check_ld(){
      log check_ld "$@"
 +    type=$1
 +    shift 1
      flags=''
      libs=''
      for f; do
          test "${f}" = "${f#-l}" && flags="$flags $f" || libs="$libs $f"
      done
 -    check_cc $($filter_cflags $flags) || return
 +    check_$type $($filter_cflags $flags) || return
      check_cmd $ld $LDFLAGS $flags -o $TMPE $TMPO $libs $extralibs
  }
  
@@@ -699,17 -670,9 +699,17 @@@ int x
  EOF
  }
  
 +check_cxxflags(){
 +    log check_cxxflags "$@"
 +    set -- $($filter_cflags "$@")
 +    check_cxx "$@" <<EOF && append CXXFLAGS "$@"
 +int x;
 +EOF
 +}
 +
  test_ldflags(){
      log test_ldflags "$@"
 -    check_ld "$@" <<EOF
 +    check_ld "cc" "$@" <<EOF
  int main(void){ return 0; }
  EOF
  }
@@@ -735,7 -698,7 +735,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
@@@ -746,10 -709,10 +746,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
  }
  
@@@ -766,26 -729,7 +766,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(){
@@@ -817,21 -761,13 +817,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 main(void){
      signal(SIGILL, sighandler);
      signal(SIGFPE, sighandler);
  #ifdef SIGBUS
      signal(SIGBUS, sighandler);
  #endif
 -    { $code }
 +    return func();
  }
  EOF
  }
@@@ -923,14 -856,6 +923,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"
@@@ -982,16 -907,16 +982,16 @@@ COMPONENT_LIST=
  "
  
  PROGRAM_LIST="
 -    avconv
 -    avplay
 -    avprobe
 -    avserver
 +    ffplay
 +    ffprobe
 +    ffserver
      ffmpeg
  "
  
  CONFIG_LIST="
      $COMPONENT_LIST
      $PROGRAM_LIST
 +    avconv
      aandct
      ac3dsp
      avcodec
      avformat
      avisynth
      bzlib
 +    crystalhd
      dct
      doc
      dwt
      h264pred
      hardcoded_tables
      huffman
 +    libaacplus
 +    libass
      libcdio
 +    libcelt
      libdc1394
      libdirac
      libfaac
      libfreetype
      libgsm
 +    libmodplug
      libmp3lame
      libnut
      libopencore_amrnb
      librtmp
      libschroedinger
      libspeex
 +    libstagefright_h264
      libtheora
 +    libutvideo
 +    libv4l2
      libvo_aacenc
      libvo_amrwbenc
      libvorbis
      mpegaudiodsp
      network
      nonfree
 +    openal
      openssl
      pic
      postproc
      small
      sram
      static
 +    swresample
      swscale
      swscale_alpha
      thumb
  THREADS_LIST='
      pthreads
      w32threads
 +    os2threads
  '
  
  ARCH_LIST='
@@@ -1146,10 -1060,8 +1146,10 @@@ HAVE_LIST=
      altivec_h
      arpa_inet_h
      asm_mod_y
 +    asm_types_h
      attribute_may_alias
      attribute_packed
 +    cbrtf
      closesocket
      cmov
      dcbzl
      inet_aton
      inline_asm
      isatty
 +    kbhit
      ldbrx
 -    libdc1394_1
 -    libdc1394_2
      llrint
      llrintf
      local_aligned_16
      lzo1x_999_compress
      machine_ioctl_bt848_h
      machine_ioctl_meteor_h
 +    makeinfo
      malloc_h
      MapViewOfFile
      memalign
      mkstemp
      mmap
 +    PeekNamedPipe
      poll_h
      posix_memalign
      round
      soundcard_h
      strerror_r
      strptime
 -    strtok_r
      struct_addrinfo
      struct_ipv6_mreq
      struct_rusage_ru_maxrss
      sys_select_h
      sys_soundcard_h
      sys_videoio_h
 +    termios_h
      threads
      trunc
      truncf
@@@ -1253,13 -1164,11 +1253,13 @@@ CMDLINE_SELECT=
      $CONFIG_LIST
      $THREADS_LIST
      asm
 +    coverage
      cross_compile
      debug
      extra_warnings
      logging
      optimizations
 +    stripping
      symver
      yasm
  "
@@@ -1280,11 -1189,9 +1280,11 @@@ CMDLINE_SET=
      arch
      as
      build_suffix
 +    progs_suffix
      cc
      cpu
      cross_prefix
 +    cxx
      dep_cc
      extra_version
      host_cc
      host_ldflags
      host_libs
      host_os
 +    install
      ld
      logfile
      malloc_prefix
      optflags
      pkg_config
      samples
 +    strip
      sysinclude
      sysroot
      target_exec
  
  CMDLINE_APPEND="
      extra_cflags
 +    extra_cxxflags
  "
  
  # code dependency declarations
@@@ -1387,7 -1291,6 +1387,7 @@@ flac_decoder_select="golomb
  flac_encoder_select="golomb lpc"
  flashsv_decoder_select="zlib"
  flashsv_encoder_select="zlib"
 +flashsv2_encoder_select="zlib"
  flashsv2_decoder_select="zlib"
  flv_decoder_select="h263_decoder"
  flv_encoder_select="h263_encoder"
@@@ -1398,12 -1301,10 +1398,12 @@@ h263_encoder_select="aandct
  h263_vaapi_hwaccel_select="vaapi h263_decoder"
  h263i_decoder_select="h263_decoder"
  h263p_encoder_select="h263_encoder"
 +h264_crystalhd_decoder_select="crystalhd h264_mp4toannexb_bsf h264_parser"
  h264_decoder_select="golomb h264chroma h264dsp h264pred"
  h264_dxva2_hwaccel_deps="dxva2api_h"
  h264_dxva2_hwaccel_select="dxva2 h264_decoder"
  h264_vaapi_hwaccel_select="vaapi h264_decoder"
 +h264_vda_hwaccel_deps="VideoDecodeAcceleration_VDADecoder_h pthreads"
  h264_vda_hwaccel_select="vda h264_decoder"
  h264_vdpau_decoder_select="vdpau h264_decoder"
  imc_decoder_select="fft mdct sinewin"
@@@ -1429,20 -1330,15 +1429,20 @@@ mpeg_vdpau_decoder_select="vdpau mpegvi
  mpeg_xvmc_decoder_deps="X11_extensions_XvMClib_h"
  mpeg_xvmc_decoder_select="mpegvideo_decoder"
  mpeg1_vdpau_decoder_select="vdpau mpeg1video_decoder"
 +mpeg1_vdpau_hwaccel_select="vdpau mpeg1video_decoder"
  mpeg1video_encoder_select="aandct"
 +mpeg2_crystalhd_decoder_select="crystalhd"
  mpeg2_dxva2_hwaccel_deps="dxva2api_h"
  mpeg2_dxva2_hwaccel_select="dxva2 mpeg2video_decoder"
 +mpeg2_vdpau_hwaccel_select="vdpau mpeg2video_decoder"
  mpeg2_vaapi_hwaccel_select="vaapi mpeg2video_decoder"
  mpeg2video_encoder_select="aandct"
 +mpeg4_crystalhd_decoder_select="crystalhd"
  mpeg4_decoder_select="h263_decoder mpeg4video_parser"
  mpeg4_encoder_select="h263_encoder"
  mpeg4_vaapi_hwaccel_select="vaapi mpeg4_decoder"
  mpeg4_vdpau_decoder_select="vdpau mpeg4_decoder"
 +msmpeg4_crystalhd_decoder_select="crystalhd"
  msmpeg4v1_decoder_select="h263_decoder"
  msmpeg4v1_encoder_select="h263_encoder"
  msmpeg4v2_decoder_select="h263_decoder"
@@@ -1466,9 -1362,6 +1466,9 @@@ shorten_decoder_select="golomb
  sipr_decoder_select="lsp"
  snow_decoder_select="dwt"
  snow_encoder_select="aandct dwt"
 +sonic_decoder_select="golomb"
 +sonic_encoder_select="golomb"
 +sonic_ls_encoder_select="golomb"
  svq1_encoder_select="aandct"
  svq3_decoder_select="golomb h264chroma h264dsp h264pred"
  svq3_decoder_suggest="zlib"
@@@ -1478,9 -1371,8 +1478,9 @@@ 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"
 -vc1_dxva2_hwaccel_deps="dxva2api_h DXVA_PictureParameters_wDecodedPictureIndex"
 +vc1_dxva2_hwaccel_deps="dxva2api_h"
  vc1_dxva2_hwaccel_select="dxva2 vc1_decoder"
  vc1_vaapi_hwaccel_select="vaapi vc1_decoder"
  vc1_vdpau_decoder_select="vdpau vc1_decoder"
@@@ -1502,7 -1394,6 +1502,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"
@@@ -1512,7 -1403,6 +1512,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 h264chroma h264dsp h264pred"
  
  # external libraries
 +libaacplus_encoder_deps="libaacplus"
 +libcelt_decoder_deps="libcelt"
  libdirac_decoder_deps="libdirac !libschroedinger"
  libdirac_encoder_deps="libdirac"
  libfaac_encoder_deps="libfaac"
@@@ -1530,18 -1418,15 +1530,18 @@@ libgsm_decoder_deps="libgsm
  libgsm_encoder_deps="libgsm"
  libgsm_ms_decoder_deps="libgsm"
  libgsm_ms_encoder_deps="libgsm"
 +libmodplug_demuxer_deps="libmodplug"
  libmp3lame_encoder_deps="libmp3lame"
  libopencore_amrnb_decoder_deps="libopencore_amrnb"
  libopencore_amrnb_encoder_deps="libopencore_amrnb"
  libopencore_amrwb_decoder_deps="libopencore_amrwb"
  libopenjpeg_decoder_deps="libopenjpeg"
 +libopenjpeg_encoder_deps="libopenjpeg"
  libschroedinger_decoder_deps="libschroedinger"
  libschroedinger_encoder_deps="libschroedinger"
  libspeex_decoder_deps="libspeex"
  libspeex_encoder_deps="libspeex"
 +libstagefright_h264_decoder_deps="libstagefright_h264"
  libtheora_encoder_deps="libtheora"
  libvo_aacenc_encoder_deps="libvo_aacenc"
  libvo_amrwbenc_encoder_deps="libvo_amrwbenc"
@@@ -1549,10 -1434,8 +1549,10 @@@ 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 gpl"
  
  # demuxers / muxers
  ac3_demuxer_select="ac3_parser"
@@@ -1589,20 -1472,14 +1589,20 @@@ w64_demuxer_deps="wav_demuxer
  alsa_indev_deps="alsa_asoundlib_h snd_pcm_htimestamp"
  alsa_outdev_deps="alsa_asoundlib_h"
  bktr_indev_deps_any="dev_bktr_ioctl_bt848_h machine_ioctl_bt848_h dev_video_bktr_ioctl_bt848_h dev_ic_bt8xx_h"
 +dshow_indev_deps="IBaseFilter"
 +dshow_indev_extralibs="-lpsapi -lole32 -lstrmiids -luuid"
  dv1394_indev_deps="dv1394 dv_demuxer"
  fbdev_indev_deps="linux_fb_h"
 -jack_indev_deps="jack_jack_h"
 +jack_indev_deps="jack_jack_h sem_timedwait"
 +lavfi_indev_deps="avfilter"
  libcdio_indev_deps="libcdio"
  libdc1394_indev_deps="libdc1394"
 +libv4l2_indev_deps="libv4l2"
 +openal_indev_deps="openal"
  oss_indev_deps_any="soundcard_h sys_soundcard_h"
  oss_outdev_deps_any="soundcard_h sys_soundcard_h"
  pulse_indev_deps="libpulse"
 +sdl_outdev_deps="sdl"
  sndio_indev_deps="sndio_h"
  sndio_outdev_deps="sndio_h"
  v4l_indev_deps="linux_videodev_h"
@@@ -1629,20 -1506,14 +1629,20 @@@ tls_protocol_select="tcp_protocol
  udp_protocol_deps="network"
  
  # filters
 +amovie_filter_deps="avcodec avformat"
 +ass_filter_deps="libass"
  blackframe_filter_deps="gpl"
  boxblur_filter_deps="gpl"
  cropdetect_filter_deps="gpl"
  delogo_filter_deps="gpl"
  drawtext_filter_deps="libfreetype"
 -frei0r_filter_deps="frei0r dlopen strtok_r"
 -frei0r_src_filter_deps="frei0r dlopen strtok_r"
 +frei0r_filter_deps="frei0r dlopen"
 +frei0r_src_filter_deps="frei0r dlopen"
  hqdn3d_filter_deps="gpl"
 +movie_filter_deps="avcodec avformat"
 +mp_filter_deps="gpl avcodec"
 +mptestsrc_filter_deps="gpl"
 +negate_filter_deps="lut_filter"
  ocv_filter_deps="libopencv"
  scale_filter_deps="swscale"
  yadif_filter_deps="gpl"
@@@ -1655,13 -1526,13 +1655,13 @@@ postproc_deps="gpl
  # programs
  avconv_deps="avcodec avformat swscale"
  avconv_select="buffer_filter"
 -avplay_deps="avcodec avformat swscale sdl"
 -avplay_select="rdft"
 -avprobe_deps="avcodec avformat"
 -avserver_deps="avformat ffm_muxer fork rtp_protocol rtsp_demuxer"
 -avserver_extralibs='$ldl'
 -ffmpeg_deps="avcodec avformat swscale"
 -ffmpeg_select="buffer_filter"
 +ffplay_deps="avcodec avformat swscale sdl"
 +ffplay_select="buffersink_filter rdft"
 +ffprobe_deps="avcodec avformat"
 +ffserver_deps="avformat ffm_muxer fork rtp_protocol rtsp_demuxer"
 +ffserver_extralibs='$ldl'
 +ffmpeg_deps="avcodec avformat swscale swresample"
 +ffmpeg_select="buffer_filter buffersink_filter"
  
  doc_deps="texi2html"
  
@@@ -1768,7 -1639,7 +1768,7 @@@ 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'
@@@ -1777,16 -1648,13 +1777,16 @@@ shlibdir_default="$libdir_default
  # toolchain
  ar_default="ar"
  cc_default="gcc"
 +cxx_default="g++"
  cc_version=\"unknown\"
  host_cc_default="gcc"
 +install="install"
  ln_s="ln -sf"
  nm_default="nm"
  objformat="elf"
  pkg_config_default=pkg-config
  ranlib="ranlib"
 +strip_default="strip"
  yasmexe="yasm"
  
  nm_opts='-g'
@@@ -1809,8 -1677,6 +1809,8 @@@ enable avfilte
  enable avformat
  enable avutil
  enable postproc
 +enable stripping
 +enable swresample
  enable swscale
  
  enable asm
@@@ -1825,7 -1691,7 +1825,7 @@@ enable swscale_alph
  
  # build settings
  SHFLAGS='-shared -Wl,-soname,$$(@F)'
 -AVSERVERLDFLAGS=-Wl,-E
 +FFSERVERLDFLAGS=-Wl,-E
  LIBPREF="lib"
  LIBSUF=".a"
  FULLNAME='$(NAME)$(BUILDSUF)'
@@@ -1841,7 -1707,6 +1841,7 @@@ SLIB_INSTALL_LINKS='$(SLIBNAME_WITH_MAJ
  
  AS_O='-o $@'
  CC_O='-o $@'
 +CXX_O='-o $@'
  
  host_cflags='-D_ISOC99_SOURCE -O3 -g'
  host_libs='-lm'
@@@ -1868,7 -1733,7 +1868,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(){
@@@ -1996,7 -1861,7 +1996,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
@@@ -2010,15 -1875,13 +2010,15 @@@ set_default arch target_o
  
  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
  enabled cross_compile || host_cc_default=$cc
  set_default host_cc
  
@@@ -2061,7 -1924,6 +2061,7 @@@ trap 'rm -f -- $TMPFILES' EXI
  
  tmpfile TMPASM .asm
  tmpfile TMPC   .c
 +tmpfile TMPCPP .cpp
  tmpfile TMPE   $EXESUF
  tmpfile TMPH   .h
  tmpfile TMPO   .o
@@@ -2278,11 -2140,9 +2278,11 @@@ test -n "$cc_type" && enable $cc_type |
  set_default ar as dep_cc ld
  
  test -n "$CC_DEPFLAGS" || CCDEP=$DEPEND_CMD
 +test -n "$CXX_DEPFLAGS" || CXXDEP=$DEPEND_CMD
  test -n "$AS_DEPFLAGS" || ASDEP=$DEPEND_CMD
  
  add_cflags $extra_cflags
 +add_cxxflags $extra_cxxflags
  add_asflags $extra_cflags
  
  if test -n "$sysroot"; then
  
  # Deal with common $arch aliases
  case "$arch" in
 -    arm*)
 +    arm*|iPad*)
          arch="arm"
      ;;
      mips|mipsel|IP*)
          arch="parisc"
          subarch="parisc64"
      ;;
 -    "Power Macintosh"|ppc|powerpc)
 -        arch="ppc"
 -    ;;
 -    ppc64|powerpc64)
 +    "Power Macintosh"|ppc|powerpc|ppc64|powerpc64)
          arch="ppc"
 -        subarch="ppc64"
      ;;
      s390|s390x)
          arch="s390"
          arch="sparc"
          subarch="sparc64"
      ;;
 -    i[3-6]86|i86pc|BePC|x86pc|x86_64|amd64)
 +    i[3-6]86|i86pc|BePC|x86pc|x86_64|x86_32|amd64)
          arch="x86"
      ;;
  esac
@@@ -2513,7 -2377,6 +2513,7 @@@ if test "$?" != 0; the
  fi
  
  add_cppflags -D_ISOC99_SOURCE
 +add_cxxflags -D__STDC_CONSTANT_MACROS
  check_cflags -std=c99
  check_cc -D_FILE_OFFSET_BITS=64 <<EOF && add_cppflags -D_FILE_OFFSET_BITS=64
  #include <stdlib.h>
              spic=$shared
          fi
      ;;
 +    ppc)
 +        check_cc <<EOF && subarch="ppc64"
 +        int test[(int)sizeof(char*) - 7];
 +EOF
 +    ;;
  esac
  
  enable $subarch
@@@ -2556,7 -2414,7 +2556,7 @@@ case $target_os i
          host_libs=
          ;;
      sunos)
 -        AVSERVERLDFLAGS=""
 +        FFSERVERLDFLAGS=""
          SHFLAGS='-shared -Wl,-h,$$(@F)'
          enabled x86 && SHFLAGS="-mimpure-text $SHFLAGS"
          network_extralibs="-lsocket -lnsl"
      openbsd)
          enable malloc_aligned
          # On OpenBSD 4.5. the compiler does not use PIC unless
 -        # explicitly using -fPIC. Libav builds fine without PIC,
 +        # explicitly using -fPIC. FFmpeg builds fine without PIC,
          # however the generated executable will not do anything
          # (simply quits with exit-code 1, no crash, no output).
          # Thus explicitly enable PIC here.
          ;;
      bsd/os)
          add_extralibs -lpoll -lgnugetopt
 +        strip="strip -d"
          ;;
      darwin)
          enable malloc_aligned
          enabled ppc && add_asflags -force_cpusubtype_ALL
          SHFLAGS='-dynamiclib -Wl,-single_module -Wl,-install_name,$(SHLIBDIR)/$(SLIBNAME),-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 ||
          LIBTARGET=i386
          if enabled x86_64; then
              enable malloc_aligned
 -            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
          ;;
  esac
  
 -echo "config:$arch:$subarch:$cpu:$target_os:$cc_ident:$LIBAV_CONFIGURATION" >config.fate
 +echo "config:$arch:$subarch:$cpu:$target_os:$cc_ident:$FFMPEG_CONFIGURATION" >config.fate
  
  check_cpp_condition stdlib.h "defined(__PIC__) || defined(__pic__) || defined(PIC)" && enable pic
  
@@@ -2755,7 -2610,6 +2755,7 @@@ die_license_disabled gpl libxav
  die_license_disabled gpl libxvid
  die_license_disabled gpl x11grab
  
 +die_license_disabled nonfree libaacplus
  die_license_disabled nonfree libfaac
  die_license_disabled nonfree openssl
  
@@@ -2821,7 -2675,7 +2821,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
@@@ -3000,8 -2854,7 +3000,8 @@@ check_func  ${malloc_prefix}posix_memal
  check_func  setrlimit
  check_func  strerror_r
  check_func  strptime
 -check_func  strtok_r
 +check_func_headers conio.h kbhit
 +check_func_headers windows.h PeekNamedPipe
  check_func_headers io.h setmode
  check_func_headers lzo/lzo1x.h lzo1x_999_compress
  check_lib2 "windows.h psapi.h" GetProcessMemoryInfo -lpsapi
@@@ -3010,37 -2863,28 +3010,37 @@@ check_func_headers windows.h MapViewOfF
  check_func_headers windows.h VirtualAlloc
  
  check_header dlfcn.h
 -check_header dxva2api.h
 +check_header dxva2api.h -D_WIN32_WINNT=0x0600
 +check_header libcrystalhd/libcrystalhd_if.h
  check_header malloc.h
  check_header poll.h
  check_header sys/mman.h
  check_header sys/resource.h
  check_header sys/select.h
 +check_header termios.h
  check_header vdpau/vdpau.h
  check_header vdpau/vdpau_x11.h
  check_header X11/extensions/XvMClib.h
 -
 -check_struct dxva2api.h DXVA_PictureParameters wDecodedPictureIndex
 +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
          :
@@@ -3066,10 -2910,8 +3066,10 @@@ for thread in $THREADS_LIST; d
  done
  
  check_lib math.h sin -lm && LIBM="-lm"
 +disabled crystalhd || check_lib libcrystalhd/libcrystalhd_if.h DtsCrystalHDVersion -lcrystalhd || disable crystalhd
  enabled vaapi && require vaapi va/va.h vaInitialize -lva
  
 +check_mathfunc cbrtf
  check_mathfunc exp2
  check_mathfunc exp2f
  check_mathfunc llrint
@@@ -3087,76 -2929,58 +3087,76 @@@ check_mathfunc trunc
  enabled avisynth   && require2 vfw32 "windows.h vfw.h" AVIFileInit -lavifil32
  enabled frei0r     && { check_header frei0r.h || die "ERROR: frei0r.h header not found"; }
  enabled gnutls     && require_pkg_config gnutls gnutls/gnutls.h gnutls_global_init
 +enabled libaacplus && require  "libaacplus >= 2.0.0" aacplus.h aacplusEncOpen -laacplus
 +enabled libass     && require_pkg_config libass ass/ass.h ass_library_init
 +enabled libcelt    && require libcelt celt/celt.h celt_decode -lcelt0
 +enabled libdc1394  && require_pkg_config libdc1394-2 dc1394/dc1394.h dc1394_new
  enabled libdirac   && require_pkg_config dirac                          \
      "libdirac_decoder/dirac_parser.h libdirac_encoder/dirac_encoder.h"  \
      "dirac_decoder_init dirac_encoder_init"
  enabled libfaac    && require2 libfaac "stdint.h faac.h" faacEncGetVersion -lfaac
  enabled libfreetype && require_pkg_config freetype2 "ft2build.h freetype/freetype.h" FT_Init_FreeType
  enabled libgsm     && require  libgsm gsm/gsm.h gsm_create -lgsm
 +enabled libmodplug && require  libmodplug libmodplug/modplug.h ModPlug_Load -lmodplug
  enabled libmp3lame && require  "libmp3lame >= 3.98.3" lame/lame.h lame_set_VBR_quality -lmp3lame
  enabled libnut     && require  libnut libnut.h nut_demuxer_init -lnut
  enabled libopencore_amrnb  && require libopencore_amrnb opencore-amrnb/interf_dec.h Decoder_Interface_init -lopencore-amrnb
  enabled libopencore_amrwb  && require libopencore_amrwb opencore-amrwb/dec_if.h D_IF_init -lopencore-amrwb
 -enabled libopencv  && require_pkg_config opencv opencv/cv.h cvCreateImageHeader
 +enabled libopencv  && require_pkg_config opencv opencv/cxcore.h cvCreateImageHeader
  enabled libopenjpeg && require libopenjpeg openjpeg.h opj_version -lopenjpeg
  enabled libpulse && require_pkg_config libpulse-simple pulse/simple.h pa_simple_new
  enabled librtmp    && require_pkg_config librtmp librtmp/rtmp.h RTMP_Socket
  enabled libschroedinger && require_pkg_config schroedinger-1.0 schroedinger/schro.h schro_init
  enabled libspeex   && require  libspeex speex/speex.h speex_decoder_init -lspeex
 +enabled libstagefright_h264  && require_cpp libstagefright_h264 "binder/ProcessState.h media/stagefright/MetaData.h
 +    media/stagefright/MediaBufferGroup.h media/stagefright/MediaDebug.h media/stagefright/MediaDefs.h
 +    media/stagefright/OMXClient.h media/stagefright/OMXCodec.h" android::OMXClient -lstagefright -lmedia -lutils -lbinder
  enabled libtheora  && require  libtheora theora/theoraenc.h th_info_init -ltheoraenc -ltheoradec -logg
 +enabled libutvideo    && require_cpp utvideo "stdint.h stdlib.h utvideo/utvideo.h utvideo/Codec.h" 'CCodec*' -lutvideo -lstdc++
 +enabled libv4l2    && require_pkg_config libv4l2 libv4l2.h v4l2_ioctl
  enabled libvo_aacenc && require libvo_aacenc vo-aacenc/voAAC.h voGetAACEncAPI -lvo-aacenc
  enabled libvo_amrwbenc && require libvo_amrwbenc vo-amrwbenc/enc_if.h E_IF_init -lvo-amrwbenc
  enabled libvorbis  && require  libvorbis vorbis/vorbisenc.h vorbis_info_init -lvorbisenc -lvorbis -logg
  enabled libvpx     && {
      enabled libvpx_decoder && { check_lib2 "vpx/vpx_decoder.h vpx/vp8dx.h" vpx_codec_dec_init_ver -lvpx ||
                                  die "ERROR: libvpx decoder version must be >=0.9.1"; }
 -    enabled libvpx_encoder && { check_lib2 "vpx/vpx_encoder.h vpx/vp8cx.h" vpx_codec_enc_init_ver -lvpx ||
 -                                die "ERROR: libvpx encoder version must be >=0.9.1"; } }
 +    enabled libvpx_encoder && { check_lib2 "vpx/vpx_encoder.h vpx/vp8cx.h" "vpx_codec_enc_init_ver VPX_CQ" -lvpx ||
 +                                die "ERROR: libvpx encoder version must be >=0.9.6"; } }
  enabled libx264    && require  libx264 x264.h x264_encoder_encode -lx264 &&
                        { check_cpp_condition x264.h "X264_BUILD >= 118" ||
                          die "ERROR: libx264 version must be >= 0.118."; }
  enabled libxavs    && require  libxavs xavs.h xavs_encoder_encode -lxavs
  enabled libxvid    && require  libxvid xvid.h xvid_global -lxvidcore
 +enabled openal     && { { for al_libs in "${OPENAL_LIBS}" "-lopenal" "-lOpenAL32"; do
 +                        check_lib 'AL/al.h' alGetError "${al_libs}" && break; done } ||
 +                        die "ERROR: openal not found"; } &&
 +                      { check_cpp_condition "AL/al.h" "defined(AL_VERSION_1_1)" ||
 +                        die "ERROR: openal version must be 1.1 or compatible"; }
  enabled mlib       && require  mediaLib mlib_types.h mlib_VectorSub_S16_U8_Mod -lmlib
  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 ||
                          die "ERROR: openssl not found"; }
  
 -# libdc1394 check
 -if enabled libdc1394; then
 -    { check_lib dc1394/dc1394.h dc1394_new -ldc1394 -lraw1394 &&
 -        enable libdc1394_2; } ||
 -    { check_lib libdc1394/dc1394_control.h dc1394_create_handle -ldc1394_control -lraw1394 &&
 -        enable libdc1394_1; } ||
 -    die "ERROR: No version of libdc1394 found "
 -fi
 -
 +SDL_CONFIG="${cross_prefix}sdl-config"
  if check_pkg_config sdl SDL_version.h SDL_Linked_Version; then
      check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) >= 0x010201" $sdl_cflags &&
      enable sdl &&
      check_struct SDL.h SDL_VideoInfo current_w $sdl_cflags && enable sdl_video_size
 +else
 +  if "${SDL_CONFIG}" --version > /dev/null 2>&1; then
 +    sdl_cflags=$("${SDL_CONFIG}" --cflags)
 +    sdl_libs=$("${SDL_CONFIG}" --libs)
 +    check_func_headers SDL_version.h SDL_Linked_Version $sdl_cflags $sdl_libs &&
 +    check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) >= 0x010201" $sdl_cflags &&
 +    enable sdl &&
 +    check_struct SDL.h SDL_VideoInfo current_w $sdl_cflags && enable sdl_video_size
 +  fi
  fi
 +enabled sdl && add_cflags $sdl_cflags && add_extralibs $sdl_libs
  
  texi2html -version > /dev/null 2>&1 && enable texi2html || disable texi2html
 +makeinfo --version > /dev/null 2>&1 && enable makeinfo  || disable makeinfo
  
  check_header linux/fb.h
  check_header linux/videodev.h
@@@ -3168,8 -2992,6 +3168,8 @@@ check_func_headers "windows.h vfw.h" ca
  # w32api 3.12 had it defined wrong
  check_cpp_condition vfw.h "WM_CAP_DRIVER_CONNECT > WM_USER" && enable vfwcap_defines
  
 +check_type "dshow.h" IBaseFilter
 +
  # check for ioctl_meteor.h, ioctl_bt848.h and alternatives
  { check_header dev/bktr/ioctl_meteor.h &&
    check_header dev/bktr/ioctl_bt848.h; } ||
  check_header dev/ic/bt8xx.h
  
  check_header sndio.h
 -check_header sys/soundcard.h
 +if check_struct sys/soundcard.h audio_buf_info bytes; then
 +    enable_safe sys/soundcard.h
 +else
 +    check_cc -D__BSD_VISIBLE -D__XSI_VISIBLE <<EOF && add_cppflags -D__BSD_VISIBLE -D__XSI_VISIBLE && enable_safe sys/soundcard.h
 +    #include <sys/soundcard.h>
 +    audio_buf_info abc;
 +EOF
 +fi
  check_header soundcard.h
  
  enabled_any alsa_indev alsa_outdev && check_lib2 alsa/asoundlib.h snd_pcm_htimestamp -lasound
  
 -enabled jack_indev && check_lib2 jack/jack.h jack_client_open -ljack
 +enabled jack_indev && check_lib2 jack/jack.h jack_client_open -ljack && check_func sem_timedwait
  
  enabled_any sndio_indev sndio_outdev && check_lib2 sndio.h sio_open -lsndio
  
@@@ -3207,11 -3022,9 +3207,11 @@@ check_func XOpenDisplay -lX1
  check_func XShmCreateImage -lX11 -lXext &&
  check_func XFixesGetCursorImage -lX11 -lXext -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
@@@ -3222,7 -3035,6 +3222,7 @@@ 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"
  
  # add some useful compiler flags if supported
  check_cflags -Wdeclaration-after-statement
@@@ -3239,13 -3051,12 +3239,13 @@@ check_cflags -Wwrite-string
  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=libpostproc:libswscale:libavfilter:libavdevice:libavformat:libavcodec:libavutil
 +check_ldflags -Wl,-rpath-link=libpostproc:libswresample:libswscale:libavfilter:libavdevice:libavformat:libavcodec:libavutil
  test_ldflags -Wl,-Bsymbolic && append SHFLAGS -Wl,-Bsymbolic
  
  echo "X{};" > $TMPV
  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
@@@ -3311,6 -3118,7 +3311,7 @@@ 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
@@@ -3340,11 -3148,6 +3341,11 @@@ 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 malloc_aligned &&
      enabled_any $need_memalign && enable memalign_hack
  
@@@ -3355,9 -3158,6 +3356,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
@@@ -3397,7 -3197,6 +3398,7 @@@ 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}"
@@@ -3406,6 -3205,7 +3407,7 @@@ echo "postprocessing support    ${postp
  echo "new filter support        ${avfilter-no}"
  echo "network support           ${network-no}"
  echo "threading support         ${thread_type-no}"
+ echo "safe bitstream reader     ${safe_bitstream_reader-no}"
  echo "SDL support               ${sdl-no}"
  echo "Sun medialib support      ${mlib-no}"
  echo "libdxva2 enabled          ${dxva2-no}"
@@@ -3414,15 -3214,11 +3416,15 @@@ echo "libvdpau enabled          ${vdpau
  echo "AVISynth enabled          ${avisynth-no}"
  echo "frei0r enabled            ${frei0r-no}"
  echo "gnutls enabled            ${gnutls-no}"
 +echo "libaacplus enabled        ${libaacplus-no}"
 +echo "libass enabled            ${libass-no}"
  echo "libcdio support           ${libcdio-no}"
 +echo "libcelt enabled           ${libcelt-no}"
  echo "libdc1394 support         ${libdc1394-no}"
  echo "libdirac enabled          ${libdirac-no}"
  echo "libfaac enabled           ${libfaac-no}"
  echo "libgsm enabled            ${libgsm-no}"
 +echo "libmodplug enabled        ${libmodplug-no}"
  echo "libmp3lame enabled        ${libmp3lame-no}"
  echo "libnut enabled            ${libnut-no}"
  echo "libopencore-amrnb support ${libopencore_amrnb-no}"
@@@ -3433,10 -3229,7 +3435,10 @@@ echo "libpulse enabled          ${libpu
  echo "librtmp enabled           ${librtmp-no}"
  echo "libschroedinger enabled   ${libschroedinger-no}"
  echo "libspeex enabled          ${libspeex-no}"
 +echo "libstagefright-h264 enabled    ${libstagefright_h264-no}"
  echo "libtheora enabled         ${libtheora-no}"
 +echo "libutvideo enabled        ${libutvideo-no}"
 +echo "libv4l2 enabled           ${libv4l2-no}"
  echo "libvo-aacenc support      ${libvo_aacenc-no}"
  echo "libvo-amrwbenc support    ${libvo_amrwbenc-no}"
  echo "libvorbis enabled         ${libvorbis-no}"
@@@ -3444,7 -3237,6 +3446,7 @@@ echo "libvpx enabled            ${libvp
  echo "libx264 enabled           ${libx264-no}"
  echo "libxavs enabled           ${libxavs-no}"
  echo "libxvid enabled           ${libxvid-no}"
 +echo "openal enabled            ${openal-no}"
  echo "openssl enabled           ${openssl-no}"
  echo "zlib enabled              ${zlib-no}"
  echo "bzlib enabled             ${bzlib-no}"
@@@ -3474,15 -3266,11 +3476,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
@@@ -3491,13 -3279,9 +3493,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
@@@ -3505,22 -3289,18 +3507,22 @@@ YASM=$yasmex
  YASMDEP=$yasmexe
  AR=$ar
  RANLIB=$ranlib
 +CP=cp -p
  LN_S=$ln_s
 +STRIP=$strip
  CPPFLAGS=$CPPFLAGS
  CFLAGS=$CFLAGS
 +CXXFLAGS=$CXXFLAGS
  ASFLAGS=$ASFLAGS
  AS_O=$CC_O
  CC_O=$CC_O
 -DLLTOOL=$dlltool
 +CXX_O=$CXX_O
  LDFLAGS=$LDFLAGS
 -AVSERVERLDFLAGS=$AVSERVERLDFLAGS
 +FFSERVERLDFLAGS=$FFSERVERLDFLAGS
  SHFLAGS=$SHFLAGS
  YASMFLAGS=$YASMFLAGS
  BUILDSUF=$build_suffix
 +PROGSSUF=$progs_suffix
  FULLNAME=$FULLNAME
  LIBPREF=$LIBPREF
  LIBSUF=$LIBSUF
@@@ -3531,7 -3311,6 +3533,7 @@@ EXESUF=$EXESU
  EXTRA_VERSION=$extra_version
  DEPFLAGS=$DEPFLAGS
  CCDEP=$CCDEP
 +CXXDEP=$CXXDEP
  ASDEP=$ASDEP
  CC_DEPFLAGS=$CC_DEPFLAGS
  AS_DEPFLAGS=$AS_DEPFLAGS
@@@ -3546,7 -3325,7 +3548,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}
@@@ -3558,7 -3337,6 +3560,7 @@@ SLIB_INSTALL_LINKS=${SLIB_INSTALL_LINKS
  SLIB_INSTALL_EXTRA_LIB=${SLIB_INSTALL_EXTRA_LIB}
  SLIB_INSTALL_EXTRA_SHLIB=${SLIB_INSTALL_EXTRA_SHLIB}
  SAMPLES:=${samples:-\$(FATE_SAMPLES)}
 +NOREDZONE_FLAGS=$noredzone_flags
  EOF
  
  get_version(){
@@@ -3577,16 -3355,14 +3579,16 @@@ get_version LIBAVFILTER libavfilter/avf
  get_version LIBAVFORMAT libavformat/version.h
  get_version LIBAVUTIL   libavutil/avutil.h
  get_version LIBPOSTPROC libpostproc/postprocess.h
 +get_version LIBSWRESAMPLE libswresample/swresample.h
  get_version LIBSWSCALE  libswscale/swscale.h
  
  cat > $TMPH <<EOF
  /* Automatically generated by configure - do not modify! */
 -#ifndef LIBAV_CONFIG_H
 -#define LIBAV_CONFIG_H
 -#define LIBAV_CONFIGURATION "$(c_escape $LIBAV_CONFIGURATION)"
 -#define LIBAV_LICENSE "$(c_escape $license)"
 +#ifndef FFMPEG_CONFIG_H
 +#define FFMPEG_CONFIG_H
 +#define FFMPEG_CONFIGURATION "$(c_escape $FFMPEG_CONFIGURATION)"
 +#define FFMPEG_LICENSE "$(c_escape $license)"
 +#define FFMPEG_DATADIR "$(eval c_escape $datadir)"
  #define AVCONV_DATADIR "$(eval c_escape $datadir)"
  #define CC_TYPE "$cc_type"
  #define CC_VERSION $cc_version
@@@ -3627,8 -3403,7 +3629,8 @@@ LAVFI_TESTS=$(print_enabled  -n _test $
  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
@@@ -3693,11 -3468,10 +3695,11 @@@ 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"
 -pkgconfig_generate libpostproc "Libav postprocessing library" "$LIBPOSTPROC_VERSION" "" "libavutil = $LIBAVUTIL_VERSION"
 -pkgconfig_generate libswscale "Libav image rescaling library" "$LIBSWSCALE_VERSION" "$LIBM" "libavutil = $LIBAVUTIL_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" "libavformat = $LIBAVFORMAT_VERSION"
 +pkgconfig_generate libavfilter "FFmpeg video filtering library" "$LIBAVFILTER_VERSION" "$extralibs"
 +pkgconfig_generate libpostproc "FFmpeg postprocessing library" "$LIBPOSTPROC_VERSION" "" "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 libavcodec/aacdec.c
@@@ -7,20 -7,20 +7,20 @@@
   * Copyright (c) 2008-2010 Paul Kendall <paul@kcbbs.gen.nz>
   * Copyright (c) 2010      Janne Grunau <janne-ffmpeg@jannau.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
   */
  
@@@ -166,7 -166,7 +166,7 @@@ static ChannelElement *get_che(AACConte
  /**
   * Check for the channel element in the current channel position configuration.
   * If it exists, make sure the appropriate element is allocated and map the
 - * channel order to match the internal Libav channel layout.
 + * channel order to match the internal FFmpeg channel layout.
   *
   * @param   che_pos current channel position configuration
   * @param   type channel element type
@@@ -249,6 -249,8 +249,6 @@@ static av_cold int output_configure(AAC
          }
  
          memcpy(ac->tag_che_map, ac->che, 4 * MAX_ELEM_ID * sizeof(ac->che[0][0]));
 -
 -        avctx->channel_layout = 0;
      }
  
      avctx->channels = channels;
      return 0;
  }
  
 +static void flush(AVCodecContext *avctx)
 +{
 +    AACContext *ac= avctx->priv_data;
 +    int type, i, j;
 +
 +    for (type = 3; type >= 0; type--) {
 +        for (i = 0; i < MAX_ELEM_ID; i++) {
 +            ChannelElement *che = ac->che[type][i];
 +            if (che) {
 +                for (j = 0; j <= 1; j++) {
 +                    memset(che->ch[j].saved, 0, sizeof(che->ch[j].saved));
 +                }
 +            }
 +        }
 +    }
 +}
 +
  /**
   * Decode an array of 4 bit element IDs, optionally interleaved with a stereo/mono switching bit.
   *
@@@ -328,10 -313,6 +328,10 @@@ static int decode_pce(AVCodecContext *a
      if (get_bits1(gb))
          skip_bits(gb, 3); // mixdown_coeff_index and pseudo_surround
  
 +    if (get_bits_left(gb) < 4 * (num_front + num_side + num_back + num_lfe + num_assoc_data + num_cc)) {
 +        av_log(avctx, AV_LOG_ERROR, overread_err);
 +        return -1;
 +    }
      decode_channel_map(new_che_pos[TYPE_CPE], new_che_pos[TYPE_SCE], AAC_CHANNEL_FRONT, gb, num_front);
      decode_channel_map(new_che_pos[TYPE_CPE], new_che_pos[TYPE_SCE], AAC_CHANNEL_SIDE,  gb, num_side );
      decode_channel_map(new_che_pos[TYPE_CPE], new_che_pos[TYPE_SCE], AAC_CHANNEL_BACK,  gb, num_back );
@@@ -722,16 -703,13 +722,13 @@@ static void decode_ltp(AACContext *ac, 
  
  /**
   * Decode Individual Channel Stream info; reference: table 4.6.
-  *
-  * @param   common_window   Channels have independent [0], or shared [1], Individual Channel Stream information.
   */
  static int decode_ics_info(AACContext *ac, IndividualChannelStream *ics,
-                            GetBitContext *gb, int common_window)
+                            GetBitContext *gb)
  {
      if (get_bits1(gb)) {
          av_log(ac->avctx, AV_LOG_ERROR, "Reserved bit set.\n");
-         memset(ics, 0, sizeof(IndividualChannelStream));
-         return -1;
+         return AVERROR_INVALIDDATA;
      }
      ics->window_sequence[1] = ics->window_sequence[0];
      ics->window_sequence[0] = get_bits(gb, 2);
          if (ics->predictor_present) {
              if (ac->m4ac.object_type == AOT_AAC_MAIN) {
                  if (decode_prediction(ac, ics, gb)) {
-                     memset(ics, 0, sizeof(IndividualChannelStream));
-                     return -1;
+                     return AVERROR_INVALIDDATA;
                  }
              } else if (ac->m4ac.object_type == AOT_AAC_LC) {
                  av_log(ac->avctx, AV_LOG_ERROR, "Prediction is not allowed in AAC-LC.\n");
-                 memset(ics, 0, sizeof(IndividualChannelStream));
-                 return -1;
+                 return AVERROR_INVALIDDATA;
              } else {
                  if ((ics->ltp.present = get_bits(gb, 1)))
                      decode_ltp(ac, &ics->ltp, gb, ics->max_sfb);
          av_log(ac->avctx, AV_LOG_ERROR,
                 "Number of scalefactor bands in group (%d) exceeds limit (%d).\n",
                 ics->max_sfb, ics->num_swb);
-         memset(ics, 0, sizeof(IndividualChannelStream));
-         return -1;
+         return AVERROR_INVALIDDATA;
      }
  
      return 0;
@@@ -1390,8 -1365,8 +1384,8 @@@ static int decode_ics(AACContext *ac, S
      global_gain = get_bits(gb, 8);
  
      if (!common_window && !scale_flag) {
-         if (decode_ics_info(ac, ics, gb, 0) < 0)
-             return -1;
+         if (decode_ics_info(ac, ics, gb) < 0)
+             return AVERROR_INVALIDDATA;
      }
  
      if (decode_band_types(ac, sce->band_type, sce->band_type_run_end, gb, ics) < 0)
@@@ -1507,8 -1482,8 +1501,8 @@@ static int decode_cpe(AACContext *ac, G
  
      common_window = get_bits1(gb);
      if (common_window) {
-         if (decode_ics_info(ac, &cpe->ch[0].ics, gb, 1))
-             return -1;
+         if (decode_ics_info(ac, &cpe->ch[0].ics, gb))
+             return AVERROR_INVALIDDATA;
          i = cpe->ch[1].ics.use_kb_window[0];
          cpe->ch[1].ics = cpe->ch[0].ics;
          cpe->ch[1].ics.use_kb_window[1] = i;
@@@ -2099,7 -2074,7 +2093,7 @@@ static int parse_adts_frame_header(AACC
  
      size = avpriv_aac_parse_header(gb, &hdr_info);
      if (size > 0) {
 -        if (hdr_info.chan_config) {
 +        if (hdr_info.chan_config && (hdr_info.chan_config!=ac->m4ac.chan_config || ac->m4ac.sample_rate!=hdr_info.sample_rate)) {
              enum ChannelPosition new_che_pos[4][MAX_ELEM_ID];
              memset(new_che_pos, 0, 4 * MAX_ELEM_ID * sizeof(new_che_pos[0][0]));
              ac->m4ac.chan_config = hdr_info.chan_config;
          }
          if (!ac->avctx->sample_rate)
              ac->avctx->sample_rate = hdr_info.sample_rate;
 -        if (hdr_info.num_aac_frames == 1) {
 -            if (!hdr_info.crc_absent)
 -                skip_bits(gb, 16);
 -        } else {
 +        if (!ac->warned_num_aac_frames && hdr_info.num_aac_frames != 1) {
 +            // This is 2 for "VLB " audio in NSV files.
 +            // See samples/nsv/vlb_audio.
              av_log_missing_feature(ac->avctx, "More than one AAC RDB per ADTS frame is", 0);
 -            return -1;
 +            ac->warned_num_aac_frames = 1;
          }
 +        if (!hdr_info.crc_absent)
 +            skip_bits(gb, 16);
      }
      return size;
  }
@@@ -2159,15 -2133,6 +2153,15 @@@ static int aac_decode_frame_int(AVCodec
          elem_id = get_bits(gb, 4);
  
          if (elem_type < TYPE_DSE) {
 +            if (!ac->tags_mapped && elem_type == TYPE_CPE && ac->m4ac.chan_config==1) {
 +                enum ChannelPosition new_che_pos[4][MAX_ELEM_ID]= {0};
 +                ac->m4ac.chan_config=2;
 +
 +                if (set_default_channel_config(ac->avctx, new_che_pos, 2)<0)
 +                    return -1;
 +                if (output_configure(ac, ac->che_pos, new_che_pos, 2, OC_TRIAL_FRAME)<0)
 +                    return -1;
 +            }
              if (!(che=get_che(ac, elem_type, elem_id))) {
                  av_log(ac->avctx, AV_LOG_ERROR, "channel element %d.%d is not allocated\n",
                         elem_type, elem_id);
  static int aac_decode_frame(AVCodecContext *avctx, void *data,
                              int *got_frame_ptr, AVPacket *avpkt)
  {
+     AACContext *ac = avctx->priv_data;
      const uint8_t *buf = avpkt->data;
      int buf_size = avpkt->size;
      GetBitContext gb;
      int buf_consumed;
      int buf_offset;
      int err;
+     int new_extradata_size;
+     const uint8_t *new_extradata = av_packet_get_side_data(avpkt,
+                                        AV_PKT_DATA_NEW_EXTRADATA,
+                                        &new_extradata_size);
+     if (new_extradata) {
+         av_free(avctx->extradata);
+         avctx->extradata = av_mallocz(new_extradata_size +
+                                       FF_INPUT_BUFFER_PADDING_SIZE);
+         if (!avctx->extradata)
+             return AVERROR(ENOMEM);
+         avctx->extradata_size = new_extradata_size;
+         memcpy(avctx->extradata, new_extradata, new_extradata_size);
+         if (decode_audio_specific_config(ac, ac->avctx, &ac->m4ac,
+                                          avctx->extradata,
+                                          avctx->extradata_size*8, 1) < 0)
+             return AVERROR_INVALIDDATA;
+     }
  
      init_get_bits(&gb, buf, buf_size * 8);
  
@@@ -2619,5 -2603,4 +2632,5 @@@ AVCodec ff_aac_latm_decoder = 
      },
      .capabilities = CODEC_CAP_CHANNEL_CONF | CODEC_CAP_DR1,
      .channel_layouts = aac_channel_layout,
 +    .flush = flush,
  };
diff --combined libavcodec/avcodec.h
@@@ -1,20 -1,20 +1,20 @@@
  /*
   * 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
   */
  
@@@ -78,8 -78,7 +78,8 @@@
   *
   * If you add a codec ID to this list, add it so that
   * 1. no value of a existing codec ID changes (that would break ABI),
 - * 2. it is as close as possible to similar codecs.
 + * 2. Give it a value which when taken as ASCII is recognized uniquely by a human as this specific codec.
 + *    This ensures that 2 forks can independantly add CodecIDs without producing conflicts.
   */
  enum CodecID {
      CODEC_ID_NONE,
      CODEC_ID_WMV3IMAGE,
      CODEC_ID_VC1IMAGE,
  #if LIBAVCODEC_VERSION_MAJOR == 53
 -    CODEC_ID_G723_1,
 -    CODEC_ID_G729,
 +    CODEC_ID_G723_1_DEPRECATED,
 +    CODEC_ID_G729_DEPRECATED,
  #endif
 -    CODEC_ID_UTVIDEO,
 +    CODEC_ID_UTVIDEO_DEPRECATED,
      CODEC_ID_BMV_VIDEO,
      CODEC_ID_VBLE,
      CODEC_ID_DXTORY,
      CODEC_ID_V410,
 +    CODEC_ID_UTVIDEO = 0x800,
 +    CODEC_ID_ESCAPE130  = MKBETAG('E','1','3','0'),
 +
 +    CODEC_ID_G2M        = MKBETAG( 0 ,'G','2','M'),
  
      /* various PCM "codecs" */
      CODEC_ID_FIRST_AUDIO = 0x10000,     ///< A dummy id pointing at the start of audio codecs
      CODEC_ID_QDMC,
      CODEC_ID_CELT,
  #if LIBAVCODEC_VERSION_MAJOR > 53
 -    CODEC_ID_G723_1,
 -    CODEC_ID_G729,
 +    CODEC_ID_G723_1_DEPRECATED,
 +    CODEC_ID_G729_DEPRECATED,
      CODEC_ID_8SVX_EXP,
      CODEC_ID_8SVX_FIB,
  #endif
      CODEC_ID_BMV_AUDIO,
 +    CODEC_ID_G729 = 0x15800,
 +    CODEC_ID_G723_1= 0x15801,
 +    CODEC_ID_FFWAVESYNTH = MKBETAG('F','F','W','S'),
 +    CODEC_ID_8SVX_RAW   = MKBETAG('8','S','V','X'),
  
      /* subtitle codecs */
      CODEC_ID_FIRST_SUBTITLE = 0x17000,          ///< A dummy ID pointing at the start of subtitle codecs.
      CODEC_ID_HDMV_PGS_SUBTITLE,
      CODEC_ID_DVB_TELETEXT,
      CODEC_ID_SRT,
 +    CODEC_ID_MICRODVD   = MKBETAG('m','D','V','D'),
  
      /* other specific kind of codecs (generally used for attachments) */
      CODEC_ID_FIRST_UNKNOWN = 0x18000,           ///< A dummy ID pointing at the start of various fake codecs.
      CODEC_ID_TTF = 0x18000,
 +    CODEC_ID_BINTEXT    = MKBETAG('B','T','X','T'),
 +    CODEC_ID_XBIN       = MKBETAG('X','B','I','N'),
 +    CODEC_ID_IDF        = MKBETAG( 0 ,'I','D','F'),
  
      CODEC_ID_PROBE = 0x19000, ///< codec_id is not known (like CODEC_ID_NONE) but lavf should attempt to identify it
  
   * Note: If the first 23 bits of the additional bytes are not 0, then damaged
   * MPEG bitstreams could cause overread and segfault.
   */
 -#define FF_INPUT_BUFFER_PADDING_SIZE 8
 +#define FF_INPUT_BUFFER_PADDING_SIZE 16
  
  /**
   * minimum encoding buffer size
@@@ -559,7 -546,6 +559,7 @@@ enum AVColorTransferCharacteristic
      AVCOL_TRC_UNSPECIFIED=2,
      AVCOL_TRC_GAMMA22    =4, ///< also ITU-R BT470M / ITU-R BT1700 625 PAL & SECAM
      AVCOL_TRC_GAMMA28    =5, ///< also ITU-R BT470BG
 +    AVCOL_TRC_SMPTE240M  =7,
      AVCOL_TRC_NB           , ///< Not part of ABI
  };
  
@@@ -571,7 -557,6 +571,7 @@@ enum AVColorSpace
      AVCOL_SPC_BT470BG    =5, ///< also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM / IEC 61966-2-4 xvYCC601
      AVCOL_SPC_SMPTE170M  =6, ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC / functionally identical to above
      AVCOL_SPC_SMPTE240M  =7,
 +    AVCOL_SPC_YCGCO      =8,
      AVCOL_SPC_NB           , ///< Not part of ABI
  };
  
@@@ -675,7 -660,6 +675,7 @@@ typedef struct RcOverride
  #define CODEC_FLAG2_LOCAL_HEADER  0x00000008 ///< Place global headers at every keyframe instead of in extradata.
  #define CODEC_FLAG2_SKIP_RD       0x00004000 ///< RD optimal MB level residual skipping
  #define CODEC_FLAG2_CHUNKS        0x00008000 ///< Input bitstream might be truncated at a packet boundaries instead of only at frame boundaries.
 +#define CODEC_FLAG2_SHOW_ALL      0x00400000 ///< Show all frames before the first keyframe
  /**
   * @defgroup deprecated_flags Deprecated codec flags
   * Use corresponding private codec options instead.
   * Codec should fill in channel configuration and samplerate instead of container
   */
  #define CODEC_CAP_CHANNEL_CONF     0x0400
 +
  /**
   * Codec is able to deal with negative linesizes
   */
  #define CODEC_CAP_NEG_LINESIZES    0x0800
 +
  /**
   * Codec supports frame-level multithreading.
   */
   * Codec supports slice-based (or partition-based) multithreading.
   */
  #define CODEC_CAP_SLICE_THREADS    0x2000
+ /**
+  * Codec supports changed parameters at any point.
+  */
+ #define CODEC_CAP_PARAM_CHANGE     0x4000
 +/**
 + * Codec is lossless.
 + */
 +#define CODEC_CAP_LOSSLESS         0x80000000
  
  //The following defines may change, don't expect compatibility if you use them.
  #define MB_TYPE_INTRA4x4   0x0001
@@@ -877,6 -859,8 +881,8 @@@ typedef struct AVPanScan
  
  enum AVPacketSideDataType {
      AV_PKT_DATA_PALETTE,
+     AV_PKT_DATA_NEW_EXTRADATA,
+     AV_PKT_DATA_PARAM_CHANGE,
  };
  
  typedef struct AVPacket {
  #define AV_PKT_FLAG_KEY     0x0001 ///< The packet contains a keyframe
  #define AV_PKT_FLAG_CORRUPT 0x0002 ///< The packet content is corrupted
  
+ /**
+  * An AV_PKT_DATA_PARAM_CHANGE side data packet is laid out as follows:
+  * u32le param_flags
+  * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT)
+  *     s32le channel_count
+  * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT)
+  *     u64le channel_layout
+  * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE)
+  *     s32le sample_rate
+  * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS)
+  *     s32le width
+  *     s32le height
+  */
+ enum AVSideDataParamChangeFlags {
+     AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT  = 0x0001,
+     AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT = 0x0002,
+     AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE    = 0x0004,
+     AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS     = 0x0008,
+ };
  /**
   * Audio Video Frame.
   * New fields can be added to the end of AVFRAME with minor version
 - * bumps. Removal, reordering and changes to existing fields require
 + * bumps. Similarly fields that are marked as to be only accessed by
 + * av_opt_ptr() can be reordered. This allows 2 forks to add fields
 + * without breaking compatibility with each other.
 + * Removal, reordering and changes in the remaining cases require
   * a major version bump.
 - * sizeof(AVFrame) must not be used outside libav*.
 + * sizeof(AVFrame) must not be used outside libavcodec.
   */
  typedef struct AVFrame {
  #if FF_API_DATA_POINTERS
      int64_t reordered_opaque;
  
      /**
 -     * hardware accelerator private data (Libav-allocated)
 +     * hardware accelerator private data (FFmpeg-allocated)
       * - encoding: unused
       * - decoding: Set by libavcodec
       */
       * decoding: set by AVCodecContext.get_buffer()
       */
      uint8_t **extended_data;
 +
 +    /**
 +     * frame timestamp estimated using various heuristics, in stream time base
 +     * Code outside libavcodec should access this field using:
 +     *  av_opt_ptr(avcodec_get_frame_class(), frame, "best_effort_timestamp");
 +     * - encoding: unused
 +     * - decoding: set by libavcodec, read by user.
 +     */
 +    int64_t best_effort_timestamp;
 +
 +    /**
 +     * reordered pos from the last AVPacket that has been input into the decoder
 +     * Code outside libavcodec should access this field using:
 +     *  av_opt_ptr(avcodec_get_frame_class(), frame, "pkt_pos");
 +     * - encoding: unused
 +     * - decoding: Read by user.
 +     */
 +    int64_t pkt_pos;
 +
 +    /**
 +     * reordered sample aspect ratio for the video frame, 0/1 if unknown\unspecified
 +     * Code outside libavcodec should access this field using:
 +     *  av_opt_ptr(avcodec_get_frame_class(), frame, "sample_aspect_ratio");
 +     * - encoding: unused
 +     * - decoding: Read by user.
 +     */
 +    AVRational sample_aspect_ratio;
 +
 +    /**
 +     * width and height of the video frame
 +     * Code outside libavcodec should access this field using:
 +     *  av_opt_ptr(avcodec_get_frame_class(), frame, "width");
 +     * - encoding: unused
 +     * - decoding: Read by user.
 +     */
 +    int width, height;
 +
 +    /**
 +     * format of the frame, -1 if unknown or unset
 +     * It should be cast to the corresponding enum (enum PixelFormat
 +     * for video, enum AVSampleFormat for audio)
 +     * Code outside libavcodec should access this field using:
 +     *  av_opt_ptr(avcodec_get_frame_class(), frame, "format");
 +     * - encoding: unused
 +     * - decoding: Read by user.
 +     */
 +    int format;
 +
  } AVFrame;
  
  struct AVCodecInternal;
   * New fields can be added to the end with minor version bumps.
   * Removal, reordering and changes to existing fields require a major
   * version bump.
 + * Please use AVOptions (av_opt* / av_set/get*()) to access these fields from user
 + * applications.
   * sizeof(AVCodecContext) must not be used outside libav*.
   */
  typedef struct AVCodecContext {
      int frame_number;   ///< audio or video frame number
  
      /**
 -     * Number of frames the decoded output will be delayed relative to
 -     * the encoded input.
 +     * Encoding: Number of frames delay there will be from the encoder input to
 +     *           the decoder output. (we assume the decoder matches the spec)
 +     * Decoding: Number of frames delay in addition to what a standard decoder
 +     *           as specified in the spec would produce.
       * - encoding: Set by libavcodec.
 -     * - decoding: unused
 +     * - decoding: Set by libavcodec.
       */
      int delay;
  
  #endif
  
      /**
 -     * GOP timecode frame start number, in non drop frame format
 -     * - encoding: Set by user.
 -     * - decoding: unused
 +     * GOP timecode frame start number
 +     * - encoding: Set by user, in non drop frame format
 +     * - decoding: Set by libavcodec (timecode in the 25 bits format, -1 if unset)
       */
      int64_t timecode_frame_start;
  
      /**
       * Audio channel layout.
       * - encoding: set by user.
 -     * - decoding: set by libavcodec.
 +     * - decoding: set by user, may be overwritten by libavcodec.
       */
      uint64_t channel_layout;
  
       * Hardware accelerator context.
       * For some hardware accelerators, a global context needs to be
       * provided by the user. In that case, this holds display-dependent
 -     * data Libav cannot instantiate itself. Please refer to the
 -     * Libav HW accelerator documentation to know how to fill this
 +     * data FFmpeg cannot instantiate itself. Please refer to the
 +     * FFmpeg HW accelerator documentation to know how to fill this
       * is. e.g. for VA API, this is a struct vaapi_context.
       * - encoding: unused
       * - decoding: Set by user
      enum AVAudioServiceType audio_service_type;
  
      /**
 -     * Used to request a sample format from the decoder.
 -     * - encoding: unused.
 +     * desired sample format
 +     * - encoding: Not used.
       * - decoding: Set by user.
 +     * Decoder will decode to this format if it can.
       */
      enum AVSampleFormat request_sample_fmt;
  
  #define AV_EF_BUFFER    (1<<2)
  #define AV_EF_EXPLODE   (1<<3)
  
 +#define AV_EF_CAREFUL    (1<<16)
 +#define AV_EF_COMPLIANT  (1<<17)
 +#define AV_EF_AGGRESSIVE (1<<18)
 +
      /**
       * Private context used for internal data.
       *
       * libavcodec functions.
       */
      struct AVCodecInternal *internal;
 +
 +    /**
 +     * Current statistics for PTS correction.
 +     * - decoding: maintained and used by libavcodec, not intended to be used by user apps
 +     * - encoding: unused
 +     */
 +    int64_t pts_correction_num_faulty_pts; /// Number of incorrect PTS values so far
 +    int64_t pts_correction_num_faulty_dts; /// Number of incorrect DTS values so far
 +    int64_t pts_correction_last_pts;       /// PTS of the last frame
 +    int64_t pts_correction_last_dts;       /// DTS of the last frame
 +
  } AVCodecContext;
  
  /**
@@@ -3516,11 -3450,6 +3543,11 @@@ uint8_t* av_packet_new_side_data(AVPack
  uint8_t* av_packet_get_side_data(AVPacket *pkt, enum AVPacketSideDataType type,
                                   int *size);
  
 +int av_packet_merge_side_data(AVPacket *pkt);
 +
 +int av_packet_split_side_data(AVPacket *pkt);
 +
 +
  /* resample.c */
  
  struct ReSampleContext;
@@@ -3678,17 -3607,8 +3705,17 @@@ int avpicture_layout(const AVPicture* s
  int avpicture_get_size(enum PixelFormat pix_fmt, int width, int height);
  void avcodec_get_chroma_sub_sample(enum PixelFormat pix_fmt, int *h_shift, int *v_shift);
  
 +/**
 + * Get the name of a codec.
 + * @return  a static string identifying the codec; never NULL
 + */
 +const char *avcodec_get_name(enum CodecID id);
 +
  #if FF_API_GET_PIX_FMT_NAME
  /**
 + * Return the short name for a pixel format.
 + *
 + * \see av_get_pix_fmt(), av_get_pix_fmt_string().
   * @deprecated Deprecated in favor of av_get_pix_fmt_name().
   */
  attribute_deprecated
@@@ -3735,8 -3655,7 +3762,8 @@@ size_t av_get_codec_tag_string(char *bu
   * @param[in] dst_pix_fmt destination pixel format
   * @param[in] src_pix_fmt source pixel format
   * @param[in] has_alpha Whether the source pixel format alpha channel is used.
 - * @return Combination of flags informing you what kind of losses will occur.
 + * @return Combination of flags informing you what kind of losses will occur
 + * (maximum loss for an invalid dst_pix_fmt).
   */
  int avcodec_get_pix_fmt_loss(enum PixelFormat dst_pix_fmt, enum PixelFormat src_pix_fmt,
                               int has_alpha);
   * The pixel formats from which it chooses one, are determined by the
   * pix_fmt_mask parameter.
   *
 + * Note, only the first 64 pixel formats will fit in pix_fmt_mask.
 + *
   * @code
   * src_pix_fmt = PIX_FMT_YUV420P;
 - * pix_fmt_mask = (1 << PIX_FMT_YUV422P) || (1 << PIX_FMT_RGB24);
 + * pix_fmt_mask = (1 << PIX_FMT_YUV422P) | (1 << PIX_FMT_RGB24);
   * dst_pix_fmt = avcodec_find_best_pix_fmt(pix_fmt_mask, src_pix_fmt, alpha, &loss);
   * @endcode
   *
  enum PixelFormat avcodec_find_best_pix_fmt(int64_t pix_fmt_mask, enum PixelFormat src_pix_fmt,
                                int has_alpha, int *loss_ptr);
  
 +/**
 + * Find the best pixel format to convert to given a certain source pixel
 + * format and a selection of two destination pixel formats. When converting from
 + * one pixel format to another, information loss may occur.  For example, when converting
 + * from RGB24 to GRAY, the color information will be lost. Similarly, other losses occur when
 + * converting from some formats to other formats. avcodec_find_best_pix_fmt2() selects which of
 + * the given pixel formats should be used to suffer the least amount of loss.
 + *
 + * If one of the destination formats is PIX_FMT_NONE the other pixel format (if valid) will be
 + * returned.
 + *
 + * @code
 + * src_pix_fmt = PIX_FMT_YUV420P;
 + * dst_pix_fmt1= PIX_FMT_RGB24;
 + * dst_pix_fmt2= PIX_FMT_GRAY8;
 + * dst_pix_fmt3= PIX_FMT_RGB8;
 + * loss= FF_LOSS_CHROMA; // don't care about chroma loss, so chroma loss will be ignored.
 + * dst_pix_fmt = avcodec_find_best_pix_fmt2(dst_pix_fmt1, dst_pix_fmt2, src_pix_fmt, alpha, &loss);
 + * dst_pix_fmt = avcodec_find_best_pix_fmt2(dst_pix_fmt, dst_pix_fmt3, src_pix_fmt, alpha, &loss);
 + * @endcode
 + *
 + * @param[in] dst_pix_fmt1 One of the two destination pixel formats to choose from
 + * @param[in] dst_pix_fmt2 The other of the two destination pixel formats to choose from
 + * @param[in] src_pix_fmt Source pixel format
 + * @param[in] has_alpha Whether the source pixel format alpha channel is used.
 + * @param[in, out] loss_ptr Combination of loss flags. In: selects which of the losses to ignore, i.e.
 + *                               NULL or value of zero means we care about all losses. Out: the loss
 + *                               that occurs when converting from src to selected dst pixel format.
 + * @return The best pixel format to convert to or -1 if none was found.
 + */
 +enum PixelFormat avcodec_find_best_pix_fmt2(enum PixelFormat dst_pix_fmt1, enum PixelFormat dst_pix_fmt2,
 +                                            enum PixelFormat src_pix_fmt, int has_alpha, int *loss_ptr);
 +
  #if FF_API_GET_ALPHA_INFO
  #define FF_ALPHA_TRANSP       0x0001 /* image has some totally transparent pixels */
  #define FF_ALPHA_SEMI_TRANSP  0x0002 /* image has some transparent pixels */
@@@ -4630,7 -4514,7 +4657,7 @@@ unsigned int av_xiphlacing(unsigned cha
  
  /**
   * Log a generic warning message about a missing feature. This function is
 - * intended to be used internally by Libav (libavcodec, libavformat, etc.)
 + * intended to be used internally by FFmpeg (libavcodec, libavformat, etc.)
   * only, and would normally not be used by applications.
   * @param[in] avc a pointer to an arbitrary struct of which the first field is
   * a pointer to an AVClass struct
@@@ -4644,7 -4528,7 +4671,7 @@@ void av_log_missing_feature(void *avc, 
  
  /**
   * Log a generic warning message asking for a sample. This function is
 - * intended to be used internally by Libav (libavcodec, libavformat, etc.)
 + * intended to be used internally by FFmpeg (libavcodec, libavformat, etc.)
   * only, and would normally not be used by applications.
   * @param[in] avc a pointer to an arbitrary struct of which the first field is
   * a pointer to an AVClass struct
@@@ -4681,7 -4565,7 +4708,7 @@@ enum AVLockOp 
   * lockmgr should store/get a pointer to a user allocated mutex. It's
   * NULL upon AV_LOCK_CREATE and != NULL for all other ops.
   *
 - * @param cb User defined callback. Note: Libav may invoke calls to this
 + * @param cb User defined callback. Note: FFmpeg may invoke calls to this
   *           callback during the call to av_lockmgr_register().
   *           Thus, the application must be prepared to handle that.
   *           If cb is set to NULL the lockmgr will be unregistered.
@@@ -4703,12 -4587,4 +4730,12 @@@ enum AVMediaType avcodec_get_type(enum 
   */
  const AVClass *avcodec_get_class(void);
  
 +/**
 + * Get the AVClass for AVFrame. It can be used in combination with
 + * AV_OPT_SEARCH_FAKE_OBJ for examining options.
 + *
 + * @see av_opt_find().
 + */
 +const AVClass *avcodec_get_frame_class(void);
 +
  #endif /* AVCODEC_AVCODEC_H */
diff --combined libavcodec/h264.c
@@@ -2,20 -2,20 +2,20 @@@
   * H.26L/H.264/AVC/JVT/14496-10/... decoder
   * 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
   */
  
   * @author Michael Niedermayer <michaelni@gmx.at>
   */
  
 +#define UNCHECKED_BITSTREAM_READER 1
 +
  #include "libavutil/imgutils.h"
 +#include "libavutil/opt.h"
  #include "internal.h"
  #include "dsputil.h"
  #include "avcodec.h"
@@@ -102,9 -99,13 +102,9 @@@ int ff_h264_check_intra4x4_pred_mode(H2
      }
  
      return 0;
 -} //FIXME cleanup like ff_h264_check_intra_pred_mode
 +} //FIXME cleanup like check_intra_pred_mode
  
 -/**
 - * Check if the top & left blocks are available if needed and
 - * change the dc mode so it only uses the available blocks.
 - */
 -int ff_h264_check_intra_pred_mode(H264Context *h, int mode){
 +static int check_intra_pred_mode(H264Context *h, int mode, int is_chroma){
      MpegEncContext * const s = &h->s;
      static const int8_t top [7]= {LEFT_DC_PRED8x8, 1,-1,-1};
      static const int8_t left[7]= { TOP_DC_PRED8x8,-1, 2,-1,DC_128_PRED8x8};
  
      if((h->left_samples_available&0x8080) != 0x8080){
          mode= left[ mode ];
 -        if(h->left_samples_available&0x8080){ //mad cow disease mode, aka MBAFF + constrained_intra_pred
 +        if(is_chroma && (h->left_samples_available&0x8080)){ //mad cow disease mode, aka MBAFF + constrained_intra_pred
              mode= ALZHEIMER_DC_L0T_PRED8x8 + (!(h->left_samples_available&0x8000)) + 2*(mode == DC_128_PRED8x8);
          }
          if(mode<0){
      return mode;
  }
  
 +/**
 + * checks if the top & left blocks are available if needed & changes the dc mode so it only uses the available blocks.
 + */
 +int ff_h264_check_intra16x16_pred_mode(H264Context *h, int mode)
 +{
 +    return check_intra_pred_mode(h, mode, 0);
 +}
 +
 +/**
 + * checks if the top & left blocks are available if needed & changes the dc mode so it only uses the available blocks.
 + */
 +int ff_h264_check_intra_chroma_pred_mode(H264Context *h, int mode)
 +{
 +    return check_intra_pred_mode(h, mode, 1);
 +}
 +
 +
  const uint8_t *ff_h264_decode_nal(H264Context *h, const uint8_t *src, int *dst_length, int *consumed, int length){
      int i, si, di;
      uint8_t *dst;
          i-= RS;
      }
  
 -    if(i>=length-1){ //no escaped 0
 -        *dst_length= length;
 -        *consumed= length+1; //+1 for the header
 -        return src;
 -    }
 -
      bufidx = h->nal_unit_type == NAL_DPC ? 1 : 0; // use second escape buffer for inter data
 -    av_fast_malloc(&h->rbsp_buffer[bufidx], &h->rbsp_buffer_size[bufidx], length+FF_INPUT_BUFFER_PADDING_SIZE);
 +    si=h->rbsp_buffer_size[bufidx];
 +    av_fast_malloc(&h->rbsp_buffer[bufidx], &h->rbsp_buffer_size[bufidx], length+FF_INPUT_BUFFER_PADDING_SIZE+MAX_MBPAIR_SIZE);
      dst= h->rbsp_buffer[bufidx];
 +    if(si != h->rbsp_buffer_size[bufidx])
 +        memset(dst + length, 0, FF_INPUT_BUFFER_PADDING_SIZE+MAX_MBPAIR_SIZE);
  
      if (dst == NULL){
          return NULL;
      }
  
 +    if(i>=length-1){ //no escaped 0
 +        *dst_length= length;
 +        *consumed= length+1; //+1 for the header
 +        if(h->s.avctx->flags2 & CODEC_FLAG2_FAST){
 +            return src;
 +        }else{
 +            memcpy(dst, src, length);
 +            return dst;
 +        }
 +    }
 +
  //printf("decoding esc\n");
      memcpy(dst, src, i);
      si=di=i;
@@@ -733,7 -709,7 +733,7 @@@ prefetch_motion(H264Context *h, int lis
              s->dsp.prefetch(src[1]+off, s->linesize, 4);
              s->dsp.prefetch(src[2]+off, s->linesize, 4);
          }else{
 -            off= ((mx>>1) << pixel_shift) + ((my>>1) + (s->mb_x&7))*s->uvlinesize + (64 << pixel_shift);
 +            off= (((mx>>1)+64)<<pixel_shift) + ((my>>1) + (s->mb_x&7))*s->uvlinesize;
              s->dsp.prefetch(src[1]+off, src[2]-src[1], 2);
          }
      }
@@@ -1055,38 -1031,29 +1055,38 @@@ static av_cold void common_init(H264Con
      s->height = s->avctx->height;
      s->codec_id= s->avctx->codec->id;
  
 -    ff_h264dsp_init(&h->h264dsp, 8, 1);
 -    ff_h264_pred_init(&h->hpc, s->codec_id, 8, 1);
 +    s->avctx->bits_per_raw_sample = 8;
 +    h->cur_chroma_format_idc = 1;
 +
 +    ff_h264dsp_init(&h->h264dsp,
 +                    s->avctx->bits_per_raw_sample, h->cur_chroma_format_idc);
 +    ff_h264_pred_init(&h->hpc, s->codec_id,
 +                      s->avctx->bits_per_raw_sample, h->cur_chroma_format_idc);
  
      h->dequant_coeff_pps= -1;
      s->unrestricted_mv=1;
  
 +    s->dsp.dct_bits = 16;
      dsputil_init(&s->dsp, s->avctx); // needed so that idct permutation is known early
  
      memset(h->pps.scaling_matrix4, 16, 6*16*sizeof(uint8_t));
      memset(h->pps.scaling_matrix8, 16, 2*64*sizeof(uint8_t));
  }
  
 -int ff_h264_decode_extradata(H264Context *h)
 +int ff_h264_decode_extradata(H264Context *h, const uint8_t *buf, int size)
  {
      AVCodecContext *avctx = h->s.avctx;
  
 -    if(avctx->extradata[0] == 1){
 +    if(!buf || size <= 0)
 +        return -1;
 +
 +    if(buf[0] == 1){
          int i, cnt, nalsize;
 -        unsigned char *p = avctx->extradata;
 +        const unsigned char *p = buf;
  
          h->is_avc = 1;
  
 -        if(avctx->extradata_size < 7) {
 +        if(size < 7) {
              av_log(avctx, AV_LOG_ERROR, "avcC too short\n");
              return -1;
          }
          p += 6;
          for (i = 0; i < cnt; i++) {
              nalsize = AV_RB16(p) + 2;
 -            if (p - avctx->extradata + nalsize > avctx->extradata_size)
 +            if(nalsize > size - (p-buf))
                  return -1;
              if(decode_nal_units(h, p, nalsize) < 0) {
                  av_log(avctx, AV_LOG_ERROR, "Decoding sps %d from avcC failed\n", i);
          cnt = *(p++); // Number of pps
          for (i = 0; i < cnt; i++) {
              nalsize = AV_RB16(p) + 2;
 -            if (p - avctx->extradata + nalsize > avctx->extradata_size)
 +            if(nalsize > size - (p-buf))
                  return -1;
              if (decode_nal_units(h, p, nalsize) < 0) {
                  av_log(avctx, AV_LOG_ERROR, "Decoding pps %d from avcC failed\n", i);
              p += nalsize;
          }
          // Now store right nal length size, that will be use to parse all other nals
 -        h->nal_length_size = (avctx->extradata[4] & 0x03) + 1;
 +        h->nal_length_size = (buf[4] & 0x03) + 1;
      } else {
          h->is_avc = 0;
 -        if(decode_nal_units(h, avctx->extradata, avctx->extradata_size) < 0)
 +        if(decode_nal_units(h, buf, size) < 0)
              return -1;
      }
      return 0;
@@@ -1159,7 -1126,6 +1159,7 @@@ av_cold int ff_h264_decode_init(AVCodec
      for (i = 0; i < MAX_DELAYED_PIC_COUNT; i++)
          h->last_pocs[i] = INT_MIN;
      h->prev_poc_msb= 1<<16;
 +    h->prev_frame_num= -1;
      h->x264_build = -1;
      ff_h264_reset_sei(h);
      if(avctx->codec_id == CODEC_ID_H264){
      }
  
      if(avctx->extradata_size > 0 && avctx->extradata &&
 -        ff_h264_decode_extradata(h))
 +        ff_h264_decode_extradata(h, avctx->extradata, avctx->extradata_size))
          return -1;
  
      if(h->sps.bitstream_restriction_flag && s->avctx->has_b_frames < h->sps.num_reorder_frames){
@@@ -1295,7 -1261,6 +1295,7 @@@ static int decode_update_thread_context
      copy_picture_range(h->delayed_pic, h1->delayed_pic, MAX_DELAYED_PIC_COUNT+2, s, s1);
  
      h->last_slice_type = h1->last_slice_type;
 +    h->sync            = h1->sync;
  
      if(!s->current_picture_ptr) return 0;
  
@@@ -1385,6 -1350,7 +1385,6 @@@ static void decode_postinit(H264Contex
      Picture *out = s->current_picture_ptr;
      Picture *cur = s->current_picture_ptr;
      int i, pics, out_of_order, out_idx;
 -    int invalid = 0, cnt = 0;
  
      s->current_picture_ptr->f.qscale_type = FF_QSCALE_TYPE_H264;
      s->current_picture_ptr->f.pict_type   = s->pict_type;
          }
      }
  
 +    cur->mmco_reset = h->mmco_reset;
 +    h->mmco_reset = 0;
      //FIXME do something with unavailable reference frames
  
      /* Sort B-frames into display order */
          s->low_delay= 0;
      }
  
 +    for (i = 0; 1; i++) {
 +        if(i == MAX_DELAYED_PIC_COUNT || cur->poc < h->last_pocs[i]){
 +            if(i)
 +                h->last_pocs[i-1] = cur->poc;
 +            break;
 +        } else if(i) {
 +            h->last_pocs[i-1]= h->last_pocs[i];
 +        }
 +    }
 +    out_of_order = MAX_DELAYED_PIC_COUNT - i;
 +    if(   cur->f.pict_type == AV_PICTURE_TYPE_B
 +       || (h->last_pocs[MAX_DELAYED_PIC_COUNT-2] > INT_MIN && h->last_pocs[MAX_DELAYED_PIC_COUNT-1] - h->last_pocs[MAX_DELAYED_PIC_COUNT-2] > 2))
 +        out_of_order = FFMAX(out_of_order, 1);
 +    if(s->avctx->has_b_frames < out_of_order && !h->sps.bitstream_restriction_flag){
 +        av_log(s->avctx, AV_LOG_WARNING, "Increasing reorder buffer to %d\n", out_of_order);
 +        s->avctx->has_b_frames = out_of_order;
 +        s->low_delay = 0;
 +    }
 +
      pics = 0;
      while(h->delayed_pic[pics]) pics++;
  
 -    assert(pics <= MAX_DELAYED_PIC_COUNT);
 +    av_assert0(pics <= MAX_DELAYED_PIC_COUNT);
  
      h->delayed_pic[pics++] = cur;
      if (cur->f.reference == 0)
          cur->f.reference = DELAYED_PIC_REF;
  
 -    /* Frame reordering. This code takes pictures from coding order and sorts
 -     * them by their incremental POC value into display order. It supports POC
 -     * gaps, MMCO reset codes and random resets.
 -     * A "display group" can start either with a IDR frame (f.key_frame = 1),
 -     * and/or can be closed down with a MMCO reset code. In sequences where
 -     * there is no delay, we can't detect that (since the frame was already
 -     * output to the user), so we also set h->mmco_reset to detect the MMCO
 -     * reset code.
 -     * FIXME: if we detect insufficient delays (as per s->avctx->has_b_frames),
 -     * we increase the delay between input and output. All frames affected by
 -     * the lag (e.g. those that should have been output before another frame
 -     * that we already returned to the user) will be dropped. This is a bug
 -     * that we will fix later. */
 -    for (i = 0; i < MAX_DELAYED_PIC_COUNT; i++) {
 -        cnt     += out->poc < h->last_pocs[i];
 -        invalid += out->poc == INT_MIN;
 -    }
 -    if (!h->mmco_reset && !cur->f.key_frame && cnt + invalid == MAX_DELAYED_PIC_COUNT && cnt > 0) {
 -        h->mmco_reset = 2;
 -        if (pics > 1)
 -            h->delayed_pic[pics - 2]->mmco_reset = 2;
 -    }
 -    if (h->mmco_reset || cur->f.key_frame) {
 -        for (i = 0; i < MAX_DELAYED_PIC_COUNT; i++)
 -            h->last_pocs[i] = INT_MIN;
 -        cnt     = 0;
 -        invalid = MAX_DELAYED_PIC_COUNT;
 -    }
      out = h->delayed_pic[0];
      out_idx = 0;
 -    for (i = 1; i < MAX_DELAYED_PIC_COUNT && h->delayed_pic[i] &&
 -         !h->delayed_pic[i-1]->mmco_reset && !h->delayed_pic[i]->f.key_frame; i++)
 -    {
 +    for (i = 1; h->delayed_pic[i] && !h->delayed_pic[i]->f.key_frame && !h->delayed_pic[i]->mmco_reset; i++)
          if(h->delayed_pic[i]->poc < out->poc){
              out = h->delayed_pic[i];
              out_idx = i;
          }
 -    }
 -    if (s->avctx->has_b_frames == 0 && (h->delayed_pic[0]->f.key_frame || h->mmco_reset))
 -        h->next_outputed_poc = INT_MIN;
 -    out_of_order = !out->f.key_frame && !h->mmco_reset && (out->poc < h->next_outputed_poc);
 -
 -    if(h->sps.bitstream_restriction_flag && s->avctx->has_b_frames >= h->sps.num_reorder_frames)
 -        { }
 -    else if (out_of_order && pics-1 == s->avctx->has_b_frames &&
 -             s->avctx->has_b_frames < MAX_DELAYED_PIC_COUNT) {
 -        if (invalid + cnt < MAX_DELAYED_PIC_COUNT) {
 -            s->avctx->has_b_frames = FFMAX(s->avctx->has_b_frames, cnt);
 -        }
 -        s->low_delay = 0;
 -    } else if (s->low_delay &&
 -               ((h->next_outputed_poc != INT_MIN && out->poc > h->next_outputed_poc + 2) ||
 -                cur->f.pict_type == AV_PICTURE_TYPE_B)) {
 -        s->low_delay = 0;
 -        s->avctx->has_b_frames++;
 -    }
 +    if (s->avctx->has_b_frames == 0 && (h->delayed_pic[0]->f.key_frame || h->delayed_pic[0]->mmco_reset))
 +        h->next_outputed_poc= INT_MIN;
 +    out_of_order = out->poc < h->next_outputed_poc;
  
 -    if(pics > s->avctx->has_b_frames){
 +    if(out_of_order || pics > s->avctx->has_b_frames){
          out->f.reference &= ~DELAYED_PIC_REF;
          out->owner2 = s; // for frame threading, the owner must be the second field's thread
                           // or else the first thread can release the picture and reuse it unsafely
          for(i=out_idx; h->delayed_pic[i]; i++)
              h->delayed_pic[i] = h->delayed_pic[i+1];
      }
 -    memmove(h->last_pocs, &h->last_pocs[1], sizeof(*h->last_pocs) * (MAX_DELAYED_PIC_COUNT - 1));
 -    h->last_pocs[MAX_DELAYED_PIC_COUNT - 1] = cur->poc;
      if(!out_of_order && pics > s->avctx->has_b_frames){
          h->next_output_pic = out;
 -        if (out->mmco_reset) {
 -            if (out_idx > 0) {
 -                h->next_outputed_poc = out->poc;
 -                h->delayed_pic[out_idx - 1]->mmco_reset = out->mmco_reset;
 -            } else {
 -                h->next_outputed_poc = INT_MIN;
 -            }
 -        } else {
 -            if (out_idx == 0 && pics > 1 && h->delayed_pic[0]->f.key_frame) {
 -                h->next_outputed_poc = INT_MIN;
 -            } else {
 -                h->next_outputed_poc = out->poc;
 -            }
 -        }
 -        h->mmco_reset = 0;
 +        if (out_idx == 0 && h->delayed_pic[0] && (h->delayed_pic[0]->f.key_frame || h->delayed_pic[0]->mmco_reset)) {
 +            h->next_outputed_poc = INT_MIN;
 +        } else
 +            h->next_outputed_poc = out->poc;
      }else{
 -        av_log(s->avctx, AV_LOG_DEBUG, "no picture\n");
 +        av_log(s->avctx, AV_LOG_DEBUG, "no picture %s\n", out_of_order ? "ooo" : "");
 +    }
 +
 +    if (h->next_output_pic && h->next_output_pic->sync) {
 +        h->sync |= 2;
      }
  
      if (setup_finished)
@@@ -1578,7 -1578,7 +1578,7 @@@ static av_always_inline void backup_mb_
                              AV_COPY128(top_border+16, src_cb + 15*uvlinesize);
                              AV_COPY128(top_border+32, src_cr + 15*uvlinesize);
                          }
 -                    } else if(chroma422) {
 +                    } else if(chroma422){
                          if (pixel_shift) {
                              AV_COPY128(top_border+32, src_cb + 15*uvlinesize);
                              AV_COPY128(top_border+48, src_cr + 15*uvlinesize);
@@@ -1818,7 -1818,7 +1818,7 @@@ static av_always_inline void hl_decode_
                                      idct_dc_add(ptr, h->mb + (i*16+p*256 << pixel_shift), linesize);
                                  else
                                      idct_add   (ptr, h->mb + (i*16+p*256 << pixel_shift), linesize);
 -                            }else
 +                            }else if(CONFIG_SVQ3_DECODER)
                                  ff_svq3_add_idct_c(ptr, h->mb + i*16+p*256, linesize, qscale, 0);
                          }
                      }
                          dctcoef_set(h->mb+(p*256 << pixel_shift), pixel_shift, dc_mapping[i], dctcoef_get(h->mb_luma_dc[p], pixel_shift, i));
                  }
              }
 -        }else
 +        }else if(CONFIG_SVQ3_DECODER)
              ff_svq3_luma_dc_dequant_idct_c(h->mb+p*256, h->mb_luma_dc[p], qscale);
      }
  }
@@@ -1882,7 -1882,7 +1882,7 @@@ static av_always_inline void hl_decode_
                      }
                  }
              }
 -        }else{
 +        }else if(CONFIG_SVQ3_DECODER) {
              for(i=0; i<16; i++){
                  if(h->non_zero_count_cache[ scan8[i+p*16] ] || h->mb[i*16+p*256]){ //FIXME benchmark weird rule, & below
                      uint8_t * const ptr= dest_y + block_offset[i];
@@@ -1953,8 -1953,8 +1953,8 @@@ static av_always_inline void hl_decode_
      }
  
      if (!simple && IS_INTRA_PCM(mb_type)) {
 +        const int bit_depth = h->sps.bit_depth_luma;
          if (pixel_shift) {
 -            const int bit_depth = h->sps.bit_depth_luma;
              int j;
              GetBitContext gb;
              init_get_bits(&gb, (uint8_t*)h->mb, 384*bit_depth);
                  if (!h->sps.chroma_format_idc) {
                      for (i = 0; i < block_h; i++) {
                          uint16_t *tmp_cb = (uint16_t*)(dest_cb + i*uvlinesize);
 -                        for (j = 0; j < 8; j++) {
 -                            tmp_cb[j] = 1 << (bit_depth - 1);
 -                        }
 -                    }
 -                    for (i = 0; i < block_h; i++) {
                          uint16_t *tmp_cr = (uint16_t*)(dest_cr + i*uvlinesize);
                          for (j = 0; j < 8; j++) {
 -                            tmp_cr[j] = 1 << (bit_depth - 1);
 +                            tmp_cb[j] = tmp_cr[j] = 1 << (bit_depth - 1);
                          }
                      }
                  } else {
              }
              if(simple || !CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){
                  if (!h->sps.chroma_format_idc) {
 -                    for (i = 0; i < block_h; i++) {
 -                        memset(dest_cb + i*uvlinesize, 128, 8);
 -                        memset(dest_cr + i*uvlinesize, 128, 8);
 +                    for (i=0; i<8; i++) {
 +                        memset(dest_cb + i*uvlinesize, 1 << (bit_depth - 1), 8);
 +                        memset(dest_cr + i*uvlinesize, 1 << (bit_depth - 1), 8);
                      }
                  } else {
 -                    for (i = 0; i < block_h; i++) {
 +                    for (i=0; i<block_h; i++) {
                          memcpy(dest_cb + i*uvlinesize, h->mb + 128 + i*4,  8);
                          memcpy(dest_cr + i*uvlinesize, h->mb + 160 + i*4,  8);
                      }
                      h->h264dsp.h264_idct_add8(dest, block_offset,
                                                h->mb, uvlinesize,
                                                h->non_zero_count_cache);
 -                }else{
 +                }
 +#if CONFIG_SVQ3_DECODER
 +                else{
                      h->h264dsp.h264_chroma_dc_dequant_idct(h->mb + 16*16*1, h->dequant4_coeff[IS_INTRA(mb_type) ? 1:4][h->chroma_qp[0]][0]);
                      h->h264dsp.h264_chroma_dc_dequant_idct(h->mb + 16*16*2, h->dequant4_coeff[IS_INTRA(mb_type) ? 2:5][h->chroma_qp[1]][0]);
                      for(j=1; j<3; j++){
                          }
                      }
                  }
 +#endif
              }
          }
      }
@@@ -2372,36 -2374,32 +2372,36 @@@ static void implicit_weight_table(H264C
   * instantaneous decoder refresh.
   */
  static void idr(H264Context *h){
 +    int i;
      ff_h264_remove_all_refs(h);
      h->prev_frame_num= 0;
      h->prev_frame_num_offset= 0;
 -    h->prev_poc_msb=
 +    h->prev_poc_msb= 1<<16;
      h->prev_poc_lsb= 0;
 +    for (i = 0; i < MAX_DELAYED_PIC_COUNT; i++)
 +        h->last_pocs[i] = INT_MIN;
  }
  
  /* forget old pics after a seek */
  static void flush_dpb(AVCodecContext *avctx){
      H264Context *h= avctx->priv_data;
      int i;
 -    for(i=0; i<MAX_DELAYED_PIC_COUNT; i++) {
 +    for(i=0; i<=MAX_DELAYED_PIC_COUNT; i++) {
          if(h->delayed_pic[i])
              h->delayed_pic[i]->f.reference = 0;
          h->delayed_pic[i]= NULL;
      }
 -    for (i = 0; i < MAX_DELAYED_PIC_COUNT; i++)
 -        h->last_pocs[i] = INT_MIN;
      h->outputed_poc=h->next_outputed_poc= INT_MIN;
      h->prev_interlaced_frame = 1;
      idr(h);
 +    h->prev_frame_num= -1;
      if(h->s.current_picture_ptr)
          h->s.current_picture_ptr->f.reference = 0;
      h->s.first_field= 0;
      ff_h264_reset_sei(h);
      ff_mpeg_flush(avctx);
 +    h->recovery_frame= -1;
 +    h->sync= 0;
  }
  
  static int init_poc(H264Context *h){
@@@ -2656,7 -2654,7 +2656,7 @@@ static int decode_slice_header(H264Cont
          s->me.qpel_avg= s->dsp.avg_h264_qpel_pixels_tab;
      }
  
 -    first_mb_in_slice= get_ue_golomb(&s->gb);
 +    first_mb_in_slice= get_ue_golomb_long(&s->gb);
  
      if(first_mb_in_slice == 0){ //FIXME better field boundary detection
          if(h0->current_slice && FIELD_PICTURE){
  
      s->chroma_y_shift = h->sps.chroma_format_idc <= 1; // 400 uses yuv420p
  
 -    s->width = 16*s->mb_width - (2>>CHROMA444)*FFMIN(h->sps.crop_right, (8<<CHROMA444)-1);
 -    if(h->sps.frame_mbs_only_flag)
 -        s->height= 16*s->mb_height - (1<<s->chroma_y_shift)*FFMIN(h->sps.crop_bottom, (16>>s->chroma_y_shift)-1);
 -    else
 -        s->height= 16*s->mb_height - (2<<s->chroma_y_shift)*FFMIN(h->sps.crop_bottom, (16>>s->chroma_y_shift)-1);
 +    s->width = 16*s->mb_width;
 +    s->height= 16*s->mb_height;
  
      if (s->context_initialized
 -        && (   s->width != s->avctx->width || s->height != s->avctx->height
 +        && (   s->width != s->avctx->coded_width || s->height != s->avctx->coded_height
 +            || s->avctx->bits_per_raw_sample != h->sps.bit_depth_luma
 +            || h->cur_chroma_format_idc != h->sps.chroma_format_idc
              || av_cmp_q(h->sps.sar, s->avctx->sample_aspect_ratio))) {
          if(h != h0) {
 -            av_log_missing_feature(s->avctx, "Width/height changing with threads is", 0);
 +            av_log_missing_feature(s->avctx, "Width/height/bit depth/chroma idc changing with threads is", 0);
              return -1;   // width / height changed during parallelized decoding
          }
          free_tables(h, 0);
          flush_dpb(s->avctx);
          MPV_common_end(s);
 +        h->list_count = 0;
      }
      if (!s->context_initialized) {
          if (h != h0) {
              av_log(h->s.avctx, AV_LOG_ERROR, "Cannot (re-)initialize context during parallel decoding.\n");
              return -1;
          }
 -
          avcodec_set_dimensions(s->avctx, s->width, s->height);
 +        s->avctx->width  -= (2>>CHROMA444)*FFMIN(h->sps.crop_right, (8<<CHROMA444)-1);
 +        s->avctx->height -= (1<<s->chroma_y_shift)*FFMIN(h->sps.crop_bottom, (16>>s->chroma_y_shift)-1) * (2 - h->sps.frame_mbs_only_flag);
          s->avctx->sample_aspect_ratio= h->sps.sar;
          av_assert0(s->avctx->sample_aspect_ratio.den);
  
 +        if (s->avctx->bits_per_raw_sample != h->sps.bit_depth_luma ||
 +            h->cur_chroma_format_idc != h->sps.chroma_format_idc) {
 +            if (h->sps.bit_depth_luma >= 8 && h->sps.bit_depth_luma <= 10 &&
 +                (h->sps.bit_depth_luma != 9 || !CHROMA422)) {
 +                s->avctx->bits_per_raw_sample = h->sps.bit_depth_luma;
 +                h->cur_chroma_format_idc = h->sps.chroma_format_idc;
 +                h->pixel_shift = h->sps.bit_depth_luma > 8;
 +
 +                ff_h264dsp_init(&h->h264dsp, h->sps.bit_depth_luma, h->sps.chroma_format_idc);
 +                ff_h264_pred_init(&h->hpc, s->codec_id, h->sps.bit_depth_luma, h->sps.chroma_format_idc);
 +                s->dsp.dct_bits = h->sps.bit_depth_luma > 8 ? 32 : 16;
 +                dsputil_init(&s->dsp, s->avctx);
 +            } else {
 +                av_log(s->avctx, AV_LOG_ERROR, "Unsupported bit depth: %d chroma_idc: %d\n",
 +                       h->sps.bit_depth_luma, h->sps.chroma_format_idc);
 +                return -1;
 +            }
 +        }
 +
          if(h->sps.video_signal_type_present_flag){
 -            s->avctx->color_range = h->sps.full_range ? AVCOL_RANGE_JPEG : AVCOL_RANGE_MPEG;
 +            s->avctx->color_range = h->sps.full_range>0 ? AVCOL_RANGE_JPEG : AVCOL_RANGE_MPEG;
              if(h->sps.colour_description_present_flag){
                  s->avctx->color_primaries = h->sps.color_primaries;
                  s->avctx->color_trc       = h->sps.color_trc;
                  break;
              default:
                  if (CHROMA444){
 +                    s->avctx->pix_fmt = s->avctx->color_range == AVCOL_RANGE_JPEG ? PIX_FMT_YUVJ444P : PIX_FMT_YUV444P;
                      if (s->avctx->colorspace == AVCOL_SPC_RGB) {
 -                        s->avctx->pix_fmt = PIX_FMT_GBRP;
 -                    } else
 -                        s->avctx->pix_fmt = s->avctx->color_range == AVCOL_RANGE_JPEG ? PIX_FMT_YUVJ444P : PIX_FMT_YUV444P;
 +                       s->avctx->pix_fmt = PIX_FMT_GBR24P;
 +                       av_log(h->s.avctx, AV_LOG_DEBUG, "Detected GBR colorspace.\n");
 +                    } else if (s->avctx->colorspace == AVCOL_SPC_YCGCO) {
 +                        av_log(h->s.avctx, AV_LOG_WARNING, "Detected unsupported YCgCo colorspace.\n");
 +                    }
                  } else if (CHROMA422) {
                      s->avctx->pix_fmt = s->avctx->color_range == AVCOL_RANGE_JPEG ? PIX_FMT_YUVJ422P : PIX_FMT_YUV422P;
                  }else{
                  c->sps = h->sps;
                  c->pps = h->pps;
                  c->pixel_shift = h->pixel_shift;
 +                c->cur_chroma_format_idc = h->cur_chroma_format_idc;
                  init_scan_tables(c);
                  clone_tables(c, h, i);
              }
      if(h->sps.frame_mbs_only_flag){
          s->picture_structure= PICT_FRAME;
      }else{
 +        if(!h->sps.direct_8x8_inference_flag && slice_type == AV_PICTURE_TYPE_B){
 +            av_log(h->s.avctx, AV_LOG_ERROR, "This stream was generated by a broken encoder, invalid 8x8 inference\n");
 +            return -1;
 +        }
          if(get_bits1(&s->gb)) { //field_pic_flag
              s->picture_structure= PICT_TOP_FIELD + get_bits1(&s->gb); //bottom_field_flag
          } else {
  
      if(h0->current_slice == 0){
          // Shorten frame num gaps so we don't have to allocate reference frames just to throw them away
 -        if(h->frame_num != h->prev_frame_num) {
 +        if(h->frame_num != h->prev_frame_num && h->prev_frame_num >= 0) {
              int unwrap_prev_frame_num = h->prev_frame_num, max_frame_num = 1<<h->sps.log2_max_frame_num;
  
              if (unwrap_prev_frame_num > h->frame_num) unwrap_prev_frame_num -= max_frame_num;
              }
          }
  
 -        while(h->frame_num !=  h->prev_frame_num &&
 +        while(h->frame_num !=  h->prev_frame_num && h->prev_frame_num >= 0 &&
                h->frame_num != (h->prev_frame_num+1)%(1<<h->sps.log2_max_frame_num)){
              Picture *prev = h->short_ref_count ? h->short_ref[0] : NULL;
              av_log(h->s.avctx, AV_LOG_DEBUG, "Frame num gap %d %d\n", h->frame_num, h->prev_frame_num);
                  s0->first_field = FIELD_PICTURE;
  
              } else {
 -                if (h->nal_ref_idc &&
 -                        s0->current_picture_ptr->f.reference &&
 -                        s0->current_picture_ptr->frame_num != h->frame_num) {
 +                if (s0->current_picture_ptr->frame_num != h->frame_num) {
                      /*
 -                     * This and previous field were reference, but had
 +                     * This and previous field had
                       * different frame_nums. Consider this field first in
                       * pair. Throw away previous field except for reference
                       * purposes.
      h->ref_count[1]= h->pps.ref_count[1];
  
      if(h->slice_type_nos != AV_PICTURE_TYPE_I){
 +        unsigned max= (16<<(s->picture_structure != PICT_FRAME))-1;
          if(h->slice_type_nos == AV_PICTURE_TYPE_B){
              h->direct_spatial_mv_pred= get_bits1(&s->gb);
          }
              if(h->slice_type_nos==AV_PICTURE_TYPE_B)
                  h->ref_count[1]= get_ue_golomb(&s->gb) + 1;
  
 -            if(h->ref_count[0]-1 > 32-1 || h->ref_count[1]-1 > 32-1){
 -                av_log(h->s.avctx, AV_LOG_ERROR, "reference overflow\n");
 -                h->ref_count[0]= h->ref_count[1]= 1;
 -                return -1;
 -            }
 +        }
 +        if(h->ref_count[0]-1 > max || h->ref_count[1]-1 > max){
 +            av_log(h->s.avctx, AV_LOG_ERROR, "reference overflow\n");
 +            h->ref_count[0]= h->ref_count[1]= 1;
 +            return -1;
          }
          if(h->slice_type_nos == AV_PICTURE_TYPE_B)
              h->list_count= 2;
          else
              h->list_count= 1;
      }else
 -        h->list_count= 0;
 +        h->ref_count[1]= h->ref_count[0]= h->list_count= 0;
  
      if(!default_ref_list_done){
          ff_h264_fill_default_ref_list(h);
  
      h0->last_slice_type = slice_type;
      h->slice_num = ++h0->current_slice;
 -    if(h->slice_num >= MAX_SLICES){
 -        av_log(s->avctx, AV_LOG_ERROR, "Too many slices, increase MAX_SLICES and recompile\n");
 +
 +    if(h->slice_num)
 +        h0->slice_row[(h->slice_num-1)&(MAX_SLICES-1)]= s->resync_mb_y;
 +    if (   h0->slice_row[h->slice_num&(MAX_SLICES-1)] + 3 >= s->resync_mb_y
 +        && h0->slice_row[h->slice_num&(MAX_SLICES-1)] <= s->resync_mb_y
 +        && h->slice_num >= MAX_SLICES) {
 +        //in case of ASO this check needs to be updated depending on how we decide to assign slice numbers in this case
 +        av_log(s->avctx, AV_LOG_WARNING, "Possibly too many slices (%d >= %d), increase MAX_SLICES and recompile if there are artifacts\n", h->slice_num, MAX_SLICES);
      }
  
      for(j=0; j<2; j++){
@@@ -3697,8 -3662,7 +3697,8 @@@ static int decode_slice(struct AVCodecC
                  if(s->mb_y >= s->mb_height){
                      tprintf(s->avctx, "slice end %d %d\n", get_bits_count(&s->gb), s->gb.size_in_bits);
  
 -                    if(get_bits_count(&s->gb) == s->gb.size_in_bits ) {
 +                    if(   get_bits_count(&s->gb) == s->gb.size_in_bits
 +                       || get_bits_count(&s->gb) <  s->gb.size_in_bits && s->avctx->error_recognition < FF_ER_AGGRESSIVE) {
                          ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x-1, s->mb_y, ER_MB_END&part_mask);
  
                          return 0;
@@@ -3748,7 -3712,6 +3748,7 @@@ static int execute_decode_slices(H264Co
              hx = h->thread_context[i];
              hx->s.err_recognition = avctx->err_recognition;
              hx->s.error_count = 0;
 +            hx->x264_build= h->x264_build;
          }
  
          avctx->execute(avctx, decode_slice,
@@@ -3779,8 -3742,6 +3779,8 @@@ static int decode_nal_units(H264Contex
      int nals_needed=0; ///< number of NALs that need decoding before the next frame thread starts
      int nal_index;
  
 +    h->nal_unit_type= 0;
 +
      h->max_contexts = (HAVE_THREADS && (s->avctx->active_thread_type&FF_THREAD_SLICE)) ? avctx->thread_count : 1;
      if(!(s->flags2 & CODEC_FLAG2_CHUNKS)){
          h->current_slice = 0;
              s->workaround_bugs |= FF_BUG_TRUNCATED;
  
          if(!(s->workaround_bugs & FF_BUG_TRUNCATED)){
 -        while(ptr[dst_length - 1] == 0 && dst_length > 0)
 +        while(dst_length > 0 && ptr[dst_length - 1] == 0)
              dst_length--;
          }
          bit_length= !dst_length ? 0 : (8*dst_length - ff_h264_decode_rbsp_trailing(h, ptr + dst_length - 1));
  
          if(s->avctx->debug&FF_DEBUG_STARTCODE){
 -            av_log(h->s.avctx, AV_LOG_DEBUG, "NAL %d at %d/%d length %d\n", hx->nal_unit_type, buf_index, buf_size, dst_length);
 +            av_log(h->s.avctx, AV_LOG_DEBUG, "NAL %d/%d at %d/%d length %d\n", hx->nal_unit_type, hx->nal_ref_idc, buf_index, buf_size, dst_length);
          }
  
          if (h->is_avc && (nalsize != consumed) && nalsize){
 -            // set trailing bits in the last partial byte to zero
 -            if (bit_length & 7)
 -                ptr[bit_length >> 3] = ptr[bit_length >> 3] & (0xff << 8 - (bit_length & 7));
              av_log(h->s.avctx, AV_LOG_DEBUG, "AVC: Consumed only %d bytes instead of %d\n", consumed, nalsize);
          }
  
              if((err = decode_slice_header(hx, h)))
                 break;
  
 +            if (   h->sei_recovery_frame_cnt >= 0
 +                && ((h->recovery_frame - h->frame_num) & ((1 << h->sps.log2_max_frame_num)-1)) > h->sei_recovery_frame_cnt) {
 +                h->recovery_frame = (h->frame_num + h->sei_recovery_frame_cnt) %
 +                                    (1 << h->sps.log2_max_frame_num);
 +            }
 +
              s->current_picture_ptr->f.key_frame |=
 -                    (hx->nal_unit_type == NAL_IDR_SLICE) ||
 -                    (h->sei_recovery_frame_cnt >= 0);
 +                    (hx->nal_unit_type == NAL_IDR_SLICE);
 +
 +            if (h->recovery_frame == h->frame_num) {
 +                h->sync |= 1;
 +                h->recovery_frame = -1;
 +            }
 +
 +            h->sync |= !!s->current_picture_ptr->f.key_frame;
 +            h->sync |= 3*!!(s->flags2 & CODEC_FLAG2_SHOW_ALL);
 +            s->current_picture_ptr->sync = h->sync;
  
              if (h->current_slice == 1) {
                  if(!(s->flags2 & CODEC_FLAG2_CHUNKS)) {
              break;
          case NAL_SPS:
              init_get_bits(&s->gb, ptr, bit_length);
 -            ff_h264_decode_seq_parameter_set(h);
 +            if(ff_h264_decode_seq_parameter_set(h) < 0 && (h->is_avc ? (nalsize != consumed) && nalsize : 1)){
 +                av_log(h->s.avctx, AV_LOG_DEBUG, "SPS decoding failure, trying alternative mode\n");
 +                if(h->is_avc) av_assert0(next_avc - buf_index + consumed == nalsize);
 +                init_get_bits(&s->gb, &buf[buf_index + 1 - consumed], 8*(next_avc - buf_index + consumed));
 +                ff_h264_decode_seq_parameter_set(h);
 +            }
  
              if (s->flags& CODEC_FLAG_LOW_DELAY ||
                  (h->sps.bitstream_restriction_flag && !h->sps.num_reorder_frames))
  
              if(avctx->has_b_frames < 2)
                  avctx->has_b_frames= !s->low_delay;
 -
 -            if (avctx->bits_per_raw_sample != h->sps.bit_depth_luma ||
 -                h->cur_chroma_format_idc != h->sps.chroma_format_idc) {
 -                if (h->sps.bit_depth_luma >= 8 && h->sps.bit_depth_luma <= 10) {
 -                    avctx->bits_per_raw_sample = h->sps.bit_depth_luma;
 -                    h->cur_chroma_format_idc = h->sps.chroma_format_idc;
 -                    h->pixel_shift = h->sps.bit_depth_luma > 8;
 -
 -                    ff_h264dsp_init(&h->h264dsp, h->sps.bit_depth_luma, h->sps.chroma_format_idc);
 -                    ff_h264_pred_init(&h->hpc, s->codec_id, h->sps.bit_depth_luma, h->sps.chroma_format_idc);
 -                    s->dsp.dct_bits = h->sps.bit_depth_luma > 8 ? 32 : 16;
 -                    dsputil_init(&s->dsp, s->avctx);
 -                } else {
 -                    av_log(avctx, AV_LOG_ERROR, "Unsupported bit depth: %d\n", h->sps.bit_depth_luma);
 -                    return -1;
 -                }
 -            }
              break;
          case NAL_PPS:
              init_get_bits(&s->gb, ptr, bit_length);
@@@ -4048,15 -4010,15 +4048,15 @@@ static int decode_frame(AVCodecContext 
      MpegEncContext *s = &h->s;
      AVFrame *pict = data;
      int buf_index;
 +    Picture *out;
 +    int i, out_idx;
  
      s->flags= avctx->flags;
      s->flags2= avctx->flags2;
  
     /* end of stream, output what is still in the buffers */
 - out:
      if (buf_size == 0) {
 -        Picture *out;
 -        int i, out_idx;
 + out:
  
          s->current_picture_ptr = NULL;
  
              *pict= *(AVFrame*)out;
          }
  
 -        return 0;
 +        return buf_size;
      }
 +    if(h->is_avc && buf_size >= 9 && buf[0]==1 && buf[2]==0 && (buf[4]&0xFC)==0xFC && (buf[5]&0x1F) && buf[8]==0x67){
 +        int cnt= buf[5]&0x1f;
 +        uint8_t *p= buf+6;
 +        while(cnt--){
 +            int nalsize= AV_RB16(p) + 2;
 +            if(nalsize > buf_size - (p-buf) || p[2]!=0x67)
 +                goto not_extra;
 +            p += nalsize;
 +        }
 +        cnt = *(p++);
 +        if(!cnt)
 +            goto not_extra;
 +        while(cnt--){
 +            int nalsize= AV_RB16(p) + 2;
 +            if(nalsize > buf_size - (p-buf) || p[2]!=0x68)
 +                goto not_extra;
 +            p += nalsize;
 +        }
 +
 +        return ff_h264_decode_extradata(h, buf, buf_size);
 +    }
 +not_extra:
  
      buf_index=decode_nal_units(h, buf, buf_size);
      if(buf_index < 0)
          return -1;
  
      if (!s->current_picture_ptr && h->nal_unit_type == NAL_END_SEQUENCE) {
 -        buf_size = 0;
 +        av_assert0(buf_index <= buf_size);
 +        buf_size = buf_index;
          goto out;
      }
  
      if(!(s->flags2 & CODEC_FLAG2_CHUNKS) && !s->current_picture_ptr){
 -        if (avctx->skip_frame >= AVDISCARD_NONREF)
 -            return 0;
 +        if (avctx->skip_frame >= AVDISCARD_NONREF ||
 +            buf_size >= 4 && !memcmp("Q264", buf, 4))
 +            return buf_size;
          av_log(avctx, AV_LOG_ERROR, "no frame!\n");
          return -1;
      }
  
          field_end(h, 0);
  
 -        if (!h->next_output_pic) {
 -            /* Wait for second field. */
 -            *data_size = 0;
 -
 -        } else {
 -            *data_size = sizeof(AVFrame);
 -            *pict = *(AVFrame*)h->next_output_pic;
 +        *data_size = 0; /* Wait for second field. */
 +        if (h->next_output_pic && h->next_output_pic->sync) {
 +            if(h->sync>1 || h->next_output_pic->f.pict_type != AV_PICTURE_TYPE_B){
 +                *data_size = sizeof(AVFrame);
 +                *pict = *(AVFrame*)h->next_output_pic;
 +            }
          }
      }
  
@@@ -4166,7 -4105,6 +4166,7 @@@ static inline void fill_mb_avail(H264Co
  #undef random
  #define COUNT 8000
  #define SIZE (COUNT*40)
 +extern AVCodec ff_h264_decoder;
  int main(void){
      int i;
      uint8_t temp[SIZE];
      DSPContext dsp;
      AVCodecContext avctx;
  
 +    avcodec_get_context_defaults3(&avctx, &ff_h264_decoder);
 +
      dsputil_init(&dsp, &avctx);
  
      init_put_bits(&pb, temp, SIZE);
  
          s= show_bits(&gb, 24);
  
--        START_TIMER
++        {START_TIMER
          j= get_ue_golomb(&gb);
          if(j != i){
              printf("mismatch! at %d (%d should be %d) bits:%6X\n", i, j, i, s);
  //            return -1;
          }
--        STOP_TIMER("get_ue_golomb");
++        STOP_TIMER("get_ue_golomb");}
      }
  
  
  
          s= show_bits(&gb, 24);
  
--        START_TIMER
++        {START_TIMER
          j= get_se_golomb(&gb);
          if(j != i - COUNT/2){
              printf("mismatch! at %d (%d should be %d) bits:%6X\n", i, j, i, s);
  //            return -1;
          }
--        STOP_TIMER("get_se_golomb");
++        STOP_TIMER("get_se_golomb");}
      }
  
      printf("Testing RBSP\n");
@@@ -4255,7 -4191,6 +4255,7 @@@ av_cold int ff_h264_decode_end(AVCodecC
      H264Context *h = avctx->priv_data;
      MpegEncContext *s = &h->s;
  
 +    ff_h264_remove_all_refs(h);
      ff_h264_free_context(h);
  
      MPV_common_end(s);
@@@ -4282,26 -4217,6 +4282,26 @@@ static const AVProfile profiles[] = 
      { FF_PROFILE_UNKNOWN },
  };
  
 +static const AVOption h264_options[] = {
 +    {"is_avc", "is avc", offsetof(H264Context, is_avc), FF_OPT_TYPE_INT, {.dbl = 0}, 0, 1, 0},
 +    {"nal_length_size", "nal_length_size", offsetof(H264Context, nal_length_size), FF_OPT_TYPE_INT, {.dbl = 0}, 0, 4, 0},
 +    {NULL}
 +};
 +
 +static const AVClass h264_class = {
 +    "H264 Decoder",
 +    av_default_item_name,
 +    h264_options,
 +    LIBAVUTIL_VERSION_INT,
 +};
 +
 +static const AVClass h264_vdpau_class = {
 +    "H264 VDPAU Decoder",
 +    av_default_item_name,
 +    h264_options,
 +    LIBAVUTIL_VERSION_INT,
 +};
 +
  AVCodec ff_h264_decoder = {
      .name           = "h264",
      .type           = AVMEDIA_TYPE_VIDEO,
      .init_thread_copy      = ONLY_IF_THREADS_ENABLED(decode_init_thread_copy),
      .update_thread_context = ONLY_IF_THREADS_ENABLED(decode_update_thread_context),
      .profiles = NULL_IF_CONFIG_SMALL(profiles),
 +    .priv_class     = &h264_class,
  };
  
  #if CONFIG_H264_VDPAU_DECODER
@@@ -4334,6 -4248,5 +4334,6 @@@ AVCodec ff_h264_vdpau_decoder = 
      .long_name = NULL_IF_CONFIG_SMALL("H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (VDPAU acceleration)"),
      .pix_fmts = (const enum PixelFormat[]){PIX_FMT_VDPAU_H264, PIX_FMT_NONE},
      .profiles = NULL_IF_CONFIG_SMALL(profiles),
 +    .priv_class     = &h264_vdpau_class,
  };
  #endif
diff --combined libavcodec/h264_cabac.c
@@@ -2,20 -2,20 +2,20 @@@
   * H.26L/H.264/AVC/JVT/14496-10/... cabac 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
   */
  
@@@ -26,7 -26,6 +26,7 @@@
   */
  
  #define CABAC 1
 +#define UNCHECKED_BITSTREAM_READER 1
  
  #include "internal.h"
  #include "dsputil.h"
@@@ -1657,7 -1656,7 +1657,7 @@@ decode_cabac_residual_internal(H264Cont
              index[coeff_count++] = last;\
          }
          const uint8_t *sig_off = significant_coeff_flag_offset_8x8[MB_FIELD];
- #if ARCH_X86 && HAVE_7REGS && HAVE_EBX_AVAILABLE && !defined(BROKEN_RELOCATIONS)
+ #if ARCH_X86 && HAVE_EBX_AVAILABLE && !defined(BROKEN_RELOCATIONS)
          coeff_count= decode_significance_8x8_x86(CC, significant_coeff_ctx_base, index,
                                                   last_coeff_ctx_base, sig_off);
      } else {
          }
      }
  
 +
  #define STORE_BLOCK(type) \
      do { \
          uint8_t *ctx = coeff_abs_level1_ctx[node_ctx] + abs_level_m1_ctx_base; \
          } \
      } while ( coeff_count );
  
 -    if (h->pixel_shift) {
 -        STORE_BLOCK(int32_t)
 -    } else {
 -        STORE_BLOCK(int16_t)
 -    }
 +        if (h->pixel_shift) {
 +            STORE_BLOCK(int32_t)
 +        } else {
 +            STORE_BLOCK(int16_t)
 +        }
  #ifdef CABAC_ON_STACK
              h->cabac.range     = cc.range     ;
              h->cabac.low       = cc.low       ;
@@@ -2040,14 -2038,14 +2040,14 @@@ decode_intra_mb
              write_back_intra_pred_mode(h);
              if( ff_h264_check_intra4x4_pred_mode(h) < 0 ) return -1;
          } else {
 -            h->intra16x16_pred_mode= ff_h264_check_intra_pred_mode( h, h->intra16x16_pred_mode );
 +            h->intra16x16_pred_mode= ff_h264_check_intra16x16_pred_mode( h, h->intra16x16_pred_mode );
              if( h->intra16x16_pred_mode < 0 ) return -1;
          }
          if(decode_chroma){
              h->chroma_pred_mode_table[mb_xy] =
              pred_mode                        = decode_cabac_mb_chroma_pre_mode( h );
  
 -            pred_mode= ff_h264_check_intra_pred_mode( h, pred_mode );
 +            pred_mode= ff_h264_check_intra_chroma_pred_mode( h, pred_mode );
              if( pred_mode < 0 ) return -1;
              h->chroma_pred_mode= pred_mode;
          } else {
diff --combined libavcodec/lpc.c
@@@ -2,20 -2,20 +2,20 @@@
   * LPC utility code
   * Copyright (c) 2006  Justin Ruggles <justin.ruggles@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
   */
  
@@@ -35,8 -35,9 +35,9 @@@ static void lpc_apply_welch_window_c(co
      double w;
      double c;
  
-     assert(!(len&1)); //the optimization in r11881 does not support odd len
-                       //if someone wants odd len extend the change in r11881
+     /* The optimization in commit fa4ed8c does not support odd len.
+      * If someone wants odd len extend that change. */
+     assert(!(len & 1));
  
      n2 = (len >> 1);
      c = 2.0 / (len - 1.0);
@@@ -154,7 -154,6 +154,7 @@@ static int decode_tag(AVCodecContext *a
                        int *got_frame_ptr, AVPacket *avpkt)
  {
      const uint8_t *buf = avpkt->data;
 +    const uint8_t *side=av_packet_get_side_data(avpkt, 'F', NULL);
      int buf_size = avpkt->size;
      NellyMoserDecodeContext *s = avctx->priv_data;
      int blocks, i, ret;
      float   *samples_flt;
  
      blocks     = buf_size / NELLY_BLOCK_LEN;
 +
      if (blocks <= 0) {
          av_log(avctx, AV_LOG_ERROR, "Packet is too small\n");
          return AVERROR_INVALIDDATA;
      }
 +
      if (buf_size % NELLY_BLOCK_LEN) {
          av_log(avctx, AV_LOG_WARNING, "Leftover bytes: %d.\n",
                 buf_size % NELLY_BLOCK_LEN);
       * 22050 Hz - 4
       * 44100 Hz - 8
       */
 +    if(side && blocks>1 && avctx->sample_rate%11025==0 && (1<<((side[0]>>2)&3)) == blocks)
 +        avctx->sample_rate= 11025*(blocks/2);
  
      /* get output buffer */
      s->frame.nb_samples = NELLY_SAMPLES * blocks;
@@@ -226,7 -221,7 +226,7 @@@ AVCodec ff_nellymoser_decoder = 
      .init           = decode_init,
      .close          = decode_end,
      .decode         = decode_tag,
-     .capabilities   = CODEC_CAP_DR1,
+     .capabilities   = CODEC_CAP_DR1 | CODEC_CAP_PARAM_CHANGE,
      .long_name = NULL_IF_CONFIG_SMALL("Nellymoser Asao"),
      .sample_fmts    = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLT,
                                                        AV_SAMPLE_FMT_S16,
diff --combined libavcodec/utils.c
@@@ -3,20 -3,20 +3,20 @@@
   * Copyright (c) 2001 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
   */
  
@@@ -33,7 -33,6 +33,7 @@@
  #include "libavutil/imgutils.h"
  #include "libavutil/samplefmt.h"
  #include "libavutil/dict.h"
 +#include "libavutil/avassert.h"
  #include "avcodec.h"
  #include "dsputil.h"
  #include "libavutil/opt.h"
@@@ -41,6 -40,7 +41,7 @@@
  #include "thread.h"
  #include "audioconvert.h"
  #include "internal.h"
+ #include "bytestream.h"
  #include <stdlib.h>
  #include <stdarg.h>
  #include <limits.h>
@@@ -205,10 -205,6 +206,10 @@@ void avcodec_align_dimensions2(AVCodecC
          break;
      }
  
 +    if(s->codec_id == CODEC_ID_IFF_ILBM || s->codec_id == CODEC_ID_IFF_BYTERUN1){
 +        w_align= FFMAX(w_align, 8);
 +    }
 +
      *width = FFALIGN(*width , w_align);
      *height= FFALIGN(*height, h_align);
      if(s->codec_id == CODEC_ID_H264 || s->lowres)
  #if HAVE_MMX
      if(s->codec_id == CODEC_ID_SVQ1 || s->codec_id == CODEC_ID_VP5 ||
         s->codec_id == CODEC_ID_VP6 || s->codec_id == CODEC_ID_VP6F ||
 -       s->codec_id == CODEC_ID_VP6A) {
 +       s->codec_id == CODEC_ID_VP6A || s->codec_id == CODEC_ID_DIRAC) {
          for (i = 0; i < AV_NUM_DATA_POINTERS; i++)
              linesize_align[i] = 16;
      }
@@@ -243,22 -239,6 +244,22 @@@ void avcodec_align_dimensions(AVCodecCo
      *width=FFALIGN(*width, align);
  }
  
 +void ff_init_buffer_info(AVCodecContext *s, AVFrame *pic)
 +{
 +    if (s->pkt) {
 +        pic->pkt_pts = s->pkt->pts;
 +        pic->pkt_pos = s->pkt->pos;
 +    } else {
 +        pic->pkt_pts = AV_NOPTS_VALUE;
 +        pic->pkt_pos = -1;
 +    }
 +    pic->reordered_opaque= s->reordered_opaque;
 +    pic->sample_aspect_ratio = s->sample_aspect_ratio;
 +    pic->width               = s->width;
 +    pic->height              = s->height;
 +    pic->format              = s->pix_fmt;
 +}
 +
  static int audio_get_buffer(AVCodecContext *avctx, AVFrame *frame)
  {
      AVCodecInternal *avci = avctx->internal;
      frame->linesize[0]   = buf->linesize[0];
      memcpy(frame->data, buf->data, sizeof(frame->data));
  
 -    if (avctx->pkt) frame->pkt_pts = avctx->pkt->pts;
 -    else            frame->pkt_pts = AV_NOPTS_VALUE;
 +    if (avctx->pkt) {
 +        frame->pkt_pts = avctx->pkt->pts;
 +        frame->pkt_pos = avctx->pkt->pos;
 +    } else {
 +        frame->pkt_pts = AV_NOPTS_VALUE;
 +        frame->pkt_pos = -1;
 +    }
 +
      frame->reordered_opaque = avctx->reordered_opaque;
  
      if (avctx->debug & FF_DEBUG_BUFFERS)
@@@ -482,18 -456,9 +483,18 @@@ static int video_get_buffer(AVCodecCont
      pic->extended_data = pic->data;
      avci->buffer_count++;
  
 -    if(s->pkt) pic->pkt_pts= s->pkt->pts;
 -    else       pic->pkt_pts= AV_NOPTS_VALUE;
 +    if (s->pkt) {
 +        pic->pkt_pts = s->pkt->pts;
 +        pic->pkt_pos = s->pkt->pos;
 +    } else {
 +        pic->pkt_pts = AV_NOPTS_VALUE;
 +        pic->pkt_pos = -1;
 +    }
      pic->reordered_opaque= s->reordered_opaque;
 +    pic->sample_aspect_ratio = s->sample_aspect_ratio;
 +    pic->width               = s->width;
 +    pic->height              = s->height;
 +    pic->format              = s->pix_fmt;
  
      if(s->debug&FF_DEBUG_BUFFERS)
          av_log(s, AV_LOG_DEBUG, "default_get_buffer called on pic %p, %d "
@@@ -617,11 -582,8 +618,11 @@@ enum PixelFormat avcodec_default_get_fo
  void avcodec_get_frame_defaults(AVFrame *pic){
      memset(pic, 0, sizeof(AVFrame));
  
 -    pic->pts= AV_NOPTS_VALUE;
 +    pic->pts = pic->pkt_dts = pic->pkt_pts = pic->best_effort_timestamp = AV_NOPTS_VALUE;
 +    pic->pkt_pos = -1;
      pic->key_frame= 1;
 +    pic->sample_aspect_ratio = (AVRational){0, 1};
 +    pic->format = -1;           /* unknown */
  }
  
  AVFrame *avcodec_alloc_frame(void){
      return pic;
  }
  
 +static void avcodec_get_subtitle_defaults(AVSubtitle *sub)
 +{
 +    memset(sub, 0, sizeof(*sub));
 +    sub->pts = AV_NOPTS_VALUE;
 +}
 +
  #if FF_API_AVCODEC_OPEN
  int attribute_align_arg avcodec_open(AVCodecContext *avctx, AVCodec *codec)
  {
@@@ -699,13 -655,10 +700,13 @@@ int attribute_align_arg avcodec_open2(A
      if ((ret = av_opt_set_dict(avctx, &tmp)) < 0)
          goto free_and_end;
  
 +    //We only call avcodec_set_dimensions() for non h264 codecs so as not to overwrite previously setup dimensions
 +    if(!( avctx->coded_width && avctx->coded_height && avctx->width && avctx->height && avctx->codec_id == CODEC_ID_H264)){
      if(avctx->coded_width && avctx->coded_height)
          avcodec_set_dimensions(avctx, avctx->coded_width, avctx->coded_height);
      else if(avctx->width && avctx->height)
          avcodec_set_dimensions(avctx, avctx->width, avctx->height);
 +    }
  
      if ((avctx->coded_width || avctx->coded_height || avctx->width || avctx->height)
          && (  av_image_check_size(avctx->coded_width, avctx->coded_height, 0, avctx) < 0
      avctx->frame_number = 0;
  #if FF_API_ER
  
 -    av_log(avctx, AV_LOG_DEBUG, "err{or,}_recognition separate: %d; %d\n",
 +    av_log(avctx, AV_LOG_DEBUG, "err{or,}_recognition separate: %d; %X\n",
             avctx->error_recognition, avctx->err_recognition);
 -    /* FF_ER_CAREFUL (==1) implies AV_EF_CRCCHECK (== 1<<1 - 1),
 -       FF_ER_COMPLIANT (==2) implies AV_EF_{CRCCHECK,BITSTREAM} (== 1<<2 - 1), et cetera} */
 -    avctx->err_recognition |= (1<<(avctx->error_recognition-(avctx->error_recognition>=FF_ER_VERY_AGGRESSIVE))) - 1;
 -    av_log(avctx, AV_LOG_DEBUG, "err{or,}_recognition combined: %d; %d\n",
 +    switch(avctx->error_recognition){
 +        case FF_ER_EXPLODE        : avctx->err_recognition |= AV_EF_EXPLODE | AV_EF_COMPLIANT | AV_EF_CAREFUL;
 +            break;
 +        case FF_ER_VERY_AGGRESSIVE:
 +        case FF_ER_AGGRESSIVE     : avctx->err_recognition |= AV_EF_AGGRESSIVE;
 +        case FF_ER_COMPLIANT      : avctx->err_recognition |= AV_EF_COMPLIANT;
 +        case FF_ER_CAREFUL        : avctx->err_recognition |= AV_EF_CAREFUL;
 +    }
 +
 +    av_log(avctx, AV_LOG_DEBUG, "err{or,}_recognition combined: %d; %X\n",
             avctx->error_recognition, avctx->err_recognition);
  #endif
  
 +    if (!HAVE_THREADS)
 +        av_log(avctx, AV_LOG_WARNING, "Warning: not compiled with thread support, using thread emulation\n");
 +
      if (HAVE_THREADS && !avctx->thread_opaque) {
          ret = ff_thread_init(avctx);
          if (ret < 0) {
          }
      }
  
 -    if (avctx->codec->max_lowres < avctx->lowres) {
 +    if (avctx->codec->max_lowres < avctx->lowres || avctx->lowres < 0) {
          av_log(avctx, AV_LOG_ERROR, "The maximum value for lowres supported by the decoder is %d\n",
                 avctx->codec->max_lowres);
          ret = AVERROR(EINVAL);
          }
      }
  
 +    avctx->pts_correction_num_faulty_pts =
 +    avctx->pts_correction_num_faulty_dts = 0;
 +    avctx->pts_correction_last_pts =
 +    avctx->pts_correction_last_dts = INT64_MIN;
 +
      if(avctx->codec->init && !(avctx->active_thread_type&FF_THREAD_FRAME)){
          ret = avctx->codec->init(avctx);
          if (ret < 0) {
              goto free_and_end;
          }
      }
 +
 +    ret=0;
  end:
      entangled_thread_counter--;
  
@@@ -894,44 -831,13 +895,44 @@@ int avcodec_encode_subtitle(AVCodecCont
          av_log(avctx, AV_LOG_ERROR, "start_display_time must be 0.\n");
          return -1;
      }
 -    if(sub->num_rects == 0 || !sub->rects)
 -        return -1;
 +
      ret = avctx->codec->encode(avctx, buf, buf_size, sub);
      avctx->frame_number++;
      return ret;
  }
  
 +/**
 + * Attempt to guess proper monotonic timestamps for decoded video frames
 + * which might have incorrect times. Input timestamps may wrap around, in
 + * which case the output will as well.
 + *
 + * @param pts the pts field of the decoded AVPacket, as passed through
 + * AVFrame.pkt_pts
 + * @param dts the dts field of the decoded AVPacket
 + * @return one of the input values, may be AV_NOPTS_VALUE
 + */
 +static int64_t guess_correct_pts(AVCodecContext *ctx,
 +                                 int64_t reordered_pts, int64_t dts)
 +{
 +    int64_t pts = AV_NOPTS_VALUE;
 +
 +    if (dts != AV_NOPTS_VALUE) {
 +        ctx->pts_correction_num_faulty_dts += dts <= ctx->pts_correction_last_dts;
 +        ctx->pts_correction_last_dts = dts;
 +    }
 +    if (reordered_pts != AV_NOPTS_VALUE) {
 +        ctx->pts_correction_num_faulty_pts += reordered_pts <= ctx->pts_correction_last_pts;
 +        ctx->pts_correction_last_pts = reordered_pts;
 +    }
 +    if ((ctx->pts_correction_num_faulty_pts<=ctx->pts_correction_num_faulty_dts || dts == AV_NOPTS_VALUE)
 +       && reordered_pts != AV_NOPTS_VALUE)
 +        pts = reordered_pts;
 +    else
 +        pts = dts;
 +
 +    return pts;
 +}
 +
  int attribute_align_arg avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture,
                           int *got_picture_ptr,
                           AVPacket *avpkt)
      if((avctx->coded_width||avctx->coded_height) && av_image_check_size(avctx->coded_width, avctx->coded_height, 0, avctx))
          return -1;
  
 -    avctx->pkt = avpkt;
 -
      if((avctx->codec->capabilities & CODEC_CAP_DELAY) || avpkt->size || (avctx->active_thread_type&FF_THREAD_FRAME)){
 +        av_packet_split_side_data(avpkt);
 +        avctx->pkt = avpkt;
          if (HAVE_THREADS && avctx->active_thread_type&FF_THREAD_FRAME)
               ret = ff_thread_decode_frame(avctx, picture, got_picture_ptr,
                                            avpkt);
              ret = avctx->codec->decode(avctx, picture, got_picture_ptr,
                                avpkt);
              picture->pkt_dts= avpkt->dts;
 +
 +            if(!avctx->has_b_frames){
 +            picture->pkt_pos= avpkt->pos;
 +            }
 +            //FIXME these should be under if(!avctx->has_b_frames)
 +            if (!picture->sample_aspect_ratio.num)
 +                picture->sample_aspect_ratio = avctx->sample_aspect_ratio;
 +            if (!picture->width)
 +                picture->width = avctx->width;
 +            if (!picture->height)
 +                picture->height = avctx->height;
 +            if (picture->format == PIX_FMT_NONE)
 +                picture->format = avctx->pix_fmt;
          }
  
          emms_c(); //needed to avoid an emms_c() call before every return;
  
 -        if (*got_picture_ptr)
 +
 +        if (*got_picture_ptr){
              avctx->frame_number++;
 +            picture->best_effort_timestamp = guess_correct_pts(avctx,
 +                                                            picture->pkt_pts,
 +                                                            picture->pkt_dts);
 +        }
      }else
          ret= 0;
  
@@@ -991,10 -879,9 +992,10 @@@ int attribute_align_arg avcodec_decode_
      int ret, got_frame = 0;
  
      if (avctx->get_buffer != avcodec_default_get_buffer) {
 -        av_log(avctx, AV_LOG_ERROR, "A custom get_buffer() cannot be used with "
 +        av_log(avctx, AV_LOG_ERROR, "Overriding custom get_buffer() for "
                 "avcodec_decode_audio3()\n");
 -        return AVERROR(EINVAL);
 +        avctx->get_buffer = avcodec_default_get_buffer;
 +        avctx->release_buffer = avcodec_default_release_buffer;
      }
  
      ret = avcodec_decode_audio4(avctx, &frame, &got_frame, avpkt);
  }
  #endif
  
+ static void apply_param_change(AVCodecContext *avctx, AVPacket *avpkt)
+ {
+     int size = 0;
+     const uint8_t *data;
+     uint32_t flags;
+     if (!(avctx->codec->capabilities & CODEC_CAP_PARAM_CHANGE))
+         return;
+     data = av_packet_get_side_data(avpkt, AV_PKT_DATA_PARAM_CHANGE, &size);
+     if (!data || size < 4)
+         return;
+     flags = bytestream_get_le32(&data);
+     size -= 4;
+     if (size < 4) /* Required for any of the changes */
+         return;
+     if (flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT) {
+         avctx->channels = bytestream_get_le32(&data);
+         size -= 4;
+     }
+     if (flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT) {
+         if (size < 8)
+             return;
+         avctx->channel_layout = bytestream_get_le64(&data);
+         size -= 8;
+     }
+     if (size < 4)
+         return;
+     if (flags & AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE) {
+         avctx->sample_rate = bytestream_get_le32(&data);
+         size -= 4;
+     }
+     if (flags & AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS) {
+         if (size < 8)
+             return;
+         avctx->width  = bytestream_get_le32(&data);
+         avctx->height = bytestream_get_le32(&data);
+         size -= 8;
+     }
+ }
  int attribute_align_arg avcodec_decode_audio4(AVCodecContext *avctx,
                                                AVFrame *frame,
                                                int *got_frame_ptr,
  
      *got_frame_ptr = 0;
  
 -    avctx->pkt = avpkt;
 -
      if (!avpkt->data && avpkt->size) {
          av_log(avctx, AV_LOG_ERROR, "invalid packet: NULL data, size != 0\n");
          return AVERROR(EINVAL);
      }
  
 -    apply_param_change(avctx, avpkt);
 -
      if ((avctx->codec->capabilities & CODEC_CAP_DELAY) || avpkt->size) {
 +        av_packet_split_side_data(avpkt);
++        apply_param_change(avctx, avpkt);
++
 +        avctx->pkt = avpkt;
          ret = avctx->codec->decode(avctx, frame, got_frame_ptr, avpkt);
          if (ret >= 0 && *got_frame_ptr) {
              avctx->frame_number++;
@@@ -1062,7 -992,6 +1106,7 @@@ int avcodec_decode_subtitle2(AVCodecCon
  
      avctx->pkt = avpkt;
      *got_sub_ptr = 0;
 +    avcodec_get_subtitle_defaults(sub);
      ret = avctx->codec->decode(avctx, sub, got_sub_ptr, avpkt);
      if (*got_sub_ptr)
          avctx->frame_number++;
@@@ -1128,21 -1057,10 +1172,21 @@@ av_cold int avcodec_close(AVCodecContex
      return 0;
  }
  
 +static enum CodecID remap_deprecated_codec_id(enum CodecID id)
 +{
 +    switch(id){
 +        case CODEC_ID_G723_1_DEPRECATED : return CODEC_ID_G723_1;
 +        case CODEC_ID_G729_DEPRECATED   : return CODEC_ID_G729;
 +        case CODEC_ID_UTVIDEO_DEPRECATED: return CODEC_ID_UTVIDEO;
 +        default                         : return id;
 +    }
 +}
 +
  AVCodec *avcodec_find_encoder(enum CodecID id)
  {
      AVCodec *p, *experimental=NULL;
      p = first_avcodec;
 +    id= remap_deprecated_codec_id(id);
      while (p) {
          if (p->encode != NULL && p->id == id) {
              if (p->capabilities & CODEC_CAP_EXPERIMENTAL && !experimental) {
@@@ -1171,19 -1089,14 +1215,19 @@@ AVCodec *avcodec_find_encoder_by_name(c
  
  AVCodec *avcodec_find_decoder(enum CodecID id)
  {
 -    AVCodec *p;
 +    AVCodec *p, *experimental=NULL;
      p = first_avcodec;
 +    id= remap_deprecated_codec_id(id);
      while (p) {
 -        if (p->decode != NULL && p->id == id)
 -            return p;
 +        if (p->decode != NULL && p->id == id) {
 +            if (p->capabilities & CODEC_CAP_EXPERIMENTAL && !experimental) {
 +                experimental = p;
 +            } else
 +                return p;
 +        }
          p = p->next;
      }
 -    return NULL;
 +    return experimental;
  }
  
  AVCodec *avcodec_find_decoder_by_name(const char *name)
@@@ -1223,25 -1136,6 +1267,25 @@@ static int get_bit_rate(AVCodecContext 
      return bit_rate;
  }
  
 +const char *avcodec_get_name(enum CodecID id)
 +{
 +    AVCodec *codec;
 +
 +#if !CONFIG_SMALL
 +    switch (id) {
 +#include "libavcodec/codec_names.h"
 +    }
 +    av_log(NULL, AV_LOG_WARNING, "Codec 0x%x is not in the full list.\n", id);
 +#endif
 +    codec = avcodec_find_decoder(id);
 +    if (codec)
 +        return codec->name;
 +    codec = avcodec_find_encoder(id);
 +    if (codec)
 +        return codec->name;
 +    return "unknown_codec";
 +}
 +
  size_t av_get_codec_tag_string(char *buf, size_t buf_size, unsigned int codec_tag)
  {
      int i, len, ret = 0;
  
  void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode)
  {
 +    const char *codec_type;
      const char *codec_name;
      const char *profile = NULL;
      AVCodec *p;
 -    char buf1[32];
      int bitrate;
      AVRational display_aspect_ratio;
  
 -    if (encode)
 -        p = avcodec_find_encoder(enc->codec_id);
 -    else
 -        p = avcodec_find_decoder(enc->codec_id);
 -
 -    if (p) {
 -        codec_name = p->name;
 -        profile = av_get_profile_name(p, enc->profile);
 -    } else if (enc->codec_id == CODEC_ID_MPEG2TS) {
 -        /* fake mpeg2 transport stream codec (currently not
 -           registered) */
 -        codec_name = "mpeg2ts";
 -    } else if (enc->codec_name[0] != '\0') {
 -        codec_name = enc->codec_name;
 -    } else {
 -        /* output avi tags */
 +    if (!buf || buf_size <= 0)
 +        return;
 +    codec_type = av_get_media_type_string(enc->codec_type);
 +    codec_name = avcodec_get_name(enc->codec_id);
 +    if (enc->profile != FF_PROFILE_UNKNOWN) {
 +        p = encode ? avcodec_find_encoder(enc->codec_id) :
 +                     avcodec_find_decoder(enc->codec_id);
 +        if (p)
 +            profile = av_get_profile_name(p, enc->profile);
 +    }
 +
 +    snprintf(buf, buf_size, "%s: %s%s", codec_type ? codec_type : "unknown",
 +             codec_name, enc->mb_decision ? " (hq)" : "");
 +    buf[0] ^= 'a' ^ 'A'; /* first letter in uppercase */
 +    if (profile)
 +        snprintf(buf + strlen(buf), buf_size - strlen(buf), " (%s)", profile);
 +    if (enc->codec_tag) {
          char tag_buf[32];
          av_get_codec_tag_string(tag_buf, sizeof(tag_buf), enc->codec_tag);
 -        snprintf(buf1, sizeof(buf1), "%s / 0x%04X", tag_buf, enc->codec_tag);
 -        codec_name = buf1;
 +        snprintf(buf + strlen(buf), buf_size - strlen(buf),
 +                 " (%s / 0x%04X)", tag_buf, enc->codec_tag);
      }
 -
      switch(enc->codec_type) {
      case AVMEDIA_TYPE_VIDEO:
 -        snprintf(buf, buf_size,
 -                 "Video: %s%s",
 -                 codec_name, enc->mb_decision ? " (hq)" : "");
 -        if (profile)
 -            snprintf(buf + strlen(buf), buf_size - strlen(buf),
 -                     " (%s)", profile);
          if (enc->pix_fmt != PIX_FMT_NONE) {
              snprintf(buf + strlen(buf), buf_size - strlen(buf),
                       ", %s",
                            enc->height*enc->sample_aspect_ratio.den,
                            1024*1024);
                  snprintf(buf + strlen(buf), buf_size - strlen(buf),
 -                         " [PAR %d:%d DAR %d:%d]",
 +                         " [SAR %d:%d DAR %d:%d]",
                           enc->sample_aspect_ratio.num, enc->sample_aspect_ratio.den,
                           display_aspect_ratio.num, display_aspect_ratio.den);
              }
          }
          break;
      case AVMEDIA_TYPE_AUDIO:
 -        snprintf(buf, buf_size,
 -                 "Audio: %s",
 -                 codec_name);
 -        if (profile)
 -            snprintf(buf + strlen(buf), buf_size - strlen(buf),
 -                     " (%s)", profile);
          if (enc->sample_rate) {
              snprintf(buf + strlen(buf), buf_size - strlen(buf),
                       ", %d Hz", enc->sample_rate);
                       ", %s", av_get_sample_fmt_name(enc->sample_fmt));
          }
          break;
 -    case AVMEDIA_TYPE_DATA:
 -        snprintf(buf, buf_size, "Data: %s", codec_name);
 -        break;
 -    case AVMEDIA_TYPE_SUBTITLE:
 -        snprintf(buf, buf_size, "Subtitle: %s", codec_name);
 -        break;
 -    case AVMEDIA_TYPE_ATTACHMENT:
 -        snprintf(buf, buf_size, "Attachment: %s", codec_name);
 -        break;
      default:
 -        snprintf(buf, buf_size, "Invalid Codec type %d", enc->codec_type);
          return;
      }
      if (encode) {
@@@ -1366,24 -1282,18 +1410,24 @@@ const char *av_get_profile_name(const A
  
  unsigned avcodec_version( void )
  {
 +    av_assert0(CODEC_ID_V410==164);
 +    av_assert0(CODEC_ID_PCM_S8_PLANAR==65563);
 +    av_assert0(CODEC_ID_ADPCM_G722==69660);
 +    av_assert0(CODEC_ID_BMV_AUDIO==86071);
 +    av_assert0(CODEC_ID_SRT==94216);
 +
    return LIBAVCODEC_VERSION_INT;
  }
  
  const char *avcodec_configuration(void)
  {
 -    return LIBAV_CONFIGURATION;
 +    return FFMPEG_CONFIGURATION;
  }
  
  const char *avcodec_license(void)
  {
  #define LICENSE_PREFIX "libavcodec license: "
 -    return LICENSE_PREFIX LIBAV_LICENSE + sizeof(LICENSE_PREFIX) - 1;
 +    return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
  }
  
  void avcodec_flush_buffers(AVCodecContext *avctx)
@@@ -1536,7 -1446,7 +1580,7 @@@ int ff_match_2uint16(const uint16_t (*t
  
  void av_log_missing_feature(void *avc, const char *feature, int want_sample)
  {
 -    av_log(avc, AV_LOG_WARNING, "%s not implemented. Update your Libav "
 +    av_log(avc, AV_LOG_WARNING, "%s not implemented. Update your FFmpeg "
              "version to the newest one from Git. If the problem still "
              "occurs, it means that your file has a feature which has not "
              "been implemented.\n", feature);
@@@ -1553,8 -1463,8 +1597,8 @@@ void av_log_ask_for_sample(void *avc, c
      if (msg)
          av_vlog(avc, AV_LOG_WARNING, msg, argument_list);
      av_log(avc, AV_LOG_WARNING, "If you want to help, upload a sample "
 -            "of this file to ftp://upload.libav.org/incoming/ "
 -            "and contact the libav-devel mailing list.\n");
 +            "of this file to ftp://upload.ffmpeg.org/MPlayer/incoming/ "
 +            "and contact the ffmpeg-devel mailing list.\n");
  
      va_end(argument_list);
  }
@@@ -1638,9 -1548,6 +1682,9 @@@ unsigned int avpriv_toupper4(unsigned i
  int ff_thread_get_buffer(AVCodecContext *avctx, AVFrame *f)
  {
      f->owner = avctx;
 +
 +    ff_init_buffer_info(avctx, f);
 +
      return avctx->get_buffer(avctx, f);
  }
  
@@@ -1673,12 -1580,6 +1717,12 @@@ int avcodec_thread_init(AVCodecContext 
  
  enum AVMediaType avcodec_get_type(enum CodecID codec_id)
  {
 +    AVCodec *c= avcodec_find_decoder(codec_id);
 +    if(!c)
 +        c= avcodec_find_encoder(codec_id);
 +    if(c)
 +        return c->type;
 +
      if (codec_id <= CODEC_ID_NONE)
          return AVMEDIA_TYPE_UNKNOWN;
      else if (codec_id < CODEC_ID_FIRST_AUDIO)
diff --combined libavcodec/version.h
@@@ -1,19 -1,19 +1,19 @@@
  /*
   *
 - * 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
   */
  
@@@ -21,8 -21,8 +21,8 @@@
  #define AVCODEC_VERSION_H
  
  #define LIBAVCODEC_VERSION_MAJOR 53
- #define LIBAVCODEC_VERSION_MINOR 46
- #define LIBAVCODEC_VERSION_MICRO  1
 -#define LIBAVCODEC_VERSION_MINOR 30
++#define LIBAVCODEC_VERSION_MINOR 47
+ #define LIBAVCODEC_VERSION_MICRO  0
  
  #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
                                                 LIBAVCODEC_VERSION_MINOR, \
  #ifndef FF_API_OLD_DECODE_AUDIO
  #define FF_API_OLD_DECODE_AUDIO (LIBAVCODEC_VERSION_MAJOR < 54)
  #endif
 +#ifndef FF_API_OLD_TIMECODE
 +#define FF_API_OLD_TIMECODE (LIBAVCODEC_VERSION_MAJOR < 54)
 +#endif
 +
  #ifndef FF_API_AVFRAME_AGE
  #define FF_API_AVFRAME_AGE (LIBAVCODEC_VERSION_MAJOR < 54)
  #endif
index 2b32bcc,0000000..0af01de
mode 100644,000000..100644
--- /dev/null
@@@ -1,1468 -1,0 +1,1469 @@@
-         int seekable_frame_in_packet = get_bits1(gb);
-         int spliced_packet = get_bits1(gb);
 +/*
 + * Wmall compatible decoder
 + * Copyright (c) 2007 Baptiste Coudurier, Benjamin Larsson, Ulion
 + * Copyright (c) 2008 - 2011 Sascha Sommer, Benjamin Larsson
 + * Copyright (c) 2011 Andreas Ă–man
 + *
 + * 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
 + */
 +
 +/**
 + * @file
 + * @brief wmall decoder implementation
 + * Wmall is an MDCT based codec comparable to wma standard or AAC.
 + * The decoding therefore consists of the following steps:
 + * - bitstream decoding
 + * - reconstruction of per-channel data
 + * - rescaling and inverse quantization
 + * - IMDCT
 + * - windowing and overlapp-add
 + *
 + * The compressed wmall bitstream is split into individual packets.
 + * Every such packet contains one or more wma frames.
 + * The compressed frames may have a variable length and frames may
 + * cross packet boundaries.
 + * Common to all wmall frames is the number of samples that are stored in
 + * a frame.
 + * The number of samples and a few other decode flags are stored
 + * as extradata that has to be passed to the decoder.
 + *
 + * The wmall frames themselves are again split into a variable number of
 + * subframes. Every subframe contains the data for 2^N time domain samples
 + * where N varies between 7 and 12.
 + *
 + * Example wmall bitstream (in samples):
 + *
 + * ||   packet 0           || packet 1 || packet 2      packets
 + * ---------------------------------------------------
 + * || frame 0      || frame 1       || frame 2    ||    frames
 + * ---------------------------------------------------
 + * ||   |      |   ||   |   |   |   ||            ||    subframes of channel 0
 + * ---------------------------------------------------
 + * ||      |   |   ||   |   |   |   ||            ||    subframes of channel 1
 + * ---------------------------------------------------
 + *
 + * The frame layouts for the individual channels of a wma frame does not need
 + * to be the same.
 + *
 + * However, if the offsets and lengths of several subframes of a frame are the
 + * same, the subframes of the channels can be grouped.
 + * Every group may then use special coding techniques like M/S stereo coding
 + * to improve the compression ratio. These channel transformations do not
 + * need to be applied to a whole subframe. Instead, they can also work on
 + * individual scale factor bands (see below).
 + * The coefficients that carry the audio signal in the frequency domain
 + * are transmitted as huffman-coded vectors with 4, 2 and 1 elements.
 + * In addition to that, the encoder can switch to a runlevel coding scheme
 + * by transmitting subframe_length / 128 zero coefficients.
 + *
 + * Before the audio signal can be converted to the time domain, the
 + * coefficients have to be rescaled and inverse quantized.
 + * A subframe is therefore split into several scale factor bands that get
 + * scaled individually.
 + * Scale factors are submitted for every frame but they might be shared
 + * between the subframes of a channel. Scale factors are initially DPCM-coded.
 + * Once scale factors are shared, the differences are transmitted as runlevel
 + * codes.
 + * Every subframe length and offset combination in the frame layout shares a
 + * common quantization factor that can be adjusted for every channel by a
 + * modifier.
 + * After the inverse quantization, the coefficients get processed by an IMDCT.
 + * The resulting values are then windowed with a sine window and the first half
 + * of the values are added to the second half of the output from the previous
 + * subframe in order to reconstruct the output samples.
 + */
 +
 +#include "avcodec.h"
 +#include "internal.h"
 +#include "get_bits.h"
 +#include "put_bits.h"
 +#include "dsputil.h"
 +#include "wma.h"
 +
 +/** current decoder limitations */
 +#define WMALL_MAX_CHANNELS    8                             ///< max number of handled channels
 +#define MAX_SUBFRAMES  32                                    ///< max number of subframes per channel
 +#define MAX_BANDS      29                                    ///< max number of scale factor bands
 +#define MAX_FRAMESIZE  32768                                 ///< maximum compressed frame size
 +
 +#define WMALL_BLOCK_MIN_BITS  6                                           ///< log2 of min block size
 +#define WMALL_BLOCK_MAX_BITS 12                                           ///< log2 of max block size
 +#define WMALL_BLOCK_MAX_SIZE (1 << WMALL_BLOCK_MAX_BITS)                 ///< maximum block size
 +#define WMALL_BLOCK_SIZES    (WMALL_BLOCK_MAX_BITS - WMALL_BLOCK_MIN_BITS + 1) ///< possible block sizes
 +
 +
 +#define VLCBITS            9
 +#define SCALEVLCBITS       8
 +#define VEC4MAXDEPTH    ((HUFF_VEC4_MAXBITS+VLCBITS-1)/VLCBITS)
 +#define VEC2MAXDEPTH    ((HUFF_VEC2_MAXBITS+VLCBITS-1)/VLCBITS)
 +#define VEC1MAXDEPTH    ((HUFF_VEC1_MAXBITS+VLCBITS-1)/VLCBITS)
 +#define SCALEMAXDEPTH   ((HUFF_SCALE_MAXBITS+SCALEVLCBITS-1)/SCALEVLCBITS)
 +#define SCALERLMAXDEPTH ((HUFF_SCALE_RL_MAXBITS+VLCBITS-1)/VLCBITS)
 +
 +static float            sin64[33];        ///< sinus table for decorrelation
 +
 +/**
 + * @brief frame specific decoder context for a single channel
 + */
 +typedef struct {
 +    int16_t  prev_block_len;                          ///< length of the previous block
 +    uint8_t  transmit_coefs;
 +    uint8_t  num_subframes;
 +    uint16_t subframe_len[MAX_SUBFRAMES];             ///< subframe length in samples
 +    uint16_t subframe_offset[MAX_SUBFRAMES];          ///< subframe positions in the current frame
 +    uint8_t  cur_subframe;                            ///< current subframe number
 +    uint16_t decoded_samples;                         ///< number of already processed samples
 +    uint8_t  grouped;                                 ///< channel is part of a group
 +    int      quant_step;                              ///< quantization step for the current subframe
 +    int8_t   reuse_sf;                                ///< share scale factors between subframes
 +    int8_t   scale_factor_step;                       ///< scaling step for the current subframe
 +    int      max_scale_factor;                        ///< maximum scale factor for the current subframe
 +    int      saved_scale_factors[2][MAX_BANDS];       ///< resampled and (previously) transmitted scale factor values
 +    int8_t   scale_factor_idx;                        ///< index for the transmitted scale factor values (used for resampling)
 +    int*     scale_factors;                           ///< pointer to the scale factor values used for decoding
 +    uint8_t  table_idx;                               ///< index in sf_offsets for the scale factor reference block
 +    float*   coeffs;                                  ///< pointer to the subframe decode buffer
 +    uint16_t num_vec_coeffs;                          ///< number of vector coded coefficients
 +    DECLARE_ALIGNED(16, float, out)[WMALL_BLOCK_MAX_SIZE + WMALL_BLOCK_MAX_SIZE / 2]; ///< output buffer
 +    int      transient_counter;                       ///< number of transient samples from the beginning of transient zone
 +} WmallChannelCtx;
 +
 +/**
 + * @brief channel group for channel transformations
 + */
 +typedef struct {
 +    uint8_t num_channels;                                     ///< number of channels in the group
 +    int8_t  transform;                                        ///< transform on / off
 +    int8_t  transform_band[MAX_BANDS];                        ///< controls if the transform is enabled for a certain band
 +    float   decorrelation_matrix[WMALL_MAX_CHANNELS*WMALL_MAX_CHANNELS];
 +    float*  channel_data[WMALL_MAX_CHANNELS];                ///< transformation coefficients
 +} WmallChannelGrp;
 +
 +/**
 + * @brief main decoder context
 + */
 +typedef struct WmallDecodeCtx {
 +    /* generic decoder variables */
 +    AVCodecContext*  avctx;                         ///< codec context for av_log
 +    DSPContext       dsp;                           ///< accelerated DSP functions
 +    uint8_t          frame_data[MAX_FRAMESIZE +
 +                      FF_INPUT_BUFFER_PADDING_SIZE];///< compressed frame data
 +    PutBitContext    pb;                            ///< context for filling the frame_data buffer
 +    FFTContext       mdct_ctx[WMALL_BLOCK_SIZES];  ///< MDCT context per block size
 +    DECLARE_ALIGNED(16, float, tmp)[WMALL_BLOCK_MAX_SIZE]; ///< IMDCT output buffer
 +    float*           windows[WMALL_BLOCK_SIZES];   ///< windows for the different block sizes
 +
 +    /* frame size dependent frame information (set during initialization) */
 +    uint32_t         decode_flags;                  ///< used compression features
 +    uint8_t          len_prefix;                    ///< frame is prefixed with its length
 +    uint8_t          dynamic_range_compression;     ///< frame contains DRC data
 +    uint8_t          bits_per_sample;               ///< integer audio sample size for the unscaled IMDCT output (used to scale to [-1.0, 1.0])
 +    uint16_t         samples_per_frame;             ///< number of samples to output
 +    uint16_t         log2_frame_size;
 +    int8_t           num_channels;                  ///< number of channels in the stream (same as AVCodecContext.num_channels)
 +    int8_t           lfe_channel;                   ///< lfe channel index
 +    uint8_t          max_num_subframes;
 +    uint8_t          subframe_len_bits;             ///< number of bits used for the subframe length
 +    uint8_t          max_subframe_len_bit;          ///< flag indicating that the subframe is of maximum size when the first subframe length bit is 1
 +    uint16_t         min_samples_per_subframe;
 +    int8_t           num_sfb[WMALL_BLOCK_SIZES];   ///< scale factor bands per block size
 +    int16_t          sfb_offsets[WMALL_BLOCK_SIZES][MAX_BANDS];                    ///< scale factor band offsets (multiples of 4)
 +    int8_t           sf_offsets[WMALL_BLOCK_SIZES][WMALL_BLOCK_SIZES][MAX_BANDS]; ///< scale factor resample matrix
 +    int16_t          subwoofer_cutoffs[WMALL_BLOCK_SIZES]; ///< subwoofer cutoff values
 +
 +    /* packet decode state */
 +    GetBitContext    pgb;                           ///< bitstream reader context for the packet
 +    int              next_packet_start;             ///< start offset of the next wma packet in the demuxer packet
 +    uint8_t          packet_offset;                 ///< frame offset in the packet
 +    uint8_t          packet_sequence_number;        ///< current packet number
 +    int              num_saved_bits;                ///< saved number of bits
 +    int              frame_offset;                  ///< frame offset in the bit reservoir
 +    int              subframe_offset;               ///< subframe offset in the bit reservoir
 +    uint8_t          packet_loss;                   ///< set in case of bitstream error
 +    uint8_t          packet_done;                   ///< set when a packet is fully decoded
 +
 +    /* frame decode state */
 +    uint32_t         frame_num;                     ///< current frame number (not used for decoding)
 +    GetBitContext    gb;                            ///< bitstream reader context
 +    int              buf_bit_size;                  ///< buffer size in bits
 +    float*           samples;                       ///< current samplebuffer pointer
 +    float*           samples_end;                   ///< maximum samplebuffer pointer
 +    uint8_t          drc_gain;                      ///< gain for the DRC tool
 +    int8_t           skip_frame;                    ///< skip output step
 +    int8_t           parsed_all_subframes;          ///< all subframes decoded?
 +
 +    /* subframe/block decode state */
 +    int16_t          subframe_len;                  ///< current subframe length
 +    int8_t           channels_for_cur_subframe;     ///< number of channels that contain the subframe
 +    int8_t           channel_indexes_for_cur_subframe[WMALL_MAX_CHANNELS];
 +    int8_t           num_bands;                     ///< number of scale factor bands
 +    int8_t           transmit_num_vec_coeffs;       ///< number of vector coded coefficients is part of the bitstream
 +    int16_t*         cur_sfb_offsets;               ///< sfb offsets for the current block
 +    uint8_t          table_idx;                     ///< index for the num_sfb, sfb_offsets, sf_offsets and subwoofer_cutoffs tables
 +    int8_t           esc_len;                       ///< length of escaped coefficients
 +
 +    uint8_t          num_chgroups;                  ///< number of channel groups
 +    WmallChannelGrp chgroup[WMALL_MAX_CHANNELS];    ///< channel group information
 +
 +    WmallChannelCtx channel[WMALL_MAX_CHANNELS];    ///< per channel data
 +
 +    // WMA lossless
 +
 +    uint8_t do_arith_coding;
 +    uint8_t do_ac_filter;
 +    uint8_t do_inter_ch_decorr;
 +    uint8_t do_mclms;
 +    uint8_t do_lpc;
 +
 +    int8_t acfilter_order;
 +    int8_t acfilter_scaling;
 +    int acfilter_coeffs[16];
 +
 +    int8_t mclms_order;
 +    int8_t mclms_scaling;
 +    int16_t mclms_coeffs[128];
 +    int16_t mclms_coeffs_cur[4];
 +    int16_t mclms_prevvalues[64];   // FIXME: should be 32-bit / 16-bit depending on bit-depth
 +    int16_t mclms_updates[64];
 +    int mclms_recent;
 +
 +    int movave_scaling;
 +    int quant_stepsize;
 +
 +    struct {
 +        int order;
 +        int scaling;
 +        int coefsend;
 +        int bitsend;
 +        int16_t coefs[256];
 +    int16_t lms_prevvalues[512];    // FIXME: see above
 +    int16_t lms_updates[512];   // and here too
 +    int recent;
 +    } cdlms[2][9];              /* XXX: Here, 2 is the max. no. of channels allowed,
 +                                        9 is the maximum no. of filters per channel.
 +                                        Question is, why 2 if WMALL_MAX_CHANNELS == 8 */
 +
 +
 +    int cdlms_ttl[2];
 +
 +    int bV3RTM;
 +
 +    int is_channel_coded[2];    // XXX: same question as above applies here too (and below)
 +    int update_speed[2];
 +
 +    int transient[2];
 +    int transient_pos[2];
 +    int seekable_tile;
 +
 +    int ave_sum[2];
 +
 +    int channel_residues[2][2048];
 +
 +
 +    int lpc_coefs[2][40];
 +    int lpc_order;
 +    int lpc_scaling;
 +    int lpc_intbits;
 +
 +    int16_t channel_coeffs[2][2048]; // FIXME: should be 32-bit / 16-bit depending on bit-depth
 +
 +} WmallDecodeCtx;
 +
 +
 +#undef dprintf
 +#define dprintf(pctx, ...) av_log(pctx, AV_LOG_DEBUG, __VA_ARGS__)
 +
 +
 +static int num_logged_tiles = 0;
 +static int num_logged_subframes = 0;
 +static int num_lms_update_call = 0;
 +
 +/**
 + *@brief helper function to print the most important members of the context
 + *@param s context
 + */
 +static void av_cold dump_context(WmallDecodeCtx *s)
 +{
 +#define PRINT(a, b)     av_log(s->avctx, AV_LOG_DEBUG, " %s = %d\n", a, b);
 +#define PRINT_HEX(a, b) av_log(s->avctx, AV_LOG_DEBUG, " %s = %x\n", a, b);
 +
 +    PRINT("ed sample bit depth", s->bits_per_sample);
 +    PRINT_HEX("ed decode flags", s->decode_flags);
 +    PRINT("samples per frame",   s->samples_per_frame);
 +    PRINT("log2 frame size",     s->log2_frame_size);
 +    PRINT("max num subframes",   s->max_num_subframes);
 +    PRINT("len prefix",          s->len_prefix);
 +    PRINT("num channels",        s->num_channels);
 +}
 +
 +static void dump_int_buffer(uint8_t *buffer, int size, int length, int delimiter)
 +{
 +    int i;
 +
 +    for (i=0 ; i<length ; i++) {
 +        if (!(i%delimiter))
 +            av_log(0, 0, "\n[%d] ", i);
 +        av_log(0, 0, "%d, ", *(int16_t *)(buffer + i * size));
 +    }
 +    av_log(0, 0, "\n");
 +
 +}
 +
 +/**
 + *@brief Uninitialize the decoder and free all resources.
 + *@param avctx codec context
 + *@return 0 on success, < 0 otherwise
 + */
 +static av_cold int decode_end(AVCodecContext *avctx)
 +{
 +    WmallDecodeCtx *s = avctx->priv_data;
 +    int i;
 +
 +    for (i = 0; i < WMALL_BLOCK_SIZES; i++)
 +        ff_mdct_end(&s->mdct_ctx[i]);
 +
 +    return 0;
 +}
 +
 +/**
 + *@brief Initialize the decoder.
 + *@param avctx codec context
 + *@return 0 on success, -1 otherwise
 + */
 +static av_cold int decode_init(AVCodecContext *avctx)
 +{
 +    WmallDecodeCtx *s = avctx->priv_data;
 +    uint8_t *edata_ptr = avctx->extradata;
 +    unsigned int channel_mask;
 +    int i;
 +    int log2_max_num_subframes;
 +    int num_possible_block_sizes;
 +
 +    s->avctx = avctx;
 +    dsputil_init(&s->dsp, avctx);
 +    init_put_bits(&s->pb, s->frame_data, MAX_FRAMESIZE);
 +
 +    avctx->sample_fmt = AV_SAMPLE_FMT_FLT;
 +
 +    if (avctx->extradata_size >= 18) {
 +        s->decode_flags    = AV_RL16(edata_ptr+14);
 +        channel_mask       = AV_RL32(edata_ptr+2);
 +        s->bits_per_sample = AV_RL16(edata_ptr);
 +        /** dump the extradata */
 +        for (i = 0; i < avctx->extradata_size; i++)
 +            dprintf(avctx, "[%x] ", avctx->extradata[i]);
 +        dprintf(avctx, "\n");
 +
 +    } else {
 +        av_log_ask_for_sample(avctx, "Unknown extradata size\n");
 +        return AVERROR_INVALIDDATA;
 +    }
 +
 +    /** generic init */
 +    s->log2_frame_size = av_log2(avctx->block_align) + 4;
 +
 +    /** frame info */
 +    s->skip_frame  = 1; /* skip first frame */
 +    s->packet_loss = 1;
 +    s->len_prefix  = (s->decode_flags & 0x40);
 +
 +    /** get frame len */
 +    s->samples_per_frame = 1 << ff_wma_get_frame_len_bits(avctx->sample_rate,
 +                                                          3, s->decode_flags);
 +
 +    /** init previous block len */
 +    for (i = 0; i < avctx->channels; i++)
 +        s->channel[i].prev_block_len = s->samples_per_frame;
 +
 +    /** subframe info */
 +    log2_max_num_subframes  = ((s->decode_flags & 0x38) >> 3);
 +    s->max_num_subframes    = 1 << log2_max_num_subframes;
 +    s->max_subframe_len_bit = 0;
 +    s->subframe_len_bits    = av_log2(log2_max_num_subframes) + 1;
 +
 +    num_possible_block_sizes     = log2_max_num_subframes + 1;
 +    s->min_samples_per_subframe  = s->samples_per_frame / s->max_num_subframes;
 +    s->dynamic_range_compression = (s->decode_flags & 0x80);
 +
 +    s->bV3RTM = s->decode_flags & 0x100;
 +
 +    if (s->max_num_subframes > MAX_SUBFRAMES) {
 +        av_log(avctx, AV_LOG_ERROR, "invalid number of subframes %i\n",
 +               s->max_num_subframes);
 +        return AVERROR_INVALIDDATA;
 +    }
 +
 +    s->num_channels = avctx->channels;
 +
 +    /** extract lfe channel position */
 +    s->lfe_channel = -1;
 +
 +    if (channel_mask & 8) {
 +        unsigned int mask;
 +        for (mask = 1; mask < 16; mask <<= 1) {
 +            if (channel_mask & mask)
 +                ++s->lfe_channel;
 +        }
 +    }
 +
 +    if (s->num_channels < 0) {
 +        av_log(avctx, AV_LOG_ERROR, "invalid number of channels %d\n", s->num_channels);
 +        return AVERROR_INVALIDDATA;
 +    } else if (s->num_channels > WMALL_MAX_CHANNELS) {
 +        av_log_ask_for_sample(avctx, "unsupported number of channels\n");
 +        return AVERROR_PATCHWELCOME;
 +    }
 +
 +    avctx->channel_layout = channel_mask;
 +    return 0;
 +}
 +
 +/**
 + *@brief Decode the subframe length.
 + *@param s context
 + *@param offset sample offset in the frame
 + *@return decoded subframe length on success, < 0 in case of an error
 + */
 +static int decode_subframe_length(WmallDecodeCtx *s, int offset)
 +{
 +    int frame_len_ratio;
 +    int subframe_len, len;
 +
 +    /** no need to read from the bitstream when only one length is possible */
 +    if (offset == s->samples_per_frame - s->min_samples_per_subframe)
 +        return s->min_samples_per_subframe;
 +
 +    len = av_log2(s->max_num_subframes - 1) + 1;
 +    frame_len_ratio = get_bits(&s->gb, len);
 +
 +    subframe_len = s->min_samples_per_subframe * (frame_len_ratio + 1);
 +
 +    /** sanity check the length */
 +    if (subframe_len < s->min_samples_per_subframe ||
 +        subframe_len > s->samples_per_frame) {
 +        av_log(s->avctx, AV_LOG_ERROR, "broken frame: subframe_len %i\n",
 +               subframe_len);
 +        return AVERROR_INVALIDDATA;
 +    }
 +    return subframe_len;
 +}
 +
 +/**
 + *@brief Decode how the data in the frame is split into subframes.
 + *       Every WMA frame contains the encoded data for a fixed number of
 + *       samples per channel. The data for every channel might be split
 + *       into several subframes. This function will reconstruct the list of
 + *       subframes for every channel.
 + *
 + *       If the subframes are not evenly split, the algorithm estimates the
 + *       channels with the lowest number of total samples.
 + *       Afterwards, for each of these channels a bit is read from the
 + *       bitstream that indicates if the channel contains a subframe with the
 + *       next subframe size that is going to be read from the bitstream or not.
 + *       If a channel contains such a subframe, the subframe size gets added to
 + *       the channel's subframe list.
 + *       The algorithm repeats these steps until the frame is properly divided
 + *       between the individual channels.
 + *
 + *@param s context
 + *@return 0 on success, < 0 in case of an error
 + */
 +static int decode_tilehdr(WmallDecodeCtx *s)
 +{
 +    uint16_t num_samples[WMALL_MAX_CHANNELS];        /**< sum of samples for all currently known subframes of a channel */
 +    uint8_t  contains_subframe[WMALL_MAX_CHANNELS];  /**< flag indicating if a channel contains the current subframe */
 +    int channels_for_cur_subframe = s->num_channels;  /**< number of channels that contain the current subframe */
 +    int fixed_channel_layout = 0;                     /**< flag indicating that all channels use the same subfra2me offsets and sizes */
 +    int min_channel_len = 0;                          /**< smallest sum of samples (channels with this length will be processed first) */
 +    int c;
 +
 +    /* Should never consume more than 3073 bits (256 iterations for the
 +     * while loop when always the minimum amount of 128 samples is substracted
 +     * from missing samples in the 8 channel case).
 +     * 1 + BLOCK_MAX_SIZE * MAX_CHANNELS / BLOCK_MIN_SIZE * (MAX_CHANNELS  + 4)
 +     */
 +
 +    /** reset tiling information */
 +    for (c = 0; c < s->num_channels; c++)
 +        s->channel[c].num_subframes = 0;
 +
 +    memset(num_samples, 0, sizeof(num_samples));
 +
 +    if (s->max_num_subframes == 1 || get_bits1(&s->gb))
 +        fixed_channel_layout = 1;
 +
 +    /** loop until the frame data is split between the subframes */
 +    do {
 +        int subframe_len;
 +
 +        /** check which channels contain the subframe */
 +        for (c = 0; c < s->num_channels; c++) {
 +            if (num_samples[c] == min_channel_len) {
 +                if (fixed_channel_layout || channels_for_cur_subframe == 1 ||
 +                    (min_channel_len == s->samples_per_frame - s->min_samples_per_subframe)) {
 +                    contains_subframe[c] = 1;
 +                }
 +                else {
 +                    contains_subframe[c] = get_bits1(&s->gb);
 +                }
 +            } else
 +                contains_subframe[c] = 0;
 +        }
 +
 +        /** get subframe length, subframe_len == 0 is not allowed */
 +        if ((subframe_len = decode_subframe_length(s, min_channel_len)) <= 0)
 +            return AVERROR_INVALIDDATA;
 +        /** add subframes to the individual channels and find new min_channel_len */
 +        min_channel_len += subframe_len;
 +        for (c = 0; c < s->num_channels; c++) {
 +            WmallChannelCtx* chan = &s->channel[c];
 +
 +            if (contains_subframe[c]) {
 +                if (chan->num_subframes >= MAX_SUBFRAMES) {
 +                    av_log(s->avctx, AV_LOG_ERROR,
 +                           "broken frame: num subframes > 31\n");
 +                    return AVERROR_INVALIDDATA;
 +                }
 +                chan->subframe_len[chan->num_subframes] = subframe_len;
 +                num_samples[c] += subframe_len;
 +                ++chan->num_subframes;
 +                if (num_samples[c] > s->samples_per_frame) {
 +                    av_log(s->avctx, AV_LOG_ERROR, "broken frame: "
 +                           "channel len(%d) > samples_per_frame(%d)\n",
 +                           num_samples[c], s->samples_per_frame);
 +                    return AVERROR_INVALIDDATA;
 +                }
 +            } else if (num_samples[c] <= min_channel_len) {
 +                if (num_samples[c] < min_channel_len) {
 +                    channels_for_cur_subframe = 0;
 +                    min_channel_len = num_samples[c];
 +                }
 +                ++channels_for_cur_subframe;
 +            }
 +        }
 +    } while (min_channel_len < s->samples_per_frame);
 +
 +    for (c = 0; c < s->num_channels; c++) {
 +        int i;
 +        int offset = 0;
 +        for (i = 0; i < s->channel[c].num_subframes; i++) {
 +            s->channel[c].subframe_offset[i] = offset;
 +            offset += s->channel[c].subframe_len[i];
 +        }
 +    }
 +
 +    return 0;
 +}
 +
 +
 +static int my_log2(unsigned int i)
 +{
 +    unsigned int iLog2 = 0;
 +    while ((i >> iLog2) > 1)
 +        iLog2++;
 +    return iLog2;
 +}
 +
 +
 +/**
 + *
 + */
 +static void decode_ac_filter(WmallDecodeCtx *s)
 +{
 +    int i;
 +    s->acfilter_order = get_bits(&s->gb, 4) + 1;
 +    s->acfilter_scaling = get_bits(&s->gb, 4);
 +
 +    for(i = 0; i < s->acfilter_order; i++) {
 +        s->acfilter_coeffs[i] = get_bits(&s->gb, s->acfilter_scaling) + 1;
 +    }
 +}
 +
 +
 +/**
 + *
 + */
 +static void decode_mclms(WmallDecodeCtx *s)
 +{
 +    s->mclms_order = (get_bits(&s->gb, 4) + 1) * 2;
 +    s->mclms_scaling = get_bits(&s->gb, 4);
 +    if(get_bits1(&s->gb)) {
 +        // mclms_send_coef
 +        int i;
 +        int send_coef_bits;
 +        int cbits = av_log2(s->mclms_scaling + 1);
 +        assert(cbits == my_log2(s->mclms_scaling + 1));
 +        if(1 << cbits < s->mclms_scaling + 1)
 +            cbits++;
 +
 +        send_coef_bits = (cbits ? get_bits(&s->gb, cbits) : 0) + 2;
 +
 +        for(i = 0; i < s->mclms_order * s->num_channels * s->num_channels; i++) {
 +            s->mclms_coeffs[i] = get_bits(&s->gb, send_coef_bits);
 +        }
 +
 +        for(i = 0; i < s->num_channels; i++) {
 +            int c;
 +            for(c = 0; c < i; c++) {
 +                s->mclms_coeffs_cur[i * s->num_channels + c] = get_bits(&s->gb, send_coef_bits);
 +            }
 +        }
 +    }
 +}
 +
 +
 +/**
 + *
 + */
 +static void decode_cdlms(WmallDecodeCtx *s)
 +{
 +    int c, i;
 +    int cdlms_send_coef = get_bits1(&s->gb);
 +
 +    for(c = 0; c < s->num_channels; c++) {
 +        s->cdlms_ttl[c] = get_bits(&s->gb, 3) + 1;
 +        for(i = 0; i < s->cdlms_ttl[c]; i++) {
 +            s->cdlms[c][i].order = (get_bits(&s->gb, 7) + 1) * 8;
 +        }
 +
 +        for(i = 0; i < s->cdlms_ttl[c]; i++) {
 +            s->cdlms[c][i].scaling = get_bits(&s->gb, 4);
 +        }
 +
 +        if(cdlms_send_coef) {
 +            for(i = 0; i < s->cdlms_ttl[c]; i++) {
 +                int cbits, shift_l, shift_r, j;
 +                cbits = av_log2(s->cdlms[c][i].order);
 +                if(1 << cbits < s->cdlms[c][i].order)
 +                    cbits++;
 +                s->cdlms[c][i].coefsend = get_bits(&s->gb, cbits) + 1;
 +
 +                cbits = av_log2(s->cdlms[c][i].scaling + 1);
 +                if(1 << cbits < s->cdlms[c][i].scaling + 1)
 +                    cbits++;
 +
 +                s->cdlms[c][i].bitsend = get_bits(&s->gb, cbits) + 2;
 +                shift_l = 32 - s->cdlms[c][i].bitsend;
 +                shift_r = 32 - 2 - s->cdlms[c][i].scaling;
 +                for(j = 0; j < s->cdlms[c][i].coefsend; j++) {
 +                    s->cdlms[c][i].coefs[j] =
 +                        (get_bits(&s->gb, s->cdlms[c][i].bitsend) << shift_l) >> shift_r;
 +                }
 +            }
 +        }
 +    }
 +}
 +
 +/**
 + *
 + */
 +static int decode_channel_residues(WmallDecodeCtx *s, int ch, int tile_size)
 +{
 +    int i = 0;
 +    unsigned int ave_mean;
 +    s->transient[ch] = get_bits1(&s->gb);
 +    if(s->transient[ch]) {
 +            s->transient_pos[ch] = get_bits(&s->gb, av_log2(tile_size));
 +        if (s->transient_pos[ch])
 +                s->transient[ch] = 0;
 +            s->channel[ch].transient_counter =
 +                FFMAX(s->channel[ch].transient_counter, s->samples_per_frame / 2);
 +        } else if (s->channel[ch].transient_counter)
 +            s->transient[ch] = 1;
 +
 +    if(s->seekable_tile) {
 +        ave_mean = get_bits(&s->gb, s->bits_per_sample);
 +        s->ave_sum[ch] = ave_mean << (s->movave_scaling + 1);
 +//        s->ave_sum[ch] *= 2;
 +    }
 +
 +    if(s->seekable_tile) {
 +        if(s->do_inter_ch_decorr)
 +            s->channel_residues[ch][0] = get_sbits(&s->gb, s->bits_per_sample + 1);
 +        else
 +            s->channel_residues[ch][0] = get_sbits(&s->gb, s->bits_per_sample);
 +        i++;
 +    }
 +    //av_log(0, 0, "%8d: ", num_logged_tiles++);
 +    for(; i < tile_size; i++) {
 +        int quo = 0, rem, rem_bits, residue;
 +        while(get_bits1(&s->gb))
 +            quo++;
 +        if(quo >= 32)
 +            quo += get_bits_long(&s->gb, get_bits(&s->gb, 5) + 1);
 +
 +               ave_mean = (s->ave_sum[ch] + (1 << s->movave_scaling)) >> (s->movave_scaling + 1);
 +        rem_bits = av_ceil_log2(ave_mean);
 +        rem = rem_bits ? get_bits(&s->gb, rem_bits) : 0;
 +        residue = (quo << rem_bits) + rem;
 +
 +        s->ave_sum[ch] = residue + s->ave_sum[ch] - (s->ave_sum[ch] >> s->movave_scaling);
 +
 +        if(residue & 1)
 +            residue = -(residue >> 1) - 1;
 +        else
 +            residue = residue >> 1;
 +        s->channel_residues[ch][i] = residue;
 +    }
 +    dump_int_buffer(s->channel_residues[ch], 4, tile_size, 16);
 +
 +    return 0;
 +
 +}
 +
 +
 +/**
 + *
 + */
 +static void
 +decode_lpc(WmallDecodeCtx *s)
 +{
 +    int ch, i, cbits;
 +    s->lpc_order = get_bits(&s->gb, 5) + 1;
 +    s->lpc_scaling = get_bits(&s->gb, 4);
 +    s->lpc_intbits = get_bits(&s->gb, 3) + 1;
 +    cbits = s->lpc_scaling + s->lpc_intbits;
 +    for(ch = 0; ch < s->num_channels; ch++) {
 +        for(i = 0; i < s->lpc_order; i++) {
 +            s->lpc_coefs[ch][i] = get_sbits(&s->gb, cbits);
 +        }
 +    }
 +}
 +
 +
 +static void clear_codec_buffers(WmallDecodeCtx *s)
 +{
 +    int ich, ilms;
 +
 +    memset(s->acfilter_coeffs, 0,     16 * sizeof(int));
 +    memset(s->lpc_coefs      , 0, 40 * 2 * sizeof(int));
 +
 +    memset(s->mclms_coeffs    , 0, 128 * sizeof(int16_t));
 +    memset(s->mclms_coeffs_cur, 0,   4 * sizeof(int16_t));
 +    memset(s->mclms_prevvalues, 0,  64 * sizeof(int));
 +    memset(s->mclms_updates   , 0,  64 * sizeof(int16_t));
 +
 +    for (ich = 0; ich < s->num_channels; ich++) {
 +        for (ilms = 0; ilms < s->cdlms_ttl[ich]; ilms++) {
 +            memset(s->cdlms[ich][ilms].coefs         , 0, 256 * sizeof(int16_t));
 +            memset(s->cdlms[ich][ilms].lms_prevvalues, 0, 512 * sizeof(int16_t));
 +            memset(s->cdlms[ich][ilms].lms_updates   , 0, 512 * sizeof(int16_t));
 +        }
 +        s->ave_sum[ich] = 0;
 +    }
 +}
 +
 +/**
 + *@brief Resets filter parameters and transient area at new seekable tile
 + */
 +static void reset_codec(WmallDecodeCtx *s)
 +{
 +    int ich, ilms;
 +    s->mclms_recent = s->mclms_order * s->num_channels;
 +    for (ich = 0; ich < s->num_channels; ich++) {
 +        for (ilms = 0; ilms < s->cdlms_ttl[ich]; ilms++)
 +            s->cdlms[ich][ilms].recent = s->cdlms[ich][ilms].order;
 +        /* first sample of a seekable subframe is considered as the starting of
 +           a transient area which is samples_per_frame samples long */
 +        s->channel[ich].transient_counter = s->samples_per_frame;
 +        s->transient[ich] = 1;
 +        s->transient_pos[ich] = 0;
 +    }
 +}
 +
 +
 +
 +static void mclms_update(WmallDecodeCtx *s, int icoef)
 +{
 +    int i, j, ich;
 +    int16_t pred_error;
 +    int order = s->mclms_order;
 +    int num_channels = s->num_channels;
 +    int16_t range = 1 << (s->bits_per_sample - 1);
 +    int bps = s->bits_per_sample > 16 ? 4 : 2; // bytes per sample
 +
 +    for (ich = 0; ich < num_channels; ich++) {
 +        pred_error = s->channel_coeffs[ich][icoef] -
 +                     s->channel_residues[ich][icoef];
 +        if (pred_error > 0) {
 +            for (i = 0; i < order * num_channels; i++)
 +                s->mclms_coeffs[i + ich * order * num_channels] +=
 +                    s->mclms_updates[s->mclms_recent + i];
 +            for (j = 0; j < i; j++) {
 +                if (s->channel_coeffs[ich][icoef] > 0)
 +                    s->mclms_coeffs_cur[ich * num_channels + j] += 1;
 +                else if (s->channel_coeffs[ich][icoef] < 0)
 +                    s->mclms_coeffs_cur[ich * num_channels + j] -= 1;
 +            }
 +        } else if (pred_error < 0) {
 +            for (i = 0; i < order * num_channels; i++)
 +                s->mclms_coeffs[i + ich * order * num_channels] -=
 +                    s->mclms_updates[s->mclms_recent + i];
 +            for (j = 0; j < i; j++) {
 +                if (s->channel_coeffs[ich][icoef] > 0)
 +                    s->mclms_coeffs_cur[ich * num_channels + j] -= 1;
 +                else if (s->channel_coeffs[ich][icoef] < 0)
 +                    s->mclms_coeffs_cur[ich * num_channels + j] += 1;
 +            }
 +        }
 +    }
 +
 +    for (ich = num_channels - 1; ich >= 0; ich--) {
 +        s->mclms_recent--;
 +        if (s->channel_coeffs[ich][icoef] > range - 1)
 +            s->mclms_prevvalues[s->mclms_recent] = range - 1;
 +        else if (s->channel_coeffs[ich][icoef] <= -range)
 +            s->mclms_prevvalues[s->mclms_recent] = -range;
 +
 +        s->mclms_updates[s->mclms_recent] =
 +            av_clip(-1, s->channel_coeffs[ich][icoef], 1);
 +    }
 +
 +    if (s->mclms_recent == 0) {
 +        memcpy(&s->mclms_prevvalues[order * num_channels],
 +               s->mclms_prevvalues,
 +               bps * order * num_channels);
 +        memcpy(&s->mclms_updates[order * num_channels],
 +               s->mclms_updates,
 +               bps * order * num_channels);
 +        s->mclms_recent = num_channels * order;
 +    }
 +}
 +static void mclms_predict(WmallDecodeCtx *s, int icoef)
 +{
 +    int ich, i;
 +    int16_t pred;
 +    int order = s->mclms_order;
 +    int num_channels = s->num_channels;
 +
 +    for (ich = 0; ich < num_channels; ich++) {
 +        if (!s->is_channel_coded[ich])
 +            continue;
 +        pred = 0;
 +        for (i = 0; i < order * num_channels; i++)
 +            pred += s->mclms_prevvalues[i] *
 +                    s->mclms_coeffs[i + order * num_channels * ich];
 +        for (i = 0; i < ich; i++)
 +            pred += s->channel_coeffs[ich][icoef] *
 +                    s->mclms_coeffs_cur[i + order * num_channels * ich];
 +        s->channel_coeffs[ich][icoef] =
 +                    s->channel_residues[ich][icoef] + pred;
 +    }
 +}
 +
 +static void revert_mclms(WmallDecodeCtx *s, int tile_size)
 +{
 +    int icoef;
 +    for (icoef = 0; icoef < tile_size; icoef++) {
 +        mclms_predict(s, icoef);
 +        mclms_update(s, icoef);
 +    }
 +}
 +
 +static int lms_predict(WmallDecodeCtx *s, int ich, int ilms)
 +{
 +    int pred = 0;
 +    int icoef;
 +    int recent = s->cdlms[ich][ilms].recent;
 +
 +    for (icoef = 0; icoef < s->cdlms[ich][ilms].order; icoef++)
 +        pred += s->cdlms[ich][ilms].coefs[icoef] *
 +                    s->cdlms[ich][ilms].lms_prevvalues[icoef + recent];
 +
 +    //pred += (1 << (s->cdlms[ich][ilms].scaling - 1));
 +    /* XXX: Table 29 has:
 +            iPred >= cdlms[iCh][ilms].scaling;
 +       seems to me like a missing > */
 +    //pred >>= s->cdlms[ich][ilms].scaling;
 +    return pred;
 +}
 +
 +static void lms_update(WmallDecodeCtx *s, int ich, int ilms, int input, int residue)
 +{
 +    int icoef;
 +    int recent = s->cdlms[ich][ilms].recent;
 +    int range = 1 << s->bits_per_sample - 1;
 +    int bps = s->bits_per_sample > 16 ? 4 : 2; // bytes per sample
 +
 +    if (residue < 0) {
 +        for (icoef = 0; icoef < s->cdlms[ich][ilms].order; icoef++)
 +            s->cdlms[ich][ilms].coefs[icoef] -=
 +                s->cdlms[ich][ilms].lms_updates[icoef + recent];
 +    } else if (residue > 0) {
 +        for (icoef = 0; icoef < s->cdlms[ich][ilms].order; icoef++)
 +            s->cdlms[ich][ilms].coefs[icoef] +=
 +                s->cdlms[ich][ilms].lms_updates[icoef + recent];    /* spec mistakenly
 +                                                                    dropped the recent */
 +    }
 +
 +    if (recent)
 +        recent--;
 +    else {
 +        /* XXX: This memcpy()s will probably fail if a fixed 32-bit buffer is used.
 +                follow kshishkov's suggestion of using a union. */
 +        memcpy(&s->cdlms[ich][ilms].lms_prevvalues[s->cdlms[ich][ilms].order],
 +               s->cdlms[ich][ilms].lms_prevvalues,
 +               bps * s->cdlms[ich][ilms].order);
 +        memcpy(&s->cdlms[ich][ilms].lms_updates[s->cdlms[ich][ilms].order],
 +               s->cdlms[ich][ilms].lms_updates,
 +               bps * s->cdlms[ich][ilms].order);
 +        recent = s->cdlms[ich][ilms].order - 1;
 +    }
 +
 +    s->cdlms[ich][ilms].lms_prevvalues[recent] = av_clip(input, -range, range - 1);
 +    if (!input)
 +        s->cdlms[ich][ilms].lms_updates[recent] = 0;
 +    else if (input < 0)
 +        s->cdlms[ich][ilms].lms_updates[recent] = -s->update_speed[ich];
 +    else
 +        s->cdlms[ich][ilms].lms_updates[recent] = s->update_speed[ich];
 +
 +    /* XXX: spec says:
 +    cdlms[iCh][ilms].updates[iRecent + cdlms[iCh][ilms].order >> 4] >>= 2;
 +    lms_updates[iCh][ilms][iRecent + cdlms[iCh][ilms].order >> 3] >>= 1;
 +
 +        Questions is - are cdlms[iCh][ilms].updates[] and lms_updates[][][] two
 +        seperate buffers? Here I've assumed that the two are same which makes
 +        more sense to me.
 +    */
 +    s->cdlms[ich][ilms].lms_updates[recent + (s->cdlms[ich][ilms].order >> 4)] >>= 2;
 +    s->cdlms[ich][ilms].lms_updates[recent + (s->cdlms[ich][ilms].order >> 3)] >>= 1;
 +    s->cdlms[ich][ilms].recent = recent;
 +}
 +
 +static void use_high_update_speed(WmallDecodeCtx *s, int ich)
 +{
 +    int ilms, recent, icoef;
 +    s->update_speed[ich] = 16;
 +    for (ilms = s->cdlms_ttl[ich] - 1; ilms >= 0; ilms--) {
 +        recent = s->cdlms[ich][ilms].recent;
 +        if (s->bV3RTM) {
 +            for (icoef = 0; icoef < s->cdlms[ich][ilms].order; icoef++)
 +                s->cdlms[ich][ilms].lms_updates[icoef + recent] *= 2;
 +        } else {
 +            for (icoef = 0; icoef < s->cdlms[ich][ilms].order; icoef++)
 +                s->cdlms[ich][ilms].lms_updates[icoef] *= 2;
 +        }
 +    }
 +}
 +
 +static void use_normal_update_speed(WmallDecodeCtx *s, int ich)
 +{
 +    int ilms, recent, icoef;
 +    s->update_speed[ich] = 8;
 +    for (ilms = s->cdlms_ttl[ich] - 1; ilms >= 0; ilms--) {
 +        recent = s->cdlms[ich][ilms].recent;
 +        if (s->bV3RTM) {
 +            for (icoef = 0; icoef < s->cdlms[ich][ilms].order; icoef++)
 +                s->cdlms[ich][ilms].lms_updates[icoef + recent] /= 2;
 +        } else {
 +            for (icoef = 0; icoef < s->cdlms[ich][ilms].order; icoef++)
 +                s->cdlms[ich][ilms].lms_updates[icoef] /= 2;
 +        }
 +    }
 +}
 +
 +static void revert_cdlms(WmallDecodeCtx *s, int ch, int coef_begin, int coef_end)
 +{
 +    int icoef;
 +    int pred;
 +    int ilms, num_lms;
 +    int residue, input;
 +
 +    num_lms = s->cdlms_ttl[ch];
 +    for (ilms = num_lms - 1; ilms >= 0; ilms--) {
 +        //s->cdlms[ch][ilms].recent = s->cdlms[ch][ilms].order;
 +        for (icoef = coef_begin; icoef < coef_end; icoef++) {
 +            pred = 1 << (s->cdlms[ch][ilms].scaling - 1);
 +            residue = s->channel_residues[ch][icoef];
 +            pred += lms_predict(s, ch, ilms);
 +            input = residue + (pred >> s->cdlms[ch][ilms].scaling);
 +            lms_update(s, ch, ilms, input, residue);
 +            s->channel_residues[ch][icoef] = input;
 +        }
 +    }
 +}
 +
 +
 +
 +/**
 + *@brief Decode a single subframe (block).
 + *@param s codec context
 + *@return 0 on success, < 0 when decoding failed
 + */
 +static int decode_subframe(WmallDecodeCtx *s)
 +{
 +    int offset = s->samples_per_frame;
 +    int subframe_len = s->samples_per_frame;
 +    int i;
 +    int total_samples   = s->samples_per_frame * s->num_channels;
 +    int rawpcm_tile;
 +    int padding_zeroes;
 +
 +    s->subframe_offset = get_bits_count(&s->gb);
 +
 +    /** reset channel context and find the next block offset and size
 +        == the next block of the channel with the smallest number of
 +        decoded samples
 +    */
 +    for (i = 0; i < s->num_channels; i++) {
 +        s->channel[i].grouped = 0;
 +        if (offset > s->channel[i].decoded_samples) {
 +            offset = s->channel[i].decoded_samples;
 +            subframe_len =
 +                s->channel[i].subframe_len[s->channel[i].cur_subframe];
 +        }
 +    }
 +
 +    /** get a list of all channels that contain the estimated block */
 +    s->channels_for_cur_subframe = 0;
 +    for (i = 0; i < s->num_channels; i++) {
 +        const int cur_subframe = s->channel[i].cur_subframe;
 +        /** substract already processed samples */
 +        total_samples -= s->channel[i].decoded_samples;
 +
 +        /** and count if there are multiple subframes that match our profile */
 +        if (offset == s->channel[i].decoded_samples &&
 +            subframe_len == s->channel[i].subframe_len[cur_subframe]) {
 +            total_samples -= s->channel[i].subframe_len[cur_subframe];
 +            s->channel[i].decoded_samples +=
 +                s->channel[i].subframe_len[cur_subframe];
 +            s->channel_indexes_for_cur_subframe[s->channels_for_cur_subframe] = i;
 +            ++s->channels_for_cur_subframe;
 +        }
 +    }
 +
 +    /** check if the frame will be complete after processing the
 +        estimated block */
 +    if (!total_samples)
 +        s->parsed_all_subframes = 1;
 +
 +
 +    s->seekable_tile = get_bits1(&s->gb);
 +    if(s->seekable_tile) {
 +        clear_codec_buffers(s);
 +
 +        s->do_arith_coding    = get_bits1(&s->gb);
 +        if(s->do_arith_coding) {
 +            dprintf(s->avctx, "do_arith_coding == 1");
 +            abort();
 +        }
 +        s->do_ac_filter       = get_bits1(&s->gb);
 +        s->do_inter_ch_decorr = get_bits1(&s->gb);
 +        s->do_mclms           = get_bits1(&s->gb);
 +
 +        if(s->do_ac_filter)
 +            decode_ac_filter(s);
 +
 +        if(s->do_mclms)
 +            decode_mclms(s);
 +
 +        decode_cdlms(s);
 +        s->movave_scaling = get_bits(&s->gb, 3);
 +        s->quant_stepsize = get_bits(&s->gb, 8) + 1;
 +
 +            reset_codec(s);
 +    }
 +
 +    rawpcm_tile = get_bits1(&s->gb);
 +
 +    for(i = 0; i < s->num_channels; i++) {
 +        s->is_channel_coded[i] = 1;
 +    }
 +
 +    if(!rawpcm_tile) {
 +
 +        for(i = 0; i < s->num_channels; i++) {
 +            s->is_channel_coded[i] = get_bits1(&s->gb);
 +        }
 +
 +        if(s->bV3RTM) {
 +            // LPC
 +            s->do_lpc = get_bits1(&s->gb);
 +            if(s->do_lpc) {
 +                decode_lpc(s);
 +            }
 +        } else {
 +            s->do_lpc = 0;
 +        }
 +    }
 +
 +
 +    if(get_bits1(&s->gb)) {
 +        padding_zeroes = get_bits(&s->gb, 5);
 +    } else {
 +        padding_zeroes = 0;
 +    }
 +
 +    if(rawpcm_tile) {
 +
 +        int bits = s->bits_per_sample - padding_zeroes;
 +        int j;
 +        dprintf(s->avctx, "RAWPCM %d bits per sample. total %d bits, remain=%d\n", bits,
 +                bits * s->num_channels * subframe_len, get_bits_count(&s->gb));
 +        for(i = 0; i < s->num_channels; i++) {
 +            for(j = 0; j < subframe_len; j++) {
 +                s->channel_coeffs[i][j] = get_sbits(&s->gb, bits);
 +//                dprintf(s->avctx, "PCM[%d][%d] = 0x%04x\n", i, j, s->channel_coeffs[i][j]);
 +            }
 +        }
 +    } else {
 +        for(i = 0; i < s->num_channels; i++)
 +            if(s->is_channel_coded[i]) {
 +            decode_channel_residues(s, i, subframe_len);
 +            if (s->seekable_tile)
 +                use_high_update_speed(s, i);
 +            else
 +                use_normal_update_speed(s, i);
 +            revert_cdlms(s, i, 0, subframe_len);
 +        }
 +    }
 +
 +    /** handled one subframe */
 +
 +    for (i = 0; i < s->channels_for_cur_subframe; i++) {
 +        int c = s->channel_indexes_for_cur_subframe[i];
 +        if (s->channel[c].cur_subframe >= s->channel[c].num_subframes) {
 +            av_log(s->avctx, AV_LOG_ERROR, "broken subframe\n");
 +            return AVERROR_INVALIDDATA;
 +        }
 +        ++s->channel[c].cur_subframe;
 +    }
 +    num_logged_subframes++;
 +    return 0;
 +}
 +
 +/**
 + *@brief Decode one WMA frame.
 + *@param s codec context
 + *@return 0 if the trailer bit indicates that this is the last frame,
 + *        1 if there are additional frames
 + */
 +static int decode_frame(WmallDecodeCtx *s)
 +{
 +    GetBitContext* gb = &s->gb;
 +    int more_frames = 0;
 +    int len = 0;
 +    int i;
 +
 +    /** check for potential output buffer overflow */
 +    if (s->num_channels * s->samples_per_frame > s->samples_end - s->samples) {
 +        /** return an error if no frame could be decoded at all */
 +        av_log(s->avctx, AV_LOG_ERROR,
 +               "not enough space for the output samples\n");
 +        s->packet_loss = 1;
 +        return 0;
 +    }
 +
 +    /** get frame length */
 +    if (s->len_prefix)
 +        len = get_bits(gb, s->log2_frame_size);
 +
 +    /** decode tile information */
 +    if (decode_tilehdr(s)) {
 +        s->packet_loss = 1;
 +        return 0;
 +    }
 +
 +    /** read drc info */
 +    if (s->dynamic_range_compression) {
 +        s->drc_gain = get_bits(gb, 8);
 +    }
 +
 +    /** no idea what these are for, might be the number of samples
 +        that need to be skipped at the beginning or end of a stream */
 +    if (get_bits1(gb)) {
 +        int skip;
 +
 +        /** usually true for the first frame */
 +        if (get_bits1(gb)) {
 +            skip = get_bits(gb, av_log2(s->samples_per_frame * 2));
 +            dprintf(s->avctx, "start skip: %i\n", skip);
 +        }
 +
 +        /** sometimes true for the last frame */
 +        if (get_bits1(gb)) {
 +            skip = get_bits(gb, av_log2(s->samples_per_frame * 2));
 +            dprintf(s->avctx, "end skip: %i\n", skip);
 +        }
 +
 +    }
 +
 +    /** reset subframe states */
 +    s->parsed_all_subframes = 0;
 +    for (i = 0; i < s->num_channels; i++) {
 +        s->channel[i].decoded_samples = 0;
 +        s->channel[i].cur_subframe    = 0;
 +        s->channel[i].reuse_sf        = 0;
 +    }
 +
 +    /** decode all subframes */
 +    while (!s->parsed_all_subframes) {
 +        if (decode_subframe(s) < 0) {
 +            s->packet_loss = 1;
 +            return 0;
 +        }
 +    }
 +
 +    dprintf(s->avctx, "Frame done\n");
 +
 +    if (s->skip_frame) {
 +        s->skip_frame = 0;
 +    } else
 +        s->samples += s->num_channels * s->samples_per_frame;
 +
 +    if (s->len_prefix) {
 +        if (len != (get_bits_count(gb) - s->frame_offset) + 2) {
 +            /** FIXME: not sure if this is always an error */
 +            av_log(s->avctx, AV_LOG_ERROR,
 +                   "frame[%i] would have to skip %i bits\n", s->frame_num,
 +                   len - (get_bits_count(gb) - s->frame_offset) - 1);
 +            s->packet_loss = 1;
 +            return 0;
 +        }
 +
 +        /** skip the rest of the frame data */
 +        skip_bits_long(gb, len - (get_bits_count(gb) - s->frame_offset) - 1);
 +    } else {
 +/*
 +        while (get_bits_count(gb) < s->num_saved_bits && get_bits1(gb) == 0) {
 +            dprintf(s->avctx, "skip1\n");
 +        }
 +*/
 +    }
 +
 +    /** decode trailer bit */
 +    more_frames = get_bits1(gb);
 +    ++s->frame_num;
 +    return more_frames;
 +}
 +
 +/**
 + *@brief Calculate remaining input buffer length.
 + *@param s codec context
 + *@param gb bitstream reader context
 + *@return remaining size in bits
 + */
 +static int remaining_bits(WmallDecodeCtx *s, GetBitContext *gb)
 +{
 +    return s->buf_bit_size - get_bits_count(gb);
 +}
 +
 +/**
 + *@brief Fill the bit reservoir with a (partial) frame.
 + *@param s codec context
 + *@param gb bitstream reader context
 + *@param len length of the partial frame
 + *@param append decides wether to reset the buffer or not
 + */
 +static void save_bits(WmallDecodeCtx *s, GetBitContext* gb, int len,
 +                      int append)
 +{
 +    int buflen;
 +
 +    /** when the frame data does not need to be concatenated, the input buffer
 +        is resetted and additional bits from the previous frame are copyed
 +        and skipped later so that a fast byte copy is possible */
 +
 +    if (!append) {
 +        s->frame_offset = get_bits_count(gb) & 7;
 +        s->num_saved_bits = s->frame_offset;
 +        init_put_bits(&s->pb, s->frame_data, MAX_FRAMESIZE);
 +    }
 +
 +    buflen = (s->num_saved_bits + len + 8) >> 3;
 +
 +    if (len <= 0 || buflen > MAX_FRAMESIZE) {
 +        av_log_ask_for_sample(s->avctx, "input buffer too small\n");
 +        s->packet_loss = 1;
 +        return;
 +    }
 +
 +    s->num_saved_bits += len;
 +    if (!append) {
 +        avpriv_copy_bits(&s->pb, gb->buffer + (get_bits_count(gb) >> 3),
 +                     s->num_saved_bits);
 +    } else {
 +        int align = 8 - (get_bits_count(gb) & 7);
 +        align = FFMIN(align, len);
 +        put_bits(&s->pb, align, get_bits(gb, align));
 +        len -= align;
 +        avpriv_copy_bits(&s->pb, gb->buffer + (get_bits_count(gb) >> 3), len);
 +    }
 +    skip_bits_long(gb, len);
 +
 +    {
 +        PutBitContext tmp = s->pb;
 +        flush_put_bits(&tmp);
 +    }
 +
 +    init_get_bits(&s->gb, s->frame_data, s->num_saved_bits);
 +    skip_bits(&s->gb, s->frame_offset);
 +}
 +
 +/**
 + *@brief Decode a single WMA packet.
 + *@param avctx codec context
 + *@param data the output buffer
 + *@param data_size number of bytes that were written to the output buffer
 + *@param avpkt input packet
 + *@return number of bytes that were read from the input buffer
 + */
 +static int decode_packet(AVCodecContext *avctx,
 +                         void *data, int *data_size, AVPacket* avpkt)
 +{
 +    WmallDecodeCtx *s = avctx->priv_data;
 +    GetBitContext* gb  = &s->pgb;
 +    const uint8_t* buf = avpkt->data;
 +    int buf_size       = avpkt->size;
 +    int num_bits_prev_frame;
 +    int packet_sequence_number;
 +
 +    s->samples       = data;
 +    s->samples_end   = (float*)((int8_t*)data + *data_size);
 +    *data_size = 0;
 +
 +    if (s->packet_done || s->packet_loss) {
++        int seekable_frame_in_packet, spliced_packet;
 +        s->packet_done = 0;
 +
 +        /** sanity check for the buffer length */
 +        if (buf_size < avctx->block_align)
 +            return 0;
 +
 +        s->next_packet_start = buf_size - avctx->block_align;
 +        buf_size = avctx->block_align;
 +        s->buf_bit_size = buf_size << 3;
 +
 +        /** parse packet header */
 +        init_get_bits(gb, buf, s->buf_bit_size);
 +        packet_sequence_number = get_bits(gb, 4);
++        seekable_frame_in_packet = get_bits1(gb);
++        spliced_packet = get_bits1(gb);
 +
 +        /** get number of bits that need to be added to the previous frame */
 +        num_bits_prev_frame = get_bits(gb, s->log2_frame_size);
 +
 +        /** check for packet loss */
 +        if (!s->packet_loss &&
 +            ((s->packet_sequence_number + 1) & 0xF) != packet_sequence_number) {
 +            s->packet_loss = 1;
 +            av_log(avctx, AV_LOG_ERROR, "Packet loss detected! seq %x vs %x\n",
 +                   s->packet_sequence_number, packet_sequence_number);
 +        }
 +        s->packet_sequence_number = packet_sequence_number;
 +
 +        if (num_bits_prev_frame > 0) {
 +            int remaining_packet_bits = s->buf_bit_size - get_bits_count(gb);
 +            if (num_bits_prev_frame >= remaining_packet_bits) {
 +                num_bits_prev_frame = remaining_packet_bits;
 +                s->packet_done = 1;
 +            }
 +
 +            /** append the previous frame data to the remaining data from the
 +                previous packet to create a full frame */
 +            save_bits(s, gb, num_bits_prev_frame, 1);
 +
 +            /** decode the cross packet frame if it is valid */
 +            if (!s->packet_loss)
 +                decode_frame(s);
 +        } else if (s->num_saved_bits - s->frame_offset) {
 +            dprintf(avctx, "ignoring %x previously saved bits\n",
 +                    s->num_saved_bits - s->frame_offset);
 +        }
 +
 +        if (s->packet_loss) {
 +            /** reset number of saved bits so that the decoder
 +                does not start to decode incomplete frames in the
 +                s->len_prefix == 0 case */
 +            s->num_saved_bits = 0;
 +            s->packet_loss = 0;
 +        }
 +
 +    } else {
 +        int frame_size;
 +
 +        s->buf_bit_size = (avpkt->size - s->next_packet_start) << 3;
 +        init_get_bits(gb, avpkt->data, s->buf_bit_size);
 +        skip_bits(gb, s->packet_offset);
 +
 +        if (s->len_prefix && remaining_bits(s, gb) > s->log2_frame_size &&
 +            (frame_size = show_bits(gb, s->log2_frame_size)) &&
 +            frame_size <= remaining_bits(s, gb)) {
 +            save_bits(s, gb, frame_size, 0);
 +            s->packet_done = !decode_frame(s);
 +        } else if (!s->len_prefix
 +                   && s->num_saved_bits > get_bits_count(&s->gb)) {
 +            /** when the frames do not have a length prefix, we don't know
 +                the compressed length of the individual frames
 +                however, we know what part of a new packet belongs to the
 +                previous frame
 +                therefore we save the incoming packet first, then we append
 +                the "previous frame" data from the next packet so that
 +                we get a buffer that only contains full frames */
 +            s->packet_done = !decode_frame(s);
 +        } else {
 +            s->packet_done = 1;
 +        }
 +    }
 +
 +    if (s->packet_done && !s->packet_loss &&
 +        remaining_bits(s, gb) > 0) {
 +        /** save the rest of the data so that it can be decoded
 +            with the next packet */
 +        save_bits(s, gb, remaining_bits(s, gb), 0);
 +    }
 +
 +    *data_size = 0; // (int8_t *)s->samples - (int8_t *)data;
 +    s->packet_offset = get_bits_count(gb) & 7;
 +
 +    return (s->packet_loss) ? AVERROR_INVALIDDATA : get_bits_count(gb) >> 3;
 +}
 +
 +/**
 + *@brief Clear decoder buffers (for seeking).
 + *@param avctx codec context
 + */
 +static void flush(AVCodecContext *avctx)
 +{
 +    WmallDecodeCtx *s = avctx->priv_data;
 +    int i;
 +    /** reset output buffer as a part of it is used during the windowing of a
 +        new frame */
 +    for (i = 0; i < s->num_channels; i++)
 +        memset(s->channel[i].out, 0, s->samples_per_frame *
 +               sizeof(*s->channel[i].out));
 +    s->packet_loss = 1;
 +}
 +
 +
 +/**
 + *@brief wmall decoder
 + */
 +AVCodec ff_wmalossless_decoder = {
 +    "wmalossless",
 +    AVMEDIA_TYPE_AUDIO,
 +    CODEC_ID_WMALOSSLESS,
 +    sizeof(WmallDecodeCtx),
 +    decode_init,
 +    NULL,
 +    decode_end,
 +    decode_packet,
 +    .capabilities = CODEC_CAP_SUBFRAMES | CODEC_CAP_EXPERIMENTAL,
 +    .flush= flush,
 +    .long_name = NULL_IF_CONFIG_SMALL("Windows Media Audio 9 Lossless"),
 +};
@@@ -2,20 -2,20 +2,20 @@@
   * H.26L/H.264/AVC/JVT/14496-10/... encoder/decoder
   * 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
   */
  
@@@ -36,7 -36,7 +36,7 @@@
  
  //FIXME use some macros to avoid duplicating get_cabac (cannot be done yet
  //as that would make optimization work hard)
- #if HAVE_6REGS && !defined(BROKEN_RELOCATIONS)
+ #if HAVE_EBX_AVAILABLE && !defined(BROKEN_RELOCATIONS)
  static int decode_significance_x86(CABACContext *c, int max_coeff,
                                     uint8_t *significant_coeff_ctx_base,
                                     int *index, x86_reg last_off){
@@@ -144,6 -144,6 +144,6 @@@ static int decode_significance_8x8_x86(
      );
      return coeff_count;
  }
- #endif /* HAVE_6REGS && !defined(BROKEN_RELOCATIONS) */
+ #endif /* HAVE_EBX_AVAILABLE && !defined(BROKEN_RELOCATIONS) */
  
  #endif /* AVCODEC_X86_H264_I386_H */
diff --combined libavformat/asfdec.c
@@@ -2,20 -2,20 +2,20 @@@
   * ASF 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
   */
  
@@@ -133,6 -133,12 +133,6 @@@ static void print_guid(const ff_asf_gui
  #define print_guid(g)
  #endif
  
 -void ff_get_guid(AVIOContext *s, ff_asf_guid *g)
 -{
 -    assert(sizeof(*g) == 16);
 -    avio_read(s, *g, sizeof(*g));
 -}
 -
  static int asf_probe(AVProbeData *pd)
  {
      /* check file header */
@@@ -166,9 -172,6 +166,9 @@@ static void get_tag(AVFormatContext *s
  
      if (type == 0) {         // UTF16-LE
          avio_get_str16le(s->pb, len, value, 2*len + 1);
 +    } else if (type == -1) { // ASCII
 +        avio_read(s->pb, value, len);
 +        value[len]=0;
      } else if (type > 1 && type <= 5) {  // boolean or DWORD or QWORD or WORD
          uint64_t num = get_value(s->pb, type);
          snprintf(value, len, "%"PRIu64, num);
@@@ -233,6 -236,7 +233,6 @@@ static int asf_read_stream_properties(A
      if (!asf_st)
          return AVERROR(ENOMEM);
      st->priv_data = asf_st;
 -    st->start_time = 0;
      start_time = asf->hdr.preroll;
  
      asf_st->stream_language_index = 128; // invalid stream index means no language info
          if (is_dvr_ms_audio) {
              // codec_id and codec_tag are unreliable in dvr_ms
              // files. Set them later by probing stream.
 -            st->codec->codec_id = CODEC_ID_PROBE;
 +            st->request_probe= 1;
              st->codec->codec_tag = 0;
          }
          if (st->codec->codec_id == CODEC_ID_AAC) {
@@@ -635,28 -639,16 +635,28 @@@ static int asf_read_header(AVFormatCont
              continue;
          } else if (!ff_guidcmp(&g, &ff_asf_marker_header)) {
              asf_read_marker(s, gsize);
 -        } else if (pb->eof_reached) {
 +        } else if (url_feof(pb)) {
              return -1;
          } else {
              if (!s->keylen) {
                  if (!ff_guidcmp(&g, &ff_asf_content_encryption)) {
 +                    unsigned int len;
 +                    AVPacket pkt;
                      av_log(s, AV_LOG_WARNING, "DRM protected stream detected, decoding will likely fail!\n");
 +                    len= avio_rl32(pb);
 +                    av_log(s, AV_LOG_DEBUG, "Secret data:\n");
 +                    av_get_packet(pb, &pkt, len); av_hex_dump_log(s, AV_LOG_DEBUG, pkt.data, pkt.size); av_free_packet(&pkt);
 +                    len= avio_rl32(pb);
 +                    get_tag(s, "ASF_Protection_Type", -1, len);
 +                    len= avio_rl32(pb);
 +                    get_tag(s, "ASF_Key_ID", -1, len);
 +                    len= avio_rl32(pb);
 +                    get_tag(s, "ASF_License_URL", -1, len);
                  } else if (!ff_guidcmp(&g, &ff_asf_ext_content_encryption)) {
                      av_log(s, AV_LOG_WARNING, "Ext DRM protected stream detected, decoding will likely fail!\n");
 +                    av_dict_set(&s->metadata, "encryption", "ASF Extended Content Encryption", 0);
                  } else if (!ff_guidcmp(&g, &ff_asf_digital_signature)) {
 -                    av_log(s, AV_LOG_WARNING, "Digital signature detected, decoding will likely fail!\n");
 +                    av_log(s, AV_LOG_INFO, "Digital signature detected!\n");
                  }
              }
          }
      avio_rl64(pb);
      avio_r8(pb);
      avio_r8(pb);
 -    if (pb->eof_reached)
 +    if (url_feof(pb))
          return -1;
      asf->data_offset = avio_tell(pb);
      asf->packet_size_left = 0;
@@@ -753,12 -745,12 +753,12 @@@ static int ff_asf_get_packet(AVFormatCo
           */
          if (pb->error == AVERROR(EAGAIN))
              return AVERROR(EAGAIN);
 -        if (!pb->eof_reached)
 +        if (!url_feof(pb))
              av_log(s, AV_LOG_ERROR, "ff asf bad header %x  at:%"PRId64"\n", c, avio_tell(pb));
      }
      if ((c & 0x8f) == 0x82) {
          if (d || e) {
 -            if (!pb->eof_reached)
 +            if (!url_feof(pb))
                  av_log(s, AV_LOG_ERROR, "ff asf bad non zero\n");
              return -1;
          }
@@@ -813,7 -805,7 +813,7 @@@ static int asf_read_frame_header(AVForm
      ASFContext *asf = s->priv_data;
      int rsize = 1;
      int num = avio_r8(pb);
 -    int64_t ts0;
 +    int64_t ts0, ts1 av_unused;
  
      asf->packet_segments--;
      asf->packet_key_frame = num >> 7;
      DO_2BITS(asf->packet_property >> 2, asf->packet_frag_offset, 0);
      DO_2BITS(asf->packet_property, asf->packet_replic_size, 0);
  //printf("key:%d stream:%d seq:%d offset:%d replic_size:%d\n", asf->packet_key_frame, asf->stream_index, asf->packet_seq, //asf->packet_frag_offset, asf->packet_replic_size);
 +    if (rsize+asf->packet_replic_size > asf->packet_size_left) {
 +        av_log(s, AV_LOG_ERROR, "packet_replic_size %d is invalid\n", asf->packet_replic_size);
 +        return -1;
 +    }
      if (asf->packet_replic_size >= 8) {
          asf->packet_obj_size = avio_rl32(pb);
          if(asf->packet_obj_size >= (1<<24) || asf->packet_obj_size <= 0){
  //            av_log(s, AV_LOG_DEBUG, "\n");
              avio_skip(pb, 10);
              ts0= avio_rl64(pb);
 -            avio_skip(pb, 8);;
 +            ts1= avio_rl64(pb);
              avio_skip(pb, 12);
              avio_rl32(pb);
              avio_skip(pb, asf->packet_replic_size - 8 - 38 - 4);
          }
          //printf("Fragsize %d\n", asf->packet_frag_size);
      } else {
 -        if (rsize > asf->packet_size_left) {
 -            av_log(s, AV_LOG_ERROR, "packet_replic_size is invalid\n");
 -            return -1;
 -        }
          asf->packet_frag_size = asf->packet_size_left - rsize;
          //printf("Using rest  %d %d %d\n", asf->packet_frag_size, asf->packet_size_left, rsize);
      }
@@@ -907,7 -899,7 +907,7 @@@ static int ff_asf_parse_packet(AVFormat
      ASFStream *asf_st = 0;
      for (;;) {
          int ret;
 -        if(pb->eof_reached)
 +        if(url_feof(pb))
              return AVERROR_EOF;
          if (asf->packet_size_left < FRAME_HEADER_SIZE
              || asf->packet_segments < 1) {
              asf_st->packet_pos= asf->packet_pos;
              if (asf_st->pkt.data && asf_st->palette_changed) {
                  uint8_t *pal;
-                 pal = av_packet_new_side_data(pkt, AV_PKT_DATA_PALETTE,
+                 pal = av_packet_new_side_data(&asf_st->pkt, AV_PKT_DATA_PALETTE,
                                                AVPALETTE_SIZE);
                  if (!pal) {
                      av_log(s, AV_LOG_ERROR, "Cannot append palette to packet\n");
@@@ -1171,13 -1163,12 +1171,13 @@@ static int64_t asf_read_pts(AVFormatCon
      if (s->packet_size > 0)
          pos= (pos+s->packet_size-1-s->data_offset)/s->packet_size*s->packet_size+ s->data_offset;
      *ppos= pos;
 -    avio_seek(s->pb, pos, SEEK_SET);
 +    if (avio_seek(s->pb, pos, SEEK_SET) < 0)
 +        return AV_NOPTS_VALUE;
  
  //printf("asf_read_pts\n");
      asf_reset_header(s);
      for(;;){
 -        if (asf_read_packet(s, pkt) < 0){
 +        if (av_read_frame(s, pkt) < 0){
              av_log(s, AV_LOG_INFO, "asf_read_pts failed\n");
              return AV_NOPTS_VALUE;
          }
@@@ -1214,20 -1205,15 +1214,20 @@@ static void asf_build_simple_index(AVFo
      int64_t current_pos= avio_tell(s->pb);
      int i;
  
 -    avio_seek(s->pb, asf->data_object_offset + asf->data_object_size, SEEK_SET);
 +    if(avio_seek(s->pb, asf->data_object_offset + asf->data_object_size, SEEK_SET) < 0) {
 +        asf->index_read= -1;
 +        return;
 +    }
 +
      ff_get_guid(s->pb, &g);
  
      /* the data object can be followed by other top-level objects,
         skip them until the simple index object is reached */
      while (ff_guidcmp(&g, &index_guid)) {
          int64_t gsize= avio_rl64(s->pb);
 -        if (gsize < 24 || s->pb->eof_reached) {
 +        if (gsize < 24 || url_feof(s->pb)) {
              avio_seek(s->pb, current_pos, SEEK_SET);
 +            asf->index_read= -1;
              return;
          }
          avio_skip(s->pb, gsize-24);
@@@ -1283,7 -1269,7 +1283,7 @@@ static int asf_read_seek(AVFormatContex
      if (!asf->index_read)
          asf_build_simple_index(s, stream_index);
  
 -    if((asf->index_read && st->index_entries)){
 +    if((asf->index_read > 0 && st->index_entries)){
          index= av_index_search_timestamp(st, pts, flags);
          if(index >= 0) {
              /* find the position */
  
              /* do the seek */
              av_log(s, AV_LOG_DEBUG, "SEEKTO: %"PRId64"\n", pos);
 -            avio_seek(s->pb, pos, SEEK_SET);
 +            if(avio_seek(s->pb, pos, SEEK_SET) < 0)
 +                return -1;
              asf_reset_header(s);
              return 0;
          }
diff --combined libavformat/flacdec.c
@@@ -2,20 -2,20 +2,20 @@@
   * Raw FLAC 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
   */
  
@@@ -48,7 -48,7 +48,7 @@@ static int flac_read_header(AVFormatCon
      }
  
      /* process metadata blocks */
 -    while (!s->pb->eof_reached && !metadata_last) {
 +    while (!url_feof(s->pb) && !metadata_last) {
          avio_read(s->pb, header, 4);
          avpriv_flac_parse_block_header(header, &metadata_last, &metadata_type,
                                     &metadata_size);
              uint8_t isrc[13];
              uint64_t start;
              const uint8_t *offset;
-             int i, j, chapters, track, ti;
+             int i, chapters, track, ti;
              if (metadata_size < 431)
                  return AVERROR_INVALIDDATA;
              offset = buffer + 395;
                  offset += 14;
                  ti = bytestream_get_byte(&offset);
                  if (ti <= 0) return AVERROR_INVALIDDATA;
-                 for (j = 0; j < ti; j++)
-                     offset += 12;
+                 offset += ti * 12;
                  avpriv_new_chapter(s, track, st->time_base, start, AV_NOPTS_VALUE, isrc);
              }
          } else {
diff --combined libavformat/flv.h
@@@ -1,22 -1,22 +1,22 @@@
  /*
   * FLV common header
   *
 - * Copyright (c) 2006 The Libav Project
 + * Copyright (c) 2006 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
   */
  
  
  #define AMF_END_OF_OBJECT         0x09
  
 +#define KEYFRAMES_TAG            "keyframes"
 +#define KEYFRAMES_TIMESTAMP_TAG  "times"
 +#define KEYFRAMES_BYTEOFFSET_TAG "filepositions"
 +
 +
  enum {
      FLV_HEADER_FLAG_HASVIDEO = 1,
      FLV_HEADER_FLAG_HASAUDIO = 4,
@@@ -62,12 -57,6 +62,13 @@@ enum 
      FLV_TAG_TYPE_META  = 0x12,
  };
  
 +enum {
 +    FLV_STREAM_TYPE_VIDEO,
 +    FLV_STREAM_TYPE_AUDIO,
 +    FLV_STREAM_TYPE_DATA,
++    FLV_STREAM_TYPE_NB,
 +};
 +
  enum {
      FLV_MONO   = 0,
      FLV_STEREO = 1,
@@@ -104,8 -93,6 +105,8 @@@ enum 
      FLV_CODECID_VP6A    = 5,
      FLV_CODECID_SCREEN2 = 6,
      FLV_CODECID_H264    = 7,
 +    FLV_CODECID_REALH263= 8,
 +    FLV_CODECID_MPEG4   = 9,
  };
  
  enum {
diff --combined libavformat/flvdec.c
@@@ -1,26 -1,26 +1,26 @@@
  /*
   * FLV demuxer
 - * Copyright (c) 2003 The Libav Project
 + * Copyright (c) 2003 The FFmpeg Project
   *
   * This demuxer will generate a 1 byte extradata for VP6F content.
   * It is composed of:
   *  - upper 4bits: difference between encoded width and visible width
   *  - lower 4bits: difference between encoded height and visible height
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
  #include "avio_internal.h"
  #include "flv.h"
  
 -#define KEYFRAMES_TAG            "keyframes"
 -#define KEYFRAMES_TIMESTAMP_TAG  "times"
 -#define KEYFRAMES_BYTEOFFSET_TAG "filepositions"
 -
  typedef struct {
      int wrong_dts; ///< wrong dts due to negative cts
 -    uint8_t *new_extradata[2];
 -    int      new_extradata_size[2];
++    uint8_t *new_extradata[FLV_STREAM_TYPE_NB];
++    int      new_extradata_size[FLV_STREAM_TYPE_NB];
+     int      last_sample_rate;
+     int      last_channels;
  } FLVContext;
  
  static int flv_probe(AVProbeData *p)
@@@ -50,8 -58,7 +54,7 @@@
      return 0;
  }
  
- static void flv_set_audio_codec(AVFormatContext *s, AVStream *astream, int flv_codecid) {
-     AVCodecContext *acodec = astream->codec;
+ static void flv_set_audio_codec(AVFormatContext *s, AVStream *astream, AVCodecContext *acodec, int flv_codecid) {
      switch(flv_codecid) {
          //no distinction between S16 and S8 PCM codec flags
          case FLV_CODECID_PCM:
@@@ -92,7 -99,6 +95,7 @@@ static int flv_set_video_codec(AVFormat
      AVCodecContext *vcodec = vstream->codec;
      switch(flv_codecid) {
          case FLV_CODECID_H263  : vcodec->codec_id = CODEC_ID_FLV1   ; break;
 +        case FLV_CODECID_REALH263: vcodec->codec_id = CODEC_ID_H263 ; break; // Really mean it this time
          case FLV_CODECID_SCREEN: vcodec->codec_id = CODEC_ID_FLASHSV; break;
          case FLV_CODECID_SCREEN2: vcodec->codec_id = CODEC_ID_FLASHSV2; break;
          case FLV_CODECID_VP6   : vcodec->codec_id = CODEC_ID_VP6F   ;
          case FLV_CODECID_H264:
              vcodec->codec_id = CODEC_ID_H264;
              return 3; // not 4, reading packet type will consume one byte
 +        case FLV_CODECID_MPEG4:
 +            vcodec->codec_id = CODEC_ID_MPEG4;
 +            return 3;
          default:
              av_log(s, AV_LOG_INFO, "Unsupported video codec (%x)\n", flv_codecid);
              vcodec->codec_tag = flv_codecid;
@@@ -134,7 -137,8 +137,7 @@@ static int amf_get_string(AVIOContext *
  }
  
  static int parse_keyframes_index(AVFormatContext *s, AVIOContext *ioc, AVStream *vstream, int64_t max_pos) {
 -    unsigned int arraylen = 0, timeslen = 0, fileposlen = 0, i;
 -    double num_val;
 +    unsigned int timeslen = 0, fileposlen = 0, i;
      char str_val[256];
      int64_t *times = NULL;
      int64_t *filepositions = NULL;
          return 0;
      }
  
 +    if(vstream->nb_index_entries>0){
 +        av_log(s, AV_LOG_WARNING, "Skiping duplicate index\n");
 +        return 0;
 +    }
 +
      while (avio_tell(ioc) < max_pos - 2 && amf_get_string(ioc, str_val, sizeof(str_val)) > 0) {
 -        int64_t* current_array;
 +        int64_t** current_array;
 +        unsigned int arraylen;
  
          // Expect array object in context
          if (avio_r8(ioc) != AMF_DATA_TYPE_ARRAY)
              break;
  
          arraylen = avio_rb32(ioc);
 -        if (arraylen >> 28)
 +        if(arraylen>>28)
              break;
  
 -        /*
 -         * Expect only 'times' or 'filepositions' sub-arrays in other case refuse to use such metadata
 -         * for indexing
 -         */
 -        if (!strcmp(KEYFRAMES_TIMESTAMP_TAG, str_val) && !times) {
 -            if (!(times = av_mallocz(sizeof(*times) * arraylen))) {
 -                ret = AVERROR(ENOMEM);
 -                goto finish;
 -            }
 -            timeslen = arraylen;
 -            current_array = times;
 -        } else if (!strcmp(KEYFRAMES_BYTEOFFSET_TAG, str_val) && !filepositions) {
 -            if (!(filepositions = av_mallocz(sizeof(*filepositions) * arraylen))) {
 -                ret = AVERROR(ENOMEM);
 -                goto finish;
 -            }
 -            fileposlen = arraylen;
 -            current_array = filepositions;
 -        } else // unexpected metatag inside keyframes, will not use such metadata for indexing
 +        if       (!strcmp(KEYFRAMES_TIMESTAMP_TAG , str_val) && !times){
 +            current_array= &times;
 +            timeslen= arraylen;
 +        }else if (!strcmp(KEYFRAMES_BYTEOFFSET_TAG, str_val) && !filepositions){
 +            current_array= &filepositions;
 +            fileposlen= arraylen;
 +        }else // unexpected metatag inside keyframes, will not use such metadata for indexing
              break;
  
 +        if (!(*current_array = av_mallocz(sizeof(**current_array) * arraylen))) {
 +            ret = AVERROR(ENOMEM);
 +            goto finish;
 +        }
 +
          for (i = 0; i < arraylen && avio_tell(ioc) < max_pos - 1; i++) {
              if (avio_r8(ioc) != AMF_DATA_TYPE_NUMBER)
                  goto finish;
 -            num_val = av_int2double(avio_rb64(ioc));
 -            current_array[i] = num_val;
 +            current_array[0][i] = av_int2double(avio_rb64(ioc));
          }
          if (times && filepositions) {
              // All done, exiting at a position allowing amf_parse_object
          }
      }
  
 -    if (!ret && timeslen == fileposlen)
 -         for (i = 0; i < fileposlen; i++)
 +    if (timeslen == fileposlen && fileposlen && max_pos <= filepositions[0]) {
 +         for(i = 0; i < timeslen; i++)
               av_add_index_entry(vstream, filepositions[i], times[i]*1000, 0, 0, AVINDEX_KEYFRAME);
 -    else
 +    else
          av_log(s, AV_LOG_WARNING, "Invalid keyframes object, skipping.\n");
  
  finish:
      av_freep(&times);
      av_freep(&filepositions);
 -    // If we got unexpected data, but successfully reset back to
 -    // the start pos, the caller can continue parsing
 -    if (ret < 0 && avio_seek(ioc, initial_pos, SEEK_SET) > 0)
 -        return 0;
 +    avio_seek(ioc, initial_pos, SEEK_SET);
      return ret;
  }
  
@@@ -234,10 -243,10 +237,10 @@@ static int amf_parse_object(AVFormatCon
          case AMF_DATA_TYPE_OBJECT: {
              unsigned int keylen;
  
 -            if ((vstream || astream) && key && !strcmp(KEYFRAMES_TAG, key) && depth == 1)
 +            if ((vstream || astream) && ioc->seekable && key && !strcmp(KEYFRAMES_TAG, key) && depth == 1)
                  if (parse_keyframes_index(s, ioc, vstream ? vstream : astream,
                                            max_pos) < 0)
 -                    return -1;
 +                    av_log(s, AV_LOG_ERROR, "Keyframe index parsing failed\n");
  
              while(avio_tell(ioc) < max_pos - 2 && (keylen = avio_rb16(ioc))) {
                  avio_skip(ioc, keylen); //skip key string
                  acodec->bit_rate = num_val * 1024.0;
          }
  
 +        if (amf_type == AMF_DATA_TYPE_OBJECT && s->nb_streams == 1 &&
 +           ((!acodec && !strcmp(key, "audiocodecid")) ||
 +            (!vcodec && !strcmp(key, "videocodecid"))))
 +                s->ctx_flags &= ~AVFMTCTX_NOHEADER; //If there is either audio/video missing, codecid will be an empty object
 +
          if (!strcmp(key, "duration")        ||
              !strcmp(key, "filesize")        ||
              !strcmp(key, "width")           ||
  
  static int flv_read_metabody(AVFormatContext *s, int64_t next_pos) {
      AMFDataType type;
 -    AVStream *stream, *astream, *vstream;
 +    AVStream *stream, *astream, *vstream, *dstream;
      AVIOContext *ioc;
      int i;
      char buffer[11]; //only needs to hold the string "onMetaData". Anything longer is something we don't want.
  
 -    astream = NULL;
 -    vstream = NULL;
 +    vstream = astream = dstream = NULL;
      ioc = s->pb;
  
      //first object needs to be "onMetaData" string
      //find the streams now so that amf_parse_object doesn't need to do the lookup every time it is called.
      for(i = 0; i < s->nb_streams; i++) {
          stream = s->streams[i];
 -        if     (stream->codec->codec_type == AVMEDIA_TYPE_AUDIO) astream = stream;
 -        else if(stream->codec->codec_type == AVMEDIA_TYPE_VIDEO) vstream = stream;
 +        if(stream->codec->codec_type == AVMEDIA_TYPE_VIDEO) vstream = stream;
 +        else if(stream->codec->codec_type == AVMEDIA_TYPE_AUDIO) astream = stream;
 +        else if(stream->codec->codec_type == AVMEDIA_TYPE_DATA) dstream = stream;
      }
  
      //parse the second object (we want a mixed array)
      return 0;
  }
  
 -static AVStream *create_stream(AVFormatContext *s, int is_audio){
 +static AVStream *create_stream(AVFormatContext *s, int stream_type){
      AVStream *st = avformat_new_stream(s, NULL);
      if (!st)
          return NULL;
 -    st->id = is_audio;
 -    st->codec->codec_type = is_audio ? AVMEDIA_TYPE_AUDIO : AVMEDIA_TYPE_VIDEO;
 +    st->id = stream_type;
 +    switch(stream_type) {
 +        case FLV_STREAM_TYPE_VIDEO:    st->codec->codec_type = AVMEDIA_TYPE_VIDEO;    break;
 +        case FLV_STREAM_TYPE_AUDIO:    st->codec->codec_type = AVMEDIA_TYPE_AUDIO;    break;
 +        case FLV_STREAM_TYPE_DATA:
 +            st->codec->codec_type = AVMEDIA_TYPE_DATA;
 +            st->codec->codec_id = CODEC_ID_NONE; // Going to rely on copy for now
 +            av_log(s, AV_LOG_DEBUG, "Data stream created\n");
 +    }
 +    if(s->nb_streams>=3 ||(   s->nb_streams==2
 +                           && s->streams[0]->codec->codec_type != AVMEDIA_TYPE_DATA
 +                           && s->streams[1]->codec->codec_type != AVMEDIA_TYPE_DATA))
 +        s->ctx_flags &= ~AVFMTCTX_NOHEADER;
 +
      avpriv_set_pts_info(st, 32, 1, 1000); /* 32 bit pts in ms */
      return st;
  }
@@@ -389,18 -381,19 +392,18 @@@ static int flv_read_header(AVFormatCont
          flags = FLV_HEADER_FLAG_HASVIDEO | FLV_HEADER_FLAG_HASAUDIO;
          av_log(s, AV_LOG_WARNING, "Broken FLV file, which says no streams present, this might fail\n");
      }
 -
 -    if((flags & (FLV_HEADER_FLAG_HASVIDEO|FLV_HEADER_FLAG_HASAUDIO))
 -             != (FLV_HEADER_FLAG_HASVIDEO|FLV_HEADER_FLAG_HASAUDIO))
          s->ctx_flags |= AVFMTCTX_NOHEADER;
  
      if(flags & FLV_HEADER_FLAG_HASVIDEO){
 -        if(!create_stream(s, 0))
 +        if(!create_stream(s, FLV_STREAM_TYPE_VIDEO))
              return AVERROR(ENOMEM);
      }
      if(flags & FLV_HEADER_FLAG_HASAUDIO){
 -        if(!create_stream(s, 1))
 +        if(!create_stream(s, FLV_STREAM_TYPE_AUDIO))
              return AVERROR(ENOMEM);
      }
 +    // Flag doesn't indicate whether or not there is script-data present. Must
 +    // create that stream if it's encountered.
  
      offset = avio_rb32(s->pb);
      avio_seek(s->pb, offset, SEEK_SET);
      return 0;
  }
  
 -    av_freep(&flv->new_extradata[0]);
 -    av_freep(&flv->new_extradata[1]);
+ static int flv_read_close(AVFormatContext *s)
+ {
++    int i;
+     FLVContext *flv = s->priv_data;
++    for(i=0; i<FLV_STREAM_TYPE_NB; i++)
++        av_freep(&flv->new_extradata[i]);
+     return 0;
+ }
  static int flv_get_extradata(AVFormatContext *s, AVStream *st, int size)
  {
      av_free(st->codec->extradata);
      return 0;
  }
  
+ static int flv_queue_extradata(FLVContext *flv, AVIOContext *pb, int stream,
+                                int size)
+ {
+     av_free(flv->new_extradata[stream]);
+     flv->new_extradata[stream] = av_mallocz(size + FF_INPUT_BUFFER_PADDING_SIZE);
+     if (!flv->new_extradata[stream])
+         return AVERROR(ENOMEM);
+     flv->new_extradata_size[stream] = size;
+     avio_read(pb, flv->new_extradata[stream], size);
+     return 0;
+ }
  static int flv_read_packet(AVFormatContext *s, AVPacket *pkt)
  {
      FLVContext *flv = s->priv_data;
 -    int ret, i, type, size, flags, is_audio;
 +    int ret, i, type, size, flags;
 +    int stream_type=-1;
      int64_t next, pos;
      int64_t dts, pts = AV_NOPTS_VALUE;
+     int sample_rate, channels;
      AVStream *st = NULL;
  
   for(;;avio_skip(s->pb, 4)){ /* pkt size is repeated at end. skip it */
      dts = avio_rb24(s->pb);
      dts |= avio_r8(s->pb) << 24;
      av_dlog(s, "type:%d, size:%d, dts:%"PRId64"\n", type, size, dts);
 -    if (s->pb->eof_reached)
 +    if (url_feof(s->pb))
          return AVERROR_EOF;
      avio_skip(s->pb, 3); /* stream id, always 0 */
      flags = 0;
      next= size + avio_tell(s->pb);
  
      if (type == FLV_TAG_TYPE_AUDIO) {
 -        is_audio=1;
 +        stream_type=FLV_STREAM_TYPE_AUDIO;
          flags = avio_r8(s->pb);
          size--;
      } else if (type == FLV_TAG_TYPE_VIDEO) {
 -        is_audio=0;
 +        stream_type=FLV_STREAM_TYPE_VIDEO;
          flags = avio_r8(s->pb);
          size--;
          if ((flags & 0xf0) == 0x50) /* video info / command frame */
              goto skip;
 -    } else {
 -        if (type == FLV_TAG_TYPE_META && size > 13+1+4)
 +    } else if (type == FLV_TAG_TYPE_META) {
 +        if (size > 13+1+4 && dts == 0) { // Header-type metadata stuff
              flv_read_metabody(s, next);
 -        else /* skip packet */
 -            av_log(s, AV_LOG_DEBUG, "skipping flv packet: type %d, size %d, flags %d\n", type, size, flags);
 +            goto skip;
 +        } else if (dts != 0) { // Script-data "special" metadata frames - don't skip
 +            stream_type=FLV_STREAM_TYPE_DATA;
 +        } else {
 +            goto skip;
 +        }
 +    } else {
 +        av_log(s, AV_LOG_DEBUG, "skipping flv packet: type %d, size %d, flags %d\n", type, size, flags);
      skip:
          avio_seek(s->pb, next, SEEK_SET);
          continue;
      /* now find stream */
      for(i=0;i<s->nb_streams;i++) {
          st = s->streams[i];
 -        if (st->id == is_audio)
 +        if (st->id == stream_type)
              break;
      }
      if(i == s->nb_streams){
 -        av_log(s, AV_LOG_ERROR, "invalid stream\n");
 -        st= create_stream(s, is_audio);
 -        s->ctx_flags &= ~AVFMTCTX_NOHEADER;
 +        av_log(s, AV_LOG_WARNING, "Stream discovered after head already parsed\n");
 +        st= create_stream(s, stream_type);
      }
 -    av_dlog(s, "%d %X %d \n", is_audio, flags, st->discard);
 -    if(  (st->discard >= AVDISCARD_NONKEY && !((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY ||         is_audio))
 -       ||(st->discard >= AVDISCARD_BIDIR  &&  ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_DISP_INTER && !is_audio))
 +    av_dlog(s, "%d %X %d \n", stream_type, flags, st->discard);
 +    if(  (st->discard >= AVDISCARD_NONKEY && !((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY || (stream_type == FLV_STREAM_TYPE_AUDIO)))
 +       ||(st->discard >= AVDISCARD_BIDIR  &&  ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_DISP_INTER && (stream_type == FLV_STREAM_TYPE_VIDEO)))
         || st->discard >= AVDISCARD_ALL
         ){
          avio_seek(s->pb, next, SEEK_SET);
          avio_seek(s->pb, pos, SEEK_SET);
      }
  
 -    if(is_audio){
 +    if(stream_type == FLV_STREAM_TYPE_AUDIO){
+         int bits_per_coded_sample;
+         channels    = (flags & FLV_AUDIO_CHANNEL_MASK) == FLV_STEREO ? 2 : 1;
+         sample_rate = (44100 << ((flags & FLV_AUDIO_SAMPLERATE_MASK) >> FLV_AUDIO_SAMPLERATE_OFFSET) >> 3);
+         bits_per_coded_sample = (flags & FLV_AUDIO_SAMPLESIZE_MASK) ? 16 : 8;
          if(!st->codec->channels || !st->codec->sample_rate || !st->codec->bits_per_coded_sample) {
-             st->codec->channels = (flags & FLV_AUDIO_CHANNEL_MASK) == FLV_STEREO ? 2 : 1;
-             st->codec->sample_rate = (44100 << ((flags & FLV_AUDIO_SAMPLERATE_MASK) >> FLV_AUDIO_SAMPLERATE_OFFSET) >> 3);
-             st->codec->bits_per_coded_sample = (flags & FLV_AUDIO_SAMPLESIZE_MASK) ? 16 : 8;
+             st->codec->channels              = channels;
+             st->codec->sample_rate           = sample_rate;
+             st->codec->bits_per_coded_sample = bits_per_coded_sample;
          }
          if(!st->codec->codec_id){
-             flv_set_audio_codec(s, st, flags & FLV_AUDIO_CODECID_MASK);
+             flv_set_audio_codec(s, st, st->codec, flags & FLV_AUDIO_CODECID_MASK);
+             flv->last_sample_rate = st->codec->sample_rate;
+             flv->last_channels    = st->codec->channels;
+         } else {
+             AVCodecContext ctx;
+             ctx.sample_rate = sample_rate;
+             flv_set_audio_codec(s, st, &ctx, flags & FLV_AUDIO_CODECID_MASK);
+             sample_rate = ctx.sample_rate;
          }
 -    }else{
 +    } else if(stream_type == FLV_STREAM_TYPE_VIDEO) {
          size -= flv_set_video_codec(s, st, flags & FLV_VIDEO_CODECID_MASK);
      }
  
      if (st->codec->codec_id == CODEC_ID_AAC ||
 -        st->codec->codec_id == CODEC_ID_H264) {
 +        st->codec->codec_id == CODEC_ID_H264 ||
 +        st->codec->codec_id == CODEC_ID_MPEG4) {
          int type = avio_r8(s->pb);
          size--;
 -        if (st->codec->codec_id == CODEC_ID_H264) {
 +        if (st->codec->codec_id == CODEC_ID_H264 || st->codec->codec_id == CODEC_ID_MPEG4) {
              int32_t cts = (avio_rb24(s->pb)+0xff800000)^0xff800000; // sign extension
              pts = dts + cts;
              if (cts < 0) { // dts are wrong
              if (flv->wrong_dts)
                  dts = AV_NOPTS_VALUE;
          }
-         if (type == 0 && !st->codec->extradata) {
 -        if (type == 0) {
++        if (type == 0 && (!st->codec->extradata || st->codec->codec_id != CODEC_ID_H264)) {
+             if (st->codec->extradata) {
 -                if ((ret = flv_queue_extradata(flv, s->pb, is_audio, size)) < 0)
++                if ((ret = flv_queue_extradata(flv, s->pb, stream_type, size)) < 0)
+                     return ret;
+                 ret = AVERROR(EAGAIN);
+                 goto leave;
+             }
              if ((ret = flv_get_extradata(s, st, size)) < 0)
                  return ret;
              if (st->codec->codec_id == CODEC_ID_AAC) {
      pkt->dts = dts;
      pkt->pts = pts == AV_NOPTS_VALUE ? dts : pts;
      pkt->stream_index = st->index;
-     if(st->codec->codec_id == CODEC_ID_NELLYMOSER)
-         av_packet_new_side_data(pkt, 'F', 1)[0]= flags;
 -    if (flv->new_extradata[is_audio]) {
++    if (flv->new_extradata[stream_type]) {
+         uint8_t *side = av_packet_new_side_data(pkt, AV_PKT_DATA_NEW_EXTRADATA,
 -                                                flv->new_extradata_size[is_audio]);
++                                                flv->new_extradata_size[stream_type]);
+         if (side) {
 -            memcpy(side, flv->new_extradata[is_audio],
 -                   flv->new_extradata_size[is_audio]);
 -            av_freep(&flv->new_extradata[is_audio]);
 -            flv->new_extradata_size[is_audio] = 0;
++            memcpy(side, flv->new_extradata[stream_type],
++                   flv->new_extradata_size[stream_type]);
++            av_freep(&flv->new_extradata[stream_type]);
++            flv->new_extradata_size[stream_type] = 0;
+         }
+     }
 -    if (is_audio && (sample_rate != flv->last_sample_rate ||
++    if (stream_type == FLV_STREAM_TYPE_AUDIO && (sample_rate != flv->last_sample_rate ||
+                      channels != flv->last_channels)) {
+         flv->last_sample_rate = sample_rate;
+         flv->last_channels    = channels;
+         ff_add_param_change(pkt, channels, 0, sample_rate, 0, 0);
+     }
  
 -    if (is_audio || ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY))
 +    if (    stream_type == FLV_STREAM_TYPE_AUDIO ||
 +            ((flags & FLV_VIDEO_FRAMETYPE_MASK) == FLV_FRAME_KEY) ||
 +            stream_type == FLV_STREAM_TYPE_DATA)
          pkt->flags |= AV_PKT_FLAG_KEY;
  
  leave:
@@@ -640,6 -675,7 +695,7 @@@ AVInputFormat ff_flv_demuxer = 
  #if 0
      .read_seek2 = flv_read_seek2,
  #endif
+     .read_close = flv_read_close,
      .extensions = "flv",
      .value = CODEC_ID_FLV1,
  };
diff --combined libavformat/idroqdec.c
@@@ -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
@@@ -45,6 -44,7 +45,7 @@@
  
  typedef struct RoqDemuxContext {
  
+     int frame_rate;
      int width;
      int height;
      int audio_channels;
@@@ -71,29 -71,21 +72,21 @@@ static int roq_read_header(AVFormatCont
  {
      RoqDemuxContext *roq = s->priv_data;
      AVIOContext *pb = s->pb;
-     int framerate;
-     AVStream *st;
      unsigned char preamble[RoQ_CHUNK_PREAMBLE_SIZE];
  
      /* get the main header */
      if (avio_read(pb, preamble, RoQ_CHUNK_PREAMBLE_SIZE) !=
          RoQ_CHUNK_PREAMBLE_SIZE)
          return AVERROR(EIO);
-     framerate = AV_RL16(&preamble[6]);
+     roq->frame_rate = AV_RL16(&preamble[6]);
  
      /* init private context parameters */
      roq->width = roq->height = roq->audio_channels = roq->video_pts =
      roq->audio_frame_count = 0;
      roq->audio_stream_index = -1;
+     roq->video_stream_index = -1;
  
-     st = avformat_new_stream(s, NULL);
-     if (!st)
-         return AVERROR(ENOMEM);
-     avpriv_set_pts_info(st, 63, 1, framerate);
-     roq->video_stream_index = st->index;
-     st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
-     st->codec->codec_id = CODEC_ID_ROQ;
-     st->codec->codec_tag = 0;  /* no fourcc */
+     s->ctx_flags |= AVFMTCTX_NOHEADER;
  
      return 0;
  }
@@@ -113,7 -105,7 +106,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:
-             if (!roq->width || !roq->height) {
-                 AVStream *st = s->streams[roq->video_stream_index];
+             if (roq->video_stream_index == -1) {
+                 AVStream *st = avformat_new_stream(s, NULL);
+                 if (!st)
+                     return AVERROR(ENOMEM);
+                 avpriv_set_pts_info(st, 63, 1, roq->frame_rate);
+                 roq->video_stream_index = st->index;
+                 st->codec->codec_type   = AVMEDIA_TYPE_VIDEO;
+                 st->codec->codec_id     = CODEC_ID_ROQ;
+                 st->codec->codec_tag    = 0;  /* no fourcc */
                  if (avio_read(pb, preamble, RoQ_CHUNK_PREAMBLE_SIZE) != RoQ_CHUNK_PREAMBLE_SIZE)
                      return AVERROR(EIO);
                  st->codec->width  = roq->width  = AV_RL16(preamble);
diff --combined