diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2012-07-21 04:49:57 +0400 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-07-21 06:25:11 +0400 |
commit | 3c033d00f5990e48b14f962d33c362f76695fb07 (patch) | |
tree | 261e11fc02302638fd451f9f0d3741fc444cc28c /libavcodec/libopenjpegdec.c | |
parent | 85761efa95fd7cfb104fb862a242691d4e7c345c (diff) | |
parent | ce64e5bfd11ae63af0fb10317a2aea6f7501be62 (diff) |
Merge remote-tracking branch 'qatar/master'
* qatar/master:
libopenjpeg: introduce lowres and lowqual private options
FATE: add a test for flac cover art.
cafdec: allow larger ALAC magic cookie
alac: fix channel pointer assignment for 24 and 32-bit
Conflicts:
libavcodec/alac.c
libavcodec/libopenjpegdec.c
Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/libopenjpegdec.c')
-rw-r--r-- | libavcodec/libopenjpegdec.c | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/libavcodec/libopenjpegdec.c b/libavcodec/libopenjpegdec.c index 0643698653..fe4d86570e 100644 --- a/libavcodec/libopenjpegdec.c +++ b/libavcodec/libopenjpegdec.c @@ -24,6 +24,7 @@ * JPEG 2000 decoder using libopenjpeg */ +#include "libavutil/opt.h" #include "libavutil/imgutils.h" #include "libavutil/pixfmt.h" #include "avcodec.h" @@ -54,8 +55,10 @@ static const enum PixelFormat libopenjpeg_yuv_pix_fmts[] = {YUV_PIXEL_FORMATS}; static const enum PixelFormat libopenjpeg_all_pix_fmts[] = {RGB_PIXEL_FORMATS,GRAY_PIXEL_FORMATS,YUV_PIXEL_FORMATS}; typedef struct { + AVClass *class; opj_dparameters_t dec_params; AVFrame image; + int lowqual; } LibOpenJPEGContext; static inline int libopenjpeg_matches_pix_fmt(const opj_image_t *image, enum PixelFormat pix_fmt){ @@ -254,8 +257,9 @@ static int libopenjpeg_decode_frame(AVCodecContext *avctx, return -1; } opj_set_event_mgr((opj_common_ptr)dec, NULL, NULL); - ctx->dec_params.cp_limit_decoding = LIMIT_TO_MAIN_HEADER; + ctx->dec_params.cp_reduce = avctx->lowres; + ctx->dec_params.cp_layer = ctx->lowqual; // Tie decoder with decoding parameters opj_setup_decoder(dec, &ctx->dec_params); stream = opj_cio_open((opj_common_ptr)dec, buf, buf_size); @@ -275,6 +279,7 @@ static int libopenjpeg_decode_frame(AVCodecContext *avctx, } width = image->x1 - image->x0; height = image->y1 - image->y0; + if(av_image_check_size(width, height, 0, avctx) < 0) { av_log(avctx, AV_LOG_ERROR, "%dx%d dimension invalid.\n", width, height); goto done; @@ -380,6 +385,20 @@ static av_cold int libopenjpeg_decode_close(AVCodecContext *avctx) return 0 ; } +#define OFFSET(x) offsetof(LibOpenJPEGContext, x) +#define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM + +static const AVOption options[] = { + { "lowqual", "Limit the number of layers used for decoding", OFFSET(lowqual), AV_OPT_TYPE_INT, { 0 }, 0, INT_MAX, VD }, + { NULL }, +}; + +static const AVClass class = { + .class_name = "libopenjpeg", + .item_name = av_default_item_name, + .option = options, + .version = LIBAVUTIL_VERSION_INT, +}; AVCodec ff_libopenjpeg_decoder = { .name = "libopenjpeg", @@ -392,5 +411,6 @@ AVCodec ff_libopenjpeg_decoder = { .capabilities = CODEC_CAP_DR1 | CODEC_CAP_FRAME_THREADS, .max_lowres = 5, .long_name = NULL_IF_CONFIG_SMALL("OpenJPEG JPEG 2000"), + .priv_class = &class, .init_thread_copy = ONLY_IF_THREADS_ENABLED(libopenjpeg_decode_init_thread_copy), }; |