# HG changeset patch # User reimar # Date 1220632286 0 # Node ID c4f105f7c8867d395cd54d7cc35b619829981039 # Parent e7ec66d55d9e14b8873934a1a1ec7701dc89170a Fix nuv decoder to use reget_buffer for non-keyframes and correctly identify non-keyframe RTJPEG frames. diff -r e7ec66d55d9e -r c4f105f7c886 nuv.c --- a/nuv.c Fri Sep 05 00:01:23 2008 +0000 +++ b/nuv.c Fri Sep 05 16:31:26 2008 +0000 @@ -132,6 +132,8 @@ 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 @@ 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 @@ 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 @@ break; } case NUV_COPY_LAST: { - c->pic.pict_type = FF_P_TYPE; - c->pic.key_frame = 0; /* nothing more to do here */ break; }