diff options
author | Anton Khirnov <anton@khirnov.net> | 2012-11-21 21:34:46 +0100 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2013-03-08 07:38:30 +0100 |
commit | 759001c534287a96dc96d1e274665feb7059145d (patch) | |
tree | 6ace9560c20aa30db92067c5b45d7bd86e458d10 /libavcodec/libopenjpegdec.c | |
parent | 6e7b50b4270116ded8b874d76cb7c5b1a0341827 (diff) | |
download | ffmpeg-759001c534287a96dc96d1e274665feb7059145d.tar.gz |
lavc decoders: work with refcounted frames.
Diffstat (limited to 'libavcodec/libopenjpegdec.c')
-rw-r--r-- | libavcodec/libopenjpegdec.c | 31 |
1 files changed, 3 insertions, 28 deletions
diff --git a/libavcodec/libopenjpegdec.c b/libavcodec/libopenjpegdec.c index 8f956f473f..19ab1605ec 100644 --- a/libavcodec/libopenjpegdec.c +++ b/libavcodec/libopenjpegdec.c @@ -67,7 +67,6 @@ static const enum AVPixelFormat any_pix_fmts[] = {RGB_PIXEL_FORMATS, typedef struct { AVClass *class; opj_dparameters_t dec_params; - AVFrame image; int lowres; int lowqual; } LibOpenJPEGContext; @@ -239,16 +238,6 @@ static av_cold int libopenjpeg_decode_init(AVCodecContext *avctx) LibOpenJPEGContext *ctx = avctx->priv_data; opj_set_default_decoder_parameters(&ctx->dec_params); - avcodec_get_frame_defaults(&ctx->image); - avctx->coded_frame = &ctx->image; - return 0; -} - -static av_cold int libopenjpeg_decode_init_thread_copy(AVCodecContext *avctx) -{ - LibOpenJPEGContext *ctx = avctx->priv_data; - - avctx->coded_frame = &ctx->image; return 0; } @@ -259,7 +248,8 @@ static int libopenjpeg_decode_frame(AVCodecContext *avctx, uint8_t *buf = avpkt->data; int buf_size = avpkt->size; LibOpenJPEGContext *ctx = avctx->priv_data; - AVFrame *picture = &ctx->image, *output = data; + ThreadFrame frame = { .f = data }; + AVFrame *picture = data; const AVPixFmtDescriptor *desc; opj_dinfo_t *dec; opj_cio_t *stream; @@ -347,10 +337,7 @@ static int libopenjpeg_decode_frame(AVCodecContext *avctx, if (image->comps[i].prec > avctx->bits_per_raw_sample) avctx->bits_per_raw_sample = image->comps[i].prec; - if (picture->data[0]) - ff_thread_release_buffer(avctx, picture); - - if (ff_thread_get_buffer(avctx, picture) < 0) { + if (ff_thread_get_buffer(avctx, &frame, 0) < 0) { av_log(avctx, AV_LOG_ERROR, "ff_thread_get_buffer() failed\n"); goto done; } @@ -411,7 +398,6 @@ static int libopenjpeg_decode_frame(AVCodecContext *avctx, goto done; } - *output = ctx->image; *got_frame = 1; ret = buf_size; @@ -421,15 +407,6 @@ done: return ret; } -static av_cold int libopenjpeg_decode_close(AVCodecContext *avctx) -{ - LibOpenJPEGContext *ctx = avctx->priv_data; - - if (ctx->image.data[0]) - ff_thread_release_buffer(avctx, &ctx->image); - return 0; -} - #define OFFSET(x) offsetof(LibOpenJPEGContext, x) #define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM @@ -452,10 +429,8 @@ AVCodec ff_libopenjpeg_decoder = { .id = AV_CODEC_ID_JPEG2000, .priv_data_size = sizeof(LibOpenJPEGContext), .init = libopenjpeg_decode_init, - .close = libopenjpeg_decode_close, .decode = libopenjpeg_decode_frame, .capabilities = CODEC_CAP_DR1 | CODEC_CAP_FRAME_THREADS, .long_name = NULL_IF_CONFIG_SMALL("OpenJPEG JPEG 2000"), .priv_class = &class, - .init_thread_copy = ONLY_IF_THREADS_ENABLED(libopenjpeg_decode_init_thread_copy), }; |