On 7/20/12 10:26 AM, Anton Khirnov wrote:
On Thu, 19 Jul 2012 20:59:45 +0200, Luca Barbato <[email protected]> wrote:OpenJPEG can decode in lower resolution or decode only a number of enhancement layers. --- libavcodec/libopenjpegdec.c | 28 ++++++++++++++++++++++++++++ 1 files changed, 28 insertions(+), 0 deletions(-) diff --git a/libavcodec/libopenjpegdec.c b/libavcodec/libopenjpegdec.c index 799ccd7..53215a1 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 "avcodec.h" #include "libavutil/intreadwrite.h" @@ -35,8 +36,11 @@ #define JP2_SIG_VALUE 0x0D0A870A typedef struct { + AVClass *class; opj_dparameters_t dec_params; AVFrame image; + int lowres; + int lowqual; } LibOpenJPEGContext; static int check_image_attributes(opj_image_t *image) @@ -104,6 +108,8 @@ static int libopenjpeg_decode_frame(AVCodecContext *avctx, 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 = ctx->lowres; + ctx->dec_params.cp_layer = ctx->lowqual;Seems lowres/lowqual isn't what libopenjpeg calls them. Why not use its native terminology?// Tie decoder with decoding parameters opj_setup_decoder(dec, &ctx->dec_params); stream = opj_cio_open((opj_common_ptr)dec, buf, buf_size); @@ -123,6 +129,12 @@ static int libopenjpeg_decode_frame(AVCodecContext *avctx, } width = image->x1 - image->x0; height = image->y1 - image->y0; + + if (ctx->lowres) { + width = (width + (1 << ctx->lowres) - 1) >> ctx->lowres; + height = (height + (1 << ctx->lowres) - 1) >> ctx->lowres; + } + 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; @@ -208,6 +220,21 @@ 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", "Low quality decoding", OFFSET(lowqual), AV_OPT_TYPE_INT, { 0 }, 0, INT_MAX, VD }, + { "lowres", "Low resolution decoding", OFFSET(lowres), AV_OPT_TYPE_INT, { 0 }, 0, INT_MAX, VD },Some more documentation on what do non-zero values mean exactly would be nice. Otherwise looks good.
I using reduce and layers is misleading and the field description in openjpeg matches quality and resolution, I'll update the patch with documentation.
Indeed setting lowqual to 1 gives you the worst quality (only 1 layer used over as many) while lowres 1 would just use half dimensions.
lu _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
