Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Tue, 27 Mar 2012 09:52:08 +0000 (11:52 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Tue, 27 Mar 2012 09:59:39 +0000 (11:59 +0200)
* qatar/master:
  make av_interleaved_write_frame() flush packets when pkt is NULL
  mpegts: Fix dead error checks
  vc1: Do not read from array if index is invalid.
  targa: convert to bytestream2.
  rv34: set mb_num_left to 0 after finishing a frame

Conflicts:
libavcodec/targa.c
libavcodec/vc1data.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavcodec/rv34.c
libavcodec/targa.c
libavcodec/vc1.c
libavcodec/vc1data.c
libavcodec/vc1dec.c
libavformat/avformat.h
libavformat/mpegts.c
libavformat/utils.c

Simple merge
@@@ -49,53 -43,54 +43,54 @@@ static int targa_decode_rle(AVCodecCont
  
      diff = stride - w * depth;
      x = y = 0;
-     while(y < h){
-         CHECK_BUFFER_SIZE(src, src_end, 1, "image type");
-         type = *src++;
+     while (y < h) {
+         if (bytestream2_get_bytes_left(&s->gb) <= 0) {
+             av_log(avctx, AV_LOG_ERROR,
+                    "Ran ouf of data before end-of-image\n");
+             return AVERROR_INVALIDDATA;
+         }
+         type  = bytestream2_get_byteu(&s->gb);
          count = (type & 0x7F) + 1;
          type &= 0x80;
 -        if (x + count > w && x + count + 1 > (h - y) * w) {
 +        if(x + count > (h - y) * w){
-             av_log(avctx, AV_LOG_ERROR, "Packet went out of bounds: position (%i,%i) size %i\n", x, y, count);
-             return -1;
-         }
-         if(type){
-             CHECK_BUFFER_SIZE(src, src_end, depth, "image data");
-         }else{
-             CHECK_BUFFER_SIZE(src, src_end, count * depth, "image data");
+             av_log(avctx, AV_LOG_ERROR,
+                    "Packet went out of bounds: position (%i,%i) size %i\n",
+                    x, y, count);
+             return AVERROR_INVALIDDATA;
          }
-         for(i = 0; i < count; i++){
-             switch(depth){
-             case 1:
-                 *dst = *src;
-                 break;
-             case 2:
-                 AV_WN16A(dst, AV_RN16A(src));
-                 break;
-             case 3:
-                 dst[0] = src[0];
-                 dst[1] = src[1];
-                 dst[2] = src[2];
-                 break;
-             case 4:
-                 AV_WN32A(dst, AV_RN32A(src));
-                 break;
-             }
-             dst += depth;
-             if(!type)
-                 src += depth;
-             x++;
-             if(x == w){
-                 x = 0;
-                 y++;
-                 dst += diff;
-             }
+         if (!type) {
+             do {
+                 int n  = FFMIN(count, w - x);
+                 bytestream2_get_buffer(&s->gb, dst, n * depth);
+                 count -= n;
+                 dst   += n * depth;
+                 x     += n;
+                 if (x == w) {
+                     x    = 0;
+                     y++;
+                     dst += diff;
+                 }
+             } while (count > 0);
+         } else {
+             uint8_t tmp[4];
+             bytestream2_get_buffer(&s->gb, tmp, depth);
+             do {
+                 int n  = FFMIN(count, w - x);
+                 count -= n;
+                 x     += n;
+                 do {
+                     memcpy(dst, tmp, depth);
+                     dst += depth;
+                 } while (--n);
+                 if (x == w) {
+                     x    = 0;
+                     y++;
+                     dst += diff;
+                 }
+             } while (count > 0);
          }
-         if(type)
-             src += depth;
      }
-     return src_size;
+     return 0;
  }
  
  static int decode_frame(AVCodecContext *avctx,
      AVFrame * const p = &s->picture;
      uint8_t *dst;
      int stride;
 -    int idlen, compr, y, w, h, bpp, flags;
 +    int idlen, pal, compr, y, w, h, bpp, flags;
      int first_clr, colors, csize;
  
+     bytestream2_init(&s->gb, avpkt->data, avpkt->size);
      /* parse image header */
-     CHECK_BUFFER_SIZE(buf, buf_end, 18, "header");
-     idlen = *buf++;
-     pal = *buf++;
-     compr = *buf++;
-     first_clr = bytestream_get_le16(&buf);
-     colors = bytestream_get_le16(&buf);
-     csize = *buf++;
+     idlen     = bytestream2_get_byte(&s->gb);
 -    bytestream2_skip(&s->gb, 1); /* pal */
++    pal       = bytestream2_get_byte(&s->gb);
+     compr     = bytestream2_get_byte(&s->gb);
+     first_clr = bytestream2_get_le16(&s->gb);
+     colors    = bytestream2_get_le16(&s->gb);
+     csize     = bytestream2_get_byte(&s->gb);
+     bytestream2_skip(&s->gb, 4); /* 2: x, 2: y */
+     w         = bytestream2_get_le16(&s->gb);
+     h         = bytestream2_get_le16(&s->gb);
+     bpp       = bytestream2_get_byte(&s->gb);
++
++    if (bytestream2_get_bytes_left(&s->gb) <= idlen) {
++        av_log(avctx, AV_LOG_ERROR,
++                "Not enough data to read header\n");
++        return AVERROR_INVALIDDATA;
++    }
++
+     flags     = bytestream2_get_byte(&s->gb);
++
 +    if (!pal && (first_clr || colors || csize)) {
 +        av_log(avctx, AV_LOG_WARNING, "File without colormap has colormap information set.\n");
 +        // specification says we should ignore those value in this case
 +        first_clr = colors = csize = 0;
 +    }
-     buf += 2; /* x */
-     y = bytestream_get_le16(&buf);
-     w = bytestream_get_le16(&buf);
-     h = bytestream_get_le16(&buf);
-     bpp = *buf++;
-     flags = *buf++;
-     //skip identifier if any
-     CHECK_BUFFER_SIZE(buf, buf_end, idlen, "identifiers");
-     buf += idlen;
-     s->bpp = bpp;
-     s->width = w;
-     s->height = h;
-     switch(s->bpp){
++
+     // skip identifier if any
+     bytestream2_skip(&s->gb, idlen);
+     switch(bpp){
      case 8:
          avctx->pix_fmt = ((compr & (~TGA_RLE)) == TGA_BW) ? PIX_FMT_GRAY8 : PIX_FMT_PAL8;
          break;
              case 3:
                  /* RGB24 */
                  for (t = 0; t < colors; t++)
-                     *pal++ = (0xffU<<24) | bytestream_get_le24(&buf);
 -                    *pal++ = bytestream2_get_le24u(&s->gb);
++                    *pal++ = (0xffU<<24) | bytestream2_get_le24u(&s->gb);
                  break;
              case 2:
                  /* RGB555 */
              }
          }
      }
-         for(y = 0; y < s->height; y++){
 +    if(flags & 0x10){ // right-to-left, needs horizontal flip
 +        int x;
-             for(x = 0; x < s->width >> 1; x++){
-                 switch(s->bpp){
++        for(y = 0; y < h; y++){
 +            void *line = &p->data[0][y * p->linesize[0]];
-                     FFSWAP(uint32_t, ((uint32_t *)line)[x], ((uint32_t *)line)[s->width - x - 1]);
++            for(x = 0; x < w >> 1; x++){
++                switch(bpp){
 +                case 32:
-                     FFSWAP(uint8_t, ((uint8_t *)line)[3 * x    ], ((uint8_t *)line)[3 * s->width - 3 * x - 3]);
-                     FFSWAP(uint8_t, ((uint8_t *)line)[3 * x + 1], ((uint8_t *)line)[3 * s->width - 3 * x - 2]);
-                     FFSWAP(uint8_t, ((uint8_t *)line)[3 * x + 2], ((uint8_t *)line)[3 * s->width - 3 * x - 1]);
++                    FFSWAP(uint32_t, ((uint32_t *)line)[x], ((uint32_t *)line)[w - x - 1]);
 +                    break;
 +                case 24:
-                     FFSWAP(uint16_t, ((uint16_t *)line)[x], ((uint16_t *)line)[s->width - x - 1]);
++                    FFSWAP(uint8_t, ((uint8_t *)line)[3 * x    ], ((uint8_t *)line)[3 * w - 3 * x - 3]);
++                    FFSWAP(uint8_t, ((uint8_t *)line)[3 * x + 1], ((uint8_t *)line)[3 * w - 3 * x - 2]);
++                    FFSWAP(uint8_t, ((uint8_t *)line)[3 * x + 2], ((uint8_t *)line)[3 * w - 3 * x - 1]);
 +                    break;
 +                case 16:
-                     FFSWAP(uint8_t, ((uint8_t *)line)[x], ((uint8_t *)line)[s->width - x - 1]);
++                    FFSWAP(uint16_t, ((uint16_t *)line)[x], ((uint16_t *)line)[w - x - 1]);
 +                    break;
 +                case 8:
++                    FFSWAP(uint8_t, ((uint8_t *)line)[x], ((uint8_t *)line)[w - x - 1]);
 +                }
 +            }
 +        }
 +    }
  
      *picture   = s->picture;
      *data_size = sizeof(AVPicture);
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -1428,11 -1389,11 +1428,12 @@@ static void pmt_cb(MpegTSFilter *filter
          return;
  
      clear_program(ts, h->id);
-     pcr_pid = get16(&p, p_end) & 0x1fff;
+     pcr_pid = get16(&p, p_end);
      if (pcr_pid < 0)
          return;
+     pcr_pid &= 0x1fff;
      add_pid_to_pmt(ts, h->id, pcr_pid);
 +    set_pcr_pid(ts->stream, h->id, pcr_pid);
  
      av_dlog(ts->stream, "pcr_pid=0x%x\n", pcr_pid);
  
Simple merge