2 * JPEG 2000 image decoder
3 * Copyright (c) 2007 Kamil Nowosad
4 * Copyright (c) 2013 Nicolas Bertrand <nicoinattendu@gmail.com>
6 * This file is part of FFmpeg.
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 * JPEG 2000 image decoder
31 #include "libavutil/attributes.h"
32 #include "libavutil/avassert.h"
33 #include "libavutil/common.h"
34 #include "libavutil/imgutils.h"
35 #include "libavutil/opt.h"
36 #include "libavutil/pixdesc.h"
37 #include "libavutil/thread.h"
39 #include "bytestream.h"
43 #include "jpeg2000dsp.h"
46 #define JP2_SIG_TYPE 0x6A502020
47 #define JP2_SIG_VALUE 0x0D0A870A
48 #define JP2_CODESTREAM 0x6A703263
49 #define JP2_HEADER 0x6A703268
56 typedef struct Jpeg2000POCEntry {
65 typedef struct Jpeg2000POC {
66 Jpeg2000POCEntry poc[MAX_POCS];
71 typedef struct Jpeg2000TilePart {
72 uint8_t tile_index; // Tile index who refers the tile-part
73 const uint8_t *tp_end;
74 GetByteContext tpg; // bit stream in tile-part
77 /* RMK: For JPEG2000 DCINEMA 3 tile-parts in a tile
78 * one per component, so tile_part elements have a size of 3 */
79 typedef struct Jpeg2000Tile {
80 Jpeg2000Component *comp;
81 uint8_t properties[4];
82 Jpeg2000CodingStyle codsty[4];
83 Jpeg2000QuantStyle qntsty[4];
85 Jpeg2000TilePart tile_part[32];
86 uint16_t tp_idx; // Tile-part index
87 int coord[2][2]; // border coordinates {{x0, x1}, {y0, y1}}
90 typedef struct Jpeg2000DecoderContext {
92 AVCodecContext *avctx;
96 int image_offset_x, image_offset_y;
97 int tile_offset_x, tile_offset_y;
98 uint8_t cbps[4]; // bits per sample in particular components
99 uint8_t sgnd[4]; // if a component is signed
100 uint8_t properties[4];
105 uint32_t palette[256];
108 int tile_width, tile_height;
109 unsigned numXtiles, numYtiles;
113 Jpeg2000CodingStyle codsty[4];
114 Jpeg2000QuantStyle qntsty[4];
122 Jpeg2000DSPContext dsp;
124 /*options parameters*/
125 int reduction_factor;
126 } Jpeg2000DecoderContext;
128 /* get_bits functions for JPEG2000 packet bitstream
129 * It is a get_bit function with a bit-stuffing routine. If the value of the
130 * byte is 0xFF, the next byte includes an extra zero bit stuffed into the MSB.
131 * cf. ISO-15444-1:2002 / B.10.1 Bit-stuffing routine */
132 static int get_bits(Jpeg2000DecoderContext *s, int n)
138 if (s->bit_index == 0) {
139 s->bit_index = 7 + (bytestream2_get_byte(&s->g) != 0xFFu);
142 res |= (bytestream2_peek_byte(&s->g) >> s->bit_index) & 1;
147 static void jpeg2000_flush(Jpeg2000DecoderContext *s)
149 if (bytestream2_get_byte(&s->g) == 0xff)
150 bytestream2_skip(&s->g, 1);
154 /* decode the value stored in node */
155 static int tag_tree_decode(Jpeg2000DecoderContext *s, Jpeg2000TgtNode *node,
158 Jpeg2000TgtNode *stack[30];
159 int sp = -1, curval = 0;
162 av_log(s->avctx, AV_LOG_ERROR, "missing node\n");
163 return AVERROR_INVALIDDATA;
166 while (node && !node->vis) {
174 curval = stack[sp]->val;
176 while (curval < threshold && sp >= 0) {
177 if (curval < stack[sp]->val)
178 curval = stack[sp]->val;
179 while (curval < threshold) {
181 if ((ret = get_bits(s, 1)) > 0) {
189 stack[sp]->val = curval;
195 static int pix_fmt_match(enum AVPixelFormat pix_fmt, int components,
196 int bpc, uint32_t log2_chroma_wh, int pal8)
199 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
203 if (desc->nb_components != components) {
207 switch (components) {
209 match = match && desc->comp[3].depth >= bpc &&
210 (log2_chroma_wh >> 14 & 3) == 0 &&
211 (log2_chroma_wh >> 12 & 3) == 0;
213 match = match && desc->comp[2].depth >= bpc &&
214 (log2_chroma_wh >> 10 & 3) == desc->log2_chroma_w &&
215 (log2_chroma_wh >> 8 & 3) == desc->log2_chroma_h;
217 match = match && desc->comp[1].depth >= bpc &&
218 (log2_chroma_wh >> 6 & 3) == desc->log2_chroma_w &&
219 (log2_chroma_wh >> 4 & 3) == desc->log2_chroma_h;
222 match = match && desc->comp[0].depth >= bpc &&
223 (log2_chroma_wh >> 2 & 3) == 0 &&
224 (log2_chroma_wh & 3) == 0 &&
225 (desc->flags & AV_PIX_FMT_FLAG_PAL) == pal8 * AV_PIX_FMT_FLAG_PAL;
230 // pix_fmts with lower bpp have to be listed before
231 // similar pix_fmts with higher bpp.
232 #define RGB_PIXEL_FORMATS AV_PIX_FMT_PAL8,AV_PIX_FMT_RGB24,AV_PIX_FMT_RGBA,AV_PIX_FMT_RGB48,AV_PIX_FMT_RGBA64
233 #define GRAY_PIXEL_FORMATS AV_PIX_FMT_GRAY8,AV_PIX_FMT_GRAY8A,AV_PIX_FMT_GRAY16,AV_PIX_FMT_YA16
234 #define YUV_PIXEL_FORMATS AV_PIX_FMT_YUV410P,AV_PIX_FMT_YUV411P,AV_PIX_FMT_YUVA420P, \
235 AV_PIX_FMT_YUV420P,AV_PIX_FMT_YUV422P,AV_PIX_FMT_YUVA422P, \
236 AV_PIX_FMT_YUV440P,AV_PIX_FMT_YUV444P,AV_PIX_FMT_YUVA444P, \
237 AV_PIX_FMT_YUV420P9,AV_PIX_FMT_YUV422P9,AV_PIX_FMT_YUV444P9, \
238 AV_PIX_FMT_YUVA420P9,AV_PIX_FMT_YUVA422P9,AV_PIX_FMT_YUVA444P9, \
239 AV_PIX_FMT_YUV420P10,AV_PIX_FMT_YUV422P10,AV_PIX_FMT_YUV444P10, \
240 AV_PIX_FMT_YUVA420P10,AV_PIX_FMT_YUVA422P10,AV_PIX_FMT_YUVA444P10, \
241 AV_PIX_FMT_YUV420P12,AV_PIX_FMT_YUV422P12,AV_PIX_FMT_YUV444P12, \
242 AV_PIX_FMT_YUV420P14,AV_PIX_FMT_YUV422P14,AV_PIX_FMT_YUV444P14, \
243 AV_PIX_FMT_YUV420P16,AV_PIX_FMT_YUV422P16,AV_PIX_FMT_YUV444P16, \
244 AV_PIX_FMT_YUVA420P16,AV_PIX_FMT_YUVA422P16,AV_PIX_FMT_YUVA444P16
245 #define XYZ_PIXEL_FORMATS AV_PIX_FMT_XYZ12
247 static const enum AVPixelFormat rgb_pix_fmts[] = {RGB_PIXEL_FORMATS};
248 static const enum AVPixelFormat gray_pix_fmts[] = {GRAY_PIXEL_FORMATS};
249 static const enum AVPixelFormat yuv_pix_fmts[] = {YUV_PIXEL_FORMATS};
250 static const enum AVPixelFormat xyz_pix_fmts[] = {XYZ_PIXEL_FORMATS,
252 static const enum AVPixelFormat all_pix_fmts[] = {RGB_PIXEL_FORMATS,
257 /* marker segments */
258 /* get sizes and offsets of image, tiles; number of components */
259 static int get_siz(Jpeg2000DecoderContext *s)
263 uint32_t log2_chroma_wh = 0;
264 const enum AVPixelFormat *possible_fmts = NULL;
265 int possible_fmts_nb = 0;
268 if (bytestream2_get_bytes_left(&s->g) < 36) {
269 av_log(s->avctx, AV_LOG_ERROR, "Insufficient space for SIZ\n");
270 return AVERROR_INVALIDDATA;
273 s->avctx->profile = bytestream2_get_be16u(&s->g); // Rsiz
274 s->width = bytestream2_get_be32u(&s->g); // Width
275 s->height = bytestream2_get_be32u(&s->g); // Height
276 s->image_offset_x = bytestream2_get_be32u(&s->g); // X0Siz
277 s->image_offset_y = bytestream2_get_be32u(&s->g); // Y0Siz
278 s->tile_width = bytestream2_get_be32u(&s->g); // XTSiz
279 s->tile_height = bytestream2_get_be32u(&s->g); // YTSiz
280 s->tile_offset_x = bytestream2_get_be32u(&s->g); // XT0Siz
281 s->tile_offset_y = bytestream2_get_be32u(&s->g); // YT0Siz
282 ncomponents = bytestream2_get_be16u(&s->g); // CSiz
284 if (s->image_offset_x || s->image_offset_y) {
285 avpriv_request_sample(s->avctx, "Support for image offsets");
286 return AVERROR_PATCHWELCOME;
288 if (av_image_check_size2(s->width, s->height, s->avctx->max_pixels, AV_PIX_FMT_NONE, 0, s->avctx)) {
289 avpriv_request_sample(s->avctx, "Large Dimensions");
290 return AVERROR_PATCHWELCOME;
293 if (ncomponents <= 0) {
294 av_log(s->avctx, AV_LOG_ERROR, "Invalid number of components: %d\n",
296 return AVERROR_INVALIDDATA;
299 if (ncomponents > 4) {
300 avpriv_request_sample(s->avctx, "Support for %d components",
302 return AVERROR_PATCHWELCOME;
305 if (s->tile_offset_x < 0 || s->tile_offset_y < 0 ||
306 s->image_offset_x < s->tile_offset_x ||
307 s->image_offset_y < s->tile_offset_y ||
308 s->tile_width + (int64_t)s->tile_offset_x <= s->image_offset_x ||
309 s->tile_height + (int64_t)s->tile_offset_y <= s->image_offset_y
311 av_log(s->avctx, AV_LOG_ERROR, "Tile offsets are invalid\n");
312 return AVERROR_INVALIDDATA;
315 s->ncomponents = ncomponents;
317 if (s->tile_width <= 0 || s->tile_height <= 0) {
318 av_log(s->avctx, AV_LOG_ERROR, "Invalid tile dimension %dx%d.\n",
319 s->tile_width, s->tile_height);
320 return AVERROR_INVALIDDATA;
323 if (bytestream2_get_bytes_left(&s->g) < 3 * s->ncomponents) {
324 av_log(s->avctx, AV_LOG_ERROR, "Insufficient space for %d components in SIZ\n", s->ncomponents);
325 return AVERROR_INVALIDDATA;
328 for (i = 0; i < s->ncomponents; i++) { // Ssiz_i XRsiz_i, YRsiz_i
329 uint8_t x = bytestream2_get_byteu(&s->g);
330 s->cbps[i] = (x & 0x7f) + 1;
331 s->precision = FFMAX(s->cbps[i], s->precision);
332 s->sgnd[i] = !!(x & 0x80);
333 s->cdx[i] = bytestream2_get_byteu(&s->g);
334 s->cdy[i] = bytestream2_get_byteu(&s->g);
335 if ( !s->cdx[i] || s->cdx[i] == 3 || s->cdx[i] > 4
336 || !s->cdy[i] || s->cdy[i] == 3 || s->cdy[i] > 4) {
337 av_log(s->avctx, AV_LOG_ERROR, "Invalid sample separation %d/%d\n", s->cdx[i], s->cdy[i]);
338 return AVERROR_INVALIDDATA;
340 log2_chroma_wh |= s->cdy[i] >> 1 << i * 4 | s->cdx[i] >> 1 << i * 4 + 2;
343 s->numXtiles = ff_jpeg2000_ceildiv(s->width - s->tile_offset_x, s->tile_width);
344 s->numYtiles = ff_jpeg2000_ceildiv(s->height - s->tile_offset_y, s->tile_height);
346 if (s->numXtiles * (uint64_t)s->numYtiles > INT_MAX/sizeof(*s->tile)) {
347 s->numXtiles = s->numYtiles = 0;
348 return AVERROR(EINVAL);
351 s->tile = av_mallocz_array(s->numXtiles * s->numYtiles, sizeof(*s->tile));
353 s->numXtiles = s->numYtiles = 0;
354 return AVERROR(ENOMEM);
357 for (i = 0; i < s->numXtiles * s->numYtiles; i++) {
358 Jpeg2000Tile *tile = s->tile + i;
360 tile->comp = av_mallocz(s->ncomponents * sizeof(*tile->comp));
362 return AVERROR(ENOMEM);
365 /* compute image size with reduction factor */
366 ret = ff_set_dimensions(s->avctx,
367 ff_jpeg2000_ceildivpow2(s->width - s->image_offset_x,
368 s->reduction_factor),
369 ff_jpeg2000_ceildivpow2(s->height - s->image_offset_y,
370 s->reduction_factor));
374 if (s->avctx->profile == FF_PROFILE_JPEG2000_DCINEMA_2K ||
375 s->avctx->profile == FF_PROFILE_JPEG2000_DCINEMA_4K) {
376 possible_fmts = xyz_pix_fmts;
377 possible_fmts_nb = FF_ARRAY_ELEMS(xyz_pix_fmts);
379 switch (s->colour_space) {
381 possible_fmts = rgb_pix_fmts;
382 possible_fmts_nb = FF_ARRAY_ELEMS(rgb_pix_fmts);
385 possible_fmts = gray_pix_fmts;
386 possible_fmts_nb = FF_ARRAY_ELEMS(gray_pix_fmts);
389 possible_fmts = yuv_pix_fmts;
390 possible_fmts_nb = FF_ARRAY_ELEMS(yuv_pix_fmts);
393 possible_fmts = all_pix_fmts;
394 possible_fmts_nb = FF_ARRAY_ELEMS(all_pix_fmts);
398 for (i = 0; i < possible_fmts_nb; ++i) {
399 if (pix_fmt_match(possible_fmts[i], ncomponents, s->precision, log2_chroma_wh, s->pal8)) {
400 s->avctx->pix_fmt = possible_fmts[i];
405 if (i == possible_fmts_nb) {
406 if (ncomponents == 4 &&
407 s->cdy[0] == 1 && s->cdx[0] == 1 &&
408 s->cdy[1] == 1 && s->cdx[1] == 1 &&
409 s->cdy[2] == s->cdy[3] && s->cdx[2] == s->cdx[3]) {
410 if (s->precision == 8 && s->cdy[2] == 2 && s->cdx[2] == 2 && !s->pal8) {
411 s->avctx->pix_fmt = AV_PIX_FMT_YUVA420P;
422 if (i == possible_fmts_nb) {
423 av_log(s->avctx, AV_LOG_ERROR,
424 "Unknown pix_fmt, profile: %d, colour_space: %d, "
425 "components: %d, precision: %d\n"
426 "cdx[0]: %d, cdy[0]: %d\n"
427 "cdx[1]: %d, cdy[1]: %d\n"
428 "cdx[2]: %d, cdy[2]: %d\n"
429 "cdx[3]: %d, cdy[3]: %d\n",
430 s->avctx->profile, s->colour_space, ncomponents, s->precision,
433 ncomponents > 1 ? s->cdx[1] : 0,
434 ncomponents > 1 ? s->cdy[1] : 0,
435 ncomponents > 2 ? s->cdx[2] : 0,
436 ncomponents > 2 ? s->cdy[2] : 0,
437 ncomponents > 3 ? s->cdx[3] : 0,
438 ncomponents > 3 ? s->cdy[3] : 0);
439 return AVERROR_PATCHWELCOME;
441 s->avctx->bits_per_raw_sample = s->precision;
445 /* get common part for COD and COC segments */
446 static int get_cox(Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *c)
450 if (bytestream2_get_bytes_left(&s->g) < 5) {
451 av_log(s->avctx, AV_LOG_ERROR, "Insufficient space for COX\n");
452 return AVERROR_INVALIDDATA;
455 /* nreslevels = number of resolution levels
456 = number of decomposition level +1 */
457 c->nreslevels = bytestream2_get_byteu(&s->g) + 1;
458 if (c->nreslevels >= JPEG2000_MAX_RESLEVELS) {
459 av_log(s->avctx, AV_LOG_ERROR, "nreslevels %d is invalid\n", c->nreslevels);
460 return AVERROR_INVALIDDATA;
463 if (c->nreslevels <= s->reduction_factor) {
464 /* we are forced to update reduction_factor as its requested value is
465 not compatible with this bitstream, and as we might have used it
466 already in setup earlier we have to fail this frame until
467 reinitialization is implemented */
468 av_log(s->avctx, AV_LOG_ERROR, "reduction_factor too large for this bitstream, max is %d\n", c->nreslevels - 1);
469 s->reduction_factor = c->nreslevels - 1;
470 return AVERROR(EINVAL);
473 /* compute number of resolution levels to decode */
474 c->nreslevels2decode = c->nreslevels - s->reduction_factor;
476 c->log2_cblk_width = (bytestream2_get_byteu(&s->g) & 15) + 2; // cblk width
477 c->log2_cblk_height = (bytestream2_get_byteu(&s->g) & 15) + 2; // cblk height
479 if (c->log2_cblk_width > 10 || c->log2_cblk_height > 10 ||
480 c->log2_cblk_width + c->log2_cblk_height > 12) {
481 av_log(s->avctx, AV_LOG_ERROR, "cblk size invalid\n");
482 return AVERROR_INVALIDDATA;
485 c->cblk_style = bytestream2_get_byteu(&s->g);
486 if (c->cblk_style != 0) { // cblk style
487 av_log(s->avctx, AV_LOG_WARNING, "extra cblk styles %X\n", c->cblk_style);
488 if (c->cblk_style & JPEG2000_CBLK_BYPASS)
489 av_log(s->avctx, AV_LOG_WARNING, "Selective arithmetic coding bypass\n");
491 c->transform = bytestream2_get_byteu(&s->g); // DWT transformation type
492 /* set integer 9/7 DWT in case of BITEXACT flag */
493 if ((s->avctx->flags & AV_CODEC_FLAG_BITEXACT) && (c->transform == FF_DWT97))
494 c->transform = FF_DWT97_INT;
495 else if (c->transform == FF_DWT53) {
496 s->avctx->properties |= FF_CODEC_PROPERTY_LOSSLESS;
499 if (c->csty & JPEG2000_CSTY_PREC) {
501 for (i = 0; i < c->nreslevels; i++) {
502 byte = bytestream2_get_byte(&s->g);
503 c->log2_prec_widths[i] = byte & 0x0F; // precinct PPx
504 c->log2_prec_heights[i] = (byte >> 4) & 0x0F; // precinct PPy
506 if (c->log2_prec_widths[i] == 0 || c->log2_prec_heights[i] == 0) {
507 av_log(s->avctx, AV_LOG_ERROR, "PPx %d PPy %d invalid\n",
508 c->log2_prec_widths[i], c->log2_prec_heights[i]);
509 c->log2_prec_widths[i] = c->log2_prec_heights[i] = 1;
510 return AVERROR_INVALIDDATA;
514 memset(c->log2_prec_widths , 15, sizeof(c->log2_prec_widths ));
515 memset(c->log2_prec_heights, 15, sizeof(c->log2_prec_heights));
520 /* get coding parameters for a particular tile or whole image*/
521 static int get_cod(Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *c,
524 Jpeg2000CodingStyle tmp;
527 if (bytestream2_get_bytes_left(&s->g) < 5) {
528 av_log(s->avctx, AV_LOG_ERROR, "Insufficient space for COD\n");
529 return AVERROR_INVALIDDATA;
532 tmp.csty = bytestream2_get_byteu(&s->g);
534 // get progression order
535 tmp.prog_order = bytestream2_get_byteu(&s->g);
537 tmp.nlayers = bytestream2_get_be16u(&s->g);
538 tmp.mct = bytestream2_get_byteu(&s->g); // multiple component transformation
540 if (tmp.mct && s->ncomponents < 3) {
541 av_log(s->avctx, AV_LOG_ERROR,
542 "MCT %"PRIu8" with too few components (%d)\n",
543 tmp.mct, s->ncomponents);
544 return AVERROR_INVALIDDATA;
547 if ((ret = get_cox(s, &tmp)) < 0)
550 for (compno = 0; compno < s->ncomponents; compno++)
551 if (!(properties[compno] & HAD_COC))
552 memcpy(c + compno, &tmp, sizeof(tmp));
556 /* Get coding parameters for a component in the whole image or a
557 * particular tile. */
558 static int get_coc(Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *c,
563 if (bytestream2_get_bytes_left(&s->g) < 2) {
564 av_log(s->avctx, AV_LOG_ERROR, "Insufficient space for COC\n");
565 return AVERROR_INVALIDDATA;
568 compno = bytestream2_get_byteu(&s->g);
570 if (compno >= s->ncomponents) {
571 av_log(s->avctx, AV_LOG_ERROR,
572 "Invalid compno %d. There are %d components in the image.\n",
573 compno, s->ncomponents);
574 return AVERROR_INVALIDDATA;
578 c->csty = bytestream2_get_byteu(&s->g);
580 if ((ret = get_cox(s, c)) < 0)
583 properties[compno] |= HAD_COC;
587 /* Get common part for QCD and QCC segments. */
588 static int get_qcx(Jpeg2000DecoderContext *s, int n, Jpeg2000QuantStyle *q)
592 if (bytestream2_get_bytes_left(&s->g) < 1)
593 return AVERROR_INVALIDDATA;
595 x = bytestream2_get_byteu(&s->g); // Sqcd
597 q->nguardbits = x >> 5;
598 q->quantsty = x & 0x1f;
600 if (q->quantsty == JPEG2000_QSTY_NONE) {
602 if (bytestream2_get_bytes_left(&s->g) < n ||
603 n > JPEG2000_MAX_DECLEVELS*3)
604 return AVERROR_INVALIDDATA;
605 for (i = 0; i < n; i++)
606 q->expn[i] = bytestream2_get_byteu(&s->g) >> 3;
607 } else if (q->quantsty == JPEG2000_QSTY_SI) {
608 if (bytestream2_get_bytes_left(&s->g) < 2)
609 return AVERROR_INVALIDDATA;
610 x = bytestream2_get_be16u(&s->g);
611 q->expn[0] = x >> 11;
612 q->mant[0] = x & 0x7ff;
613 for (i = 1; i < JPEG2000_MAX_DECLEVELS * 3; i++) {
614 int curexpn = FFMAX(0, q->expn[0] - (i - 1) / 3);
615 q->expn[i] = curexpn;
616 q->mant[i] = q->mant[0];
620 if (bytestream2_get_bytes_left(&s->g) < 2 * n ||
621 n > JPEG2000_MAX_DECLEVELS*3)
622 return AVERROR_INVALIDDATA;
623 for (i = 0; i < n; i++) {
624 x = bytestream2_get_be16u(&s->g);
625 q->expn[i] = x >> 11;
626 q->mant[i] = x & 0x7ff;
632 /* Get quantization parameters for a particular tile or a whole image. */
633 static int get_qcd(Jpeg2000DecoderContext *s, int n, Jpeg2000QuantStyle *q,
636 Jpeg2000QuantStyle tmp;
639 memset(&tmp, 0, sizeof(tmp));
641 if ((ret = get_qcx(s, n, &tmp)) < 0)
643 for (compno = 0; compno < s->ncomponents; compno++)
644 if (!(properties[compno] & HAD_QCC))
645 memcpy(q + compno, &tmp, sizeof(tmp));
649 /* Get quantization parameters for a component in the whole image
650 * on in a particular tile. */
651 static int get_qcc(Jpeg2000DecoderContext *s, int n, Jpeg2000QuantStyle *q,
656 if (bytestream2_get_bytes_left(&s->g) < 1)
657 return AVERROR_INVALIDDATA;
659 compno = bytestream2_get_byteu(&s->g);
661 if (compno >= s->ncomponents) {
662 av_log(s->avctx, AV_LOG_ERROR,
663 "Invalid compno %d. There are %d components in the image.\n",
664 compno, s->ncomponents);
665 return AVERROR_INVALIDDATA;
668 properties[compno] |= HAD_QCC;
669 return get_qcx(s, n - 1, q + compno);
672 static int get_poc(Jpeg2000DecoderContext *s, int size, Jpeg2000POC *p)
675 int elem_size = s->ncomponents <= 257 ? 7 : 9;
676 Jpeg2000POC tmp = {{{0}}};
678 if (bytestream2_get_bytes_left(&s->g) < 5 || size < 2 + elem_size) {
679 av_log(s->avctx, AV_LOG_ERROR, "Insufficient space for POC\n");
680 return AVERROR_INVALIDDATA;
684 avpriv_request_sample(s->avctx, "Fat POC not supported");
685 return AVERROR_PATCHWELCOME;
688 tmp.nb_poc = (size - 2) / elem_size;
689 if (tmp.nb_poc > MAX_POCS) {
690 avpriv_request_sample(s->avctx, "Too many POCs (%d)", tmp.nb_poc);
691 return AVERROR_PATCHWELCOME;
694 for (i = 0; i<tmp.nb_poc; i++) {
695 Jpeg2000POCEntry *e = &tmp.poc[i];
696 e->RSpoc = bytestream2_get_byteu(&s->g);
697 e->CSpoc = bytestream2_get_byteu(&s->g);
698 e->LYEpoc = bytestream2_get_be16u(&s->g);
699 e->REpoc = bytestream2_get_byteu(&s->g);
700 e->CEpoc = bytestream2_get_byteu(&s->g);
701 e->Ppoc = bytestream2_get_byteu(&s->g);
704 if (e->CEpoc > s->ncomponents)
705 e->CEpoc = s->ncomponents;
706 if ( e->RSpoc >= e->REpoc || e->REpoc > 33
707 || e->CSpoc >= e->CEpoc || e->CEpoc > s->ncomponents
709 av_log(s->avctx, AV_LOG_ERROR, "POC Entry %d is invalid (%d, %d, %d, %d, %d, %d)\n", i,
710 e->RSpoc, e->CSpoc, e->LYEpoc, e->REpoc, e->CEpoc, e->Ppoc
712 return AVERROR_INVALIDDATA;
716 if (!p->nb_poc || p->is_default) {
719 if (p->nb_poc + tmp.nb_poc > MAX_POCS) {
720 av_log(s->avctx, AV_LOG_ERROR, "Insufficient space for POC\n");
721 return AVERROR_INVALIDDATA;
723 memcpy(p->poc + p->nb_poc, tmp.poc, tmp.nb_poc * sizeof(tmp.poc[0]));
724 p->nb_poc += tmp.nb_poc;
733 /* Get start of tile segment. */
734 static int get_sot(Jpeg2000DecoderContext *s, int n)
736 Jpeg2000TilePart *tp;
741 if (bytestream2_get_bytes_left(&s->g) < 8)
742 return AVERROR_INVALIDDATA;
745 Isot = bytestream2_get_be16u(&s->g); // Isot
746 if (Isot >= s->numXtiles * s->numYtiles)
747 return AVERROR_INVALIDDATA;
750 Psot = bytestream2_get_be32u(&s->g); // Psot
751 TPsot = bytestream2_get_byteu(&s->g); // TPsot
753 /* Read TNSot but not used */
754 bytestream2_get_byteu(&s->g); // TNsot
757 Psot = bytestream2_get_bytes_left(&s->g) - 2 + n + 2;
759 if (Psot > bytestream2_get_bytes_left(&s->g) - 2 + n + 2) {
760 av_log(s->avctx, AV_LOG_ERROR, "Psot %"PRIu32" too big\n", Psot);
761 return AVERROR_INVALIDDATA;
764 if (TPsot >= FF_ARRAY_ELEMS(s->tile[Isot].tile_part)) {
765 avpriv_request_sample(s->avctx, "Too many tile parts");
766 return AVERROR_PATCHWELCOME;
769 s->tile[Isot].tp_idx = TPsot;
770 tp = s->tile[Isot].tile_part + TPsot;
771 tp->tile_index = Isot;
772 tp->tp_end = s->g.buffer + Psot - n - 2;
775 Jpeg2000Tile *tile = s->tile + s->curtileno;
778 memcpy(tile->codsty, s->codsty, s->ncomponents * sizeof(Jpeg2000CodingStyle));
779 memcpy(tile->qntsty, s->qntsty, s->ncomponents * sizeof(Jpeg2000QuantStyle));
780 memcpy(&tile->poc , &s->poc , sizeof(tile->poc));
781 tile->poc.is_default = 1;
787 /* Tile-part lengths: see ISO 15444-1:2002, section A.7.1
788 * Used to know the number of tile parts and lengths.
789 * There may be multiple TLMs in the header.
790 * TODO: The function is not used for tile-parts management, nor anywhere else.
791 * It can be useful to allocate memory for tile parts, before managing the SOT
792 * markers. Parsing the TLM header is needed to increment the input header
794 * This marker is mandatory for DCI. */
795 static uint8_t get_tlm(Jpeg2000DecoderContext *s, int n)
797 uint8_t Stlm, ST, SP, tile_tlm, i;
798 bytestream2_get_byte(&s->g); /* Ztlm: skipped */
799 Stlm = bytestream2_get_byte(&s->g);
801 // too complex ? ST = ((Stlm >> 4) & 0x01) + ((Stlm >> 4) & 0x02);
802 ST = (Stlm >> 4) & 0x03;
803 // TODO: Manage case of ST = 0b11 --> raise error
804 SP = (Stlm >> 6) & 0x01;
805 tile_tlm = (n - 4) / ((SP + 1) * 2 + ST);
806 for (i = 0; i < tile_tlm; i++) {
811 bytestream2_get_byte(&s->g);
814 bytestream2_get_be16(&s->g);
817 bytestream2_get_be32(&s->g);
821 bytestream2_get_be16(&s->g);
823 bytestream2_get_be32(&s->g);
829 static uint8_t get_plt(Jpeg2000DecoderContext *s, int n)
833 av_log(s->avctx, AV_LOG_DEBUG,
834 "PLT marker at pos 0x%X\n", bytestream2_tell(&s->g) - 4);
836 /*Zplt =*/ bytestream2_get_byte(&s->g);
838 for (i = 0; i < n - 3; i++) {
839 bytestream2_get_byte(&s->g);
845 static int init_tile(Jpeg2000DecoderContext *s, int tileno)
848 int tilex = tileno % s->numXtiles;
849 int tiley = tileno / s->numXtiles;
850 Jpeg2000Tile *tile = s->tile + tileno;
853 return AVERROR(ENOMEM);
855 tile->coord[0][0] = av_clip(tilex * (int64_t)s->tile_width + s->tile_offset_x, s->image_offset_x, s->width);
856 tile->coord[0][1] = av_clip((tilex + 1) * (int64_t)s->tile_width + s->tile_offset_x, s->image_offset_x, s->width);
857 tile->coord[1][0] = av_clip(tiley * (int64_t)s->tile_height + s->tile_offset_y, s->image_offset_y, s->height);
858 tile->coord[1][1] = av_clip((tiley + 1) * (int64_t)s->tile_height + s->tile_offset_y, s->image_offset_y, s->height);
860 for (compno = 0; compno < s->ncomponents; compno++) {
861 Jpeg2000Component *comp = tile->comp + compno;
862 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
863 Jpeg2000QuantStyle *qntsty = tile->qntsty + compno;
864 int ret; // global bandno
866 comp->coord_o[0][0] = tile->coord[0][0];
867 comp->coord_o[0][1] = tile->coord[0][1];
868 comp->coord_o[1][0] = tile->coord[1][0];
869 comp->coord_o[1][1] = tile->coord[1][1];
871 comp->coord_o[0][0] /= s->cdx[compno];
872 comp->coord_o[0][1] /= s->cdx[compno];
873 comp->coord_o[1][0] /= s->cdy[compno];
874 comp->coord_o[1][1] /= s->cdy[compno];
877 comp->coord[0][0] = ff_jpeg2000_ceildivpow2(comp->coord_o[0][0], s->reduction_factor);
878 comp->coord[0][1] = ff_jpeg2000_ceildivpow2(comp->coord_o[0][1], s->reduction_factor);
879 comp->coord[1][0] = ff_jpeg2000_ceildivpow2(comp->coord_o[1][0], s->reduction_factor);
880 comp->coord[1][1] = ff_jpeg2000_ceildivpow2(comp->coord_o[1][1], s->reduction_factor);
882 if (ret = ff_jpeg2000_init_component(comp, codsty, qntsty,
883 s->cbps[compno], s->cdx[compno],
884 s->cdy[compno], s->avctx))
890 /* Read the number of coding passes. */
891 static int getnpasses(Jpeg2000DecoderContext *s)
898 if ((num = get_bits(s, 2)) != 3)
899 return num < 0 ? num : 3 + num;
900 if ((num = get_bits(s, 5)) != 31)
901 return num < 0 ? num : 6 + num;
902 num = get_bits(s, 7);
903 return num < 0 ? num : 37 + num;
906 static int getlblockinc(Jpeg2000DecoderContext *s)
909 while (ret = get_bits(s, 1)) {
917 static int jpeg2000_decode_packet(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile, int *tp_index,
918 Jpeg2000CodingStyle *codsty,
919 Jpeg2000ResLevel *rlevel, int precno,
920 int layno, uint8_t *expn, int numgbits)
922 int bandno, cblkno, ret, nb_code_blocks;
925 if (layno < rlevel->band[0].prec[precno].decoded_layers)
927 rlevel->band[0].prec[precno].decoded_layers = layno + 1;
929 if (bytestream2_get_bytes_left(&s->g) == 0 && s->bit_index == 8) {
930 if (*tp_index < FF_ARRAY_ELEMS(tile->tile_part) - 1) {
931 s->g = tile->tile_part[++(*tp_index)].tpg;
935 if (bytestream2_peek_be32(&s->g) == JPEG2000_SOP_FIXED_BYTES)
936 bytestream2_skip(&s->g, JPEG2000_SOP_BYTE_LENGTH);
938 if (!(ret = get_bits(s, 1))) {
944 for (bandno = 0; bandno < rlevel->nbands; bandno++) {
945 Jpeg2000Band *band = rlevel->band + bandno;
946 Jpeg2000Prec *prec = band->prec + precno;
948 if (band->coord[0][0] == band->coord[0][1] ||
949 band->coord[1][0] == band->coord[1][1])
951 nb_code_blocks = prec->nb_codeblocks_height *
952 prec->nb_codeblocks_width;
953 for (cblkno = 0; cblkno < nb_code_blocks; cblkno++) {
954 Jpeg2000Cblk *cblk = prec->cblk + cblkno;
955 int incl, newpasses, llen;
959 incl = get_bits(s, 1);
961 incl = tag_tree_decode(s, prec->cblkincl + cblkno, layno + 1) == layno;
967 if (!cblk->npasses) {
968 int v = expn[bandno] + numgbits - 1 -
969 tag_tree_decode(s, prec->zerobits + cblkno, 100);
970 if (v < 0 || v > 30) {
971 av_log(s->avctx, AV_LOG_ERROR,
972 "nonzerobits %d invalid or unsupported\n", v);
973 return AVERROR_INVALIDDATA;
975 cblk->nonzerobits = v;
977 if ((newpasses = getnpasses(s)) < 0)
979 av_assert2(newpasses > 0);
980 if (cblk->npasses + newpasses >= JPEG2000_MAX_PASSES) {
981 avpriv_request_sample(s->avctx, "Too many passes");
982 return AVERROR_PATCHWELCOME;
984 if ((llen = getlblockinc(s)) < 0)
986 if (cblk->lblock + llen + av_log2(newpasses) > 16) {
987 avpriv_request_sample(s->avctx,
988 "Block with length beyond 16 bits");
989 return AVERROR_PATCHWELCOME;
992 cblk->lblock += llen;
994 cblk->nb_lengthinc = 0;
995 cblk->nb_terminationsinc = 0;
996 av_free(cblk->lengthinc);
997 cblk->lengthinc = av_mallocz_array(newpasses , sizeof(*cblk->lengthinc));
998 if (!cblk->lengthinc)
999 return AVERROR(ENOMEM);
1000 tmp = av_realloc_array(cblk->data_start, cblk->nb_terminations + newpasses + 1, sizeof(*cblk->data_start));
1002 return AVERROR(ENOMEM);
1003 cblk->data_start = tmp;
1007 while (newpasses1 < newpasses) {
1009 if (needs_termination(codsty->cblk_style, cblk->npasses + newpasses1 - 1)) {
1010 cblk->nb_terminationsinc ++;
1015 if ((ret = get_bits(s, av_log2(newpasses1) + cblk->lblock)) < 0)
1017 if (ret > cblk->data_allocated) {
1018 size_t new_size = FFMAX(2*cblk->data_allocated, ret);
1019 void *new = av_realloc(cblk->data, new_size);
1022 cblk->data_allocated = new_size;
1025 if (ret > cblk->data_allocated) {
1026 avpriv_request_sample(s->avctx,
1027 "Block with lengthinc greater than %"SIZE_SPECIFIER"",
1028 cblk->data_allocated);
1029 return AVERROR_PATCHWELCOME;
1031 cblk->lengthinc[cblk->nb_lengthinc++] = ret;
1032 cblk->npasses += newpasses1;
1033 newpasses -= newpasses1;
1039 if (codsty->csty & JPEG2000_CSTY_EPH) {
1040 if (bytestream2_peek_be16(&s->g) == JPEG2000_EPH)
1041 bytestream2_skip(&s->g, 2);
1043 av_log(s->avctx, AV_LOG_ERROR, "EPH marker not found. instead %X\n", bytestream2_peek_be32(&s->g));
1046 for (bandno = 0; bandno < rlevel->nbands; bandno++) {
1047 Jpeg2000Band *band = rlevel->band + bandno;
1048 Jpeg2000Prec *prec = band->prec + precno;
1050 nb_code_blocks = prec->nb_codeblocks_height * prec->nb_codeblocks_width;
1051 for (cblkno = 0; cblkno < nb_code_blocks; cblkno++) {
1052 Jpeg2000Cblk *cblk = prec->cblk + cblkno;
1053 if (!cblk->nb_terminationsinc && !cblk->lengthinc)
1055 for (cwsno = 0; cwsno < cblk->nb_lengthinc; cwsno ++) {
1056 if (cblk->data_allocated < cblk->length + cblk->lengthinc[cwsno] + 4) {
1057 size_t new_size = FFMAX(2*cblk->data_allocated, cblk->length + cblk->lengthinc[cwsno] + 4);
1058 void *new = av_realloc(cblk->data, new_size);
1061 cblk->data_allocated = new_size;
1064 if ( bytestream2_get_bytes_left(&s->g) < cblk->lengthinc[cwsno]
1065 || cblk->data_allocated < cblk->length + cblk->lengthinc[cwsno] + 4
1067 av_log(s->avctx, AV_LOG_ERROR,
1068 "Block length %"PRIu16" or lengthinc %d is too large, left %d\n",
1069 cblk->length, cblk->lengthinc[cwsno], bytestream2_get_bytes_left(&s->g));
1070 return AVERROR_INVALIDDATA;
1073 bytestream2_get_bufferu(&s->g, cblk->data + cblk->length, cblk->lengthinc[cwsno]);
1074 cblk->length += cblk->lengthinc[cwsno];
1075 cblk->lengthinc[cwsno] = 0;
1076 if (cblk->nb_terminationsinc) {
1077 cblk->nb_terminationsinc--;
1078 cblk->nb_terminations++;
1079 cblk->data[cblk->length++] = 0xFF;
1080 cblk->data[cblk->length++] = 0xFF;
1081 cblk->data_start[cblk->nb_terminations] = cblk->length;
1084 av_freep(&cblk->lengthinc);
1090 static int jpeg2000_decode_packets_po_iteration(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile,
1091 int RSpoc, int CSpoc,
1092 int LYEpoc, int REpoc, int CEpoc,
1093 int Ppoc, int *tp_index)
1096 int layno, reslevelno, compno, precno, ok_reslevel;
1101 case JPEG2000_PGOD_RLCP:
1102 av_log(s->avctx, AV_LOG_DEBUG, "Progression order RLCP\n");
1104 for (reslevelno = RSpoc; ok_reslevel && reslevelno < REpoc; reslevelno++) {
1106 for (layno = 0; layno < LYEpoc; layno++) {
1107 for (compno = CSpoc; compno < CEpoc; compno++) {
1108 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1109 Jpeg2000QuantStyle *qntsty = tile->qntsty + compno;
1110 if (reslevelno < codsty->nreslevels) {
1111 Jpeg2000ResLevel *rlevel = tile->comp[compno].reslevel +
1114 for (precno = 0; precno < rlevel->num_precincts_x * rlevel->num_precincts_y; precno++)
1115 if ((ret = jpeg2000_decode_packet(s, tile, tp_index,
1118 qntsty->expn + (reslevelno ? 3 * (reslevelno - 1) + 1 : 0),
1119 qntsty->nguardbits)) < 0)
1127 case JPEG2000_PGOD_LRCP:
1128 av_log(s->avctx, AV_LOG_DEBUG, "Progression order LRCP\n");
1129 for (layno = 0; layno < LYEpoc; layno++) {
1131 for (reslevelno = RSpoc; ok_reslevel && reslevelno < REpoc; reslevelno++) {
1133 for (compno = CSpoc; compno < CEpoc; compno++) {
1134 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1135 Jpeg2000QuantStyle *qntsty = tile->qntsty + compno;
1136 if (reslevelno < codsty->nreslevels) {
1137 Jpeg2000ResLevel *rlevel = tile->comp[compno].reslevel +
1140 for (precno = 0; precno < rlevel->num_precincts_x * rlevel->num_precincts_y; precno++)
1141 if ((ret = jpeg2000_decode_packet(s, tile, tp_index,
1144 qntsty->expn + (reslevelno ? 3 * (reslevelno - 1) + 1 : 0),
1145 qntsty->nguardbits)) < 0)
1153 case JPEG2000_PGOD_CPRL:
1154 av_log(s->avctx, AV_LOG_DEBUG, "Progression order CPRL\n");
1155 for (compno = CSpoc; compno < CEpoc; compno++) {
1156 Jpeg2000Component *comp = tile->comp + compno;
1157 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1158 Jpeg2000QuantStyle *qntsty = tile->qntsty + compno;
1162 if (RSpoc > FFMIN(codsty->nreslevels, REpoc))
1165 for (reslevelno = RSpoc; reslevelno < FFMIN(codsty->nreslevels, REpoc); reslevelno++) {
1166 uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; // ==> N_L - r
1167 Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
1168 step_x = FFMIN(step_x, rlevel->log2_prec_width + reducedresno);
1169 step_y = FFMIN(step_y, rlevel->log2_prec_height + reducedresno);
1171 av_assert0(step_x < 32 && step_y < 32);
1175 for (y = tile->coord[1][0]; y < tile->coord[1][1]; y = (y/step_y + 1)*step_y) {
1176 for (x = tile->coord[0][0]; x < tile->coord[0][1]; x = (x/step_x + 1)*step_x) {
1177 for (reslevelno = RSpoc; reslevelno < FFMIN(codsty->nreslevels, REpoc); reslevelno++) {
1178 unsigned prcx, prcy;
1179 uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; // ==> N_L - r
1180 Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
1181 int xc = x / s->cdx[compno];
1182 int yc = y / s->cdy[compno];
1184 if (yc % (1LL << (rlevel->log2_prec_height + reducedresno)) && y != tile->coord[1][0]) //FIXME this is a subset of the check
1187 if (xc % (1LL << (rlevel->log2_prec_width + reducedresno)) && x != tile->coord[0][0]) //FIXME this is a subset of the check
1190 // check if a precinct exists
1191 prcx = ff_jpeg2000_ceildivpow2(xc, reducedresno) >> rlevel->log2_prec_width;
1192 prcy = ff_jpeg2000_ceildivpow2(yc, reducedresno) >> rlevel->log2_prec_height;
1193 prcx -= ff_jpeg2000_ceildivpow2(comp->coord_o[0][0], reducedresno) >> rlevel->log2_prec_width;
1194 prcy -= ff_jpeg2000_ceildivpow2(comp->coord_o[1][0], reducedresno) >> rlevel->log2_prec_height;
1196 precno = prcx + rlevel->num_precincts_x * prcy;
1198 if (prcx >= rlevel->num_precincts_x || prcy >= rlevel->num_precincts_y) {
1199 av_log(s->avctx, AV_LOG_WARNING, "prc %d %d outside limits %d %d\n",
1200 prcx, prcy, rlevel->num_precincts_x, rlevel->num_precincts_y);
1204 for (layno = 0; layno < LYEpoc; layno++) {
1205 if ((ret = jpeg2000_decode_packet(s, tile, tp_index, codsty, rlevel,
1207 qntsty->expn + (reslevelno ? 3 * (reslevelno - 1) + 1 : 0),
1208 qntsty->nguardbits)) < 0)
1217 case JPEG2000_PGOD_RPCL:
1218 av_log(s->avctx, AV_LOG_WARNING, "Progression order RPCL\n");
1220 for (reslevelno = RSpoc; ok_reslevel && reslevelno < REpoc; reslevelno++) {
1224 for (compno = CSpoc; compno < CEpoc; compno++) {
1225 Jpeg2000Component *comp = tile->comp + compno;
1226 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1228 if (reslevelno < codsty->nreslevels) {
1229 uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; // ==> N_L - r
1230 Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
1231 step_x = FFMIN(step_x, rlevel->log2_prec_width + reducedresno);
1232 step_y = FFMIN(step_y, rlevel->log2_prec_height + reducedresno);
1238 for (y = tile->coord[1][0]; y < tile->coord[1][1]; y = (y/step_y + 1)*step_y) {
1239 for (x = tile->coord[0][0]; x < tile->coord[0][1]; x = (x/step_x + 1)*step_x) {
1240 for (compno = CSpoc; compno < CEpoc; compno++) {
1241 Jpeg2000Component *comp = tile->comp + compno;
1242 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1243 Jpeg2000QuantStyle *qntsty = tile->qntsty + compno;
1244 uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; // ==> N_L - r
1245 Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
1246 unsigned prcx, prcy;
1248 int xc = x / s->cdx[compno];
1249 int yc = y / s->cdy[compno];
1251 if (reslevelno >= codsty->nreslevels)
1254 if (yc % (1 << (rlevel->log2_prec_height + reducedresno)) && y != tile->coord[1][0]) //FIXME this is a subset of the check
1257 if (xc % (1 << (rlevel->log2_prec_width + reducedresno)) && x != tile->coord[0][0]) //FIXME this is a subset of the check
1260 // check if a precinct exists
1261 prcx = ff_jpeg2000_ceildivpow2(xc, reducedresno) >> rlevel->log2_prec_width;
1262 prcy = ff_jpeg2000_ceildivpow2(yc, reducedresno) >> rlevel->log2_prec_height;
1263 prcx -= ff_jpeg2000_ceildivpow2(comp->coord_o[0][0], reducedresno) >> rlevel->log2_prec_width;
1264 prcy -= ff_jpeg2000_ceildivpow2(comp->coord_o[1][0], reducedresno) >> rlevel->log2_prec_height;
1266 precno = prcx + rlevel->num_precincts_x * prcy;
1269 if (prcx >= rlevel->num_precincts_x || prcy >= rlevel->num_precincts_y) {
1270 av_log(s->avctx, AV_LOG_WARNING, "prc %d %d outside limits %d %d\n",
1271 prcx, prcy, rlevel->num_precincts_x, rlevel->num_precincts_y);
1275 for (layno = 0; layno < LYEpoc; layno++) {
1276 if ((ret = jpeg2000_decode_packet(s, tile, tp_index,
1279 qntsty->expn + (reslevelno ? 3 * (reslevelno - 1) + 1 : 0),
1280 qntsty->nguardbits)) < 0)
1289 case JPEG2000_PGOD_PCRL:
1290 av_log(s->avctx, AV_LOG_WARNING, "Progression order PCRL\n");
1293 for (compno = CSpoc; compno < CEpoc; compno++) {
1294 Jpeg2000Component *comp = tile->comp + compno;
1295 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1297 for (reslevelno = RSpoc; reslevelno < FFMIN(codsty->nreslevels, REpoc); reslevelno++) {
1298 uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; // ==> N_L - r
1299 Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
1300 step_x = FFMIN(step_x, rlevel->log2_prec_width + reducedresno);
1301 step_y = FFMIN(step_y, rlevel->log2_prec_height + reducedresno);
1304 if (step_x >= 31 || step_y >= 31){
1305 avpriv_request_sample(s->avctx, "PCRL with large step");
1306 return AVERROR_PATCHWELCOME;
1311 for (y = tile->coord[1][0]; y < tile->coord[1][1]; y = (y/step_y + 1)*step_y) {
1312 for (x = tile->coord[0][0]; x < tile->coord[0][1]; x = (x/step_x + 1)*step_x) {
1313 for (compno = CSpoc; compno < CEpoc; compno++) {
1314 Jpeg2000Component *comp = tile->comp + compno;
1315 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1316 Jpeg2000QuantStyle *qntsty = tile->qntsty + compno;
1317 int xc = x / s->cdx[compno];
1318 int yc = y / s->cdy[compno];
1320 for (reslevelno = RSpoc; reslevelno < FFMIN(codsty->nreslevels, REpoc); reslevelno++) {
1321 unsigned prcx, prcy;
1322 uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; // ==> N_L - r
1323 Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
1325 if (yc % (1 << (rlevel->log2_prec_height + reducedresno)) && y != tile->coord[1][0]) //FIXME this is a subset of the check
1328 if (xc % (1 << (rlevel->log2_prec_width + reducedresno)) && x != tile->coord[0][0]) //FIXME this is a subset of the check
1331 // check if a precinct exists
1332 prcx = ff_jpeg2000_ceildivpow2(xc, reducedresno) >> rlevel->log2_prec_width;
1333 prcy = ff_jpeg2000_ceildivpow2(yc, reducedresno) >> rlevel->log2_prec_height;
1334 prcx -= ff_jpeg2000_ceildivpow2(comp->coord_o[0][0], reducedresno) >> rlevel->log2_prec_width;
1335 prcy -= ff_jpeg2000_ceildivpow2(comp->coord_o[1][0], reducedresno) >> rlevel->log2_prec_height;
1337 precno = prcx + rlevel->num_precincts_x * prcy;
1339 if (prcx >= rlevel->num_precincts_x || prcy >= rlevel->num_precincts_y) {
1340 av_log(s->avctx, AV_LOG_WARNING, "prc %d %d outside limits %d %d\n",
1341 prcx, prcy, rlevel->num_precincts_x, rlevel->num_precincts_y);
1345 for (layno = 0; layno < LYEpoc; layno++) {
1346 if ((ret = jpeg2000_decode_packet(s, tile, tp_index, codsty, rlevel,
1348 qntsty->expn + (reslevelno ? 3 * (reslevelno - 1) + 1 : 0),
1349 qntsty->nguardbits)) < 0)
1365 static int jpeg2000_decode_packets(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile)
1367 int ret = AVERROR_BUG;
1372 if (tile->poc.nb_poc) {
1373 for (i=0; i<tile->poc.nb_poc; i++) {
1374 Jpeg2000POCEntry *e = &tile->poc.poc[i];
1375 ret = jpeg2000_decode_packets_po_iteration(s, tile,
1377 FFMIN(e->LYEpoc, tile->codsty[0].nlayers),
1379 FFMIN(e->CEpoc, s->ncomponents),
1386 ret = jpeg2000_decode_packets_po_iteration(s, tile,
1388 tile->codsty[0].nlayers,
1391 tile->codsty[0].prog_order,
1395 /* EOC marker reached */
1396 bytestream2_skip(&s->g, 2);
1401 /* TIER-1 routines */
1402 static void decode_sigpass(Jpeg2000T1Context *t1, int width, int height,
1403 int bpno, int bandno,
1404 int vert_causal_ctx_csty_symbol)
1406 int mask = 3 << (bpno - 1), y0, x, y;
1408 for (y0 = 0; y0 < height; y0 += 4)
1409 for (x = 0; x < width; x++)
1410 for (y = y0; y < height && y < y0 + 4; y++) {
1411 int flags_mask = -1;
1412 if (vert_causal_ctx_csty_symbol && y == y0 + 3)
1413 flags_mask &= ~(JPEG2000_T1_SIG_S | JPEG2000_T1_SIG_SW | JPEG2000_T1_SIG_SE | JPEG2000_T1_SGN_S);
1414 if ((t1->flags[(y+1) * t1->stride + x+1] & JPEG2000_T1_SIG_NB & flags_mask)
1415 && !(t1->flags[(y+1) * t1->stride + x+1] & (JPEG2000_T1_SIG | JPEG2000_T1_VIS))) {
1416 if (ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ff_jpeg2000_getsigctxno(t1->flags[(y+1) * t1->stride + x+1] & flags_mask, bandno))) {
1417 int xorbit, ctxno = ff_jpeg2000_getsgnctxno(t1->flags[(y+1) * t1->stride + x+1] & flags_mask, &xorbit);
1419 t1->data[(y) * t1->stride + x] = ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ctxno) ? -mask : mask;
1421 t1->data[(y) * t1->stride + x] = (ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ctxno) ^ xorbit) ?
1424 ff_jpeg2000_set_significance(t1, x, y,
1425 t1->data[(y) * t1->stride + x] < 0);
1427 t1->flags[(y + 1) * t1->stride + x + 1] |= JPEG2000_T1_VIS;
1432 static void decode_refpass(Jpeg2000T1Context *t1, int width, int height,
1433 int bpno, int vert_causal_ctx_csty_symbol)
1438 phalf = 1 << (bpno - 1);
1441 for (y0 = 0; y0 < height; y0 += 4)
1442 for (x = 0; x < width; x++)
1443 for (y = y0; y < height && y < y0 + 4; y++)
1444 if ((t1->flags[(y + 1) * t1->stride + x + 1] & (JPEG2000_T1_SIG | JPEG2000_T1_VIS)) == JPEG2000_T1_SIG) {
1445 int flags_mask = (vert_causal_ctx_csty_symbol && y == y0 + 3) ?
1446 ~(JPEG2000_T1_SIG_S | JPEG2000_T1_SIG_SW | JPEG2000_T1_SIG_SE | JPEG2000_T1_SGN_S) : -1;
1447 int ctxno = ff_jpeg2000_getrefctxno(t1->flags[(y + 1) * t1->stride + x + 1] & flags_mask);
1448 int r = ff_mqc_decode(&t1->mqc,
1449 t1->mqc.cx_states + ctxno)
1451 t1->data[(y) * t1->stride + x] += t1->data[(y) * t1->stride + x] < 0 ? -r : r;
1452 t1->flags[(y + 1) * t1->stride + x + 1] |= JPEG2000_T1_REF;
1456 static void decode_clnpass(Jpeg2000DecoderContext *s, Jpeg2000T1Context *t1,
1457 int width, int height, int bpno, int bandno,
1458 int seg_symbols, int vert_causal_ctx_csty_symbol)
1460 int mask = 3 << (bpno - 1), y0, x, y, runlen, dec;
1462 for (y0 = 0; y0 < height; y0 += 4) {
1463 for (x = 0; x < width; x++) {
1464 int flags_mask = -1;
1465 if (vert_causal_ctx_csty_symbol)
1466 flags_mask &= ~(JPEG2000_T1_SIG_S | JPEG2000_T1_SIG_SW | JPEG2000_T1_SIG_SE | JPEG2000_T1_SGN_S);
1467 if (y0 + 3 < height &&
1468 !((t1->flags[(y0 + 1) * t1->stride + x + 1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG)) ||
1469 (t1->flags[(y0 + 2) * t1->stride + x + 1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG)) ||
1470 (t1->flags[(y0 + 3) * t1->stride + x + 1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG)) ||
1471 (t1->flags[(y0 + 4) * t1->stride + x + 1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG) & flags_mask))) {
1472 if (!ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_RL))
1474 runlen = ff_mqc_decode(&t1->mqc,
1475 t1->mqc.cx_states + MQC_CX_UNI);
1476 runlen = (runlen << 1) | ff_mqc_decode(&t1->mqc,
1485 for (y = y0 + runlen; y < y0 + 4 && y < height; y++) {
1486 int flags_mask = -1;
1487 if (vert_causal_ctx_csty_symbol && y == y0 + 3)
1488 flags_mask &= ~(JPEG2000_T1_SIG_S | JPEG2000_T1_SIG_SW | JPEG2000_T1_SIG_SE | JPEG2000_T1_SGN_S);
1490 if (!(t1->flags[(y+1) * t1->stride + x+1] & (JPEG2000_T1_SIG | JPEG2000_T1_VIS))) {
1491 dec = ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ff_jpeg2000_getsigctxno(t1->flags[(y+1) * t1->stride + x+1] & flags_mask,
1497 int ctxno = ff_jpeg2000_getsgnctxno(t1->flags[(y + 1) * t1->stride + x + 1] & flags_mask,
1499 t1->data[(y) * t1->stride + x] = (ff_mqc_decode(&t1->mqc,
1500 t1->mqc.cx_states + ctxno) ^
1503 ff_jpeg2000_set_significance(t1, x, y, t1->data[(y) * t1->stride + x] < 0);
1506 t1->flags[(y + 1) * t1->stride + x + 1] &= ~JPEG2000_T1_VIS;
1512 val = ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_UNI);
1513 val = (val << 1) + ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_UNI);
1514 val = (val << 1) + ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_UNI);
1515 val = (val << 1) + ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_UNI);
1517 av_log(s->avctx, AV_LOG_ERROR,
1518 "Segmentation symbol value incorrect\n");
1522 static int decode_cblk(Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *codsty,
1523 Jpeg2000T1Context *t1, Jpeg2000Cblk *cblk,
1524 int width, int height, int bandpos)
1526 int passno = cblk->npasses, pass_t = 2, bpno = cblk->nonzerobits - 1;
1528 int vert_causal_ctx_csty_symbol = codsty->cblk_style & JPEG2000_CBLK_VSC;
1532 av_assert0(width <= 1024U && height <= 1024U);
1533 av_assert0(width*height <= 4096);
1535 memset(t1->data, 0, t1->stride * height * sizeof(*t1->data));
1537 /* If code-block contains no compressed data: nothing to do. */
1541 memset(t1->flags, 0, t1->stride * (height + 2) * sizeof(*t1->flags));
1543 cblk->data[cblk->length] = 0xff;
1544 cblk->data[cblk->length+1] = 0xff;
1545 ff_mqc_initdec(&t1->mqc, cblk->data, 0, 1);
1549 av_log(s->avctx, AV_LOG_ERROR, "bpno became negative\n");
1550 return AVERROR_INVALIDDATA;
1554 decode_sigpass(t1, width, height, bpno + 1, bandpos,
1555 vert_causal_ctx_csty_symbol);
1558 decode_refpass(t1, width, height, bpno + 1, vert_causal_ctx_csty_symbol);
1561 av_assert2(!t1->mqc.raw);
1562 decode_clnpass(s, t1, width, height, bpno + 1, bandpos,
1563 codsty->cblk_style & JPEG2000_CBLK_SEGSYM,
1564 vert_causal_ctx_csty_symbol);
1567 if (codsty->cblk_style & JPEG2000_CBLK_RESET) // XXX no testcase for just this
1568 ff_mqc_init_contexts(&t1->mqc);
1570 if (passno && (coder_type = needs_termination(codsty->cblk_style, pass_cnt))) {
1571 if (term_cnt >= cblk->nb_terminations) {
1572 av_log(s->avctx, AV_LOG_ERROR, "Missing needed termination \n");
1573 return AVERROR_INVALIDDATA;
1575 if (FFABS(cblk->data + cblk->data_start[term_cnt + 1] - 2 - t1->mqc.bp) > 0) {
1576 av_log(s->avctx, AV_LOG_WARNING, "Mid mismatch %"PTRDIFF_SPECIFIER" in pass %d of %d\n",
1577 cblk->data + cblk->data_start[term_cnt + 1] - 2 - t1->mqc.bp,
1578 pass_cnt, cblk->npasses);
1581 ff_mqc_initdec(&t1->mqc, cblk->data + cblk->data_start[++term_cnt], coder_type == 2, 0);
1592 if (cblk->data + cblk->length - 2*(term_cnt < cblk->nb_terminations) != t1->mqc.bp) {
1593 av_log(s->avctx, AV_LOG_WARNING, "End mismatch %"PTRDIFF_SPECIFIER"\n",
1594 cblk->data + cblk->length - 2*(term_cnt < cblk->nb_terminations) - t1->mqc.bp);
1600 /* TODO: Verify dequantization for lossless case
1601 * comp->data can be float or int
1602 * band->stepsize can be float or int
1603 * depending on the type of DWT transformation.
1604 * see ISO/IEC 15444-1:2002 A.6.1 */
1606 /* Float dequantization of a codeblock.*/
1607 static void dequantization_float(int x, int y, Jpeg2000Cblk *cblk,
1608 Jpeg2000Component *comp,
1609 Jpeg2000T1Context *t1, Jpeg2000Band *band)
1612 int w = cblk->coord[0][1] - cblk->coord[0][0];
1613 for (j = 0; j < (cblk->coord[1][1] - cblk->coord[1][0]); ++j) {
1614 float *datap = &comp->f_data[(comp->coord[0][1] - comp->coord[0][0]) * (y + j) + x];
1615 int *src = t1->data + j*t1->stride;
1616 for (i = 0; i < w; ++i)
1617 datap[i] = src[i] * band->f_stepsize;
1621 /* Integer dequantization of a codeblock.*/
1622 static void dequantization_int(int x, int y, Jpeg2000Cblk *cblk,
1623 Jpeg2000Component *comp,
1624 Jpeg2000T1Context *t1, Jpeg2000Band *band)
1627 int w = cblk->coord[0][1] - cblk->coord[0][0];
1628 for (j = 0; j < (cblk->coord[1][1] - cblk->coord[1][0]); ++j) {
1629 int32_t *datap = &comp->i_data[(comp->coord[0][1] - comp->coord[0][0]) * (y + j) + x];
1630 int *src = t1->data + j*t1->stride;
1631 if (band->i_stepsize == 32768) {
1632 for (i = 0; i < w; ++i)
1633 datap[i] = src[i] / 2;
1635 // This should be VERY uncommon
1636 for (i = 0; i < w; ++i)
1637 datap[i] = (src[i] * (int64_t)band->i_stepsize) / 65536;
1642 static void dequantization_int_97(int x, int y, Jpeg2000Cblk *cblk,
1643 Jpeg2000Component *comp,
1644 Jpeg2000T1Context *t1, Jpeg2000Band *band)
1647 int w = cblk->coord[0][1] - cblk->coord[0][0];
1648 for (j = 0; j < (cblk->coord[1][1] - cblk->coord[1][0]); ++j) {
1649 int32_t *datap = &comp->i_data[(comp->coord[0][1] - comp->coord[0][0]) * (y + j) + x];
1650 int *src = t1->data + j*t1->stride;
1651 for (i = 0; i < w; ++i)
1652 datap[i] = (src[i] * (int64_t)band->i_stepsize + (1<<15)) >> 16;
1656 static inline void mct_decode(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile)
1661 for (i = 1; i < 3; i++) {
1662 if (tile->codsty[0].transform != tile->codsty[i].transform) {
1663 av_log(s->avctx, AV_LOG_ERROR, "Transforms mismatch, MCT not supported\n");
1666 if (memcmp(tile->comp[0].coord, tile->comp[i].coord, sizeof(tile->comp[0].coord))) {
1667 av_log(s->avctx, AV_LOG_ERROR, "Coords mismatch, MCT not supported\n");
1672 for (i = 0; i < 3; i++)
1673 if (tile->codsty[0].transform == FF_DWT97)
1674 src[i] = tile->comp[i].f_data;
1676 src[i] = tile->comp[i].i_data;
1678 for (i = 0; i < 2; i++)
1679 csize *= tile->comp[0].coord[i][1] - tile->comp[0].coord[i][0];
1681 s->dsp.mct_decode[tile->codsty[0].transform](src[0], src[1], src[2], csize);
1684 static inline void tile_codeblocks(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile)
1686 Jpeg2000T1Context t1;
1688 int compno, reslevelno, bandno;
1690 /* Loop on tile components */
1691 for (compno = 0; compno < s->ncomponents; compno++) {
1692 Jpeg2000Component *comp = tile->comp + compno;
1693 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1695 t1.stride = (1<<codsty->log2_cblk_width) + 2;
1697 /* Loop on resolution levels */
1698 for (reslevelno = 0; reslevelno < codsty->nreslevels2decode; reslevelno++) {
1699 Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
1701 for (bandno = 0; bandno < rlevel->nbands; bandno++) {
1702 int nb_precincts, precno;
1703 Jpeg2000Band *band = rlevel->band + bandno;
1704 int cblkno = 0, bandpos;
1706 bandpos = bandno + (reslevelno > 0);
1708 if (band->coord[0][0] == band->coord[0][1] ||
1709 band->coord[1][0] == band->coord[1][1])
1712 nb_precincts = rlevel->num_precincts_x * rlevel->num_precincts_y;
1713 /* Loop on precincts */
1714 for (precno = 0; precno < nb_precincts; precno++) {
1715 Jpeg2000Prec *prec = band->prec + precno;
1717 /* Loop on codeblocks */
1719 cblkno < prec->nb_codeblocks_width * prec->nb_codeblocks_height;
1722 Jpeg2000Cblk *cblk = prec->cblk + cblkno;
1723 decode_cblk(s, codsty, &t1, cblk,
1724 cblk->coord[0][1] - cblk->coord[0][0],
1725 cblk->coord[1][1] - cblk->coord[1][0],
1728 x = cblk->coord[0][0] - band->coord[0][0];
1729 y = cblk->coord[1][0] - band->coord[1][0];
1731 if (codsty->transform == FF_DWT97)
1732 dequantization_float(x, y, cblk, comp, &t1, band);
1733 else if (codsty->transform == FF_DWT97_INT)
1734 dequantization_int_97(x, y, cblk, comp, &t1, band);
1736 dequantization_int(x, y, cblk, comp, &t1, band);
1740 } /* end reslevel */
1743 ff_dwt_decode(&comp->dwt, codsty->transform == FF_DWT97 ? (void*)comp->f_data : (void*)comp->i_data);
1747 #define WRITE_FRAME(D, PIXEL) \
1748 static inline void write_frame_ ## D(Jpeg2000DecoderContext * s, Jpeg2000Tile * tile, \
1749 AVFrame * picture, int precision) \
1751 const AVPixFmtDescriptor *pixdesc = av_pix_fmt_desc_get(s->avctx->pix_fmt); \
1752 int planar = !!(pixdesc->flags & AV_PIX_FMT_FLAG_PLANAR); \
1753 int pixelsize = planar ? 1 : pixdesc->nb_components; \
1758 for (compno = 0; compno < s->ncomponents; compno++) { \
1759 Jpeg2000Component *comp = tile->comp + compno; \
1760 Jpeg2000CodingStyle *codsty = tile->codsty + compno; \
1762 float *datap = comp->f_data; \
1763 int32_t *i_datap = comp->i_data; \
1764 int cbps = s->cbps[compno]; \
1765 int w = tile->comp[compno].coord[0][1] - s->image_offset_x; \
1769 plane = s->cdef[compno] ? s->cdef[compno]-1 : (s->ncomponents-1); \
1771 y = tile->comp[compno].coord[1][0] - s->image_offset_y / s->cdy[compno]; \
1772 line = (PIXEL *)picture->data[plane] + y * (picture->linesize[plane] / sizeof(PIXEL));\
1773 for (; y < tile->comp[compno].coord[1][1] - s->image_offset_y; y++) { \
1776 x = tile->comp[compno].coord[0][0] - s->image_offset_x / s->cdx[compno]; \
1777 dst = line + x * pixelsize + compno*!planar; \
1779 if (codsty->transform == FF_DWT97) { \
1780 for (; x < w; x++) { \
1781 int val = lrintf(*datap) + (1 << (cbps - 1)); \
1782 /* DC level shift and clip see ISO 15444-1:2002 G.1.2 */ \
1783 val = av_clip(val, 0, (1 << cbps) - 1); \
1784 *dst = val << (precision - cbps); \
1789 for (; x < w; x++) { \
1790 int val = *i_datap + (1 << (cbps - 1)); \
1791 /* DC level shift and clip see ISO 15444-1:2002 G.1.2 */ \
1792 val = av_clip(val, 0, (1 << cbps) - 1); \
1793 *dst = val << (precision - cbps); \
1798 line += picture->linesize[plane] / sizeof(PIXEL); \
1804 WRITE_FRAME(8, uint8_t)
1805 WRITE_FRAME(16, uint16_t)
1809 static int jpeg2000_decode_tile(AVCodecContext *avctx, void *td,
1810 int jobnr, int threadnr)
1812 Jpeg2000DecoderContext *s = avctx->priv_data;
1813 AVFrame *picture = td;
1814 Jpeg2000Tile *tile = s->tile + jobnr;
1817 tile_codeblocks(s, tile);
1819 /* inverse MCT transformation */
1820 if (tile->codsty[0].mct)
1821 mct_decode(s, tile);
1823 for (x = 0; x < s->ncomponents; x++) {
1824 if (s->cdef[x] < 0) {
1825 for (x = 0; x < s->ncomponents; x++) {
1828 if ((s->ncomponents & 1) == 0)
1829 s->cdef[s->ncomponents-1] = 0;
1834 if (s->precision <= 8) {
1835 write_frame_8(s, tile, picture, 8);
1837 int precision = picture->format == AV_PIX_FMT_XYZ12 ||
1838 picture->format == AV_PIX_FMT_RGB48 ||
1839 picture->format == AV_PIX_FMT_RGBA64 ||
1840 picture->format == AV_PIX_FMT_GRAY16 ? 16 : s->precision;
1842 write_frame_16(s, tile, picture, precision);
1848 static void jpeg2000_dec_cleanup(Jpeg2000DecoderContext *s)
1851 for (tileno = 0; tileno < s->numXtiles * s->numYtiles; tileno++) {
1852 if (s->tile[tileno].comp) {
1853 for (compno = 0; compno < s->ncomponents; compno++) {
1854 Jpeg2000Component *comp = s->tile[tileno].comp + compno;
1855 Jpeg2000CodingStyle *codsty = s->tile[tileno].codsty + compno;
1857 ff_jpeg2000_cleanup(comp, codsty);
1859 av_freep(&s->tile[tileno].comp);
1863 memset(s->codsty, 0, sizeof(s->codsty));
1864 memset(s->qntsty, 0, sizeof(s->qntsty));
1865 memset(s->properties, 0, sizeof(s->properties));
1866 memset(&s->poc , 0, sizeof(s->poc));
1867 s->numXtiles = s->numYtiles = 0;
1871 static int jpeg2000_read_main_headers(Jpeg2000DecoderContext *s)
1873 Jpeg2000CodingStyle *codsty = s->codsty;
1874 Jpeg2000QuantStyle *qntsty = s->qntsty;
1875 Jpeg2000POC *poc = &s->poc;
1876 uint8_t *properties = s->properties;
1883 if (bytestream2_get_bytes_left(&s->g) < 2) {
1884 av_log(s->avctx, AV_LOG_ERROR, "Missing EOC\n");
1888 marker = bytestream2_get_be16u(&s->g);
1889 oldpos = bytestream2_tell(&s->g);
1891 if (marker == JPEG2000_SOD) {
1893 Jpeg2000TilePart *tp;
1896 av_log(s->avctx, AV_LOG_ERROR, "Missing SIZ\n");
1897 return AVERROR_INVALIDDATA;
1899 if (s->curtileno < 0) {
1900 av_log(s->avctx, AV_LOG_ERROR, "Missing SOT\n");
1901 return AVERROR_INVALIDDATA;
1904 tile = s->tile + s->curtileno;
1905 tp = tile->tile_part + tile->tp_idx;
1906 if (tp->tp_end < s->g.buffer) {
1907 av_log(s->avctx, AV_LOG_ERROR, "Invalid tpend\n");
1908 return AVERROR_INVALIDDATA;
1910 bytestream2_init(&tp->tpg, s->g.buffer, tp->tp_end - s->g.buffer);
1911 bytestream2_skip(&s->g, tp->tp_end - s->g.buffer);
1915 if (marker == JPEG2000_EOC)
1918 len = bytestream2_get_be16(&s->g);
1919 if (len < 2 || bytestream2_get_bytes_left(&s->g) < len - 2) {
1920 av_log(s->avctx, AV_LOG_ERROR, "Invalid len %d left=%d\n", len, bytestream2_get_bytes_left(&s->g));
1921 return AVERROR_INVALIDDATA;
1926 if (s->ncomponents) {
1927 av_log(s->avctx, AV_LOG_ERROR, "Duplicate SIZ\n");
1928 return AVERROR_INVALIDDATA;
1932 s->numXtiles = s->numYtiles = 0;
1935 ret = get_coc(s, codsty, properties);
1938 ret = get_cod(s, codsty, properties);
1941 ret = get_qcc(s, len, qntsty, properties);
1944 ret = get_qcd(s, len, qntsty, properties);
1947 ret = get_poc(s, len, poc);
1950 if (!(ret = get_sot(s, len))) {
1951 av_assert1(s->curtileno >= 0);
1952 codsty = s->tile[s->curtileno].codsty;
1953 qntsty = s->tile[s->curtileno].qntsty;
1954 poc = &s->tile[s->curtileno].poc;
1955 properties = s->tile[s->curtileno].properties;
1959 // the PLM marker is ignored
1961 // the comment is ignored
1962 bytestream2_skip(&s->g, len - 2);
1965 // Tile-part lengths
1966 ret = get_tlm(s, len);
1969 // Packet length, tile-part header
1970 ret = get_plt(s, len);
1973 av_log(s->avctx, AV_LOG_ERROR,
1974 "unsupported marker 0x%.4"PRIX16" at pos 0x%X\n",
1975 marker, bytestream2_tell(&s->g) - 4);
1976 bytestream2_skip(&s->g, len - 2);
1979 if (bytestream2_tell(&s->g) - oldpos != len || ret) {
1980 av_log(s->avctx, AV_LOG_ERROR,
1981 "error during processing marker segment %.4"PRIx16"\n",
1983 return ret ? ret : -1;
1989 /* Read bit stream packets --> T2 operation. */
1990 static int jpeg2000_read_bitstream_packets(Jpeg2000DecoderContext *s)
1995 for (tileno = 0; tileno < s->numXtiles * s->numYtiles; tileno++) {
1996 Jpeg2000Tile *tile = s->tile + tileno;
1998 if ((ret = init_tile(s, tileno)) < 0)
2001 s->g = tile->tile_part[0].tpg;
2002 if ((ret = jpeg2000_decode_packets(s, tile)) < 0)
2009 static int jp2_find_codestream(Jpeg2000DecoderContext *s)
2011 uint32_t atom_size, atom, atom_end;
2012 int search_range = 10;
2016 bytestream2_get_bytes_left(&s->g) >= 8) {
2017 atom_size = bytestream2_get_be32u(&s->g);
2018 atom = bytestream2_get_be32u(&s->g);
2019 if (atom_size == 1) {
2020 if (bytestream2_get_be32u(&s->g)) {
2021 avpriv_request_sample(s->avctx, "Huge atom");
2024 atom_size = bytestream2_get_be32u(&s->g);
2025 atom_end = bytestream2_tell(&s->g) + atom_size - 16;
2027 atom_end = bytestream2_tell(&s->g) + atom_size - 8;
2030 if (atom == JP2_CODESTREAM)
2033 if (bytestream2_get_bytes_left(&s->g) < atom_size || atom_end < atom_size)
2036 if (atom == JP2_HEADER &&
2038 uint32_t atom2_size, atom2, atom2_end;
2040 atom2_size = bytestream2_get_be32u(&s->g);
2041 atom2 = bytestream2_get_be32u(&s->g);
2042 atom2_end = bytestream2_tell(&s->g) + atom2_size - 8;
2043 if (atom2_size < 8 || atom2_end > atom_end || atom2_end < atom2_size)
2046 if (atom2 == JP2_CODESTREAM) {
2048 } else if (atom2 == MKBETAG('c','o','l','r') && atom2_size >= 7) {
2049 int method = bytestream2_get_byteu(&s->g);
2050 bytestream2_skipu(&s->g, 2);
2052 s->colour_space = bytestream2_get_be32u(&s->g);
2054 } else if (atom2 == MKBETAG('p','c','l','r') && atom2_size >= 6) {
2055 int i, size, colour_count, colour_channels, colour_depth[3];
2057 colour_count = bytestream2_get_be16u(&s->g);
2058 colour_channels = bytestream2_get_byteu(&s->g);
2059 // FIXME: Do not ignore channel_sign
2060 colour_depth[0] = (bytestream2_get_byteu(&s->g) & 0x7f) + 1;
2061 colour_depth[1] = (bytestream2_get_byteu(&s->g) & 0x7f) + 1;
2062 colour_depth[2] = (bytestream2_get_byteu(&s->g) & 0x7f) + 1;
2063 size = (colour_depth[0] + 7 >> 3) * colour_count +
2064 (colour_depth[1] + 7 >> 3) * colour_count +
2065 (colour_depth[2] + 7 >> 3) * colour_count;
2066 if (colour_count > 256 ||
2067 colour_channels != 3 ||
2068 colour_depth[0] > 16 ||
2069 colour_depth[1] > 16 ||
2070 colour_depth[2] > 16 ||
2071 atom2_size < size) {
2072 avpriv_request_sample(s->avctx, "Unknown palette");
2073 bytestream2_seek(&s->g, atom2_end, SEEK_SET);
2077 for (i = 0; i < colour_count; i++) {
2078 if (colour_depth[0] <= 8) {
2079 r = bytestream2_get_byteu(&s->g) << 8 - colour_depth[0];
2080 r |= r >> colour_depth[0];
2082 r = bytestream2_get_be16u(&s->g) >> colour_depth[0] - 8;
2084 if (colour_depth[1] <= 8) {
2085 g = bytestream2_get_byteu(&s->g) << 8 - colour_depth[1];
2086 g |= g >> colour_depth[1];
2088 g = bytestream2_get_be16u(&s->g) >> colour_depth[1] - 8;
2090 if (colour_depth[2] <= 8) {
2091 b = bytestream2_get_byteu(&s->g) << 8 - colour_depth[2];
2092 b |= b >> colour_depth[2];
2094 b = bytestream2_get_be16u(&s->g) >> colour_depth[2] - 8;
2096 s->palette[i] = 0xffu << 24 | r << 16 | g << 8 | b;
2098 } else if (atom2 == MKBETAG('c','d','e','f') && atom2_size >= 2) {
2099 int n = bytestream2_get_be16u(&s->g);
2101 int cn = bytestream2_get_be16(&s->g);
2102 int av_unused typ = bytestream2_get_be16(&s->g);
2103 int asoc = bytestream2_get_be16(&s->g);
2104 if (cn < 4 && asoc < 4)
2107 } else if (atom2 == MKBETAG('r','e','s',' ') && atom2_size >= 18) {
2108 int64_t vnum, vden, hnum, hden, vexp, hexp;
2110 bytestream2_skip(&s->g, 4);
2111 resx = bytestream2_get_be32u(&s->g);
2112 if (resx != MKBETAG('r','e','s','c') && resx != MKBETAG('r','e','s','d')) {
2113 bytestream2_seek(&s->g, atom2_end, SEEK_SET);
2116 vnum = bytestream2_get_be16u(&s->g);
2117 vden = bytestream2_get_be16u(&s->g);
2118 hnum = bytestream2_get_be16u(&s->g);
2119 hden = bytestream2_get_be16u(&s->g);
2120 vexp = bytestream2_get_byteu(&s->g);
2121 hexp = bytestream2_get_byteu(&s->g);
2122 if (!vnum || !vden || !hnum || !hden) {
2123 bytestream2_seek(&s->g, atom2_end, SEEK_SET);
2124 av_log(s->avctx, AV_LOG_WARNING, "RES box invalid\n");
2134 if ( INT64_MAX / (hnum * vden) > pow(10, hexp)
2135 && INT64_MAX / (vnum * hden) > pow(10, vexp))
2136 av_reduce(&s->sar.den, &s->sar.num,
2137 hnum * vden * pow(10, hexp),
2138 vnum * hden * pow(10, vexp),
2141 bytestream2_seek(&s->g, atom2_end, SEEK_SET);
2142 } while (atom_end - atom2_end >= 8);
2146 bytestream2_seek(&s->g, atom_end, SEEK_SET);
2152 static av_cold void jpeg2000_init_static_data(void)
2154 ff_jpeg2000_init_tier1_luts();
2155 ff_mqc_init_context_tables();
2158 static av_cold int jpeg2000_decode_init(AVCodecContext *avctx)
2160 static AVOnce init_static_once = AV_ONCE_INIT;
2161 Jpeg2000DecoderContext *s = avctx->priv_data;
2163 ff_thread_once(&init_static_once, jpeg2000_init_static_data);
2164 ff_jpeg2000dsp_init(&s->dsp);
2169 static int jpeg2000_decode_frame(AVCodecContext *avctx, void *data,
2170 int *got_frame, AVPacket *avpkt)
2172 Jpeg2000DecoderContext *s = avctx->priv_data;
2173 ThreadFrame frame = { .f = data };
2174 AVFrame *picture = data;
2178 bytestream2_init(&s->g, avpkt->data, avpkt->size);
2180 memset(s->cdef, -1, sizeof(s->cdef));
2182 if (bytestream2_get_bytes_left(&s->g) < 2) {
2183 ret = AVERROR_INVALIDDATA;
2187 // check if the image is in jp2 format
2188 if (bytestream2_get_bytes_left(&s->g) >= 12 &&
2189 (bytestream2_get_be32u(&s->g) == 12) &&
2190 (bytestream2_get_be32u(&s->g) == JP2_SIG_TYPE) &&
2191 (bytestream2_get_be32u(&s->g) == JP2_SIG_VALUE)) {
2192 if (!jp2_find_codestream(s)) {
2193 av_log(avctx, AV_LOG_ERROR,
2194 "Could not find Jpeg2000 codestream atom.\n");
2195 ret = AVERROR_INVALIDDATA;
2199 bytestream2_seek(&s->g, 0, SEEK_SET);
2202 while (bytestream2_get_bytes_left(&s->g) >= 3 && bytestream2_peek_be16(&s->g) != JPEG2000_SOC)
2203 bytestream2_skip(&s->g, 1);
2205 if (bytestream2_get_be16u(&s->g) != JPEG2000_SOC) {
2206 av_log(avctx, AV_LOG_ERROR, "SOC marker not present\n");
2207 ret = AVERROR_INVALIDDATA;
2210 if (ret = jpeg2000_read_main_headers(s))
2213 /* get picture buffer */
2214 if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0)
2216 picture->pict_type = AV_PICTURE_TYPE_I;
2217 picture->key_frame = 1;
2219 if (ret = jpeg2000_read_bitstream_packets(s))
2222 avctx->execute2(avctx, jpeg2000_decode_tile, picture, NULL, s->numXtiles * s->numYtiles);
2224 jpeg2000_dec_cleanup(s);
2228 if (s->avctx->pix_fmt == AV_PIX_FMT_PAL8)
2229 memcpy(picture->data[1], s->palette, 256 * sizeof(uint32_t));
2230 if (s->sar.num && s->sar.den)
2231 avctx->sample_aspect_ratio = s->sar;
2232 s->sar.num = s->sar.den = 0;
2234 return bytestream2_tell(&s->g);
2237 jpeg2000_dec_cleanup(s);
2241 #define OFFSET(x) offsetof(Jpeg2000DecoderContext, x)
2242 #define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
2244 static const AVOption options[] = {
2245 { "lowres", "Lower the decoding resolution by a power of two",
2246 OFFSET(reduction_factor), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, JPEG2000_MAX_RESLEVELS - 1, VD },
2250 static const AVClass jpeg2000_class = {
2251 .class_name = "jpeg2000",
2252 .item_name = av_default_item_name,
2254 .version = LIBAVUTIL_VERSION_INT,
2257 AVCodec ff_jpeg2000_decoder = {
2259 .long_name = NULL_IF_CONFIG_SMALL("JPEG 2000"),
2260 .type = AVMEDIA_TYPE_VIDEO,
2261 .id = AV_CODEC_ID_JPEG2000,
2262 .capabilities = AV_CODEC_CAP_SLICE_THREADS | AV_CODEC_CAP_FRAME_THREADS | AV_CODEC_CAP_DR1,
2263 .priv_data_size = sizeof(Jpeg2000DecoderContext),
2264 .init = jpeg2000_decode_init,
2265 .decode = jpeg2000_decode_frame,
2266 .priv_class = &jpeg2000_class,
2268 .profiles = NULL_IF_CONFIG_SMALL(ff_jpeg2000_profiles)