From 2881a656ff6a0fd5e94c7f73eb65fd1a4b32a514 Mon Sep 17 00:00:00 2001 From: Reimar Döffinger Date: Fri, 5 Sep 2008 16:31:26 +0000 Subject: Fix nuv decoder to use reget_buffer for non-keyframes and correctly identify non-keyframe RTJPEG frames. Originally committed as revision 15217 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/nuv.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) (limited to 'libavcodec/nuv.c') diff --git a/libavcodec/nuv.c b/libavcodec/nuv.c index 189a4e9e29..7f6e5d336e 100644 --- a/libavcodec/nuv.c +++ b/libavcodec/nuv.c @@ -132,6 +132,8 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, NuvContext *c = avctx->priv_data; AVFrame *picture = data; int orig_size = buf_size; + int keyframe; + int result; enum {NUV_UNCOMPRESSED = '0', NUV_RTJPEG = '1', NUV_RTJPEG_IN_LZO = '2', NUV_LZO = '3', NUV_BLACK = 'N', NUV_COPY_LAST = 'L'} comptype; @@ -159,6 +161,15 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, return -1; } comptype = buf[1]; + switch (comptype) { + case NUV_RTJPEG_IN_LZO: + case NUV_RTJPEG: + keyframe = !buf[2]; break; + case NUV_COPY_LAST: + keyframe = 0; break; + default: + keyframe = 1; break; + } // skip rest of the frameheader. buf = &buf[12]; buf_size -= 12; @@ -184,18 +195,19 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, buf_size -= 12; } - if (c->pic.data[0]) + if (keyframe && c->pic.data[0]) avctx->release_buffer(avctx, &c->pic); c->pic.reference = 1; c->pic.buffer_hints = FF_BUFFER_HINTS_VALID | FF_BUFFER_HINTS_READABLE | FF_BUFFER_HINTS_PRESERVE | FF_BUFFER_HINTS_REUSABLE; - if (avctx->get_buffer(avctx, &c->pic) < 0) { + result = keyframe ? avctx->get_buffer(avctx, &c->pic) : avctx->reget_buffer(avctx, &c->pic); + if (result < 0) { av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); return -1; } - c->pic.pict_type = FF_I_TYPE; - c->pic.key_frame = 1; + c->pic.pict_type = keyframe ? FF_I_TYPE : FF_P_TYPE; + c->pic.key_frame = keyframe; // decompress/copy/whatever data switch (comptype) { case NUV_LZO: @@ -220,8 +232,6 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, break; } case NUV_COPY_LAST: { - c->pic.pict_type = FF_P_TYPE; - c->pic.key_frame = 0; /* nothing more to do here */ break; } -- cgit v1.2.3