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;
955 incl = get_bits(s, 1);
957 incl = tag_tree_decode(s, prec->cblkincl + cblkno, layno + 1) == layno;
963 if (!cblk->npasses) {
964 int v = expn[bandno] + numgbits - 1 -
965 tag_tree_decode(s, prec->zerobits + cblkno, 100);
966 if (v < 0 || v > 30) {
967 av_log(s->avctx, AV_LOG_ERROR,
968 "nonzerobits %d invalid or unsupported\n", v);
969 return AVERROR_INVALIDDATA;
971 cblk->nonzerobits = v;
973 if ((newpasses = getnpasses(s)) < 0)
975 av_assert2(newpasses > 0);
976 if (cblk->npasses + newpasses >= JPEG2000_MAX_PASSES) {
977 avpriv_request_sample(s->avctx, "Too many passes");
978 return AVERROR_PATCHWELCOME;
980 if ((llen = getlblockinc(s)) < 0)
982 if (cblk->lblock + llen + av_log2(newpasses) > 16) {
983 avpriv_request_sample(s->avctx,
984 "Block with length beyond 16 bits");
985 return AVERROR_PATCHWELCOME;
988 cblk->lblock += llen;
990 cblk->nb_lengthinc = 0;
991 cblk->nb_terminationsinc = 0;
992 av_free(cblk->lengthinc);
993 cblk->lengthinc = av_mallocz_array(newpasses , sizeof(*cblk->lengthinc));
994 if (!cblk->lengthinc)
995 return AVERROR(ENOMEM);
996 tmp = av_realloc_array(cblk->data_start, cblk->nb_terminations + newpasses + 1, sizeof(*cblk->data_start));
998 return AVERROR(ENOMEM);
999 cblk->data_start = tmp;
1003 while (newpasses1 < newpasses) {
1005 if (needs_termination(codsty->cblk_style, cblk->npasses + newpasses1 - 1)) {
1006 cblk->nb_terminationsinc ++;
1011 if ((ret = get_bits(s, av_log2(newpasses1) + cblk->lblock)) < 0)
1013 if (ret > cblk->data_allocated) {
1014 size_t new_size = FFMAX(2*cblk->data_allocated, ret);
1015 void *new = av_realloc(cblk->data, new_size);
1018 cblk->data_allocated = new_size;
1021 if (ret > cblk->data_allocated) {
1022 avpriv_request_sample(s->avctx,
1023 "Block with lengthinc greater than %"SIZE_SPECIFIER"",
1024 cblk->data_allocated);
1025 return AVERROR_PATCHWELCOME;
1027 cblk->lengthinc[cblk->nb_lengthinc++] = ret;
1028 cblk->npasses += newpasses1;
1029 newpasses -= newpasses1;
1035 if (codsty->csty & JPEG2000_CSTY_EPH) {
1036 if (bytestream2_peek_be16(&s->g) == JPEG2000_EPH)
1037 bytestream2_skip(&s->g, 2);
1039 av_log(s->avctx, AV_LOG_ERROR, "EPH marker not found. instead %X\n", bytestream2_peek_be32(&s->g));
1042 for (bandno = 0; bandno < rlevel->nbands; bandno++) {
1043 Jpeg2000Band *band = rlevel->band + bandno;
1044 Jpeg2000Prec *prec = band->prec + precno;
1046 nb_code_blocks = prec->nb_codeblocks_height * prec->nb_codeblocks_width;
1047 for (cblkno = 0; cblkno < nb_code_blocks; cblkno++) {
1048 Jpeg2000Cblk *cblk = prec->cblk + cblkno;
1049 if (!cblk->nb_terminationsinc && !cblk->lengthinc)
1051 for (cwsno = 0; cwsno < cblk->nb_lengthinc; cwsno ++) {
1052 if (cblk->data_allocated < cblk->length + cblk->lengthinc[cwsno] + 4) {
1053 size_t new_size = FFMAX(2*cblk->data_allocated, cblk->length + cblk->lengthinc[cwsno] + 4);
1054 void *new = av_realloc(cblk->data, new_size);
1057 cblk->data_allocated = new_size;
1060 if ( bytestream2_get_bytes_left(&s->g) < cblk->lengthinc[cwsno]
1061 || cblk->data_allocated < cblk->length + cblk->lengthinc[cwsno] + 4
1063 av_log(s->avctx, AV_LOG_ERROR,
1064 "Block length %"PRIu16" or lengthinc %d is too large, left %d\n",
1065 cblk->length, cblk->lengthinc[cwsno], bytestream2_get_bytes_left(&s->g));
1066 return AVERROR_INVALIDDATA;
1069 bytestream2_get_bufferu(&s->g, cblk->data + cblk->length, cblk->lengthinc[cwsno]);
1070 cblk->length += cblk->lengthinc[cwsno];
1071 cblk->lengthinc[cwsno] = 0;
1072 if (cblk->nb_terminationsinc) {
1073 cblk->nb_terminationsinc--;
1074 cblk->nb_terminations++;
1075 cblk->data[cblk->length++] = 0xFF;
1076 cblk->data[cblk->length++] = 0xFF;
1077 cblk->data_start[cblk->nb_terminations] = cblk->length;
1080 av_freep(&cblk->lengthinc);
1086 static int jpeg2000_decode_packets_po_iteration(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile,
1087 int RSpoc, int CSpoc,
1088 int LYEpoc, int REpoc, int CEpoc,
1089 int Ppoc, int *tp_index)
1092 int layno, reslevelno, compno, precno, ok_reslevel;
1097 case JPEG2000_PGOD_RLCP:
1098 av_log(s->avctx, AV_LOG_DEBUG, "Progression order RLCP\n");
1100 for (reslevelno = RSpoc; ok_reslevel && reslevelno < REpoc; reslevelno++) {
1102 for (layno = 0; layno < LYEpoc; layno++) {
1103 for (compno = CSpoc; compno < CEpoc; compno++) {
1104 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1105 Jpeg2000QuantStyle *qntsty = tile->qntsty + compno;
1106 if (reslevelno < codsty->nreslevels) {
1107 Jpeg2000ResLevel *rlevel = tile->comp[compno].reslevel +
1110 for (precno = 0; precno < rlevel->num_precincts_x * rlevel->num_precincts_y; precno++)
1111 if ((ret = jpeg2000_decode_packet(s, tile, tp_index,
1114 qntsty->expn + (reslevelno ? 3 * (reslevelno - 1) + 1 : 0),
1115 qntsty->nguardbits)) < 0)
1123 case JPEG2000_PGOD_LRCP:
1124 av_log(s->avctx, AV_LOG_DEBUG, "Progression order LRCP\n");
1125 for (layno = 0; layno < LYEpoc; layno++) {
1127 for (reslevelno = RSpoc; ok_reslevel && reslevelno < REpoc; reslevelno++) {
1129 for (compno = CSpoc; compno < CEpoc; compno++) {
1130 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1131 Jpeg2000QuantStyle *qntsty = tile->qntsty + compno;
1132 if (reslevelno < codsty->nreslevels) {
1133 Jpeg2000ResLevel *rlevel = tile->comp[compno].reslevel +
1136 for (precno = 0; precno < rlevel->num_precincts_x * rlevel->num_precincts_y; precno++)
1137 if ((ret = jpeg2000_decode_packet(s, tile, tp_index,
1140 qntsty->expn + (reslevelno ? 3 * (reslevelno - 1) + 1 : 0),
1141 qntsty->nguardbits)) < 0)
1149 case JPEG2000_PGOD_CPRL:
1150 av_log(s->avctx, AV_LOG_DEBUG, "Progression order CPRL\n");
1151 for (compno = CSpoc; compno < CEpoc; compno++) {
1152 Jpeg2000Component *comp = tile->comp + compno;
1153 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1154 Jpeg2000QuantStyle *qntsty = tile->qntsty + compno;
1158 for (reslevelno = RSpoc; reslevelno < FFMIN(codsty->nreslevels, REpoc); reslevelno++) {
1159 uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; // ==> N_L - r
1160 Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
1161 step_x = FFMIN(step_x, rlevel->log2_prec_width + reducedresno);
1162 step_y = FFMIN(step_y, rlevel->log2_prec_height + reducedresno);
1164 av_assert0(step_x < 32 && step_y < 32);
1168 for (y = tile->coord[1][0]; y < tile->coord[1][1]; y = (y/step_y + 1)*step_y) {
1169 for (x = tile->coord[0][0]; x < tile->coord[0][1]; x = (x/step_x + 1)*step_x) {
1170 for (reslevelno = RSpoc; reslevelno < FFMIN(codsty->nreslevels, REpoc); reslevelno++) {
1171 unsigned prcx, prcy;
1172 uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; // ==> N_L - r
1173 Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
1174 int xc = x / s->cdx[compno];
1175 int yc = y / s->cdy[compno];
1177 if (yc % (1 << (rlevel->log2_prec_height + reducedresno)) && y != tile->coord[1][0]) //FIXME this is a subset of the check
1180 if (xc % (1 << (rlevel->log2_prec_width + reducedresno)) && x != tile->coord[0][0]) //FIXME this is a subset of the check
1183 // check if a precinct exists
1184 prcx = ff_jpeg2000_ceildivpow2(xc, reducedresno) >> rlevel->log2_prec_width;
1185 prcy = ff_jpeg2000_ceildivpow2(yc, reducedresno) >> rlevel->log2_prec_height;
1186 prcx -= ff_jpeg2000_ceildivpow2(comp->coord_o[0][0], reducedresno) >> rlevel->log2_prec_width;
1187 prcy -= ff_jpeg2000_ceildivpow2(comp->coord_o[1][0], reducedresno) >> rlevel->log2_prec_height;
1189 precno = prcx + rlevel->num_precincts_x * prcy;
1191 if (prcx >= rlevel->num_precincts_x || prcy >= rlevel->num_precincts_y) {
1192 av_log(s->avctx, AV_LOG_WARNING, "prc %d %d outside limits %d %d\n",
1193 prcx, prcy, rlevel->num_precincts_x, rlevel->num_precincts_y);
1197 for (layno = 0; layno < LYEpoc; layno++) {
1198 if ((ret = jpeg2000_decode_packet(s, tile, tp_index, codsty, rlevel,
1200 qntsty->expn + (reslevelno ? 3 * (reslevelno - 1) + 1 : 0),
1201 qntsty->nguardbits)) < 0)
1210 case JPEG2000_PGOD_RPCL:
1211 av_log(s->avctx, AV_LOG_WARNING, "Progression order RPCL\n");
1213 for (reslevelno = RSpoc; ok_reslevel && reslevelno < REpoc; reslevelno++) {
1217 for (compno = CSpoc; compno < CEpoc; compno++) {
1218 Jpeg2000Component *comp = tile->comp + compno;
1219 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1221 if (reslevelno < codsty->nreslevels) {
1222 uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; // ==> N_L - r
1223 Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
1224 step_x = FFMIN(step_x, rlevel->log2_prec_width + reducedresno);
1225 step_y = FFMIN(step_y, rlevel->log2_prec_height + reducedresno);
1231 for (y = tile->coord[1][0]; y < tile->coord[1][1]; y = (y/step_y + 1)*step_y) {
1232 for (x = tile->coord[0][0]; x < tile->coord[0][1]; x = (x/step_x + 1)*step_x) {
1233 for (compno = CSpoc; compno < CEpoc; compno++) {
1234 Jpeg2000Component *comp = tile->comp + compno;
1235 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1236 Jpeg2000QuantStyle *qntsty = tile->qntsty + compno;
1237 uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; // ==> N_L - r
1238 Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
1239 unsigned prcx, prcy;
1241 int xc = x / s->cdx[compno];
1242 int yc = y / s->cdy[compno];
1244 if (reslevelno >= codsty->nreslevels)
1247 if (yc % (1 << (rlevel->log2_prec_height + reducedresno)) && y != tile->coord[1][0]) //FIXME this is a subset of the check
1250 if (xc % (1 << (rlevel->log2_prec_width + reducedresno)) && x != tile->coord[0][0]) //FIXME this is a subset of the check
1253 // check if a precinct exists
1254 prcx = ff_jpeg2000_ceildivpow2(xc, reducedresno) >> rlevel->log2_prec_width;
1255 prcy = ff_jpeg2000_ceildivpow2(yc, reducedresno) >> rlevel->log2_prec_height;
1256 prcx -= ff_jpeg2000_ceildivpow2(comp->coord_o[0][0], reducedresno) >> rlevel->log2_prec_width;
1257 prcy -= ff_jpeg2000_ceildivpow2(comp->coord_o[1][0], reducedresno) >> rlevel->log2_prec_height;
1259 precno = prcx + rlevel->num_precincts_x * prcy;
1262 if (prcx >= rlevel->num_precincts_x || prcy >= rlevel->num_precincts_y) {
1263 av_log(s->avctx, AV_LOG_WARNING, "prc %d %d outside limits %d %d\n",
1264 prcx, prcy, rlevel->num_precincts_x, rlevel->num_precincts_y);
1268 for (layno = 0; layno < LYEpoc; layno++) {
1269 if ((ret = jpeg2000_decode_packet(s, tile, tp_index,
1272 qntsty->expn + (reslevelno ? 3 * (reslevelno - 1) + 1 : 0),
1273 qntsty->nguardbits)) < 0)
1282 case JPEG2000_PGOD_PCRL:
1283 av_log(s->avctx, AV_LOG_WARNING, "Progression order PCRL\n");
1286 for (compno = CSpoc; compno < CEpoc; compno++) {
1287 Jpeg2000Component *comp = tile->comp + compno;
1288 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1290 for (reslevelno = RSpoc; reslevelno < FFMIN(codsty->nreslevels, REpoc); reslevelno++) {
1291 uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; // ==> N_L - r
1292 Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
1293 step_x = FFMIN(step_x, rlevel->log2_prec_width + reducedresno);
1294 step_y = FFMIN(step_y, rlevel->log2_prec_height + reducedresno);
1297 if (step_x >= 31 || step_y >= 31){
1298 avpriv_request_sample(s->avctx, "PCRL with large step");
1299 return AVERROR_PATCHWELCOME;
1304 for (y = tile->coord[1][0]; y < tile->coord[1][1]; y = (y/step_y + 1)*step_y) {
1305 for (x = tile->coord[0][0]; x < tile->coord[0][1]; x = (x/step_x + 1)*step_x) {
1306 for (compno = CSpoc; compno < CEpoc; compno++) {
1307 Jpeg2000Component *comp = tile->comp + compno;
1308 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1309 Jpeg2000QuantStyle *qntsty = tile->qntsty + compno;
1310 int xc = x / s->cdx[compno];
1311 int yc = y / s->cdy[compno];
1313 for (reslevelno = RSpoc; reslevelno < FFMIN(codsty->nreslevels, REpoc); reslevelno++) {
1314 unsigned prcx, prcy;
1315 uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; // ==> N_L - r
1316 Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
1318 if (yc % (1 << (rlevel->log2_prec_height + reducedresno)) && y != tile->coord[1][0]) //FIXME this is a subset of the check
1321 if (xc % (1 << (rlevel->log2_prec_width + reducedresno)) && x != tile->coord[0][0]) //FIXME this is a subset of the check
1324 // check if a precinct exists
1325 prcx = ff_jpeg2000_ceildivpow2(xc, reducedresno) >> rlevel->log2_prec_width;
1326 prcy = ff_jpeg2000_ceildivpow2(yc, reducedresno) >> rlevel->log2_prec_height;
1327 prcx -= ff_jpeg2000_ceildivpow2(comp->coord_o[0][0], reducedresno) >> rlevel->log2_prec_width;
1328 prcy -= ff_jpeg2000_ceildivpow2(comp->coord_o[1][0], reducedresno) >> rlevel->log2_prec_height;
1330 precno = prcx + rlevel->num_precincts_x * prcy;
1332 if (prcx >= rlevel->num_precincts_x || prcy >= rlevel->num_precincts_y) {
1333 av_log(s->avctx, AV_LOG_WARNING, "prc %d %d outside limits %d %d\n",
1334 prcx, prcy, rlevel->num_precincts_x, rlevel->num_precincts_y);
1338 for (layno = 0; layno < LYEpoc; layno++) {
1339 if ((ret = jpeg2000_decode_packet(s, tile, tp_index, codsty, rlevel,
1341 qntsty->expn + (reslevelno ? 3 * (reslevelno - 1) + 1 : 0),
1342 qntsty->nguardbits)) < 0)
1358 static int jpeg2000_decode_packets(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile)
1360 int ret = AVERROR_BUG;
1365 if (tile->poc.nb_poc) {
1366 for (i=0; i<tile->poc.nb_poc; i++) {
1367 Jpeg2000POCEntry *e = &tile->poc.poc[i];
1368 ret = jpeg2000_decode_packets_po_iteration(s, tile,
1370 FFMIN(e->LYEpoc, tile->codsty[0].nlayers),
1372 FFMIN(e->CEpoc, s->ncomponents),
1379 ret = jpeg2000_decode_packets_po_iteration(s, tile,
1381 tile->codsty[0].nlayers,
1384 tile->codsty[0].prog_order,
1388 /* EOC marker reached */
1389 bytestream2_skip(&s->g, 2);
1394 /* TIER-1 routines */
1395 static void decode_sigpass(Jpeg2000T1Context *t1, int width, int height,
1396 int bpno, int bandno,
1397 int vert_causal_ctx_csty_symbol)
1399 int mask = 3 << (bpno - 1), y0, x, y;
1401 for (y0 = 0; y0 < height; y0 += 4)
1402 for (x = 0; x < width; x++)
1403 for (y = y0; y < height && y < y0 + 4; y++) {
1404 int flags_mask = -1;
1405 if (vert_causal_ctx_csty_symbol && y == y0 + 3)
1406 flags_mask &= ~(JPEG2000_T1_SIG_S | JPEG2000_T1_SIG_SW | JPEG2000_T1_SIG_SE | JPEG2000_T1_SGN_S);
1407 if ((t1->flags[(y+1) * t1->stride + x+1] & JPEG2000_T1_SIG_NB & flags_mask)
1408 && !(t1->flags[(y+1) * t1->stride + x+1] & (JPEG2000_T1_SIG | JPEG2000_T1_VIS))) {
1409 if (ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ff_jpeg2000_getsigctxno(t1->flags[(y+1) * t1->stride + x+1] & flags_mask, bandno))) {
1410 int xorbit, ctxno = ff_jpeg2000_getsgnctxno(t1->flags[(y+1) * t1->stride + x+1] & flags_mask, &xorbit);
1412 t1->data[(y) * t1->stride + x] = ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ctxno) ? -mask : mask;
1414 t1->data[(y) * t1->stride + x] = (ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ctxno) ^ xorbit) ?
1417 ff_jpeg2000_set_significance(t1, x, y,
1418 t1->data[(y) * t1->stride + x] < 0);
1420 t1->flags[(y + 1) * t1->stride + x + 1] |= JPEG2000_T1_VIS;
1425 static void decode_refpass(Jpeg2000T1Context *t1, int width, int height,
1426 int bpno, int vert_causal_ctx_csty_symbol)
1431 phalf = 1 << (bpno - 1);
1434 for (y0 = 0; y0 < height; y0 += 4)
1435 for (x = 0; x < width; x++)
1436 for (y = y0; y < height && y < y0 + 4; y++)
1437 if ((t1->flags[(y + 1) * t1->stride + x + 1] & (JPEG2000_T1_SIG | JPEG2000_T1_VIS)) == JPEG2000_T1_SIG) {
1438 int flags_mask = (vert_causal_ctx_csty_symbol && y == y0 + 3) ?
1439 ~(JPEG2000_T1_SIG_S | JPEG2000_T1_SIG_SW | JPEG2000_T1_SIG_SE | JPEG2000_T1_SGN_S) : -1;
1440 int ctxno = ff_jpeg2000_getrefctxno(t1->flags[(y + 1) * t1->stride + x + 1] & flags_mask);
1441 int r = ff_mqc_decode(&t1->mqc,
1442 t1->mqc.cx_states + ctxno)
1444 t1->data[(y) * t1->stride + x] += t1->data[(y) * t1->stride + x] < 0 ? -r : r;
1445 t1->flags[(y + 1) * t1->stride + x + 1] |= JPEG2000_T1_REF;
1449 static void decode_clnpass(Jpeg2000DecoderContext *s, Jpeg2000T1Context *t1,
1450 int width, int height, int bpno, int bandno,
1451 int seg_symbols, int vert_causal_ctx_csty_symbol)
1453 int mask = 3 << (bpno - 1), y0, x, y, runlen, dec;
1455 for (y0 = 0; y0 < height; y0 += 4) {
1456 for (x = 0; x < width; x++) {
1457 int flags_mask = -1;
1458 if (vert_causal_ctx_csty_symbol)
1459 flags_mask &= ~(JPEG2000_T1_SIG_S | JPEG2000_T1_SIG_SW | JPEG2000_T1_SIG_SE | JPEG2000_T1_SGN_S);
1460 if (y0 + 3 < height &&
1461 !((t1->flags[(y0 + 1) * t1->stride + x + 1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG)) ||
1462 (t1->flags[(y0 + 2) * t1->stride + x + 1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG)) ||
1463 (t1->flags[(y0 + 3) * t1->stride + x + 1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG)) ||
1464 (t1->flags[(y0 + 4) * t1->stride + x + 1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG) & flags_mask))) {
1465 if (!ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_RL))
1467 runlen = ff_mqc_decode(&t1->mqc,
1468 t1->mqc.cx_states + MQC_CX_UNI);
1469 runlen = (runlen << 1) | ff_mqc_decode(&t1->mqc,
1478 for (y = y0 + runlen; y < y0 + 4 && y < height; y++) {
1479 int flags_mask = -1;
1480 if (vert_causal_ctx_csty_symbol && y == y0 + 3)
1481 flags_mask &= ~(JPEG2000_T1_SIG_S | JPEG2000_T1_SIG_SW | JPEG2000_T1_SIG_SE | JPEG2000_T1_SGN_S);
1483 if (!(t1->flags[(y+1) * t1->stride + x+1] & (JPEG2000_T1_SIG | JPEG2000_T1_VIS))) {
1484 dec = ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ff_jpeg2000_getsigctxno(t1->flags[(y+1) * t1->stride + x+1] & flags_mask,
1490 int ctxno = ff_jpeg2000_getsgnctxno(t1->flags[(y + 1) * t1->stride + x + 1] & flags_mask,
1492 t1->data[(y) * t1->stride + x] = (ff_mqc_decode(&t1->mqc,
1493 t1->mqc.cx_states + ctxno) ^
1496 ff_jpeg2000_set_significance(t1, x, y, t1->data[(y) * t1->stride + x] < 0);
1499 t1->flags[(y + 1) * t1->stride + x + 1] &= ~JPEG2000_T1_VIS;
1505 val = ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_UNI);
1506 val = (val << 1) + ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_UNI);
1507 val = (val << 1) + ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_UNI);
1508 val = (val << 1) + ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_UNI);
1510 av_log(s->avctx, AV_LOG_ERROR,
1511 "Segmentation symbol value incorrect\n");
1515 static int decode_cblk(Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *codsty,
1516 Jpeg2000T1Context *t1, Jpeg2000Cblk *cblk,
1517 int width, int height, int bandpos)
1519 int passno = cblk->npasses, pass_t = 2, bpno = cblk->nonzerobits - 1;
1521 int vert_causal_ctx_csty_symbol = codsty->cblk_style & JPEG2000_CBLK_VSC;
1525 av_assert0(width <= 1024U && height <= 1024U);
1526 av_assert0(width*height <= 4096);
1528 memset(t1->data, 0, t1->stride * height * sizeof(*t1->data));
1530 /* If code-block contains no compressed data: nothing to do. */
1534 memset(t1->flags, 0, t1->stride * (height + 2) * sizeof(*t1->flags));
1536 cblk->data[cblk->length] = 0xff;
1537 cblk->data[cblk->length+1] = 0xff;
1538 ff_mqc_initdec(&t1->mqc, cblk->data, 0, 1);
1542 av_log(s->avctx, AV_LOG_ERROR, "bpno became negative\n");
1543 return AVERROR_INVALIDDATA;
1547 decode_sigpass(t1, width, height, bpno + 1, bandpos,
1548 vert_causal_ctx_csty_symbol);
1551 decode_refpass(t1, width, height, bpno + 1, vert_causal_ctx_csty_symbol);
1554 av_assert2(!t1->mqc.raw);
1555 decode_clnpass(s, t1, width, height, bpno + 1, bandpos,
1556 codsty->cblk_style & JPEG2000_CBLK_SEGSYM,
1557 vert_causal_ctx_csty_symbol);
1560 if (codsty->cblk_style & JPEG2000_CBLK_RESET) // XXX no testcase for just this
1561 ff_mqc_init_contexts(&t1->mqc);
1563 if (passno && (coder_type = needs_termination(codsty->cblk_style, pass_cnt))) {
1564 if (term_cnt >= cblk->nb_terminations) {
1565 av_log(s->avctx, AV_LOG_ERROR, "Missing needed termination \n");
1566 return AVERROR_INVALIDDATA;
1568 if (FFABS(cblk->data + cblk->data_start[term_cnt + 1] - 2 - t1->mqc.bp) > 0) {
1569 av_log(s->avctx, AV_LOG_WARNING, "Mid mismatch %"PTRDIFF_SPECIFIER" in pass %d of %d\n",
1570 cblk->data + cblk->data_start[term_cnt + 1] - 2 - t1->mqc.bp,
1571 pass_cnt, cblk->npasses);
1574 ff_mqc_initdec(&t1->mqc, cblk->data + cblk->data_start[++term_cnt], coder_type == 2, 0);
1585 if (cblk->data + cblk->length - 2*(term_cnt < cblk->nb_terminations) != t1->mqc.bp) {
1586 av_log(s->avctx, AV_LOG_WARNING, "End mismatch %"PTRDIFF_SPECIFIER"\n",
1587 cblk->data + cblk->length - 2*(term_cnt < cblk->nb_terminations) - t1->mqc.bp);
1593 /* TODO: Verify dequantization for lossless case
1594 * comp->data can be float or int
1595 * band->stepsize can be float or int
1596 * depending on the type of DWT transformation.
1597 * see ISO/IEC 15444-1:2002 A.6.1 */
1599 /* Float dequantization of a codeblock.*/
1600 static void dequantization_float(int x, int y, Jpeg2000Cblk *cblk,
1601 Jpeg2000Component *comp,
1602 Jpeg2000T1Context *t1, Jpeg2000Band *band)
1605 int w = cblk->coord[0][1] - cblk->coord[0][0];
1606 for (j = 0; j < (cblk->coord[1][1] - cblk->coord[1][0]); ++j) {
1607 float *datap = &comp->f_data[(comp->coord[0][1] - comp->coord[0][0]) * (y + j) + x];
1608 int *src = t1->data + j*t1->stride;
1609 for (i = 0; i < w; ++i)
1610 datap[i] = src[i] * band->f_stepsize;
1614 /* Integer dequantization of a codeblock.*/
1615 static void dequantization_int(int x, int y, Jpeg2000Cblk *cblk,
1616 Jpeg2000Component *comp,
1617 Jpeg2000T1Context *t1, Jpeg2000Band *band)
1620 int w = cblk->coord[0][1] - cblk->coord[0][0];
1621 for (j = 0; j < (cblk->coord[1][1] - cblk->coord[1][0]); ++j) {
1622 int32_t *datap = &comp->i_data[(comp->coord[0][1] - comp->coord[0][0]) * (y + j) + x];
1623 int *src = t1->data + j*t1->stride;
1624 if (band->i_stepsize == 32768) {
1625 for (i = 0; i < w; ++i)
1626 datap[i] = src[i] / 2;
1628 // This should be VERY uncommon
1629 for (i = 0; i < w; ++i)
1630 datap[i] = (src[i] * (int64_t)band->i_stepsize) / 65536;
1635 static void dequantization_int_97(int x, int y, Jpeg2000Cblk *cblk,
1636 Jpeg2000Component *comp,
1637 Jpeg2000T1Context *t1, Jpeg2000Band *band)
1640 int w = cblk->coord[0][1] - cblk->coord[0][0];
1641 for (j = 0; j < (cblk->coord[1][1] - cblk->coord[1][0]); ++j) {
1642 int32_t *datap = &comp->i_data[(comp->coord[0][1] - comp->coord[0][0]) * (y + j) + x];
1643 int *src = t1->data + j*t1->stride;
1644 for (i = 0; i < w; ++i)
1645 datap[i] = (src[i] * (int64_t)band->i_stepsize + (1<<15)) >> 16;
1649 static inline void mct_decode(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile)
1654 for (i = 1; i < 3; i++) {
1655 if (tile->codsty[0].transform != tile->codsty[i].transform) {
1656 av_log(s->avctx, AV_LOG_ERROR, "Transforms mismatch, MCT not supported\n");
1659 if (memcmp(tile->comp[0].coord, tile->comp[i].coord, sizeof(tile->comp[0].coord))) {
1660 av_log(s->avctx, AV_LOG_ERROR, "Coords mismatch, MCT not supported\n");
1665 for (i = 0; i < 3; i++)
1666 if (tile->codsty[0].transform == FF_DWT97)
1667 src[i] = tile->comp[i].f_data;
1669 src[i] = tile->comp[i].i_data;
1671 for (i = 0; i < 2; i++)
1672 csize *= tile->comp[0].coord[i][1] - tile->comp[0].coord[i][0];
1674 s->dsp.mct_decode[tile->codsty[0].transform](src[0], src[1], src[2], csize);
1677 static inline void tile_codeblocks(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile)
1679 Jpeg2000T1Context t1;
1681 int compno, reslevelno, bandno;
1683 /* Loop on tile components */
1684 for (compno = 0; compno < s->ncomponents; compno++) {
1685 Jpeg2000Component *comp = tile->comp + compno;
1686 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1688 t1.stride = (1<<codsty->log2_cblk_width) + 2;
1690 /* Loop on resolution levels */
1691 for (reslevelno = 0; reslevelno < codsty->nreslevels2decode; reslevelno++) {
1692 Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
1694 for (bandno = 0; bandno < rlevel->nbands; bandno++) {
1695 int nb_precincts, precno;
1696 Jpeg2000Band *band = rlevel->band + bandno;
1697 int cblkno = 0, bandpos;
1699 bandpos = bandno + (reslevelno > 0);
1701 if (band->coord[0][0] == band->coord[0][1] ||
1702 band->coord[1][0] == band->coord[1][1])
1705 nb_precincts = rlevel->num_precincts_x * rlevel->num_precincts_y;
1706 /* Loop on precincts */
1707 for (precno = 0; precno < nb_precincts; precno++) {
1708 Jpeg2000Prec *prec = band->prec + precno;
1710 /* Loop on codeblocks */
1712 cblkno < prec->nb_codeblocks_width * prec->nb_codeblocks_height;
1715 Jpeg2000Cblk *cblk = prec->cblk + cblkno;
1716 decode_cblk(s, codsty, &t1, cblk,
1717 cblk->coord[0][1] - cblk->coord[0][0],
1718 cblk->coord[1][1] - cblk->coord[1][0],
1721 x = cblk->coord[0][0] - band->coord[0][0];
1722 y = cblk->coord[1][0] - band->coord[1][0];
1724 if (codsty->transform == FF_DWT97)
1725 dequantization_float(x, y, cblk, comp, &t1, band);
1726 else if (codsty->transform == FF_DWT97_INT)
1727 dequantization_int_97(x, y, cblk, comp, &t1, band);
1729 dequantization_int(x, y, cblk, comp, &t1, band);
1733 } /* end reslevel */
1736 ff_dwt_decode(&comp->dwt, codsty->transform == FF_DWT97 ? (void*)comp->f_data : (void*)comp->i_data);
1740 #define WRITE_FRAME(D, PIXEL) \
1741 static inline void write_frame_ ## D(Jpeg2000DecoderContext * s, Jpeg2000Tile * tile, \
1742 AVFrame * picture, int precision) \
1744 const AVPixFmtDescriptor *pixdesc = av_pix_fmt_desc_get(s->avctx->pix_fmt); \
1745 int planar = !!(pixdesc->flags & AV_PIX_FMT_FLAG_PLANAR); \
1746 int pixelsize = planar ? 1 : pixdesc->nb_components; \
1751 for (compno = 0; compno < s->ncomponents; compno++) { \
1752 Jpeg2000Component *comp = tile->comp + compno; \
1753 Jpeg2000CodingStyle *codsty = tile->codsty + compno; \
1755 float *datap = comp->f_data; \
1756 int32_t *i_datap = comp->i_data; \
1757 int cbps = s->cbps[compno]; \
1758 int w = tile->comp[compno].coord[0][1] - s->image_offset_x; \
1762 plane = s->cdef[compno] ? s->cdef[compno]-1 : (s->ncomponents-1); \
1764 y = tile->comp[compno].coord[1][0] - s->image_offset_y / s->cdy[compno]; \
1765 line = (PIXEL *)picture->data[plane] + y * (picture->linesize[plane] / sizeof(PIXEL));\
1766 for (; y < tile->comp[compno].coord[1][1] - s->image_offset_y; y++) { \
1769 x = tile->comp[compno].coord[0][0] - s->image_offset_x / s->cdx[compno]; \
1770 dst = line + x * pixelsize + compno*!planar; \
1772 if (codsty->transform == FF_DWT97) { \
1773 for (; x < w; x++) { \
1774 int val = lrintf(*datap) + (1 << (cbps - 1)); \
1775 /* DC level shift and clip see ISO 15444-1:2002 G.1.2 */ \
1776 val = av_clip(val, 0, (1 << cbps) - 1); \
1777 *dst = val << (precision - cbps); \
1782 for (; x < w; x++) { \
1783 int val = *i_datap + (1 << (cbps - 1)); \
1784 /* DC level shift and clip see ISO 15444-1:2002 G.1.2 */ \
1785 val = av_clip(val, 0, (1 << cbps) - 1); \
1786 *dst = val << (precision - cbps); \
1791 line += picture->linesize[plane] / sizeof(PIXEL); \
1797 WRITE_FRAME(8, uint8_t)
1798 WRITE_FRAME(16, uint16_t)
1802 static int jpeg2000_decode_tile(AVCodecContext *avctx, void *td,
1803 int jobnr, int threadnr)
1805 Jpeg2000DecoderContext *s = avctx->priv_data;
1806 AVFrame *picture = td;
1807 Jpeg2000Tile *tile = s->tile + jobnr;
1810 tile_codeblocks(s, tile);
1812 /* inverse MCT transformation */
1813 if (tile->codsty[0].mct)
1814 mct_decode(s, tile);
1816 for (x = 0; x < s->ncomponents; x++) {
1817 if (s->cdef[x] < 0) {
1818 for (x = 0; x < s->ncomponents; x++) {
1821 if ((s->ncomponents & 1) == 0)
1822 s->cdef[s->ncomponents-1] = 0;
1827 if (s->precision <= 8) {
1828 write_frame_8(s, tile, picture, 8);
1830 int precision = picture->format == AV_PIX_FMT_XYZ12 ||
1831 picture->format == AV_PIX_FMT_RGB48 ||
1832 picture->format == AV_PIX_FMT_RGBA64 ||
1833 picture->format == AV_PIX_FMT_GRAY16 ? 16 : s->precision;
1835 write_frame_16(s, tile, picture, precision);
1841 static void jpeg2000_dec_cleanup(Jpeg2000DecoderContext *s)
1844 for (tileno = 0; tileno < s->numXtiles * s->numYtiles; tileno++) {
1845 if (s->tile[tileno].comp) {
1846 for (compno = 0; compno < s->ncomponents; compno++) {
1847 Jpeg2000Component *comp = s->tile[tileno].comp + compno;
1848 Jpeg2000CodingStyle *codsty = s->tile[tileno].codsty + compno;
1850 ff_jpeg2000_cleanup(comp, codsty);
1852 av_freep(&s->tile[tileno].comp);
1856 memset(s->codsty, 0, sizeof(s->codsty));
1857 memset(s->qntsty, 0, sizeof(s->qntsty));
1858 memset(s->properties, 0, sizeof(s->properties));
1859 memset(&s->poc , 0, sizeof(s->poc));
1860 s->numXtiles = s->numYtiles = 0;
1864 static int jpeg2000_read_main_headers(Jpeg2000DecoderContext *s)
1866 Jpeg2000CodingStyle *codsty = s->codsty;
1867 Jpeg2000QuantStyle *qntsty = s->qntsty;
1868 Jpeg2000POC *poc = &s->poc;
1869 uint8_t *properties = s->properties;
1876 if (bytestream2_get_bytes_left(&s->g) < 2) {
1877 av_log(s->avctx, AV_LOG_ERROR, "Missing EOC\n");
1881 marker = bytestream2_get_be16u(&s->g);
1882 oldpos = bytestream2_tell(&s->g);
1884 if (marker == JPEG2000_SOD) {
1886 Jpeg2000TilePart *tp;
1889 av_log(s->avctx, AV_LOG_ERROR, "Missing SIZ\n");
1890 return AVERROR_INVALIDDATA;
1892 if (s->curtileno < 0) {
1893 av_log(s->avctx, AV_LOG_ERROR, "Missing SOT\n");
1894 return AVERROR_INVALIDDATA;
1897 tile = s->tile + s->curtileno;
1898 tp = tile->tile_part + tile->tp_idx;
1899 if (tp->tp_end < s->g.buffer) {
1900 av_log(s->avctx, AV_LOG_ERROR, "Invalid tpend\n");
1901 return AVERROR_INVALIDDATA;
1903 bytestream2_init(&tp->tpg, s->g.buffer, tp->tp_end - s->g.buffer);
1904 bytestream2_skip(&s->g, tp->tp_end - s->g.buffer);
1908 if (marker == JPEG2000_EOC)
1911 len = bytestream2_get_be16(&s->g);
1912 if (len < 2 || bytestream2_get_bytes_left(&s->g) < len - 2) {
1913 av_log(s->avctx, AV_LOG_ERROR, "Invalid len %d left=%d\n", len, bytestream2_get_bytes_left(&s->g));
1914 return AVERROR_INVALIDDATA;
1919 if (s->ncomponents) {
1920 av_log(s->avctx, AV_LOG_ERROR, "Duplicate SIZ\n");
1921 return AVERROR_INVALIDDATA;
1925 s->numXtiles = s->numYtiles = 0;
1928 ret = get_coc(s, codsty, properties);
1931 ret = get_cod(s, codsty, properties);
1934 ret = get_qcc(s, len, qntsty, properties);
1937 ret = get_qcd(s, len, qntsty, properties);
1940 ret = get_poc(s, len, poc);
1943 if (!(ret = get_sot(s, len))) {
1944 av_assert1(s->curtileno >= 0);
1945 codsty = s->tile[s->curtileno].codsty;
1946 qntsty = s->tile[s->curtileno].qntsty;
1947 poc = &s->tile[s->curtileno].poc;
1948 properties = s->tile[s->curtileno].properties;
1952 // the PLM marker is ignored
1954 // the comment is ignored
1955 bytestream2_skip(&s->g, len - 2);
1958 // Tile-part lengths
1959 ret = get_tlm(s, len);
1962 // Packet length, tile-part header
1963 ret = get_plt(s, len);
1966 av_log(s->avctx, AV_LOG_ERROR,
1967 "unsupported marker 0x%.4"PRIX16" at pos 0x%X\n",
1968 marker, bytestream2_tell(&s->g) - 4);
1969 bytestream2_skip(&s->g, len - 2);
1972 if (bytestream2_tell(&s->g) - oldpos != len || ret) {
1973 av_log(s->avctx, AV_LOG_ERROR,
1974 "error during processing marker segment %.4"PRIx16"\n",
1976 return ret ? ret : -1;
1982 /* Read bit stream packets --> T2 operation. */
1983 static int jpeg2000_read_bitstream_packets(Jpeg2000DecoderContext *s)
1988 for (tileno = 0; tileno < s->numXtiles * s->numYtiles; tileno++) {
1989 Jpeg2000Tile *tile = s->tile + tileno;
1991 if ((ret = init_tile(s, tileno)) < 0)
1994 s->g = tile->tile_part[0].tpg;
1995 if ((ret = jpeg2000_decode_packets(s, tile)) < 0)
2002 static int jp2_find_codestream(Jpeg2000DecoderContext *s)
2004 uint32_t atom_size, atom, atom_end;
2005 int search_range = 10;
2009 bytestream2_get_bytes_left(&s->g) >= 8) {
2010 atom_size = bytestream2_get_be32u(&s->g);
2011 atom = bytestream2_get_be32u(&s->g);
2012 if (atom_size == 1) {
2013 if (bytestream2_get_be32u(&s->g)) {
2014 avpriv_request_sample(s->avctx, "Huge atom");
2017 atom_size = bytestream2_get_be32u(&s->g);
2018 atom_end = bytestream2_tell(&s->g) + atom_size - 16;
2020 atom_end = bytestream2_tell(&s->g) + atom_size - 8;
2023 if (atom == JP2_CODESTREAM)
2026 if (bytestream2_get_bytes_left(&s->g) < atom_size || atom_end < atom_size)
2029 if (atom == JP2_HEADER &&
2031 uint32_t atom2_size, atom2, atom2_end;
2033 atom2_size = bytestream2_get_be32u(&s->g);
2034 atom2 = bytestream2_get_be32u(&s->g);
2035 atom2_end = bytestream2_tell(&s->g) + atom2_size - 8;
2036 if (atom2_size < 8 || atom2_end > atom_end || atom2_end < atom2_size)
2039 if (atom2 == JP2_CODESTREAM) {
2041 } else if (atom2 == MKBETAG('c','o','l','r') && atom2_size >= 7) {
2042 int method = bytestream2_get_byteu(&s->g);
2043 bytestream2_skipu(&s->g, 2);
2045 s->colour_space = bytestream2_get_be32u(&s->g);
2047 } else if (atom2 == MKBETAG('p','c','l','r') && atom2_size >= 6) {
2048 int i, size, colour_count, colour_channels, colour_depth[3];
2050 colour_count = bytestream2_get_be16u(&s->g);
2051 colour_channels = bytestream2_get_byteu(&s->g);
2052 // FIXME: Do not ignore channel_sign
2053 colour_depth[0] = (bytestream2_get_byteu(&s->g) & 0x7f) + 1;
2054 colour_depth[1] = (bytestream2_get_byteu(&s->g) & 0x7f) + 1;
2055 colour_depth[2] = (bytestream2_get_byteu(&s->g) & 0x7f) + 1;
2056 size = (colour_depth[0] + 7 >> 3) * colour_count +
2057 (colour_depth[1] + 7 >> 3) * colour_count +
2058 (colour_depth[2] + 7 >> 3) * colour_count;
2059 if (colour_count > 256 ||
2060 colour_channels != 3 ||
2061 colour_depth[0] > 16 ||
2062 colour_depth[1] > 16 ||
2063 colour_depth[2] > 16 ||
2064 atom2_size < size) {
2065 avpriv_request_sample(s->avctx, "Unknown palette");
2066 bytestream2_seek(&s->g, atom2_end, SEEK_SET);
2070 for (i = 0; i < colour_count; i++) {
2071 if (colour_depth[0] <= 8) {
2072 r = bytestream2_get_byteu(&s->g) << 8 - colour_depth[0];
2073 r |= r >> colour_depth[0];
2075 r = bytestream2_get_be16u(&s->g) >> colour_depth[0] - 8;
2077 if (colour_depth[1] <= 8) {
2078 g = bytestream2_get_byteu(&s->g) << 8 - colour_depth[1];
2079 g |= g >> colour_depth[1];
2081 g = bytestream2_get_be16u(&s->g) >> colour_depth[1] - 8;
2083 if (colour_depth[2] <= 8) {
2084 b = bytestream2_get_byteu(&s->g) << 8 - colour_depth[2];
2085 b |= b >> colour_depth[2];
2087 b = bytestream2_get_be16u(&s->g) >> colour_depth[2] - 8;
2089 s->palette[i] = 0xffu << 24 | r << 16 | g << 8 | b;
2091 } else if (atom2 == MKBETAG('c','d','e','f') && atom2_size >= 2) {
2092 int n = bytestream2_get_be16u(&s->g);
2094 int cn = bytestream2_get_be16(&s->g);
2095 int av_unused typ = bytestream2_get_be16(&s->g);
2096 int asoc = bytestream2_get_be16(&s->g);
2097 if (cn < 4 && asoc < 4)
2100 } else if (atom2 == MKBETAG('r','e','s',' ') && atom2_size >= 18) {
2101 int64_t vnum, vden, hnum, hden, vexp, hexp;
2103 bytestream2_skip(&s->g, 4);
2104 resx = bytestream2_get_be32u(&s->g);
2105 if (resx != MKBETAG('r','e','s','c') && resx != MKBETAG('r','e','s','d')) {
2106 bytestream2_seek(&s->g, atom2_end, SEEK_SET);
2109 vnum = bytestream2_get_be16u(&s->g);
2110 vden = bytestream2_get_be16u(&s->g);
2111 hnum = bytestream2_get_be16u(&s->g);
2112 hden = bytestream2_get_be16u(&s->g);
2113 vexp = bytestream2_get_byteu(&s->g);
2114 hexp = bytestream2_get_byteu(&s->g);
2115 if (!vnum || !vden || !hnum || !hden) {
2116 bytestream2_seek(&s->g, atom2_end, SEEK_SET);
2117 av_log(s->avctx, AV_LOG_WARNING, "RES box invalid\n");
2127 if ( INT64_MAX / (hnum * vden) > pow(10, hexp)
2128 && INT64_MAX / (vnum * hden) > pow(10, vexp))
2129 av_reduce(&s->sar.den, &s->sar.num,
2130 hnum * vden * pow(10, hexp),
2131 vnum * hden * pow(10, vexp),
2134 bytestream2_seek(&s->g, atom2_end, SEEK_SET);
2135 } while (atom_end - atom2_end >= 8);
2139 bytestream2_seek(&s->g, atom_end, SEEK_SET);
2145 static av_cold int jpeg2000_decode_init(AVCodecContext *avctx)
2147 Jpeg2000DecoderContext *s = avctx->priv_data;
2149 ff_jpeg2000dsp_init(&s->dsp);
2154 static int jpeg2000_decode_frame(AVCodecContext *avctx, void *data,
2155 int *got_frame, AVPacket *avpkt)
2157 Jpeg2000DecoderContext *s = avctx->priv_data;
2158 ThreadFrame frame = { .f = data };
2159 AVFrame *picture = data;
2163 bytestream2_init(&s->g, avpkt->data, avpkt->size);
2165 memset(s->cdef, -1, sizeof(s->cdef));
2167 if (bytestream2_get_bytes_left(&s->g) < 2) {
2168 ret = AVERROR_INVALIDDATA;
2172 // check if the image is in jp2 format
2173 if (bytestream2_get_bytes_left(&s->g) >= 12 &&
2174 (bytestream2_get_be32u(&s->g) == 12) &&
2175 (bytestream2_get_be32u(&s->g) == JP2_SIG_TYPE) &&
2176 (bytestream2_get_be32u(&s->g) == JP2_SIG_VALUE)) {
2177 if (!jp2_find_codestream(s)) {
2178 av_log(avctx, AV_LOG_ERROR,
2179 "Could not find Jpeg2000 codestream atom.\n");
2180 ret = AVERROR_INVALIDDATA;
2184 bytestream2_seek(&s->g, 0, SEEK_SET);
2187 while (bytestream2_get_bytes_left(&s->g) >= 3 && bytestream2_peek_be16(&s->g) != JPEG2000_SOC)
2188 bytestream2_skip(&s->g, 1);
2190 if (bytestream2_get_be16u(&s->g) != JPEG2000_SOC) {
2191 av_log(avctx, AV_LOG_ERROR, "SOC marker not present\n");
2192 ret = AVERROR_INVALIDDATA;
2195 if (ret = jpeg2000_read_main_headers(s))
2198 /* get picture buffer */
2199 if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0)
2201 picture->pict_type = AV_PICTURE_TYPE_I;
2202 picture->key_frame = 1;
2204 if (ret = jpeg2000_read_bitstream_packets(s))
2207 avctx->execute2(avctx, jpeg2000_decode_tile, picture, NULL, s->numXtiles * s->numYtiles);
2209 jpeg2000_dec_cleanup(s);
2213 if (s->avctx->pix_fmt == AV_PIX_FMT_PAL8)
2214 memcpy(picture->data[1], s->palette, 256 * sizeof(uint32_t));
2215 if (s->sar.num && s->sar.den)
2216 avctx->sample_aspect_ratio = s->sar;
2217 s->sar.num = s->sar.den = 0;
2219 return bytestream2_tell(&s->g);
2222 jpeg2000_dec_cleanup(s);
2226 static av_cold void jpeg2000_init_static_data(AVCodec *codec)
2228 ff_jpeg2000_init_tier1_luts();
2229 ff_mqc_init_context_tables();
2232 #define OFFSET(x) offsetof(Jpeg2000DecoderContext, x)
2233 #define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
2235 static const AVOption options[] = {
2236 { "lowres", "Lower the decoding resolution by a power of two",
2237 OFFSET(reduction_factor), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, JPEG2000_MAX_RESLEVELS - 1, VD },
2241 static const AVClass jpeg2000_class = {
2242 .class_name = "jpeg2000",
2243 .item_name = av_default_item_name,
2245 .version = LIBAVUTIL_VERSION_INT,
2248 AVCodec ff_jpeg2000_decoder = {
2250 .long_name = NULL_IF_CONFIG_SMALL("JPEG 2000"),
2251 .type = AVMEDIA_TYPE_VIDEO,
2252 .id = AV_CODEC_ID_JPEG2000,
2253 .capabilities = AV_CODEC_CAP_SLICE_THREADS | AV_CODEC_CAP_FRAME_THREADS | AV_CODEC_CAP_DR1,
2254 .priv_data_size = sizeof(Jpeg2000DecoderContext),
2255 .init_static_data = jpeg2000_init_static_data,
2256 .init = jpeg2000_decode_init,
2257 .decode = jpeg2000_decode_frame,
2258 .priv_class = &jpeg2000_class,
2260 .profiles = NULL_IF_CONFIG_SMALL(ff_jpeg2000_profiles)