Merge commit '688b132b881d423877e38dc82f17e23a604be676'
authorMichael Niedermayer <michaelni@gmx.at>
Mon, 14 Jan 2013 14:04:58 +0000 (15:04 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Mon, 14 Jan 2013 14:04:58 +0000 (15:04 +0100)
* commit '688b132b881d423877e38dc82f17e23a604be676':
  qdrw: return meaningful error codes.
  qtrle: return a meaningful error code.
  gifdec: return meaningful error codes.
  interplayvideo: remove a static variable.
  interplayvideo: return meaningful error codes.
  lcldec: return meaningful error codes.
  targa: return meaningful error codes.
  qpeg: return a meaningful error code.
  nuv: return meaningful error codes.

Conflicts:
libavcodec/gifdec.c
libavcodec/interplayvideo.c
libavcodec/nuv.c
libavcodec/qpeg.c
libavcodec/targa.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavcodec/gifdec.c
libavcodec/interplayvideo.c
libavcodec/lcldec.c
libavcodec/nuv.c
libavcodec/qdrw.c
libavcodec/qpeg.c
libavcodec/qtrle.c
libavcodec/targa.c

@@@ -408,19 -245,18 +408,20 @@@ static int gif_read_header1(GifState *s
      return 0;
  }
  
 -static int gif_parse_next_image(GifState *s)
 +static int gif_parse_next_image(GifState *s, int *got_picture)
  {
-     int ret;
 -    while (s->bytestream < s->bytestream_end) {
 -        int code = bytestream_get_byte(&s->bytestream);
++
 +    *got_picture = 1;
 +    while (bytestream2_get_bytes_left(&s->gb)) {
 +        int code = bytestream2_get_byte(&s->gb);
+         int ret;
  
 -        av_dlog(s->avctx, "gif: code=%02x '%c'\n", code, code);
 +        av_dlog(s->avctx, "code=%02x '%c'\n", code, code);
  
          switch (code) {
 -        case ',':
 +        case GIF_IMAGE_SEPARATOR:
              return gif_read_image(s);
 -        case '!':
 +        case GIF_EXTENSION_INTRODUCER:
              if ((ret = gif_read_extension(s)) < 0)
                  return ret;
              break;
@@@ -73,12 -73,12 +73,12 @@@ static int copy_from(IpvideoContext *s
      int motion_offset = current_offset + delta_y * s->current_frame.linesize[0]
                         + delta_x * (1 + s->is_16bpp);
      if (motion_offset < 0) {
 -        av_log(s->avctx, AV_LOG_ERROR, " Interplay video: motion offset < 0 (%d)\n", motion_offset);
 +        av_log(s->avctx, AV_LOG_ERROR, "motion offset < 0 (%d)\n", motion_offset);
-         return -1;
+         return AVERROR_INVALIDDATA;
      } else if (motion_offset > s->upper_motion_limit_offset) {
 -        av_log(s->avctx, AV_LOG_ERROR, " Interplay video: motion offset above limit (%d >= %d)\n",
 +        av_log(s->avctx, AV_LOG_ERROR, "motion offset above limit (%d >= %d)\n",
              motion_offset, s->upper_motion_limit_offset);
-         return -1;
+         return AVERROR_INVALIDDATA;
      }
      if (src->data[0] == NULL) {
          av_log(s->avctx, AV_LOG_ERROR, "Invalid decode type, corrupted header?\n");
@@@ -922,8 -918,8 +918,8 @@@ static void ipvideo_decode_opcodes(Ipvi
                  ret = ipvideo_decode_block16[opcode](s);
              }
              if (ret != 0) {
 -                av_log(s->avctx, AV_LOG_ERROR, " Interplay video: decode problem on frame %d, @ block (%d, %d)\n",
 +                av_log(s->avctx, AV_LOG_ERROR, "decode problem on frame %d, @ block (%d, %d)\n",
-                        frame, x, y);
+                        s->avctx->frame_number, x, y);
                  return;
              }
          }
@@@ -977,9 -970,9 +974,9 @@@ static int ipvideo_decode_frame(AVCodec
                       buf_size - s->decoding_map_size);
  
      s->current_frame.reference = 3;
-     if (ff_get_buffer(avctx, &s->current_frame)) {
+     if ((ret = ff_get_buffer(avctx, &s->current_frame)) < 0) {
 -        av_log(avctx, AV_LOG_ERROR, "  Interplay Video: get_buffer() failed\n");
 +        av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
-         return -1;
+         return ret;
      }
  
      if (!s->is_16bpp) {
@@@ -138,9 -132,9 +138,9 @@@ static int zlib_decomp(AVCodecContext *
      int zret = inflateReset(&c->zstream);
      if (zret != Z_OK) {
          av_log(avctx, AV_LOG_ERROR, "Inflate reset error: %d\n", zret);
-         return -1;
+         return AVERROR_UNKNOWN;
      }
 -    c->zstream.next_in = src;
 +    c->zstream.next_in = (uint8_t *)src;
      c->zstream.avail_in = src_len;
      c->zstream.next_out = c->decomp_buf + offset;
      c->zstream.avail_out = c->decomp_size - offset;
@@@ -119,11 -120,8 +121,12 @@@ static int codec_reinit(AVCodecContext 
      if (quality >= 0)
          get_quant_quality(c, quality);
      if (width != c->width || height != c->height) {
-         if (av_image_check_size(height, width, 0, avctx) < 0 ||
-             buf_size > INT_MAX/8)
 +        // also reserve space for a possible additional header
 +        int buf_size = 24 + height * width * 3 / 2 + AV_LZO_OUTPUT_PADDING;
++        if (buf_size > INT_MAX/8)
 +            return -1;
+         if ((ret = av_image_check_size(height, width, 0, avctx)) < 0)
+             return ret;
          avctx->width  = c->width  = width;
          avctx->height = c->height = height;
          av_fast_malloc(&c->decomp_buf, &c->decomp_size,
@@@ -182,9 -178,9 +185,9 @@@ static int decode_frame(AVCodecContext 
          return orig_size;
      }
  
 -    if (buf[0] != 'V' || buf_size < 12) {
 +    if (buf_size < 12 || buf[0] != 'V') {
          av_log(avctx, AV_LOG_ERROR, "not a nuv video frame\n");
-         return -1;
+         return AVERROR_INVALIDDATA;
      }
      comptype = buf[1];
      switch (comptype) {
@@@ -227,16 -215,9 +230,15 @@@ retry
          w = AV_RL16(&buf[6]);
          h = AV_RL16(&buf[8]);
          q = buf[10];
-         res = codec_reinit(avctx, w, h, q);
-         if (res < 0)
-             return res;
-         if (res) {
+         if ((result = codec_reinit(avctx, w, h, q)) < 0)
+             return result;
++        if (result) {
 +            buf = avpkt->data;
 +            buf_size = avpkt->size;
 +            size_change = 1;
 +            goto retry;
 +        }
-         buf = &buf[RTJPEG_HEADER_SIZE];
+         buf       = &buf[RTJPEG_HEADER_SIZE];
          buf_size -= RTJPEG_HEADER_SIZE;
      }
  
Simple merge
@@@ -255,10 -245,9 +255,10 @@@ static int decode_frame(AVCodecContext 
  {
      uint8_t ctable[128];
      QpegContext * const a = avctx->priv_data;
 -    AVFrame * const p = &a->pic;
 +    AVFrame *  p = &a->pic;
 +    AVFrame * ref= &a->ref;
      uint8_t* outdata;
-     int delta;
+     int delta, ret;
      const uint8_t *pal = av_packet_get_side_data(avpkt, AV_PKT_DATA_PALETTE, NULL);
  
      if (avpkt->size < 0x86) {
      }
  
      bytestream2_init(&a->buffer, avpkt->data, avpkt->size);
 -    p->reference = 3;
 -    if ((ret = avctx->reget_buffer(avctx, p)) < 0) {
 -        av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n");
 +
 +    if(ref->data[0])
 +        avctx->release_buffer(avctx, ref);
 +    FFSWAP(AVFrame, *ref, *p);
 +
 +    p->reference= 3;
-     if(ff_get_buffer(avctx, p) < 0){
++    if ((ret = ff_get_buffer(avctx, p)) < 0) {
 +        av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
-         return -1;
+         return ret;
      }
      outdata = a->pic.data[0];
      bytestream2_skip(&a->buffer, 4);
@@@ -407,14 -389,15 +407,15 @@@ static int qtrle_decode_frame(AVCodecCo
      int header, start_line;
      int height, row_ptr;
      int has_palette = 0;
+     int ret;
  
      bytestream2_init(&s->g, avpkt->data, avpkt->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)) {
+     if ((ret = avctx->reget_buffer(avctx, &s->frame)) < 0) {
          av_log (s->avctx, AV_LOG_ERROR, "reget_buffer() failed\n");
-         return -1;
+         return ret;
      }
  
      /* check if this frame is even supposed to change */
@@@ -170,19 -144,14 +170,19 @@@ static int decode_frame(AVCodecContext 
          return AVERROR_INVALIDDATA;
      }
  
 -    if(s->picture.data[0])
 +    if (s->picture.data[0])
          avctx->release_buffer(avctx, &s->picture);
  
-     if ((ret = av_image_check_size(w, h, 0, avctx)))
 +    if (colors && (colors + first_clr) > 256) {
 +        av_log(avctx, AV_LOG_ERROR, "Incorrect palette: %i colors with offset %i\n", colors, first_clr);
 +        return AVERROR_INVALIDDATA;
 +    }
 +
+     if ((ret = av_image_check_size(w, h, 0, avctx)) < 0)
          return ret;
 -    if(w != avctx->width || h != avctx->height)
 +    if (w != avctx->width || h != avctx->height)
          avcodec_set_dimensions(avctx, w, h);
 -    if ((ret = ff_get_buffer(avctx, p)) < 0){
 +    if ((ret = ff_get_buffer(avctx, p)) < 0) {
          av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
          return ret;
      }
          stride = -p->linesize[0];
      }
  
 -    if(colors){
 +    interleave = flags & TGA_INTERLEAVE2 ? 2 :
 +                 flags & TGA_INTERLEAVE4 ? 4 : 1;
 +
 +    if (colors) {
          int pal_size, pal_sample_size;
 -        if((colors + first_clr) > 256){
 -            av_log(avctx, AV_LOG_ERROR, "Incorrect palette: %i colors with offset %i\n", colors, first_clr);
 -            return AVERROR_INVALIDDATA;
 -        }
++
          switch (csize) {
 +        case 32: pal_sample_size = 4; break;
          case 24: pal_sample_size = 3; break;
          case 16:
          case 15: pal_sample_size = 2; break;