FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/jpeg2000dec.c
Date: 2024-11-20 23:03:26
Exec Total Coverage
Lines: 1170 1750 66.9%
Functions: 43 47 91.5%
Branches: 773 1330 58.1%

Line Branch Exec Source
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 <inttypes.h>
29 #include <math.h>
30
31 #include "libavutil/attributes.h"
32 #include "libavutil/avassert.h"
33 #include "libavutil/common.h"
34 #include "libavutil/imgutils.h"
35 #include "libavutil/mem.h"
36 #include "libavutil/opt.h"
37 #include "libavutil/pixdesc.h"
38 #include "avcodec.h"
39 #include "bytestream.h"
40 #include "codec_internal.h"
41 #include "decode.h"
42 #include "thread.h"
43 #include "jpeg2000.h"
44 #include "jpeg2000dsp.h"
45 #include "profiles.h"
46 #include "jpeg2000dec.h"
47 #include "jpeg2000htdec.h"
48
49 #define JP2_SIG_TYPE 0x6A502020
50 #define JP2_SIG_VALUE 0x0D0A870A
51 #define JP2_CODESTREAM 0x6A703263
52 #define JP2_HEADER 0x6A703268
53
54 #define HAD_COC 0x01
55 #define HAD_QCC 0x02
56
57 // Values of flag for placeholder passes
58 enum HT_PLHD_STATUS {
59 HT_PLHD_OFF,
60 HT_PLHD_ON
61 };
62
63 #define HT_MIXED 0x80 // bit 7 of SPcod/SPcoc
64
65
66 /* get_bits functions for JPEG2000 packet bitstream
67 * It is a get_bit function with a bit-stuffing routine. If the value of the
68 * byte is 0xFF, the next byte includes an extra zero bit stuffed into the MSB.
69 * cf. ISO-15444-1:2002 / B.10.1 Bit-stuffing routine */
70 8840179 static int get_bits(Jpeg2000DecoderContext *s, int n)
71 {
72 8840179 int res = 0;
73
74
2/2
✓ Branch 0 taken 17558593 times.
✓ Branch 1 taken 8840179 times.
26398772 while (--n >= 0) {
75 17558593 res <<= 1;
76
2/2
✓ Branch 0 taken 2154406 times.
✓ Branch 1 taken 15404187 times.
17558593 if (s->bit_index == 0) {
77
2/2
✓ Branch 1 taken 2093872 times.
✓ Branch 2 taken 60534 times.
2154406 s->bit_index = 7 + (bytestream2_get_byte(&s->g) != 0xFFu);
78 }
79 17558593 s->bit_index--;
80 17558593 res |= (bytestream2_peek_byte(&s->g) >> s->bit_index) & 1;
81 }
82 8840179 return res;
83 }
84
85 87192 static void jpeg2000_flush(Jpeg2000DecoderContext *s)
86 {
87
2/2
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 87190 times.
87192 if (bytestream2_get_byte(&s->g) == 0xff)
88 2 bytestream2_skip(&s->g, 1);
89 87192 s->bit_index = 8;
90 87192 }
91
92 /* decode the value stored in node */
93 1787992 static int tag_tree_decode(Jpeg2000DecoderContext *s, Jpeg2000TgtNode *node,
94 int threshold)
95 {
96 Jpeg2000TgtNode *stack[30];
97 1787992 int sp = -1, curval = 0;
98
99
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1787992 times.
1787992 if (!node) {
100 av_log(s->avctx, AV_LOG_ERROR, "missing node\n");
101 return AVERROR_INVALIDDATA;
102 }
103
104
4/4
✓ Branch 0 taken 4250491 times.
✓ Branch 1 taken 385413 times.
✓ Branch 2 taken 2847912 times.
✓ Branch 3 taken 1402579 times.
4635904 while (node && !node->vis) {
105 2847912 stack[++sp] = node;
106 2847912 node = node->parent;
107 }
108
109
2/2
✓ Branch 0 taken 1402579 times.
✓ Branch 1 taken 385413 times.
1787992 if (node)
110 1402579 curval = node->val;
111 else
112 385413 curval = stack[sp]->val;
113
114
4/4
✓ Branch 0 taken 3943501 times.
✓ Branch 1 taken 161076 times.
✓ Branch 2 taken 2316585 times.
✓ Branch 3 taken 1626916 times.
4104577 while (curval < threshold && sp >= 0) {
115
2/2
✓ Branch 0 taken 31252 times.
✓ Branch 1 taken 2285333 times.
2316585 if (curval < stack[sp]->val)
116 31252 curval = stack[sp]->val;
117
2/2
✓ Branch 0 taken 3146479 times.
✓ Branch 1 taken 66521 times.
3213000 while (curval < threshold) {
118 int ret;
119
2/2
✓ Branch 1 taken 2250064 times.
✓ Branch 2 taken 896415 times.
3146479 if ((ret = get_bits(s, 1)) > 0) {
120 2250064 stack[sp]->vis++;
121 2250064 break;
122
1/2
✓ Branch 0 taken 896415 times.
✗ Branch 1 not taken.
896415 } else if (!ret)
123 896415 curval++;
124 else
125 return ret;
126 }
127 2316585 stack[sp]->val = curval;
128 2316585 sp--;
129 }
130 1787992 return curval;
131 }
132
133 1309 static int pix_fmt_match(enum AVPixelFormat pix_fmt, int components,
134 int bpc, uint32_t log2_chroma_wh, int pal8)
135 {
136 1309 int match = 1;
137 1309 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
138
139 av_assert2(desc);
140
141
2/2
✓ Branch 0 taken 319 times.
✓ Branch 1 taken 990 times.
1309 if (desc->nb_components != components) {
142 319 return 0;
143 }
144
145
3/5
✓ Branch 0 taken 279 times.
✓ Branch 1 taken 680 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 31 times.
✗ Branch 4 not taken.
990 switch (components) {
146 279 case 4:
147
2/2
✓ Branch 0 taken 242 times.
✓ Branch 1 taken 37 times.
558 match = match && desc->comp[3].depth >= bpc &&
148
3/4
✓ Branch 0 taken 279 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 213 times.
✓ Branch 3 taken 29 times.
771 (log2_chroma_wh >> 14 & 3) == 0 &&
149
1/2
✓ Branch 0 taken 213 times.
✗ Branch 1 not taken.
213 (log2_chroma_wh >> 12 & 3) == 0;
150 959 case 3:
151
2/2
✓ Branch 0 taken 886 times.
✓ Branch 1 taken 7 times.
1852 match = match && desc->comp[2].depth >= bpc &&
152
4/4
✓ Branch 0 taken 893 times.
✓ Branch 1 taken 66 times.
✓ Branch 2 taken 833 times.
✓ Branch 3 taken 53 times.
2685 (log2_chroma_wh >> 10 & 3) == desc->log2_chroma_w &&
153
2/2
✓ Branch 0 taken 831 times.
✓ Branch 1 taken 2 times.
833 (log2_chroma_wh >> 8 & 3) == desc->log2_chroma_h;
154 959 case 2:
155
1/2
✓ Branch 0 taken 831 times.
✗ Branch 1 not taken.
1790 match = match && desc->comp[1].depth >= bpc &&
156
3/4
✓ Branch 0 taken 831 times.
✓ Branch 1 taken 128 times.
✓ Branch 2 taken 831 times.
✗ Branch 3 not taken.
2621 (log2_chroma_wh >> 6 & 3) == desc->log2_chroma_w &&
157
1/2
✓ Branch 0 taken 831 times.
✗ Branch 1 not taken.
831 (log2_chroma_wh >> 4 & 3) == desc->log2_chroma_h;
158
159 990 case 1:
160
1/2
✓ Branch 0 taken 862 times.
✗ Branch 1 not taken.
1852 match = match && desc->comp[0].depth >= bpc &&
161
2/2
✓ Branch 0 taken 853 times.
✓ Branch 1 taken 9 times.
862 (log2_chroma_wh >> 2 & 3) == 0 &&
162
3/4
✓ Branch 0 taken 862 times.
✓ Branch 1 taken 128 times.
✓ Branch 2 taken 853 times.
✗ Branch 3 not taken.
2705 (log2_chroma_wh & 3) == 0 &&
163
2/2
✓ Branch 0 taken 845 times.
✓ Branch 1 taken 8 times.
853 (desc->flags & AV_PIX_FMT_FLAG_PAL) == pal8 * AV_PIX_FMT_FLAG_PAL;
164 }
165 990 return match;
166 }
167
168 // pix_fmts with lower bpp have to be listed before
169 // similar pix_fmts with higher bpp.
170 #define RGB_PIXEL_FORMATS AV_PIX_FMT_PAL8,AV_PIX_FMT_RGB24,AV_PIX_FMT_RGBA,AV_PIX_FMT_RGB48,AV_PIX_FMT_RGBA64
171 #define GRAY_PIXEL_FORMATS AV_PIX_FMT_GRAY8,AV_PIX_FMT_GRAY8A,AV_PIX_FMT_GRAY16,AV_PIX_FMT_YA16
172 #define YUV_PIXEL_FORMATS AV_PIX_FMT_YUV410P,AV_PIX_FMT_YUV411P,AV_PIX_FMT_YUVA420P, \
173 AV_PIX_FMT_YUV420P,AV_PIX_FMT_YUV422P,AV_PIX_FMT_YUVA422P, \
174 AV_PIX_FMT_YUV440P,AV_PIX_FMT_YUV444P,AV_PIX_FMT_YUVA444P, \
175 AV_PIX_FMT_YUV420P9,AV_PIX_FMT_YUV422P9,AV_PIX_FMT_YUV444P9, \
176 AV_PIX_FMT_YUVA420P9,AV_PIX_FMT_YUVA422P9,AV_PIX_FMT_YUVA444P9, \
177 AV_PIX_FMT_YUV420P10,AV_PIX_FMT_YUV422P10,AV_PIX_FMT_YUV444P10, \
178 AV_PIX_FMT_YUVA420P10,AV_PIX_FMT_YUVA422P10,AV_PIX_FMT_YUVA444P10, \
179 AV_PIX_FMT_YUV420P12,AV_PIX_FMT_YUV422P12,AV_PIX_FMT_YUV444P12, \
180 AV_PIX_FMT_YUV420P14,AV_PIX_FMT_YUV422P14,AV_PIX_FMT_YUV444P14, \
181 AV_PIX_FMT_YUV420P16,AV_PIX_FMT_YUV422P16,AV_PIX_FMT_YUV444P16, \
182 AV_PIX_FMT_YUVA420P16,AV_PIX_FMT_YUVA422P16,AV_PIX_FMT_YUVA444P16
183 #define XYZ_PIXEL_FORMATS AV_PIX_FMT_XYZ12
184
185 static const enum AVPixelFormat rgb_pix_fmts[] = {RGB_PIXEL_FORMATS};
186 static const enum AVPixelFormat gray_pix_fmts[] = {GRAY_PIXEL_FORMATS};
187 static const enum AVPixelFormat yuv_pix_fmts[] = {YUV_PIXEL_FORMATS};
188 static const enum AVPixelFormat xyz_pix_fmts[] = {XYZ_PIXEL_FORMATS,
189 YUV_PIXEL_FORMATS};
190 static const enum AVPixelFormat all_pix_fmts[] = {RGB_PIXEL_FORMATS,
191 GRAY_PIXEL_FORMATS,
192 YUV_PIXEL_FORMATS,
193 XYZ_PIXEL_FORMATS};
194
195 /* marker segments */
196 /* get sizes and offsets of image, tiles; number of components */
197 851 static int get_siz(Jpeg2000DecoderContext *s)
198 {
199 int i;
200 int ncomponents;
201 851 uint32_t log2_chroma_wh = 0;
202 851 const enum AVPixelFormat *possible_fmts = NULL;
203 851 int possible_fmts_nb = 0;
204 int ret;
205 int o_dimx, o_dimy; //original image dimensions.
206 int dimx, dimy;
207
208
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 851 times.
851 if (bytestream2_get_bytes_left(&s->g) < 36) {
209 av_log(s->avctx, AV_LOG_ERROR, "Insufficient space for SIZ\n");
210 return AVERROR_INVALIDDATA;
211 }
212
213 851 s->avctx->profile = bytestream2_get_be16u(&s->g); // Rsiz
214 851 s->width = bytestream2_get_be32u(&s->g); // Width
215 851 s->height = bytestream2_get_be32u(&s->g); // Height
216 851 s->image_offset_x = bytestream2_get_be32u(&s->g); // X0Siz
217 851 s->image_offset_y = bytestream2_get_be32u(&s->g); // Y0Siz
218 851 s->tile_width = bytestream2_get_be32u(&s->g); // XTSiz
219 851 s->tile_height = bytestream2_get_be32u(&s->g); // YTSiz
220 851 s->tile_offset_x = bytestream2_get_be32u(&s->g); // XT0Siz
221 851 s->tile_offset_y = bytestream2_get_be32u(&s->g); // YT0Siz
222 851 ncomponents = bytestream2_get_be16u(&s->g); // CSiz
223
224
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 851 times.
851 if (av_image_check_size2(s->width, s->height, s->avctx->max_pixels, AV_PIX_FMT_NONE, 0, s->avctx)) {
225 avpriv_request_sample(s->avctx, "Large Dimensions");
226 return AVERROR_PATCHWELCOME;
227 }
228
229
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 851 times.
851 if (ncomponents <= 0) {
230 av_log(s->avctx, AV_LOG_ERROR, "Invalid number of components: %d\n",
231 s->ncomponents);
232 return AVERROR_INVALIDDATA;
233 }
234
235
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 851 times.
851 if (ncomponents > 4) {
236 avpriv_request_sample(s->avctx, "Support for %d components",
237 ncomponents);
238 return AVERROR_PATCHWELCOME;
239 }
240
241
2/4
✓ Branch 0 taken 851 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 851 times.
✗ Branch 3 not taken.
851 if (s->tile_offset_x < 0 || s->tile_offset_y < 0 ||
242
1/2
✓ Branch 0 taken 851 times.
✗ Branch 1 not taken.
851 s->image_offset_x < s->tile_offset_x ||
243
1/2
✓ Branch 0 taken 851 times.
✗ Branch 1 not taken.
851 s->image_offset_y < s->tile_offset_y ||
244
1/2
✓ Branch 0 taken 851 times.
✗ Branch 1 not taken.
851 s->tile_width + (int64_t)s->tile_offset_x <= s->image_offset_x ||
245
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 851 times.
851 s->tile_height + (int64_t)s->tile_offset_y <= s->image_offset_y
246 ) {
247 av_log(s->avctx, AV_LOG_ERROR, "Tile offsets are invalid\n");
248 return AVERROR_INVALIDDATA;
249 }
250
251
2/4
✓ Branch 0 taken 851 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 851 times.
851 if (s->image_offset_x >= s->width || s->image_offset_y >= s->height) {
252 av_log(s->avctx, AV_LOG_ERROR, "image offsets outside image");
253 return AVERROR_INVALIDDATA;
254 }
255
256
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 850 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
851 if (s->reduction_factor && (s->image_offset_x || s->image_offset_y) ){
257 av_log(s->avctx, AV_LOG_ERROR, "reduction factor with image offsets is not fully implemented");
258 return AVERROR_PATCHWELCOME;
259 }
260
261 851 s->ncomponents = ncomponents;
262
263
2/4
✓ Branch 0 taken 851 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 851 times.
851 if (s->tile_width <= 0 || s->tile_height <= 0) {
264 av_log(s->avctx, AV_LOG_ERROR, "Invalid tile dimension %dx%d.\n",
265 s->tile_width, s->tile_height);
266 return AVERROR_INVALIDDATA;
267 }
268
269
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 851 times.
851 if (bytestream2_get_bytes_left(&s->g) < 3 * s->ncomponents) {
270 av_log(s->avctx, AV_LOG_ERROR, "Insufficient space for %d components in SIZ\n", s->ncomponents);
271 return AVERROR_INVALIDDATA;
272 }
273
274
2/2
✓ Branch 0 taken 2724 times.
✓ Branch 1 taken 851 times.
3575 for (i = 0; i < s->ncomponents; i++) { // Ssiz_i XRsiz_i, YRsiz_i
275 2724 uint8_t x = bytestream2_get_byteu(&s->g);
276 2724 s->cbps[i] = (x & 0x7f) + 1;
277 2724 s->precision = FFMAX(s->cbps[i], s->precision);
278 2724 s->sgnd[i] = !!(x & 0x80);
279 2724 s->cdx[i] = bytestream2_get_byteu(&s->g);
280 2724 s->cdy[i] = bytestream2_get_byteu(&s->g);
281
3/6
✓ Branch 0 taken 2724 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2724 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2724 times.
✗ Branch 5 not taken.
2724 if ( !s->cdx[i] || s->cdx[i] == 3 || s->cdx[i] > 4
282
3/6
✓ Branch 0 taken 2724 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2724 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 2724 times.
2724 || !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 2724 log2_chroma_wh |= s->cdy[i] >> 1 << i * 4 | s->cdx[i] >> 1 << i * 4 + 2;
287 }
288
289 851 s->numXtiles = ff_jpeg2000_ceildiv(s->width - s->tile_offset_x, s->tile_width);
290 851 s->numYtiles = ff_jpeg2000_ceildiv(s->height - s->tile_offset_y, s->tile_height);
291
292 // There must be at least a SOT and SOD per tile, their minimum size is 14
293
1/2
✓ Branch 0 taken 851 times.
✗ Branch 1 not taken.
851 if (s->numXtiles * (uint64_t)s->numYtiles > INT_MAX/sizeof(*s->tile) ||
294
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 851 times.
851 s->numXtiles * s->numYtiles * 14LL > bytestream2_size(&s->g)
295 ) {
296 s->numXtiles = s->numYtiles = 0;
297 return AVERROR(EINVAL);
298 }
299
300 851 s->tile = av_calloc(s->numXtiles * s->numYtiles, sizeof(*s->tile));
301
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 851 times.
851 if (!s->tile) {
302 s->numXtiles = s->numYtiles = 0;
303 return AVERROR(ENOMEM);
304 }
305
306
2/2
✓ Branch 0 taken 3216 times.
✓ Branch 1 taken 851 times.
4067 for (i = 0; i < s->numXtiles * s->numYtiles; i++) {
307 3216 Jpeg2000Tile *tile = s->tile + i;
308
309 3216 tile->comp = av_mallocz(s->ncomponents * sizeof(*tile->comp));
310
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3216 times.
3216 if (!tile->comp)
311 return AVERROR(ENOMEM);
312 }
313
314 /* compute image size with reduction factor */
315 851 o_dimx = ff_jpeg2000_ceildivpow2(s->width - s->image_offset_x,
316 s->reduction_factor);
317 851 o_dimy = ff_jpeg2000_ceildivpow2(s->height - s->image_offset_y,
318 s->reduction_factor);
319 851 dimx = ff_jpeg2000_ceildiv(o_dimx, s->cdx[0]);
320 851 dimy = ff_jpeg2000_ceildiv(o_dimy, s->cdy[0]);
321
2/2
✓ Branch 0 taken 1873 times.
✓ Branch 1 taken 851 times.
2724 for (i = 1; i < s->ncomponents; i++) {
322
2/2
✓ Branch 1 taken 1869 times.
✓ Branch 2 taken 4 times.
1873 dimx = FFMAX(dimx, ff_jpeg2000_ceildiv(o_dimx, s->cdx[i]));
323
2/2
✓ Branch 1 taken 1869 times.
✓ Branch 2 taken 4 times.
1873 dimy = FFMAX(dimy, ff_jpeg2000_ceildiv(o_dimy, s->cdy[i]));
324 }
325
326 851 ret = ff_set_dimensions(s->avctx, dimx << s->avctx->lowres, dimy << s->avctx->lowres);
327
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 851 times.
851 if (ret < 0)
328 return ret;
329
330
2/2
✓ Branch 0 taken 848 times.
✓ Branch 1 taken 3 times.
851 if (s->avctx->profile == AV_PROFILE_JPEG2000_DCINEMA_2K ||
331
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 848 times.
848 s->avctx->profile == AV_PROFILE_JPEG2000_DCINEMA_4K) {
332 3 possible_fmts = xyz_pix_fmts;
333 3 possible_fmts_nb = FF_ARRAY_ELEMS(xyz_pix_fmts);
334 } else {
335
3/4
✓ Branch 0 taken 613 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 204 times.
✓ Branch 3 taken 31 times.
848 switch (s->colour_space) {
336 613 case 16:
337 613 possible_fmts = rgb_pix_fmts;
338 613 possible_fmts_nb = FF_ARRAY_ELEMS(rgb_pix_fmts);
339 613 break;
340 case 17:
341 possible_fmts = gray_pix_fmts;
342 possible_fmts_nb = FF_ARRAY_ELEMS(gray_pix_fmts);
343 break;
344 204 case 18:
345 204 possible_fmts = yuv_pix_fmts;
346 204 possible_fmts_nb = FF_ARRAY_ELEMS(yuv_pix_fmts);
347 204 break;
348 31 default:
349 31 possible_fmts = all_pix_fmts;
350 31 possible_fmts_nb = FF_ARRAY_ELEMS(all_pix_fmts);
351 31 break;
352 }
353 }
354
2/2
✓ Branch 0 taken 817 times.
✓ Branch 1 taken 34 times.
851 if ( s->avctx->pix_fmt != AV_PIX_FMT_NONE
355
2/2
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 814 times.
817 && !pix_fmt_match(s->avctx->pix_fmt, ncomponents, s->precision, log2_chroma_wh, s->pal8))
356 3 s->avctx->pix_fmt = AV_PIX_FMT_NONE;
357
2/2
✓ Branch 0 taken 37 times.
✓ Branch 1 taken 814 times.
851 if (s->avctx->pix_fmt == AV_PIX_FMT_NONE)
358
2/2
✓ Branch 0 taken 492 times.
✓ Branch 1 taken 6 times.
498 for (i = 0; i < possible_fmts_nb; ++i) {
359
2/2
✓ Branch 1 taken 31 times.
✓ Branch 2 taken 461 times.
492 if (pix_fmt_match(possible_fmts[i], ncomponents, s->precision, log2_chroma_wh, s->pal8)) {
360 31 s->avctx->pix_fmt = possible_fmts[i];
361 31 break;
362 }
363 }
364
365
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 845 times.
851 if (i == possible_fmts_nb) {
366
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
6 if (ncomponents == 4 &&
367
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2 s->cdy[0] == 1 && s->cdx[0] == 1 &&
368
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2 s->cdy[1] == 1 && s->cdx[1] == 1 &&
369
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2 s->cdy[2] == s->cdy[3] && s->cdx[2] == s->cdx[3]) {
370
4/8
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
2 if (s->precision == 8 && s->cdy[2] == 2 && s->cdx[2] == 2 && !s->pal8) {
371 2 s->avctx->pix_fmt = AV_PIX_FMT_YUVA420P;
372 2 s->cdef[0] = 0;
373 2 s->cdef[1] = 1;
374 2 s->cdef[2] = 2;
375 2 s->cdef[3] = 3;
376 2 i = 0;
377 }
378
3/4
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
4 } else if (ncomponents == 3 && s->precision == 8 &&
379
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2 s->cdx[0] == s->cdx[1] && s->cdx[0] == s->cdx[2] &&
380
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2 s->cdy[0] == s->cdy[1] && s->cdy[0] == s->cdy[2]) {
381 2 s->avctx->pix_fmt = AV_PIX_FMT_RGB24;
382 2 i = 0;
383
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2 } else if (ncomponents == 2 && s->precision == 8 &&
384 s->cdx[0] == s->cdx[1] && s->cdy[0] == s->cdy[1]) {
385 s->avctx->pix_fmt = AV_PIX_FMT_YA8;
386 i = 0;
387
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2 } else if (ncomponents == 2 && s->precision == 16 &&
388 s->cdx[0] == s->cdx[1] && s->cdy[0] == s->cdy[1]) {
389 s->avctx->pix_fmt = AV_PIX_FMT_YA16;
390 i = 0;
391
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2 } else if (ncomponents == 1 && s->precision == 8) {
392 2 s->avctx->pix_fmt = AV_PIX_FMT_GRAY8;
393 2 i = 0;
394 } else if (ncomponents == 1 && s->precision == 12) {
395 s->avctx->pix_fmt = AV_PIX_FMT_GRAY16LE;
396 i = 0;
397 }
398 }
399
400
401
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 851 times.
851 if (i == possible_fmts_nb) {
402 av_log(s->avctx, AV_LOG_ERROR,
403 "Unknown pix_fmt, profile: %d, colour_space: %d, "
404 "components: %d, precision: %d\n"
405 "cdx[0]: %d, cdy[0]: %d\n"
406 "cdx[1]: %d, cdy[1]: %d\n"
407 "cdx[2]: %d, cdy[2]: %d\n"
408 "cdx[3]: %d, cdy[3]: %d\n",
409 s->avctx->profile, s->colour_space, ncomponents, s->precision,
410 s->cdx[0],
411 s->cdy[0],
412 ncomponents > 1 ? s->cdx[1] : 0,
413 ncomponents > 1 ? s->cdy[1] : 0,
414 ncomponents > 2 ? s->cdx[2] : 0,
415 ncomponents > 2 ? s->cdy[2] : 0,
416 ncomponents > 3 ? s->cdx[3] : 0,
417 ncomponents > 3 ? s->cdy[3] : 0);
418 return AVERROR_PATCHWELCOME;
419 }
420 851 s->avctx->bits_per_raw_sample = s->precision;
421 851 return 0;
422 }
423 /* get extended capabilities (CAP) marker segment */
424 2 static int get_cap(Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *c)
425 {
426 uint32_t Pcap;
427 2 uint16_t Ccap_i[32] = { 0 };
428 uint16_t Ccap_15;
429 uint8_t P;
430
431
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
2 if (bytestream2_get_bytes_left(&s->g) < 6) {
432 av_log(s->avctx, AV_LOG_ERROR, "Underflow while parsing the CAP marker\n");
433 return AVERROR_INVALIDDATA;
434 }
435
436 2 Pcap = bytestream2_get_be32u(&s->g);
437 2 s->isHT = (Pcap >> (31 - (15 - 1))) & 1;
438
2/2
✓ Branch 0 taken 64 times.
✓ Branch 1 taken 2 times.
66 for (int i = 0; i < 32; i++) {
439
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 62 times.
64 if ((Pcap >> (31 - i)) & 1)
440 2 Ccap_i[i] = bytestream2_get_be16u(&s->g);
441 }
442 2 Ccap_15 = Ccap_i[14];
443
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 if (s->isHT == 1) {
444 2 av_log(s->avctx, AV_LOG_INFO, "This codestream uses the HT block coder.\n");
445 // Bits 14-15
446
1/4
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
2 switch ((Ccap_15 >> 14) & 0x3) {
447 case 0x3:
448 s->Ccap15_b14_15 = HTJ2K_MIXED;
449 break;
450 case 0x1:
451 s->Ccap15_b14_15 = HTJ2K_HTDECLARED;
452 break;
453 2 case 0x0:
454 2 s->Ccap15_b14_15 = HTJ2K_HTONLY;
455 2 break;
456 default:
457 av_log(s->avctx, AV_LOG_ERROR, "Unknown CCap value.\n");
458 return AVERROR(EINVAL);
459 break;
460 }
461 // Bit 13
462
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if ((Ccap_15 >> 13) & 1) {
463 av_log(s->avctx, AV_LOG_ERROR, "MULTIHT set is not supported.\n");
464 return AVERROR_PATCHWELCOME;
465 }
466 // Bit 12
467 2 s->Ccap15_b12 = (Ccap_15 >> 12) & 1;
468 // Bit 11
469 2 s->Ccap15_b11 = (Ccap_15 >> 11) & 1;
470 // Bit 5
471 2 s->Ccap15_b05 = (Ccap_15 >> 5) & 1;
472 // Bit 0-4
473 2 P = Ccap_15 & 0x1F;
474
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (!P)
475 s->HT_B = 8;
476
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 else if (P < 20)
477 2 s->HT_B = P + 8;
478 else if (P < 31)
479 s->HT_B = 4 * (P - 19) + 27;
480 else
481 s->HT_B = 74;
482
483
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (s->HT_B > 31) {
484 av_log(s->avctx, AV_LOG_ERROR, "Codestream exceeds available precision (B > 31).\n");
485 return AVERROR_PATCHWELCOME;
486 }
487 }
488 2 return 0;
489 }
490
491 /* get common part for COD and COC segments */
492 869 static int get_cox(Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *c)
493 {
494 uint8_t byte;
495
496
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 869 times.
869 if (bytestream2_get_bytes_left(&s->g) < 5) {
497 av_log(s->avctx, AV_LOG_ERROR, "Insufficient space for COX\n");
498 return AVERROR_INVALIDDATA;
499 }
500
501 /* nreslevels = number of resolution levels
502 = number of decomposition level +1 */
503 869 c->nreslevels = bytestream2_get_byteu(&s->g) + 1;
504
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 869 times.
869 if (c->nreslevels >= JPEG2000_MAX_RESLEVELS) {
505 av_log(s->avctx, AV_LOG_ERROR, "nreslevels %d is invalid\n", c->nreslevels);
506 return AVERROR_INVALIDDATA;
507 }
508
509
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 869 times.
869 if (c->nreslevels <= s->reduction_factor) {
510 /* we are forced to update reduction_factor as its requested value is
511 not compatible with this bitstream, and as we might have used it
512 already in setup earlier we have to fail this frame until
513 reinitialization is implemented */
514 av_log(s->avctx, AV_LOG_ERROR, "reduction_factor too large for this bitstream, max is %d\n", c->nreslevels - 1);
515 s->reduction_factor = c->nreslevels - 1;
516 return AVERROR(EINVAL);
517 }
518
519 /* compute number of resolution levels to decode */
520 869 c->nreslevels2decode = c->nreslevels - s->reduction_factor;
521
522 869 c->log2_cblk_width = (bytestream2_get_byteu(&s->g) & 15) + 2; // cblk width
523 869 c->log2_cblk_height = (bytestream2_get_byteu(&s->g) & 15) + 2; // cblk height
524
525
2/4
✓ Branch 0 taken 869 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 869 times.
✗ Branch 3 not taken.
869 if (c->log2_cblk_width > 10 || c->log2_cblk_height > 10 ||
526
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 869 times.
869 c->log2_cblk_width + c->log2_cblk_height > 12) {
527 av_log(s->avctx, AV_LOG_ERROR, "cblk size invalid\n");
528 return AVERROR_INVALIDDATA;
529 }
530
531 869 c->cblk_style = bytestream2_get_byteu(&s->g);
532
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 857 times.
869 if (c->cblk_style != 0) { // cblk style
533
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
12 if (c->cblk_style & JPEG2000_CTSY_HTJ2K_M || c->cblk_style & JPEG2000_CTSY_HTJ2K_F) {
534 2 av_log(s->avctx,AV_LOG_TRACE,"High Throughput jpeg 2000 codestream.\n");
535 } else {
536 10 av_log(s->avctx, AV_LOG_WARNING, "extra cblk styles %X\n", c->cblk_style);
537
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
10 if (c->cblk_style & JPEG2000_CBLK_BYPASS)
538 av_log(s->avctx, AV_LOG_WARNING, "Selective arithmetic coding bypass\n");
539 }
540 }
541 869 c->transform = bytestream2_get_byteu(&s->g); // DWT transformation type
542 /* set integer 9/7 DWT in case of BITEXACT flag */
543
4/4
✓ Branch 0 taken 867 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 223 times.
✓ Branch 3 taken 644 times.
869 if ((s->avctx->flags & AV_CODEC_FLAG_BITEXACT) && (c->transform == FF_DWT97))
544 223 c->transform = FF_DWT97_INT;
545
2/2
✓ Branch 0 taken 645 times.
✓ Branch 1 taken 1 times.
646 else if (c->transform == FF_DWT53) {
546 645 s->avctx->properties |= FF_CODEC_PROPERTY_LOSSLESS;
547 }
548
549
2/2
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 853 times.
869 if (c->csty & JPEG2000_CSTY_PREC) {
550 int i;
551
2/2
✓ Branch 0 taken 84 times.
✓ Branch 1 taken 16 times.
100 for (i = 0; i < c->nreslevels; i++) {
552 84 byte = bytestream2_get_byte(&s->g);
553 84 c->log2_prec_widths[i] = byte & 0x0F; // precinct PPx
554 84 c->log2_prec_heights[i] = (byte >> 4) & 0x0F; // precinct PPy
555
2/2
✓ Branch 0 taken 68 times.
✓ Branch 1 taken 16 times.
84 if (i)
556
2/4
✓ Branch 0 taken 68 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 68 times.
68 if (c->log2_prec_widths[i] == 0 || c->log2_prec_heights[i] == 0) {
557 av_log(s->avctx, AV_LOG_ERROR, "PPx %d PPy %d invalid\n",
558 c->log2_prec_widths[i], c->log2_prec_heights[i]);
559 c->log2_prec_widths[i] = c->log2_prec_heights[i] = 1;
560 return AVERROR_INVALIDDATA;
561 }
562 }
563 } else {
564 853 memset(c->log2_prec_widths , 15, sizeof(c->log2_prec_widths ));
565 853 memset(c->log2_prec_heights, 15, sizeof(c->log2_prec_heights));
566 }
567 869 return 0;
568 }
569
570 /* get coding parameters for a particular tile or whole image*/
571 851 static int get_cod(Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *c,
572 const uint8_t *properties)
573 {
574 Jpeg2000CodingStyle tmp;
575 int compno, ret;
576
577
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 851 times.
851 if (bytestream2_get_bytes_left(&s->g) < 5) {
578 av_log(s->avctx, AV_LOG_ERROR, "Insufficient space for COD\n");
579 return AVERROR_INVALIDDATA;
580 }
581
582 851 tmp.csty = bytestream2_get_byteu(&s->g);
583
584 // get progression order
585 851 tmp.prog_order = bytestream2_get_byteu(&s->g);
586
587 851 tmp.nlayers = bytestream2_get_be16u(&s->g);
588 851 tmp.mct = bytestream2_get_byteu(&s->g); // multiple component transformation
589
590
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 841 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
851 if (tmp.mct && s->ncomponents < 3) {
591 av_log(s->avctx, AV_LOG_ERROR,
592 "MCT %"PRIu8" with too few components (%d)\n",
593 tmp.mct, s->ncomponents);
594 return AVERROR_INVALIDDATA;
595 }
596
597
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 851 times.
851 if ((ret = get_cox(s, &tmp)) < 0)
598 return ret;
599 851 tmp.init = 1;
600
2/2
✓ Branch 0 taken 2724 times.
✓ Branch 1 taken 851 times.
3575 for (compno = 0; compno < s->ncomponents; compno++)
601
1/2
✓ Branch 0 taken 2724 times.
✗ Branch 1 not taken.
2724 if (!(properties[compno] & HAD_COC))
602 2724 memcpy(c + compno, &tmp, sizeof(tmp));
603 851 return 0;
604 }
605
606 /* Get coding parameters for a component in the whole image or a
607 * particular tile. */
608 18 static int get_coc(Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *c,
609 uint8_t *properties)
610 {
611 int compno, ret;
612 uint8_t has_eph, has_sop;
613
614
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 18 times.
18 if (bytestream2_get_bytes_left(&s->g) < 2) {
615 av_log(s->avctx, AV_LOG_ERROR, "Insufficient space for COC\n");
616 return AVERROR_INVALIDDATA;
617 }
618
619 18 compno = bytestream2_get_byteu(&s->g);
620
621
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 if (compno >= s->ncomponents) {
622 av_log(s->avctx, AV_LOG_ERROR,
623 "Invalid compno %d. There are %d components in the image.\n",
624 compno, s->ncomponents);
625 return AVERROR_INVALIDDATA;
626 }
627
628 18 c += compno;
629 18 has_eph = c->csty & JPEG2000_CSTY_EPH;
630 18 has_sop = c->csty & JPEG2000_CSTY_SOP;
631 18 c->csty = bytestream2_get_byteu(&s->g);
632 18 c->csty |= has_eph; //do not override eph present bits from COD
633 18 c->csty |= has_sop; //do not override sop present bits from COD
634
635
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 18 times.
18 if ((ret = get_cox(s, c)) < 0)
636 return ret;
637
638 18 properties[compno] |= HAD_COC;
639 18 c->init = 1;
640 18 return 0;
641 }
642
643 4 static int get_rgn(Jpeg2000DecoderContext *s, int n)
644 {
645 uint16_t compno;
646
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
4 compno = (s->ncomponents < 257)? bytestream2_get_byte(&s->g):
647 bytestream2_get_be16u(&s->g);
648
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
4 if (bytestream2_get_byte(&s->g)) {
649 av_log(s->avctx, AV_LOG_ERROR, "Invalid RGN header.\n");
650 return AVERROR_INVALIDDATA; // SRgn field value is 0
651 }
652 // SPrgn field
653 // Currently compno cannot be greater than 4.
654 // However, future implementation should support compno up to 65536
655
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
4 if (compno < s->ncomponents) {
656 int v;
657
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
4 if (s->curtileno == -1) {
658 v = bytestream2_get_byte(&s->g);
659 if (v > 30)
660 return AVERROR_PATCHWELCOME;
661 s->roi_shift[compno] = v;
662 } else {
663
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
4 if (s->tile[s->curtileno].tp_idx != 0)
664 return AVERROR_INVALIDDATA; // marker occurs only in first tile part of tile
665 4 v = bytestream2_get_byte(&s->g);
666
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
4 if (v > 30)
667 return AVERROR_PATCHWELCOME;
668 4 s->tile[s->curtileno].comp[compno].roi_shift = v;
669 }
670 4 return 0;
671 }
672 return AVERROR_INVALIDDATA;
673 }
674
675 /* Get common part for QCD and QCC segments. */
676 876 static int get_qcx(Jpeg2000DecoderContext *s, int n, Jpeg2000QuantStyle *q)
677 {
678 int i, x;
679
680
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 876 times.
876 if (bytestream2_get_bytes_left(&s->g) < 1)
681 return AVERROR_INVALIDDATA;
682
683 876 x = bytestream2_get_byteu(&s->g); // Sqcd
684
685 876 q->nguardbits = x >> 5;
686 876 q->quantsty = x & 0x1f;
687
688
2/2
✓ Branch 0 taken 643 times.
✓ Branch 1 taken 233 times.
876 if (q->quantsty == JPEG2000_QSTY_NONE) {
689 643 n -= 3;
690
2/4
✓ Branch 1 taken 643 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 643 times.
643 if (bytestream2_get_bytes_left(&s->g) < n ||
691 n > JPEG2000_MAX_DECLEVELS*3)
692 return AVERROR_INVALIDDATA;
693
2/2
✓ Branch 0 taken 12004 times.
✓ Branch 1 taken 643 times.
12647 for (i = 0; i < n; i++)
694 12004 q->expn[i] = bytestream2_get_byteu(&s->g) >> 3;
695
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 227 times.
233 } else if (q->quantsty == JPEG2000_QSTY_SI) {
696
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
6 if (bytestream2_get_bytes_left(&s->g) < 2)
697 return AVERROR_INVALIDDATA;
698 6 x = bytestream2_get_be16u(&s->g);
699 6 q->expn[0] = x >> 11;
700 6 q->mant[0] = x & 0x7ff;
701
2/2
✓ Branch 0 taken 588 times.
✓ Branch 1 taken 6 times.
594 for (i = 1; i < JPEG2000_MAX_DECLEVELS * 3; i++) {
702 588 int curexpn = FFMAX(0, q->expn[0] - (i - 1) / 3);
703 588 q->expn[i] = curexpn;
704 588 q->mant[i] = q->mant[0];
705 }
706 } else {
707 227 n = (n - 3) >> 1;
708
2/4
✓ Branch 1 taken 227 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 227 times.
227 if (bytestream2_get_bytes_left(&s->g) < 2 * n ||
709 n > JPEG2000_MAX_DECLEVELS*3)
710 return AVERROR_INVALIDDATA;
711
2/2
✓ Branch 0 taken 4268 times.
✓ Branch 1 taken 227 times.
4495 for (i = 0; i < n; i++) {
712 4268 x = bytestream2_get_be16u(&s->g);
713 4268 q->expn[i] = x >> 11;
714 4268 q->mant[i] = x & 0x7ff;
715 }
716 }
717 876 return 0;
718 }
719
720 /* Get quantization parameters for a particular tile or a whole image. */
721 851 static int get_qcd(Jpeg2000DecoderContext *s, int n, Jpeg2000QuantStyle *q,
722 const uint8_t *properties)
723 {
724 Jpeg2000QuantStyle tmp;
725 int compno, ret;
726
727 851 memset(&tmp, 0, sizeof(tmp));
728
729
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 851 times.
851 if ((ret = get_qcx(s, n, &tmp)) < 0)
730 return ret;
731
2/2
✓ Branch 0 taken 2724 times.
✓ Branch 1 taken 851 times.
3575 for (compno = 0; compno < s->ncomponents; compno++)
732
1/2
✓ Branch 0 taken 2724 times.
✗ Branch 1 not taken.
2724 if (!(properties[compno] & HAD_QCC))
733 2724 memcpy(q + compno, &tmp, sizeof(tmp));
734 851 return 0;
735 }
736
737 /* Get quantization parameters for a component in the whole image
738 * on in a particular tile. */
739 25 static int get_qcc(Jpeg2000DecoderContext *s, int n, Jpeg2000QuantStyle *q,
740 uint8_t *properties)
741 {
742 int compno;
743
744
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 25 times.
25 if (bytestream2_get_bytes_left(&s->g) < 1)
745 return AVERROR_INVALIDDATA;
746
747 25 compno = bytestream2_get_byteu(&s->g);
748
749
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 25 times.
25 if (compno >= s->ncomponents) {
750 av_log(s->avctx, AV_LOG_ERROR,
751 "Invalid compno %d. There are %d components in the image.\n",
752 compno, s->ncomponents);
753 return AVERROR_INVALIDDATA;
754 }
755
756 25 properties[compno] |= HAD_QCC;
757 25 return get_qcx(s, n - 1, q + compno);
758 }
759
760 8 static int get_poc(Jpeg2000DecoderContext *s, int size, Jpeg2000POC *p)
761 {
762 int i;
763
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
8 int elem_size = s->ncomponents <= 257 ? 7 : 9;
764 8 Jpeg2000POC tmp = {{{0}}};
765
766
2/4
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 8 times.
8 if (bytestream2_get_bytes_left(&s->g) < 5 || size < 2 + elem_size) {
767 av_log(s->avctx, AV_LOG_ERROR, "Insufficient space for POC\n");
768 return AVERROR_INVALIDDATA;
769 }
770
771
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 if (elem_size > 7) {
772 avpriv_request_sample(s->avctx, "Fat POC not supported");
773 return AVERROR_PATCHWELCOME;
774 }
775
776 8 tmp.nb_poc = (size - 2) / elem_size;
777
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 if (tmp.nb_poc > MAX_POCS) {
778 avpriv_request_sample(s->avctx, "Too many POCs (%d)", tmp.nb_poc);
779 return AVERROR_PATCHWELCOME;
780 }
781
782
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
16 for (i = 0; i<tmp.nb_poc; i++) {
783 8 Jpeg2000POCEntry *e = &tmp.poc[i];
784 8 e->RSpoc = bytestream2_get_byteu(&s->g);
785 8 e->CSpoc = bytestream2_get_byteu(&s->g);
786 8 e->LYEpoc = bytestream2_get_be16u(&s->g);
787 8 e->REpoc = bytestream2_get_byteu(&s->g);
788 8 e->CEpoc = bytestream2_get_byteu(&s->g);
789 8 e->Ppoc = bytestream2_get_byteu(&s->g);
790
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 if (!e->CEpoc)
791 e->CEpoc = 256;
792
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
8 if (e->CEpoc > s->ncomponents)
793 4 e->CEpoc = s->ncomponents;
794
2/4
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
8 if ( e->RSpoc >= e->REpoc || e->REpoc > 33
795
2/4
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
8 || e->CSpoc >= e->CEpoc || e->CEpoc > s->ncomponents
796
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 || !e->LYEpoc) {
797 av_log(s->avctx, AV_LOG_ERROR, "POC Entry %d is invalid (%d, %d, %d, %d, %d, %d)\n", i,
798 e->RSpoc, e->CSpoc, e->LYEpoc, e->REpoc, e->CEpoc, e->Ppoc
799 );
800 return AVERROR_INVALIDDATA;
801 }
802 }
803
804
3/4
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
8 if (!p->nb_poc || p->is_default) {
805 6 *p = tmp;
806 } else {
807
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (p->nb_poc + tmp.nb_poc > MAX_POCS) {
808 av_log(s->avctx, AV_LOG_ERROR, "Insufficient space for POC\n");
809 return AVERROR_INVALIDDATA;
810 }
811 2 memcpy(p->poc + p->nb_poc, tmp.poc, tmp.nb_poc * sizeof(tmp.poc[0]));
812 2 p->nb_poc += tmp.nb_poc;
813 }
814
815 8 p->is_default = 0;
816
817 8 return 0;
818 }
819
820
821 /* Get start of tile segment. */
822 3242 static int get_sot(Jpeg2000DecoderContext *s, int n)
823 {
824 Jpeg2000TilePart *tp;
825 uint16_t Isot;
826 uint32_t Psot;
827 unsigned TPsot;
828
829
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 3242 times.
3242 if (bytestream2_get_bytes_left(&s->g) < 8)
830 return AVERROR_INVALIDDATA;
831
832 3242 s->curtileno = 0;
833 3242 Isot = bytestream2_get_be16u(&s->g); // Isot
834
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3242 times.
3242 if (Isot >= s->numXtiles * s->numYtiles)
835 return AVERROR_INVALIDDATA;
836
837 3242 s->curtileno = Isot;
838 3242 Psot = bytestream2_get_be32u(&s->g); // Psot
839 3242 TPsot = bytestream2_get_byteu(&s->g); // TPsot
840
841 /* Read TNSot but not used */
842 3242 bytestream2_get_byteu(&s->g); // TNsot
843
844
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3242 times.
3242 if (!Psot)
845 Psot = bytestream2_get_bytes_left(&s->g) - 2 + n + 2;
846
847
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 3242 times.
3242 if (Psot > bytestream2_get_bytes_left(&s->g) - 2 + n + 2) {
848 av_log(s->avctx, AV_LOG_ERROR, "Psot %"PRIu32" too big\n", Psot);
849 return AVERROR_INVALIDDATA;
850 }
851
852
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3242 times.
3242 if (TPsot >= FF_ARRAY_ELEMS(s->tile[Isot].tile_part)) {
853 avpriv_request_sample(s->avctx, "Too many tile parts");
854 return AVERROR_PATCHWELCOME;
855 }
856
857 3242 s->tile[Isot].tp_idx = TPsot;
858 3242 tp = s->tile[Isot].tile_part + TPsot;
859 3242 tp->tile_index = Isot;
860 3242 tp->tp_end = s->g.buffer + Psot - n - 2;
861
862
2/2
✓ Branch 0 taken 3216 times.
✓ Branch 1 taken 26 times.
3242 if (!TPsot) {
863 3216 Jpeg2000Tile *tile = s->tile + s->curtileno;
864
865 /* copy defaults */
866 3216 memcpy(tile->codsty, s->codsty, s->ncomponents * sizeof(Jpeg2000CodingStyle));
867 3216 memcpy(tile->qntsty, s->qntsty, s->ncomponents * sizeof(Jpeg2000QuantStyle));
868 3216 memcpy(&tile->poc , &s->poc , sizeof(tile->poc));
869 3216 tile->poc.is_default = 1;
870 }
871
872 3242 return 0;
873 }
874
875 4 static int read_crg(Jpeg2000DecoderContext *s, int n)
876 {
877
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
4 if (s->ncomponents*4 != n - 2) {
878 av_log(s->avctx, AV_LOG_ERROR, "Invalid CRG marker.\n");
879 return AVERROR_INVALIDDATA;
880 }
881 4 bytestream2_skip(&s->g, n - 2);
882 4 return 0;
883 }
884
885 2 static int read_cpf(Jpeg2000DecoderContext *s, int n)
886 {
887
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
2 if (bytestream2_get_bytes_left(&s->g) < (n - 2))
888 return AVERROR_INVALIDDATA;
889 2 bytestream2_skip(&s->g, n - 2);
890 2 return 0;
891 }
892
893 /* Tile-part lengths: see ISO 15444-1:2002, section A.7.1
894 * Used to know the number of tile parts and lengths.
895 * There may be multiple TLMs in the header.
896 * TODO: The function is not used for tile-parts management, nor anywhere else.
897 * It can be useful to allocate memory for tile parts, before managing the SOT
898 * markers. Parsing the TLM header is needed to increment the input header
899 * buffer.
900 * This marker is mandatory for DCI. */
901 11 static int get_tlm(Jpeg2000DecoderContext *s, int n)
902 {
903 uint8_t Stlm, ST, SP, tile_tlm, i;
904 11 bytestream2_get_byte(&s->g); /* Ztlm: skipped */
905 11 Stlm = bytestream2_get_byte(&s->g);
906
907 // too complex ? ST = ((Stlm >> 4) & 0x01) + ((Stlm >> 4) & 0x02);
908 11 ST = (Stlm >> 4) & 0x03;
909
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 11 times.
11 if (ST == 0x03) {
910 av_log(s->avctx, AV_LOG_ERROR, "TLM marker contains invalid ST value.\n");
911 return AVERROR_INVALIDDATA;
912 }
913
914 11 SP = (Stlm >> 6) & 0x01;
915 11 tile_tlm = (n - 4) / ((SP + 1) * 2 + ST);
916
2/2
✓ Branch 0 taken 38 times.
✓ Branch 1 taken 11 times.
49 for (i = 0; i < tile_tlm; i++) {
917
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 17 times.
✓ Branch 2 taken 21 times.
✗ Branch 3 not taken.
38 switch (ST) {
918 case 0:
919 break;
920 17 case 1:
921 17 bytestream2_get_byte(&s->g);
922 17 break;
923 21 case 2:
924 21 bytestream2_get_be16(&s->g);
925 21 break;
926 }
927
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 38 times.
38 if (SP == 0) {
928 bytestream2_get_be16(&s->g);
929 } else {
930 38 bytestream2_get_be32(&s->g);
931 }
932 }
933 11 return 0;
934 }
935
936 514 static int get_plt(Jpeg2000DecoderContext *s, int n)
937 {
938 int i;
939 int v;
940
941 514 av_log(s->avctx, AV_LOG_DEBUG,
942 514 "PLT marker at pos 0x%X\n", bytestream2_tell(&s->g) - 4);
943
944
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 514 times.
514 if (n < 4)
945 return AVERROR_INVALIDDATA;
946
947 514 /*Zplt =*/ bytestream2_get_byte(&s->g);
948
949
2/2
✓ Branch 0 taken 73452 times.
✓ Branch 1 taken 514 times.
73966 for (i = 0; i < n - 3; i++) {
950 73452 v = bytestream2_get_byte(&s->g);
951 }
952
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 514 times.
514 if (v & 0x80)
953 return AVERROR_INVALIDDATA;
954
955 514 return 0;
956 }
957
958 static int get_ppm(Jpeg2000DecoderContext *s, int n)
959 {
960 void *new;
961
962 if (n < 3) {
963 av_log(s->avctx, AV_LOG_ERROR, "Invalid length for PPM data.\n");
964 return AVERROR_INVALIDDATA;
965 }
966 bytestream2_get_byte(&s->g); //Zppm is skipped and not used
967 new = av_realloc(s->packed_headers,
968 s->packed_headers_size + n - 3);
969 if (new) {
970 s->packed_headers = new;
971 } else
972 return AVERROR(ENOMEM);
973 s->has_ppm = 1;
974 memset(&s->packed_headers_stream, 0, sizeof(s->packed_headers_stream));
975 bytestream2_get_bufferu(&s->g, s->packed_headers + s->packed_headers_size,
976 n - 3);
977 s->packed_headers_size += n - 3;
978
979 return 0;
980 }
981
982 static int get_ppt(Jpeg2000DecoderContext *s, int n)
983 {
984 Jpeg2000Tile *tile;
985 void *new;
986
987 if (n < 3) {
988 av_log(s->avctx, AV_LOG_ERROR, "Invalid length for PPT data.\n");
989 return AVERROR_INVALIDDATA;
990 }
991 if (s->curtileno < 0)
992 return AVERROR_INVALIDDATA;
993
994 tile = &s->tile[s->curtileno];
995 if (tile->tp_idx != 0) {
996 av_log(s->avctx, AV_LOG_ERROR,
997 "PPT marker can occur only on first tile part of a tile.\n");
998 return AVERROR_INVALIDDATA;
999 }
1000
1001 tile->has_ppt = 1; // this tile has a ppt marker
1002 bytestream2_get_byte(&s->g); // Zppt is skipped and not used
1003 new = av_realloc(tile->packed_headers,
1004 tile->packed_headers_size + n - 3);
1005 if (new) {
1006 tile->packed_headers = new;
1007 } else
1008 return AVERROR(ENOMEM);
1009 memset(&tile->packed_headers_stream, 0, sizeof(tile->packed_headers_stream));
1010 bytestream2_get_bufferu(&s->g, tile->packed_headers + tile->packed_headers_size, n - 3);
1011 tile->packed_headers_size += n - 3;
1012
1013 return 0;
1014 }
1015
1016 2881 static int init_tile(Jpeg2000DecoderContext *s, int tileno)
1017 {
1018 int compno;
1019 2881 int tilex = tileno % s->numXtiles;
1020 2881 int tiley = tileno / s->numXtiles;
1021 2881 Jpeg2000Tile *tile = s->tile + tileno;
1022
1023
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2881 times.
2881 if (!tile->comp)
1024 return AVERROR(ENOMEM);
1025
1026 2881 tile->coord[0][0] = av_clip(tilex * (int64_t)s->tile_width + s->tile_offset_x, s->image_offset_x, s->width);
1027 2881 tile->coord[0][1] = av_clip((tilex + 1) * (int64_t)s->tile_width + s->tile_offset_x, s->image_offset_x, s->width);
1028 2881 tile->coord[1][0] = av_clip(tiley * (int64_t)s->tile_height + s->tile_offset_y, s->image_offset_y, s->height);
1029 2881 tile->coord[1][1] = av_clip((tiley + 1) * (int64_t)s->tile_height + s->tile_offset_y, s->image_offset_y, s->height);
1030
1031
2/2
✓ Branch 0 taken 9264 times.
✓ Branch 1 taken 2881 times.
12145 for (compno = 0; compno < s->ncomponents; compno++) {
1032 9264 Jpeg2000Component *comp = tile->comp + compno;
1033 9264 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1034 9264 Jpeg2000QuantStyle *qntsty = tile->qntsty + compno;
1035 int ret; // global bandno
1036
1037 9264 comp->coord_o[0][0] = tile->coord[0][0];
1038 9264 comp->coord_o[0][1] = tile->coord[0][1];
1039 9264 comp->coord_o[1][0] = tile->coord[1][0];
1040 9264 comp->coord_o[1][1] = tile->coord[1][1];
1041
1042 9264 comp->coord_o[0][0] = ff_jpeg2000_ceildiv(comp->coord_o[0][0], s->cdx[compno]);
1043 9264 comp->coord_o[0][1] = ff_jpeg2000_ceildiv(comp->coord_o[0][1], s->cdx[compno]);
1044 9264 comp->coord_o[1][0] = ff_jpeg2000_ceildiv(comp->coord_o[1][0], s->cdy[compno]);
1045 9264 comp->coord_o[1][1] = ff_jpeg2000_ceildiv(comp->coord_o[1][1], s->cdy[compno]);
1046
1047 9264 comp->coord[0][0] = ff_jpeg2000_ceildivpow2(comp->coord_o[0][0], s->reduction_factor);
1048 9264 comp->coord[0][1] = ff_jpeg2000_ceildivpow2(comp->coord_o[0][1], s->reduction_factor);
1049 9264 comp->coord[1][0] = ff_jpeg2000_ceildivpow2(comp->coord_o[1][0], s->reduction_factor);
1050 9264 comp->coord[1][1] = ff_jpeg2000_ceildivpow2(comp->coord_o[1][1], s->reduction_factor);
1051
1052
2/2
✓ Branch 0 taken 9262 times.
✓ Branch 1 taken 2 times.
9264 if (!comp->roi_shift)
1053 9262 comp->roi_shift = s->roi_shift[compno];
1054
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 9264 times.
9264 if (!codsty->init)
1055 return AVERROR_INVALIDDATA;
1056
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 9263 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
9264 if (s->isHT && (!s->Ccap15_b05) && (!codsty->transform)) {
1057 av_log(s->avctx, AV_LOG_ERROR, "Transformation = 0 (lossy DWT) is found in HTREV HT set\n");
1058 return AVERROR_INVALIDDATA;
1059 }
1060
4/6
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 9263 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
9264 if (s->isHT && s->Ccap15_b14_15 != (codsty->cblk_style >> 6) && s->Ccap15_b14_15 != HTJ2K_HTONLY) {
1061 av_log(s->avctx, AV_LOG_ERROR, "SPcod/SPcoc value does not match bit 14-15 values of Ccap15\n");
1062 return AVERROR_INVALIDDATA;
1063 }
1064
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 9264 times.
9264 if (ret = ff_jpeg2000_init_component(comp, codsty, qntsty,
1065 9264 s->cbps[compno], s->cdx[compno],
1066 s->cdy[compno], s->avctx))
1067 return ret;
1068 }
1069 2881 return 0;
1070 }
1071
1072 /* Read the number of coding passes. */
1073 890998 static int getnpasses(Jpeg2000DecoderContext *s)
1074 {
1075 int num;
1076
2/2
✓ Branch 1 taken 56247 times.
✓ Branch 2 taken 834751 times.
890998 if (!get_bits(s, 1))
1077 56247 return 1;
1078
2/2
✓ Branch 1 taken 29425 times.
✓ Branch 2 taken 805326 times.
834751 if (!get_bits(s, 1))
1079 29425 return 2;
1080
2/2
✓ Branch 1 taken 157732 times.
✓ Branch 2 taken 647594 times.
805326 if ((num = get_bits(s, 2)) != 3)
1081
1/2
✓ Branch 0 taken 157732 times.
✗ Branch 1 not taken.
157732 return num < 0 ? num : 3 + num;
1082
2/2
✓ Branch 1 taken 604660 times.
✓ Branch 2 taken 42934 times.
647594 if ((num = get_bits(s, 5)) != 31)
1083
1/2
✓ Branch 0 taken 604660 times.
✗ Branch 1 not taken.
604660 return num < 0 ? num : 6 + num;
1084 42934 num = get_bits(s, 7);
1085
1/2
✓ Branch 0 taken 42934 times.
✗ Branch 1 not taken.
42934 return num < 0 ? num : 37 + num;
1086 }
1087
1088 890998 static int getlblockinc(Jpeg2000DecoderContext *s)
1089 {
1090 890998 int res = 0, ret;
1091
2/2
✓ Branch 1 taken 512784 times.
✓ Branch 2 taken 890998 times.
1403782 while (ret = get_bits(s, 1)) {
1092
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 512784 times.
512784 if (ret < 0)
1093 return ret;
1094 512784 res++;
1095 }
1096 890998 return res;
1097 }
1098
1099 static inline void select_header(Jpeg2000DecoderContext *s, const Jpeg2000Tile *tile,
1100 int *tp_index)
1101 {
1102 s->g = tile->tile_part[*tp_index].header_tpg;
1103 if (bytestream2_get_bytes_left(&s->g) == 0 && s->bit_index == 8) {
1104 av_log(s->avctx, AV_LOG_WARNING, "Packet header bytes in PPM marker segment is too short.\n");
1105 if (*tp_index < FF_ARRAY_ELEMS(tile->tile_part) - 1) {
1106 s->g = tile->tile_part[++(*tp_index)].tpg;
1107 }
1108 }
1109 }
1110
1111 87192 static inline void select_stream(Jpeg2000DecoderContext *s, const Jpeg2000Tile *tile,
1112 int *tp_index, const Jpeg2000CodingStyle *codsty)
1113 {
1114 int32_t is_endof_tp;
1115
1116 87192 s->g = tile->tile_part[*tp_index].tpg;
1117
3/4
✓ Branch 1 taken 9 times.
✓ Branch 2 taken 87183 times.
✓ Branch 3 taken 9 times.
✗ Branch 4 not taken.
87192 is_endof_tp = bytestream2_get_bytes_left(&s->g) == 0 && s->bit_index == 8;
1118 // Following while loop is necessary because a tilepart may include only SOD marker.
1119 // Such a tilepart has neither packet header nor compressed data.
1120
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 87192 times.
87202 while (is_endof_tp) {
1121
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
10 if (*tp_index < FF_ARRAY_ELEMS(tile->tile_part) - 1) {
1122 10 s->g = tile->tile_part[++(*tp_index)].tpg;
1123
3/4
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
10 is_endof_tp = bytestream2_get_bytes_left(&s->g) == 0 && s->bit_index == 8;
1124 } else {
1125 is_endof_tp = 0;
1126 }
1127 }
1128
2/2
✓ Branch 0 taken 25452 times.
✓ Branch 1 taken 61740 times.
87192 if (codsty->csty & JPEG2000_CSTY_SOP) {
1129
1/2
✓ Branch 1 taken 25452 times.
✗ Branch 2 not taken.
25452 if (bytestream2_peek_be32(&s->g) == JPEG2000_SOP_FIXED_BYTES)
1130 25452 bytestream2_skip(&s->g, JPEG2000_SOP_BYTE_LENGTH);
1131 else
1132 av_log(s->avctx, AV_LOG_ERROR, "SOP marker not found. instead %X\n", bytestream2_peek_be32(&s->g));
1133 }
1134 87192 }
1135
1136 87264 static int jpeg2000_decode_packet(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile, int *tp_index,
1137 const Jpeg2000CodingStyle *codsty,
1138 Jpeg2000ResLevel *rlevel, int precno,
1139 int layno, const uint8_t *expn, int numgbits)
1140 {
1141 int bandno, cblkno, ret, nb_code_blocks;
1142 int cwsno;
1143
1144
2/2
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 87192 times.
87264 if (layno < rlevel->band[0].prec[precno].decoded_layers)
1145 72 return 0;
1146 87192 rlevel->band[0].prec[precno].decoded_layers = layno + 1;
1147 // Select stream to read from
1148
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 87192 times.
87192 if (s->has_ppm)
1149 select_header(s, tile, tp_index);
1150
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 87192 times.
87192 else if (tile->has_ppt)
1151 s->g = tile->packed_headers_stream;
1152 else
1153 87192 select_stream(s, tile, tp_index, codsty);
1154
1155
2/2
✓ Branch 1 taken 3915 times.
✓ Branch 2 taken 83277 times.
87192 if (!(ret = get_bits(s, 1))) {
1156 3915 jpeg2000_flush(s);
1157 3915 goto skip_data;
1158
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 83277 times.
83277 } else if (ret < 0)
1159 return ret;
1160
1161
2/2
✓ Branch 0 taken 220079 times.
✓ Branch 1 taken 83277 times.
303356 for (bandno = 0; bandno < rlevel->nbands; bandno++) {
1162 220079 Jpeg2000Band *band = rlevel->band + bandno;
1163 220079 Jpeg2000Prec *prec = band->prec + precno;
1164
1165
2/2
✓ Branch 0 taken 220077 times.
✓ Branch 1 taken 2 times.
220079 if (band->coord[0][0] == band->coord[0][1] ||
1166
2/2
✓ Branch 0 taken 7190 times.
✓ Branch 1 taken 212887 times.
220077 band->coord[1][0] == band->coord[1][1])
1167 7192 continue;
1168 212887 nb_code_blocks = prec->nb_codeblocks_height *
1169 212887 prec->nb_codeblocks_width;
1170
2/2
✓ Branch 0 taken 1001564 times.
✓ Branch 1 taken 212887 times.
1214451 for (cblkno = 0; cblkno < nb_code_blocks; cblkno++) {
1171 1001564 Jpeg2000Cblk *cblk = prec->cblk + cblkno;
1172 int incl, newpasses, llen;
1173 void *tmp;
1174
1175
2/2
✓ Branch 0 taken 913967 times.
✓ Branch 1 taken 87597 times.
1001564 if (!cblk->incl) {
1176 913967 incl = 0;
1177 913967 cblk->modes = codsty->cblk_style;
1178
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 913957 times.
913967 if (cblk->modes >= JPEG2000_CTSY_HTJ2K_F)
1179 10 cblk->ht_plhd = HT_PLHD_ON;
1180
2/2
✓ Branch 0 taken 60567 times.
✓ Branch 1 taken 853400 times.
913967 if (layno > 0)
1181 60567 incl = tag_tree_decode(s, prec->cblkincl + cblkno, 0 + 1) == 0;
1182 913967 incl = tag_tree_decode(s, prec->cblkincl + cblkno, layno + 1) == layno;
1183
1184
2/2
✓ Branch 0 taken 813458 times.
✓ Branch 1 taken 100509 times.
913967 if (incl) {
1185 813458 int zbp = tag_tree_decode(s, prec->zerobits + cblkno, 100);
1186 813458 int v = expn[bandno] + numgbits - 1 - (zbp - tile->comp->roi_shift);
1187
2/4
✓ Branch 0 taken 813458 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 813458 times.
813458 if (v < 0 || v > 30) {
1188 av_log(s->avctx, AV_LOG_ERROR,
1189 "nonzerobits %d invalid or unsupported\n", v);
1190 return AVERROR_INVALIDDATA;
1191 }
1192 813458 cblk->incl = 1;
1193 813458 cblk->nonzerobits = v;
1194 813458 cblk->zbp = zbp;
1195 813458 cblk->lblock = 3;
1196 }
1197 } else {
1198 87597 incl = get_bits(s, 1);
1199 }
1200
1201
2/2
✓ Branch 0 taken 890998 times.
✓ Branch 1 taken 110566 times.
1001564 if (incl) {
1202 890998 uint8_t bypass_term_threshold = 0;
1203 890998 uint8_t bits_to_read = 0;
1204 890998 uint32_t segment_bytes = 0;
1205 890998 int32_t segment_passes = 0;
1206 890998 uint8_t next_segment_passes = 0;
1207 int32_t href_passes, pass_bound;
1208 890998 uint32_t tmp_length = 0;
1209 int32_t newpasses_copy, npasses_copy;
1210
1211
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 890998 times.
890998 if ((newpasses = getnpasses(s)) <= 0)
1212 return newpasses;
1213
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 890998 times.
890998 if (cblk->npasses + newpasses >= JPEG2000_MAX_PASSES) {
1214 avpriv_request_sample(s->avctx, "Too many passes");
1215 return AVERROR_PATCHWELCOME;
1216 }
1217
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 890998 times.
890998 if ((llen = getlblockinc(s)) < 0)
1218 return llen;
1219
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 890998 times.
890998 if (cblk->lblock + llen + av_log2(newpasses) > 16) {
1220 avpriv_request_sample(s->avctx,
1221 "Block with length beyond 16 bits");
1222 return AVERROR_PATCHWELCOME;
1223 }
1224 890998 cblk->nb_lengthinc = 0;
1225 890998 cblk->nb_terminationsinc = 0;
1226 890998 av_free(cblk->lengthinc);
1227 890998 cblk->lengthinc = av_calloc(newpasses, sizeof(*cblk->lengthinc));
1228
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 890998 times.
890998 if (!cblk->lengthinc)
1229 return AVERROR(ENOMEM);
1230 890998 tmp = av_realloc_array(cblk->data_start, cblk->nb_terminations + newpasses + 1,
1231 sizeof(*cblk->data_start));
1232
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 890998 times.
890998 if (!tmp)
1233 return AVERROR(ENOMEM);
1234 890998 cblk->data_start = tmp;
1235 890998 cblk->lblock += llen;
1236
1237 // Count number of necessary terminations for non HT code block
1238 890998 newpasses_copy = newpasses;
1239 890998 npasses_copy = cblk->npasses;
1240
2/2
✓ Branch 0 taken 890988 times.
✓ Branch 1 taken 10 times.
890998 if (!(cblk->modes & JPEG2000_CTSY_HTJ2K_F)) {
1241 do {
1242 893516 int newpasses1 = 0;
1243
1244
2/2
✓ Branch 0 taken 12162772 times.
✓ Branch 1 taken 889354 times.
13052126 while (newpasses1 < newpasses_copy) {
1245 12162772 newpasses1++;
1246
2/2
✓ Branch 1 taken 4162 times.
✓ Branch 2 taken 12158610 times.
12162772 if (needs_termination(codsty->cblk_style, npasses_copy + newpasses1 - 1)) {
1247 4162 cblk->nb_terminationsinc++;
1248 4162 break;
1249 }
1250 }
1251 893516 npasses_copy += newpasses1;
1252 893516 newpasses_copy -= newpasses1;
1253
2/2
✓ Branch 0 taken 2528 times.
✓ Branch 1 taken 890988 times.
893516 } while (newpasses_copy);
1254 }
1255
1256
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 890988 times.
890998 if (cblk->ht_plhd) {
1257 10 href_passes = (cblk->npasses + newpasses - 1) % 3;
1258 10 segment_passes = newpasses - href_passes;
1259 10 pass_bound = 2;
1260 10 bits_to_read = cblk->lblock;
1261
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
10 if (segment_passes < 1) {
1262 // No possible HT Cleanup pass here; may have placeholder passes
1263 // or an original J2K block bit-stream (in MIXED mode).
1264 segment_passes = newpasses;
1265 while (pass_bound <= segment_passes) {
1266 bits_to_read++;
1267 pass_bound += pass_bound;
1268 }
1269 segment_bytes = get_bits(s, bits_to_read);
1270 if (segment_bytes) {
1271 if (cblk->modes & HT_MIXED) {
1272 cblk->ht_plhd = HT_PLHD_OFF;
1273 cblk->modes &= (uint8_t) (~(JPEG2000_CTSY_HTJ2K_F));
1274 }
1275 else {
1276 av_log(s->avctx, AV_LOG_WARNING, "Length information for a HT-codeblock is invalid\n");
1277 }
1278 }
1279 } else {
1280
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
10 while (pass_bound <= segment_passes) {
1281 bits_to_read++;
1282 pass_bound += pass_bound;
1283 }
1284 10 segment_bytes = get_bits(s, bits_to_read);
1285
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
10 if (segment_bytes) {
1286 // No more placeholder passes
1287
1/2
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
10 if (!(cblk->modes & HT_MIXED)) {
1288 // Must be the first HT Cleanup pass
1289
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
10 if (segment_bytes < 2)
1290 av_log(s->avctx, AV_LOG_WARNING, "Length information for a HT-codeblock is invalid\n");
1291 10 next_segment_passes = 2;
1292 10 cblk->ht_plhd = HT_PLHD_OFF;
1293 // Write length information for HT CleanUp segment
1294 10 cblk->pass_lengths[0] = segment_bytes;
1295 } else if (cblk->lblock > 3 && segment_bytes > 1
1296 && (segment_bytes >> (bits_to_read - 1)) == 0) {
1297 // Must be the first HT Cleanup pass, since length MSB is 0
1298 next_segment_passes = 2;
1299 cblk->ht_plhd = HT_PLHD_OFF;
1300 // Write length information for HT CleanUp segment
1301 cblk->pass_lengths[0] = segment_bytes;
1302 } else {
1303 // Must have an original (non-HT) block coding pass
1304 cblk->modes &= (uint8_t) (~(JPEG2000_CTSY_HTJ2K_F));
1305 cblk->ht_plhd = HT_PLHD_OFF;
1306 segment_passes = newpasses;
1307 while (pass_bound <= segment_passes) {
1308 bits_to_read++;
1309 pass_bound += pass_bound;
1310 segment_bytes <<= 1;
1311 segment_bytes += get_bits(s, 1);
1312 }
1313 }
1314 } else {
1315 // Probably parsing placeholder passes, but we need to read an
1316 // extra length bit to verify this, since prior to the first
1317 // HT Cleanup pass, the number of length bits read for a
1318 // contributing code-block is dependent on the number of passes
1319 // being included, as if it were a non-HT code-block.
1320 segment_passes = newpasses;
1321 if (pass_bound <= segment_passes) {
1322 while (1) {
1323 bits_to_read++;
1324 pass_bound += pass_bound;
1325 segment_bytes <<= 1;
1326 segment_bytes += get_bits(s, 1);
1327 if (pass_bound > segment_passes)
1328 break;
1329 }
1330 if (segment_bytes) {
1331 if (cblk->modes & HT_MIXED) {
1332 cblk->modes &= (uint8_t) (~(JPEG2000_CTSY_HTJ2K_F));
1333 cblk->ht_plhd = HT_PLHD_OFF;
1334 } else {
1335 av_log(s->avctx, AV_LOG_WARNING, "Length information for a HT-codeblock is invalid\n");
1336 }
1337 }
1338 }
1339 }
1340 }
1341
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 890988 times.
890988 } else if (cblk->modes & JPEG2000_CTSY_HTJ2K_F) {
1342 // Quality layer commences with a non-initial HT coding pass
1343 if(bits_to_read != 0)
1344 av_log(s->avctx, AV_LOG_WARNING, "Length information for a HT-codeblock is invalid\n");
1345 segment_passes = cblk->npasses % 3;
1346 if (segment_passes == 0) {
1347 // newpasses is a HT Cleanup pass; next segment has refinement passes
1348 segment_passes = 1;
1349 next_segment_passes = 2;
1350 if (segment_bytes == 1)
1351 av_log(s->avctx, AV_LOG_WARNING, "Length information for a HT-codeblock is invalid\n");
1352 } else {
1353 // newpasses = 1 means npasses is HT SigProp; 2 means newpasses is
1354 // HT MagRef pass
1355 segment_passes = newpasses > 1 ? 3 - segment_passes : 1;
1356 next_segment_passes = 1;
1357 bits_to_read = av_log2(segment_passes);
1358 }
1359 bits_to_read = (uint8_t) (bits_to_read + cblk->lblock);
1360 segment_bytes = get_bits(s, bits_to_read);
1361 // Write length information for HT Refinment segment
1362 cblk->pass_lengths[1] += segment_bytes;
1363
2/2
✓ Branch 0 taken 889354 times.
✓ Branch 1 taken 1634 times.
890988 } else if (!(cblk->modes & (JPEG2000_CBLK_TERMALL | JPEG2000_CBLK_BYPASS))) {
1364 // Common case for non-HT code-blocks; we have only one segment
1365 889354 bits_to_read = (uint8_t) cblk->lblock + av_log2((uint8_t) newpasses);
1366 889354 segment_bytes = get_bits(s, bits_to_read);
1367 889354 segment_passes = newpasses;
1368
1/2
✓ Branch 0 taken 1634 times.
✗ Branch 1 not taken.
1634 } else if (cblk->modes & JPEG2000_CBLK_TERMALL) {
1369 // RESTART MODE
1370 1634 bits_to_read = cblk->lblock;
1371 1634 segment_bytes = get_bits(s, bits_to_read);
1372 1634 segment_passes = 1;
1373 1634 next_segment_passes = 1;
1374 } else {
1375 // BYPASS MODE
1376 bypass_term_threshold = 10;
1377 if(bits_to_read != 0)
1378 av_log(s->avctx, AV_LOG_WARNING, "Length information for a codeblock is invalid\n");
1379 if (cblk->npasses < bypass_term_threshold) {
1380 // May have from 1 to 10 uninterrupted passes before 1st RAW SigProp
1381 segment_passes = bypass_term_threshold - cblk->npasses;
1382 if (segment_passes > newpasses)
1383 segment_passes = newpasses;
1384 while ((2 << bits_to_read) <= segment_passes)
1385 bits_to_read++;
1386 next_segment_passes = 2;
1387 } else if ((cblk->npasses - bypass_term_threshold) % 3 < 2) {
1388 // 0 means newpasses is a RAW SigProp; 1 means newpasses is a RAW MagRef pass
1389 segment_passes = newpasses > 1 ? 2 - (cblk->npasses - bypass_term_threshold) % 3 : 1;
1390 bits_to_read = av_log2(segment_passes);
1391 next_segment_passes = 1;
1392 } else {
1393 // newpasses is an isolated Cleanup pass that precedes a RAW SigProp pass
1394 segment_passes = 1;
1395 next_segment_passes = 2;
1396 }
1397 bits_to_read = (uint8_t) (bits_to_read + cblk->lblock);
1398 segment_bytes = get_bits(s, bits_to_read);
1399 }
1400 // Update cblk->npasses and write length information
1401 890998 cblk->npasses = (uint8_t) (cblk->npasses + segment_passes);
1402 890998 cblk->lengthinc[cblk->nb_lengthinc++] = segment_bytes;
1403
1404
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 890988 times.
✓ Branch 2 taken 10 times.
✗ Branch 3 not taken.
890998 if ((cblk->modes & JPEG2000_CTSY_HTJ2K_F) && cblk->ht_plhd == HT_PLHD_OFF) {
1405 10 newpasses -= (uint8_t) segment_passes;
1406
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
10 while (newpasses > 0) {
1407 segment_passes = newpasses > 1 ? next_segment_passes : 1;
1408 next_segment_passes = (uint8_t) (3 - next_segment_passes);
1409 bits_to_read = (uint8_t) (cblk->lblock + av_log2(segment_passes));
1410 segment_bytes = get_bits(s, bits_to_read);
1411 newpasses -= (uint8_t) (segment_passes);
1412 // This is a FAST Refinement pass
1413 // Write length information for HT Refinement segment
1414 cblk->pass_lengths[1] += segment_bytes;
1415 // Update cblk->npasses and write length information
1416 cblk->npasses = (uint8_t) (cblk->npasses + segment_passes);
1417 cblk->lengthinc[cblk->nb_lengthinc++] = segment_bytes;
1418 }
1419 } else {
1420 890988 newpasses -= (uint8_t) (segment_passes);
1421
2/2
✓ Branch 0 taken 2528 times.
✓ Branch 1 taken 890988 times.
893516 while (newpasses > 0) {
1422
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2528 times.
2528 if (bypass_term_threshold != 0) {
1423 segment_passes = newpasses > 1 ? next_segment_passes : 1;
1424 next_segment_passes = (uint8_t) (3 - next_segment_passes);
1425 bits_to_read = (uint8_t) (cblk->lblock + av_log2(segment_passes));
1426 } else {
1427
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2528 times.
2528 if ((cblk->modes & JPEG2000_CBLK_TERMALL) == 0)
1428 av_log(s->avctx, AV_LOG_WARNING, "Corrupted packet header is found.\n");
1429 2528 segment_passes = 1;
1430 2528 bits_to_read = cblk->lblock;
1431 }
1432 2528 segment_bytes = get_bits(s, bits_to_read);
1433 2528 newpasses -= (uint8_t) (segment_passes);
1434
1435 // Update cblk->npasses and write length information
1436 2528 cblk->npasses = (uint8_t) (cblk->npasses + segment_passes);
1437 2528 cblk->lengthinc[cblk->nb_lengthinc++] = segment_bytes;
1438 }
1439 }
1440
1441
2/2
✓ Branch 0 taken 893526 times.
✓ Branch 1 taken 890998 times.
1784524 for (int i = 0; i < cblk->nb_lengthinc; ++i)
1442 893526 tmp_length = (tmp_length < cblk->lengthinc[i]) ? cblk->lengthinc[i] : tmp_length;
1443
1444
2/2
✓ Branch 0 taken 822218 times.
✓ Branch 1 taken 68780 times.
890998 if (tmp_length > cblk->data_allocated) {
1445 822218 size_t new_size = FFMAX(2 * cblk->data_allocated, tmp_length);
1446 822218 void *new = av_realloc(cblk->data, new_size);
1447
1/2
✓ Branch 0 taken 822218 times.
✗ Branch 1 not taken.
822218 if (new) {
1448 822218 cblk->data = new;
1449 822218 cblk->data_allocated = new_size;
1450 }
1451 }
1452
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 890998 times.
890998 if (tmp_length > cblk->data_allocated) {
1453 avpriv_request_sample(s->avctx,
1454 "Block with lengthinc greater than %"SIZE_SPECIFIER"",
1455 cblk->data_allocated);
1456 return AVERROR_PATCHWELCOME;
1457 }
1458 } else {
1459 // This codeblock has no contribution to the current packet
1460 110566 continue;
1461 }
1462 }
1463 }
1464 83277 jpeg2000_flush(s);
1465
1466
2/2
✓ Branch 0 taken 25321 times.
✓ Branch 1 taken 57956 times.
83277 if (codsty->csty & JPEG2000_CSTY_EPH) {
1467
1/2
✓ Branch 1 taken 25321 times.
✗ Branch 2 not taken.
25321 if (bytestream2_peek_be16(&s->g) == JPEG2000_EPH)
1468 25321 bytestream2_skip(&s->g, 2);
1469 else
1470 av_log(s->avctx, AV_LOG_ERROR, "EPH marker not found. instead %X\n", bytestream2_peek_be32(&s->g));
1471 }
1472
1473 // Save state of stream
1474
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 83277 times.
83277 if (s->has_ppm) {
1475 tile->tile_part[*tp_index].header_tpg = s->g;
1476 select_stream(s, tile, tp_index, codsty);
1477
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 83277 times.
83277 } else if (tile->has_ppt) {
1478 tile->packed_headers_stream = s->g;
1479 select_stream(s, tile, tp_index, codsty);
1480 }
1481
2/2
✓ Branch 0 taken 220079 times.
✓ Branch 1 taken 83277 times.
303356 for (bandno = 0; bandno < rlevel->nbands; bandno++) {
1482 220079 Jpeg2000Band *band = rlevel->band + bandno;
1483 220079 Jpeg2000Prec *prec = band->prec + precno;
1484
1485 220079 nb_code_blocks = prec->nb_codeblocks_height * prec->nb_codeblocks_width;
1486
2/2
✓ Branch 0 taken 1008754 times.
✓ Branch 1 taken 220079 times.
1228833 for (cblkno = 0; cblkno < nb_code_blocks; cblkno++) {
1487 1008754 Jpeg2000Cblk *cblk = prec->cblk + cblkno;
1488
4/4
✓ Branch 0 taken 1007120 times.
✓ Branch 1 taken 1634 times.
✓ Branch 2 taken 117756 times.
✓ Branch 3 taken 889364 times.
1008754 if (!cblk->nb_terminationsinc && !cblk->lengthinc)
1489 117756 continue;
1490
2/2
✓ Branch 0 taken 893526 times.
✓ Branch 1 taken 890998 times.
1784524 for (cwsno = 0; cwsno < cblk->nb_lengthinc; cwsno ++) {
1491
2/2
✓ Branch 0 taken 849862 times.
✓ Branch 1 taken 43664 times.
893526 if (cblk->data_allocated < cblk->length + cblk->lengthinc[cwsno] + 4) {
1492 849862 size_t new_size = FFMAX(2*cblk->data_allocated, cblk->length + cblk->lengthinc[cwsno] + 4);
1493 849862 void *new = av_realloc(cblk->data, new_size);
1494
1/2
✓ Branch 0 taken 849862 times.
✗ Branch 1 not taken.
849862 if (new) {
1495 849862 cblk->data = new;
1496 849862 cblk->data_allocated = new_size;
1497 }
1498 }
1499
1/2
✓ Branch 1 taken 893526 times.
✗ Branch 2 not taken.
893526 if ( bytestream2_get_bytes_left(&s->g) < cblk->lengthinc[cwsno]
1500
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 893526 times.
893526 || cblk->data_allocated < cblk->length + cblk->lengthinc[cwsno] + 4
1501 ) {
1502 av_log(s->avctx, AV_LOG_ERROR,
1503 "Block length %"PRIu16" or lengthinc %d is too large, left %d\n",
1504 cblk->length, cblk->lengthinc[cwsno], bytestream2_get_bytes_left(&s->g));
1505 return AVERROR_INVALIDDATA;
1506 }
1507
1508 893526 bytestream2_get_bufferu(&s->g, cblk->data + cblk->length, cblk->lengthinc[cwsno]);
1509 893526 cblk->length += cblk->lengthinc[cwsno];
1510 893526 cblk->lengthinc[cwsno] = 0;
1511
2/2
✓ Branch 0 taken 4162 times.
✓ Branch 1 taken 889364 times.
893526 if (cblk->nb_terminationsinc) {
1512 4162 cblk->nb_terminationsinc--;
1513 4162 cblk->nb_terminations++;
1514 4162 cblk->data[cblk->length++] = 0xFF;
1515 4162 cblk->data[cblk->length++] = 0xFF;
1516 4162 cblk->data_start[cblk->nb_terminations] = cblk->length;
1517 }
1518 }
1519 890998 av_freep(&cblk->lengthinc);
1520 }
1521 }
1522 // Save state of stream
1523 83277 tile->tile_part[*tp_index].tpg = s->g;
1524 83277 return 0;
1525
1526 3915 skip_data:
1527
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3915 times.
3915 if (codsty->csty & JPEG2000_CSTY_EPH) {
1528 if (bytestream2_peek_be16(&s->g) == JPEG2000_EPH)
1529 bytestream2_skip(&s->g, 2);
1530 else
1531 av_log(s->avctx, AV_LOG_ERROR, "EPH marker not found. instead %X\n", bytestream2_peek_be32(&s->g));
1532 }
1533
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3915 times.
3915 if (s->has_ppm) {
1534 tile->tile_part[*tp_index].header_tpg = s->g;
1535 select_stream(s, tile, tp_index, codsty);
1536
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3915 times.
3915 } else if (tile->has_ppt) {
1537 tile->packed_headers_stream = s->g;
1538 select_stream(s, tile, tp_index, codsty);
1539 }
1540 3915 tile->tile_part[*tp_index].tpg = s->g;
1541 3915 return 0;
1542 }
1543
1544 2882 static int jpeg2000_decode_packets_po_iteration(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile,
1545 int RSpoc, int CSpoc,
1546 int LYEpoc, int REpoc, int CEpoc,
1547 int Ppoc, int *tp_index)
1548 {
1549 2882 int ret = 0;
1550 int layno, reslevelno, compno, precno, ok_reslevel;
1551 int x, y;
1552 int step_x, step_y;
1553
1554
4/6
✓ Branch 0 taken 259 times.
✓ Branch 1 taken 2619 times.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2882 switch (Ppoc) {
1555 259 case JPEG2000_PGOD_RLCP:
1556 259 av_log(s->avctx, AV_LOG_DEBUG, "Progression order RLCP\n");
1557 259 ok_reslevel = 1;
1558
3/4
✓ Branch 0 taken 1298 times.
✓ Branch 1 taken 259 times.
✓ Branch 2 taken 1298 times.
✗ Branch 3 not taken.
1557 for (reslevelno = RSpoc; ok_reslevel && reslevelno < REpoc; reslevelno++) {
1559 1298 ok_reslevel = 0;
1560
2/2
✓ Branch 0 taken 10385 times.
✓ Branch 1 taken 1298 times.
11683 for (layno = 0; layno < LYEpoc; layno++) {
1561
2/2
✓ Branch 0 taken 31105 times.
✓ Branch 1 taken 10385 times.
41490 for (compno = CSpoc; compno < CEpoc; compno++) {
1562 31105 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1563 31105 Jpeg2000QuantStyle *qntsty = tile->qntsty + compno;
1564
2/2
✓ Branch 0 taken 24920 times.
✓ Branch 1 taken 6185 times.
31105 if (reslevelno < codsty->nreslevels) {
1565 24920 Jpeg2000ResLevel *rlevel = tile->comp[compno].reslevel +
1566 reslevelno;
1567 24920 ok_reslevel = 1;
1568
2/2
✓ Branch 0 taken 26420 times.
✓ Branch 1 taken 24920 times.
51340 for (precno = 0; precno < rlevel->num_precincts_x * rlevel->num_precincts_y; precno++)
1569
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 26420 times.
26420 if ((ret = jpeg2000_decode_packet(s, tile, tp_index,
1570 codsty, rlevel,
1571 precno, layno,
1572 26420 qntsty->expn + (reslevelno ? 3 * (reslevelno - 1) + 1 : 0),
1573
2/2
✓ Branch 0 taken 20235 times.
✓ Branch 1 taken 6185 times.
26420 qntsty->nguardbits)) < 0)
1574 return ret;
1575 }
1576 }
1577 }
1578 }
1579 259 break;
1580
1581 2619 case JPEG2000_PGOD_LRCP:
1582 2619 av_log(s->avctx, AV_LOG_DEBUG, "Progression order LRCP\n");
1583
2/2
✓ Branch 0 taken 2698 times.
✓ Branch 1 taken 2619 times.
5317 for (layno = 0; layno < LYEpoc; layno++) {
1584 2698 ok_reslevel = 1;
1585
4/4
✓ Branch 0 taken 21155 times.
✓ Branch 1 taken 2690 times.
✓ Branch 2 taken 21147 times.
✓ Branch 3 taken 8 times.
23845 for (reslevelno = RSpoc; ok_reslevel && reslevelno < REpoc; reslevelno++) {
1586 21147 ok_reslevel = 0;
1587
2/2
✓ Branch 0 taken 68169 times.
✓ Branch 1 taken 21147 times.
89316 for (compno = CSpoc; compno < CEpoc; compno++) {
1588 68169 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1589 68169 Jpeg2000QuantStyle *qntsty = tile->qntsty + compno;
1590
2/2
✓ Branch 0 taken 59595 times.
✓ Branch 1 taken 8574 times.
68169 if (reslevelno < codsty->nreslevels) {
1591 59595 Jpeg2000ResLevel *rlevel = tile->comp[compno].reslevel +
1592 reslevelno;
1593 59595 ok_reslevel = 1;
1594
2/2
✓ Branch 0 taken 59595 times.
✓ Branch 1 taken 59595 times.
119190 for (precno = 0; precno < rlevel->num_precincts_x * rlevel->num_precincts_y; precno++)
1595
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 59595 times.
59595 if ((ret = jpeg2000_decode_packet(s, tile, tp_index,
1596 codsty, rlevel,
1597 precno, layno,
1598 59595 qntsty->expn + (reslevelno ? 3 * (reslevelno - 1) + 1 : 0),
1599
2/2
✓ Branch 0 taken 50997 times.
✓ Branch 1 taken 8598 times.
59595 qntsty->nguardbits)) < 0)
1600 return ret;
1601 }
1602 }
1603 }
1604 }
1605 2619 break;
1606
1607 3 case JPEG2000_PGOD_CPRL:
1608 3 av_log(s->avctx, AV_LOG_DEBUG, "Progression order CPRL\n");
1609
2/2
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 3 times.
12 for (compno = CSpoc; compno < CEpoc; compno++) {
1610 9 Jpeg2000Component *comp = tile->comp + compno;
1611 9 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1612 9 Jpeg2000QuantStyle *qntsty = tile->qntsty + compno;
1613 9 step_x = 32;
1614 9 step_y = 32;
1615
1616
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 9 times.
9 if (RSpoc >= FFMIN(codsty->nreslevels, REpoc))
1617 continue;
1618
1619
2/2
✓ Branch 0 taken 60 times.
✓ Branch 1 taken 9 times.
69 for (reslevelno = RSpoc; reslevelno < FFMIN(codsty->nreslevels, REpoc); reslevelno++) {
1620 60 uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; // ==> N_L - r
1621 60 Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
1622 60 step_x = FFMIN(step_x, rlevel->log2_prec_width + reducedresno);
1623 60 step_y = FFMIN(step_y, rlevel->log2_prec_height + reducedresno);
1624 }
1625
2/4
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 9 times.
9 if (step_x >= 31 || step_y >= 31){
1626 avpriv_request_sample(s->avctx, "CPRL with large step");
1627 return AVERROR_PATCHWELCOME;
1628 }
1629 9 step_x = 1<<step_x;
1630 9 step_y = 1<<step_y;
1631
1632
2/2
✓ Branch 0 taken 33 times.
✓ Branch 1 taken 9 times.
42 for (y = tile->coord[1][0]; y < tile->coord[1][1]; y = (y/step_y + 1)*step_y) {
1633
2/2
✓ Branch 0 taken 243 times.
✓ Branch 1 taken 33 times.
276 for (x = tile->coord[0][0]; x < tile->coord[0][1]; x = (x/step_x + 1)*step_x) {
1634
2/2
✓ Branch 0 taken 1464 times.
✓ Branch 1 taken 243 times.
1707 for (reslevelno = RSpoc; reslevelno < FFMIN(codsty->nreslevels, REpoc); reslevelno++) {
1635 unsigned prcx, prcy;
1636 1464 uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; // ==> N_L - r
1637 1464 Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
1638 1464 int xc = x / s->cdx[compno];
1639 1464 int yc = y / s->cdy[compno];
1640
1641
3/4
✓ Branch 0 taken 816 times.
✓ Branch 1 taken 648 times.
✓ Branch 2 taken 816 times.
✗ Branch 3 not taken.
1464 if (yc % (1LL << (rlevel->log2_prec_height + reducedresno)) && y != tile->coord[1][0]) //FIXME this is a subset of the check
1642 816 continue;
1643
1644
3/4
✓ Branch 0 taken 270 times.
✓ Branch 1 taken 378 times.
✓ Branch 2 taken 270 times.
✗ Branch 3 not taken.
648 if (xc % (1LL << (rlevel->log2_prec_width + reducedresno)) && x != tile->coord[0][0]) //FIXME this is a subset of the check
1645 270 continue;
1646
1647 // check if a precinct exists
1648 378 prcx = ff_jpeg2000_ceildivpow2(xc, reducedresno) >> rlevel->log2_prec_width;
1649 378 prcy = ff_jpeg2000_ceildivpow2(yc, reducedresno) >> rlevel->log2_prec_height;
1650 378 prcx -= ff_jpeg2000_ceildivpow2(comp->coord_o[0][0], reducedresno) >> rlevel->log2_prec_width;
1651 378 prcy -= ff_jpeg2000_ceildivpow2(comp->coord_o[1][0], reducedresno) >> rlevel->log2_prec_height;
1652
1653 378 precno = prcx + rlevel->num_precincts_x * prcy;
1654
1655
2/4
✓ Branch 0 taken 378 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 378 times.
378 if (prcx >= rlevel->num_precincts_x || prcy >= rlevel->num_precincts_y) {
1656 av_log(s->avctx, AV_LOG_WARNING, "prc %d %d outside limits %d %d\n",
1657 prcx, prcy, rlevel->num_precincts_x, rlevel->num_precincts_y);
1658 continue;
1659 }
1660
1661
2/2
✓ Branch 0 taken 1074 times.
✓ Branch 1 taken 378 times.
1452 for (layno = 0; layno < LYEpoc; layno++) {
1662
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1074 times.
1074 if ((ret = jpeg2000_decode_packet(s, tile, tp_index, codsty, rlevel,
1663 precno, layno,
1664 1074 qntsty->expn + (reslevelno ? 3 * (reslevelno - 1) + 1 : 0),
1665
2/2
✓ Branch 0 taken 978 times.
✓ Branch 1 taken 96 times.
1074 qntsty->nguardbits)) < 0)
1666 return ret;
1667 }
1668 }
1669 }
1670 }
1671 }
1672 3 break;
1673
1674 case JPEG2000_PGOD_RPCL:
1675 av_log(s->avctx, AV_LOG_WARNING, "Progression order RPCL\n");
1676 ok_reslevel = 1;
1677 for (reslevelno = RSpoc; ok_reslevel && reslevelno < REpoc; reslevelno++) {
1678 ok_reslevel = 0;
1679 step_x = 30;
1680 step_y = 30;
1681 for (compno = CSpoc; compno < CEpoc; compno++) {
1682 Jpeg2000Component *comp = tile->comp + compno;
1683 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1684
1685 if (reslevelno < codsty->nreslevels) {
1686 uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; // ==> N_L - r
1687 Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
1688 step_x = FFMIN(step_x, rlevel->log2_prec_width + reducedresno);
1689 step_y = FFMIN(step_y, rlevel->log2_prec_height + reducedresno);
1690 }
1691 }
1692 step_x = 1<<step_x;
1693 step_y = 1<<step_y;
1694
1695 for (y = tile->coord[1][0]; y < tile->coord[1][1]; y = (y/step_y + 1)*step_y) {
1696 for (x = tile->coord[0][0]; x < tile->coord[0][1]; x = (x/step_x + 1)*step_x) {
1697 for (compno = CSpoc; compno < CEpoc; compno++) {
1698 Jpeg2000Component *comp = tile->comp + compno;
1699 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1700 Jpeg2000QuantStyle *qntsty = tile->qntsty + compno;
1701 uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; // ==> N_L - r
1702 Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
1703 unsigned prcx, prcy;
1704 int trx0, try0;
1705
1706 if (!s->cdx[compno] || !s->cdy[compno])
1707 return AVERROR_INVALIDDATA;
1708
1709 if (reslevelno >= codsty->nreslevels)
1710 continue;
1711
1712 trx0 = ff_jpeg2000_ceildiv(tile->coord[0][0], (int64_t)s->cdx[compno] << reducedresno);
1713 try0 = ff_jpeg2000_ceildiv(tile->coord[1][0], (int64_t)s->cdy[compno] << reducedresno);
1714
1715 if (!(y % ((uint64_t)s->cdy[compno] << (rlevel->log2_prec_height + reducedresno)) == 0 ||
1716 (y == tile->coord[1][0] && ((int64_t)try0 << reducedresno) % (1ULL << (reducedresno + rlevel->log2_prec_height)))))
1717 continue;
1718
1719 if (!(x % ((uint64_t)s->cdx[compno] << (rlevel->log2_prec_width + reducedresno)) == 0 ||
1720 (x == tile->coord[0][0] && ((int64_t)trx0 << reducedresno) % (1ULL << (reducedresno + rlevel->log2_prec_width)))))
1721 continue;
1722
1723 // check if a precinct exists
1724 prcx = ff_jpeg2000_ceildiv(x, (int64_t)s->cdx[compno] << reducedresno) >> rlevel->log2_prec_width;
1725 prcy = ff_jpeg2000_ceildiv(y, (int64_t)s->cdy[compno] << reducedresno) >> rlevel->log2_prec_height;
1726 prcx -= ff_jpeg2000_ceildivpow2(comp->coord_o[0][0], reducedresno) >> rlevel->log2_prec_width;
1727 prcy -= ff_jpeg2000_ceildivpow2(comp->coord_o[1][0], reducedresno) >> rlevel->log2_prec_height;
1728
1729 precno = prcx + rlevel->num_precincts_x * prcy;
1730
1731 ok_reslevel = 1;
1732 if (prcx >= rlevel->num_precincts_x || prcy >= rlevel->num_precincts_y) {
1733 av_log(s->avctx, AV_LOG_WARNING, "prc %d %d outside limits %d %d\n",
1734 prcx, prcy, rlevel->num_precincts_x, rlevel->num_precincts_y);
1735 continue;
1736 }
1737
1738 for (layno = 0; layno < LYEpoc; layno++) {
1739 if ((ret = jpeg2000_decode_packet(s, tile, tp_index,
1740 codsty, rlevel,
1741 precno, layno,
1742 qntsty->expn + (reslevelno ? 3 * (reslevelno - 1) + 1 : 0),
1743 qntsty->nguardbits)) < 0)
1744 return ret;
1745 }
1746 }
1747 }
1748 }
1749 }
1750 break;
1751
1752 1 case JPEG2000_PGOD_PCRL:
1753 1 av_log(s->avctx, AV_LOG_WARNING, "Progression order PCRL\n");
1754 1 step_x = 32;
1755 1 step_y = 32;
1756
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 1 times.
5 for (compno = CSpoc; compno < CEpoc; compno++) {
1757 4 Jpeg2000Component *comp = tile->comp + compno;
1758 4 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1759
1760
2/2
✓ Branch 0 taken 25 times.
✓ Branch 1 taken 4 times.
29 for (reslevelno = RSpoc; reslevelno < FFMIN(codsty->nreslevels, REpoc); reslevelno++) {
1761 25 uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; // ==> N_L - r
1762 25 Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
1763 25 step_x = FFMIN(step_x, rlevel->log2_prec_width + reducedresno);
1764 25 step_y = FFMIN(step_y, rlevel->log2_prec_height + reducedresno);
1765 }
1766 }
1767
2/4
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
1 if (step_x >= 31 || step_y >= 31){
1768 avpriv_request_sample(s->avctx, "PCRL with large step");
1769 return AVERROR_PATCHWELCOME;
1770 }
1771 1 step_x = 1<<step_x;
1772 1 step_y = 1<<step_y;
1773
1774
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
2 for (y = tile->coord[1][0]; y < tile->coord[1][1]; y = (y/step_y + 1)*step_y) {
1775
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
2 for (x = tile->coord[0][0]; x < tile->coord[0][1]; x = (x/step_x + 1)*step_x) {
1776
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 1 times.
5 for (compno = CSpoc; compno < CEpoc; compno++) {
1777 4 Jpeg2000Component *comp = tile->comp + compno;
1778 4 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
1779 4 Jpeg2000QuantStyle *qntsty = tile->qntsty + compno;
1780
1781
2/4
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
4 if (!s->cdx[compno] || !s->cdy[compno])
1782 return AVERROR_INVALIDDATA;
1783
1784
2/2
✓ Branch 0 taken 25 times.
✓ Branch 1 taken 4 times.
29 for (reslevelno = RSpoc; reslevelno < FFMIN(codsty->nreslevels, REpoc); reslevelno++) {
1785 unsigned prcx, prcy;
1786 25 uint8_t reducedresno = codsty->nreslevels - 1 -reslevelno; // ==> N_L - r
1787 25 Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
1788 int trx0, try0;
1789
1790 25 trx0 = ff_jpeg2000_ceildiv(tile->coord[0][0], (int64_t)s->cdx[compno] << reducedresno);
1791 25 try0 = ff_jpeg2000_ceildiv(tile->coord[1][0], (int64_t)s->cdy[compno] << reducedresno);
1792
1793
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 25 times.
25 if (!(y % ((uint64_t)s->cdy[compno] << (rlevel->log2_prec_height + reducedresno)) == 0 ||
1794 (y == tile->coord[1][0] && ((int64_t)try0 << reducedresno) % (1ULL << (reducedresno + rlevel->log2_prec_height)))))
1795 continue;
1796
1797
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 25 times.
25 if (!(x % ((uint64_t)s->cdx[compno] << (rlevel->log2_prec_width + reducedresno)) == 0 ||
1798 (x == tile->coord[0][0] && ((int64_t)trx0 << reducedresno) % (1ULL << (reducedresno + rlevel->log2_prec_width)))))
1799 continue;
1800
1801 // check if a precinct exists
1802 25 prcx = ff_jpeg2000_ceildiv(x, (int64_t)s->cdx[compno] << reducedresno) >> rlevel->log2_prec_width;
1803 25 prcy = ff_jpeg2000_ceildiv(y, (int64_t)s->cdy[compno] << reducedresno) >> rlevel->log2_prec_height;
1804 25 prcx -= ff_jpeg2000_ceildivpow2(comp->coord_o[0][0], reducedresno) >> rlevel->log2_prec_width;
1805 25 prcy -= ff_jpeg2000_ceildivpow2(comp->coord_o[1][0], reducedresno) >> rlevel->log2_prec_height;
1806
1807 25 precno = prcx + rlevel->num_precincts_x * prcy;
1808
1809
2/4
✓ Branch 0 taken 25 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 25 times.
25 if (prcx >= rlevel->num_precincts_x || prcy >= rlevel->num_precincts_y) {
1810 av_log(s->avctx, AV_LOG_WARNING, "prc %d %d outside limits %d %d\n",
1811 prcx, prcy, rlevel->num_precincts_x, rlevel->num_precincts_y);
1812 continue;
1813 }
1814
1815
2/2
✓ Branch 0 taken 175 times.
✓ Branch 1 taken 25 times.
200 for (layno = 0; layno < LYEpoc; layno++) {
1816
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 175 times.
175 if ((ret = jpeg2000_decode_packet(s, tile, tp_index, codsty, rlevel,
1817 precno, layno,
1818 175 qntsty->expn + (reslevelno ? 3 * (reslevelno - 1) + 1 : 0),
1819
2/2
✓ Branch 0 taken 147 times.
✓ Branch 1 taken 28 times.
175 qntsty->nguardbits)) < 0)
1820 return ret;
1821 }
1822 }
1823 }
1824 }
1825 }
1826 1 break;
1827
1828 default:
1829 break;
1830 }
1831
1832 2882 return ret;
1833 }
1834
1835 2881 static int jpeg2000_decode_packets(Jpeg2000DecoderContext *s, Jpeg2000Tile *tile)
1836 {
1837 2881 int ret = AVERROR_BUG;
1838 int i;
1839 2881 int tp_index = 0;
1840
1841 2881 s->bit_index = 8;
1842
2/2
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 2872 times.
2881 if (tile->poc.nb_poc) {
1843
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 9 times.
19 for (i=0; i<tile->poc.nb_poc; i++) {
1844 10 Jpeg2000POCEntry *e = &tile->poc.poc[i];
1845 30 ret = jpeg2000_decode_packets_po_iteration(s, tile,
1846 10 e->RSpoc, e->CSpoc,
1847 10 FFMIN(e->LYEpoc, tile->codsty[0].nlayers),
1848 10 e->REpoc,
1849 10 FFMIN(e->CEpoc, s->ncomponents),
1850
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
10 e->Ppoc, &tp_index
1851 );
1852
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
10 if (ret < 0)
1853 return ret;
1854 }
1855 } else {
1856 2872 ret = jpeg2000_decode_packets_po_iteration(s, tile,
1857 0, 0,
1858 2872 tile->codsty[0].nlayers,
1859 33,
1860 s->ncomponents,
1861 2872 tile->codsty[0].prog_order,
1862 &tp_index
1863 );
1864 }
1865 /* EOC marker reached */
1866 2881 bytestream2_skip(&s->g, 2);
1867
1868 2881 return ret;
1869 }
1870
1871 /* TIER-1 routines */
1872 4025580 static void decode_sigpass(Jpeg2000T1Context *t1, int width, int height,
1873 int bpno, int bandno,
1874 int vert_causal_ctx_csty_symbol)
1875 {
1876 4025580 int mask = 3 << (bpno - 1), y0, x, y;
1877
1878
2/2
✓ Branch 0 taken 14247108 times.
✓ Branch 1 taken 4025580 times.
18272688 for (y0 = 0; y0 < height; y0 += 4)
1879
2/2
✓ Branch 0 taken 235531408 times.
✓ Branch 1 taken 14247108 times.
249778516 for (x = 0; x < width; x++)
1880
4/4
✓ Branch 0 taken 1115006649 times.
✓ Branch 1 taken 57650602 times.
✓ Branch 2 taken 937125843 times.
✓ Branch 3 taken 177880806 times.
1172657251 for (y = y0; y < height && y < y0 + 4; y++) {
1881 937125843 int flags_mask = -1;
1882
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 937125843 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
937125843 if (vert_causal_ctx_csty_symbol && y == y0 + 3)
1883 flags_mask &= ~(JPEG2000_T1_SIG_S | JPEG2000_T1_SIG_SW | JPEG2000_T1_SIG_SE | JPEG2000_T1_SGN_S);
1884
2/2
✓ Branch 0 taken 572729325 times.
✓ Branch 1 taken 364396518 times.
937125843 if ((t1->flags[(y+1) * t1->stride + x+1] & JPEG2000_T1_SIG_NB & flags_mask)
1885
2/2
✓ Branch 0 taken 255814734 times.
✓ Branch 1 taken 316914591 times.
572729325 && !(t1->flags[(y+1) * t1->stride + x+1] & (JPEG2000_T1_SIG | JPEG2000_T1_VIS))) {
1886
2/2
✓ Branch 2 taken 80968267 times.
✓ Branch 3 taken 174846467 times.
255814734 if (ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ff_jpeg2000_getsigctxno(t1->flags[(y+1) * t1->stride + x+1] & flags_mask, bandno))) {
1887 80968267 int xorbit, ctxno = ff_jpeg2000_getsgnctxno(t1->flags[(y+1) * t1->stride + x+1] & flags_mask, &xorbit);
1888
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 80968267 times.
80968267 if (t1->mqc.raw) {
1889 t1->data[(y) * t1->stride + x] |= ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ctxno) << 31;
1890 t1->data[(y) * t1->stride + x] |= mask;
1891 } else {
1892 80968267 t1->data[(y) * t1->stride + x] |= (ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ctxno) ^ xorbit) << 31;
1893 80968267 t1->data[(y) * t1->stride + x] |= mask;
1894 }
1895 80968267 ff_jpeg2000_set_significance(t1, x, y,
1896 80968267 t1->data[(y) * t1->stride + x] & INT32_MIN);
1897 }
1898 255814734 t1->flags[(y + 1) * t1->stride + x + 1] |= JPEG2000_T1_VIS;
1899 }
1900 }
1901 4025580 }
1902
1903 3688064 static void decode_refpass(Jpeg2000T1Context *t1, int width, int height,
1904 int bpno, int vert_causal_ctx_csty_symbol)
1905 {
1906 int phalf;
1907 int y0, x, y;
1908
1909 3688064 phalf = 1 << (bpno - 1);
1910
1911
2/2
✓ Branch 0 taken 13057007 times.
✓ Branch 1 taken 3688064 times.
16745071 for (y0 = 0; y0 < height; y0 += 4)
1912
2/2
✓ Branch 0 taken 217413142 times.
✓ Branch 1 taken 13057007 times.
230470149 for (x = 0; x < width; x++)
1913
4/4
✓ Branch 0 taken 1029719586 times.
✓ Branch 1 taken 52786672 times.
✓ Branch 2 taken 865093116 times.
✓ Branch 3 taken 164626470 times.
1082506258 for (y = y0; y < height && y < y0 + 4; y++)
1914
2/2
✓ Branch 0 taken 279193434 times.
✓ Branch 1 taken 585899682 times.
865093116 if ((t1->flags[(y + 1) * t1->stride + x + 1] & (JPEG2000_T1_SIG | JPEG2000_T1_VIS)) == JPEG2000_T1_SIG) {
1915 int flags_mask = (vert_causal_ctx_csty_symbol && y == y0 + 3) ?
1916
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 279193434 times.
279193434 ~(JPEG2000_T1_SIG_S | JPEG2000_T1_SIG_SW | JPEG2000_T1_SIG_SE | JPEG2000_T1_SGN_S) : -1;
1917 279193434 int ctxno = ff_jpeg2000_getrefctxno(t1->flags[(y + 1) * t1->stride + x + 1] & flags_mask);
1918 279193434 t1->data[(y) * t1->stride + x] |= phalf;
1919
2/2
✓ Branch 1 taken 104556358 times.
✓ Branch 2 taken 174637076 times.
279193434 if (ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ctxno))
1920 104556358 t1->data[(y) * t1->stride + x] |= phalf << 1;
1921 else {
1922 174637076 t1->data[(y) * t1->stride + x] &= ~(phalf << 1);
1923
1924 }
1925 279193434 t1->flags[(y + 1) * t1->stride + x + 1] |= JPEG2000_T1_REF;
1926 }
1927 3688064 }
1928
1929 4399286 static void decode_clnpass(const Jpeg2000DecoderContext *s, Jpeg2000T1Context *t1,
1930 int width, int height, int bpno, int bandno,
1931 int seg_symbols, int vert_causal_ctx_csty_symbol)
1932 {
1933 4399286 int mask = 3 << (bpno - 1), y0, x, y, runlen, dec;
1934
1935
2/2
✓ Branch 0 taken 15675400 times.
✓ Branch 1 taken 4399286 times.
20074686 for (y0 = 0; y0 < height; y0 += 4) {
1936
2/2
✓ Branch 0 taken 260469372 times.
✓ Branch 1 taken 15675400 times.
276144772 for (x = 0; x < width; x++) {
1937 260469372 int flags_mask = -1;
1938
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 260469372 times.
260469372 if (vert_causal_ctx_csty_symbol)
1939 flags_mask &= ~(JPEG2000_T1_SIG_S | JPEG2000_T1_SIG_SW | JPEG2000_T1_SIG_SE | JPEG2000_T1_SGN_S);
1940
2/2
✓ Branch 0 taken 258378523 times.
✓ Branch 1 taken 2090849 times.
260469372 if (y0 + 3 < height &&
1941
2/2
✓ Branch 0 taken 116152811 times.
✓ Branch 1 taken 142225712 times.
258378523 !((t1->flags[(y0 + 1) * t1->stride + x + 1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG)) ||
1942
2/2
✓ Branch 0 taken 107696334 times.
✓ Branch 1 taken 8456477 times.
116152811 (t1->flags[(y0 + 2) * t1->stride + x + 1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG)) ||
1943
2/2
✓ Branch 0 taken 100366742 times.
✓ Branch 1 taken 7329592 times.
107696334 (t1->flags[(y0 + 3) * t1->stride + x + 1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG)) ||
1944
2/2
✓ Branch 0 taken 96872806 times.
✓ Branch 1 taken 3493936 times.
100366742 (t1->flags[(y0 + 4) * t1->stride + x + 1] & (JPEG2000_T1_SIG_NB | JPEG2000_T1_VIS | JPEG2000_T1_SIG) & flags_mask))) {
1945
2/2
✓ Branch 1 taken 90566361 times.
✓ Branch 2 taken 6306445 times.
96872806 if (!ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_RL))
1946 90566361 continue;
1947 6306445 runlen = ff_mqc_decode(&t1->mqc,
1948 6306445 t1->mqc.cx_states + MQC_CX_UNI);
1949 12612890 runlen = (runlen << 1) | ff_mqc_decode(&t1->mqc,
1950 6306445 t1->mqc.cx_states +
1951 MQC_CX_UNI);
1952 6306445 dec = 1;
1953 } else {
1954 163596566 runlen = 0;
1955 163596566 dec = 0;
1956 }
1957
1958
4/4
✓ Branch 0 taken 666468227 times.
✓ Branch 1 taken 167812162 times.
✓ Branch 2 taken 664377378 times.
✓ Branch 3 taken 2090849 times.
834280389 for (y = y0 + runlen; y < y0 + 4 && y < height; y++) {
1959 664377378 int flags_mask = -1;
1960
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 664377378 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
664377378 if (vert_causal_ctx_csty_symbol && y == y0 + 3)
1961 flags_mask &= ~(JPEG2000_T1_SIG_S | JPEG2000_T1_SIG_SW | JPEG2000_T1_SIG_SE | JPEG2000_T1_SGN_S);
1962
2/2
✓ Branch 0 taken 658070933 times.
✓ Branch 1 taken 6306445 times.
664377378 if (!dec) {
1963
2/2
✓ Branch 0 taken 153966202 times.
✓ Branch 1 taken 504104731 times.
658070933 if (!(t1->flags[(y+1) * t1->stride + x+1] & (JPEG2000_T1_SIG | JPEG2000_T1_VIS))) {
1964 153966202 dec = ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ff_jpeg2000_getsigctxno(t1->flags[(y+1) * t1->stride + x+1] & flags_mask,
1965 bandno));
1966 }
1967 }
1968
2/2
✓ Branch 0 taken 24012194 times.
✓ Branch 1 taken 640365184 times.
664377378 if (dec) {
1969 int xorbit;
1970 24012194 int ctxno = ff_jpeg2000_getsgnctxno(t1->flags[(y + 1) * t1->stride + x + 1] & flags_mask,
1971 &xorbit);
1972 24012194 t1->data[(y) * t1->stride + x] |= (ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + ctxno) ^ xorbit) << 31;
1973 24012194 t1->data[(y) * t1->stride + x] |= mask;
1974 24012194 ff_jpeg2000_set_significance(t1, x, y, t1->data[(y) * t1->stride + x] & INT32_MIN);
1975 }
1976 664377378 dec = 0;
1977 664377378 t1->flags[(y + 1) * t1->stride + x + 1] &= ~JPEG2000_T1_VIS;
1978 }
1979 }
1980 }
1981
2/2
✓ Branch 0 taken 104 times.
✓ Branch 1 taken 4399182 times.
4399286 if (seg_symbols) {
1982 int val;
1983 104 val = ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_UNI);
1984 104 val = (val << 1) + ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_UNI);
1985 104 val = (val << 1) + ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_UNI);
1986 104 val = (val << 1) + ff_mqc_decode(&t1->mqc, t1->mqc.cx_states + MQC_CX_UNI);
1987
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 104 times.
104 if (val != 0xa)
1988 av_log(s->avctx, AV_LOG_ERROR,
1989 "Segmentation symbol value incorrect\n");
1990 }
1991 4399286 }
1992
1993 919837 static int decode_cblk(const Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *codsty,
1994 Jpeg2000T1Context *t1, Jpeg2000Cblk *cblk,
1995 int width, int height, int bandpos, uint8_t roi_shift, const int M_b)
1996 {
1997 919837 int passno = cblk->npasses, pass_t = 2, bpno = cblk->nonzerobits - 1 + 31 - M_b - 1 - roi_shift;
1998 919837 int pass_cnt = 0;
1999 919837 int vert_causal_ctx_csty_symbol = codsty->cblk_style & JPEG2000_CBLK_VSC;
2000 919837 int term_cnt = 0;
2001 int coder_type;
2002
2003
2/4
✓ Branch 0 taken 919837 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 919837 times.
919837 av_assert0(width <= 1024U && height <= 1024U);
2004
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 919837 times.
919837 av_assert0(width*height <= 4096);
2005
2006 919837 memset(t1->data, 0, t1->stride * height * sizeof(*t1->data));
2007
2008 /* If code-block contains no compressed data: nothing to do. */
2009
2/2
✓ Branch 0 taken 108213 times.
✓ Branch 1 taken 811624 times.
919837 if (!cblk->length)
2010 108213 return 0;
2011
2012 811624 memset(t1->flags, 0, t1->stride * (height + 2) * sizeof(*t1->flags));
2013
2014 811624 cblk->data[cblk->length] = 0xff;
2015 811624 cblk->data[cblk->length+1] = 0xff;
2016 811624 ff_mqc_initdec(&t1->mqc, cblk->data, 0, 1);
2017
2018
2/2
✓ Branch 0 taken 12112930 times.
✓ Branch 1 taken 811624 times.
12924554 while (passno--) {
2019
2/4
✓ Branch 0 taken 12112930 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 12112930 times.
12112930 if (bpno < 0 || bpno > 29) {
2020 av_log(s->avctx, AV_LOG_ERROR, "bpno became invalid\n");
2021 return AVERROR_INVALIDDATA;
2022 }
2023
3/4
✓ Branch 0 taken 4025580 times.
✓ Branch 1 taken 3688064 times.
✓ Branch 2 taken 4399286 times.
✗ Branch 3 not taken.
12112930 switch(pass_t) {
2024 4025580 case 0:
2025 4025580 decode_sigpass(t1, width, height, bpno + 1, bandpos,
2026 vert_causal_ctx_csty_symbol);
2027 4025580 break;
2028 3688064 case 1:
2029 3688064 decode_refpass(t1, width, height, bpno + 1, vert_causal_ctx_csty_symbol);
2030 3688064 break;
2031 4399286 case 2:
2032 av_assert2(!t1->mqc.raw);
2033 4399286 decode_clnpass(s, t1, width, height, bpno + 1, bandpos,
2034 4399286 codsty->cblk_style & JPEG2000_CBLK_SEGSYM,
2035 vert_causal_ctx_csty_symbol);
2036 4399286 break;
2037 }
2038
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 12112930 times.
12112930 if (codsty->cblk_style & JPEG2000_CBLK_RESET) // XXX no testcase for just this
2039 ff_mqc_init_contexts(&t1->mqc);
2040
2041
4/4
✓ Branch 0 taken 11301306 times.
✓ Branch 1 taken 811624 times.
✓ Branch 3 taken 3861 times.
✓ Branch 4 taken 11297445 times.
12112930 if (passno && (coder_type = needs_termination(codsty->cblk_style, pass_cnt))) {
2042
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3861 times.
3861 if (term_cnt >= cblk->nb_terminations) {
2043 av_log(s->avctx, AV_LOG_ERROR, "Missing needed termination \n");
2044 return AVERROR_INVALIDDATA;
2045 }
2046
2/4
✓ Branch 0 taken 3861 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 3861 times.
3861 if (FFABS(cblk->data + cblk->data_start[term_cnt + 1] - 2 - t1->mqc.bp) > 0) {
2047 av_log(s->avctx, AV_LOG_WARNING, "Mid mismatch %"PTRDIFF_SPECIFIER" in pass %d of %d\n",
2048 cblk->data + cblk->data_start[term_cnt + 1] - 2 - t1->mqc.bp,
2049 pass_cnt, cblk->npasses);
2050 }
2051
2052 3861 ff_mqc_initdec(&t1->mqc, cblk->data + cblk->data_start[++term_cnt], coder_type == 2, 0);
2053 }
2054
2055 12112930 pass_t++;
2056
2/2
✓ Branch 0 taken 4399286 times.
✓ Branch 1 taken 7713644 times.
12112930 if (pass_t == 3) {
2057 4399286 bpno--;
2058 4399286 pass_t = 0;
2059 }
2060 12112930 pass_cnt ++;
2061 }
2062
2063
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 811624 times.
811624 if (cblk->data + cblk->length - 2 > t1->mqc.bp) {
2064 av_log(s->avctx, AV_LOG_WARNING, "End mismatch %"PTRDIFF_SPECIFIER"\n",
2065 cblk->data + cblk->length - 2 - t1->mqc.bp);
2066 }
2067
2068
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 811624 times.
811624 if (cblk->data + cblk->length < t1->mqc.bp) {
2069 av_log(s->avctx, AV_LOG_WARNING, "Synthetic End of Stream Marker Read.\n");
2070 }
2071
2072 /* Reconstruct the sample values */
2073
2/2
✓ Branch 0 taken 11964899 times.
✓ Branch 1 taken 811624 times.
12776523 for (int y = 0; y < height; y++) {
2074
2/2
✓ Branch 0 taken 197511925 times.
✓ Branch 1 taken 11964899 times.
209476824 for (int x = 0; x < width; x++) {
2075 int32_t sign, n, val;
2076 197511925 const uint32_t mask = UINT32_MAX >> (M_b + 1); // bit mask for ROI detection
2077
2078 197511925 n = x + (y * t1->stride);
2079 197511925 val = t1->data[n];
2080 197511925 sign = val & INT32_MIN;
2081 197511925 val &= INT32_MAX;
2082 /* ROI shift, if necessary */
2083
4/4
✓ Branch 0 taken 32768 times.
✓ Branch 1 taken 197479157 times.
✓ Branch 2 taken 30464 times.
✓ Branch 3 taken 2304 times.
197511925 if (roi_shift && (((uint32_t)val & ~mask) == 0))
2084 30464 val <<= roi_shift;
2085 197511925 t1->data[n] = val | sign; /* NOTE: Binary point for reconstruction value is located in 31 - M_b */
2086 }
2087 }
2088 811624 return 1;
2089 }
2090
2091 /* TODO: Verify dequantization for lossless case
2092 * comp->data can be float or int
2093 * band->stepsize can be float or int
2094 * depending on the type of DWT transformation.
2095 * see ISO/IEC 15444-1:2002 A.6.1 */
2096
2097 /* Float dequantization of a codeblock.*/
2098 static void dequantization_float(int x, int y, Jpeg2000Cblk *cblk,
2099 Jpeg2000Component *comp,
2100 Jpeg2000T1Context *t1, Jpeg2000Band *band, const int M_b)
2101 {
2102 int i, j;
2103 int w = cblk->coord[0][1] - cblk->coord[0][0];
2104 const int downshift = 31 - M_b;
2105 float fscale = band->f_stepsize;
2106 fscale /= (float)(1 << downshift);
2107 for (j = 0; j < (cblk->coord[1][1] - cblk->coord[1][0]); ++j) {
2108 float *datap = &comp->f_data[(comp->coord[0][1] - comp->coord[0][0]) * (y + j) + x];
2109 int *src = t1->data + j*t1->stride;
2110 for (i = 0; i < w; ++i) {
2111 int val = src[i];
2112 if (val < 0) // Convert sign-magnitude to two's complement
2113 val = -(val & INT32_MAX);
2114 datap[i] = (float)val * fscale;
2115 }
2116 }
2117 }
2118
2119 /* Integer dequantization of a codeblock.*/
2120 606367 static void dequantization_int(int x, int y, Jpeg2000Cblk *cblk,
2121 Jpeg2000Component *comp,
2122 Jpeg2000T1Context *t1, Jpeg2000Band *band, const int M_b)
2123 {
2124 int i, j;
2125 606367 const int downshift = 31 - M_b;
2126 606367 int w = cblk->coord[0][1] - cblk->coord[0][0];
2127
2/2
✓ Branch 0 taken 8882373 times.
✓ Branch 1 taken 606367 times.
9488740 for (j = 0; j < (cblk->coord[1][1] - cblk->coord[1][0]); ++j) {
2128 8882373 int32_t *datap = &comp->i_data[(comp->coord[0][1] - comp->coord[0][0]) * (y + j) + x];
2129 8882373 int *src = t1->data + j*t1->stride;
2130
1/2
✓ Branch 0 taken 8882373 times.
✗ Branch 1 not taken.
8882373 if (band->i_stepsize == 32768) {
2131
2/2
✓ Branch 0 taken 145656327 times.
✓ Branch 1 taken 8882373 times.
154538700 for (i = 0; i < w; ++i) {
2132 145656327 int val = src[i];
2133
2/2
✓ Branch 0 taken 42982330 times.
✓ Branch 1 taken 102673997 times.
145656327 if (val < 0) // Convert sign-magnitude to two's complement
2134 42982330 val = -((val & INT32_MAX) >> downshift);
2135 else
2136 102673997 val >>= downshift;
2137 145656327 datap[i] = val;
2138 }
2139 } else {
2140 // This should be VERY uncommon
2141 for (i = 0; i < w; ++i) {
2142 int val = src[i];
2143 if (val < 0) // Convert sign-magnitude to two's complement
2144 val = -((val & INT32_MAX) >> downshift);
2145 else
2146 val >>= downshift;
2147 datap[i] = (val * (int64_t)band->i_stepsize) / 65536;
2148 }
2149 }
2150 }
2151 606367 }
2152
2153 205267 static void dequantization_int_97(int x, int y, Jpeg2000Cblk *cblk,
2154 Jpeg2000Component *comp,
2155 Jpeg2000T1Context *t1, Jpeg2000Band *band, const int M_b)
2156 {
2157 int i, j;
2158 205267 int w = cblk->coord[0][1] - cblk->coord[0][0];
2159 205267 float fscale = band->f_stepsize;
2160 205267 const int downshift = 31 - M_b;
2161 205267 const int PRESCALE = 6; // At least 6 is required to pass the conformance tests in ISO/IEC 15444-4
2162 int scale;
2163
2164 205267 fscale /= (float)(1 << downshift);
2165 205267 fscale *= (float)(1 << PRESCALE);
2166 205267 fscale *= (float)(1 << (16 + I_PRESHIFT));
2167 205267 scale = (int)(fscale + 0.5);
2168 205267 band->i_stepsize = scale;
2169
2/2
✓ Branch 0 taken 3082878 times.
✓ Branch 1 taken 205267 times.
3288145 for (j = 0; j < (cblk->coord[1][1] - cblk->coord[1][0]); ++j) {
2170 3082878 int32_t *datap = &comp->i_data[(comp->coord[0][1] - comp->coord[0][0]) * (y + j) + x];
2171 3082878 int *src = t1->data + j*t1->stride;
2172
2/2
✓ Branch 0 taken 51871982 times.
✓ Branch 1 taken 3082878 times.
54954860 for (i = 0; i < w; ++i) {
2173 51871982 int val = src[i];
2174
2/2
✓ Branch 0 taken 9002949 times.
✓ Branch 1 taken 42869033 times.
51871982 if (val < 0) // Convert sign-magnitude to two's complement
2175 9002949 val = -(val & INT32_MAX);
2176 // Shifting down to prevent overflow in dequantization
2177 51871982 val = (val + (1 << (PRESCALE - 1))) >> PRESCALE;
2178
2/2
✓ Branch 0 taken 9121136 times.
✓ Branch 1 taken 42750846 times.
51871982 datap[i] = RSHIFT(val * (int64_t)band->i_stepsize, 16);
2179 }
2180 }
2181 205267 }
2182
2183 8 static inline void mct_decode(const Jpeg2000DecoderContext *s, Jpeg2000Tile *tile)
2184 {
2185 8 int i, csize = 1;
2186 void *src[3];
2187
2188
2/2
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 8 times.
24 for (i = 1; i < 3; i++) {
2189
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 16 times.
16 if (tile->codsty[0].transform != tile->codsty[i].transform) {
2190 av_log(s->avctx, AV_LOG_ERROR, "Transforms mismatch, MCT not supported\n");
2191 return;
2192 }
2193
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 16 times.
16 if (memcmp(tile->comp[0].coord, tile->comp[i].coord, sizeof(tile->comp[0].coord))) {
2194 av_log(s->avctx, AV_LOG_ERROR, "Coords mismatch, MCT not supported\n");
2195 return;
2196 }
2197 }
2198
2199
2/2
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 8 times.
32 for (i = 0; i < 3; i++)
2200
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 24 times.
24 if (tile->codsty[0].transform == FF_DWT97)
2201 src[i] = tile->comp[i].f_data;
2202 else
2203 24 src[i] = tile->comp[i].i_data;
2204
2205
2/2
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 8 times.
24 for (i = 0; i < 2; i++)
2206 16 csize *= tile->comp[0].coord[i][1] - tile->comp[0].coord[i][0];
2207
2208 8 s->dsp.mct_decode[tile->codsty[0].transform](src[0], src[1], src[2], csize);
2209 }
2210
2211
2212 2881 static inline int tile_codeblocks(const Jpeg2000DecoderContext *s, Jpeg2000Tile *tile)
2213 {
2214 Jpeg2000T1Context t1;
2215
2216 int compno, reslevelno, bandno;
2217
2218 /* Loop on tile components */
2219
2/2
✓ Branch 0 taken 9264 times.
✓ Branch 1 taken 2881 times.
12145 for (compno = 0; compno < s->ncomponents; compno++) {
2220 9264 Jpeg2000Component *comp = tile->comp + compno;
2221 9264 Jpeg2000CodingStyle *codsty = tile->codsty + compno;
2222 9264 Jpeg2000QuantStyle *quantsty = tile->qntsty + compno;
2223
2224 9264 int coded = 0;
2225 9264 int subbandno = 0;
2226
2227 9264 t1.stride = (1<<codsty->log2_cblk_width) + 2;
2228
2229 /* Loop on resolution levels */
2230
2/2
✓ Branch 0 taken 62434 times.
✓ Branch 1 taken 9264 times.
71698 for (reslevelno = 0; reslevelno < codsty->nreslevels2decode; reslevelno++) {
2231 62434 Jpeg2000ResLevel *rlevel = comp->reslevel + reslevelno;
2232 /* Loop on bands */
2233
2/2
✓ Branch 0 taken 168774 times.
✓ Branch 1 taken 62434 times.
231208 for (bandno = 0; bandno < rlevel->nbands; bandno++, subbandno++) {
2234 int nb_precincts, precno;
2235 168774 Jpeg2000Band *band = rlevel->band + bandno;
2236 168774 int cblkno = 0, bandpos;
2237 /* See Rec. ITU-T T.800, Equation E-2 */
2238 168774 int M_b = quantsty->expn[subbandno] + quantsty->nguardbits - 1;
2239
2240 168774 bandpos = bandno + (reslevelno > 0);
2241
2242
2/2
✓ Branch 0 taken 168772 times.
✓ Branch 1 taken 2 times.
168774 if (band->coord[0][0] == band->coord[0][1] ||
2243
2/2
✓ Branch 0 taken 7800 times.
✓ Branch 1 taken 160972 times.
168772 band->coord[1][0] == band->coord[1][1])
2244 7802 continue;
2245
2246
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 160962 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
160972 if ((codsty->cblk_style & JPEG2000_CTSY_HTJ2K_F) && M_b >= 31) {
2247 avpriv_request_sample(s->avctx, "JPEG2000_CTSY_HTJ2K_F and M_b >= 31");
2248 return AVERROR_PATCHWELCOME;
2249 }
2250
2251 160972 nb_precincts = rlevel->num_precincts_x * rlevel->num_precincts_y;
2252 /* Loop on precincts */
2253
2/2
✓ Branch 0 taken 162151 times.
✓ Branch 1 taken 160972 times.
323123 for (precno = 0; precno < nb_precincts; precno++) {
2254 162151 Jpeg2000Prec *prec = band->prec + precno;
2255
2256 /* Loop on codeblocks */
2257 162151 for (cblkno = 0;
2258
2/2
✓ Branch 0 taken 919847 times.
✓ Branch 1 taken 162151 times.
1081998 cblkno < prec->nb_codeblocks_width * prec->nb_codeblocks_height;
2259 919847 cblkno++) {
2260 int x, y, ret;
2261
2262 919847 Jpeg2000Cblk *cblk = prec->cblk + cblkno;
2263
2264
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 919837 times.
919847 if (cblk->modes & JPEG2000_CTSY_HTJ2K_F)
2265 10 ret = ff_jpeg2000_decode_htj2k(s, codsty, &t1, cblk,
2266 10 cblk->coord[0][1] - cblk->coord[0][0],
2267 10 cblk->coord[1][1] - cblk->coord[1][0],
2268 10 M_b, comp->roi_shift);
2269 else
2270 919837 ret = decode_cblk(s, codsty, &t1, cblk,
2271 919837 cblk->coord[0][1] - cblk->coord[0][0],
2272 919837 cblk->coord[1][1] - cblk->coord[1][0],
2273 919837 bandpos, comp->roi_shift, M_b);
2274
2275
2/2
✓ Branch 0 taken 811634 times.
✓ Branch 1 taken 108213 times.
919847 if (ret)
2276 811634 coded = 1;
2277 else
2278 108213 continue;
2279 811634 x = cblk->coord[0][0] - band->coord[0][0];
2280 811634 y = cblk->coord[1][0] - band->coord[1][0];
2281
2282
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 811634 times.
811634 if (codsty->transform == FF_DWT97)
2283 dequantization_float(x, y, cblk, comp, &t1, band, M_b);
2284
2/2
✓ Branch 0 taken 205267 times.
✓ Branch 1 taken 606367 times.
811634 else if (codsty->transform == FF_DWT97_INT)
2285 205267 dequantization_int_97(x, y, cblk, comp, &t1, band, M_b);
2286 else
2287 606367 dequantization_int(x, y, cblk, comp, &t1, band, M_b);
2288 } /* end cblk */
2289 } /*end prec */
2290 } /* end band */
2291 } /* end reslevel */
2292
2293 /* inverse DWT */
2294
1/2
✓ Branch 0 taken 9264 times.
✗ Branch 1 not taken.
9264 if (coded)
2295
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 9264 times.
9264 ff_dwt_decode(&comp->dwt, codsty->transform == FF_DWT97 ? (void*)comp->f_data : (void*)comp->i_data);
2296
2297 } /*end comp */
2298 2881 return 0;
2299 }
2300
2301 #define WRITE_FRAME(D, PIXEL) \
2302 static inline void write_frame_ ## D(const Jpeg2000DecoderContext * s, Jpeg2000Tile * tile, \
2303 AVFrame * picture, int precision) \
2304 { \
2305 const AVPixFmtDescriptor *pixdesc = av_pix_fmt_desc_get(s->avctx->pix_fmt); \
2306 int planar = !!(pixdesc->flags & AV_PIX_FMT_FLAG_PLANAR); \
2307 int pixelsize = planar ? 1 : pixdesc->nb_components; \
2308 \
2309 int compno; \
2310 int x, y; \
2311 \
2312 for (compno = 0; compno < s->ncomponents; compno++) { \
2313 Jpeg2000Component *comp = tile->comp + compno; \
2314 Jpeg2000CodingStyle *codsty = tile->codsty + compno; \
2315 PIXEL *line; \
2316 float *datap = comp->f_data; \
2317 int32_t *i_datap = comp->i_data; \
2318 int cbps = s->cbps[compno]; \
2319 int w = tile->comp[compno].coord[0][1] - \
2320 ff_jpeg2000_ceildiv(s->image_offset_x, s->cdx[compno]); \
2321 int h = tile->comp[compno].coord[1][1] - \
2322 ff_jpeg2000_ceildiv(s->image_offset_y, s->cdy[compno]); \
2323 int plane = 0; \
2324 \
2325 if (planar) \
2326 plane = s->cdef[compno] ? s->cdef[compno]-1 : (s->ncomponents-1); \
2327 \
2328 y = tile->comp[compno].coord[1][0] - \
2329 ff_jpeg2000_ceildiv(s->image_offset_y, s->cdy[compno]); \
2330 line = (PIXEL *)picture->data[plane] + y * (picture->linesize[plane] / sizeof(PIXEL));\
2331 for (; y < h; y++) { \
2332 PIXEL *dst; \
2333 \
2334 x = tile->comp[compno].coord[0][0] - \
2335 ff_jpeg2000_ceildiv(s->image_offset_x, s->cdx[compno]); \
2336 dst = line + x * pixelsize + compno*!planar; \
2337 \
2338 if (codsty->transform == FF_DWT97) { \
2339 for (; x < w; x++) { \
2340 int val = lrintf(*datap) + (1 << (cbps - 1)); \
2341 /* DC level shift and clip see ISO 15444-1:2002 G.1.2 */ \
2342 val = av_clip(val, 0, (1 << cbps) - 1); \
2343 *dst = val << (precision - cbps); \
2344 datap++; \
2345 dst += pixelsize; \
2346 } \
2347 } else { \
2348 for (; x < w; x++) { \
2349 int val = *i_datap + (1 << (cbps - 1)); \
2350 /* DC level shift and clip see ISO 15444-1:2002 G.1.2 */ \
2351 val = av_clip(val, 0, (1 << cbps) - 1); \
2352 *dst = val << (precision - cbps); \
2353 i_datap++; \
2354 dst += pixelsize; \
2355 } \
2356 } \
2357 line += picture->linesize[plane] / sizeof(PIXEL); \
2358 } \
2359 } \
2360 \
2361 }
2362
2363
13/16
✓ Branch 1 taken 1321 times.
✓ Branch 2 taken 1 times.
✓ Branch 5 taken 4 times.
✓ Branch 6 taken 3933 times.
✓ Branch 7 taken 3 times.
✓ Branch 8 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 535220 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 95336791 times.
✓ Branch 16 taken 535220 times.
✓ Branch 17 taken 535220 times.
✓ Branch 18 taken 3937 times.
✓ Branch 19 taken 3937 times.
✓ Branch 20 taken 1322 times.
95877270 WRITE_FRAME(8, uint8_t)
2364
13/16
✓ Branch 1 taken 909 times.
✓ Branch 2 taken 650 times.
✓ Branch 5 taken 2600 times.
✓ Branch 6 taken 2727 times.
✓ Branch 7 taken 1950 times.
✓ Branch 8 taken 650 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 726092 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 133058168 times.
✓ Branch 16 taken 726092 times.
✓ Branch 17 taken 726092 times.
✓ Branch 18 taken 5327 times.
✓ Branch 19 taken 5327 times.
✓ Branch 20 taken 1559 times.
133791146 WRITE_FRAME(16, uint16_t)
2365
2366 #undef WRITE_FRAME
2367
2368 2881 static int jpeg2000_decode_tile(AVCodecContext *avctx, void *td,
2369 int jobnr, int threadnr)
2370 {
2371 2881 const Jpeg2000DecoderContext *s = avctx->priv_data;
2372 2881 AVFrame *picture = td;
2373 2881 Jpeg2000Tile *tile = s->tile + jobnr;
2374
2375 2881 int ret = tile_codeblocks(s, tile);
2376
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2881 times.
2881 if (ret < 0)
2377 return ret;
2378
2379 /* inverse MCT transformation */
2380
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 2873 times.
2881 if (tile->codsty[0].mct)
2381 8 mct_decode(s, tile);
2382
2383
2/2
✓ Branch 0 taken 1322 times.
✓ Branch 1 taken 1559 times.
2881 if (s->precision <= 8) {
2384 1322 write_frame_8(s, tile, picture, 8);
2385 } else {
2386 4675 int precision = picture->format == AV_PIX_FMT_XYZ12 ||
2387
2/2
✓ Branch 0 taken 650 times.
✓ Branch 1 taken 907 times.
1557 picture->format == AV_PIX_FMT_RGB48 ||
2388
1/2
✓ Branch 0 taken 650 times.
✗ Branch 1 not taken.
650 picture->format == AV_PIX_FMT_RGBA64 ||
2389
3/4
✓ Branch 0 taken 1557 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 650 times.
✗ Branch 3 not taken.
3116 picture->format == AV_PIX_FMT_GRAY16 ? 16 : s->precision;
2390
2391 1559 write_frame_16(s, tile, picture, precision);
2392 }
2393
2394 2881 return 0;
2395 }
2396
2397 851 static void jpeg2000_dec_cleanup(Jpeg2000DecoderContext *s)
2398 {
2399 int tileno, compno;
2400
2/2
✓ Branch 0 taken 3216 times.
✓ Branch 1 taken 851 times.
4067 for (tileno = 0; tileno < s->numXtiles * s->numYtiles; tileno++) {
2401
1/2
✓ Branch 0 taken 3216 times.
✗ Branch 1 not taken.
3216 if (s->tile[tileno].comp) {
2402
2/2
✓ Branch 0 taken 10255 times.
✓ Branch 1 taken 3216 times.
13471 for (compno = 0; compno < s->ncomponents; compno++) {
2403 10255 Jpeg2000Component *comp = s->tile[tileno].comp + compno;
2404 10255 Jpeg2000CodingStyle *codsty = s->tile[tileno].codsty + compno;
2405
2406 10255 ff_jpeg2000_cleanup(comp, codsty);
2407 }
2408 3216 av_freep(&s->tile[tileno].comp);
2409 3216 av_freep(&s->tile[tileno].packed_headers);
2410 3216 s->tile[tileno].packed_headers_size = 0;
2411 }
2412 }
2413 851 av_freep(&s->packed_headers);
2414 851 s->packed_headers_size = 0;
2415 851 memset(&s->packed_headers_stream, 0, sizeof(s->packed_headers_stream));
2416 851 av_freep(&s->tile);
2417 851 memset(s->codsty, 0, sizeof(s->codsty));
2418 851 memset(s->qntsty, 0, sizeof(s->qntsty));
2419 851 memset(s->properties, 0, sizeof(s->properties));
2420 851 memset(&s->poc , 0, sizeof(s->poc));
2421 851 s->numXtiles = s->numYtiles = 0;
2422 851 s->ncomponents = 0;
2423 851 }
2424
2425 851 static int jpeg2000_read_main_headers(Jpeg2000DecoderContext *s)
2426 {
2427 851 Jpeg2000CodingStyle *codsty = s->codsty;
2428 851 Jpeg2000QuantStyle *qntsty = s->qntsty;
2429 851 Jpeg2000POC *poc = &s->poc;
2430 851 uint8_t *properties = s->properties;
2431 851 uint8_t in_tile_headers = 0;
2432
2433 9671 for (;;) {
2434 10522 int len, ret = 0;
2435 uint16_t marker;
2436 int oldpos;
2437
2438
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 10522 times.
10522 if (bytestream2_get_bytes_left(&s->g) < 2) {
2439 av_log(s->avctx, AV_LOG_ERROR, "Missing EOC\n");
2440 break;
2441 }
2442
2443 10522 marker = bytestream2_get_be16u(&s->g);
2444 10522 oldpos = bytestream2_tell(&s->g);
2445
3/4
✓ Branch 0 taken 10522 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 10520 times.
10522 if (marker >= 0xFF30 && marker <= 0xFF3F)
2446 2 continue;
2447
2/2
✓ Branch 0 taken 3242 times.
✓ Branch 1 taken 7278 times.
10520 if (marker == JPEG2000_SOD) {
2448 Jpeg2000Tile *tile;
2449 Jpeg2000TilePart *tp;
2450
2451
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3242 times.
3242 if (!s->tile) {
2452 av_log(s->avctx, AV_LOG_ERROR, "Missing SIZ\n");
2453 return AVERROR_INVALIDDATA;
2454 }
2455
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3242 times.
3242 if (s->curtileno < 0) {
2456 av_log(s->avctx, AV_LOG_ERROR, "Missing SOT\n");
2457 return AVERROR_INVALIDDATA;
2458 }
2459
2460 3242 tile = s->tile + s->curtileno;
2461 3242 tp = tile->tile_part + tile->tp_idx;
2462
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3242 times.
3242 if (tp->tp_end < s->g.buffer) {
2463 av_log(s->avctx, AV_LOG_ERROR, "Invalid tpend\n");
2464 return AVERROR_INVALIDDATA;
2465 }
2466
2467
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3242 times.
3242 if (s->has_ppm) {
2468 uint32_t tp_header_size = bytestream2_get_be32(&s->packed_headers_stream);
2469 if (bytestream2_get_bytes_left(&s->packed_headers_stream) < tp_header_size)
2470 return AVERROR_INVALIDDATA;
2471 bytestream2_init(&tp->header_tpg, s->packed_headers_stream.buffer, tp_header_size);
2472 bytestream2_skip(&s->packed_headers_stream, tp_header_size);
2473 }
2474
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 3242 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
3242 if (tile->has_ppt && tile->tp_idx == 0) {
2475 bytestream2_init(&tile->packed_headers_stream, tile->packed_headers, tile->packed_headers_size);
2476 }
2477
2478 3242 bytestream2_init(&tp->tpg, s->g.buffer, tp->tp_end - s->g.buffer);
2479 3242 bytestream2_skip(&s->g, tp->tp_end - s->g.buffer);
2480
2481 3242 continue;
2482 }
2483
2/2
✓ Branch 0 taken 851 times.
✓ Branch 1 taken 6427 times.
7278 if (marker == JPEG2000_EOC)
2484 851 break;
2485
2486 6427 len = bytestream2_get_be16(&s->g);
2487
2/4
✓ Branch 0 taken 6427 times.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6427 times.
6427 if (len < 2 || bytestream2_get_bytes_left(&s->g) < len - 2) {
2488 if (s->avctx->strict_std_compliance >= FF_COMPLIANCE_STRICT) {
2489 av_log(s->avctx, AV_LOG_ERROR, "Invalid len %d left=%d\n", len, bytestream2_get_bytes_left(&s->g));
2490 return AVERROR_INVALIDDATA;
2491 }
2492 av_log(s->avctx, AV_LOG_WARNING, "Missing EOC Marker.\n");
2493 break;
2494 }
2495
2496
14/17
✓ Branch 0 taken 851 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 851 times.
✓ Branch 4 taken 4 times.
✓ Branch 5 taken 25 times.
✓ Branch 6 taken 851 times.
✓ Branch 7 taken 8 times.
✓ Branch 8 taken 3242 times.
✓ Branch 9 taken 44 times.
✓ Branch 10 taken 4 times.
✓ Branch 11 taken 11 times.
✓ Branch 12 taken 514 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
6427 switch (marker) {
2497 851 case JPEG2000_SIZ:
2498
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 851 times.
851 if (s->ncomponents) {
2499 av_log(s->avctx, AV_LOG_ERROR, "Duplicate SIZ\n");
2500 return AVERROR_INVALIDDATA;
2501 }
2502 851 ret = get_siz(s);
2503
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 851 times.
851 if (!s->tile)
2504 s->numXtiles = s->numYtiles = 0;
2505 851 break;
2506 2 case JPEG2000_CAP:
2507
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if (!s->ncomponents) {
2508 av_log(s->avctx, AV_LOG_ERROR, "CAP marker segment shall come after SIZ\n");
2509 return AVERROR_INVALIDDATA;
2510 }
2511 2 ret = get_cap(s, codsty);
2512 2 break;
2513 18 case JPEG2000_COC:
2514
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
18 if (in_tile_headers == 1 && s->isHT && (!s->Ccap15_b11)) {
2515 av_log(s->avctx, AV_LOG_ERROR,
2516 "COC marker found in a tile header but the codestream belongs to the HOMOGENEOUS set\n");
2517 return AVERROR_INVALIDDATA;
2518 }
2519 18 ret = get_coc(s, codsty, properties);
2520 18 break;
2521 851 case JPEG2000_COD:
2522
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 851 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
851 if (in_tile_headers == 1 && s->isHT && (!s->Ccap15_b11)) {
2523 av_log(s->avctx, AV_LOG_ERROR,
2524 "COD marker found in a tile header but the codestream belongs to the HOMOGENEOUS set\n");
2525 return AVERROR_INVALIDDATA;
2526 }
2527 851 ret = get_cod(s, codsty, properties);
2528 851 break;
2529 4 case JPEG2000_RGN:
2530
2/6
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
4 if (in_tile_headers == 1 && s->isHT && (!s->Ccap15_b11)) {
2531 av_log(s->avctx, AV_LOG_ERROR,
2532 "RGN marker found in a tile header but the codestream belongs to the HOMOGENEOUS set\n");
2533 return AVERROR_INVALIDDATA;
2534 }
2535 4 ret = get_rgn(s, len);
2536
2/4
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
4 if ((!s->Ccap15_b12) && s->isHT) {
2537 av_log(s->avctx, AV_LOG_ERROR, "RGN marker found but the codestream belongs to the RGNFREE set\n");
2538 return AVERROR_INVALIDDATA;
2539 }
2540 4 break;
2541 25 case JPEG2000_QCC:
2542
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 25 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
25 if (in_tile_headers == 1 && s->isHT && (!s->Ccap15_b11)) {
2543 av_log(s->avctx, AV_LOG_ERROR,
2544 "QCC marker found in a tile header but the codestream belongs to the HOMOGENEOUS set\n");
2545 return AVERROR_INVALIDDATA;
2546 }
2547 25 ret = get_qcc(s, len, qntsty, properties);
2548 25 break;
2549 851 case JPEG2000_QCD:
2550
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 851 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
851 if (in_tile_headers == 1 && s->isHT && (!s->Ccap15_b11)) {
2551 av_log(s->avctx, AV_LOG_ERROR,
2552 "QCD marker found in a tile header but the codestream belongs to the HOMOGENEOUS set\n");
2553 return AVERROR_INVALIDDATA;
2554 }
2555 851 ret = get_qcd(s, len, qntsty, properties);
2556 851 break;
2557 8 case JPEG2000_POC:
2558
3/6
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
8 if (in_tile_headers == 1 && s->isHT && (!s->Ccap15_b11)) {
2559 av_log(s->avctx, AV_LOG_ERROR,
2560 "POC marker found in a tile header but the codestream belongs to the HOMOGENEOUS set\n");
2561 return AVERROR_INVALIDDATA;
2562 }
2563 8 ret = get_poc(s, len, poc);
2564 8 break;
2565 3242 case JPEG2000_SOT:
2566
2/2
✓ Branch 0 taken 851 times.
✓ Branch 1 taken 2391 times.
3242 if (!in_tile_headers) {
2567 851 in_tile_headers = 1;
2568
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 851 times.
851 if (s->has_ppm) {
2569 bytestream2_init(&s->packed_headers_stream, s->packed_headers, s->packed_headers_size);
2570 }
2571 }
2572
1/2
✓ Branch 1 taken 3242 times.
✗ Branch 2 not taken.
3242 if (!(ret = get_sot(s, len))) {
2573 av_assert1(s->curtileno >= 0);
2574 3242 codsty = s->tile[s->curtileno].codsty;
2575 3242 qntsty = s->tile[s->curtileno].qntsty;
2576 3242 poc = &s->tile[s->curtileno].poc;
2577 3242 properties = s->tile[s->curtileno].properties;
2578 }
2579 3242 break;
2580 44 case JPEG2000_PLM:
2581 // the PLM marker is ignored
2582 case JPEG2000_COM:
2583 // the comment is ignored
2584 44 bytestream2_skip(&s->g, len - 2);
2585 44 break;
2586 4 case JPEG2000_CRG:
2587 4 ret = read_crg(s, len);
2588 4 break;
2589 11 case JPEG2000_TLM:
2590 // Tile-part lengths
2591 11 ret = get_tlm(s, len);
2592 11 break;
2593 514 case JPEG2000_PLT:
2594 // Packet length, tile-part header
2595 514 ret = get_plt(s, len);
2596 514 break;
2597 case JPEG2000_PPM:
2598 // Packed headers, main header
2599 if (in_tile_headers) {
2600 av_log(s->avctx, AV_LOG_ERROR, "PPM Marker can only be in Main header\n");
2601 return AVERROR_INVALIDDATA;
2602 }
2603 ret = get_ppm(s, len);
2604 break;
2605 case JPEG2000_PPT:
2606 // Packed headers, tile-part header
2607 if (s->has_ppm) {
2608 av_log(s->avctx, AV_LOG_ERROR,
2609 "Cannot have both PPT and PPM marker.\n");
2610 return AVERROR_INVALIDDATA;
2611 }
2612 if ((!s->Ccap15_b11) && s->isHT) {
2613 av_log(s->avctx, AV_LOG_ERROR, "PPT marker found but the codestream belongs to the HOMOGENEOUS set\n");
2614 return AVERROR_INVALIDDATA;
2615 }
2616 ret = get_ppt(s, len);
2617 break;
2618 2 case JPEG2000_CPF:
2619 // Corresponding profile marker
2620 2 ret = read_cpf(s, len);
2621 2 break;
2622 default:
2623 av_log(s->avctx, AV_LOG_ERROR,
2624 "unsupported marker 0x%.4"PRIX16" at pos 0x%X\n",
2625 marker, bytestream2_tell(&s->g) - 4);
2626 bytestream2_skip(&s->g, len - 2);
2627 break;
2628 }
2629
2/4
✓ Branch 1 taken 6427 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6427 times.
6427 if (bytestream2_tell(&s->g) - oldpos != len || ret) {
2630 av_log(s->avctx, AV_LOG_ERROR,
2631 "error during processing marker segment %.4"PRIx16"\n",
2632 marker);
2633 return ret ? ret : -1;
2634 }
2635 }
2636 851 return 0;
2637 }
2638
2639 /* Read bit stream packets --> T2 operation. */
2640 817 static int jpeg2000_read_bitstream_packets(Jpeg2000DecoderContext *s)
2641 {
2642 817 int ret = 0;
2643 int tileno;
2644
2645
2/2
✓ Branch 0 taken 2881 times.
✓ Branch 1 taken 817 times.
3698 for (tileno = 0; tileno < s->numXtiles * s->numYtiles; tileno++) {
2646 2881 Jpeg2000Tile *tile = s->tile + tileno;
2647
2648
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2881 times.
2881 if ((ret = init_tile(s, tileno)) < 0)
2649 return ret;
2650
2651
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2881 times.
2881 if ((ret = jpeg2000_decode_packets(s, tile)) < 0)
2652 return ret;
2653 }
2654
2655 817 return 0;
2656 }
2657
2658 817 static int jp2_find_codestream(Jpeg2000DecoderContext *s)
2659 {
2660 uint32_t atom_size, atom, atom_end;
2661 817 int search_range = 10;
2662
2663 817 while (search_range
2664
2/4
✓ Branch 0 taken 2452 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2452 times.
✗ Branch 3 not taken.
4904 &&
2665 2452 bytestream2_get_bytes_left(&s->g) >= 8) {
2666 2452 atom_size = bytestream2_get_be32u(&s->g);
2667 2452 atom = bytestream2_get_be32u(&s->g);
2668
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2452 times.
2452 if (atom_size == 1) {
2669 if (bytestream2_get_be32u(&s->g)) {
2670 avpriv_request_sample(s->avctx, "Huge atom");
2671 return 0;
2672 }
2673 atom_size = bytestream2_get_be32u(&s->g);
2674 if (atom_size < 16 || (int64_t)bytestream2_tell(&s->g) + atom_size - 16 > INT_MAX)
2675 return AVERROR_INVALIDDATA;
2676 atom_end = bytestream2_tell(&s->g) + atom_size - 16;
2677 } else {
2678
3/4
✓ Branch 0 taken 2451 times.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2451 times.
2452 if (atom_size < 8 || (int64_t)bytestream2_tell(&s->g) + atom_size - 8 > INT_MAX)
2679 1 return AVERROR_INVALIDDATA;
2680 2451 atom_end = bytestream2_tell(&s->g) + atom_size - 8;
2681 }
2682
2683
2/2
✓ Branch 0 taken 816 times.
✓ Branch 1 taken 1635 times.
2451 if (atom == JP2_CODESTREAM)
2684 816 return 1;
2685
2686
2/4
✓ Branch 1 taken 1635 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1635 times.
1635 if (bytestream2_get_bytes_left(&s->g) < atom_size || atom_end < atom_size)
2687 return 0;
2688
2689
3/4
✓ Branch 0 taken 817 times.
✓ Branch 1 taken 818 times.
✓ Branch 2 taken 817 times.
✗ Branch 3 not taken.
1635 if (atom == JP2_HEADER &&
2690 817 atom_size >= 16) {
2691 uint32_t atom2_size, atom2, atom2_end;
2692 do {
2693
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1634 times.
1634 if (bytestream2_get_bytes_left(&s->g) < 8)
2694 break;
2695 1634 atom2_size = bytestream2_get_be32u(&s->g);
2696 1634 atom2 = bytestream2_get_be32u(&s->g);
2697 1634 atom2_end = bytestream2_tell(&s->g) + atom2_size - 8;
2698
3/6
✓ Branch 0 taken 1634 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1634 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1634 times.
✗ Branch 5 not taken.
1634 if (atom2_size < 8 || atom2_end > atom_end || atom2_end < atom2_size)
2699 break;
2700 1634 atom2_size -= 8;
2701
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1634 times.
1634 if (atom2 == JP2_CODESTREAM) {
2702 return 1;
2703
3/4
✓ Branch 0 taken 817 times.
✓ Branch 1 taken 817 times.
✓ Branch 2 taken 817 times.
✗ Branch 3 not taken.
2451 } else if (atom2 == MKBETAG('c','o','l','r') && atom2_size >= 7) {
2704 817 int method = bytestream2_get_byteu(&s->g);
2705 817 bytestream2_skipu(&s->g, 2);
2706
1/2
✓ Branch 0 taken 817 times.
✗ Branch 1 not taken.
817 if (method == 1) {
2707 817 s->colour_space = bytestream2_get_be32u(&s->g);
2708 }
2709
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 817 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
817 } else if (atom2 == MKBETAG('p','c','l','r') && atom2_size >= 6) {
2710 int i, size, colour_count, colour_channels, colour_depth[3];
2711 colour_count = bytestream2_get_be16u(&s->g);
2712 colour_channels = bytestream2_get_byteu(&s->g);
2713 // FIXME: Do not ignore channel_sign
2714 colour_depth[0] = (bytestream2_get_byteu(&s->g) & 0x7f) + 1;
2715 colour_depth[1] = (bytestream2_get_byteu(&s->g) & 0x7f) + 1;
2716 colour_depth[2] = (bytestream2_get_byteu(&s->g) & 0x7f) + 1;
2717 size = (colour_depth[0] + 7 >> 3) * colour_count +
2718 (colour_depth[1] + 7 >> 3) * colour_count +
2719 (colour_depth[2] + 7 >> 3) * colour_count;
2720 if (colour_count > AVPALETTE_COUNT ||
2721 colour_channels != 3 ||
2722 colour_depth[0] > 16 ||
2723 colour_depth[1] > 16 ||
2724 colour_depth[2] > 16 ||
2725 atom2_size < size) {
2726 avpriv_request_sample(s->avctx, "Unknown palette");
2727 bytestream2_seek(&s->g, atom2_end, SEEK_SET);
2728 continue;
2729 }
2730 s->pal8 = 1;
2731 for (i = 0; i < colour_count; i++) {
2732 uint32_t r, g, b;
2733 if (colour_depth[0] <= 8) {
2734 r = bytestream2_get_byteu(&s->g) << 8 - colour_depth[0];
2735 r |= r >> colour_depth[0];
2736 } else {
2737 r = bytestream2_get_be16u(&s->g) >> colour_depth[0] - 8;
2738 }
2739 if (colour_depth[1] <= 8) {
2740 g = bytestream2_get_byteu(&s->g) << 8 - colour_depth[1];
2741 g |= g >> colour_depth[1];
2742 } else {
2743 g = bytestream2_get_be16u(&s->g) >> colour_depth[1] - 8;
2744 }
2745 if (colour_depth[2] <= 8) {
2746 b = bytestream2_get_byteu(&s->g) << 8 - colour_depth[2];
2747 b |= b >> colour_depth[2];
2748 } else {
2749 b = bytestream2_get_be16u(&s->g) >> colour_depth[2] - 8;
2750 }
2751 s->palette[i] = 0xffu << 24 | r << 16 | g << 8 | b;
2752 }
2753
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 817 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
817 } else if (atom2 == MKBETAG('c','d','e','f') && atom2_size >= 2) {
2754 int n = bytestream2_get_be16u(&s->g);
2755 for (; n>0; n--) {
2756 int cn = bytestream2_get_be16(&s->g);
2757 int av_unused typ = bytestream2_get_be16(&s->g);
2758 int asoc = bytestream2_get_be16(&s->g);
2759 if (cn < 4 && asoc < 4)
2760 s->cdef[cn] = asoc;
2761 }
2762
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 817 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
817 } else if (atom2 == MKBETAG('r','e','s',' ') && atom2_size >= 18) {
2763 int64_t vnum, vden, hnum, hden, vexp, hexp;
2764 uint32_t resx;
2765 bytestream2_skip(&s->g, 4);
2766 resx = bytestream2_get_be32u(&s->g);
2767 if (resx != MKBETAG('r','e','s','c') && resx != MKBETAG('r','e','s','d')) {
2768 bytestream2_seek(&s->g, atom2_end, SEEK_SET);
2769 continue;
2770 }
2771 vnum = bytestream2_get_be16u(&s->g);
2772 vden = bytestream2_get_be16u(&s->g);
2773 hnum = bytestream2_get_be16u(&s->g);
2774 hden = bytestream2_get_be16u(&s->g);
2775 vexp = bytestream2_get_byteu(&s->g);
2776 hexp = bytestream2_get_byteu(&s->g);
2777 if (!vnum || !vden || !hnum || !hden) {
2778 bytestream2_seek(&s->g, atom2_end, SEEK_SET);
2779 av_log(s->avctx, AV_LOG_WARNING, "RES box invalid\n");
2780 continue;
2781 }
2782 if (vexp > hexp) {
2783 vexp -= hexp;
2784 hexp = 0;
2785 } else {
2786 hexp -= vexp;
2787 vexp = 0;
2788 }
2789 if ( INT64_MAX / (hnum * vden) > pow(10, hexp)
2790 && INT64_MAX / (vnum * hden) > pow(10, vexp))
2791 av_reduce(&s->sar.den, &s->sar.num,
2792 hnum * vden * pow(10, hexp),
2793 vnum * hden * pow(10, vexp),
2794 INT32_MAX);
2795 }
2796 1634 bytestream2_seek(&s->g, atom2_end, SEEK_SET);
2797
2/2
✓ Branch 0 taken 817 times.
✓ Branch 1 taken 817 times.
1634 } while (atom_end - atom2_end >= 8);
2798 } else {
2799 818 search_range--;
2800 }
2801 1635 bytestream2_seek(&s->g, atom_end, SEEK_SET);
2802 }
2803
2804 return 0;
2805 }
2806
2807 67 static av_cold int jpeg2000_decode_init(AVCodecContext *avctx)
2808 {
2809 67 Jpeg2000DecoderContext *s = avctx->priv_data;
2810
2811
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 67 times.
67 if (avctx->lowres)
2812 av_log(avctx, AV_LOG_WARNING, "lowres is overriden by reduction_factor but set anyway\n");
2813
3/4
✓ Branch 0 taken 66 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 66 times.
✗ Branch 3 not taken.
67 if (!s->reduction_factor && avctx->lowres < JPEG2000_MAX_RESLEVELS) {
2814 66 s->reduction_factor = avctx->lowres;
2815 }
2816
3/4
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 66 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
67 if (avctx->lowres != s->reduction_factor && avctx->lowres)
2817 return AVERROR(EINVAL);
2818
2819 67 ff_jpeg2000dsp_init(&s->dsp);
2820 67 ff_jpeg2000_init_tier1_luts();
2821
2822 67 return 0;
2823 }
2824
2825 851 static int jpeg2000_decode_frame(AVCodecContext *avctx, AVFrame *picture,
2826 int *got_frame, AVPacket *avpkt)
2827 {
2828 851 Jpeg2000DecoderContext *s = avctx->priv_data;
2829 int ret;
2830
2831 851 s->avctx = avctx;
2832 851 bytestream2_init(&s->g, avpkt->data, avpkt->size);
2833 851 s->curtileno = -1;
2834 851 memset(s->cdef, -1, sizeof(s->cdef));
2835
2836
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 851 times.
851 if (bytestream2_get_bytes_left(&s->g) < 2) {
2837 ret = AVERROR_INVALIDDATA;
2838 goto end;
2839 }
2840
2841 // check if the image is in jp2 format
2842
3/4
✓ Branch 1 taken 851 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 817 times.
✓ Branch 4 taken 34 times.
1702 if (bytestream2_get_bytes_left(&s->g) >= 12 &&
2843
1/2
✓ Branch 1 taken 817 times.
✗ Branch 2 not taken.
1668 (bytestream2_get_be32u(&s->g) == 12) &&
2844
1/2
✓ Branch 1 taken 817 times.
✗ Branch 2 not taken.
1634 (bytestream2_get_be32u(&s->g) == JP2_SIG_TYPE) &&
2845 817 (bytestream2_get_be32u(&s->g) == JP2_SIG_VALUE)) {
2846
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 817 times.
817 if (!jp2_find_codestream(s)) {
2847 av_log(avctx, AV_LOG_ERROR,
2848 "Could not find Jpeg2000 codestream atom.\n");
2849 ret = AVERROR_INVALIDDATA;
2850 goto end;
2851 }
2852 } else {
2853 34 bytestream2_seek(&s->g, 0, SEEK_SET);
2854 }
2855
2856
2/4
✓ Branch 1 taken 851 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 851 times.
851 while (bytestream2_get_bytes_left(&s->g) >= 3 && bytestream2_peek_be16(&s->g) != JPEG2000_SOC)
2857 bytestream2_skip(&s->g, 1);
2858
2859
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 851 times.
851 if (bytestream2_get_be16u(&s->g) != JPEG2000_SOC) {
2860 av_log(avctx, AV_LOG_ERROR, "SOC marker not present\n");
2861 ret = AVERROR_INVALIDDATA;
2862 goto end;
2863 }
2864
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 851 times.
851 if (ret = jpeg2000_read_main_headers(s))
2865 goto end;
2866
2867
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 851 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
851 if (s->sar.num && s->sar.den)
2868 avctx->sample_aspect_ratio = s->sar;
2869 851 s->sar.num = s->sar.den = 0;
2870
2871
2/2
✓ Branch 0 taken 34 times.
✓ Branch 1 taken 817 times.
851 if (avctx->skip_frame >= AVDISCARD_ALL) {
2872 34 jpeg2000_dec_cleanup(s);
2873 34 return avpkt->size;
2874 }
2875
2876 /* get picture buffer */
2877
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 817 times.
817 if ((ret = ff_thread_get_buffer(avctx, picture, 0)) < 0)
2878 goto end;
2879
2880
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 817 times.
817 if (ret = jpeg2000_read_bitstream_packets(s))
2881 goto end;
2882
2883
2/2
✓ Branch 0 taken 820 times.
✓ Branch 1 taken 1 times.
821 for (int x = 0; x < s->ncomponents; x++) {
2884
2/2
✓ Branch 0 taken 816 times.
✓ Branch 1 taken 4 times.
820 if (s->cdef[x] < 0) {
2885
2/2
✓ Branch 0 taken 2630 times.
✓ Branch 1 taken 816 times.
3446 for (x = 0; x < s->ncomponents; x++) {
2886 2630 s->cdef[x] = x + 1;
2887 }
2888
2/2
✓ Branch 0 taken 200 times.
✓ Branch 1 taken 616 times.
816 if ((s->ncomponents & 1) == 0)
2889 200 s->cdef[s->ncomponents-1] = 0;
2890 816 break;
2891 }
2892 }
2893
2894 817 avctx->execute2(avctx, jpeg2000_decode_tile, picture, NULL, s->numXtiles * s->numYtiles);
2895
2896 817 jpeg2000_dec_cleanup(s);
2897
2898 817 *got_frame = 1;
2899
2900
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 817 times.
817 if (s->avctx->pix_fmt == AV_PIX_FMT_PAL8)
2901 memcpy(picture->data[1], s->palette, 256 * sizeof(uint32_t));
2902
2903 817 return bytestream2_tell(&s->g);
2904
2905 end:
2906 jpeg2000_dec_cleanup(s);
2907 return ret;
2908 }
2909
2910 #define OFFSET(x) offsetof(Jpeg2000DecoderContext, x)
2911 #define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM
2912
2913 static const AVOption options[] = {
2914 { "lowres", "Lower the decoding resolution by a power of two",
2915 OFFSET(reduction_factor), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, JPEG2000_MAX_RESLEVELS - 1, VD },
2916 { NULL },
2917 };
2918
2919 static const AVClass jpeg2000_class = {
2920 .class_name = "jpeg2000",
2921 .item_name = av_default_item_name,
2922 .option = options,
2923 .version = LIBAVUTIL_VERSION_INT,
2924 };
2925
2926 const FFCodec ff_jpeg2000_decoder = {
2927 .p.name = "jpeg2000",
2928 CODEC_LONG_NAME("JPEG 2000"),
2929 .p.type = AVMEDIA_TYPE_VIDEO,
2930 .p.id = AV_CODEC_ID_JPEG2000,
2931 .p.capabilities = AV_CODEC_CAP_SLICE_THREADS | AV_CODEC_CAP_FRAME_THREADS | AV_CODEC_CAP_DR1,
2932 .priv_data_size = sizeof(Jpeg2000DecoderContext),
2933 .init = jpeg2000_decode_init,
2934 FF_CODEC_DECODE_CB(jpeg2000_decode_frame),
2935 .p.priv_class = &jpeg2000_class,
2936 .p.max_lowres = 5,
2937 .p.profiles = NULL_IF_CONFIG_SMALL(ff_jpeg2000_profiles),
2938 .caps_internal = FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM,
2939 };
2940