FFmpeg coverage


Directory: ../../../ffmpeg/
File: src/libavcodec/huffyuvdec.c
Date: 2026-08-11 17:55:23
Exec Total Coverage
Lines: 456 757 60.2%
Functions: 16 17 94.1%
Branches: 343 589 58.2%

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