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

Reply via email to