[FFmpeg-devel] [PATCH] libopenjpeg wrapper for jpeg2k decoding

Michael Niedermayer michaelni
Thu Jan 29 11:35:20 CET 2009


On Thu, Jan 29, 2009 at 11:35:31AM +0530, Jai Menon wrote:
> Hi,
> 
> On Thu, Jan 29, 2009 at 4:27 AM, Michael Niedermayer <michaelni at gmx.at> wrote:
> > On Wed, Jan 28, 2009 at 02:23:46PM +0530, Jai Menon wrote:
> > [...]
> >> +static int libopenjpeg_decode_frame(AVCodecContext *avctx,
> >> +                                    void *data, int *data_size,
> >> +                                    const uint8_t *buf, int buf_size)
> >> +{
> >> +    LibOpenJPEGContext *ctx = avctx->priv_data;
> >> +    AVPicture *picture = data;
> >> +    opj_dinfo_t *dec = NULL;
> >> +    opj_cio_t *stream = NULL;
> >> +    opj_image_t *image = NULL;
> >> +    int width, height, has_alpha = 0, ret = -1;
> >> +    int x, y, index;
> >> +    int picture_size;
> >> +    uint8_t *img_ptr;
> >> +    float scale;
> >> +
> >> +    *data_size = 0;
> >> +
> >> +    // Check if input is a raw jpeg2k codestream or in jp2 wrapping
> >
> >> +    if((AV_RB32(buf) == 12) && (AV_RB32(buf + 4) == JP2_SIG_TYPE)
> >> +        && (AV_RB32(buf + 8) == JP2_SIG_VALUE))
> >> +        dec = opj_create_decompress(CODEC_JP2);
> >> +    else dec = opj_create_decompress(CODEC_J2K);
> >
> > if{
> > }else
> > and this can be vertically aligned prettier
> 
> fixed.
> 
> > [...]
> >> +    width = image->comps[0].w;
> >> +    height = image->comps[0].h;
> >
> > vertical align
> 
> done.
> 
> > [...]
> >> +    img_ptr = ctx->img_buf;
> >> +    picture->data[0] = ctx->img_buf;
> >> +    scale = 255.0f / (float)((1 << image->comps[0].prec) - 1);
> >> +    for(y = 0; y < height; y++) {
> >> +        index = y*width;
> >> +        for(x = 0; x < width; x++, index++) {
> >> +            *img_ptr++ = image->comps[0].data[index] * scale;
> >
> >> +            if((image->numcomps > 2) && check_image_attributes(image)) {
> >
> > superflous ()
> 
> yes, removed.
> revised patch attached.
[...]
> +static int libopenjpeg_decode_frame(AVCodecContext *avctx,
> +                                    void *data, int *data_size,
> +                                    const uint8_t *buf, int buf_size)
> +{
> +    LibOpenJPEGContext *ctx = avctx->priv_data;
> +    AVPicture *picture = data;
> +    opj_dinfo_t *dec = NULL;
> +    opj_cio_t *stream = NULL;
> +    opj_image_t *image = NULL;
> +    int width, height, has_alpha = 0, ret = -1;
> +    int x, y, index;
> +    int picture_size;
> +    uint8_t *img_ptr;
> +    float scale;
> +
> +    *data_size = 0;
> +
> +    // Check if input is a raw jpeg2k codestream or in jp2 wrapping
> +    if((AV_RB32(buf) == 12) && 
> +       (AV_RB32(buf + 4) == JP2_SIG_TYPE) &&
> +       (AV_RB32(buf + 8) == JP2_SIG_VALUE)) {
> +        dec = opj_create_decompress(CODEC_JP2);
> +    }
> +    else dec = opj_create_decompress(CODEC_J2K);

dec is written to twice with no read in between, this applies to more vars


[...]
> +    picture_size = avpicture_get_size(avctx->pix_fmt, avctx->width, avctx->height);
> +    if(!ctx->img_buf) {
> +        ctx->img_buf = av_mallocz(picture_size);
> +        if(!ctx->img_buf) {
> +            av_log(avctx, AV_LOG_ERROR, "Couldn't allocate image buffer.\n");
> +            goto done;
> +        }
> +    }
> +    img_ptr = ctx->img_buf;
> +    picture->data[0] = ctx->img_buf;
> +    scale = 255.0f / (float)((1 << image->comps[0].prec) - 1);
> +    for(y = 0; y < height; y++) {
> +        index = y*width;
> +        for(x = 0; x < width; x++, index++) {
> +            *img_ptr++ = image->comps[0].data[index] * scale;
> +            if(image->numcomps > 2 && check_image_attributes(image)) {
> +                *img_ptr++ = image->comps[1].data[index] * scale;
> +                *img_ptr++ = image->comps[2].data[index] * scale;
> +                if(has_alpha)
> +                    *img_ptr++ = image->comps[3].data[index] * scale;
> +            }
> +        }
> +    }

sec hole when width/height changes


[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

In a rich man's house there is no place to spit but his face.
-- Diogenes of Sinope
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20090129/9f5fce32/attachment.pgp>



More information about the ffmpeg-devel mailing list