/src/ffmpeg/libavcodec/huffyuvdec.c
Line | Count | 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 | 26.9M | #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 | | static int read_len_table(uint8_t *dst, GetByteContext *gb, int n) |
142 | 64.7k | { |
143 | 64.7k | int i, val, repeat; |
144 | | |
145 | 22.2M | for (i = 0; i < n;) { |
146 | 22.2M | if (bytestream2_get_bytes_left(gb) <= 0) |
147 | 7.91k | goto error; |
148 | 22.2M | repeat = bytestream2_peek_byteu(gb) >> 5; |
149 | 22.2M | val = bytestream2_get_byteu(gb) & 0x1F; |
150 | 22.2M | if (repeat == 0) { |
151 | 1.59M | if (bytestream2_get_bytes_left(gb) <= 0) |
152 | 2.75k | goto error; |
153 | 1.59M | repeat = bytestream2_get_byteu(gb); |
154 | 1.59M | } |
155 | 22.2M | if (i + repeat > n) |
156 | 7.43k | goto error; |
157 | 65.9M | while (repeat--) |
158 | 43.7M | dst[i++] = val; |
159 | 22.2M | } |
160 | 46.6k | return 0; |
161 | | |
162 | 18.1k | error: |
163 | 18.1k | av_log(NULL, AV_LOG_ERROR, "Error reading huffman table\n"); |
164 | 18.1k | return AVERROR_INVALIDDATA; |
165 | 64.7k | } |
166 | | |
167 | | static int generate_joint_tables(HYuvDecContext *s) |
168 | 18.5k | { |
169 | 18.5k | int ret; |
170 | 18.5k | uint16_t *symbols = av_mallocz(5 << VLC_BITS); |
171 | 18.5k | uint16_t *bits; |
172 | 18.5k | uint8_t *len; |
173 | 18.5k | if (!symbols) |
174 | 0 | return AVERROR(ENOMEM); |
175 | 18.5k | bits = symbols + (1 << VLC_BITS); |
176 | 18.5k | len = (uint8_t *)(bits + (1 << VLC_BITS)); |
177 | | |
178 | 18.5k | if (s->bitstream_bpp < 24 || s->version > 2) { |
179 | 13.8k | int count = 1 + s->alpha + 2 * s->chroma; |
180 | 13.8k | int p, i, y, u; |
181 | 42.8k | for (p = 0; p < count; p++) { |
182 | 28.9k | int p0 = s->version > 2 ? p : 0; |
183 | 23.2M | for (i = y = 0; y < s->vlc_n; y++) { |
184 | 23.1M | int len0 = s->len[p0][y]; |
185 | 23.1M | int limit = VLC_BITS - len0; |
186 | 23.1M | if (limit <= 0 || !len0) |
187 | 22.1M | continue; |
188 | 1.00M | if ((sign_extend(y, 8) & (s->vlc_n-1)) != y) |
189 | 106k | continue; |
190 | 258M | for (u = 0; u < s->vlc_n; u++) { |
191 | 257M | int len1 = s->len[p][u]; |
192 | 257M | if (len1 > limit || !len1) |
193 | 243M | continue; |
194 | 13.5M | if ((sign_extend(u, 8) & (s->vlc_n-1)) != u) |
195 | 21.3k | continue; |
196 | 13.5M | av_assert0(i < (1 << VLC_BITS)); |
197 | 13.5M | len[i] = len0 + len1; |
198 | 13.5M | bits[i] = (s->bits[p0][y] << len1) + s->bits[p][u]; |
199 | 13.5M | symbols[i] = (y << 8) + (u & 0xFF); |
200 | 13.5M | i++; |
201 | 13.5M | } |
202 | 899k | } |
203 | 28.9k | ff_vlc_free(&s->vlc[4 + p]); |
204 | 28.9k | if ((ret = ff_vlc_init_sparse(&s->vlc[4 + p], VLC_BITS, i, len, 1, 1, |
205 | 28.9k | bits, 2, 2, symbols, 2, 2, 0)) < 0) |
206 | 0 | goto out; |
207 | 28.9k | } |
208 | 13.8k | } else { |
209 | 4.63k | uint8_t (*map)[4] = (uint8_t(*)[4]) s->pix_bgr_map; |
210 | 4.63k | int i, b, g, r, code; |
211 | 4.63k | int p0 = s->decorrelate; |
212 | 4.63k | 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 | 153k | for (i = 0, g = -16; g < 16; g++) { |
217 | 148k | int len0 = s->len[p0][g & 255]; |
218 | 148k | int limit0 = VLC_BITS - len0; |
219 | 148k | if (limit0 < 2 || !len0) |
220 | 98.5k | continue; |
221 | 1.64M | for (b = -16; b < 16; b++) { |
222 | 1.59M | int len1 = s->len[p1][b & 255]; |
223 | 1.59M | int limit1 = limit0 - len1; |
224 | 1.59M | if (limit1 < 1 || !len1) |
225 | 1.25M | continue; |
226 | 335k | code = (s->bits[p0][g & 255] << len1) + s->bits[p1][b & 255]; |
227 | 11.0M | for (r = -16; r < 16; r++) { |
228 | 10.7M | int len2 = s->len[2][r & 255]; |
229 | 10.7M | if (len2 > limit1 || !len2) |
230 | 10.0M | continue; |
231 | 672k | av_assert0(i < (1 << VLC_BITS)); |
232 | 672k | len[i] = len0 + len1 + len2; |
233 | 672k | bits[i] = (code << len2) + s->bits[2][r & 255]; |
234 | 672k | if (s->decorrelate) { |
235 | 298k | map[i][G] = g; |
236 | 298k | map[i][B] = g + b; |
237 | 298k | map[i][R] = g + r; |
238 | 373k | } else { |
239 | 373k | map[i][B] = g; |
240 | 373k | map[i][G] = b; |
241 | 373k | map[i][R] = r; |
242 | 373k | } |
243 | 672k | i++; |
244 | 672k | } |
245 | 335k | } |
246 | 49.7k | } |
247 | 4.63k | ff_vlc_free(&s->vlc[4]); |
248 | 4.63k | if ((ret = vlc_init(&s->vlc[4], VLC_BITS, i, len, 1, 1, |
249 | 4.63k | bits, 2, 2, 0)) < 0) |
250 | 0 | goto out; |
251 | 4.63k | } |
252 | 18.5k | ret = 0; |
253 | 18.5k | out: |
254 | 18.5k | av_freep(&symbols); |
255 | 18.5k | return ret; |
256 | 18.5k | } |
257 | | |
258 | | static int read_huffman_tables(HYuvDecContext *s, const uint8_t *src, int length) |
259 | 37.0k | { |
260 | 37.0k | GetByteContext gb; |
261 | 37.0k | int i, ret; |
262 | 37.0k | int count = 3; |
263 | | |
264 | 37.0k | bytestream2_init(&gb, src, length); |
265 | | |
266 | 37.0k | if (s->version > 2) |
267 | 25.7k | count = 1 + s->alpha + 2*s->chroma; |
268 | | |
269 | 76.2k | for (i = 0; i < count; i++) { |
270 | 60.0k | if ((ret = read_len_table(s->len[i], &gb, s->vlc_n)) < 0) |
271 | 18.1k | return ret; |
272 | 41.9k | if ((ret = ff_huffyuv_generate_bits_table(s->bits[i], s->len[i], s->vlc_n)) < 0) |
273 | 1.60k | return ret; |
274 | 40.3k | ff_vlc_free(&s->vlc[i]); |
275 | 40.3k | if ((ret = vlc_init(&s->vlc[i], VLC_BITS, s->vlc_n, s->len[i], 1, 1, |
276 | 40.3k | s->bits[i], 4, 4, 0)) < 0) |
277 | 1.13k | return ret; |
278 | 40.3k | } |
279 | | |
280 | 16.1k | if ((ret = generate_joint_tables(s)) < 0) |
281 | 0 | return ret; |
282 | | |
283 | 16.1k | return bytestream2_tell(&gb); |
284 | 16.1k | } |
285 | | |
286 | | static int read_old_huffman_tables(HYuvDecContext *s) |
287 | 2.33k | { |
288 | 2.33k | GetByteContext gb; |
289 | 2.33k | int i, ret; |
290 | | |
291 | 2.33k | bytestream2_init(&gb, classic_shift_luma, |
292 | 2.33k | sizeof(classic_shift_luma)); |
293 | 2.33k | ret = read_len_table(s->len[0], &gb, 256); |
294 | 2.33k | av_assert1(ret >= 0); |
295 | | |
296 | 2.33k | bytestream2_init(&gb, classic_shift_chroma, |
297 | 2.33k | sizeof(classic_shift_chroma)); |
298 | 2.33k | ret = read_len_table(s->len[1], &gb, 256); |
299 | 2.33k | av_assert1(ret >= 0); |
300 | | |
301 | 600k | for (i = 0; i < 256; i++) |
302 | 598k | s->bits[0][i] = classic_add_luma[i]; |
303 | 600k | for (i = 0; i < 256; i++) |
304 | 598k | s->bits[1][i] = classic_add_chroma[i]; |
305 | | |
306 | 2.33k | if (s->bitstream_bpp >= 24) { |
307 | 1.21k | memcpy(s->bits[1], s->bits[0], 256 * sizeof(uint32_t)); |
308 | 1.21k | memcpy(s->len[1], s->len[0], 256 * sizeof(uint8_t)); |
309 | 1.21k | } |
310 | 2.33k | memcpy(s->bits[2], s->bits[1], 256 * sizeof(uint32_t)); |
311 | 2.33k | memcpy(s->len[2], s->len[1], 256 * sizeof(uint8_t)); |
312 | | |
313 | 11.6k | for (i = 0; i < 4; i++) { |
314 | 9.35k | ff_vlc_free(&s->vlc[i]); |
315 | 9.35k | if ((ret = vlc_init(&s->vlc[i], VLC_BITS, 256, s->len[i], 1, 1, |
316 | 9.35k | s->bits[i], 4, 4, 0)) < 0) |
317 | 0 | return ret; |
318 | 9.35k | } |
319 | | |
320 | 2.33k | if ((ret = generate_joint_tables(s)) < 0) |
321 | 0 | return ret; |
322 | | |
323 | 2.33k | return 0; |
324 | 2.33k | } |
325 | | |
326 | | static av_cold int decode_end(AVCodecContext *avctx) |
327 | 6.33k | { |
328 | 6.33k | HYuvDecContext *s = avctx->priv_data; |
329 | 6.33k | int i; |
330 | | |
331 | 25.3k | for (int i = 0; i < 3; i++) |
332 | 18.9k | av_freep(&s->temp[i]); |
333 | | |
334 | 6.33k | av_freep(&s->bitstream_buffer); |
335 | | |
336 | 56.9k | for (i = 0; i < 8; i++) |
337 | 50.6k | ff_vlc_free(&s->vlc[i]); |
338 | | |
339 | 6.33k | return 0; |
340 | 6.33k | } |
341 | | |
342 | | static av_cold int decode_init(AVCodecContext *avctx) |
343 | 6.33k | { |
344 | 6.33k | HYuvDecContext *s = avctx->priv_data; |
345 | 6.33k | int ret; |
346 | | |
347 | 6.33k | ret = av_image_check_size(avctx->width, avctx->height, 0, avctx); |
348 | 6.33k | if (ret < 0) |
349 | 422 | return ret; |
350 | | |
351 | 5.90k | s->flags = avctx->flags; |
352 | | |
353 | 5.90k | ff_bswapdsp_init(&s->bdsp); |
354 | 5.90k | ff_huffyuvdsp_init(&s->hdsp, avctx->pix_fmt); |
355 | 5.90k | ff_llviddsp_init(&s->llviddsp); |
356 | | |
357 | 5.90k | s->interlaced = avctx->height > 288; |
358 | 5.90k | s->bgr32 = 1; |
359 | | |
360 | 5.90k | if (avctx->extradata_size) { |
361 | 3.81k | if ((avctx->bits_per_coded_sample & 7) && |
362 | 252 | avctx->bits_per_coded_sample != 12) |
363 | 247 | s->version = 1; // do such files exist at all? |
364 | 3.57k | else if (avctx->extradata_size > 3 && avctx->extradata[3] == 0) |
365 | 934 | s->version = 2; |
366 | 2.63k | else |
367 | 2.63k | s->version = 3; |
368 | 3.81k | } else |
369 | 2.09k | s->version = 0; |
370 | | |
371 | 5.90k | s->bps = 8; |
372 | 5.90k | s->n = 1<<s->bps; |
373 | 5.90k | s->vlc_n = FFMIN(s->n, MAX_VLC_N); |
374 | 5.90k | s->chroma = 1; |
375 | 5.90k | if (s->version >= 2) { |
376 | 3.57k | int method, interlace; |
377 | | |
378 | 3.57k | if (avctx->extradata_size < 4) |
379 | 9 | return AVERROR_INVALIDDATA; |
380 | | |
381 | 3.56k | method = avctx->extradata[0]; |
382 | 3.56k | s->decorrelate = method & 64 ? 1 : 0; |
383 | 3.56k | s->predictor = method & 63; |
384 | 3.56k | if (s->version == 2) { |
385 | 934 | s->bitstream_bpp = avctx->extradata[1]; |
386 | 934 | if (s->bitstream_bpp == 0) |
387 | 133 | s->bitstream_bpp = avctx->bits_per_coded_sample & ~7; |
388 | 2.62k | } else { |
389 | 2.62k | s->bps = (avctx->extradata[1] >> 4) + 1; |
390 | 2.62k | s->n = 1<<s->bps; |
391 | 2.62k | s->vlc_n = FFMIN(s->n, MAX_VLC_N); |
392 | 2.62k | s->chroma_h_shift = avctx->extradata[1] & 3; |
393 | 2.62k | s->chroma_v_shift = (avctx->extradata[1] >> 2) & 3; |
394 | 2.62k | s->yuv = !!(avctx->extradata[2] & 1); |
395 | 2.62k | s->chroma= !!(avctx->extradata[2] & 3); |
396 | 2.62k | s->alpha = !!(avctx->extradata[2] & 4); |
397 | 2.62k | } |
398 | 3.56k | interlace = (avctx->extradata[2] & 0x30) >> 4; |
399 | 3.56k | s->interlaced = (interlace == 1) ? 1 : (interlace == 2) ? 0 : s->interlaced; |
400 | 3.56k | s->context = avctx->extradata[2] & 0x40 ? 1 : 0; |
401 | | |
402 | 3.56k | if ((ret = read_huffman_tables(s, avctx->extradata + 4, |
403 | 3.56k | avctx->extradata_size - 4)) < 0) |
404 | 330 | return ret; |
405 | 3.56k | } else { |
406 | 2.33k | switch (avctx->bits_per_coded_sample & 7) { |
407 | 95 | case 1: |
408 | 95 | s->predictor = LEFT; |
409 | 95 | s->decorrelate = 0; |
410 | 95 | break; |
411 | 252 | case 2: |
412 | 252 | s->predictor = LEFT; |
413 | 252 | s->decorrelate = 1; |
414 | 252 | break; |
415 | 624 | case 3: |
416 | 624 | s->predictor = PLANE; |
417 | 624 | s->decorrelate = avctx->bits_per_coded_sample >= 24; |
418 | 624 | break; |
419 | 413 | case 4: |
420 | 413 | s->predictor = MEDIAN; |
421 | 413 | s->decorrelate = 0; |
422 | 413 | break; |
423 | 954 | default: |
424 | 954 | s->predictor = LEFT; // OLD |
425 | 954 | s->decorrelate = 0; |
426 | 954 | break; |
427 | 2.33k | } |
428 | 2.33k | s->bitstream_bpp = avctx->bits_per_coded_sample & ~7; |
429 | 2.33k | s->context = 0; |
430 | | |
431 | 2.33k | if ((ret = read_old_huffman_tables(s)) < 0) |
432 | 0 | return ret; |
433 | 2.33k | } |
434 | | |
435 | 5.56k | if (s->version <= 2) { |
436 | 3.20k | switch (s->bitstream_bpp) { |
437 | 471 | case 12: |
438 | 471 | avctx->pix_fmt = AV_PIX_FMT_YUV420P; |
439 | 471 | s->yuv = 1; |
440 | 471 | break; |
441 | 1.00k | case 16: |
442 | 1.00k | if (s->yuy2) |
443 | 0 | avctx->pix_fmt = AV_PIX_FMT_YUYV422; |
444 | 1.00k | else |
445 | 1.00k | avctx->pix_fmt = AV_PIX_FMT_YUV422P; |
446 | 1.00k | s->yuv = 1; |
447 | 1.00k | break; |
448 | 559 | case 24: |
449 | 559 | if (s->bgr32) |
450 | 559 | avctx->pix_fmt = AV_PIX_FMT_0RGB32; |
451 | 0 | else |
452 | 0 | avctx->pix_fmt = AV_PIX_FMT_BGR24; |
453 | 559 | break; |
454 | 786 | case 32: |
455 | 786 | av_assert0(s->bgr32); |
456 | 786 | avctx->pix_fmt = AV_PIX_FMT_RGB32; |
457 | 786 | s->alpha = 1; |
458 | 786 | break; |
459 | 385 | default: |
460 | 385 | return AVERROR_INVALIDDATA; |
461 | 3.20k | } |
462 | 2.81k | av_pix_fmt_get_chroma_sub_sample(avctx->pix_fmt, |
463 | 2.81k | &s->chroma_h_shift, |
464 | 2.81k | &s->chroma_v_shift); |
465 | 2.81k | } else { |
466 | 2.36k | switch ( (s->chroma<<10) | (s->yuv<<9) | (s->alpha<<8) | ((s->bps-1)<<4) | s->chroma_h_shift | (s->chroma_v_shift<<2)) { |
467 | 523 | case 0x070: |
468 | 523 | avctx->pix_fmt = AV_PIX_FMT_GRAY8; |
469 | 523 | break; |
470 | 132 | case 0x0F0: |
471 | 132 | avctx->pix_fmt = AV_PIX_FMT_GRAY16; |
472 | 132 | break; |
473 | 114 | case 0x470: |
474 | 114 | avctx->pix_fmt = AV_PIX_FMT_GBRP; |
475 | 114 | break; |
476 | 111 | case 0x480: |
477 | 111 | avctx->pix_fmt = AV_PIX_FMT_GBRP9; |
478 | 111 | break; |
479 | 25 | case 0x490: |
480 | 25 | avctx->pix_fmt = AV_PIX_FMT_GBRP10; |
481 | 25 | break; |
482 | 0 | case 0x4B0: |
483 | 0 | avctx->pix_fmt = AV_PIX_FMT_GBRP12; |
484 | 0 | break; |
485 | 16 | case 0x4D0: |
486 | 16 | avctx->pix_fmt = AV_PIX_FMT_GBRP14; |
487 | 16 | break; |
488 | 32 | case 0x4F0: |
489 | 32 | avctx->pix_fmt = AV_PIX_FMT_GBRP16; |
490 | 32 | break; |
491 | 29 | case 0x570: |
492 | 29 | avctx->pix_fmt = AV_PIX_FMT_GBRAP; |
493 | 29 | break; |
494 | 36 | case 0x670: |
495 | 36 | avctx->pix_fmt = AV_PIX_FMT_YUV444P; |
496 | 36 | break; |
497 | 52 | case 0x680: |
498 | 52 | avctx->pix_fmt = AV_PIX_FMT_YUV444P9; |
499 | 52 | break; |
500 | 26 | case 0x690: |
501 | 26 | avctx->pix_fmt = AV_PIX_FMT_YUV444P10; |
502 | 26 | break; |
503 | 0 | case 0x6B0: |
504 | 0 | avctx->pix_fmt = AV_PIX_FMT_YUV444P12; |
505 | 0 | break; |
506 | 16 | case 0x6D0: |
507 | 16 | avctx->pix_fmt = AV_PIX_FMT_YUV444P14; |
508 | 16 | break; |
509 | 19 | case 0x6F0: |
510 | 19 | avctx->pix_fmt = AV_PIX_FMT_YUV444P16; |
511 | 19 | break; |
512 | 3 | case 0x671: |
513 | 3 | avctx->pix_fmt = AV_PIX_FMT_YUV422P; |
514 | 3 | break; |
515 | 194 | case 0x681: |
516 | 194 | avctx->pix_fmt = AV_PIX_FMT_YUV422P9; |
517 | 194 | break; |
518 | 27 | case 0x691: |
519 | 27 | avctx->pix_fmt = AV_PIX_FMT_YUV422P10; |
520 | 27 | break; |
521 | 0 | case 0x6B1: |
522 | 0 | avctx->pix_fmt = AV_PIX_FMT_YUV422P12; |
523 | 0 | break; |
524 | 18 | case 0x6D1: |
525 | 18 | avctx->pix_fmt = AV_PIX_FMT_YUV422P14; |
526 | 18 | break; |
527 | 16 | case 0x6F1: |
528 | 16 | avctx->pix_fmt = AV_PIX_FMT_YUV422P16; |
529 | 16 | break; |
530 | 85 | case 0x672: |
531 | 85 | avctx->pix_fmt = AV_PIX_FMT_YUV411P; |
532 | 85 | break; |
533 | 37 | case 0x674: |
534 | 37 | avctx->pix_fmt = AV_PIX_FMT_YUV440P; |
535 | 37 | break; |
536 | 3 | case 0x675: |
537 | 3 | avctx->pix_fmt = AV_PIX_FMT_YUV420P; |
538 | 3 | break; |
539 | 122 | case 0x685: |
540 | 122 | avctx->pix_fmt = AV_PIX_FMT_YUV420P9; |
541 | 122 | break; |
542 | 27 | case 0x695: |
543 | 27 | avctx->pix_fmt = AV_PIX_FMT_YUV420P10; |
544 | 27 | break; |
545 | 0 | case 0x6B5: |
546 | 0 | avctx->pix_fmt = AV_PIX_FMT_YUV420P12; |
547 | 0 | break; |
548 | 16 | case 0x6D5: |
549 | 16 | avctx->pix_fmt = AV_PIX_FMT_YUV420P14; |
550 | 16 | break; |
551 | 20 | case 0x6F5: |
552 | 20 | avctx->pix_fmt = AV_PIX_FMT_YUV420P16; |
553 | 20 | break; |
554 | 73 | case 0x67A: |
555 | 73 | avctx->pix_fmt = AV_PIX_FMT_YUV410P; |
556 | 73 | break; |
557 | 29 | case 0x770: |
558 | 29 | avctx->pix_fmt = AV_PIX_FMT_YUVA444P; |
559 | 29 | break; |
560 | 34 | case 0x780: |
561 | 34 | avctx->pix_fmt = AV_PIX_FMT_YUVA444P9; |
562 | 34 | break; |
563 | 24 | case 0x790: |
564 | 24 | avctx->pix_fmt = AV_PIX_FMT_YUVA444P10; |
565 | 24 | break; |
566 | 34 | case 0x7F0: |
567 | 34 | avctx->pix_fmt = AV_PIX_FMT_YUVA444P16; |
568 | 34 | break; |
569 | 39 | case 0x771: |
570 | 39 | avctx->pix_fmt = AV_PIX_FMT_YUVA422P; |
571 | 39 | break; |
572 | 28 | case 0x781: |
573 | 28 | avctx->pix_fmt = AV_PIX_FMT_YUVA422P9; |
574 | 28 | break; |
575 | 76 | case 0x791: |
576 | 76 | avctx->pix_fmt = AV_PIX_FMT_YUVA422P10; |
577 | 76 | break; |
578 | 16 | case 0x7F1: |
579 | 16 | avctx->pix_fmt = AV_PIX_FMT_YUVA422P16; |
580 | 16 | break; |
581 | 25 | case 0x775: |
582 | 25 | avctx->pix_fmt = AV_PIX_FMT_YUVA420P; |
583 | 25 | break; |
584 | 35 | case 0x785: |
585 | 35 | avctx->pix_fmt = AV_PIX_FMT_YUVA420P9; |
586 | 35 | break; |
587 | 24 | case 0x795: |
588 | 24 | avctx->pix_fmt = AV_PIX_FMT_YUVA420P10; |
589 | 24 | break; |
590 | 16 | case 0x7F5: |
591 | 16 | avctx->pix_fmt = AV_PIX_FMT_YUVA420P16; |
592 | 16 | break; |
593 | 216 | default: |
594 | 216 | return AVERROR_INVALIDDATA; |
595 | 2.36k | } |
596 | 2.36k | } |
597 | | |
598 | 4.96k | if ((avctx->pix_fmt == AV_PIX_FMT_YUV422P || avctx->pix_fmt == AV_PIX_FMT_YUV420P) && avctx->width & 1) { |
599 | 9 | av_log(avctx, AV_LOG_ERROR, "width must be even for this colorspace\n"); |
600 | 9 | return AVERROR_INVALIDDATA; |
601 | 9 | } |
602 | 4.95k | if (s->predictor == MEDIAN && avctx->pix_fmt == AV_PIX_FMT_YUV422P && |
603 | 372 | avctx->width % 4) { |
604 | 3 | av_log(avctx, AV_LOG_ERROR, "width must be a multiple of 4 " |
605 | 3 | "for this combination of colorspace and predictor type.\n"); |
606 | 3 | return AVERROR_INVALIDDATA; |
607 | 3 | } |
608 | | |
609 | 19.8k | for (int i = 0; i < 3; i++) { |
610 | 14.8k | s->temp[i] = av_malloc(4 * avctx->width + 16); |
611 | 14.8k | if (!s->temp[i]) |
612 | 0 | return AVERROR(ENOMEM); |
613 | 14.8k | } |
614 | | |
615 | 4.95k | return 0; |
616 | 4.95k | } |
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 | 100M | code = table[index].sym; \ |
621 | 100M | n = table[index].len; \ |
622 | 100M | if (max_depth > 1 && n < 0) { \ |
623 | 6.35M | LAST_SKIP_BITS(name, gb, bits); \ |
624 | 6.35M | UPDATE_CACHE(name, gb); \ |
625 | 6.35M | \ |
626 | 6.35M | nb_bits = -n; \ |
627 | 6.35M | index = SHOW_UBITS(name, gb, nb_bits) + code; \ |
628 | 6.35M | code = table[index].sym; \ |
629 | 6.35M | n = table[index].len; \ |
630 | 6.35M | if (max_depth > 2 && n < 0) { \ |
631 | 674k | LAST_SKIP_BITS(name, gb, nb_bits); \ |
632 | 674k | UPDATE_CACHE(name, gb); \ |
633 | 674k | \ |
634 | 674k | nb_bits = -n; \ |
635 | 674k | index = SHOW_UBITS(name, gb, nb_bits) + code; \ |
636 | 674k | code = table[index].sym; \ |
637 | 674k | n = table[index].len; \ |
638 | 674k | } \ |
639 | 6.35M | } \ |
640 | 100M | dst = code; \ |
641 | 100M | 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 | 55.2M | do { \ |
647 | 55.2M | unsigned int index = SHOW_UBITS(name, gb, bits); \ |
648 | 55.2M | int code, n = dtable[index].len; \ |
649 | 55.2M | \ |
650 | 55.2M | if (n<=0) { \ |
651 | 27.2M | int nb_bits; \ |
652 | 27.2M | VLC_INTERN(dst0, table1, gb, name, bits, max_depth); \ |
653 | 27.2M | \ |
654 | 27.2M | UPDATE_CACHE(re, gb); \ |
655 | 27.2M | index = SHOW_UBITS(name, gb, bits); \ |
656 | 27.2M | VLC_INTERN(dst1, table2, gb, name, bits, max_depth); \ |
657 | 27.9M | } else { \ |
658 | 27.9M | code = dtable[index].sym; \ |
659 | 27.9M | OP(dst0, dst1, code); \ |
660 | 27.9M | LAST_SKIP_BITS(name, gb, n); \ |
661 | 27.9M | } \ |
662 | 55.2M | } while (0) |
663 | | |
664 | 23.5M | #define OP8bits(dst0, dst1, code) dst0 = code>>8; dst1 = code |
665 | | |
666 | | #define READ_2PIX(dst0, dst1, plane1) \ |
667 | 30.2M | UPDATE_CACHE(re, &s->gb); \ |
668 | 30.2M | GET_VLC_DUAL(dst0, dst1, re, &s->gb, s->vlc[4+plane1].table, \ |
669 | 20.1M | s->vlc[0].table, s->vlc[plane1].table, VLC_BITS, 3, OP8bits) |
670 | | |
671 | | static void decode_422_bitstream(HYuvDecContext *s, int count) |
672 | 1.40M | { |
673 | 1.40M | int i, icount; |
674 | 1.40M | OPEN_READER(re, &s->gb); |
675 | 1.40M | count /= 2; |
676 | | |
677 | 1.40M | icount = get_bits_left(&s->gb) / (32 * 4); |
678 | 1.40M | if (count >= icount) { |
679 | 3.64M | for (i = 0; i < icount; i++) { |
680 | 2.50M | READ_2PIX(s->temp[0][2 * i], s->temp[1][i], 1); |
681 | 2.50M | READ_2PIX(s->temp[0][2 * i + 1], s->temp[2][i], 2); |
682 | 2.50M | } |
683 | 11.5M | for (; i < count && BITS_LEFT(re, &s->gb) > 0; i++) { |
684 | 10.4M | READ_2PIX(s->temp[0][2 * i ], s->temp[1][i], 1); |
685 | 10.4M | if (BITS_LEFT(re, &s->gb) <= 0) break; |
686 | 10.4M | READ_2PIX(s->temp[0][2 * i + 1], s->temp[2][i], 2); |
687 | 10.4M | } |
688 | 30.4M | for (; i < count; i++) |
689 | 29.2M | s->temp[0][2 * i ] = s->temp[1][i] = |
690 | 29.2M | s->temp[0][2 * i + 1] = s->temp[2][i] = 0; |
691 | 1.14M | } else { |
692 | 1.12M | for (i = 0; i < count; i++) { |
693 | 856k | READ_2PIX(s->temp[0][2 * i], s->temp[1][i], 1); |
694 | 856k | READ_2PIX(s->temp[0][2 * i + 1], s->temp[2][i], 2); |
695 | 856k | } |
696 | 267k | } |
697 | 1.40M | CLOSE_READER(re, &s->gb); |
698 | 1.40M | } |
699 | | |
700 | | #define READ_2PIX_PLANE(dst0, dst1, plane, OP) \ |
701 | 25.0M | UPDATE_CACHE(re, &s->gb); \ |
702 | 25.0M | GET_VLC_DUAL(dst0, dst1, re, &s->gb, s->vlc[4+plane].table, \ |
703 | 25.0M | s->vlc[plane].table, s->vlc[plane].table, VLC_BITS, 3, OP) |
704 | | |
705 | 4.44M | #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 | 1.58M | #define READ_2PIX_PLANE16(dst0, dst1, plane){\ |
710 | 1.58M | dst0 = get_vlc2(&s->gb, s->vlc[plane].table, VLC_BITS, 3)*4;\ |
711 | 1.58M | dst0 += get_bits(&s->gb, 2);\ |
712 | 1.58M | dst1 = get_vlc2(&s->gb, s->vlc[plane].table, VLC_BITS, 3)*4;\ |
713 | 1.58M | dst1 += get_bits(&s->gb, 2);\ |
714 | 1.58M | } |
715 | | static void decode_plane_bitstream(HYuvDecContext *s, int width, int plane) |
716 | 17.2M | { |
717 | 17.2M | int i, count = width/2; |
718 | | |
719 | 17.2M | if (s->bps <= 8) { |
720 | 1.39M | OPEN_READER(re, &s->gb); |
721 | 1.39M | if (count >= (get_bits_left(&s->gb)) / (32 * 2)) { |
722 | 9.77M | for (i = 0; i < count && BITS_LEFT(re, &s->gb) > 0; i++) { |
723 | 9.27M | READ_2PIX_PLANE(s->temp[0][2 * i], s->temp[0][2 * i + 1], plane, OP8bits); |
724 | 9.27M | } |
725 | 896k | } else { |
726 | 2.48M | for(i=0; i<count; i++){ |
727 | 1.59M | READ_2PIX_PLANE(s->temp[0][2 * i], s->temp[0][2 * i + 1], plane, OP8bits); |
728 | 1.59M | } |
729 | 896k | } |
730 | 1.39M | if( width&1 && BITS_LEFT(re, &s->gb)>0 ) { |
731 | 681k | unsigned int index; |
732 | 681k | int nb_bits, code, n; |
733 | 681k | UPDATE_CACHE(re, &s->gb); |
734 | 681k | index = SHOW_UBITS(re, &s->gb, VLC_BITS); |
735 | 681k | VLC_INTERN(s->temp[0][width-1], s->vlc[plane].table, |
736 | 681k | &s->gb, re, VLC_BITS, 3); |
737 | 681k | } |
738 | 1.39M | CLOSE_READER(re, &s->gb); |
739 | 15.8M | } else if (s->bps <= 14) { |
740 | 14.4M | OPEN_READER(re, &s->gb); |
741 | 14.4M | if (count >= (get_bits_left(&s->gb)) / (32 * 2)) { |
742 | 21.3M | for (i = 0; i < count && BITS_LEFT(re, &s->gb) > 0; i++) { |
743 | 12.4M | READ_2PIX_PLANE(s->temp16[0][2 * i], s->temp16[0][2 * i + 1], plane, OP14bits); |
744 | 12.4M | } |
745 | 8.86M | } else { |
746 | 7.32M | for(i=0; i<count; i++){ |
747 | 1.69M | READ_2PIX_PLANE(s->temp16[0][2 * i], s->temp16[0][2 * i + 1], plane, OP14bits); |
748 | 1.69M | } |
749 | 5.62M | } |
750 | 14.4M | if( width&1 && BITS_LEFT(re, &s->gb)>0 ) { |
751 | 5.55M | unsigned int index; |
752 | 5.55M | int nb_bits, code, n; |
753 | 5.55M | UPDATE_CACHE(re, &s->gb); |
754 | 5.55M | index = SHOW_UBITS(re, &s->gb, VLC_BITS); |
755 | 5.55M | VLC_INTERN(s->temp16[0][width-1], s->vlc[plane].table, |
756 | 5.55M | &s->gb, re, VLC_BITS, 3); |
757 | 5.55M | } |
758 | 14.4M | CLOSE_READER(re, &s->gb); |
759 | 14.4M | } else { |
760 | 1.33M | if (count >= (get_bits_left(&s->gb)) / (32 * 2)) { |
761 | 1.12M | for (i = 0; i < count && get_bits_left(&s->gb) > 0; i++) { |
762 | 168k | READ_2PIX_PLANE16(s->temp16[0][2 * i], s->temp16[0][2 * i + 1], plane); |
763 | 168k | } |
764 | 955k | } else { |
765 | 1.79M | for(i=0; i<count; i++){ |
766 | 1.41M | READ_2PIX_PLANE16(s->temp16[0][2 * i], s->temp16[0][2 * i + 1], plane); |
767 | 1.41M | } |
768 | 379k | } |
769 | 1.33M | if( width&1 && get_bits_left(&s->gb)>0 ) { |
770 | 380k | int dst = (unsigned)get_vlc2(&s->gb, s->vlc[plane].table, VLC_BITS, 3)<<2; |
771 | 380k | s->temp16[0][width-1] = dst + get_bits(&s->gb, 2); |
772 | 380k | } |
773 | 1.33M | } |
774 | 17.2M | } |
775 | | |
776 | | static void decode_gray_bitstream(HYuvDecContext *s, int count) |
777 | 937k | { |
778 | 937k | int i; |
779 | 937k | OPEN_READER(re, &s->gb); |
780 | 937k | count /= 2; |
781 | | |
782 | 937k | if (count >= (get_bits_left(&s->gb)) / (32 * 2)) { |
783 | 2.28M | for (i = 0; i < count && BITS_LEFT(re, &s->gb) > 0; i++) { |
784 | 1.56M | READ_2PIX(s->temp[0][2 * i], s->temp[0][2 * i + 1], 0); |
785 | 1.56M | } |
786 | 5.25M | for (; i < count; i++) |
787 | 4.54M | s->temp[0][2 * i] = s->temp[0][2 * i + 1] = 0; |
788 | 717k | } else { |
789 | 1.28M | for (i = 0; i < count; i++) { |
790 | 1.05M | READ_2PIX(s->temp[0][2 * i], s->temp[0][2 * i + 1], 0); |
791 | 1.05M | } |
792 | 220k | } |
793 | 937k | CLOSE_READER(re, &s->gb); |
794 | 937k | } |
795 | | |
796 | | static av_always_inline void decode_bgr_1(HYuvDecContext *s, int count, |
797 | | int decorrelate, int alpha) |
798 | 8.06M | { |
799 | 8.06M | int i; |
800 | 8.06M | OPEN_READER(re, &s->gb); |
801 | | |
802 | 24.2M | for (i = 0; i < count && BITS_LEFT(re, &s->gb) > 0; i++) { |
803 | 16.2M | unsigned int index; |
804 | 16.2M | int code, n, nb_bits; |
805 | | |
806 | 16.2M | UPDATE_CACHE(re, &s->gb); |
807 | 16.2M | index = SHOW_UBITS(re, &s->gb, VLC_BITS); |
808 | 16.2M | n = s->vlc[4].table[index].len; |
809 | | |
810 | 16.2M | if (n>0) { |
811 | 5.94M | code = s->vlc[4].table[index].sym; |
812 | 5.94M | *(uint32_t *) &s->temp[0][4 * i] = s->pix_bgr_map[code]; |
813 | 5.94M | LAST_SKIP_BITS(re, &s->gb, n); |
814 | 10.2M | } else { |
815 | 10.2M | if (decorrelate) { |
816 | 1.72M | VLC_INTERN(s->temp[0][4 * i + G], s->vlc[1].table, |
817 | 1.72M | &s->gb, re, VLC_BITS, 3); |
818 | | |
819 | 1.72M | UPDATE_CACHE(re, &s->gb); |
820 | 1.72M | index = SHOW_UBITS(re, &s->gb, VLC_BITS); |
821 | 1.72M | VLC_INTERN(code, s->vlc[0].table, &s->gb, re, VLC_BITS, 3); |
822 | 1.72M | s->temp[0][4 * i + B] = code + s->temp[0][4 * i + G]; |
823 | | |
824 | 1.72M | UPDATE_CACHE(re, &s->gb); |
825 | 1.72M | index = SHOW_UBITS(re, &s->gb, VLC_BITS); |
826 | 1.72M | VLC_INTERN(code, s->vlc[2].table, &s->gb, re, VLC_BITS, 3); |
827 | 1.72M | s->temp[0][4 * i + R] = code + s->temp[0][4 * i + G]; |
828 | 8.56M | } else { |
829 | 8.56M | VLC_INTERN(s->temp[0][4 * i + B], s->vlc[0].table, |
830 | 8.56M | &s->gb, re, VLC_BITS, 3); |
831 | | |
832 | 8.56M | UPDATE_CACHE(re, &s->gb); |
833 | 8.56M | index = SHOW_UBITS(re, &s->gb, VLC_BITS); |
834 | 8.56M | VLC_INTERN(s->temp[0][4 * i + G], s->vlc[1].table, |
835 | 8.56M | &s->gb, re, VLC_BITS, 3); |
836 | | |
837 | 8.56M | UPDATE_CACHE(re, &s->gb); |
838 | 8.56M | index = SHOW_UBITS(re, &s->gb, VLC_BITS); |
839 | 8.56M | VLC_INTERN(s->temp[0][4 * i + R], s->vlc[2].table, |
840 | 8.56M | &s->gb, re, VLC_BITS, 3); |
841 | 8.56M | } |
842 | 10.2M | } |
843 | 16.2M | if (alpha) { |
844 | 8.86M | UPDATE_CACHE(re, &s->gb); |
845 | 8.86M | index = SHOW_UBITS(re, &s->gb, VLC_BITS); |
846 | 8.86M | VLC_INTERN(s->temp[0][4 * i + A], s->vlc[2].table, |
847 | 8.86M | &s->gb, re, VLC_BITS, 3); |
848 | 8.86M | } else |
849 | 7.36M | s->temp[0][4 * i + A] = 0; |
850 | 16.2M | } |
851 | 8.06M | CLOSE_READER(re, &s->gb); |
852 | 8.06M | } |
853 | | |
854 | | static void decode_bgr_bitstream(HYuvDecContext *s, int count) |
855 | 8.06M | { |
856 | 8.06M | if (s->decorrelate) { |
857 | 7.26M | if (s->bitstream_bpp == 24) |
858 | 1.75M | decode_bgr_1(s, count, 1, 0); |
859 | 5.50M | else |
860 | 5.50M | decode_bgr_1(s, count, 1, 1); |
861 | 7.26M | } else { |
862 | 803k | if (s->bitstream_bpp == 24) |
863 | 214k | decode_bgr_1(s, count, 0, 0); |
864 | 588k | else |
865 | 588k | decode_bgr_1(s, count, 0, 1); |
866 | 803k | } |
867 | 8.06M | } |
868 | | |
869 | | static void draw_slice(HYuvDecContext *s, AVCodecContext *avctx, AVFrame *frame, int y) |
870 | 1.60M | { |
871 | 1.60M | int h, cy, i; |
872 | 1.60M | int offset[AV_NUM_DATA_POINTERS]; |
873 | | |
874 | 1.60M | if (!avctx->draw_horiz_band) |
875 | 1.60M | return; |
876 | | |
877 | 0 | h = y - s->last_slice_end; |
878 | 0 | y -= h; |
879 | |
|
880 | 0 | if (s->bitstream_bpp == 12) |
881 | 0 | cy = y >> 1; |
882 | 0 | else |
883 | 0 | cy = y; |
884 | |
|
885 | 0 | offset[0] = frame->linesize[0] * y; |
886 | 0 | offset[1] = frame->linesize[1] * cy; |
887 | 0 | offset[2] = frame->linesize[2] * cy; |
888 | 0 | for (i = 3; i < AV_NUM_DATA_POINTERS; i++) |
889 | 0 | offset[i] = 0; |
890 | 0 | emms_c(); |
891 | |
|
892 | 0 | avctx->draw_horiz_band(avctx, frame, offset, y, 3, h); |
893 | |
|
894 | 0 | s->last_slice_end = y + h; |
895 | 0 | } |
896 | | |
897 | | static int left_prediction(HYuvDecContext *s, uint8_t *dst, const uint8_t *src, int w, int acc) |
898 | 4.81M | { |
899 | 4.81M | if (s->bps <= 8) { |
900 | 752k | return s->llviddsp.add_left_pred(dst, src, w, acc); |
901 | 4.05M | } else { |
902 | 4.05M | return s->llviddsp.add_left_pred_int16(( uint16_t *)dst, (const uint16_t *)src, s->n-1, w, acc); |
903 | 4.05M | } |
904 | 4.81M | } |
905 | | |
906 | | static void add_bytes(HYuvDecContext *s, uint8_t *dst, uint8_t *src, int w) |
907 | 4.03M | { |
908 | 4.03M | if (s->bps <= 8) { |
909 | 362k | s->llviddsp.add_bytes(dst, src, w); |
910 | 3.67M | } else { |
911 | 3.67M | s->hdsp.add_int16((uint16_t*)dst, (const uint16_t*)src, s->n - 1, w); |
912 | 3.67M | } |
913 | 4.03M | } |
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 | 12.4M | { |
917 | 12.4M | if (s->bps <= 8) { |
918 | 637k | s->llviddsp.add_median_pred(dst, src, diff, w, left, left_top); |
919 | 11.7M | } else { |
920 | 11.7M | 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 | 11.7M | } |
922 | 12.4M | } |
923 | | |
924 | | static int decode_slice(AVCodecContext *avctx, AVFrame *p, int height, |
925 | | int buf_size, int y_offset, int table_size) |
926 | 308k | { |
927 | 308k | HYuvDecContext *s = avctx->priv_data; |
928 | 308k | int fake_ystride, fake_ustride, fake_vstride; |
929 | 308k | const int width = avctx->width; |
930 | 308k | const int width2 = avctx->width >> 1; |
931 | 308k | int ret; |
932 | | |
933 | 308k | if ((ret = init_get_bits8(&s->gb, s->bitstream_buffer + table_size, buf_size - table_size)) < 0) |
934 | 228 | return ret; |
935 | | |
936 | 308k | fake_ystride = s->interlaced ? p->linesize[0] * 2 : p->linesize[0]; |
937 | 308k | fake_ustride = s->interlaced ? p->linesize[1] * 2 : p->linesize[1]; |
938 | 308k | fake_vstride = s->interlaced ? p->linesize[2] * 2 : p->linesize[2]; |
939 | | |
940 | 308k | if (s->version > 2) { |
941 | 50.1k | int plane; |
942 | 189k | for(plane = 0; plane < 1 + 2*s->chroma + s->alpha; plane++) { |
943 | 138k | int left, lefttop, y; |
944 | 138k | int w = width; |
945 | 138k | int h = height; |
946 | 138k | int fake_stride = fake_ystride; |
947 | | |
948 | 138k | if (s->chroma && (plane == 1 || plane == 2)) { |
949 | 79.1k | w >>= s->chroma_h_shift; |
950 | 79.1k | h >>= s->chroma_v_shift; |
951 | 79.1k | fake_stride = plane == 1 ? fake_ustride : fake_vstride; |
952 | 79.1k | } |
953 | | |
954 | 138k | switch (s->predictor) { |
955 | 45.3k | case LEFT: |
956 | 70.4k | case PLANE: |
957 | 70.4k | decode_plane_bitstream(s, w, plane); |
958 | 70.4k | left = left_prediction(s, p->data[plane], s->temp[0], w, 0); |
959 | | |
960 | 4.75M | for (y = 1; y < h; y++) { |
961 | 4.68M | uint8_t *dst = p->data[plane] + p->linesize[plane]*y; |
962 | | |
963 | 4.68M | decode_plane_bitstream(s, w, plane); |
964 | 4.68M | left = left_prediction(s, dst, s->temp[0], w, left); |
965 | 4.68M | if (s->predictor == PLANE) { |
966 | 4.04M | if (y > s->interlaced) { |
967 | 4.03M | add_bytes(s, dst, dst - fake_stride, w); |
968 | 4.03M | } |
969 | 4.04M | } |
970 | 4.68M | } |
971 | | |
972 | 70.4k | break; |
973 | 50.7k | case MEDIAN: |
974 | 50.7k | decode_plane_bitstream(s, w, plane); |
975 | 50.7k | left= left_prediction(s, p->data[plane], s->temp[0], w, 0); |
976 | | |
977 | 50.7k | y = 1; |
978 | 50.7k | if (y >= h) |
979 | 6.96k | break; |
980 | | |
981 | | /* second line is left predicted for interlaced case */ |
982 | 43.8k | if (s->interlaced) { |
983 | 9.80k | decode_plane_bitstream(s, w, plane); |
984 | 9.80k | left = left_prediction(s, p->data[plane] + p->linesize[plane], s->temp[0], w, left); |
985 | 9.80k | y++; |
986 | 9.80k | if (y >= h) |
987 | 1.67k | break; |
988 | 9.80k | } |
989 | | |
990 | 42.1k | lefttop = p->data[plane][0]; |
991 | 42.1k | decode_plane_bitstream(s, w, plane); |
992 | 42.1k | add_median_prediction(s, p->data[plane] + fake_stride, p->data[plane], s->temp[0], w, &left, &lefttop); |
993 | 42.1k | y++; |
994 | | |
995 | 12.4M | for (; y<h; y++) { |
996 | 12.3M | uint8_t *dst; |
997 | | |
998 | 12.3M | decode_plane_bitstream(s, w, plane); |
999 | | |
1000 | 12.3M | dst = p->data[plane] + p->linesize[plane] * y; |
1001 | | |
1002 | 12.3M | add_median_prediction(s, dst, dst - fake_stride, s->temp[0], w, &left, &lefttop); |
1003 | 12.3M | } |
1004 | | |
1005 | 42.1k | break; |
1006 | 138k | } |
1007 | 138k | } |
1008 | 50.1k | draw_slice(s, avctx, p, height); |
1009 | 257k | } else if (s->bitstream_bpp < 24) { |
1010 | 68.4k | int y, cy; |
1011 | 68.4k | int lefty, leftu, leftv; |
1012 | 68.4k | int lefttopy, lefttopu, lefttopv; |
1013 | | |
1014 | 68.4k | if (s->yuy2) { |
1015 | 0 | p->data[0][3] = get_bits(&s->gb, 8); |
1016 | 0 | p->data[0][2] = get_bits(&s->gb, 8); |
1017 | 0 | p->data[0][1] = get_bits(&s->gb, 8); |
1018 | 0 | p->data[0][0] = get_bits(&s->gb, 8); |
1019 | |
|
1020 | 0 | av_log(avctx, AV_LOG_ERROR, |
1021 | 0 | "YUY2 output is not implemented yet\n"); |
1022 | 0 | return AVERROR_PATCHWELCOME; |
1023 | 68.4k | } else { |
1024 | 68.4k | leftv = |
1025 | 68.4k | p->data[2][0 + y_offset * p->linesize[2]] = get_bits(&s->gb, 8); |
1026 | 68.4k | lefty = |
1027 | 68.4k | p->data[0][1 + y_offset * p->linesize[0]] = get_bits(&s->gb, 8); |
1028 | 68.4k | leftu = |
1029 | 68.4k | p->data[1][0 + y_offset * p->linesize[1]] = get_bits(&s->gb, 8); |
1030 | 68.4k | p->data[0][0 + y_offset * p->linesize[0]] = get_bits(&s->gb, 8); |
1031 | | |
1032 | 68.4k | switch (s->predictor) { |
1033 | 45.4k | case LEFT: |
1034 | 50.1k | case PLANE: |
1035 | 50.1k | decode_422_bitstream(s, width - 2); |
1036 | 50.1k | lefty = s->llviddsp.add_left_pred(p->data[0] + p->linesize[0] * y_offset + 2, s->temp[0], |
1037 | 50.1k | width - 2, lefty); |
1038 | 50.1k | if (!(s->flags & AV_CODEC_FLAG_GRAY)) { |
1039 | 50.1k | leftu = s->llviddsp.add_left_pred(p->data[1] + p->linesize[1] * y_offset + 1, s->temp[1], width2 - 1, leftu); |
1040 | 50.1k | leftv = s->llviddsp.add_left_pred(p->data[2] + p->linesize[2] * y_offset + 1, s->temp[2], width2 - 1, leftv); |
1041 | 50.1k | } |
1042 | | |
1043 | 499k | for (cy = y = 1; y < height; y++, cy++) { |
1044 | 450k | uint8_t *ydst, *udst, *vdst; |
1045 | | |
1046 | 450k | if (s->bitstream_bpp == 12) { |
1047 | 197k | decode_gray_bitstream(s, width); |
1048 | | |
1049 | 197k | ydst = p->data[0] + p->linesize[0] * (y + y_offset); |
1050 | | |
1051 | 197k | lefty = s->llviddsp.add_left_pred(ydst, s->temp[0], |
1052 | 197k | width, lefty); |
1053 | 197k | if (s->predictor == PLANE) { |
1054 | 195k | if (y > s->interlaced) |
1055 | 194k | s->llviddsp.add_bytes(ydst, ydst - fake_ystride, width); |
1056 | 195k | } |
1057 | 197k | y++; |
1058 | 197k | if (y >= height) |
1059 | 1.67k | break; |
1060 | 197k | } |
1061 | | |
1062 | 449k | draw_slice(s, avctx, p, y); |
1063 | | |
1064 | 449k | ydst = p->data[0] + p->linesize[0] * (y + y_offset); |
1065 | 449k | udst = p->data[1] + p->linesize[1] * (cy + y_offset); |
1066 | 449k | vdst = p->data[2] + p->linesize[2] * (cy + y_offset); |
1067 | | |
1068 | 449k | decode_422_bitstream(s, width); |
1069 | 449k | lefty = s->llviddsp.add_left_pred(ydst, s->temp[0], |
1070 | 449k | width, lefty); |
1071 | 449k | if (!(s->flags & AV_CODEC_FLAG_GRAY)) { |
1072 | 449k | leftu = s->llviddsp.add_left_pred(udst, s->temp[1], width2, leftu); |
1073 | 449k | leftv = s->llviddsp.add_left_pred(vdst, s->temp[2], width2, leftv); |
1074 | 449k | } |
1075 | 449k | if (s->predictor == PLANE) { |
1076 | 352k | if (cy > s->interlaced) { |
1077 | 351k | s->llviddsp.add_bytes(ydst, ydst - fake_ystride, width); |
1078 | 351k | if (!(s->flags & AV_CODEC_FLAG_GRAY)) { |
1079 | 351k | s->llviddsp.add_bytes(udst, udst - fake_ustride, width2); |
1080 | 351k | s->llviddsp.add_bytes(vdst, vdst - fake_vstride, width2); |
1081 | 351k | } |
1082 | 351k | } |
1083 | 352k | } |
1084 | 449k | } |
1085 | 50.1k | draw_slice(s, avctx, p, height); |
1086 | | |
1087 | 50.1k | break; |
1088 | 16.3k | case MEDIAN: |
1089 | | /* first line except first 2 pixels is left predicted */ |
1090 | 16.3k | decode_422_bitstream(s, width - 2); |
1091 | 16.3k | lefty = s->llviddsp.add_left_pred(p->data[0] + 2, s->temp[0], |
1092 | 16.3k | width - 2, lefty); |
1093 | 16.3k | if (!(s->flags & AV_CODEC_FLAG_GRAY)) { |
1094 | 16.3k | leftu = s->llviddsp.add_left_pred(p->data[1] + 1, s->temp[1], width2 - 1, leftu); |
1095 | 16.3k | leftv = s->llviddsp.add_left_pred(p->data[2] + 1, s->temp[2], width2 - 1, leftv); |
1096 | 16.3k | } |
1097 | | |
1098 | 16.3k | cy = y = 1; |
1099 | 16.3k | if (y >= height) |
1100 | 1.30k | break; |
1101 | | |
1102 | | /* second line is left predicted for interlaced case */ |
1103 | 15.0k | if (s->interlaced) { |
1104 | 2.59k | decode_422_bitstream(s, width); |
1105 | 2.59k | lefty = s->llviddsp.add_left_pred(p->data[0] + p->linesize[0], |
1106 | 2.59k | s->temp[0], width, lefty); |
1107 | 2.59k | if (!(s->flags & AV_CODEC_FLAG_GRAY)) { |
1108 | 2.59k | leftu = s->llviddsp.add_left_pred(p->data[1] + p->linesize[2], s->temp[1], width2, leftu); |
1109 | 2.59k | leftv = s->llviddsp.add_left_pred(p->data[2] + p->linesize[1], s->temp[2], width2, leftv); |
1110 | 2.59k | } |
1111 | 2.59k | y++; |
1112 | 2.59k | cy++; |
1113 | 2.59k | if (y >= height) |
1114 | 1.32k | break; |
1115 | 2.59k | } |
1116 | | |
1117 | | /* next 4 pixels are left predicted too */ |
1118 | 13.7k | decode_422_bitstream(s, 4); |
1119 | 13.7k | lefty = s->llviddsp.add_left_pred(p->data[0] + fake_ystride, |
1120 | 13.7k | s->temp[0], 4, lefty); |
1121 | 13.7k | if (!(s->flags & AV_CODEC_FLAG_GRAY)) { |
1122 | 13.7k | leftu = s->llviddsp.add_left_pred(p->data[1] + fake_ustride, s->temp[1], 2, leftu); |
1123 | 13.7k | leftv = s->llviddsp.add_left_pred(p->data[2] + fake_vstride, s->temp[2], 2, leftv); |
1124 | 13.7k | } |
1125 | | |
1126 | | /* next line except the first 4 pixels is median predicted */ |
1127 | 13.7k | lefttopy = p->data[0][3]; |
1128 | 13.7k | decode_422_bitstream(s, width - 4); |
1129 | 13.7k | s->llviddsp.add_median_pred(p->data[0] + fake_ystride + 4, |
1130 | 13.7k | p->data[0] + 4, s->temp[0], |
1131 | 13.7k | width - 4, &lefty, &lefttopy); |
1132 | 13.7k | if (!(s->flags & AV_CODEC_FLAG_GRAY)) { |
1133 | 13.7k | lefttopu = p->data[1][1]; |
1134 | 13.7k | lefttopv = p->data[2][1]; |
1135 | 13.7k | s->llviddsp.add_median_pred(p->data[1] + fake_ustride + 2, p->data[1] + 2, s->temp[1], width2 - 2, &leftu, &lefttopu); |
1136 | 13.7k | s->llviddsp.add_median_pred(p->data[2] + fake_vstride + 2, p->data[2] + 2, s->temp[2], width2 - 2, &leftv, &lefttopv); |
1137 | 13.7k | } |
1138 | 13.7k | y++; |
1139 | 13.7k | cy++; |
1140 | | |
1141 | 877k | for (; y < height; y++, cy++) { |
1142 | 865k | uint8_t *ydst, *udst, *vdst; |
1143 | | |
1144 | 865k | if (s->bitstream_bpp == 12) { |
1145 | 1.47M | while (2 * cy > y) { |
1146 | 740k | decode_gray_bitstream(s, width); |
1147 | 740k | ydst = p->data[0] + p->linesize[0] * y; |
1148 | 740k | s->llviddsp.add_median_pred(ydst, ydst - fake_ystride, |
1149 | 740k | s->temp[0], width, |
1150 | 740k | &lefty, &lefttopy); |
1151 | 740k | y++; |
1152 | 740k | } |
1153 | 729k | if (y >= height) |
1154 | 1.42k | break; |
1155 | 729k | } |
1156 | 863k | draw_slice(s, avctx, p, y); |
1157 | | |
1158 | 863k | decode_422_bitstream(s, width); |
1159 | | |
1160 | 863k | ydst = p->data[0] + p->linesize[0] * y; |
1161 | 863k | udst = p->data[1] + p->linesize[1] * cy; |
1162 | 863k | vdst = p->data[2] + p->linesize[2] * cy; |
1163 | | |
1164 | 863k | s->llviddsp.add_median_pred(ydst, ydst - fake_ystride, |
1165 | 863k | s->temp[0], width, |
1166 | 863k | &lefty, &lefttopy); |
1167 | 863k | if (!(s->flags & AV_CODEC_FLAG_GRAY)) { |
1168 | 863k | s->llviddsp.add_median_pred(udst, udst - fake_ustride, s->temp[1], width2, &leftu, &lefttopu); |
1169 | 863k | s->llviddsp.add_median_pred(vdst, vdst - fake_vstride, s->temp[2], width2, &leftv, &lefttopv); |
1170 | 863k | } |
1171 | 863k | } |
1172 | | |
1173 | 13.7k | draw_slice(s, avctx, p, height); |
1174 | 13.7k | break; |
1175 | 68.4k | } |
1176 | 68.4k | } |
1177 | 189k | } else { |
1178 | 189k | int y; |
1179 | 189k | uint8_t left[4]; |
1180 | 189k | const int last_line = (y_offset + height - 1) * p->linesize[0]; |
1181 | | |
1182 | 189k | if (s->bitstream_bpp == 32) { |
1183 | 102k | left[A] = p->data[0][last_line + A] = get_bits(&s->gb, 8); |
1184 | 102k | left[R] = p->data[0][last_line + R] = get_bits(&s->gb, 8); |
1185 | 102k | left[G] = p->data[0][last_line + G] = get_bits(&s->gb, 8); |
1186 | 102k | left[B] = p->data[0][last_line + B] = get_bits(&s->gb, 8); |
1187 | 102k | } else { |
1188 | 86.8k | left[R] = p->data[0][last_line + R] = get_bits(&s->gb, 8); |
1189 | 86.8k | left[G] = p->data[0][last_line + G] = get_bits(&s->gb, 8); |
1190 | 86.8k | left[B] = p->data[0][last_line + B] = get_bits(&s->gb, 8); |
1191 | 86.8k | left[A] = p->data[0][last_line + A] = 255; |
1192 | 86.8k | skip_bits(&s->gb, 8); |
1193 | 86.8k | } |
1194 | | |
1195 | 189k | if (s->bgr32) { |
1196 | 189k | switch (s->predictor) { |
1197 | 178k | case LEFT: |
1198 | 181k | case PLANE: |
1199 | 181k | decode_bgr_bitstream(s, width - 1); |
1200 | 181k | s->hdsp.add_hfyu_left_pred_bgr32(p->data[0] + last_line + 4, |
1201 | 181k | s->temp[0], width - 1, left); |
1202 | | |
1203 | 8.06M | for (y = height - 2; y >= 0; y--) { // Yes it is stored upside down. |
1204 | 7.88M | decode_bgr_bitstream(s, width); |
1205 | | |
1206 | 7.88M | s->hdsp.add_hfyu_left_pred_bgr32(p->data[0] + p->linesize[0] * (y + y_offset), |
1207 | 7.88M | s->temp[0], width, left); |
1208 | 7.88M | if (s->predictor == PLANE) { |
1209 | 5.03M | if (s->bitstream_bpp != 32) |
1210 | 1.63M | left[A] = 0; |
1211 | 5.03M | if (y < height - 1 - s->interlaced) { |
1212 | 5.03M | s->llviddsp.add_bytes(p->data[0] + p->linesize[0] * (y + y_offset), |
1213 | 5.03M | p->data[0] + p->linesize[0] * (y + y_offset) + |
1214 | 5.03M | fake_ystride, 4 * width); |
1215 | 5.03M | } |
1216 | 5.03M | } |
1217 | 7.88M | } |
1218 | | // just 1 large slice as this is not possible in reverse order |
1219 | 181k | draw_slice(s, avctx, p, height); |
1220 | 181k | break; |
1221 | 7.56k | default: |
1222 | 7.56k | av_log(avctx, AV_LOG_ERROR, |
1223 | 7.56k | "prediction type not supported!\n"); |
1224 | 189k | } |
1225 | 189k | } else { |
1226 | 0 | av_log(avctx, AV_LOG_ERROR, |
1227 | 0 | "BGR24 output is not implemented yet\n"); |
1228 | 0 | return AVERROR_PATCHWELCOME; |
1229 | 0 | } |
1230 | 189k | } |
1231 | | |
1232 | 308k | return 0; |
1233 | 308k | } |
1234 | | |
1235 | | static int decode_frame(AVCodecContext *avctx, AVFrame *p, |
1236 | | int *got_frame, AVPacket *avpkt) |
1237 | 2.55M | { |
1238 | 2.55M | const uint8_t *buf = avpkt->data; |
1239 | 2.55M | int buf_size = avpkt->size; |
1240 | 2.55M | HYuvDecContext *s = avctx->priv_data; |
1241 | 2.55M | const int width = avctx->width; |
1242 | 2.55M | const int height = avctx->height; |
1243 | 2.55M | int slice, table_size = 0, ret, nb_slices; |
1244 | 2.55M | unsigned slices_info_offset; |
1245 | 2.55M | int slice_height; |
1246 | | |
1247 | 2.55M | if (buf_size < (width * height + 7)/8) |
1248 | 2.22M | return AVERROR_INVALIDDATA; |
1249 | | |
1250 | 332k | av_fast_padded_malloc(&s->bitstream_buffer, |
1251 | 332k | &s->bitstream_buffer_size, |
1252 | 332k | buf_size); |
1253 | 332k | if (!s->bitstream_buffer) |
1254 | 0 | return AVERROR(ENOMEM); |
1255 | | |
1256 | 332k | s->bdsp.bswap_buf((uint32_t *) s->bitstream_buffer, |
1257 | 332k | (const uint32_t *) buf, buf_size / 4); |
1258 | | |
1259 | 332k | if ((ret = ff_thread_get_buffer(avctx, p, 0)) < 0) |
1260 | 12 | return ret; |
1261 | | |
1262 | 332k | if (s->context) { |
1263 | 33.4k | table_size = read_huffman_tables(s, s->bitstream_buffer, buf_size); |
1264 | 33.4k | if (table_size < 0) |
1265 | 20.5k | return table_size; |
1266 | 33.4k | } |
1267 | | |
1268 | 311k | if ((unsigned) (buf_size - table_size) >= INT_MAX / 8) |
1269 | 0 | return AVERROR_INVALIDDATA; |
1270 | | |
1271 | 311k | s->last_slice_end = 0; |
1272 | | |
1273 | 311k | if (avctx->codec_id == AV_CODEC_ID_HYMT && |
1274 | 126k | (buf_size > 32 && AV_RL32(avpkt->data + buf_size - 16) == 0)) { |
1275 | 3.87k | slices_info_offset = AV_RL32(avpkt->data + buf_size - 4); |
1276 | 3.87k | slice_height = AV_RL32(avpkt->data + buf_size - 8); |
1277 | 3.87k | nb_slices = AV_RL32(avpkt->data + buf_size - 12); |
1278 | 3.87k | if (nb_slices * 8LL + slices_info_offset > buf_size - 16 || |
1279 | 3.33k | s->chroma_v_shift || |
1280 | 2.87k | slice_height <= 0 || nb_slices * (uint64_t)slice_height > height) |
1281 | 2.22k | return AVERROR_INVALIDDATA; |
1282 | 307k | } else { |
1283 | 307k | slice_height = height; |
1284 | 307k | nb_slices = 1; |
1285 | 307k | } |
1286 | | |
1287 | 617k | for (slice = 0; slice < nb_slices; slice++) { |
1288 | 309k | int y_offset, slice_offset, slice_size; |
1289 | | |
1290 | 309k | if (nb_slices > 1) { |
1291 | 1.82k | slice_offset = AV_RL32(avpkt->data + slices_info_offset + slice * 8); |
1292 | 1.82k | slice_size = AV_RL32(avpkt->data + slices_info_offset + slice * 8 + 4); |
1293 | | |
1294 | 1.82k | if (slice_offset < 0 || slice_size <= 0 || (slice_offset&3) || |
1295 | 981 | slice_offset + (int64_t)slice_size > buf_size) |
1296 | 1.17k | return AVERROR_INVALIDDATA; |
1297 | | |
1298 | 649 | y_offset = height - (slice + 1) * slice_height; |
1299 | 649 | s->bdsp.bswap_buf((uint32_t *)s->bitstream_buffer, |
1300 | 649 | (const uint32_t *)(buf + slice_offset), slice_size / 4); |
1301 | 307k | } else { |
1302 | 307k | y_offset = 0; |
1303 | 307k | slice_offset = 0; |
1304 | 307k | slice_size = buf_size; |
1305 | 307k | } |
1306 | | |
1307 | 308k | ret = decode_slice(avctx, p, slice_height, slice_size, y_offset, table_size); |
1308 | 308k | emms_c(); |
1309 | 308k | if (ret < 0) |
1310 | 228 | return ret; |
1311 | 308k | } |
1312 | | |
1313 | 307k | *got_frame = 1; |
1314 | | |
1315 | 307k | return (get_bits_count(&s->gb) + 31) / 32 * 4 + table_size; |
1316 | 309k | } |
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 */ |