|
|
|
@ -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; |
|
|
|
|
} |
|
|
|
|