|
|
|
@ -111,6 +111,7 @@ static av_cold int smvjpeg_decode_init(AVCodecContext *avctx) |
|
|
|
|
s->avctx = avcodec_alloc_context3(codec); |
|
|
|
|
|
|
|
|
|
av_dict_set(&thread_opt, "threads", "1", 0); |
|
|
|
|
s->avctx->refcounted_frames = 1; |
|
|
|
|
s->avctx->flags = avctx->flags; |
|
|
|
|
s->avctx->idct_algo = avctx->idct_algo; |
|
|
|
|
if (ff_codec_open2_recursive(s->avctx, codec, &thread_opt) < 0) { |
|
|
|
@ -133,9 +134,10 @@ static int smvjpeg_decode_frame(AVCodecContext *avctx, void *data, int *data_siz |
|
|
|
|
cur_frame = avpkt->pts % s->frames_per_jpeg; |
|
|
|
|
|
|
|
|
|
/* Are we at the start of a block? */ |
|
|
|
|
if (!cur_frame) |
|
|
|
|
if (!cur_frame) { |
|
|
|
|
av_frame_unref(mjpeg_data); |
|
|
|
|
ret = avcodec_decode_video2(s->avctx, mjpeg_data, &s->mjpeg_data_size, avpkt); |
|
|
|
|
else if (!s->mjpeg_data_size) |
|
|
|
|
} else if (!s->mjpeg_data_size) |
|
|
|
|
return AVERROR(EINVAL); |
|
|
|
|
|
|
|
|
|
desc = av_pix_fmt_desc_get(s->avctx->pix_fmt); |
|
|
|
@ -177,6 +179,7 @@ static av_cold int smvjpeg_decode_end(AVCodecContext *avctx) |
|
|
|
|
MJpegDecodeContext *jpg = &s->jpg; |
|
|
|
|
|
|
|
|
|
jpg->picture_ptr = NULL; |
|
|
|
|
av_frame_free(&s->picture[0]); |
|
|
|
|
av_frame_free(&s->picture[1]); |
|
|
|
|
ff_codec_close_recursive(s->avctx); |
|
|
|
|
av_freep(&s->avctx); |
|
|
|
|