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 |