FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/huffyuvdec.c
Date: 2025-03-08 20:38:41
Exec Total Coverage
Lines: 395 759 52.0%
Functions: 15 17 88.2%
Branches: 323 589 54.8%

Line Branch Exec Source
1 /*
2 * huffyuv decoder
3 *
4 * Copyright (c) 2002-2014 Michael Niedermayer <michaelni@gmx.at>
5 *
6 * see https://multimedia.cx/huffyuv.txt for a description of
7 * the algorithm used
8 *
9 * This file is part of FFmpeg.
10 *
11 * FFmpeg is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Lesser General Public
13 * License as published by the Free Software Foundation; either
14 * version 2.1 of the License, or (at your option) any later version.
15 *
16 * FFmpeg is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * Lesser General Public License for more details.
20 *
21 * You should have received a copy of the GNU Lesser General Public
22 * License along with FFmpeg; if not, write to the Free Software
23 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 *
25 * yuva, gray, 4:4:4, 4:1:1, 4:1:0 and >8 bit per sample support sponsored by NOA
26 */
27
28 /**
29 * @file
30 * huffyuv decoder
31 */
32
33 #define UNCHECKED_BITSTREAM_READER 1
34
35 #include "config_components.h"
36
37 #include "avcodec.h"
38 #include "bswapdsp.h"
39 #include "bytestream.h"
40 #include "codec_internal.h"
41 #include "get_bits.h"
42 #include "huffyuv.h"
43 #include "huffyuvdsp.h"
44 #include "lossless_videodsp.h"
45 #include "thread.h"
46 #include "libavutil/emms.h"
47 #include "libavutil/imgutils.h"
48 #include "libavutil/mem.h"
49 #include "libavutil/pixdesc.h"
50
51 #define VLC_BITS 12
52
53 typedef struct HYuvDecContext {
54 GetBitContext gb;
55 Predictor predictor;
56 int interlaced;
57 int decorrelate;
58 int bitstream_bpp;
59 int version;
60 int yuy2; //use yuy2 instead of 422P
61 int bgr32; //use bgr32 instead of bgr24
62 int bps;
63 int n; // 1<<bps
64 int vlc_n; // number of vlc codes (FFMIN(1<<bps, MAX_VLC_N))
65 int alpha;
66 int chroma;
67 int yuv;
68 int chroma_h_shift;
69 int chroma_v_shift;
70 int flags;
71 int context;
72 int last_slice_end;
73
74 union {
75 uint8_t *temp[3];
76 uint16_t *temp16[3];
77 };
78 uint8_t len[4][MAX_VLC_N];
79 uint32_t bits[4][MAX_VLC_N];
80 uint32_t pix_bgr_map[1<<VLC_BITS];
81 VLC vlc[8]; //Y,U,V,A,YY,YU,YV,AA
82 uint8_t *bitstream_buffer;
83 unsigned int bitstream_buffer_size;
84 BswapDSPContext bdsp;
85 HuffYUVDSPContext hdsp;
86 LLVidDSPContext llviddsp;
87 } HYuvDecContext;
88
89
90 static const uint8_t classic_shift_luma[] = {
91 34, 36, 35, 69, 135, 232, 9, 16, 10, 24, 11, 23, 12, 16, 13, 10,
92 14, 8, 15, 8, 16, 8, 17, 20, 16, 10, 207, 206, 205, 236, 11, 8,
93 10, 21, 9, 23, 8, 8, 199, 70, 69, 68,
94 };
95
96 static const uint8_t classic_shift_chroma[] = {
97 66, 36, 37, 38, 39, 40, 41, 75, 76, 77, 110, 239, 144, 81, 82, 83,
98 84, 85, 118, 183, 56, 57, 88, 89, 56, 89, 154, 57, 58, 57, 26, 141,
99 57, 56, 58, 57, 58, 57, 184, 119, 214, 245, 116, 83, 82, 49, 80, 79,
100 78, 77, 44, 75, 41, 40, 39, 38, 37, 36, 34,
101 };
102
103 static const unsigned char classic_add_luma[256] = {
104 3, 9, 5, 12, 10, 35, 32, 29, 27, 50, 48, 45, 44, 41, 39, 37,
105 73, 70, 68, 65, 64, 61, 58, 56, 53, 50, 49, 46, 44, 41, 38, 36,
106 68, 65, 63, 61, 58, 55, 53, 51, 48, 46, 45, 43, 41, 39, 38, 36,
107 35, 33, 32, 30, 29, 27, 26, 25, 48, 47, 46, 44, 43, 41, 40, 39,
108 37, 36, 35, 34, 32, 31, 30, 28, 27, 26, 24, 23, 22, 20, 19, 37,
109 35, 34, 33, 31, 30, 29, 27, 26, 24, 23, 21, 20, 18, 17, 15, 29,
110 27, 26, 24, 22, 21, 19, 17, 16, 14, 26, 25, 23, 21, 19, 18, 16,
111 15, 27, 25, 23, 21, 19, 17, 16, 14, 26, 25, 23, 21, 18, 17, 14,
112 12, 17, 19, 13, 4, 9, 2, 11, 1, 7, 8, 0, 16, 3, 14, 6,
113 12, 10, 5, 15, 18, 11, 10, 13, 15, 16, 19, 20, 22, 24, 27, 15,
114 18, 20, 22, 24, 26, 14, 17, 20, 22, 24, 27, 15, 18, 20, 23, 25,
115 28, 16, 19, 22, 25, 28, 32, 36, 21, 25, 29, 33, 38, 42, 45, 49,
116 28, 31, 34, 37, 40, 42, 44, 47, 49, 50, 52, 54, 56, 57, 59, 60,
117 62, 64, 66, 67, 69, 35, 37, 39, 40, 42, 43, 45, 47, 48, 51, 52,
118 54, 55, 57, 59, 60, 62, 63, 66, 67, 69, 71, 72, 38, 40, 42, 43,
119 46, 47, 49, 51, 26, 28, 30, 31, 33, 34, 18, 19, 11, 13, 7, 8,
120 };
121
122 static const unsigned char classic_add_chroma[256] = {
123 3, 1, 2, 2, 2, 2, 3, 3, 7, 5, 7, 5, 8, 6, 11, 9,
124 7, 13, 11, 10, 9, 8, 7, 5, 9, 7, 6, 4, 7, 5, 8, 7,
125 11, 8, 13, 11, 19, 15, 22, 23, 20, 33, 32, 28, 27, 29, 51, 77,
126 43, 45, 76, 81, 46, 82, 75, 55, 56, 144, 58, 80, 60, 74, 147, 63,
127 143, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
128 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 27, 30, 21, 22,
129 17, 14, 5, 6, 100, 54, 47, 50, 51, 53, 106, 107, 108, 109, 110, 111,
130 112, 113, 114, 115, 4, 117, 118, 92, 94, 121, 122, 3, 124, 103, 2, 1,
131 0, 129, 130, 131, 120, 119, 126, 125, 136, 137, 138, 139, 140, 141, 142, 134,
132 135, 132, 133, 104, 64, 101, 62, 57, 102, 95, 93, 59, 61, 28, 97, 96,
133 52, 49, 48, 29, 32, 25, 24, 46, 23, 98, 45, 44, 43, 20, 42, 41,
134 19, 18, 99, 40, 15, 39, 38, 16, 13, 12, 11, 37, 10, 9, 8, 36,
135 7, 128, 127, 105, 123, 116, 35, 34, 33, 145, 31, 79, 42, 146, 78, 26,
136 83, 48, 49, 50, 44, 47, 26, 31, 30, 18, 17, 19, 21, 24, 25, 13,
137 14, 16, 17, 18, 20, 21, 12, 14, 15, 9, 10, 6, 9, 6, 5, 8,
138 6, 12, 8, 10, 7, 9, 6, 4, 6, 2, 2, 3, 3, 3, 3, 2,
139 };
140
141 255 static int read_len_table(uint8_t *dst, GetByteContext *gb, int n)
142 {
143 int i, val, repeat;
144
145
2/2
✓ Branch 0 taken 9327 times.
✓ Branch 1 taken 255 times.
9582 for (i = 0; i < n;) {
146
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 9327 times.
9327 if (bytestream2_get_bytes_left(gb) <= 0)
147 goto error;
148 9327 repeat = bytestream2_peek_byteu(gb) >> 5;
149 9327 val = bytestream2_get_byteu(gb) & 0x1F;
150
2/2
✓ Branch 0 taken 5055 times.
✓ Branch 1 taken 4272 times.
9327 if (repeat == 0) {
151
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 5055 times.
5055 if (bytestream2_get_bytes_left(gb) <= 0)
152 goto error;
153 5055 repeat = bytestream2_get_byteu(gb);
154 }
155
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 9327 times.
9327 if (i + repeat > n)
156 goto error;
157
2/2
✓ Branch 0 taken 562944 times.
✓ Branch 1 taken 9327 times.
572271 while (repeat--)
158 562944 dst[i++] = val;
159 }
160 255 return 0;
161
162 error:
163 av_log(NULL, AV_LOG_ERROR, "Error reading huffman table\n");
164 return AVERROR_INVALIDDATA;
165 }
166
167 85 static int generate_joint_tables(HYuvDecContext *s)
168 {
169 int ret;
170 85 uint16_t *symbols = av_mallocz(5 << VLC_BITS);
171 uint16_t *bits;
172 uint8_t *len;
173
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 85 times.
85 if (!symbols)
174 return AVERROR(ENOMEM);
175 85 bits = symbols + (1 << VLC_BITS);
176 85 len = (uint8_t *)(bits + (1 << VLC_BITS));
177
178
3/4
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 69 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 16 times.
154 if (s->bitstream_bpp < 24 || s->version > 2) {
179 69 int count = 1 + s->alpha + 2 * s->chroma;
180 int p, i, y, u;
181
2/2
✓ Branch 0 taken 207 times.
✓ Branch 1 taken 69 times.
276 for (p = 0; p < count; p++) {
182
2/2
✓ Branch 0 taken 96 times.
✓ Branch 1 taken 111 times.
207 int p0 = s->version > 2 ? p : 0;
183
2/2
✓ Branch 0 taken 550656 times.
✓ Branch 1 taken 207 times.
550863 for (i = y = 0; y < s->vlc_n; y++) {
184 550656 int len0 = s->len[p0][y];
185 550656 int limit = VLC_BITS - len0;
186
3/4
✓ Branch 0 taken 13431 times.
✓ Branch 1 taken 537225 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 13431 times.
550656 if (limit <= 0 || !len0)
187 537225 continue;
188
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 13431 times.
13431 if ((sign_extend(y, 8) & (s->vlc_n-1)) != y)
189 continue;
190
2/2
✓ Branch 0 taken 35399424 times.
✓ Branch 1 taken 13431 times.
35412855 for (u = 0; u < s->vlc_n; u++) {
191 35399424 int len1 = s->len[p][u];
192
3/4
✓ Branch 0 taken 77271 times.
✓ Branch 1 taken 35322153 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 77271 times.
35399424 if (len1 > limit || !len1)
193 35322153 continue;
194
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 77271 times.
77271 if ((sign_extend(u, 8) & (s->vlc_n-1)) != u)
195 continue;
196
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 77271 times.
77271 av_assert0(i < (1 << VLC_BITS));
197 77271 len[i] = len0 + len1;
198 77271 bits[i] = (s->bits[p0][y] << len1) + s->bits[p][u];
199 77271 symbols[i] = (y << 8) + (u & 0xFF);
200 77271 i++;
201 }
202 }
203 207 ff_vlc_free(&s->vlc[4 + p]);
204
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 207 times.
207 if ((ret = ff_vlc_init_sparse(&s->vlc[4 + p], VLC_BITS, i, len, 1, 1,
205 bits, 2, 2, symbols, 2, 2, 0)) < 0)
206 goto out;
207 }
208 } else {
209 16 uint8_t (*map)[4] = (uint8_t(*)[4]) s->pix_bgr_map;
210 int i, b, g, r, code;
211 16 int p0 = s->decorrelate;
212 16 int p1 = !s->decorrelate;
213 /* Restrict the range to +/-16 because that's pretty much guaranteed
214 * to cover all the combinations that fit in 11 bits total, and it
215 * does not matter if we miss a few rare codes. */
216
2/2
✓ Branch 0 taken 512 times.
✓ Branch 1 taken 16 times.
528 for (i = 0, g = -16; g < 16; g++) {
217 512 int len0 = s->len[p0][g & 255];
218 512 int limit0 = VLC_BITS - len0;
219
2/4
✓ Branch 0 taken 512 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 512 times.
512 if (limit0 < 2 || !len0)
220 continue;
221
2/2
✓ Branch 0 taken 16384 times.
✓ Branch 1 taken 512 times.
16896 for (b = -16; b < 16; b++) {
222 16384 int len1 = s->len[p1][b & 255];
223 16384 int limit1 = limit0 - len1;
224
3/4
✓ Branch 0 taken 3728 times.
✓ Branch 1 taken 12656 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 3728 times.
16384 if (limit1 < 1 || !len1)
225 12656 continue;
226 3728 code = (s->bits[p0][g & 255] << len1) + s->bits[p1][b & 255];
227
2/2
✓ Branch 0 taken 119296 times.
✓ Branch 1 taken 3728 times.
123024 for (r = -16; r < 16; r++) {
228 119296 int len2 = s->len[2][r & 255];
229
3/4
✓ Branch 0 taken 10928 times.
✓ Branch 1 taken 108368 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10928 times.
119296 if (len2 > limit1 || !len2)
230 108368 continue;
231
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10928 times.
10928 av_assert0(i < (1 << VLC_BITS));
232 10928 len[i] = len0 + len1 + len2;
233 10928 bits[i] = (code << len2) + s->bits[2][r & 255];
234
1/2
✓ Branch 0 taken 10928 times.
✗ Branch 1 not taken.
10928 if (s->decorrelate) {
235 10928 map[i][G] = g;
236 10928 map[i][B] = g + b;
237 10928 map[i][R] = g + r;
238 } else {
239 map[i][B] = g;
240 map[i][G] = b;
241 map[i][R] = r;
242 }
243 10928 i++;
244 }
245 }
246 }
247 16 ff_vlc_free(&s->vlc[4]);
248
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 16 times.
16 if ((ret = vlc_init(&s->vlc[4], VLC_BITS, i, len, 1, 1,
249 bits, 2, 2, 0)) < 0)
250 goto out;
251 }
252 85 ret = 0;
253 85 out:
254 85 av_freep(&symbols);
255 85 return ret;
256 }
257
258 85 static int read_huffman_tables(HYuvDecContext *s, const uint8_t *src, int length)
259 {
260 GetByteContext gb;
261 int i, ret;
262 85 int count = 3;
263
264 85 bytestream2_init(&gb, src, length);
265
266
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 53 times.
85 if (s->version > 2)
267 32 count = 1 + s->alpha + 2*s->chroma;
268
269
2/2
✓ Branch 0 taken 255 times.
✓ Branch 1 taken 85 times.
340 for (i = 0; i < count; i++) {
270
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 255 times.
255 if ((ret = read_len_table(s->len[i], &gb, s->vlc_n)) < 0)
271 return ret;
272
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 255 times.
255 if ((ret = ff_huffyuv_generate_bits_table(s->bits[i], s->len[i], s->vlc_n)) < 0)
273 return ret;
274 255 ff_vlc_free(&s->vlc[i]);
275
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 255 times.
255 if ((ret = vlc_init(&s->vlc[i], VLC_BITS, s->vlc_n, s->len[i], 1, 1,
276 s->bits[i], 4, 4, 0)) < 0)
277 return ret;
278 }
279
280
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 85 times.
85 if ((ret = generate_joint_tables(s)) < 0)
281 return ret;
282
283 85 return bytestream2_tell(&gb);
284 }
285
286 static int read_old_huffman_tables(HYuvDecContext *s)
287 {
288 GetByteContext gb;
289 int i, ret;
290
291 bytestream2_init(&gb, classic_shift_luma,
292 sizeof(classic_shift_luma));
293 ret = read_len_table(s->len[0], &gb, 256);
294 av_assert1(ret >= 0);
295
296 bytestream2_init(&gb, classic_shift_chroma,
297 sizeof(classic_shift_chroma));
298 ret = read_len_table(s->len[1], &gb, 256);
299 av_assert1(ret >= 0);
300
301 for (i = 0; i < 256; i++)
302 s->bits[0][i] = classic_add_luma[i];
303 for (i = 0; i < 256; i++)
304 s->bits[1][i] = classic_add_chroma[i];
305
306 if (s->bitstream_bpp >= 24) {
307 memcpy(s->bits[1], s->bits[0], 256 * sizeof(uint32_t));
308 memcpy(s->len[1], s->len[0], 256 * sizeof(uint8_t));
309 }
310 memcpy(s->bits[2], s->bits[1], 256 * sizeof(uint32_t));
311 memcpy(s->len[2], s->len[1], 256 * sizeof(uint8_t));
312
313 for (i = 0; i < 4; i++) {
314 ff_vlc_free(&s->vlc[i]);
315 if ((ret = vlc_init(&s->vlc[i], VLC_BITS, 256, s->len[i], 1, 1,
316 s->bits[i], 4, 4, 0)) < 0)
317 return ret;
318 }
319
320 if ((ret = generate_joint_tables(s)) < 0)
321 return ret;
322
323 return 0;
324 }
325
326 85 static av_cold int decode_end(AVCodecContext *avctx)
327 {
328 85 HYuvDecContext *s = avctx->priv_data;
329 int i;
330
331
2/2
✓ Branch 0 taken 255 times.
✓ Branch 1 taken 85 times.
340 for (int i = 0; i < 3; i++)
332 255 av_freep(&s->temp[i]);
333
334 85 av_freep(&s->bitstream_buffer);
335
336
2/2
✓ Branch 0 taken 680 times.
✓ Branch 1 taken 85 times.
765 for (i = 0; i < 8; i++)
337 680 ff_vlc_free(&s->vlc[i]);
338
339 85 return 0;
340 }
341
342 85 static av_cold int decode_init(AVCodecContext *avctx)
343 {
344 85 HYuvDecContext *s = avctx->priv_data;
345 int ret;
346
347 85 ret = av_image_check_size(avctx->width, avctx->height, 0, avctx);
348
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 85 times.
85 if (ret < 0)
349 return ret;
350
351 85 s->flags = avctx->flags;
352
353 85 ff_bswapdsp_init(&s->bdsp);
354 85 ff_huffyuvdsp_init(&s->hdsp, avctx->pix_fmt);
355 85 ff_llviddsp_init(&s->llviddsp);
356
357 85 s->interlaced = avctx->height > 288;
358 85 s->bgr32 = 1;
359
360
1/2
✓ Branch 0 taken 85 times.
✗ Branch 1 not taken.
85 if (avctx->extradata_size) {
361
2/2
✓ Branch 0 taken 28 times.
✓ Branch 1 taken 57 times.
85 if ((avctx->bits_per_coded_sample & 7) &&
362
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 28 times.
28 avctx->bits_per_coded_sample != 12)
363 s->version = 1; // do such files exist at all?
364
3/4
✓ Branch 0 taken 85 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 53 times.
✓ Branch 3 taken 32 times.
85 else if (avctx->extradata_size > 3 && avctx->extradata[3] == 0)
365 53 s->version = 2;
366 else
367 32 s->version = 3;
368 } else
369 s->version = 0;
370
371 85 s->bps = 8;
372 85 s->n = 1<<s->bps;
373 85 s->vlc_n = FFMIN(s->n, MAX_VLC_N);
374 85 s->chroma = 1;
375
1/2
✓ Branch 0 taken 85 times.
✗ Branch 1 not taken.
85 if (s->version >= 2) {
376 int method, interlace;
377
378
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 85 times.
85 if (avctx->extradata_size < 4)
379 return AVERROR_INVALIDDATA;
380
381 85 method = avctx->extradata[0];
382 85 s->decorrelate = method & 64 ? 1 : 0;
383 85 s->predictor = method & 63;
384
2/2
✓ Branch 0 taken 53 times.
✓ Branch 1 taken 32 times.
85 if (s->version == 2) {
385 53 s->bitstream_bpp = avctx->extradata[1];
386
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 53 times.
53 if (s->bitstream_bpp == 0)
387 s->bitstream_bpp = avctx->bits_per_coded_sample & ~7;
388 } else {
389 32 s->bps = (avctx->extradata[1] >> 4) + 1;
390 32 s->n = 1<<s->bps;
391 32 s->vlc_n = FFMIN(s->n, MAX_VLC_N);
392 32 s->chroma_h_shift = avctx->extradata[1] & 3;
393 32 s->chroma_v_shift = (avctx->extradata[1] >> 2) & 3;
394 32 s->yuv = !!(avctx->extradata[2] & 1);
395 32 s->chroma= !!(avctx->extradata[2] & 3);
396 32 s->alpha = !!(avctx->extradata[2] & 4);
397 }
398 85 interlace = (avctx->extradata[2] & 0x30) >> 4;
399
2/4
✓ Branch 0 taken 85 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 85 times.
85 s->interlaced = (interlace == 1) ? 1 : (interlace == 2) ? 0 : s->interlaced;
400 85 s->context = avctx->extradata[2] & 0x40 ? 1 : 0;
401
402
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 85 times.
85 if ((ret = read_huffman_tables(s, avctx->extradata + 4,
403 85 avctx->extradata_size - 4)) < 0)
404 return ret;
405 } else {
406 switch (avctx->bits_per_coded_sample & 7) {
407 case 1:
408 s->predictor = LEFT;
409 s->decorrelate = 0;
410 break;
411 case 2:
412 s->predictor = LEFT;
413 s->decorrelate = 1;
414 break;
415 case 3:
416 s->predictor = PLANE;
417 s->decorrelate = avctx->bits_per_coded_sample >= 24;
418 break;
419 case 4:
420 s->predictor = MEDIAN;
421 s->decorrelate = 0;
422 break;
423 default:
424 s->predictor = LEFT; // OLD
425 s->decorrelate = 0;
426 break;
427 }
428 s->bitstream_bpp = avctx->bits_per_coded_sample & ~7;
429 s->context = 0;
430
431 if ((ret = read_old_huffman_tables(s)) < 0)
432 return ret;
433 }
434
435
2/2
✓ Branch 0 taken 53 times.
✓ Branch 1 taken 32 times.
85 if (s->version <= 2) {
436
4/5
✓ Branch 0 taken 28 times.
✓ Branch 1 taken 9 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
53 switch (s->bitstream_bpp) {
437 28 case 12:
438 28 avctx->pix_fmt = AV_PIX_FMT_YUV420P;
439 28 s->yuv = 1;
440 28 break;
441 9 case 16:
442
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 9 times.
9 if (s->yuy2)
443 avctx->pix_fmt = AV_PIX_FMT_YUYV422;
444 else
445 9 avctx->pix_fmt = AV_PIX_FMT_YUV422P;
446 9 s->yuv = 1;
447 9 break;
448 8 case 24:
449
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
8 if (s->bgr32)
450 8 avctx->pix_fmt = AV_PIX_FMT_0RGB32;
451 else
452 avctx->pix_fmt = AV_PIX_FMT_BGR24;
453 8 break;
454 8 case 32:
455
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8 times.
8 av_assert0(s->bgr32);
456 8 avctx->pix_fmt = AV_PIX_FMT_RGB32;
457 8 s->alpha = 1;
458 8 break;
459 default:
460 return AVERROR_INVALIDDATA;
461 }
462 53 av_pix_fmt_get_chroma_sub_sample(avctx->pix_fmt,
463 &s->chroma_h_shift,
464 &s->chroma_v_shift);
465 } else {
466
4/43
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 8 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 8 times.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 8 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 8 times.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
32 switch ( (s->chroma<<10) | (s->yuv<<9) | (s->alpha<<8) | ((s->bps-1)<<4) | s->chroma_h_shift | (s->chroma_v_shift<<2)) {
467 case 0x070:
468 avctx->pix_fmt = AV_PIX_FMT_GRAY8;
469 break;
470 case 0x0F0:
471 avctx->pix_fmt = AV_PIX_FMT_GRAY16;
472 break;
473 case 0x470:
474 avctx->pix_fmt = AV_PIX_FMT_GBRP;
475 break;
476 case 0x480:
477 avctx->pix_fmt = AV_PIX_FMT_GBRP9;
478 break;
479 case 0x490:
480 avctx->pix_fmt = AV_PIX_FMT_GBRP10;
481 break;
482 case 0x4B0:
483 avctx->pix_fmt = AV_PIX_FMT_GBRP12;
484 break;
485 case 0x4D0:
486 avctx->pix_fmt = AV_PIX_FMT_GBRP14;
487 break;
488 case 0x4F0:
489 avctx->pix_fmt = AV_PIX_FMT_GBRP16;
490 break;
491 case 0x570:
492 avctx->pix_fmt = AV_PIX_FMT_GBRAP;
493 break;
494 8 case 0x670:
495 8 avctx->pix_fmt = AV_PIX_FMT_YUV444P;
496 8 break;
497 case 0x680:
498 avctx->pix_fmt = AV_PIX_FMT_YUV444P9;
499 break;
500 case 0x690:
501 avctx->pix_fmt = AV_PIX_FMT_YUV444P10;
502 break;
503 case 0x6B0:
504 avctx->pix_fmt = AV_PIX_FMT_YUV444P12;
505 break;
506 case 0x6D0:
507 avctx->pix_fmt = AV_PIX_FMT_YUV444P14;
508 break;
509 8 case 0x6F0:
510 8 avctx->pix_fmt = AV_PIX_FMT_YUV444P16;
511 8 break;
512 case 0x671:
513 avctx->pix_fmt = AV_PIX_FMT_YUV422P;
514 break;
515 case 0x681:
516 avctx->pix_fmt = AV_PIX_FMT_YUV422P9;
517 break;
518 8 case 0x691:
519 8 avctx->pix_fmt = AV_PIX_FMT_YUV422P10;
520 8 break;
521 case 0x6B1:
522 avctx->pix_fmt = AV_PIX_FMT_YUV422P12;
523 break;
524 case 0x6D1:
525 avctx->pix_fmt = AV_PIX_FMT_YUV422P14;
526 break;
527 case 0x6F1:
528 avctx->pix_fmt = AV_PIX_FMT_YUV422P16;
529 break;
530 case 0x672:
531 avctx->pix_fmt = AV_PIX_FMT_YUV411P;
532 break;
533 case 0x674:
534 avctx->pix_fmt = AV_PIX_FMT_YUV440P;
535 break;
536 case 0x675:
537 avctx->pix_fmt = AV_PIX_FMT_YUV420P;
538 break;
539 case 0x685:
540 avctx->pix_fmt = AV_PIX_FMT_YUV420P9;
541 break;
542 case 0x695:
543 avctx->pix_fmt = AV_PIX_FMT_YUV420P10;
544 break;
545 8 case 0x6B5:
546 8 avctx->pix_fmt = AV_PIX_FMT_YUV420P12;
547 8 break;
548 case 0x6D5:
549 avctx->pix_fmt = AV_PIX_FMT_YUV420P14;
550 break;
551 case 0x6F5:
552 avctx->pix_fmt = AV_PIX_FMT_YUV420P16;
553 break;
554 case 0x67A:
555 avctx->pix_fmt = AV_PIX_FMT_YUV410P;
556 break;
557 case 0x770:
558 avctx->pix_fmt = AV_PIX_FMT_YUVA444P;
559 break;
560 case 0x780:
561 avctx->pix_fmt = AV_PIX_FMT_YUVA444P9;
562 break;
563 case 0x790:
564 avctx->pix_fmt = AV_PIX_FMT_YUVA444P10;
565 break;
566 case 0x7F0:
567 avctx->pix_fmt = AV_PIX_FMT_YUVA444P16;
568 break;
569 case 0x771:
570 avctx->pix_fmt = AV_PIX_FMT_YUVA422P;
571 break;
572 case 0x781:
573 avctx->pix_fmt = AV_PIX_FMT_YUVA422P9;
574 break;
575 case 0x791:
576 avctx->pix_fmt = AV_PIX_FMT_YUVA422P10;
577 break;
578 case 0x7F1:
579 avctx->pix_fmt = AV_PIX_FMT_YUVA422P16;
580 break;
581 case 0x775:
582 avctx->pix_fmt = AV_PIX_FMT_YUVA420P;
583 break;
584 case 0x785:
585 avctx->pix_fmt = AV_PIX_FMT_YUVA420P9;
586 break;
587 case 0x795:
588 avctx->pix_fmt = AV_PIX_FMT_YUVA420P10;
589 break;
590 case 0x7F5:
591 avctx->pix_fmt = AV_PIX_FMT_YUVA420P16;
592 break;
593 default:
594 return AVERROR_INVALIDDATA;
595 }
596 }
597
598
5/6
✓ Branch 0 taken 76 times.
✓ Branch 1 taken 9 times.
✓ Branch 2 taken 28 times.
✓ Branch 3 taken 48 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 37 times.
85 if ((avctx->pix_fmt == AV_PIX_FMT_YUV422P || avctx->pix_fmt == AV_PIX_FMT_YUV420P) && avctx->width & 1) {
599 av_log(avctx, AV_LOG_ERROR, "width must be even for this colorspace\n");
600 return AVERROR_INVALIDDATA;
601 }
602
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 85 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
85 if (s->predictor == MEDIAN && avctx->pix_fmt == AV_PIX_FMT_YUV422P &&
603 avctx->width % 4) {
604 av_log(avctx, AV_LOG_ERROR, "width must be a multiple of 4 "
605 "for this combination of colorspace and predictor type.\n");
606 return AVERROR_INVALIDDATA;
607 }
608
609
2/2
✓ Branch 0 taken 255 times.
✓ Branch 1 taken 85 times.
340 for (int i = 0; i < 3; i++) {
610 255 s->temp[i] = av_malloc(4 * avctx->width + 16);
611
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 255 times.
255 if (!s->temp[i])
612 return AVERROR(ENOMEM);
613 }
614
615 85 return 0;
616 }
617
618 /** Subset of GET_VLC for use in hand-roller VLC code */
619 #define VLC_INTERN(dst, table, gb, name, bits, max_depth) \
620 code = table[index].sym; \
621 n = table[index].len; \
622 if (max_depth > 1 && n < 0) { \
623 LAST_SKIP_BITS(name, gb, bits); \
624 UPDATE_CACHE(name, gb); \
625 \
626 nb_bits = -n; \
627 index = SHOW_UBITS(name, gb, nb_bits) + code; \
628 code = table[index].sym; \
629 n = table[index].len; \
630 if (max_depth > 2 && n < 0) { \
631 LAST_SKIP_BITS(name, gb, nb_bits); \
632 UPDATE_CACHE(name, gb); \
633 \
634 nb_bits = -n; \
635 index = SHOW_UBITS(name, gb, nb_bits) + code; \
636 code = table[index].sym; \
637 n = table[index].len; \
638 } \
639 } \
640 dst = code; \
641 LAST_SKIP_BITS(name, gb, n)
642
643
644 #define GET_VLC_DUAL(dst0, dst1, name, gb, dtable, table1, table2, \
645 bits, max_depth, OP) \
646 do { \
647 unsigned int index = SHOW_UBITS(name, gb, bits); \
648 int code, n = dtable[index].len; \
649 \
650 if (n<=0) { \
651 int nb_bits; \
652 VLC_INTERN(dst0, table1, gb, name, bits, max_depth); \
653 \
654 UPDATE_CACHE(re, gb); \
655 index = SHOW_UBITS(name, gb, bits); \
656 VLC_INTERN(dst1, table2, gb, name, bits, max_depth); \
657 } else { \
658 code = dtable[index].sym; \
659 OP(dst0, dst1, code); \
660 LAST_SKIP_BITS(name, gb, n); \
661 } \
662 } while (0)
663
664 #define OP8bits(dst0, dst1, code) dst0 = code>>8; dst1 = code
665
666 #define READ_2PIX(dst0, dst1, plane1) \
667 UPDATE_CACHE(re, &s->gb); \
668 GET_VLC_DUAL(dst0, dst1, re, &s->gb, s->vlc[4+plane1].table, \
669 s->vlc[0].table, s->vlc[plane1].table, VLC_BITS, 3, OP8bits)
670
671 70390 static void decode_422_bitstream(HYuvDecContext *s, int count)
672 {
673 int i, icount;
674 70390 OPEN_READER(re, &s->gb);
675 70390 count /= 2;
676
677 70390 icount = get_bits_left(&s->gb) / (32 * 4);
678
2/2
✓ Branch 0 taken 1665 times.
✓ Branch 1 taken 68725 times.
70390 if (count >= icount) {
679
2/2
✓ Branch 0 taken 145894 times.
✓ Branch 1 taken 1665 times.
147559 for (i = 0; i < icount; i++) {
680
8/10
✓ Branch 1 taken 35884 times.
✓ Branch 2 taken 110010 times.
✓ Branch 3 taken 5174 times.
✓ Branch 4 taken 30710 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 5174 times.
✓ Branch 10 taken 4241 times.
✓ Branch 11 taken 31643 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 4241 times.
145894 READ_2PIX(s->temp[0][2 * i], s->temp[1][i], 1);
681
8/10
✓ Branch 1 taken 60494 times.
✓ Branch 2 taken 85400 times.
✓ Branch 3 taken 4323 times.
✓ Branch 4 taken 56171 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 4323 times.
✓ Branch 10 taken 3011 times.
✓ Branch 11 taken 57483 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 3011 times.
145894 READ_2PIX(s->temp[0][2 * i + 1], s->temp[2][i], 2);
682 }
683
3/4
✓ Branch 0 taken 119540 times.
✓ Branch 1 taken 1665 times.
✓ Branch 2 taken 119540 times.
✗ Branch 3 not taken.
121205 for (; i < count && BITS_LEFT(re, &s->gb) > 0; i++) {
684
8/10
✓ Branch 1 taken 30418 times.
✓ Branch 2 taken 89122 times.
✓ Branch 3 taken 3373 times.
✓ Branch 4 taken 27045 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3373 times.
✓ Branch 10 taken 2240 times.
✓ Branch 11 taken 28178 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 2240 times.
119540 READ_2PIX(s->temp[0][2 * i ], s->temp[1][i], 1);
685
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 119540 times.
119540 if (BITS_LEFT(re, &s->gb) <= 0) break;
686
8/10
✓ Branch 1 taken 40541 times.
✓ Branch 2 taken 78999 times.
✓ Branch 3 taken 3330 times.
✓ Branch 4 taken 37211 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3330 times.
✓ Branch 10 taken 1831 times.
✓ Branch 11 taken 38710 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1831 times.
119540 READ_2PIX(s->temp[0][2 * i + 1], s->temp[2][i], 2);
687 }
688
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1665 times.
1665 for (; i < count; i++)
689 s->temp[0][2 * i ] = s->temp[1][i] =
690 s->temp[0][2 * i + 1] = s->temp[2][i] = 0;
691 } else {
692
2/2
✓ Branch 0 taken 12276706 times.
✓ Branch 1 taken 68725 times.
12345431 for (i = 0; i < count; i++) {
693
8/10
✓ Branch 1 taken 3139971 times.
✓ Branch 2 taken 9136735 times.
✓ Branch 3 taken 424733 times.
✓ Branch 4 taken 2715238 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 424733 times.
✓ Branch 10 taken 405857 times.
✓ Branch 11 taken 2734114 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 405857 times.
12276706 READ_2PIX(s->temp[0][2 * i], s->temp[1][i], 1);
694
8/10
✓ Branch 1 taken 5538372 times.
✓ Branch 2 taken 6738334 times.
✓ Branch 3 taken 393571 times.
✓ Branch 4 taken 5144801 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 393571 times.
✓ Branch 10 taken 279448 times.
✓ Branch 11 taken 5258924 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 279448 times.
12276706 READ_2PIX(s->temp[0][2 * i + 1], s->temp[2][i], 2);
695 }
696 }
697 70390 CLOSE_READER(re, &s->gb);
698 70390 }
699
700 #define READ_2PIX_PLANE(dst0, dst1, plane, OP) \
701 UPDATE_CACHE(re, &s->gb); \
702 GET_VLC_DUAL(dst0, dst1, re, &s->gb, s->vlc[4+plane].table, \
703 s->vlc[plane].table, s->vlc[plane].table, VLC_BITS, 3, OP)
704
705 #define OP14bits(dst0, dst1, code) dst0 = code>>8; dst1 = sign_extend(code, 8)
706
707 /* TODO instead of restarting the read when the code isn't in the first level
708 * of the joint table, jump into the 2nd level of the individual table. */
709 #define READ_2PIX_PLANE16(dst0, dst1, plane){\
710 dst0 = get_vlc2(&s->gb, s->vlc[plane].table, VLC_BITS, 3)*4;\
711 dst0 += get_bits(&s->gb, 2);\
712 dst1 = get_vlc2(&s->gb, s->vlc[plane].table, VLC_BITS, 3)*4;\
713 dst1 += get_bits(&s->gb, 2);\
714 }
715 493900 static void decode_plane_bitstream(HYuvDecContext *s, int width, int plane)
716 {
717 493900 int i, count = width/2;
718
719
2/2
✓ Branch 0 taken 134700 times.
✓ Branch 1 taken 359200 times.
493900 if (s->bps <= 8) {
720 134700 OPEN_READER(re, &s->gb);
721
2/2
✓ Branch 1 taken 1387 times.
✓ Branch 2 taken 133313 times.
134700 if (count >= (get_bits_left(&s->gb)) / (32 * 2)) {
722
3/4
✓ Branch 0 taken 212153 times.
✓ Branch 1 taken 1387 times.
✓ Branch 2 taken 212153 times.
✗ Branch 3 not taken.
213540 for (i = 0; i < count && BITS_LEFT(re, &s->gb) > 0; i++) {
723
8/10
✓ Branch 1 taken 24131 times.
✓ Branch 2 taken 188022 times.
✓ Branch 3 taken 542 times.
✓ Branch 4 taken 23589 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 542 times.
✓ Branch 10 taken 65 times.
✓ Branch 11 taken 24066 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 65 times.
212153 READ_2PIX_PLANE(s->temp[0][2 * i], s->temp[0][2 * i + 1], plane, OP8bits);
724 }
725 } else {
726
2/2
✓ Branch 0 taken 22684147 times.
✓ Branch 1 taken 133313 times.
22817460 for(i=0; i<count; i++){
727
8/10
✓ Branch 1 taken 6319215 times.
✓ Branch 2 taken 16364932 times.
✓ Branch 3 taken 350124 times.
✓ Branch 4 taken 5969091 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 350124 times.
✓ Branch 10 taken 266353 times.
✓ Branch 11 taken 6052862 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 266353 times.
22684147 READ_2PIX_PLANE(s->temp[0][2 * i], s->temp[0][2 * i + 1], plane, OP8bits);
728 }
729 }
730
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 134700 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
134700 if( width&1 && BITS_LEFT(re, &s->gb)>0 ) {
731 unsigned int index;
732 int nb_bits, code, n;
733 UPDATE_CACHE(re, &s->gb);
734 index = SHOW_UBITS(re, &s->gb, VLC_BITS);
735 VLC_INTERN(s->temp[0][width-1], s->vlc[plane].table,
736 &s->gb, re, VLC_BITS, 3);
737 }
738 134700 CLOSE_READER(re, &s->gb);
739
2/2
✓ Branch 0 taken 224500 times.
✓ Branch 1 taken 134700 times.
359200 } else if (s->bps <= 14) {
740 224500 OPEN_READER(re, &s->gb);
741
2/2
✓ Branch 1 taken 1073 times.
✓ Branch 2 taken 223427 times.
224500 if (count >= (get_bits_left(&s->gb)) / (32 * 2)) {
742
3/4
✓ Branch 0 taken 82104 times.
✓ Branch 1 taken 1073 times.
✓ Branch 2 taken 82104 times.
✗ Branch 3 not taken.
83177 for (i = 0; i < count && BITS_LEFT(re, &s->gb) > 0; i++) {
743
8/10
✓ Branch 1 taken 57626 times.
✓ Branch 2 taken 24478 times.
✓ Branch 3 taken 21687 times.
✓ Branch 4 taken 35939 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 21687 times.
✓ Branch 10 taken 21105 times.
✓ Branch 11 taken 36521 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 21105 times.
82104 READ_2PIX_PLANE(s->temp16[0][2 * i], s->temp16[0][2 * i + 1], plane, OP14bits);
744 }
745 } else {
746
2/2
✓ Branch 0 taken 26627696 times.
✓ Branch 1 taken 223427 times.
26851123 for(i=0; i<count; i++){
747
8/10
✓ Branch 1 taken 21066126 times.
✓ Branch 2 taken 5561570 times.
✓ Branch 3 taken 9246504 times.
✓ Branch 4 taken 11819622 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 9246504 times.
✓ Branch 10 taken 9120068 times.
✓ Branch 11 taken 11946058 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 9120068 times.
26627696 READ_2PIX_PLANE(s->temp16[0][2 * i], s->temp16[0][2 * i + 1], plane, OP14bits);
748 }
749 }
750
3/4
✓ Branch 0 taken 5100 times.
✓ Branch 1 taken 219400 times.
✓ Branch 2 taken 5100 times.
✗ Branch 3 not taken.
224500 if( width&1 && BITS_LEFT(re, &s->gb)>0 ) {
751 unsigned int index;
752 int nb_bits, code, n;
753 5100 UPDATE_CACHE(re, &s->gb);
754 5100 index = SHOW_UBITS(re, &s->gb, VLC_BITS);
755
3/4
✓ Branch 0 taken 2272 times.
✓ Branch 1 taken 2828 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2272 times.
5100 VLC_INTERN(s->temp16[0][width-1], s->vlc[plane].table,
756 &s->gb, re, VLC_BITS, 3);
757 }
758 224500 CLOSE_READER(re, &s->gb);
759 } else {
760
2/2
✓ Branch 1 taken 372 times.
✓ Branch 2 taken 134328 times.
134700 if (count >= (get_bits_left(&s->gb)) / (32 * 2)) {
761
3/4
✓ Branch 0 taken 56886 times.
✓ Branch 1 taken 372 times.
✓ Branch 3 taken 56886 times.
✗ Branch 4 not taken.
57258 for (i = 0; i < count && get_bits_left(&s->gb) > 0; i++) {
762 56886 READ_2PIX_PLANE16(s->temp16[0][2 * i], s->temp16[0][2 * i + 1], plane);
763 }
764 } else {
765
2/2
✓ Branch 0 taken 22839414 times.
✓ Branch 1 taken 134328 times.
22973742 for(i=0; i<count; i++){
766 22839414 READ_2PIX_PLANE16(s->temp16[0][2 * i], s->temp16[0][2 * i + 1], plane);
767 }
768 }
769
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 134700 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
134700 if( width&1 && get_bits_left(&s->gb)>0 ) {
770 int dst = (unsigned)get_vlc2(&s->gb, s->vlc[plane].table, VLC_BITS, 3)<<2;
771 s->temp16[0][width-1] = dst + get_bits(&s->gb, 2);
772 }
773 }
774 493900 }
775
776 25490 static void decode_gray_bitstream(HYuvDecContext *s, int count)
777 {
778 int i;
779 25490 OPEN_READER(re, &s->gb);
780 25490 count /= 2;
781
782
2/2
✓ Branch 1 taken 427 times.
✓ Branch 2 taken 25063 times.
25490 if (count >= (get_bits_left(&s->gb)) / (32 * 2)) {
783
3/4
✓ Branch 0 taken 74930 times.
✓ Branch 1 taken 427 times.
✓ Branch 2 taken 74930 times.
✗ Branch 3 not taken.
75357 for (i = 0; i < count && BITS_LEFT(re, &s->gb) > 0; i++) {
784
8/10
✓ Branch 1 taken 31336 times.
✓ Branch 2 taken 43594 times.
✓ Branch 3 taken 1978 times.
✓ Branch 4 taken 29358 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1978 times.
✓ Branch 10 taken 1840 times.
✓ Branch 11 taken 29496 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1840 times.
74930 READ_2PIX(s->temp[0][2 * i], s->temp[0][2 * i + 1], 0);
785 }
786
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 427 times.
427 for (; i < count; i++)
787 s->temp[0][2 * i] = s->temp[0][2 * i + 1] = 0;
788 } else {
789
2/2
✓ Branch 0 taken 4835520 times.
✓ Branch 1 taken 25063 times.
4860583 for (i = 0; i < count; i++) {
790
8/10
✓ Branch 1 taken 2242950 times.
✓ Branch 2 taken 2592570 times.
✓ Branch 3 taken 144924 times.
✓ Branch 4 taken 2098026 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 144924 times.
✓ Branch 10 taken 134202 times.
✓ Branch 11 taken 2108748 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 134202 times.
4835520 READ_2PIX(s->temp[0][2 * i], s->temp[0][2 * i + 1], 0);
791 }
792 }
793 25490 CLOSE_READER(re, &s->gb);
794 25490 }
795
796 89800 static av_always_inline void decode_bgr_1(HYuvDecContext *s, int count,
797 int decorrelate, int alpha)
798 {
799 int i;
800 89800 OPEN_READER(re, &s->gb);
801
802
3/4
✓ Branch 0 taken 30528000 times.
✓ Branch 1 taken 89800 times.
✓ Branch 2 taken 30528000 times.
✗ Branch 3 not taken.
30617800 for (i = 0; i < count && BITS_LEFT(re, &s->gb) > 0; i++) {
803 unsigned int index;
804 int code, n, nb_bits;
805
806 30528000 UPDATE_CACHE(re, &s->gb);
807 30528000 index = SHOW_UBITS(re, &s->gb, VLC_BITS);
808 30528000 n = s->vlc[4].table[index].len;
809
810
2/2
✓ Branch 0 taken 13538088 times.
✓ Branch 1 taken 16989912 times.
30528000 if (n>0) {
811 13538088 code = s->vlc[4].table[index].sym;
812 13538088 *(uint32_t *) &s->temp[0][4 * i] = s->pix_bgr_map[code];
813 13538088 LAST_SKIP_BITS(re, &s->gb, n);
814 } else {
815
1/2
✓ Branch 0 taken 16989912 times.
✗ Branch 1 not taken.
16989912 if (decorrelate) {
816
3/4
✓ Branch 0 taken 1469318 times.
✓ Branch 1 taken 15520594 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1469318 times.
16989912 VLC_INTERN(s->temp[0][4 * i + G], s->vlc[1].table,
817 &s->gb, re, VLC_BITS, 3);
818
819 16989912 UPDATE_CACHE(re, &s->gb);
820 16989912 index = SHOW_UBITS(re, &s->gb, VLC_BITS);
821
3/4
✓ Branch 0 taken 1019554 times.
✓ Branch 1 taken 15970358 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1019554 times.
16989912 VLC_INTERN(code, s->vlc[0].table, &s->gb, re, VLC_BITS, 3);
822 16989912 s->temp[0][4 * i + B] = code + s->temp[0][4 * i + G];
823
824 16989912 UPDATE_CACHE(re, &s->gb);
825 16989912 index = SHOW_UBITS(re, &s->gb, VLC_BITS);
826
3/4
✓ Branch 0 taken 957442 times.
✓ Branch 1 taken 16032470 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 957442 times.
16989912 VLC_INTERN(code, s->vlc[2].table, &s->gb, re, VLC_BITS, 3);
827 16989912 s->temp[0][4 * i + R] = code + s->temp[0][4 * i + G];
828 } else {
829 VLC_INTERN(s->temp[0][4 * i + B], s->vlc[0].table,
830 &s->gb, re, VLC_BITS, 3);
831
832 UPDATE_CACHE(re, &s->gb);
833 index = SHOW_UBITS(re, &s->gb, VLC_BITS);
834 VLC_INTERN(s->temp[0][4 * i + G], s->vlc[1].table,
835 &s->gb, re, VLC_BITS, 3);
836
837 UPDATE_CACHE(re, &s->gb);
838 index = SHOW_UBITS(re, &s->gb, VLC_BITS);
839 VLC_INTERN(s->temp[0][4 * i + R], s->vlc[2].table,
840 &s->gb, re, VLC_BITS, 3);
841 }
842 }
843
2/2
✓ Branch 0 taken 15264000 times.
✓ Branch 1 taken 15264000 times.
30528000 if (alpha) {
844 15264000 UPDATE_CACHE(re, &s->gb);
845 15264000 index = SHOW_UBITS(re, &s->gb, VLC_BITS);
846
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 15264000 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
15264000 VLC_INTERN(s->temp[0][4 * i + A], s->vlc[2].table,
847 &s->gb, re, VLC_BITS, 3);
848 } else
849 15264000 s->temp[0][4 * i + A] = 0;
850 }
851 89800 CLOSE_READER(re, &s->gb);
852 89800 }
853
854 89800 static void decode_bgr_bitstream(HYuvDecContext *s, int count)
855 {
856
1/2
✓ Branch 0 taken 89800 times.
✗ Branch 1 not taken.
89800 if (s->decorrelate) {
857
2/2
✓ Branch 0 taken 44900 times.
✓ Branch 1 taken 44900 times.
89800 if (s->bitstream_bpp == 24)
858 44900 decode_bgr_1(s, count, 1, 0);
859 else
860 44900 decode_bgr_1(s, count, 1, 1);
861 } else {
862 if (s->bitstream_bpp == 24)
863 decode_bgr_1(s, count, 0, 0);
864 else
865 decode_bgr_1(s, count, 0, 1);
866 }
867 89800 }
868
869 71590 static void draw_slice(HYuvDecContext *s, AVCodecContext *avctx, AVFrame *frame, int y)
870 {
871 int h, cy, i;
872 int offset[AV_NUM_DATA_POINTERS];
873
874
1/2
✓ Branch 0 taken 71590 times.
✗ Branch 1 not taken.
71590 if (!avctx->draw_horiz_band)
875 71590 return;
876
877 h = y - s->last_slice_end;
878 y -= h;
879
880 if (s->bitstream_bpp == 12)
881 cy = y >> 1;
882 else
883 cy = y;
884
885 offset[0] = frame->linesize[0] * y;
886 offset[1] = frame->linesize[1] * cy;
887 offset[2] = frame->linesize[2] * cy;
888 for (i = 3; i < AV_NUM_DATA_POINTERS; i++)
889 offset[i] = 0;
890 emms_c();
891
892 avctx->draw_horiz_band(avctx, frame, offset, y, 3, h);
893
894 s->last_slice_end = y + h;
895 }
896
897 493900 static int left_prediction(HYuvDecContext *s, uint8_t *dst, const uint8_t *src, int w, int acc)
898 {
899
2/2
✓ Branch 0 taken 134700 times.
✓ Branch 1 taken 359200 times.
493900 if (s->bps <= 8) {
900 134700 return s->llviddsp.add_left_pred(dst, src, w, acc);
901 } else {
902 359200 return s->llviddsp.add_left_pred_int16(( uint16_t *)dst, (const uint16_t *)src, s->n-1, w, acc);
903 }
904 }
905
906 134100 static void add_bytes(HYuvDecContext *s, uint8_t *dst, uint8_t *src, int w)
907 {
908
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 134100 times.
134100 if (s->bps <= 8) {
909 s->llviddsp.add_bytes(dst, src, w);
910 } else {
911 134100 s->hdsp.add_int16((uint16_t*)dst, (const uint16_t*)src, s->n - 1, w);
912 }
913 134100 }
914
915 static void add_median_prediction(HYuvDecContext *s, uint8_t *dst, const uint8_t *src, const uint8_t *diff, int w, int *left, int *left_top)
916 {
917 if (s->bps <= 8) {
918 s->llviddsp.add_median_pred(dst, src, diff, w, left, left_top);
919 } else {
920 s->hdsp.add_hfyu_median_pred_int16((uint16_t *)dst, (const uint16_t *)src, (const uint16_t *)diff, s->n-1, w, left, left_top);
921 }
922 }
923
924 1610 static int decode_slice(AVCodecContext *avctx, AVFrame *p, int height,
925 int buf_size, int y_offset, int table_size)
926 {
927 1610 HYuvDecContext *s = avctx->priv_data;
928 int fake_ystride, fake_ustride, fake_vstride;
929 1610 const int width = avctx->width;
930 1610 const int width2 = avctx->width >> 1;
931 int ret;
932
933
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1610 times.
1610 if ((ret = init_get_bits8(&s->gb, s->bitstream_buffer + table_size, buf_size - table_size)) < 0)
934 return ret;
935
936
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1610 times.
1610 fake_ystride = s->interlaced ? p->linesize[0] * 2 : p->linesize[0];
937
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1610 times.
1610 fake_ustride = s->interlaced ? p->linesize[1] * 2 : p->linesize[1];
938
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1610 times.
1610 fake_vstride = s->interlaced ? p->linesize[2] * 2 : p->linesize[2];
939
940
2/2
✓ Branch 0 taken 800 times.
✓ Branch 1 taken 810 times.
1610 if (s->version > 2) {
941 int plane;
942
2/2
✓ Branch 0 taken 2400 times.
✓ Branch 1 taken 800 times.
3200 for(plane = 0; plane < 1 + 2*s->chroma + s->alpha; plane++) {
943 int left, lefttop, y;
944 2400 int w = width;
945 2400 int h = height;
946 2400 int fake_stride = fake_ystride;
947
948
5/6
✓ Branch 0 taken 2400 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1600 times.
✓ Branch 3 taken 800 times.
✓ Branch 4 taken 800 times.
✓ Branch 5 taken 800 times.
2400 if (s->chroma && (plane == 1 || plane == 2)) {
949 1600 w >>= s->chroma_h_shift;
950 1600 h >>= s->chroma_v_shift;
951
2/2
✓ Branch 0 taken 800 times.
✓ Branch 1 taken 800 times.
1600 fake_stride = plane == 1 ? fake_ustride : fake_vstride;
952 }
953
954
1/3
✓ Branch 0 taken 2400 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
2400 switch (s->predictor) {
955 2400 case LEFT:
956 case PLANE:
957 2400 decode_plane_bitstream(s, w, plane);
958 2400 left = left_prediction(s, p->data[plane], s->temp[0], w, 0);
959
960
2/2
✓ Branch 0 taken 491500 times.
✓ Branch 1 taken 2400 times.
493900 for (y = 1; y < h; y++) {
961 491500 uint8_t *dst = p->data[plane] + p->linesize[plane]*y;
962
963 491500 decode_plane_bitstream(s, w, plane);
964 491500 left = left_prediction(s, dst, s->temp[0], w, left);
965
2/2
✓ Branch 0 taken 134100 times.
✓ Branch 1 taken 357400 times.
491500 if (s->predictor == PLANE) {
966
1/2
✓ Branch 0 taken 134100 times.
✗ Branch 1 not taken.
134100 if (y > s->interlaced) {
967 134100 add_bytes(s, dst, dst - fake_stride, w);
968 }
969 }
970 }
971
972 2400 break;
973 case MEDIAN:
974 decode_plane_bitstream(s, w, plane);
975 left= left_prediction(s, p->data[plane], s->temp[0], w, 0);
976
977 y = 1;
978 if (y >= h)
979 break;
980
981 /* second line is left predicted for interlaced case */
982 if (s->interlaced) {
983 decode_plane_bitstream(s, w, plane);
984 left = left_prediction(s, p->data[plane] + p->linesize[plane], s->temp[0], w, left);
985 y++;
986 if (y >= h)
987 break;
988 }
989
990 lefttop = p->data[plane][0];
991 decode_plane_bitstream(s, w, plane);
992 add_median_prediction(s, p->data[plane] + fake_stride, p->data[plane], s->temp[0], w, &left, &lefttop);
993 y++;
994
995 for (; y<h; y++) {
996 uint8_t *dst;
997
998 decode_plane_bitstream(s, w, plane);
999
1000 dst = p->data[plane] + p->linesize[plane] * y;
1001
1002 add_median_prediction(s, dst, dst - fake_stride, s->temp[0], w, &left, &lefttop);
1003 }
1004
1005 break;
1006 }
1007 }
1008 800 draw_slice(s, avctx, p, height);
1009
2/2
✓ Branch 0 taken 410 times.
✓ Branch 1 taken 400 times.
810 } else if (s->bitstream_bpp < 24) {
1010 int y, cy;
1011 int lefty, leftu, leftv;
1012 int lefttopy, lefttopu, lefttopv;
1013
1014
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 410 times.
410 if (s->yuy2) {
1015 p->data[0][3] = get_bits(&s->gb, 8);
1016 p->data[0][2] = get_bits(&s->gb, 8);
1017 p->data[0][1] = get_bits(&s->gb, 8);
1018 p->data[0][0] = get_bits(&s->gb, 8);
1019
1020 av_log(avctx, AV_LOG_ERROR,
1021 "YUY2 output is not implemented yet\n");
1022 return AVERROR_PATCHWELCOME;
1023 } else {
1024 410 leftv =
1025 410 p->data[2][0 + y_offset * p->linesize[2]] = get_bits(&s->gb, 8);
1026 410 lefty =
1027 410 p->data[0][1 + y_offset * p->linesize[0]] = get_bits(&s->gb, 8);
1028 410 leftu =
1029 410 p->data[1][0 + y_offset * p->linesize[1]] = get_bits(&s->gb, 8);
1030 410 p->data[0][0 + y_offset * p->linesize[0]] = get_bits(&s->gb, 8);
1031
1032
1/3
✓ Branch 0 taken 410 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
410 switch (s->predictor) {
1033 410 case LEFT:
1034 case PLANE:
1035 410 decode_422_bitstream(s, width - 2);
1036 820 lefty = s->llviddsp.add_left_pred(p->data[0] + p->linesize[0] * y_offset + 2, s->temp[0],
1037 410 width - 2, lefty);
1038
1/2
✓ Branch 0 taken 410 times.
✗ Branch 1 not taken.
410 if (!(s->flags & AV_CODEC_FLAG_GRAY)) {
1039 410 leftu = s->llviddsp.add_left_pred(p->data[1] + p->linesize[1] * y_offset + 1, s->temp[1], width2 - 1, leftu);
1040 410 leftv = s->llviddsp.add_left_pred(p->data[2] + p->linesize[2] * y_offset + 1, s->temp[2], width2 - 1, leftv);
1041 }
1042
1043
2/2
✓ Branch 0 taken 70190 times.
✓ Branch 1 taken 200 times.
70390 for (cy = y = 1; y < height; y++, cy++) {
1044 uint8_t *ydst, *udst, *vdst;
1045
1046
2/2
✓ Branch 0 taken 25490 times.
✓ Branch 1 taken 44700 times.
70190 if (s->bitstream_bpp == 12) {
1047 25490 decode_gray_bitstream(s, width);
1048
1049 25490 ydst = p->data[0] + p->linesize[0] * (y + y_offset);
1050
1051 25490 lefty = s->llviddsp.add_left_pred(ydst, s->temp[0],
1052 width, lefty);
1053
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 25490 times.
25490 if (s->predictor == PLANE) {
1054 if (y > s->interlaced)
1055 s->llviddsp.add_bytes(ydst, ydst - fake_ystride, width);
1056 }
1057 25490 y++;
1058
2/2
✓ Branch 0 taken 210 times.
✓ Branch 1 taken 25280 times.
25490 if (y >= height)
1059 210 break;
1060 }
1061
1062 69980 draw_slice(s, avctx, p, y);
1063
1064 69980 ydst = p->data[0] + p->linesize[0] * (y + y_offset);
1065 69980 udst = p->data[1] + p->linesize[1] * (cy + y_offset);
1066 69980 vdst = p->data[2] + p->linesize[2] * (cy + y_offset);
1067
1068 69980 decode_422_bitstream(s, width);
1069 69980 lefty = s->llviddsp.add_left_pred(ydst, s->temp[0],
1070 width, lefty);
1071
1/2
✓ Branch 0 taken 69980 times.
✗ Branch 1 not taken.
69980 if (!(s->flags & AV_CODEC_FLAG_GRAY)) {
1072 69980 leftu = s->llviddsp.add_left_pred(udst, s->temp[1], width2, leftu);
1073 69980 leftv = s->llviddsp.add_left_pred(vdst, s->temp[2], width2, leftv);
1074 }
1075
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 69980 times.
69980 if (s->predictor == PLANE) {
1076 if (cy > s->interlaced) {
1077 s->llviddsp.add_bytes(ydst, ydst - fake_ystride, width);
1078 if (!(s->flags & AV_CODEC_FLAG_GRAY)) {
1079 s->llviddsp.add_bytes(udst, udst - fake_ustride, width2);
1080 s->llviddsp.add_bytes(vdst, vdst - fake_vstride, width2);
1081 }
1082 }
1083 }
1084 }
1085 410 draw_slice(s, avctx, p, height);
1086
1087 410 break;
1088 case MEDIAN:
1089 /* first line except first 2 pixels is left predicted */
1090 decode_422_bitstream(s, width - 2);
1091 lefty = s->llviddsp.add_left_pred(p->data[0] + 2, s->temp[0],
1092 width - 2, lefty);
1093 if (!(s->flags & AV_CODEC_FLAG_GRAY)) {
1094 leftu = s->llviddsp.add_left_pred(p->data[1] + 1, s->temp[1], width2 - 1, leftu);
1095 leftv = s->llviddsp.add_left_pred(p->data[2] + 1, s->temp[2], width2 - 1, leftv);
1096 }
1097
1098 cy = y = 1;
1099 if (y >= height)
1100 break;
1101
1102 /* second line is left predicted for interlaced case */
1103 if (s->interlaced) {
1104 decode_422_bitstream(s, width);
1105 lefty = s->llviddsp.add_left_pred(p->data[0] + p->linesize[0],
1106 s->temp[0], width, lefty);
1107 if (!(s->flags & AV_CODEC_FLAG_GRAY)) {
1108 leftu = s->llviddsp.add_left_pred(p->data[1] + p->linesize[2], s->temp[1], width2, leftu);
1109 leftv = s->llviddsp.add_left_pred(p->data[2] + p->linesize[1], s->temp[2], width2, leftv);
1110 }
1111 y++;
1112 cy++;
1113 if (y >= height)
1114 break;
1115 }
1116
1117 /* next 4 pixels are left predicted too */
1118 decode_422_bitstream(s, 4);
1119 lefty = s->llviddsp.add_left_pred(p->data[0] + fake_ystride,
1120 s->temp[0], 4, lefty);
1121 if (!(s->flags & AV_CODEC_FLAG_GRAY)) {
1122 leftu = s->llviddsp.add_left_pred(p->data[1] + fake_ustride, s->temp[1], 2, leftu);
1123 leftv = s->llviddsp.add_left_pred(p->data[2] + fake_vstride, s->temp[2], 2, leftv);
1124 }
1125
1126 /* next line except the first 4 pixels is median predicted */
1127 lefttopy = p->data[0][3];
1128 decode_422_bitstream(s, width - 4);
1129 s->llviddsp.add_median_pred(p->data[0] + fake_ystride + 4,
1130 p->data[0] + 4, s->temp[0],
1131 width - 4, &lefty, &lefttopy);
1132 if (!(s->flags & AV_CODEC_FLAG_GRAY)) {
1133 lefttopu = p->data[1][1];
1134 lefttopv = p->data[2][1];
1135 s->llviddsp.add_median_pred(p->data[1] + fake_ustride + 2, p->data[1] + 2, s->temp[1], width2 - 2, &leftu, &lefttopu);
1136 s->llviddsp.add_median_pred(p->data[2] + fake_vstride + 2, p->data[2] + 2, s->temp[2], width2 - 2, &leftv, &lefttopv);
1137 }
1138 y++;
1139 cy++;
1140
1141 for (; y < height; y++, cy++) {
1142 uint8_t *ydst, *udst, *vdst;
1143
1144 if (s->bitstream_bpp == 12) {
1145 while (2 * cy > y) {
1146 decode_gray_bitstream(s, width);
1147 ydst = p->data[0] + p->linesize[0] * y;
1148 s->llviddsp.add_median_pred(ydst, ydst - fake_ystride,
1149 s->temp[0], width,
1150 &lefty, &lefttopy);
1151 y++;
1152 }
1153 if (y >= height)
1154 break;
1155 }
1156 draw_slice(s, avctx, p, y);
1157
1158 decode_422_bitstream(s, width);
1159
1160 ydst = p->data[0] + p->linesize[0] * y;
1161 udst = p->data[1] + p->linesize[1] * cy;
1162 vdst = p->data[2] + p->linesize[2] * cy;
1163
1164 s->llviddsp.add_median_pred(ydst, ydst - fake_ystride,
1165 s->temp[0], width,
1166 &lefty, &lefttopy);
1167 if (!(s->flags & AV_CODEC_FLAG_GRAY)) {
1168 s->llviddsp.add_median_pred(udst, udst - fake_ustride, s->temp[1], width2, &leftu, &lefttopu);
1169 s->llviddsp.add_median_pred(vdst, vdst - fake_vstride, s->temp[2], width2, &leftv, &lefttopv);
1170 }
1171 }
1172
1173 draw_slice(s, avctx, p, height);
1174 break;
1175 }
1176 }
1177 } else {
1178 int y;
1179 uint8_t left[4];
1180 400 const int last_line = (y_offset + height - 1) * p->linesize[0];
1181
1182
2/2
✓ Branch 0 taken 200 times.
✓ Branch 1 taken 200 times.
400 if (s->bitstream_bpp == 32) {
1183 200 left[A] = p->data[0][last_line + A] = get_bits(&s->gb, 8);
1184 200 left[R] = p->data[0][last_line + R] = get_bits(&s->gb, 8);
1185 200 left[G] = p->data[0][last_line + G] = get_bits(&s->gb, 8);
1186 200 left[B] = p->data[0][last_line + B] = get_bits(&s->gb, 8);
1187 } else {
1188 200 left[R] = p->data[0][last_line + R] = get_bits(&s->gb, 8);
1189 200 left[G] = p->data[0][last_line + G] = get_bits(&s->gb, 8);
1190 200 left[B] = p->data[0][last_line + B] = get_bits(&s->gb, 8);
1191 200 left[A] = p->data[0][last_line + A] = 255;
1192 200 skip_bits(&s->gb, 8);
1193 }
1194
1195
1/2
✓ Branch 0 taken 400 times.
✗ Branch 1 not taken.
400 if (s->bgr32) {
1196
1/2
✓ Branch 0 taken 400 times.
✗ Branch 1 not taken.
400 switch (s->predictor) {
1197 400 case LEFT:
1198 case PLANE:
1199 400 decode_bgr_bitstream(s, width - 1);
1200 400 s->hdsp.add_hfyu_left_pred_bgr32(p->data[0] + last_line + 4,
1201 400 s->temp[0], width - 1, left);
1202
1203
2/2
✓ Branch 0 taken 89400 times.
✓ Branch 1 taken 400 times.
89800 for (y = height - 2; y >= 0; y--) { // Yes it is stored upside down.
1204 89400 decode_bgr_bitstream(s, width);
1205
1206 89400 s->hdsp.add_hfyu_left_pred_bgr32(p->data[0] + p->linesize[0] * (y + y_offset),
1207 89400 s->temp[0], width, left);
1208
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 89400 times.
89400 if (s->predictor == PLANE) {
1209 if (s->bitstream_bpp != 32)
1210 left[A] = 0;
1211 if (y < height - 1 - s->interlaced) {
1212 s->llviddsp.add_bytes(p->data[0] + p->linesize[0] * (y + y_offset),
1213 p->data[0] + p->linesize[0] * (y + y_offset) +
1214 fake_ystride, 4 * width);
1215 }
1216 }
1217 }
1218 // just 1 large slice as this is not possible in reverse order
1219 400 draw_slice(s, avctx, p, height);
1220 400 break;
1221 default:
1222 av_log(avctx, AV_LOG_ERROR,
1223 "prediction type not supported!\n");
1224 }
1225 } else {
1226 av_log(avctx, AV_LOG_ERROR,
1227 "BGR24 output is not implemented yet\n");
1228 return AVERROR_PATCHWELCOME;
1229 }
1230 }
1231
1232 1610 return 0;
1233 }
1234
1235 1610 static int decode_frame(AVCodecContext *avctx, AVFrame *p,
1236 int *got_frame, AVPacket *avpkt)
1237 {
1238 1610 const uint8_t *buf = avpkt->data;
1239 1610 int buf_size = avpkt->size;
1240 1610 HYuvDecContext *s = avctx->priv_data;
1241 1610 const int width = avctx->width;
1242 1610 const int height = avctx->height;
1243 1610 int slice, table_size = 0, ret, nb_slices;
1244 unsigned slices_info_offset;
1245 int slice_height;
1246
1247
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1610 times.
1610 if (buf_size < (width * height + 7)/8)
1248 return AVERROR_INVALIDDATA;
1249
1250 1610 av_fast_padded_malloc(&s->bitstream_buffer,
1251 &s->bitstream_buffer_size,
1252 buf_size);
1253
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1610 times.
1610 if (!s->bitstream_buffer)
1254 return AVERROR(ENOMEM);
1255
1256 1610 s->bdsp.bswap_buf((uint32_t *) s->bitstream_buffer,
1257 (const uint32_t *) buf, buf_size / 4);
1258
1259
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1610 times.
1610 if ((ret = ff_thread_get_buffer(avctx, p, 0)) < 0)
1260 return ret;
1261
1262
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1610 times.
1610 if (s->context) {
1263 table_size = read_huffman_tables(s, s->bitstream_buffer, buf_size);
1264 if (table_size < 0)
1265 return table_size;
1266 }
1267
1268
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1610 times.
1610 if ((unsigned) (buf_size - table_size) >= INT_MAX / 8)
1269 return AVERROR_INVALIDDATA;
1270
1271 1610 s->last_slice_end = 0;
1272
1273
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1610 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1610 if (avctx->codec_id == AV_CODEC_ID_HYMT &&
1274 (buf_size > 32 && AV_RL32(avpkt->data + buf_size - 16) == 0)) {
1275 slices_info_offset = AV_RL32(avpkt->data + buf_size - 4);
1276 slice_height = AV_RL32(avpkt->data + buf_size - 8);
1277 nb_slices = AV_RL32(avpkt->data + buf_size - 12);
1278 if (nb_slices * 8LL + slices_info_offset > buf_size - 16 ||
1279 s->chroma_v_shift ||
1280 slice_height <= 0 || nb_slices * (uint64_t)slice_height > height)
1281 return AVERROR_INVALIDDATA;
1282 } else {
1283 1610 slice_height = height;
1284 1610 nb_slices = 1;
1285 }
1286
1287
2/2
✓ Branch 0 taken 1610 times.
✓ Branch 1 taken 1610 times.
3220 for (slice = 0; slice < nb_slices; slice++) {
1288 int y_offset, slice_offset, slice_size;
1289
1290
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1610 times.
1610 if (nb_slices > 1) {
1291 slice_offset = AV_RL32(avpkt->data + slices_info_offset + slice * 8);
1292 slice_size = AV_RL32(avpkt->data + slices_info_offset + slice * 8 + 4);
1293
1294 if (slice_offset < 0 || slice_size <= 0 || (slice_offset&3) ||
1295 slice_offset + (int64_t)slice_size > buf_size)
1296 return AVERROR_INVALIDDATA;
1297
1298 y_offset = height - (slice + 1) * slice_height;
1299 s->bdsp.bswap_buf((uint32_t *)s->bitstream_buffer,
1300 (const uint32_t *)(buf + slice_offset), slice_size / 4);
1301 } else {
1302 1610 y_offset = 0;
1303 1610 slice_offset = 0;
1304 1610 slice_size = buf_size;
1305 }
1306
1307 1610 ret = decode_slice(avctx, p, slice_height, slice_size, y_offset, table_size);
1308 1610 emms_c();
1309
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1610 times.
1610 if (ret < 0)
1310 return ret;
1311 }
1312
1313 1610 *got_frame = 1;
1314
1315 1610 return (get_bits_count(&s->gb) + 31) / 32 * 4 + table_size;
1316 }
1317
1318 const FFCodec ff_huffyuv_decoder = {
1319 .p.name = "huffyuv",
1320 CODEC_LONG_NAME("Huffyuv / HuffYUV"),
1321 .p.type = AVMEDIA_TYPE_VIDEO,
1322 .p.id = AV_CODEC_ID_HUFFYUV,
1323 .priv_data_size = sizeof(HYuvDecContext),
1324 .init = decode_init,
1325 .close = decode_end,
1326 FF_CODEC_DECODE_CB(decode_frame),
1327 .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DRAW_HORIZ_BAND |
1328 AV_CODEC_CAP_FRAME_THREADS,
1329 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
1330 };
1331
1332 #if CONFIG_FFVHUFF_DECODER
1333 const FFCodec ff_ffvhuff_decoder = {
1334 .p.name = "ffvhuff",
1335 CODEC_LONG_NAME("Huffyuv FFmpeg variant"),
1336 .p.type = AVMEDIA_TYPE_VIDEO,
1337 .p.id = AV_CODEC_ID_FFVHUFF,
1338 .priv_data_size = sizeof(HYuvDecContext),
1339 .init = decode_init,
1340 .close = decode_end,
1341 FF_CODEC_DECODE_CB(decode_frame),
1342 .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DRAW_HORIZ_BAND |
1343 AV_CODEC_CAP_FRAME_THREADS,
1344 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
1345 };
1346 #endif /* CONFIG_FFVHUFF_DECODER */
1347
1348 #if CONFIG_HYMT_DECODER
1349 const FFCodec ff_hymt_decoder = {
1350 .p.name = "hymt",
1351 CODEC_LONG_NAME("HuffYUV MT"),
1352 .p.type = AVMEDIA_TYPE_VIDEO,
1353 .p.id = AV_CODEC_ID_HYMT,
1354 .priv_data_size = sizeof(HYuvDecContext),
1355 .init = decode_init,
1356 .close = decode_end,
1357 FF_CODEC_DECODE_CB(decode_frame),
1358 .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DRAW_HORIZ_BAND |
1359 AV_CODEC_CAP_FRAME_THREADS,
1360 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
1361 };
1362 #endif /* CONFIG_HYMT_DECODER */
1363