Merge commit '6612a03d7470af4aa6b8aa313b1eff013691d181'
authorMichael Niedermayer <michaelni@gmx.at>
Mon, 17 Mar 2014 14:56:49 +0000 (15:56 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Mon, 17 Mar 2014 14:58:02 +0000 (15:58 +0100)
* commit '6612a03d7470af4aa6b8aa313b1eff013691d181':
  fraps: set color_range

Conflicts:
libavcodec/fraps.c

See: 79f452f4e68696f1daa9f205b35037185959c9ea
Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavcodec/fraps.c

@@@ -161,57 -166,19 +161,58 @@@ static int decode_frame(AVCodecContext 
          return AVERROR_PATCHWELCOME;
      }
  
 -    buf += 4;
 -    if (header_size == 8)
 -        buf += 4;
 +    buf += header_size;
  
 -    pix_fmt = version & 1 ? AV_PIX_FMT_BGR24 : AV_PIX_FMT_YUVJ420P;
 -    if (avctx->pix_fmt != pix_fmt && f->data[0]) {
 -        av_frame_unref(f);
 +    if (version < 2) {
 +        unsigned needed_size = avctx->width * avctx->height * 3;
 +        if (version == 0) needed_size /= 2;
 +        needed_size += header_size;
 +        /* bit 31 means same as previous pic */
 +        if (header & (1U<<31)) {
 +            *got_frame = 0;
 +            return buf_size;
 +        }
 +        if (buf_size != needed_size) {
 +            av_log(avctx, AV_LOG_ERROR,
 +                   "Invalid frame length %d (should be %d)\n",
 +                   buf_size, needed_size);
 +            return AVERROR_INVALIDDATA;
 +        }
 +    } else {
 +        /* skip frame */
 +        if (buf_size == 8) {
 +            *got_frame = 0;
 +            return buf_size;
 +        }
 +        if (AV_RL32(buf) != FPS_TAG || buf_size < planes*1024 + 24) {
 +            av_log(avctx, AV_LOG_ERROR, "Fraps: error in data stream\n");
 +            return AVERROR_INVALIDDATA;
 +        }
 +        for (i = 0; i < planes; i++) {
 +            offs[i] = AV_RL32(buf + 4 + i * 4);
 +            if (offs[i] >= buf_size - header_size || (i && offs[i] <= offs[i - 1] + 1024)) {
 +                av_log(avctx, AV_LOG_ERROR, "Fraps: plane %i offset is out of bounds\n", i);
 +                return AVERROR_INVALIDDATA;
 +            }
 +        }
 +        offs[planes] = buf_size - header_size;
 +        for (i = 0; i < planes; i++) {
 +            av_fast_padded_malloc(&s->tmpbuf, &s->tmpbuf_size, offs[i + 1] - offs[i] - 1024);
 +            if (!s->tmpbuf)
 +                return AVERROR(ENOMEM);
 +        }
      }
 -    avctx->pix_fmt = pix_fmt;
 +
 +    f->pict_type = AV_PICTURE_TYPE_I;
 +    f->key_frame = 1;
 +
 +    avctx->pix_fmt = version & 1 ? AV_PIX_FMT_BGR24 : AV_PIX_FMT_YUVJ420P;
-     avctx->color_range = version & 1 ? AVCOL_RANGE_UNSPECIFIED : AVCOL_RANGE_JPEG;
+     avctx->color_range = version & 1 ? AVCOL_RANGE_UNSPECIFIED
+                                      : AVCOL_RANGE_JPEG;
 +    avctx->colorspace = version & 1 ? AVCOL_SPC_UNSPECIFIED : AVCOL_SPC_BT709;
  
 -    expected_size = header_size;
 +    if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0)
 +        return ret;
  
      switch (version) {
      case 0: