Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Sun, 8 Jan 2012 23:32:38 +0000 (00:32 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Sun, 8 Jan 2012 23:32:38 +0000 (00:32 +0100)
* qatar/master:
  bfi: Use bytestream2 functions to prevent buffer overreads.
  dpcm: Fix invalid writes
  utvideo: frame multithreading.
  vorbis: An additional defense in the Vorbis codec.
  vorbisdec: Fix decoding bug with channel handling

Conflicts:
libavcodec/dpcm.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavcodec/bfi.c
libavcodec/dpcm.c
libavcodec/utvideo.c

diff --combined libavcodec/bfi.c
index 2aa1a4cb658835e1cf0e3dcef2eca4d5270b7df4,542ba5421c879f6abcfd82a9b290764d873c6d4b..0a7324a297d87cef77c93a0d8b7205a850bc1d15
@@@ -2,20 -2,20 +2,20 @@@
   * Brute Force & Ignorance (BFI) video decoder
   * Copyright (c) 2008 Sisir Koppaka
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
@@@ -34,14 -34,12 +34,14 @@@ typedef struct BFIContext 
      AVCodecContext *avctx;
      AVFrame frame;
      uint8_t *dst;
 +    uint32_t pal[256];
  } BFIContext;
  
  static av_cold int bfi_decode_init(AVCodecContext *avctx)
  {
      BFIContext *bfi = avctx->priv_data;
      avctx->pix_fmt = PIX_FMT_PAL8;
 +    avcodec_get_frame_defaults(&bfi->frame);
      bfi->dst = av_mallocz(avctx->width * avctx->height);
      return 0;
  }
@@@ -49,7 -47,7 +49,7 @@@
  static int bfi_decode_frame(AVCodecContext *avctx, void *data,
                              int *data_size, AVPacket *avpkt)
  {
-     const uint8_t *buf = avpkt->data, *buf_end = avpkt->data + avpkt->size;
+     GetByteContext g;
      int buf_size = avpkt->size;
      BFIContext *bfi = avctx->priv_data;
      uint8_t *dst = bfi->dst;
      if (bfi->frame.data[0])
          avctx->release_buffer(avctx, &bfi->frame);
  
 -    bfi->frame.reference = 1;
 +    bfi->frame.reference = 3;
  
      if (avctx->get_buffer(avctx, &bfi->frame) < 0) {
          av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
          return -1;
      }
  
+     bytestream2_init(&g, avpkt->data, buf_size);
      /* Set frame parameters and palette, if necessary */
      if (!avctx->frame_number) {
          bfi->frame.pict_type = AV_PICTURE_TYPE_I;
          pal = (uint32_t *)bfi->frame.data[1];
          for (i = 0; i < avctx->extradata_size / 3; i++) {
              int shift = 16;
 -            *pal = 0;
 +            *pal = 0xFF << 24;
              for (j = 0; j < 3; j++, shift -= 8)
                  *pal +=
                      ((avctx->extradata[i * 3 + j] << 2) |
                      (avctx->extradata[i * 3 + j] >> 4)) << shift;
              pal++;
          }
 +        memcpy(bfi->pal, bfi->frame.data[1], sizeof(bfi->pal));
          bfi->frame.palette_has_changed = 1;
      } else {
          bfi->frame.pict_type = AV_PICTURE_TYPE_P;
          bfi->frame.key_frame = 0;
 +        bfi->frame.palette_has_changed = 0;
 +        memcpy(bfi->frame.data[1], bfi->pal, sizeof(bfi->pal));
      }
  
-     buf += 4; // Unpacked size, not required.
+     bytestream2_skip(&g, 4); // Unpacked size, not required.
  
      while (dst != frame_end) {
          static const uint8_t lentab[4] = { 0, 2, 0, 1 };
-         unsigned int byte   = *buf++, av_uninit(offset);
+         unsigned int byte   = bytestream2_get_byte(&g), av_uninit(offset);
          unsigned int code   = byte >> 6;
          unsigned int length = byte & ~0xC0;
  
-         if (buf >= buf_end) {
+         if (!bytestream2_get_bytes_left(&g)) {
              av_log(avctx, AV_LOG_ERROR,
                     "Input resolution larger than actual frame.\n");
              return -1;
          /* Get length and offset(if required) */
          if (length == 0) {
              if (code == 1) {
-                 length = bytestream_get_byte(&buf);
-                 offset = bytestream_get_le16(&buf);
+                 length = bytestream2_get_byte(&g);
+                 offset = bytestream2_get_le16(&g);
              } else {
-                 length = bytestream_get_le16(&buf);
+                 length = bytestream2_get_le16(&g);
                  if (code == 2 && length == 0)
                      break;
              }
          } else {
              if (code == 1)
-                 offset = bytestream_get_byte(&buf);
+                 offset = bytestream2_get_byte(&g);
          }
  
          /* Do boundary check */
          switch (code) {
  
          case 0:                //Normal Chain
-             if (length >= buf_end - buf) {
+             if (length >= bytestream2_get_bytes_left(&g)) {
                  av_log(avctx, AV_LOG_ERROR, "Frame larger than buffer.\n");
                  return -1;
              }
-             bytestream_get_buffer(&buf, dst, length);
+             bytestream2_get_buffer(&g, dst, length);
              dst += length;
              break;
  
              break;
  
          case 3:                //Fill Chain
-             colour1 = bytestream_get_byte(&buf);
-             colour2 = bytestream_get_byte(&buf);
+             colour1 = bytestream2_get_byte(&g);
+             colour2 = bytestream2_get_byte(&g);
              while (length--) {
                  *dst++ = colour1;
                  *dst++ = colour2;
diff --combined libavcodec/dpcm.c
index 5f186ebd0d4c3155b11599c60280e4064511bd8d,1b0f6b005b2a1c5c4f4836dbe28e60f98310f340..929458a22b2d4d6a1eed2345c76daf329e652bbb
@@@ -2,20 -2,20 +2,20 @@@
   * Assorted DPCM codecs
   * Copyright (c) 2003 The ffmpeg Project
   *
 - * This file is part of Libav.
 + * This file is part of FFmpeg.
   *
 - * Libav is free software; you can redistribute it and/or
 + * FFmpeg is free software; you can redistribute it and/or
   * modify it under the terms of the GNU Lesser General Public
   * License as published by the Free Software Foundation; either
   * version 2.1 of the License, or (at your option) any later version.
   *
 - * Libav is distributed in the hope that it will be useful,
 + * FFmpeg is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * Lesser General Public License for more details.
   *
   * You should have received a copy of the GNU Lesser General Public
 - * License along with Libav; if not, write to the Free Software
 + * License along with FFmpeg; if not, write to the Free Software
   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
   */
  
@@@ -288,7 -288,7 +288,7 @@@ static int dpcm_decode_frame(AVCodecCon
      }
      case CODEC_ID_SOL_DPCM:
          if (avctx->codec_tag != 3) {
-             uint8_t *output_samples_u8 = output_samples;
+             uint8_t *output_samples_u8 = s->frame.data[0];
              while (buf < buf_end) {
                  uint8_t n = *buf++;
  
diff --combined libavcodec/utvideo.c
index 906a61f9f8ee9a82962d2a4cf767b7932652df14,89854c277c4b6ca27ec25b09c4cec6f9d3750142..a45f13fa54e6c03d0ba2f2fe309dc4d93e4f4e5d
@@@ -31,6 -31,7 +31,7 @@@
  #include "bytestream.h"
  #include "get_bits.h"
  #include "dsputil.h"
+ #include "thread.h"
  
  enum {
      PRED_NONE = 0,
@@@ -366,15 -367,17 +367,17 @@@ static int decode_frame(AVCodecContext 
      int ret;
  
      if (c->pic.data[0])
-         avctx->release_buffer(avctx, &c->pic);
+         ff_thread_release_buffer(avctx, &c->pic);
  
 -    c->pic.reference = 1;
 +    c->pic.reference = 3;
      c->pic.buffer_hints = FF_BUFFER_HINTS_VALID;
-     if ((ret = avctx->get_buffer(avctx, &c->pic)) < 0) {
+     if ((ret = ff_thread_get_buffer(avctx, &c->pic)) < 0) {
          av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
          return ret;
      }
  
+     ff_thread_finish_setup(avctx);
      /* parse plane structure to retrieve frame flags and validate slice offsets */
      ptr = buf;
      for (i = 0; i < c->planes; i++) {
@@@ -557,7 -560,7 +560,7 @@@ static av_cold int decode_end(AVCodecCo
      UtvideoContext * const c = avctx->priv_data;
  
      if (c->pic.data[0])
-         avctx->release_buffer(avctx, &c->pic);
+         ff_thread_release_buffer(avctx, &c->pic);
  
      av_freep(&c->slice_bits);
  
@@@ -572,7 -575,7 +575,7 @@@ AVCodec ff_utvideo_decoder = 
      .init           = decode_init,
      .close          = decode_end,
      .decode         = decode_frame,
-     .capabilities   = CODEC_CAP_DR1,
+     .capabilities   = CODEC_CAP_DR1 | CODEC_CAP_FRAME_THREADS,
      .long_name      = NULL_IF_CONFIG_SMALL("Ut Video"),
  };