Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Thu, 5 Apr 2012 20:26:50 +0000 (22:26 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Thu, 5 Apr 2012 20:26:50 +0000 (22:26 +0200)
* qatar/master:
  h264: Factorize declaration of mb_sizes array.
  vsrc_buffer: when no frame is available, return an error instead of segfaulting.
  configure: add dl to frei0r extralibs.
  dsputil x86: use SSE float instruction instead of SSE2 integer equivalent
  dsputil x86: remove deprecated parameter from scalarproduct_int16 prototype
  vp8dsp x86: perform rounding shift with a single instruction
  fate: add BMP tests.
  swscale: handle complete dimensions for monoblack/white.
  aacenc: Mark deinterleave_input_samples argument as const.
  vf_unsharp: Mark readonly variable as const.
  h264: fix 4:2:2 PCM-macroblocks decoding

Conflicts:
configure
libavcodec/h264.h
libavcodec/x86/dsputil_mmx.c
libavfilter/vf_unsharp.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
12 files changed:
1  2 
configure
libavcodec/aacenc.c
libavcodec/h264.c
libavcodec/h264.h
libavcodec/h264_cabac.c
libavcodec/h264_cavlc.c
libavcodec/x86/dsputil_mmx.c
libavcodec/x86/vp8dsp.asm
libavfilter/vf_unsharp.c
libswscale/input.c
libswscale/output.c
tests/Makefile

diff --combined configure
+++ b/configure
@@@ -1,6 -1,6 +1,6 @@@
  #!/bin/sh
  #
 -# Libav configure script
 +# FFmpeg configure script
  #
  # Copyright (c) 2000-2002 Fabrice Bellard
  # Copyright (c) 2005-2008 Diego Biurrun
@@@ -44,9 -44,9 +44,9 @@@ if test "$E1" != 0 || test "$E2" = 0; t
      echo "No compatible shell script interpreter found."
      echo "This configure script requires a POSIX-compatible shell"
      echo "such as bash or ksh."
 -    echo "THIS IS NOT A BUG IN LIBAV, DO NOT REPORT IT AS SUCH."
 +    echo "THIS IS NOT A BUG IN FFMPEG, DO NOT REPORT IT AS SUCH."
      echo "Instead, install a working POSIX-compatible shell."
 -    echo "Disabling this configure test will create a broken Libav."
 +    echo "Disabling this configure test will create a broken FFmpeg."
      if test "$BASH_VERSION" = '2.04.0(1)-release'; then
          echo "This bash version ($BASH_VERSION) is broken on your platform."
          echo "Upgrade to a later version if available."
@@@ -78,7 -78,7 +78,7 @@@ Standard options
    --disable-logging        do not log configure debug information
    --prefix=PREFIX          install in PREFIX [$prefix]
    --bindir=DIR             install binaries in DIR [PREFIX/bin]
 -  --datadir=DIR            install data files in DIR [PREFIX/share/avconv]
 +  --datadir=DIR            install data files in DIR [PREFIX/share/ffmpeg]
    --libdir=DIR             install libs in DIR [PREFIX/lib]
    --shlibdir=DIR           install shared libs in DIR [PREFIX/lib]
    --incdir=DIR             install includes in DIR [PREFIX/include]
@@@ -101,20 -101,17 +101,20 @@@ Configuration options
  
  Component options:
    --disable-doc            do not build documentation
 -  --disable-avconv         disable avconv build
 -  --disable-avplay         disable avplay build
 -  --disable-avprobe        disable avprobe build
 -  --disable-avserver       disable avserver build
 +  --disable-ffmpeg         disable ffmpeg build
 +  --disable-ffplay         disable ffplay build
 +  --disable-ffprobe        disable ffprobe build
 +  --disable-ffserver       disable ffserver build
    --disable-avdevice       disable libavdevice build
    --disable-avcodec        disable libavcodec build
    --disable-avformat       disable libavformat build
 +  --disable-swresample     disable libswresample build
    --disable-swscale        disable libswscale build
 +  --disable-postproc       disable libpostproc build
    --disable-avfilter       disable video filter support [no]
    --disable-pthreads       disable pthreads [auto]
    --disable-w32threads     disable Win32 threads [auto]
 +  --disable-os2threads     disable OS/2 threads [auto]
    --enable-x11grab         enable X11 grabbing [no]
    --disable-network        disable network support [no]
    --disable-dct            disable DCT code
    --disable-rdft           disable RDFT code
    --disable-fft            disable FFT code
    --enable-dxva2           enable DXVA2 code
 -  --enable-vaapi           enable VAAPI code
 -  --enable-vda             enable VDA code
 -  --enable-vdpau           enable VDPAU code
 +  --enable-vaapi           enable VAAPI code [autodetect]
 +  --enable-vda             enable VDA code   [autodetect]
 +  --enable-vdpau           enable VDPAU code [autodetect]
  
  Individual component options:
    --disable-everything     disable all components listed below
@@@ -168,10 -165,6 +168,10 @@@ 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-libbluray       enable BluRay reading using libbluray [no]
 +  --enable-libcelt         enable CELT decoding via libcelt [no]
    --enable-libopencore-amrnb enable AMR-NB de/encoding via libopencore-amrnb [no]
    --enable-libopencore-amrwb enable AMR-WB decoding via libopencore-amrwb [no]
    --enable-libopencv       enable video filtering via libopencv [no]
    --enable-libfaac         enable FAAC support via libfaac [no]
    --enable-libfreetype     enable libfreetype [no]
    --enable-libgsm          enable GSM support via libgsm [no]
 +  --enable-libmodplug      enable ModPlug via libmodplug [no]
    --enable-libmp3lame      enable MP3 encoding via libmp3lame [no]
    --enable-libnut          enable NUT (de)muxing via libnut,
                             native (de)muxer exists [no]
 -  --enable-libopenjpeg     enable JPEG 2000 decoding via OpenJPEG [no]
 +  --enable-libopenjpeg     enable JPEG 2000 encoding/decoding via OpenJPEG [no]
    --enable-libpulse        enable Pulseaudio input via libpulse [no]
    --enable-librtmp         enable RTMP[E] support via librtmp [no]
    --enable-libschroedinger enable Dirac support via libschroedinger [no]
    --enable-libspeex        enable Speex support via libspeex [no]
 +  --enable-libstagefright-h264  enable H.264 decoding via libstagefright [no]
    --enable-libtheora       enable Theora encoding via libtheora [no]
 +  --enable-libutvideo      enable Ut Video encoding and decoding via libutvideo [no]
 +  --enable-libv4l2         enable libv4l2/v4l-utils [no]
    --enable-libvo-aacenc    enable AAC encoding via libvo-aacenc [no]
    --enable-libvo-amrwbenc  enable AMR-WB encoding via libvo-amrwbenc [no]
    --enable-libvorbis       enable Vorbis encoding via libvorbis,
    --enable-libxavs         enable AVS encoding via xavs [no]
    --enable-libxvid         enable Xvid encoding via xvidcore,
                             native MPEG-4/Xvid encoder exists [no]
 +  --enable-openal          enable OpenAL 1.1 capture support [no]
    --enable-openssl         enable openssl [no]
    --enable-zlib            enable zlib [autodetect]
  
@@@ -216,26 -204,22 +216,26 @@@ Advanced options (experts only)
    --target-os=OS           compiler targets OS [$target_os]
    --target-exec=CMD        command to run executables on target
    --target-path=DIR        path to view of build directory on target
 -  --nm=NM                  use nm tool
 +  --nm=NM                  use nm tool NM [$nm_default]
    --ar=AR                  use archive tool AR [$ar_default]
    --as=AS                  use assembler AS [$as_default]
 +  --yasmexe=EXE            use yasm-compatible assembler EXE [$yasmexe_default]
    --cc=CC                  use C compiler CC [$cc_default]
 -  --ld=LD                  use linker LD
 +  --cxx=CXX                use C compiler CXX [$cxx_default]
 +  --ld=LD                  use linker LD [$ld_default]
    --host-cc=HOSTCC         use host C compiler HOSTCC
    --host-cflags=HCFLAGS    use HCFLAGS when compiling for host
    --host-ldflags=HLDFLAGS  use HLDFLAGS when linking for host
    --host-libs=HLIBS        use libs HLIBS when linking for host
    --extra-cflags=ECFLAGS   add ECFLAGS to CFLAGS [$CFLAGS]
 +  --extra-cxxflags=ECFLAGS add ECFLAGS to CXXFLAGS [$CXXFLAGS]
    --extra-ldflags=ELDFLAGS add ELDFLAGS to LDFLAGS [$LDFLAGS]
    --extra-libs=ELIBS       add ELIBS [$ELIBS]
    --extra-version=STRING   version string suffix []
    --optflags               override optimization-related compiler flags
    --build-suffix=SUFFIX    library name suffix []
    --malloc-prefix=PREFIX   prefix malloc and related names with PREFIX
 +  --progs-suffix=SUFFIX    program name suffix []
    --arch=ARCH              select architecture [$arch]
    --cpu=CPU                select the minimum required CPU (affects
                             instruction selection, may crash on older CPUs)
@@@ -267,19 -251,12 +267,19 @@@ Optimization options (experts only)
    --disable-neon           disable NEON optimizations
    --disable-vis            disable VIS optimizations
    --disable-yasm           disable use of yasm assembler
 +  --postproc-version=V     build libpostproc version V.
 +                           Where V can be '$ALT_PP_VER_MAJOR.$ALT_PP_VER_MINOR.$ALT_PP_VER_MICRO' or 'current'. [$postproc_version_default]
  
 -Developer options (useful when working on Libav itself):
 +Developer options (useful when working on FFmpeg itself):
 +  --enable-coverage        build with test coverage instrumentation
    --disable-debug          disable debugging symbols
    --enable-debug=LEVEL     set the debug level [$debuglevel]
    --disable-optimizations  disable compiler optimizations
    --enable-extra-warnings  enable more compiler warnings
 +  --disable-stripping      disable stripping of executables and shared libraries
 +  --valgrind=VALGRIND      run "make fate" tests through valgrind to detect memory
 +                           leaks and errors, using the specified valgrind binary.
 +                           Cannot be combined with --target-exec
    --samples=PATH           location of test samples for FATE, if not set use
                             \$FATE_SAMPLES at make invocation time.
    --enable-xmm-clobber-test check XMM registers for clobbering (Win64-only;
@@@ -318,7 -295,7 +318,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
@@@ -616,10 -593,6 +616,10 @@@ add_cflags()
      append CFLAGS $($filter_cflags "$@")
  }
  
 +add_cxxflags(){
 +    append CXXFLAGS $($filter_cflags "$@")
 +}
 +
  add_asflags(){
      append ASFLAGS $($filter_asflags "$@")
  }
@@@ -644,13 -617,6 +644,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
@@@ -686,14 -652,12 +686,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
  }
  
@@@ -713,17 -677,9 +713,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
  }
@@@ -749,7 -705,7 +749,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
@@@ -760,10 -716,10 +760,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
  }
  
@@@ -780,26 -736,7 +780,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(){
@@@ -831,21 -768,13 +831,21 @@@ check_lib2()
      check_func_headers "$headers" "$funcs" "$@" && add_extralibs "$@"
  }
  
 +check_lib_cpp(){
 +    log check_lib_cpp "$@"
 +    headers="$1"
 +    classes="$2"
 +    shift 2
 +    check_class_headers_cpp "$headers" "$classes" "$@" && add_extralibs "$@"
 +}
 +
  check_pkg_config(){
      log check_pkg_config "$@"
      pkg="$1"
      headers="$2"
      funcs="$3"
      shift 3
 -    $pkg_config --exists $pkg || return
 +    $pkg_config --exists $pkg 2>/dev/null || return
      pkg_cflags=$($pkg_config --cflags $pkg)
      pkg_libs=$($pkg_config --libs $pkg)
      check_func_headers "$headers" "$funcs" $pkg_cflags $pkg_libs "$@" &&
  }
  
  check_exec(){
 -    check_ld "$@" && { enabled cross_compile || $TMPE >> $logfile 2>&1; }
 +    check_ld "cc" "$@" && { enabled cross_compile || $TMPE >> $logfile 2>&1; }
  }
  
  check_exec_crash(){
  static void sighandler(int sig){
      raise(SIGTERM);
  }
 +int func(void){
 +    $code
 +}
 +int (*func_ptr)(void) = func;
  int main(void){
      signal(SIGILL, sighandler);
      signal(SIGFPE, sighandler);
  #ifdef SIGBUS
      signal(SIGBUS, sighandler);
  #endif
 -    { $code }
 +    return func_ptr();
  }
  EOF
  }
@@@ -938,14 -863,6 +938,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"
@@@ -997,10 -914,10 +997,10 @@@ COMPONENT_LIST=
  "
  
  PROGRAM_LIST="
 -    avconv
 -    avplay
 -    avprobe
 -    avserver
 +    ffplay
 +    ffprobe
 +    ffserver
 +    ffmpeg
  "
  
  CONFIG_LIST="
      avformat
      avisynth
      bzlib
 +    crystalhd
      dct
      doc
      dwt
      gpl
      gray
      hardcoded_tables
 +    libaacplus
 +    libass
 +    libbluray
      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
      rdft
      rtpdec
      runtime_cpudetect
      small
      sram
      static
 +    swresample
      swscale
      swscale_alpha
      thumb
  THREADS_LIST='
      pthreads
      w32threads
 +    os2threads
  '
  
  ARCH_LIST='
@@@ -1153,11 -1057,8 +1153,11 @@@ HAVE_LIST=
      altivec_h
      arpa_inet_h
      asm_mod_y
 +    asm_types_h
      attribute_may_alias
      attribute_packed
 +    cbrtf
 +    clock_gettime
      closesocket
      cmov
      dcbzl
      GetProcessMemoryInfo
      GetProcessTimes
      getrusage
 +    glob
      gnu_as
      ibm_asm
      inet_aton
      inline_asm
      isatty
 +    kbhit
      ldbrx
      libdc1394_1
      libdc1394_2
      loongson
      lrint
      lrintf
 +    lzo1x_999_compress
      machine_ioctl_bt848_h
      machine_ioctl_meteor_h
 +    makeinfo
      malloc_h
      MapViewOfFile
      memalign
      mkstemp
      mmap
 +    PeekNamedPipe
      poll_h
      posix_memalign
      round
      soundcard_h
      strerror_r
      strptime
 -    strtok_r
      struct_addrinfo
      struct_ipv6_mreq
      struct_rusage_ru_maxrss
      sys_select_h
      sys_soundcard_h
      sys_videoio_h
 +    termios_h
      threads
      trunc
      truncf
@@@ -1278,13 -1174,11 +1278,13 @@@ CMDLINE_SELECT=
      $CONFIG_LIST
      $THREADS_LIST
      asm
 +    coverage
      cross_compile
      debug
      extra_warnings
      logging
      optimizations
 +    stripping
      symver
      yasm
  "
@@@ -1308,7 -1202,6 +1308,7 @@@ CMDLINE_SET=
      cc
      cpu
      cross_prefix
 +    cxx
      dep_cc
      extra_version
      host_cc
      host_ldflags
      host_libs
      host_os
 +    install
      ld
      logfile
      malloc_prefix
      nm
      optflags
      pkg_config
 +    postproc_version
 +    progs_suffix
      samples
 +    strip
      sysinclude
      sysroot
      target_exec
      target_os
      target_path
 +    valgrind
 +    yasmexe
  "
  
  CMDLINE_APPEND="
      extra_cflags
 +    extra_cxxflags
  "
  
  # code dependency declarations
@@@ -1414,7 -1300,6 +1414,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"
@@@ -1425,12 -1310,10 +1425,12 @@@ h263_encoder_select="aandct
  h263_vaapi_hwaccel_select="vaapi h263_decoder"
  h263i_decoder_select="h263_decoder"
  h263p_encoder_select="h263_encoder"
 +h264_crystalhd_decoder_select="crystalhd h264_mp4toannexb_bsf h264_parser"
  h264_decoder_select="golomb h264chroma h264dsp h264pred h264qpel"
  h264_dxva2_hwaccel_deps="dxva2api_h"
  h264_dxva2_hwaccel_select="dxva2 h264_decoder"
  h264_vaapi_hwaccel_select="vaapi h264_decoder"
 +h264_vda_hwaccel_deps="VideoDecodeAcceleration_VDADecoder_h pthreads"
  h264_vda_hwaccel_select="vda h264_decoder"
  h264_vdpau_decoder_select="vdpau h264_decoder"
  imc_decoder_select="fft mdct sinewin"
@@@ -1456,20 -1339,15 +1456,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"
@@@ -1494,9 -1372,6 +1494,9 @@@ shorten_decoder_select="golomb
  sipr_decoder_select="lsp"
  snow_decoder_select="dwt"
  snow_encoder_select="aandct dwt"
 +sonic_decoder_select="golomb"
 +sonic_encoder_select="golomb"
 +sonic_ls_encoder_select="golomb"
  svq1_encoder_select="aandct"
  svq3_decoder_select="golomb h264chroma h264dsp h264pred h264qpel"
  svq3_decoder_suggest="zlib"
@@@ -1506,7 -1381,6 +1506,7 @@@ tiff_encoder_suggest="zlib
  truehd_decoder_select="mlp_decoder"
  tscc_decoder_select="zlib"
  twinvq_decoder_select="mdct lsp sinewin"
 +vc1_crystalhd_decoder_select="crystalhd"
  vc1_decoder_select="h263_decoder h264chroma h264qpel"
  vc1_dxva2_hwaccel_deps="dxva2api_h"
  vc1_dxva2_hwaccel_select="dxva2 vc1_decoder"
@@@ -1530,7 -1404,6 +1530,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"
@@@ -1541,7 -1414,6 +1541,7 @@@ zlib_encoder_select="zlib
  zmbv_decoder_select="zlib"
  zmbv_encoder_select="zlib"
  
 +crystalhd_deps="libcrystalhd_libcrystalhd_if_h"
  vaapi_deps="va_va_h"
  vda_deps="VideoDecodeAcceleration_VDADecoder_h pthreads"
  vdpau_deps="vdpau_vdpau_h vdpau_vdpau_x11_h"
  h264_parser_select="golomb h264dsp h264pred"
  
  # external libraries
 +libaacplus_encoder_deps="libaacplus"
 +libcelt_decoder_deps="libcelt"
  libdirac_decoder_deps="libdirac !libschroedinger"
  libfaac_encoder_deps="libfaac"
  libgsm_decoder_deps="libgsm"
  libgsm_encoder_deps="libgsm"
  libgsm_ms_decoder_deps="libgsm"
  libgsm_ms_encoder_deps="libgsm"
 +libmodplug_demuxer_deps="libmodplug"
  libmp3lame_encoder_deps="libmp3lame"
  libopencore_amrnb_decoder_deps="libopencore_amrnb"
  libopencore_amrnb_encoder_deps="libopencore_amrnb"
  libopencore_amrwb_decoder_deps="libopencore_amrwb"
  libopenjpeg_decoder_deps="libopenjpeg"
 +libopenjpeg_encoder_deps="libopenjpeg"
  libschroedinger_decoder_deps="libschroedinger"
  libschroedinger_encoder_deps="libschroedinger"
  libspeex_decoder_deps="libspeex"
  libspeex_encoder_deps="libspeex"
 +libstagefright_h264_decoder_deps="libstagefright_h264"
  libtheora_encoder_deps="libtheora"
  libvo_aacenc_encoder_deps="libvo_aacenc"
  libvo_amrwbenc_encoder_deps="libvo_amrwbenc"
@@@ -1577,11 -1444,8 +1577,11 @@@ libvorbis_encoder_deps="libvorbis
  libvpx_decoder_deps="libvpx"
  libvpx_encoder_deps="libvpx"
  libx264_encoder_deps="libx264"
 +libx264rgb_encoder_deps="libx264"
  libxavs_encoder_deps="libxavs"
  libxvid_encoder_deps="libxvid"
 +libutvideo_decoder_deps="libutvideo"
 +libutvideo_encoder_deps="libutvideo"
  
  # demuxers / muxers
  ac3_demuxer_select="ac3_parser"
@@@ -1618,30 -1482,22 +1618,30 @@@ w64_demuxer_deps="wav_demuxer
  alsa_indev_deps="alsa_asoundlib_h snd_pcm_htimestamp"
  alsa_outdev_deps="alsa_asoundlib_h"
  bktr_indev_deps_any="dev_bktr_ioctl_bt848_h machine_ioctl_bt848_h dev_video_bktr_ioctl_bt848_h dev_ic_bt8xx_h"
 +dshow_indev_deps="IBaseFilter"
 +dshow_indev_extralibs="-lpsapi -lole32 -lstrmiids -luuid"
  dv1394_indev_deps="dv1394 dv_demuxer"
  fbdev_indev_deps="linux_fb_h"
 -jack_indev_deps="jack_jack_h"
 +jack_indev_deps="jack_jack_h sem_timedwait"
 +lavfi_indev_deps="avfilter"
  libcdio_indev_deps="libcdio"
  libdc1394_indev_deps="libdc1394"
 +libv4l2_indev_deps="libv4l2"
 +openal_indev_deps="openal"
  oss_indev_deps_any="soundcard_h sys_soundcard_h"
  oss_outdev_deps_any="soundcard_h sys_soundcard_h"
  pulse_indev_deps="libpulse"
 +sdl_outdev_deps="sdl"
  sndio_indev_deps="sndio_h"
  sndio_outdev_deps="sndio_h"
 +v4l_indev_deps="linux_videodev_h"
  v4l2_indev_deps_any="linux_videodev2_h sys_videoio_h"
  vfwcap_indev_deps="capCreateCaptureWindow vfwcap_defines"
  vfwcap_indev_extralibs="-lavicap32"
  x11_grab_device_indev_deps="x11grab XShmCreateImage"
  
  # protocols
 +bluray_protocol_deps="libbluray"
  gopher_protocol_deps="network"
  httpproxy_protocol_deps="network"
  httpproxy_protocol_select="tcp_protocol"
@@@ -1664,42 -1520,31 +1664,44 @@@ tls_protocol_select="tcp_protocol
  udp_protocol_deps="network"
  
  # filters
 +aconvert_filter_deps="swresample"
 +amovie_filter_deps="avcodec avformat"
 +aresample_filter_deps="swresample"
 +ass_filter_deps="libass"
  blackframe_filter_deps="gpl"
  boxblur_filter_deps="gpl"
 +colormatrix_filter_deps="gpl"
  cropdetect_filter_deps="gpl"
  delogo_filter_deps="gpl"
  drawtext_filter_deps="libfreetype"
 -frei0r_filter_deps="frei0r dlopen strtok_r"
 +frei0r_filter_deps="frei0r dlopen"
+ frei0r_filter_extralibs='$ldl'
 -frei0r_src_filter_deps="frei0r dlopen strtok_r"
 +frei0r_src_filter_deps="frei0r dlopen"
+ frei0r_src_filter_extralibs='$ldl'
  hqdn3d_filter_deps="gpl"
 +movie_filter_deps="avcodec avformat"
 +mp_filter_deps="gpl avcodec swscale postproc"
 +mptestsrc_filter_deps="gpl"
 +negate_filter_deps="lut_filter"
  ocv_filter_deps="libopencv"
 +pan_filter_deps="swresample"
  scale_filter_deps="swscale"
 +tinterlace_filter_deps="gpl"
  yadif_filter_deps="gpl"
  
  # libraries
  avdevice_deps="avcodec avformat"
  avformat_deps="avcodec"
 +postproc_deps="gpl"
  
  # programs
 -avconv_deps="avcodec avformat swscale"
 -avplay_deps="avcodec avformat swscale sdl"
 -avplay_select="rdft"
 -avprobe_deps="avcodec avformat"
 -avserver_deps="avformat ffm_muxer fork rtp_protocol rtsp_demuxer !shared"
 -avserver_extralibs='$ldl'
 +ffplay_deps="avcodec avformat swscale swresample sdl"
 +ffplay_select="buffersink_filter rdft"
 +ffprobe_deps="avcodec avformat"
 +ffserver_deps="avformat ffm_muxer fork rtp_protocol rtsp_demuxer"
 +ffserver_extralibs='$ldl'
 +ffmpeg_deps="avcodec avformat swscale swresample"
 +ffmpeg_select="buffersink_filter"
  
  doc_deps="texi2html"
  
@@@ -1783,11 -1628,11 +1785,11 @@@ test_deps _muxer _demuxe
      gxf                                                                 \
      matroska=mkv                                                        \
      mmf                                                                 \
 -    mov                                                                 \
 +    mov="mov ismv"                                                      \
      pcm_mulaw=mulaw                                                     \
      mxf="mxf mxf_d10"                                                   \
      nut                                                                 \
 -    ogg                                                                 \
 +    ogg="ogg ogg_vp3"                                                   \
      rawvideo=pixfmt                                                     \
      rm                                                                  \
      swf                                                                 \
      yuv4mpegpipe=yuv4mpeg                                               \
  
  ac3_fixed_test_deps="ac3_fixed_encoder ac3_decoder"
 +flashsv2_test_deps="zlib"
  mpg_test_deps="mpeg1system_muxer mpegps_demuxer"
 +mpng_test_deps="zlib"
 +pp_test_deps="mp_filter"
 +pp2_test_deps="mp_filter"
 +pp3_test_deps="mp_filter"
 +pp4_test_deps="mp_filter"
 +pp5_test_deps="mp_filter"
 +pp6_test_deps="mp_filter"
 +zlib_test_deps="zlib"
 +zmbv_test_deps="zlib"
  
  # default parameters
  
@@@ -1816,27 -1651,23 +1818,27 @@@ logfile="config.log
  # installation paths
  prefix_default="/usr/local"
  bindir_default='${prefix}/bin'
 -datadir_default='${prefix}/share/avconv'
 +datadir_default='${prefix}/share/ffmpeg'
  incdir_default='${prefix}/include'
  libdir_default='${prefix}/lib'
  mandir_default='${prefix}/share/man'
  shlibdir_default="$libdir_default"
 +postproc_version_default="current"
  
  # toolchain
  ar_default="ar"
  cc_default="gcc"
 +cxx_default="g++"
  cc_version=\"unknown\"
  host_cc_default="gcc"
 +install="install"
  ln_s="ln -sf"
  nm_default="nm"
  objformat="elf"
  pkg_config_default=pkg-config
  ranlib="ranlib"
 -yasmexe="yasm"
 +strip_default="strip"
 +yasmexe_default="yasm"
  
  nm_opts='-g'
  nogas=":"
@@@ -1849,12 -1680,6 +1851,12 @@@ cpu="generic
  target_os_default=$(tolower $(uname -s))
  host_os=$target_os_default
  
 +# alternative libpostproc version
 +ALT_PP_VER_MAJOR=51
 +ALT_PP_VER_MINOR=2
 +ALT_PP_VER_MICRO=101
 +ALT_PP_VER=$ALT_PP_VER_MAJOR.$ALT_PP_VER_MINOR.$ALT_PP_VER_MICRO
 +
  # configurable options
  enable $PROGRAM_LIST
  
@@@ -1863,9 -1688,6 +1865,9 @@@ enable avdevic
  enable avfilter
  enable avformat
  enable avutil
 +enable postproc
 +enable stripping
 +enable swresample
  enable swscale
  
  enable asm
@@@ -1880,7 -1702,7 +1882,7 @@@ enable swscale_alph
  
  # build settings
  SHFLAGS='-shared -Wl,-soname,$$(@F)'
 -AVSERVERLDFLAGS=-Wl,-E
 +FFSERVERLDFLAGS=-Wl,-E
  LIBPREF="lib"
  LIBSUF=".a"
  FULLNAME='$(NAME)$(BUILDSUF)'
@@@ -1896,7 -1718,6 +1898,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'
@@@ -1923,7 -1744,7 +1925,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(){
@@@ -1965,12 -1786,11 +1967,12 @@@ find_tests()
  
  ACODEC_TESTS=$(find_tests acodec)
  VCODEC_TESTS=$(find_tests vsynth1)
 +LAVF_FATE_TESTS=$(find_tests lavf-fate)
  LAVF_TESTS=$(find_tests lavf)
  LAVFI_TESTS=$(find_tests lavfi)
  SEEK_TESTS=$(find_tests seek seek_)
  
 -ALL_TESTS="$ACODEC_TESTS $VCODEC_TESTS $LAVF_TESTS $LAVFI_TESTS $SEEK_TESTS"
 +ALL_TESTS="$ACODEC_TESTS $VCODEC_TESTS $LAVF_FATE_TESTS $LAVF_TESTS $LAVFI_TESTS $SEEK_TESTS"
  
  pcm_test_deps=$(map 'echo ${v%_*}_decoder $v' $(filter pcm_* $ENCODER_LIST))
  
@@@ -2052,7 -1872,7 +2054,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
@@@ -2062,29 -1882,17 +2064,29 @@@ if enabled cross_compile; the
          die "Must specify target arch and OS when cross-compiling"
  fi
  
 -set_default arch target_os
 +set_default arch target_os postproc_version
 +
 +# Check if we should build alternative libpostproc version instead of current
 +if   test "$postproc_version" = $ALT_PP_VER; then
 +  LIBPOSTPROC_VERSION=$ALT_PP_VER
 +  LIBPOSTPROC_VERSION_MAJOR=$ALT_PP_VER_MAJOR
 +  LIBPOSTPROC_VERSION_MINOR=$ALT_PP_VER_MINOR
 +  LIBPOSTPROC_VERSION_MICRO=$ALT_PP_VER_MICRO
 +elif test "$postproc_version" != current; then
 +  die "Invalid argument to --postproc-version. See --help output."
 +fi
  
  ar_default="${cross_prefix}${ar_default}"
  cc_default="${cross_prefix}${cc_default}"
 +cxx_default="${cross_prefix}${cxx_default}"
  nm_default="${cross_prefix}${nm_default}"
  pkg_config_default="${cross_prefix}${pkg_config_default}"
  ranlib="${cross_prefix}${ranlib}"
 +strip_default="${cross_prefix}${strip_default}"
  
  sysinclude_default="${sysroot}/usr/include"
  
 -set_default cc nm pkg_config sysinclude
 +set_default cc cxx nm pkg_config strip sysinclude yasmexe
  enabled cross_compile || host_cc_default=$cc
  set_default host_cc
  
@@@ -2127,7 -1935,6 +2129,7 @@@ trap 'rm -f -- $TMPFILES' EXI
  
  tmpfile TMPASM .asm
  tmpfile TMPC   .c
 +tmpfile TMPCPP .cpp
  tmpfile TMPE   $EXESUF
  tmpfile TMPH   .h
  tmpfile TMPO   .o
@@@ -2344,11 -2151,9 +2346,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)
 +    "Power Macintosh"|ppc|powerpc|ppc64|powerpc64)
          arch="ppc"
      ;;
 -    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
@@@ -2579,7 -2388,6 +2581,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
@@@ -2622,7 -2425,7 +2624,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_WITH_MAJOR),-current_version,$(LIBVERSION),-compatibility_version,$(LIBMAJOR)'
          enabled x86_32 && append SHFLAGS -Wl,-read_only_relocs,suppress
 +        strip="${strip} -x"
          add_ldflags -Wl,-dynamic,-search_paths_first
          SLIBSUF=".dylib"
          SLIBNAME_WITH_VERSION='$(SLIBPREF)$(FULLNAME).$(LIBVERSION)$(SLIBSUF)'
          SLIBNAME_WITH_MAJOR='$(SLIBPREF)$(FULLNAME).$(LIBMAJOR)$(SLIBSUF)'
 -        AVSERVERLDFLAGS=-Wl,-bind_at_load
 +        FFSERVERLDFLAGS=-Wl,-bind_at_load
          objformat="macho"
          enabled x86_64 && objformat="macho64"
          enabled_any pic shared ||
          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
  
@@@ -2816,13 -2616,11 +2818,13 @@@ die_license_disabled() 
  }
  
  die_license_disabled gpl libcdio
 +die_license_disabled gpl libutvideo
  die_license_disabled gpl libx264
  die_license_disabled gpl libxavs
  die_license_disabled gpl libxvid
  die_license_disabled gpl x11grab
  
 +die_license_disabled nonfree libaacplus
  die_license_disabled nonfree libfaac
  die_license_disabled nonfree openssl
  
@@@ -2888,7 -2686,7 +2890,7 @@@ elif enabled arm; the
      elif ! check_cpp_condition stddef.h "defined __ARM_PCS || defined __SOFTFP__"; then
          case "${cross_prefix:-$cc}" in
              *hardfloat*)         enable vfp_args;   fpabi=vfp ;;
 -            *) check_ld <<EOF && enable vfp_args && fpabi=vfp || fpabi=soft ;;
 +            *) check_ld "cc" <<EOF && enable vfp_args && fpabi=vfp || fpabi=soft ;;
  __asm__ (".eabi_attribute 28, 1");
  int main(void) { return 0; }
  EOF
  # Solaris has nanosleep in -lrt, OpenSolaris no longer needs that
  check_func nanosleep || { check_func nanosleep -lrt && add_extralibs -lrt; }
  
 +check_func  clock_gettime || { check_func clock_gettime -lrt && add_extralibs -lrt; }
  check_func  fcntl
  check_func  fork
  check_func  getaddrinfo $network_extralibs
@@@ -3067,53 -2864,39 +3069,53 @@@ check_func  ${malloc_prefix}posix_memal
  check_func  setrlimit
  check_func  strerror_r
  check_func  strptime
 -check_func  strtok_r
  check_func  sched_getaffinity
  check_func  sysconf
  check_func  sysctl
 +check_func_headers conio.h kbhit
 +check_func_headers windows.h PeekNamedPipe
  check_func_headers io.h setmode
 +check_func_headers lzo/lzo1x.h lzo1x_999_compress
  check_lib2 "windows.h psapi.h" GetProcessMemoryInfo -lpsapi
  check_func_headers windows.h GetProcessAffinityMask
  check_func_headers windows.h GetProcessTimes
  check_func_headers windows.h MapViewOfFile
  check_func_headers windows.h VirtualAlloc
 +check_func_headers glob.h glob
  
  check_header dlfcn.h
 -check_header dxva2api.h
 +check_header dxva2api.h -D_WIN32_WINNT=0x0600
 +check_header libcrystalhd/libcrystalhd_if.h
  check_header malloc.h
  check_header poll.h
  check_header sys/mman.h
  check_header sys/param.h
  check_header sys/resource.h
  check_header sys/select.h
 +check_header termios.h
  check_header vdpau/vdpau.h
  check_header vdpau/vdpau_x11.h
  check_header X11/extensions/XvMClib.h
 +check_header asm/types.h
  
  disabled  zlib || check_lib   zlib.h      zlibVersion -lz   || disable  zlib
  disabled bzlib || check_lib2 bzlib.h BZ2_bzlibVersion -lbz2 || disable bzlib
  
 +# check for VDA header
 +if ! disabled vda; then
 +    if check_header VideoDecodeAcceleration/VDADecoder.h; then
 +        enable vda
 +        add_extralibs -framework CoreFoundation -framework VideoDecodeAcceleration -framework QuartzCore
 +    fi
 +fi
 +
  if ! disabled w32threads && ! enabled pthreads; then
      check_func _beginthreadex && enable w32threads
  fi
  
  # check for some common methods of building with pthread support
  # do this before the optional library checks as some of them require pthreads
 -if ! disabled pthreads && ! enabled w32threads; then
 +if ! disabled pthreads && ! enabled w32threads && ! enabled os2threads; then
      enable pthreads
      if check_func pthread_create; then
          :
@@@ -3139,10 -2922,8 +3141,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
@@@ -3160,53 -2941,36 +3162,53 @@@ 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 libbluray  && require libbluray libbluray/bluray.h bd_open -lbluray
 +enabled libcelt    && require libcelt celt/celt.h celt_decode -lcelt0 &&
 +                      { check_lib celt/celt.h celt_decoder_create_custom -lcelt0 ||
 +                        die "ERROR: libcelt version must be >= 0.11.0."; }
  enabled libdirac   && require_pkg_config dirac                          \
      "libdirac_decoder/dirac_parser.h"  \
      "dirac_decoder_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 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 ||
@@@ -3221,28 -2985,15 +3223,28 @@@ if enabled libdc1394; the
      die "ERROR: No version of libdc1394 found "
  fi
  
 +SDL_CONFIG="${cross_prefix}sdl-config"
  if check_pkg_config sdl SDL_events.h SDL_PollEvent; then
      check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) >= 0x010201" $sdl_cflags &&
      enable sdl &&
      check_struct SDL.h SDL_VideoInfo current_w $sdl_cflags && enable sdl_video_size
 +else
 +  if "${SDL_CONFIG}" --version > /dev/null 2>&1; then
 +    sdl_cflags=$("${SDL_CONFIG}" --cflags)
 +    sdl_libs=$("${SDL_CONFIG}" --libs)
 +    check_func_headers SDL_version.h SDL_Linked_Version $sdl_cflags $sdl_libs &&
 +    check_cpp_condition SDL.h "(SDL_MAJOR_VERSION<<16 | SDL_MINOR_VERSION<<8 | SDL_PATCHLEVEL) >= 0x010201" $sdl_cflags &&
 +    enable sdl &&
 +    check_struct SDL.h SDL_VideoInfo current_w $sdl_cflags && enable sdl_video_size
 +  fi
  fi
 +enabled sdl && add_cflags $sdl_cflags && add_extralibs $sdl_libs
  
  texi2html -version > /dev/null 2>&1 && enable texi2html || disable texi2html
 +makeinfo --version > /dev/null 2>&1 && enable makeinfo  || disable makeinfo
  
  check_header linux/fb.h
 +check_header linux/videodev.h
  check_header linux/videodev2.h
  check_struct linux/videodev2.h "struct v4l2_frmivalenum" discrete
  
@@@ -3253,8 -3004,6 +3255,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
  
@@@ -3289,11 -3031,9 +3291,11 @@@ require X11 X11/Xlib.h XOpenDisplay -lX
  require Xext X11/extensions/XShm.h XShmCreateImage -lXext &&
  require Xfixes X11/extensions/Xfixes.h XFixesGetCursorImage -lXfixes
  
 -# check for VDA header
 -if ! disabled vda && check_header VideoDecodeAcceleration/VDADecoder.h; then
 -    enable vda && add_extralibs -framework CoreFoundation -framework VideoDecodeAcceleration -framework QuartzCore
 +if ! disabled vaapi; then
 +    check_lib va/va.h vaInitialize -lva && {
 +        check_cpp_condition va/va_version.h "VA_CHECK_VERSION(0,32,0)" ||
 +        warn "Please upgrade to VA-API >= 0.32 if you would like full VA-API support.";
 +    } || disable vaapi
  fi
  
  if ! disabled vdpau && enabled vdpau_vdpau_h; then
@@@ -3304,8 -3044,6 +3306,8 @@@ check_cpp_condition 
  fi
  
  enabled debug && add_cflags -g"$debuglevel" && add_asflags -g"$debuglevel"
 +enabled coverage && add_cflags "-fprofile-arcs -ftest-coverage" && add_ldflags "-fprofile-arcs -ftest-coverage"
 +test -n "$valgrind" && target_exec="$valgrind --error-exitcode=1 --malloc-fill=0x2a --track-origins=yes --leak-check=full --gen-suppressions=all --suppressions=$source_path/tests/fate-valgrind.supp"
  
  # add some useful compiler flags if supported
  check_cflags -Wdeclaration-after-statement
@@@ -3322,13 -3060,12 +3324,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=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
  
  enabled xmm_clobber_test &&                             \
  fi
  check_cflags -fno-math-errno
  check_cflags -fno-signed-zeros
 +check_cc -mno-red-zone <<EOF && noredzone_flags="-mno-red-zone"
 +int x;
 +EOF
 +
  
  if enabled icc; then
      # Just warnings, no remarks
@@@ -3405,6 -3138,7 +3407,6 @@@ elif enabled gcc; the
      check_cflags -fno-tree-vectorize
      check_cflags -Werror=implicit-function-declaration
      check_cflags -Werror=missing-prototypes
 -    check_cflags -Werror=declaration-after-statement
  elif enabled llvm_gcc; then
      check_cflags -mllvm -stack-alignment=16
  elif enabled clang; then
@@@ -3434,41 -3168,9 +3436,41 @@@ check_deps $CONFIG_LIST       
  
  enabled asm || { arch=c; disable $ARCH_LIST $ARCH_EXT_LIST; }
  
 +if test $target_os = "haiku"; then
 +    disable memalign
 +    disable posix_memalign
 +fi
 +
  ! enabled_any memalign posix_memalign malloc_aligned &&
      enabled_any $need_memalign && enable memalign_hack
  
 +# add_dep lib dep
 +# -> enable ${lib}_deps_${dep}
 +# -> add $dep to ${lib}_deps only once
 +add_dep() {
 +    lib=$1
 +    dep=$2
 +    enabled "${lib}_deps_${dep}" && return 0
 +    enable  "${lib}_deps_${dep}"
 +    prepend "${lib}_deps" $dep
 +}
 +
 +# merge deps lib components
 +# merge all ${component}_deps into ${lib}_deps and ${lib}_deps_*
 +merge_deps() {
 +    lib=$1
 +    shift
 +    for comp in $*; do
 +        enabled $comp || continue
 +        eval "dep=\"\$${comp}_deps\""
 +        for d in $dep; do
 +            add_dep $lib $d
 +        done
 +    done
 +}
 +
 +merge_deps libavfilter $FILTER_LIST
 +
  echo "install prefix            $prefix"
  echo "source path               $source_path"
  echo "C compiler                $cc"
@@@ -3476,9 -3178,6 +3478,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
@@@ -3517,12 -3216,10 +3519,12 @@@ if enabled sparc; the
      echo "VIS enabled               ${vis-no}"
  fi
  echo "debug symbols             ${debug-no}"
 +echo "strip symbols             ${stripping-no}"
  echo "optimize for size         ${small-no}"
  echo "optimizations             ${optimizations-no}"
  echo "static                    ${static-no}"
  echo "shared                    ${shared-no}"
 +echo "postprocessing support    ${postproc-no}"
  echo "new filter support        ${avfilter-no}"
  echo "network support           ${network-no}"
  echo "threading support         ${thread_type-no}"
@@@ -3534,15 -3231,11 +3536,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}"
@@@ -3553,10 -3246,7 +3555,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}"
@@@ -3564,7 -3254,6 +3566,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}"
@@@ -3594,15 -3283,11 +3596,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
@@@ -3611,13 -3296,9 +3613,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
@@@ -3625,22 -3306,18 +3627,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
@@@ -3651,7 -3328,6 +3653,7 @@@ EXESUF=$EXESU
  EXTRA_VERSION=$extra_version
  DEPFLAGS=$DEPFLAGS
  CCDEP=$CCDEP
 +CXXDEP=$CXXDEP
  ASDEP=$ASDEP
  CC_DEPFLAGS=$CC_DEPFLAGS
  AS_DEPFLAGS=$AS_DEPFLAGS
@@@ -3666,7 -3342,7 +3668,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}
@@@ -3678,17 -3354,13 +3680,17 @@@ SLIB_INSTALL_LINKS=${SLIB_INSTALL_LINKS
  SLIB_INSTALL_EXTRA_LIB=${SLIB_INSTALL_EXTRA_LIB}
  SLIB_INSTALL_EXTRA_SHLIB=${SLIB_INSTALL_EXTRA_SHLIB}
  SAMPLES:=${samples:-\$(FATE_SAMPLES)}
 +NOREDZONE_FLAGS=$noredzone_flags
  EOF
  
  get_version(){
      name=$1
      file=$source_path/$2
 +# This condition will be removed when we stop supporting old libpostproc versions
 +if ! test "$name" = LIBPOSTPROC || test "$postproc_version" = current; then
      eval $(grep "#define ${name}_VERSION_M" "$file" | awk '{ print $2"="$3 }')
      eval ${name}_VERSION=\$${name}_VERSION_MAJOR.\$${name}_VERSION_MINOR.\$${name}_VERSION_MICRO
 +fi
      lcname=$(tolower $name)
      eval echo "${lcname}_VERSION=\$${name}_VERSION" >> config.mak
      eval echo "${lcname}_VERSION_MAJOR=\$${name}_VERSION_MAJOR" >> config.mak
@@@ -3699,17 -3371,14 +3701,17 @@@ get_version LIBAVDEVICE libavdevice/avd
  get_version LIBAVFILTER libavfilter/version.h
  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
@@@ -3745,14 -3414,12 +3747,14 @@@ print_config CONFIG_ "$config_files" $C
  cat >>config.mak <<EOF
  ACODEC_TESTS=$(print_enabled -n _test $ACODEC_TESTS)
  VCODEC_TESTS=$(print_enabled -n _test $VCODEC_TESTS)
 +LAVF_FATE_TESTS=$(print_enabled -n _test $LAVF_FATE_TESTS)
  LAVF_TESTS=$(print_enabled   -n _test $LAVF_TESTS)
  LAVFI_TESTS=$(print_enabled  -n _test $LAVFI_TESTS)
  SEEK_TESTS=$(print_enabled   -n _test $SEEK_TESTS)
  EOF
  
 -echo "#endif /* LIBAV_CONFIG_H */" >> $TMPH
 +echo "#endif /* FFMPEG_CONFIG_H */" >> $TMPH
 +echo "endif # FFMPEG_CONFIG_MAK" >> config.mak
  
  # Do not overwrite an unchanged config.h to avoid superfluous rebuilds.
  cp_if_changed $TMPH config.h
@@@ -3766,12 -3433,6 +3768,12 @@@ cat > $TMPH <<EO
  #define AVUTIL_AVCONFIG_H
  EOF
  
 +test "$postproc_version" != current && cat >> $TMPH <<EOF
 +#define LIBPOSTPROC_VERSION_MAJOR $LIBPOSTPROC_VERSION_MAJOR
 +#define LIBPOSTPROC_VERSION_MINOR $LIBPOSTPROC_VERSION_MINOR
 +#define LIBPOSTPROC_VERSION_MICRO $LIBPOSTPROC_VERSION_MICRO
 +EOF
 +
  print_config AV_HAVE_ $TMPH $HAVE_LIST_PUB
  
  echo "#endif /* AVUTIL_AVCONFIG_H */" >> $TMPH
@@@ -3823,22 -3484,9 +3825,22 @@@ 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 libswscale "Libav image rescaling library" "$LIBSWSCALE_VERSION" "$LIBM" "libavutil = $LIBAVUTIL_VERSION"
 +libavfilter_pc_deps=""
 +enabled libavfilter_deps_avcodec    && prepend libavfilter_pc_deps "libavcodec = $LIBAVCODEC_VERSION,"
 +enabled libavfilter_deps_avformat   && prepend libavfilter_pc_deps "libavformat = $LIBAVFORMAT_VERSION,"
 +enabled libavfilter_deps_swscale    && prepend libavfilter_pc_deps "libswscale = $LIBSWSCALE_VERSION,"
 +enabled libavfilter_deps_swresample && prepend libavfilter_pc_deps "libswresample = $LIBSWRESAMPLE_VERSION,"
 +enabled libavfilter_deps_postproc   && prepend libavfilter_pc_deps "libpostproc = $LIBPOSTPROC_VERSION,"
 +libavfilter_pc_deps=${libavfilter_pc_deps%, }
 +
 +libavdevice_pc_deps="libavformat = $LIBAVFORMAT_VERSION"
 +enabled lavfi_indev && prepend libavdevice_pc_deps "libavfilter = $LIBAVFILTER_VERSION,"
 +
 +pkgconfig_generate libavutil "FFmpeg utility library" "$LIBAVUTIL_VERSION" "$LIBM"
 +pkgconfig_generate libavcodec "FFmpeg codec library" "$LIBAVCODEC_VERSION" "$extralibs" "libavutil = $LIBAVUTIL_VERSION"
 +pkgconfig_generate libavformat "FFmpeg container format library" "$LIBAVFORMAT_VERSION" "$extralibs" "libavcodec = $LIBAVCODEC_VERSION"
 +pkgconfig_generate libavdevice "FFmpeg device handling library" "$LIBAVDEVICE_VERSION" "$extralibs" "$libavdevice_pc_deps"
 +pkgconfig_generate libavfilter "FFmpeg video filtering library" "$LIBAVFILTER_VERSION" "$extralibs" "$libavfilter_pc_deps"
 +pkgconfig_generate libpostproc "FFmpeg postprocessing library" "$LIBPOSTPROC_VERSION" "" "libavutil = $LIBAVUTIL_VERSION"
 +pkgconfig_generate 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/aacenc.c
@@@ -2,20 -2,20 +2,20 @@@
   * AAC encoder
   * Copyright (C) 2008 Konstantin Shishkov
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
@@@ -145,7 -145,7 +145,7 @@@ static const uint8_t aac_chan_configs[6
  };
  
  /**
 - * Table to remap channels from Libav's default order to AAC order.
 + * Table to remap channels from libavcodec's default order to AAC order.
   */
  static const uint8_t aac_chan_maps[AAC_MAX_CHANNELS][AAC_MAX_CHANNELS] = {
      { 0 },
@@@ -475,9 -475,9 +475,9 @@@ static void put_bitstream_info(AVCodecC
  
  /*
   * Deinterleave input samples.
 - * Channels are reordered from Libav's default order to AAC order.
 + * Channels are reordered from libavcodec's default order to AAC order.
   */
- static void deinterleave_input_samples(AACEncContext *s, AVFrame *frame)
+ static void deinterleave_input_samples(AACEncContext *s, const AVFrame *frame)
  {
      int ch, i;
      const int sinc = s->channels;
@@@ -574,8 -574,10 +574,8 @@@ static int aac_encode_frame(AVCodecCont
      do {
          int frame_bits;
  
 -        if ((ret = ff_alloc_packet(avpkt, 768 * s->channels))) {
 -            av_log(avctx, AV_LOG_ERROR, "Error getting output packet\n");
 +        if ((ret = ff_alloc_packet2(avctx, avpkt, 768 * s->channels)))
              return ret;
 -        }
          init_put_bits(&s->pb, avpkt->data, avpkt->size);
  
          if ((avctx->frame_number & 0xFF)==1 && !(avctx->flags & CODEC_FLAG_BITEXACT))
@@@ -773,7 -775,7 +773,7 @@@ static av_cold int aac_encode_init(AVCo
      if (ret = ff_psy_init(&s->psy, avctx, 2, sizes, lengths, s->chan_map[0], grouping))
          goto fail;
      s->psypp = ff_psy_preprocess_init(avctx);
 -    s->coder = &ff_aac_coders[2];
 +    s->coder = &ff_aac_coders[s->options.aac_coder];
  
      s->lambda = avctx->global_quality ? avctx->global_quality : 120;
  
@@@ -797,7 -799,6 +797,7 @@@ static const AVOption aacenc_options[] 
          {"auto",     "Selected by the Encoder", 0, AV_OPT_TYPE_CONST, {.dbl = -1 }, INT_MIN, INT_MAX, AACENC_FLAGS, "stereo_mode"},
          {"ms_off",   "Disable Mid/Side coding", 0, AV_OPT_TYPE_CONST, {.dbl =  0 }, INT_MIN, INT_MAX, AACENC_FLAGS, "stereo_mode"},
          {"ms_force", "Force Mid/Side for the whole frame if possible", 0, AV_OPT_TYPE_CONST, {.dbl =  1 }, INT_MIN, INT_MAX, AACENC_FLAGS, "stereo_mode"},
 +    {"aac_coder", "", offsetof(AACEncContext, options.aac_coder), AV_OPT_TYPE_INT, {.dbl = 2}, 0, AAC_CODER_NB-1, AACENC_FLAGS},
      {NULL}
  };
  
@@@ -816,7 -817,6 +816,7 @@@ AVCodec ff_aac_encoder = 
      .init           = aac_encode_init,
      .encode2        = aac_encode_frame,
      .close          = aac_encode_end,
 +    .supported_samplerates = avpriv_mpeg4audio_sample_rates,
      .capabilities = CODEC_CAP_SMALL_LAST_FRAME | CODEC_CAP_DELAY | CODEC_CAP_EXPERIMENTAL,
      .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_FLT,AV_SAMPLE_FMT_NONE},
      .long_name = NULL_IF_CONFIG_SMALL("Advanced Audio Coding"),
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 "cabac.h"
  #include "cabac_functions.h"
@@@ -48,6 -45,8 +48,8 @@@
  // #undef NDEBUG
  #include <assert.h>
  
+ const uint16_t ff_h264_mb_sizes[4] = { 256, 384, 512, 768 };
  static const uint8_t rem6[QP_MAX_NUM + 1] = {
      0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2,
      3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5,
@@@ -213,27 -212,21 +215,27 @@@ const uint8_t *ff_h264_decode_nal(H264C
          i -= RS;
      }
  
 -    if (i >= length - 1) { // no escaped 0
 -        *dst_length = length;
 -        *consumed   = length + 1; // +1 for the header
 -        return src;
 -    }
 -
      // use second escape buffer for inter data
      bufidx = h->nal_unit_type == NAL_DPC ? 1 : 0;
 -    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_padded_malloc(&h->rbsp_buffer[bufidx], &h->rbsp_buffer_size[bufidx], length+MAX_MBPAIR_SIZE);
      dst = h->rbsp_buffer[bufidx];
  
      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;
@@@ -767,7 -760,9 +769,7 @@@ static av_always_inline void prefetch_m
              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);
          }
      }
@@@ -1024,7 -1019,7 +1026,7 @@@ int ff_h264_alloc_tables(H264Context *h
  {
      MpegEncContext *const s = &h->s;
      const int big_mb_num    = s->mb_stride * (s->mb_height + 1);
 -    const int row_mb_num    = s->mb_stride * 2 * s->avctx->thread_count;
 +    const int row_mb_num    = 2*s->mb_stride*FFMAX(s->avctx->thread_count, 1);
      int x, y;
  
      FF_ALLOCZ_OR_GOTO(h->s.avctx, h->intra4x4_pred_mode,
@@@ -1131,18 -1126,12 +1133,18 @@@ 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;
      /* needed so that IDCT permutation is known early */
      ff_dsputil_init(&s->dsp, s->avctx);
  
      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,
          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,
              p += nalsize;
          }
          // Now store right nal length size, that will be used 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;
 +    return size;
  }
  
  av_cold int ff_h264_decode_init(AVCodecContext *avctx)
      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) < 0)
          return -1;
  
      if (h->sps.bitstream_restriction_flag &&
@@@ -1317,7 -1302,7 +1319,7 @@@ static int decode_update_thread_context
      int inited = s->context_initialized, err;
      int i;
  
 -    if (dst == src || !s1->context_initialized)
 +    if (dst == src)
          return 0;
  
      err = ff_mpeg_update_thread_context(dst, src);
                 sizeof(H264Context) - sizeof(MpegEncContext));
          memset(h->sps_buffers, 0, sizeof(h->sps_buffers));
          memset(h->pps_buffers, 0, sizeof(h->pps_buffers));
 +
 +        if (s1->context_initialized) {
          if (ff_h264_alloc_tables(h) < 0) {
              av_log(dst, AV_LOG_ERROR, "Could not allocate memory for h264\n");
              return AVERROR(ENOMEM);
          }
          context_init(h);
  
 +        /* frame_start may not be called for the next thread (if it's decoding
 +         * a bottom field) so this has to be allocated here */
 +        h->s.obmc_scratchpad = av_malloc(16 * 6 * s->linesize);
 +        }
 +
          for (i = 0; i < 2; i++) {
              h->rbsp_buffer[i]      = NULL;
              h->rbsp_buffer_size[i] = 0;
  
          h->thread_context[0] = h;
  
 -        /* frame_start may not be called for the next thread (if it's decoding
 -         * a bottom field) so this has to be allocated here */
 -        h->s.obmc_scratchpad = av_malloc(16 * 6 * s->linesize);
 -
          s->dsp.clear_blocks(h->mb);
          s->dsp.clear_blocks(h->mb + (24 * 16 << h->pixel_shift));
      }
                         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;
@@@ -1433,7 -1414,6 +1435,7 @@@ int ff_h264_frame_start(H264Context *h
       * See decode_nal_units().
       */
      s->current_picture_ptr->f.key_frame = 0;
 +    s->current_picture_ptr->sync        = 0;
      s->current_picture_ptr->mmco_reset  = 0;
  
      assert(s->linesize && s->uvlinesize);
@@@ -1496,6 -1476,7 +1498,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 = 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;
 +    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->delayed_pic[0]->f.key_frame || h->delayed_pic[0]->mmco_reset))
          h->next_outputed_poc = INT_MIN;
 -    out_of_order = !out->f.key_frame && !h->mmco_reset &&
 -                   (out->poc < h->next_outputed_poc);
 +    out_of_order = 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 (pics > s->avctx->has_b_frames) {
 +    if (out_of_order || pics > s->avctx->has_b_frames) {
          out->f.reference &= ~DELAYED_PIC_REF;
          // 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)
@@@ -2122,11 -2139,12 +2124,12 @@@ 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);
+             init_get_bits(&gb, (uint8_t *)h->mb,
+                           ff_h264_mb_sizes[h->sps.chroma_format_idc] * bit_depth);
  
              for (i = 0; i < 16; i++) {
                  uint16_t *tmp_y = (uint16_t *)(dest_y + i * linesize);
                  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);
 +                        for (j = 0; j < 8; j++) {
 +                            tmp_cb[j] = tmp_cr[j] = 1 << (bit_depth - 1);
 +                        }
                      }
                  } else {
                      for (i = 0; i < block_h; i++) {
              }
          } else {
              for (i = 0; i < 16; i++)
-                 memcpy(dest_y + i * linesize, h->mb + i * 8, 16);
+                 memcpy(dest_y + i * linesize, (uint8_t *)h->mb + i * 16, 16);
              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 {
+                     uint8_t *src_cb = (uint8_t *)h->mb + 256;
+                     uint8_t *src_cr = (uint8_t *)h->mb + 256 + block_h * 8;
                      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);
+                         memcpy(dest_cb + i * uvlinesize, src_cb + i * 8, 8);
+                         memcpy(dest_cr + i * uvlinesize, src_cr + i * 8, 8);
                      }
                  }
              }
                                 uvlinesize, 1, 0, simple, pixel_shift);
  
              if (simple || !CONFIG_GRAY || !(s->flags & CODEC_FLAG_GRAY)) {
 -                h->hpc.pred8x8[h->chroma_pred_mode](dest_cb, uvlinesize);
 -                h->hpc.pred8x8[h->chroma_pred_mode](dest_cr, uvlinesize);
 +                if (CHROMA) {
 +                    h->hpc.pred8x8[h->chroma_pred_mode](dest_cb, uvlinesize);
 +                    h->hpc.pred8x8[h->chroma_pred_mode](dest_cr, uvlinesize);
 +                }
              }
  
              hl_decode_mb_predict_luma(h, mb_type, is_h264, simple,
@@@ -2358,7 -2379,8 +2363,8 @@@ static av_always_inline void hl_decode_
          } else {
              for (p = 0; p < plane_count; p++)
                  for (i = 0; i < 16; i++)
-                     memcpy(dest[p] + i * linesize, h->mb + p * 128 + i * 8, 16);
+                     memcpy(dest[p] + i * linesize,
+                            (uint8_t *)h->mb + p * 256 + i * 16, 16);
          }
      } else {
          if (IS_INTRA(mb_type)) {
@@@ -2578,14 -2600,11 +2584,14 @@@ static void implicit_weight_table(H264C
   */
  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 */
@@@ -2593,22 -2612,21 +2599,22 @@@ static void flush_dpb(AVCodecContext *a
  {
      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)
@@@ -2859,7 -2877,6 +2865,7 @@@ static int decode_slice_header(H264Cont
      unsigned int slice_type, tmp, i, j;
      int default_ref_list_done = 0;
      int last_pic_structure, last_pic_dropable;
 +    int must_reinit;
  
      /* FIXME: 2tap qpel isn't implemented for high bit depth. */
      if ((s->avctx->flags2 & CODEC_FLAG2_FAST) &&
          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) {
  
      pps_id = get_ue_golomb(&s->gb);
      if (pps_id >= MAX_PPS_COUNT) {
 -        av_log(h->s.avctx, AV_LOG_ERROR, "pps_id out of range\n");
 +        av_log(h->s.avctx, AV_LOG_ERROR, "pps_id %d out of range\n", pps_id);
          return -1;
      }
      if (!h0->pps_buffers[pps_id]) {
      s->avctx->level   = h->sps.level_idc;
      s->avctx->refs    = h->sps.ref_frame_count;
  
 +    must_reinit = (s->context_initialized &&
 +                    (   16*h->sps.mb_width != s->avctx->coded_width
 +                     || 16*h->sps.mb_height * (2 - h->sps.frame_mbs_only_flag) != 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(must_reinit && (h != h0 || (s->avctx->active_thread_type & FF_THREAD_FRAME))) {
 +        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
 +    }
 +
      s->mb_width  = h->sps.mb_width;
      s->mb_height = h->sps.mb_height * (2 - h->sps.frame_mbs_only_flag);
  
  
      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 ||
 -         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);
 -            return -1;   // width / height changed during parallelized decoding
 -        }
 +
 +    if(must_reinit) {
          free_tables(h, 0);
          flush_dpb(s->avctx);
          ff_MPV_common_end(s);
 +        h->list_count = 0;
      }
      if (!s->context_initialized) {
          if (h != h0) {
                     "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;
 +                ff_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
 +            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;
              break;
          case 8:
              if (CHROMA444) {
 -                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;
 +                    if (s->avctx->colorspace == AVCOL_SPC_RGB) {
 +                        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;
                  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 {
      } else {
          /* 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;
              int max_frame_num         = 1 << h->sps.log2_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",
                  s0->first_field         = FIELD_PICTURE;
              } else {
                  if (s0->current_picture_ptr->frame_num != h->frame_num) {
 +                    ff_thread_report_progress((AVFrame*)s0->current_picture_ptr, INT_MAX,
 +                                              s0->picture_structure==PICT_BOTTOM_FIELD);
                      /* This and the previous field had different frame_nums.
                       * Consider this field first in pair. Throw away previous
                       * one except for reference purposes. */
      h->ref_count[1] = h->pps.ref_count[1];
  
      if (h->slice_type_nos != AV_PICTURE_TYPE_I) {
 -        int max_refs = s->picture_structure == PICT_FRAME ? 16 : 32;
 +        unsigned max = s->picture_structure == PICT_FRAME ? 15 : 31;
  
          if (h->slice_type_nos == AV_PICTURE_TYPE_B)
              h->direct_spatial_mv_pred = get_bits1(&s->gb);
                  h->ref_count[1] = get_ue_golomb(&s->gb) + 1;
          }
  
 -        if (h->ref_count[0] > max_refs || h->ref_count[1] > max_refs) {
 +        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 AVERROR_INVALIDDATA;
          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++) {
@@@ -3636,7 -3613,7 +3642,7 @@@ static av_always_inline void fill_filte
          if (USES_LIST(top_type, list)) {
              const int b_xy  = h->mb2b_xy[top_xy] + 3 * b_stride;
              const int b8_xy = 4 * top_xy + 2;
 -            int (*ref2frm)[64] = h->ref2frm[h->slice_table[top_xy] & (MAX_SLICES - 1)][0] + (MB_MBAFF ? 20 : 2);
 +            int (*ref2frm)[64] = (void*)(h->ref2frm[h->slice_table[top_xy] & (MAX_SLICES - 1)][0] + (MB_MBAFF ? 20 : 2));
              AV_COPY128(mv_dst - 1 * 8, s->current_picture.f.motion_val[list][b_xy + 0]);
              ref_cache[0 - 1 * 8] =
              ref_cache[1 - 1 * 8] = ref2frm[list][s->current_picture.f.ref_index[list][b8_xy + 0]];
              if (USES_LIST(left_type[LTOP], list)) {
                  const int b_xy  = h->mb2b_xy[left_xy[LTOP]] + 3;
                  const int b8_xy = 4 * left_xy[LTOP] + 1;
 -                int (*ref2frm)[64] = h->ref2frm[h->slice_table[left_xy[LTOP]] & (MAX_SLICES - 1)][0] + (MB_MBAFF ? 20 : 2);
 +                int (*ref2frm)[64] =(void*)( h->ref2frm[h->slice_table[left_xy[LTOP]] & (MAX_SLICES - 1)][0] + (MB_MBAFF ? 20 : 2));
                  AV_COPY32(mv_dst - 1 +  0, s->current_picture.f.motion_val[list][b_xy + b_stride * 0]);
                  AV_COPY32(mv_dst - 1 +  8, s->current_picture.f.motion_val[list][b_xy + b_stride * 1]);
                  AV_COPY32(mv_dst - 1 + 16, s->current_picture.f.motion_val[list][b_xy + b_stride * 2]);
  
      {
          int8_t *ref = &s->current_picture.f.ref_index[list][4 * mb_xy];
 -        int (*ref2frm)[64] = h->ref2frm[h->slice_num & (MAX_SLICES - 1)][0] + (MB_MBAFF ? 20 : 2);
 +        int (*ref2frm)[64] = (void*)(h->ref2frm[h->slice_num & (MAX_SLICES - 1)][0] + (MB_MBAFF ? 20 : 2));
          uint32_t ref01 = (pack16to32(ref2frm[list][ref[0]], ref2frm[list][ref[1]]) & 0x00FF00FF) * 0x0101;
          uint32_t ref23 = (pack16to32(ref2frm[list][ref[2]], ref2frm[list][ref[3]]) & 0x00FF00FF) * 0x0101;
          AV_WN32A(&ref_cache[0 * 8], ref01);
@@@ -4094,8 -4071,7 +4100,8 @@@ static int decode_slice(struct AVCodecC
                      tprintf(s->avctx, "slice end %d %d\n",
                              get_bits_count(&s->gb), s->gb.size_in_bits);
  
 -                    if (get_bits_left(&s->gb) == 0) {
 +                    if (   get_bits_left(&s->gb) == 0
 +                        || get_bits_left(&s->gb) > 0 && !(s->avctx->err_recognition & AV_EF_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);
@@@ -4156,7 -4132,6 +4162,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, h->thread_context,
@@@ -4187,10 -4162,6 +4193,10 @@@ 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;
 +
 +    if(!s->slice_context_count)
 +         s->slice_context_count= 1;
      h->max_contexts = s->slice_context_count;
      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 -
                                          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 pass %d\n", hx->nal_unit_type, hx->nal_ref_idc, buf_index, buf_size, dst_length, pass);
  
              if (h->is_avc && (nalsize != consumed) && nalsize)
                  av_log(h->s.avctx, AV_LOG_DEBUG,
@@@ -4302,7 -4275,7 +4308,7 @@@ again
              case NAL_IDR_SLICE:
                  if (h->nal_unit_type != NAL_IDR_SLICE) {
                      av_log(h->s.avctx, AV_LOG_ERROR,
 -                           "Invalid mix of idr and non-idr slices");
 +                           "Invalid mix of idr and non-idr slices\n");
                      buf_index = -1;
                      goto end;
                  }
                  if ((err = decode_slice_header(hx, h)))
                      break;
  
 +                if (   h->sei_recovery_frame_cnt >= 0
 +                    && (   h->recovery_frame<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) {
 +                    s->current_picture_ptr->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);
 -                if (ff_h264_decode_seq_parameter_set(h) < 0 &&
 -                    h->is_avc && (nalsize != consumed) && nalsize) {
 +                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, try parsing the coomplete NAL\n");
 -                    init_get_bits(&s->gb, buf + buf_index + 1 - consumed,
 -                                  8 * (nalsize - 1));
 +                           "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 - 1));
                      ff_h264_decode_seq_parameter_set(h);
                  }
  
                      (h->sps.bitstream_restriction_flag &&
                       !h->sps.num_reorder_frames))
                      s->low_delay = 1;
 -
                  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;
 -                        ff_dsputil_init(&s->dsp, s->avctx);
 -                    } else {
 -                        av_log(avctx, AV_LOG_ERROR,
 -                               "Unsupported bit depth: %d\n",
 -                               h->sps.bit_depth_luma);
 -                        buf_index = -1;
 -                        goto end;
 -                    }
 -                }
                  break;
              case NAL_PPS:
                  init_get_bits(&s->gb, ptr, bit_length);
@@@ -4496,15 -4477,15 +4502,15 @@@ static int decode_frame(AVCodecContext 
      MpegEncContext *s  = &h->s;
      AVFrame *pict      = data;
      int buf_index      = 0;
 +    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;
  
  
          return buf_index;
      }
 +    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;
 +        const 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);
          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 {
 +        /* Wait for second field. */
 +        *data_size = 0;
 +        if (h->next_output_pic && (h->next_output_pic->sync || h->sync>1)) {
              *data_size = sizeof(AVFrame);
              *pict      = h->next_output_pic->f;
          }
@@@ -4611,7 -4570,6 +4617,7 @@@ static av_cold int h264_decode_end(AVCo
      H264Context *h    = avctx->priv_data;
      MpegEncContext *s = &h->s;
  
 +    ff_h264_remove_all_refs(h);
      ff_h264_free_context(h);
  
      ff_MPV_common_end(s);
@@@ -4638,26 -4596,6 +4644,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
@@@ -4692,6 -4629,5 +4698,6 @@@ AVCodec ff_h264_vdpau_decoder = 
      .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.h
@@@ -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
   */
  
@@@ -46,8 -46,6 +46,8 @@@
  
  #define MAX_DELAYED_PIC_COUNT 16
  
 +#define MAX_MBPAIR_SIZE (256*1024) // a tighter bound could be calculated if someone cares about a few bytes
 +
  /* Compiling in interlaced support reduces the speed
   * of progressive decoding by about 2%. */
  #define ALLOW_INTERLACE
@@@ -87,7 -85,6 +87,7 @@@
  #define CABAC h->pps.cabac
  #endif
  
 +#define CHROMA    (h->sps.chroma_format_idc)
  #define CHROMA422 (h->sps.chroma_format_idc == 2)
  #define CHROMA444 (h->sps.chroma_format_idc == 3)
  
   */
  #define DELAYED_PIC_REF 4
  
 -#define QP_MAX_NUM (51 + 2*6)           // The maximum supported qp
 +#define QP_MAX_NUM (51 + 4*6)           // The maximum supported qp
  
  /* NAL unit types */
  enum {
@@@ -230,7 -227,7 +230,7 @@@ typedef struct PPS
      int transform_8x8_mode;     ///< transform_8x8_mode_flag
      uint8_t scaling_matrix4[6][16];
      uint8_t scaling_matrix8[6][64];
 -    uint8_t chroma_qp_table[2][64];  ///< pre-scaled (with chroma_qp_index_offset) version of qp_table
 +    uint8_t chroma_qp_table[2][QP_MAX_NUM+1];  ///< pre-scaled (with chroma_qp_index_offset) version of qp_table
      int chroma_qp_diff;
  }PPS;
  
@@@ -379,9 -376,9 +379,9 @@@ typedef struct H264Context
      /**
       * num_ref_idx_l0/1_active_minus1 + 1
       */
 +    uint8_t *list_counts;            ///< Array of list_count per MB specifying the slice type
      unsigned int ref_count[2];   ///< counts frames or fields, depending on current mb mode
      unsigned int list_count;
 -    uint8_t *list_counts;            ///< Array of list_count per MB specifying the slice type
      Picture ref_list[2][48];         /**< 0..15: frame refs, 16..47: mbaff field refs.
                                            Reordered version of default_ref_list
                                            according to picture reordering in slice header */
       * frames.
       */
      int sei_recovery_frame_cnt;
 +    /**
 +     * recovery_frame is the frame_num at which the next frame should
 +     * be fully constructed.
 +     *
 +     * Set to -1 when not expecting a recovery point.
 +     */
 +    int recovery_frame;
  
      int luma_weight_flag[2];   ///< 7.4.3.2 luma_weight_lX_flag
      int chroma_weight_flag[2]; ///< 7.4.3.2 chroma_weight_lX_flag
      int initial_cpb_removal_delay[32]; ///< Initial timestamps for CPBs
  
      int cur_chroma_format_idc;
 +
 +    int16_t slice_row[MAX_SLICES]; ///< to detect when MAX_SLICES is too low
 +
 +    int sync;                      ///< did we had a keyframe or recovery point
 +
 +    uint8_t parse_history[4];
 +    int parse_history_count;
 +    int parse_last_mb;
  }H264Context;
  
  
 -extern const uint8_t ff_h264_chroma_qp[3][QP_MAX_NUM+1]; ///< One chroma qp table for each supported bit depth (8, 9, 10).
 +extern const uint8_t ff_h264_chroma_qp[5][QP_MAX_NUM+1]; ///< One chroma qp table for each possible bit depth (8-12).
+ extern const uint16_t ff_h264_mb_sizes[4];
  
  /**
   * Decode SEI
@@@ -672,11 -655,14 +673,11 @@@ void ff_generate_sliding_window_mmcos(H
   */
  int ff_h264_check_intra4x4_pred_mode(H264Context *h);
  
 -/**
 - * Check if the top & left blocks are available if needed & change the dc mode so it only uses the available blocks.
 - */
  int ff_h264_check_intra_pred_mode(H264Context *h, int mode, int is_chroma);
  
  void ff_h264_hl_decode_mb(H264Context *h);
  int ff_h264_frame_start(H264Context *h);
 -int ff_h264_decode_extradata(H264Context *h);
 +int ff_h264_decode_extradata(H264Context *h, const uint8_t *buf, int size);
  av_cold int ff_h264_decode_init(AVCodecContext *avctx);
  av_cold void ff_h264_decode_init_vlc(void);
  
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 "config.h"
  #include "cabac.h"
@@@ -1631,6 -1630,7 +1631,6 @@@ decode_cabac_residual_internal(H264Cont
      cc.range     = h->cabac.range;
      cc.low       = h->cabac.low;
      cc.bytestream= h->cabac.bytestream;
 -    cc.bytestream_end = h->cabac.bytestream_end;
  #else
  #define CC &h->cabac
  #endif
          }
      }
  
 +
  #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       ;
@@@ -1984,8 -1983,8 +1984,8 @@@ decode_intra_mb
      h->slice_table[ mb_xy ]= h->slice_num;
  
      if(IS_INTRA_PCM(mb_type)) {
-         static const uint16_t mb_sizes[4] = {256,384,512,768};
-         const int mb_size = mb_sizes[h->sps.chroma_format_idc]*h->sps.bit_depth_luma >> 3;
+         const int mb_size = ff_h264_mb_sizes[h->sps.chroma_format_idc] *
+                             h->sps.bit_depth_luma >> 3;
          const uint8_t *ptr;
  
          // We assume these blocks are very rare so we do not optimize it.
diff --combined libavcodec/h264_cavlc.c
@@@ -2,20 -2,20 +2,20 @@@
   * H.26L/H.264/AVC/JVT/14496-10/... cavlc bitstream 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 0
 +#define UNCHECKED_BITSTREAM_READER 1
  
  #include "internal.h"
  #include "avcodec.h"
@@@ -765,8 -764,8 +765,8 @@@ decode_intra_mb
  
      if(IS_INTRA_PCM(mb_type)){
          unsigned int x;
-         static const uint16_t mb_sizes[4] = {256,384,512,768};
-         const int mb_size = mb_sizes[h->sps.chroma_format_idc]*h->sps.bit_depth_luma >> 3;
+         const int mb_size = ff_h264_mb_sizes[h->sps.chroma_format_idc] *
+                             h->sps.bit_depth_luma >> 3;
  
          // We assume these blocks are very rare so we do not optimize it.
          align_get_bits(&s->gb);
              if( decode_luma_residual(h, gb, scan, scan8x8, pixel_shift, mb_type, cbp, 2) < 0 ){
                  return -1;
              }
 -        } else if (CHROMA422) {
 +        } else {
 +            const int num_c8x8 = h->sps.chroma_format_idc;
 +
              if(cbp&0x30){
                  for(chroma_idx=0; chroma_idx<2; chroma_idx++)
                      if (decode_residual(h, gb, h->mb + ((256 + 16*16*chroma_idx) << pixel_shift),
 -                                        CHROMA_DC_BLOCK_INDEX+chroma_idx, chroma422_dc_scan,
 -                                        NULL, 8) < 0) {
 +                                        CHROMA_DC_BLOCK_INDEX+chroma_idx,
 +                                        CHROMA422 ? chroma422_dc_scan : chroma_dc_scan,
 +                                        NULL, 4*num_c8x8) < 0) {
                          return -1;
                      }
              }
                  for(chroma_idx=0; chroma_idx<2; chroma_idx++){
                      const uint32_t *qmul = h->dequant4_coeff[chroma_idx+1+(IS_INTRA( mb_type ) ? 0:3)][h->chroma_qp[chroma_idx]];
                      DCTELEM *mb = h->mb + (16*(16 + 16*chroma_idx) << pixel_shift);
 -                    for (i8x8 = 0; i8x8 < 2; i8x8++) {
 -                        for (i4x4 = 0; i4x4 < 4; i4x4++) {
 -                            const int index = 16 + 16*chroma_idx + 8*i8x8 + i4x4;
 +                    for (i8x8=0; i8x8<num_c8x8; i8x8++) {
 +                        for (i4x4=0; i4x4<4; i4x4++) {
 +                            const int index= 16 + 16*chroma_idx + 8*i8x8 + i4x4;
                              if (decode_residual(h, gb, mb, index, scan + 1, qmul, 15) < 0)
                                  return -1;
 -                            mb += 16 << pixel_shift;
 -                        }
 -                    }
 -                }
 -            }else{
 -                fill_rectangle(&h->non_zero_count_cache[scan8[16]], 4, 4, 8, 0, 1);
 -                fill_rectangle(&h->non_zero_count_cache[scan8[32]], 4, 4, 8, 0, 1);
 -            }
 -        } else /* yuv420 */ {
 -            if(cbp&0x30){
 -                for(chroma_idx=0; chroma_idx<2; chroma_idx++)
 -                    if( decode_residual(h, gb, h->mb + ((256 + 16*16*chroma_idx) << pixel_shift), CHROMA_DC_BLOCK_INDEX+chroma_idx, chroma_dc_scan, NULL, 4) < 0){
 -                        return -1;
 -                    }
 -            }
 -
 -            if(cbp&0x20){
 -                for(chroma_idx=0; chroma_idx<2; chroma_idx++){
 -                    const uint32_t *qmul = h->dequant4_coeff[chroma_idx+1+(IS_INTRA( mb_type ) ? 0:3)][h->chroma_qp[chroma_idx]];
 -                    for(i4x4=0; i4x4<4; i4x4++){
 -                        const int index= 16 + 16*chroma_idx + i4x4;
 -                        if( decode_residual(h, gb, h->mb + (16*index << pixel_shift), index, scan + 1, qmul, 15) < 0){
 -                            return -1;
 +                            mb += 16<<pixel_shift;
                          }
                      }
                  }
@@@ -3,23 -3,23 +3,23 @@@
   * Copyright (c) 2000, 2001 Fabrice Bellard
   * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
   *
 - * MMX optimization by Nick Kurshev <nickols_k@mail.ru>
 - *
 - * 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
 + *
 + * MMX optimization by Nick Kurshev <nickols_k@mail.ru>
   */
  
  #include "libavutil/cpu.h"
@@@ -31,7 -31,6 +31,7 @@@
  #include "libavcodec/ac3dec.h"
  #include "dsputil_mmx.h"
  #include "idct_xvid.h"
 +#include "diracdsp_mmx.h"
  
  //#undef NDEBUG
  //#include <assert.h>
@@@ -2109,84 -2108,6 +2109,84 @@@ void ff_avg_vc1_mspel_mc00_mmx2(uint8_
      avg_pixels8_mmx2(dst, src, stride, 8);
  }
  
 +/* only used in VP3/5/6 */
 +static void put_vp_no_rnd_pixels8_l2_mmx(uint8_t *dst, const uint8_t *a, const uint8_t *b, int stride, int h)
 +{
 +//    START_TIMER
 +    MOVQ_BFE(mm6);
 +    __asm__ volatile(
 +        "1:                             \n\t"
 +        "movq   (%1), %%mm0             \n\t"
 +        "movq   (%2), %%mm1             \n\t"
 +        "movq   (%1,%4), %%mm2          \n\t"
 +        "movq   (%2,%4), %%mm3          \n\t"
 +        PAVGBP_MMX_NO_RND(%%mm0, %%mm1, %%mm4,   %%mm2, %%mm3, %%mm5)
 +        "movq   %%mm4, (%3)             \n\t"
 +        "movq   %%mm5, (%3,%4)          \n\t"
 +
 +        "movq   (%1,%4,2), %%mm0        \n\t"
 +        "movq   (%2,%4,2), %%mm1        \n\t"
 +        "movq   (%1,%5), %%mm2          \n\t"
 +        "movq   (%2,%5), %%mm3          \n\t"
 +        "lea    (%1,%4,4), %1           \n\t"
 +        "lea    (%2,%4,4), %2           \n\t"
 +        PAVGBP_MMX_NO_RND(%%mm0, %%mm1, %%mm4,   %%mm2, %%mm3, %%mm5)
 +        "movq   %%mm4, (%3,%4,2)        \n\t"
 +        "movq   %%mm5, (%3,%5)          \n\t"
 +        "lea    (%3,%4,4), %3           \n\t"
 +        "subl   $4, %0                  \n\t"
 +        "jnz    1b                      \n\t"
 +        :"+r"(h), "+r"(a), "+r"(b), "+r"(dst)
 +        :"r"((x86_reg)stride), "r"((x86_reg)3L*stride)
 +        :"memory");
 +//    STOP_TIMER("put_vp_no_rnd_pixels8_l2_mmx")
 +}
 +static void put_vp_no_rnd_pixels16_l2_mmx(uint8_t *dst, const uint8_t *a, const uint8_t *b, int stride, int h)
 +{
 +    put_vp_no_rnd_pixels8_l2_mmx(dst, a, b, stride, h);
 +    put_vp_no_rnd_pixels8_l2_mmx(dst+8, a+8, b+8, stride, h);
 +}
 +
 +#if CONFIG_DIRAC_DECODER
 +#define DIRAC_PIXOP(OPNAME, EXT)\
 +void ff_ ## OPNAME ## _dirac_pixels8_ ## EXT(uint8_t *dst, const uint8_t *src[5], int stride, int h)\
 +{\
 +    OPNAME ## _pixels8_ ## EXT(dst, src[0], stride, h);\
 +}\
 +void ff_ ## OPNAME ## _dirac_pixels16_ ## EXT(uint8_t *dst, const uint8_t *src[5], int stride, int h)\
 +{\
 +    OPNAME ## _pixels16_ ## EXT(dst, src[0], stride, h);\
 +}\
 +void ff_ ## OPNAME ## _dirac_pixels32_ ## EXT(uint8_t *dst, const uint8_t *src[5], int stride, int h)\
 +{\
 +    OPNAME ## _pixels16_ ## EXT(dst   , src[0]   , stride, h);\
 +    OPNAME ## _pixels16_ ## EXT(dst+16, src[0]+16, stride, h);\
 +}
 +
 +DIRAC_PIXOP(put, mmx)
 +DIRAC_PIXOP(avg, mmx)
 +DIRAC_PIXOP(avg, mmx2)
 +
 +void ff_put_dirac_pixels16_sse2(uint8_t *dst, const uint8_t *src[5], int stride, int h)
 +{
 +    put_pixels16_sse2(dst, src[0], stride, h);
 +}
 +void ff_avg_dirac_pixels16_sse2(uint8_t *dst, const uint8_t *src[5], int stride, int h)
 +{
 +    avg_pixels16_sse2(dst, src[0], stride, h);
 +}
 +void ff_put_dirac_pixels32_sse2(uint8_t *dst, const uint8_t *src[5], int stride, int h)
 +{
 +    put_pixels16_sse2(dst   , src[0]   , stride, h);
 +    put_pixels16_sse2(dst+16, src[0]+16, stride, h);
 +}
 +void ff_avg_dirac_pixels32_sse2(uint8_t *dst, const uint8_t *src[5], int stride, int h)
 +{
 +    avg_pixels16_sse2(dst   , src[0]   , stride, h);
 +    avg_pixels16_sse2(dst+16, src[0]+16, stride, h);
 +}
 +#endif
 +
  /* XXX: Those functions should be suppressed ASAP when all IDCTs are
   * converted. */
  #if CONFIG_GPL
@@@ -2655,9 -2576,9 +2655,9 @@@ void ff_vp3_idct_put_sse2(uint8_t *dest
  void ff_vp3_idct_add_sse2(uint8_t *dest, int line_size, DCTELEM *block);
  
  int32_t ff_scalarproduct_int16_mmx2(const int16_t *v1, const int16_t *v2,
-                                     int len);
+                                     int order);
  int32_t ff_scalarproduct_int16_sse2(const int16_t *v1, const int16_t *v2,
-                                     int len);
+                                     int order);
  int32_t ff_scalarproduct_and_madd_int16_mmx2(int16_t *v1, const int16_t *v2,
                                               const int16_t *v3,
                                               int order, int mul);
@@@ -2785,9 -2706,6 +2785,9 @@@ static void dsputil_init_mmx(DSPContex
  
      c->add_bytes = add_bytes_mmx;
  
 +    c->put_no_rnd_pixels_l2[0]= put_vp_no_rnd_pixels16_l2_mmx;
 +    c->put_no_rnd_pixels_l2[1]= put_vp_no_rnd_pixels8_l2_mmx;
 +
      if (CONFIG_H263_DECODER || CONFIG_H263_ENCODER) {
          c->h263_v_loop_filter = h263_v_loop_filter_mmx;
          c->h263_h_loop_filter = h263_h_loop_filter_mmx;
@@@ -3,25 -3,25 +3,25 @@@
  ;* Copyright (c) 2010 Ronald S. Bultje <rsbultje@gmail.com>
  ;* Copyright (c) 2010 Jason Garrett-Glaser <darkshikari@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
  ;******************************************************************************
  
 -%include "x86inc.asm"
 -%include "x86util.asm"
 +%include "libavutil/x86/x86inc.asm"
 +%include "libavutil/x86/x86util.asm"
  
  SECTION_RODATA
  
@@@ -144,6 -144,8 +144,8 @@@ filter_h6_shuf1: db 0, 5, 1, 6, 2, 7, 3
  filter_h6_shuf2: db 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,  7, 7,  8,  8,  9
  filter_h6_shuf3: db 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8,  9, 9, 10, 10, 11
  
+ pw_256:  times 8 dw 256
  pw_20091: times 4 dw 20091
  pw_17734: times 4 dw 17734
  
@@@ -205,8 -207,7 +207,7 @@@ cglobal put_vp8_epel%1_h6, 6, 6 + npicr
      pmaddubsw m2, m7
      paddsw    m0, m1
      paddsw    m0, m2
-     paddsw    m0, [pw_64]
-     psraw     m0, 7
+     pmulhrsw  m0, [pw_256]
      packuswb  m0, m0
      movh  [dstq], m0        ; store
  
  
  cglobal put_vp8_epel%1_h4, 6, 6 + npicregs, 7, dst, dststride, src, srcstride, height, mx, picreg
      shl      mxd, 4
-     mova      m2, [pw_64]
+     mova      m2, [pw_256]
      mova      m3, [filter_h2_shuf]
      mova      m4, [filter_h4_shuf]
  %ifdef PIC
      pshufb    m1, m4
      pmaddubsw m0, m5
      pmaddubsw m1, m6
-     paddsw    m0, m2
      paddsw    m0, m1
-     psraw     m0, 7
+     pmulhrsw  m0, m2
      packuswb  m0, m0
      movh  [dstq], m0        ; store
  
@@@ -255,7 -255,7 +255,7 @@@ cglobal put_vp8_epel%1_v4, 7, 7, 8, dst
  %endif
      mova      m5, [fourtap_filter_hb+myq-16]
      mova      m6, [fourtap_filter_hb+myq]
-     mova      m7, [pw_64]
+     mova      m7, [pw_256]
  
      ; read 3 lines
      sub     srcq, srcstrideq
      pmaddubsw m2, m6
      paddsw    m4, m2
      mova      m2, m3
-     paddsw    m4, m7
-     psraw     m4, 7
+     pmulhrsw  m4, m7
      packuswb  m4, m4
      movh  [dstq], m4
  
@@@ -319,9 -318,8 +318,8 @@@ cglobal put_vp8_epel%1_v6, 7, 7, 8, dst
      paddsw    m6, m1
      paddsw    m6, m7
      mova      m1, m2
-     paddsw    m6, [pw_64]
      mova      m2, m3
-     psraw     m6, 7
+     pmulhrsw  m6, [pw_256]
      mova      m3, m4
      packuswb  m6, m6
      mova      m4, m5
diff --combined libavfilter/vf_unsharp.c
@@@ -3,26 -3,26 +3,26 @@@
   * Port copyright (c) 2010 Daniel G. Taylor <dan@programmer-art.org>
   * Relicensed to the LGPL with permission from Remi Guyomarch.
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
  /**
   * @file
 - * blur / sharpen filter, ported to Libav from MPlayer
 + * blur / sharpen filter, ported to FFmpeg from MPlayer
   * libmpcodecs/unsharp.c.
   *
   * This code is based on:
@@@ -73,7 -73,7 +73,7 @@@ static void apply_unsharp(      uint8_
  
      int32_t res;
      int x, y, z;
 -    const uint8_t *src2;
 +    const uint8_t *src2 = NULL;  //silence a warning
  
      if (!fp->amount) {
          if (dst_stride == src_stride)
              }
              if (x >= fp->steps_x && y >= fp->steps_y) {
                  const uint8_t *srx = src - fp->steps_y * src_stride + x - fp->steps_x;
-                 uint8_t       *dsx = dst - fp->steps_y * dst_stride + x - fp->steps_x;
+                 uint8_t *dsx       = dst - fp->steps_y * dst_stride + x - fp->steps_x;
  
                  res = (int32_t)*srx + ((((int32_t) * srx - (int32_t)((tmp1 + fp->halfscale) >> fp->scalebits)) * fp->amount) >> 16);
                  *dsx = av_clip_uint8(res);
@@@ -162,7 -162,7 +162,7 @@@ static int query_formats(AVFilterContex
          PIX_FMT_YUVJ444P, PIX_FMT_YUVJ440P, PIX_FMT_NONE
      };
  
 -    avfilter_set_common_formats(ctx, avfilter_make_format_list(pix_fmts));
 +    avfilter_set_common_pixel_formats(ctx, avfilter_make_format_list(pix_fmts));
  
      return 0;
  }
@@@ -242,7 -242,7 +242,7 @@@ AVFilter avfilter_vf_unsharp = 
      .uninit = uninit,
      .query_formats = query_formats,
  
 -    .inputs    = (AVFilterPad[]) {{ .name             = "default",
 +    .inputs    = (const AVFilterPad[]) {{ .name       = "default",
                                      .type             = AVMEDIA_TYPE_VIDEO,
                                      .draw_slice       = draw_slice,
                                      .end_frame        = end_frame,
                                      .min_perms        = AV_PERM_READ, },
                                    { .name = NULL}},
  
 -    .outputs   = (AVFilterPad[]) {{ .name             = "default",
 +    .outputs   = (const AVFilterPad[]) {{ .name       = "default",
                                      .type             = AVMEDIA_TYPE_VIDEO, },
                                    { .name = NULL}},
  };
diff --combined libswscale/input.c
@@@ -1,20 -1,20 +1,20 @@@
  /*
 - * Copyright (C) 2001-2003 Michael Niedermayer <michaelni@gmx.at>
 + * Copyright (C) 2001-2012 Michael Niedermayer <michaelni@gmx.at>
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
  #define b ((origin == PIX_FMT_BGR48BE || origin == PIX_FMT_BGR48LE) ? r_b : b_r)
  
  static av_always_inline void
 +rgb64ToY_c_template(uint16_t *dst, const uint16_t *src, int width,
 +                    enum PixelFormat origin)
 +{
 +    int i;
 +    for (i = 0; i < width; i++) {
 +        unsigned int r_b = input_pixel(&src[i*4+0]);
 +        unsigned int   g = input_pixel(&src[i*4+1]);
 +        unsigned int b_r = input_pixel(&src[i*4+2]);
 +
 +        dst[i] = (RY*r + GY*g + BY*b + (0x2001<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
 +    }
 +}
 +
 +static av_always_inline void
 +rgb64ToUV_c_template(uint16_t *dstU, uint16_t *dstV,
 +                    const uint16_t *src1, const uint16_t *src2,
 +                    int width, enum PixelFormat origin)
 +{
 +    int i;
 +    assert(src1==src2);
 +    for (i = 0; i < width; i++) {
 +        int r_b = input_pixel(&src1[i*4+0]);
 +        int   g = input_pixel(&src1[i*4+1]);
 +        int b_r = input_pixel(&src1[i*4+2]);
 +
 +        dstU[i] = (RU*r + GU*g + BU*b + (0x10001<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
 +        dstV[i] = (RV*r + GV*g + BV*b + (0x10001<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
 +    }
 +}
 +
 +static av_always_inline void
 +rgb64ToUV_half_c_template(uint16_t *dstU, uint16_t *dstV,
 +                          const uint16_t *src1, const uint16_t *src2,
 +                          int width, enum PixelFormat origin)
 +{
 +    int i;
 +    assert(src1==src2);
 +    for (i = 0; i < width; i++) {
 +        int r_b = (input_pixel(&src1[8 * i + 0]) + input_pixel(&src1[8 * i + 4]) + 1) >> 1;
 +        int   g = (input_pixel(&src1[8 * i + 1]) + input_pixel(&src1[8 * i + 5]) + 1) >> 1;
 +        int b_r = (input_pixel(&src1[8 * i + 2]) + input_pixel(&src1[8 * i + 6]) + 1) >> 1;
 +
 +        dstU[i]= (RU*r + GU*g + BU*b + (0x10001<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
 +        dstV[i]= (RV*r + GV*g + BV*b + (0x10001<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
 +    }
 +}
 +
 +#define rgb64funcs(pattern, BE_LE, origin) \
 +static void pattern ## 64 ## BE_LE ## ToY_c(uint8_t *_dst, const uint8_t *_src, const uint8_t *unused0, const uint8_t *unused1,\
 +                                    int width, uint32_t *unused) \
 +{ \
 +    const uint16_t *src = (const uint16_t *) _src; \
 +    uint16_t *dst = (uint16_t *) _dst; \
 +    rgb64ToY_c_template(dst, src, width, origin); \
 +} \
 + \
 +static void pattern ## 64 ## BE_LE ## ToUV_c(uint8_t *_dstU, uint8_t *_dstV, \
 +                                    const uint8_t *unused0, const uint8_t *_src1, const uint8_t *_src2, \
 +                                    int width, uint32_t *unused) \
 +{ \
 +    const uint16_t *src1 = (const uint16_t *) _src1, \
 +                   *src2 = (const uint16_t *) _src2; \
 +    uint16_t *dstU = (uint16_t *) _dstU, *dstV = (uint16_t *) _dstV; \
 +    rgb64ToUV_c_template(dstU, dstV, src1, src2, width, origin); \
 +} \
 + \
 +static void pattern ## 64 ## BE_LE ## ToUV_half_c(uint8_t *_dstU, uint8_t *_dstV, \
 +                                    const uint8_t *unused0, const uint8_t *_src1, const uint8_t *_src2, \
 +                                    int width, uint32_t *unused) \
 +{ \
 +    const uint16_t *src1 = (const uint16_t *) _src1, \
 +                   *src2 = (const uint16_t *) _src2; \
 +    uint16_t *dstU = (uint16_t *) _dstU, *dstV = (uint16_t *) _dstV; \
 +    rgb64ToUV_half_c_template(dstU, dstV, src1, src2, width, origin); \
 +}
 +
 +rgb64funcs(rgb, LE, PIX_FMT_RGBA64LE)
 +rgb64funcs(rgb, BE, PIX_FMT_RGBA64BE)
 +
 +static av_always_inline void
  rgb48ToY_c_template(uint16_t *dst, const uint16_t *src, int width,
                      enum PixelFormat origin)
  {
@@@ -184,7 -104,7 +184,7 @@@ rgb48ToUV_half_c_template(uint16_t *dst
  #undef input_pixel
  
  #define rgb48funcs(pattern, BE_LE, origin) \
 -static void pattern ## 48 ## BE_LE ## ToY_c(uint8_t *_dst, const uint8_t *_src, \
 +static void pattern ## 48 ## BE_LE ## ToY_c(uint8_t *_dst, const uint8_t *_src, const uint8_t *unused0, const uint8_t *unused1,\
                                      int width, uint32_t *unused) \
  { \
      const uint16_t *src = (const uint16_t *) _src; \
  } \
   \
  static void pattern ## 48 ## BE_LE ## ToUV_c(uint8_t *_dstU, uint8_t *_dstV, \
 -                                    const uint8_t *_src1, const uint8_t *_src2, \
 +                                    const uint8_t *unused0, const uint8_t *_src1, const uint8_t *_src2, \
                                      int width, uint32_t *unused) \
  { \
      const uint16_t *src1 = (const uint16_t *) _src1, \
  } \
   \
  static void pattern ## 48 ## BE_LE ## ToUV_half_c(uint8_t *_dstU, uint8_t *_dstV, \
 -                                    const uint8_t *_src1, const uint8_t *_src2, \
 +                                    const uint8_t *unused0, const uint8_t *_src1, const uint8_t *_src2, \
                                      int width, uint32_t *unused) \
  { \
      const uint16_t *src1 = (const uint16_t *) _src1, \
@@@ -222,14 -142,14 +222,14 @@@ rgb48funcs(bgr, BE, PIX_FMT_BGR48BE
                          (isBE(origin) ? AV_RB16(&src[(i)*2]) : AV_RL16(&src[(i)*2])))
  
  static av_always_inline void
 -rgb16_32ToY_c_template(uint8_t *dst, const uint8_t *src,
 +rgb16_32ToY_c_template(int16_t *dst, const uint8_t *src,
                         int width, enum PixelFormat origin,
                         int shr,   int shg,   int shb, int shp,
                         int maskr, int maskg, int maskb,
                         int rsh,   int gsh,   int bsh, int S)
  {
      const int ry = RY << rsh, gy = GY << gsh, by = BY << bsh;
 -    const unsigned rnd = 33u << (S - 1);
 +    const unsigned rnd = (32<<((S)-1)) + (1<<(S-7));
      int i;
  
      for (i = 0; i < width; i++) {
          int g = (px & maskg) >> shg;
          int r = (px & maskr) >> shr;
  
 -        dst[i] = (ry * r + gy * g + by * b + rnd) >> S;
 +        dst[i] = (ry * r + gy * g + by * b + rnd) >> ((S)-6);
      }
  }
  
  static av_always_inline void
 -rgb16_32ToUV_c_template(uint8_t *dstU, uint8_t *dstV,
 +rgb16_32ToUV_c_template(int16_t *dstU, int16_t *dstV,
                          const uint8_t *src, int width,
                          enum PixelFormat origin,
                          int shr,   int shg,   int shb, int shp,
  {
      const int ru = RU << rsh, gu = GU << gsh, bu = BU << bsh,
                rv = RV << rsh, gv = GV << gsh, bv = BV << bsh;
 -    const unsigned rnd = 257u << (S - 1);
 +    const unsigned rnd = (256u<<((S)-1)) + (1<<(S-7));
      int i;
  
      for (i = 0; i < width; i++) {
          int g = (px & maskg) >> shg;
          int r = (px & maskr) >> shr;
  
 -        dstU[i] = (ru * r + gu * g + bu * b + rnd) >> S;
 -        dstV[i] = (rv * r + gv * g + bv * b + rnd) >> S;
 +        dstU[i] = (ru * r + gu * g + bu * b + rnd) >> ((S)-6);
 +        dstV[i] = (rv * r + gv * g + bv * b + rnd) >> ((S)-6);
      }
  }
  
  static av_always_inline void
 -rgb16_32ToUV_half_c_template(uint8_t *dstU, uint8_t *dstV,
 +rgb16_32ToUV_half_c_template(int16_t *dstU, int16_t *dstV,
                               const uint8_t *src, int width,
                               enum PixelFormat origin,
                               int shr,   int shg,   int shb, int shp,
      const int ru = RU << rsh, gu = GU << gsh, bu = BU << bsh,
                rv = RV << rsh, gv = GV << gsh, bv = BV << bsh,
                maskgx = ~(maskr | maskb);
 -    const unsigned rnd = 257u << S;
 +    const unsigned rnd = (256U<<(S)) + (1<<(S-6));
      int i;
  
      maskr |= maskr << 1; maskb |= maskb << 1; maskg |= maskg << 1;
          }
          r = (rb & maskr) >> shr;
  
 -        dstU[i] = (ru * r + gu * g + bu * b + rnd) >> (S + 1);
 -        dstV[i] = (rv * r + gv * g + bv * b + rnd) >> (S + 1);
 +        dstU[i] = (ru * r + gu * g + bu * b + (unsigned)rnd) >> ((S)-6+1);
 +        dstV[i] = (rv * r + gv * g + bv * b + (unsigned)rnd) >> ((S)-6+1);
      }
  }
  
  
  #define rgb16_32_wrapper(fmt, name, shr, shg, shb, shp, maskr, \
                           maskg, maskb, rsh, gsh, bsh, S) \
 -static void name ## ToY_c(uint8_t *dst, const uint8_t *src, \
 +static void name ## ToY_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, \
                            int width, uint32_t *unused) \
  { \
 -    rgb16_32ToY_c_template(dst, src, width, fmt, shr, shg, shb, shp, \
 +    rgb16_32ToY_c_template((int16_t*)dst, src, width, fmt, \
 +                           shr, shg, shb, shp, \
                             maskr, maskg, maskb, rsh, gsh, bsh, S); \
  } \
   \
  static void name ## ToUV_c(uint8_t *dstU, uint8_t *dstV, \
 -                           const uint8_t *src, const uint8_t *dummy, \
 +                           const uint8_t *unused0, const uint8_t *src, const uint8_t *dummy, \
                             int width, uint32_t *unused) \
  { \
 -    rgb16_32ToUV_c_template(dstU, dstV, src, width, fmt, shr, shg, shb, shp, \
 +    rgb16_32ToUV_c_template((int16_t*)dstU, (int16_t*)dstV, src, width, fmt,  \
 +                            shr, shg, shb, shp, \
                              maskr, maskg, maskb, rsh, gsh, bsh, S); \
  } \
   \
  static void name ## ToUV_half_c(uint8_t *dstU, uint8_t *dstV, \
 -                                const uint8_t *src, const uint8_t *dummy, \
 +                                const uint8_t *unused0, const uint8_t *src, const uint8_t *dummy, \
                                  int width, uint32_t *unused) \
  { \
 -    rgb16_32ToUV_half_c_template(dstU, dstV, src, width, fmt, shr, shg, shb, shp, \
 +    rgb16_32ToUV_half_c_template((int16_t*)dstU, (int16_t*)dstV, src, width, fmt, \
 +                                 shr, shg, shb, shp, \
                                   maskr, maskg, maskb, rsh, gsh, bsh, S); \
  }
  
@@@ -348,23 -265,15 +348,23 @@@ rgb16_32_wrapper(PIX_FMT_RGB565BE, rgb1
  rgb16_32_wrapper(PIX_FMT_RGB555BE, rgb15be, 0, 0,  0, 0,   0x7C00, 0x03E0,   0x001F,  0, 5, 10, RGB2YUV_SHIFT+7)
  rgb16_32_wrapper(PIX_FMT_RGB444BE, rgb12be, 0, 0,  0, 0,   0x0F00, 0x00F0,   0x000F,  0, 4,  8, RGB2YUV_SHIFT+4)
  
 -static void abgrToA_c(uint8_t *dst, const uint8_t *src, int width, uint32_t *unused)
 +static void gbr24pToUV_half_c(uint16_t *dstU, uint16_t *dstV,
 +                         const uint8_t *gsrc, const uint8_t *bsrc, const uint8_t *rsrc,
 +                         int width, enum PixelFormat origin)
  {
      int i;
      for (i=0; i<width; i++) {
 -        dst[i]= src[4*i];
 +        unsigned int g   = gsrc[2*i] + gsrc[2*i+1];
 +        unsigned int b   = bsrc[2*i] + bsrc[2*i+1];
 +        unsigned int r   = rsrc[2*i] + rsrc[2*i+1];
 +
 +        dstU[i] = (RU*r + GU*g + BU*b + (0x4001<<(RGB2YUV_SHIFT-6))) >> (RGB2YUV_SHIFT-6+1);
 +        dstV[i] = (RV*r + GV*g + BV*b + (0x4001<<(RGB2YUV_SHIFT-6))) >> (RGB2YUV_SHIFT-6+1);
      }
  }
  
 -static void rgbaToA_c(uint8_t *dst, const uint8_t *src, int width, uint32_t *unused)
 +static void rgba64ToA_c(int16_t *dst, const uint16_t *src, const uint8_t *unused1,
 +                        const uint8_t *unused2, int width, uint32_t *unused)
  {
      int i;
      for (i=0; i<width; i++) {
      }
  }
  
 -static void palToY_c(uint8_t *dst, const uint8_t *src, int width, uint32_t *pal)
 +static void abgrToA_c(int16_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width, uint32_t *unused)
 +{
 +    int i;
 +    for (i=0; i<width; i++) {
 +        dst[i]= src[4*i]<<6;
 +    }
 +}
 +
 +static void rgbaToA_c(int16_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width, uint32_t *unused)
 +{
 +    int i;
 +    for (i=0; i<width; i++) {
 +        dst[i]= src[4*i+3]<<6;
 +    }
 +}
 +
 +static void palToA_c(int16_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width, uint32_t *pal)
  {
      int i;
      for (i=0; i<width; i++) {
          int d= src[i];
  
 -        dst[i]= pal[d] & 0xFF;
 +        dst[i]= (pal[d] >> 24)<<6;
      }
  }
  
 -static void palToUV_c(uint8_t *dstU, uint8_t *dstV,
 -                      const uint8_t *src1, const uint8_t *src2,
 +static void palToY_c(int16_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, long width, uint32_t *pal)
 +{
 +    int i;
 +    for (i=0; i<width; i++) {
 +        int d= src[i];
 +
 +        dst[i]= (pal[d] & 0xFF)<<6;
 +    }
 +}
 +
 +static void palToUV_c(uint16_t *dstU, int16_t *dstV,
 +                           const uint8_t *unused0, const uint8_t *src1, const uint8_t *src2,
                        int width, uint32_t *pal)
  {
      int i;
      for (i=0; i<width; i++) {
          int p= pal[src1[i]];
  
 -        dstU[i]= p>>8;
 -        dstV[i]= p>>16;
 +        dstU[i]= (uint8_t)(p>> 8)<<6;
 +        dstV[i]= (uint8_t)(p>>16)<<6;
      }
  }
  
 -static void monowhite2Y_c(uint8_t *dst, const uint8_t *src,
 -                          int width, uint32_t *unused)
 +static void monowhite2Y_c(int16_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2,  int width, uint32_t *unused)
  {
      int i, j;
-     for (i=0; i<width/8; i++) {
+     width = (width + 7) >> 3;
+     for (i = 0; i < width; i++) {
          int d= ~src[i];
          for(j=0; j<8; j++)
 -            dst[8*i+j]= ((d>>(7-j))&1)*255;
 +            dst[8*i+j]= ((d>>(7-j))&1)*16383;
 +    }
 +    if(width&7){
 +        int d= ~src[i];
 +        for(j=0; j<(width&7); j++)
 +            dst[8*i+j]= ((d>>(7-j))&1)*16383;
      }
  }
  
 -static void monoblack2Y_c(uint8_t *dst, const uint8_t *src,
 -                          int width, uint32_t *unused)
 +static void monoblack2Y_c(int16_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2,  int width, uint32_t *unused)
  {
      int i, j;
-     for (i=0; i<width/8; i++) {
+     width = (width + 7) >> 3;
+     for (i = 0; i < width; i++) {
          int d= src[i];
          for(j=0; j<8; j++)
 -            dst[8*i+j]= ((d>>(7-j))&1)*255;
 +            dst[8*i+j]= ((d>>(7-j))&1)*16383;
 +    }
 +    if(width&7){
 +        int d= src[i];
 +        for(j=0; j<(width&7); j++)
 +            dst[8*i+j]= ((d>>(7-j))&1)*16383;
      }
  }
  
 -static void yuy2ToY_c(uint8_t *dst, const uint8_t *src, int width,
 +static void yuy2ToY_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2,  int width,
                        uint32_t *unused)
  {
      int i;
          dst[i]= src[2*i];
  }
  
 -static void yuy2ToUV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *src1,
 +static void yuy2ToUV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *unused0, const uint8_t *src1,
                         const uint8_t *src2, int width, uint32_t *unused)
  {
      int i;
      assert(src1 == src2);
  }
  
 -static void bswap16Y_c(uint8_t *_dst, const uint8_t *_src, int width, uint32_t *unused)
 +static void bswap16Y_c(uint8_t *_dst, const uint8_t *_src, const uint8_t *unused1, const uint8_t *unused2,  int width, uint32_t *unused)
  {
      int i;
      const uint16_t *src = (const uint16_t *) _src;
      }
  }
  
 -static void bswap16UV_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *_src1,
 +static void bswap16UV_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *unused0, const uint8_t *_src1,
                          const uint8_t *_src2, int width, uint32_t *unused)
  {
      int i;
  
  /* This is almost identical to the previous, end exists only because
   * yuy2ToY/UV)(dst, src+1, ...) would have 100% unaligned accesses. */
 -static void uyvyToY_c(uint8_t *dst, const uint8_t *src, int width,
 +static void uyvyToY_c(uint8_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2,  int width,
                        uint32_t *unused)
  {
      int i;
          dst[i]= src[2*i+1];
  }
  
 -static void uyvyToUV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *src1,
 +static void uyvyToUV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *unused0, const uint8_t *src1,
                         const uint8_t *src2, int width, uint32_t *unused)
  {
      int i;
@@@ -526,14 -403,14 +528,14 @@@ static av_always_inline void nvXXtoUV_c
  }
  
  static void nv12ToUV_c(uint8_t *dstU, uint8_t *dstV,
 -                       const uint8_t *src1, const uint8_t *src2,
 +                       const uint8_t *unused0, const uint8_t *src1, const uint8_t *src2,
                         int width, uint32_t *unused)
  {
      nvXXtoUV_c(dstU, dstV, src1, width);
  }
  
  static void nv21ToUV_c(uint8_t *dstU, uint8_t *dstV,
 -                       const uint8_t *src1, const uint8_t *src2,
 +                       const uint8_t *unused0, const uint8_t *src1, const uint8_t *src2,
                         int width, uint32_t *unused)
  {
      nvXXtoUV_c(dstV, dstU, src1, width);
  
  #define input_pixel(pos) (isBE(origin) ? AV_RB16(pos) : AV_RL16(pos))
  
 -static void bgr24ToY_c(uint8_t *dst, const uint8_t *src,
 +static void bgr24ToY_c(int16_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2,
                         int width, uint32_t *unused)
  {
      int i;
          int g= src[i*3+1];
          int r= src[i*3+2];
  
 -        dst[i]= ((RY*r + GY*g + BY*b + (33<<(RGB2YUV_SHIFT-1)))>>RGB2YUV_SHIFT);
 +        dst[i]= ((RY*r + GY*g + BY*b + (32<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6));
      }
  }
  
 -static void bgr24ToUV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *src1,
 +static void bgr24ToUV_c(int16_t *dstU, int16_t *dstV, const uint8_t *unused0, const uint8_t *src1,
                          const uint8_t *src2, int width, uint32_t *unused)
  {
      int i;
          int g= src1[3*i + 1];
          int r= src1[3*i + 2];
  
 -        dstU[i]= (RU*r + GU*g + BU*b + (257<<(RGB2YUV_SHIFT-1)))>>RGB2YUV_SHIFT;
 -        dstV[i]= (RV*r + GV*g + BV*b + (257<<(RGB2YUV_SHIFT-1)))>>RGB2YUV_SHIFT;
 +        dstU[i]= (RU*r + GU*g + BU*b + (256<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6);
 +        dstV[i]= (RV*r + GV*g + BV*b + (256<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6);
      }
      assert(src1 == src2);
  }
  
 -static void bgr24ToUV_half_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *src1,
 +static void bgr24ToUV_half_c(int16_t *dstU, int16_t *dstV, const uint8_t *unused0, const uint8_t *src1,
                               const uint8_t *src2, int width, uint32_t *unused)
  {
      int i;
          int g= src1[6*i + 1] + src1[6*i + 4];
          int r= src1[6*i + 2] + src1[6*i + 5];
  
 -        dstU[i]= (RU*r + GU*g + BU*b + (257<<RGB2YUV_SHIFT))>>(RGB2YUV_SHIFT+1);
 -        dstV[i]= (RV*r + GV*g + BV*b + (257<<RGB2YUV_SHIFT))>>(RGB2YUV_SHIFT+1);
 +        dstU[i]= (RU*r + GU*g + BU*b + (256<<RGB2YUV_SHIFT) + (1<<(RGB2YUV_SHIFT-6)))>>(RGB2YUV_SHIFT-5);
 +        dstV[i]= (RV*r + GV*g + BV*b + (256<<RGB2YUV_SHIFT) + (1<<(RGB2YUV_SHIFT-6)))>>(RGB2YUV_SHIFT-5);
      }
      assert(src1 == src2);
  }
  
 -static void rgb24ToY_c(uint8_t *dst, const uint8_t *src, int width,
 +static void rgb24ToY_c(int16_t *dst, const uint8_t *src, const uint8_t *unused1, const uint8_t *unused2, int width,
                         uint32_t *unused)
  {
      int i;
          int g= src[i*3+1];
          int b= src[i*3+2];
  
 -        dst[i]= ((RY*r + GY*g + BY*b + (33<<(RGB2YUV_SHIFT-1)))>>RGB2YUV_SHIFT);
 +        dst[i]= ((RY*r + GY*g + BY*b + (32<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6));
      }
  }
  
 -static void rgb24ToUV_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *src1,
 +static void rgb24ToUV_c(int16_t *dstU, int16_t *dstV, const uint8_t *unused0, const uint8_t *src1,
                          const uint8_t *src2, int width, uint32_t *unused)
  {
      int i;
          int g= src1[3*i + 1];
          int b= src1[3*i + 2];
  
 -        dstU[i]= (RU*r + GU*g + BU*b + (257<<(RGB2YUV_SHIFT-1)))>>RGB2YUV_SHIFT;
 -        dstV[i]= (RV*r + GV*g + BV*b + (257<<(RGB2YUV_SHIFT-1)))>>RGB2YUV_SHIFT;
 +        dstU[i]= (RU*r + GU*g + BU*b + (256<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6);
 +        dstV[i]= (RV*r + GV*g + BV*b + (256<<(RGB2YUV_SHIFT-1)) + (1<<(RGB2YUV_SHIFT-7)))>>(RGB2YUV_SHIFT-6);
      }
  }
  
 -static void rgb24ToUV_half_c(uint8_t *dstU, uint8_t *dstV, const uint8_t *src1,
 +static void rgb24ToUV_half_c(int16_t *dstU, int16_t *dstV, const uint8_t *unused0, const uint8_t *src1,
                               const uint8_t *src2, int width, uint32_t *unused)
  {
      int i;
          int g= src1[6*i + 1] + src1[6*i + 4];
          int b= src1[6*i + 2] + src1[6*i + 5];
  
 -        dstU[i]= (RU*r + GU*g + BU*b + (257<<RGB2YUV_SHIFT))>>(RGB2YUV_SHIFT+1);
 -        dstV[i]= (RV*r + GV*g + BV*b + (257<<RGB2YUV_SHIFT))>>(RGB2YUV_SHIFT+1);
 +        dstU[i]= (RU*r + GU*g + BU*b + (256<<RGB2YUV_SHIFT) + (1<<(RGB2YUV_SHIFT-6)))>>(RGB2YUV_SHIFT-5);
 +        dstV[i]= (RV*r + GV*g + BV*b + (256<<RGB2YUV_SHIFT) + (1<<(RGB2YUV_SHIFT-6)))>>(RGB2YUV_SHIFT-5);
      }
  }
  
 -static void planar_rgb_to_y(uint8_t *dst, const uint8_t *src[4], int width)
 +static void planar_rgb_to_y(uint16_t *dst, const uint8_t *src[4], int width)
  {
      int i;
      for (i = 0; i < width; i++) {
          int b = src[1][i];
          int r = src[2][i];
  
 -        dst[i] = ((RY * r + GY * g + BY * b + (33 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT);
 +        dst[i] = (RY*r + GY*g + BY*b + (0x801<<(RGB2YUV_SHIFT-7))) >> (RGB2YUV_SHIFT-6);
      }
  }
  
@@@ -667,7 -544,7 +669,7 @@@ static void planar_rgb16be_to_y(uint8_
      }
  }
  
 -static void planar_rgb_to_uv(uint8_t *dstU, uint8_t *dstV, const uint8_t *src[4], int width)
 +static void planar_rgb_to_uv(uint16_t *dstU, uint16_t *dstV, const uint8_t *src[4], int width)
  {
      int i;
      for (i = 0; i < width; i++) {
          int b = src[1][i];
          int r = src[2][i];
  
 -        dstU[i] = (RU * r + GU * g + BU * b + (257 << RGB2YUV_SHIFT)) >> (RGB2YUV_SHIFT + 1);
 -        dstV[i] = (RV * r + GV * g + BV * b + (257 << RGB2YUV_SHIFT)) >> (RGB2YUV_SHIFT + 1);
 +        dstU[i] = (RU*r + GU*g + BU*b + (0x4001<<(RGB2YUV_SHIFT-7))) >> (RGB2YUV_SHIFT-6);
 +        dstV[i] = (RV*r + GV*g + BV*b + (0x4001<<(RGB2YUV_SHIFT-7))) >> (RGB2YUV_SHIFT-6);
      }
  }
  
@@@ -758,8 -635,6 +760,8 @@@ av_cold void ff_sws_init_input_funcs(Sw
      }
      if (c->chrSrcHSubSample) {
          switch(srcFormat) {
 +        case PIX_FMT_RGBA64BE: c->chrToYV12 = rgb64BEToUV_half_c; break;
 +        case PIX_FMT_RGBA64LE: c->chrToYV12 = rgb64LEToUV_half_c; break;
          case PIX_FMT_RGB48BE : c->chrToYV12 = rgb48BEToUV_half_c; break;
          case PIX_FMT_RGB48LE : c->chrToYV12 = rgb48LEToUV_half_c; break;
          case PIX_FMT_BGR48BE : c->chrToYV12 = bgr48BEToUV_half_c; break;
          case PIX_FMT_RGB565BE: c->chrToYV12 = rgb16beToUV_half_c; break;
          case PIX_FMT_RGB555LE: c->chrToYV12 = rgb15leToUV_half_c; break;
          case PIX_FMT_RGB555BE: c->chrToYV12 = rgb15beToUV_half_c; break;
 +        case PIX_FMT_GBR24P  : c->chrToYV12 = gbr24pToUV_half_c;  break;
          case PIX_FMT_RGB444LE: c->chrToYV12 = rgb12leToUV_half_c; break;
          case PIX_FMT_RGB444BE: c->chrToYV12 = rgb12beToUV_half_c; break;
          }
      } else {
          switch(srcFormat) {
 +        case PIX_FMT_RGBA64BE: c->chrToYV12 = rgb64BEToUV_c; break;
 +        case PIX_FMT_RGBA64LE: c->chrToYV12 = rgb64LEToUV_c; break;
          case PIX_FMT_RGB48BE : c->chrToYV12 = rgb48BEToUV_c; break;
          case PIX_FMT_RGB48LE : c->chrToYV12 = rgb48LEToUV_c; break;
          case PIX_FMT_BGR48BE : c->chrToYV12 = bgr48BEToUV_c; break;
      case PIX_FMT_RGB48LE: c->lumToYV12 = rgb48LEToY_c; break;
      case PIX_FMT_BGR48BE: c->lumToYV12 = bgr48BEToY_c; break;
      case PIX_FMT_BGR48LE: c->lumToYV12 = bgr48LEToY_c; break;
 +    case PIX_FMT_RGBA64BE:c->lumToYV12 = rgb64BEToY_c; break;
 +    case PIX_FMT_RGBA64LE:c->lumToYV12 = rgb64LEToY_c; break;
      }
      if (c->alpPixBuf) {
          switch (srcFormat) {
 +        case PIX_FMT_RGBA64LE:
 +        case PIX_FMT_RGBA64BE:  c->alpToYV12 = rgba64ToA_c; break;
          case PIX_FMT_BGRA:
          case PIX_FMT_RGBA:  c->alpToYV12 = rgbaToA_c; break;
          case PIX_FMT_ABGR:
          case PIX_FMT_ARGB:  c->alpToYV12 = abgrToA_c; break;
          case PIX_FMT_Y400A: c->alpToYV12 = uyvyToY_c; break;
 +        case PIX_FMT_PAL8 : c->alpToYV12 = palToA_c; break;
          }
      }
  }
diff --combined libswscale/output.c
@@@ -1,20 -1,20 +1,20 @@@
  /*
 - * Copyright (C) 2001-2003 Michael Niedermayer <michaelni@gmx.at>
 + * Copyright (C) 2001-2012 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
   */
  
@@@ -25,7 -25,6 +25,7 @@@
  #include <string.h>
  
  #include "libavutil/avutil.h"
 +#include "libavutil/avassert.h"
  #include "libavutil/bswap.h"
  #include "libavutil/cpu.h"
  #include "libavutil/intreadwrite.h"
@@@ -136,8 -135,7 +136,8 @@@ yuv2plane1_16_c_template(const int32_t 
                           int big_endian, int output_bits)
  {
      int i;
 -    int shift = 19 - output_bits;
 +    int shift = 3;
 +    av_assert0(output_bits == 16);
  
      for (i = 0; i < dstW; i++) {
          int val = src[i] + (1 << (shift - 1));
@@@ -151,11 -149,10 +151,11 @@@ yuv2planeX_16_c_template(const int16_t 
                           int big_endian, int output_bits)
  {
      int i;
 -    int shift = 15 + 16 - output_bits;
 +    int shift = 15;
 +    av_assert0(output_bits == 16);
  
      for (i = 0; i < dstW; i++) {
 -        int val = 1 << (30-output_bits);
 +        int val = 1 << (shift - 1);
          int j;
  
          /* range of val is [0,0x7FFFFFFF], so 31 bits, but with lanczos/spline
@@@ -202,7 -199,7 +202,7 @@@ yuv2planeX_10_c_template(const int16_t 
      int shift = 11 + 16 - output_bits;
  
      for (i = 0; i < dstW; i++) {
 -        int val = 1 << (26-output_bits);
 +        int val = 1 << (shift - 1);
          int j;
  
          for (j = 0; j < filterSize; j++)
@@@ -320,7 -317,7 +320,7 @@@ yuv2mono_X_c_template(SwsContext *c, co
      int i;
      unsigned acc = 0;
  
-     for (i = 0; i < dstW - 1; i += 2) {
+     for (i = 0; i < dstW; i += 2) {
          int j;
          int Y1 = 1 << 18;
          int Y2 = 1 << 18;
              output_pixel(*dest++, acc);
          }
      }
+     if (i & 6) {
+         output_pixel(*dest, acc);
+     }
  }
  
  static av_always_inline void
@@@ -355,7 -356,7 +359,7 @@@ yuv2mono_2_c_template(SwsContext *c, co
      int  yalpha1 = 4095 - yalpha;
      int i;
  
-     for (i = 0; i < dstW - 7; i += 8) {
+     for (i = 0; i < dstW; i += 8) {
          int Y, acc = 0;
  
          Y = (buf0[i + 0] * yalpha1 + buf1[i + 0] * yalpha) >> 19;
@@@ -388,17 -389,17 +392,17 @@@ yuv2mono_1_c_template(SwsContext *c, co
      const uint8_t * const d128 = dither_8x8_220[y & 7];
      int i;
  
-     for (i = 0; i < dstW - 7; i += 8) {
+     for (i = 0; i < dstW; i += 8) {
          int acc = 0;
  
 -        accumulate_bit(acc, (buf0[i + 0] >> 7) + d128[0]);
 -        accumulate_bit(acc, (buf0[i + 1] >> 7) + d128[1]);
 -        accumulate_bit(acc, (buf0[i + 2] >> 7) + d128[2]);
 -        accumulate_bit(acc, (buf0[i + 3] >> 7) + d128[3]);
 -        accumulate_bit(acc, (buf0[i + 4] >> 7) + d128[4]);
 -        accumulate_bit(acc, (buf0[i + 5] >> 7) + d128[5]);
 -        accumulate_bit(acc, (buf0[i + 6] >> 7) + d128[6]);
 -        accumulate_bit(acc, (buf0[i + 7] >> 7) + d128[7]);
 +        accumulate_bit(acc, ((buf0[i + 0] + 64) >> 7) + d128[0]);
 +        accumulate_bit(acc, ((buf0[i + 1] + 64) >> 7) + d128[1]);
 +        accumulate_bit(acc, ((buf0[i + 2] + 64) >> 7) + d128[2]);
 +        accumulate_bit(acc, ((buf0[i + 3] + 64) >> 7) + d128[3]);
 +        accumulate_bit(acc, ((buf0[i + 4] + 64) >> 7) + d128[4]);
 +        accumulate_bit(acc, ((buf0[i + 5] + 64) >> 7) + d128[5]);
 +        accumulate_bit(acc, ((buf0[i + 6] + 64) >> 7) + d128[6]);
 +        accumulate_bit(acc, ((buf0[i + 7] + 64) >> 7) + d128[7]);
  
          output_pixel(*dest++, acc);
      }
@@@ -514,12 -515,10 +518,12 @@@ yuv2422_2_c_template(SwsContext *c, con
          int U  = (ubuf0[i]        * uvalpha1 + ubuf1[i]        * uvalpha) >> 19;
          int V  = (vbuf0[i]        * uvalpha1 + vbuf1[i]        * uvalpha) >> 19;
  
 -        Y1 = av_clip_uint8(Y1);
 -        Y2 = av_clip_uint8(Y2);
 -        U  = av_clip_uint8(U);
 -        V  = av_clip_uint8(V);
 +        if ((Y1 | Y2 | U | V) & 0x100) {
 +            Y1 = av_clip_uint8(Y1);
 +            Y2 = av_clip_uint8(Y2);
 +            U  = av_clip_uint8(U);
 +            V  = av_clip_uint8(V);
 +        }
  
          output_pixels(i * 4, Y1, U, Y2, V);
      }
@@@ -536,17 -535,10 +540,17 @@@ yuv2422_1_c_template(SwsContext *c, con
  
      if (uvalpha < 2048) {
          for (i = 0; i < (dstW >> 1); i++) {
 -            int Y1 = buf0[i * 2]     >> 7;
 -            int Y2 = buf0[i * 2 + 1] >> 7;
 -            int U  = ubuf0[i]        >> 7;
 -            int V  = vbuf0[i]        >> 7;
 +            int Y1 = (buf0[i * 2    ]+64) >> 7;
 +            int Y2 = (buf0[i * 2 + 1]+64) >> 7;
 +            int U  = (ubuf0[i]       +64) >> 7;
 +            int V  = (vbuf0[i]       +64) >> 7;
 +
 +            if ((Y1 | Y2 | U | V) & 0x100) {
 +                Y1 = av_clip_uint8(Y1);
 +                Y2 = av_clip_uint8(Y2);
 +                U  = av_clip_uint8(U);
 +                V  = av_clip_uint8(V);
 +            }
  
              Y1 = av_clip_uint8(Y1);
              Y2 = av_clip_uint8(Y2);
      } else {
          const int16_t *ubuf1 = ubuf[1], *vbuf1 = vbuf[1];
          for (i = 0; i < (dstW >> 1); i++) {
 -            int Y1 =  buf0[i * 2]          >> 7;
 -            int Y2 =  buf0[i * 2 + 1]      >> 7;
 -            int U  = (ubuf0[i] + ubuf1[i]) >> 8;
 -            int V  = (vbuf0[i] + vbuf1[i]) >> 8;
 +            int Y1 = (buf0[i * 2    ]    + 64) >> 7;
 +            int Y2 = (buf0[i * 2 + 1]    + 64) >> 7;
 +            int U  = (ubuf0[i] + ubuf1[i]+128) >> 8;
 +            int V  = (vbuf0[i] + vbuf1[i]+128) >> 8;
 +
 +            if ((Y1 | Y2 | U | V) & 0x100) {
 +                Y1 = av_clip_uint8(Y1);
 +                Y2 = av_clip_uint8(Y2);
 +                U  = av_clip_uint8(U);
 +                V  = av_clip_uint8(V);
 +            }
  
              Y1 = av_clip_uint8(Y1);
              Y2 = av_clip_uint8(Y2);
@@@ -826,7 -811,7 +830,7 @@@ YUV2PACKED16WRAPPER(yuv2, rgb48, bgr48l
   * correct RGB values into the destination buffer.
   */
  static av_always_inline void
 -yuv2rgb_write(uint8_t *_dest, int i, unsigned Y1, unsigned Y2,
 +yuv2rgb_write(uint8_t *_dest, int i, int Y1, int Y2,
                unsigned A1, unsigned A2,
                const void *_r, const void *_g, const void *_b, int y,
                enum PixelFormat target, int hasAlpha)
  
  #define r_b ((target == PIX_FMT_RGB24) ? r : b)
  #define b_r ((target == PIX_FMT_RGB24) ? b : r)
 +
          dest[i * 6 + 0] = r_b[Y1];
          dest[i * 6 + 1] =   g[Y1];
          dest[i * 6 + 2] = b_r[Y1];
@@@ -968,6 -952,12 +972,6 @@@ yuv2rgb_X_c_template(SwsContext *c, con
          Y2 >>= 19;
          U  >>= 19;
          V  >>= 19;
 -        if ((Y1 | Y2 | U | V) & 0x100) {
 -            Y1 = av_clip_uint8(Y1);
 -            Y2 = av_clip_uint8(Y2);
 -            U  = av_clip_uint8(U);
 -            V  = av_clip_uint8(V);
 -        }
          if (hasAlpha) {
              A1 = 1 << 18;
              A2 = 1 << 18;
              }
          }
  
 -        /* FIXME fix tables so that clipping is not needed and then use _NOCLIP*/
 -        r =  c->table_rV[V];
 -        g = (c->table_gU[U] + c->table_gV[V]);
 -        b =  c->table_bU[U];
 +        r =  c->table_rV[V + YUVRGB_TABLE_HEADROOM];
 +        g = (c->table_gU[U + YUVRGB_TABLE_HEADROOM] + c->table_gV[V + YUVRGB_TABLE_HEADROOM]);
 +        b =  c->table_bU[U + YUVRGB_TABLE_HEADROOM];
  
          yuv2rgb_write(dest, i, Y1, Y2, hasAlpha ? A1 : 0, hasAlpha ? A2 : 0,
                        r, g, b, y, target, hasAlpha);
@@@ -1014,9 -1005,9 +1018,9 @@@ yuv2rgb_2_c_template(SwsContext *c, con
          int U  = (ubuf0[i]        * uvalpha1 + ubuf1[i]        * uvalpha) >> 19;
          int V  = (vbuf0[i]        * uvalpha1 + vbuf1[i]        * uvalpha) >> 19;
          int A1, A2;
 -        const void *r =  c->table_rV[V],
 -                   *g = (c->table_gU[U] + c->table_gV[V]),
 -                   *b =  c->table_bU[U];
 +        const void *r =  c->table_rV[V + YUVRGB_TABLE_HEADROOM],
 +                   *g = (c->table_gU[U + YUVRGB_TABLE_HEADROOM] + c->table_gV[V + YUVRGB_TABLE_HEADROOM]),
 +                   *b =  c->table_bU[U + YUVRGB_TABLE_HEADROOM];
  
          Y1 = av_clip_uint8(Y1);
          Y2 = av_clip_uint8(Y2);
@@@ -1047,14 -1038,14 +1051,14 @@@ yuv2rgb_1_c_template(SwsContext *c, con
  
      if (uvalpha < 2048) {
          for (i = 0; i < (dstW >> 1); i++) {
 -            int Y1 = buf0[i * 2]     >> 7;
 -            int Y2 = buf0[i * 2 + 1] >> 7;
 -            int U  = ubuf0[i]        >> 7;
 -            int V  = vbuf0[i]        >> 7;
 +            int Y1 = (buf0[i * 2    ] + 64) >> 7;
 +            int Y2 = (buf0[i * 2 + 1] + 64) >> 7;
 +            int U  = (ubuf0[i]        + 64) >> 7;
 +            int V  = (vbuf0[i]        + 64) >> 7;
              int A1, A2;
 -            const void *r =  c->table_rV[V],
 -                       *g = (c->table_gU[U] + c->table_gV[V]),
 -                       *b =  c->table_bU[U];
 +            const void *r =  c->table_rV[V + YUVRGB_TABLE_HEADROOM],
 +                       *g = (c->table_gU[U + YUVRGB_TABLE_HEADROOM] + c->table_gV[V + YUVRGB_TABLE_HEADROOM]),
 +                       *b =  c->table_bU[U + YUVRGB_TABLE_HEADROOM];
  
              Y1 = av_clip_uint8(Y1);
              Y2 = av_clip_uint8(Y2);
              V  = av_clip_uint8(V);
  
              if (hasAlpha) {
 -                A1 = abuf0[i * 2    ] >> 7;
 -                A2 = abuf0[i * 2 + 1] >> 7;
 +                A1 = abuf0[i * 2    ] * 255 + 16384 >> 15;
 +                A2 = abuf0[i * 2 + 1] * 255 + 16384 >> 15;
                  A1 = av_clip_uint8(A1);
                  A2 = av_clip_uint8(A2);
              }
      } else {
          const int16_t *ubuf1 = ubuf[1], *vbuf1 = vbuf[1];
          for (i = 0; i < (dstW >> 1); i++) {
 -            int Y1 =  buf0[i * 2]          >> 7;
 -            int Y2 =  buf0[i * 2 + 1]      >> 7;
 -            int U  = (ubuf0[i] + ubuf1[i]) >> 8;
 -            int V  = (vbuf0[i] + vbuf1[i]) >> 8;
 +            int Y1 = (buf0[i * 2    ]     +  64) >> 7;
 +            int Y2 = (buf0[i * 2 + 1]     +  64) >> 7;
 +            int U  = (ubuf0[i] + ubuf1[i] + 128) >> 8;
 +            int V  = (vbuf0[i] + vbuf1[i] + 128) >> 8;
              int A1, A2;
 -            const void *r =  c->table_rV[V],
 -                       *g = (c->table_gU[U] + c->table_gV[V]),
 -                       *b =  c->table_bU[U];
 +            const void *r =  c->table_rV[V + YUVRGB_TABLE_HEADROOM],
 +                       *g = (c->table_gU[U + YUVRGB_TABLE_HEADROOM] + c->table_gV[V + YUVRGB_TABLE_HEADROOM]),
 +                       *b =  c->table_bU[U + YUVRGB_TABLE_HEADROOM];
  
              Y1 = av_clip_uint8(Y1);
              Y2 = av_clip_uint8(Y2);
              V  = av_clip_uint8(V);
  
              if (hasAlpha) {
 -                A1 = abuf0[i * 2    ] >> 7;
 -                A2 = abuf0[i * 2 + 1] >> 7;
 +                A1 = (abuf0[i * 2    ] + 64) >> 7;
 +                A2 = (abuf0[i * 2 + 1] + 64) >> 7;
                  A1 = av_clip_uint8(A1);
                  A2 = av_clip_uint8(A2);
              }
@@@ -1166,9 -1157,9 +1170,9 @@@ yuv2rgb_full_X_c_template(SwsContext *c
  
      for (i = 0; i < dstW; i++) {
          int j;
 -        int Y = 0;
 -        int U = -128 << 19;
 -        int V = -128 << 19;
 +        int Y = 1<<9;
 +        int U = (1<<9)-(128 << 19);
 +        int V = (1<<9)-(128 << 19);
          int R, G, B, A;
  
          for (j = 0; j < lumFilterSize; j++) {
          U >>= 10;
          V >>= 10;
          if (hasAlpha) {
 -            A = 1 << 21;
 +            A = 1 << 18;
              for (j = 0; j < lumFilterSize; j++) {
                  A += alpSrc[j][i] * lumFilter[j];
              }
              dest[1] = B >> 22;
              dest[2] = G >> 22;
              dest[3] = R >> 22;
 -            dest += 4;
              break;
          case PIX_FMT_BGR24:
              dest[0] = B >> 22;
@@@ -1355,10 -1347,7 +1359,10 @@@ void ff_sws_init_output_funcs(SwsContex
              *yuv2packedX = yuv2bgr24_full_X_c;
              break;
          }
 +        if(!*yuv2packedX)
 +            goto YUV_PACKED;
      } else {
 +        YUV_PACKED:
          switch (dstFormat) {
          case PIX_FMT_RGB48LE:
              *yuv2packed1 = yuv2rgb48le_1_c;
diff --combined tests/Makefile
@@@ -1,18 -1,9 +1,18 @@@
 +FFSERVER_REFFILE = $(SRC_PATH)/tests/ffserver.regression.ref
 +
  AREF = fate-acodec-aref
  VREF = fate-vsynth1-vref fate-vsynth2-vref
  REFS = $(AREF) $(VREF)
  
 -$(VREF): avconv$(EXESUF) tests/vsynth1/00.pgm tests/vsynth2/00.pgm
 -$(AREF): avconv$(EXESUF) tests/data/asynth1.sw
 +$(VREF): ffmpeg$(EXESUF) tests/vsynth1/00.pgm tests/vsynth2/00.pgm
 +$(AREF): ffmpeg$(EXESUF) tests/data/asynth1.sw
 +
 +ffservertest: ffserver$(EXESUF) tests/vsynth1/00.pgm tests/data/asynth1.sw
 +      @echo
 +      @echo "Unfortunately ffserver is broken and therefore its regression"
 +      @echo "test fails randomly. Treat the results accordingly."
 +      @echo
 +      $(SRC_PATH)/tests/ffserver-regression.sh $(FFSERVER_REFFILE) $(SRC_PATH)/tests/ffserver.conf
  
  OBJDIRS += tests/data tests/vsynth1 tests/vsynth2
  
@@@ -28,15 -19,7 +28,15 @@@ tests/data/asynth1.sw: tests/audiogen$(
  tests/data/asynth-16000-1.sw: tests/audiogen$(HOSTEXESUF) | tests/data
        $(M)./$< $@ 16000 1
  
 -tests/data/asynth%.sw tests/vsynth%/00.pgm: TAG = GEN
 +tests/data/mapchan-6ch.sw: tests/audiogen$(HOSTEXESUF)
 +      @mkdir -p tests/data
 +      $(M)./$< $@ 22050 6
 +
 +tests/data/mapchan-mono.sw: tests/audiogen$(HOSTEXESUF)
 +      @mkdir -p tests/data
 +      $(M)./$< $@ 22050 1
 +
 +tests/data/%.sw tests/vsynth%/00.pgm: TAG = GEN
  
  include $(SRC_PATH)/tests/fate/aac.mak
  include $(SRC_PATH)/tests/fate/ac3.mak
@@@ -46,6 -29,7 +46,7 @@@ include $(SRC_PATH)/tests/fate/amrnb.ma
  include $(SRC_PATH)/tests/fate/amrwb.mak
  include $(SRC_PATH)/tests/fate/atrac.mak
  include $(SRC_PATH)/tests/fate/audio.mak
+ include $(SRC_PATH)/tests/fate/bmp.mak
  include $(SRC_PATH)/tests/fate/cdxl.mak
  include $(SRC_PATH)/tests/fate/dct.mak
  include $(SRC_PATH)/tests/fate/demux.mak
@@@ -58,7 -42,6 +59,7 @@@ include $(SRC_PATH)/tests/fate/image.ma
  include $(SRC_PATH)/tests/fate/indeo.mak
  include $(SRC_PATH)/tests/fate/libavcodec.mak
  include $(SRC_PATH)/tests/fate/libavutil.mak
 +include $(SRC_PATH)/tests/fate/mapchan.mak
  include $(SRC_PATH)/tests/fate/lossless-audio.mak
  include $(SRC_PATH)/tests/fate/lossless-video.mak
  include $(SRC_PATH)/tests/fate/microsoft.mak
@@@ -83,7 -66,6 +84,7 @@@ FATE_ACODEC  = $(ACODEC_TESTS:%=fate-ac
  FATE_VSYNTH1 = $(VCODEC_TESTS:%=fate-vsynth1-%)
  FATE_VSYNTH2 = $(VCODEC_TESTS:%=fate-vsynth2-%)
  FATE_VCODEC  = $(FATE_VSYNTH1) $(FATE_VSYNTH2)
 +FATE_LAVF_FATE = $(LAVF_FATE_TESTS:%=fate-lavf-fate-%)
  FATE_LAVF    = $(LAVF_TESTS:%=fate-lavf-%)
  FATE_LAVFI   = $(LAVFI_TESTS:%=fate-lavfi-%)
  FATE_SEEK    = $(SEEK_TESTS:seek_%=fate-seek-%)
@@@ -107,7 -89,6 +108,7 @@@ $(FATE_SEEK):   fate-codec fate-lavf li
  $(FATE_ACODEC):  CMD = codectest acodec
  $(FATE_VSYNTH1): CMD = codectest vsynth1
  $(FATE_VSYNTH2): CMD = codectest vsynth2
 +$(FATE_LAVF_FATE): CMD = lavffatetest
  $(FATE_LAVF):    CMD = lavftest
  $(FATE_LAVFI):   CMD = lavfitest
  $(FATE_SEEK):    CMD = seektest
  fate-codec:  fate-acodec fate-vcodec
  fate-acodec: $(FATE_ACODEC)
  fate-vcodec: $(FATE_VCODEC)
 +fate-lavf-fate: $(FATE_LAVF_FATE)
  fate-lavf:   $(FATE_LAVF)
  fate-lavfi:  $(FATE_LAVFI)
  fate-seek:   $(FATE_SEEK)
  
  ifdef SAMPLES
 +FATE += $(FATE_LAVF_FATE)
  FATE += $(FATE_TESTS) $(FATE_TESTS-yes)
  fate-rsync:
 -      rsync -vaLW rsync://fate-suite.libav.org/fate-suite/ $(SAMPLES)
 +      rsync -vaLW --timeout=60 --contimeout=60 rsync://fate.ffmpeg.org/fate-suite/ $(SAMPLES)
  else
 +fate::
 +      @echo "warning: only a subset of the fate tests will be run because SAMPLES is not specified"
  fate-rsync:
        @echo "use 'make fate-rsync SAMPLES=/path/to/samples' to sync the fate suite"
  $(FATE_TESTS):
@@@ -136,11 -113,9 +137,11 @@@ endi
  
  FATE_UTILS = base64 tiny_psnr
  
 -fate: $(FATE)
 +TOOL = ffmpeg
 +
 +fate:: $(FATE)
  
 -$(FATE): avconv$(EXESUF) $(FATE_UTILS:%=tests/%$(HOSTEXESUF))
 +$(FATE): $(TOOL)$(EXESUF) $(FATE_UTILS:%=tests/%$(HOSTEXESUF))
        @echo "TEST    $(@:fate-%=%)"
        $(Q)$(SRC_PATH)/tests/fate-run.sh $@ "$(SAMPLES)" "$(TARGET_EXEC)" "$(TARGET_PATH)" '$(CMD)' '$(CMP)' '$(REF)' '$(FUZZ)' '$(THREADS)' '$(THREAD_TYPE)' '$(CPUFLAGS)' '$(CMP_SHIFT)' '$(CMP_TARGET)' '$(SIZE_TOLERANCE)'
  
@@@ -150,7 -125,7 +151,7 @@@ fate-list
  clean:: testclean
  
  testclean:
 -      $(RM) -r tests/vsynth1 tests/vsynth2 tests/data
 +      $(RM) -r tests/vsynth1 tests/vsynth2 tests/data tools/lavfi-showfiltfmts$(EXESUF)
        $(RM) $(CLEANSUFFIXES:%=tests/%)
        $(RM) $(TESTTOOLS:%=tests/%$(HOSTEXESUF))