2 * JPEG 2000 image decoder
3 * Copyright (c) 2007 Kamil Nowosad
4 * Copyright (c) 2013 Nicolas Bertrand <nicoinattendu@gmail.com>
6 * This file is part of FFmpeg.
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 * JPEG 2000 image decoder
31 #include "libavutil/attributes.h"
32 #include "libavutil/avassert.h"
33 #include "libavutil/common.h"
34 #include "libavutil/imgutils.h"
35 #include "libavutil/opt.h"
36 #include "libavutil/pixdesc.h"
37 #include "libavutil/thread.h"
39 #include "bytestream.h"
43 #include "jpeg2000dsp.h"
46 #define JP2_SIG_TYPE 0x6A502020
47 #define JP2_SIG_VALUE 0x0D0A870A
48 #define JP2_CODESTREAM 0x6A703263
49 #define JP2_HEADER 0x6A703268
56 typedef struct Jpeg2000POCEntry {
65 typedef struct Jpeg2000POC {
66 Jpeg2000POCEntry poc[MAX_POCS];
71 typedef struct Jpeg2000TilePart {
72 uint8_t tile_index; // Tile index who refers the tile-part
73 const uint8_t *tp_end;
74 GetByteContext tpg; // bit stream in tile-part
77 /* RMK: For JPEG2000 DCINEMA 3 tile-parts in a tile
78 * one per component, so tile_part elements have a size of 3 */
79 typedef struct Jpeg2000Tile {
80 Jpeg2000Component *comp;
81 uint8_t properties[4];
82 Jpeg2000CodingStyle codsty[4];
83 Jpeg2000QuantStyle qntsty[4];
85 Jpeg2000TilePart tile_part[32];
86 uint16_t tp_idx; // Tile-part index
87 int coord[2][2]; // border coordinates {{x0, x1}, {y0, y1}}
90 typedef struct Jpeg2000DecoderContext {
92 AVCodecContext *avctx;
96 int image_offset_x, image_offset_y;
97 int tile_offset_x, tile_offset_y;
98 uint8_t cbps[4]; // bits per sample in particular components
99 uint8_t sgnd[4]; // if a component is signed
100 uint8_t properties[4];
105 uint32_t palette[256];
108 int tile_width, tile_height;
109 unsigned numXtiles, numYtiles;
113 Jpeg2000CodingStyle codsty[4];
114 Jpeg2000QuantStyle qntsty[4];
122 Jpeg2000DSPContext dsp;
124 /*options parameters*/
125 int reduction_factor;
126 } Jpeg2000DecoderContext;
128 /* get_bits functions for JPEG2000 packet bitstream
129 * It is a get_bit function with a bit-stuffing routine. If the value of the
130 * byte is 0xFF, the next byte includes an extra zero bit stuffed into the MSB.
131 * cf. ISO-15444-1:2002 / B.10.1 Bit-stuffing routine */
132 static int get_bits(Jpeg2000DecoderContext *s, int n)
138 if (s->bit_index == 0) {
139 s->bit_index = 7 + (bytestream2_get_byte(&s->g) != 0xFFu);
142 res |= (bytestream2_peek_byte(&s->g) >> s->bit_index) & 1;
147 static void jpeg2000_flush(Jpeg2000DecoderContext *s)
149 if (bytestream2_get_byte(&s->g) == 0xff)
150 bytestream2_skip(&s->g, 1);
154 /* decode the value stored in node */
155 static int tag_tree_decode(Jpeg2000DecoderContext *s, Jpeg2000TgtNode *node,
158 Jpeg2000TgtNode *stack[30];
159 int sp = -1, curval = 0;
162 av_log(s->avctx, AV_LOG_ERROR, "missing node\n");
163 return AVERROR_INVALIDDATA;
166 while (node && !node->vis) {
174 curval = stack[sp]->val;
176 while (curval < threshold && sp >= 0) {
177 if (curval < stack[sp]->val)
178 curval = stack[sp]->val;
179 while (curval < threshold) {
181 if ((ret = get_bits(s, 1)) > 0) {
189 stack[sp]->val = curval;
195 static int pix_fmt_match(enum AVPixelFormat pix_fmt, int components,
196 int bpc, uint32_t log2_chroma_wh, int pal8)
199 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
203 if (desc->nb_components != components) {
207 switch (components) {
209 match = match && desc->comp[3].depth >= bpc &&
210 (log2_chroma_wh >> 14 & 3) == 0 &&
211 (log2_chroma_wh >> 12 & 3) == 0;
213 match = match && desc->comp[2].depth >= bpc &&
214 (log2_chroma_wh >> 10 & 3) == desc->log2_chroma_w &&
215 (log2_chroma_wh >> 8 & 3) == desc->log2_chroma_h;
217 match = match && desc->comp[1].depth >= bpc &&
218 (log2_chroma_wh >> 6 & 3) == desc->log2_chroma_w &&
219 (log2_chroma_wh >> 4 & 3) == desc->log2_chroma_h;
222 match = match && desc->comp[0].depth >= bpc &&
223 (log2_chroma_wh >> 2 & 3) == 0 &&
224 (log2_chroma_wh & 3) == 0 &&
225 (desc->flags & AV_PIX_FMT_FLAG_PAL) == pal8 * AV_PIX_FMT_FLAG_PAL;
230 // pix_fmts with lower bpp have to be listed before
231 // similar pix_fmts with higher bpp.
232 #define RGB_PIXEL_FORMATS AV_PIX_FMT_PAL8,AV_PIX_FMT_RGB24,AV_PIX_FMT_RGBA,AV_PIX_FMT_RGB48,AV_PIX_FMT_RGBA64
233 #define GRAY_PIXEL_FORMATS AV_PIX_FMT_GRAY8,AV_PIX_FMT_GRAY8A,AV_PIX_FMT_GRAY16,AV_PIX_FMT_YA16
234 #define YUV_PIXEL_FORMATS AV_PIX_FMT_YUV410P,AV_PIX_FMT_YUV411P,AV_PIX_FMT_YUVA420P, \
235 AV_PIX_FMT_YUV420P,AV_PIX_FMT_YUV422P,AV_PIX_FMT_YUVA422P, \
236 AV_PIX_FMT_YUV440P,AV_PIX_FMT_YUV444P,AV_PIX_FMT_YUVA444P, \
237 AV_PIX_FMT_YUV420P9,AV_PIX_FMT_YUV422P9,AV_PIX_FMT_YUV444P9, \
238 AV_PIX_FMT_YUVA420P9,AV_PIX_FMT_YUVA422P9,AV_PIX_FMT_YUVA444P9, \
239 AV_PIX_FMT_YUV420P10,AV_PIX_FMT_YUV422P10,AV_PIX_FMT_YUV444P10, \
240 AV_PIX_FMT_YUVA420P10,AV_PIX_FMT_YUVA422P10,AV_PIX_FMT_YUVA444P10, \
241 AV_PIX_FMT_YUV420P12,AV_PIX_FMT_YUV422P12,AV_PIX_FMT_YUV444P12, \
242 AV_PIX_FMT_YUV420P14,AV_PIX_FMT_YUV422P14,AV_PIX_FMT_YUV444P14, \
243 AV_PIX_FMT_YUV420P16,AV_PIX_FMT_YUV422P16,AV_PIX_FMT_YUV444P16, \
244 AV_PIX_FMT_YUVA420P16,AV_PIX_FMT_YUVA422P16,AV_PIX_FMT_YUVA444P16
245 #define XYZ_PIXEL_FORMATS AV_PIX_FMT_XYZ12
247 static const enum AVPixelFormat rgb_pix_fmts[] = {RGB_PIXEL_FORMATS};
248 static const enum AVPixelFormat gray_pix_fmts[] = {GRAY_PIXEL_FORMATS};
249 static const enum AVPixelFormat yuv_pix_fmts[] = {YUV_PIXEL_FORMATS};
250 static const enum AVPixelFormat xyz_pix_fmts[] = {XYZ_PIXEL_FORMATS,
252 static const enum AVPixelFormat all_pix_fmts[] = {RGB_PIXEL_FORMATS,
257 /* marker segments */
258 /* get sizes and offsets of image, tiles; number of components */
259 static int get_siz(Jpeg2000DecoderContext *s)
263 uint32_t log2_chroma_wh = 0;
264 const enum AVPixelFormat *possible_fmts = NULL;
265 int possible_fmts_nb = 0;
268 if (bytestream2_get_bytes_left(&s->g) < 36) {
269 av_log(s->avctx, AV_LOG_ERROR, "Insufficient space for SIZ\n");
270 return AVERROR_INVALIDDATA;
273 s->avctx->profile = bytestream2_get_be16u(&s->g); // Rsiz
274 s->width = bytestream2_get_be32u(&s->g); // Width
275 s->height = bytestream2_get_be32u(&s->g); // Height
276 s->image_offset_x = bytestream2_get_be32u(&s->g); // X0Siz
277 s->image_offset_y = bytestream2_get_be32u(&s->g); // Y0Siz
278 s->tile_width = bytestream2_get_be32u(&s->g); // XTSiz
279 s->tile_height = bytestream2_get_be32u(&s->g); // YTSiz
280 s->tile_offset_x = bytestream2_get_be32u(&s->g); // XT0Siz
281 s->tile_offset_y = bytestream2_get_be32u(&s->g); // YT0Siz
282 ncomponents = bytestream2_get_be16u(&s->g); // CSiz
284 if (s->image_offset_x || s->image_offset_y) {
285 avpriv_request_sample(s->avctx, "Support for image offsets");
286 return AVERROR_PATCHWELCOME;
288 if (av_image_check_size2(s->width, s->height, s->avctx->max_pixels, AV_PIX_FMT_NONE, 0, s->avctx)) {
289 avpriv_request_sample(s->avctx, "Large Dimensions");
290 return AVERROR_PATCHWELCOME;
293 if (ncomponents <= 0) {
294 av_log(s->avctx, AV_LOG_ERROR, "Invalid number of components: %d\n",
296 return AVERROR_INVALIDDATA;
299 if (ncomponents > 4) {
300 avpriv_request_sample(s->avctx, "Support for %d components",
302 return AVERROR_PATCHWELCOME;
305 if (s->tile_offset_x < 0 || s->tile_offset_y < 0 ||
306 s->image_offset_x < s->tile_offset_x ||
307 s->image_offset_y < s->tile_offset_y ||
308 s->tile_width + (int64_t)s->tile_offset_x <= s->image_offset_x ||
309 s->tile_height + (int64_t)s->tile_offset_y <= s->image_offset_y
311 av_log(s->avctx, AV_LOG_ERROR, "Tile offsets are invalid\n");
312 return AVERROR_INVALIDDATA;
315 s->ncomponents = ncomponents;
317 if (s->tile_width <= 0 || s->tile_height <= 0) {
318 av_log(s->avctx, AV_LOG_ERROR, "Invalid tile dimension %dx%d.\n",
319 s->tile_width, s->tile_height);
320 return AVERROR_INVALIDDATA;
323 if (bytestream2_get_bytes_left(&s->g) < 3 * s->ncomponents) {
324 av_log(s->avctx, AV_LOG_ERROR, "Insufficient space for %d components in SIZ\n", s->ncomponents);
325 return AVERROR_INVALIDDATA;
328 for (i = 0; i < s->ncomponents; i++) { // Ssiz_i XRsiz_i, YRsiz_i
329 uint8_t x = bytestream2_get_byteu(&s->g);
330 s->cbps[i] = (x & 0x7f) + 1;
331 s->precision = FFMAX(s->cbps[i], s->precision);
332 s->sgnd[i] = !!(x & 0x80);
333 s->cdx[i] = bytestream2_get_byteu(&s->g);
334 s->cdy[i] = bytestream2_get_byteu(&s->g);
335 if ( !s->cdx[i] || s->cdx[i] == 3 || s->cdx[i] > 4
336 || !s->cdy[i] || s->cdy[i] == 3 || s->cdy[i] > 4) {
337 av_log(s->avctx, AV_LOG_ERROR, "Invalid sample separation %d/%d\n", s->cdx[i], s->cdy[i]);
338 return AVERROR_INVALIDDATA;
340 log2_chroma_wh |= s->cdy[i] >> 1 << i * 4 | s->cdx[i] >> 1 << i * 4 + 2;
343 s->numXtiles = ff_jpeg2000_ceildiv(s->width - s->tile_offset_x, s->tile_width);
344 s->numYtiles = ff_jpeg2000_ceildiv(s->height - s->tile_offset_y, s->tile_height);
346 // There must be at least a SOT and SOD per tile, their minimum size is 14
347 if (s->numXtiles * (uint64_t)s->numYtiles > INT_MAX/sizeof(*s->tile) ||
348 s->numXtiles * s->numYtiles * 14LL > bytestream2_size(&s->g)
350 s->numXtiles = s->numYtiles = 0;
351 return AVERROR(EINVAL);
354 s->tile = av_mallocz_array(s->numXtiles * s->numYtiles, sizeof(*s->tile));
356 s->numXtiles = s->numYtiles = 0;
357 return AVERROR(ENOMEM);
360 for (i = 0; i < s->numXtiles * s->numYtiles; i++) {
361 Jpeg2000Tile *tile = s->tile + i;
363 tile->comp = av_mallocz(s->ncomponents * sizeof(*tile->comp));
365 return AVERROR(ENOMEM);
368 /* compute image size with reduction factor */
369 ret = ff_set_dimensions(s->avctx,
370 ff_jpeg2000_ceildivpow2(s->width - s->image_offset_x,
371 s->reduction_factor),
372 ff_jpeg2000_ceildivpow2(s->height - s->image_offset_y,
373 s->reduction_factor));
377 if (s->avctx->profile == FF_PROFILE_JPEG2000_DCINEMA_2K ||
378 s->avctx->profile == FF_PROFILE_JPEG2000_DCINEMA_4K) {
379 possible_fmts = xyz_pix_fmts;
380 possible_fmts_nb = FF_ARRAY_ELEMS(xyz_pix_fmts);
382 switch (s->colour_space) {
384 possible_fmts = rgb_pix_fmts;
385 possible_fmts_nb = FF_ARRAY_ELEMS(rgb_pix_fmts);
388 possible_fmts = gray_pix_fmts;
389 possible_fmts_nb = FF_ARRAY_ELEMS(gray_pix_fmts);
392 possible_fmts = yuv_pix_fmts;
393 possible_fmts_nb = FF_ARRAY_ELEMS(yuv_pix_fmts);
396 possible_fmts = all_pix_fmts;
397 possible_fmts_nb = FF_ARRAY_ELEMS(all_pix_fmts);
401 for (i = 0; i < possible_fmts_nb; ++i) {
402 if (pix_fmt_match(possible_fmts[i], ncomponents, s->precision, log2_chroma_wh, s->pal8)) {
403 s->avctx->pix_fmt = possible_fmts[i];
408 if (i == possible_fmts_nb) {
409 if (ncomponents == 4 &&
410 s->cdy[0] == 1 && s->cdx[0] == 1 &&
411 s->cdy[1] == 1 && s->cdx[1] == 1 &&
412 s->cdy[2] == s->cdy[3] && s->cdx[2] == s->cdx[3]) {
413 if (s->precision == 8 && s->cdy[2] == 2 && s->cdx[2] == 2 && !s->pal8) {
414 s->avctx->pix_fmt = AV_PIX_FMT_YUVA420P;
425 if (i == possible_fmts_nb) {
426 av_log(s->avctx, AV_LOG_ERROR,
427 "Unknown pix_fmt, profile: %d, colour_space: %d, "
428 "components: %d, precision: %d\n"
429 "cdx[0]: %d, cdy[0]: %d\n"
430 "cdx[1]: %d, cdy[1]: %d\n"
431 "cdx[2]: %d, cdy[2]: %d\n"
432 "cdx[3]: %d, cdy[3]: %d\n",
433 s->avctx->profile, s->colour_space, ncomponents, s->precision,
436 ncomponents > 1 ? s->cdx[1] : 0,
437 ncomponents > 1 ? s->cdy[1] : 0,
438 ncomponents > 2 ? s->cdx[2] : 0,
439 ncomponents > 2 ? s->cdy[2] : 0,
440 ncomponents > 3 ? s->cdx[3] : 0,
441 ncomponents > 3 ? s->cdy[3] : 0);
442 return AVERROR_PATCHWELCOME;
444 s->avctx->bits_per_raw_sample = s->precision;
448 /* get common part for COD and COC segments */
449 static int get_cox(Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *c)
453 if (bytestream2_get_bytes_left(&s->g) < 5) {
454 av_log(s->avctx, AV_LOG_ERROR, "Insufficient space for COX\n");
455 return AVERROR_INVALIDDATA;
458 /* nreslevels = number of resolution levels
459 = number of decomposition level +1 */
460 c->nreslevels = bytestream2_get_byteu(&s->g) + 1;
461 if (c->nreslevels >= JPEG2000_MAX_RESLEVELS) {
462 av_log(s->avctx, AV_LOG_ERROR, "nreslevels %d is invalid\n", c->nreslevels);
463 return AVERROR_INVALIDDATA;
466 if (c->nreslevels <= s->reduction_factor) {
467 /* we are forced to update reduction_factor as its requested value is
468 not compatible with this bitstream, and as we might have used it
469 already in setup earlier we have to fail this frame until
470 reinitialization is implemented */
471 av_log(s->avctx, AV_LOG_ERROR, "reduction_factor too large for this bitstream, max is %d\n", c->nreslevels - 1);
472 s->reduction_factor = c->nreslevels - 1;
473 return AVERROR(EINVAL);
476 /* compute number of resolution levels to decode */
477 c->nreslevels2decode = c->nreslevels - s->reduction_factor;
479 c->log2_cblk_width = (bytestream2_get_byteu(&s->g) & 15) + 2; // cblk width
480 c->log2_cblk_height = (bytestream2_get_byteu(&s->g) & 15) + 2; // cblk height
482 if (c->log2_cblk_width > 10 || c->log2_cblk_height > 10 ||
483 c->log2_cblk_width + c->log2_cblk_height > 12) {
484 av_log(s->avctx, AV_LOG_ERROR, "cblk size invalid\n");
485 return AVERROR_INVALIDDATA;
488 c->cblk_style = bytestream2_get_byteu(&s->g);
489 if (c->cblk_style != 0) { // cblk style
490 av_log(s->avctx, AV_LOG_WARNING, "extra cblk styles %X\n", c->cblk_style);
491 if (c->cblk_style & JPEG2000_CBLK_BYPASS)
492 av_log(s->avctx, AV_LOG_WARNING, "Selective arithmetic coding bypass\n");
494 c->transform = bytestream2_get_byteu(&s->g); // DWT transformation type
495 /* set integer 9/7 DWT in case of BITEXACT flag */
496 if ((s->avctx->flags & AV_CODEC_FLAG_BITEXACT) && (c->transform == FF_DWT97))
497 c->transform = FF_DWT97_INT;
498 else if (c->transform == FF_DWT53) {
499 s->avctx->properties |= FF_CODEC_PROPERTY_LOSSLESS;
502 if (c->csty & JPEG2000_CSTY_PREC) {
504 for (i = 0; i < c->nreslevels; i++) {
505 byte = bytestream2_get_byte(&s->g);
506 c->log2_prec_widths[i] = byte & 0x0F; // precinct PPx
507 c->log2_prec_heights[i] = (byte >> 4) & 0x0F; // precinct PPy
509 if (c->log2_prec_widths[i] == 0 || c->log2_prec_heights[i] == 0) {
510 av_log(s->avctx, AV_LOG_ERROR, "PPx %d PPy %d invalid\n",
511 c->log2_prec_widths[i], c->log2_prec_heights[i]);
512 c->log2_prec_widths[i] = c->log2_prec_heights[i] = 1;
513 return AVERROR_INVALIDDATA;
517 memset(c->log2_prec_widths , 15, sizeof(c->log2_prec_widths ));
518 memset(c->log2_prec_heights, 15, sizeof(c->log2_prec_heights));
523 /* get coding parameters for a particular tile or whole image*/
524 static int get_cod(Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *c,
527 Jpeg2000CodingStyle tmp;
530 if (bytestream2_get_bytes_left(&s->g) < 5) {
531 av_log(s->avctx, AV_LOG_ERROR, "Insufficient space for COD\n");
532 return AVERROR_INVALIDDATA;
535 tmp.csty = bytestream2_get_byteu(&s->g);
537 // get progression order
538 tmp.prog_order = bytestream2_get_byteu(&s->g);
540 tmp.nlayers = bytestream2_get_be16u(&s->g);
541 tmp.mct = bytestream2_get_byteu(&s->g); // multiple component transformation
543 if (tmp.mct && s->ncomponents < 3) {
544 av_log(s->avctx, AV_LOG_ERROR,
545 "MCT %"PRIu8" with too few components (%d)\n",
546 tmp.mct, s->ncomponents);
547 return AVERROR_INVALIDDATA;
550 if ((ret = get_cox(s, &tmp)) < 0)
553 for (compno = 0; compno < s->ncomponents; compno++)
554 if (!(properties[compno] & HAD_COC))
555 memcpy(c + compno, &tmp, sizeof(tmp));
559 /* Get coding parameters for a component in the whole image or a
560 * particular tile. */
561 static int get_coc(Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *c,
566 if (bytestream2_get_bytes_left(&s->g) < 2) {
567 av_log(s->avctx, AV_LOG_ERROR, "Insufficient space for COC\n");
568 return AVERROR_INVALIDDATA;
571 compno = bytestream2_get_byteu(&s->g);
573 if (compno >= s->ncomponents) {
574 av_log(s->avctx, AV_LOG_ERROR,
575 "Invalid compno %d. There are %d components in the image.\n",
576 compno, s->ncomponents);
577 return AVERROR_INVALIDDATA;
581 c->csty = bytestream2_get_byteu(&s->g);
583 if ((ret = get_cox(s, c)) < 0)
586 properties[compno] |= HAD_COC;
590 /* Get common part for QCD and QCC segments. */
591 static int get_qcx(Jpeg2000DecoderContext *s, int n, Jpeg2000QuantStyle *q)
595 if (bytestream2_get_bytes_left(&s->g) < 1)
596 return AVERROR_INVALIDDATA;
598 x = bytestream2_get_byteu(&s->g); // Sqcd
600 q->nguardbits = x >> 5;
601 q->quantsty = x & 0x1f;
603 if (q->quantsty == JPEG2000_QSTY_NONE) {
605 if (bytestream2_get_bytes_left(&s->g) < n ||
606 n > JPEG2000_MAX_DECLEVELS*3)
607 return AVERROR_INVALIDDATA;
608 for (i = 0; i < n; i++)
609 q->expn[i] = bytestream2_get_byteu(&s->g) >> 3;
610 } else if (q->quantsty == JPEG2000_QSTY_SI) {
611 if (bytestream2_get_bytes_left(&s->g) < 2)
612 return AVERROR_INVALIDDATA;
613 x = bytestream2_get_be16u(&s->g);
614 q->expn[0] = x >> 11;
615 q->mant[0] = x & 0x7ff;
616 for (i = 1; i < JPEG2000_MAX_DECLEVELS * 3; i++) {
617 int curexpn = FFMAX(0, q->expn[0] - (i - 1) / 3);
618 q->expn[i] = curexpn;
619 q->mant[i] = q->mant[0];
623 if (bytestream2_get_bytes_left(&s->g) < 2 * n ||
624 n > JPEG2000_MAX_DECLEVELS*3)
625 return AVERROR_INVALIDDATA;
626 for (i = 0; i < n; i++) {
627 x = bytestream2_get_be16u(&s->g);
628 q->expn[i] = x >> 11;
629 q->mant[i] = x & 0x7ff;
635 /* Get quantization parameters for a particular tile or a whole image. */
636 static int get_qcd(Jpeg2000DecoderContext *s, int n, Jpeg2000QuantStyle *q,
639 Jpeg2000QuantStyle tmp;
642 memset(&tmp, 0, sizeof(tmp));
644 if ((ret = get_qcx(s, n, &tmp)) < 0)
646 for (compno = 0; compno < s->ncomponents; compno++)
647 if (!(properties[compno] & HAD_QCC))
648 memcpy(q + compno, &tmp, sizeof(tmp));
652 /* Get quantization parameters for a component in the whole image
653 * on in a particular tile. */
654 static int get_qcc(Jpeg2000DecoderContext *s, int n, Jpeg2000QuantStyle *q,
659 if (bytestream2_get_bytes_left(&s->g) < 1)
660 return AVERROR_INVALIDDATA;
662 compno = bytestream2_get_byteu(&s->g);
664 if (compno >= s->ncomponents) {
665 av_log(s->avctx, AV_LOG_ERROR,
666 "Invalid compno %d. There are %d components in the image.\n",
667 compno, s->ncomponents);
668 return AVERROR_INVALIDDATA;
671 properties[compno] |= HAD_QCC;
672 return get_qcx(s, n - 1, q + compno);
675 static int get_poc(Jpeg2000DecoderContext *s, int size, Jpeg2000POC *p)
678 int elem_size = s->ncomponents <= 257 ? 7 : 9;
679 Jpeg2000POC tmp = {{{0}}};
681 if (bytestream2_get_bytes_left(&s->g) < 5 || size < 2 + elem_size) {
682 av_log(s->avctx, AV_LOG_ERROR, "Insufficient space for POC\n");
683 return AVERROR_INVALIDDATA;
687 avpriv_request_sample(s->avctx, "Fat POC not supported");
688 return AVERROR_PATCHWELCOME;
691 tmp.nb_poc = (size - 2) / elem_size;
692 if (tmp.nb_poc > MAX_POCS) {
693 avpriv_request_sample(s->avctx, "Too many POCs (%d)", tmp.nb_poc);
694 return AVERROR_PATCHWELCOME;
697 for (i = 0; i<tmp.nb_poc; i++) {
698 Jpeg2000POCEntry *e = &tmp.poc[i];
699 e->RSpoc = bytestream2_get_byteu(&s->g);
700 e->CSpoc = bytestream2_get_byteu(&s->g);
701 e->LYEpoc = bytestream2_get_be16u(&s->g);
702 e->REpoc = bytestream2_get_byteu(&s->g);
703 e->CEpoc = bytestream2_get_byteu(&s->g);
704 e->Ppoc = bytestream2_get_byteu(&s->g);
707 if (e->CEpoc > s->ncomponents)
708 e->CEpoc = s->ncomponents;
709 if ( e->RSpoc >= e->REpoc || e->REpoc > 33
710 || e->CSpoc >= e->CEpoc || e->CEpoc > s->ncomponents
712 av_log(s->avctx, AV_LOG_ERROR, "POC Entry %d is invalid (%d, %d, %d, %d, %d, %d)\n", i,
713 e->RSpoc, e->CSpoc, e->LYEpoc, e->REpoc, e->CEpoc, e->Ppoc
715 return AVERROR_INVALIDDATA;
719 if (!p->nb_poc || p->is_default) {
722 if (p->nb_poc + tmp.nb_poc > MAX_POCS) {
723 av_log(s->avctx, AV_LOG_ERROR, "Insufficient space for POC\n");
724 return AVERROR_INVALIDDATA;
726 memcpy(p->poc + p->nb_poc, tmp.poc, tmp.nb_poc * sizeof(tmp.poc[0]));
727 p->nb_poc += tmp.nb_poc;
736 /* Get start of tile segment. */
737 static int get_sot(Jpeg2000DecoderContext *s, int n)
739 Jpeg2000TilePart *tp;
744 if (bytestream2_get_bytes_left(&s->g) < 8)
745 return AVERROR_INVALIDDATA;
748 Isot = bytestream2_get_be16u(&s->g); // Isot
749 if (Isot >= s->numXtiles * s->numYtiles)
750 return AVERROR_INVALIDDATA;
753 Psot = bytestream2_get_be32u(&s->g); // Psot
754 TPsot = bytestream2_get_byteu(&s->g); // TPsot
756 /* Read TNSot but not used */
757 bytestream2_get_byteu(&s->g); // TNsot
760 Psot = bytestream2_get_bytes_left(&s->g) - 2 + n + 2;
762 if (Psot > bytestream2_get_bytes_left(&s->g) - 2 + n + 2) {
763 av_log(s->avctx, AV_LOG_ERROR, "Psot %"PRIu32" too big\n", Psot);
764 return AVERROR_INVALIDDATA;
767 if (TPsot >= FF_ARRAY_ELEMS(s->tile[Isot].tile_part)) {
768 avpriv_request_sample(s->avctx, "Too many tile parts");
769 return AVERROR_PATCHWELCOME;
772 s->tile[Isot].tp_idx = TPsot;
773 tp = s->tile[Isot].tile_part + TPsot;
774 tp->tile_index = Isot;
775 tp->tp_end = s->g.buffer + Psot - n - 2;
778 Jpeg2000Tile *tile = s->tile + s->curtileno;
781 memcpy(tile->codsty, s->codsty, s->ncomponents * sizeof(Jpeg2000CodingStyle));
782 memcpy(tile->qntsty, s->qntsty, s->ncomponents * sizeof(Jpeg2000QuantStyle));
783 memcpy(&tile->poc , &s->poc , sizeof(tile->poc));
784 tile->poc.is_default = 1;
790 /* Tile-part lengths: see ISO 15444-1:2002, section A.7.1
791 * Used to know the number of tile parts and lengths.
792 * There may be multiple TLMs in the header.
793 * TODO: The function is not used for tile-parts management, nor anywhere else.
794 * It can be useful to allocate memory for tile parts, before managing the SOT
795 * markers. Parsing the TLM header is needed to increment the input header
797 * This marker is mandatory for DCI. */
798 static int get_tlm(Jpeg2000DecoderContext *s, int n)
800 uint8_t Stlm, ST, SP, tile_tlm, i;
801 bytestream2_get_byte(&s->g); /* Ztlm: skipped */
802 Stlm = bytestream2_get_byte(&s->g);
804 // too complex ? ST = ((Stlm >> 4) & 0x01) + ((Stlm >> 4) & 0x02);
805 ST = (Stlm >> 4) & 0x03;
807 av_log(s->avctx, AV_LOG_ERROR, "TLM marker contains invalid ST value.\n");
808 return AVERROR_INVALIDDATA;
811 SP = (Stlm >> 6) & 0x01;
812 tile_tlm = (n - 4) / ((SP + 1) * 2 + ST);
813 for (i = 0; i < tile_tlm; i++) {
818 bytestream2_get_byte(&s->g);
821 bytestream2_get_be16(&s->g);
824 bytestream2_get_be32(&s->g);
828 bytestream2_get_be16(&s->g);
830 bytestream2_get_be32(&s->g);
836 static int get_plt(Jpeg2000DecoderContext *s, int n)
841 av_log(s->avctx, AV_LOG_DEBUG,
842 "PLT marker at pos 0x%X\n", bytestream2_tell(&s->g) - 4);
845 return AVERROR_INVALIDDATA;
847 /*Zplt =*/ bytestream2_get_byte(&s->g);
849 for (i = 0; i < n - 3; i++) {
850 v = bytestream2_get_byte(&s->g);
853 return AVERROR_INVALIDDATA;
858 static int init_tile(Jpeg2000DecoderContext *s, int tileno)
861 int tilex = tileno % s->numXtiles;
862 int tiley = tileno / s->numXtiles;
863 Jpeg2000Tile *tile = s->tile + tileno;
866 return AVERROR(ENOMEM);
868 tile->coord[0][0] = av_clip(tilex * (int64_t)s->tile_width + s->tile_offset_x, s->image_offset_x, s->width);
869 tile->coord[0][1] = av_clip((tilex + 1) * (int64_t)s->tile_width + s->tile_offset_x, s->image_offset_x, s->width);
870 tile->coord[1][0] = av_clip(tiley * (int64_t)s->tile_height + s->tile_offset_y, s->image_offset_y, s->height);
871 tile->coord[1][1] = av_clip((tiley + 1) * (int64_t)s->tile_height + s->tile_offset_y, s->image_offset_y, s->height);
873 for (compno = 0; compno < s->ncomponents; compno++) {
874 Jpeg2000Component *comp = tile->comp + compno;
875 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
876 Jpeg2000QuantStyle *qntsty = tile->qntsty + compno;
877 int ret; // global bandno
879 comp->coord_o[0][0] = tile->coord[0][0];
880 comp->coord_o[0][1] = tile->coord[0][1];
881 comp->coord_o[1][0] = tile->coord[1][0];
882 comp->coord_o[1][1] = tile->coord[1][1];
884 comp->coord_o[0][0] /= s->cdx[compno];
885 comp->coord_o[0][1] /= s->cdx[compno];
886 comp->coord_o[1][0] /= s->cdy[compno];
887 comp->coord_o[1][1] /= s->cdy[compno];
890 comp->coord[0][0] = ff_jpeg2000_ceildivpow2(comp->coord_o[0][0], s->reduction_factor);
891 comp->coord[0][1] = ff_jpeg2000_ceildivpow2(comp->coord_o[0][1], s->reduction_factor);
892 comp->coord[1][0] = ff_jpeg2000_ceildivpow2(comp->coord_o[1][0], s->reduction_factor);
893 comp->coord[1][1] = ff_jpeg2000_ceildivpow2(comp->coord_o[1][1], s->reduction_factor);
895 if (ret = ff_jpeg2000_init_component(comp, codsty, qntsty,
896 s->cbps[compno], s->cdx[compno],
897 s->cdy[compno], s->avctx))
903 /* Read the number of coding passes. */
904 static int getnpasses(Jpeg2000DecoderContext *s)
911 if ((num = get_bits(s, 2)) != 3)
912 return num < 0 ? num : 3 + num;
913 if ((num = get_bits(s, 5)) != 31)
914 return num < 0 ? num : 6 + num;
915 num = get_bits(s, 7);
916 return num < 0 ? num : 37 + num;
919 static int getlblockinc(Jpeg2000DecoderContext *s)
922 while (ret = get_bits(s, 1)) {
930 static int jpeg2000_decode_packet(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile, int *tp_index,
931 Jpeg2000CodingStyle *codsty,
932 Jpeg2000ResLevel *rlevel, int precno,
933 int layno, uint8_t *expn, int numgbits)
935 int bandno, cblkno, ret, nb_code_blocks;
938 if (layno < rlevel->band[0].prec[precno].decoded_layers)
940 rlevel->band[0].prec[precno].decoded_layers = layno + 1;
942 if (bytestream2_get_bytes_left(&s->g) == 0 && s->bit_index == 8) {
943 if (*tp_index < FF_ARRAY_ELEMS(tile->tile_part) - 1) {
944 s->g = tile->tile_part[++(*tp_index)].tpg;
948 if (bytestream2_peek_be32(&s->g) == JPEG2000_SOP_FIXED_BYTES)
949 bytestream2_skip(&s->g, JPEG2000_SOP_BYTE_LENGTH);
951 if (!(ret = get_bits(s, 1))) {
957 for (bandno = 0; bandno < rlevel->nbands; bandno++) {
958 Jpeg2000Band *band = rlevel->band + bandno;
959 Jpeg2000Prec *prec = band->prec + precno;
961 if (band->coord[0][0] == band->coord[0][1] ||
962 band->coord[1][0] == band->coord[1][1])
964 nb_code_blocks = prec->nb_codeblocks_height *
965 prec->nb_codeblocks_width;
966 for (cblkno = 0; cblkno < nb_code_blocks; cblkno++) {
967 Jpeg2000Cblk *cblk = prec->cblk + cblkno;
968 int incl, newpasses, llen;
972 incl = get_bits(s, 1);
974 incl = tag_tree_decode(s, prec->cblkincl + cblkno, layno + 1) == layno;
980 if (!cblk->npasses) {
981 int v = expn[bandno] + numgbits - 1 -
982 tag_tree_decode(s, prec->zerobits + cblkno, 100);
983 if (v < 0 || v > 30) {
984 av_log(s->avctx, AV_LOG_ERROR,
985 "nonzerobits %d invalid or unsupported\n", v);
986 return AVERROR_INVALIDDATA;
988 cblk->nonzerobits = v;
990 if ((newpasses = getnpasses(s)) < 0)
992 av_assert2(newpasses > 0);
993 if (cblk->npasses + newpasses >= JPEG2000_MAX_PASSES) {
994 avpriv_request_sample(s->avctx, "Too many passes");
995 return AVERROR_PATCHWELCOME;
997 if ((llen = getlblockinc(s)) < 0)
999 if (cblk->lblock + llen + av_log2(newpasses) > 16) {
1000 avpriv_request_sample(s->avctx,
1001 "Block with length beyond 16 bits");
1002 return AVERROR_PATCHWELCOME;
1005 cblk->lblock += llen;
1007 cblk->nb_lengthinc = 0;
1008 cblk->nb_terminationsinc = 0;
1009 av_free(cblk->lengthinc);
1010 cblk->lengthinc = av_mallocz_array(newpasses , sizeof(*cblk->lengthinc));
1011 if (!cblk->lengthinc)
1012 return AVERROR(ENOMEM);
1013 tmp = av_realloc_array(cblk->data_start, cblk->nb_terminations + newpasses + 1, sizeof(*cblk->data_start));
1015 return AVERROR(ENOMEM);
1016 cblk->data_start = tmp;
1020 while (newpasses1 < newpasses) {
1022 if (needs_termination(codsty->cblk_style, cblk->npasses + newpasses1 - 1)) {
1023 cblk->nb_terminationsinc ++;
1028 if ((ret = get_bits(s, av_log2(newpasses1) + cblk->lblock)) < 0)
1030 if (ret > cblk->data_allocated) {
1031 size_t new_size = FFMAX(2*cblk->data_allocated, ret);
1032 void *new = av_realloc(cblk->data, new_size);
1035 cblk->data_allocated = new_size;
1038 if (ret > cblk->data_allocated) {
1039 avpriv_request_sample(s->avctx,
1040 "Block with lengthinc greater than %"SIZE_SPECIFIER"",
1041 cblk->data_allocated);
1042 return AVERROR_PATCHWELCOME;
1044 cblk->lengthinc[cblk->nb_lengthinc++] = ret;
1045 cblk->npasses += newpasses1;
1046 newpasses -= newpasses1;
1052 if (codsty->csty & JPEG2000_CSTY_EPH) {
1053 if (bytestream2_peek_be16(&s->g) == JPEG2000_EPH)
1054 bytestream2_skip(&s->g, 2);
1056 av_log(s->avctx, AV_LOG_ERROR, "EPH marker not found. instead %X\n", bytestream2_peek_be32(&s->g));
1059 for (bandno = 0; bandno < rlevel->nbands; bandno++) {
1060 Jpeg2000Band *band = rlevel->band + bandno;
1061 Jpeg2000Prec *prec = band->prec + precno;
1063 nb_code_blocks = prec->nb_codeblocks_height * prec->nb_codeblocks_width;
1064 for (cblkno = 0; cblkno < nb_code_blocks; cblkno++) {
1065 Jpeg2000Cblk *cblk = prec->cblk + cblkno;
1066 if (!cblk->nb_terminationsinc && !cblk->lengthinc)
1068 for (cwsno = 0; cwsno < cblk->nb_lengthinc; cwsno ++) {
1069 if (cblk->data_allocated < cblk->length + cblk->lengthinc[cwsno] + 4) {
1070 size_t new_size = FFMAX(2*cblk->data_allocated, cblk->length + cblk->lengthinc[cwsno] + 4);
1071 void *new = av_realloc(cblk->data, new_size);
1074 cblk->data_allocated = new_size;
1077 if ( bytestream2_get_bytes_left(&s->g) < cblk->lengthinc[cwsno]
1078 || cblk->data_allocated < cblk->length + cblk->lengthinc[cwsno] + 4
1080 av_log(s->avctx, AV_LOG_ERROR,
1081 "Block length %"PRIu16" or lengthinc %d is too large, left %d\n",
1082 cblk->length, cblk->lengthinc[cwsno], bytestream2_get_bytes_left(&s->g));
1083 return AVERROR_INVALIDDATA;
1086 bytestream2_get_bufferu(&s->g, cblk->data + cblk->length, cblk->lengthinc[cwsno]);
1087 cblk->length += cblk->lengthinc[cwsno];
1088 cblk->lengthinc[cwsno] = 0;
1089 if (cblk->nb_terminationsinc) {
1090 cblk->nb_terminationsinc--;
1091 cblk->nb_terminations++;
1092 cblk->data[cblk->length++] = 0xFF;
1093 cblk->data[cblk->length++] = 0xFF;
1094 cblk->data_start[cblk->nb_terminations] = cblk->length;
1097 av_freep(&cblk->lengthinc);
1103 static int jpeg2000_decode_packets_po_iteration(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile,
1104 int RSpoc, int CSpoc,
1105 int LYEpoc, int REpoc, int CEpoc,
1106 int Ppoc, int *tp_index)
1109 int layno, reslevelno, compno, precno, ok_reslevel;
1114 case JPEG2000_PGOD_RLCP:
1115 av_log(s->avctx, AV_LOG_DEBUG, "Progression order RLCP\n");
1117 for (reslevelno = RSpoc; ok_reslevel && reslevelno < REpoc; reslevelno++) {
1119 for (layno = 0; layno < LYEpoc; layno++) {
1120 for (compno = CSpoc; compno < CEpoc; compno++) {
1121 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1122 Jpeg2000QuantStyle *qntsty = tile->qntsty + compno;
1123 if (reslevelno < codsty->nreslevels) {
1124 Jpeg2000ResLevel *rlevel = tile->comp[compno].reslevel +
1127 for (precno = 0; precno < rlevel->num_precincts_x * rlevel->num_precincts_y; precno++)
1128 if ((ret = jpeg2000_decode_packet(s, tile, tp_index,
1131 qntsty->expn + (reslevelno ? 3 * (reslevelno - 1) + 1 : 0),
1132 qntsty->nguardbits)) < 0)
1140 case JPEG2000_PGOD_LRCP:
1141 av_log(s->avctx, AV_LOG_DEBUG, "Progression order LRCP\n");
1142 for (layno = 0; layno < LYEpoc; layno++) {
1144 for (reslevelno = RSpoc; ok_reslevel && reslevelno < REpoc; reslevelno++) {
1146 for (compno = CSpoc; compno < CEpoc; compno++) {
1147 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1148 Jpeg2000QuantStyle *qntsty = tile->qntsty + compno;
1149 if (reslevelno < codsty->nreslevels) {
1150 Jpeg2000ResLevel *rlevel = tile->comp[compno].reslevel +
1153 for (precno = 0; precno < rlevel->num_precincts_x * rlevel->num_precincts_y; precno++)
1154 if ((ret = jpeg2000_decode_packet(s, tile, tp_index,
1157 qntsty->expn + (reslevelno ? 3 * (reslevelno - 1) + 1 : 0),
1158 qntsty->nguardbits)) < 0)
1166 case JPEG2000_PGOD_CPRL:
1167 av_log(s->avctx, AV_LOG_DEBUG, "Progression order CPRL\n");
1168 for (compno = CSpoc; compno < CEpoc; compno++) {
1169 Jpeg2000Component *comp = tile->comp + compno;
1170 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1171 Jpeg2000QuantStyle *qntsty = tile->qntsty + compno;
1175 if (RSpoc >= FFMIN(codsty->nreslevels, REpoc))
1178 for (reslevelno = RSpoc; reslevelno < FFMIN(codsty->nreslevels, REpoc); reslevelno++) {
1179 uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; // ==> N_L - r
1180 Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
1181 step_x = FFMIN(step_x, rlevel->log2_prec_width + reducedresno);
1182 step_y = FFMIN(step_y, rlevel->log2_prec_height + reducedresno);
1184 if (step_x >= 31 || step_y >= 31){
1185 avpriv_request_sample(s->avctx, "CPRL with large step");
1186 return AVERROR_PATCHWELCOME;
1191 for (y = tile->coord[1][0]; y < tile->coord[1][1]; y = (y/step_y + 1)*step_y) {
1192 for (x = tile->coord[0][0]; x < tile->coord[0][1]; x = (x/step_x + 1)*step_x) {
1193 for (reslevelno = RSpoc; reslevelno < FFMIN(codsty->nreslevels, REpoc); reslevelno++) {
1194 unsigned prcx, prcy;
1195 uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; // ==> N_L - r
1196 Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
1197 int xc = x / s->cdx[compno];
1198 int yc = y / s->cdy[compno];
1200 if (yc % (1LL << (rlevel->log2_prec_height + reducedresno)) && y != tile->coord[1][0]) //FIXME this is a subset of the check
1203 if (xc % (1LL << (rlevel->log2_prec_width + reducedresno)) && x != tile->coord[0][0]) //FIXME this is a subset of the check
1206 // check if a precinct exists
1207 prcx = ff_jpeg2000_ceildivpow2(xc, reducedresno) >> rlevel->log2_prec_width;
1208 prcy = ff_jpeg2000_ceildivpow2(yc, reducedresno) >> rlevel->log2_prec_height;
1209 prcx -= ff_jpeg2000_ceildivpow2(comp->coord_o[0][0], reducedresno) >> rlevel->log2_prec_width;
1210 prcy -= ff_jpeg2000_ceildivpow2(comp->coord_o[1][0], reducedresno) >> rlevel->log2_prec_height;
1212 precno = prcx + rlevel->num_precincts_x * prcy;
1214 if (prcx >= rlevel->num_precincts_x || prcy >= rlevel->num_precincts_y) {
1215 av_log(s->avctx, AV_LOG_WARNING, "prc %d %d outside limits %d %d\n",
1216 prcx, prcy, rlevel->num_precincts_x, rlevel->num_precincts_y);
1220 for (layno = 0; layno < LYEpoc; layno++) {
1221 if ((ret = jpeg2000_decode_packet(s, tile, tp_index, codsty, rlevel,
1223 qntsty->expn + (reslevelno ? 3 * (reslevelno - 1) + 1 : 0),
1224 qntsty->nguardbits)) < 0)
1233 case JPEG2000_PGOD_RPCL:
1234 av_log(s->avctx, AV_LOG_WARNING, "Progression order RPCL\n");
1236 for (reslevelno = RSpoc; ok_reslevel && reslevelno < REpoc; reslevelno++) {
1240 for (compno = CSpoc; compno < CEpoc; compno++) {
1241 Jpeg2000Component *comp = tile->comp + compno;
1242 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1244 if (reslevelno < codsty->nreslevels) {
1245 uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; // ==> N_L - r
1246 Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
1247 step_x = FFMIN(step_x, rlevel->log2_prec_width + reducedresno);
1248 step_y = FFMIN(step_y, rlevel->log2_prec_height + reducedresno);
1254 for (y = tile->coord[1][0]; y < tile->coord[1][1]; y = (y/step_y + 1)*step_y) {
1255 for (x = tile->coord[0][0]; x < tile->coord[0][1]; x = (x/step_x + 1)*step_x) {
1256 for (compno = CSpoc; compno < CEpoc; compno++) {
1257 Jpeg2000Component *comp = tile->comp + compno;
1258 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1259 Jpeg2000QuantStyle *qntsty = tile->qntsty + compno;
1260 uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; // ==> N_L - r
1261 Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
1262 unsigned prcx, prcy;
1264 int xc = x / s->cdx[compno];
1265 int yc = y / s->cdy[compno];
1267 if (reslevelno >= codsty->nreslevels)
1270 if (yc % (1LL << (rlevel->log2_prec_height + reducedresno)) && y != tile->coord[1][0]) //FIXME this is a subset of the check
1273 if (xc % (1LL << (rlevel->log2_prec_width + reducedresno)) && x != tile->coord[0][0]) //FIXME this is a subset of the check
1276 // check if a precinct exists
1277 prcx = ff_jpeg2000_ceildivpow2(xc, reducedresno) >> rlevel->log2_prec_width;
1278 prcy = ff_jpeg2000_ceildivpow2(yc, reducedresno) >> rlevel->log2_prec_height;
1279 prcx -= ff_jpeg2000_ceildivpow2(comp->coord_o[0][0], reducedresno) >> rlevel->log2_prec_width;
1280 prcy -= ff_jpeg2000_ceildivpow2(comp->coord_o[1][0], reducedresno) >> rlevel->log2_prec_height;
1282 precno = prcx + rlevel->num_precincts_x * prcy;
1285 if (prcx >= rlevel->num_precincts_x || prcy >= rlevel->num_precincts_y) {
1286 av_log(s->avctx, AV_LOG_WARNING, "prc %d %d outside limits %d %d\n",
1287 prcx, prcy, rlevel->num_precincts_x, rlevel->num_precincts_y);
1291 for (layno = 0; layno < LYEpoc; layno++) {
1292 if ((ret = jpeg2000_decode_packet(s, tile, tp_index,
1295 qntsty->expn + (reslevelno ? 3 * (reslevelno - 1) + 1 : 0),
1296 qntsty->nguardbits)) < 0)
1305 case JPEG2000_PGOD_PCRL:
1306 av_log(s->avctx, AV_LOG_WARNING, "Progression order PCRL\n");
1309 for (compno = CSpoc; compno < CEpoc; compno++) {
1310 Jpeg2000Component *comp = tile->comp + compno;
1311 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1313 for (reslevelno = RSpoc; reslevelno < FFMIN(codsty->nreslevels, REpoc); reslevelno++) {
1314 uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; // ==> N_L - r
1315 Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
1316 step_x = FFMIN(step_x, rlevel->log2_prec_width + reducedresno);
1317 step_y = FFMIN(step_y, rlevel->log2_prec_height + reducedresno);
1320 if (step_x >= 31 || step_y >= 31){
1321 avpriv_request_sample(s->avctx, "PCRL with large step");
1322 return AVERROR_PATCHWELCOME;
1327 for (y = tile->coord[1][0]; y < tile->coord[1][1]; y = (y/step_y + 1)*step_y) {
1328 for (x = tile->coord[0][0]; x < tile->coord[0][1]; x = (x/step_x + 1)*step_x) {
1329 for (compno = CSpoc; compno < CEpoc; compno++) {
1330 Jpeg2000Component *comp = tile->comp + compno;
1331 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1332 Jpeg2000QuantStyle *qntsty = tile->qntsty + compno;
1333 int xc = x / s->cdx[compno];
1334 int yc = y / s->cdy[compno];
1336 for (reslevelno = RSpoc; reslevelno < FFMIN(codsty->nreslevels, REpoc); reslevelno++) {
1337 unsigned prcx, prcy;
1338 uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; // ==> N_L - r
1339 Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
1341 if (yc % (1LL << (rlevel->log2_prec_height + reducedresno)) && y != tile->coord[1][0]) //FIXME this is a subset of the check
1344 if (xc % (1LL << (rlevel->log2_prec_width + reducedresno)) && x != tile->coord[0][0]) //FIXME this is a subset of the check
1347 // check if a precinct exists
1348 prcx = ff_jpeg2000_ceildivpow2(xc, reducedresno) >> rlevel->log2_prec_width;
1349 prcy = ff_jpeg2000_ceildivpow2(yc, reducedresno) >> rlevel->log2_prec_height;
1350 prcx -= ff_jpeg2000_ceildivpow2(comp->coord_o[0][0], reducedresno) >> rlevel->log2_prec_width;
1351 prcy -= ff_jpeg2000_ceildivpow2(comp->coord_o[1][0], reducedresno) >> rlevel->log2_prec_height;
1353 precno = prcx + rlevel->num_precincts_x * prcy;
1355 if (prcx >= rlevel->num_precincts_x || prcy >= rlevel->num_precincts_y) {
1356 av_log(s->avctx, AV_LOG_WARNING, "prc %d %d outside limits %d %d\n",
1357 prcx, prcy, rlevel->num_precincts_x, rlevel->num_precincts_y);
1361 for (layno = 0; layno < LYEpoc; layno++) {
1362 if ((ret = jpeg2000_decode_packet(s, tile, tp_index, codsty, rlevel,
1364 qntsty->expn + (reslevelno ? 3 * (reslevelno - 1) + 1 : 0),
1365 qntsty->nguardbits)) < 0)
1381 static int jpeg2000_decode_packets(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile)
1383 int ret = AVERROR_BUG;
1388 if (tile->poc.nb_poc) {
1389 for (i=0; i<tile->poc.nb_poc; i++) {
1390 Jpeg2000POCEntry *e = &tile->poc.poc[i];
1391 ret = jpeg2000_decode_packets_po_iteration(s, tile,
1393 FFMIN(e->LYEpoc, tile->codsty[0].nlayers),
1395 FFMIN(e->CEpoc, s->ncomponents),
1402 ret = jpeg2000_decode_packets_po_iteration(s, tile,
1404 tile->codsty[0].nlayers,
1407 tile->codsty[0].prog_order,
1411 /* EOC marker reached */
1412 bytestream2_skip(&s->g, 2);
1417 /* TIER-1 routines */
1418 static void decode_sigpass(Jpeg2000T1Context *t1, int width, int height,
1419 int bpno, int bandno,
1420 int vert_causal_ctx_csty_symbol)
1422 int mask = 3 << (bpno - 1), y0, x, y;
1424 for (y0 = 0; y0 < height; y0 += 4)
1425 for (x = 0; x < width; x++)
1426 for (y = y0; y < height && y < y0 + 4; y++) {
1427 int flags_mask = -1;
1428 if (vert_causal_ctx_csty_symbol && y == y0 + 3)
1429 flags_mask &= ~(JPEG2000_T1_SIG_S | JPEG2000_T1_SIG_SW | JPEG2000_T1_SIG_SE | JPEG2000_T1_SGN_S);
1430 if ((t1->flags[(y+1) * t1->stride + x+1] & JPEG2000_T1_SIG_NB & flags_mask)
1431 && !(t1->flags[(y+1) * t1->stride + x+1] & (JPEG2000_T1_SIG | JPEG2000_T1_VIS))) {
1432 if (ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ff_jpeg2000_getsigctxno(t1->flags[(y+1) * t1->stride + x+1] & flags_mask, bandno))) {
1433 int xorbit, ctxno = ff_jpeg2000_getsgnctxno(t1->flags[(y+1) * t1->stride + x+1] & flags_mask, &xorbit);
1435 t1->data[(y) * t1->stride + x] = ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ctxno) ? -mask : mask;
1437 t1->data[(y) * t1->stride + x] = (ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ctxno) ^ xorbit) ?
1440 ff_jpeg2000_set_significance(t1, x, y,
1441 t1->data[(y) * t1->stride + x] < 0);
1443 t1->flags[(y + 1) * t1->stride + x + 1] |= JPEG2000_T1_VIS;
1448 static void decode_refpass(Jpeg2000T1Context *t1, int width, int height,
1449 int bpno, int vert_causal_ctx_csty_symbol)
1454 phalf = 1 << (bpno - 1);
1457 for (y0 = 0; y0 < height; y0 += 4)
1458 for (x = 0; x < width; x++)
1459 for (y = y0; y < height && y < y0 + 4; y++)
1460 if ((t1->flags[(y + 1) * t1->stride + x + 1] & (JPEG2000_T1_SIG | JPEG2000_T1_VIS)) == JPEG2000_T1_SIG) {
1461 int flags_mask = (vert_causal_ctx_csty_symbol && y == y0 + 3) ?
1462 ~(JPEG2000_T1_SIG_S | JPEG2000_T1_SIG_SW | JPEG2000_T1_SIG_SE | JPEG2000_T1_SGN_S) : -1;
1463 int ctxno = ff_jpeg2000_getrefctxno(t1->flags[(y + 1) * t1->stride + x + 1] & flags_mask);
1464 int r = ff_mqc_decode(&t1->mqc,
1465 t1->mqc.cx_states + ctxno)
1467 t1->data[(y) * t1->stride + x] += t1->data[(y) * t1->stride + x] < 0 ? -r : r;
1468 t1->flags[(y + 1) * t1->stride + x + 1] |= JPEG2000_T1_REF;
1472 static void decode_clnpass(Jpeg2000DecoderContext *s, Jpeg2000T1Context *t1,
1473 int width, int height, int bpno, int bandno,
1474 int seg_symbols, int vert_causal_ctx_csty_symbol)
1476 int mask = 3 << (bpno - 1), y0, x, y, runlen, dec;
1478 for (y0 = 0; y0 < height; y0 += 4) {
1479 for (x = 0; x < width; x++) {
1480 int flags_mask = -1;
1481 if (vert_causal_ctx_csty_symbol)
1482 flags_mask &= ~(JPEG2000_T1_SIG_S | JPEG2000_T1_SIG_SW | JPEG2000_T1_SIG_SE | JPEG2000_T1_SGN_S);
1483 if (y0 + 3 < height &&
1484 !((t1->flags[(y0 + 1) * t1->stride + x + 1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG)) ||
1485 (t1->flags[(y0 + 2) * t1->stride + x + 1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG)) ||
1486 (t1->flags[(y0 + 3) * t1->stride + x + 1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG)) ||
1487 (t1->flags[(y0 + 4) * t1->stride + x + 1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG) & flags_mask))) {
1488 if (!ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_RL))
1490 runlen = ff_mqc_decode(&t1->mqc,
1491 t1->mqc.cx_states + MQC_CX_UNI);
1492 runlen = (runlen << 1) | ff_mqc_decode(&t1->mqc,
1501 for (y = y0 + runlen; y < y0 + 4 && y < height; y++) {
1502 int flags_mask = -1;
1503 if (vert_causal_ctx_csty_symbol && y == y0 + 3)
1504 flags_mask &= ~(JPEG2000_T1_SIG_S | JPEG2000_T1_SIG_SW | JPEG2000_T1_SIG_SE | JPEG2000_T1_SGN_S);
1506 if (!(t1->flags[(y+1) * t1->stride + x+1] & (JPEG2000_T1_SIG | JPEG2000_T1_VIS))) {
1507 dec = ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ff_jpeg2000_getsigctxno(t1->flags[(y+1) * t1->stride + x+1] & flags_mask,
1513 int ctxno = ff_jpeg2000_getsgnctxno(t1->flags[(y + 1) * t1->stride + x + 1] & flags_mask,
1515 t1->data[(y) * t1->stride + x] = (ff_mqc_decode(&t1->mqc,
1516 t1->mqc.cx_states + ctxno) ^
1519 ff_jpeg2000_set_significance(t1, x, y, t1->data[(y) * t1->stride + x] < 0);
1522 t1->flags[(y + 1) * t1->stride + x + 1] &= ~JPEG2000_T1_VIS;
1528 val = ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_UNI);
1529 val = (val << 1) + ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_UNI);
1530 val = (val << 1) + ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_UNI);
1531 val = (val << 1) + ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_UNI);
1533 av_log(s->avctx, AV_LOG_ERROR,
1534 "Segmentation symbol value incorrect\n");
1538 static int decode_cblk(Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *codsty,
1539 Jpeg2000T1Context *t1, Jpeg2000Cblk *cblk,
1540 int width, int height, int bandpos)
1542 int passno = cblk->npasses, pass_t = 2, bpno = cblk->nonzerobits - 1;
1544 int vert_causal_ctx_csty_symbol = codsty->cblk_style & JPEG2000_CBLK_VSC;
1548 av_assert0(width <= 1024U && height <= 1024U);
1549 av_assert0(width*height <= 4096);
1551 memset(t1->data, 0, t1->stride * height * sizeof(*t1->data));
1553 /* If code-block contains no compressed data: nothing to do. */
1557 memset(t1->flags, 0, t1->stride * (height + 2) * sizeof(*t1->flags));
1559 cblk->data[cblk->length] = 0xff;
1560 cblk->data[cblk->length+1] = 0xff;
1561 ff_mqc_initdec(&t1->mqc, cblk->data, 0, 1);
1565 av_log(s->avctx, AV_LOG_ERROR, "bpno became negative\n");
1566 return AVERROR_INVALIDDATA;
1570 decode_sigpass(t1, width, height, bpno + 1, bandpos,
1571 vert_causal_ctx_csty_symbol);
1574 decode_refpass(t1, width, height, bpno + 1, vert_causal_ctx_csty_symbol);
1577 av_assert2(!t1->mqc.raw);
1578 decode_clnpass(s, t1, width, height, bpno + 1, bandpos,
1579 codsty->cblk_style & JPEG2000_CBLK_SEGSYM,
1580 vert_causal_ctx_csty_symbol);
1583 if (codsty->cblk_style & JPEG2000_CBLK_RESET) // XXX no testcase for just this
1584 ff_mqc_init_contexts(&t1->mqc);
1586 if (passno && (coder_type = needs_termination(codsty->cblk_style, pass_cnt))) {
1587 if (term_cnt >= cblk->nb_terminations) {
1588 av_log(s->avctx, AV_LOG_ERROR, "Missing needed termination \n");
1589 return AVERROR_INVALIDDATA;
1591 if (FFABS(cblk->data + cblk->data_start[term_cnt + 1] - 2 - t1->mqc.bp) > 0) {
1592 av_log(s->avctx, AV_LOG_WARNING, "Mid mismatch %"PTRDIFF_SPECIFIER" in pass %d of %d\n",
1593 cblk->data + cblk->data_start[term_cnt + 1] - 2 - t1->mqc.bp,
1594 pass_cnt, cblk->npasses);
1597 ff_mqc_initdec(&t1->mqc, cblk->data + cblk->data_start[++term_cnt], coder_type == 2, 0);
1608 if (cblk->data + cblk->length - 2*(term_cnt < cblk->nb_terminations) != t1->mqc.bp) {
1609 av_log(s->avctx, AV_LOG_WARNING, "End mismatch %"PTRDIFF_SPECIFIER"\n",
1610 cblk->data + cblk->length - 2*(term_cnt < cblk->nb_terminations) - t1->mqc.bp);
1616 /* TODO: Verify dequantization for lossless case
1617 * comp->data can be float or int
1618 * band->stepsize can be float or int
1619 * depending on the type of DWT transformation.
1620 * see ISO/IEC 15444-1:2002 A.6.1 */
1622 /* Float dequantization of a codeblock.*/
1623 static void dequantization_float(int x, int y, Jpeg2000Cblk *cblk,
1624 Jpeg2000Component *comp,
1625 Jpeg2000T1Context *t1, Jpeg2000Band *band)
1628 int w = cblk->coord[0][1] - cblk->coord[0][0];
1629 for (j = 0; j < (cblk->coord[1][1] - cblk->coord[1][0]); ++j) {
1630 float *datap = &comp->f_data[(comp->coord[0][1] - comp->coord[0][0]) * (y + j) + x];
1631 int *src = t1->data + j*t1->stride;
1632 for (i = 0; i < w; ++i)
1633 datap[i] = src[i] * band->f_stepsize;
1637 /* Integer dequantization of a codeblock.*/
1638 static void dequantization_int(int x, int y, Jpeg2000Cblk *cblk,
1639 Jpeg2000Component *comp,
1640 Jpeg2000T1Context *t1, Jpeg2000Band *band)
1643 int w = cblk->coord[0][1] - cblk->coord[0][0];
1644 for (j = 0; j < (cblk->coord[1][1] - cblk->coord[1][0]); ++j) {
1645 int32_t *datap = &comp->i_data[(comp->coord[0][1] - comp->coord[0][0]) * (y + j) + x];
1646 int *src = t1->data + j*t1->stride;
1647 if (band->i_stepsize == 32768) {
1648 for (i = 0; i < w; ++i)
1649 datap[i] = src[i] / 2;
1651 // This should be VERY uncommon
1652 for (i = 0; i < w; ++i)
1653 datap[i] = (src[i] * (int64_t)band->i_stepsize) / 65536;
1658 static void dequantization_int_97(int x, int y, Jpeg2000Cblk *cblk,
1659 Jpeg2000Component *comp,
1660 Jpeg2000T1Context *t1, Jpeg2000Band *band)
1663 int w = cblk->coord[0][1] - cblk->coord[0][0];
1664 for (j = 0; j < (cblk->coord[1][1] - cblk->coord[1][0]); ++j) {
1665 int32_t *datap = &comp->i_data[(comp->coord[0][1] - comp->coord[0][0]) * (y + j) + x];
1666 int *src = t1->data + j*t1->stride;
1667 for (i = 0; i < w; ++i)
1668 datap[i] = (src[i] * (int64_t)band->i_stepsize + (1<<15)) >> 16;
1672 static inline void mct_decode(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile)
1677 for (i = 1; i < 3; i++) {
1678 if (tile->codsty[0].transform != tile->codsty[i].transform) {
1679 av_log(s->avctx, AV_LOG_ERROR, "Transforms mismatch, MCT not supported\n");
1682 if (memcmp(tile->comp[0].coord, tile->comp[i].coord, sizeof(tile->comp[0].coord))) {
1683 av_log(s->avctx, AV_LOG_ERROR, "Coords mismatch, MCT not supported\n");
1688 for (i = 0; i < 3; i++)
1689 if (tile->codsty[0].transform == FF_DWT97)
1690 src[i] = tile->comp[i].f_data;
1692 src[i] = tile->comp[i].i_data;
1694 for (i = 0; i < 2; i++)
1695 csize *= tile->comp[0].coord[i][1] - tile->comp[0].coord[i][0];
1697 s->dsp.mct_decode[tile->codsty[0].transform](src[0], src[1], src[2], csize);
1700 static inline void tile_codeblocks(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile)
1702 Jpeg2000T1Context t1;
1704 int compno, reslevelno, bandno;
1706 /* Loop on tile components */
1707 for (compno = 0; compno < s->ncomponents; compno++) {
1708 Jpeg2000Component *comp = tile->comp + compno;
1709 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1712 t1.stride = (1<<codsty->log2_cblk_width) + 2;
1714 /* Loop on resolution levels */
1715 for (reslevelno = 0; reslevelno < codsty->nreslevels2decode; reslevelno++) {
1716 Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
1718 for (bandno = 0; bandno < rlevel->nbands; bandno++) {
1719 int nb_precincts, precno;
1720 Jpeg2000Band *band = rlevel->band + bandno;
1721 int cblkno = 0, bandpos;
1723 bandpos = bandno + (reslevelno > 0);
1725 if (band->coord[0][0] == band->coord[0][1] ||
1726 band->coord[1][0] == band->coord[1][1])
1729 nb_precincts = rlevel->num_precincts_x * rlevel->num_precincts_y;
1730 /* Loop on precincts */
1731 for (precno = 0; precno < nb_precincts; precno++) {
1732 Jpeg2000Prec *prec = band->prec + precno;
1734 /* Loop on codeblocks */
1736 cblkno < prec->nb_codeblocks_width * prec->nb_codeblocks_height;
1739 Jpeg2000Cblk *cblk = prec->cblk + cblkno;
1740 int ret = decode_cblk(s, codsty, &t1, cblk,
1741 cblk->coord[0][1] - cblk->coord[0][0],
1742 cblk->coord[1][1] - cblk->coord[1][0],
1748 x = cblk->coord[0][0] - band->coord[0][0];
1749 y = cblk->coord[1][0] - band->coord[1][0];
1751 if (codsty->transform == FF_DWT97)
1752 dequantization_float(x, y, cblk, comp, &t1, band);
1753 else if (codsty->transform == FF_DWT97_INT)
1754 dequantization_int_97(x, y, cblk, comp, &t1, band);
1756 dequantization_int(x, y, cblk, comp, &t1, band);
1760 } /* end reslevel */
1764 ff_dwt_decode(&comp->dwt, codsty->transform == FF_DWT97 ? (void*)comp->f_data : (void*)comp->i_data);
1769 #define WRITE_FRAME(D, PIXEL) \
1770 static inline void write_frame_ ## D(Jpeg2000DecoderContext * s, Jpeg2000Tile * tile, \
1771 AVFrame * picture, int precision) \
1773 const AVPixFmtDescriptor *pixdesc = av_pix_fmt_desc_get(s->avctx->pix_fmt); \
1774 int planar = !!(pixdesc->flags & AV_PIX_FMT_FLAG_PLANAR); \
1775 int pixelsize = planar ? 1 : pixdesc->nb_components; \
1780 for (compno = 0; compno < s->ncomponents; compno++) { \
1781 Jpeg2000Component *comp = tile->comp + compno; \
1782 Jpeg2000CodingStyle *codsty = tile->codsty + compno; \
1784 float *datap = comp->f_data; \
1785 int32_t *i_datap = comp->i_data; \
1786 int cbps = s->cbps[compno]; \
1787 int w = tile->comp[compno].coord[0][1] - s->image_offset_x; \
1791 plane = s->cdef[compno] ? s->cdef[compno]-1 : (s->ncomponents-1); \
1793 y = tile->comp[compno].coord[1][0] - s->image_offset_y / s->cdy[compno]; \
1794 line = (PIXEL *)picture->data[plane] + y * (picture->linesize[plane] / sizeof(PIXEL));\
1795 for (; y < tile->comp[compno].coord[1][1] - s->image_offset_y; y++) { \
1798 x = tile->comp[compno].coord[0][0] - s->image_offset_x / s->cdx[compno]; \
1799 dst = line + x * pixelsize + compno*!planar; \
1801 if (codsty->transform == FF_DWT97) { \
1802 for (; x < w; x++) { \
1803 int val = lrintf(*datap) + (1 << (cbps - 1)); \
1804 /* DC level shift and clip see ISO 15444-1:2002 G.1.2 */ \
1805 val = av_clip(val, 0, (1 << cbps) - 1); \
1806 *dst = val << (precision - cbps); \
1811 for (; x < w; x++) { \
1812 int val = *i_datap + (1 << (cbps - 1)); \
1813 /* DC level shift and clip see ISO 15444-1:2002 G.1.2 */ \
1814 val = av_clip(val, 0, (1 << cbps) - 1); \
1815 *dst = val << (precision - cbps); \
1820 line += picture->linesize[plane] / sizeof(PIXEL); \
1826 WRITE_FRAME(8, uint8_t)
1827 WRITE_FRAME(16, uint16_t)
1831 static int jpeg2000_decode_tile(AVCodecContext *avctx, void *td,
1832 int jobnr, int threadnr)
1834 Jpeg2000DecoderContext *s = avctx->priv_data;
1835 AVFrame *picture = td;
1836 Jpeg2000Tile *tile = s->tile + jobnr;
1839 tile_codeblocks(s, tile);
1841 /* inverse MCT transformation */
1842 if (tile->codsty[0].mct)
1843 mct_decode(s, tile);
1845 for (x = 0; x < s->ncomponents; x++) {
1846 if (s->cdef[x] < 0) {
1847 for (x = 0; x < s->ncomponents; x++) {
1850 if ((s->ncomponents & 1) == 0)
1851 s->cdef[s->ncomponents-1] = 0;
1856 if (s->precision <= 8) {
1857 write_frame_8(s, tile, picture, 8);
1859 int precision = picture->format == AV_PIX_FMT_XYZ12 ||
1860 picture->format == AV_PIX_FMT_RGB48 ||
1861 picture->format == AV_PIX_FMT_RGBA64 ||
1862 picture->format == AV_PIX_FMT_GRAY16 ? 16 : s->precision;
1864 write_frame_16(s, tile, picture, precision);
1870 static void jpeg2000_dec_cleanup(Jpeg2000DecoderContext *s)
1873 for (tileno = 0; tileno < s->numXtiles * s->numYtiles; tileno++) {
1874 if (s->tile[tileno].comp) {
1875 for (compno = 0; compno < s->ncomponents; compno++) {
1876 Jpeg2000Component *comp = s->tile[tileno].comp + compno;
1877 Jpeg2000CodingStyle *codsty = s->tile[tileno].codsty + compno;
1879 ff_jpeg2000_cleanup(comp, codsty);
1881 av_freep(&s->tile[tileno].comp);
1885 memset(s->codsty, 0, sizeof(s->codsty));
1886 memset(s->qntsty, 0, sizeof(s->qntsty));
1887 memset(s->properties, 0, sizeof(s->properties));
1888 memset(&s->poc , 0, sizeof(s->poc));
1889 s->numXtiles = s->numYtiles = 0;
1893 static int jpeg2000_read_main_headers(Jpeg2000DecoderContext *s)
1895 Jpeg2000CodingStyle *codsty = s->codsty;
1896 Jpeg2000QuantStyle *qntsty = s->qntsty;
1897 Jpeg2000POC *poc = &s->poc;
1898 uint8_t *properties = s->properties;
1905 if (bytestream2_get_bytes_left(&s->g) < 2) {
1906 av_log(s->avctx, AV_LOG_ERROR, "Missing EOC\n");
1910 marker = bytestream2_get_be16u(&s->g);
1911 oldpos = bytestream2_tell(&s->g);
1913 if (marker == JPEG2000_SOD) {
1915 Jpeg2000TilePart *tp;
1918 av_log(s->avctx, AV_LOG_ERROR, "Missing SIZ\n");
1919 return AVERROR_INVALIDDATA;
1921 if (s->curtileno < 0) {
1922 av_log(s->avctx, AV_LOG_ERROR, "Missing SOT\n");
1923 return AVERROR_INVALIDDATA;
1926 tile = s->tile + s->curtileno;
1927 tp = tile->tile_part + tile->tp_idx;
1928 if (tp->tp_end < s->g.buffer) {
1929 av_log(s->avctx, AV_LOG_ERROR, "Invalid tpend\n");
1930 return AVERROR_INVALIDDATA;
1932 bytestream2_init(&tp->tpg, s->g.buffer, tp->tp_end - s->g.buffer);
1933 bytestream2_skip(&s->g, tp->tp_end - s->g.buffer);
1937 if (marker == JPEG2000_EOC)
1940 len = bytestream2_get_be16(&s->g);
1941 if (len < 2 || bytestream2_get_bytes_left(&s->g) < len - 2) {
1942 if (s->avctx->strict_std_compliance >= FF_COMPLIANCE_STRICT) {
1943 av_log(s->avctx, AV_LOG_ERROR, "Invalid len %d left=%d\n", len, bytestream2_get_bytes_left(&s->g));
1944 return AVERROR_INVALIDDATA;
1946 av_log(s->avctx, AV_LOG_WARNING, "Missing EOC Marker.\n");
1952 if (s->ncomponents) {
1953 av_log(s->avctx, AV_LOG_ERROR, "Duplicate SIZ\n");
1954 return AVERROR_INVALIDDATA;
1958 s->numXtiles = s->numYtiles = 0;
1961 ret = get_coc(s, codsty, properties);
1964 ret = get_cod(s, codsty, properties);
1967 ret = get_qcc(s, len, qntsty, properties);
1970 ret = get_qcd(s, len, qntsty, properties);
1973 ret = get_poc(s, len, poc);
1976 if (!(ret = get_sot(s, len))) {
1977 av_assert1(s->curtileno >= 0);
1978 codsty = s->tile[s->curtileno].codsty;
1979 qntsty = s->tile[s->curtileno].qntsty;
1980 poc = &s->tile[s->curtileno].poc;
1981 properties = s->tile[s->curtileno].properties;
1985 // the PLM marker is ignored
1987 // the comment is ignored
1988 bytestream2_skip(&s->g, len - 2);
1991 // Tile-part lengths
1992 ret = get_tlm(s, len);
1995 // Packet length, tile-part header
1996 ret = get_plt(s, len);
1999 av_log(s->avctx, AV_LOG_ERROR,
2000 "unsupported marker 0x%.4"PRIX16" at pos 0x%X\n",
2001 marker, bytestream2_tell(&s->g) - 4);
2002 bytestream2_skip(&s->g, len - 2);
2005 if (bytestream2_tell(&s->g) - oldpos != len || ret) {
2006 av_log(s->avctx, AV_LOG_ERROR,
2007 "error during processing marker segment %.4"PRIx16"\n",
2009 return ret ? ret : -1;
2015 /* Read bit stream packets --> T2 operation. */
2016 static int jpeg2000_read_bitstream_packets(Jpeg2000DecoderContext *s)
2021 for (tileno = 0; tileno < s->numXtiles * s->numYtiles; tileno++) {
2022 Jpeg2000Tile *tile = s->tile + tileno;
2024 if ((ret = init_tile(s, tileno)) < 0)
2027 s->g = tile->tile_part[0].tpg;
2028 if ((ret = jpeg2000_decode_packets(s, tile)) < 0)
2035 static int jp2_find_codestream(Jpeg2000DecoderContext *s)
2037 uint32_t atom_size, atom, atom_end;
2038 int search_range = 10;
2042 bytestream2_get_bytes_left(&s->g) >= 8) {
2043 atom_size = bytestream2_get_be32u(&s->g);
2044 atom = bytestream2_get_be32u(&s->g);
2045 if (atom_size == 1) {
2046 if (bytestream2_get_be32u(&s->g)) {
2047 avpriv_request_sample(s->avctx, "Huge atom");
2050 atom_size = bytestream2_get_be32u(&s->g);
2051 atom_end = bytestream2_tell(&s->g) + atom_size - 16;
2053 atom_end = bytestream2_tell(&s->g) + atom_size - 8;
2056 if (atom == JP2_CODESTREAM)
2059 if (bytestream2_get_bytes_left(&s->g) < atom_size || atom_end < atom_size)
2062 if (atom == JP2_HEADER &&
2064 uint32_t atom2_size, atom2, atom2_end;
2066 atom2_size = bytestream2_get_be32u(&s->g);
2067 atom2 = bytestream2_get_be32u(&s->g);
2068 atom2_end = bytestream2_tell(&s->g) + atom2_size - 8;
2069 if (atom2_size < 8 || atom2_end > atom_end || atom2_end < atom2_size)
2072 if (atom2 == JP2_CODESTREAM) {
2074 } else if (atom2 == MKBETAG('c','o','l','r') && atom2_size >= 7) {
2075 int method = bytestream2_get_byteu(&s->g);
2076 bytestream2_skipu(&s->g, 2);
2078 s->colour_space = bytestream2_get_be32u(&s->g);
2080 } else if (atom2 == MKBETAG('p','c','l','r') && atom2_size >= 6) {
2081 int i, size, colour_count, colour_channels, colour_depth[3];
2082 colour_count = bytestream2_get_be16u(&s->g);
2083 colour_channels = bytestream2_get_byteu(&s->g);
2084 // FIXME: Do not ignore channel_sign
2085 colour_depth[0] = (bytestream2_get_byteu(&s->g) & 0x7f) + 1;
2086 colour_depth[1] = (bytestream2_get_byteu(&s->g) & 0x7f) + 1;
2087 colour_depth[2] = (bytestream2_get_byteu(&s->g) & 0x7f) + 1;
2088 size = (colour_depth[0] + 7 >> 3) * colour_count +
2089 (colour_depth[1] + 7 >> 3) * colour_count +
2090 (colour_depth[2] + 7 >> 3) * colour_count;
2091 if (colour_count > AVPALETTE_COUNT ||
2092 colour_channels != 3 ||
2093 colour_depth[0] > 16 ||
2094 colour_depth[1] > 16 ||
2095 colour_depth[2] > 16 ||
2096 atom2_size < size) {
2097 avpriv_request_sample(s->avctx, "Unknown palette");
2098 bytestream2_seek(&s->g, atom2_end, SEEK_SET);
2102 for (i = 0; i < colour_count; i++) {
2104 if (colour_depth[0] <= 8) {
2105 r = bytestream2_get_byteu(&s->g) << 8 - colour_depth[0];
2106 r |= r >> colour_depth[0];
2108 r = bytestream2_get_be16u(&s->g) >> colour_depth[0] - 8;
2110 if (colour_depth[1] <= 8) {
2111 g = bytestream2_get_byteu(&s->g) << 8 - colour_depth[1];
2112 g |= g >> colour_depth[1];
2114 g = bytestream2_get_be16u(&s->g) >> colour_depth[1] - 8;
2116 if (colour_depth[2] <= 8) {
2117 b = bytestream2_get_byteu(&s->g) << 8 - colour_depth[2];
2118 b |= b >> colour_depth[2];
2120 b = bytestream2_get_be16u(&s->g) >> colour_depth[2] - 8;
2122 s->palette[i] = 0xffu << 24 | r << 16 | g << 8 | b;
2124 } else if (atom2 == MKBETAG('c','d','e','f') && atom2_size >= 2) {
2125 int n = bytestream2_get_be16u(&s->g);
2127 int cn = bytestream2_get_be16(&s->g);
2128 int av_unused typ = bytestream2_get_be16(&s->g);
2129 int asoc = bytestream2_get_be16(&s->g);
2130 if (cn < 4 && asoc < 4)
2133 } else if (atom2 == MKBETAG('r','e','s',' ') && atom2_size >= 18) {
2134 int64_t vnum, vden, hnum, hden, vexp, hexp;
2136 bytestream2_skip(&s->g, 4);
2137 resx = bytestream2_get_be32u(&s->g);
2138 if (resx != MKBETAG('r','e','s','c') && resx != MKBETAG('r','e','s','d')) {
2139 bytestream2_seek(&s->g, atom2_end, SEEK_SET);
2142 vnum = bytestream2_get_be16u(&s->g);
2143 vden = bytestream2_get_be16u(&s->g);
2144 hnum = bytestream2_get_be16u(&s->g);
2145 hden = bytestream2_get_be16u(&s->g);
2146 vexp = bytestream2_get_byteu(&s->g);
2147 hexp = bytestream2_get_byteu(&s->g);
2148 if (!vnum || !vden || !hnum || !hden) {
2149 bytestream2_seek(&s->g, atom2_end, SEEK_SET);
2150 av_log(s->avctx, AV_LOG_WARNING, "RES box invalid\n");
2160 if ( INT64_MAX / (hnum * vden) > pow(10, hexp)
2161 && INT64_MAX / (vnum * hden) > pow(10, vexp))
2162 av_reduce(&s->sar.den, &s->sar.num,
2163 hnum * vden * pow(10, hexp),
2164 vnum * hden * pow(10, vexp),
2167 bytestream2_seek(&s->g, atom2_end, SEEK_SET);
2168 } while (atom_end - atom2_end >= 8);
2172 bytestream2_seek(&s->g, atom_end, SEEK_SET);
2178 static av_cold void jpeg2000_init_static_data(void)
2180 ff_jpeg2000_init_tier1_luts();
2181 ff_mqc_init_context_tables();
2184 static av_cold int jpeg2000_decode_init(AVCodecContext *avctx)
2186 static AVOnce init_static_once = AV_ONCE_INIT;
2187 Jpeg2000DecoderContext *s = avctx->priv_data;
2189 ff_thread_once(&init_static_once, jpeg2000_init_static_data);
2190 ff_jpeg2000dsp_init(&s->dsp);
2195 static int jpeg2000_decode_frame(AVCodecContext *avctx, void *data,
2196 int *got_frame, AVPacket *avpkt)
2198 Jpeg2000DecoderContext *s = avctx->priv_data;
2199 ThreadFrame frame = { .f = data };
2200 AVFrame *picture = data;
2204 bytestream2_init(&s->g, avpkt->data, avpkt->size);
2206 memset(s->cdef, -1, sizeof(s->cdef));
2208 if (bytestream2_get_bytes_left(&s->g) < 2) {
2209 ret = AVERROR_INVALIDDATA;
2213 // check if the image is in jp2 format
2214 if (bytestream2_get_bytes_left(&s->g) >= 12 &&
2215 (bytestream2_get_be32u(&s->g) == 12) &&
2216 (bytestream2_get_be32u(&s->g) == JP2_SIG_TYPE) &&
2217 (bytestream2_get_be32u(&s->g) == JP2_SIG_VALUE)) {
2218 if (!jp2_find_codestream(s)) {
2219 av_log(avctx, AV_LOG_ERROR,
2220 "Could not find Jpeg2000 codestream atom.\n");
2221 ret = AVERROR_INVALIDDATA;
2225 bytestream2_seek(&s->g, 0, SEEK_SET);
2228 while (bytestream2_get_bytes_left(&s->g) >= 3 && bytestream2_peek_be16(&s->g) != JPEG2000_SOC)
2229 bytestream2_skip(&s->g, 1);
2231 if (bytestream2_get_be16u(&s->g) != JPEG2000_SOC) {
2232 av_log(avctx, AV_LOG_ERROR, "SOC marker not present\n");
2233 ret = AVERROR_INVALIDDATA;
2236 if (ret = jpeg2000_read_main_headers(s))
2239 /* get picture buffer */
2240 if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0)
2242 picture->pict_type = AV_PICTURE_TYPE_I;
2243 picture->key_frame = 1;
2245 if (ret = jpeg2000_read_bitstream_packets(s))
2248 avctx->execute2(avctx, jpeg2000_decode_tile, picture, NULL, s->numXtiles * s->numYtiles);
2250 jpeg2000_dec_cleanup(s);
2254 if (s->avctx->pix_fmt == AV_PIX_FMT_PAL8)
2255 memcpy(picture->data[1], s->palette, 256 * sizeof(uint32_t));
2256 if (s->sar.num && s->sar.den)
2257 avctx->sample_aspect_ratio = s->sar;
2258 s->sar.num = s->sar.den = 0;
2260 return bytestream2_tell(&s->g);
2263 jpeg2000_dec_cleanup(s);
2267 #define OFFSET(x) offsetof(Jpeg2000DecoderContext, x)
2268 #define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
2270 static const AVOption options[] = {
2271 { "lowres", "Lower the decoding resolution by a power of two",
2272 OFFSET(reduction_factor), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, JPEG2000_MAX_RESLEVELS - 1, VD },
2276 static const AVClass jpeg2000_class = {
2277 .class_name = "jpeg2000",
2278 .item_name = av_default_item_name,
2280 .version = LIBAVUTIL_VERSION_INT,
2283 AVCodec ff_jpeg2000_decoder = {
2285 .long_name = NULL_IF_CONFIG_SMALL("JPEG 2000"),
2286 .type = AVMEDIA_TYPE_VIDEO,
2287 .id = AV_CODEC_ID_JPEG2000,
2288 .capabilities = AV_CODEC_CAP_SLICE_THREADS | AV_CODEC_CAP_FRAME_THREADS | AV_CODEC_CAP_DR1,
2289 .priv_data_size = sizeof(Jpeg2000DecoderContext),
2290 .init = jpeg2000_decode_init,
2291 .decode = jpeg2000_decode_frame,
2292 .priv_class = &jpeg2000_class,
2294 .profiles = NULL_IF_CONFIG_SMALL(ff_jpeg2000_profiles)