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"
38 #include "bytestream.h"
42 #include "jpeg2000dsp.h"
45 #define JP2_SIG_TYPE 0x6A502020
46 #define JP2_SIG_VALUE 0x0D0A870A
47 #define JP2_CODESTREAM 0x6A703263
48 #define JP2_HEADER 0x6A703268
55 typedef struct Jpeg2000POCEntry {
64 typedef struct Jpeg2000POC {
65 Jpeg2000POCEntry poc[MAX_POCS];
70 typedef struct Jpeg2000TilePart {
71 uint8_t tile_index; // Tile index who refers the tile-part
72 const uint8_t *tp_end;
73 GetByteContext tpg; // bit stream in tile-part
76 /* RMK: For JPEG2000 DCINEMA 3 tile-parts in a tile
77 * one per component, so tile_part elements have a size of 3 */
78 typedef struct Jpeg2000Tile {
79 Jpeg2000Component *comp;
80 uint8_t properties[4];
81 Jpeg2000CodingStyle codsty[4];
82 Jpeg2000QuantStyle qntsty[4];
84 Jpeg2000TilePart tile_part[256];
85 uint16_t tp_idx; // Tile-part index
86 int coord[2][2]; // border coordinates {{x0, x1}, {y0, y1}}
89 typedef struct Jpeg2000DecoderContext {
91 AVCodecContext *avctx;
95 int image_offset_x, image_offset_y;
96 int tile_offset_x, tile_offset_y;
97 uint8_t cbps[4]; // bits per sample in particular components
98 uint8_t sgnd[4]; // if a component is signed
99 uint8_t properties[4];
104 uint32_t palette[256];
107 int tile_width, tile_height;
108 unsigned numXtiles, numYtiles;
112 Jpeg2000CodingStyle codsty[4];
113 Jpeg2000QuantStyle qntsty[4];
121 Jpeg2000DSPContext dsp;
123 /*options parameters*/
124 int reduction_factor;
125 } Jpeg2000DecoderContext;
127 /* get_bits functions for JPEG2000 packet bitstream
128 * It is a get_bit function with a bit-stuffing routine. If the value of the
129 * byte is 0xFF, the next byte includes an extra zero bit stuffed into the MSB.
130 * cf. ISO-15444-1:2002 / B.10.1 Bit-stuffing routine */
131 static int get_bits(Jpeg2000DecoderContext *s, int n)
137 if (s->bit_index == 0) {
138 s->bit_index = 7 + (bytestream2_get_byte(&s->g) != 0xFFu);
141 res |= (bytestream2_peek_byte(&s->g) >> s->bit_index) & 1;
146 static void jpeg2000_flush(Jpeg2000DecoderContext *s)
148 if (bytestream2_get_byte(&s->g) == 0xff)
149 bytestream2_skip(&s->g, 1);
153 /* decode the value stored in node */
154 static int tag_tree_decode(Jpeg2000DecoderContext *s, Jpeg2000TgtNode *node,
157 Jpeg2000TgtNode *stack[30];
158 int sp = -1, curval = 0;
161 av_log(s->avctx, AV_LOG_ERROR, "missing node\n");
162 return AVERROR_INVALIDDATA;
165 while (node && !node->vis) {
173 curval = stack[sp]->val;
175 while (curval < threshold && sp >= 0) {
176 if (curval < stack[sp]->val)
177 curval = stack[sp]->val;
178 while (curval < threshold) {
180 if ((ret = get_bits(s, 1)) > 0) {
188 stack[sp]->val = curval;
194 static int pix_fmt_match(enum AVPixelFormat pix_fmt, int components,
195 int bpc, uint32_t log2_chroma_wh, int pal8)
198 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
202 if (desc->nb_components != components) {
206 switch (components) {
208 match = match && desc->comp[3].depth >= bpc &&
209 (log2_chroma_wh >> 14 & 3) == 0 &&
210 (log2_chroma_wh >> 12 & 3) == 0;
212 match = match && desc->comp[2].depth >= bpc &&
213 (log2_chroma_wh >> 10 & 3) == desc->log2_chroma_w &&
214 (log2_chroma_wh >> 8 & 3) == desc->log2_chroma_h;
216 match = match && desc->comp[1].depth >= bpc &&
217 (log2_chroma_wh >> 6 & 3) == desc->log2_chroma_w &&
218 (log2_chroma_wh >> 4 & 3) == desc->log2_chroma_h;
221 match = match && desc->comp[0].depth >= bpc &&
222 (log2_chroma_wh >> 2 & 3) == 0 &&
223 (log2_chroma_wh & 3) == 0 &&
224 (desc->flags & AV_PIX_FMT_FLAG_PAL) == pal8 * AV_PIX_FMT_FLAG_PAL;
229 // pix_fmts with lower bpp have to be listed before
230 // similar pix_fmts with higher bpp.
231 #define RGB_PIXEL_FORMATS AV_PIX_FMT_PAL8,AV_PIX_FMT_RGB24,AV_PIX_FMT_RGBA,AV_PIX_FMT_RGB48,AV_PIX_FMT_RGBA64
232 #define GRAY_PIXEL_FORMATS AV_PIX_FMT_GRAY8,AV_PIX_FMT_GRAY8A,AV_PIX_FMT_GRAY16,AV_PIX_FMT_YA16
233 #define YUV_PIXEL_FORMATS AV_PIX_FMT_YUV410P,AV_PIX_FMT_YUV411P,AV_PIX_FMT_YUVA420P, \
234 AV_PIX_FMT_YUV420P,AV_PIX_FMT_YUV422P,AV_PIX_FMT_YUVA422P, \
235 AV_PIX_FMT_YUV440P,AV_PIX_FMT_YUV444P,AV_PIX_FMT_YUVA444P, \
236 AV_PIX_FMT_YUV420P9,AV_PIX_FMT_YUV422P9,AV_PIX_FMT_YUV444P9, \
237 AV_PIX_FMT_YUVA420P9,AV_PIX_FMT_YUVA422P9,AV_PIX_FMT_YUVA444P9, \
238 AV_PIX_FMT_YUV420P10,AV_PIX_FMT_YUV422P10,AV_PIX_FMT_YUV444P10, \
239 AV_PIX_FMT_YUVA420P10,AV_PIX_FMT_YUVA422P10,AV_PIX_FMT_YUVA444P10, \
240 AV_PIX_FMT_YUV420P12,AV_PIX_FMT_YUV422P12,AV_PIX_FMT_YUV444P12, \
241 AV_PIX_FMT_YUV420P14,AV_PIX_FMT_YUV422P14,AV_PIX_FMT_YUV444P14, \
242 AV_PIX_FMT_YUV420P16,AV_PIX_FMT_YUV422P16,AV_PIX_FMT_YUV444P16, \
243 AV_PIX_FMT_YUVA420P16,AV_PIX_FMT_YUVA422P16,AV_PIX_FMT_YUVA444P16
244 #define XYZ_PIXEL_FORMATS AV_PIX_FMT_XYZ12
246 static const enum AVPixelFormat rgb_pix_fmts[] = {RGB_PIXEL_FORMATS};
247 static const enum AVPixelFormat gray_pix_fmts[] = {GRAY_PIXEL_FORMATS};
248 static const enum AVPixelFormat yuv_pix_fmts[] = {YUV_PIXEL_FORMATS};
249 static const enum AVPixelFormat xyz_pix_fmts[] = {XYZ_PIXEL_FORMATS,
251 static const enum AVPixelFormat all_pix_fmts[] = {RGB_PIXEL_FORMATS,
256 /* marker segments */
257 /* get sizes and offsets of image, tiles; number of components */
258 static int get_siz(Jpeg2000DecoderContext *s)
262 uint32_t log2_chroma_wh = 0;
263 const enum AVPixelFormat *possible_fmts = NULL;
264 int possible_fmts_nb = 0;
267 if (bytestream2_get_bytes_left(&s->g) < 36) {
268 av_log(s->avctx, AV_LOG_ERROR, "Insufficient space for SIZ\n");
269 return AVERROR_INVALIDDATA;
272 s->avctx->profile = bytestream2_get_be16u(&s->g); // Rsiz
273 s->width = bytestream2_get_be32u(&s->g); // Width
274 s->height = bytestream2_get_be32u(&s->g); // Height
275 s->image_offset_x = bytestream2_get_be32u(&s->g); // X0Siz
276 s->image_offset_y = bytestream2_get_be32u(&s->g); // Y0Siz
277 s->tile_width = bytestream2_get_be32u(&s->g); // XTSiz
278 s->tile_height = bytestream2_get_be32u(&s->g); // YTSiz
279 s->tile_offset_x = bytestream2_get_be32u(&s->g); // XT0Siz
280 s->tile_offset_y = bytestream2_get_be32u(&s->g); // YT0Siz
281 ncomponents = bytestream2_get_be16u(&s->g); // CSiz
283 if (s->image_offset_x || s->image_offset_y) {
284 avpriv_request_sample(s->avctx, "Support for image offsets");
285 return AVERROR_PATCHWELCOME;
287 if (av_image_check_size(s->width, s->height, 0, s->avctx)) {
288 avpriv_request_sample(s->avctx, "Large Dimensions");
289 return AVERROR_PATCHWELCOME;
292 if (ncomponents <= 0) {
293 av_log(s->avctx, AV_LOG_ERROR, "Invalid number of components: %d\n",
295 return AVERROR_INVALIDDATA;
298 if (ncomponents > 4) {
299 avpriv_request_sample(s->avctx, "Support for %d components",
301 return AVERROR_PATCHWELCOME;
304 if (s->tile_offset_x < 0 || s->tile_offset_y < 0 ||
305 s->image_offset_x < s->tile_offset_x ||
306 s->image_offset_y < s->tile_offset_y ||
307 s->tile_width + (int64_t)s->tile_offset_x <= s->image_offset_x ||
308 s->tile_height + (int64_t)s->tile_offset_y <= s->image_offset_y
310 av_log(s->avctx, AV_LOG_ERROR, "Tile offsets are invalid\n");
311 return AVERROR_INVALIDDATA;
314 s->ncomponents = ncomponents;
316 if (s->tile_width <= 0 || s->tile_height <= 0) {
317 av_log(s->avctx, AV_LOG_ERROR, "Invalid tile dimension %dx%d.\n",
318 s->tile_width, s->tile_height);
319 return AVERROR_INVALIDDATA;
322 if (bytestream2_get_bytes_left(&s->g) < 3 * s->ncomponents) {
323 av_log(s->avctx, AV_LOG_ERROR, "Insufficient space for %d components in SIZ\n", s->ncomponents);
324 return AVERROR_INVALIDDATA;
327 for (i = 0; i < s->ncomponents; i++) { // Ssiz_i XRsiz_i, YRsiz_i
328 uint8_t x = bytestream2_get_byteu(&s->g);
329 s->cbps[i] = (x & 0x7f) + 1;
330 s->precision = FFMAX(s->cbps[i], s->precision);
331 s->sgnd[i] = !!(x & 0x80);
332 s->cdx[i] = bytestream2_get_byteu(&s->g);
333 s->cdy[i] = bytestream2_get_byteu(&s->g);
334 if ( !s->cdx[i] || s->cdx[i] == 3 || s->cdx[i] > 4
335 || !s->cdy[i] || s->cdy[i] == 3 || s->cdy[i] > 4) {
336 av_log(s->avctx, AV_LOG_ERROR, "Invalid sample separation %d/%d\n", s->cdx[i], s->cdy[i]);
337 return AVERROR_INVALIDDATA;
339 log2_chroma_wh |= s->cdy[i] >> 1 << i * 4 | s->cdx[i] >> 1 << i * 4 + 2;
342 s->numXtiles = ff_jpeg2000_ceildiv(s->width - s->tile_offset_x, s->tile_width);
343 s->numYtiles = ff_jpeg2000_ceildiv(s->height - s->tile_offset_y, s->tile_height);
345 if (s->numXtiles * (uint64_t)s->numYtiles > INT_MAX/sizeof(*s->tile)) {
346 s->numXtiles = s->numYtiles = 0;
347 return AVERROR(EINVAL);
350 s->tile = av_mallocz_array(s->numXtiles * s->numYtiles, sizeof(*s->tile));
352 s->numXtiles = s->numYtiles = 0;
353 return AVERROR(ENOMEM);
356 for (i = 0; i < s->numXtiles * s->numYtiles; i++) {
357 Jpeg2000Tile *tile = s->tile + i;
359 tile->comp = av_mallocz(s->ncomponents * sizeof(*tile->comp));
361 return AVERROR(ENOMEM);
364 /* compute image size with reduction factor */
365 ret = ff_set_dimensions(s->avctx,
366 ff_jpeg2000_ceildivpow2(s->width - s->image_offset_x,
367 s->reduction_factor),
368 ff_jpeg2000_ceildivpow2(s->height - s->image_offset_y,
369 s->reduction_factor));
373 if (s->avctx->profile == FF_PROFILE_JPEG2000_DCINEMA_2K ||
374 s->avctx->profile == FF_PROFILE_JPEG2000_DCINEMA_4K) {
375 possible_fmts = xyz_pix_fmts;
376 possible_fmts_nb = FF_ARRAY_ELEMS(xyz_pix_fmts);
378 switch (s->colour_space) {
380 possible_fmts = rgb_pix_fmts;
381 possible_fmts_nb = FF_ARRAY_ELEMS(rgb_pix_fmts);
384 possible_fmts = gray_pix_fmts;
385 possible_fmts_nb = FF_ARRAY_ELEMS(gray_pix_fmts);
388 possible_fmts = yuv_pix_fmts;
389 possible_fmts_nb = FF_ARRAY_ELEMS(yuv_pix_fmts);
392 possible_fmts = all_pix_fmts;
393 possible_fmts_nb = FF_ARRAY_ELEMS(all_pix_fmts);
397 for (i = 0; i < possible_fmts_nb; ++i) {
398 if (pix_fmt_match(possible_fmts[i], ncomponents, s->precision, log2_chroma_wh, s->pal8)) {
399 s->avctx->pix_fmt = possible_fmts[i];
404 if (i == possible_fmts_nb) {
405 if (ncomponents == 4 &&
406 s->cdy[0] == 1 && s->cdx[0] == 1 &&
407 s->cdy[1] == 1 && s->cdx[1] == 1 &&
408 s->cdy[2] == s->cdy[3] && s->cdx[2] == s->cdx[3]) {
409 if (s->precision == 8 && s->cdy[2] == 2 && s->cdx[2] == 2 && !s->pal8) {
410 s->avctx->pix_fmt = AV_PIX_FMT_YUVA420P;
421 if (i == possible_fmts_nb) {
422 av_log(s->avctx, AV_LOG_ERROR,
423 "Unknown pix_fmt, profile: %d, colour_space: %d, "
424 "components: %d, precision: %d\n"
425 "cdx[0]: %d, cdy[0]: %d\n"
426 "cdx[1]: %d, cdy[1]: %d\n"
427 "cdx[2]: %d, cdy[2]: %d\n"
428 "cdx[3]: %d, cdy[3]: %d\n",
429 s->avctx->profile, s->colour_space, ncomponents, s->precision,
432 ncomponents > 1 ? s->cdx[1] : 0,
433 ncomponents > 1 ? s->cdy[1] : 0,
434 ncomponents > 2 ? s->cdx[2] : 0,
435 ncomponents > 2 ? s->cdy[2] : 0,
436 ncomponents > 3 ? s->cdx[3] : 0,
437 ncomponents > 3 ? s->cdy[3] : 0);
438 return AVERROR_PATCHWELCOME;
440 s->avctx->bits_per_raw_sample = s->precision;
444 /* get common part for COD and COC segments */
445 static int get_cox(Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *c)
449 if (bytestream2_get_bytes_left(&s->g) < 5) {
450 av_log(s->avctx, AV_LOG_ERROR, "Insufficient space for COX\n");
451 return AVERROR_INVALIDDATA;
454 /* nreslevels = number of resolution levels
455 = number of decomposition level +1 */
456 c->nreslevels = bytestream2_get_byteu(&s->g) + 1;
457 if (c->nreslevels >= JPEG2000_MAX_RESLEVELS) {
458 av_log(s->avctx, AV_LOG_ERROR, "nreslevels %d is invalid\n", c->nreslevels);
459 return AVERROR_INVALIDDATA;
462 if (c->nreslevels <= s->reduction_factor) {
463 /* we are forced to update reduction_factor as its requested value is
464 not compatible with this bitstream, and as we might have used it
465 already in setup earlier we have to fail this frame until
466 reinitialization is implemented */
467 av_log(s->avctx, AV_LOG_ERROR, "reduction_factor too large for this bitstream, max is %d\n", c->nreslevels - 1);
468 s->reduction_factor = c->nreslevels - 1;
469 return AVERROR(EINVAL);
472 /* compute number of resolution levels to decode */
473 c->nreslevels2decode = c->nreslevels - s->reduction_factor;
475 c->log2_cblk_width = (bytestream2_get_byteu(&s->g) & 15) + 2; // cblk width
476 c->log2_cblk_height = (bytestream2_get_byteu(&s->g) & 15) + 2; // cblk height
478 if (c->log2_cblk_width > 10 || c->log2_cblk_height > 10 ||
479 c->log2_cblk_width + c->log2_cblk_height > 12) {
480 av_log(s->avctx, AV_LOG_ERROR, "cblk size invalid\n");
481 return AVERROR_INVALIDDATA;
484 c->cblk_style = bytestream2_get_byteu(&s->g);
485 if (c->cblk_style != 0) { // cblk style
486 av_log(s->avctx, AV_LOG_WARNING, "extra cblk styles %X\n", c->cblk_style);
487 if (c->cblk_style & JPEG2000_CBLK_BYPASS)
488 av_log(s->avctx, AV_LOG_WARNING, "Selective arithmetic coding bypass\n");
490 c->transform = bytestream2_get_byteu(&s->g); // DWT transformation type
491 /* set integer 9/7 DWT in case of BITEXACT flag */
492 if ((s->avctx->flags & AV_CODEC_FLAG_BITEXACT) && (c->transform == FF_DWT97))
493 c->transform = FF_DWT97_INT;
494 else if (c->transform == FF_DWT53) {
495 s->avctx->properties |= FF_CODEC_PROPERTY_LOSSLESS;
498 if (c->csty & JPEG2000_CSTY_PREC) {
500 for (i = 0; i < c->nreslevels; i++) {
501 byte = bytestream2_get_byte(&s->g);
502 c->log2_prec_widths[i] = byte & 0x0F; // precinct PPx
503 c->log2_prec_heights[i] = (byte >> 4) & 0x0F; // precinct PPy
505 if (c->log2_prec_widths[i] == 0 || c->log2_prec_heights[i] == 0) {
506 av_log(s->avctx, AV_LOG_ERROR, "PPx %d PPy %d invalid\n",
507 c->log2_prec_widths[i], c->log2_prec_heights[i]);
508 c->log2_prec_widths[i] = c->log2_prec_heights[i] = 1;
509 return AVERROR_INVALIDDATA;
513 memset(c->log2_prec_widths , 15, sizeof(c->log2_prec_widths ));
514 memset(c->log2_prec_heights, 15, sizeof(c->log2_prec_heights));
519 /* get coding parameters for a particular tile or whole image*/
520 static int get_cod(Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *c,
523 Jpeg2000CodingStyle tmp;
526 if (bytestream2_get_bytes_left(&s->g) < 5) {
527 av_log(s->avctx, AV_LOG_ERROR, "Insufficient space for COD\n");
528 return AVERROR_INVALIDDATA;
531 tmp.csty = bytestream2_get_byteu(&s->g);
533 // get progression order
534 tmp.prog_order = bytestream2_get_byteu(&s->g);
536 tmp.nlayers = bytestream2_get_be16u(&s->g);
537 tmp.mct = bytestream2_get_byteu(&s->g); // multiple component transformation
539 if (tmp.mct && s->ncomponents < 3) {
540 av_log(s->avctx, AV_LOG_ERROR,
541 "MCT %"PRIu8" with too few components (%d)\n",
542 tmp.mct, s->ncomponents);
543 return AVERROR_INVALIDDATA;
546 if ((ret = get_cox(s, &tmp)) < 0)
549 for (compno = 0; compno < s->ncomponents; compno++)
550 if (!(properties[compno] & HAD_COC))
551 memcpy(c + compno, &tmp, sizeof(tmp));
555 /* Get coding parameters for a component in the whole image or a
556 * particular tile. */
557 static int get_coc(Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *c,
562 if (bytestream2_get_bytes_left(&s->g) < 2) {
563 av_log(s->avctx, AV_LOG_ERROR, "Insufficient space for COC\n");
564 return AVERROR_INVALIDDATA;
567 compno = bytestream2_get_byteu(&s->g);
569 if (compno >= s->ncomponents) {
570 av_log(s->avctx, AV_LOG_ERROR,
571 "Invalid compno %d. There are %d components in the image.\n",
572 compno, s->ncomponents);
573 return AVERROR_INVALIDDATA;
577 c->csty = bytestream2_get_byteu(&s->g);
579 if ((ret = get_cox(s, c)) < 0)
582 properties[compno] |= HAD_COC;
586 /* Get common part for QCD and QCC segments. */
587 static int get_qcx(Jpeg2000DecoderContext *s, int n, Jpeg2000QuantStyle *q)
591 if (bytestream2_get_bytes_left(&s->g) < 1)
592 return AVERROR_INVALIDDATA;
594 x = bytestream2_get_byteu(&s->g); // Sqcd
596 q->nguardbits = x >> 5;
597 q->quantsty = x & 0x1f;
599 if (q->quantsty == JPEG2000_QSTY_NONE) {
601 if (bytestream2_get_bytes_left(&s->g) < n ||
602 n > JPEG2000_MAX_DECLEVELS*3)
603 return AVERROR_INVALIDDATA;
604 for (i = 0; i < n; i++)
605 q->expn[i] = bytestream2_get_byteu(&s->g) >> 3;
606 } else if (q->quantsty == JPEG2000_QSTY_SI) {
607 if (bytestream2_get_bytes_left(&s->g) < 2)
608 return AVERROR_INVALIDDATA;
609 x = bytestream2_get_be16u(&s->g);
610 q->expn[0] = x >> 11;
611 q->mant[0] = x & 0x7ff;
612 for (i = 1; i < JPEG2000_MAX_DECLEVELS * 3; i++) {
613 int curexpn = FFMAX(0, q->expn[0] - (i - 1) / 3);
614 q->expn[i] = curexpn;
615 q->mant[i] = q->mant[0];
619 if (bytestream2_get_bytes_left(&s->g) < 2 * n ||
620 n > JPEG2000_MAX_DECLEVELS*3)
621 return AVERROR_INVALIDDATA;
622 for (i = 0; i < n; i++) {
623 x = bytestream2_get_be16u(&s->g);
624 q->expn[i] = x >> 11;
625 q->mant[i] = x & 0x7ff;
631 /* Get quantization parameters for a particular tile or a whole image. */
632 static int get_qcd(Jpeg2000DecoderContext *s, int n, Jpeg2000QuantStyle *q,
635 Jpeg2000QuantStyle tmp;
638 memset(&tmp, 0, sizeof(tmp));
640 if ((ret = get_qcx(s, n, &tmp)) < 0)
642 for (compno = 0; compno < s->ncomponents; compno++)
643 if (!(properties[compno] & HAD_QCC))
644 memcpy(q + compno, &tmp, sizeof(tmp));
648 /* Get quantization parameters for a component in the whole image
649 * on in a particular tile. */
650 static int get_qcc(Jpeg2000DecoderContext *s, int n, Jpeg2000QuantStyle *q,
655 if (bytestream2_get_bytes_left(&s->g) < 1)
656 return AVERROR_INVALIDDATA;
658 compno = bytestream2_get_byteu(&s->g);
660 if (compno >= s->ncomponents) {
661 av_log(s->avctx, AV_LOG_ERROR,
662 "Invalid compno %d. There are %d components in the image.\n",
663 compno, s->ncomponents);
664 return AVERROR_INVALIDDATA;
667 properties[compno] |= HAD_QCC;
668 return get_qcx(s, n - 1, q + compno);
671 static int get_poc(Jpeg2000DecoderContext *s, int size, Jpeg2000POC *p)
674 int elem_size = s->ncomponents <= 257 ? 7 : 9;
675 Jpeg2000POC tmp = {{{0}}};
677 if (bytestream2_get_bytes_left(&s->g) < 5 || size < 2 + elem_size) {
678 av_log(s->avctx, AV_LOG_ERROR, "Insufficient space for POC\n");
679 return AVERROR_INVALIDDATA;
683 avpriv_request_sample(s->avctx, "Fat POC not supported");
684 return AVERROR_PATCHWELCOME;
687 tmp.nb_poc = (size - 2) / elem_size;
688 if (tmp.nb_poc > MAX_POCS) {
689 avpriv_request_sample(s->avctx, "Too many POCs (%d)", tmp.nb_poc);
690 return AVERROR_PATCHWELCOME;
693 for (i = 0; i<tmp.nb_poc; i++) {
694 Jpeg2000POCEntry *e = &tmp.poc[i];
695 e->RSpoc = bytestream2_get_byteu(&s->g);
696 e->CSpoc = bytestream2_get_byteu(&s->g);
697 e->LYEpoc = bytestream2_get_be16u(&s->g);
698 e->REpoc = bytestream2_get_byteu(&s->g);
699 e->CEpoc = bytestream2_get_byteu(&s->g);
700 e->Ppoc = bytestream2_get_byteu(&s->g);
703 if (e->CEpoc > s->ncomponents)
704 e->CEpoc = s->ncomponents;
705 if ( e->RSpoc >= e->REpoc || e->REpoc > 33
706 || e->CSpoc >= e->CEpoc || e->CEpoc > s->ncomponents
708 av_log(s->avctx, AV_LOG_ERROR, "POC Entry %d is invalid (%d, %d, %d, %d, %d, %d)\n", i,
709 e->RSpoc, e->CSpoc, e->LYEpoc, e->REpoc, e->CEpoc, e->Ppoc
711 return AVERROR_INVALIDDATA;
715 if (!p->nb_poc || p->is_default) {
718 if (p->nb_poc + tmp.nb_poc > MAX_POCS) {
719 av_log(s->avctx, AV_LOG_ERROR, "Insufficient space for POC\n");
720 return AVERROR_INVALIDDATA;
722 memcpy(p->poc + p->nb_poc, tmp.poc, tmp.nb_poc * sizeof(tmp.poc[0]));
723 p->nb_poc += tmp.nb_poc;
732 /* Get start of tile segment. */
733 static int get_sot(Jpeg2000DecoderContext *s, int n)
735 Jpeg2000TilePart *tp;
740 if (bytestream2_get_bytes_left(&s->g) < 8)
741 return AVERROR_INVALIDDATA;
744 Isot = bytestream2_get_be16u(&s->g); // Isot
745 if (Isot >= s->numXtiles * s->numYtiles)
746 return AVERROR_INVALIDDATA;
749 Psot = bytestream2_get_be32u(&s->g); // Psot
750 TPsot = bytestream2_get_byteu(&s->g); // TPsot
752 /* Read TNSot but not used */
753 bytestream2_get_byteu(&s->g); // TNsot
756 Psot = bytestream2_get_bytes_left(&s->g) - 2 + n + 2;
758 if (Psot > bytestream2_get_bytes_left(&s->g) - 2 + n + 2) {
759 av_log(s->avctx, AV_LOG_ERROR, "Psot %"PRIu32" too big\n", Psot);
760 return AVERROR_INVALIDDATA;
763 av_assert0(TPsot < FF_ARRAY_ELEMS(s->tile[Isot].tile_part));
765 s->tile[Isot].tp_idx = TPsot;
766 tp = s->tile[Isot].tile_part + TPsot;
767 tp->tile_index = Isot;
768 tp->tp_end = s->g.buffer + Psot - n - 2;
771 Jpeg2000Tile *tile = s->tile + s->curtileno;
774 memcpy(tile->codsty, s->codsty, s->ncomponents * sizeof(Jpeg2000CodingStyle));
775 memcpy(tile->qntsty, s->qntsty, s->ncomponents * sizeof(Jpeg2000QuantStyle));
776 memcpy(&tile->poc , &s->poc , sizeof(tile->poc));
777 tile->poc.is_default = 1;
783 /* Tile-part lengths: see ISO 15444-1:2002, section A.7.1
784 * Used to know the number of tile parts and lengths.
785 * There may be multiple TLMs in the header.
786 * TODO: The function is not used for tile-parts management, nor anywhere else.
787 * It can be useful to allocate memory for tile parts, before managing the SOT
788 * markers. Parsing the TLM header is needed to increment the input header
790 * This marker is mandatory for DCI. */
791 static uint8_t get_tlm(Jpeg2000DecoderContext *s, int n)
793 uint8_t Stlm, ST, SP, tile_tlm, i;
794 bytestream2_get_byte(&s->g); /* Ztlm: skipped */
795 Stlm = bytestream2_get_byte(&s->g);
797 // too complex ? ST = ((Stlm >> 4) & 0x01) + ((Stlm >> 4) & 0x02);
798 ST = (Stlm >> 4) & 0x03;
799 // TODO: Manage case of ST = 0b11 --> raise error
800 SP = (Stlm >> 6) & 0x01;
801 tile_tlm = (n - 4) / ((SP + 1) * 2 + ST);
802 for (i = 0; i < tile_tlm; i++) {
807 bytestream2_get_byte(&s->g);
810 bytestream2_get_be16(&s->g);
813 bytestream2_get_be32(&s->g);
817 bytestream2_get_be16(&s->g);
819 bytestream2_get_be32(&s->g);
825 static uint8_t get_plt(Jpeg2000DecoderContext *s, int n)
829 av_log(s->avctx, AV_LOG_DEBUG,
830 "PLT marker at pos 0x%X\n", bytestream2_tell(&s->g) - 4);
832 /*Zplt =*/ bytestream2_get_byte(&s->g);
834 for (i = 0; i < n - 3; i++) {
835 bytestream2_get_byte(&s->g);
841 static int init_tile(Jpeg2000DecoderContext *s, int tileno)
844 int tilex = tileno % s->numXtiles;
845 int tiley = tileno / s->numXtiles;
846 Jpeg2000Tile *tile = s->tile + tileno;
849 return AVERROR(ENOMEM);
851 tile->coord[0][0] = av_clip(tilex * (int64_t)s->tile_width + s->tile_offset_x, s->image_offset_x, s->width);
852 tile->coord[0][1] = av_clip((tilex + 1) * (int64_t)s->tile_width + s->tile_offset_x, s->image_offset_x, s->width);
853 tile->coord[1][0] = av_clip(tiley * (int64_t)s->tile_height + s->tile_offset_y, s->image_offset_y, s->height);
854 tile->coord[1][1] = av_clip((tiley + 1) * (int64_t)s->tile_height + s->tile_offset_y, s->image_offset_y, s->height);
856 for (compno = 0; compno < s->ncomponents; compno++) {
857 Jpeg2000Component *comp = tile->comp + compno;
858 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
859 Jpeg2000QuantStyle *qntsty = tile->qntsty + compno;
860 int ret; // global bandno
862 comp->coord_o[0][0] = tile->coord[0][0];
863 comp->coord_o[0][1] = tile->coord[0][1];
864 comp->coord_o[1][0] = tile->coord[1][0];
865 comp->coord_o[1][1] = tile->coord[1][1];
867 comp->coord_o[0][0] /= s->cdx[compno];
868 comp->coord_o[0][1] /= s->cdx[compno];
869 comp->coord_o[1][0] /= s->cdy[compno];
870 comp->coord_o[1][1] /= s->cdy[compno];
873 comp->coord[0][0] = ff_jpeg2000_ceildivpow2(comp->coord_o[0][0], s->reduction_factor);
874 comp->coord[0][1] = ff_jpeg2000_ceildivpow2(comp->coord_o[0][1], s->reduction_factor);
875 comp->coord[1][0] = ff_jpeg2000_ceildivpow2(comp->coord_o[1][0], s->reduction_factor);
876 comp->coord[1][1] = ff_jpeg2000_ceildivpow2(comp->coord_o[1][1], s->reduction_factor);
878 if (ret = ff_jpeg2000_init_component(comp, codsty, qntsty,
879 s->cbps[compno], s->cdx[compno],
880 s->cdy[compno], s->avctx))
886 /* Read the number of coding passes. */
887 static int getnpasses(Jpeg2000DecoderContext *s)
894 if ((num = get_bits(s, 2)) != 3)
895 return num < 0 ? num : 3 + num;
896 if ((num = get_bits(s, 5)) != 31)
897 return num < 0 ? num : 6 + num;
898 num = get_bits(s, 7);
899 return num < 0 ? num : 37 + num;
902 static int getlblockinc(Jpeg2000DecoderContext *s)
905 while (ret = get_bits(s, 1)) {
913 static int jpeg2000_decode_packet(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile, int *tp_index,
914 Jpeg2000CodingStyle *codsty,
915 Jpeg2000ResLevel *rlevel, int precno,
916 int layno, uint8_t *expn, int numgbits)
918 int bandno, cblkno, ret, nb_code_blocks;
921 if (layno < rlevel->band[0].prec[precno].decoded_layers)
923 rlevel->band[0].prec[precno].decoded_layers = layno + 1;
925 if (bytestream2_get_bytes_left(&s->g) == 0 && s->bit_index == 8) {
926 if (*tp_index < FF_ARRAY_ELEMS(tile->tile_part) - 1) {
927 s->g = tile->tile_part[++(*tp_index)].tpg;
931 if (bytestream2_peek_be32(&s->g) == JPEG2000_SOP_FIXED_BYTES)
932 bytestream2_skip(&s->g, JPEG2000_SOP_BYTE_LENGTH);
934 if (!(ret = get_bits(s, 1))) {
940 for (bandno = 0; bandno < rlevel->nbands; bandno++) {
941 Jpeg2000Band *band = rlevel->band + bandno;
942 Jpeg2000Prec *prec = band->prec + precno;
944 if (band->coord[0][0] == band->coord[0][1] ||
945 band->coord[1][0] == band->coord[1][1])
947 nb_code_blocks = prec->nb_codeblocks_height *
948 prec->nb_codeblocks_width;
949 for (cblkno = 0; cblkno < nb_code_blocks; cblkno++) {
950 Jpeg2000Cblk *cblk = prec->cblk + cblkno;
951 int incl, newpasses, llen;
954 incl = get_bits(s, 1);
956 incl = tag_tree_decode(s, prec->cblkincl + cblkno, layno + 1) == layno;
962 if (!cblk->npasses) {
963 int v = expn[bandno] + numgbits - 1 -
964 tag_tree_decode(s, prec->zerobits + cblkno, 100);
965 if (v < 0 || v > 30) {
966 av_log(s->avctx, AV_LOG_ERROR,
967 "nonzerobits %d invalid or unsupported\n", v);
968 return AVERROR_INVALIDDATA;
970 cblk->nonzerobits = v;
972 if ((newpasses = getnpasses(s)) < 0)
974 av_assert2(newpasses > 0);
975 if (cblk->npasses + newpasses >= JPEG2000_MAX_PASSES) {
976 avpriv_request_sample(s->avctx, "Too many passes");
977 return AVERROR_PATCHWELCOME;
979 if ((llen = getlblockinc(s)) < 0)
981 if (cblk->lblock + llen + av_log2(newpasses) > 16) {
982 avpriv_request_sample(s->avctx,
983 "Block with length beyond 16 bits");
984 return AVERROR_PATCHWELCOME;
987 cblk->lblock += llen;
989 cblk->nb_lengthinc = 0;
990 cblk->nb_terminationsinc = 0;
994 while (newpasses1 < newpasses) {
996 if (needs_termination(codsty->cblk_style, cblk->npasses + newpasses1 - 1)) {
997 cblk->nb_terminationsinc ++;
1002 if ((ret = get_bits(s, av_log2(newpasses1) + cblk->lblock)) < 0)
1004 if (ret > sizeof(cblk->data)) {
1005 avpriv_request_sample(s->avctx,
1006 "Block with lengthinc greater than %"SIZE_SPECIFIER"",
1007 sizeof(cblk->data));
1008 return AVERROR_PATCHWELCOME;
1010 cblk->lengthinc[cblk->nb_lengthinc++] = ret;
1011 cblk->npasses += newpasses1;
1012 newpasses -= newpasses1;
1018 if (codsty->csty & JPEG2000_CSTY_EPH) {
1019 if (bytestream2_peek_be16(&s->g) == JPEG2000_EPH)
1020 bytestream2_skip(&s->g, 2);
1022 av_log(s->avctx, AV_LOG_ERROR, "EPH marker not found. instead %X\n", bytestream2_peek_be32(&s->g));
1025 for (bandno = 0; bandno < rlevel->nbands; bandno++) {
1026 Jpeg2000Band *band = rlevel->band + bandno;
1027 Jpeg2000Prec *prec = band->prec + precno;
1029 nb_code_blocks = prec->nb_codeblocks_height * prec->nb_codeblocks_width;
1030 for (cblkno = 0; cblkno < nb_code_blocks; cblkno++) {
1031 Jpeg2000Cblk *cblk = prec->cblk + cblkno;
1032 for (cwsno = 0; cwsno < cblk->nb_lengthinc; cwsno ++) {
1033 if ( bytestream2_get_bytes_left(&s->g) < cblk->lengthinc[cwsno]
1034 || sizeof(cblk->data) < cblk->length + cblk->lengthinc[cwsno] + 4
1036 av_log(s->avctx, AV_LOG_ERROR,
1037 "Block length %"PRIu16" or lengthinc %d is too large, left %d\n",
1038 cblk->length, cblk->lengthinc[cwsno], bytestream2_get_bytes_left(&s->g));
1039 return AVERROR_INVALIDDATA;
1042 bytestream2_get_bufferu(&s->g, cblk->data + cblk->length, cblk->lengthinc[cwsno]);
1043 cblk->length += cblk->lengthinc[cwsno];
1044 cblk->lengthinc[cwsno] = 0;
1045 if (cblk->nb_terminationsinc) {
1046 cblk->nb_terminationsinc--;
1047 cblk->nb_terminations++;
1048 cblk->data[cblk->length++] = 0xFF;
1049 cblk->data[cblk->length++] = 0xFF;
1050 cblk->data_start[cblk->nb_terminations] = cblk->length;
1058 static int jpeg2000_decode_packets_po_iteration(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile,
1059 int RSpoc, int CSpoc,
1060 int LYEpoc, int REpoc, int CEpoc,
1061 int Ppoc, int *tp_index)
1064 int layno, reslevelno, compno, precno, ok_reslevel;
1069 case JPEG2000_PGOD_RLCP:
1070 av_log(s->avctx, AV_LOG_DEBUG, "Progression order RLCP\n");
1072 for (reslevelno = RSpoc; ok_reslevel && reslevelno < REpoc; reslevelno++) {
1074 for (layno = 0; layno < LYEpoc; layno++) {
1075 for (compno = CSpoc; compno < CEpoc; compno++) {
1076 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1077 Jpeg2000QuantStyle *qntsty = tile->qntsty + compno;
1078 if (reslevelno < codsty->nreslevels) {
1079 Jpeg2000ResLevel *rlevel = tile->comp[compno].reslevel +
1082 for (precno = 0; precno < rlevel->num_precincts_x * rlevel->num_precincts_y; precno++)
1083 if ((ret = jpeg2000_decode_packet(s, tile, tp_index,
1086 qntsty->expn + (reslevelno ? 3 * (reslevelno - 1) + 1 : 0),
1087 qntsty->nguardbits)) < 0)
1095 case JPEG2000_PGOD_LRCP:
1096 av_log(s->avctx, AV_LOG_DEBUG, "Progression order LRCP\n");
1097 for (layno = 0; layno < LYEpoc; layno++) {
1099 for (reslevelno = RSpoc; ok_reslevel && reslevelno < REpoc; reslevelno++) {
1101 for (compno = CSpoc; compno < CEpoc; compno++) {
1102 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1103 Jpeg2000QuantStyle *qntsty = tile->qntsty + compno;
1104 if (reslevelno < codsty->nreslevels) {
1105 Jpeg2000ResLevel *rlevel = tile->comp[compno].reslevel +
1108 for (precno = 0; precno < rlevel->num_precincts_x * rlevel->num_precincts_y; precno++)
1109 if ((ret = jpeg2000_decode_packet(s, tile, tp_index,
1112 qntsty->expn + (reslevelno ? 3 * (reslevelno - 1) + 1 : 0),
1113 qntsty->nguardbits)) < 0)
1121 case JPEG2000_PGOD_CPRL:
1122 av_log(s->avctx, AV_LOG_DEBUG, "Progression order CPRL\n");
1123 for (compno = CSpoc; compno < CEpoc; compno++) {
1124 Jpeg2000Component *comp = tile->comp + compno;
1125 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1126 Jpeg2000QuantStyle *qntsty = tile->qntsty + compno;
1130 for (reslevelno = RSpoc; reslevelno < FFMIN(codsty->nreslevels, REpoc); reslevelno++) {
1131 uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; // ==> N_L - r
1132 Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
1133 step_x = FFMIN(step_x, rlevel->log2_prec_width + reducedresno);
1134 step_y = FFMIN(step_y, rlevel->log2_prec_height + reducedresno);
1136 av_assert0(step_x < 32 && step_y < 32);
1140 for (y = tile->coord[1][0]; y < tile->coord[1][1]; y = (y/step_y + 1)*step_y) {
1141 for (x = tile->coord[0][0]; x < tile->coord[0][1]; x = (x/step_x + 1)*step_x) {
1142 for (reslevelno = RSpoc; reslevelno < FFMIN(codsty->nreslevels, REpoc); reslevelno++) {
1143 unsigned prcx, prcy;
1144 uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; // ==> N_L - r
1145 Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
1146 int xc = x / s->cdx[compno];
1147 int yc = y / s->cdy[compno];
1149 if (yc % (1 << (rlevel->log2_prec_height + reducedresno)) && y != tile->coord[1][0]) //FIXME this is a subset of the check
1152 if (xc % (1 << (rlevel->log2_prec_width + reducedresno)) && x != tile->coord[0][0]) //FIXME this is a subset of the check
1155 // check if a precinct exists
1156 prcx = ff_jpeg2000_ceildivpow2(xc, reducedresno) >> rlevel->log2_prec_width;
1157 prcy = ff_jpeg2000_ceildivpow2(yc, reducedresno) >> rlevel->log2_prec_height;
1158 prcx -= ff_jpeg2000_ceildivpow2(comp->coord_o[0][0], reducedresno) >> rlevel->log2_prec_width;
1159 prcy -= ff_jpeg2000_ceildivpow2(comp->coord_o[1][0], reducedresno) >> rlevel->log2_prec_height;
1161 precno = prcx + rlevel->num_precincts_x * prcy;
1163 if (prcx >= rlevel->num_precincts_x || prcy >= rlevel->num_precincts_y) {
1164 av_log(s->avctx, AV_LOG_WARNING, "prc %d %d outside limits %d %d\n",
1165 prcx, prcy, rlevel->num_precincts_x, rlevel->num_precincts_y);
1169 for (layno = 0; layno < LYEpoc; layno++) {
1170 if ((ret = jpeg2000_decode_packet(s, tile, tp_index, codsty, rlevel,
1172 qntsty->expn + (reslevelno ? 3 * (reslevelno - 1) + 1 : 0),
1173 qntsty->nguardbits)) < 0)
1182 case JPEG2000_PGOD_RPCL:
1183 av_log(s->avctx, AV_LOG_WARNING, "Progression order RPCL\n");
1185 for (reslevelno = RSpoc; ok_reslevel && reslevelno < REpoc; reslevelno++) {
1189 for (compno = CSpoc; compno < CEpoc; compno++) {
1190 Jpeg2000Component *comp = tile->comp + compno;
1191 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1193 if (reslevelno < codsty->nreslevels) {
1194 uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; // ==> N_L - r
1195 Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
1196 step_x = FFMIN(step_x, rlevel->log2_prec_width + reducedresno);
1197 step_y = FFMIN(step_y, rlevel->log2_prec_height + reducedresno);
1203 for (y = tile->coord[1][0]; y < tile->coord[1][1]; y = (y/step_y + 1)*step_y) {
1204 for (x = tile->coord[0][0]; x < tile->coord[0][1]; x = (x/step_x + 1)*step_x) {
1205 for (compno = CSpoc; compno < CEpoc; compno++) {
1206 Jpeg2000Component *comp = tile->comp + compno;
1207 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1208 Jpeg2000QuantStyle *qntsty = tile->qntsty + compno;
1209 uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; // ==> N_L - r
1210 Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
1211 unsigned prcx, prcy;
1213 int xc = x / s->cdx[compno];
1214 int yc = y / s->cdy[compno];
1216 if (reslevelno >= codsty->nreslevels)
1219 if (yc % (1 << (rlevel->log2_prec_height + reducedresno)) && y != tile->coord[1][0]) //FIXME this is a subset of the check
1222 if (xc % (1 << (rlevel->log2_prec_width + reducedresno)) && x != tile->coord[0][0]) //FIXME this is a subset of the check
1225 // check if a precinct exists
1226 prcx = ff_jpeg2000_ceildivpow2(xc, reducedresno) >> rlevel->log2_prec_width;
1227 prcy = ff_jpeg2000_ceildivpow2(yc, reducedresno) >> rlevel->log2_prec_height;
1228 prcx -= ff_jpeg2000_ceildivpow2(comp->coord_o[0][0], reducedresno) >> rlevel->log2_prec_width;
1229 prcy -= ff_jpeg2000_ceildivpow2(comp->coord_o[1][0], reducedresno) >> rlevel->log2_prec_height;
1231 precno = prcx + rlevel->num_precincts_x * prcy;
1234 if (prcx >= rlevel->num_precincts_x || prcy >= rlevel->num_precincts_y) {
1235 av_log(s->avctx, AV_LOG_WARNING, "prc %d %d outside limits %d %d\n",
1236 prcx, prcy, rlevel->num_precincts_x, rlevel->num_precincts_y);
1240 for (layno = 0; layno < LYEpoc; layno++) {
1241 if ((ret = jpeg2000_decode_packet(s, tile, tp_index,
1244 qntsty->expn + (reslevelno ? 3 * (reslevelno - 1) + 1 : 0),
1245 qntsty->nguardbits)) < 0)
1254 case JPEG2000_PGOD_PCRL:
1255 av_log(s->avctx, AV_LOG_WARNING, "Progression order PCRL\n");
1258 for (compno = CSpoc; compno < CEpoc; compno++) {
1259 Jpeg2000Component *comp = tile->comp + compno;
1260 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1262 for (reslevelno = RSpoc; reslevelno < FFMIN(codsty->nreslevels, REpoc); reslevelno++) {
1263 uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; // ==> N_L - r
1264 Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
1265 step_x = FFMIN(step_x, rlevel->log2_prec_width + reducedresno);
1266 step_y = FFMIN(step_y, rlevel->log2_prec_height + reducedresno);
1269 if (step_x >= 31 || step_y >= 31){
1270 avpriv_request_sample(s->avctx, "PCRL with large step");
1271 return AVERROR_PATCHWELCOME;
1276 for (y = tile->coord[1][0]; y < tile->coord[1][1]; y = (y/step_y + 1)*step_y) {
1277 for (x = tile->coord[0][0]; x < tile->coord[0][1]; x = (x/step_x + 1)*step_x) {
1278 for (compno = CSpoc; compno < CEpoc; compno++) {
1279 Jpeg2000Component *comp = tile->comp + compno;
1280 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1281 Jpeg2000QuantStyle *qntsty = tile->qntsty + compno;
1282 int xc = x / s->cdx[compno];
1283 int yc = y / s->cdy[compno];
1285 for (reslevelno = RSpoc; reslevelno < FFMIN(codsty->nreslevels, REpoc); reslevelno++) {
1286 unsigned prcx, prcy;
1287 uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; // ==> N_L - r
1288 Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
1290 if (yc % (1 << (rlevel->log2_prec_height + reducedresno)) && y != tile->coord[1][0]) //FIXME this is a subset of the check
1293 if (xc % (1 << (rlevel->log2_prec_width + reducedresno)) && x != tile->coord[0][0]) //FIXME this is a subset of the check
1296 // check if a precinct exists
1297 prcx = ff_jpeg2000_ceildivpow2(xc, reducedresno) >> rlevel->log2_prec_width;
1298 prcy = ff_jpeg2000_ceildivpow2(yc, reducedresno) >> rlevel->log2_prec_height;
1299 prcx -= ff_jpeg2000_ceildivpow2(comp->coord_o[0][0], reducedresno) >> rlevel->log2_prec_width;
1300 prcy -= ff_jpeg2000_ceildivpow2(comp->coord_o[1][0], reducedresno) >> rlevel->log2_prec_height;
1302 precno = prcx + rlevel->num_precincts_x * prcy;
1304 if (prcx >= rlevel->num_precincts_x || prcy >= rlevel->num_precincts_y) {
1305 av_log(s->avctx, AV_LOG_WARNING, "prc %d %d outside limits %d %d\n",
1306 prcx, prcy, rlevel->num_precincts_x, rlevel->num_precincts_y);
1310 for (layno = 0; layno < LYEpoc; layno++) {
1311 if ((ret = jpeg2000_decode_packet(s, tile, tp_index, codsty, rlevel,
1313 qntsty->expn + (reslevelno ? 3 * (reslevelno - 1) + 1 : 0),
1314 qntsty->nguardbits)) < 0)
1330 static int jpeg2000_decode_packets(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile)
1332 int ret = AVERROR_BUG;
1337 if (tile->poc.nb_poc) {
1338 for (i=0; i<tile->poc.nb_poc; i++) {
1339 Jpeg2000POCEntry *e = &tile->poc.poc[i];
1340 ret = jpeg2000_decode_packets_po_iteration(s, tile,
1342 FFMIN(e->LYEpoc, tile->codsty[0].nlayers),
1344 FFMIN(e->CEpoc, s->ncomponents),
1351 ret = jpeg2000_decode_packets_po_iteration(s, tile,
1353 tile->codsty[0].nlayers,
1356 tile->codsty[0].prog_order,
1360 /* EOC marker reached */
1361 bytestream2_skip(&s->g, 2);
1366 /* TIER-1 routines */
1367 static void decode_sigpass(Jpeg2000T1Context *t1, int width, int height,
1368 int bpno, int bandno,
1369 int vert_causal_ctx_csty_symbol)
1371 int mask = 3 << (bpno - 1), y0, x, y;
1373 for (y0 = 0; y0 < height; y0 += 4)
1374 for (x = 0; x < width; x++)
1375 for (y = y0; y < height && y < y0 + 4; y++) {
1376 int flags_mask = -1;
1377 if (vert_causal_ctx_csty_symbol && y == y0 + 3)
1378 flags_mask &= ~(JPEG2000_T1_SIG_S | JPEG2000_T1_SIG_SW | JPEG2000_T1_SIG_SE | JPEG2000_T1_SGN_S);
1379 if ((t1->flags[(y+1) * t1->stride + x+1] & JPEG2000_T1_SIG_NB & flags_mask)
1380 && !(t1->flags[(y+1) * t1->stride + x+1] & (JPEG2000_T1_SIG | JPEG2000_T1_VIS))) {
1381 if (ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ff_jpeg2000_getsigctxno(t1->flags[(y+1) * t1->stride + x+1] & flags_mask, bandno))) {
1382 int xorbit, ctxno = ff_jpeg2000_getsgnctxno(t1->flags[(y+1) * t1->stride + x+1] & flags_mask, &xorbit);
1384 t1->data[(y) * t1->stride + x] = ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ctxno) ? -mask : mask;
1386 t1->data[(y) * t1->stride + x] = (ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ctxno) ^ xorbit) ?
1389 ff_jpeg2000_set_significance(t1, x, y,
1390 t1->data[(y) * t1->stride + x] < 0);
1392 t1->flags[(y + 1) * t1->stride + x + 1] |= JPEG2000_T1_VIS;
1397 static void decode_refpass(Jpeg2000T1Context *t1, int width, int height,
1398 int bpno, int vert_causal_ctx_csty_symbol)
1403 phalf = 1 << (bpno - 1);
1406 for (y0 = 0; y0 < height; y0 += 4)
1407 for (x = 0; x < width; x++)
1408 for (y = y0; y < height && y < y0 + 4; y++)
1409 if ((t1->flags[(y + 1) * t1->stride + x + 1] & (JPEG2000_T1_SIG | JPEG2000_T1_VIS)) == JPEG2000_T1_SIG) {
1410 int flags_mask = (vert_causal_ctx_csty_symbol && y == y0 + 3) ?
1411 ~(JPEG2000_T1_SIG_S | JPEG2000_T1_SIG_SW | JPEG2000_T1_SIG_SE | JPEG2000_T1_SGN_S) : -1;
1412 int ctxno = ff_jpeg2000_getrefctxno(t1->flags[(y + 1) * t1->stride + x + 1] & flags_mask);
1413 int r = ff_mqc_decode(&t1->mqc,
1414 t1->mqc.cx_states + ctxno)
1416 t1->data[(y) * t1->stride + x] += t1->data[(y) * t1->stride + x] < 0 ? -r : r;
1417 t1->flags[(y + 1) * t1->stride + x + 1] |= JPEG2000_T1_REF;
1421 static void decode_clnpass(Jpeg2000DecoderContext *s, Jpeg2000T1Context *t1,
1422 int width, int height, int bpno, int bandno,
1423 int seg_symbols, int vert_causal_ctx_csty_symbol)
1425 int mask = 3 << (bpno - 1), y0, x, y, runlen, dec;
1427 for (y0 = 0; y0 < height; y0 += 4) {
1428 for (x = 0; x < width; x++) {
1429 int flags_mask = -1;
1430 if (vert_causal_ctx_csty_symbol)
1431 flags_mask &= ~(JPEG2000_T1_SIG_S | JPEG2000_T1_SIG_SW | JPEG2000_T1_SIG_SE | JPEG2000_T1_SGN_S);
1432 if (y0 + 3 < height &&
1433 !((t1->flags[(y0 + 1) * t1->stride + x + 1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG)) ||
1434 (t1->flags[(y0 + 2) * t1->stride + x + 1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG)) ||
1435 (t1->flags[(y0 + 3) * t1->stride + x + 1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG)) ||
1436 (t1->flags[(y0 + 4) * t1->stride + x + 1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG) & flags_mask))) {
1437 if (!ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_RL))
1439 runlen = ff_mqc_decode(&t1->mqc,
1440 t1->mqc.cx_states + MQC_CX_UNI);
1441 runlen = (runlen << 1) | ff_mqc_decode(&t1->mqc,
1450 for (y = y0 + runlen; y < y0 + 4 && y < height; y++) {
1451 int flags_mask = -1;
1452 if (vert_causal_ctx_csty_symbol && y == y0 + 3)
1453 flags_mask &= ~(JPEG2000_T1_SIG_S | JPEG2000_T1_SIG_SW | JPEG2000_T1_SIG_SE | JPEG2000_T1_SGN_S);
1455 if (!(t1->flags[(y+1) * t1->stride + x+1] & (JPEG2000_T1_SIG | JPEG2000_T1_VIS))) {
1456 dec = ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ff_jpeg2000_getsigctxno(t1->flags[(y+1) * t1->stride + x+1] & flags_mask,
1462 int ctxno = ff_jpeg2000_getsgnctxno(t1->flags[(y + 1) * t1->stride + x + 1] & flags_mask,
1464 t1->data[(y) * t1->stride + x] = (ff_mqc_decode(&t1->mqc,
1465 t1->mqc.cx_states + ctxno) ^
1468 ff_jpeg2000_set_significance(t1, x, y, t1->data[(y) * t1->stride + x] < 0);
1471 t1->flags[(y + 1) * t1->stride + x + 1] &= ~JPEG2000_T1_VIS;
1477 val = ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_UNI);
1478 val = (val << 1) + ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_UNI);
1479 val = (val << 1) + ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_UNI);
1480 val = (val << 1) + ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_UNI);
1482 av_log(s->avctx, AV_LOG_ERROR,
1483 "Segmentation symbol value incorrect\n");
1487 static int decode_cblk(Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *codsty,
1488 Jpeg2000T1Context *t1, Jpeg2000Cblk *cblk,
1489 int width, int height, int bandpos)
1491 int passno = cblk->npasses, pass_t = 2, bpno = cblk->nonzerobits - 1;
1493 int vert_causal_ctx_csty_symbol = codsty->cblk_style & JPEG2000_CBLK_VSC;
1497 av_assert0(width <= 1024U && height <= 1024U);
1498 av_assert0(width*height <= 4096);
1500 memset(t1->data, 0, t1->stride * height * sizeof(*t1->data));
1502 /* If code-block contains no compressed data: nothing to do. */
1506 memset(t1->flags, 0, t1->stride * (height + 2) * sizeof(*t1->flags));
1508 cblk->data[cblk->length] = 0xff;
1509 cblk->data[cblk->length+1] = 0xff;
1510 ff_mqc_initdec(&t1->mqc, cblk->data, 0, 1);
1514 av_log(s->avctx, AV_LOG_ERROR, "bpno became negative\n");
1515 return AVERROR_INVALIDDATA;
1519 decode_sigpass(t1, width, height, bpno + 1, bandpos,
1520 vert_causal_ctx_csty_symbol);
1523 decode_refpass(t1, width, height, bpno + 1, vert_causal_ctx_csty_symbol);
1526 av_assert2(!t1->mqc.raw);
1527 decode_clnpass(s, t1, width, height, bpno + 1, bandpos,
1528 codsty->cblk_style & JPEG2000_CBLK_SEGSYM,
1529 vert_causal_ctx_csty_symbol);
1532 if (codsty->cblk_style & JPEG2000_CBLK_RESET) // XXX no testcase for just this
1533 ff_mqc_init_contexts(&t1->mqc);
1535 if (passno && (coder_type = needs_termination(codsty->cblk_style, pass_cnt))) {
1536 if (term_cnt >= cblk->nb_terminations) {
1537 av_log(s->avctx, AV_LOG_ERROR, "Missing needed termination \n");
1538 return AVERROR_INVALIDDATA;
1540 if (FFABS(cblk->data + cblk->data_start[term_cnt + 1] - 2 - t1->mqc.bp) > 0) {
1541 av_log(s->avctx, AV_LOG_WARNING, "Mid mismatch %"PTRDIFF_SPECIFIER" in pass %d of %d\n",
1542 cblk->data + cblk->data_start[term_cnt + 1] - 2 - t1->mqc.bp,
1543 pass_cnt, cblk->npasses);
1546 ff_mqc_initdec(&t1->mqc, cblk->data + cblk->data_start[++term_cnt], coder_type == 2, 0);
1557 if (cblk->data + cblk->length - 2*(term_cnt < cblk->nb_terminations) != t1->mqc.bp) {
1558 av_log(s->avctx, AV_LOG_WARNING, "End mismatch %"PTRDIFF_SPECIFIER"\n",
1559 cblk->data + cblk->length - 2*(term_cnt < cblk->nb_terminations) - t1->mqc.bp);
1565 /* TODO: Verify dequantization for lossless case
1566 * comp->data can be float or int
1567 * band->stepsize can be float or int
1568 * depending on the type of DWT transformation.
1569 * see ISO/IEC 15444-1:2002 A.6.1 */
1571 /* Float dequantization of a codeblock.*/
1572 static void dequantization_float(int x, int y, Jpeg2000Cblk *cblk,
1573 Jpeg2000Component *comp,
1574 Jpeg2000T1Context *t1, Jpeg2000Band *band)
1577 int w = cblk->coord[0][1] - cblk->coord[0][0];
1578 for (j = 0; j < (cblk->coord[1][1] - cblk->coord[1][0]); ++j) {
1579 float *datap = &comp->f_data[(comp->coord[0][1] - comp->coord[0][0]) * (y + j) + x];
1580 int *src = t1->data + j*t1->stride;
1581 for (i = 0; i < w; ++i)
1582 datap[i] = src[i] * band->f_stepsize;
1586 /* Integer dequantization of a codeblock.*/
1587 static void dequantization_int(int x, int y, Jpeg2000Cblk *cblk,
1588 Jpeg2000Component *comp,
1589 Jpeg2000T1Context *t1, Jpeg2000Band *band)
1592 int w = cblk->coord[0][1] - cblk->coord[0][0];
1593 for (j = 0; j < (cblk->coord[1][1] - cblk->coord[1][0]); ++j) {
1594 int32_t *datap = &comp->i_data[(comp->coord[0][1] - comp->coord[0][0]) * (y + j) + x];
1595 int *src = t1->data + j*t1->stride;
1596 if (band->i_stepsize == 32768) {
1597 for (i = 0; i < w; ++i)
1598 datap[i] = src[i] / 2;
1600 // This should be VERY uncommon
1601 for (i = 0; i < w; ++i)
1602 datap[i] = (src[i] * (int64_t)band->i_stepsize) / 65536;
1607 static void dequantization_int_97(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 int32_t *datap = &comp->i_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] * (int64_t)band->i_stepsize + (1<<15)) >> 16;
1621 static inline void mct_decode(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile)
1626 for (i = 1; i < 3; i++) {
1627 if (tile->codsty[0].transform != tile->codsty[i].transform) {
1628 av_log(s->avctx, AV_LOG_ERROR, "Transforms mismatch, MCT not supported\n");
1631 if (memcmp(tile->comp[0].coord, tile->comp[i].coord, sizeof(tile->comp[0].coord))) {
1632 av_log(s->avctx, AV_LOG_ERROR, "Coords mismatch, MCT not supported\n");
1637 for (i = 0; i < 3; i++)
1638 if (tile->codsty[0].transform == FF_DWT97)
1639 src[i] = tile->comp[i].f_data;
1641 src[i] = tile->comp[i].i_data;
1643 for (i = 0; i < 2; i++)
1644 csize *= tile->comp[0].coord[i][1] - tile->comp[0].coord[i][0];
1646 s->dsp.mct_decode[tile->codsty[0].transform](src[0], src[1], src[2], csize);
1649 static inline void tile_codeblocks(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile)
1651 Jpeg2000T1Context t1;
1653 int compno, reslevelno, bandno;
1655 /* Loop on tile components */
1656 for (compno = 0; compno < s->ncomponents; compno++) {
1657 Jpeg2000Component *comp = tile->comp + compno;
1658 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1660 t1.stride = (1<<codsty->log2_cblk_width) + 2;
1662 /* Loop on resolution levels */
1663 for (reslevelno = 0; reslevelno < codsty->nreslevels2decode; reslevelno++) {
1664 Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
1666 for (bandno = 0; bandno < rlevel->nbands; bandno++) {
1667 int nb_precincts, precno;
1668 Jpeg2000Band *band = rlevel->band + bandno;
1669 int cblkno = 0, bandpos;
1671 bandpos = bandno + (reslevelno > 0);
1673 if (band->coord[0][0] == band->coord[0][1] ||
1674 band->coord[1][0] == band->coord[1][1])
1677 nb_precincts = rlevel->num_precincts_x * rlevel->num_precincts_y;
1678 /* Loop on precincts */
1679 for (precno = 0; precno < nb_precincts; precno++) {
1680 Jpeg2000Prec *prec = band->prec + precno;
1682 /* Loop on codeblocks */
1684 cblkno < prec->nb_codeblocks_width * prec->nb_codeblocks_height;
1687 Jpeg2000Cblk *cblk = prec->cblk + cblkno;
1688 decode_cblk(s, codsty, &t1, cblk,
1689 cblk->coord[0][1] - cblk->coord[0][0],
1690 cblk->coord[1][1] - cblk->coord[1][0],
1693 x = cblk->coord[0][0] - band->coord[0][0];
1694 y = cblk->coord[1][0] - band->coord[1][0];
1696 if (codsty->transform == FF_DWT97)
1697 dequantization_float(x, y, cblk, comp, &t1, band);
1698 else if (codsty->transform == FF_DWT97_INT)
1699 dequantization_int_97(x, y, cblk, comp, &t1, band);
1701 dequantization_int(x, y, cblk, comp, &t1, band);
1705 } /* end reslevel */
1708 ff_dwt_decode(&comp->dwt, codsty->transform == FF_DWT97 ? (void*)comp->f_data : (void*)comp->i_data);
1712 #define WRITE_FRAME(D, PIXEL) \
1713 static inline void write_frame_ ## D(Jpeg2000DecoderContext * s, Jpeg2000Tile * tile, \
1714 AVFrame * picture, int precision) \
1716 const AVPixFmtDescriptor *pixdesc = av_pix_fmt_desc_get(s->avctx->pix_fmt); \
1717 int planar = !!(pixdesc->flags & AV_PIX_FMT_FLAG_PLANAR); \
1718 int pixelsize = planar ? 1 : pixdesc->nb_components; \
1723 for (compno = 0; compno < s->ncomponents; compno++) { \
1724 Jpeg2000Component *comp = tile->comp + compno; \
1725 Jpeg2000CodingStyle *codsty = tile->codsty + compno; \
1727 float *datap = comp->f_data; \
1728 int32_t *i_datap = comp->i_data; \
1729 int cbps = s->cbps[compno]; \
1730 int w = tile->comp[compno].coord[0][1] - s->image_offset_x; \
1734 plane = s->cdef[compno] ? s->cdef[compno]-1 : (s->ncomponents-1); \
1736 y = tile->comp[compno].coord[1][0] - s->image_offset_y / s->cdy[compno]; \
1737 line = (PIXEL *)picture->data[plane] + y * (picture->linesize[plane] / sizeof(PIXEL));\
1738 for (; y < tile->comp[compno].coord[1][1] - s->image_offset_y; y++) { \
1741 x = tile->comp[compno].coord[0][0] - s->image_offset_x / s->cdx[compno]; \
1742 dst = line + x * pixelsize + compno*!planar; \
1744 if (codsty->transform == FF_DWT97) { \
1745 for (; x < w; x++) { \
1746 int val = lrintf(*datap) + (1 << (cbps - 1)); \
1747 /* DC level shift and clip see ISO 15444-1:2002 G.1.2 */ \
1748 val = av_clip(val, 0, (1 << cbps) - 1); \
1749 *dst = val << (precision - cbps); \
1754 for (; x < w; x++) { \
1755 int val = *i_datap + (1 << (cbps - 1)); \
1756 /* DC level shift and clip see ISO 15444-1:2002 G.1.2 */ \
1757 val = av_clip(val, 0, (1 << cbps) - 1); \
1758 *dst = val << (precision - cbps); \
1763 line += picture->linesize[plane] / sizeof(PIXEL); \
1769 WRITE_FRAME(8, uint8_t)
1770 WRITE_FRAME(16, uint16_t)
1774 static int jpeg2000_decode_tile(AVCodecContext *avctx, void *td,
1775 int jobnr, int threadnr)
1777 Jpeg2000DecoderContext *s = avctx->priv_data;
1778 AVFrame *picture = td;
1779 Jpeg2000Tile *tile = s->tile + jobnr;
1782 tile_codeblocks(s, tile);
1784 /* inverse MCT transformation */
1785 if (tile->codsty[0].mct)
1786 mct_decode(s, tile);
1788 for (x = 0; x < s->ncomponents; x++) {
1789 if (s->cdef[x] < 0) {
1790 for (x = 0; x < s->ncomponents; x++) {
1793 if ((s->ncomponents & 1) == 0)
1794 s->cdef[s->ncomponents-1] = 0;
1799 if (s->precision <= 8) {
1800 write_frame_8(s, tile, picture, 8);
1802 int precision = picture->format == AV_PIX_FMT_XYZ12 ||
1803 picture->format == AV_PIX_FMT_RGB48 ||
1804 picture->format == AV_PIX_FMT_RGBA64 ||
1805 picture->format == AV_PIX_FMT_GRAY16 ? 16 : s->precision;
1807 write_frame_16(s, tile, picture, precision);
1813 static void jpeg2000_dec_cleanup(Jpeg2000DecoderContext *s)
1816 for (tileno = 0; tileno < s->numXtiles * s->numYtiles; tileno++) {
1817 if (s->tile[tileno].comp) {
1818 for (compno = 0; compno < s->ncomponents; compno++) {
1819 Jpeg2000Component *comp = s->tile[tileno].comp + compno;
1820 Jpeg2000CodingStyle *codsty = s->tile[tileno].codsty + compno;
1822 ff_jpeg2000_cleanup(comp, codsty);
1824 av_freep(&s->tile[tileno].comp);
1828 memset(s->codsty, 0, sizeof(s->codsty));
1829 memset(s->qntsty, 0, sizeof(s->qntsty));
1830 memset(s->properties, 0, sizeof(s->properties));
1831 memset(&s->poc , 0, sizeof(s->poc));
1832 s->numXtiles = s->numYtiles = 0;
1836 static int jpeg2000_read_main_headers(Jpeg2000DecoderContext *s)
1838 Jpeg2000CodingStyle *codsty = s->codsty;
1839 Jpeg2000QuantStyle *qntsty = s->qntsty;
1840 Jpeg2000POC *poc = &s->poc;
1841 uint8_t *properties = s->properties;
1848 if (bytestream2_get_bytes_left(&s->g) < 2) {
1849 av_log(s->avctx, AV_LOG_ERROR, "Missing EOC\n");
1853 marker = bytestream2_get_be16u(&s->g);
1854 oldpos = bytestream2_tell(&s->g);
1856 if (marker == JPEG2000_SOD) {
1858 Jpeg2000TilePart *tp;
1861 av_log(s->avctx, AV_LOG_ERROR, "Missing SIZ\n");
1862 return AVERROR_INVALIDDATA;
1864 if (s->curtileno < 0) {
1865 av_log(s->avctx, AV_LOG_ERROR, "Missing SOT\n");
1866 return AVERROR_INVALIDDATA;
1869 tile = s->tile + s->curtileno;
1870 tp = tile->tile_part + tile->tp_idx;
1871 if (tp->tp_end < s->g.buffer) {
1872 av_log(s->avctx, AV_LOG_ERROR, "Invalid tpend\n");
1873 return AVERROR_INVALIDDATA;
1875 bytestream2_init(&tp->tpg, s->g.buffer, tp->tp_end - s->g.buffer);
1876 bytestream2_skip(&s->g, tp->tp_end - s->g.buffer);
1880 if (marker == JPEG2000_EOC)
1883 len = bytestream2_get_be16(&s->g);
1884 if (len < 2 || bytestream2_get_bytes_left(&s->g) < len - 2) {
1885 av_log(s->avctx, AV_LOG_ERROR, "Invalid len %d left=%d\n", len, bytestream2_get_bytes_left(&s->g));
1886 return AVERROR_INVALIDDATA;
1891 if (s->ncomponents) {
1892 av_log(s->avctx, AV_LOG_ERROR, "Duplicate SIZ\n");
1893 return AVERROR_INVALIDDATA;
1897 s->numXtiles = s->numYtiles = 0;
1900 ret = get_coc(s, codsty, properties);
1903 ret = get_cod(s, codsty, properties);
1906 ret = get_qcc(s, len, qntsty, properties);
1909 ret = get_qcd(s, len, qntsty, properties);
1912 ret = get_poc(s, len, poc);
1915 if (!(ret = get_sot(s, len))) {
1916 av_assert1(s->curtileno >= 0);
1917 codsty = s->tile[s->curtileno].codsty;
1918 qntsty = s->tile[s->curtileno].qntsty;
1919 poc = &s->tile[s->curtileno].poc;
1920 properties = s->tile[s->curtileno].properties;
1924 // the PLM marker is ignored
1926 // the comment is ignored
1927 bytestream2_skip(&s->g, len - 2);
1930 // Tile-part lengths
1931 ret = get_tlm(s, len);
1934 // Packet length, tile-part header
1935 ret = get_plt(s, len);
1938 av_log(s->avctx, AV_LOG_ERROR,
1939 "unsupported marker 0x%.4"PRIX16" at pos 0x%X\n",
1940 marker, bytestream2_tell(&s->g) - 4);
1941 bytestream2_skip(&s->g, len - 2);
1944 if (bytestream2_tell(&s->g) - oldpos != len || ret) {
1945 av_log(s->avctx, AV_LOG_ERROR,
1946 "error during processing marker segment %.4"PRIx16"\n",
1948 return ret ? ret : -1;
1954 /* Read bit stream packets --> T2 operation. */
1955 static int jpeg2000_read_bitstream_packets(Jpeg2000DecoderContext *s)
1960 for (tileno = 0; tileno < s->numXtiles * s->numYtiles; tileno++) {
1961 Jpeg2000Tile *tile = s->tile + tileno;
1963 if ((ret = init_tile(s, tileno)) < 0)
1966 s->g = tile->tile_part[0].tpg;
1967 if ((ret = jpeg2000_decode_packets(s, tile)) < 0)
1974 static int jp2_find_codestream(Jpeg2000DecoderContext *s)
1976 uint32_t atom_size, atom, atom_end;
1977 int search_range = 10;
1981 bytestream2_get_bytes_left(&s->g) >= 8) {
1982 atom_size = bytestream2_get_be32u(&s->g);
1983 atom = bytestream2_get_be32u(&s->g);
1984 atom_end = bytestream2_tell(&s->g) + atom_size - 8;
1986 if (atom == JP2_CODESTREAM)
1989 if (bytestream2_get_bytes_left(&s->g) < atom_size || atom_end < atom_size)
1992 if (atom == JP2_HEADER &&
1994 uint32_t atom2_size, atom2, atom2_end;
1996 atom2_size = bytestream2_get_be32u(&s->g);
1997 atom2 = bytestream2_get_be32u(&s->g);
1998 atom2_end = bytestream2_tell(&s->g) + atom2_size - 8;
1999 if (atom2_size < 8 || atom2_end > atom_end || atom2_end < atom2_size)
2002 if (atom2 == JP2_CODESTREAM) {
2004 } else if (atom2 == MKBETAG('c','o','l','r') && atom2_size >= 7) {
2005 int method = bytestream2_get_byteu(&s->g);
2006 bytestream2_skipu(&s->g, 2);
2008 s->colour_space = bytestream2_get_be32u(&s->g);
2010 } else if (atom2 == MKBETAG('p','c','l','r') && atom2_size >= 6) {
2011 int i, size, colour_count, colour_channels, colour_depth[3];
2013 colour_count = bytestream2_get_be16u(&s->g);
2014 colour_channels = bytestream2_get_byteu(&s->g);
2015 // FIXME: Do not ignore channel_sign
2016 colour_depth[0] = (bytestream2_get_byteu(&s->g) & 0x7f) + 1;
2017 colour_depth[1] = (bytestream2_get_byteu(&s->g) & 0x7f) + 1;
2018 colour_depth[2] = (bytestream2_get_byteu(&s->g) & 0x7f) + 1;
2019 size = (colour_depth[0] + 7 >> 3) * colour_count +
2020 (colour_depth[1] + 7 >> 3) * colour_count +
2021 (colour_depth[2] + 7 >> 3) * colour_count;
2022 if (colour_count > 256 ||
2023 colour_channels != 3 ||
2024 colour_depth[0] > 16 ||
2025 colour_depth[1] > 16 ||
2026 colour_depth[2] > 16 ||
2027 atom2_size < size) {
2028 avpriv_request_sample(s->avctx, "Unknown palette");
2029 bytestream2_seek(&s->g, atom2_end, SEEK_SET);
2033 for (i = 0; i < colour_count; i++) {
2034 if (colour_depth[0] <= 8) {
2035 r = bytestream2_get_byteu(&s->g) << 8 - colour_depth[0];
2036 r |= r >> colour_depth[0];
2038 r = bytestream2_get_be16u(&s->g) >> colour_depth[0] - 8;
2040 if (colour_depth[1] <= 8) {
2041 g = bytestream2_get_byteu(&s->g) << 8 - colour_depth[1];
2042 r |= r >> colour_depth[1];
2044 g = bytestream2_get_be16u(&s->g) >> colour_depth[1] - 8;
2046 if (colour_depth[2] <= 8) {
2047 b = bytestream2_get_byteu(&s->g) << 8 - colour_depth[2];
2048 r |= r >> colour_depth[2];
2050 b = bytestream2_get_be16u(&s->g) >> colour_depth[2] - 8;
2052 s->palette[i] = 0xffu << 24 | r << 16 | g << 8 | b;
2054 } else if (atom2 == MKBETAG('c','d','e','f') && atom2_size >= 2) {
2055 int n = bytestream2_get_be16u(&s->g);
2057 int cn = bytestream2_get_be16(&s->g);
2058 int av_unused typ = bytestream2_get_be16(&s->g);
2059 int asoc = bytestream2_get_be16(&s->g);
2060 if (cn < 4 && asoc < 4)
2063 } else if (atom2 == MKBETAG('r','e','s',' ') && atom2_size >= 18) {
2064 int64_t vnum, vden, hnum, hden, vexp, hexp;
2066 bytestream2_skip(&s->g, 4);
2067 resx = bytestream2_get_be32u(&s->g);
2068 if (resx != MKBETAG('r','e','s','c') && resx != MKBETAG('r','e','s','d')) {
2069 bytestream2_seek(&s->g, atom2_end, SEEK_SET);
2072 vnum = bytestream2_get_be16u(&s->g);
2073 vden = bytestream2_get_be16u(&s->g);
2074 hnum = bytestream2_get_be16u(&s->g);
2075 hden = bytestream2_get_be16u(&s->g);
2076 vexp = bytestream2_get_byteu(&s->g);
2077 hexp = bytestream2_get_byteu(&s->g);
2078 if (!vnum || !vden || !hnum || !hden) {
2079 bytestream2_seek(&s->g, atom2_end, SEEK_SET);
2080 av_log(s->avctx, AV_LOG_WARNING, "RES box invalid\n");
2090 if ( INT64_MAX / (hnum * vden) > pow(10, hexp)
2091 && INT64_MAX / (vnum * hden) > pow(10, vexp))
2092 av_reduce(&s->sar.den, &s->sar.num,
2093 hnum * vden * pow(10, hexp),
2094 vnum * hden * pow(10, vexp),
2097 bytestream2_seek(&s->g, atom2_end, SEEK_SET);
2098 } while (atom_end - atom2_end >= 8);
2102 bytestream2_seek(&s->g, atom_end, SEEK_SET);
2108 static av_cold int jpeg2000_decode_init(AVCodecContext *avctx)
2110 Jpeg2000DecoderContext *s = avctx->priv_data;
2112 ff_jpeg2000dsp_init(&s->dsp);
2117 static int jpeg2000_decode_frame(AVCodecContext *avctx, void *data,
2118 int *got_frame, AVPacket *avpkt)
2120 Jpeg2000DecoderContext *s = avctx->priv_data;
2121 ThreadFrame frame = { .f = data };
2122 AVFrame *picture = data;
2126 bytestream2_init(&s->g, avpkt->data, avpkt->size);
2128 memset(s->cdef, -1, sizeof(s->cdef));
2130 if (bytestream2_get_bytes_left(&s->g) < 2) {
2131 ret = AVERROR_INVALIDDATA;
2135 // check if the image is in jp2 format
2136 if (bytestream2_get_bytes_left(&s->g) >= 12 &&
2137 (bytestream2_get_be32u(&s->g) == 12) &&
2138 (bytestream2_get_be32u(&s->g) == JP2_SIG_TYPE) &&
2139 (bytestream2_get_be32u(&s->g) == JP2_SIG_VALUE)) {
2140 if (!jp2_find_codestream(s)) {
2141 av_log(avctx, AV_LOG_ERROR,
2142 "Could not find Jpeg2000 codestream atom.\n");
2143 ret = AVERROR_INVALIDDATA;
2147 bytestream2_seek(&s->g, 0, SEEK_SET);
2150 while (bytestream2_get_bytes_left(&s->g) >= 3 && bytestream2_peek_be16(&s->g) != JPEG2000_SOC)
2151 bytestream2_skip(&s->g, 1);
2153 if (bytestream2_get_be16u(&s->g) != JPEG2000_SOC) {
2154 av_log(avctx, AV_LOG_ERROR, "SOC marker not present\n");
2155 ret = AVERROR_INVALIDDATA;
2158 if (ret = jpeg2000_read_main_headers(s))
2161 /* get picture buffer */
2162 if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0)
2164 picture->pict_type = AV_PICTURE_TYPE_I;
2165 picture->key_frame = 1;
2167 if (ret = jpeg2000_read_bitstream_packets(s))
2170 avctx->execute2(avctx, jpeg2000_decode_tile, picture, NULL, s->numXtiles * s->numYtiles);
2172 jpeg2000_dec_cleanup(s);
2176 if (s->avctx->pix_fmt == AV_PIX_FMT_PAL8)
2177 memcpy(picture->data[1], s->palette, 256 * sizeof(uint32_t));
2178 if (s->sar.num && s->sar.den)
2179 avctx->sample_aspect_ratio = s->sar;
2180 s->sar.num = s->sar.den = 0;
2182 return bytestream2_tell(&s->g);
2185 jpeg2000_dec_cleanup(s);
2189 static av_cold void jpeg2000_init_static_data(AVCodec *codec)
2191 ff_jpeg2000_init_tier1_luts();
2192 ff_mqc_init_context_tables();
2195 #define OFFSET(x) offsetof(Jpeg2000DecoderContext, x)
2196 #define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
2198 static const AVOption options[] = {
2199 { "lowres", "Lower the decoding resolution by a power of two",
2200 OFFSET(reduction_factor), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, JPEG2000_MAX_RESLEVELS - 1, VD },
2204 static const AVClass jpeg2000_class = {
2205 .class_name = "jpeg2000",
2206 .item_name = av_default_item_name,
2208 .version = LIBAVUTIL_VERSION_INT,
2211 AVCodec ff_jpeg2000_decoder = {
2213 .long_name = NULL_IF_CONFIG_SMALL("JPEG 2000"),
2214 .type = AVMEDIA_TYPE_VIDEO,
2215 .id = AV_CODEC_ID_JPEG2000,
2216 .capabilities = AV_CODEC_CAP_SLICE_THREADS | AV_CODEC_CAP_FRAME_THREADS | AV_CODEC_CAP_DR1,
2217 .priv_data_size = sizeof(Jpeg2000DecoderContext),
2218 .init_static_data = jpeg2000_init_static_data,
2219 .init = jpeg2000_decode_init,
2220 .decode = jpeg2000_decode_frame,
2221 .priv_class = &jpeg2000_class,
2223 .profiles = NULL_IF_CONFIG_SMALL(ff_jpeg2000_profiles)