|
|
|
@@ -139,7 +139,7 @@ static int decode_frame(AVCodecContext *avctx, |
|
|
|
uint32_t *luma1,*luma2,*cb,*cr; |
|
|
|
uint32_t offs[4]; |
|
|
|
int i, j, is_chroma, planes; |
|
|
|
|
|
|
|
enum PixelFormat pix_fmt; |
|
|
|
|
|
|
|
header = AV_RL32(buf); |
|
|
|
version = header & 0xff; |
|
|
|
@@ -156,12 +156,16 @@ static int decode_frame(AVCodecContext *avctx, |
|
|
|
if (header_size == 8) |
|
|
|
buf+=4; |
|
|
|
|
|
|
|
pix_fmt = version & 1 ? PIX_FMT_BGR24 : PIX_FMT_YUVJ420P; |
|
|
|
if (avctx->pix_fmt != pix_fmt && f->data[0]) { |
|
|
|
avctx->release_buffer(avctx, f); |
|
|
|
} |
|
|
|
avctx->pix_fmt = pix_fmt; |
|
|
|
|
|
|
|
switch(version) { |
|
|
|
case 0: |
|
|
|
default: |
|
|
|
/* Fraps v0 is a reordered YUV420 */ |
|
|
|
avctx->pix_fmt = PIX_FMT_YUVJ420P; |
|
|
|
|
|
|
|
if ( (buf_size != avctx->width*avctx->height*3/2+header_size) && |
|
|
|
(buf_size != header_size) ) { |
|
|
|
av_log(avctx, AV_LOG_ERROR, |
|
|
|
@@ -209,8 +213,6 @@ static int decode_frame(AVCodecContext *avctx, |
|
|
|
|
|
|
|
case 1: |
|
|
|
/* Fraps v1 is an upside-down BGR24 */ |
|
|
|
avctx->pix_fmt = PIX_FMT_BGR24; |
|
|
|
|
|
|
|
if ( (buf_size != avctx->width*avctx->height*3+header_size) && |
|
|
|
(buf_size != header_size) ) { |
|
|
|
av_log(avctx, AV_LOG_ERROR, |
|
|
|
@@ -245,7 +247,6 @@ static int decode_frame(AVCodecContext *avctx, |
|
|
|
* Fraps v2 is Huffman-coded YUV420 planes |
|
|
|
* Fraps v4 is virtually the same |
|
|
|
*/ |
|
|
|
avctx->pix_fmt = PIX_FMT_YUVJ420P; |
|
|
|
planes = 3; |
|
|
|
f->reference = 1; |
|
|
|
f->buffer_hints = FF_BUFFER_HINTS_VALID | |
|
|
|
@@ -291,7 +292,6 @@ static int decode_frame(AVCodecContext *avctx, |
|
|
|
case 3: |
|
|
|
case 5: |
|
|
|
/* Virtually the same as version 4, but is for RGB24 */ |
|
|
|
avctx->pix_fmt = PIX_FMT_BGR24; |
|
|
|
planes = 3; |
|
|
|
f->reference = 1; |
|
|
|
f->buffer_hints = FF_BUFFER_HINTS_VALID | |
|
|
|
|