Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Tue, 11 Oct 2011 00:39:50 +0000 (02:39 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Tue, 11 Oct 2011 01:42:43 +0000 (03:42 +0200)
* qatar/master: (34 commits)
  h264: reset h->ref_count in case of errors in ff_h264_decode_ref_pic_list_reordering()
  error_resilience: fix the check for missing references in ff_er_frame_end() for H264
  4xm: prevent NULL dereference with invalid huffman table
  4xmdemux: prevent use of uninitialized memory
  4xm: clear FF_INPUT_BUFFER_PADDING_SIZE bytes in temporary buffers
  ptx: check for out of bound reads
  tiffdec: fix out of bound reads/writes
  eacmv: check for out of bound reads
  eacmv: fix potential pointer arithmetic overflows
  adpcm: fix out of bound reads due to integer overflow
  anm: prevent infinite loop
  avsdemux: check for out of bound writes
  avs: check for out of bound reads
  avsdemux: check for corrupted data
  AVOptions: refactor set_number/write_number
  AVOptions: cosmetics, rename static av_set_number2() to write_number().
  AVOptions: cosmetics, move and rename static av_set_number().
  AVOptions: split av_set_string3 into opt type-specific functions
  avidec: fix signed overflow in avi_sync()
  mxfdec: Fix some buffer overreads caused by the misuse of AVPacket related functions.
  ...

Conflicts:
Changelog
configure
libavcodec/ptx.c
libavcodec/ra144.c
libavcodec/vaapi_vc1.c
libavcodec/vc1.c
libavcodec/version.h
libavformat/4xm.c
libavformat/avidec.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
18 files changed:
1  2 
Changelog
configure
libavcodec/ptx.c
libavcodec/ra144.c
libavcodec/ra144dec.c
libavcodec/ra288.c
libavcodec/vc1.c
libavcodec/vc1.h
libavcodec/vc1data.c
libavcodec/vc1data.h
libavcodec/vc1dec.c
libavcodec/vc1dsp.c
libavcodec/version.h
libavformat/4xm.c
libavformat/avidec.c
libavformat/mxfdec.c
libavutil/opt.c
libavutil/opt.h

diff --cc Changelog
+++ b/Changelog
@@@ -43,31 -41,43 +43,32 @@@ easier to use. The changes are
        '-preset <presetname>'.
      * -intra option was removed, it's equivalent to -g 0.
  - XMV demuxer
 +- LOAS demuxer
 +- ashowinfo filter added
  - Windows Media Image decoder
 +- amovie source added
  - LATM muxer/demuxer
 -- showinfo filter
 -- split filter
 +- Speex encoder via libspeex
 +- JSON output in ffprobe
 +- WTV muxer
 +- Optional C++ Support (needed for libstagefright)
 +- H.264 Decoding on Android via Stagefright
 +- Prores decoder
 +- BIN/XBIN/ADF/IDF text file decoder
 +- aconvert audio filter added
 +- audio support to lavfi input device added
  - libcdio-paranoia input device for audio CD grabbing
 -- select filter
  - Apple ProRes decoder
  - CELT in Ogg demuxing
 +- G.723.1 demuxer and decoder
 +- libmodplug support (--enable-libmodplug)
+ - VC-1 interlaced decoding
  
  
 -version 0.7:
 -
 -- E-AC-3 audio encoder
 -- ac3enc: add channel coupling support
 -- floating-point sample format support for (E-)AC-3, DCA, AAC, Vorbis decoders
 -- H.264/MPEG frame-level multithreading
 -- av_metadata_* functions renamed to av_dict_* and moved to libavutil
 -- 4:4:4 H.264 decoding support
 -- 10-bit H.264 optimizations for x86
 -- bump libswscale for recently reported ABI break
 +version 0.8:
  
  
 -version 0.7_beta2:
 -
 -- VP8 frame-level multithreading
 -- NEON optimizations for VP8
 -- removed a lot of deprecated API cruft
 -- FFT and IMDCT optimizations for AVX (Sandy Bridge) processors
 -- DPX image encoder
 -- SMPTE 302M AES3 audio decoder
 -- ffmpeg no longer quits after the 'q' key is pressed; use 'ctrl+c' instead
 -- 9bit and 10bit per sample support in the H.264 decoder
 -
 -
 -version 0.7_beta1:
 -
 +- many many things we forgot because we rather write code than changelogs
  - WebM support in Matroska de/muxer
  - low overhead Ogg muxing
  - MMS-TCP support
diff --cc configure
+++ b/configure
@@@ -3162,7 -2992,7 +3162,8 @@@ 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
Simple merge
@@@ -1711,10 -1711,10 +1711,10 @@@ void ff_subblock_synthesis(RA144Contex
      ff_add_wav(block, gain, cba_idx, m, cba_idx? buffer_a: NULL,
                 ff_cb1_vects[cb1_idx], ff_cb2_vects[cb2_idx]);
  
-     memcpy(ractx->curr_sblock, ractx->curr_sblock + 40,
-            10*sizeof(*ractx->curr_sblock));
+     memcpy(ractx->curr_sblock, ractx->curr_sblock + BLOCKSIZE,
+            LPC_ORDER*sizeof(*ractx->curr_sblock));
  
-     if (ff_celp_lp_synthesis_filter(ractx->curr_sblock + 10, lpc_coefs,
-                                     block, BLOCKSIZE, 10, 1, 0, 0xfff))
-         memset(ractx->curr_sblock, 0, 50*sizeof(*ractx->curr_sblock));
+     if (ff_celp_lp_synthesis_filter(ractx->curr_sblock + LPC_ORDER, lpc_coefs,
 -                                    block, BLOCKSIZE, LPC_ORDER, 1, 0xfff))
++                                    block, BLOCKSIZE, LPC_ORDER, 1, 0, 0xfff))
+         memset(ractx->curr_sblock, 0, (LPC_ORDER+BLOCKSIZE)*sizeof(*ractx->curr_sblock));
  }
Simple merge
Simple merge
@@@ -424,11 -417,9 +418,10 @@@ int vc1_decode_sequence_header(AVCodecC
  
  static int decode_sequence_header_adv(VC1Context *v, GetBitContext *gb)
  {
 +    int w, h;
      v->res_rtm_flag = 1;
      v->level = get_bits(gb, 3);
-     if(v->level >= 5)
-     {
+     if (v->level >= 5) {
          av_log(v->s.avctx, AV_LOG_ERROR, "Reserved LEVEL %i\n",v->level);
      }
      v->chromaformat = get_bits(gb, 2);
      }
  
      // (fps-2)/4 (->30)
-     v->frmrtq_postproc = get_bits(gb, 3); //common
+     v->frmrtq_postproc       = get_bits(gb, 3); //common
      // (bitrate-32kbps)/64kbps
-     v->bitrtq_postproc = get_bits(gb, 5); //common
-     v->postprocflag = get_bits1(gb); //common
+     v->bitrtq_postproc       = get_bits(gb, 5); //common
+     v->postprocflag          = get_bits1(gb);   //common
  
 -    v->s.avctx->coded_width  = (get_bits(gb, 12) + 1) << 1;
 -    v->s.avctx->coded_height = (get_bits(gb, 12) + 1) << 1;
 -    v->s.avctx->width        = v->s.avctx->coded_width;
 -    v->s.avctx->height       = v->s.avctx->coded_height;
 +    w = (get_bits(gb, 12) + 1) << 1;
 +    h = (get_bits(gb, 12) + 1) << 1;
 +    avcodec_set_dimensions(v->s.avctx, w, h);
-     v->broadcast = get_bits1(gb);
-     v->interlace = get_bits1(gb);
-     v->tfcntrflag = get_bits1(gb);
-     v->finterpflag = get_bits1(gb);
+     v->broadcast             = get_bits1(gb);
+     v->interlace             = get_bits1(gb);
+     v->tfcntrflag            = get_bits1(gb);
+     v->finterpflag           = get_bits1(gb);
      skip_bits1(gb); // reserved
  
      av_log(v->s.avctx, AV_LOG_DEBUG,
@@@ -555,14 -547,13 +548,14 @@@ int vc1_decode_entry_point(AVCodecConte
          }
      }
  
 -    if (get_bits1(gb)) {
 -        avctx->width  = avctx->coded_width  = (get_bits(gb, 12) + 1) << 1;
 -        avctx->height = avctx->coded_height = (get_bits(gb, 12) + 1) << 1;
 +    if(get_bits1(gb)){
 +        int w = (get_bits(gb, 12)+1)<<1;
 +        int h = (get_bits(gb, 12)+1)<<1;
 +        avcodec_set_dimensions(avctx, w, h);
      }
-     if(v->extended_mv)
+     if (v->extended_mv)
          v->extended_dmv = get_bits1(gb);
-     if((v->range_mapy_flag = get_bits1(gb))) {
+     if ((v->range_mapy_flag = get_bits1(gb))) {
          av_log(avctx, AV_LOG_ERROR, "Luma scaling is not supported, expect wrong picture\n");
          v->range_mapy = get_bits(gb, 3);
      }
@@@ -800,39 -819,61 +821,62 @@@ int vc1_parse_frame_header_adv(VC1Conte
  {
      int pqindex, lowquant;
      int status;
+     int mbmodetab, imvtab, icbptab, twomvbptab, fourmvbptab; /* useful only for debugging */
+     int scale, shift, i; /* for initializing LUT for intensity compensation */
  
++    v->numref=0;
      v->p_frame_skipped = 0;
+     if (v->second_field) {
+         v->s.pict_type = (v->fptype & 1) ? AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_I;
+         if (v->fptype & 4)
+             v->s.pict_type = (v->fptype & 1) ? AV_PICTURE_TYPE_BI : AV_PICTURE_TYPE_B;
+         v->s.current_picture_ptr->f.pict_type = v->s.pict_type;
+         if (!v->pic_header_flag)
+             goto parse_common_info;
+     }
  
-     if(v->interlace){
+     if (v->interlace) {
          v->fcm = decode012(gb);
-         if(v->fcm){
-             if(!v->warn_interlaced++)
-                 av_log(v->s.avctx, AV_LOG_ERROR, "Interlaced frames/fields support is not implemented\n");
-             return -1;
+         if (v->fcm) {
+             if (v->fcm == 2)
+                 v->field_mode = 1;
+             else
+                 v->field_mode = 0;
+             if (!v->warn_interlaced++)
+                 av_log(v->s.avctx, AV_LOG_ERROR,
+                        "Interlaced frames/fields support is incomplete\n");
          }
      }
-     switch(get_unary(gb, 0, 4)) {
-     case 0:
-         v->s.pict_type = AV_PICTURE_TYPE_P;
-         break;
-     case 1:
-         v->s.pict_type = AV_PICTURE_TYPE_B;
-         break;
-     case 2:
-         v->s.pict_type = AV_PICTURE_TYPE_I;
-         break;
-     case 3:
-         v->s.pict_type = AV_PICTURE_TYPE_BI;
-         break;
-     case 4:
-         v->s.pict_type = AV_PICTURE_TYPE_P; // skipped pic
-         v->p_frame_skipped = 1;
-         break;
+     if (v->field_mode) {
+         v->fptype = get_bits(gb, 3);
+         v->s.pict_type = (v->fptype & 2) ? AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_I;
+         if (v->fptype & 4) // B-picture
+             v->s.pict_type = (v->fptype & 2) ? AV_PICTURE_TYPE_BI : AV_PICTURE_TYPE_B;
+     } else {
+         switch (get_unary(gb, 0, 4)) {
+         case 0:
+             v->s.pict_type = AV_PICTURE_TYPE_P;
+             break;
+         case 1:
+             v->s.pict_type = AV_PICTURE_TYPE_B;
+             break;
+         case 2:
+             v->s.pict_type = AV_PICTURE_TYPE_I;
+             break;
+         case 3:
+             v->s.pict_type = AV_PICTURE_TYPE_BI;
+             break;
+         case 4:
+             v->s.pict_type = AV_PICTURE_TYPE_P; // skipped pic
+             v->p_frame_skipped = 1;
+             break;
+         }
      }
-     if(v->tfcntrflag)
+     if (v->tfcntrflag)
          skip_bits(gb, 8);
-     if(v->broadcast) {
-         if(!v->interlace || v->psf) {
+     if (v->broadcast) {
+         if (!v->interlace || v->psf) {
              v->rptfrm = get_bits(gb, 2);
          } else {
              v->tff = get_bits1(gb);
Simple merge
Simple merge
Simple merge
@@@ -3791,7 -5332,9 +5332,9 @@@ static int vc1_decode_frame(AVCodecCont
      MpegEncContext *s = &v->s;
      AVFrame *pict = data;
      uint8_t *buf2 = NULL;
+     uint8_t *buf_field2 = NULL;
      const uint8_t *buf_start = buf;
 -    int mb_height, n_slices1;
++    int mb_height, n_slices1=-1;
      struct {
          uint8_t *buf;
          GetBitContext gb;
Simple merge
@@@ -21,8 -21,8 +21,8 @@@
  #define AVCODEC_VERSION_H
  
  #define LIBAVCODEC_VERSION_MAJOR 53
 -#define LIBAVCODEC_VERSION_MINOR  12
 -#define LIBAVCODEC_VERSION_MICRO  2
 +#define LIBAVCODEC_VERSION_MINOR 20
- #define LIBAVCODEC_VERSION_MICRO  0
++#define LIBAVCODEC_VERSION_MICRO  1
  
  #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
                                                 LIBAVCODEC_VERSION_MINOR, \
@@@ -173,11 -173,10 +173,11 @@@ static int fourxm_read_header(AVFormatC
                  goto fail;
              }
              if (current_track + 1 > fourxm->track_count) {
 -                fourxm->tracks = av_realloc(fourxm->tracks,
 -                    (current_track + 1) * sizeof(AudioTrack));
 +                fourxm->tracks = av_realloc_f(fourxm->tracks,
 +                                              sizeof(AudioTrack),
 +                                              current_track + 1);
                  if (!fourxm->tracks) {
-                     ret AVERROR(ENOMEM);
+                     ret = AVERROR(ENOMEM);
                      goto fail;
                  }
                  memset(&fourxm->tracks[fourxm->track_count], 0,
@@@ -879,8 -849,8 +880,8 @@@ static int avi_sync(AVFormatContext *s
      int64_t i, sync;
  
  start_sync:
-     memset(d, -1, sizeof(int)*8);
+     memset(d, -1, sizeof(d));
 -    for(i=sync=avio_tell(pb); !pb->eof_reached; i++) {
 +    for(i=sync=avio_tell(pb); !url_feof(pb); i++) {
          int j;
  
          for(j=0; j<7; j++)
Simple merge
diff --cc libavutil/opt.c
@@@ -123,88 -194,38 +193,38 @@@ int av_set_string3(void *obj, const cha
          *o_out = o;
      if (!o)
          return AVERROR_OPTION_NOT_FOUND;
 -    if (!val)
 +    if (!val && o->type != FF_OPT_TYPE_STRING)
          return AVERROR(EINVAL);
  
-     if (o->type == FF_OPT_TYPE_BINARY) {
-         uint8_t **dst = (uint8_t **)(((uint8_t*)obj) + o->offset);
-         int *lendst = (int *)(dst + 1);
-         uint8_t *bin, *ptr;
-         int len = strlen(val);
-         av_freep(dst);
-         *lendst = 0;
-         if (len & 1) return AVERROR(EINVAL);
-         len /= 2;
-         ptr = bin = av_malloc(len);
-         while (*val) {
-             int a = hexchar2int(*val++);
-             int b = hexchar2int(*val++);
-             if (a < 0 || b < 0) {
-                 av_free(bin);
-                 return AVERROR(EINVAL);
-             }
-             *ptr++ = (a << 4) | b;
-         }
-         *dst = bin;
-         *lendst = len;
-         return 0;
+     dst = ((uint8_t*)obj) + o->offset;
+     switch (o->type) {
+     case FF_OPT_TYPE_STRING:   return set_string(obj, o, val, dst);
+     case FF_OPT_TYPE_BINARY:   return set_string_binary(obj, o, val, dst);
+     case FF_OPT_TYPE_FLAGS:
+     case FF_OPT_TYPE_INT:
+     case FF_OPT_TYPE_INT64:
+     case FF_OPT_TYPE_FLOAT:
+     case FF_OPT_TYPE_DOUBLE:
+     case FF_OPT_TYPE_RATIONAL: return set_string_number(obj, o, val, dst);
      }
-     if (o->type != FF_OPT_TYPE_STRING) {
-         int notfirst=0;
-         for (;;) {
-             int i;
-             char buf[256];
-             int cmd=0;
-             double d;
-             if (*val == '+' || *val == '-')
-                 cmd= *(val++);
-             for (i=0; i<sizeof(buf)-1 && val[i] && val[i]!='+' && val[i]!='-'; i++)
-                 buf[i]= val[i];
-             buf[i]=0;
-             {
-                 const AVOption *o_named = av_opt_find(obj, buf, o->unit, 0, 0);
-                 if (o_named && o_named->type == FF_OPT_TYPE_CONST)
-                     d= o_named->default_val.dbl;
-                 else if (!strcmp(buf, "default")) d= o->default_val.dbl;
-                 else if (!strcmp(buf, "max"    )) d= o->max;
-                 else if (!strcmp(buf, "min"    )) d= o->min;
-                 else if (!strcmp(buf, "none"   )) d= 0;
-                 else if (!strcmp(buf, "all"    )) d= ~0;
-                 else {
-                     int res = av_expr_parse_and_eval(&d, buf, const_names, const_values, NULL, NULL, NULL, NULL, NULL, 0, obj);
-                     if (res < 0) {
-                         av_log(obj, AV_LOG_ERROR, "Unable to parse option value \"%s\"\n", val);
-                         return res;
-                     }
-                 }
-             }
-             if (o->type == FF_OPT_TYPE_FLAGS) {
-                 if      (cmd=='+') d= av_get_int(obj, name, NULL) | (int64_t)d;
-                 else if (cmd=='-') d= av_get_int(obj, name, NULL) &~(int64_t)d;
-             } else {
-                 if      (cmd=='+') d= notfirst*av_get_double(obj, name, NULL) + d;
-                 else if (cmd=='-') d= notfirst*av_get_double(obj, name, NULL) - d;
-             }
  
-             if ((ret = av_set_number2(obj, name, d, 1, 1, o_out)) < 0)
-                 return ret;
-             val+= i;
-             if (!*val)
-                 return 0;
-             notfirst=1;
-         }
-     }
+     av_log(obj, AV_LOG_ERROR, "Invalid option type.\n");
+     return AVERROR(EINVAL);
+ }
  
-     if (alloc) {
-         av_free(*(void**)(((uint8_t*)obj) + o->offset));
-         val= av_strdup(val);
-     }
+ static const AVOption *set_number(void *obj, const char *name, double num, int den, int64_t intnum)
+ {
+     const AVOption *o = av_opt_find(obj, name, NULL, 0, 0);
+     void *dst;
  
-     memcpy(((uint8_t*)obj) + o->offset, &val, sizeof(val));
-     return 0;
+     if (!o)
+         return NULL;
+     dst = ((uint8_t*)obj) + o->offset;
+     if (write_number(obj, o, dst, num, den, intnum) < 0)
+         return NULL;
+     else
+         return o;
  }
  
  const AVOption *av_set_double(void *obj, const char *name, double n)
diff --cc libavutil/opt.h
Simple merge