FFmpeg
Loading...
Searching...
No Matches
huffyuvdec.c
Go to the documentation of this file.
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
52typedef struct HYuvDecContext {
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;
69 int flags;
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
87
88
89static 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
95static 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
102static 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
121static 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
140static int read_len_table(uint8_t *dst, GetByteContext *gb, int n)
141{
142 int i, val, repeat;
143
144 for (i = 0; i < n;) {
145 if (bytestream2_get_bytes_left(gb) <= 0)
146 goto error;
147 repeat = bytestream2_peek_byteu(gb) >> 5;
148 val = bytestream2_get_byteu(gb) & 0x1F;
149 if (repeat == 0) {
150 if (bytestream2_get_bytes_left(gb) <= 0)
151 goto error;
152 repeat = bytestream2_get_byteu(gb);
153 }
154 if (i + repeat > n)
155 goto error;
156 while (repeat--)
157 dst[i++] = val;
158 }
159 return 0;
160
161error:
162 av_log(NULL, AV_LOG_ERROR, "Error reading huffman table\n");
163 return AVERROR_INVALIDDATA;
164}
165
167{
168 int ret;
169 uint16_t *symbols = av_mallocz(5 << VLC_BITS);
170 uint16_t *bits;
171 uint8_t *len;
172 if (!symbols)
173 return AVERROR(ENOMEM);
174 bits = symbols + (1 << VLC_BITS);
175 len = (uint8_t *)(bits + (1 << VLC_BITS));
176
177 if (s->bitstream_bpp < 24 || s->version > 2) {
178 int count = 1 + s->alpha + 2 * s->chroma;
179 int p, i, y, u;
180 for (p = 0; p < count; p++) {
181 int p0 = s->version > 2 ? p : 0;
182 for (i = y = 0; y < s->vlc_n; y++) {
183 int len0 = s->len[p0][y];
184 int limit = VLC_BITS - len0;
185 if (limit <= 0 || !len0)
186 continue;
187 if ((sign_extend(y, 8) & (s->vlc_n-1)) != y)
188 continue;
189 for (u = 0; u < s->vlc_n; u++) {
190 int len1 = s->len[p][u];
191 if (len1 > limit || !len1)
192 continue;
193 if ((sign_extend(u, 8) & (s->vlc_n-1)) != u)
194 continue;
195 av_assert0(i < (1 << VLC_BITS));
196 len[i] = len0 + len1;
197 bits[i] = (s->bits[p0][y] << len1) + s->bits[p][u];
198 symbols[i] = (y << 8) + (u & 0xFF);
199 i++;
200 }
201 }
202 ff_vlc_free(&s->vlc[4 + p]);
203 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 uint8_t (*map)[4] = (uint8_t(*)[4]) s->pix_bgr_map;
209 int i, b, g, r, code;
210 int p0 = s->decorrelate;
211 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 for (i = 0, g = -16; g < 16; g++) {
216 int len0 = s->len[p0][g & 255];
217 int limit0 = VLC_BITS - len0;
218 if (limit0 < 2 || !len0)
219 continue;
220 for (b = -16; b < 16; b++) {
221 int len1 = s->len[p1][b & 255];
222 int limit1 = limit0 - len1;
223 if (limit1 < 1 || !len1)
224 continue;
225 code = (s->bits[p0][g & 255] << len1) + s->bits[p1][b & 255];
226 for (r = -16; r < 16; r++) {
227 int len2 = s->len[2][r & 255];
228 if (len2 > limit1 || !len2)
229 continue;
230 av_assert0(i < (1 << VLC_BITS));
231 len[i] = len0 + len1 + len2;
232 bits[i] = (code << len2) + s->bits[2][r & 255];
233 if (s->decorrelate) {
234 map[i][G] = g;
235 map[i][B] = g + b;
236 map[i][R] = g + r;
237 } else {
238 map[i][B] = g;
239 map[i][G] = b;
240 map[i][R] = r;
241 }
242 i++;
243 }
244 }
245 }
246 ff_vlc_free(&s->vlc[4]);
247 if ((ret = vlc_init(&s->vlc[4], VLC_BITS, i, len, 1, 1,
248 bits, 2, 2, 0)) < 0)
249 goto out;
250 }
251 ret = 0;
252out:
253 av_freep(&symbols);
254 return ret;
255}
256
257static int read_huffman_tables(HYuvDecContext *s, const uint8_t *src, int length)
258{
260 int i, ret;
261 int count = 3;
262
263 bytestream2_init(&gb, src, length);
264
265 if (s->version > 2)
266 count = 1 + s->alpha + 2*s->chroma;
267
268 for (i = 0; i < count; i++) {
269 if ((ret = read_len_table(s->len[i], &gb, s->vlc_n)) < 0)
270 return ret;
271 if ((ret = ff_huffyuv_generate_bits_table(s->bits[i], s->len[i], s->vlc_n)) < 0)
272 return ret;
273 ff_vlc_free(&s->vlc[i]);
274 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 if ((ret = generate_joint_tables(s)) < 0)
280 return ret;
281
282 return bytestream2_tell(&gb);
283}
284
286{
288 int i, ret;
289
291 sizeof(classic_shift_luma));
292 ret = read_len_table(s->len[0], &gb, 256);
293 av_assert1(ret >= 0);
294
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
326{
327 HYuvDecContext *s = avctx->priv_data;
328 int i;
329
330 for (int i = 0; i < 3; i++)
331 av_freep(&s->temp[i]);
332
333 av_freep(&s->bitstream_buffer);
334
335 for (i = 0; i < 8; i++)
336 ff_vlc_free(&s->vlc[i]);
337
338 return 0;
339}
340
342{
343 HYuvDecContext *s = avctx->priv_data;
344 int ret;
345
346 ret = av_image_check_size(avctx->width, avctx->height, 0, avctx);
347 if (ret < 0)
348 return ret;
349
350 s->flags = avctx->flags;
351
352 ff_bswapdsp_init(&s->bdsp);
353 ff_huffyuvdsp_init(&s->hdsp);
354 ff_llviddsp_init(&s->llviddsp);
355
356 s->interlaced = avctx->height > 288;
357 s->bgr32 = 1;
358
359 if (avctx->extradata_size) {
360 if ((avctx->bits_per_coded_sample & 7) &&
361 avctx->bits_per_coded_sample != 12)
362 s->version = 1; // do such files exist at all?
363 else if (avctx->extradata_size > 3 && avctx->extradata[3] == 0)
364 s->version = 2;
365 else
366 s->version = 3;
367 } else
368 s->version = 0;
369
370 s->bps = 8;
371 s->n = 1<<s->bps;
372 s->vlc_n = FFMIN(s->n, MAX_VLC_N);
373 s->chroma = 1;
374 if (s->version >= 2) {
375 int method, interlace;
376
377 if (avctx->extradata_size < 4)
378 return AVERROR_INVALIDDATA;
379
380 method = avctx->extradata[0];
381 s->decorrelate = method & 64 ? 1 : 0;
382 s->predictor = method & 63;
383 if (s->version == 2) {
384 s->bitstream_bpp = avctx->extradata[1];
385 if (s->bitstream_bpp == 0)
386 s->bitstream_bpp = avctx->bits_per_coded_sample & ~7;
387 } else {
388 s->bps = (avctx->extradata[1] >> 4) + 1;
389 s->n = 1<<s->bps;
390 s->vlc_n = FFMIN(s->n, MAX_VLC_N);
391 s->chroma_h_shift = avctx->extradata[1] & 3;
392 s->chroma_v_shift = (avctx->extradata[1] >> 2) & 3;
393 s->yuv = !!(avctx->extradata[2] & 1);
394 s->chroma= !!(avctx->extradata[2] & 3);
395 s->alpha = !!(avctx->extradata[2] & 4);
396 }
397 interlace = (avctx->extradata[2] & 0x30) >> 4;
398 s->interlaced = (interlace == 1) ? 1 : (interlace == 2) ? 0 : s->interlaced;
399 s->context = avctx->extradata[2] & 0x40 ? 1 : 0;
400
401 if ((ret = read_huffman_tables(s, avctx->extradata + 4,
402 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 if (s->version <= 2) {
435 switch (s->bitstream_bpp) {
436 case 12:
438 s->yuv = 1;
439 break;
440 case 16:
441 if (s->yuy2)
443 else
445 s->yuv = 1;
446 break;
447 case 24:
448 if (s->bgr32)
449 avctx->pix_fmt = AV_PIX_FMT_0RGB32;
450 else
451 avctx->pix_fmt = AV_PIX_FMT_BGR24;
452 break;
453 case 32:
454 av_assert0(s->bgr32);
455 avctx->pix_fmt = AV_PIX_FMT_RGB32;
456 s->alpha = 1;
457 break;
458 default:
459 return AVERROR_INVALIDDATA;
460 }
462 &s->chroma_h_shift,
463 &s->chroma_v_shift);
464 } else {
465 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 case 0x670:
495 break;
496 case 0x680:
498 break;
499 case 0x690:
501 break;
502 case 0x6B0:
504 break;
505 case 0x6D0:
507 break;
508 case 0x6F0:
510 break;
511 case 0x671:
513 break;
514 case 0x681:
516 break;
517 case 0x691:
519 break;
520 case 0x6B1:
522 break;
523 case 0x6D1:
525 break;
526 case 0x6F1:
528 break;
529 case 0x672:
531 break;
532 case 0x674:
534 break;
535 case 0x675:
537 break;
538 case 0x685:
540 break;
541 case 0x695:
543 break;
544 case 0x6B5:
546 break;
547 case 0x6D5:
549 break;
550 case 0x6F5:
552 break;
553 case 0x67A:
555 break;
556 case 0x770:
558 break;
559 case 0x780:
561 break;
562 case 0x790:
564 break;
565 case 0x7F0:
567 break;
568 case 0x771:
570 break;
571 case 0x781:
573 break;
574 case 0x791:
576 break;
577 case 0x7F1:
579 break;
580 case 0x775:
582 break;
583 case 0x785:
585 break;
586 case 0x795:
588 break;
589 case 0x7F5:
591 break;
592 default:
593 return AVERROR_INVALIDDATA;
594 }
595 }
596
597 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 if (s->predictor == MEDIAN && avctx->pix_fmt == AV_PIX_FMT_YUV422P &&
602 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 for (int i = 0; i < 3; i++) {
609 s->temp[i] = av_malloc(4 * avctx->width + 16);
610 if (!s->temp[i])
611 return AVERROR(ENOMEM);
612 }
613
614 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
670static void decode_422_bitstream(HYuvDecContext *s, int count)
671{
672 int i, icount;
673 OPEN_READER(re, &s->gb);
674 count /= 2;
675
676 icount = get_bits_left(&s->gb) / (32 * 4);
677 if (count >= icount) {
678 for (i = 0; i < icount; i++) {
679 READ_2PIX(s->temp[0][2 * i], s->temp[1][i], 1);
680 READ_2PIX(s->temp[0][2 * i + 1], s->temp[2][i], 2);
681 }
682 for (; i < count && BITS_LEFT(re, &s->gb) > 0; i++) {
683 READ_2PIX(s->temp[0][2 * i ], s->temp[1][i], 1);
684 if (BITS_LEFT(re, &s->gb) <= 0) break;
685 READ_2PIX(s->temp[0][2 * i + 1], s->temp[2][i], 2);
686 }
687 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 for (i = 0; i < count; i++) {
692 READ_2PIX(s->temp[0][2 * i], s->temp[1][i], 1);
693 READ_2PIX(s->temp[0][2 * i + 1], s->temp[2][i], 2);
694 }
695 }
696 CLOSE_READER(re, &s->gb);
697}
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}
714static void decode_plane_bitstream(HYuvDecContext *s, int width, int plane)
715{
716 int i, count = width/2;
717
718 if (s->bps <= 8) {
719 OPEN_READER(re, &s->gb);
720 if (count >= (get_bits_left(&s->gb)) / (32 * 2)) {
721 for (i = 0; i < count && BITS_LEFT(re, &s->gb) > 0; i++) {
722 READ_2PIX_PLANE(s->temp[0][2 * i], s->temp[0][2 * i + 1], plane, OP8bits);
723 }
724 } else {
725 for(i=0; i<count; i++){
726 READ_2PIX_PLANE(s->temp[0][2 * i], s->temp[0][2 * i + 1], plane, OP8bits);
727 }
728 }
729 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 CLOSE_READER(re, &s->gb);
738 } else if (s->bps <= 14) {
739 OPEN_READER(re, &s->gb);
740 if (count >= (get_bits_left(&s->gb)) / (32 * 2)) {
741 for (i = 0; i < count && BITS_LEFT(re, &s->gb) > 0; i++) {
742 READ_2PIX_PLANE(s->temp16[0][2 * i], s->temp16[0][2 * i + 1], plane, OP14bits);
743 }
744 } else {
745 for(i=0; i<count; i++){
746 READ_2PIX_PLANE(s->temp16[0][2 * i], s->temp16[0][2 * i + 1], plane, OP14bits);
747 }
748 }
749 if( width&1 && BITS_LEFT(re, &s->gb)>0 ) {
750 unsigned int index;
751 int nb_bits, code, n;
752 UPDATE_CACHE(re, &s->gb);
753 index = SHOW_UBITS(re, &s->gb, VLC_BITS);
754 VLC_INTERN(s->temp16[0][width-1], s->vlc[plane].table,
755 &s->gb, re, VLC_BITS, 3);
756 }
757 CLOSE_READER(re, &s->gb);
758 } else {
759 if (count >= (get_bits_left(&s->gb)) / (32 * 2)) {
760 for (i = 0; i < count && get_bits_left(&s->gb) > 0; i++) {
761 READ_2PIX_PLANE16(s->temp16[0][2 * i], s->temp16[0][2 * i + 1], plane);
762 }
763 } else {
764 for(i=0; i<count; i++){
765 READ_2PIX_PLANE16(s->temp16[0][2 * i], s->temp16[0][2 * i + 1], plane);
766 }
767 }
768 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}
774
775static void decode_gray_bitstream(HYuvDecContext *s, int count)
776{
777 int i;
778 OPEN_READER(re, &s->gb);
779 count /= 2;
780
781 if (count >= (get_bits_left(&s->gb)) / (32 * 2)) {
782 for (i = 0; i < count && BITS_LEFT(re, &s->gb) > 0; i++) {
783 READ_2PIX(s->temp[0][2 * i], s->temp[0][2 * i + 1], 0);
784 }
785 for (; i < count; i++)
786 s->temp[0][2 * i] = s->temp[0][2 * i + 1] = 0;
787 } else {
788 for (i = 0; i < count; i++) {
789 READ_2PIX(s->temp[0][2 * i], s->temp[0][2 * i + 1], 0);
790 }
791 }
792 CLOSE_READER(re, &s->gb);
793}
794
796 int decorrelate, int alpha)
797{
798 int i;
799 OPEN_READER(re, &s->gb);
800
801 for (i = 0; i < count && BITS_LEFT(re, &s->gb) > 0; i++) {
802 unsigned int index;
803 int code, n, nb_bits;
804
805 UPDATE_CACHE(re, &s->gb);
806 index = SHOW_UBITS(re, &s->gb, VLC_BITS);
807 n = s->vlc[4].table[index].len;
808
809 if (n>0) {
810 code = s->vlc[4].table[index].sym;
811 *(uint32_t *) &s->temp[0][4 * i] = s->pix_bgr_map[code];
812 LAST_SKIP_BITS(re, &s->gb, n);
813 } else {
814 if (decorrelate) {
815 VLC_INTERN(s->temp[0][4 * i + G], s->vlc[1].table,
816 &s->gb, re, VLC_BITS, 3);
817
818 UPDATE_CACHE(re, &s->gb);
819 index = SHOW_UBITS(re, &s->gb, VLC_BITS);
820 VLC_INTERN(code, s->vlc[0].table, &s->gb, re, VLC_BITS, 3);
821 s->temp[0][4 * i + B] = code + s->temp[0][4 * i + G];
822
823 UPDATE_CACHE(re, &s->gb);
824 index = SHOW_UBITS(re, &s->gb, VLC_BITS);
825 VLC_INTERN(code, s->vlc[2].table, &s->gb, re, VLC_BITS, 3);
826 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 if (alpha) {
843 UPDATE_CACHE(re, &s->gb);
844 index = SHOW_UBITS(re, &s->gb, VLC_BITS);
845 VLC_INTERN(s->temp[0][4 * i + A], s->vlc[2].table,
846 &s->gb, re, VLC_BITS, 3);
847 } else
848 s->temp[0][4 * i + A] = 0;
849 }
850 CLOSE_READER(re, &s->gb);
851}
852
853static void decode_bgr_bitstream(HYuvDecContext *s, int count)
854{
855 if (s->decorrelate) {
856 if (s->bitstream_bpp == 24)
857 decode_bgr_1(s, count, 1, 0);
858 else
859 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}
867
869{
870 int h, cy, i;
872
873 if (!avctx->draw_horiz_band)
874 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
895static int left_prediction(HYuvDecContext *s, uint8_t *dst, const uint8_t *src, int w, int acc)
896{
897 if (s->bps <= 8) {
898 return s->llviddsp.add_left_pred(dst, src, w, acc);
899 } else {
900 return s->llviddsp.add_left_pred_int16(( uint16_t *)dst, (const uint16_t *)src, s->n-1, w, acc);
901 }
902}
903
904static void add_bytes(HYuvDecContext *s, uint8_t *dst, uint8_t *src, int w)
905{
906 if (s->bps <= 8) {
907 s->llviddsp.add_bytes(dst, src, w);
908 } else {
909 s->hdsp.add_int16((uint16_t*)dst, (const uint16_t*)src, s->n - 1, w);
910 }
911}
912
913static 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 if (s->bps <= 8) {
916 s->llviddsp.add_median_pred(dst, src, diff, w, left, left_top);
917 } else {
918 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}
921
922static int decode_slice(AVCodecContext *avctx, AVFrame *p, int height,
923 int buf_size, int y_offset, int table_size)
924{
925 HYuvDecContext *s = avctx->priv_data;
926 int fake_ystride, fake_ustride, fake_vstride;
927 const int width = avctx->width;
928 const int width2 = avctx->width >> 1;
929 int ret;
930
931 if ((ret = init_get_bits8(&s->gb, s->bitstream_buffer + table_size, buf_size - table_size)) < 0)
932 return ret;
933
934 fake_ystride = s->interlaced ? p->linesize[0] * 2 : p->linesize[0];
935 fake_ustride = s->interlaced ? p->linesize[1] * 2 : p->linesize[1];
936 fake_vstride = s->interlaced ? p->linesize[2] * 2 : p->linesize[2];
937
938 if (s->version > 2) {
939 int plane;
940 for(plane = 0; plane < 1 + 2*s->chroma + s->alpha; plane++) {
941 int left, lefttop, y;
942 int w = width;
943 int h = height;
944 int fake_stride = fake_ystride;
945
946 if (s->chroma && (plane == 1 || plane == 2)) {
947 w >>= s->chroma_h_shift;
948 h >>= s->chroma_v_shift;
949 fake_stride = plane == 1 ? fake_ustride : fake_vstride;
950 }
951
952 switch (s->predictor) {
953 case LEFT:
954 case PLANE:
955 decode_plane_bitstream(s, w, plane);
956 left = left_prediction(s, p->data[plane], s->temp[0], w, 0);
957
958 for (y = 1; y < h; y++) {
959 uint8_t *dst = p->data[plane] + p->linesize[plane]*y;
960
961 decode_plane_bitstream(s, w, plane);
962 left = left_prediction(s, dst, s->temp[0], w, left);
963 if (s->predictor == PLANE) {
964 if (y > s->interlaced) {
965 add_bytes(s, dst, dst - fake_stride, w);
966 }
967 }
968 }
969
970 break;
971 case MEDIAN:
972 decode_plane_bitstream(s, w, plane);
973 left= left_prediction(s, p->data[plane], s->temp[0], w, 0);
974
975 y = 1;
976 if (y >= h)
977 break;
978
979 /* second line is left predicted for interlaced case */
980 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 lefttop = READ_LOWBYTE(p->data[plane], s->bps);
989 decode_plane_bitstream(s, w, plane);
990 add_median_prediction(s, p->data[plane] + fake_stride, p->data[plane], s->temp[0], w, &left, &lefttop);
991 y++;
992
993 for (; y<h; y++) {
994 uint8_t *dst;
995
996 decode_plane_bitstream(s, w, plane);
997
998 dst = p->data[plane] + p->linesize[plane] * y;
999
1000 add_median_prediction(s, dst, dst - fake_stride, s->temp[0], w, &left, &lefttop);
1001 }
1002
1003 break;
1004 }
1005 }
1006 draw_slice(s, avctx, p, height);
1007 } else if (s->bitstream_bpp < 24) {
1008 int y, cy;
1009 int lefty, leftu, leftv;
1010 int lefttopy, lefttopu, lefttopv;
1011
1012 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 leftv =
1023 p->data[2][0 + y_offset * p->linesize[2]] = get_bits(&s->gb, 8);
1024 lefty =
1025 p->data[0][1 + y_offset * p->linesize[0]] = get_bits(&s->gb, 8);
1026 leftu =
1027 p->data[1][0 + y_offset * p->linesize[1]] = get_bits(&s->gb, 8);
1028 p->data[0][0 + y_offset * p->linesize[0]] = get_bits(&s->gb, 8);
1029
1030 switch (s->predictor) {
1031 case LEFT:
1032 case PLANE:
1034 lefty = s->llviddsp.add_left_pred(p->data[0] + p->linesize[0] * y_offset + 2, s->temp[0],
1035 width - 2, lefty);
1036 if (!(s->flags & AV_CODEC_FLAG_GRAY)) {
1037 leftu = s->llviddsp.add_left_pred(p->data[1] + p->linesize[1] * y_offset + 1, s->temp[1], width2 - 1, leftu);
1038 leftv = s->llviddsp.add_left_pred(p->data[2] + p->linesize[2] * y_offset + 1, s->temp[2], width2 - 1, leftv);
1039 }
1040
1041 for (cy = y = 1; y < height; y++, cy++) {
1042 uint8_t *ydst, *udst, *vdst;
1043
1044 if (s->bitstream_bpp == 12) {
1046
1047 ydst = p->data[0] + p->linesize[0] * (y + y_offset);
1048
1049 lefty = s->llviddsp.add_left_pred(ydst, s->temp[0],
1050 width, lefty);
1051 if (s->predictor == PLANE) {
1052 if (y > s->interlaced)
1053 s->llviddsp.add_bytes(ydst, ydst - fake_ystride, width);
1054 }
1055 y++;
1056 if (y >= height)
1057 break;
1058 }
1059
1060 draw_slice(s, avctx, p, y);
1061
1062 ydst = p->data[0] + p->linesize[0] * (y + y_offset);
1063 udst = p->data[1] + p->linesize[1] * (cy + y_offset);
1064 vdst = p->data[2] + p->linesize[2] * (cy + y_offset);
1065
1067 lefty = s->llviddsp.add_left_pred(ydst, s->temp[0],
1068 width, lefty);
1069 if (!(s->flags & AV_CODEC_FLAG_GRAY)) {
1070 leftu = s->llviddsp.add_left_pred(udst, s->temp[1], width2, leftu);
1071 leftv = s->llviddsp.add_left_pred(vdst, s->temp[2], width2, leftv);
1072 }
1073 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 draw_slice(s, avctx, p, height);
1084
1085 break;
1086 case MEDIAN:
1087 /* first line except first 2 pixels is left predicted */
1089 lefty = s->llviddsp.add_left_pred(p->data[0] + 2, s->temp[0],
1090 width - 2, lefty);
1091 if (!(s->flags & AV_CODEC_FLAG_GRAY)) {
1092 leftu = s->llviddsp.add_left_pred(p->data[1] + 1, s->temp[1], width2 - 1, leftu);
1093 leftv = s->llviddsp.add_left_pred(p->data[2] + 1, s->temp[2], width2 - 1, leftv);
1094 }
1095
1096 cy = y = 1;
1097 if (y >= height)
1098 break;
1099
1100 /* second line is left predicted for interlaced case */
1101 if (s->interlaced) {
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 */
1117 lefty = s->llviddsp.add_left_pred(p->data[0] + fake_ystride,
1118 s->temp[0], 4, lefty);
1119 if (!(s->flags & AV_CODEC_FLAG_GRAY)) {
1120 leftu = s->llviddsp.add_left_pred(p->data[1] + fake_ustride, s->temp[1], 2, leftu);
1121 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 lefttopy = p->data[0][3];
1127 s->llviddsp.add_median_pred(p->data[0] + fake_ystride + 4,
1128 p->data[0] + 4, s->temp[0],
1129 width - 4, &lefty, &lefttopy);
1130 if (!(s->flags & AV_CODEC_FLAG_GRAY)) {
1131 lefttopu = p->data[1][1];
1132 lefttopv = p->data[2][1];
1133 s->llviddsp.add_median_pred(p->data[1] + fake_ustride + 2, p->data[1] + 2, s->temp[1], width2 - 2, &leftu, &lefttopu);
1134 s->llviddsp.add_median_pred(p->data[2] + fake_vstride + 2, p->data[2] + 2, s->temp[2], width2 - 2, &leftv, &lefttopv);
1135 }
1136 y++;
1137 cy++;
1138
1139 for (; y < height; y++, cy++) {
1140 uint8_t *ydst, *udst, *vdst;
1141
1142 if (s->bitstream_bpp == 12) {
1143 while (2 * cy > y) {
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 draw_slice(s, avctx, p, y);
1155
1157
1158 ydst = p->data[0] + p->linesize[0] * y;
1159 udst = p->data[1] + p->linesize[1] * cy;
1160 vdst = p->data[2] + p->linesize[2] * cy;
1161
1162 s->llviddsp.add_median_pred(ydst, ydst - fake_ystride,
1163 s->temp[0], width,
1164 &lefty, &lefttopy);
1165 if (!(s->flags & AV_CODEC_FLAG_GRAY)) {
1166 s->llviddsp.add_median_pred(udst, udst - fake_ustride, s->temp[1], width2, &leftu, &lefttopu);
1167 s->llviddsp.add_median_pred(vdst, vdst - fake_vstride, s->temp[2], width2, &leftv, &lefttopv);
1168 }
1169 }
1170
1171 draw_slice(s, avctx, p, height);
1172 break;
1173 }
1174 }
1175 } else {
1176 int y;
1177 uint8_t left[4];
1178 const int last_line = (y_offset + height - 1) * p->linesize[0];
1179
1180 if (s->bitstream_bpp == 32) {
1181 left[A] = p->data[0][last_line + A] = get_bits(&s->gb, 8);
1182 left[R] = p->data[0][last_line + R] = get_bits(&s->gb, 8);
1183 left[G] = p->data[0][last_line + G] = get_bits(&s->gb, 8);
1184 left[B] = p->data[0][last_line + B] = get_bits(&s->gb, 8);
1185 } else {
1186 left[R] = p->data[0][last_line + R] = get_bits(&s->gb, 8);
1187 left[G] = p->data[0][last_line + G] = get_bits(&s->gb, 8);
1188 left[B] = p->data[0][last_line + B] = get_bits(&s->gb, 8);
1189 left[A] = p->data[0][last_line + A] = 255;
1190 skip_bits(&s->gb, 8);
1191 }
1192
1193 if (s->bgr32) {
1194 switch (s->predictor) {
1195 case LEFT:
1196 case PLANE:
1198 s->hdsp.add_hfyu_left_pred_bgr32(p->data[0] + last_line + 4,
1199 s->temp[0], width - 1, left);
1200
1201 for (y = height - 2; y >= 0; y--) { // Yes it is stored upside down.
1203
1204 s->hdsp.add_hfyu_left_pred_bgr32(p->data[0] + p->linesize[0] * (y + y_offset),
1205 s->temp[0], width, left);
1206 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 draw_slice(s, avctx, p, height);
1218 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 return 0;
1231}
1232
1234 int *got_frame, AVPacket *avpkt)
1235{
1236 const uint8_t *buf = avpkt->data;
1237 int buf_size = avpkt->size;
1238 HYuvDecContext *s = avctx->priv_data;
1239 const int width = avctx->width;
1240 const int height = avctx->height;
1241 int slice, table_size = 0, ret, nb_slices;
1242 unsigned slices_info_offset;
1243 int slice_height;
1244
1245 if (buf_size < (width * height + 7)/8)
1246 return AVERROR_INVALIDDATA;
1247
1248 av_fast_padded_malloc(&s->bitstream_buffer,
1249 &s->bitstream_buffer_size,
1250 buf_size);
1251 if (!s->bitstream_buffer)
1252 return AVERROR(ENOMEM);
1253
1254 s->bdsp.bswap_buf((uint32_t *) s->bitstream_buffer,
1255 (const uint32_t *) buf, buf_size / 4);
1256
1257 if ((ret = ff_thread_get_buffer(avctx, p, 0)) < 0)
1258 return ret;
1259
1260 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 if ((unsigned) (buf_size - table_size) >= INT_MAX / 8)
1267 return AVERROR_INVALIDDATA;
1268
1269 s->last_slice_end = 0;
1270
1271 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 slice_height = height;
1282 nb_slices = 1;
1283 }
1284
1285 for (slice = 0; slice < nb_slices; slice++) {
1286 int y_offset, slice_offset, slice_size;
1287
1288 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 y_offset = 0;
1301 slice_offset = 0;
1302 slice_size = buf_size;
1303 }
1304
1305 ret = decode_slice(avctx, p, slice_height, slice_size, y_offset, table_size);
1306 if (ret < 0)
1307 return ret;
1308 }
1309
1310 *got_frame = 1;
1311
1312 return (get_bits_count(&s->gb) + 31) / 32 * 4 + table_size;
1313}
1314
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,
1326 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
1327};
1328
1329#if CONFIG_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,
1341 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
1342};
1343#endif /* CONFIG_FFVHUFF_DECODER */
1344
1345#if CONFIG_HYMT_DECODER
1346const 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,
1357 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
1358};
1359#endif /* CONFIG_HYMT_DECODER */
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition dsp.h:87
static double val(void *priv, double ch)
Definition aeval.c:77
const FFCodec ff_hymt_decoder
const FFCodec ff_huffyuv_decoder
const FFCodec ff_ffvhuff_decoder
static av_cold void close(AVCodecParserContext *s)
Definition apv_parser.c:197
#define A(x)
Definition vpx_arith.h:28
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition avassert.h:58
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition avassert.h:42
Libavcodec external API header.
static int BS_FUNC left(const BSCTX *bc)
Return the number of the bits left in a buffer.
static av_always_inline int bytestream2_get_bytes_left(const GetByteContext *g)
Definition bytestream.h:158
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
Definition bytestream.h:137
static av_always_inline int bytestream2_tell(const GetByteContext *g)
Definition bytestream.h:192
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
#define s(width, name)
Definition cbs_vp9.c:198
#define LEFT
Definition cdgraphics.c:168
#define VLC_BITS
Definition cfhd.h:103
#define FF_CODEC_DECODE_CB(func)
#define CODEC_LONG_NAME(str)
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
#define NULL
Definition coverity.c:32
long long int64_t
Definition coverity.c:34
static AVFrame * frame
int(* init)(AVBSFContext *ctx)
Definition dts2pts.c:608
static const uint8_t bits[8]
Definition fastaudio.c:100
#define AV_NUM_DATA_POINTERS
Definition frame.h:473
bitstream reader API header.
static av_always_inline int get_vlc2(GetBitContext *s, const VLCElem *table, int bits, int max_depth)
Parse a vlc code.
Definition get_bits.h:645
#define CLOSE_READER(name, gb)
Definition get_bits.h:189
static int get_bits_left(GetBitContext *gb)
Definition get_bits.h:688
#define SHOW_UBITS(name, gb, num)
Definition get_bits.h:247
#define OPEN_READER(name, gb)
Definition get_bits.h:182
static void skip_bits(GetBitContext *s, int n)
Definition get_bits.h:383
#define UPDATE_CACHE(name, gb)
Definition get_bits.h:213
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
Definition get_bits.h:544
#define LAST_SKIP_BITS(name, gb, num)
Definition get_bits.h:235
static int get_bits_count(const GetBitContext *s)
Definition get_bits.h:254
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition get_bits.h:337
#define BITS_LEFT(name, gb)
Definition get_bits.h:227
#define AV_CODEC_CAP_DRAW_HORIZ_BAND
Decoder can use draw_horiz_band callback.
Definition codec.h:41
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition codec.h:49
#define AV_CODEC_FLAG_GRAY
Only decode/encode grayscale.
Definition avcodec.h:302
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
Definition codec.h:98
@ AV_CODEC_ID_FFVHUFF
Definition codec_id.h:117
@ AV_CODEC_ID_HUFFYUV
Definition codec_id.h:75
@ AV_CODEC_ID_HYMT
Definition codec_id.h:287
void av_fast_padded_malloc(void *ptr, unsigned int *size, size_t min_size)
Same behaviour av_fast_malloc but the buffer has additional AV_INPUT_BUFFER_PADDING_SIZE at the end w...
Definition utils.c:53
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition error.h:64
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition error.h:61
#define AVERROR(e)
Definition error.h:45
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
@ AVMEDIA_TYPE_VIDEO
Definition avutil.h:200
int av_image_check_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx)
Check if the given dimension of an image is valid, meaning that all bytes of the image can be address...
Definition imgutils.c:318
int index
Definition gxfenc.c:90
int ff_huffyuv_generate_bits_table(uint32_t *dst, const uint8_t *len_table, int n)
Definition huffyuv.c:40
huffyuv codec for libavcodec.
#define B
Definition huffyuv.h:42
#define R
Definition huffyuv.h:44
#define MAX_VLC_N
Definition huffyuv.h:50
@ PLANE
Definition huffyuv.h:54
#define READ_LOWBYTE(plane, bps)
Definition huffyuv.h:58
#define G
Definition huffyuv.h:43
static void decode_bgr_bitstream(HYuvDecContext *s, int count)
Definition huffyuvdec.c:853
static const unsigned char classic_add_luma[256]
Definition huffyuvdec.c:102
static void add_bytes(HYuvDecContext *s, uint8_t *dst, uint8_t *src, int w)
Definition huffyuvdec.c:904
static int read_len_table(uint8_t *dst, GetByteContext *gb, int n)
Definition huffyuvdec.c:140
#define VLC_INTERN(dst, table, gb, name, bits, max_depth)
Subset of GET_VLC for use in hand-roller VLC code.
Definition huffyuvdec.c:618
#define OP8bits(dst0, dst1, code)
Definition huffyuvdec.c:663
static const unsigned char classic_add_chroma[256]
Definition huffyuvdec.c:121
static const uint8_t classic_shift_luma[]
Definition huffyuvdec.c:89
static av_cold int decode_init(AVCodecContext *avctx)
Definition huffyuvdec.c:341
#define READ_2PIX(dst0, dst1, plane1)
Definition huffyuvdec.c:665
static void decode_plane_bitstream(HYuvDecContext *s, int width, int plane)
Definition huffyuvdec.c:714
static av_cold int decode_end(AVCodecContext *avctx)
Definition huffyuvdec.c:325
static av_always_inline void decode_bgr_1(HYuvDecContext *s, int count, int decorrelate, int alpha)
Definition huffyuvdec.c:795
static int decode_slice(AVCodecContext *avctx, AVFrame *p, int height, int buf_size, int y_offset, int table_size)
Definition huffyuvdec.c:922
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)
Definition huffyuvdec.c:913
static int left_prediction(HYuvDecContext *s, uint8_t *dst, const uint8_t *src, int w, int acc)
Definition huffyuvdec.c:895
static int decode_frame(AVCodecContext *avctx, AVFrame *p, int *got_frame, AVPacket *avpkt)
static const uint8_t classic_shift_chroma[]
Definition huffyuvdec.c:95
#define VLC_BITS
Definition huffyuvdec.c:50
#define READ_2PIX_PLANE16(dst0, dst1, plane)
Definition huffyuvdec.c:708
#define READ_2PIX_PLANE(dst0, dst1, plane, OP)
Definition huffyuvdec.c:699
static int generate_joint_tables(HYuvDecContext *s)
Definition huffyuvdec.c:166
static void decode_422_bitstream(HYuvDecContext *s, int count)
Definition huffyuvdec.c:670
static int read_huffman_tables(HYuvDecContext *s, const uint8_t *src, int length)
Definition huffyuvdec.c:257
static void decode_gray_bitstream(HYuvDecContext *s, int count)
Definition huffyuvdec.c:775
static int read_old_huffman_tables(HYuvDecContext *s)
Definition huffyuvdec.c:285
#define OP14bits(dst0, dst1, code)
Definition huffyuvdec.c:704
static void draw_slice(HYuvDecContext *s, AVCodecContext *avctx, AVFrame *frame, int y)
Definition huffyuvdec.c:868
const VDPAUPixFmtMap * map
static const int16_t alpha[]
Definition ilbcdata.h:55
misc image utilities
#define r
Definition input.c:42
#define b
Definition input.c:43
#define AV_RL32(p)
unsigned offset
Definition libaomenc.c:763
static av_cold int decode_init(AVCodecContext *avctx)
Definition 4xm.c:998
static av_cold int decode_end(AVCodecContext *avctx)
Definition 4xm.c:980
static int decode_frame(AVCodecContext *avctx, AVFrame *picture, int *got_frame, AVPacket *avpkt)
Definition 4xm.c:837
av_cold void ff_bswapdsp_init(BswapDSPContext *c)
Definition bswapdsp.c:37
#define u(width, name, range_min, range_max)
Definition cbs_apv.c:68
av_cold void ff_huffyuvdsp_init(HuffYUVDSPContext *c)
Definition huffyuvdsp.c:84
Multithreading API for decoders.
#define av_always_inline
Definition attributes.h:72
#define av_cold
Definition attributes.h:117
uint8_t w
Definition llvidencdsp.c:39
av_cold void ff_llviddsp_init(LLVidDSPContext *c)
#define FFMIN(a, b)
Definition macros.h:49
static av_const int sign_extend(int val, unsigned bits)
Definition mathops.h:135
Memory handling functions.
uint8_t interlaced
Definition mxfenc.c:2336
#define av_malloc(s)
Definition ops_static.c:52
int av_pix_fmt_get_chroma_sub_sample(enum AVPixelFormat pix_fmt, int *h_shift, int *v_shift)
Utility function to access log2_chroma_w log2_chroma_h from the pixel format AVPixFmtDescriptor.
Definition pixdesc.c:3488
#define AV_PIX_FMT_0RGB32
Definition pixfmt.h:521
#define AV_PIX_FMT_YUV420P16
Definition pixfmt.h:556
#define AV_PIX_FMT_YUV444P12
Definition pixfmt.h:552
#define AV_PIX_FMT_YUV444P9
Definition pixfmt.h:544
#define AV_PIX_FMT_YUV420P10
Definition pixfmt.h:545
#define AV_PIX_FMT_GBRP9
Definition pixfmt.h:563
#define AV_PIX_FMT_YUV422P9
Definition pixfmt.h:543
#define AV_PIX_FMT_YUVA444P10
Definition pixfmt.h:598
#define AV_PIX_FMT_YUVA420P16
Definition pixfmt.h:601
#define AV_PIX_FMT_YUV420P12
Definition pixfmt.h:549
#define AV_PIX_FMT_YUVA420P10
Definition pixfmt.h:596
#define AV_PIX_FMT_YUVA422P9
Definition pixfmt.h:594
#define AV_PIX_FMT_YUV422P12
Definition pixfmt.h:550
#define AV_PIX_FMT_GBRP10
Definition pixfmt.h:564
#define AV_PIX_FMT_YUV422P10
Definition pixfmt.h:546
#define AV_PIX_FMT_GBRP12
Definition pixfmt.h:565
#define AV_PIX_FMT_YUV420P9
Definition pixfmt.h:542
#define AV_PIX_FMT_YUVA420P9
Definition pixfmt.h:593
#define AV_PIX_FMT_YUVA422P10
Definition pixfmt.h:597
#define AV_PIX_FMT_YUV420P14
Definition pixfmt.h:553
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition pixfmt.h:73
@ AV_PIX_FMT_YUV440P
planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
Definition pixfmt.h:106
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition pixfmt.h:77
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
Definition pixfmt.h:81
@ AV_PIX_FMT_YUVA420P
planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
Definition pixfmt.h:108
@ AV_PIX_FMT_YUV410P
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
Definition pixfmt.h:79
@ AV_PIX_FMT_YUV411P
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
Definition pixfmt.h:80
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
Definition pixfmt.h:78
@ AV_PIX_FMT_YUVA444P
planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)
Definition pixfmt.h:174
@ AV_PIX_FMT_GBRAP
planar GBRA 4:4:4:4 32bpp
Definition pixfmt.h:212
@ AV_PIX_FMT_YUVA422P
planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples)
Definition pixfmt.h:173
@ AV_PIX_FMT_YUYV422
packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr
Definition pixfmt.h:74
@ AV_PIX_FMT_BGR24
packed RGB 8:8:8, 24bpp, BGRBGR...
Definition pixfmt.h:76
@ AV_PIX_FMT_GBRP
planar GBR 4:4:4 24bpp
Definition pixfmt.h:165
#define AV_PIX_FMT_YUV422P14
Definition pixfmt.h:554
#define AV_PIX_FMT_YUV422P16
Definition pixfmt.h:557
#define AV_PIX_FMT_GRAY16
Definition pixfmt.h:528
#define AV_PIX_FMT_YUVA444P16
Definition pixfmt.h:603
#define AV_PIX_FMT_YUVA422P16
Definition pixfmt.h:602
#define AV_PIX_FMT_GBRP16
Definition pixfmt.h:567
#define AV_PIX_FMT_YUV444P14
Definition pixfmt.h:555
#define AV_PIX_FMT_YUVA444P9
Definition pixfmt.h:595
#define AV_PIX_FMT_GBRP14
Definition pixfmt.h:566
#define AV_PIX_FMT_YUV444P16
Definition pixfmt.h:558
#define AV_PIX_FMT_RGB32
Definition pixfmt.h:517
#define AV_PIX_FMT_YUV444P10
Definition pixfmt.h:548
int ff_thread_get_buffer(AVCodecContext *avctx, AVFrame *f, int flags)
Wrapper around get_buffer() for frame-multithreaded codecs.
#define MEDIAN(x)
static void decorrelate(SnowContext *s, SubBand *b, IDWTELEM *src, int stride, int inverse, int use_median)
Definition snowenc.c:1526
const uint8_t * code
Definition spdifenc.c:433
main external API structure.
Definition avcodec.h:443
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition avcodec.h:643
int width
picture width / height.
Definition avcodec.h:604
int bits_per_coded_sample
bits per sample/pixel from the demuxer (needed for huffyuv).
Definition avcodec.h:1564
void(* draw_horiz_band)(struct AVCodecContext *s, const AVFrame *src, int offset[AV_NUM_DATA_POINTERS], int y, int type, int height)
If non NULL, 'draw_horiz_band' is called by the libavcodec decoder to draw a horizontal band.
Definition avcodec.h:744
int flags
AV_CODEC_FLAG_*.
Definition avcodec.h:500
uint8_t * extradata
Out-of-band global headers that may be used by some codecs.
Definition avcodec.h:526
enum AVCodecID codec_id
Definition avcodec.h:453
int extradata_size
Definition avcodec.h:527
void * priv_data
Definition avcodec.h:470
This structure describes decoded (raw) audio or video data.
Definition frame.h:472
This structure stores compressed data.
Definition packet.h:580
int size
Definition packet.h:604
uint8_t * data
Definition packet.h:603
Predictor predictor
Definition huffyuvdec.c:54
unsigned int bitstream_buffer_size
Definition huffyuvdec.c:82
GetBitContext gb
Definition huffyuvdec.c:53
uint32_t bits[4][MAX_VLC_N]
Definition huffyuvdec.c:78
BswapDSPContext bdsp
Definition huffyuvdec.c:83
uint8_t len[4][MAX_VLC_N]
Definition huffyuvdec.c:77
HuffYUVDSPContext hdsp
Definition huffyuvdec.c:84
uint32_t pix_bgr_map[1<< VLC_BITS]
Definition huffyuvdec.c:79
LLVidDSPContext llviddsp
Definition huffyuvdec.c:85
uint8_t * temp[3]
Definition huffyuvdec.c:74
uint16_t * temp16[3]
Definition huffyuvdec.c:75
uint8_t * bitstream_buffer
Definition huffyuvdec.c:81
Definition vlc.h:50
#define av_mallocz(s)
#define av_freep(p)
#define av_log(a,...)
static void error(const char *err)
#define src
Definition vp8dsp.c:248
static FILE * out
Definition movenc.c:55
#define height
Definition dsp.h:89
#define width
Definition dsp.h:89
const char * g
Definition vf_curves.c:128
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)
static double limit(double x)
int ff_vlc_init_sparse(VLC *vlc, int nb_bits, int nb_codes, const void *bits, int bits_wrap, int bits_size, const void *codes, int codes_wrap, int codes_size, const void *symbols, int symbols_wrap, int symbols_size, int flags)
Build VLC decoding tables suitable for use with get_vlc2().
Definition vlc.c:250
void ff_vlc_free(VLC *vlc)
Definition vlc.c:580
#define vlc_init(vlc, nb_bits, nb_codes, bits, bits_wrap, bits_size, codes, codes_wrap, codes_size, flags)
Definition vlc.h:70
int len