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 uint8_t has_ppt; // whether this tile has a ppt marker
87 uint8_t *packed_headers; // contains packed headers. Used only along with PPT marker
88 int packed_headers_size; // size in bytes of the packed headers
89 GetByteContext packed_headers_stream; // byte context corresponding to packed headers
90 uint16_t tp_idx; // Tile-part index
91 int coord[2][2]; // border coordinates {{x0, x1}, {y0, y1}}
94 typedef struct Jpeg2000DecoderContext {
96 AVCodecContext *avctx;
100 int image_offset_x, image_offset_y;
101 int tile_offset_x, tile_offset_y;
102 uint8_t cbps[4]; // bits per sample in particular components
103 uint8_t sgnd[4]; // if a component is signed
104 uint8_t properties[4];
109 uint32_t palette[256];
112 int tile_width, tile_height;
113 unsigned numXtiles, numYtiles;
117 Jpeg2000CodingStyle codsty[4];
118 Jpeg2000QuantStyle qntsty[4];
120 uint8_t roi_shift[4];
127 Jpeg2000DSPContext dsp;
129 /*options parameters*/
130 int reduction_factor;
131 } Jpeg2000DecoderContext;
133 /* get_bits functions for JPEG2000 packet bitstream
134 * It is a get_bit function with a bit-stuffing routine. If the value of the
135 * byte is 0xFF, the next byte includes an extra zero bit stuffed into the MSB.
136 * cf. ISO-15444-1:2002 / B.10.1 Bit-stuffing routine */
137 static int get_bits(Jpeg2000DecoderContext *s, int n)
143 if (s->bit_index == 0) {
144 s->bit_index = 7 + (bytestream2_get_byte(&s->g) != 0xFFu);
147 res |= (bytestream2_peek_byte(&s->g) >> s->bit_index) & 1;
152 static void jpeg2000_flush(Jpeg2000DecoderContext *s)
154 if (bytestream2_get_byte(&s->g) == 0xff)
155 bytestream2_skip(&s->g, 1);
159 /* decode the value stored in node */
160 static int tag_tree_decode(Jpeg2000DecoderContext *s, Jpeg2000TgtNode *node,
163 Jpeg2000TgtNode *stack[30];
164 int sp = -1, curval = 0;
167 av_log(s->avctx, AV_LOG_ERROR, "missing node\n");
168 return AVERROR_INVALIDDATA;
171 while (node && !node->vis) {
179 curval = stack[sp]->val;
181 while (curval < threshold && sp >= 0) {
182 if (curval < stack[sp]->val)
183 curval = stack[sp]->val;
184 while (curval < threshold) {
186 if ((ret = get_bits(s, 1)) > 0) {
194 stack[sp]->val = curval;
200 static int pix_fmt_match(enum AVPixelFormat pix_fmt, int components,
201 int bpc, uint32_t log2_chroma_wh, int pal8)
204 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
208 if (desc->nb_components != components) {
212 switch (components) {
214 match = match && desc->comp[3].depth >= bpc &&
215 (log2_chroma_wh >> 14 & 3) == 0 &&
216 (log2_chroma_wh >> 12 & 3) == 0;
218 match = match && desc->comp[2].depth >= bpc &&
219 (log2_chroma_wh >> 10 & 3) == desc->log2_chroma_w &&
220 (log2_chroma_wh >> 8 & 3) == desc->log2_chroma_h;
222 match = match && desc->comp[1].depth >= bpc &&
223 (log2_chroma_wh >> 6 & 3) == desc->log2_chroma_w &&
224 (log2_chroma_wh >> 4 & 3) == desc->log2_chroma_h;
227 match = match && desc->comp[0].depth >= bpc &&
228 (log2_chroma_wh >> 2 & 3) == 0 &&
229 (log2_chroma_wh & 3) == 0 &&
230 (desc->flags & AV_PIX_FMT_FLAG_PAL) == pal8 * AV_PIX_FMT_FLAG_PAL;
235 // pix_fmts with lower bpp have to be listed before
236 // similar pix_fmts with higher bpp.
237 #define RGB_PIXEL_FORMATS AV_PIX_FMT_PAL8,AV_PIX_FMT_RGB24,AV_PIX_FMT_RGBA,AV_PIX_FMT_RGB48,AV_PIX_FMT_RGBA64
238 #define GRAY_PIXEL_FORMATS AV_PIX_FMT_GRAY8,AV_PIX_FMT_GRAY8A,AV_PIX_FMT_GRAY16,AV_PIX_FMT_YA16
239 #define YUV_PIXEL_FORMATS AV_PIX_FMT_YUV410P,AV_PIX_FMT_YUV411P,AV_PIX_FMT_YUVA420P, \
240 AV_PIX_FMT_YUV420P,AV_PIX_FMT_YUV422P,AV_PIX_FMT_YUVA422P, \
241 AV_PIX_FMT_YUV440P,AV_PIX_FMT_YUV444P,AV_PIX_FMT_YUVA444P, \
242 AV_PIX_FMT_YUV420P9,AV_PIX_FMT_YUV422P9,AV_PIX_FMT_YUV444P9, \
243 AV_PIX_FMT_YUVA420P9,AV_PIX_FMT_YUVA422P9,AV_PIX_FMT_YUVA444P9, \
244 AV_PIX_FMT_YUV420P10,AV_PIX_FMT_YUV422P10,AV_PIX_FMT_YUV444P10, \
245 AV_PIX_FMT_YUVA420P10,AV_PIX_FMT_YUVA422P10,AV_PIX_FMT_YUVA444P10, \
246 AV_PIX_FMT_YUV420P12,AV_PIX_FMT_YUV422P12,AV_PIX_FMT_YUV444P12, \
247 AV_PIX_FMT_YUV420P14,AV_PIX_FMT_YUV422P14,AV_PIX_FMT_YUV444P14, \
248 AV_PIX_FMT_YUV420P16,AV_PIX_FMT_YUV422P16,AV_PIX_FMT_YUV444P16, \
249 AV_PIX_FMT_YUVA420P16,AV_PIX_FMT_YUVA422P16,AV_PIX_FMT_YUVA444P16
250 #define XYZ_PIXEL_FORMATS AV_PIX_FMT_XYZ12
252 static const enum AVPixelFormat rgb_pix_fmts[] = {RGB_PIXEL_FORMATS};
253 static const enum AVPixelFormat gray_pix_fmts[] = {GRAY_PIXEL_FORMATS};
254 static const enum AVPixelFormat yuv_pix_fmts[] = {YUV_PIXEL_FORMATS};
255 static const enum AVPixelFormat xyz_pix_fmts[] = {XYZ_PIXEL_FORMATS,
257 static const enum AVPixelFormat all_pix_fmts[] = {RGB_PIXEL_FORMATS,
262 /* marker segments */
263 /* get sizes and offsets of image, tiles; number of components */
264 static int get_siz(Jpeg2000DecoderContext *s)
268 uint32_t log2_chroma_wh = 0;
269 const enum AVPixelFormat *possible_fmts = NULL;
270 int possible_fmts_nb = 0;
272 int o_dimx, o_dimy; //original image dimensions.
275 if (bytestream2_get_bytes_left(&s->g) < 36) {
276 av_log(s->avctx, AV_LOG_ERROR, "Insufficient space for SIZ\n");
277 return AVERROR_INVALIDDATA;
280 s->avctx->profile = bytestream2_get_be16u(&s->g); // Rsiz
281 s->width = bytestream2_get_be32u(&s->g); // Width
282 s->height = bytestream2_get_be32u(&s->g); // Height
283 s->image_offset_x = bytestream2_get_be32u(&s->g); // X0Siz
284 s->image_offset_y = bytestream2_get_be32u(&s->g); // Y0Siz
285 s->tile_width = bytestream2_get_be32u(&s->g); // XTSiz
286 s->tile_height = bytestream2_get_be32u(&s->g); // YTSiz
287 s->tile_offset_x = bytestream2_get_be32u(&s->g); // XT0Siz
288 s->tile_offset_y = bytestream2_get_be32u(&s->g); // YT0Siz
289 ncomponents = bytestream2_get_be16u(&s->g); // CSiz
291 if (s->image_offset_x || s->image_offset_y) {
292 avpriv_request_sample(s->avctx, "Support for image offsets");
293 return AVERROR_PATCHWELCOME;
295 if (av_image_check_size2(s->width, s->height, s->avctx->max_pixels, AV_PIX_FMT_NONE, 0, s->avctx)) {
296 avpriv_request_sample(s->avctx, "Large Dimensions");
297 return AVERROR_PATCHWELCOME;
300 if (ncomponents <= 0) {
301 av_log(s->avctx, AV_LOG_ERROR, "Invalid number of components: %d\n",
303 return AVERROR_INVALIDDATA;
306 if (ncomponents > 4) {
307 avpriv_request_sample(s->avctx, "Support for %d components",
309 return AVERROR_PATCHWELCOME;
312 if (s->tile_offset_x < 0 || s->tile_offset_y < 0 ||
313 s->image_offset_x < s->tile_offset_x ||
314 s->image_offset_y < s->tile_offset_y ||
315 s->tile_width + (int64_t)s->tile_offset_x <= s->image_offset_x ||
316 s->tile_height + (int64_t)s->tile_offset_y <= s->image_offset_y
318 av_log(s->avctx, AV_LOG_ERROR, "Tile offsets are invalid\n");
319 return AVERROR_INVALIDDATA;
322 s->ncomponents = ncomponents;
324 if (s->tile_width <= 0 || s->tile_height <= 0) {
325 av_log(s->avctx, AV_LOG_ERROR, "Invalid tile dimension %dx%d.\n",
326 s->tile_width, s->tile_height);
327 return AVERROR_INVALIDDATA;
330 if (bytestream2_get_bytes_left(&s->g) < 3 * s->ncomponents) {
331 av_log(s->avctx, AV_LOG_ERROR, "Insufficient space for %d components in SIZ\n", s->ncomponents);
332 return AVERROR_INVALIDDATA;
335 for (i = 0; i < s->ncomponents; i++) { // Ssiz_i XRsiz_i, YRsiz_i
336 uint8_t x = bytestream2_get_byteu(&s->g);
337 s->cbps[i] = (x & 0x7f) + 1;
338 s->precision = FFMAX(s->cbps[i], s->precision);
339 s->sgnd[i] = !!(x & 0x80);
340 s->cdx[i] = bytestream2_get_byteu(&s->g);
341 s->cdy[i] = bytestream2_get_byteu(&s->g);
342 if ( !s->cdx[i] || s->cdx[i] == 3 || s->cdx[i] > 4
343 || !s->cdy[i] || s->cdy[i] == 3 || s->cdy[i] > 4) {
344 av_log(s->avctx, AV_LOG_ERROR, "Invalid sample separation %d/%d\n", s->cdx[i], s->cdy[i]);
345 return AVERROR_INVALIDDATA;
347 log2_chroma_wh |= s->cdy[i] >> 1 << i * 4 | s->cdx[i] >> 1 << i * 4 + 2;
350 s->numXtiles = ff_jpeg2000_ceildiv(s->width - s->tile_offset_x, s->tile_width);
351 s->numYtiles = ff_jpeg2000_ceildiv(s->height - s->tile_offset_y, s->tile_height);
353 // There must be at least a SOT and SOD per tile, their minimum size is 14
354 if (s->numXtiles * (uint64_t)s->numYtiles > INT_MAX/sizeof(*s->tile) ||
355 s->numXtiles * s->numYtiles * 14LL > bytestream2_size(&s->g)
357 s->numXtiles = s->numYtiles = 0;
358 return AVERROR(EINVAL);
361 s->tile = av_mallocz_array(s->numXtiles * s->numYtiles, sizeof(*s->tile));
363 s->numXtiles = s->numYtiles = 0;
364 return AVERROR(ENOMEM);
367 for (i = 0; i < s->numXtiles * s->numYtiles; i++) {
368 Jpeg2000Tile *tile = s->tile + i;
370 tile->comp = av_mallocz(s->ncomponents * sizeof(*tile->comp));
372 return AVERROR(ENOMEM);
375 /* compute image size with reduction factor */
376 o_dimx = ff_jpeg2000_ceildivpow2(s->width - s->image_offset_x,
377 s->reduction_factor);
378 o_dimy = ff_jpeg2000_ceildivpow2(s->height - s->image_offset_y,
379 s->reduction_factor);
380 dimx = ff_jpeg2000_ceildiv(o_dimx, s->cdx[0]);
381 dimy = ff_jpeg2000_ceildiv(o_dimy, s->cdy[0]);
382 for (i = 1; i < s->ncomponents; i++) {
383 dimx = FFMAX(dimx, ff_jpeg2000_ceildiv(o_dimx, s->cdx[i]));
384 dimy = FFMAX(dimy, ff_jpeg2000_ceildiv(o_dimy, s->cdy[i]));
387 ret = ff_set_dimensions(s->avctx, dimx, dimy);
391 if (s->avctx->profile == FF_PROFILE_JPEG2000_DCINEMA_2K ||
392 s->avctx->profile == FF_PROFILE_JPEG2000_DCINEMA_4K) {
393 possible_fmts = xyz_pix_fmts;
394 possible_fmts_nb = FF_ARRAY_ELEMS(xyz_pix_fmts);
396 switch (s->colour_space) {
398 possible_fmts = rgb_pix_fmts;
399 possible_fmts_nb = FF_ARRAY_ELEMS(rgb_pix_fmts);
402 possible_fmts = gray_pix_fmts;
403 possible_fmts_nb = FF_ARRAY_ELEMS(gray_pix_fmts);
406 possible_fmts = yuv_pix_fmts;
407 possible_fmts_nb = FF_ARRAY_ELEMS(yuv_pix_fmts);
410 possible_fmts = all_pix_fmts;
411 possible_fmts_nb = FF_ARRAY_ELEMS(all_pix_fmts);
415 if ( s->avctx->pix_fmt != AV_PIX_FMT_NONE
416 && !pix_fmt_match(s->avctx->pix_fmt, ncomponents, s->precision, log2_chroma_wh, s->pal8))
417 s->avctx->pix_fmt = AV_PIX_FMT_NONE;
418 if (s->avctx->pix_fmt == AV_PIX_FMT_NONE)
419 for (i = 0; i < possible_fmts_nb; ++i) {
420 if (pix_fmt_match(possible_fmts[i], ncomponents, s->precision, log2_chroma_wh, s->pal8)) {
421 s->avctx->pix_fmt = possible_fmts[i];
426 if (i == possible_fmts_nb) {
427 if (ncomponents == 4 &&
428 s->cdy[0] == 1 && s->cdx[0] == 1 &&
429 s->cdy[1] == 1 && s->cdx[1] == 1 &&
430 s->cdy[2] == s->cdy[3] && s->cdx[2] == s->cdx[3]) {
431 if (s->precision == 8 && s->cdy[2] == 2 && s->cdx[2] == 2 && !s->pal8) {
432 s->avctx->pix_fmt = AV_PIX_FMT_YUVA420P;
443 if (i == possible_fmts_nb) {
444 av_log(s->avctx, AV_LOG_ERROR,
445 "Unknown pix_fmt, profile: %d, colour_space: %d, "
446 "components: %d, precision: %d\n"
447 "cdx[0]: %d, cdy[0]: %d\n"
448 "cdx[1]: %d, cdy[1]: %d\n"
449 "cdx[2]: %d, cdy[2]: %d\n"
450 "cdx[3]: %d, cdy[3]: %d\n",
451 s->avctx->profile, s->colour_space, ncomponents, s->precision,
454 ncomponents > 1 ? s->cdx[1] : 0,
455 ncomponents > 1 ? s->cdy[1] : 0,
456 ncomponents > 2 ? s->cdx[2] : 0,
457 ncomponents > 2 ? s->cdy[2] : 0,
458 ncomponents > 3 ? s->cdx[3] : 0,
459 ncomponents > 3 ? s->cdy[3] : 0);
460 return AVERROR_PATCHWELCOME;
462 s->avctx->bits_per_raw_sample = s->precision;
466 /* get common part for COD and COC segments */
467 static int get_cox(Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *c)
471 if (bytestream2_get_bytes_left(&s->g) < 5) {
472 av_log(s->avctx, AV_LOG_ERROR, "Insufficient space for COX\n");
473 return AVERROR_INVALIDDATA;
476 /* nreslevels = number of resolution levels
477 = number of decomposition level +1 */
478 c->nreslevels = bytestream2_get_byteu(&s->g) + 1;
479 if (c->nreslevels >= JPEG2000_MAX_RESLEVELS) {
480 av_log(s->avctx, AV_LOG_ERROR, "nreslevels %d is invalid\n", c->nreslevels);
481 return AVERROR_INVALIDDATA;
484 if (c->nreslevels <= s->reduction_factor) {
485 /* we are forced to update reduction_factor as its requested value is
486 not compatible with this bitstream, and as we might have used it
487 already in setup earlier we have to fail this frame until
488 reinitialization is implemented */
489 av_log(s->avctx, AV_LOG_ERROR, "reduction_factor too large for this bitstream, max is %d\n", c->nreslevels - 1);
490 s->reduction_factor = c->nreslevels - 1;
491 return AVERROR(EINVAL);
494 /* compute number of resolution levels to decode */
495 c->nreslevels2decode = c->nreslevels - s->reduction_factor;
497 c->log2_cblk_width = (bytestream2_get_byteu(&s->g) & 15) + 2; // cblk width
498 c->log2_cblk_height = (bytestream2_get_byteu(&s->g) & 15) + 2; // cblk height
500 if (c->log2_cblk_width > 10 || c->log2_cblk_height > 10 ||
501 c->log2_cblk_width + c->log2_cblk_height > 12) {
502 av_log(s->avctx, AV_LOG_ERROR, "cblk size invalid\n");
503 return AVERROR_INVALIDDATA;
506 c->cblk_style = bytestream2_get_byteu(&s->g);
507 if (c->cblk_style != 0) { // cblk style
508 av_log(s->avctx, AV_LOG_WARNING, "extra cblk styles %X\n", c->cblk_style);
509 if (c->cblk_style & JPEG2000_CBLK_BYPASS)
510 av_log(s->avctx, AV_LOG_WARNING, "Selective arithmetic coding bypass\n");
512 c->transform = bytestream2_get_byteu(&s->g); // DWT transformation type
513 /* set integer 9/7 DWT in case of BITEXACT flag */
514 if ((s->avctx->flags & AV_CODEC_FLAG_BITEXACT) && (c->transform == FF_DWT97))
515 c->transform = FF_DWT97_INT;
516 else if (c->transform == FF_DWT53) {
517 s->avctx->properties |= FF_CODEC_PROPERTY_LOSSLESS;
520 if (c->csty & JPEG2000_CSTY_PREC) {
522 for (i = 0; i < c->nreslevels; i++) {
523 byte = bytestream2_get_byte(&s->g);
524 c->log2_prec_widths[i] = byte & 0x0F; // precinct PPx
525 c->log2_prec_heights[i] = (byte >> 4) & 0x0F; // precinct PPy
527 if (c->log2_prec_widths[i] == 0 || c->log2_prec_heights[i] == 0) {
528 av_log(s->avctx, AV_LOG_ERROR, "PPx %d PPy %d invalid\n",
529 c->log2_prec_widths[i], c->log2_prec_heights[i]);
530 c->log2_prec_widths[i] = c->log2_prec_heights[i] = 1;
531 return AVERROR_INVALIDDATA;
535 memset(c->log2_prec_widths , 15, sizeof(c->log2_prec_widths ));
536 memset(c->log2_prec_heights, 15, sizeof(c->log2_prec_heights));
541 /* get coding parameters for a particular tile or whole image*/
542 static int get_cod(Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *c,
545 Jpeg2000CodingStyle tmp;
548 if (bytestream2_get_bytes_left(&s->g) < 5) {
549 av_log(s->avctx, AV_LOG_ERROR, "Insufficient space for COD\n");
550 return AVERROR_INVALIDDATA;
553 tmp.csty = bytestream2_get_byteu(&s->g);
555 // get progression order
556 tmp.prog_order = bytestream2_get_byteu(&s->g);
558 tmp.nlayers = bytestream2_get_be16u(&s->g);
559 tmp.mct = bytestream2_get_byteu(&s->g); // multiple component transformation
561 if (tmp.mct && s->ncomponents < 3) {
562 av_log(s->avctx, AV_LOG_ERROR,
563 "MCT %"PRIu8" with too few components (%d)\n",
564 tmp.mct, s->ncomponents);
565 return AVERROR_INVALIDDATA;
568 if ((ret = get_cox(s, &tmp)) < 0)
571 for (compno = 0; compno < s->ncomponents; compno++)
572 if (!(properties[compno] & HAD_COC))
573 memcpy(c + compno, &tmp, sizeof(tmp));
577 /* Get coding parameters for a component in the whole image or a
578 * particular tile. */
579 static int get_coc(Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *c,
585 if (bytestream2_get_bytes_left(&s->g) < 2) {
586 av_log(s->avctx, AV_LOG_ERROR, "Insufficient space for COC\n");
587 return AVERROR_INVALIDDATA;
590 compno = bytestream2_get_byteu(&s->g);
592 if (compno >= s->ncomponents) {
593 av_log(s->avctx, AV_LOG_ERROR,
594 "Invalid compno %d. There are %d components in the image.\n",
595 compno, s->ncomponents);
596 return AVERROR_INVALIDDATA;
600 has_eph = c->csty & JPEG2000_CSTY_EPH;
601 c->csty = bytestream2_get_byteu(&s->g);
602 c->csty |= has_eph; //do not override eph present bits from COD
604 if ((ret = get_cox(s, c)) < 0)
607 properties[compno] |= HAD_COC;
611 static int get_rgn(Jpeg2000DecoderContext *s, int n)
614 compno = (s->ncomponents < 257)? bytestream2_get_byte(&s->g):
615 bytestream2_get_be16u(&s->g);
616 if (bytestream2_get_byte(&s->g)) {
617 av_log(s->avctx, AV_LOG_ERROR, "Invalid RGN header.\n");
618 return AVERROR_INVALIDDATA; // SRgn field value is 0
621 // Currently compno cannot be greater than 4.
622 // However, future implementation should support compno up to 65536
623 if (compno < s->ncomponents) {
625 if (s->curtileno == -1) {
626 v = bytestream2_get_byte(&s->g);
628 return AVERROR_PATCHWELCOME;
629 s->roi_shift[compno] = v;
631 if (s->tile[s->curtileno].tp_idx != 0)
632 return AVERROR_INVALIDDATA; // marker occurs only in first tile part of tile
633 v = bytestream2_get_byte(&s->g);
635 return AVERROR_PATCHWELCOME;
636 s->tile[s->curtileno].comp[compno].roi_shift = v;
640 return AVERROR_INVALIDDATA;
643 /* Get common part for QCD and QCC segments. */
644 static int get_qcx(Jpeg2000DecoderContext *s, int n, Jpeg2000QuantStyle *q)
648 if (bytestream2_get_bytes_left(&s->g) < 1)
649 return AVERROR_INVALIDDATA;
651 x = bytestream2_get_byteu(&s->g); // Sqcd
653 q->nguardbits = x >> 5;
654 q->quantsty = x & 0x1f;
656 if (q->quantsty == JPEG2000_QSTY_NONE) {
658 if (bytestream2_get_bytes_left(&s->g) < n ||
659 n > JPEG2000_MAX_DECLEVELS*3)
660 return AVERROR_INVALIDDATA;
661 for (i = 0; i < n; i++)
662 q->expn[i] = bytestream2_get_byteu(&s->g) >> 3;
663 } else if (q->quantsty == JPEG2000_QSTY_SI) {
664 if (bytestream2_get_bytes_left(&s->g) < 2)
665 return AVERROR_INVALIDDATA;
666 x = bytestream2_get_be16u(&s->g);
667 q->expn[0] = x >> 11;
668 q->mant[0] = x & 0x7ff;
669 for (i = 1; i < JPEG2000_MAX_DECLEVELS * 3; i++) {
670 int curexpn = FFMAX(0, q->expn[0] - (i - 1) / 3);
671 q->expn[i] = curexpn;
672 q->mant[i] = q->mant[0];
676 if (bytestream2_get_bytes_left(&s->g) < 2 * n ||
677 n > JPEG2000_MAX_DECLEVELS*3)
678 return AVERROR_INVALIDDATA;
679 for (i = 0; i < n; i++) {
680 x = bytestream2_get_be16u(&s->g);
681 q->expn[i] = x >> 11;
682 q->mant[i] = x & 0x7ff;
688 /* Get quantization parameters for a particular tile or a whole image. */
689 static int get_qcd(Jpeg2000DecoderContext *s, int n, Jpeg2000QuantStyle *q,
692 Jpeg2000QuantStyle tmp;
695 memset(&tmp, 0, sizeof(tmp));
697 if ((ret = get_qcx(s, n, &tmp)) < 0)
699 for (compno = 0; compno < s->ncomponents; compno++)
700 if (!(properties[compno] & HAD_QCC))
701 memcpy(q + compno, &tmp, sizeof(tmp));
705 /* Get quantization parameters for a component in the whole image
706 * on in a particular tile. */
707 static int get_qcc(Jpeg2000DecoderContext *s, int n, Jpeg2000QuantStyle *q,
712 if (bytestream2_get_bytes_left(&s->g) < 1)
713 return AVERROR_INVALIDDATA;
715 compno = bytestream2_get_byteu(&s->g);
717 if (compno >= s->ncomponents) {
718 av_log(s->avctx, AV_LOG_ERROR,
719 "Invalid compno %d. There are %d components in the image.\n",
720 compno, s->ncomponents);
721 return AVERROR_INVALIDDATA;
724 properties[compno] |= HAD_QCC;
725 return get_qcx(s, n - 1, q + compno);
728 static int get_poc(Jpeg2000DecoderContext *s, int size, Jpeg2000POC *p)
731 int elem_size = s->ncomponents <= 257 ? 7 : 9;
732 Jpeg2000POC tmp = {{{0}}};
734 if (bytestream2_get_bytes_left(&s->g) < 5 || size < 2 + elem_size) {
735 av_log(s->avctx, AV_LOG_ERROR, "Insufficient space for POC\n");
736 return AVERROR_INVALIDDATA;
740 avpriv_request_sample(s->avctx, "Fat POC not supported");
741 return AVERROR_PATCHWELCOME;
744 tmp.nb_poc = (size - 2) / elem_size;
745 if (tmp.nb_poc > MAX_POCS) {
746 avpriv_request_sample(s->avctx, "Too many POCs (%d)", tmp.nb_poc);
747 return AVERROR_PATCHWELCOME;
750 for (i = 0; i<tmp.nb_poc; i++) {
751 Jpeg2000POCEntry *e = &tmp.poc[i];
752 e->RSpoc = bytestream2_get_byteu(&s->g);
753 e->CSpoc = bytestream2_get_byteu(&s->g);
754 e->LYEpoc = bytestream2_get_be16u(&s->g);
755 e->REpoc = bytestream2_get_byteu(&s->g);
756 e->CEpoc = bytestream2_get_byteu(&s->g);
757 e->Ppoc = bytestream2_get_byteu(&s->g);
760 if (e->CEpoc > s->ncomponents)
761 e->CEpoc = s->ncomponents;
762 if ( e->RSpoc >= e->REpoc || e->REpoc > 33
763 || e->CSpoc >= e->CEpoc || e->CEpoc > s->ncomponents
765 av_log(s->avctx, AV_LOG_ERROR, "POC Entry %d is invalid (%d, %d, %d, %d, %d, %d)\n", i,
766 e->RSpoc, e->CSpoc, e->LYEpoc, e->REpoc, e->CEpoc, e->Ppoc
768 return AVERROR_INVALIDDATA;
772 if (!p->nb_poc || p->is_default) {
775 if (p->nb_poc + tmp.nb_poc > MAX_POCS) {
776 av_log(s->avctx, AV_LOG_ERROR, "Insufficient space for POC\n");
777 return AVERROR_INVALIDDATA;
779 memcpy(p->poc + p->nb_poc, tmp.poc, tmp.nb_poc * sizeof(tmp.poc[0]));
780 p->nb_poc += tmp.nb_poc;
789 /* Get start of tile segment. */
790 static int get_sot(Jpeg2000DecoderContext *s, int n)
792 Jpeg2000TilePart *tp;
797 if (bytestream2_get_bytes_left(&s->g) < 8)
798 return AVERROR_INVALIDDATA;
801 Isot = bytestream2_get_be16u(&s->g); // Isot
802 if (Isot >= s->numXtiles * s->numYtiles)
803 return AVERROR_INVALIDDATA;
806 Psot = bytestream2_get_be32u(&s->g); // Psot
807 TPsot = bytestream2_get_byteu(&s->g); // TPsot
809 /* Read TNSot but not used */
810 bytestream2_get_byteu(&s->g); // TNsot
813 Psot = bytestream2_get_bytes_left(&s->g) - 2 + n + 2;
815 if (Psot > bytestream2_get_bytes_left(&s->g) - 2 + n + 2) {
816 av_log(s->avctx, AV_LOG_ERROR, "Psot %"PRIu32" too big\n", Psot);
817 return AVERROR_INVALIDDATA;
820 if (TPsot >= FF_ARRAY_ELEMS(s->tile[Isot].tile_part)) {
821 avpriv_request_sample(s->avctx, "Too many tile parts");
822 return AVERROR_PATCHWELCOME;
825 s->tile[Isot].tp_idx = TPsot;
826 tp = s->tile[Isot].tile_part + TPsot;
827 tp->tile_index = Isot;
828 tp->tp_end = s->g.buffer + Psot - n - 2;
831 Jpeg2000Tile *tile = s->tile + s->curtileno;
834 memcpy(tile->codsty, s->codsty, s->ncomponents * sizeof(Jpeg2000CodingStyle));
835 memcpy(tile->qntsty, s->qntsty, s->ncomponents * sizeof(Jpeg2000QuantStyle));
836 memcpy(&tile->poc , &s->poc , sizeof(tile->poc));
837 tile->poc.is_default = 1;
843 static int read_crg(Jpeg2000DecoderContext *s, int n)
845 if (s->ncomponents*4 != n - 2) {
846 av_log(s->avctx, AV_LOG_ERROR, "Invalid CRG marker.\n");
847 return AVERROR_INVALIDDATA;
849 bytestream2_skip(&s->g, n - 2);
852 /* Tile-part lengths: see ISO 15444-1:2002, section A.7.1
853 * Used to know the number of tile parts and lengths.
854 * There may be multiple TLMs in the header.
855 * TODO: The function is not used for tile-parts management, nor anywhere else.
856 * It can be useful to allocate memory for tile parts, before managing the SOT
857 * markers. Parsing the TLM header is needed to increment the input header
859 * This marker is mandatory for DCI. */
860 static int get_tlm(Jpeg2000DecoderContext *s, int n)
862 uint8_t Stlm, ST, SP, tile_tlm, i;
863 bytestream2_get_byte(&s->g); /* Ztlm: skipped */
864 Stlm = bytestream2_get_byte(&s->g);
866 // too complex ? ST = ((Stlm >> 4) & 0x01) + ((Stlm >> 4) & 0x02);
867 ST = (Stlm >> 4) & 0x03;
869 av_log(s->avctx, AV_LOG_ERROR, "TLM marker contains invalid ST value.\n");
870 return AVERROR_INVALIDDATA;
873 SP = (Stlm >> 6) & 0x01;
874 tile_tlm = (n - 4) / ((SP + 1) * 2 + ST);
875 for (i = 0; i < tile_tlm; i++) {
880 bytestream2_get_byte(&s->g);
883 bytestream2_get_be16(&s->g);
886 bytestream2_get_be32(&s->g);
890 bytestream2_get_be16(&s->g);
892 bytestream2_get_be32(&s->g);
898 static int get_plt(Jpeg2000DecoderContext *s, int n)
903 av_log(s->avctx, AV_LOG_DEBUG,
904 "PLT marker at pos 0x%X\n", bytestream2_tell(&s->g) - 4);
907 return AVERROR_INVALIDDATA;
909 /*Zplt =*/ bytestream2_get_byte(&s->g);
911 for (i = 0; i < n - 3; i++) {
912 v = bytestream2_get_byte(&s->g);
915 return AVERROR_INVALIDDATA;
920 static int get_ppt(Jpeg2000DecoderContext *s, int n)
926 av_log(s->avctx, AV_LOG_ERROR, "Invalid length for PPT data.\n");
927 return AVERROR_INVALIDDATA;
929 if (s->curtileno < 0)
930 return AVERROR_INVALIDDATA;
932 tile = &s->tile[s->curtileno];
933 if (tile->tp_idx != 0) {
934 av_log(s->avctx, AV_LOG_ERROR,
935 "PPT marker can occur only on first tile part of a tile.\n");
936 return AVERROR_INVALIDDATA;
939 tile->has_ppt = 1; // this tile has a ppt marker
940 bytestream2_get_byte(&s->g); // Zppt is skipped and not used
941 new = av_realloc(tile->packed_headers,
942 tile->packed_headers_size + n - 3);
944 tile->packed_headers = new;
946 return AVERROR(ENOMEM);
947 memset(&tile->packed_headers_stream, 0, sizeof(tile->packed_headers_stream));
948 memcpy(tile->packed_headers + tile->packed_headers_size,
950 tile->packed_headers_size += n - 3;
951 bytestream2_skip(&s->g, n - 3);
956 static int init_tile(Jpeg2000DecoderContext *s, int tileno)
959 int tilex = tileno % s->numXtiles;
960 int tiley = tileno / s->numXtiles;
961 Jpeg2000Tile *tile = s->tile + tileno;
964 return AVERROR(ENOMEM);
966 tile->coord[0][0] = av_clip(tilex * (int64_t)s->tile_width + s->tile_offset_x, s->image_offset_x, s->width);
967 tile->coord[0][1] = av_clip((tilex + 1) * (int64_t)s->tile_width + s->tile_offset_x, s->image_offset_x, s->width);
968 tile->coord[1][0] = av_clip(tiley * (int64_t)s->tile_height + s->tile_offset_y, s->image_offset_y, s->height);
969 tile->coord[1][1] = av_clip((tiley + 1) * (int64_t)s->tile_height + s->tile_offset_y, s->image_offset_y, s->height);
971 for (compno = 0; compno < s->ncomponents; compno++) {
972 Jpeg2000Component *comp = tile->comp + compno;
973 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
974 Jpeg2000QuantStyle *qntsty = tile->qntsty + compno;
975 int ret; // global bandno
977 comp->coord_o[0][0] = tile->coord[0][0];
978 comp->coord_o[0][1] = tile->coord[0][1];
979 comp->coord_o[1][0] = tile->coord[1][0];
980 comp->coord_o[1][1] = tile->coord[1][1];
982 comp->coord_o[0][0] /= s->cdx[compno];
983 comp->coord_o[0][1] /= s->cdx[compno];
984 comp->coord_o[1][0] /= s->cdy[compno];
985 comp->coord_o[1][1] /= s->cdy[compno];
988 comp->coord[0][0] = ff_jpeg2000_ceildivpow2(comp->coord_o[0][0], s->reduction_factor);
989 comp->coord[0][1] = ff_jpeg2000_ceildivpow2(comp->coord_o[0][1], s->reduction_factor);
990 comp->coord[1][0] = ff_jpeg2000_ceildivpow2(comp->coord_o[1][0], s->reduction_factor);
991 comp->coord[1][1] = ff_jpeg2000_ceildivpow2(comp->coord_o[1][1], s->reduction_factor);
993 if (!comp->roi_shift)
994 comp->roi_shift = s->roi_shift[compno];
996 if (ret = ff_jpeg2000_init_component(comp, codsty, qntsty,
997 s->cbps[compno], s->cdx[compno],
998 s->cdy[compno], s->avctx))
1004 /* Read the number of coding passes. */
1005 static int getnpasses(Jpeg2000DecoderContext *s)
1008 if (!get_bits(s, 1))
1010 if (!get_bits(s, 1))
1012 if ((num = get_bits(s, 2)) != 3)
1013 return num < 0 ? num : 3 + num;
1014 if ((num = get_bits(s, 5)) != 31)
1015 return num < 0 ? num : 6 + num;
1016 num = get_bits(s, 7);
1017 return num < 0 ? num : 37 + num;
1020 static int getlblockinc(Jpeg2000DecoderContext *s)
1023 while (ret = get_bits(s, 1)) {
1031 static inline void select_stream(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile,
1034 s->g = tile->tile_part[*tp_index].tpg;
1035 if (bytestream2_get_bytes_left(&s->g) == 0 && s->bit_index == 8) {
1036 if (*tp_index < FF_ARRAY_ELEMS(tile->tile_part) - 1) {
1037 s->g = tile->tile_part[++(*tp_index)].tpg;
1040 if (bytestream2_peek_be32(&s->g) == JPEG2000_SOP_FIXED_BYTES)
1041 bytestream2_skip(&s->g, JPEG2000_SOP_BYTE_LENGTH);
1044 static int jpeg2000_decode_packet(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile, int *tp_index,
1045 Jpeg2000CodingStyle *codsty,
1046 Jpeg2000ResLevel *rlevel, int precno,
1047 int layno, uint8_t *expn, int numgbits)
1049 int bandno, cblkno, ret, nb_code_blocks;
1052 if (layno < rlevel->band[0].prec[precno].decoded_layers)
1054 rlevel->band[0].prec[precno].decoded_layers = layno + 1;
1055 // Select stream to read from
1057 s->g = tile->packed_headers_stream;
1059 select_stream(s, tile, tp_index);
1061 if (!(ret = get_bits(s, 1))) {
1067 for (bandno = 0; bandno < rlevel->nbands; bandno++) {
1068 Jpeg2000Band *band = rlevel->band + bandno;
1069 Jpeg2000Prec *prec = band->prec + precno;
1071 if (band->coord[0][0] == band->coord[0][1] ||
1072 band->coord[1][0] == band->coord[1][1])
1074 nb_code_blocks = prec->nb_codeblocks_height *
1075 prec->nb_codeblocks_width;
1076 for (cblkno = 0; cblkno < nb_code_blocks; cblkno++) {
1077 Jpeg2000Cblk *cblk = prec->cblk + cblkno;
1078 int incl, newpasses, llen;
1082 incl = get_bits(s, 1);
1084 incl = tag_tree_decode(s, prec->cblkincl + cblkno, layno + 1) == layno;
1090 if (!cblk->npasses) {
1091 int v = expn[bandno] + numgbits - 1 -
1092 tag_tree_decode(s, prec->zerobits + cblkno, 100);
1093 if (v < 0 || v > 30) {
1094 av_log(s->avctx, AV_LOG_ERROR,
1095 "nonzerobits %d invalid or unsupported\n", v);
1096 return AVERROR_INVALIDDATA;
1098 cblk->nonzerobits = v;
1100 if ((newpasses = getnpasses(s)) < 0)
1102 av_assert2(newpasses > 0);
1103 if (cblk->npasses + newpasses >= JPEG2000_MAX_PASSES) {
1104 avpriv_request_sample(s->avctx, "Too many passes");
1105 return AVERROR_PATCHWELCOME;
1107 if ((llen = getlblockinc(s)) < 0)
1109 if (cblk->lblock + llen + av_log2(newpasses) > 16) {
1110 avpriv_request_sample(s->avctx,
1111 "Block with length beyond 16 bits");
1112 return AVERROR_PATCHWELCOME;
1115 cblk->lblock += llen;
1117 cblk->nb_lengthinc = 0;
1118 cblk->nb_terminationsinc = 0;
1119 av_free(cblk->lengthinc);
1120 cblk->lengthinc = av_mallocz_array(newpasses , sizeof(*cblk->lengthinc));
1121 if (!cblk->lengthinc)
1122 return AVERROR(ENOMEM);
1123 tmp = av_realloc_array(cblk->data_start, cblk->nb_terminations + newpasses + 1, sizeof(*cblk->data_start));
1125 return AVERROR(ENOMEM);
1126 cblk->data_start = tmp;
1130 while (newpasses1 < newpasses) {
1132 if (needs_termination(codsty->cblk_style, cblk->npasses + newpasses1 - 1)) {
1133 cblk->nb_terminationsinc ++;
1138 if ((ret = get_bits(s, av_log2(newpasses1) + cblk->lblock)) < 0)
1140 if (ret > cblk->data_allocated) {
1141 size_t new_size = FFMAX(2*cblk->data_allocated, ret);
1142 void *new = av_realloc(cblk->data, new_size);
1145 cblk->data_allocated = new_size;
1148 if (ret > cblk->data_allocated) {
1149 avpriv_request_sample(s->avctx,
1150 "Block with lengthinc greater than %"SIZE_SPECIFIER"",
1151 cblk->data_allocated);
1152 return AVERROR_PATCHWELCOME;
1154 cblk->lengthinc[cblk->nb_lengthinc++] = ret;
1155 cblk->npasses += newpasses1;
1156 newpasses -= newpasses1;
1162 if (codsty->csty & JPEG2000_CSTY_EPH) {
1163 if (bytestream2_peek_be16(&s->g) == JPEG2000_EPH)
1164 bytestream2_skip(&s->g, 2);
1166 av_log(s->avctx, AV_LOG_ERROR, "EPH marker not found. instead %X\n", bytestream2_peek_be32(&s->g));
1169 // Save state of stream
1170 if (tile->has_ppt) {
1171 tile->packed_headers_stream = s->g;
1172 select_stream(s, tile, tp_index);
1174 for (bandno = 0; bandno < rlevel->nbands; bandno++) {
1175 Jpeg2000Band *band = rlevel->band + bandno;
1176 Jpeg2000Prec *prec = band->prec + precno;
1178 nb_code_blocks = prec->nb_codeblocks_height * prec->nb_codeblocks_width;
1179 for (cblkno = 0; cblkno < nb_code_blocks; cblkno++) {
1180 Jpeg2000Cblk *cblk = prec->cblk + cblkno;
1181 if (!cblk->nb_terminationsinc && !cblk->lengthinc)
1183 for (cwsno = 0; cwsno < cblk->nb_lengthinc; cwsno ++) {
1184 if (cblk->data_allocated < cblk->length + cblk->lengthinc[cwsno] + 4) {
1185 size_t new_size = FFMAX(2*cblk->data_allocated, cblk->length + cblk->lengthinc[cwsno] + 4);
1186 void *new = av_realloc(cblk->data, new_size);
1189 cblk->data_allocated = new_size;
1192 if ( bytestream2_get_bytes_left(&s->g) < cblk->lengthinc[cwsno]
1193 || cblk->data_allocated < cblk->length + cblk->lengthinc[cwsno] + 4
1195 av_log(s->avctx, AV_LOG_ERROR,
1196 "Block length %"PRIu16" or lengthinc %d is too large, left %d\n",
1197 cblk->length, cblk->lengthinc[cwsno], bytestream2_get_bytes_left(&s->g));
1198 return AVERROR_INVALIDDATA;
1201 bytestream2_get_bufferu(&s->g, cblk->data + cblk->length, cblk->lengthinc[cwsno]);
1202 cblk->length += cblk->lengthinc[cwsno];
1203 cblk->lengthinc[cwsno] = 0;
1204 if (cblk->nb_terminationsinc) {
1205 cblk->nb_terminationsinc--;
1206 cblk->nb_terminations++;
1207 cblk->data[cblk->length++] = 0xFF;
1208 cblk->data[cblk->length++] = 0xFF;
1209 cblk->data_start[cblk->nb_terminations] = cblk->length;
1212 av_freep(&cblk->lengthinc);
1215 // Save state of stream
1216 tile->tile_part[*tp_index].tpg = s->g;
1221 tile->packed_headers_stream = s->g;
1223 tile->tile_part[*tp_index].tpg = s->g;
1227 static int jpeg2000_decode_packets_po_iteration(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile,
1228 int RSpoc, int CSpoc,
1229 int LYEpoc, int REpoc, int CEpoc,
1230 int Ppoc, int *tp_index)
1233 int layno, reslevelno, compno, precno, ok_reslevel;
1238 case JPEG2000_PGOD_RLCP:
1239 av_log(s->avctx, AV_LOG_DEBUG, "Progression order RLCP\n");
1241 for (reslevelno = RSpoc; ok_reslevel && reslevelno < REpoc; reslevelno++) {
1243 for (layno = 0; layno < LYEpoc; layno++) {
1244 for (compno = CSpoc; compno < CEpoc; compno++) {
1245 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1246 Jpeg2000QuantStyle *qntsty = tile->qntsty + compno;
1247 if (reslevelno < codsty->nreslevels) {
1248 Jpeg2000ResLevel *rlevel = tile->comp[compno].reslevel +
1251 for (precno = 0; precno < rlevel->num_precincts_x * rlevel->num_precincts_y; precno++)
1252 if ((ret = jpeg2000_decode_packet(s, tile, tp_index,
1255 qntsty->expn + (reslevelno ? 3 * (reslevelno - 1) + 1 : 0),
1256 qntsty->nguardbits)) < 0)
1264 case JPEG2000_PGOD_LRCP:
1265 av_log(s->avctx, AV_LOG_DEBUG, "Progression order LRCP\n");
1266 for (layno = 0; layno < LYEpoc; layno++) {
1268 for (reslevelno = RSpoc; ok_reslevel && reslevelno < REpoc; reslevelno++) {
1270 for (compno = CSpoc; compno < CEpoc; compno++) {
1271 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1272 Jpeg2000QuantStyle *qntsty = tile->qntsty + compno;
1273 if (reslevelno < codsty->nreslevels) {
1274 Jpeg2000ResLevel *rlevel = tile->comp[compno].reslevel +
1277 for (precno = 0; precno < rlevel->num_precincts_x * rlevel->num_precincts_y; precno++)
1278 if ((ret = jpeg2000_decode_packet(s, tile, tp_index,
1281 qntsty->expn + (reslevelno ? 3 * (reslevelno - 1) + 1 : 0),
1282 qntsty->nguardbits)) < 0)
1290 case JPEG2000_PGOD_CPRL:
1291 av_log(s->avctx, AV_LOG_DEBUG, "Progression order CPRL\n");
1292 for (compno = CSpoc; compno < CEpoc; compno++) {
1293 Jpeg2000Component *comp = tile->comp + compno;
1294 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1295 Jpeg2000QuantStyle *qntsty = tile->qntsty + compno;
1299 if (RSpoc >= FFMIN(codsty->nreslevels, REpoc))
1302 for (reslevelno = RSpoc; reslevelno < FFMIN(codsty->nreslevels, REpoc); reslevelno++) {
1303 uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; // ==> N_L - r
1304 Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
1305 step_x = FFMIN(step_x, rlevel->log2_prec_width + reducedresno);
1306 step_y = FFMIN(step_y, rlevel->log2_prec_height + reducedresno);
1308 if (step_x >= 31 || step_y >= 31){
1309 avpriv_request_sample(s->avctx, "CPRL with large step");
1310 return AVERROR_PATCHWELCOME;
1315 for (y = tile->coord[1][0]; y < tile->coord[1][1]; y = (y/step_y + 1)*step_y) {
1316 for (x = tile->coord[0][0]; x < tile->coord[0][1]; x = (x/step_x + 1)*step_x) {
1317 for (reslevelno = RSpoc; reslevelno < FFMIN(codsty->nreslevels, REpoc); reslevelno++) {
1318 unsigned prcx, prcy;
1319 uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; // ==> N_L - r
1320 Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
1321 int xc = x / s->cdx[compno];
1322 int yc = y / s->cdy[compno];
1324 if (yc % (1LL << (rlevel->log2_prec_height + reducedresno)) && y != tile->coord[1][0]) //FIXME this is a subset of the check
1327 if (xc % (1LL << (rlevel->log2_prec_width + reducedresno)) && x != tile->coord[0][0]) //FIXME this is a subset of the check
1330 // check if a precinct exists
1331 prcx = ff_jpeg2000_ceildivpow2(xc, reducedresno) >> rlevel->log2_prec_width;
1332 prcy = ff_jpeg2000_ceildivpow2(yc, reducedresno) >> rlevel->log2_prec_height;
1333 prcx -= ff_jpeg2000_ceildivpow2(comp->coord_o[0][0], reducedresno) >> rlevel->log2_prec_width;
1334 prcy -= ff_jpeg2000_ceildivpow2(comp->coord_o[1][0], reducedresno) >> rlevel->log2_prec_height;
1336 precno = prcx + rlevel->num_precincts_x * prcy;
1338 if (prcx >= rlevel->num_precincts_x || prcy >= rlevel->num_precincts_y) {
1339 av_log(s->avctx, AV_LOG_WARNING, "prc %d %d outside limits %d %d\n",
1340 prcx, prcy, rlevel->num_precincts_x, rlevel->num_precincts_y);
1344 for (layno = 0; layno < LYEpoc; layno++) {
1345 if ((ret = jpeg2000_decode_packet(s, tile, tp_index, codsty, rlevel,
1347 qntsty->expn + (reslevelno ? 3 * (reslevelno - 1) + 1 : 0),
1348 qntsty->nguardbits)) < 0)
1357 case JPEG2000_PGOD_RPCL:
1358 av_log(s->avctx, AV_LOG_WARNING, "Progression order RPCL\n");
1360 for (reslevelno = RSpoc; ok_reslevel && reslevelno < REpoc; reslevelno++) {
1364 for (compno = CSpoc; compno < CEpoc; compno++) {
1365 Jpeg2000Component *comp = tile->comp + compno;
1366 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1368 if (reslevelno < codsty->nreslevels) {
1369 uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; // ==> N_L - r
1370 Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
1371 step_x = FFMIN(step_x, rlevel->log2_prec_width + reducedresno);
1372 step_y = FFMIN(step_y, rlevel->log2_prec_height + reducedresno);
1378 for (y = tile->coord[1][0]; y < tile->coord[1][1]; y = (y/step_y + 1)*step_y) {
1379 for (x = tile->coord[0][0]; x < tile->coord[0][1]; x = (x/step_x + 1)*step_x) {
1380 for (compno = CSpoc; compno < CEpoc; compno++) {
1381 Jpeg2000Component *comp = tile->comp + compno;
1382 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1383 Jpeg2000QuantStyle *qntsty = tile->qntsty + compno;
1384 uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; // ==> N_L - r
1385 Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
1386 unsigned prcx, prcy;
1388 int xc = x / s->cdx[compno];
1389 int yc = y / s->cdy[compno];
1391 if (reslevelno >= codsty->nreslevels)
1394 if (yc % (1LL << (rlevel->log2_prec_height + reducedresno)) && y != tile->coord[1][0]) //FIXME this is a subset of the check
1397 if (xc % (1LL << (rlevel->log2_prec_width + reducedresno)) && x != tile->coord[0][0]) //FIXME this is a subset of the check
1400 // check if a precinct exists
1401 prcx = ff_jpeg2000_ceildivpow2(xc, reducedresno) >> rlevel->log2_prec_width;
1402 prcy = ff_jpeg2000_ceildivpow2(yc, reducedresno) >> rlevel->log2_prec_height;
1403 prcx -= ff_jpeg2000_ceildivpow2(comp->coord_o[0][0], reducedresno) >> rlevel->log2_prec_width;
1404 prcy -= ff_jpeg2000_ceildivpow2(comp->coord_o[1][0], reducedresno) >> rlevel->log2_prec_height;
1406 precno = prcx + rlevel->num_precincts_x * prcy;
1409 if (prcx >= rlevel->num_precincts_x || prcy >= rlevel->num_precincts_y) {
1410 av_log(s->avctx, AV_LOG_WARNING, "prc %d %d outside limits %d %d\n",
1411 prcx, prcy, rlevel->num_precincts_x, rlevel->num_precincts_y);
1415 for (layno = 0; layno < LYEpoc; layno++) {
1416 if ((ret = jpeg2000_decode_packet(s, tile, tp_index,
1419 qntsty->expn + (reslevelno ? 3 * (reslevelno - 1) + 1 : 0),
1420 qntsty->nguardbits)) < 0)
1429 case JPEG2000_PGOD_PCRL:
1430 av_log(s->avctx, AV_LOG_WARNING, "Progression order PCRL\n");
1433 for (compno = CSpoc; compno < CEpoc; compno++) {
1434 Jpeg2000Component *comp = tile->comp + compno;
1435 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1437 for (reslevelno = RSpoc; reslevelno < FFMIN(codsty->nreslevels, REpoc); reslevelno++) {
1438 uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; // ==> N_L - r
1439 Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
1440 step_x = FFMIN(step_x, rlevel->log2_prec_width + reducedresno);
1441 step_y = FFMIN(step_y, rlevel->log2_prec_height + reducedresno);
1444 if (step_x >= 31 || step_y >= 31){
1445 avpriv_request_sample(s->avctx, "PCRL with large step");
1446 return AVERROR_PATCHWELCOME;
1451 for (y = tile->coord[1][0]; y < tile->coord[1][1]; y = (y/step_y + 1)*step_y) {
1452 for (x = tile->coord[0][0]; x < tile->coord[0][1]; x = (x/step_x + 1)*step_x) {
1453 for (compno = CSpoc; compno < CEpoc; compno++) {
1454 Jpeg2000Component *comp = tile->comp + compno;
1455 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1456 Jpeg2000QuantStyle *qntsty = tile->qntsty + compno;
1457 int xc = x / s->cdx[compno];
1458 int yc = y / s->cdy[compno];
1460 for (reslevelno = RSpoc; reslevelno < FFMIN(codsty->nreslevels, REpoc); reslevelno++) {
1461 unsigned prcx, prcy;
1462 uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; // ==> N_L - r
1463 Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
1465 if (yc % (1LL << (rlevel->log2_prec_height + reducedresno)) && y != tile->coord[1][0]) //FIXME this is a subset of the check
1468 if (xc % (1LL << (rlevel->log2_prec_width + reducedresno)) && x != tile->coord[0][0]) //FIXME this is a subset of the check
1471 // check if a precinct exists
1472 prcx = ff_jpeg2000_ceildivpow2(xc, reducedresno) >> rlevel->log2_prec_width;
1473 prcy = ff_jpeg2000_ceildivpow2(yc, reducedresno) >> rlevel->log2_prec_height;
1474 prcx -= ff_jpeg2000_ceildivpow2(comp->coord_o[0][0], reducedresno) >> rlevel->log2_prec_width;
1475 prcy -= ff_jpeg2000_ceildivpow2(comp->coord_o[1][0], reducedresno) >> rlevel->log2_prec_height;
1477 precno = prcx + rlevel->num_precincts_x * prcy;
1479 if (prcx >= rlevel->num_precincts_x || prcy >= rlevel->num_precincts_y) {
1480 av_log(s->avctx, AV_LOG_WARNING, "prc %d %d outside limits %d %d\n",
1481 prcx, prcy, rlevel->num_precincts_x, rlevel->num_precincts_y);
1485 for (layno = 0; layno < LYEpoc; layno++) {
1486 if ((ret = jpeg2000_decode_packet(s, tile, tp_index, codsty, rlevel,
1488 qntsty->expn + (reslevelno ? 3 * (reslevelno - 1) + 1 : 0),
1489 qntsty->nguardbits)) < 0)
1505 static int jpeg2000_decode_packets(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile)
1507 int ret = AVERROR_BUG;
1512 if (tile->poc.nb_poc) {
1513 for (i=0; i<tile->poc.nb_poc; i++) {
1514 Jpeg2000POCEntry *e = &tile->poc.poc[i];
1515 ret = jpeg2000_decode_packets_po_iteration(s, tile,
1517 FFMIN(e->LYEpoc, tile->codsty[0].nlayers),
1519 FFMIN(e->CEpoc, s->ncomponents),
1526 ret = jpeg2000_decode_packets_po_iteration(s, tile,
1528 tile->codsty[0].nlayers,
1531 tile->codsty[0].prog_order,
1535 /* EOC marker reached */
1536 bytestream2_skip(&s->g, 2);
1541 /* TIER-1 routines */
1542 static void decode_sigpass(Jpeg2000T1Context *t1, int width, int height,
1543 int bpno, int bandno,
1544 int vert_causal_ctx_csty_symbol)
1546 int mask = 3 << (bpno - 1), y0, x, y;
1548 for (y0 = 0; y0 < height; y0 += 4)
1549 for (x = 0; x < width; x++)
1550 for (y = y0; y < height && y < y0 + 4; y++) {
1551 int flags_mask = -1;
1552 if (vert_causal_ctx_csty_symbol && y == y0 + 3)
1553 flags_mask &= ~(JPEG2000_T1_SIG_S | JPEG2000_T1_SIG_SW | JPEG2000_T1_SIG_SE | JPEG2000_T1_SGN_S);
1554 if ((t1->flags[(y+1) * t1->stride + x+1] & JPEG2000_T1_SIG_NB & flags_mask)
1555 && !(t1->flags[(y+1) * t1->stride + x+1] & (JPEG2000_T1_SIG | JPEG2000_T1_VIS))) {
1556 if (ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ff_jpeg2000_getsigctxno(t1->flags[(y+1) * t1->stride + x+1] & flags_mask, bandno))) {
1557 int xorbit, ctxno = ff_jpeg2000_getsgnctxno(t1->flags[(y+1) * t1->stride + x+1] & flags_mask, &xorbit);
1559 t1->data[(y) * t1->stride + x] = ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ctxno) ? -mask : mask;
1561 t1->data[(y) * t1->stride + x] = (ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ctxno) ^ xorbit) ?
1564 ff_jpeg2000_set_significance(t1, x, y,
1565 t1->data[(y) * t1->stride + x] < 0);
1567 t1->flags[(y + 1) * t1->stride + x + 1] |= JPEG2000_T1_VIS;
1572 static void decode_refpass(Jpeg2000T1Context *t1, int width, int height,
1573 int bpno, int vert_causal_ctx_csty_symbol)
1578 phalf = 1 << (bpno - 1);
1581 for (y0 = 0; y0 < height; y0 += 4)
1582 for (x = 0; x < width; x++)
1583 for (y = y0; y < height && y < y0 + 4; y++)
1584 if ((t1->flags[(y + 1) * t1->stride + x + 1] & (JPEG2000_T1_SIG | JPEG2000_T1_VIS)) == JPEG2000_T1_SIG) {
1585 int flags_mask = (vert_causal_ctx_csty_symbol && y == y0 + 3) ?
1586 ~(JPEG2000_T1_SIG_S | JPEG2000_T1_SIG_SW | JPEG2000_T1_SIG_SE | JPEG2000_T1_SGN_S) : -1;
1587 int ctxno = ff_jpeg2000_getrefctxno(t1->flags[(y + 1) * t1->stride + x + 1] & flags_mask);
1588 int r = ff_mqc_decode(&t1->mqc,
1589 t1->mqc.cx_states + ctxno)
1591 t1->data[(y) * t1->stride + x] += t1->data[(y) * t1->stride + x] < 0 ? -r : r;
1592 t1->flags[(y + 1) * t1->stride + x + 1] |= JPEG2000_T1_REF;
1596 static void decode_clnpass(Jpeg2000DecoderContext *s, Jpeg2000T1Context *t1,
1597 int width, int height, int bpno, int bandno,
1598 int seg_symbols, int vert_causal_ctx_csty_symbol)
1600 int mask = 3 << (bpno - 1), y0, x, y, runlen, dec;
1602 for (y0 = 0; y0 < height; y0 += 4) {
1603 for (x = 0; x < width; x++) {
1604 int flags_mask = -1;
1605 if (vert_causal_ctx_csty_symbol)
1606 flags_mask &= ~(JPEG2000_T1_SIG_S | JPEG2000_T1_SIG_SW | JPEG2000_T1_SIG_SE | JPEG2000_T1_SGN_S);
1607 if (y0 + 3 < height &&
1608 !((t1->flags[(y0 + 1) * t1->stride + x + 1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG)) ||
1609 (t1->flags[(y0 + 2) * t1->stride + x + 1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG)) ||
1610 (t1->flags[(y0 + 3) * t1->stride + x + 1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG)) ||
1611 (t1->flags[(y0 + 4) * t1->stride + x + 1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG) & flags_mask))) {
1612 if (!ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_RL))
1614 runlen = ff_mqc_decode(&t1->mqc,
1615 t1->mqc.cx_states + MQC_CX_UNI);
1616 runlen = (runlen << 1) | ff_mqc_decode(&t1->mqc,
1625 for (y = y0 + runlen; y < y0 + 4 && y < height; y++) {
1626 int flags_mask = -1;
1627 if (vert_causal_ctx_csty_symbol && y == y0 + 3)
1628 flags_mask &= ~(JPEG2000_T1_SIG_S | JPEG2000_T1_SIG_SW | JPEG2000_T1_SIG_SE | JPEG2000_T1_SGN_S);
1630 if (!(t1->flags[(y+1) * t1->stride + x+1] & (JPEG2000_T1_SIG | JPEG2000_T1_VIS))) {
1631 dec = ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ff_jpeg2000_getsigctxno(t1->flags[(y+1) * t1->stride + x+1] & flags_mask,
1637 int ctxno = ff_jpeg2000_getsgnctxno(t1->flags[(y + 1) * t1->stride + x + 1] & flags_mask,
1639 t1->data[(y) * t1->stride + x] = (ff_mqc_decode(&t1->mqc,
1640 t1->mqc.cx_states + ctxno) ^
1643 ff_jpeg2000_set_significance(t1, x, y, t1->data[(y) * t1->stride + x] < 0);
1646 t1->flags[(y + 1) * t1->stride + x + 1] &= ~JPEG2000_T1_VIS;
1652 val = ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_UNI);
1653 val = (val << 1) + ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_UNI);
1654 val = (val << 1) + ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_UNI);
1655 val = (val << 1) + ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_UNI);
1657 av_log(s->avctx, AV_LOG_ERROR,
1658 "Segmentation symbol value incorrect\n");
1662 static int decode_cblk(Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *codsty,
1663 Jpeg2000T1Context *t1, Jpeg2000Cblk *cblk,
1664 int width, int height, int bandpos, uint8_t roi_shift)
1666 int passno = cblk->npasses, pass_t = 2, bpno = cblk->nonzerobits - 1 + roi_shift;
1668 int vert_causal_ctx_csty_symbol = codsty->cblk_style & JPEG2000_CBLK_VSC;
1672 av_assert0(width <= 1024U && height <= 1024U);
1673 av_assert0(width*height <= 4096);
1675 memset(t1->data, 0, t1->stride * height * sizeof(*t1->data));
1677 /* If code-block contains no compressed data: nothing to do. */
1681 memset(t1->flags, 0, t1->stride * (height + 2) * sizeof(*t1->flags));
1683 cblk->data[cblk->length] = 0xff;
1684 cblk->data[cblk->length+1] = 0xff;
1685 ff_mqc_initdec(&t1->mqc, cblk->data, 0, 1);
1688 if (bpno < 0 || bpno > 29) {
1689 av_log(s->avctx, AV_LOG_ERROR, "bpno became invalid\n");
1690 return AVERROR_INVALIDDATA;
1694 decode_sigpass(t1, width, height, bpno + 1, bandpos,
1695 vert_causal_ctx_csty_symbol);
1698 decode_refpass(t1, width, height, bpno + 1, vert_causal_ctx_csty_symbol);
1701 av_assert2(!t1->mqc.raw);
1702 decode_clnpass(s, t1, width, height, bpno + 1, bandpos,
1703 codsty->cblk_style & JPEG2000_CBLK_SEGSYM,
1704 vert_causal_ctx_csty_symbol);
1707 if (codsty->cblk_style & JPEG2000_CBLK_RESET) // XXX no testcase for just this
1708 ff_mqc_init_contexts(&t1->mqc);
1710 if (passno && (coder_type = needs_termination(codsty->cblk_style, pass_cnt))) {
1711 if (term_cnt >= cblk->nb_terminations) {
1712 av_log(s->avctx, AV_LOG_ERROR, "Missing needed termination \n");
1713 return AVERROR_INVALIDDATA;
1715 if (FFABS(cblk->data + cblk->data_start[term_cnt + 1] - 2 - t1->mqc.bp) > 0) {
1716 av_log(s->avctx, AV_LOG_WARNING, "Mid mismatch %"PTRDIFF_SPECIFIER" in pass %d of %d\n",
1717 cblk->data + cblk->data_start[term_cnt + 1] - 2 - t1->mqc.bp,
1718 pass_cnt, cblk->npasses);
1721 ff_mqc_initdec(&t1->mqc, cblk->data + cblk->data_start[++term_cnt], coder_type == 2, 0);
1732 if (cblk->data + cblk->length - 2*(term_cnt < cblk->nb_terminations) != t1->mqc.bp) {
1733 av_log(s->avctx, AV_LOG_WARNING, "End mismatch %"PTRDIFF_SPECIFIER"\n",
1734 cblk->data + cblk->length - 2*(term_cnt < cblk->nb_terminations) - t1->mqc.bp);
1740 static inline int roi_shift_param(Jpeg2000Component *comp,
1745 roi_shift = comp->roi_shift;
1746 val = (quan_parameter < 0)?-quan_parameter:quan_parameter;
1748 if (val > (1 << roi_shift))
1749 return (quan_parameter < 0)?-(val >> roi_shift):(val >> roi_shift);
1750 return quan_parameter;
1753 /* TODO: Verify dequantization for lossless case
1754 * comp->data can be float or int
1755 * band->stepsize can be float or int
1756 * depending on the type of DWT transformation.
1757 * see ISO/IEC 15444-1:2002 A.6.1 */
1759 /* Float dequantization of a codeblock.*/
1760 static void dequantization_float(int x, int y, Jpeg2000Cblk *cblk,
1761 Jpeg2000Component *comp,
1762 Jpeg2000T1Context *t1, Jpeg2000Band *band)
1765 int w = cblk->coord[0][1] - cblk->coord[0][0];
1766 for (j = 0; j < (cblk->coord[1][1] - cblk->coord[1][0]); ++j) {
1767 float *datap = &comp->f_data[(comp->coord[0][1] - comp->coord[0][0]) * (y + j) + x];
1768 int *src = t1->data + j*t1->stride;
1769 for (i = 0; i < w; ++i)
1770 datap[i] = src[i] * band->f_stepsize;
1774 /* Integer dequantization of a codeblock.*/
1775 static void dequantization_int(int x, int y, Jpeg2000Cblk *cblk,
1776 Jpeg2000Component *comp,
1777 Jpeg2000T1Context *t1, Jpeg2000Band *band)
1780 int w = cblk->coord[0][1] - cblk->coord[0][0];
1781 for (j = 0; j < (cblk->coord[1][1] - cblk->coord[1][0]); ++j) {
1782 int32_t *datap = &comp->i_data[(comp->coord[0][1] - comp->coord[0][0]) * (y + j) + x];
1783 int *src = t1->data + j*t1->stride;
1784 if (band->i_stepsize == 32768) {
1785 for (i = 0; i < w; ++i)
1786 datap[i] = src[i] / 2;
1788 // This should be VERY uncommon
1789 for (i = 0; i < w; ++i)
1790 datap[i] = (src[i] * (int64_t)band->i_stepsize) / 65536;
1795 static void dequantization_int_97(int x, int y, Jpeg2000Cblk *cblk,
1796 Jpeg2000Component *comp,
1797 Jpeg2000T1Context *t1, Jpeg2000Band *band)
1800 int w = cblk->coord[0][1] - cblk->coord[0][0];
1801 for (j = 0; j < (cblk->coord[1][1] - cblk->coord[1][0]); ++j) {
1802 int32_t *datap = &comp->i_data[(comp->coord[0][1] - comp->coord[0][0]) * (y + j) + x];
1803 int *src = t1->data + j*t1->stride;
1804 for (i = 0; i < w; ++i)
1805 datap[i] = (src[i] * (int64_t)band->i_stepsize + (1<<15)) >> 16;
1809 static inline void mct_decode(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile)
1814 for (i = 1; i < 3; i++) {
1815 if (tile->codsty[0].transform != tile->codsty[i].transform) {
1816 av_log(s->avctx, AV_LOG_ERROR, "Transforms mismatch, MCT not supported\n");
1819 if (memcmp(tile->comp[0].coord, tile->comp[i].coord, sizeof(tile->comp[0].coord))) {
1820 av_log(s->avctx, AV_LOG_ERROR, "Coords mismatch, MCT not supported\n");
1825 for (i = 0; i < 3; i++)
1826 if (tile->codsty[0].transform == FF_DWT97)
1827 src[i] = tile->comp[i].f_data;
1829 src[i] = tile->comp[i].i_data;
1831 for (i = 0; i < 2; i++)
1832 csize *= tile->comp[0].coord[i][1] - tile->comp[0].coord[i][0];
1834 s->dsp.mct_decode[tile->codsty[0].transform](src[0], src[1], src[2], csize);
1837 static inline void roi_scale_cblk(Jpeg2000Cblk *cblk,
1838 Jpeg2000Component *comp,
1839 Jpeg2000T1Context *t1)
1842 int w = cblk->coord[0][1] - cblk->coord[0][0];
1843 for (j = 0; j < (cblk->coord[1][1] - cblk->coord[1][0]); ++j) {
1844 int *src = t1->data + j*t1->stride;
1845 for (i = 0; i < w; ++i)
1846 src[i] = roi_shift_param(comp, src[i]);
1850 static inline void tile_codeblocks(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile)
1852 Jpeg2000T1Context t1;
1854 int compno, reslevelno, bandno;
1856 /* Loop on tile components */
1857 for (compno = 0; compno < s->ncomponents; compno++) {
1858 Jpeg2000Component *comp = tile->comp + compno;
1859 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1862 t1.stride = (1<<codsty->log2_cblk_width) + 2;
1864 /* Loop on resolution levels */
1865 for (reslevelno = 0; reslevelno < codsty->nreslevels2decode; reslevelno++) {
1866 Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
1868 for (bandno = 0; bandno < rlevel->nbands; bandno++) {
1869 int nb_precincts, precno;
1870 Jpeg2000Band *band = rlevel->band + bandno;
1871 int cblkno = 0, bandpos;
1873 bandpos = bandno + (reslevelno > 0);
1875 if (band->coord[0][0] == band->coord[0][1] ||
1876 band->coord[1][0] == band->coord[1][1])
1879 nb_precincts = rlevel->num_precincts_x * rlevel->num_precincts_y;
1880 /* Loop on precincts */
1881 for (precno = 0; precno < nb_precincts; precno++) {
1882 Jpeg2000Prec *prec = band->prec + precno;
1884 /* Loop on codeblocks */
1886 cblkno < prec->nb_codeblocks_width * prec->nb_codeblocks_height;
1889 Jpeg2000Cblk *cblk = prec->cblk + cblkno;
1890 int ret = decode_cblk(s, codsty, &t1, cblk,
1891 cblk->coord[0][1] - cblk->coord[0][0],
1892 cblk->coord[1][1] - cblk->coord[1][0],
1893 bandpos, comp->roi_shift);
1898 x = cblk->coord[0][0] - band->coord[0][0];
1899 y = cblk->coord[1][0] - band->coord[1][0];
1901 if (comp->roi_shift)
1902 roi_scale_cblk(cblk, comp, &t1);
1903 if (codsty->transform == FF_DWT97)
1904 dequantization_float(x, y, cblk, comp, &t1, band);
1905 else if (codsty->transform == FF_DWT97_INT)
1906 dequantization_int_97(x, y, cblk, comp, &t1, band);
1908 dequantization_int(x, y, cblk, comp, &t1, band);
1912 } /* end reslevel */
1916 ff_dwt_decode(&comp->dwt, codsty->transform == FF_DWT97 ? (void*)comp->f_data : (void*)comp->i_data);
1921 #define WRITE_FRAME(D, PIXEL) \
1922 static inline void write_frame_ ## D(Jpeg2000DecoderContext * s, Jpeg2000Tile * tile, \
1923 AVFrame * picture, int precision) \
1925 const AVPixFmtDescriptor *pixdesc = av_pix_fmt_desc_get(s->avctx->pix_fmt); \
1926 int planar = !!(pixdesc->flags & AV_PIX_FMT_FLAG_PLANAR); \
1927 int pixelsize = planar ? 1 : pixdesc->nb_components; \
1932 for (compno = 0; compno < s->ncomponents; compno++) { \
1933 Jpeg2000Component *comp = tile->comp + compno; \
1934 Jpeg2000CodingStyle *codsty = tile->codsty + compno; \
1936 float *datap = comp->f_data; \
1937 int32_t *i_datap = comp->i_data; \
1938 int cbps = s->cbps[compno]; \
1939 int w = tile->comp[compno].coord[0][1] - s->image_offset_x; \
1943 plane = s->cdef[compno] ? s->cdef[compno]-1 : (s->ncomponents-1); \
1945 y = tile->comp[compno].coord[1][0] - s->image_offset_y / s->cdy[compno]; \
1946 line = (PIXEL *)picture->data[plane] + y * (picture->linesize[plane] / sizeof(PIXEL));\
1947 for (; y < tile->comp[compno].coord[1][1] - s->image_offset_y; y++) { \
1950 x = tile->comp[compno].coord[0][0] - s->image_offset_x / s->cdx[compno]; \
1951 dst = line + x * pixelsize + compno*!planar; \
1953 if (codsty->transform == FF_DWT97) { \
1954 for (; x < w; x++) { \
1955 int val = lrintf(*datap) + (1 << (cbps - 1)); \
1956 /* DC level shift and clip see ISO 15444-1:2002 G.1.2 */ \
1957 val = av_clip(val, 0, (1 << cbps) - 1); \
1958 *dst = val << (precision - cbps); \
1963 for (; x < w; x++) { \
1964 int val = *i_datap + (1 << (cbps - 1)); \
1965 /* DC level shift and clip see ISO 15444-1:2002 G.1.2 */ \
1966 val = av_clip(val, 0, (1 << cbps) - 1); \
1967 *dst = val << (precision - cbps); \
1972 line += picture->linesize[plane] / sizeof(PIXEL); \
1978 WRITE_FRAME(8, uint8_t)
1979 WRITE_FRAME(16, uint16_t)
1983 static int jpeg2000_decode_tile(AVCodecContext *avctx, void *td,
1984 int jobnr, int threadnr)
1986 Jpeg2000DecoderContext *s = avctx->priv_data;
1987 AVFrame *picture = td;
1988 Jpeg2000Tile *tile = s->tile + jobnr;
1991 tile_codeblocks(s, tile);
1993 /* inverse MCT transformation */
1994 if (tile->codsty[0].mct)
1995 mct_decode(s, tile);
1997 for (x = 0; x < s->ncomponents; x++) {
1998 if (s->cdef[x] < 0) {
1999 for (x = 0; x < s->ncomponents; x++) {
2002 if ((s->ncomponents & 1) == 0)
2003 s->cdef[s->ncomponents-1] = 0;
2008 if (s->precision <= 8) {
2009 write_frame_8(s, tile, picture, 8);
2011 int precision = picture->format == AV_PIX_FMT_XYZ12 ||
2012 picture->format == AV_PIX_FMT_RGB48 ||
2013 picture->format == AV_PIX_FMT_RGBA64 ||
2014 picture->format == AV_PIX_FMT_GRAY16 ? 16 : s->precision;
2016 write_frame_16(s, tile, picture, precision);
2022 static void jpeg2000_dec_cleanup(Jpeg2000DecoderContext *s)
2025 for (tileno = 0; tileno < s->numXtiles * s->numYtiles; tileno++) {
2026 if (s->tile[tileno].comp) {
2027 for (compno = 0; compno < s->ncomponents; compno++) {
2028 Jpeg2000Component *comp = s->tile[tileno].comp + compno;
2029 Jpeg2000CodingStyle *codsty = s->tile[tileno].codsty + compno;
2031 ff_jpeg2000_cleanup(comp, codsty);
2033 av_freep(&s->tile[tileno].comp);
2034 av_freep(&s->tile[tileno].packed_headers);
2035 s->tile[tileno].packed_headers_size = 0;
2039 memset(s->codsty, 0, sizeof(s->codsty));
2040 memset(s->qntsty, 0, sizeof(s->qntsty));
2041 memset(s->properties, 0, sizeof(s->properties));
2042 memset(&s->poc , 0, sizeof(s->poc));
2043 s->numXtiles = s->numYtiles = 0;
2047 static int jpeg2000_read_main_headers(Jpeg2000DecoderContext *s)
2049 Jpeg2000CodingStyle *codsty = s->codsty;
2050 Jpeg2000QuantStyle *qntsty = s->qntsty;
2051 Jpeg2000POC *poc = &s->poc;
2052 uint8_t *properties = s->properties;
2059 if (bytestream2_get_bytes_left(&s->g) < 2) {
2060 av_log(s->avctx, AV_LOG_ERROR, "Missing EOC\n");
2064 marker = bytestream2_get_be16u(&s->g);
2065 oldpos = bytestream2_tell(&s->g);
2067 if (marker == JPEG2000_SOD) {
2069 Jpeg2000TilePart *tp;
2072 av_log(s->avctx, AV_LOG_ERROR, "Missing SIZ\n");
2073 return AVERROR_INVALIDDATA;
2075 if (s->curtileno < 0) {
2076 av_log(s->avctx, AV_LOG_ERROR, "Missing SOT\n");
2077 return AVERROR_INVALIDDATA;
2080 tile = s->tile + s->curtileno;
2081 tp = tile->tile_part + tile->tp_idx;
2082 if (tp->tp_end < s->g.buffer) {
2083 av_log(s->avctx, AV_LOG_ERROR, "Invalid tpend\n");
2084 return AVERROR_INVALIDDATA;
2087 if (tile->has_ppt && tile->tp_idx == 0) {
2088 bytestream2_init(&tile->packed_headers_stream, tile->packed_headers, tile->packed_headers_size);
2091 bytestream2_init(&tp->tpg, s->g.buffer, tp->tp_end - s->g.buffer);
2092 bytestream2_skip(&s->g, tp->tp_end - s->g.buffer);
2096 if (marker == JPEG2000_EOC)
2099 len = bytestream2_get_be16(&s->g);
2100 if (len < 2 || bytestream2_get_bytes_left(&s->g) < len - 2) {
2101 if (s->avctx->strict_std_compliance >= FF_COMPLIANCE_STRICT) {
2102 av_log(s->avctx, AV_LOG_ERROR, "Invalid len %d left=%d\n", len, bytestream2_get_bytes_left(&s->g));
2103 return AVERROR_INVALIDDATA;
2105 av_log(s->avctx, AV_LOG_WARNING, "Missing EOC Marker.\n");
2111 if (s->ncomponents) {
2112 av_log(s->avctx, AV_LOG_ERROR, "Duplicate SIZ\n");
2113 return AVERROR_INVALIDDATA;
2117 s->numXtiles = s->numYtiles = 0;
2120 ret = get_coc(s, codsty, properties);
2123 ret = get_cod(s, codsty, properties);
2126 ret = get_rgn(s, len);
2129 ret = get_qcc(s, len, qntsty, properties);
2132 ret = get_qcd(s, len, qntsty, properties);
2135 ret = get_poc(s, len, poc);
2138 if (!(ret = get_sot(s, len))) {
2139 av_assert1(s->curtileno >= 0);
2140 codsty = s->tile[s->curtileno].codsty;
2141 qntsty = s->tile[s->curtileno].qntsty;
2142 poc = &s->tile[s->curtileno].poc;
2143 properties = s->tile[s->curtileno].properties;
2147 // the PLM marker is ignored
2149 // the comment is ignored
2150 bytestream2_skip(&s->g, len - 2);
2153 ret = read_crg(s, len);
2156 // Tile-part lengths
2157 ret = get_tlm(s, len);
2160 // Packet length, tile-part header
2161 ret = get_plt(s, len);
2164 // Packed headers, tile-part header
2165 ret = get_ppt(s, len);
2168 av_log(s->avctx, AV_LOG_ERROR,
2169 "unsupported marker 0x%.4"PRIX16" at pos 0x%X\n",
2170 marker, bytestream2_tell(&s->g) - 4);
2171 bytestream2_skip(&s->g, len - 2);
2174 if (bytestream2_tell(&s->g) - oldpos != len || ret) {
2175 av_log(s->avctx, AV_LOG_ERROR,
2176 "error during processing marker segment %.4"PRIx16"\n",
2178 return ret ? ret : -1;
2184 /* Read bit stream packets --> T2 operation. */
2185 static int jpeg2000_read_bitstream_packets(Jpeg2000DecoderContext *s)
2190 for (tileno = 0; tileno < s->numXtiles * s->numYtiles; tileno++) {
2191 Jpeg2000Tile *tile = s->tile + tileno;
2193 if ((ret = init_tile(s, tileno)) < 0)
2196 if ((ret = jpeg2000_decode_packets(s, tile)) < 0)
2203 static int jp2_find_codestream(Jpeg2000DecoderContext *s)
2205 uint32_t atom_size, atom, atom_end;
2206 int search_range = 10;
2210 bytestream2_get_bytes_left(&s->g) >= 8) {
2211 atom_size = bytestream2_get_be32u(&s->g);
2212 atom = bytestream2_get_be32u(&s->g);
2213 if (atom_size == 1) {
2214 if (bytestream2_get_be32u(&s->g)) {
2215 avpriv_request_sample(s->avctx, "Huge atom");
2218 atom_size = bytestream2_get_be32u(&s->g);
2219 atom_end = bytestream2_tell(&s->g) + atom_size - 16;
2221 atom_end = bytestream2_tell(&s->g) + atom_size - 8;
2224 if (atom == JP2_CODESTREAM)
2227 if (bytestream2_get_bytes_left(&s->g) < atom_size || atom_end < atom_size)
2230 if (atom == JP2_HEADER &&
2232 uint32_t atom2_size, atom2, atom2_end;
2234 atom2_size = bytestream2_get_be32u(&s->g);
2235 atom2 = bytestream2_get_be32u(&s->g);
2236 atom2_end = bytestream2_tell(&s->g) + atom2_size - 8;
2237 if (atom2_size < 8 || atom2_end > atom_end || atom2_end < atom2_size)
2240 if (atom2 == JP2_CODESTREAM) {
2242 } else if (atom2 == MKBETAG('c','o','l','r') && atom2_size >= 7) {
2243 int method = bytestream2_get_byteu(&s->g);
2244 bytestream2_skipu(&s->g, 2);
2246 s->colour_space = bytestream2_get_be32u(&s->g);
2248 } else if (atom2 == MKBETAG('p','c','l','r') && atom2_size >= 6) {
2249 int i, size, colour_count, colour_channels, colour_depth[3];
2250 colour_count = bytestream2_get_be16u(&s->g);
2251 colour_channels = bytestream2_get_byteu(&s->g);
2252 // FIXME: Do not ignore channel_sign
2253 colour_depth[0] = (bytestream2_get_byteu(&s->g) & 0x7f) + 1;
2254 colour_depth[1] = (bytestream2_get_byteu(&s->g) & 0x7f) + 1;
2255 colour_depth[2] = (bytestream2_get_byteu(&s->g) & 0x7f) + 1;
2256 size = (colour_depth[0] + 7 >> 3) * colour_count +
2257 (colour_depth[1] + 7 >> 3) * colour_count +
2258 (colour_depth[2] + 7 >> 3) * colour_count;
2259 if (colour_count > AVPALETTE_COUNT ||
2260 colour_channels != 3 ||
2261 colour_depth[0] > 16 ||
2262 colour_depth[1] > 16 ||
2263 colour_depth[2] > 16 ||
2264 atom2_size < size) {
2265 avpriv_request_sample(s->avctx, "Unknown palette");
2266 bytestream2_seek(&s->g, atom2_end, SEEK_SET);
2270 for (i = 0; i < colour_count; i++) {
2272 if (colour_depth[0] <= 8) {
2273 r = bytestream2_get_byteu(&s->g) << 8 - colour_depth[0];
2274 r |= r >> colour_depth[0];
2276 r = bytestream2_get_be16u(&s->g) >> colour_depth[0] - 8;
2278 if (colour_depth[1] <= 8) {
2279 g = bytestream2_get_byteu(&s->g) << 8 - colour_depth[1];
2280 g |= g >> colour_depth[1];
2282 g = bytestream2_get_be16u(&s->g) >> colour_depth[1] - 8;
2284 if (colour_depth[2] <= 8) {
2285 b = bytestream2_get_byteu(&s->g) << 8 - colour_depth[2];
2286 b |= b >> colour_depth[2];
2288 b = bytestream2_get_be16u(&s->g) >> colour_depth[2] - 8;
2290 s->palette[i] = 0xffu << 24 | r << 16 | g << 8 | b;
2292 } else if (atom2 == MKBETAG('c','d','e','f') && atom2_size >= 2) {
2293 int n = bytestream2_get_be16u(&s->g);
2295 int cn = bytestream2_get_be16(&s->g);
2296 int av_unused typ = bytestream2_get_be16(&s->g);
2297 int asoc = bytestream2_get_be16(&s->g);
2298 if (cn < 4 && asoc < 4)
2301 } else if (atom2 == MKBETAG('r','e','s',' ') && atom2_size >= 18) {
2302 int64_t vnum, vden, hnum, hden, vexp, hexp;
2304 bytestream2_skip(&s->g, 4);
2305 resx = bytestream2_get_be32u(&s->g);
2306 if (resx != MKBETAG('r','e','s','c') && resx != MKBETAG('r','e','s','d')) {
2307 bytestream2_seek(&s->g, atom2_end, SEEK_SET);
2310 vnum = bytestream2_get_be16u(&s->g);
2311 vden = bytestream2_get_be16u(&s->g);
2312 hnum = bytestream2_get_be16u(&s->g);
2313 hden = bytestream2_get_be16u(&s->g);
2314 vexp = bytestream2_get_byteu(&s->g);
2315 hexp = bytestream2_get_byteu(&s->g);
2316 if (!vnum || !vden || !hnum || !hden) {
2317 bytestream2_seek(&s->g, atom2_end, SEEK_SET);
2318 av_log(s->avctx, AV_LOG_WARNING, "RES box invalid\n");
2328 if ( INT64_MAX / (hnum * vden) > pow(10, hexp)
2329 && INT64_MAX / (vnum * hden) > pow(10, vexp))
2330 av_reduce(&s->sar.den, &s->sar.num,
2331 hnum * vden * pow(10, hexp),
2332 vnum * hden * pow(10, vexp),
2335 bytestream2_seek(&s->g, atom2_end, SEEK_SET);
2336 } while (atom_end - atom2_end >= 8);
2340 bytestream2_seek(&s->g, atom_end, SEEK_SET);
2346 static av_cold void jpeg2000_init_static_data(void)
2348 ff_jpeg2000_init_tier1_luts();
2349 ff_mqc_init_context_tables();
2352 static av_cold int jpeg2000_decode_init(AVCodecContext *avctx)
2354 static AVOnce init_static_once = AV_ONCE_INIT;
2355 Jpeg2000DecoderContext *s = avctx->priv_data;
2357 ff_thread_once(&init_static_once, jpeg2000_init_static_data);
2358 ff_jpeg2000dsp_init(&s->dsp);
2363 static int jpeg2000_decode_frame(AVCodecContext *avctx, void *data,
2364 int *got_frame, AVPacket *avpkt)
2366 Jpeg2000DecoderContext *s = avctx->priv_data;
2367 ThreadFrame frame = { .f = data };
2368 AVFrame *picture = data;
2372 bytestream2_init(&s->g, avpkt->data, avpkt->size);
2374 memset(s->cdef, -1, sizeof(s->cdef));
2376 if (bytestream2_get_bytes_left(&s->g) < 2) {
2377 ret = AVERROR_INVALIDDATA;
2381 // check if the image is in jp2 format
2382 if (bytestream2_get_bytes_left(&s->g) >= 12 &&
2383 (bytestream2_get_be32u(&s->g) == 12) &&
2384 (bytestream2_get_be32u(&s->g) == JP2_SIG_TYPE) &&
2385 (bytestream2_get_be32u(&s->g) == JP2_SIG_VALUE)) {
2386 if (!jp2_find_codestream(s)) {
2387 av_log(avctx, AV_LOG_ERROR,
2388 "Could not find Jpeg2000 codestream atom.\n");
2389 ret = AVERROR_INVALIDDATA;
2393 bytestream2_seek(&s->g, 0, SEEK_SET);
2396 while (bytestream2_get_bytes_left(&s->g) >= 3 && bytestream2_peek_be16(&s->g) != JPEG2000_SOC)
2397 bytestream2_skip(&s->g, 1);
2399 if (bytestream2_get_be16u(&s->g) != JPEG2000_SOC) {
2400 av_log(avctx, AV_LOG_ERROR, "SOC marker not present\n");
2401 ret = AVERROR_INVALIDDATA;
2404 if (ret = jpeg2000_read_main_headers(s))
2407 /* get picture buffer */
2408 if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0)
2410 picture->pict_type = AV_PICTURE_TYPE_I;
2411 picture->key_frame = 1;
2413 if (ret = jpeg2000_read_bitstream_packets(s))
2416 avctx->execute2(avctx, jpeg2000_decode_tile, picture, NULL, s->numXtiles * s->numYtiles);
2418 jpeg2000_dec_cleanup(s);
2422 if (s->avctx->pix_fmt == AV_PIX_FMT_PAL8)
2423 memcpy(picture->data[1], s->palette, 256 * sizeof(uint32_t));
2424 if (s->sar.num && s->sar.den)
2425 avctx->sample_aspect_ratio = s->sar;
2426 s->sar.num = s->sar.den = 0;
2428 return bytestream2_tell(&s->g);
2431 jpeg2000_dec_cleanup(s);
2435 #define OFFSET(x) offsetof(Jpeg2000DecoderContext, x)
2436 #define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
2438 static const AVOption options[] = {
2439 { "lowres", "Lower the decoding resolution by a power of two",
2440 OFFSET(reduction_factor), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, JPEG2000_MAX_RESLEVELS - 1, VD },
2444 static const AVClass jpeg2000_class = {
2445 .class_name = "jpeg2000",
2446 .item_name = av_default_item_name,
2448 .version = LIBAVUTIL_VERSION_INT,
2451 AVCodec ff_jpeg2000_decoder = {
2453 .long_name = NULL_IF_CONFIG_SMALL("JPEG 2000"),
2454 .type = AVMEDIA_TYPE_VIDEO,
2455 .id = AV_CODEC_ID_JPEG2000,
2456 .capabilities = AV_CODEC_CAP_SLICE_THREADS | AV_CODEC_CAP_FRAME_THREADS | AV_CODEC_CAP_DR1,
2457 .priv_data_size = sizeof(Jpeg2000DecoderContext),
2458 .init = jpeg2000_decode_init,
2459 .decode = jpeg2000_decode_frame,
2460 .priv_class = &jpeg2000_class,
2462 .profiles = NULL_IF_CONFIG_SMALL(ff_jpeg2000_profiles)