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 Libav.
8 * Libav 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 * Libav 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 Libav; 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
28 #include "libavutil/common.h"
29 #include "libavutil/opt.h"
31 #include "bytestream.h"
35 #define JP2_SIG_TYPE 0x6A502020
36 #define JP2_SIG_VALUE 0x0D0A870A
37 #define JP2_CODESTREAM 0x6A703263
42 typedef struct Jpeg2000TilePart
{
43 uint16_t tp_idx
; // Tile-part index
44 uint8_t tile_index
; // Tile index who refers the tile-part
45 uint32_t tp_len
; // Length of tile-part
46 const uint8_t *tp_start_bstrm
; // Start address bit stream in tile-part
47 const uint8_t *tp_end_bstrm
; // End address of the bit stream tile part
50 /* RMK: For JPEG2000 DCINEMA 3 tile-parts in a tile
51 * one per component, so tile_part elements have a size of 3 */
52 typedef struct Jpeg2000Tile
{
53 Jpeg2000Component
*comp
;
54 uint8_t properties
[4];
55 Jpeg2000CodingStyle codsty
[4];
56 Jpeg2000QuantStyle qntsty
[4];
57 Jpeg2000TilePart tile_part
[3];
60 typedef struct Jpeg2000DecoderContext
{
62 AVCodecContext
*avctx
;
65 int image_offset_x
, image_offset_y
;
66 int tile_offset_x
, tile_offset_y
;
67 uint8_t cbps
[4]; // bits per sample in particular components
68 uint8_t sgnd
[4]; // if a component is signed
69 uint8_t properties
[4];
73 int tile_width
, tile_height
;
74 int numXtiles
, numYtiles
;
77 Jpeg2000CodingStyle codsty
[4];
78 Jpeg2000QuantStyle qntsty
[4];
80 const uint8_t *buf_start
;
82 const uint8_t *buf_end
;
88 /*options parameters*/
90 int16_t reduction_factor
;
91 } Jpeg2000DecoderContext
;
93 /* get_bits functions for JPEG2000 packet bitstream
94 * It is a get_bit function with a bit-stuffing routine. If the value of the
95 * byte is 0xFF, the next byte includes an extra zero bit stuffed into the MSB.
96 * cf. ISO-15444-1:2002 / B.10.1 Bit-stuffing routine */
97 static int get_bits(Jpeg2000DecoderContext
*s
, int n
)
100 if (s
->buf_end
- s
->buf
< ((n
- s
->bit_index
) >> 8))
101 return AVERROR(EINVAL
);
104 if (s
->bit_index
== 0) {
105 s
->bit_index
= 7 + (*s
->buf
!= 0xff);
109 res
|= (*s
->buf
>> s
->bit_index
) & 1;
114 static void jpeg2000_flush(Jpeg2000DecoderContext
*s
)
122 /* decode the value stored in node */
123 static int tag_tree_decode(Jpeg2000DecoderContext
*s
, Jpeg2000TgtNode
*node
,
126 Jpeg2000TgtNode
*stack
[30];
127 int sp
= -1, curval
= 0;
129 while (node
&& !node
->vis
) {
137 curval
= stack
[sp
]->val
;
139 while (curval
< threshold
&& sp
>= 0) {
140 if (curval
< stack
[sp
]->val
)
141 curval
= stack
[sp
]->val
;
142 while (curval
< threshold
) {
144 if ((ret
= get_bits(s
, 1)) > 0) {
152 stack
[sp
]->val
= curval
;
158 /* marker segments */
159 /* get sizes and offsets of image, tiles; number of components */
160 static int get_siz(Jpeg2000DecoderContext
*s
)
164 if (s
->buf_end
- s
->buf
< 36)
165 return AVERROR(EINVAL
);
167 s
->avctx
->profile
= bytestream_get_be16(&s
->buf
); // Rsiz
168 s
->width
= bytestream_get_be32(&s
->buf
); // Width
169 s
->height
= bytestream_get_be32(&s
->buf
); // Height
170 s
->image_offset_x
= bytestream_get_be32(&s
->buf
); // X0Siz
171 s
->image_offset_y
= bytestream_get_be32(&s
->buf
); // Y0Siz
172 s
->tile_width
= bytestream_get_be32(&s
->buf
); // XTSiz
173 s
->tile_height
= bytestream_get_be32(&s
->buf
); // YTSiz
174 s
->tile_offset_x
= bytestream_get_be32(&s
->buf
); // XT0Siz
175 s
->tile_offset_y
= bytestream_get_be32(&s
->buf
); // YT0Siz
176 s
->ncomponents
= bytestream_get_be16(&s
->buf
); // CSiz
178 if (s
->buf_end
- s
->buf
< 2 * s
->ncomponents
)
179 return AVERROR(EINVAL
);
181 for (i
= 0; i
< s
->ncomponents
; i
++) { // Ssiz_i XRsiz_i, YRsiz_i
182 uint8_t x
= bytestream_get_byte(&s
->buf
);
183 s
->cbps
[i
] = (x
& 0x7f) + 1;
184 s
->precision
= FFMAX(s
->cbps
[i
], s
->precision
);
185 s
->sgnd
[i
] = (x
& 0x80) == 1;
186 s
->cdx
[i
] = bytestream_get_byte(&s
->buf
);
187 s
->cdy
[i
] = bytestream_get_byte(&s
->buf
);
190 s
->numXtiles
= ff_jpeg2000_ceildiv(s
->width
- s
->tile_offset_x
, s
->tile_width
);
191 s
->numYtiles
= ff_jpeg2000_ceildiv(s
->height
- s
->tile_offset_y
, s
->tile_height
);
193 s
->tile
= av_mallocz(s
->numXtiles
* s
->numYtiles
* sizeof(*s
->tile
));
195 return AVERROR(ENOMEM
);
197 for (i
= 0; i
< s
->numXtiles
* s
->numYtiles
; i
++) {
198 Jpeg2000Tile
*tile
= s
->tile
+ i
;
200 tile
->comp
= av_mallocz(s
->ncomponents
* sizeof(*tile
->comp
));
202 return AVERROR(ENOMEM
);
205 /* compute image size with reduction factor */
206 s
->avctx
->width
= ff_jpeg2000_ceildivpow2(s
->width
- s
->image_offset_x
,
207 s
->reduction_factor
);
208 s
->avctx
->height
= ff_jpeg2000_ceildivpow2(s
->height
- s
->image_offset_y
,
209 s
->reduction_factor
);
211 switch (s
->avctx
->profile
) {
212 case FF_PROFILE_JPEG2000_DCINEMA_2K
:
213 case FF_PROFILE_JPEG2000_DCINEMA_4K
:
214 /* XYZ color-space for digital cinema profiles */
215 s
->avctx
->pix_fmt
= AV_PIX_FMT_XYZ12
;
218 /* For other profiles selects color-space according number of
219 * components and bit depth precision. */
220 switch (s
->ncomponents
) {
222 if (s
->precision
> 8)
223 s
->avctx
->pix_fmt
= AV_PIX_FMT_GRAY16
;
225 s
->avctx
->pix_fmt
= AV_PIX_FMT_GRAY8
;
228 if (s
->precision
> 8)
229 s
->avctx
->pix_fmt
= AV_PIX_FMT_RGB48
;
231 s
->avctx
->pix_fmt
= AV_PIX_FMT_RGB24
;
234 s
->avctx
->pix_fmt
= AV_PIX_FMT_BGRA
;
237 /* pixel format can not be identified */
238 s
->avctx
->pix_fmt
= AV_PIX_FMT_NONE
;
246 /* get common part for COD and COC segments */
247 static int get_cox(Jpeg2000DecoderContext
*s
, Jpeg2000CodingStyle
*c
)
251 if (s
->buf_end
- s
->buf
< 5)
252 return AVERROR(EINVAL
);
253 c
->nreslevels
= bytestream_get_byte(&s
->buf
) + 1; // num of resolution levels - 1
255 /* compute number of resolution levels to decode */
256 if (c
->nreslevels
< s
->reduction_factor
)
257 c
->nreslevels2decode
= 1;
259 c
->nreslevels2decode
= c
->nreslevels
- s
->reduction_factor
;
261 c
->log2_cblk_width
= bytestream_get_byte(&s
->buf
) + 2; // cblk width
262 c
->log2_cblk_height
= bytestream_get_byte(&s
->buf
) + 2; // cblk height
264 c
->cblk_style
= bytestream_get_byte(&s
->buf
);
265 if (c
->cblk_style
!= 0) { // cblk style
266 av_log(s
->avctx
, AV_LOG_ERROR
, "no extra cblk styles supported\n");
269 c
->transform
= bytestream_get_byte(&s
->buf
); // DWT transformation type
270 /* set integer 9/7 DWT in case of BITEXACT flag */
271 if ((s
->avctx
->flags
& CODEC_FLAG_BITEXACT
) && (c
->transform
== FF_DWT97
))
272 c
->transform
= FF_DWT97_INT
;
274 if (c
->csty
& JPEG2000_CSTY_PREC
) {
276 for (i
= 0; i
< c
->nreslevels
; i
++) {
277 byte
= bytestream_get_byte(&s
->buf
);
278 c
->log2_prec_widths
[i
] = byte
& 0x0F; // precinct PPx
279 c
->log2_prec_heights
[i
] = (byte
>> 4) & 0x0F; // precinct PPy
285 /* get coding parameters for a particular tile or whole image*/
286 static int get_cod(Jpeg2000DecoderContext
*s
, Jpeg2000CodingStyle
*c
,
289 Jpeg2000CodingStyle tmp
;
292 if (s
->buf_end
- s
->buf
< 5)
293 return AVERROR(EINVAL
);
295 tmp
.log2_prec_width
=
296 tmp
.log2_prec_height
= 15;
298 tmp
.csty
= bytestream_get_byte(&s
->buf
);
300 // get progression order
301 tmp
.prog_order
= bytestream_get_byte(&s
->buf
);
303 tmp
.nlayers
= bytestream_get_be16(&s
->buf
);
304 tmp
.mct
= bytestream_get_byte(&s
->buf
); // multiple component transformation
307 for (compno
= 0; compno
< s
->ncomponents
; compno
++)
308 if (!(properties
[compno
] & HAD_COC
))
309 memcpy(c
+ compno
, &tmp
, sizeof(tmp
));
313 /* Get coding parameters for a component in the whole image or a
314 * particular tile. */
315 static int get_coc(Jpeg2000DecoderContext
*s
, Jpeg2000CodingStyle
*c
,
320 if (s
->buf_end
- s
->buf
< 2)
321 return AVERROR(EINVAL
);
323 compno
= bytestream_get_byte(&s
->buf
);
326 c
->csty
= bytestream_get_byte(&s
->buf
);
329 properties
[compno
] |= HAD_COC
;
333 /* Get common part for QCD and QCC segments. */
334 static int get_qcx(Jpeg2000DecoderContext
*s
, int n
, Jpeg2000QuantStyle
*q
)
338 if (s
->buf_end
- s
->buf
< 1)
339 return AVERROR(EINVAL
);
341 x
= bytestream_get_byte(&s
->buf
); // Sqcd
343 q
->nguardbits
= x
>> 5;
344 q
->quantsty
= x
& 0x1f;
346 if (q
->quantsty
== JPEG2000_QSTY_NONE
) {
348 if (s
->buf_end
- s
->buf
< n
)
349 return AVERROR(EINVAL
);
350 for (i
= 0; i
< n
; i
++)
351 q
->expn
[i
] = bytestream_get_byte(&s
->buf
) >> 3;
352 } else if (q
->quantsty
== JPEG2000_QSTY_SI
) {
353 if (s
->buf_end
- s
->buf
< 2)
354 return AVERROR(EINVAL
);
355 x
= bytestream_get_be16(&s
->buf
);
356 q
->expn
[0] = x
>> 11;
357 q
->mant
[0] = x
& 0x7ff;
358 for (i
= 1; i
< 32 * 3; i
++) {
359 int curexpn
= FFMAX(0, q
->expn
[0] - (i
- 1) / 3);
360 q
->expn
[i
] = curexpn
;
361 q
->mant
[i
] = q
->mant
[0];
365 if (s
->buf_end
- s
->buf
< n
)
366 return AVERROR(EINVAL
);
367 for (i
= 0; i
< n
; i
++) {
368 x
= bytestream_get_be16(&s
->buf
);
369 q
->expn
[i
] = x
>> 11;
370 q
->mant
[i
] = x
& 0x7ff;
376 /* Get quantization parameters for a particular tile or a whole image. */
377 static int get_qcd(Jpeg2000DecoderContext
*s
, int n
, Jpeg2000QuantStyle
*q
,
380 Jpeg2000QuantStyle tmp
;
383 if (get_qcx(s
, n
, &tmp
))
385 for (compno
= 0; compno
< s
->ncomponents
; compno
++)
386 if (!(properties
[compno
] & HAD_QCC
))
387 memcpy(q
+ compno
, &tmp
, sizeof(tmp
));
391 /* Get quantization parameters for a component in the whole image
392 * on in a particular tile. */
393 static int get_qcc(Jpeg2000DecoderContext
*s
, int n
, Jpeg2000QuantStyle
*q
,
398 if (s
->buf_end
- s
->buf
< 1)
399 return AVERROR(EINVAL
);
401 compno
= bytestream_get_byte(&s
->buf
);
402 properties
[compno
] |= HAD_QCC
;
403 return get_qcx(s
, n
- 1, q
+ compno
);
406 /* Get start of tile segment. */
407 static uint8_t get_sot(Jpeg2000DecoderContext
*s
, int n
)
409 Jpeg2000TilePart
*tp
;
414 if (s
->buf_end
- s
->buf
< 4)
415 return AVERROR(EINVAL
);
417 Isot
= bytestream_get_be16(&s
->buf
); // Isot
419 av_log(s
->avctx
, AV_LOG_ERROR
,
420 "Not a DCINEMA JP2K file: more than one tile\n");
423 Psot
= bytestream_get_be32(&s
->buf
); // Psot
424 TPsot
= bytestream_get_byte(&s
->buf
); // TPsot
426 /* Read TNSot but not used */
427 bytestream_get_byte(&s
->buf
); // TNsot
429 tp
= s
->tile
[s
->curtileno
].tile_part
+ TPsot
;
430 tp
->tile_index
= Isot
;
434 /* Start of bit stream. Pointer to SOD marker
435 * Check SOD marker is present. */
436 if (JPEG2000_SOD
== bytestream_get_be16(&s
->buf
))
437 tp
->tp_start_bstrm
= s
->buf
;
439 av_log(s
->avctx
, AV_LOG_ERROR
, "SOD marker not found \n");
443 /* End address of bit stream =
444 * start address + (Psot - size of SOT HEADER(n)
445 * - size of SOT MARKER(2) - size of SOD marker(2) */
446 tp
->tp_end_bstrm
= s
->buf
+ (tp
->tp_len
- n
- 4);
448 // set buffer pointer to end of tile part header
449 s
->buf
= tp
->tp_end_bstrm
;
454 /* Tile-part lengths: see ISO 15444-1:2002, section A.7.1
455 * Used to know the number of tile parts and lengths.
456 * There may be multiple TLMs in the header.
457 * TODO: The function is not used for tile-parts management, nor anywhere else.
458 * It can be useful to allocate memory for tile parts, before managing the SOT
459 * markers. Parsing the TLM header is needed to increment the input header
461 * This marker is mandatory for DCI. */
462 static uint8_t get_tlm(Jpeg2000DecoderContext
*s
, int n
)
464 uint8_t Stlm
, ST
, SP
, tile_tlm
, i
;
465 bytestream_get_byte(&s
->buf
); /* Ztlm: skipped */
466 Stlm
= bytestream_get_byte(&s
->buf
);
468 // too complex ? ST = ((Stlm >> 4) & 0x01) + ((Stlm >> 4) & 0x02);
469 ST
= (Stlm
>> 4) & 0x03;
470 // TODO: Manage case of ST = 0b11 --> raise error
471 SP
= (Stlm
>> 6) & 0x01;
472 tile_tlm
= (n
- 4) / ((SP
+ 1) * 2 + ST
);
473 for (i
= 0; i
< tile_tlm
; i
++) {
478 bytestream_get_byte(&s
->buf
);
481 bytestream_get_be16(&s
->buf
);
484 bytestream_get_be32(&s
->buf
);
488 bytestream_get_be16(&s
->buf
);
490 bytestream_get_be32(&s
->buf
);
496 static int init_tile(Jpeg2000DecoderContext
*s
, int tileno
)
499 int tilex
= tileno
% s
->numXtiles
;
500 int tiley
= tileno
/ s
->numXtiles
;
501 Jpeg2000Tile
*tile
= s
->tile
+ tileno
;
502 Jpeg2000CodingStyle
*codsty
;
503 Jpeg2000QuantStyle
*qntsty
;
506 return AVERROR(ENOMEM
);
508 /* copy codsty, qnsty to tile. TODO: Is it the best way?
509 * codsty, qnsty is an array of 4 structs Jpeg2000CodingStyle
510 * and Jpeg2000QuantStyle */
511 memcpy(tile
->codsty
, s
->codsty
, s
->ncomponents
* sizeof(*codsty
));
512 memcpy(tile
->qntsty
, s
->qntsty
, s
->ncomponents
* sizeof(*qntsty
));
514 for (compno
= 0; compno
< s
->ncomponents
; compno
++) {
515 Jpeg2000Component
*comp
= tile
->comp
+ compno
;
516 int ret
; // global bandno
517 codsty
= tile
->codsty
+ compno
;
518 qntsty
= tile
->qntsty
+ compno
;
520 comp
->coord_o
[0][0] = FFMAX(tilex
* s
->tile_width
+ s
->tile_offset_x
, s
->image_offset_x
);
521 comp
->coord_o
[0][1] = FFMIN((tilex
+ 1) * s
->tile_width
+ s
->tile_offset_x
, s
->width
);
522 comp
->coord_o
[1][0] = FFMAX(tiley
* s
->tile_height
+ s
->tile_offset_y
, s
->image_offset_y
);
523 comp
->coord_o
[1][1] = FFMIN((tiley
+ 1) * s
->tile_height
+ s
->tile_offset_y
, s
->height
);
525 // FIXME: add a dcinema profile check ?
526 // value is guaranteed by profile (orig=0, 1 tile)
527 comp
->coord
[0][0] = 0;
528 comp
->coord
[0][1] = s
->avctx
->width
;
529 comp
->coord
[1][0] = 0;
530 comp
->coord
[1][1] = s
->avctx
->height
;
532 if (ret
= ff_jpeg2000_init_component(comp
, codsty
, qntsty
,
533 s
->cbps
[compno
], s
->cdx
[compno
],
534 s
->cdy
[compno
], s
->avctx
))
540 /* Read the number of coding passes. */
541 static int getnpasses(Jpeg2000DecoderContext
*s
)
548 if ((num
= get_bits(s
, 2)) != 3)
549 return num
< 0 ? num
: 3 + num
;
550 if ((num
= get_bits(s
, 5)) != 31)
551 return num
< 0 ? num
: 6 + num
;
552 num
= get_bits(s
, 7);
553 return num
< 0 ? num
: 37 + num
;
556 static int getlblockinc(Jpeg2000DecoderContext
*s
)
559 while (ret
= get_bits(s
, 1)) {
567 static int jpeg2000_decode_packet(Jpeg2000DecoderContext
*s
,
568 Jpeg2000CodingStyle
*codsty
,
569 Jpeg2000ResLevel
*rlevel
, int precno
,
570 int layno
, uint8_t *expn
, int numgbits
)
572 int bandno
, cblkno
, ret
, nb_code_blocks
;
574 if (!(ret
= get_bits(s
, 1))) {
580 for (bandno
= 0; bandno
< rlevel
->nbands
; bandno
++) {
581 Jpeg2000Band
*band
= rlevel
->band
+ bandno
;
582 Jpeg2000Prec
*prec
= band
->prec
+ precno
;
584 if (band
->coord
[0][0] == band
->coord
[0][1] ||
585 band
->coord
[1][0] == band
->coord
[1][1])
589 nb_code_blocks
= prec
->nb_codeblocks_height
*
590 prec
->nb_codeblocks_width
;
591 for (cblkno
= 0; cblkno
< nb_code_blocks
; cblkno
++) {
592 Jpeg2000Cblk
*cblk
= prec
->cblk
+ cblkno
;
593 int incl
, newpasses
, llen
;
596 incl
= get_bits(s
, 1);
598 incl
= tag_tree_decode(s
, prec
->cblkincl
+ cblkno
, layno
+ 1) == layno
;
605 cblk
->nonzerobits
= expn
[bandno
] + numgbits
- 1 -
606 tag_tree_decode(s
, prec
->zerobits
+ cblkno
,
608 if ((newpasses
= getnpasses(s
)) < 0)
610 if ((llen
= getlblockinc(s
)) < 0)
612 cblk
->lblock
+= llen
;
613 if ((ret
= get_bits(s
, av_log2(newpasses
) + cblk
->lblock
)) < 0)
615 cblk
->lengthinc
= ret
;
616 cblk
->npasses
+= newpasses
;
621 if (codsty
->csty
& JPEG2000_CSTY_EPH
) {
622 if (AV_RB16(s
->buf
) == JPEG2000_EPH
)
625 av_log(s
->avctx
, AV_LOG_ERROR
, "EPH marker not found.\n");
628 for (bandno
= 0; bandno
< rlevel
->nbands
; bandno
++) {
629 Jpeg2000Band
*band
= rlevel
->band
+ bandno
;
630 Jpeg2000Prec
*prec
= band
->prec
+ precno
;
632 nb_code_blocks
= prec
->nb_codeblocks_height
* prec
->nb_codeblocks_width
;
633 for (cblkno
= 0; cblkno
< nb_code_blocks
; cblkno
++) {
634 Jpeg2000Cblk
*cblk
= prec
->cblk
+ cblkno
;
635 if (s
->buf_end
- s
->buf
< cblk
->lengthinc
)
636 return AVERROR(EINVAL
);
637 bytestream_get_buffer(&s
->buf
, cblk
->data
, cblk
->lengthinc
);
638 cblk
->length
+= cblk
->lengthinc
;
645 static int jpeg2000_decode_packets(Jpeg2000DecoderContext
*s
, Jpeg2000Tile
*tile
)
647 int layno
, reslevelno
, compno
, precno
, ok_reslevel
;
648 uint8_t prog_order
= tile
->codsty
[0].prog_order
;
653 switch (prog_order
) {
654 case JPEG2000_PGOD_LRCP
:
655 for (layno
= 0; layno
< tile
->codsty
[0].nlayers
; layno
++) {
657 for (reslevelno
= 0; ok_reslevel
; reslevelno
++) {
659 for (compno
= 0; compno
< s
->ncomponents
; compno
++) {
660 Jpeg2000CodingStyle
*codsty
= tile
->codsty
+ compno
;
661 Jpeg2000QuantStyle
*qntsty
= tile
->qntsty
+ compno
;
662 if (reslevelno
< codsty
->nreslevels
) {
663 Jpeg2000ResLevel
*rlevel
= tile
->comp
[compno
].reslevel
+
666 for (precno
= 0; precno
< rlevel
->num_precincts_x
* rlevel
->num_precincts_y
; precno
++)
667 if (jpeg2000_decode_packet(s
,
670 qntsty
->expn
+ (reslevelno ?
3 * (reslevelno
- 1) + 1 : 0),
679 case JPEG2000_PGOD_CPRL
:
680 for (compno
= 0; compno
< s
->ncomponents
; compno
++) {
681 Jpeg2000CodingStyle
*codsty
= tile
->codsty
+ compno
;
682 Jpeg2000QuantStyle
*qntsty
= tile
->qntsty
+ compno
;
684 /* Set bit stream buffer address according to tile-part.
685 * For DCinema one tile-part per component, so can be
686 * indexed by component. */
687 s
->buf
= tile
->tile_part
[compno
].tp_start_bstrm
;
689 /* Position loop (y axis)
690 * TODO: Automate computing of step 256.
691 * Fixed here, but to be computed before entering here. */
692 for (y
= 0; y
< s
->height
; y
+= 256) {
693 /* Position loop (y axis)
694 * TODO: automate computing of step 256.
695 * Fixed here, but to be computed before entering here. */
696 for (x
= 0; x
< s
->width
; x
+= 256) {
697 for (reslevelno
= 0; reslevelno
< codsty
->nreslevels
; reslevelno
++) {
699 uint8_t reducedresno
= codsty
->nreslevels
- 1 -reslevelno
; // ==> N_L - r
700 Jpeg2000ResLevel
*rlevel
= tile
->comp
[compno
].reslevel
+ reslevelno
;
702 if (!((y
% (1 << (rlevel
->log2_prec_height
+ reducedresno
)) == 0) ||
703 (y
== 0))) // TODO: 2nd condition simplified as try0 always =0 for dcinema
706 if (!((x
% (1 << (rlevel
->log2_prec_width
+ reducedresno
)) == 0) ||
707 (x
== 0))) // TODO: 2nd condition simplified as try0 always =0 for dcinema
710 // check if a precinct exists
711 prcx
= ff_jpeg2000_ceildivpow2(x
, reducedresno
) >> rlevel
->log2_prec_width
;
712 prcy
= ff_jpeg2000_ceildivpow2(y
, reducedresno
) >> rlevel
->log2_prec_height
;
713 precno
= prcx
+ rlevel
->num_precincts_x
* prcy
;
714 for (layno
= 0; layno
< tile
->codsty
[0].nlayers
; layno
++) {
715 if (jpeg2000_decode_packet(s
, codsty
, rlevel
,
717 qntsty
->expn
+ (reslevelno ?
3 * (reslevelno
- 1) + 1 : 0),
731 /* EOC marker reached */
737 /* TIER-1 routines */
738 static void decode_sigpass(Jpeg2000T1Context
*t1
, int width
, int height
,
739 int bpno
, int bandno
)
741 int mask
= 3 << (bpno
- 1), y0
, x
, y
;
743 for (y0
= 0; y0
< height
; y0
+= 4)
744 for (x
= 0; x
< width
; x
++)
745 for (y
= y0
; y
< height
&& y
< y0
+ 4; y
++)
746 if ((t1
->flags
[y
+ 1][x
+ 1] & JPEG2000_T1_SIG_NB
)
747 && !(t1
->flags
[y
+ 1][x
+ 1] & (JPEG2000_T1_SIG
| JPEG2000_T1_VIS
))) {
748 if (ff_mqc_decode(&t1
->mqc
,
750 ff_jpeg2000_getsigctxno(t1
->flags
[y
+ 1][x
+ 1],
752 int xorbit
, ctxno
= ff_jpeg2000_getsgnctxno(t1
->flags
[y
+ 1][x
+ 1],
756 (ff_mqc_decode(&t1
->mqc
,
757 t1
->mqc
.cx_states
+ ctxno
) ^ xorbit
)
760 ff_jpeg2000_set_significance(t1
, x
, y
,
763 t1
->flags
[y
+ 1][x
+ 1] |= JPEG2000_T1_VIS
;
767 static void decode_refpass(Jpeg2000T1Context
*t1
, int width
, int height
,
773 phalf
= 1 << (bpno
- 1);
776 for (y0
= 0; y0
< height
; y0
+= 4)
777 for (x
= 0; x
< width
; x
++)
778 for (y
= y0
; y
< height
&& y
< y0
+ 4; y
++)
779 if ((t1
->flags
[y
+ 1][x
+ 1] & (JPEG2000_T1_SIG
| JPEG2000_T1_VIS
)) == JPEG2000_T1_SIG
) {
780 int ctxno
= ff_jpeg2000_getrefctxno(t1
->flags
[y
+ 1][x
+ 1]);
781 int r
= ff_mqc_decode(&t1
->mqc
,
782 t1
->mqc
.cx_states
+ ctxno
)
784 t1
->data
[y
][x
] += t1
->data
[y
][x
] < 0 ?
-r
: r
;
785 t1
->flags
[y
+ 1][x
+ 1] |= JPEG2000_T1_REF
;
789 static void decode_clnpass(Jpeg2000DecoderContext
*s
, Jpeg2000T1Context
*t1
,
790 int width
, int height
, int bpno
, int bandno
,
793 int mask
= 3 << (bpno
- 1), y0
, x
, y
, runlen
, dec
;
795 for (y0
= 0; y0
< height
; y0
+= 4)
796 for (x
= 0; x
< width
; x
++) {
797 if (y0
+ 3 < height
&&
798 !((t1
->flags
[y0
+ 1][x
+ 1] & (JPEG2000_T1_SIG_NB
| JPEG2000_T1_VIS
| JPEG2000_T1_SIG
)) ||
799 (t1
->flags
[y0
+ 2][x
+ 1] & (JPEG2000_T1_SIG_NB
| JPEG2000_T1_VIS
| JPEG2000_T1_SIG
)) ||
800 (t1
->flags
[y0
+ 3][x
+ 1] & (JPEG2000_T1_SIG_NB
| JPEG2000_T1_VIS
| JPEG2000_T1_SIG
)) ||
801 (t1
->flags
[y0
+ 4][x
+ 1] & (JPEG2000_T1_SIG_NB
| JPEG2000_T1_VIS
| JPEG2000_T1_SIG
)))) {
802 if (!ff_mqc_decode(&t1
->mqc
, t1
->mqc
.cx_states
+ MQC_CX_RL
))
804 runlen
= ff_mqc_decode(&t1
->mqc
,
805 t1
->mqc
.cx_states
+ MQC_CX_UNI
);
806 runlen
= (runlen
<< 1) | ff_mqc_decode(&t1
->mqc
,
815 for (y
= y0
+ runlen
; y
< y0
+ 4 && y
< height
; y
++) {
817 if (!(t1
->flags
[y
+ 1][x
+ 1] & (JPEG2000_T1_SIG
| JPEG2000_T1_VIS
)))
818 dec
= ff_mqc_decode(&t1
->mqc
,
820 ff_jpeg2000_getsigctxno(t1
->flags
[y
+ 1][x
+ 1],
825 int ctxno
= ff_jpeg2000_getsgnctxno(t1
->flags
[y
+ 1][x
+ 1],
827 t1
->data
[y
][x
] = (ff_mqc_decode(&t1
->mqc
,
828 t1
->mqc
.cx_states
+ ctxno
) ^
831 ff_jpeg2000_set_significance(t1
, x
, y
, t1
->data
[y
][x
] < 0);
834 t1
->flags
[y
+ 1][x
+ 1] &= ~JPEG2000_T1_VIS
;
839 val
= ff_mqc_decode(&t1
->mqc
, t1
->mqc
.cx_states
+ MQC_CX_UNI
);
840 val
= (val
<< 1) + ff_mqc_decode(&t1
->mqc
, t1
->mqc
.cx_states
+ MQC_CX_UNI
);
841 val
= (val
<< 1) + ff_mqc_decode(&t1
->mqc
, t1
->mqc
.cx_states
+ MQC_CX_UNI
);
842 val
= (val
<< 1) + ff_mqc_decode(&t1
->mqc
, t1
->mqc
.cx_states
+ MQC_CX_UNI
);
844 av_log(s
->avctx
, AV_LOG_ERROR
,
845 "Segmentation symbol value incorrect\n");
849 static int decode_cblk(Jpeg2000DecoderContext
*s
, Jpeg2000CodingStyle
*codsty
,
850 Jpeg2000T1Context
*t1
, Jpeg2000Cblk
*cblk
,
851 int width
, int height
, int bandpos
)
853 int passno
= cblk
->npasses
, pass_t
= 2, bpno
= cblk
->nonzerobits
- 1, y
;
855 for (y
= 0; y
< height
+ 2; y
++)
856 memset(t1
->flags
[y
], 0, (width
+ 2) * sizeof(width
));
858 for (y
= 0; y
< height
; y
++)
859 memset(t1
->data
[y
], 0, width
* sizeof(width
));
861 ff_mqc_initdec(&t1
->mqc
, cblk
->data
);
862 cblk
->data
[cblk
->length
] = 0xff;
863 cblk
->data
[cblk
->length
+ 1] = 0xff;
868 decode_sigpass(t1
, width
, height
, bpno
+ 1, bandpos
);
871 decode_refpass(t1
, width
, height
, bpno
+ 1);
874 decode_clnpass(s
, t1
, width
, height
, bpno
+ 1, bandpos
,
875 codsty
->cblk_style
& JPEG2000_CBLK_SEGSYM
);
888 /* TODO: Verify dequantization for lossless case
889 * comp->data can be float or int
890 * band->stepsize can be float or int
891 * depending on the type of DWT transformation.
892 * see ISO/IEC 15444-1:2002 A.6.1 */
894 /* Float dequantization of a codeblock.*/
895 static void dequantization_float(int x
, int y
, Jpeg2000Cblk
*cblk
,
896 Jpeg2000Component
*comp
,
897 Jpeg2000T1Context
*t1
, Jpeg2000Band
*band
)
900 float *datap
= &comp
->data
[(comp
->coord
[0][1] - comp
->coord
[0][0]) * y
+ x
];
901 for (j
= 0; j
< (cblk
->coord
[1][1] - cblk
->coord
[1][0]); ++j
)
902 for (i
= 0; i
< (cblk
->coord
[0][1] - cblk
->coord
[0][0]); ++i
) {
903 idx
= (comp
->coord
[0][1] - comp
->coord
[0][0]) * j
+ i
;
904 datap
[idx
] = (float)(t1
->data
[j
][i
]) * ((float)band
->stepsize
);
909 /* Integer dequantization of a codeblock.*/
910 static void dequantization_int(int x
, int y
, Jpeg2000Cblk
*cblk
,
911 Jpeg2000Component
*comp
,
912 Jpeg2000T1Context
*t1
, Jpeg2000Band
*band
)
916 (int32_t *) &comp
->data
[(comp
->coord
[0][1] - comp
->coord
[0][0]) * y
+ x
];
917 for (j
= 0; j
< (cblk
->coord
[1][1] - cblk
->coord
[1][0]); ++j
)
918 for (i
= 0; i
< (cblk
->coord
[0][1] - cblk
->coord
[0][0]); ++i
) {
919 idx
= (comp
->coord
[0][1] - comp
->coord
[0][0]) * j
+ i
;
921 ((int32_t)(t1
->data
[j
][i
]) * ((int32_t)band
->stepsize
) + (1 << 15)) >> 16;
926 /* Inverse ICT parameters in float and integer.
927 * int value = (float value) * (1<<16) */
928 static const float f_ict_params
[4] = {
934 static const int i_ict_params
[4] = {
941 static int mct_decode(Jpeg2000DecoderContext
*s
, Jpeg2000Tile
*tile
)
945 int32_t *src
[3], i0
, i1
, i2
;
946 float *srcf
[3], i0f
, i1f
, i2f
;
948 for (i
= 0; i
< 3; i
++)
949 if (tile
->codsty
[0].transform
== FF_DWT97
)
950 srcf
[i
] = tile
->comp
[i
].data
;
952 src
[i
] = (int32_t *)tile
->comp
[i
].data
;
954 for (i
= 0; i
< 2; i
++)
955 csize
*= tile
->comp
[0].coord
[i
][1] - tile
->comp
[0].coord
[i
][0];
956 switch (tile
->codsty
[0].transform
) {
958 for (i
= 0; i
< csize
; i
++) {
959 i0f
= *srcf
[0] + (f_ict_params
[0] * *srcf
[2]);
960 i1f
= *srcf
[0] - (f_ict_params
[1] * *srcf
[1])
961 - (f_ict_params
[2] * *srcf
[2]);
962 i2f
= *srcf
[0] + (f_ict_params
[3] * *srcf
[1]);
969 for (i
= 0; i
< csize
; i
++) {
970 i0
= *src
[0] + (((i_ict_params
[0] * *src
[2]) + (1 << 15)) >> 16);
971 i1
= *src
[0] - (((i_ict_params
[1] * *src
[1]) + (1 << 15)) >> 16)
972 - (((i_ict_params
[2] * *src
[2]) + (1 << 15)) >> 16);
973 i2
= *src
[0] + (((i_ict_params
[3] * *src
[1]) + (1 << 15)) >> 16);
980 for (i
= 0; i
< csize
; i
++) {
981 i1
= *src
[0] - (*src
[2] + *src
[1] >> 2);
993 static int jpeg2000_decode_tile(Jpeg2000DecoderContext
*s
, Jpeg2000Tile
*tile
,
996 int compno
, reslevelno
, bandno
;
1000 Jpeg2000T1Context t1
;
1001 /* Loop on tile components */
1003 for (compno
= 0; compno
< s
->ncomponents
; compno
++) {
1004 Jpeg2000Component
*comp
= tile
->comp
+ compno
;
1005 Jpeg2000CodingStyle
*codsty
= tile
->codsty
+ compno
;
1006 /* Loop on resolution levels */
1007 for (reslevelno
= 0; reslevelno
< codsty
->nreslevels2decode
; reslevelno
++) {
1008 Jpeg2000ResLevel
*rlevel
= comp
->reslevel
+ reslevelno
;
1010 for (bandno
= 0; bandno
< rlevel
->nbands
; bandno
++) {
1011 uint16_t nb_precincts
, precno
;
1012 Jpeg2000Band
*band
= rlevel
->band
+ bandno
;
1013 int cblkno
= 0, bandpos
;
1014 bandpos
= bandno
+ (reslevelno
> 0);
1016 nb_precincts
= rlevel
->num_precincts_x
* rlevel
->num_precincts_y
;
1017 /* Loop on precincts */
1018 for (precno
= 0; precno
< nb_precincts
; precno
++) {
1019 Jpeg2000Prec
*prec
= band
->prec
+ precno
;
1021 /* Loop on codeblocks */
1022 for (cblkno
= 0; cblkno
< prec
->nb_codeblocks_width
* prec
->nb_codeblocks_height
; cblkno
++) {
1024 Jpeg2000Cblk
*cblk
= prec
->cblk
+ cblkno
;
1025 decode_cblk(s
, codsty
, &t1
, cblk
,
1026 cblk
->coord
[0][1] - cblk
->coord
[0][0],
1027 cblk
->coord
[1][1] - cblk
->coord
[1][0],
1030 /* Manage band offsets */
1031 x
= cblk
->coord
[0][0];
1032 y
= cblk
->coord
[1][0];
1033 if ((reslevelno
> 0) && ((bandno
+ 1) & 1)) {
1034 Jpeg2000ResLevel
*pres
= comp
->reslevel
+ (reslevelno
- 1);
1035 x
+= pres
->coord
[0][1] - pres
->coord
[0][0];
1037 if ((reslevelno
> 0) && ((bandno
+ 1) & 2)) {
1038 Jpeg2000ResLevel
*pres
= comp
->reslevel
+ (reslevelno
- 1);
1039 y
+= pres
->coord
[1][1] - pres
->coord
[1][0];
1042 if (s
->avctx
->flags
& CODEC_FLAG_BITEXACT
)
1043 dequantization_int(x
, y
, cblk
, comp
, &t1
, band
);
1045 dequantization_float(x
, y
, cblk
, comp
, &t1
, band
);
1049 } /* end reslevel */
1052 ff_dwt_decode(&comp
->dwt
, comp
->data
);
1055 /* inverse MCT transformation */
1056 if (tile
->codsty
[0].mct
)
1057 mct_decode(s
, tile
);
1059 if (s
->avctx
->pix_fmt
== PIX_FMT_BGRA
) // RGBA -> BGRA
1060 FFSWAP(float *, tile
->comp
[0].data
, tile
->comp
[2].data
);
1062 if (s
->precision
<= 8) {
1063 for (compno
= 0; compno
< s
->ncomponents
; compno
++) {
1064 Jpeg2000Component
*comp
= tile
->comp
+ compno
;
1065 int32_t *datap
= (int32_t *)comp
->data
;
1066 y
= tile
->comp
[compno
].coord
[1][0] - s
->image_offset_y
;
1067 line
= picture
->data
[0] + y
* picture
->linesize
[0];
1068 for (; y
< tile
->comp
[compno
].coord
[1][1] - s
->image_offset_y
; y
+= s
->cdy
[compno
]) {
1071 x
= tile
->comp
[compno
].coord
[0][0] - s
->image_offset_x
;
1072 dst
= line
+ x
* s
->ncomponents
+ compno
;
1074 for (; x
< tile
->comp
[compno
].coord
[0][1] - s
->image_offset_x
; x
+= s
->cdx
[compno
]) {
1075 *datap
+= 1 << (s
->cbps
[compno
] - 1);
1078 else if (*datap
>= (1 << s
->cbps
[compno
]))
1079 *datap
= (1 << s
->cbps
[compno
]) - 1;
1081 dst
+= s
->ncomponents
;
1083 line
+= picture
->linesize
[0];
1087 for (compno
= 0; compno
< s
->ncomponents
; compno
++) {
1088 Jpeg2000Component
*comp
= tile
->comp
+ compno
;
1089 float *datap
= comp
->data
;
1090 int32_t *i_datap
= (int32_t *) comp
->data
;
1093 y
= tile
->comp
[compno
].coord
[1][0] - s
->image_offset_y
;
1094 linel
= (uint16_t *)picture
->data
[0] + y
* (picture
->linesize
[0] >> 1);
1095 for (; y
< tile
->comp
[compno
].coord
[1][1] - s
->image_offset_y
; y
+= s
->cdy
[compno
]) {
1097 x
= tile
->comp
[compno
].coord
[0][0] - s
->image_offset_x
;
1098 dst
= linel
+ (x
* s
->ncomponents
+ compno
);
1099 for (; x
< s
->avctx
->width
; x
+= s
->cdx
[compno
]) {
1101 /* DC level shift and clip see ISO 15444-1:2002 G.1.2 */
1102 if (s
->avctx
->flags
& CODEC_FLAG_BITEXACT
)
1103 val
= *i_datap
+ (1 << (s
->cbps
[compno
] - 1));
1105 val
= lrintf(*datap
) + (1 << (s
->cbps
[compno
] - 1));
1106 val
= av_clip(val
, 0, (1 << s
->cbps
[compno
]) - 1);
1107 /* align 12 bit values in little-endian mode */
1111 dst
+= s
->ncomponents
;
1113 linel
+= picture
->linesize
[0] >> 1;
1120 static void jpeg2000_dec_cleanup(Jpeg2000DecoderContext
*s
)
1123 for (tileno
= 0; tileno
< s
->numXtiles
* s
->numYtiles
; tileno
++) {
1124 for (compno
= 0; compno
< s
->ncomponents
; compno
++) {
1125 Jpeg2000Component
*comp
= s
->tile
[tileno
].comp
+ compno
;
1126 Jpeg2000CodingStyle
*codsty
= s
->tile
[tileno
].codsty
+ compno
;
1128 ff_jpeg2000_cleanup(comp
, codsty
);
1130 av_freep(&s
->tile
[tileno
].comp
);
1135 static int jpeg2000_read_main_headers(Jpeg2000DecoderContext
*s
)
1137 Jpeg2000CodingStyle
*codsty
= s
->codsty
;
1138 Jpeg2000QuantStyle
*qntsty
= s
->qntsty
;
1139 uint8_t *properties
= s
->properties
;
1144 const uint8_t *oldbuf
;
1146 if (s
->buf_end
- s
->buf
< 2) {
1147 av_log(s
->avctx
, AV_LOG_ERROR
, "Missing EOC\n");
1151 marker
= bytestream_get_be16(&s
->buf
);
1154 if (marker
== JPEG2000_EOC
)
1157 if (s
->buf_end
- s
->buf
< 2)
1158 return AVERROR(EINVAL
);
1159 len
= bytestream_get_be16(&s
->buf
);
1165 ret
= get_coc(s
, codsty
, properties
);
1168 ret
= get_cod(s
, codsty
, properties
);
1171 ret
= get_qcc(s
, len
, qntsty
, properties
);
1174 ret
= get_qcd(s
, len
, qntsty
, properties
);
1177 ret
= get_sot(s
, len
);
1180 // the comment is ignored
1184 // Tile-part lengths
1185 ret
= get_tlm(s
, len
);
1188 av_log(s
->avctx
, AV_LOG_ERROR
,
1189 "unsupported marker 0x%.4X at pos 0x%lX\n",
1190 marker
, (uint64_t)(s
->buf
- s
->buf_start
- 4));
1194 if (((s
->buf
- oldbuf
!= len
) && (marker
!= JPEG2000_SOT
)) || ret
) {
1195 av_log(s
->avctx
, AV_LOG_ERROR
,
1196 "error during processing marker segment %.4x\n", marker
);
1197 return ret ? ret
: -1;
1203 /* Read bit stream packets --> T2 operation. */
1204 static int jpeg2000_read_bitstream_packets(Jpeg2000DecoderContext
*s
)
1207 Jpeg2000Tile
*tile
= s
->tile
+ s
->curtileno
;
1209 if (ret
= init_tile(s
, s
->curtileno
))
1211 if (ret
= jpeg2000_decode_packets(s
, tile
))
1217 static int jp2_find_codestream(Jpeg2000DecoderContext
*s
)
1220 int found_codestream
= 0, search_range
= 10;
1222 // Skip JPEG 2000 signature atom.
1225 while (!found_codestream
&& search_range
) {
1226 atom_size
= AV_RB32(s
->buf
);
1227 if (AV_RB32(s
->buf
+ 4) == JP2_CODESTREAM
) {
1228 found_codestream
= 1;
1231 s
->buf
+= atom_size
;
1236 if (found_codestream
)
1241 static int jpeg2000_decode_frame(AVCodecContext
*avctx
, void *data
,
1242 int *got_frame
, AVPacket
*avpkt
)
1244 Jpeg2000DecoderContext
*s
= avctx
->priv_data
;
1245 AVFrame
*picture
= data
;
1249 s
->buf
= s
->buf_start
= avpkt
->data
;
1250 s
->buf_end
= s
->buf_start
+ avpkt
->size
;
1251 s
->curtileno
= 0; // TODO: only one tile in DCI JP2K. to implement for more tiles
1253 // reduction factor, i.e number of resolution levels to skip
1254 s
->reduction_factor
= s
->lowres
;
1256 ff_jpeg2000_init_tier1_luts();
1258 if (s
->buf_end
- s
->buf
< 2)
1259 return AVERROR(EINVAL
);
1261 // check if the image is in jp2 format
1262 if ((AV_RB32(s
->buf
) == 12) &&
1263 (AV_RB32(s
->buf
+ 4) == JP2_SIG_TYPE
) &&
1264 (AV_RB32(s
->buf
+ 8) == JP2_SIG_VALUE
)) {
1265 if (!jp2_find_codestream(s
)) {
1266 av_log(avctx
, AV_LOG_ERROR
,
1267 "couldn't find jpeg2k codestream atom\n");
1272 if (bytestream_get_be16(&s
->buf
) != JPEG2000_SOC
) {
1273 av_log(avctx
, AV_LOG_ERROR
, "SOC marker not present\n");
1276 if (ret
= jpeg2000_read_main_headers(s
))
1279 /* get picture buffer */
1280 if ((ret
= ff_get_buffer(avctx
, picture
, 0)) < 0) {
1281 av_log(avctx
, AV_LOG_ERROR
, "ff_get_buffer() failed\n");
1284 picture
->pict_type
= AV_PICTURE_TYPE_I
;
1285 picture
->key_frame
= 1;
1287 if (ret
= jpeg2000_read_bitstream_packets(s
))
1289 for (tileno
= 0; tileno
< s
->numXtiles
* s
->numYtiles
; tileno
++)
1290 if (ret
= jpeg2000_decode_tile(s
, s
->tile
+ tileno
, picture
))
1292 jpeg2000_dec_cleanup(s
);
1296 return s
->buf
- s
->buf_start
;
1299 #define OFFSET(x) offsetof(Jpeg2000DecoderContext, x)
1300 #define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
1302 static const AVOption options
[] = {
1303 { "lowres", "Lower the decoding resolution by a power of two",
1304 OFFSET(lowres
), AV_OPT_TYPE_INT
, { .i64
= 0 }, 0, JPEG2000_MAX_RESLEVELS
- 1, VD
},
1308 static const AVProfile profiles
[] = {
1309 { FF_PROFILE_JPEG2000_CSTREAM_RESTRICTION_0
, "JPEG 2000 codestream restriction 0" },
1310 { FF_PROFILE_JPEG2000_CSTREAM_RESTRICTION_1
, "JPEG 2000 codestream restriction 1" },
1311 { FF_PROFILE_JPEG2000_CSTREAM_NO_RESTRICTION
, "JPEG 2000 no codestream restrictions" },
1312 { FF_PROFILE_JPEG2000_DCINEMA_2K
, "JPEG 2000 digital cinema 2K" },
1313 { FF_PROFILE_JPEG2000_DCINEMA_4K
, "JPEG 2000 digital cinema 4K" },
1314 { FF_PROFILE_UNKNOWN
},
1317 static const AVClass
class = {
1318 .class_name
= "jpeg2000",
1319 .item_name
= av_default_item_name
,
1321 .version
= LIBAVUTIL_VERSION_INT
,
1324 AVCodec ff_jpeg2000_decoder
= {
1326 .long_name
= NULL_IF_CONFIG_SMALL("JPEG 2000"),
1327 .type
= AVMEDIA_TYPE_VIDEO
,
1328 .id
= AV_CODEC_ID_JPEG2000
,
1329 .priv_data_size
= sizeof(Jpeg2000DecoderContext
),
1330 .decode
= jpeg2000_decode_frame
,
1331 .priv_class
= &class,
1332 .pix_fmts
= (enum PixelFormat
[]) { AV_PIX_FMT_XYZ12
,
1335 .profiles
= NULL_IF_CONFIG_SMALL(profiles
)