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.
--
Anton Khirnov
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel