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 memset(s->temp[0] + 2 * i, 0, 2 * (count - i));
725 } else {
726 for(i=0; i<count; i++){
727 READ_2PIX_PLANE(s->temp[0][2 * i], s->temp[0][2 * i + 1], plane, OP8bits);
728 }
729 }
730 if( width&1 && BITS_LEFT(re, &s->gb)>0 ) {
731 unsigned int index;
732 int nb_bits, code, n;
733 UPDATE_CACHE(re, &s->gb);
734 index = SHOW_UBITS(re, &s->gb, VLC_BITS);
735 VLC_INTERN(s->temp[0][width-1], s->vlc[plane].table,
736 &s->gb, re, VLC_BITS, 3);
737 } else if (width & 1)
738 s->temp[0][width - 1] = 0;
739 CLOSE_READER(re, &s->gb);
740 } else if (s->bps <= 14) {
741 OPEN_READER(re, &s->gb);
742 if (count >= (get_bits_left(&s->gb)) / (32 * 2)) {
743 for (i = 0; i < count && BITS_LEFT(re, &s->gb) > 0; i++) {
744 READ_2PIX_PLANE(s->temp16[0][2 * i], s->temp16[0][2 * i + 1], plane, OP14bits);
745 }
746 memset(s->temp16[0] + 2 * i, 0, 4 * (count - i));
747 } else {
748 for(i=0; i<count; i++){
749 READ_2PIX_PLANE(s->temp16[0][2 * i], s->temp16[0][2 * i + 1], plane, OP14bits);
750 }
751 }
752 if( width&1 && BITS_LEFT(re, &s->gb)>0 ) {
753 unsigned int index;
754 int nb_bits, code, n;
755 UPDATE_CACHE(re, &s->gb);
756 index = SHOW_UBITS(re, &s->gb, VLC_BITS);
757 VLC_INTERN(s->temp16[0][width-1], s->vlc[plane].table,
758 &s->gb, re, VLC_BITS, 3);
759 } else if (width & 1)
760 s->temp16[0][width - 1] = 0;
761 CLOSE_READER(re, &s->gb);
762 } else {
763 if (count >= (get_bits_left(&s->gb)) / (32 * 2)) {
764 for (i = 0; i < count && get_bits_left(&s->gb) > 0; i++) {
765 READ_2PIX_PLANE16(s->temp16[0][2 * i], s->temp16[0][2 * i + 1], plane);
766 }
767 memset(s->temp16[0] + 2 * i, 0, 4 * (count - i));
768 } else {
769 for(i=0; i<count; i++){
770 READ_2PIX_PLANE16(s->temp16[0][2 * i], s->temp16[0][2 * i + 1], plane);
771 }
772 }
773 if( width&1 && get_bits_left(&s->gb)>0 ) {
774 int dst = (unsigned)get_vlc2(&s->gb, s->vlc[plane].table, VLC_BITS, 3)<<2;
775 s->temp16[0][width-1] = dst + get_bits(&s->gb, 2);
776 } else if (width & 1)
777 s->temp16[0][width - 1] = 0;
778 }
779}
780
781static void decode_gray_bitstream(HYuvDecContext *s, int count)
782{
783 int i;
784 OPEN_READER(re, &s->gb);
785 count /= 2;
786
787 if (count >= (get_bits_left(&s->gb)) / (32 * 2)) {
788 for (i = 0; i < count && BITS_LEFT(re, &s->gb) > 0; i++) {
789 READ_2PIX(s->temp[0][2 * i], s->temp[0][2 * i + 1], 0);
790 }
791 for (; i < count; i++)
792 s->temp[0][2 * i] = s->temp[0][2 * i + 1] = 0;
793 } else {
794 for (i = 0; i < count; i++) {
795 READ_2PIX(s->temp[0][2 * i], s->temp[0][2 * i + 1], 0);
796 }
797 }
798 CLOSE_READER(re, &s->gb);
799}
800
802 int decorrelate, int alpha)
803{
804 int i;
805 OPEN_READER(re, &s->gb);
806
807 for (i = 0; i < count && BITS_LEFT(re, &s->gb) > 0; i++) {
808 unsigned int index;
809 int code, n, nb_bits;
810
811 UPDATE_CACHE(re, &s->gb);
812 index = SHOW_UBITS(re, &s->gb, VLC_BITS);
813 n = s->vlc[4].table[index].len;
814
815 if (n>0) {
816 code = s->vlc[4].table[index].sym;
817 *(uint32_t *) &s->temp[0][4 * i] = s->pix_bgr_map[code];
818 LAST_SKIP_BITS(re, &s->gb, n);
819 } else {
820 if (decorrelate) {
821 VLC_INTERN(s->temp[0][4 * i + G], s->vlc[1].table,
822 &s->gb, re, VLC_BITS, 3);
823
824 UPDATE_CACHE(re, &s->gb);
825 index = SHOW_UBITS(re, &s->gb, VLC_BITS);
826 VLC_INTERN(code, s->vlc[0].table, &s->gb, re, VLC_BITS, 3);
827 s->temp[0][4 * i + B] = code + s->temp[0][4 * i + G];
828
829 UPDATE_CACHE(re, &s->gb);
830 index = SHOW_UBITS(re, &s->gb, VLC_BITS);
831 VLC_INTERN(code, s->vlc[2].table, &s->gb, re, VLC_BITS, 3);
832 s->temp[0][4 * i + R] = code + s->temp[0][4 * i + G];
833 } else {
834 VLC_INTERN(s->temp[0][4 * i + B], s->vlc[0].table,
835 &s->gb, re, VLC_BITS, 3);
836
837 UPDATE_CACHE(re, &s->gb);
838 index = SHOW_UBITS(re, &s->gb, VLC_BITS);
839 VLC_INTERN(s->temp[0][4 * i + G], s->vlc[1].table,
840 &s->gb, re, VLC_BITS, 3);
841
842 UPDATE_CACHE(re, &s->gb);
843 index = SHOW_UBITS(re, &s->gb, VLC_BITS);
844 VLC_INTERN(s->temp[0][4 * i + R], s->vlc[2].table,
845 &s->gb, re, VLC_BITS, 3);
846 }
847 }
848 if (alpha) {
849 UPDATE_CACHE(re, &s->gb);
850 index = SHOW_UBITS(re, &s->gb, VLC_BITS);
851 VLC_INTERN(s->temp[0][4 * i + A], s->vlc[2].table,
852 &s->gb, re, VLC_BITS, 3);
853 } else
854 s->temp[0][4 * i + A] = 0;
855 }
856 CLOSE_READER(re, &s->gb);
857 memset(s->temp[0] + 4 * i, 0, 4 * (count - i));
858}
859
860static void decode_bgr_bitstream(HYuvDecContext *s, int count)
861{
862 if (s->decorrelate) {
863 if (s->bitstream_bpp == 24)
864 decode_bgr_1(s, count, 1, 0);
865 else
866 decode_bgr_1(s, count, 1, 1);
867 } else {
868 if (s->bitstream_bpp == 24)
869 decode_bgr_1(s, count, 0, 0);
870 else
871 decode_bgr_1(s, count, 0, 1);
872 }
873}
874
876{
877 int h, cy, i;
879
880 if (!avctx->draw_horiz_band)
881 return;
882
883 h = y - s->last_slice_end;
884 y -= h;
885
886 if (s->bitstream_bpp == 12)
887 cy = y >> 1;
888 else
889 cy = y;
890
891 offset[0] = frame->linesize[0] * y;
892 offset[1] = frame->linesize[1] * cy;
893 offset[2] = frame->linesize[2] * cy;
894 for (i = 3; i < AV_NUM_DATA_POINTERS; i++)
895 offset[i] = 0;
896
897 avctx->draw_horiz_band(avctx, frame, offset, y, 3, h);
898
899 s->last_slice_end = y + h;
900}
901
902static int left_prediction(HYuvDecContext *s, uint8_t *dst, const uint8_t *src, int w, int acc)
903{
904 if (s->bps <= 8) {
905 return s->llviddsp.add_left_pred(dst, src, w, acc);
906 } else {
907 return s->llviddsp.add_left_pred_int16(( uint16_t *)dst, (const uint16_t *)src, s->n-1, w, acc);
908 }
909}
910
911static void add_bytes(HYuvDecContext *s, uint8_t *dst, uint8_t *src, int w)
912{
913 if (s->bps <= 8) {
914 s->llviddsp.add_bytes(dst, src, w);
915 } else {
916 s->hdsp.add_int16((uint16_t*)dst, (const uint16_t*)src, s->n - 1, w);
917 }
918}
919
920static void add_median_prediction(HYuvDecContext *s, uint8_t *dst, const uint8_t *src, const uint8_t *diff, int w, int *left, int *left_top)
921{
922 if (s->bps <= 8) {
923 s->llviddsp.add_median_pred(dst, src, diff, w, left, left_top);
924 } else {
925 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);
926 }
927}
928
929static int decode_slice(AVCodecContext *avctx, AVFrame *p, int height,
930 int buf_size, int y_offset, int table_size)
931{
932 HYuvDecContext *s = avctx->priv_data;
933 int fake_ystride, fake_ustride, fake_vstride;
934 const int width = avctx->width;
935 const int width2 = avctx->width >> 1;
936 int ret;
937
938 if ((ret = init_get_bits8(&s->gb, s->bitstream_buffer + table_size, buf_size - table_size)) < 0)
939 return ret;
940
941 fake_ystride = s->interlaced ? p->linesize[0] * 2 : p->linesize[0];
942 fake_ustride = s->interlaced ? p->linesize[1] * 2 : p->linesize[1];
943 fake_vstride = s->interlaced ? p->linesize[2] * 2 : p->linesize[2];
944
945 if (s->version > 2) {
946 int plane;
947 for(plane = 0; plane < 1 + 2*s->chroma + s->alpha; plane++) {
948 int left, lefttop, y;
949 int w = width;
950 int h = height;
951 int fake_stride = fake_ystride;
952
953 if (s->chroma && (plane == 1 || plane == 2)) {
954 w >>= s->chroma_h_shift;
955 h >>= s->chroma_v_shift;
956 fake_stride = plane == 1 ? fake_ustride : fake_vstride;
957 }
958
959 switch (s->predictor) {
960 case LEFT:
961 case PLANE:
962 decode_plane_bitstream(s, w, plane);
963 left = left_prediction(s, p->data[plane], s->temp[0], w, 0);
964
965 for (y = 1; y < h; y++) {
966 uint8_t *dst = p->data[plane] + p->linesize[plane]*y;
967
968 decode_plane_bitstream(s, w, plane);
969 left = left_prediction(s, dst, s->temp[0], w, left);
970 if (s->predictor == PLANE) {
971 if (y > s->interlaced) {
972 add_bytes(s, dst, dst - fake_stride, w);
973 }
974 }
975 }
976
977 break;
978 case MEDIAN:
979 decode_plane_bitstream(s, w, plane);
980 left= left_prediction(s, p->data[plane], s->temp[0], w, 0);
981
982 y = 1;
983 if (y >= h)
984 break;
985
986 /* second line is left predicted for interlaced case */
987 if (s->interlaced) {
988 decode_plane_bitstream(s, w, plane);
989 left = left_prediction(s, p->data[plane] + p->linesize[plane], s->temp[0], w, left);
990 y++;
991 if (y >= h)
992 break;
993 }
994
995 lefttop = READ_LOWBYTE(p->data[plane], s->bps);
996 decode_plane_bitstream(s, w, plane);
997 add_median_prediction(s, p->data[plane] + fake_stride, p->data[plane], s->temp[0], w, &left, &lefttop);
998 y++;
999
1000 for (; y<h; y++) {
1001 uint8_t *dst;
1002
1003 decode_plane_bitstream(s, w, plane);
1004
1005 dst = p->data[plane] + p->linesize[plane] * y;
1006
1007 add_median_prediction(s, dst, dst - fake_stride, s->temp[0], w, &left, &lefttop);
1008 }
1009
1010 break;
1011 }
1012 }
1013 draw_slice(s, avctx, p, height);
1014 } else if (s->bitstream_bpp < 24) {
1015 int y, cy;
1016 int lefty, leftu, leftv;
1017 int lefttopy, lefttopu, lefttopv;
1018
1019 if (s->yuy2) {
1020 p->data[0][3] = get_bits(&s->gb, 8);
1021 p->data[0][2] = get_bits(&s->gb, 8);
1022 p->data[0][1] = get_bits(&s->gb, 8);
1023 p->data[0][0] = get_bits(&s->gb, 8);
1024
1025 av_log(avctx, AV_LOG_ERROR,
1026 "YUY2 output is not implemented yet\n");
1027 return AVERROR_PATCHWELCOME;
1028 } else {
1029 leftv =
1030 p->data[2][0 + y_offset * p->linesize[2]] = get_bits(&s->gb, 8);
1031 lefty =
1032 p->data[0][1 + y_offset * p->linesize[0]] = get_bits(&s->gb, 8);
1033 leftu =
1034 p->data[1][0 + y_offset * p->linesize[1]] = get_bits(&s->gb, 8);
1035 p->data[0][0 + y_offset * p->linesize[0]] = get_bits(&s->gb, 8);
1036
1037 switch (s->predictor) {
1038 case LEFT:
1039 case PLANE:
1041 lefty = s->llviddsp.add_left_pred(p->data[0] + p->linesize[0] * y_offset + 2, s->temp[0],
1042 width - 2, lefty);
1043 if (!(s->flags & AV_CODEC_FLAG_GRAY)) {
1044 leftu = s->llviddsp.add_left_pred(p->data[1] + p->linesize[1] * y_offset + 1, s->temp[1], width2 - 1, leftu);
1045 leftv = s->llviddsp.add_left_pred(p->data[2] + p->linesize[2] * y_offset + 1, s->temp[2], width2 - 1, leftv);
1046 }
1047
1048 for (cy = y = 1; y < height; y++, cy++) {
1049 uint8_t *ydst, *udst, *vdst;
1050
1051 if (s->bitstream_bpp == 12) {
1053
1054 ydst = p->data[0] + p->linesize[0] * (y + y_offset);
1055
1056 lefty = s->llviddsp.add_left_pred(ydst, s->temp[0],
1057 width, lefty);
1058 if (s->predictor == PLANE) {
1059 if (y > s->interlaced)
1060 s->llviddsp.add_bytes(ydst, ydst - fake_ystride, width);
1061 }
1062 y++;
1063 if (y >= height)
1064 break;
1065 }
1066
1067 draw_slice(s, avctx, p, y);
1068
1069 ydst = p->data[0] + p->linesize[0] * (y + y_offset);
1070 udst = p->data[1] + p->linesize[1] * (cy + y_offset);
1071 vdst = p->data[2] + p->linesize[2] * (cy + y_offset);
1072
1074 lefty = s->llviddsp.add_left_pred(ydst, s->temp[0],
1075 width, lefty);
1076 if (!(s->flags & AV_CODEC_FLAG_GRAY)) {
1077 leftu = s->llviddsp.add_left_pred(udst, s->temp[1], width2, leftu);
1078 leftv = s->llviddsp.add_left_pred(vdst, s->temp[2], width2, leftv);
1079 }
1080 if (s->predictor == PLANE) {
1081 if (cy > s->interlaced) {
1082 s->llviddsp.add_bytes(ydst, ydst - fake_ystride, width);
1083 if (!(s->flags & AV_CODEC_FLAG_GRAY)) {
1084 s->llviddsp.add_bytes(udst, udst - fake_ustride, width2);
1085 s->llviddsp.add_bytes(vdst, vdst - fake_vstride, width2);
1086 }
1087 }
1088 }
1089 }
1090 draw_slice(s, avctx, p, height);
1091
1092 break;
1093 case MEDIAN:
1094 /* first line except first 2 pixels is left predicted */
1096 lefty = s->llviddsp.add_left_pred(p->data[0] + 2, s->temp[0],
1097 width - 2, lefty);
1098 if (!(s->flags & AV_CODEC_FLAG_GRAY)) {
1099 leftu = s->llviddsp.add_left_pred(p->data[1] + 1, s->temp[1], width2 - 1, leftu);
1100 leftv = s->llviddsp.add_left_pred(p->data[2] + 1, s->temp[2], width2 - 1, leftv);
1101 }
1102
1103 cy = y = 1;
1104 if (y >= height)
1105 break;
1106
1107 /* second line is left predicted for interlaced case */
1108 if (s->interlaced) {
1110 lefty = s->llviddsp.add_left_pred(p->data[0] + p->linesize[0],
1111 s->temp[0], width, lefty);
1112 if (!(s->flags & AV_CODEC_FLAG_GRAY)) {
1113 leftu = s->llviddsp.add_left_pred(p->data[1] + p->linesize[2], s->temp[1], width2, leftu);
1114 leftv = s->llviddsp.add_left_pred(p->data[2] + p->linesize[1], s->temp[2], width2, leftv);
1115 }
1116 y++;
1117 cy++;
1118 if (y >= height)
1119 break;
1120 }
1121
1122 /* next 4 pixels are left predicted too */
1124 lefty = s->llviddsp.add_left_pred(p->data[0] + fake_ystride,
1125 s->temp[0], 4, lefty);
1126 if (!(s->flags & AV_CODEC_FLAG_GRAY)) {
1127 leftu = s->llviddsp.add_left_pred(p->data[1] + fake_ustride, s->temp[1], 2, leftu);
1128 leftv = s->llviddsp.add_left_pred(p->data[2] + fake_vstride, s->temp[2], 2, leftv);
1129 }
1130
1131 /* next line except the first 4 pixels is median predicted */
1132 lefttopy = p->data[0][3];
1134 s->llviddsp.add_median_pred(p->data[0] + fake_ystride + 4,
1135 p->data[0] + 4, s->temp[0],
1136 width - 4, &lefty, &lefttopy);
1137 if (!(s->flags & AV_CODEC_FLAG_GRAY)) {
1138 lefttopu = p->data[1][1];
1139 lefttopv = p->data[2][1];
1140 s->llviddsp.add_median_pred(p->data[1] + fake_ustride + 2, p->data[1] + 2, s->temp[1], width2 - 2, &leftu, &lefttopu);
1141 s->llviddsp.add_median_pred(p->data[2] + fake_vstride + 2, p->data[2] + 2, s->temp[2], width2 - 2, &leftv, &lefttopv);
1142 }
1143 y++;
1144 cy++;
1145
1146 for (; y < height; y++, cy++) {
1147 uint8_t *ydst, *udst, *vdst;
1148
1149 if (s->bitstream_bpp == 12) {
1150 while (2 * cy > y) {
1152 ydst = p->data[0] + p->linesize[0] * y;
1153 s->llviddsp.add_median_pred(ydst, ydst - fake_ystride,
1154 s->temp[0], width,
1155 &lefty, &lefttopy);
1156 y++;
1157 }
1158 if (y >= height)
1159 break;
1160 }
1161 draw_slice(s, avctx, p, y);
1162
1164
1165 ydst = p->data[0] + p->linesize[0] * y;
1166 udst = p->data[1] + p->linesize[1] * cy;
1167 vdst = p->data[2] + p->linesize[2] * cy;
1168
1169 s->llviddsp.add_median_pred(ydst, ydst - fake_ystride,
1170 s->temp[0], width,
1171 &lefty, &lefttopy);
1172 if (!(s->flags & AV_CODEC_FLAG_GRAY)) {
1173 s->llviddsp.add_median_pred(udst, udst - fake_ustride, s->temp[1], width2, &leftu, &lefttopu);
1174 s->llviddsp.add_median_pred(vdst, vdst - fake_vstride, s->temp[2], width2, &leftv, &lefttopv);
1175 }
1176 }
1177
1178 draw_slice(s, avctx, p, height);
1179 break;
1180 }
1181 }
1182 } else {
1183 int y;
1184 uint8_t left[4];
1185 const int last_line = (y_offset + height - 1) * p->linesize[0];
1186
1187 if (s->bitstream_bpp == 32) {
1188 left[A] = p->data[0][last_line + A] = get_bits(&s->gb, 8);
1189 left[R] = p->data[0][last_line + R] = get_bits(&s->gb, 8);
1190 left[G] = p->data[0][last_line + G] = get_bits(&s->gb, 8);
1191 left[B] = p->data[0][last_line + B] = get_bits(&s->gb, 8);
1192 } else {
1193 left[R] = p->data[0][last_line + R] = get_bits(&s->gb, 8);
1194 left[G] = p->data[0][last_line + G] = get_bits(&s->gb, 8);
1195 left[B] = p->data[0][last_line + B] = get_bits(&s->gb, 8);
1196 left[A] = p->data[0][last_line + A] = 255;
1197 skip_bits(&s->gb, 8);
1198 }
1199
1200 if (s->bgr32) {
1201 switch (s->predictor) {
1202 case LEFT:
1203 case PLANE:
1205 s->hdsp.add_hfyu_left_pred_bgr32(p->data[0] + last_line + 4,
1206 s->temp[0], width - 1, left);
1207
1208 for (y = height - 2; y >= 0; y--) { // Yes it is stored upside down.
1210
1211 s->hdsp.add_hfyu_left_pred_bgr32(p->data[0] + p->linesize[0] * (y + y_offset),
1212 s->temp[0], width, left);
1213 if (s->predictor == PLANE) {
1214 if (s->bitstream_bpp != 32)
1215 left[A] = 0;
1216 if (y < height - 1 - s->interlaced) {
1217 s->llviddsp.add_bytes(p->data[0] + p->linesize[0] * (y + y_offset),
1218 p->data[0] + p->linesize[0] * (y + y_offset) +
1219 fake_ystride, 4 * width);
1220 }
1221 }
1222 }
1223 // just 1 large slice as this is not possible in reverse order
1224 draw_slice(s, avctx, p, height);
1225 break;
1226 default:
1227 av_log(avctx, AV_LOG_ERROR,
1228 "prediction type not supported!\n");
1229 }
1230 } else {
1231 av_log(avctx, AV_LOG_ERROR,
1232 "BGR24 output is not implemented yet\n");
1233 return AVERROR_PATCHWELCOME;
1234 }
1235 }
1236
1237 return 0;
1238}
1239
1241 int *got_frame, AVPacket *avpkt)
1242{
1243 const uint8_t *buf = avpkt->data;
1244 int buf_size = avpkt->size;
1245 HYuvDecContext *s = avctx->priv_data;
1246 const int width = avctx->width;
1247 const int height = avctx->height;
1248 int slice, table_size = 0, ret, nb_slices;
1249 unsigned slices_info_offset;
1250 int slice_height;
1251
1252 if (buf_size < (width * height + 7)/8)
1253 return AVERROR_INVALIDDATA;
1254
1255 av_fast_padded_malloc(&s->bitstream_buffer,
1256 &s->bitstream_buffer_size,
1257 buf_size);
1258 if (!s->bitstream_buffer)
1259 return AVERROR(ENOMEM);
1260
1261 s->bdsp.bswap_buf((uint32_t *) s->bitstream_buffer,
1262 (const uint32_t *) buf, buf_size / 4);
1263
1264 if ((ret = ff_thread_get_buffer(avctx, p, 0)) < 0)
1265 return ret;
1266
1267 if (s->context) {
1268 table_size = read_huffman_tables(s, s->bitstream_buffer, buf_size);
1269 if (table_size < 0)
1270 return table_size;
1271 }
1272
1273 if ((unsigned) (buf_size - table_size) >= INT_MAX / 8)
1274 return AVERROR_INVALIDDATA;
1275
1276 s->last_slice_end = 0;
1277
1278 if (avctx->codec_id == AV_CODEC_ID_HYMT &&
1279 (buf_size > 32 && AV_RL32(avpkt->data + buf_size - 16) == 0)) {
1280 slices_info_offset = AV_RL32(avpkt->data + buf_size - 4);
1281 slice_height = AV_RL32(avpkt->data + buf_size - 8);
1282 nb_slices = AV_RL32(avpkt->data + buf_size - 12);
1283 if (nb_slices * 8LL + slices_info_offset > buf_size - 16 ||
1284 s->chroma_v_shift ||
1285 slice_height <= 0 || nb_slices * (uint64_t)slice_height > height)
1286 return AVERROR_INVALIDDATA;
1287 } else {
1288 slice_height = height;
1289 nb_slices = 1;
1290 }
1291
1292 for (slice = 0; slice < nb_slices; slice++) {
1293 int y_offset, slice_offset, slice_size;
1294
1295 if (nb_slices > 1) {
1296 slice_offset = AV_RL32(avpkt->data + slices_info_offset + slice * 8);
1297 slice_size = AV_RL32(avpkt->data + slices_info_offset + slice * 8 + 4);
1298
1299 if (slice_offset < 0 || slice_size <= 0 || (slice_offset&3) ||
1300 slice_offset + (int64_t)slice_size > buf_size)
1301 return AVERROR_INVALIDDATA;
1302
1303 y_offset = height - (slice + 1) * slice_height;
1304 s->bdsp.bswap_buf((uint32_t *)s->bitstream_buffer,
1305 (const uint32_t *)(buf + slice_offset), slice_size / 4);
1306 } else {
1307 y_offset = 0;
1308 slice_offset = 0;
1309 slice_size = buf_size;
1310 }
1311
1312 ret = decode_slice(avctx, p, slice_height, slice_size, y_offset, table_size);
1313 if (ret < 0)
1314 return ret;
1315 }
1316
1317 *got_frame = 1;
1318
1319 return (get_bits_count(&s->gb) + 31) / 32 * 4 + table_size;
1320}
1321
1323 .p.name = "huffyuv",
1324 CODEC_LONG_NAME("Huffyuv / HuffYUV"),
1325 .p.type = AVMEDIA_TYPE_VIDEO,
1326 .p.id = AV_CODEC_ID_HUFFYUV,
1327 .priv_data_size = sizeof(HYuvDecContext),
1328 .init = decode_init,
1329 .close = decode_end,
1333 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
1334};
1335
1336#if CONFIG_FFVHUFF_DECODER
1338 .p.name = "ffvhuff",
1339 CODEC_LONG_NAME("Huffyuv FFmpeg variant"),
1340 .p.type = AVMEDIA_TYPE_VIDEO,
1341 .p.id = AV_CODEC_ID_FFVHUFF,
1342 .priv_data_size = sizeof(HYuvDecContext),
1343 .init = decode_init,
1344 .close = decode_end,
1348 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
1349};
1350#endif /* CONFIG_FFVHUFF_DECODER */
1351
1352#if CONFIG_HYMT_DECODER
1353const FFCodec ff_hymt_decoder = {
1354 .p.name = "hymt",
1355 CODEC_LONG_NAME("HuffYUV MT"),
1356 .p.type = AVMEDIA_TYPE_VIDEO,
1357 .p.id = AV_CODEC_ID_HYMT,
1358 .priv_data_size = sizeof(HYuvDecContext),
1359 .init = decode_init,
1360 .close = decode_end,
1364 .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
1365};
1366#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:97
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 FILE * out
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:480
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:860
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:911
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:801
static int decode_slice(AVCodecContext *avctx, AVFrame *p, int height, int buf_size, int y_offset, int table_size)
Definition huffyuvdec.c:929
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:920
static int left_prediction(HYuvDecContext *s, uint8_t *dst, const uint8_t *src, int w, int acc)
Definition huffyuvdec.c:902
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:781
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:875
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:3512
#define AV_PIX_FMT_0RGB32
Definition pixfmt.h:524
#define AV_PIX_FMT_YUV420P16
Definition pixfmt.h:559
#define AV_PIX_FMT_YUV444P12
Definition pixfmt.h:555
#define AV_PIX_FMT_YUV444P9
Definition pixfmt.h:547
#define AV_PIX_FMT_YUV420P10
Definition pixfmt.h:548
#define AV_PIX_FMT_GBRP9
Definition pixfmt.h:566
#define AV_PIX_FMT_YUV422P9
Definition pixfmt.h:546
#define AV_PIX_FMT_YUVA444P10
Definition pixfmt.h:601
#define AV_PIX_FMT_YUVA420P16
Definition pixfmt.h:604
#define AV_PIX_FMT_YUV420P12
Definition pixfmt.h:552
#define AV_PIX_FMT_YUVA420P10
Definition pixfmt.h:599
#define AV_PIX_FMT_YUVA422P9
Definition pixfmt.h:597
#define AV_PIX_FMT_YUV422P12
Definition pixfmt.h:553
#define AV_PIX_FMT_GBRP10
Definition pixfmt.h:567
#define AV_PIX_FMT_YUV422P10
Definition pixfmt.h:549
#define AV_PIX_FMT_GBRP12
Definition pixfmt.h:568
#define AV_PIX_FMT_YUV420P9
Definition pixfmt.h:545
#define AV_PIX_FMT_YUVA420P9
Definition pixfmt.h:596
#define AV_PIX_FMT_YUVA422P10
Definition pixfmt.h:600
#define AV_PIX_FMT_YUV420P14
Definition pixfmt.h:556
@ 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:557
#define AV_PIX_FMT_YUV422P16
Definition pixfmt.h:560
#define AV_PIX_FMT_GRAY16
Definition pixfmt.h:531
#define AV_PIX_FMT_YUVA444P16
Definition pixfmt.h:606
#define AV_PIX_FMT_YUVA422P16
Definition pixfmt.h:605
#define AV_PIX_FMT_GBRP16
Definition pixfmt.h:570
#define AV_PIX_FMT_YUV444P14
Definition pixfmt.h:558
#define AV_PIX_FMT_YUVA444P9
Definition pixfmt.h:598
#define AV_PIX_FMT_GBRP14
Definition pixfmt.h:569
#define AV_PIX_FMT_YUV444P16
Definition pixfmt.h:561
#define AV_PIX_FMT_RGB32
Definition pixfmt.h:520
#define AV_PIX_FMT_YUV444P10
Definition pixfmt.h:551
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:1527
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:1569
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:479
This structure stores compressed data.
Definition packet.h:587
int size
Definition packet.h:611
uint8_t * data
Definition packet.h:610
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
#define height
Definition dsp.h:99
#define width
Definition dsp.h:99
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