Merge remote-tracking branch 'qatar/release/0.8' into release/0.10
authorMichael Niedermayer <michaelni@gmx.at>
Fri, 16 Mar 2012 06:47:27 +0000 (07:47 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Fri, 16 Mar 2012 08:01:08 +0000 (09:01 +0100)
* qatar/release/0.8: (154 commits)
  Update Changelog for the 0.8.1 Release
  dca: include libavutil/mathematics.h for possibly missing M_SQRT1_2
  dca: don't use av_clip_uintp2().
  snow: check reference frame indices.
  snow: reject unsupported chroma shifts.
  xa_adpcm: limit filter to prevent xa_adpcm_table[] array bounds overruns.
  h264: increase reference poc list from 16 to 32.
  h264: stricter reference limit enforcement.
  h264: improve parsing of broken AVC SPS
  Replace computations of remaining bits with calls to get_bits_left().
  png: convert to bytestream2 API.
  roqvideo: convert to bytestream2 API.
  smc: port to bytestream2 API.
  tgq: convert to bytestream2 API.
  algmm: convert to bytestream2 API.
  jvdec: unbreak video decoding
  h264: Fix invalid interlaced/progressive MB combinations for direct mode prediction.
  libx264: add 'stats' private option for setting 2pass stats filename.
  libx264: fix help text for slice-max-size option.
  avconv: reindent
  ...

Conflicts:
Changelog
RELEASE
avconv.c
doc/APIchanges
ffplay.c
libavcodec/Makefile
libavcodec/aacdec.c
libavcodec/alsdec.c
libavcodec/atrac3.c
libavcodec/avcodec.h
libavcodec/dvdata.c
libavcodec/fraps.c
libavcodec/golomb.h
libavcodec/h264.c
libavcodec/h264.h
libavcodec/h264_cabac.c
libavcodec/h264_cavlc.c
libavcodec/h264_direct.c
libavcodec/h264_parser.c
libavcodec/h264_ps.c
libavcodec/h264idct_template.c
libavcodec/indeo3.c
libavcodec/kgv1dec.c
libavcodec/kmvc.c
libavcodec/mjpegbdec.c
libavcodec/mmvideo.c
libavcodec/mpegaudiodec.c
libavcodec/mpegvideo.h
libavcodec/options.c
libavcodec/pngdec.c
libavcodec/roqvideodec.c
libavcodec/shorten.c
libavcodec/svq3.c
libavcodec/utils.c
libavcodec/version.h
libavcodec/wmadec.c
libavcodec/xxan.c
libavformat/Makefile
libavformat/asfdec.c
libavformat/dv.c
libavformat/mov.c
libavformat/nsvdec.c
libavformat/utils.c
libavformat/version.h
libavutil/avutil.h
libavutil/error.c
libavutil/error.h
libswscale/swscale.c
libswscale/utils.c
libswscale/x86/swscale_template.c
tests/ref/acodec/g722

Merged-by: Michael Niedermayer <michaelni@gmx.at>
125 files changed:
1  2 
Changelog
RELEASE
doc/APIchanges
ffmpeg.c
libavcodec/Makefile
libavcodec/aacdec.c
libavcodec/ac3_parser.c
libavcodec/ac3dec.c
libavcodec/ac3dsp.c
libavcodec/ac3tab.c
libavcodec/ac3tab.h
libavcodec/adpcm.c
libavcodec/amrnbdec.c
libavcodec/amrwbdec.c
libavcodec/atrac3.c
libavcodec/avcodec.h
libavcodec/cavsdec.c
libavcodec/cook.c
libavcodec/cookdata.h
libavcodec/cscd.c
libavcodec/dca.c
libavcodec/dcadata.h
libavcodec/dpcm.c
libavcodec/dsicinav.c
libavcodec/dsputil.c
libavcodec/eatgq.c
libavcodec/error_resilience.c
libavcodec/escape124.c
libavcodec/flacdec.c
libavcodec/fraps.c
libavcodec/get_bits.h
libavcodec/golomb.h
libavcodec/h261dec.c
libavcodec/h263dec.c
libavcodec/h264.c
libavcodec/h264.h
libavcodec/h264_cabac.c
libavcodec/h264_cavlc.c
libavcodec/h264_direct.c
libavcodec/h264_ps.c
libavcodec/h264_sei.c
libavcodec/h264idct_template.c
libavcodec/huffyuv.c
libavcodec/indeo3.c
libavcodec/ituh263dec.c
libavcodec/jvdec.c
libavcodec/kgv1dec.c
libavcodec/kmvc.c
libavcodec/lcldec.c
libavcodec/libx264.c
libavcodec/mjpegbdec.c
libavcodec/mjpegdec.c
libavcodec/mmvideo.c
libavcodec/mpc.c
libavcodec/mpc7.c
libavcodec/mpcdata.h
libavcodec/mpeg12data.c
libavcodec/mpegaudiodec.c
libavcodec/options.c
libavcodec/pcm-mpeg.c
libavcodec/png.h
libavcodec/pngdec.c
libavcodec/qtrle.c
libavcodec/rawdec.c
libavcodec/roqvideo.h
libavcodec/roqvideodec.c
libavcodec/rpza.c
libavcodec/rv10.c
libavcodec/rv34.c
libavcodec/shorten.c
libavcodec/simple_idct.c
libavcodec/smacker.c
libavcodec/smc.c
libavcodec/snowdec.c
libavcodec/svq3.c
libavcodec/tiff.c
libavcodec/truemotion2.c
libavcodec/tta.c
libavcodec/utils.c
libavcodec/vc1.h
libavcodec/vc1_parser.c
libavcodec/vc1dec.c
libavcodec/vc1dsp.c
libavcodec/version.h
libavcodec/vmnc.c
libavcodec/vorbis.c
libavcodec/vorbisdec.c
libavcodec/vp3dsp.c
libavcodec/vp5.c
libavcodec/vp6.c
libavcodec/vp8dsp.c
libavcodec/wma.h
libavcodec/wmadec.c
libavcodec/wmaenc.c
libavcodec/x86/ac3dsp.asm
libavcodec/x86/h264_deblock_10bit.asm
libavcodec/xxan.c
libavformat/Makefile
libavformat/aiffdec.c
libavformat/asfdec.c
libavformat/avformat.h
libavformat/dv.c
libavformat/isom.c
libavformat/matroskadec.c
libavformat/mov.c
libavformat/mpegts.c
libavformat/nsvdec.c
libavformat/omadec.c
libavformat/rmdec.c
libavformat/smacker.c
libavformat/swfdec.c
libavformat/utils.c
libavformat/version.h
libavutil/Makefile
libavutil/avutil.h
libavutil/error.c
libavutil/error.h
libswscale/ppc/swscale_altivec.c
libswscale/swscale.c
libswscale/swscale_internal.h
libswscale/utils.c
libswscale/x86/scale.asm
libswscale/x86/swscale_mmx.c
libswscale/x86/swscale_template.c
tests/ref/acodec/g722

diff --cc Changelog
+++ b/Changelog
@@@ -1,54 -1,58 +1,85 @@@
  Entries are sorted chronologically from oldest to youngest within each release,
  releases are sorted from youngest to oldest.
  
 -version 0.8.1:
 +version next:
 +
++version 0.10.1
+ - Several bugs and crashes have been fixed in the following codecs: AAC,
+   AC-3, ADPCM, AMR (both NB and WB), ATRAC3, CAVC, Cook, camstudio, DCA,
+   DPCM, DSI CIN, DV, EA TGQ, FLAC, fraps, G.722 (both encoder and
+   decoder), H.264, huvffyuv, BB JV decoder, Indeo 3, KGV1, LCL, the
+   libx264 wrapper, MJPEG, mp3on4, Musepack, MPEG1/2, PNG, QDM2, Qt RLE,
+   ROQ, RV10, RV30/RV34/RV40, shorten, smacker, subrip, SVQ3, TIFF,
+   Truemotion2, TTA, VC1, VMware Screen codec, Vorbis, VP5, VP6, WMA,
+   Westwood SNDx, XXAN.
+ - This release additionally updates the following codecs to the
+   bytestream2 API, and therefore benefit from additional overflow
+   checks: XXAN, ALG MM, TQG, SMC, Qt SMC, ROQ, PNG
+ - Several bugs and crashes have been fixed in the following formats:
+   AIFF, ASF, DV, Matroska, NSV, MOV, MPEG-TS, Smacker, Sony OpenMG, RM,
+   SWF.
+ - Libswscale has an potential overflow for large image size fixed.
+ - The following APIs have been added:
+   avcodec_is_open()
+   avformat_get_riff_video_tags()
+   avformat_get_riff_audio_tags()
+   Please see the file doc/APIchanges and the Doxygen documentation for
+   further information.
 -version 0.8:
 -
 +version 0.10:
 +- Fixes: CVE-2011-3929, CVE-2011-3934, CVE-2011-3935, CVE-2011-3936,
 +         CVE-2011-3937, CVE-2011-3940, CVE-2011-3941, CVE-2011-3944,
 +         CVE-2011-3945, CVE-2011-3946, CVE-2011-3947, CVE-2011-3949,
 +         CVE-2011-3950, CVE-2011-3951, CVE-2011-3952
 +- v410 Quicktime Uncompressed 4:4:4 10-bit encoder and decoder
 +- SBaGen (SBG) binaural beats script demuxer
 +- OpenMG Audio muxer
 +- Timecode extraction in DV and MOV
 +- thumbnail video filter
 +- XML output in ffprobe
 +- asplit audio filter
 +- tinterlace video filter
 +- astreamsync audio filter
 +- amerge audio filter
 +- ISMV (Smooth Streaming) muxer
  - GSM audio parser
  - SMJPEG muxer
 -
 -
 -version 0.8_beta2:
 -
 +- XWD encoder and decoder
  - Automatic thread count based on detection number of (available) CPU cores
 -- Deprecate libpostproc. If desired, the switch --enable-postproc will
 -  enable it but it may be removed in a later Libav release.
 +- y41p Brooktree Uncompressed 4:1:1 12-bit encoder and decoder
 +- ffprobe -show_error option
 +- Avid 1:1 10-bit RGB Packer codec
 +- v308 Quicktime Uncompressed 4:4:4 encoder and decoder
 +- yuv4 libquicktime packed 4:2:0 encoder and decoder
 +- ffprobe -show_frames option
 +- silencedetect audio filter
 +- ffprobe -show_program_version, -show_library_versions, -show_versions options
  - rv34: frame-level multi-threading
  - optimized iMDCT transform on x86 using SSE for for mpegaudiodec
 +- Improved PGS subtitle decoder
 +- dumpgraph option to lavfi device
 +- r210 and r10k encoders
 +- ffwavesynth decoder
 +- aviocat tool
 +- ffeval tool
  
  
 -version 0.8_beta1:
 +version 0.9:
  
 +- openal input device added
 +- boxblur filter added
  - BWF muxer
  - Flash Screen Video 2 decoder
 -- ffplay/ffprobe/ffserver renamed to avplay/avprobe/avserver
 -- ffmpeg deprecated, added avconv, which is almost the same for now, except
 +- lavfi input device added
 +- added avconv, which is almost the same for now, except
  for a few incompatible changes in the options, which will hopefully make them
  easier to use. The changes are:
      * The options placement is now strictly enforced! While in theory the
diff --cc RELEASE
+++ b/RELEASE
@@@ -1,1 -1,1 +1,1 @@@
- 0.10
 -0.8.1
++0.10.1
diff --cc doc/APIchanges
@@@ -13,15 -13,19 +13,28 @@@ libavutil:   2011-04-1
  
  API changes, most recent first:
  
 +2012-01-24 - xxxxxxx - lavfi 2.60.100
 +  Add avfilter_graph_dump.
 +
 +2012-01-25 - lavf 53.22.0
 +  f1caf01 Allow doing av_write_frame(ctx, NULL) for flushing possible
 +          buffered data within a muxer. Added AVFMT_ALLOW_FLUSH for
 +          muxers supporting it (av_write_frame makes sure it is called
 +          only for muxers with this flag).
 +
+ 2012-03-04 - xxxxxxx - lavu 51.22.1 - error.h
+   Add AVERROR_UNKNOWN
+ 2012-02-29 - xxxxxxx - lavf 53.21.0
+   Add avformat_get_riff_video_tags() and avformat_get_riff_audio_tags().
+ 2012-02-29 - xxxxxxx - lavu 51.22.0 - intfloat.h
+   Add a new installed header libavutil/intfloat.h with int/float punning
+   functions.
+ 2012-02-17 - xxxxxxx - lavc 53.35.0
+   Add avcodec_is_open() function.
  2012-01-15 - lavc 53.34.0
    New audio encoding API:
    b2c75b6 Add CODEC_CAP_VARIABLE_FRAME_SIZE capability for use by audio
diff --cc ffmpeg.c
+++ b/ffmpeg.c
@@@ -2626,32 -2259,29 +2626,35 @@@ static int transcode_init(OutputFile *o
                  break;
              }
              /* two pass mode */
-             if (codec->codec_id != CODEC_ID_H264 &&
 -            if (ost->encoding_needed &&
--                (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
++            if (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2)) {
                  char logfilename[1024];
                  FILE *f;
  
                  snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
                           pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
                           i);
-                 if (codec->flags & CODEC_FLAG_PASS2) {
-                     char  *logbuffer;
-                     size_t logbuffer_size;
-                     if (cmdutils_read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
-                         av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
-                                logfilename);
 -                if (codec->flags & CODEC_FLAG_PASS1) {
 -                    f = fopen(logfilename, "wb");
 -                    if (!f) {
 -                        fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
--                        exit_program(1);
 -                    }
 -                    ost->logfile = f;
++                if (!strcmp(ost->enc->name, "libx264")) {
++                    av_dict_set(&ost->opts, "stats", logfilename, AV_DICT_DONT_OVERWRITE);
+                 } else {
 -                    char  *logbuffer;
 -                    size_t logbuffer_size;
 -                    if (cmdutils_read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
 -                        fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
 -                        exit_program(1);
++                    if (codec->flags & CODEC_FLAG_PASS2) {
++                        char  *logbuffer;
++                        size_t logbuffer_size;
++                        if (cmdutils_read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
++                            av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
++                                logfilename);
++                            exit_program(1);
++                        }
++                        codec->stats_in = logbuffer;
 +                    }
-                     codec->stats_in = logbuffer;
-                 }
-                 if (codec->flags & CODEC_FLAG_PASS1) {
-                     f = fopen(logfilename, "wb");
-                     if (!f) {
-                         av_log(NULL, AV_LOG_FATAL, "Cannot write log file '%s' for pass-1 encoding: %s\n",
-                                logfilename, strerror(errno));
-                         exit_program(1);
++                    if (codec->flags & CODEC_FLAG_PASS1) {
++                        f = fopen(logfilename, "wb");
++                        if (!f) {
++                            av_log(NULL, AV_LOG_FATAL, "Cannot write log file '%s' for pass-1 encoding: %s\n",
++                                logfilename, strerror(errno));
++                            exit_program(1);
++                        }
++                        ost->logfile = f;
                      }
-                     ost->logfile = f;
 -                    codec->stats_in = logbuffer;
                  }
              }
          }
@@@ -592,9 -547,9 +592,9 @@@ OBJS-$(CONFIG_MATROSKA_AUDIO_MUXER)    
  OBJS-$(CONFIG_MATROSKA_DEMUXER)        += mpeg4audio.o mpegaudiodata.o
  OBJS-$(CONFIG_MATROSKA_MUXER)          += xiph.o mpeg4audio.o \
                                            flacdec.o flacdata.o flac.o \
 -                                          mpegaudiodata.o
 +                                          mpegaudiodata.o vorbis_data.o
  OBJS-$(CONFIG_MP3_MUXER)               += mpegaudiodata.o mpegaudiodecheader.o
- OBJS-$(CONFIG_MOV_DEMUXER)             += mpeg4audio.o mpegaudiodata.o timecode.o
 -OBJS-$(CONFIG_MOV_DEMUXER)             += mpeg4audio.o mpegaudiodata.o ac3tab.o
++OBJS-$(CONFIG_MOV_DEMUXER)             += mpeg4audio.o mpegaudiodata.o ac3tab.o timecode.o
  OBJS-$(CONFIG_MOV_MUXER)               += mpeg4audio.o mpegaudiodata.o
  OBJS-$(CONFIG_MPEGTS_MUXER)            += mpegvideo.o mpeg4audio.o
  OBJS-$(CONFIG_MPEGTS_DEMUXER)          += mpeg4audio.o mpegaudiodata.o
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -789,34 -794,11 +803,35 @@@ static int adpcm_decode_frame(AVCodecCo
              *samples++ = adpcm_ima_expand_nibble(&c->status[st], v & 0x0F, 3);
          }
          break;
 +    case CODEC_ID_ADPCM_IMA_WS:
 +        for (channel = 0; channel < avctx->channels; channel++) {
 +            const uint8_t *src0;
 +            int src_stride;
 +            int16_t *smp = samples + channel;
 +
 +            if (c->vqa_version == 3) {
 +                src0 = src + channel * buf_size / 2;
 +                src_stride = 1;
 +            } else {
 +                src0 = src + channel;
 +                src_stride = avctx->channels;
 +            }
 +            for (n = nb_samples / 2; n > 0; n--) {
 +                uint8_t v = *src0;
 +                src0 += src_stride;
 +                *smp = adpcm_ima_expand_nibble(&c->status[channel], v >> 4  , 3);
 +                smp += avctx->channels;
 +                *smp = adpcm_ima_expand_nibble(&c->status[channel], v & 0x0F, 3);
 +                smp += avctx->channels;
 +            }
 +        }
 +        src = buf + buf_size;
 +        break;
      case CODEC_ID_ADPCM_XA:
          while (buf_size >= 128) {
-             xa_decode(samples, src, &c->status[0], &c->status[1],
-                 avctx->channels);
+             if ((ret = xa_decode(avctx, samples, src, &c->status[0],
+                                  &c->status[1], avctx->channels)) < 0)
+                 return ret;
              src += 128;
              samples += 28 * 8;
              buf_size -= 128;
@@@ -947,9 -951,12 +951,13 @@@ static int amrnb_decode_frame(AVCodecCo
      buf_out = (float *)p->avframe.data[0];
  
      p->cur_frame_mode = unpack_bitstream(p, buf, buf_size);
+     if (p->cur_frame_mode == NO_DATA) {
+         av_log(avctx, AV_LOG_ERROR, "Corrupt bitstream\n");
+         return AVERROR_INVALIDDATA;
+     }
      if (p->cur_frame_mode == MODE_DTX) {
 -        av_log_missing_feature(avctx, "dtx mode", 1);
 +        av_log_missing_feature(avctx, "dtx mode", 0);
 +        av_log(avctx, AV_LOG_INFO, "Note: libopencore_amrnb supports dtx\n");
          return -1;
      }
  
Simple merge
Simple merge
@@@ -4867,11 -4753,9 +4882,17 @@@ enum AVMediaType avcodec_get_type(enum 
  const AVClass *avcodec_get_class(void);
  
  /**
 + * Get the AVClass for AVFrame. It can be used in combination with
 + * AV_OPT_SEARCH_FAKE_OBJ for examining options.
 + *
 + * @see av_opt_find().
 + */
 +const AVClass *avcodec_get_frame_class(void);
 +
++/**
+  * @return a positive value if s is open (i.e. avcodec_open2() was called on it
+  * with no corresponding avcodec_close()), 0 otherwise.
+  */
+ int avcodec_is_open(AVCodecContext *s);
  #endif /* AVCODEC_AVCODEC_H */
Simple merge
Simple merge
Simple merge
@@@ -228,10 -228,9 +228,10 @@@ static av_cold int decode_init(AVCodecC
              av_log(avctx, AV_LOG_ERROR,
                     "CamStudio codec error: invalid depth %i bpp\n",
                     avctx->bits_per_coded_sample);
-             return 1;
+             return AVERROR_INVALIDDATA;
      }
      c->bpp = avctx->bits_per_coded_sample;
 +    avcodec_get_frame_defaults(&c->pic);
      c->pic.data[0] = NULL;
      c->linelen = avctx->width * avctx->bits_per_coded_sample / 8;
      c->height = avctx->height;
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -138,9 -137,8 +138,9 @@@ static int decode_frame(AVCodecContext 
      const uint32_t *buf32;
      uint32_t *luma1,*luma2,*cb,*cr;
      uint32_t offs[4];
 -    int i, j, is_chroma, planes;
 +    int i, j, is_chroma;
 +    const int planes = 3;
+     enum PixelFormat pix_fmt;
  
      header = AV_RL32(buf);
      version = header & 0xff;
          return -1;
      }
  
 -    buf+=4;
 -    if (header_size == 8)
 -        buf+=4;
 +    buf += header_size;
 +
-     avctx->pix_fmt = version & 1 ? PIX_FMT_BGR24 : PIX_FMT_YUVJ420P;
 +    if (version < 2) {
 +        unsigned needed_size = avctx->width*avctx->height*3;
 +        if (version == 0) needed_size /= 2;
 +        needed_size += header_size;
 +        if (buf_size != needed_size && buf_size != header_size) {
 +            av_log(avctx, AV_LOG_ERROR,
 +                   "Invalid frame length %d (should be %d)\n",
 +                   buf_size, needed_size);
 +            return -1;
 +        }
 +    }
 +
 +    f->pict_type = AV_PICTURE_TYPE_I;
 +    f->key_frame = 1;
 +    f->reference = 3;
 +    f->buffer_hints = FF_BUFFER_HINTS_VALID |
 +                      FF_BUFFER_HINTS_PRESERVE |
 +                      FF_BUFFER_HINTS_REUSABLE;
  
+     pix_fmt = version & 1 ? PIX_FMT_BGR24 : PIX_FMT_YUVJ420P;
+     if (avctx->pix_fmt != pix_fmt && f->data[0]) {
+         avctx->release_buffer(avctx, f);
+     }
+     avctx->pix_fmt = pix_fmt;
      switch(version) {
      case 0:
      default:
@@@ -118,10 -120,23 +118,23 @@@ for examples see get_bits, show_bits, s
  #   define MIN_CACHE_BITS 25
  #endif
  
+ #if UNCHECKED_BITSTREAM_READER
  #define OPEN_READER(name, gb)                   \
      unsigned int name##_index = (gb)->index;    \
 -    unsigned int av_unused name##_cache = 0
 +    av_unused unsigned int name##_cache
  
+ #define HAVE_BITS_REMAINING(name, gb) 1
+ #else
+ #define OPEN_READER(name, gb)                   \
+     unsigned int name##_index = (gb)->index;    \
+     unsigned int av_unused name##_cache = 0;    \
+     unsigned int av_unused name##_size_plus8 =  \
+                 (gb)->size_in_bits_plus8
+ #define HAVE_BITS_REMAINING(name, gb)           \
+     name##_index < name##_size_plus8
+ #endif
  #define CLOSE_READER(name, gb) (gb)->index = name##_index
  
  #ifdef BITSTREAM_READER_LE
@@@ -135,7 -135,7 +135,7 @@@ static inline int svq3_get_ue_golomb(Ge
              ret = (ret << 4) | ff_interleaved_dirac_golomb_vlc_code[buf];
              UPDATE_CACHE(re, gb);
              buf = GET_CACHE(re, gb);
-         } while(ret<0x8000000U);
 -        } while (HAVE_BITS_REMAINING(re, gb));
++        } while (ret<0x8000000U && HAVE_BITS_REMAINING(re, gb));
  
          CLOSE_READER(re, gb);
          return ret - 1;
@@@ -301,9 -301,7 +301,9 @@@ static inline int get_ur_golomb_jpegls(
          return buf;
      }else{
          int i;
-         for(i=0; SHOW_UBITS(re, gb, 1) == 0; i++){
+         for (i = 0; i < limit && SHOW_UBITS(re, gb, 1) == 0; i++) {
 +            if (gb->size_in_bits <= re_index)
 +                return -1;
              LAST_SKIP_BITS(re, gb, 1);
              UPDATE_CACHE(re, gb);
          }
Simple merge
Simple merge
@@@ -102,9 -99,13 +102,9 @@@ int ff_h264_check_intra4x4_pred_mode(H2
      }
  
      return 0;
 -} //FIXME cleanup like ff_h264_check_intra_pred_mode
 +} //FIXME cleanup like check_intra_pred_mode
  
- static int check_intra_pred_mode(H264Context *h, int mode, int is_chroma){
 -/**
 - * Check if the top & left blocks are available if needed and
 - * change the dc mode so it only uses the available blocks.
 - */
+ int ff_h264_check_intra_pred_mode(H264Context *h, int mode, int is_chroma){
      MpegEncContext * const s = &h->s;
      static const int8_t top [7]= {LEFT_DC_PRED8x8, 1,-1,-1};
      static const int8_t left[7]= { TOP_DC_PRED8x8,-1, 2,-1,DC_128_PRED8x8};
      return mode;
  }
  
- /**
-  * checks if the top & left blocks are available if needed & changes the dc mode so it only uses the available blocks.
-  */
- int ff_h264_check_intra16x16_pred_mode(H264Context *h, int mode)
- {
-     return check_intra_pred_mode(h, mode, 0);
- }
- /**
-  * checks if the top & left blocks are available if needed & changes the dc mode so it only uses the available blocks.
-  */
- int ff_h264_check_intra_chroma_pred_mode(H264Context *h, int mode)
- {
-     return check_intra_pred_mode(h, mode, 1);
- }
 +
  const uint8_t *ff_h264_decode_nal(H264Context *h, const uint8_t *src, int *dst_length, int *consumed, int length){
      int i, si, di;
      uint8_t *dst;
@@@ -2806,15 -2781,12 +2785,15 @@@ static int decode_slice_header(H264Cont
                  else
                      s->avctx->pix_fmt = PIX_FMT_YUV420P10;
                  break;
-             default:
+             case 8:
                  if (CHROMA444){
 +                    s->avctx->pix_fmt = s->avctx->color_range == AVCOL_RANGE_JPEG ? PIX_FMT_YUVJ444P : PIX_FMT_YUV444P;
                      if (s->avctx->colorspace == AVCOL_SPC_RGB) {
 -                        s->avctx->pix_fmt = PIX_FMT_GBRP;
 -                    } else
 -                        s->avctx->pix_fmt = s->avctx->color_range == AVCOL_RANGE_JPEG ? PIX_FMT_YUVJ444P : PIX_FMT_YUV444P;
 +                       s->avctx->pix_fmt = PIX_FMT_GBR24P;
 +                       av_log(h->s.avctx, AV_LOG_DEBUG, "Detected GBR colorspace.\n");
 +                    } else if (s->avctx->colorspace == AVCOL_SPC_YCGCO) {
 +                        av_log(h->s.avctx, AV_LOG_WARNING, "Detected unsupported YCgCo colorspace.\n");
 +                    }
                  } else if (CHROMA422) {
                      s->avctx->pix_fmt = s->avctx->color_range == AVCOL_RANGE_JPEG ? PIX_FMT_YUVJ422P : PIX_FMT_YUV422P;
                  }else{
      h->ref_count[1]= h->pps.ref_count[1];
  
      if(h->slice_type_nos != AV_PICTURE_TYPE_I){
-         unsigned max= (16<<(s->picture_structure != PICT_FRAME))-1;
 -        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[0]= get_ue_golomb(&s->gb) + 1;
              if(h->slice_type_nos==AV_PICTURE_TYPE_B)
                  h->ref_count[1]= get_ue_golomb(&s->gb) + 1;
          }
-         if(h->ref_count[0]-1 > max || h->ref_count[1]-1 > max){
 -        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 -1;
+             h->ref_count[0] = h->ref_count[1] = 1;
+             return AVERROR_INVALIDDATA;
          }
          if(h->slice_type_nos == AV_PICTURE_TYPE_B)
              h->list_count= 2;
          else
@@@ -3694,8 -3669,7 +3685,8 @@@ static int decode_slice(struct AVCodecC
                  if(s->mb_y >= s->mb_height){
                      tprintf(s->avctx, "slice end %d %d\n", get_bits_count(&s->gb), s->gb.size_in_bits);
  
-                     if(   get_bits_count(&s->gb) == s->gb.size_in_bits
-                        || get_bits_count(&s->gb) <  s->gb.size_in_bits && s->avctx->error_recognition < FF_ER_AGGRESSIVE) {
 -                    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);
  
                          return 0;
@@@ -3974,10 -3927,12 +3965,10 @@@ static int decode_nal_units(H264Contex
              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 : 1)){
 -            if (ff_h264_decode_seq_parameter_set(h) < 0 &&
 -                h->is_avc && (nalsize != consumed) && nalsize) {
 -                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));
++            if (ff_h264_decode_seq_parameter_set(h) < 0 && (h->is_avc ? (nalsize != consumed) && nalsize : 1)){
 +                av_log(h->s.avctx, AV_LOG_DEBUG, "SPS decoding failure, trying alternative mode\n");
 +                if(h->is_avc) av_assert0(next_avc - buf_index + consumed == nalsize);
-                 init_get_bits(&s->gb, &buf[buf_index + 1 - consumed], 8*(next_avc - buf_index + consumed));
++                init_get_bits(&s->gb, &buf[buf_index + 1 - consumed], 8*(next_avc - buf_index + consumed - 1));
                  ff_h264_decode_seq_parameter_set(h);
              }
  
@@@ -671,15 -654,10 +671,7 @@@ 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_intra16x16_pred_mode(H264Context *h, int mode);
--/**
-- * 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_chroma_pred_mode(H264Context *h, int mode);
+ 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);
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -49,10 -49,9 +49,9 @@@ static const uint8_t scan8[16*3]=
  void FUNCC(ff_h264_idct_add)(uint8_t *_dst, DCTELEM *_block, int stride)
  {
      int i;
-     INIT_CLIP
      pixel *dst = (pixel*)_dst;
      dctcoef *block = (dctcoef*)_block;
 -    stride /= sizeof(pixel);
 +    stride >>= sizeof(pixel)-1;
  
      block[0] += 1 << 5;
  
  
  void FUNCC(ff_h264_idct8_add)(uint8_t *_dst, DCTELEM *_block, int stride){
      int i;
-     INIT_CLIP
      pixel *dst = (pixel*)_dst;
      dctcoef *block = (dctcoef*)_block;
 -    stride /= sizeof(pixel);
 +    stride >>= sizeof(pixel)-1;
  
      block[0] += 32;
  
  }
  
  // assumes all AC coefs are 0
 -void FUNCC(ff_h264_idct_dc_add)(uint8_t *_dst, DCTELEM *block, int stride){
 +void FUNCC(ff_h264_idct_dc_add)(uint8_t *p_dst, DCTELEM *block, int stride){
      int i, j;
      int dc = (((dctcoef*)block)[0] + 32) >> 6;
-     INIT_CLIP
 -    pixel *dst = (pixel*)_dst;
 -    stride /= sizeof(pixel);
 +    pixel *dst = (pixel*)p_dst;
 +    stride >>= sizeof(pixel)-1;
      for( j = 0; j < 4; j++ )
      {
          for( i = 0; i < 4; i++ )
      }
  }
  
 -void FUNCC(ff_h264_idct8_dc_add)(uint8_t *_dst, DCTELEM *block, int stride){
 +void FUNCC(ff_h264_idct8_dc_add)(uint8_t *p_dst, DCTELEM *block, int stride){
      int i, j;
      int dc = (((dctcoef*)block)[0] + 32) >> 6;
-     INIT_CLIP
 -    pixel *dst = (pixel*)_dst;
 -    stride /= sizeof(pixel);
 +    pixel *dst = (pixel*)p_dst;
 +    stride >>= sizeof(pixel)-1;
      for( j = 0; j < 8; j++ )
      {
          for( i = 0; i < 8; i++ )
Simple merge
@@@ -735,9 -734,11 +737,11 @@@ static int parse_bintree(Indeo3DecodeCo
              SPLIT_CELL(ref_cell->width, curr_cell.width);
          ref_cell->xpos  += curr_cell.width;
          ref_cell->width -= curr_cell.width;
+         if (ref_cell->width <= 0 || curr_cell.width <= 0)
+             return AVERROR_INVALIDDATA;
      }
  
 -    while (1) { /* loop until return */
 +    while (get_bits_left(&ctx->gb) >= 2) { /* loop until return */
          RESYNC_BITSTREAM;
          switch (code = get_bits(&ctx->gb, 2)) {
          case H_SPLIT:
Simple merge
Simple merge
Simple merge
@@@ -380,10 -381,9 +381,10 @@@ static av_cold int decode_init(AVCodecC
          c->palsize = 127;
      } else {
          c->palsize = AV_RL16(avctx->extradata + 10);
-         if (c->palsize > 255U) {
 -        if (c->palsize >= MAX_PALSIZE) {
++        if (c->palsize >= (unsigned)MAX_PALSIZE) {
 +            c->palsize = 127;
-             av_log(NULL, AV_LOG_ERROR, "palsize too big\n");
-             return -1;
+             av_log(avctx, AV_LOG_ERROR, "KMVC palette too large\n");
+             return AVERROR_INVALIDDATA;
          }
      }
  
@@@ -459,10 -474,9 +480,10 @@@ static av_cold int decode_init(AVCodecC
      unsigned int max_basesize = FFALIGN(avctx->width, 4) * FFALIGN(avctx->height, 4) + AV_LZO_OUTPUT_PADDING;
      unsigned int max_decomp_size;
  
 +    avcodec_get_frame_defaults(&c->pic);
      if (avctx->extradata_size < 8) {
          av_log(avctx, AV_LOG_ERROR, "Extradata size too small.\n");
-         return 1;
+         return AVERROR_INVALIDDATA;
      }
  
      /* Check codec type */
Simple merge
Simple merge
Simple merge
@@@ -64,15 -65,17 +66,17 @@@ static av_cold int mm_decode_init(AVCod
      return 0;
  }
  
- static void mm_decode_pal(MmContext *s, const uint8_t *buf, const uint8_t *buf_end)
+ static int mm_decode_pal(MmContext *s)
  {
      int i;
-     buf += 4;
-     for (i=0; i<128 && buf+2<buf_end; i++) {
-         s->palette[i] = 0xFF << 24 | AV_RB24(buf);
+     bytestream2_skip(&s->gb, 4);
+     for (i = 0; i < 128; i++) {
 -        s->palette[i] = bytestream2_get_be24(&s->gb);
++        s->palette[i] = 0xFF << 24 | bytestream2_get_be24(&s->gb);
          s->palette[i+128] = s->palette[i]<<2;
-         buf += 3;
      }
+     return 0;
  }
  
  /**
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -1391,27 -1390,31 +1392,27 @@@ static int mp_decode_layer3(MPADecodeCo
          s->in_gb = s->gb;
          init_get_bits(&s->gb, s->last_buf, s->last_buf_size*8);
  #if !UNCHECKED_BITSTREAM_READER
-         s->gb.size_in_bits_plus8 += EXTRABYTES * 8;
+         s->gb.size_in_bits_plus8 += extrasize * 8;
  #endif
 -        s->last_buf_size <<= 3;
 -        for (gr = 0; gr < nb_granules && (s->last_buf_size >> 3) < main_data_begin; gr++) {
 -            for (ch = 0; ch < s->nb_channels; ch++) {
 -                g = &s->granules[ch][gr];
 -                s->last_buf_size += g->part2_3_length;
 -                memset(g->sb_hybrid, 0, sizeof(g->sb_hybrid));
 -            }
 -        }
 -        skip = s->last_buf_size - 8 * main_data_begin;
 -        if (skip >= s->gb.size_in_bits && s->in_gb.buffer) {
 -            skip_bits_long(&s->in_gb, skip - s->gb.size_in_bits);
 -            s->gb           = s->in_gb;
 -            s->in_gb.buffer = NULL;
 -        } else {
 -            skip_bits_long(&s->gb, skip);
 -        }
 -    } else {
 -        gr = 0;
 +        skip_bits_long(&s->gb, 8*(s->last_buf_size - main_data_begin));
      }
  
 -    for (; gr < nb_granules; gr++) {
 +    for (gr = 0; gr < nb_granules; gr++) {
          for (ch = 0; ch < s->nb_channels; ch++) {
              g = &s->granules[ch][gr];
 +            if (get_bits_count(&s->gb) < 0) {
 +                av_log(s->avctx, AV_LOG_DEBUG, "mdb:%d, lastbuf:%d skipping granule %d\n",
 +                       main_data_begin, s->last_buf_size, gr);
 +                skip_bits_long(&s->gb, g->part2_3_length);
 +                memset(g->sb_hybrid, 0, sizeof(g->sb_hybrid));
 +                if (get_bits_count(&s->gb) >= s->gb.size_in_bits && s->in_gb.buffer) {
 +                    skip_bits_long(&s->in_gb, get_bits_count(&s->gb) - s->gb.size_in_bits);
 +                    s->gb           = s->in_gb;
 +                    s->in_gb.buffer = NULL;
 +                }
 +                continue;
 +            }
 +
              bits_pos = get_bits_count(&s->gb);
  
              if (!s->lsf) {
Simple merge
Simple merge
  #define AVCODEC_PNG_H
  
  #include <stdint.h>
 +#include <zlib.h>
 +
 +#include "avcodec.h"
++#include "bytestream.h"
  
  #define PNG_COLOR_MASK_PALETTE    1
  #define PNG_COLOR_MASK_COLOR      2
@@@ -72,41 -69,4 +73,39 @@@ int ff_png_pass_row_size(int pass, int 
  
  void ff_add_png_paeth_prediction(uint8_t *dst, uint8_t *src, uint8_t *top, int w, int bpp);
  
-     const uint8_t *bytestream;
-     const uint8_t *bytestream_start;
-     const uint8_t *bytestream_end;
 +typedef struct PNGDecContext {
++    GetByteContext gb;
 +    AVFrame picture1, picture2;
 +    AVFrame *current_picture, *last_picture;
 +
 +    int state;
 +    int width, height;
 +    int bit_depth;
 +    int color_type;
 +    int compression_type;
 +    int interlace_type;
 +    int filter_type;
 +    int channels;
 +    int bits_per_pixel;
 +    int bpp;
 +
 +    uint8_t *image_buf;
 +    int image_linesize;
 +    uint32_t palette[256];
 +    uint8_t *crow_buf;
 +    uint8_t *last_row;
 +    uint8_t *tmp_row;
 +    int pass;
 +    int crow_size; /* compressed row size (include filter type) */
 +    int row_size; /* decompressed row size */
 +    int pass_row_size; /* decompress row size of the current pass */
 +    int y;
 +    z_stream zstream;
 +
 +    void (*add_bytes_l2)(uint8_t *dst, uint8_t *src1, uint8_t *src2, int w);
 +    void (*add_paeth_prediction)(uint8_t *dst, uint8_t *src, uint8_t *top, int w, int bpp);
 +} PNGDecContext;
 +
 +void ff_png_init_mmx(PNGDecContext *s);
 +
  #endif /* AVCODEC_PNG_H */
@@@ -422,16 -416,13 +417,14 @@@ static int decode_frame(AVCodecContext 
      if (ret != Z_OK)
          return -1;
      for(;;) {
-         int tag32;
-         if (s->bytestream >= s->bytestream_end)
+         if (bytestream2_get_bytes_left(&s->gb) <= 0)
              goto fail;
-         length = bytestream_get_be32(&s->bytestream);
+         length = bytestream2_get_be32(&s->gb);
          if (length > 0x7fffffff)
              goto fail;
-         tag32 = bytestream_get_be32(&s->bytestream);
-         tag = av_bswap32(tag32);
+         tag = bytestream2_get_le32(&s->gb);
 -        av_dlog(avctx, "png: tag=%c%c%c%c length=%u\n",
 +        if (avctx->debug & FF_DEBUG_STARTCODE)
 +            av_log(avctx, AV_LOG_DEBUG, "png: tag=%c%c%c%c length=%u\n",
                  (tag & 0xff),
                  ((tag >> 8) & 0xff),
                  ((tag >> 16) & 0xff),
                  s->width= s->height= 0;
                  goto fail;
              }
-             s->bit_depth = *s->bytestream++;
-             s->color_type = *s->bytestream++;
-             s->compression_type = *s->bytestream++;
-             s->filter_type = *s->bytestream++;
-             s->interlace_type = *s->bytestream++;
-             s->bytestream += 4; /* crc */
+             s->bit_depth        = bytestream2_get_byte(&s->gb);
+             s->color_type       = bytestream2_get_byte(&s->gb);
+             s->compression_type = bytestream2_get_byte(&s->gb);
+             s->filter_type      = bytestream2_get_byte(&s->gb);
+             s->interlace_type   = bytestream2_get_byte(&s->gb);
+             bytestream2_skip(&s->gb, 4); /* crc */
              s->state |= PNG_IHDR;
 -            av_dlog(avctx, "width=%d height=%d depth=%d color_type=%d compression_type=%d filter_type=%d interlace_type=%d\n",
 +            if (avctx->debug & FF_DEBUG_PICT_INFO)
 +                av_log(avctx, AV_LOG_DEBUG, "width=%d height=%d depth=%d color_type=%d compression_type=%d filter_type=%d interlace_type=%d\n",
                      s->width, s->height, s->bit_depth, s->color_type,
                      s->compression_type, s->filter_type, s->interlace_type);
              break;
@@@ -424,10 -407,9 +424,10 @@@ static av_cold int qtrle_decode_init(AV
      default:
          av_log (avctx, AV_LOG_ERROR, "Unsupported colorspace: %d bits/sample?\n",
              avctx->bits_per_coded_sample);
-         break;
+         return AVERROR_INVALIDDATA;
      }
  
 +    avcodec_get_frame_defaults(&s->frame);
      s->frame.data[0] = NULL;
  
      return 0;
@@@ -148,13 -128,10 +148,16 @@@ static int raw_decode(AVCodecContext *a
      frame->top_field_first = avctx->coded_frame->top_field_first;
      frame->reordered_opaque = avctx->reordered_opaque;
      frame->pkt_pts          = avctx->pkt->pts;
 +    frame->pkt_pos          = avctx->pkt->pos;
 +
 +    if(context->tff>=0){
 +        frame->interlaced_frame = 1;
 +        frame->top_field_first  = context->tff;
 +    }
  
+     if(buf_size < context->length - (avctx->pix_fmt==PIX_FMT_PAL8 ? 256*4 : 0))
+         return -1;
      //2bpp and 4bpp raw in avi and mov (yes this is ugly ...)
      if (context->buffer) {
          int i;
Simple merge
@@@ -70,20 -69,13 +69,23 @@@ static void roqvideo_decode_frame(RoqCo
          }
      }
  
-     bpos = xpos = ypos = 0;
-     if (chunk_size > buf_end - buf) {
+     chunk_start = bytestream2_tell(&ri->gb);
+     xpos = ypos = 0;
++
++    if (chunk_size > bytestream2_get_bytes_left(&ri->gb)) {
 +        av_log(ri->avctx, AV_LOG_ERROR, "Chunk does not fit in input buffer\n");
-         chunk_size = buf_end - buf;
++        chunk_size = bytestream2_get_bytes_left(&ri->gb);
 +    }
-     while(bpos < chunk_size) {
++
+     while (bytestream2_tell(&ri->gb) < chunk_start + chunk_size) {
          for (yp = ypos; yp < ypos + 16; yp += 8)
              for (xp = xpos; xp < xpos + 16; xp += 8) {
-                 if (bpos >= chunk_size) {
++                if (bytestream2_tell(&ri->gb) >= chunk_start + chunk_size) {
 +                    av_log(ri->avctx, AV_LOG_ERROR, "Input buffer too small\n");
 +                    return;
 +                }
                  if (vqflg_pos < 0) {
-                     vqflg = buf[bpos++]; vqflg |= (buf[bpos++] << 8);
+                     vqflg = bytestream2_get_le16(&ri->gb);
                      vqflg_pos = 7;
                  }
                  vqid = (vqflg >> (vqflg_pos * 2)) & 0x3;
                          if(k & 0x01) x += 4;
                          if(k & 0x02) y += 4;
  
-                         if (bpos >= chunk_size) {
++                        if (bytestream2_tell(&ri->gb) >= chunk_start + chunk_size) {
 +                            av_log(ri->avctx, AV_LOG_ERROR, "Input buffer too small\n");
 +                            return;
 +                        }
                          if (vqflg_pos < 0) {
-                             vqflg = buf[bpos++];
-                             vqflg |= (buf[bpos++] << 8);
+                             vqflg = bytestream2_get_le16(&ri->gb);
                              vqflg_pos = 7;
                          }
                          vqid = (vqflg >> (vqflg_pos * 2)) & 0x3;
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -440,10 -430,9 +431,9 @@@ static int smc_decode_frame(AVCodecCont
      SmcContext *s = avctx->priv_data;
      const uint8_t *pal = av_packet_get_side_data(avpkt, AV_PKT_DATA_PALETTE, NULL);
  
-     s->buf = buf;
-     s->size = buf_size;
+     bytestream2_init(&s->gb, buf, buf_size);
  
 -    s->frame.reference = 1;
 +    s->frame.reference = 3;
      s->frame.buffer_hints = FF_BUFFER_HINTS_VALID | FF_BUFFER_HINTS_PRESERVE |
                              FF_BUFFER_HINTS_REUSABLE | FF_BUFFER_HINTS_READABLE;
      if (avctx->reget_buffer(avctx, &s->frame)) {
Simple merge
@@@ -831,13 -830,17 +832,18 @@@ static av_cold int svq3_decode_init(AVC
          svq3->thirdpel_flag = 1;
          svq3->unknown_flag  = 0;
  
 +
          /* prowl for the "SEQH" marker in the extradata */
          extradata = (unsigned char *)avctx->extradata;
-         for (m = 0; m < avctx->extradata_size; m++) {
-             if (!memcmp(extradata, "SEQH", 4))
-                 break;
-             extradata++;
+         extradata_end = avctx->extradata + avctx->extradata_size;
+         if (extradata) {
+             for (m = 0; m + 8 < avctx->extradata_size; m++) {
+                 if (!memcmp(extradata, "SEQH", 4)) {
+                     marker_found = 1;
+                     break;
+                 }
+                 extradata++;
+             }
          }
  
          /* if a match was found, parse the extra data */
Simple merge
Simple merge
Simple merge
@@@ -816,9 -744,12 +826,15 @@@ int attribute_align_arg avcodec_open2(A
             avctx->error_recognition, avctx->err_recognition);
  #endif
  
+     if (avctx->codec_type == AVMEDIA_TYPE_AUDIO &&
+         (!avctx->time_base.num || !avctx->time_base.den)) {
+         avctx->time_base.num = 1;
+         avctx->time_base.den = avctx->sample_rate;
+     }
 +    if (!HAVE_THREADS)
 +        av_log(avctx, AV_LOG_WARNING, "Warning: not compiled with thread support, using thread emulation\n");
 +
      if (HAVE_THREADS && !avctx->thread_opaque) {
          ret = ff_thread_init(avctx);
          if (ret < 0) {
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -21,8 -21,8 +21,8 @@@
  #define AVCODEC_VERSION_H
  
  #define LIBAVCODEC_VERSION_MAJOR 53
- #define LIBAVCODEC_VERSION_MINOR 60
 -#define LIBAVCODEC_VERSION_MINOR 35
 -#define LIBAVCODEC_VERSION_MICRO  0
++#define LIBAVCODEC_VERSION_MINOR 61
 +#define LIBAVCODEC_VERSION_MICRO 100
  
  #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
                                                 LIBAVCODEC_VERSION_MINOR, \
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -834,10 -817,13 +834,14 @@@ static int wma_decode_superframe(AVCode
          s->last_superframe_len = 0;
          return 0;
      }
-     if (buf_size < s->block_align)
-         return AVERROR(EINVAL);
+     if (buf_size < s->block_align) {
+         av_log(avctx, AV_LOG_ERROR,
+                "Input packet size too small (%d < %d)\n",
+                buf_size, s->block_align);
+         return AVERROR_INVALIDDATA;
+     }
 -    buf_size = s->block_align;
 +    if(s->block_align)
 +        buf_size = s->block_align;
  
      init_get_bits(&s->gb, buf, buf_size*8);
  
Simple merge
Simple merge
Simple merge
@@@ -196,10 -197,8 +197,10 @@@ static int xan_decode_chroma(AVCodecCon
      if (mode) {
          for (j = 0; j < avctx->height >> 1; j++) {
              for (i = 0; i < avctx->width >> 1; i++) {
 +                if (src_end - src < 1)
 +                    return 0;
                  val = *src++;
-                 if (val) {
+                 if (val && val < table_size) {
                      val  = AV_RL16(table + (val << 1));
                      uval = (val >> 3) & 0xF8;
                      vval = (val >> 8) & 0xF8;
  
          for (j = 0; j < avctx->height >> 2; j++) {
              for (i = 0; i < avctx->width >> 1; i += 2) {
 +                if (src_end - src < 1)
 +                    return 0;
                  val = *src++;
-                 if (val) {
+                 if (val && val < table_size) {
                      val  = AV_RL16(table + (val << 1));
                      uval = (val >> 3) & 0xF8;
                      vval = (val >> 8) & 0xF8;
@@@ -298,17 -292,13 +294,16 @@@ static int xan_decode_frame_type0(AVCod
      if (corr_off) {
          int corr_end, dec_size;
  
-         corr_end = avpkt->size;
+         corr_end = (s->gb.buffer_end - s->gb.buffer_start);
          if (chroma_off > corr_off)
              corr_end = chroma_off;
-         dec_size = xan_unpack(s->scratch_buffer, s->buffer_size,
-                               avpkt->data + 8 + corr_off,
-                               corr_end - corr_off);
+         bytestream2_seek(&s->gb, 8 + corr_off, SEEK_SET);
+         dec_size = xan_unpack(s, s->scratch_buffer, s->buffer_size);
          if (dec_size < 0)
              dec_size = 0;
 +        else
 +            dec_size = FFMIN(dec_size, s->buffer_size/2 - 1);
 +
          for (i = 0; i < dec_size; i++)
              s->y_buffer[i*2+1] = (s->y_buffer[i*2+1] + (s->scratch_buffer[i] << 1)) & 0x3F;
      }
@@@ -29,8 -26,8 +30,8 @@@ OBJS-$(CONFIG_ADX_DEMUXER
  OBJS-$(CONFIG_ADX_MUXER)                 += rawenc.o
  OBJS-$(CONFIG_ADTS_MUXER)                += adtsenc.o
  OBJS-$(CONFIG_AEA_DEMUXER)               += aea.o pcm.o
- OBJS-$(CONFIG_AIFF_DEMUXER)              += aiffdec.o riff.o pcm.o isom.o
- OBJS-$(CONFIG_AIFF_MUXER)                += aiffenc.o riff.o isom.o
 -OBJS-$(CONFIG_AIFF_DEMUXER)              += aiffdec.o pcm.o
 -OBJS-$(CONFIG_AIFF_MUXER)                += aiffenc.o
++OBJS-$(CONFIG_AIFF_DEMUXER)              += aiffdec.o pcm.o isom.o
++OBJS-$(CONFIG_AIFF_MUXER)                += aiffenc.o isom.o
  OBJS-$(CONFIG_AMR_DEMUXER)               += amr.o
  OBJS-$(CONFIG_AMR_MUXER)                 += amr.o
  OBJS-$(CONFIG_ANM_DEMUXER)               += anm.o
@@@ -58,8 -52,7 +59,8 @@@ OBJS-$(CONFIG_BIT_MUXER
  OBJS-$(CONFIG_BMV_DEMUXER)               += bmv.o
  OBJS-$(CONFIG_C93_DEMUXER)               += c93.o vocdec.o voc.o
  OBJS-$(CONFIG_CAF_DEMUXER)               += cafdec.o caf.o mov.o mov_chan.o \
-                                             riff.o isom.o
+                                             isom.o
 +OBJS-$(CONFIG_CAF_MUXER)                 += cafenc.o caf.o riff.o isom.o
  OBJS-$(CONFIG_CAVSVIDEO_DEMUXER)         += cavsvideodec.o rawdec.o
  OBJS-$(CONFIG_CAVSVIDEO_MUXER)           += rawenc.o
  OBJS-$(CONFIG_CDG_DEMUXER)               += cdg.o
@@@ -136,13 -123,11 +137,13 @@@ OBJS-$(CONFIG_LXF_DEMUXER
  OBJS-$(CONFIG_M4V_DEMUXER)               += m4vdec.o rawdec.o
  OBJS-$(CONFIG_M4V_MUXER)                 += rawenc.o
  OBJS-$(CONFIG_MATROSKA_DEMUXER)          += matroskadec.o matroska.o \
-                                             riff.o isom.o rmdec.o rm.o
+                                             isom.o rmdec.o rm.o
  OBJS-$(CONFIG_MATROSKA_MUXER)            += matroskaenc.o matroska.o \
-                                             riff.o isom.o avc.o \
+                                             isom.o avc.o \
                                              flacenc_header.o avlanguage.o
  OBJS-$(CONFIG_MD5_MUXER)                 += md5enc.o
 +OBJS-$(CONFIG_MICRODVD_DEMUXER)          += microdvddec.o
 +OBJS-$(CONFIG_MICRODVD_MUXER)            += microdvdenc.o rawenc.o
  OBJS-$(CONFIG_MJPEG_DEMUXER)             += rawdec.o
  OBJS-$(CONFIG_MJPEG_MUXER)               += rawenc.o
  OBJS-$(CONFIG_MLP_DEMUXER)               += rawdec.o
@@@ -319,31 -301,28 +319,31 @@@ OBJS-$(CONFIG_VMD_DEMUXER
  OBJS-$(CONFIG_VOC_DEMUXER)               += vocdec.o voc.o
  OBJS-$(CONFIG_VOC_MUXER)                 += vocenc.o voc.o
  OBJS-$(CONFIG_VQF_DEMUXER)               += vqf.o
- OBJS-$(CONFIG_W64_DEMUXER)               += wav.o riff.o pcm.o
- OBJS-$(CONFIG_WAV_DEMUXER)               += wav.o riff.o pcm.o
- OBJS-$(CONFIG_WAV_MUXER)                 += wav.o riff.o
+ OBJS-$(CONFIG_W64_DEMUXER)               += wav.o pcm.o
+ OBJS-$(CONFIG_WAV_DEMUXER)               += wav.o pcm.o
+ OBJS-$(CONFIG_WAV_MUXER)                 += wav.o
  OBJS-$(CONFIG_WC3_DEMUXER)               += wc3movie.o
  OBJS-$(CONFIG_WEBM_MUXER)                += matroskaenc.o matroska.o \
-                                             riff.o isom.o avc.o \
+                                             isom.o avc.o \
                                              flacenc_header.o avlanguage.o
 -OBJS-$(CONFIG_WSAUD_DEMUXER)             += westwood.o
 -OBJS-$(CONFIG_WSVQA_DEMUXER)             += westwood.o
 -OBJS-$(CONFIG_WTV_DEMUXER)               += wtv.o asfdec.o asf.o asfcrypt.o \
 +OBJS-$(CONFIG_WSAUD_DEMUXER)             += westwood_aud.o
 +OBJS-$(CONFIG_WSVQA_DEMUXER)             += westwood_vqa.o
 +OBJS-$(CONFIG_WTV_DEMUXER)               += wtvdec.o wtv.o asfdec.o asf.o asfcrypt.o \
-                                             avlanguage.o mpegts.o isom.o riff.o
- OBJS-$(CONFIG_WTV_MUXER)                 += wtvenc.o wtv.o asf.o asfenc.o riff.o
+                                             avlanguage.o mpegts.o isom.o
++OBJS-$(CONFIG_WTV_MUXER)                 += wtvenc.o wtv.o asf.o asfenc.o
  OBJS-$(CONFIG_WV_DEMUXER)                += wv.o apetag.o
  OBJS-$(CONFIG_XA_DEMUXER)                += xa.o
- OBJS-$(CONFIG_XMV_DEMUXER)               += xmv.o riff.o
- OBJS-$(CONFIG_XWMA_DEMUXER)              += xwma.o riff.o
 +OBJS-$(CONFIG_XBIN_DEMUXER)              += bintext.o sauce.o
+ OBJS-$(CONFIG_XMV_DEMUXER)               += xmv.o
+ OBJS-$(CONFIG_XWMA_DEMUXER)              += xwma.o
  OBJS-$(CONFIG_YOP_DEMUXER)               += yop.o
  OBJS-$(CONFIG_YUV4MPEGPIPE_MUXER)        += yuv4mpeg.o
  OBJS-$(CONFIG_YUV4MPEGPIPE_DEMUXER)      += yuv4mpeg.o
  
  # external libraries
- OBJS-$(CONFIG_LIBNUT_DEMUXER)            += libnut.o riff.o
- OBJS-$(CONFIG_LIBNUT_MUXER)              += libnut.o riff.o
 +OBJS-$(CONFIG_LIBMODPLUG_DEMUXER)        += libmodplug.o
+ OBJS-$(CONFIG_LIBNUT_DEMUXER)            += libnut.o
+ OBJS-$(CONFIG_LIBNUT_MUXER)              += libnut.o
  
  # protocols I/O
  OBJS+= avio.o aviobuf.o
Simple merge
Simple merge
Simple merge
@@@ -134,7 -133,7 +137,8 @@@ static int dv_extract_audio(uint8_t* fr
  
      /* for each DIF channel */
      for (chan = 0; chan < sys->n_difchan; chan++) {
 +        av_assert0(ipcm<4);
+         /* next stereo channel (50Mbps and 100Mbps only) */
          pcm = ppcm[ipcm++];
          if (!pcm)
              break;
Simple merge
Simple merge
@@@ -30,7 -31,7 +31,8 @@@
  #include "libavutil/mathematics.h"
  #include "libavutil/avstring.h"
  #include "libavutil/dict.h"
 +#include "libavutil/opt.h"
+ #include "libavcodec/ac3tab.h"
  #include "avformat.h"
  #include "internal.h"
  #include "avio_internal.h"
@@@ -1835,16 -1794,13 +1835,17 @@@ static int handle_packets(MpegTSContex
  
      ts->stop_parse = 0;
      packet_num = 0;
+     memset(packet + TS_PACKET_SIZE, 0, FF_INPUT_BUFFER_PADDING_SIZE);
      for(;;) {
 -        if (ts->stop_parse>0)
 -            break;
          packet_num++;
 -        if (nb_packets != 0 && packet_num >= nb_packets)
 +        if (nb_packets != 0 && packet_num >= nb_packets ||
 +            ts->stop_parse > 1) {
 +            ret = AVERROR(EAGAIN);
 +            break;
 +        }
 +        if (ts->stop_parse > 0)
              break;
 +
          ret = read_packet(s, packet, ts->raw_packet_size);
          if (ret != 0)
              break;
Simple merge
@@@ -232,9 -229,9 +232,9 @@@ static int decrypt_init(AVFormatContex
      }
      if (!memcmp(oc->r_val, (const uint8_t[8]){0}, 8) ||
          rprobe(s, gdata, oc->r_val) < 0 &&
 -        nprobe(s, gdata, oc->n_val) < 0) {
 +        nprobe(s, gdata, geob->datasize, oc->n_val) < 0) {
          int i;
-         for (i = 0; i < sizeof(leaf_table); i += 2) {
+         for (i = 0; i < FF_ARRAY_ELEMS(leaf_table); i += 2) {
              uint8_t buf[16];
              AV_WL64(buf, leaf_table[i]);
              AV_WL64(&buf[8], leaf_table[i+1]);
Simple merge
Simple merge
Simple merge
@@@ -2283,10 -2180,9 +2286,11 @@@ static int try_decode_frame(AVStream *s
                  st->info->nb_decoded_frames++;
              pkt.data += ret;
              pkt.size -= ret;
+             ret       = got_picture;
          }
      }
 +    if(!pkt.data && !got_picture)
 +        return -1;
      return ret;
  }
  
@@@ -2579,32 -2492,6 +2583,36 @@@ int avformat_find_stream_info(AVFormatC
          count++;
      }
  
-             while ((err = try_decode_frame(st, &empty_pkt,
 +    if (flush_codecs) {
 +        AVPacket empty_pkt = { 0 };
 +        int err;
 +        av_init_packet(&empty_pkt);
 +
 +        ret = -1; /* we could not have all the codec parameters before EOF */
 +        for(i=0;i<ic->nb_streams;i++) {
 +            st = ic->streams[i];
 +
 +            /* flush the decoders */
-                                             &options[i] : NULL)) >= 0)
-                 if (has_codec_parameters(st->codec))
-                     break;
++            do {
++                    err = try_decode_frame(st, &empty_pkt,
 +                                           (options && i < orig_nb_streams) ?
++                                            &options[i] : NULL);
++            } while (err > 0 && !has_codec_parameters(st->codec));
 +
++            if (err < 0) {
++                av_log(ic, AV_LOG_WARNING,
++                       "decoding for stream %d failed\n", st->index);
++            }
 +            if (!has_codec_parameters(st->codec)){
 +                char buf[256];
 +                avcodec_string(buf, sizeof(buf), st->codec, 0);
 +                av_log(ic, AV_LOG_WARNING, "Could not find codec parameters (%s)\n", buf);
 +            } else {
 +                ret = 0;
 +            }
 +        }
 +    }
 +
      // close codecs which were opened in try_decode_frame()
      for(i=0;i<ic->nb_streams;i++) {
          st = ic->streams[i];
@@@ -30,8 -30,8 +30,8 @@@
  #include "libavutil/avutil.h"
  
  #define LIBAVFORMAT_VERSION_MAJOR 53
- #define LIBAVFORMAT_VERSION_MINOR 31
 -#define LIBAVFORMAT_VERSION_MINOR 21
 -#define LIBAVFORMAT_VERSION_MICRO  0
++#define LIBAVFORMAT_VERSION_MINOR 32
 +#define LIBAVFORMAT_VERSION_MICRO 100
  
  #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
                                                 LIBAVFORMAT_VERSION_MINOR, \
Simple merge
   */
  
  #define LIBAVUTIL_VERSION_MAJOR 51
- #define LIBAVUTIL_VERSION_MINOR 34
- #define LIBAVUTIL_VERSION_MICRO 101
 -#define LIBAVUTIL_VERSION_MINOR 22
 -#define LIBAVUTIL_VERSION_MICRO  1
++#define LIBAVUTIL_VERSION_MINOR 35
++#define LIBAVUTIL_VERSION_MICRO 100
  
  #define LIBAVUTIL_VERSION_INT   AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
                                                 LIBAVUTIL_VERSION_MINOR, \
@@@ -38,9 -35,11 +38,10 @@@ int av_strerror(int errnum, char *errbu
      case AVERROR_INVALIDDATA:       errstr = "Invalid data found when processing input"     ; break;
      case AVERROR_MUXER_NOT_FOUND:   errstr = "Muxer not found"                              ; break;
      case AVERROR_OPTION_NOT_FOUND:  errstr = "Option not found"                             ; break;
 -    case AVERROR_PATCHWELCOME:      errstr = "Not yet implemented in Libav, patches welcome"; break;
 +    case AVERROR_PATCHWELCOME:      errstr = "Not yet implemented in FFmpeg, patches welcome"; break;
      case AVERROR_PROTOCOL_NOT_FOUND:errstr = "Protocol not found"                           ; break;
      case AVERROR_STREAM_NOT_FOUND:  errstr = "Stream not found"                             ; break;
 -    case AVERROR_BUG:               errstr = "Bug detected, please report the issue"        ; break;
+     case AVERROR_UNKNOWN:           errstr = "Unknown error occurred"                       ; break;
      }
  
      if (errstr) {
  #define AVERROR_INVALIDDATA        (-MKTAG( 'I','N','D','A')) ///< Invalid data found when processing input
  #define AVERROR_MUXER_NOT_FOUND    (-MKTAG(0xF8,'M','U','X')) ///< Muxer not found
  #define AVERROR_OPTION_NOT_FOUND   (-MKTAG(0xF8,'O','P','T')) ///< Option not found
 -#define AVERROR_PATCHWELCOME       (-MKTAG( 'P','A','W','E')) ///< Not yet implemented in Libav, patches welcome
 +#define AVERROR_PATCHWELCOME       (-MKTAG( 'P','A','W','E')) ///< Not yet implemented in FFmpeg, patches welcome
  #define AVERROR_PROTOCOL_NOT_FOUND (-MKTAG(0xF8,'P','R','O')) ///< Protocol not found
  #define AVERROR_STREAM_NOT_FOUND   (-MKTAG(0xF8,'S','T','R')) ///< Stream not found
 -#define AVERROR_BUG                (-MKTAG( 'B','U','G',' ')) ///< Bug detected, please report the issue
 +
 +/**
 + * This is semantically identical to AVERROR_BUG
 + * it has been introduced in Libav after our AVERROR_BUG and with a modified value.
 + */
 +#define AVERROR_BUG2               (-MKTAG( 'B','U','G',' '))
+ #define AVERROR_UNKNOWN            (-MKTAG( 'U','N','K','N')) ///< Unknown error, typically from an external library
  
  /**
   * Put a description of the AVERROR code errnum in errbuf.
Simple merge
@@@ -2510,10 -2369,12 +2510,10 @@@ static int swScale(SwsContext *c, cons
      const int chrXInc= c->chrXInc;
      const enum PixelFormat dstFormat= c->dstFormat;
      const int flags= c->flags;
-     int16_t *vLumFilterPos= c->vLumFilterPos;
-     int16_t *vChrFilterPos= c->vChrFilterPos;
-     int16_t *hLumFilterPos= c->hLumFilterPos;
-     int16_t *hChrFilterPos= c->hChrFilterPos;
+     int32_t *vLumFilterPos= c->vLumFilterPos;
+     int32_t *vChrFilterPos= c->vChrFilterPos;
+     int32_t *hLumFilterPos= c->hLumFilterPos;
+     int32_t *hChrFilterPos= c->hChrFilterPos;
 -    int16_t *vLumFilter= c->vLumFilter;
 -    int16_t *vChrFilter= c->vChrFilter;
      int16_t *hLumFilter= c->hLumFilter;
      int16_t *hChrFilter= c->hChrFilter;
      int32_t *lumMmxFilter= c->lumMmxFilter;
Simple merge
@@@ -191,9 -180,9 +191,9 @@@ static double getSplineCoeff(double a, 
                                           dist-1.0);
  }
  
- static int initFilter(int16_t **outFilter, int16_t **filterPos, int *outFilterSize, int xInc,
+ static int initFilter(int16_t **outFilter, int32_t **filterPos, int *outFilterSize, int xInc,
                        int srcW, int dstW, int filterAlign, int one, int flags, int cpu_flags,
 -                      SwsVector *srcFilter, SwsVector *dstFilter, double param[2], int is_horizontal)
 +                      SwsVector *srcFilter, SwsVector *dstFilter, double param[2])
  {
      int i;
      int filterSize;
@@@ -935,9 -911,9 +935,9 @@@ int sws_init_context(SwsContext *c, Sws
              c->chrXInc+= 20;
          }
          //we don't use the x86 asm scaler if MMX is available
 -        else if (HAVE_MMX && cpu_flags & AV_CPU_FLAG_MMX) {
 +        else if (HAVE_MMX && cpu_flags & AV_CPU_FLAG_MMX && c->dstBpc <= 10) {
-             c->lumXInc = ((srcW-2)<<16)/(dstW-2) - 20;
-             c->chrXInc = ((c->chrSrcW-2)<<16)/(c->chrDstW-2) - 20;
+             c->lumXInc = ((int64_t)(srcW-2)<<16)/(dstW-2) - 20;
+             c->chrXInc = ((int64_t)(c->chrSrcW-2)<<16)/(c->chrDstW-2) - 20;
          }
      }
  
Simple merge
@@@ -128,10 -128,48 +128,48 @@@ void updateMMXDitherTables(SwsContext *
          c->greenDither= ff_dither4[dstY&1];
      c->redDither= ff_dither8[(dstY+1)&1];
      if (dstY < dstH - 2) {
 -        const int16_t **lumSrcPtr= (const int16_t **) lumPixBuf + lumBufIndex + firstLumSrcY - lastInLumBuf + vLumBufSize;
 -        const int16_t **chrUSrcPtr= (const int16_t **) chrUPixBuf + chrBufIndex + firstChrSrcY - lastInChrBuf + vChrBufSize;
 -        const int16_t **alpSrcPtr= (CONFIG_SWSCALE_ALPHA && alpPixBuf) ? (const int16_t **) alpPixBuf + lumBufIndex + firstLumSrcY - lastInLumBuf + vLumBufSize : NULL;
 +        const int16_t **lumSrcPtr= (const int16_t **)(void*) lumPixBuf + lumBufIndex + firstLumSrcY - lastInLumBuf + vLumBufSize;
 +        const int16_t **chrUSrcPtr= (const int16_t **)(void*) chrUPixBuf + chrBufIndex + firstChrSrcY - lastInChrBuf + vChrBufSize;
 +        const int16_t **alpSrcPtr= (CONFIG_SWSCALE_ALPHA && alpPixBuf) ? (const int16_t **)(void*) alpPixBuf + lumBufIndex + firstLumSrcY - lastInLumBuf + vLumBufSize : NULL;
          int i;
+         if (firstLumSrcY < 0 || firstLumSrcY + vLumFilterSize > c->srcH) {
+             const int16_t **tmpY = (const int16_t **) lumPixBuf + 2 * vLumBufSize;
+             int neg = -firstLumSrcY, i, end = FFMIN(c->srcH - firstLumSrcY, vLumFilterSize);
+             for (i = 0; i < neg;            i++)
+                 tmpY[i] = lumSrcPtr[neg];
+             for (     ; i < end;            i++)
+                 tmpY[i] = lumSrcPtr[i];
+             for (     ; i < vLumFilterSize; i++)
+                 tmpY[i] = tmpY[i-1];
+             lumSrcPtr = tmpY;
+             if (alpSrcPtr) {
+                 const int16_t **tmpA = (const int16_t **) alpPixBuf + 2 * vLumBufSize;
+                 for (i = 0; i < neg;            i++)
+                     tmpA[i] = alpSrcPtr[neg];
+                 for (     ; i < end;            i++)
+                     tmpA[i] = alpSrcPtr[i];
+                 for (     ; i < vLumFilterSize; i++)
+                     tmpA[i] = tmpA[i - 1];
+                 alpSrcPtr = tmpA;
+             }
+         }
+         if (firstChrSrcY < 0 || firstChrSrcY + vChrFilterSize > c->chrSrcH) {
+             const int16_t **tmpU = (const int16_t **) chrUPixBuf + 2 * vChrBufSize;
+             int neg = -firstChrSrcY, i, end = FFMIN(c->chrSrcH - firstChrSrcY, vChrFilterSize);
+             for (i = 0; i < neg;            i++) {
+                 tmpU[i] = chrUSrcPtr[neg];
+             }
+             for (     ; i < end;            i++) {
+                 tmpU[i] = chrUSrcPtr[i];
+             }
+             for (     ; i < vChrFilterSize; i++) {
+                 tmpU[i] = tmpU[i - 1];
+             }
+             chrUSrcPtr = tmpU;
+         }
          if (flags & SWS_ACCURATE_RND) {
              int s= APCK_SIZE / 8;
              for (i=0; i<vLumFilterSize; i+=2) {
Simple merge
@@@ -1,4 -1,4 +1,4 @@@
- b813a52d4efe6cf7974190ea9c4c7e8c *./tests/data/acodec/g722.wav
 -7b0492eee76b04b710990235f97a0bf2 *./tests/data/acodec/g722.wav
 -   48053 ./tests/data/acodec/g722.wav
 -b5568e0e3930ff563824156e8e1015f0 *./tests/data/g722.acodec.out.wav
 -stddev: 8939.44 PSNR: 17.30 MAXDIFF:40370 bytes:   191980/  1058400
++d1a10c4d35f752f60798114a156be3a8 *./tests/data/acodec/g722.wav
 +48053 ./tests/data/acodec/g722.wav
- d8344d14a11eef0418b856af70694cbe *./tests/data/g722.acodec.out.wav
- stddev: 8841.18 PSNR: 17.40 MAXDIFF:36225 bytes:   191980/  1058400
++8dafe5b74ccd5f08fed2fb2a69c5475f *./tests/data/g722.acodec.out.wav
++stddev: 8939.47 PSNR: 17.30 MAXDIFF:40370 bytes:   191980/  1058400