|
|
|
@ -31,7 +31,7 @@ |
|
|
|
|
#include "rtjpeg.h" |
|
|
|
|
|
|
|
|
|
typedef struct { |
|
|
|
|
AVFrame pic; |
|
|
|
|
AVFrame *pic; |
|
|
|
|
int codec_frameheader; |
|
|
|
|
int quality; |
|
|
|
|
int width, height; |
|
|
|
@ -137,7 +137,7 @@ static int codec_reinit(AVCodecContext *avctx, int width, int height, |
|
|
|
|
c->decomp_buf = ptr; |
|
|
|
|
ff_rtjpeg_decode_init(&c->rtj, &c->dsp, c->width, c->height, |
|
|
|
|
c->lq, c->cq); |
|
|
|
|
av_frame_unref(&c->pic); |
|
|
|
|
av_frame_unref(c->pic); |
|
|
|
|
} else if (quality != c->quality) |
|
|
|
|
ff_rtjpeg_decode_init(&c->rtj, &c->dsp, c->width, c->height, |
|
|
|
|
c->lq, c->cq); |
|
|
|
@ -232,23 +232,23 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (keyframe) { |
|
|
|
|
av_frame_unref(&c->pic); |
|
|
|
|
av_frame_unref(c->pic); |
|
|
|
|
init_frame = 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
result = ff_reget_buffer(avctx, &c->pic); |
|
|
|
|
result = ff_reget_buffer(avctx, c->pic); |
|
|
|
|
if (result < 0) { |
|
|
|
|
av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); |
|
|
|
|
return result; |
|
|
|
|
} |
|
|
|
|
if (init_frame) { |
|
|
|
|
memset(c->pic.data[0], 0, avctx->height * c->pic.linesize[0]); |
|
|
|
|
memset(c->pic.data[1], 0x80, avctx->height * c->pic.linesize[1] / 2); |
|
|
|
|
memset(c->pic.data[2], 0x80, avctx->height * c->pic.linesize[2] / 2); |
|
|
|
|
memset(c->pic->data[0], 0, avctx->height * c->pic->linesize[0]); |
|
|
|
|
memset(c->pic->data[1], 0x80, avctx->height * c->pic->linesize[1] / 2); |
|
|
|
|
memset(c->pic->data[2], 0x80, avctx->height * c->pic->linesize[2] / 2); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
c->pic.pict_type = keyframe ? AV_PICTURE_TYPE_I : AV_PICTURE_TYPE_P; |
|
|
|
|
c->pic.key_frame = keyframe; |
|
|
|
|
c->pic->pict_type = keyframe ? AV_PICTURE_TYPE_I : AV_PICTURE_TYPE_P; |
|
|
|
|
c->pic->key_frame = keyframe; |
|
|
|
|
// decompress/copy/whatever data
|
|
|
|
|
switch (comptype) { |
|
|
|
|
case NUV_LZO: |
|
|
|
@ -258,19 +258,19 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, |
|
|
|
|
av_log(avctx, AV_LOG_ERROR, "uncompressed frame too short\n"); |
|
|
|
|
height = buf_size / c->width / 3 * 2; |
|
|
|
|
} |
|
|
|
|
copy_frame(&c->pic, buf, c->width, height); |
|
|
|
|
copy_frame(c->pic, buf, c->width, height); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
case NUV_RTJPEG_IN_LZO: |
|
|
|
|
case NUV_RTJPEG: |
|
|
|
|
ret = ff_rtjpeg_decode_frame_yuv420(&c->rtj, &c->pic, buf, buf_size); |
|
|
|
|
ret = ff_rtjpeg_decode_frame_yuv420(&c->rtj, c->pic, buf, buf_size); |
|
|
|
|
if (ret < 0) |
|
|
|
|
return ret; |
|
|
|
|
break; |
|
|
|
|
case NUV_BLACK: |
|
|
|
|
memset(c->pic.data[0], 0, c->width * c->height); |
|
|
|
|
memset(c->pic.data[1], 128, c->width * c->height / 4); |
|
|
|
|
memset(c->pic.data[2], 128, c->width * c->height / 4); |
|
|
|
|
memset(c->pic->data[0], 0, c->width * c->height); |
|
|
|
|
memset(c->pic->data[1], 128, c->width * c->height / 4); |
|
|
|
|
memset(c->pic->data[2], 128, c->width * c->height / 4); |
|
|
|
|
break; |
|
|
|
|
case NUV_COPY_LAST: |
|
|
|
|
/* nothing more to do here */ |
|
|
|
@ -280,7 +280,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, |
|
|
|
|
return AVERROR_INVALIDDATA; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ((result = av_frame_ref(picture, &c->pic)) < 0) |
|
|
|
|
if ((result = av_frame_ref(picture, c->pic)) < 0) |
|
|
|
|
return result; |
|
|
|
|
|
|
|
|
|
*got_frame = 1; |
|
|
|
@ -292,8 +292,11 @@ static av_cold int decode_init(AVCodecContext *avctx) |
|
|
|
|
NuvContext *c = avctx->priv_data; |
|
|
|
|
int ret; |
|
|
|
|
|
|
|
|
|
c->pic = av_frame_alloc(); |
|
|
|
|
if (!c->pic) |
|
|
|
|
return AVERROR(ENOMEM); |
|
|
|
|
|
|
|
|
|
avctx->pix_fmt = AV_PIX_FMT_YUV420P; |
|
|
|
|
c->pic.data[0] = NULL; |
|
|
|
|
c->decomp_buf = NULL; |
|
|
|
|
c->quality = -1; |
|
|
|
|
c->width = 0; |
|
|
|
@ -317,7 +320,7 @@ static av_cold int decode_end(AVCodecContext *avctx) |
|
|
|
|
NuvContext *c = avctx->priv_data; |
|
|
|
|
|
|
|
|
|
av_freep(&c->decomp_buf); |
|
|
|
|
av_frame_unref(&c->pic); |
|
|
|
|
av_frame_free(&c->pic); |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|