annotate libopenjpeg.c @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents ffb3668ff7af
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8747
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
1 /*
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
2 * JPEG 2000 decoding support via OpenJPEG
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
3 * Copyright (c) 2009 Jaikrishnan Menon <realityman@gmx.net>
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
4 *
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
5 * This file is part of FFmpeg.
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
6 *
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
11 *
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
15 * Lesser General Public License for more details.
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
16 *
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
20 */
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
21
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
22 /**
11644
7dd2a45249a9 Remove explicit filename from Doxygen @file commands.
diego
parents: 11560
diff changeset
23 * @file
8747
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
24 * JPEG 2000 decoder using libopenjpeg
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
25 */
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
26
12376
7e9b2d528e59 Fix the compilation of some libavcodec/lib* files which were not
stefano
parents: 12372
diff changeset
27 #include "libavcore/imgutils.h"
8747
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
28 #include "avcodec.h"
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
29 #include "libavutil/intreadwrite.h"
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
30 #define OPJ_STATIC
8787
9575568668c4 Use default system include path for an installed OpenJPEG library.
diego
parents: 8747
diff changeset
31 #include <openjpeg.h>
8747
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
32
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
33 #define JP2_SIG_TYPE 0x6A502020
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
34 #define JP2_SIG_VALUE 0x0D0A870A
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
35
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
36 typedef struct {
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
37 opj_dparameters_t dec_params;
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
38 AVFrame image;
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
39 } LibOpenJPEGContext;
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
40
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
41 static int check_image_attributes(opj_image_t *image)
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
42 {
10436
a050e8857f00 cosmetics: Remove pointless parentheses from return statement.
diego
parents: 9804
diff changeset
43 return image->comps[0].dx == image->comps[1].dx &&
8747
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
44 image->comps[1].dx == image->comps[2].dx &&
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
45 image->comps[0].dy == image->comps[1].dy &&
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
46 image->comps[1].dy == image->comps[2].dy &&
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
47 image->comps[0].prec == image->comps[1].prec &&
10436
a050e8857f00 cosmetics: Remove pointless parentheses from return statement.
diego
parents: 9804
diff changeset
48 image->comps[1].prec == image->comps[2].prec;
8747
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
49 }
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
50
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
51 static av_cold int libopenjpeg_decode_init(AVCodecContext *avctx)
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
52 {
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
53 LibOpenJPEGContext *ctx = avctx->priv_data;
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
54
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
55 opj_set_default_decoder_parameters(&ctx->dec_params);
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
56 avctx->coded_frame = &ctx->image;
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
57 return 0;
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
58 }
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
59
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
60 static int libopenjpeg_decode_frame(AVCodecContext *avctx,
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
61 void *data, int *data_size,
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 8787
diff changeset
62 AVPacket *avpkt)
8747
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
63 {
9355
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 8787
diff changeset
64 const uint8_t *buf = avpkt->data;
54bc8a2727b0 Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents: 8787
diff changeset
65 int buf_size = avpkt->size;
8747
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
66 LibOpenJPEGContext *ctx = avctx->priv_data;
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
67 AVFrame *picture = &ctx->image, *output = data;
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
68 opj_dinfo_t *dec;
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
69 opj_cio_t *stream;
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
70 opj_image_t *image;
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
71 int width, height, has_alpha = 0, ret = -1;
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
72 int x, y, index;
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
73 uint8_t *img_ptr;
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
74 int adjust[4];
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
75
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
76 *data_size = 0;
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
77
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
78 // Check if input is a raw jpeg2k codestream or in jp2 wrapping
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
79 if((AV_RB32(buf) == 12) &&
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
80 (AV_RB32(buf + 4) == JP2_SIG_TYPE) &&
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
81 (AV_RB32(buf + 8) == JP2_SIG_VALUE)) {
10507
ca71c924b65f cosmetics : fix indentation.
jai_menon
parents: 10436
diff changeset
82 dec = opj_create_decompress(CODEC_JP2);
8747
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
83 } else {
10508
f33404f82b9e Handle JPEG2000 frames stored in the Quicktime container.
jai_menon
parents: 10507
diff changeset
84 // If the AVPacket contains a jp2c box, then skip to
f33404f82b9e Handle JPEG2000 frames stored in the Quicktime container.
jai_menon
parents: 10507
diff changeset
85 // the starting byte of the codestream.
f33404f82b9e Handle JPEG2000 frames stored in the Quicktime container.
jai_menon
parents: 10507
diff changeset
86 if (AV_RB32(buf + 4) == AV_RB32("jp2c"))
f33404f82b9e Handle JPEG2000 frames stored in the Quicktime container.
jai_menon
parents: 10507
diff changeset
87 buf += 8;
10507
ca71c924b65f cosmetics : fix indentation.
jai_menon
parents: 10436
diff changeset
88 dec = opj_create_decompress(CODEC_J2K);
8747
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
89 }
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
90
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
91 if(!dec) {
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
92 av_log(avctx, AV_LOG_ERROR, "Error initializing decoder.\n");
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
93 return -1;
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
94 }
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
95 opj_set_event_mgr((opj_common_ptr)dec, NULL, NULL);
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
96
9715
997d2de9cd84 Add lowres support to the libopenjpeg wrapper.
jai_menon
parents: 9714
diff changeset
97 ctx->dec_params.cp_reduce = avctx->lowres;
8747
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
98 // Tie decoder with decoding parameters
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
99 opj_setup_decoder(dec, &ctx->dec_params);
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
100 stream = opj_cio_open((opj_common_ptr)dec, buf, buf_size);
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
101 if(!stream) {
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
102 av_log(avctx, AV_LOG_ERROR, "Codestream could not be opened for reading.\n");
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
103 opj_destroy_decompress(dec);
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
104 return -1;
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
105 }
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
106
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
107 // Decode the codestream
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
108 image = opj_decode_with_info(dec, stream, NULL);
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
109 opj_cio_close(stream);
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
110 if(!image) {
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
111 av_log(avctx, AV_LOG_ERROR, "Error decoding codestream.\n");
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
112 opj_destroy_decompress(dec);
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
113 return -1;
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
114 }
9715
997d2de9cd84 Add lowres support to the libopenjpeg wrapper.
jai_menon
parents: 9714
diff changeset
115 width = image->comps[0].w << avctx->lowres;
997d2de9cd84 Add lowres support to the libopenjpeg wrapper.
jai_menon
parents: 9714
diff changeset
116 height = image->comps[0].h << avctx->lowres;
12462
ffb3668ff7af Use new imgutils.h API names, fix deprecation warnings.
stefano
parents: 12376
diff changeset
117 if(av_image_check_size(width, height, 0, avctx) < 0) {
8747
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
118 av_log(avctx, AV_LOG_ERROR, "%dx%d dimension invalid.\n", width, height);
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
119 goto done;
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
120 }
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
121 avcodec_set_dimensions(avctx, width, height);
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
122
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
123 switch(image->numcomps)
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
124 {
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
125 case 1: avctx->pix_fmt = PIX_FMT_GRAY8;
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
126 break;
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
127 case 3: if(check_image_attributes(image)) {
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
128 avctx->pix_fmt = PIX_FMT_RGB24;
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
129 } else {
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
130 avctx->pix_fmt = PIX_FMT_GRAY8;
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
131 av_log(avctx, AV_LOG_ERROR, "Only first component will be used.\n");
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
132 }
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
133 break;
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
134 case 4: has_alpha = 1;
10737
adf750125dc9 Fix colours for QT JPEG2000, fixes issue 1540.
cehoyos
parents: 10508
diff changeset
135 avctx->pix_fmt = PIX_FMT_RGBA;
8747
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
136 break;
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
137 default: av_log(avctx, AV_LOG_ERROR, "%d components unsupported.\n", image->numcomps);
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
138 goto done;
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
139 }
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
140
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
141 if(picture->data[0])
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
142 avctx->release_buffer(avctx, picture);
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
143
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
144 if(avctx->get_buffer(avctx, picture) < 0) {
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
145 av_log(avctx, AV_LOG_ERROR, "Couldn't allocate image buffer.\n");
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
146 return -1;
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
147 }
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
148
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
149 for(x = 0; x < image->numcomps; x++) {
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
150 adjust[x] = FFMAX(image->comps[x].prec - 8, 0);
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
151 }
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
152
9714
5df11d49abb7 Use dimensions stored in AVCodecContext instead of local variables.
jai_menon
parents: 9355
diff changeset
153 for(y = 0; y < avctx->height; y++) {
5df11d49abb7 Use dimensions stored in AVCodecContext instead of local variables.
jai_menon
parents: 9355
diff changeset
154 index = y*avctx->width;
8747
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
155 img_ptr = picture->data[0] + y*picture->linesize[0];
9714
5df11d49abb7 Use dimensions stored in AVCodecContext instead of local variables.
jai_menon
parents: 9355
diff changeset
156 for(x = 0; x < avctx->width; x++, index++) {
8747
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
157 *img_ptr++ = image->comps[0].data[index] >> adjust[0];
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
158 if(image->numcomps > 2 && check_image_attributes(image)) {
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
159 *img_ptr++ = image->comps[1].data[index] >> adjust[1];
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
160 *img_ptr++ = image->comps[2].data[index] >> adjust[2];
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
161 if(has_alpha)
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
162 *img_ptr++ = image->comps[3].data[index] >> adjust[3];
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
163 }
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
164 }
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
165 }
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
166
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
167 *output = ctx->image;
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
168 *data_size = sizeof(AVPicture);
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
169 ret = buf_size;
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
170
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
171 done:
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
172 opj_image_destroy(image);
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
173 opj_destroy_decompress(dec);
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
174 return ret;
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
175 }
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
176
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
177 static av_cold int libopenjpeg_decode_close(AVCodecContext *avctx)
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
178 {
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
179 LibOpenJPEGContext *ctx = avctx->priv_data;
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
180
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
181 if(ctx->image.data[0])
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
182 avctx->release_buffer(avctx, &ctx->image);
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
183 return 0 ;
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
184 }
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
185
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
186
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
187 AVCodec libopenjpeg_decoder = {
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
188 "libopenjpeg",
11560
8a4984c5cacc Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 10737
diff changeset
189 AVMEDIA_TYPE_VIDEO,
8747
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
190 CODEC_ID_JPEG2000,
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
191 sizeof(LibOpenJPEGContext),
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
192 libopenjpeg_decode_init,
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
193 NULL,
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
194 libopenjpeg_decode_close,
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
195 libopenjpeg_decode_frame,
9804
00581e706e1d libopenjpeg wrapper uses get_buffer, set CODEC_CAP_DR1
bcoudurier
parents: 9715
diff changeset
196 CODEC_CAP_DR1,
12108
c35d7bc64882 Add new decoder property max_lowres and do not init decoder if requested value is higher.
cehoyos
parents: 11644
diff changeset
197 .max_lowres = 5,
8747
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
198 .long_name = NULL_IF_CONFIG_SMALL("OpenJPEG based JPEG 2000 decoder"),
a261e3271d1f Use libopenjpeg for jpeg2k decoding.
cehoyos
parents:
diff changeset
199 } ;