X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Flibopenjpeg.c;h=387ea8b5d91b06bd19d842f9ac175fbdae4a3e86;hb=97197beb1ce3bbd4f89d3d3da0ec039f4eee5c6e;hp=a3035fd290d591d746dcc827ce9db6366aaefc8c;hpb=7a00bbad2100367481240e62876b941b5c4befdc;p=ffmpeg diff --git a/libavcodec/libopenjpeg.c b/libavcodec/libopenjpeg.c index a3035fd290d..387ea8b5d91 100644 --- a/libavcodec/libopenjpeg.c +++ b/libavcodec/libopenjpeg.c @@ -39,12 +39,12 @@ typedef struct { static int check_image_attributes(opj_image_t *image) { - return(image->comps[0].dx == image->comps[1].dx && + return image->comps[0].dx == image->comps[1].dx && image->comps[1].dx == image->comps[2].dx && image->comps[0].dy == image->comps[1].dy && image->comps[1].dy == image->comps[2].dy && image->comps[0].prec == image->comps[1].prec && - image->comps[1].prec == image->comps[2].prec); + image->comps[1].prec == image->comps[2].prec; } static av_cold int libopenjpeg_decode_init(AVCodecContext *avctx) @@ -78,9 +78,13 @@ static int libopenjpeg_decode_frame(AVCodecContext *avctx, 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); + dec = opj_create_decompress(CODEC_JP2); } else { - dec = opj_create_decompress(CODEC_J2K); + // If the AVPacket contains a jp2c box, then skip to + // the starting byte of the codestream. + if (AV_RB32(buf + 4) == AV_RB32("jp2c")) + buf += 8; + dec = opj_create_decompress(CODEC_J2K); } if(!dec) { @@ -89,6 +93,7 @@ static int libopenjpeg_decode_frame(AVCodecContext *avctx, } opj_set_event_mgr((opj_common_ptr)dec, NULL, NULL); + ctx->dec_params.cp_reduce = avctx->lowres; // Tie decoder with decoding parameters opj_setup_decoder(dec, &ctx->dec_params); stream = opj_cio_open((opj_common_ptr)dec, buf, buf_size); @@ -106,8 +111,8 @@ static int libopenjpeg_decode_frame(AVCodecContext *avctx, opj_destroy_decompress(dec); return -1; } - width = image->comps[0].w; - height = image->comps[0].h; + width = image->comps[0].w << avctx->lowres; + height = image->comps[0].h << avctx->lowres; if(avcodec_check_dimensions(avctx, width, height) < 0) { av_log(avctx, AV_LOG_ERROR, "%dx%d dimension invalid.\n", width, height); goto done; @@ -126,7 +131,7 @@ static int libopenjpeg_decode_frame(AVCodecContext *avctx, } break; case 4: has_alpha = 1; - avctx->pix_fmt = PIX_FMT_RGB32; + avctx->pix_fmt = PIX_FMT_RGBA; break; default: av_log(avctx, AV_LOG_ERROR, "%d components unsupported.\n", image->numcomps); goto done; @@ -144,10 +149,10 @@ static int libopenjpeg_decode_frame(AVCodecContext *avctx, adjust[x] = FFMAX(image->comps[x].prec - 8, 0); } - for(y = 0; y < height; y++) { - index = y*width; + for(y = 0; y < avctx->height; y++) { + index = y*avctx->width; img_ptr = picture->data[0] + y*picture->linesize[0]; - for(x = 0; x < width; x++, index++) { + for(x = 0; x < avctx->width; x++, index++) { *img_ptr++ = image->comps[0].data[index] >> adjust[0]; if(image->numcomps > 2 && check_image_attributes(image)) { *img_ptr++ = image->comps[1].data[index] >> adjust[1]; @@ -187,6 +192,6 @@ AVCodec libopenjpeg_decoder = { NULL, libopenjpeg_decode_close, libopenjpeg_decode_frame, - NULL, + CODEC_CAP_DR1, .long_name = NULL_IF_CONFIG_SMALL("OpenJPEG based JPEG 2000 decoder"), } ;