diff options
author | Reimar Döffinger <Reimar.Doeffinger@gmx.de> | 2008-09-05 16:31:26 +0000 |
---|---|---|
committer | Reimar Döffinger <Reimar.Doeffinger@gmx.de> | 2008-09-05 16:31:26 +0000 |
commit | 2881a656ff6a0fd5e94c7f73eb65fd1a4b32a514 (patch) | |
tree | a5e81d48cefac09513da6cc87f2ad674287bbdcd | |
parent | cf74dd4a5c17332fb2d5d340fdb129600253fe52 (diff) | |
download | ffmpeg-2881a656ff6a0fd5e94c7f73eb65fd1a4b32a514.tar.gz |
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
-rw-r--r-- | libavcodec/nuv.c | 22 |
1 files changed, 16 insertions, 6 deletions
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; } |