]> git.sesse.net Git - ffmpeg/blob - libavcodec/jpeg2000dec.c
Merge commit '074c769de93bf12e9f44d77e58a8c7167f9dfb13'
[ffmpeg] / libavcodec / jpeg2000dec.c
1 /*
2  * JPEG 2000 image decoder
3  * Copyright (c) 2007 Kamil Nowosad
4  * Copyright (c) 2013 Nicolas Bertrand <nicoinattendu@gmail.com>
5  *
6  * This file is part of FFmpeg.
7  *
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.
12  *
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.
17  *
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
21  */
22
23 /**
24  * @file
25  * JPEG 2000 image decoder
26  */
27
28 #include "libavutil/avassert.h"
29 #include "libavutil/common.h"
30 #include "libavutil/opt.h"
31 #include "libavutil/pixdesc.h"
32 #include "avcodec.h"
33 #include "bytestream.h"
34 #include "internal.h"
35 #include "thread.h"
36 #include "jpeg2000.h"
37
38 #define JP2_SIG_TYPE    0x6A502020
39 #define JP2_SIG_VALUE   0x0D0A870A
40 #define JP2_CODESTREAM  0x6A703263
41 #define JP2_HEADER      0x6A703268
42
43 #define HAD_COC 0x01
44 #define HAD_QCC 0x02
45
46 typedef struct Jpeg2000TilePart {
47     uint8_t tile_index;                 // Tile index who refers the tile-part
48     const uint8_t *tp_end;
49     GetByteContext tpg;                 // bit stream in tile-part
50 } Jpeg2000TilePart;
51
52 /* RMK: For JPEG2000 DCINEMA 3 tile-parts in a tile
53  * one per component, so tile_part elements have a size of 3 */
54 typedef struct Jpeg2000Tile {
55     Jpeg2000Component   *comp;
56     uint8_t             properties[4];
57     Jpeg2000CodingStyle codsty[4];
58     Jpeg2000QuantStyle  qntsty[4];
59     Jpeg2000TilePart    tile_part[4];
60     uint16_t tp_idx;                    // Tile-part index
61 } Jpeg2000Tile;
62
63 typedef struct Jpeg2000DecoderContext {
64     AVClass         *class;
65     AVCodecContext  *avctx;
66     GetByteContext  g;
67
68     int             width, height;
69     int             image_offset_x, image_offset_y;
70     int             tile_offset_x, tile_offset_y;
71     uint8_t         cbps[4];    // bits per sample in particular components
72     uint8_t         sgnd[4];    // if a component is signed
73     uint8_t         properties[4];
74     int             cdx[4], cdy[4];
75     int             precision;
76     int             ncomponents;
77     int             colour_space;
78     uint32_t        palette[256];
79     int8_t          pal8;
80     int             cdef[4];
81     int             tile_width, tile_height;
82     unsigned        numXtiles, numYtiles;
83     int             maxtilelen;
84
85     Jpeg2000CodingStyle codsty[4];
86     Jpeg2000QuantStyle  qntsty[4];
87
88     int             bit_index;
89
90     int             curtileno;
91
92     Jpeg2000Tile    *tile;
93
94     /*options parameters*/
95     int             reduction_factor;
96 } Jpeg2000DecoderContext;
97
98 /* get_bits functions for JPEG2000 packet bitstream
99  * It is a get_bit function with a bit-stuffing routine. If the value of the
100  * byte is 0xFF, the next byte includes an extra zero bit stuffed into the MSB.
101  * cf. ISO-15444-1:2002 / B.10.1 Bit-stuffing routine */
102 static int get_bits(Jpeg2000DecoderContext *s, int n)
103 {
104     int res = 0;
105
106     while (--n >= 0) {
107         res <<= 1;
108         if (s->bit_index == 0) {
109             s->bit_index = 7 + (bytestream2_get_byte(&s->g) != 0xFFu);
110         }
111         s->bit_index--;
112         res |= (bytestream2_peek_byte(&s->g) >> s->bit_index) & 1;
113     }
114     return res;
115 }
116
117 static void jpeg2000_flush(Jpeg2000DecoderContext *s)
118 {
119     if (bytestream2_get_byte(&s->g) == 0xff)
120         bytestream2_skip(&s->g, 1);
121     s->bit_index = 8;
122 }
123
124 /* decode the value stored in node */
125 static int tag_tree_decode(Jpeg2000DecoderContext *s, Jpeg2000TgtNode *node,
126                            int threshold)
127 {
128     Jpeg2000TgtNode *stack[30];
129     int sp = -1, curval = 0;
130
131     if (!node)
132         return AVERROR_INVALIDDATA;
133
134     while (node && !node->vis) {
135         stack[++sp] = node;
136         node        = node->parent;
137     }
138
139     if (node)
140         curval = node->val;
141     else
142         curval = stack[sp]->val;
143
144     while (curval < threshold && sp >= 0) {
145         if (curval < stack[sp]->val)
146             curval = stack[sp]->val;
147         while (curval < threshold) {
148             int ret;
149             if ((ret = get_bits(s, 1)) > 0) {
150                 stack[sp]->vis++;
151                 break;
152             } else if (!ret)
153                 curval++;
154             else
155                 return ret;
156         }
157         stack[sp]->val = curval;
158         sp--;
159     }
160     return curval;
161 }
162
163 static int pix_fmt_match(enum AVPixelFormat pix_fmt, int components,
164                          int bpc, uint32_t log2_chroma_wh, int pal8)
165 {
166     int match = 1;
167     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
168
169     if (desc->nb_components != components) {
170         return 0;
171     }
172
173     switch (components) {
174     case 4:
175         match = match && desc->comp[3].depth_minus1 + 1 >= bpc &&
176                          (log2_chroma_wh >> 14 & 3) == 0 &&
177                          (log2_chroma_wh >> 12 & 3) == 0;
178     case 3:
179         match = match && desc->comp[2].depth_minus1 + 1 >= bpc &&
180                          (log2_chroma_wh >> 10 & 3) == desc->log2_chroma_w &&
181                          (log2_chroma_wh >>  8 & 3) == desc->log2_chroma_h;
182     case 2:
183         match = match && desc->comp[1].depth_minus1 + 1 >= bpc &&
184                          (log2_chroma_wh >>  6 & 3) == desc->log2_chroma_w &&
185                          (log2_chroma_wh >>  4 & 3) == desc->log2_chroma_h;
186
187     case 1:
188         match = match && desc->comp[0].depth_minus1 + 1 >= bpc &&
189                          (log2_chroma_wh >>  2 & 3) == 0 &&
190                          (log2_chroma_wh       & 3) == 0 &&
191                          (desc->flags & AV_PIX_FMT_FLAG_PAL) == pal8 * AV_PIX_FMT_FLAG_PAL;
192     }
193     return match;
194 }
195
196 // pix_fmts with lower bpp have to be listed before
197 // similar pix_fmts with higher bpp.
198 #define RGB_PIXEL_FORMATS   AV_PIX_FMT_PAL8,AV_PIX_FMT_RGB24,AV_PIX_FMT_RGBA,AV_PIX_FMT_RGB48,AV_PIX_FMT_RGBA64
199 #define GRAY_PIXEL_FORMATS  AV_PIX_FMT_GRAY8,AV_PIX_FMT_GRAY8A,AV_PIX_FMT_GRAY16
200 #define YUV_PIXEL_FORMATS   AV_PIX_FMT_YUV410P,AV_PIX_FMT_YUV411P,AV_PIX_FMT_YUVA420P, \
201                             AV_PIX_FMT_YUV420P,AV_PIX_FMT_YUV422P,AV_PIX_FMT_YUVA422P, \
202                             AV_PIX_FMT_YUV440P,AV_PIX_FMT_YUV444P,AV_PIX_FMT_YUVA444P, \
203                             AV_PIX_FMT_YUV420P9,AV_PIX_FMT_YUV422P9,AV_PIX_FMT_YUV444P9, \
204                             AV_PIX_FMT_YUVA420P9,AV_PIX_FMT_YUVA422P9,AV_PIX_FMT_YUVA444P9, \
205                             AV_PIX_FMT_YUV420P10,AV_PIX_FMT_YUV422P10,AV_PIX_FMT_YUV444P10, \
206                             AV_PIX_FMT_YUVA420P10,AV_PIX_FMT_YUVA422P10,AV_PIX_FMT_YUVA444P10, \
207                             AV_PIX_FMT_YUV420P12,AV_PIX_FMT_YUV422P12,AV_PIX_FMT_YUV444P12, \
208                             AV_PIX_FMT_YUV420P14,AV_PIX_FMT_YUV422P14,AV_PIX_FMT_YUV444P14, \
209                             AV_PIX_FMT_YUV420P16,AV_PIX_FMT_YUV422P16,AV_PIX_FMT_YUV444P16, \
210                             AV_PIX_FMT_YUVA420P16,AV_PIX_FMT_YUVA422P16,AV_PIX_FMT_YUVA444P16
211 #define XYZ_PIXEL_FORMATS   AV_PIX_FMT_XYZ12
212
213 static const enum AVPixelFormat rgb_pix_fmts[]  = {RGB_PIXEL_FORMATS};
214 static const enum AVPixelFormat gray_pix_fmts[] = {GRAY_PIXEL_FORMATS};
215 static const enum AVPixelFormat yuv_pix_fmts[]  = {YUV_PIXEL_FORMATS};
216 static const enum AVPixelFormat xyz_pix_fmts[]  = {XYZ_PIXEL_FORMATS};
217 static const enum AVPixelFormat all_pix_fmts[]  = {RGB_PIXEL_FORMATS,
218                                                    GRAY_PIXEL_FORMATS,
219                                                    YUV_PIXEL_FORMATS,
220                                                    XYZ_PIXEL_FORMATS};
221
222 /* marker segments */
223 /* get sizes and offsets of image, tiles; number of components */
224 static int get_siz(Jpeg2000DecoderContext *s)
225 {
226     int i;
227     int ncomponents;
228     uint32_t log2_chroma_wh = 0;
229     const enum AVPixelFormat *possible_fmts = NULL;
230     int possible_fmts_nb = 0;
231
232     if (bytestream2_get_bytes_left(&s->g) < 36)
233         return AVERROR_INVALIDDATA;
234
235     s->avctx->profile = bytestream2_get_be16u(&s->g); // Rsiz
236     s->width          = bytestream2_get_be32u(&s->g); // Width
237     s->height         = bytestream2_get_be32u(&s->g); // Height
238     s->image_offset_x = bytestream2_get_be32u(&s->g); // X0Siz
239     s->image_offset_y = bytestream2_get_be32u(&s->g); // Y0Siz
240     s->tile_width     = bytestream2_get_be32u(&s->g); // XTSiz
241     s->tile_height    = bytestream2_get_be32u(&s->g); // YTSiz
242     s->tile_offset_x  = bytestream2_get_be32u(&s->g); // XT0Siz
243     s->tile_offset_y  = bytestream2_get_be32u(&s->g); // YT0Siz
244     ncomponents       = bytestream2_get_be16u(&s->g); // CSiz
245
246     if (s->image_offset_x || s->image_offset_y) {
247         avpriv_request_sample(s->avctx, "Support for image offsets");
248         return AVERROR_PATCHWELCOME;
249     }
250
251     if (ncomponents <= 0) {
252         av_log(s->avctx, AV_LOG_ERROR, "Invalid number of components: %d\n",
253                s->ncomponents);
254         return AVERROR_INVALIDDATA;
255     }
256
257     if (ncomponents > 4) {
258         avpriv_request_sample(s->avctx, "Support for %d components",
259                               s->ncomponents);
260         return AVERROR_PATCHWELCOME;
261     }
262
263     s->ncomponents = ncomponents;
264
265     if (s->tile_width <= 0 || s->tile_height <= 0) {
266         av_log(s->avctx, AV_LOG_ERROR, "Invalid tile dimension %dx%d.\n",
267                s->tile_width, s->tile_height);
268         return AVERROR_INVALIDDATA;
269     }
270
271     if (bytestream2_get_bytes_left(&s->g) < 3 * s->ncomponents)
272         return AVERROR_INVALIDDATA;
273
274     for (i = 0; i < s->ncomponents; i++) { // Ssiz_i XRsiz_i, YRsiz_i
275         uint8_t x    = bytestream2_get_byteu(&s->g);
276         s->cbps[i]   = (x & 0x7f) + 1;
277         s->precision = FFMAX(s->cbps[i], s->precision);
278         s->sgnd[i]   = !!(x & 0x80);
279         s->cdx[i]    = bytestream2_get_byteu(&s->g);
280         s->cdy[i]    = bytestream2_get_byteu(&s->g);
281         if (   !s->cdx[i] || s->cdx[i] == 3 || s->cdx[i] > 4
282             || !s->cdy[i] || s->cdy[i] == 3 || s->cdy[i] > 4) {
283             av_log(s->avctx, AV_LOG_ERROR, "Invalid sample separation %d/%d\n", s->cdx[i], s->cdy[i]);
284             return AVERROR_INVALIDDATA;
285         }
286         log2_chroma_wh |= s->cdy[i] >> 1 << i * 4 | s->cdx[i] >> 1 << i * 4 + 2;
287     }
288
289     s->numXtiles = ff_jpeg2000_ceildiv(s->width  - s->tile_offset_x, s->tile_width);
290     s->numYtiles = ff_jpeg2000_ceildiv(s->height - s->tile_offset_y, s->tile_height);
291
292     if (s->numXtiles * (uint64_t)s->numYtiles > INT_MAX/sizeof(*s->tile)) {
293         s->numXtiles = s->numYtiles = 0;
294         return AVERROR(EINVAL);
295     }
296
297     s->tile = av_mallocz_array(s->numXtiles * s->numYtiles, sizeof(*s->tile));
298     if (!s->tile) {
299         s->numXtiles = s->numYtiles = 0;
300         return AVERROR(ENOMEM);
301     }
302
303     for (i = 0; i < s->numXtiles * s->numYtiles; i++) {
304         Jpeg2000Tile *tile = s->tile + i;
305
306         tile->comp = av_mallocz(s->ncomponents * sizeof(*tile->comp));
307         if (!tile->comp)
308             return AVERROR(ENOMEM);
309     }
310
311     /* compute image size with reduction factor */
312     s->avctx->width  = ff_jpeg2000_ceildivpow2(s->width  - s->image_offset_x,
313                                                s->reduction_factor);
314     s->avctx->height = ff_jpeg2000_ceildivpow2(s->height - s->image_offset_y,
315                                                s->reduction_factor);
316
317     if (s->avctx->profile == FF_PROFILE_JPEG2000_DCINEMA_2K ||
318         s->avctx->profile == FF_PROFILE_JPEG2000_DCINEMA_4K) {
319         possible_fmts = xyz_pix_fmts;
320         possible_fmts_nb = FF_ARRAY_ELEMS(xyz_pix_fmts);
321     } else {
322         switch (s->colour_space) {
323         case 16:
324             possible_fmts = rgb_pix_fmts;
325             possible_fmts_nb = FF_ARRAY_ELEMS(rgb_pix_fmts);
326             break;
327         case 17:
328             possible_fmts = gray_pix_fmts;
329             possible_fmts_nb = FF_ARRAY_ELEMS(gray_pix_fmts);
330             break;
331         case 18:
332             possible_fmts = yuv_pix_fmts;
333             possible_fmts_nb = FF_ARRAY_ELEMS(yuv_pix_fmts);
334             break;
335         default:
336             possible_fmts = all_pix_fmts;
337             possible_fmts_nb = FF_ARRAY_ELEMS(all_pix_fmts);
338             break;
339         }
340     }
341     for (i = 0; i < possible_fmts_nb; ++i) {
342         if (pix_fmt_match(possible_fmts[i], ncomponents, s->precision, log2_chroma_wh, s->pal8)) {
343             s->avctx->pix_fmt = possible_fmts[i];
344             break;
345         }
346     }
347     if (s->avctx->pix_fmt == AV_PIX_FMT_NONE) {
348         av_log(s->avctx, AV_LOG_ERROR,
349                "Unknown pix_fmt, profile: %d, colour_space: %d, "
350                "components: %d, precision: %d, "
351                "cdx[1]: %d, cdy[1]: %d, cdx[2]: %d, cdy[2]: %d\n",
352                s->avctx->profile, s->colour_space, ncomponents, s->precision,
353                ncomponents > 2 ? s->cdx[1] : 0,
354                ncomponents > 2 ? s->cdy[1] : 0,
355                ncomponents > 2 ? s->cdx[2] : 0,
356                ncomponents > 2 ? s->cdy[2] : 0);
357     }
358     s->avctx->bits_per_raw_sample = s->precision;
359     return 0;
360 }
361
362 /* get common part for COD and COC segments */
363 static int get_cox(Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *c)
364 {
365     uint8_t byte;
366
367     if (bytestream2_get_bytes_left(&s->g) < 5)
368         return AVERROR_INVALIDDATA;
369
370     /*  nreslevels = number of resolution levels
371                    = number of decomposition level +1 */
372     c->nreslevels = bytestream2_get_byteu(&s->g) + 1;
373     if (c->nreslevels >= JPEG2000_MAX_RESLEVELS) {
374         av_log(s->avctx, AV_LOG_ERROR, "nreslevels %d is invalid\n", c->nreslevels);
375         return AVERROR_INVALIDDATA;
376     }
377
378     if (c->nreslevels <= s->reduction_factor) {
379         /* we are forced to update reduction_factor as its requested value is
380            not compatible with this bitstream, and as we might have used it
381            already in setup earlier we have to fail this frame until
382            reinitialization is implemented */
383         av_log(s->avctx, AV_LOG_ERROR, "reduction_factor too large for this bitstream, max is %d\n", c->nreslevels - 1);
384         s->reduction_factor = c->nreslevels - 1;
385         return AVERROR(EINVAL);
386     }
387
388     /* compute number of resolution levels to decode */
389     c->nreslevels2decode = c->nreslevels - s->reduction_factor;
390
391     c->log2_cblk_width  = (bytestream2_get_byteu(&s->g) & 15) + 2; // cblk width
392     c->log2_cblk_height = (bytestream2_get_byteu(&s->g) & 15) + 2; // cblk height
393
394     if (c->log2_cblk_width > 10 || c->log2_cblk_height > 10 ||
395         c->log2_cblk_width + c->log2_cblk_height > 12) {
396         av_log(s->avctx, AV_LOG_ERROR, "cblk size invalid\n");
397         return AVERROR_INVALIDDATA;
398     }
399
400     if (c->log2_cblk_width > 6 || c->log2_cblk_height > 6) {
401         avpriv_request_sample(s->avctx, "cblk size > 64");
402         return AVERROR_PATCHWELCOME;
403     }
404
405     c->cblk_style = bytestream2_get_byteu(&s->g);
406     if (c->cblk_style != 0) { // cblk style
407         av_log(s->avctx, AV_LOG_WARNING, "extra cblk styles %X\n", c->cblk_style);
408     }
409     c->transform = bytestream2_get_byteu(&s->g); // DWT transformation type
410     /* set integer 9/7 DWT in case of BITEXACT flag */
411     if ((s->avctx->flags & CODEC_FLAG_BITEXACT) && (c->transform == FF_DWT97))
412         c->transform = FF_DWT97_INT;
413
414     if (c->csty & JPEG2000_CSTY_PREC) {
415         int i;
416         for (i = 0; i < c->nreslevels; i++) {
417             byte = bytestream2_get_byte(&s->g);
418             c->log2_prec_widths[i]  =  byte       & 0x0F;    // precinct PPx
419             c->log2_prec_heights[i] = (byte >> 4) & 0x0F;    // precinct PPy
420         }
421     } else {
422         memset(c->log2_prec_widths , 15, sizeof(c->log2_prec_widths ));
423         memset(c->log2_prec_heights, 15, sizeof(c->log2_prec_heights));
424     }
425     return 0;
426 }
427
428 /* get coding parameters for a particular tile or whole image*/
429 static int get_cod(Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *c,
430                    uint8_t *properties)
431 {
432     Jpeg2000CodingStyle tmp;
433     int compno, ret;
434
435     if (bytestream2_get_bytes_left(&s->g) < 5)
436         return AVERROR_INVALIDDATA;
437
438     tmp.csty = bytestream2_get_byteu(&s->g);
439
440     // get progression order
441     tmp.prog_order = bytestream2_get_byteu(&s->g);
442
443     tmp.nlayers    = bytestream2_get_be16u(&s->g);
444     tmp.mct        = bytestream2_get_byteu(&s->g); // multiple component transformation
445
446     if (tmp.mct && s->ncomponents < 3) {
447         av_log(s->avctx, AV_LOG_ERROR,
448                "MCT %d with too few components (%d)\n",
449                tmp.mct, s->ncomponents);
450         return AVERROR_INVALIDDATA;
451     }
452
453     if ((ret = get_cox(s, &tmp)) < 0)
454         return ret;
455
456     for (compno = 0; compno < s->ncomponents; compno++)
457         if (!(properties[compno] & HAD_COC))
458             memcpy(c + compno, &tmp, sizeof(tmp));
459     return 0;
460 }
461
462 /* Get coding parameters for a component in the whole image or a
463  * particular tile. */
464 static int get_coc(Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *c,
465                    uint8_t *properties)
466 {
467     int compno, ret;
468
469     if (bytestream2_get_bytes_left(&s->g) < 2)
470         return AVERROR_INVALIDDATA;
471
472     compno = bytestream2_get_byteu(&s->g);
473
474     if (compno >= s->ncomponents) {
475         av_log(s->avctx, AV_LOG_ERROR,
476                "Invalid compno %d. There are %d components in the image.\n",
477                compno, s->ncomponents);
478         return AVERROR_INVALIDDATA;
479     }
480
481     c      += compno;
482     c->csty = bytestream2_get_byteu(&s->g);
483
484     if ((ret = get_cox(s, c)) < 0)
485         return ret;
486
487     properties[compno] |= HAD_COC;
488     return 0;
489 }
490
491 /* Get common part for QCD and QCC segments. */
492 static int get_qcx(Jpeg2000DecoderContext *s, int n, Jpeg2000QuantStyle *q)
493 {
494     int i, x;
495
496     if (bytestream2_get_bytes_left(&s->g) < 1)
497         return AVERROR_INVALIDDATA;
498
499     x = bytestream2_get_byteu(&s->g); // Sqcd
500
501     q->nguardbits = x >> 5;
502     q->quantsty   = x & 0x1f;
503
504     if (q->quantsty == JPEG2000_QSTY_NONE) {
505         n -= 3;
506         if (bytestream2_get_bytes_left(&s->g) < n ||
507             n > JPEG2000_MAX_DECLEVELS*3)
508             return AVERROR_INVALIDDATA;
509         for (i = 0; i < n; i++)
510             q->expn[i] = bytestream2_get_byteu(&s->g) >> 3;
511     } else if (q->quantsty == JPEG2000_QSTY_SI) {
512         if (bytestream2_get_bytes_left(&s->g) < 2)
513             return AVERROR_INVALIDDATA;
514         x          = bytestream2_get_be16u(&s->g);
515         q->expn[0] = x >> 11;
516         q->mant[0] = x & 0x7ff;
517         for (i = 1; i < JPEG2000_MAX_DECLEVELS * 3; i++) {
518             int curexpn = FFMAX(0, q->expn[0] - (i - 1) / 3);
519             q->expn[i] = curexpn;
520             q->mant[i] = q->mant[0];
521         }
522     } else {
523         n = (n - 3) >> 1;
524         if (bytestream2_get_bytes_left(&s->g) < 2 * n ||
525             n > JPEG2000_MAX_DECLEVELS*3)
526             return AVERROR_INVALIDDATA;
527         for (i = 0; i < n; i++) {
528             x          = bytestream2_get_be16u(&s->g);
529             q->expn[i] = x >> 11;
530             q->mant[i] = x & 0x7ff;
531         }
532     }
533     return 0;
534 }
535
536 /* Get quantization parameters for a particular tile or a whole image. */
537 static int get_qcd(Jpeg2000DecoderContext *s, int n, Jpeg2000QuantStyle *q,
538                    uint8_t *properties)
539 {
540     Jpeg2000QuantStyle tmp;
541     int compno, ret;
542
543     if ((ret = get_qcx(s, n, &tmp)) < 0)
544         return ret;
545     for (compno = 0; compno < s->ncomponents; compno++)
546         if (!(properties[compno] & HAD_QCC))
547             memcpy(q + compno, &tmp, sizeof(tmp));
548     return 0;
549 }
550
551 /* Get quantization parameters for a component in the whole image
552  * on in a particular tile. */
553 static int get_qcc(Jpeg2000DecoderContext *s, int n, Jpeg2000QuantStyle *q,
554                    uint8_t *properties)
555 {
556     int compno;
557
558     if (bytestream2_get_bytes_left(&s->g) < 1)
559         return AVERROR_INVALIDDATA;
560
561     compno = bytestream2_get_byteu(&s->g);
562
563     if (compno >= s->ncomponents) {
564         av_log(s->avctx, AV_LOG_ERROR,
565                "Invalid compno %d. There are %d components in the image.\n",
566                compno, s->ncomponents);
567         return AVERROR_INVALIDDATA;
568     }
569
570     properties[compno] |= HAD_QCC;
571     return get_qcx(s, n - 1, q + compno);
572 }
573
574 /* Get start of tile segment. */
575 static int get_sot(Jpeg2000DecoderContext *s, int n)
576 {
577     Jpeg2000TilePart *tp;
578     uint16_t Isot;
579     uint32_t Psot;
580     uint8_t TPsot;
581
582     if (bytestream2_get_bytes_left(&s->g) < 8)
583         return AVERROR_INVALIDDATA;
584
585     s->curtileno = 0;
586     Isot = bytestream2_get_be16u(&s->g);        // Isot
587     if (Isot >= s->numXtiles * s->numYtiles)
588         return AVERROR_INVALIDDATA;
589
590     s->curtileno = Isot;
591     Psot  = bytestream2_get_be32u(&s->g);       // Psot
592     TPsot = bytestream2_get_byteu(&s->g);       // TPsot
593
594     /* Read TNSot but not used */
595     bytestream2_get_byteu(&s->g);               // TNsot
596
597     if (Psot > bytestream2_get_bytes_left(&s->g) + n + 2) {
598         av_log(s->avctx, AV_LOG_ERROR, "Psot %d too big\n", Psot);
599         return AVERROR_INVALIDDATA;
600     }
601
602     if (TPsot >= FF_ARRAY_ELEMS(s->tile[Isot].tile_part)) {
603         avpriv_request_sample(s->avctx, "Support for %d components", TPsot);
604         return AVERROR_PATCHWELCOME;
605     }
606
607     s->tile[Isot].tp_idx = TPsot;
608     tp             = s->tile[Isot].tile_part + TPsot;
609     tp->tile_index = Isot;
610     tp->tp_end     = s->g.buffer + Psot - n - 2;
611
612     if (!TPsot) {
613         Jpeg2000Tile *tile = s->tile + s->curtileno;
614
615         /* copy defaults */
616         memcpy(tile->codsty, s->codsty, s->ncomponents * sizeof(Jpeg2000CodingStyle));
617         memcpy(tile->qntsty, s->qntsty, s->ncomponents * sizeof(Jpeg2000QuantStyle));
618     }
619
620     return 0;
621 }
622
623 /* Tile-part lengths: see ISO 15444-1:2002, section A.7.1
624  * Used to know the number of tile parts and lengths.
625  * There may be multiple TLMs in the header.
626  * TODO: The function is not used for tile-parts management, nor anywhere else.
627  * It can be useful to allocate memory for tile parts, before managing the SOT
628  * markers. Parsing the TLM header is needed to increment the input header
629  * buffer.
630  * This marker is mandatory for DCI. */
631 static uint8_t get_tlm(Jpeg2000DecoderContext *s, int n)
632 {
633     uint8_t Stlm, ST, SP, tile_tlm, i;
634     bytestream2_get_byte(&s->g);               /* Ztlm: skipped */
635     Stlm = bytestream2_get_byte(&s->g);
636
637     // too complex ? ST = ((Stlm >> 4) & 0x01) + ((Stlm >> 4) & 0x02);
638     ST = (Stlm >> 4) & 0x03;
639     // TODO: Manage case of ST = 0b11 --> raise error
640     SP       = (Stlm >> 6) & 0x01;
641     tile_tlm = (n - 4) / ((SP + 1) * 2 + ST);
642     for (i = 0; i < tile_tlm; i++) {
643         switch (ST) {
644         case 0:
645             break;
646         case 1:
647             bytestream2_get_byte(&s->g);
648             break;
649         case 2:
650             bytestream2_get_be16(&s->g);
651             break;
652         case 3:
653             bytestream2_get_be32(&s->g);
654             break;
655         }
656         if (SP == 0) {
657             bytestream2_get_be16(&s->g);
658         } else {
659             bytestream2_get_be32(&s->g);
660         }
661     }
662     return 0;
663 }
664
665 static int init_tile(Jpeg2000DecoderContext *s, int tileno)
666 {
667     int compno;
668     int tilex = tileno % s->numXtiles;
669     int tiley = tileno / s->numXtiles;
670     Jpeg2000Tile *tile = s->tile + tileno;
671
672     if (!tile->comp)
673         return AVERROR(ENOMEM);
674
675     for (compno = 0; compno < s->ncomponents; compno++) {
676         Jpeg2000Component *comp = tile->comp + compno;
677         Jpeg2000CodingStyle *codsty = tile->codsty + compno;
678         Jpeg2000QuantStyle  *qntsty = tile->qntsty + compno;
679         int ret; // global bandno
680
681         comp->coord_o[0][0] = FFMAX(tilex       * s->tile_width  + s->tile_offset_x, s->image_offset_x);
682         comp->coord_o[0][1] = FFMIN((tilex + 1) * s->tile_width  + s->tile_offset_x, s->width);
683         comp->coord_o[1][0] = FFMAX(tiley       * s->tile_height + s->tile_offset_y, s->image_offset_y);
684         comp->coord_o[1][1] = FFMIN((tiley + 1) * s->tile_height + s->tile_offset_y, s->height);
685
686         comp->coord[0][0] = ff_jpeg2000_ceildivpow2(comp->coord_o[0][0], s->reduction_factor);
687         comp->coord[0][1] = ff_jpeg2000_ceildivpow2(comp->coord_o[0][1], s->reduction_factor);
688         comp->coord[1][0] = ff_jpeg2000_ceildivpow2(comp->coord_o[1][0], s->reduction_factor);
689         comp->coord[1][1] = ff_jpeg2000_ceildivpow2(comp->coord_o[1][1], s->reduction_factor);
690
691         if (ret = ff_jpeg2000_init_component(comp, codsty, qntsty,
692                                              s->cbps[compno], s->cdx[compno],
693                                              s->cdy[compno], s->avctx))
694             return ret;
695     }
696     return 0;
697 }
698
699 /* Read the number of coding passes. */
700 static int getnpasses(Jpeg2000DecoderContext *s)
701 {
702     int num;
703     if (!get_bits(s, 1))
704         return 1;
705     if (!get_bits(s, 1))
706         return 2;
707     if ((num = get_bits(s, 2)) != 3)
708         return num < 0 ? num : 3 + num;
709     if ((num = get_bits(s, 5)) != 31)
710         return num < 0 ? num : 6 + num;
711     num = get_bits(s, 7);
712     return num < 0 ? num : 37 + num;
713 }
714
715 static int getlblockinc(Jpeg2000DecoderContext *s)
716 {
717     int res = 0, ret;
718     while (ret = get_bits(s, 1)) {
719         if (ret < 0)
720             return ret;
721         res++;
722     }
723     return res;
724 }
725
726 static int jpeg2000_decode_packet(Jpeg2000DecoderContext *s,
727                                   Jpeg2000CodingStyle *codsty,
728                                   Jpeg2000ResLevel *rlevel, int precno,
729                                   int layno, uint8_t *expn, int numgbits)
730 {
731     int bandno, cblkno, ret, nb_code_blocks;
732
733     if (!(ret = get_bits(s, 1))) {
734         jpeg2000_flush(s);
735         return 0;
736     } else if (ret < 0)
737         return ret;
738
739     for (bandno = 0; bandno < rlevel->nbands; bandno++) {
740         Jpeg2000Band *band = rlevel->band + bandno;
741         Jpeg2000Prec *prec = band->prec + precno;
742
743         if (band->coord[0][0] == band->coord[0][1] ||
744             band->coord[1][0] == band->coord[1][1])
745             continue;
746         nb_code_blocks =  prec->nb_codeblocks_height *
747                           prec->nb_codeblocks_width;
748         for (cblkno = 0; cblkno < nb_code_blocks; cblkno++) {
749             Jpeg2000Cblk *cblk = prec->cblk + cblkno;
750             int incl, newpasses, llen;
751
752             if (cblk->npasses)
753                 incl = get_bits(s, 1);
754             else
755                 incl = tag_tree_decode(s, prec->cblkincl + cblkno, layno + 1) == layno;
756             if (!incl)
757                 continue;
758             else if (incl < 0)
759                 return incl;
760
761             if (!cblk->npasses) {
762                 int v = expn[bandno] + numgbits - 1 -
763                         tag_tree_decode(s, prec->zerobits + cblkno, 100);
764                 if (v < 0) {
765                     av_log(s->avctx, AV_LOG_ERROR,
766                            "nonzerobits %d invalid\n", v);
767                     return AVERROR_INVALIDDATA;
768                 }
769                 cblk->nonzerobits = v;
770             }
771             if ((newpasses = getnpasses(s)) < 0)
772                 return newpasses;
773             if ((llen = getlblockinc(s)) < 0)
774                 return llen;
775             cblk->lblock += llen;
776             if ((ret = get_bits(s, av_log2(newpasses) + cblk->lblock)) < 0)
777                 return ret;
778             if (ret > sizeof(cblk->data)) {
779                 avpriv_request_sample(s->avctx,
780                                       "Block with lengthinc greater than %zu",
781                                       sizeof(cblk->data));
782                 return AVERROR_PATCHWELCOME;
783             }
784             cblk->lengthinc = ret;
785             cblk->npasses  += newpasses;
786         }
787     }
788     jpeg2000_flush(s);
789
790     if (codsty->csty & JPEG2000_CSTY_EPH) {
791         if (bytestream2_peek_be16(&s->g) == JPEG2000_EPH)
792             bytestream2_skip(&s->g, 2);
793         else
794             av_log(s->avctx, AV_LOG_ERROR, "EPH marker not found.\n");
795     }
796
797     for (bandno = 0; bandno < rlevel->nbands; bandno++) {
798         Jpeg2000Band *band = rlevel->band + bandno;
799         Jpeg2000Prec *prec = band->prec + precno;
800
801         nb_code_blocks = prec->nb_codeblocks_height * prec->nb_codeblocks_width;
802         for (cblkno = 0; cblkno < nb_code_blocks; cblkno++) {
803             Jpeg2000Cblk *cblk = prec->cblk + cblkno;
804             if (   bytestream2_get_bytes_left(&s->g) < cblk->lengthinc
805                 || sizeof(cblk->data) < cblk->length + cblk->lengthinc + 2
806             ) {
807                 av_log(s->avctx, AV_LOG_ERROR,
808                        "Block length %d or lengthinc %d is too large\n",
809                        cblk->length, cblk->lengthinc);
810                 return AVERROR_INVALIDDATA;
811             }
812
813             bytestream2_get_bufferu(&s->g, cblk->data + cblk->length, cblk->lengthinc);
814             cblk->length   += cblk->lengthinc;
815             cblk->lengthinc = 0;
816         }
817     }
818     return 0;
819 }
820
821 static int jpeg2000_decode_packets(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile)
822 {
823     int ret = 0;
824     int layno, reslevelno, compno, precno, ok_reslevel;
825     int x, y;
826
827     s->bit_index = 8;
828     switch (tile->codsty[0].prog_order) {
829     case JPEG2000_PGOD_RLCP:
830         avpriv_request_sample(s->avctx, "Progression order RLCP");
831
832     case JPEG2000_PGOD_LRCP:
833         for (layno = 0; layno < tile->codsty[0].nlayers; layno++) {
834             ok_reslevel = 1;
835             for (reslevelno = 0; ok_reslevel; reslevelno++) {
836                 ok_reslevel = 0;
837                 for (compno = 0; compno < s->ncomponents; compno++) {
838                     Jpeg2000CodingStyle *codsty = tile->codsty + compno;
839                     Jpeg2000QuantStyle *qntsty  = tile->qntsty + compno;
840                     if (reslevelno < codsty->nreslevels) {
841                         Jpeg2000ResLevel *rlevel = tile->comp[compno].reslevel +
842                                                 reslevelno;
843                         ok_reslevel = 1;
844                         for (precno = 0; precno < rlevel->num_precincts_x * rlevel->num_precincts_y; precno++)
845                             if ((ret = jpeg2000_decode_packet(s,
846                                                               codsty, rlevel,
847                                                               precno, layno,
848                                                               qntsty->expn + (reslevelno ? 3 * (reslevelno - 1) + 1 : 0),
849                                                               qntsty->nguardbits)) < 0)
850                                 return ret;
851                     }
852                 }
853             }
854         }
855         break;
856
857     case JPEG2000_PGOD_CPRL:
858         for (compno = 0; compno < s->ncomponents; compno++) {
859             Jpeg2000CodingStyle *codsty = tile->codsty + compno;
860             Jpeg2000QuantStyle *qntsty  = tile->qntsty + compno;
861
862             /* Set bit stream buffer address according to tile-part.
863              * For DCinema one tile-part per component, so can be
864              * indexed by component. */
865             s->g = tile->tile_part[compno].tpg;
866
867             /* Position loop (y axis)
868              * TODO: Automate computing of step 256.
869              * Fixed here, but to be computed before entering here. */
870             for (y = 0; y < s->height; y += 256) {
871                 /* Position loop (y axis)
872                  * TODO: automate computing of step 256.
873                  * Fixed here, but to be computed before entering here. */
874                 for (x = 0; x < s->width; x += 256) {
875                     for (reslevelno = 0; reslevelno < codsty->nreslevels; reslevelno++) {
876                         uint16_t prcx, prcy;
877                         uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; //  ==> N_L - r
878                         Jpeg2000ResLevel *rlevel = tile->comp[compno].reslevel + reslevelno;
879
880                         if (!((y % (1 << (rlevel->log2_prec_height + reducedresno)) == 0) ||
881                               (y == 0))) // TODO: 2nd condition simplified as try0 always =0 for dcinema
882                             continue;
883
884                         if (!((x % (1 << (rlevel->log2_prec_width + reducedresno)) == 0) ||
885                               (x == 0))) // TODO: 2nd condition simplified as try0 always =0 for dcinema
886                             continue;
887
888                         // check if a precinct exists
889                         prcx   = ff_jpeg2000_ceildivpow2(x, reducedresno) >> rlevel->log2_prec_width;
890                         prcy   = ff_jpeg2000_ceildivpow2(y, reducedresno) >> rlevel->log2_prec_height;
891                         precno = prcx + rlevel->num_precincts_x * prcy;
892                         for (layno = 0; layno < tile->codsty[0].nlayers; layno++) {
893                             if ((ret = jpeg2000_decode_packet(s, codsty, rlevel,
894                                                               precno, layno,
895                                                               qntsty->expn + (reslevelno ? 3 * (reslevelno - 1) + 1 : 0),
896                                                               qntsty->nguardbits)) < 0)
897                                 return ret;
898                         }
899                     }
900                 }
901             }
902         }
903         break;
904
905     case JPEG2000_PGOD_RPCL:
906         avpriv_request_sample(s->avctx, "Progression order RPCL");
907         ret = AVERROR_PATCHWELCOME;
908         break;
909
910     case JPEG2000_PGOD_PCRL:
911         avpriv_request_sample(s->avctx, "Progression order PCRL");
912         ret = AVERROR_PATCHWELCOME;
913         break;
914
915     default:
916         break;
917     }
918
919     /* EOC marker reached */
920     bytestream2_skip(&s->g, 2);
921
922     return ret;
923 }
924
925 /* TIER-1 routines */
926 static void decode_sigpass(Jpeg2000T1Context *t1, int width, int height,
927                            int bpno, int bandno, int bpass_csty_symbol,
928                            int vert_causal_ctx_csty_symbol)
929 {
930     int mask = 3 << (bpno - 1), y0, x, y;
931
932     for (y0 = 0; y0 < height; y0 += 4)
933         for (x = 0; x < width; x++)
934             for (y = y0; y < height && y < y0 + 4; y++) {
935                 if ((t1->flags[y+1][x+1] & JPEG2000_T1_SIG_NB)
936                 && !(t1->flags[y+1][x+1] & (JPEG2000_T1_SIG | JPEG2000_T1_VIS))) {
937                     int flags_mask = -1;
938                     if (vert_causal_ctx_csty_symbol && y == y0 + 3)
939                         flags_mask &= ~(JPEG2000_T1_SIG_S | JPEG2000_T1_SIG_SW | JPEG2000_T1_SIG_SE);
940                     if (ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ff_jpeg2000_getsigctxno(t1->flags[y+1][x+1] & flags_mask, bandno))) {
941                         int xorbit, ctxno = ff_jpeg2000_getsgnctxno(t1->flags[y+1][x+1], &xorbit);
942                         if (bpass_csty_symbol)
943                              t1->data[y][x] = ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ctxno) ? -mask : mask;
944                         else
945                              t1->data[y][x] = (ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ctxno) ^ xorbit) ?
946                                                -mask : mask;
947
948                         ff_jpeg2000_set_significance(t1, x, y,
949                                                      t1->data[y][x] < 0);
950                     }
951                     t1->flags[y + 1][x + 1] |= JPEG2000_T1_VIS;
952                 }
953             }
954 }
955
956 static void decode_refpass(Jpeg2000T1Context *t1, int width, int height,
957                            int bpno)
958 {
959     int phalf, nhalf;
960     int y0, x, y;
961
962     phalf = 1 << (bpno - 1);
963     nhalf = -phalf;
964
965     for (y0 = 0; y0 < height; y0 += 4)
966         for (x = 0; x < width; x++)
967             for (y = y0; y < height && y < y0 + 4; y++)
968                 if ((t1->flags[y + 1][x + 1] & (JPEG2000_T1_SIG | JPEG2000_T1_VIS)) == JPEG2000_T1_SIG) {
969                     int ctxno = ff_jpeg2000_getrefctxno(t1->flags[y + 1][x + 1]);
970                     int r     = ff_mqc_decode(&t1->mqc,
971                                               t1->mqc.cx_states + ctxno)
972                                 ? phalf : nhalf;
973                     t1->data[y][x]          += t1->data[y][x] < 0 ? -r : r;
974                     t1->flags[y + 1][x + 1] |= JPEG2000_T1_REF;
975                 }
976 }
977
978 static void decode_clnpass(Jpeg2000DecoderContext *s, Jpeg2000T1Context *t1,
979                            int width, int height, int bpno, int bandno,
980                            int seg_symbols, int vert_causal_ctx_csty_symbol)
981 {
982     int mask = 3 << (bpno - 1), y0, x, y, runlen, dec;
983
984     for (y0 = 0; y0 < height; y0 += 4) {
985         for (x = 0; x < width; x++) {
986             if (y0 + 3 < height &&
987                 !((t1->flags[y0 + 1][x + 1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG)) ||
988                   (t1->flags[y0 + 2][x + 1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG)) ||
989                   (t1->flags[y0 + 3][x + 1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG)) ||
990                   (t1->flags[y0 + 4][x + 1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG)))) {
991                 if (!ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_RL))
992                     continue;
993                 runlen = ff_mqc_decode(&t1->mqc,
994                                        t1->mqc.cx_states + MQC_CX_UNI);
995                 runlen = (runlen << 1) | ff_mqc_decode(&t1->mqc,
996                                                        t1->mqc.cx_states +
997                                                        MQC_CX_UNI);
998                 dec = 1;
999             } else {
1000                 runlen = 0;
1001                 dec    = 0;
1002             }
1003
1004             for (y = y0 + runlen; y < y0 + 4 && y < height; y++) {
1005                 if (!dec) {
1006                     if (!(t1->flags[y+1][x+1] & (JPEG2000_T1_SIG | JPEG2000_T1_VIS))) {
1007                         int flags_mask = -1;
1008                         if (vert_causal_ctx_csty_symbol && y == y0 + 3)
1009                             flags_mask &= ~(JPEG2000_T1_SIG_S | JPEG2000_T1_SIG_SW | JPEG2000_T1_SIG_SE);
1010                         dec = ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ff_jpeg2000_getsigctxno(t1->flags[y+1][x+1] & flags_mask,
1011                                                                                              bandno));
1012                     }
1013                 }
1014                 if (dec) {
1015                     int xorbit;
1016                     int ctxno = ff_jpeg2000_getsgnctxno(t1->flags[y + 1][x + 1],
1017                                                         &xorbit);
1018                     t1->data[y][x] = (ff_mqc_decode(&t1->mqc,
1019                                                     t1->mqc.cx_states + ctxno) ^
1020                                       xorbit)
1021                                      ? -mask : mask;
1022                     ff_jpeg2000_set_significance(t1, x, y, t1->data[y][x] < 0);
1023                 }
1024                 dec = 0;
1025                 t1->flags[y + 1][x + 1] &= ~JPEG2000_T1_VIS;
1026             }
1027         }
1028     }
1029     if (seg_symbols) {
1030         int val;
1031         val = ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_UNI);
1032         val = (val << 1) + ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_UNI);
1033         val = (val << 1) + ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_UNI);
1034         val = (val << 1) + ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_UNI);
1035         if (val != 0xa)
1036             av_log(s->avctx, AV_LOG_ERROR,
1037                    "Segmentation symbol value incorrect\n");
1038     }
1039 }
1040
1041 static int decode_cblk(Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *codsty,
1042                        Jpeg2000T1Context *t1, Jpeg2000Cblk *cblk,
1043                        int width, int height, int bandpos)
1044 {
1045     int passno = cblk->npasses, pass_t = 2, bpno = cblk->nonzerobits - 1, y;
1046     int clnpass_cnt = 0;
1047     int bpass_csty_symbol           = codsty->cblk_style & JPEG2000_CBLK_BYPASS;
1048     int vert_causal_ctx_csty_symbol = codsty->cblk_style & JPEG2000_CBLK_VSC;
1049
1050     av_assert0(width  <= JPEG2000_MAX_CBLKW);
1051     av_assert0(height <= JPEG2000_MAX_CBLKH);
1052
1053     for (y = 0; y < height; y++)
1054         memset(t1->data[y], 0, width * sizeof(**t1->data));
1055
1056     /* If code-block contains no compressed data: nothing to do. */
1057     if (!cblk->length)
1058         return 0;
1059
1060     for (y = 0; y < height + 2; y++)
1061         memset(t1->flags[y], 0, (width + 2) * sizeof(**t1->flags));
1062
1063     cblk->data[cblk->length] = 0xff;
1064     cblk->data[cblk->length+1] = 0xff;
1065     ff_mqc_initdec(&t1->mqc, cblk->data);
1066
1067     while (passno--) {
1068         switch(pass_t) {
1069         case 0:
1070             decode_sigpass(t1, width, height, bpno + 1, bandpos,
1071                            bpass_csty_symbol && (clnpass_cnt >= 4),
1072                            vert_causal_ctx_csty_symbol);
1073             break;
1074         case 1:
1075             decode_refpass(t1, width, height, bpno + 1);
1076             if (bpass_csty_symbol && clnpass_cnt >= 4)
1077                 ff_mqc_initdec(&t1->mqc, cblk->data);
1078             break;
1079         case 2:
1080             decode_clnpass(s, t1, width, height, bpno + 1, bandpos,
1081                            codsty->cblk_style & JPEG2000_CBLK_SEGSYM,
1082                            vert_causal_ctx_csty_symbol);
1083             clnpass_cnt = clnpass_cnt + 1;
1084             if (bpass_csty_symbol && clnpass_cnt >= 4)
1085                 ff_mqc_initdec(&t1->mqc, cblk->data);
1086             break;
1087         }
1088
1089         pass_t++;
1090         if (pass_t == 3) {
1091             bpno--;
1092             pass_t = 0;
1093         }
1094     }
1095     return 0;
1096 }
1097
1098 /* TODO: Verify dequantization for lossless case
1099  * comp->data can be float or int
1100  * band->stepsize can be float or int
1101  * depending on the type of DWT transformation.
1102  * see ISO/IEC 15444-1:2002 A.6.1 */
1103
1104 /* Float dequantization of a codeblock.*/
1105 static void dequantization_float(int x, int y, Jpeg2000Cblk *cblk,
1106                                  Jpeg2000Component *comp,
1107                                  Jpeg2000T1Context *t1, Jpeg2000Band *band)
1108 {
1109     int i, j;
1110     int w = cblk->coord[0][1] - cblk->coord[0][0];
1111     for (j = 0; j < (cblk->coord[1][1] - cblk->coord[1][0]); ++j) {
1112         float *datap = &comp->f_data[(comp->coord[0][1] - comp->coord[0][0]) * (y + j) + x];
1113         int *src = t1->data[j];
1114         for (i = 0; i < w; ++i)
1115             datap[i] = src[i] * band->f_stepsize;
1116     }
1117 }
1118
1119 /* Integer dequantization of a codeblock.*/
1120 static void dequantization_int(int x, int y, Jpeg2000Cblk *cblk,
1121                                Jpeg2000Component *comp,
1122                                Jpeg2000T1Context *t1, Jpeg2000Band *band)
1123 {
1124     int i, j;
1125     int w = cblk->coord[0][1] - cblk->coord[0][0];
1126     for (j = 0; j < (cblk->coord[1][1] - cblk->coord[1][0]); ++j) {
1127         int32_t *datap = &comp->i_data[(comp->coord[0][1] - comp->coord[0][0]) * (y + j) + x];
1128         int *src = t1->data[j];
1129         for (i = 0; i < w; ++i)
1130             datap[i] = (src[i] * band->i_stepsize + (1 << 14)) >> 15;
1131     }
1132 }
1133
1134 /* Inverse ICT parameters in float and integer.
1135  * int value = (float value) * (1<<16) */
1136 static const float f_ict_params[4] = {
1137     1.402f,
1138     0.34413f,
1139     0.71414f,
1140     1.772f
1141 };
1142 static const int   i_ict_params[4] = {
1143      91881,
1144      22553,
1145      46802,
1146     116130
1147 };
1148
1149 static void mct_decode(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile)
1150 {
1151     int i, csize = 1;
1152     int32_t *src[3],  i0,  i1,  i2;
1153     float   *srcf[3], i0f, i1f, i2f;
1154
1155     for (i = 1; i < 3; i++)
1156         if (tile->codsty[0].transform != tile->codsty[i].transform) {
1157             av_log(s->avctx, AV_LOG_ERROR, "Transforms mismatch, MCT not supported\n");
1158             return;
1159         }
1160
1161     for (i = 0; i < 3; i++)
1162         if (tile->codsty[0].transform == FF_DWT97)
1163             srcf[i] = tile->comp[i].f_data;
1164         else
1165             src [i] = tile->comp[i].i_data;
1166
1167     for (i = 0; i < 2; i++)
1168         csize *= tile->comp[0].coord[i][1] - tile->comp[0].coord[i][0];
1169
1170     switch (tile->codsty[0].transform) {
1171     case FF_DWT97:
1172         for (i = 0; i < csize; i++) {
1173             i0f = *srcf[0] + (f_ict_params[0] * *srcf[2]);
1174             i1f = *srcf[0] - (f_ict_params[1] * *srcf[1])
1175                            - (f_ict_params[2] * *srcf[2]);
1176             i2f = *srcf[0] + (f_ict_params[3] * *srcf[1]);
1177             *srcf[0]++ = i0f;
1178             *srcf[1]++ = i1f;
1179             *srcf[2]++ = i2f;
1180         }
1181         break;
1182     case FF_DWT97_INT:
1183         for (i = 0; i < csize; i++) {
1184             i0 = *src[0] + (((i_ict_params[0] * *src[2]) + (1 << 15)) >> 16);
1185             i1 = *src[0] - (((i_ict_params[1] * *src[1]) + (1 << 15)) >> 16)
1186                          - (((i_ict_params[2] * *src[2]) + (1 << 15)) >> 16);
1187             i2 = *src[0] + (((i_ict_params[3] * *src[1]) + (1 << 15)) >> 16);
1188             *src[0]++ = i0;
1189             *src[1]++ = i1;
1190             *src[2]++ = i2;
1191         }
1192         break;
1193     case FF_DWT53:
1194         for (i = 0; i < csize; i++) {
1195             i1 = *src[0] - (*src[2] + *src[1] >> 2);
1196             i0 = i1 + *src[2];
1197             i2 = i1 + *src[1];
1198             *src[0]++ = i0;
1199             *src[1]++ = i1;
1200             *src[2]++ = i2;
1201         }
1202         break;
1203     }
1204 }
1205
1206 static int jpeg2000_decode_tile(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile,
1207                                 AVFrame *picture)
1208 {
1209     int compno, reslevelno, bandno;
1210     int x, y;
1211
1212     uint8_t *line;
1213     Jpeg2000T1Context t1;
1214
1215     /* Loop on tile components */
1216     for (compno = 0; compno < s->ncomponents; compno++) {
1217         Jpeg2000Component *comp     = tile->comp + compno;
1218         Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1219
1220         /* Loop on resolution levels */
1221         for (reslevelno = 0; reslevelno < codsty->nreslevels2decode; reslevelno++) {
1222             Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
1223             /* Loop on bands */
1224             for (bandno = 0; bandno < rlevel->nbands; bandno++) {
1225                 int nb_precincts, precno;
1226                 Jpeg2000Band *band = rlevel->band + bandno;
1227                 int cblkno = 0, bandpos;
1228
1229                 bandpos = bandno + (reslevelno > 0);
1230
1231                 if (band->coord[0][0] == band->coord[0][1] ||
1232                     band->coord[1][0] == band->coord[1][1])
1233                     continue;
1234
1235                 nb_precincts = rlevel->num_precincts_x * rlevel->num_precincts_y;
1236                 /* Loop on precincts */
1237                 for (precno = 0; precno < nb_precincts; precno++) {
1238                     Jpeg2000Prec *prec = band->prec + precno;
1239
1240                     /* Loop on codeblocks */
1241                     for (cblkno = 0; cblkno < prec->nb_codeblocks_width * prec->nb_codeblocks_height; cblkno++) {
1242                         int x, y;
1243                         Jpeg2000Cblk *cblk = prec->cblk + cblkno;
1244                         decode_cblk(s, codsty, &t1, cblk,
1245                                     cblk->coord[0][1] - cblk->coord[0][0],
1246                                     cblk->coord[1][1] - cblk->coord[1][0],
1247                                     bandpos);
1248
1249                         x = cblk->coord[0][0];
1250                         y = cblk->coord[1][0];
1251
1252                         if (codsty->transform == FF_DWT97)
1253                             dequantization_float(x, y, cblk, comp, &t1, band);
1254                         else
1255                             dequantization_int(x, y, cblk, comp, &t1, band);
1256                    } /* end cblk */
1257                 } /*end prec */
1258             } /* end band */
1259         } /* end reslevel */
1260
1261         /* inverse DWT */
1262         ff_dwt_decode(&comp->dwt, codsty->transform == FF_DWT97 ? (void*)comp->f_data : (void*)comp->i_data);
1263     } /*end comp */
1264
1265     /* inverse MCT transformation */
1266     if (tile->codsty[0].mct)
1267         mct_decode(s, tile);
1268
1269     if (s->cdef[0] < 0) {
1270         for (x = 0; x < s->ncomponents; x++)
1271             s->cdef[x] = x + 1;
1272         if ((s->ncomponents & 1) == 0)
1273             s->cdef[s->ncomponents-1] = 0;
1274     }
1275
1276     if (s->precision <= 8) {
1277         for (compno = 0; compno < s->ncomponents; compno++) {
1278             Jpeg2000Component *comp = tile->comp + compno;
1279             Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1280             float *datap = comp->f_data;
1281             int32_t *i_datap = comp->i_data;
1282             int cbps = s->cbps[compno];
1283             int w = tile->comp[compno].coord[0][1] - s->image_offset_x;
1284             int planar = !!picture->data[2];
1285             int pixelsize = planar ? 1 : s->ncomponents;
1286             int plane = 0;
1287
1288             if (planar)
1289                 plane = s->cdef[compno] ? s->cdef[compno]-1 : (s->ncomponents-1);
1290
1291
1292             y    = tile->comp[compno].coord[1][0] - s->image_offset_y;
1293             line = picture->data[plane] + y / s->cdy[compno] * picture->linesize[plane];
1294             for (; y < tile->comp[compno].coord[1][1] - s->image_offset_y; y += s->cdy[compno]) {
1295                 uint8_t *dst;
1296
1297                 x   = tile->comp[compno].coord[0][0] - s->image_offset_x;
1298                 dst = line + x / s->cdx[compno] * pixelsize + compno*!planar;
1299
1300                 if (codsty->transform == FF_DWT97) {
1301                     for (; x < w; x += s->cdx[compno]) {
1302                         int val = lrintf(*datap) + (1 << (cbps - 1));
1303                         /* DC level shift and clip see ISO 15444-1:2002 G.1.2 */
1304                         val = av_clip(val, 0, (1 << cbps) - 1);
1305                         *dst = val << (8 - cbps);
1306                         datap++;
1307                         dst += pixelsize;
1308                     }
1309                 } else {
1310                     for (; x < w; x += s->cdx[compno]) {
1311                         int val = *i_datap + (1 << (cbps - 1));
1312                         /* DC level shift and clip see ISO 15444-1:2002 G.1.2 */
1313                         val = av_clip(val, 0, (1 << cbps) - 1);
1314                         *dst = val << (8 - cbps);
1315                         i_datap++;
1316                         dst += pixelsize;
1317                     }
1318                 }
1319                 line += picture->linesize[plane];
1320             }
1321         }
1322     } else {
1323         for (compno = 0; compno < s->ncomponents; compno++) {
1324             Jpeg2000Component *comp = tile->comp + compno;
1325             Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1326             float *datap = comp->f_data;
1327             int32_t *i_datap = comp->i_data;
1328             uint16_t *linel;
1329             int cbps = s->cbps[compno];
1330             int w = tile->comp[compno].coord[0][1] - s->image_offset_x;
1331             int planar = !!picture->data[2];
1332             int pixelsize = planar ? 1 : s->ncomponents;
1333             int plane = 0;
1334
1335             if (planar)
1336                 plane = s->cdef[compno] ? s->cdef[compno]-1 : (s->ncomponents-1);
1337
1338             y     = tile->comp[compno].coord[1][0] - s->image_offset_y;
1339             linel = (uint16_t *)picture->data[plane] + y / s->cdy[compno] * (picture->linesize[plane] >> 1);
1340             for (; y < tile->comp[compno].coord[1][1] - s->image_offset_y; y += s->cdy[compno]) {
1341                 uint16_t *dst;
1342
1343                 x   = tile->comp[compno].coord[0][0] - s->image_offset_x;
1344                 dst = linel + (x / s->cdx[compno] * pixelsize + compno*!planar);
1345                 if (codsty->transform == FF_DWT97) {
1346                     for (; x < w; x += s-> cdx[compno]) {
1347                         int  val = lrintf(*datap) + (1 << (cbps - 1));
1348                         /* DC level shift and clip see ISO 15444-1:2002 G.1.2 */
1349                         val = av_clip(val, 0, (1 << cbps) - 1);
1350                         /* align 12 bit values in little-endian mode */
1351                         *dst = val << (16 - cbps);
1352                         datap++;
1353                         dst += pixelsize;
1354                     }
1355                 } else {
1356                     for (; x < w; x += s-> cdx[compno]) {
1357                         int val = *i_datap + (1 << (cbps - 1));
1358                         /* DC level shift and clip see ISO 15444-1:2002 G.1.2 */
1359                         val = av_clip(val, 0, (1 << cbps) - 1);
1360                         /* align 12 bit values in little-endian mode */
1361                         *dst = val << (16 - cbps);
1362                         i_datap++;
1363                         dst += pixelsize;
1364                     }
1365                 }
1366                 linel += picture->linesize[plane] >> 1;
1367             }
1368         }
1369     }
1370
1371     return 0;
1372 }
1373
1374 static void jpeg2000_dec_cleanup(Jpeg2000DecoderContext *s)
1375 {
1376     int tileno, compno;
1377     for (tileno = 0; tileno < s->numXtiles * s->numYtiles; tileno++) {
1378         if (s->tile[tileno].comp) {
1379             for (compno = 0; compno < s->ncomponents; compno++) {
1380                 Jpeg2000Component *comp     = s->tile[tileno].comp   + compno;
1381                 Jpeg2000CodingStyle *codsty = s->tile[tileno].codsty + compno;
1382
1383                 ff_jpeg2000_cleanup(comp, codsty);
1384             }
1385             av_freep(&s->tile[tileno].comp);
1386         }
1387     }
1388     av_freep(&s->tile);
1389     memset(s->codsty, 0, sizeof(s->codsty));
1390     memset(s->qntsty, 0, sizeof(s->qntsty));
1391     s->numXtiles = s->numYtiles = 0;
1392 }
1393
1394 static int jpeg2000_read_main_headers(Jpeg2000DecoderContext *s)
1395 {
1396     Jpeg2000CodingStyle *codsty = s->codsty;
1397     Jpeg2000QuantStyle *qntsty  = s->qntsty;
1398     uint8_t *properties         = s->properties;
1399
1400     for (;;) {
1401         int len, ret = 0;
1402         uint16_t marker;
1403         int oldpos;
1404
1405         if (bytestream2_get_bytes_left(&s->g) < 2) {
1406             av_log(s->avctx, AV_LOG_ERROR, "Missing EOC\n");
1407             break;
1408         }
1409
1410         marker = bytestream2_get_be16u(&s->g);
1411         oldpos = bytestream2_tell(&s->g);
1412
1413         if (marker == JPEG2000_SOD) {
1414             Jpeg2000Tile *tile;
1415             Jpeg2000TilePart *tp;
1416
1417             if (!s->tile) {
1418                 av_log(s->avctx, AV_LOG_ERROR, "Missing SIZ\n");
1419                 return AVERROR_INVALIDDATA;
1420             }
1421             if (s->curtileno < 0) {
1422                 av_log(s->avctx, AV_LOG_ERROR, "Missing SOT\n");
1423                 return AVERROR_INVALIDDATA;
1424             }
1425
1426             tile = s->tile + s->curtileno;
1427             tp = tile->tile_part + tile->tp_idx;
1428             if (tp->tp_end < s->g.buffer) {
1429                 av_log(s->avctx, AV_LOG_ERROR, "Invalid tpend\n");
1430                 return AVERROR_INVALIDDATA;
1431             }
1432             bytestream2_init(&tp->tpg, s->g.buffer, tp->tp_end - s->g.buffer);
1433             bytestream2_skip(&s->g, tp->tp_end - s->g.buffer);
1434
1435             continue;
1436         }
1437         if (marker == JPEG2000_EOC)
1438             break;
1439
1440         len = bytestream2_get_be16(&s->g);
1441         if (len < 2 || bytestream2_get_bytes_left(&s->g) < len - 2)
1442             return AVERROR_INVALIDDATA;
1443
1444         switch (marker) {
1445         case JPEG2000_SIZ:
1446             ret = get_siz(s);
1447             if (!s->tile)
1448                 s->numXtiles = s->numYtiles = 0;
1449             break;
1450         case JPEG2000_COC:
1451             ret = get_coc(s, codsty, properties);
1452             break;
1453         case JPEG2000_COD:
1454             ret = get_cod(s, codsty, properties);
1455             break;
1456         case JPEG2000_QCC:
1457             ret = get_qcc(s, len, qntsty, properties);
1458             break;
1459         case JPEG2000_QCD:
1460             ret = get_qcd(s, len, qntsty, properties);
1461             break;
1462         case JPEG2000_SOT:
1463             if (!(ret = get_sot(s, len))) {
1464                 av_assert1(s->curtileno >= 0);
1465                 codsty = s->tile[s->curtileno].codsty;
1466                 qntsty = s->tile[s->curtileno].qntsty;
1467                 properties = s->tile[s->curtileno].properties;
1468             }
1469             break;
1470         case JPEG2000_COM:
1471             // the comment is ignored
1472             bytestream2_skip(&s->g, len - 2);
1473             break;
1474         case JPEG2000_TLM:
1475             // Tile-part lengths
1476             ret = get_tlm(s, len);
1477             break;
1478         default:
1479             av_log(s->avctx, AV_LOG_ERROR,
1480                    "unsupported marker 0x%.4X at pos 0x%X\n",
1481                    marker, bytestream2_tell(&s->g) - 4);
1482             bytestream2_skip(&s->g, len - 2);
1483             break;
1484         }
1485         if (bytestream2_tell(&s->g) - oldpos != len || ret) {
1486             av_log(s->avctx, AV_LOG_ERROR,
1487                    "error during processing marker segment %.4x\n", marker);
1488             return ret ? ret : -1;
1489         }
1490     }
1491     return 0;
1492 }
1493
1494 /* Read bit stream packets --> T2 operation. */
1495 static int jpeg2000_read_bitstream_packets(Jpeg2000DecoderContext *s)
1496 {
1497     int ret = 0;
1498     int tileno;
1499
1500     for (tileno = 0; tileno < s->numXtiles * s->numYtiles; tileno++) {
1501         Jpeg2000Tile *tile = s->tile + tileno;
1502
1503         if (ret = init_tile(s, tileno))
1504             return ret;
1505
1506         s->g = tile->tile_part[0].tpg;
1507         if (ret = jpeg2000_decode_packets(s, tile))
1508             return ret;
1509     }
1510
1511     return 0;
1512 }
1513
1514 static int jp2_find_codestream(Jpeg2000DecoderContext *s)
1515 {
1516     uint32_t atom_size, atom, atom_end;
1517     int search_range = 10;
1518
1519     while (search_range
1520            &&
1521            bytestream2_get_bytes_left(&s->g) >= 8) {
1522         atom_size = bytestream2_get_be32u(&s->g);
1523         atom      = bytestream2_get_be32u(&s->g);
1524         atom_end  = bytestream2_tell(&s->g) + atom_size - 8;
1525
1526         if (atom == JP2_CODESTREAM)
1527             return 1;
1528
1529         if (bytestream2_get_bytes_left(&s->g) < atom_size || atom_end < atom_size)
1530             return 0;
1531
1532         if (atom == JP2_HEADER &&
1533                    atom_size >= 16) {
1534             uint32_t atom2_size, atom2, atom2_end;
1535             do {
1536                 atom2_size = bytestream2_get_be32u(&s->g);
1537                 atom2      = bytestream2_get_be32u(&s->g);
1538                 atom2_end  = bytestream2_tell(&s->g) + atom2_size - 8;
1539                 if (atom2_size < 8 || atom2_end > atom_end || atom2_end < atom2_size)
1540                     break;
1541                 if (atom2 == JP2_CODESTREAM) {
1542                     return 1;
1543                 } else if (atom2 == MKBETAG('c','o','l','r') && atom2_size >= 7) {
1544                     int method = bytestream2_get_byteu(&s->g);
1545                     bytestream2_skipu(&s->g, 2);
1546                     if (method == 1) {
1547                         s->colour_space = bytestream2_get_be32u(&s->g);
1548                     }
1549                 } else if (atom2 == MKBETAG('p','c','l','r') && atom2_size >= 6) {
1550                     int i, size, colour_count, colour_channels, colour_depth[3];
1551                     uint32_t r, g, b;
1552                     colour_count = bytestream2_get_be16u(&s->g);
1553                     colour_channels = bytestream2_get_byteu(&s->g);
1554                     // FIXME: Do not ignore channel_sign
1555                     colour_depth[0] = (bytestream2_get_byteu(&s->g) & 0x7f) + 1;
1556                     colour_depth[1] = (bytestream2_get_byteu(&s->g) & 0x7f) + 1;
1557                     colour_depth[2] = (bytestream2_get_byteu(&s->g) & 0x7f) + 1;
1558                     size = (colour_depth[0] + 7 >> 3) * colour_count +
1559                            (colour_depth[1] + 7 >> 3) * colour_count +
1560                            (colour_depth[2] + 7 >> 3) * colour_count;
1561                     if (colour_count > 256   ||
1562                         colour_channels != 3 ||
1563                         colour_depth[0] > 16 ||
1564                         colour_depth[1] > 16 ||
1565                         colour_depth[2] > 16 ||
1566                         atom2_size < size) {
1567                         avpriv_request_sample(s->avctx, "Unknown palette");
1568                         bytestream2_seek(&s->g, atom2_end, SEEK_SET);
1569                         continue;
1570                     }
1571                     s->pal8 = 1;
1572                     for (i = 0; i < colour_count; i++) {
1573                         if (colour_depth[0] <= 8) {
1574                             r = bytestream2_get_byteu(&s->g) << 8 - colour_depth[0];
1575                             r |= r >> colour_depth[0];
1576                         } else {
1577                             r = bytestream2_get_be16u(&s->g) >> colour_depth[0] - 8;
1578                         }
1579                         if (colour_depth[1] <= 8) {
1580                             g = bytestream2_get_byteu(&s->g) << 8 - colour_depth[1];
1581                             r |= r >> colour_depth[1];
1582                         } else {
1583                             g = bytestream2_get_be16u(&s->g) >> colour_depth[1] - 8;
1584                         }
1585                         if (colour_depth[2] <= 8) {
1586                             b = bytestream2_get_byteu(&s->g) << 8 - colour_depth[2];
1587                             r |= r >> colour_depth[2];
1588                         } else {
1589                             b = bytestream2_get_be16u(&s->g) >> colour_depth[2] - 8;
1590                         }
1591                         s->palette[i] = 0xffu << 24 | r << 16 | g << 8 | b;
1592                     }
1593                 } else if (atom2 == MKBETAG('c','d','e','f') && atom2_size >= 2) {
1594                     int n = bytestream2_get_be16u(&s->g);
1595                     for (; n>0; n--) {
1596                         int cn   = bytestream2_get_be16(&s->g);
1597                         int av_unused typ  = bytestream2_get_be16(&s->g);
1598                         int asoc = bytestream2_get_be16(&s->g);
1599                         if (cn < 4 || asoc < 4)
1600                             s->cdef[cn] = asoc;
1601                     }
1602                 }
1603                 bytestream2_seek(&s->g, atom2_end, SEEK_SET);
1604             } while (atom_end - atom2_end >= 8);
1605         } else {
1606             search_range--;
1607         }
1608         bytestream2_seek(&s->g, atom_end, SEEK_SET);
1609     }
1610
1611     return 0;
1612 }
1613
1614 static int jpeg2000_decode_frame(AVCodecContext *avctx, void *data,
1615                                  int *got_frame, AVPacket *avpkt)
1616 {
1617     Jpeg2000DecoderContext *s = avctx->priv_data;
1618     ThreadFrame frame = { .f = data };
1619     AVFrame *picture = data;
1620     int tileno, ret;
1621
1622     s->avctx     = avctx;
1623     bytestream2_init(&s->g, avpkt->data, avpkt->size);
1624     s->curtileno = -1;
1625     memset(s->cdef, -1, sizeof(s->cdef));
1626
1627     if (bytestream2_get_bytes_left(&s->g) < 2) {
1628         ret = AVERROR_INVALIDDATA;
1629         goto end;
1630     }
1631
1632     // check if the image is in jp2 format
1633     if (bytestream2_get_bytes_left(&s->g) >= 12 &&
1634        (bytestream2_get_be32u(&s->g) == 12) &&
1635        (bytestream2_get_be32u(&s->g) == JP2_SIG_TYPE) &&
1636        (bytestream2_get_be32u(&s->g) == JP2_SIG_VALUE)) {
1637         if (!jp2_find_codestream(s)) {
1638             av_log(avctx, AV_LOG_ERROR,
1639                    "Could not find Jpeg2000 codestream atom.\n");
1640             ret = AVERROR_INVALIDDATA;
1641             goto end;
1642         }
1643     } else {
1644         bytestream2_seek(&s->g, 0, SEEK_SET);
1645     }
1646
1647     while (bytestream2_get_bytes_left(&s->g) >= 3 && bytestream2_peek_be16(&s->g) != JPEG2000_SOC)
1648         bytestream2_skip(&s->g, 1);
1649
1650     if (bytestream2_get_be16u(&s->g) != JPEG2000_SOC) {
1651         av_log(avctx, AV_LOG_ERROR, "SOC marker not present\n");
1652         ret = AVERROR_INVALIDDATA;
1653         goto end;
1654     }
1655     if (ret = jpeg2000_read_main_headers(s))
1656         goto end;
1657
1658     /* get picture buffer */
1659     if ((ret = ff_thread_get_buffer(avctx, &frame, 0)) < 0)
1660         goto end;
1661     picture->pict_type = AV_PICTURE_TYPE_I;
1662     picture->key_frame = 1;
1663
1664     if (ret = jpeg2000_read_bitstream_packets(s))
1665         goto end;
1666
1667     for (tileno = 0; tileno < s->numXtiles * s->numYtiles; tileno++)
1668         if (ret = jpeg2000_decode_tile(s, s->tile + tileno, picture))
1669             goto end;
1670
1671     jpeg2000_dec_cleanup(s);
1672
1673     *got_frame = 1;
1674
1675     if (s->avctx->pix_fmt == AV_PIX_FMT_PAL8)
1676         memcpy(picture->data[1], s->palette, 256 * sizeof(uint32_t));
1677
1678     return bytestream2_tell(&s->g);
1679
1680 end:
1681     jpeg2000_dec_cleanup(s);
1682     return ret;
1683 }
1684
1685 static void jpeg2000_init_static_data(AVCodec *codec)
1686 {
1687     ff_jpeg2000_init_tier1_luts();
1688     ff_mqc_init_context_tables();
1689 }
1690
1691 #define OFFSET(x) offsetof(Jpeg2000DecoderContext, x)
1692 #define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
1693
1694 static const AVOption options[] = {
1695     { "lowres",  "Lower the decoding resolution by a power of two",
1696         OFFSET(reduction_factor), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, JPEG2000_MAX_RESLEVELS - 1, VD },
1697     { NULL },
1698 };
1699
1700 static const AVProfile profiles[] = {
1701     { FF_PROFILE_JPEG2000_CSTREAM_RESTRICTION_0,  "JPEG 2000 codestream restriction 0"   },
1702     { FF_PROFILE_JPEG2000_CSTREAM_RESTRICTION_1,  "JPEG 2000 codestream restriction 1"   },
1703     { FF_PROFILE_JPEG2000_CSTREAM_NO_RESTRICTION, "JPEG 2000 no codestream restrictions" },
1704     { FF_PROFILE_JPEG2000_DCINEMA_2K,             "JPEG 2000 digital cinema 2K"          },
1705     { FF_PROFILE_JPEG2000_DCINEMA_4K,             "JPEG 2000 digital cinema 4K"          },
1706     { FF_PROFILE_UNKNOWN },
1707 };
1708
1709 static const AVClass jpeg2000_class = {
1710     .class_name = "jpeg2000",
1711     .item_name  = av_default_item_name,
1712     .option     = options,
1713     .version    = LIBAVUTIL_VERSION_INT,
1714 };
1715
1716 AVCodec ff_jpeg2000_decoder = {
1717     .name             = "jpeg2000",
1718     .long_name        = NULL_IF_CONFIG_SMALL("JPEG 2000"),
1719     .type             = AVMEDIA_TYPE_VIDEO,
1720     .id               = AV_CODEC_ID_JPEG2000,
1721     .capabilities     = CODEC_CAP_FRAME_THREADS,
1722     .priv_data_size   = sizeof(Jpeg2000DecoderContext),
1723     .init_static_data = jpeg2000_init_static_data,
1724     .decode           = jpeg2000_decode_frame,
1725     .priv_class       = &jpeg2000_class,
1726     .max_lowres       = 5,
1727     .profiles         = NULL_IF_CONFIG_SMALL(profiles)
1728 };