FFmpeg
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 
52 typedef struct HYuvDecContext {
58  int version;
59  int yuy2; //use yuy2 instead of 422P
60  int bgr32; //use bgr32 instead of bgr24
61  int bps;
62  int n; // 1<<bps
63  int vlc_n; // number of vlc codes (FFMIN(1<<bps, MAX_VLC_N))
64  int alpha;
65  int chroma;
66  int yuv;
69  int flags;
70  int context;
72 
73  union {
74  uint8_t *temp[3];
75  uint16_t *temp16[3];
76  };
77  uint8_t len[4][MAX_VLC_N];
78  uint32_t bits[4][MAX_VLC_N];
79  uint32_t pix_bgr_map[1<<VLC_BITS];
80  VLC vlc[8]; //Y,U,V,A,YY,YU,YV,AA
81  uint8_t *bitstream_buffer;
82  unsigned int bitstream_buffer_size;
87 
88 
89 static const uint8_t classic_shift_luma[] = {
90  34, 36, 35, 69, 135, 232, 9, 16, 10, 24, 11, 23, 12, 16, 13, 10,
91  14, 8, 15, 8, 16, 8, 17, 20, 16, 10, 207, 206, 205, 236, 11, 8,
92  10, 21, 9, 23, 8, 8, 199, 70, 69, 68,
93 };
94 
95 static const uint8_t classic_shift_chroma[] = {
96  66, 36, 37, 38, 39, 40, 41, 75, 76, 77, 110, 239, 144, 81, 82, 83,
97  84, 85, 118, 183, 56, 57, 88, 89, 56, 89, 154, 57, 58, 57, 26, 141,
98  57, 56, 58, 57, 58, 57, 184, 119, 214, 245, 116, 83, 82, 49, 80, 79,
99  78, 77, 44, 75, 41, 40, 39, 38, 37, 36, 34,
100 };
101 
102 static const unsigned char classic_add_luma[256] = {
103  3, 9, 5, 12, 10, 35, 32, 29, 27, 50, 48, 45, 44, 41, 39, 37,
104  73, 70, 68, 65, 64, 61, 58, 56, 53, 50, 49, 46, 44, 41, 38, 36,
105  68, 65, 63, 61, 58, 55, 53, 51, 48, 46, 45, 43, 41, 39, 38, 36,
106  35, 33, 32, 30, 29, 27, 26, 25, 48, 47, 46, 44, 43, 41, 40, 39,
107  37, 36, 35, 34, 32, 31, 30, 28, 27, 26, 24, 23, 22, 20, 19, 37,
108  35, 34, 33, 31, 30, 29, 27, 26, 24, 23, 21, 20, 18, 17, 15, 29,
109  27, 26, 24, 22, 21, 19, 17, 16, 14, 26, 25, 23, 21, 19, 18, 16,
110  15, 27, 25, 23, 21, 19, 17, 16, 14, 26, 25, 23, 21, 18, 17, 14,
111  12, 17, 19, 13, 4, 9, 2, 11, 1, 7, 8, 0, 16, 3, 14, 6,
112  12, 10, 5, 15, 18, 11, 10, 13, 15, 16, 19, 20, 22, 24, 27, 15,
113  18, 20, 22, 24, 26, 14, 17, 20, 22, 24, 27, 15, 18, 20, 23, 25,
114  28, 16, 19, 22, 25, 28, 32, 36, 21, 25, 29, 33, 38, 42, 45, 49,
115  28, 31, 34, 37, 40, 42, 44, 47, 49, 50, 52, 54, 56, 57, 59, 60,
116  62, 64, 66, 67, 69, 35, 37, 39, 40, 42, 43, 45, 47, 48, 51, 52,
117  54, 55, 57, 59, 60, 62, 63, 66, 67, 69, 71, 72, 38, 40, 42, 43,
118  46, 47, 49, 51, 26, 28, 30, 31, 33, 34, 18, 19, 11, 13, 7, 8,
119 };
120 
121 static const unsigned char classic_add_chroma[256] = {
122  3, 1, 2, 2, 2, 2, 3, 3, 7, 5, 7, 5, 8, 6, 11, 9,
123  7, 13, 11, 10, 9, 8, 7, 5, 9, 7, 6, 4, 7, 5, 8, 7,
124  11, 8, 13, 11, 19, 15, 22, 23, 20, 33, 32, 28, 27, 29, 51, 77,
125  43, 45, 76, 81, 46, 82, 75, 55, 56, 144, 58, 80, 60, 74, 147, 63,
126  143, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
127  80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 27, 30, 21, 22,
128  17, 14, 5, 6, 100, 54, 47, 50, 51, 53, 106, 107, 108, 109, 110, 111,
129  112, 113, 114, 115, 4, 117, 118, 92, 94, 121, 122, 3, 124, 103, 2, 1,
130  0, 129, 130, 131, 120, 119, 126, 125, 136, 137, 138, 139, 140, 141, 142, 134,
131  135, 132, 133, 104, 64, 101, 62, 57, 102, 95, 93, 59, 61, 28, 97, 96,
132  52, 49, 48, 29, 32, 25, 24, 46, 23, 98, 45, 44, 43, 20, 42, 41,
133  19, 18, 99, 40, 15, 39, 38, 16, 13, 12, 11, 37, 10, 9, 8, 36,
134  7, 128, 127, 105, 123, 116, 35, 34, 33, 145, 31, 79, 42, 146, 78, 26,
135  83, 48, 49, 50, 44, 47, 26, 31, 30, 18, 17, 19, 21, 24, 25, 13,
136  14, 16, 17, 18, 20, 21, 12, 14, 15, 9, 10, 6, 9, 6, 5, 8,
137  6, 12, 8, 10, 7, 9, 6, 4, 6, 2, 2, 3, 3, 3, 3, 2,
138 };
139 
140 static 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 
161 error:
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;
252 out:
253  av_freep(&symbols);
254  return ret;
255 }
256 
257 static int read_huffman_tables(HYuvDecContext *s, const uint8_t *src, int length)
258 {
259  GetByteContext gb;
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 {
287  GetByteContext gb;
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:
437  avctx->pix_fmt = AV_PIX_FMT_YUV420P;
438  s->yuv = 1;
439  break;
440  case 16:
441  if (s->yuy2)
442  avctx->pix_fmt = AV_PIX_FMT_YUYV422;
443  else
444  avctx->pix_fmt = AV_PIX_FMT_YUV422P;
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:
494  avctx->pix_fmt = AV_PIX_FMT_YUV444P;
495  break;
496  case 0x680:
497  avctx->pix_fmt = AV_PIX_FMT_YUV444P9;
498  break;
499  case 0x690:
500  avctx->pix_fmt = AV_PIX_FMT_YUV444P10;
501  break;
502  case 0x6B0:
503  avctx->pix_fmt = AV_PIX_FMT_YUV444P12;
504  break;
505  case 0x6D0:
506  avctx->pix_fmt = AV_PIX_FMT_YUV444P14;
507  break;
508  case 0x6F0:
509  avctx->pix_fmt = AV_PIX_FMT_YUV444P16;
510  break;
511  case 0x671:
512  avctx->pix_fmt = AV_PIX_FMT_YUV422P;
513  break;
514  case 0x681:
515  avctx->pix_fmt = AV_PIX_FMT_YUV422P9;
516  break;
517  case 0x691:
518  avctx->pix_fmt = AV_PIX_FMT_YUV422P10;
519  break;
520  case 0x6B1:
521  avctx->pix_fmt = AV_PIX_FMT_YUV422P12;
522  break;
523  case 0x6D1:
524  avctx->pix_fmt = AV_PIX_FMT_YUV422P14;
525  break;
526  case 0x6F1:
527  avctx->pix_fmt = AV_PIX_FMT_YUV422P16;
528  break;
529  case 0x672:
530  avctx->pix_fmt = AV_PIX_FMT_YUV411P;
531  break;
532  case 0x674:
533  avctx->pix_fmt = AV_PIX_FMT_YUV440P;
534  break;
535  case 0x675:
536  avctx->pix_fmt = AV_PIX_FMT_YUV420P;
537  break;
538  case 0x685:
539  avctx->pix_fmt = AV_PIX_FMT_YUV420P9;
540  break;
541  case 0x695:
542  avctx->pix_fmt = AV_PIX_FMT_YUV420P10;
543  break;
544  case 0x6B5:
545  avctx->pix_fmt = AV_PIX_FMT_YUV420P12;
546  break;
547  case 0x6D5:
548  avctx->pix_fmt = AV_PIX_FMT_YUV420P14;
549  break;
550  case 0x6F5:
551  avctx->pix_fmt = AV_PIX_FMT_YUV420P16;
552  break;
553  case 0x67A:
554  avctx->pix_fmt = AV_PIX_FMT_YUV410P;
555  break;
556  case 0x770:
557  avctx->pix_fmt = AV_PIX_FMT_YUVA444P;
558  break;
559  case 0x780:
560  avctx->pix_fmt = AV_PIX_FMT_YUVA444P9;
561  break;
562  case 0x790:
564  break;
565  case 0x7F0:
567  break;
568  case 0x771:
569  avctx->pix_fmt = AV_PIX_FMT_YUVA422P;
570  break;
571  case 0x781:
572  avctx->pix_fmt = AV_PIX_FMT_YUVA422P9;
573  break;
574  case 0x791:
576  break;
577  case 0x7F1:
579  break;
580  case 0x775:
581  avctx->pix_fmt = AV_PIX_FMT_YUVA420P;
582  break;
583  case 0x785:
584  avctx->pix_fmt = AV_PIX_FMT_YUVA420P9;
585  break;
586  case 0x795:
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 
670 static 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 }
714 static 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 
775 static 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 
853 static 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 
868 static void draw_slice(HYuvDecContext *s, AVCodecContext *avctx, AVFrame *frame, int y)
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 
895 static 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 
904 static 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 
913 static void add_median_prediction(HYuvDecContext *s, uint8_t *dst, const uint8_t *src, const uint8_t *diff, int w, int *left, int *left_top)
914 {
915  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 
922 static 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 */
1116  decode_422_bitstream(s, 4);
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 
1233 static int decode_frame(AVCodecContext *avctx, AVFrame *p,
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,
1324  .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DRAW_HORIZ_BAND |
1326  .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
1327 };
1328 
1329 #if CONFIG_FFVHUFF_DECODER
1330 const FFCodec ff_ffvhuff_decoder = {
1331  .p.name = "ffvhuff",
1332  CODEC_LONG_NAME("Huffyuv FFmpeg variant"),
1333  .p.type = AVMEDIA_TYPE_VIDEO,
1334  .p.id = AV_CODEC_ID_FFVHUFF,
1335  .priv_data_size = sizeof(HYuvDecContext),
1336  .init = decode_init,
1337  .close = decode_end,
1339  .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DRAW_HORIZ_BAND |
1341  .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
1342 };
1343 #endif /* CONFIG_FFVHUFF_DECODER */
1344 
1345 #if CONFIG_HYMT_DECODER
1346 const FFCodec ff_hymt_decoder = {
1347  .p.name = "hymt",
1348  CODEC_LONG_NAME("HuffYUV MT"),
1349  .p.type = AVMEDIA_TYPE_VIDEO,
1350  .p.id = AV_CODEC_ID_HYMT,
1351  .priv_data_size = sizeof(HYuvDecContext),
1352  .init = decode_init,
1353  .close = decode_end,
1355  .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DRAW_HORIZ_BAND |
1357  .caps_internal = FF_CODEC_CAP_INIT_CLEANUP,
1358 };
1359 #endif /* CONFIG_HYMT_DECODER */
read_len_table
static int read_len_table(uint8_t *dst, GetByteContext *gb, int n)
Definition: huffyuvdec.c:140
error
static void error(const char *err)
Definition: target_bsf_fuzzer.c:32
HuffYUVDSPContext
Definition: huffyuvdsp.h:24
VLC_INTERN
#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
AV_PIX_FMT_YUVA422P16
#define AV_PIX_FMT_YUVA422P16
Definition: pixfmt.h:602
A
#define A(x)
Definition: vpx_arith.h:28
decode_bgr_bitstream
static void decode_bgr_bitstream(HYuvDecContext *s, int count)
Definition: huffyuvdec.c:853
bswapdsp.h
read_old_huffman_tables
static int read_old_huffman_tables(HYuvDecContext *s)
Definition: huffyuvdec.c:285
decorrelate
static void decorrelate(SnowContext *s, SubBand *b, IDWTELEM *src, int stride, int inverse, int use_median)
Definition: snowenc.c:1526
generate_joint_tables
static int generate_joint_tables(HYuvDecContext *s)
Definition: huffyuvdec.c:166
VLC_BITS
#define VLC_BITS
Definition: huffyuvdec.c:50
FF_CODEC_CAP_INIT_CLEANUP
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
Definition: codec_internal.h:43
get_bits_left
static int get_bits_left(GetBitContext *gb)
Definition: get_bits.h:688
r
const char * r
Definition: vf_curves.c:127
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
HYuvDecContext::alpha
int alpha
Definition: huffyuvdec.c:64
HYuvDecContext::context
int context
Definition: huffyuvdec.c:70
bytestream2_get_bytes_left
static av_always_inline int bytestream2_get_bytes_left(const GetByteContext *g)
Definition: bytestream.h:158
AV_CODEC_ID_HUFFYUV
@ AV_CODEC_ID_HUFFYUV
Definition: codec_id.h:75
out
static FILE * out
Definition: movenc.c:55
decode_bgr_1
static av_always_inline void decode_bgr_1(HYuvDecContext *s, int count, int decorrelate, int alpha)
Definition: huffyuvdec.c:795
AV_CODEC_ID_HYMT
@ AV_CODEC_ID_HYMT
Definition: codec_id.h:287
GetByteContext
Definition: bytestream.h:33
bytestream2_tell
static av_always_inline int bytestream2_tell(const GetByteContext *g)
Definition: bytestream.h:192
av_cold
#define av_cold
Definition: attributes.h:119
int64_t
long long int64_t
Definition: coverity.c:34
MAX_VLC_N
#define MAX_VLC_N
Definition: huffyuv.h:50
get_bits_count
static int get_bits_count(const GetBitContext *s)
Definition: get_bits.h:254
HYuvDecContext::bgr32
int bgr32
Definition: huffyuvdec.c:60
AV_PIX_FMT_YUVA422P9
#define AV_PIX_FMT_YUVA422P9
Definition: pixfmt.h:594
HYuvDecContext::bitstream_buffer_size
unsigned int bitstream_buffer_size
Definition: huffyuvdec.c:82
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:472
pixdesc.h
AV_PIX_FMT_YUVA420P16
#define AV_PIX_FMT_YUVA420P16
Definition: pixfmt.h:601
u
#define u(width, name, range_min, range_max)
Definition: cbs_apv.c:68
AVPacket::data
uint8_t * data
Definition: packet.h:603
huffyuvdsp.h
AV_PIX_FMT_YUVA420P10
#define AV_PIX_FMT_YUVA420P10
Definition: pixfmt.h:596
HYuvDecContext::n
int n
Definition: huffyuvdec.c:62
add_median_prediction
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
b
#define b
Definition: input.c:43
READ_2PIX
#define READ_2PIX(dst0, dst1, plane1)
Definition: huffyuvdec.c:665
classic_add_luma
static const unsigned char classic_add_luma[256]
Definition: huffyuvdec.c:102
R
#define R
Definition: huffyuv.h:44
AV_PIX_FMT_YUV420P10
#define AV_PIX_FMT_YUV420P10
Definition: pixfmt.h:545
FFCodec
Definition: codec_internal.h:129
HYuvDecContext::vlc_n
int vlc_n
Definition: huffyuvdec.c:63
AV_PIX_FMT_BGR24
@ AV_PIX_FMT_BGR24
packed RGB 8:8:8, 24bpp, BGRBGR...
Definition: pixfmt.h:76
AV_PIX_FMT_YUV440P
@ AV_PIX_FMT_YUV440P
planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
Definition: pixfmt.h:106
READ_LOWBYTE
#define READ_LOWBYTE(plane, bps)
Definition: huffyuv.h:58
decode_init
static av_cold int decode_init(AVCodecContext *avctx)
Definition: huffyuvdec.c:341
UPDATE_CACHE
#define UPDATE_CACHE(name, gb)
Definition: get_bits.h:213
OP8bits
#define OP8bits(dst0, dst1, code)
Definition: huffyuvdec.c:663
OP14bits
#define OP14bits(dst0, dst1, code)
Definition: huffyuvdec.c:704
add_bytes
static void add_bytes(HYuvDecContext *s, uint8_t *dst, uint8_t *src, int w)
Definition: huffyuvdec.c:904
HYuvDecContext::version
int version
Definition: huffyuvdec.c:58
AV_PIX_FMT_YUVA422P10
#define AV_PIX_FMT_YUVA422P10
Definition: pixfmt.h:597
HYuvDecContext::bits
uint32_t bits[4][MAX_VLC_N]
Definition: huffyuvdec.c:78
thread.h
av_always_inline
#define av_always_inline
Definition: attributes.h:76
skip_bits
static void skip_bits(GetBitContext *s, int n)
Definition: get_bits.h:383
close
static av_cold void close(AVCodecParserContext *s)
Definition: apv_parser.c:197
AV_PIX_FMT_YUVA420P9
#define AV_PIX_FMT_YUVA420P9
Definition: pixfmt.h:593
get_bits
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:337
FFCodec::p
AVCodec p
The public AVCodec.
Definition: codec_internal.h:133
AV_PIX_FMT_GBRP14
#define AV_PIX_FMT_GBRP14
Definition: pixfmt.h:566
AV_PIX_FMT_GBRAP
@ AV_PIX_FMT_GBRAP
planar GBRA 4:4:4:4 32bpp
Definition: pixfmt.h:212
HYuvDecContext::predictor
Predictor predictor
Definition: huffyuvdec.c:54
AV_PIX_FMT_GBRP10
#define AV_PIX_FMT_GBRP10
Definition: pixfmt.h:564
ff_llviddsp_init
av_cold void ff_llviddsp_init(LLVidDSPContext *c)
Definition: lossless_videodsp.c:114
AV_PIX_FMT_YUVA444P16
#define AV_PIX_FMT_YUVA444P16
Definition: pixfmt.h:603
GetBitContext
Definition: get_bits.h:109
AV_PIX_FMT_YUV422P9
#define AV_PIX_FMT_YUV422P9
Definition: pixfmt.h:543
AVCodecContext::flags
int flags
AV_CODEC_FLAG_*.
Definition: avcodec.h:500
decode_frame
static int decode_frame(AVCodecContext *avctx, AVFrame *p, int *got_frame, AVPacket *avpkt)
Definition: huffyuvdec.c:1233
val
static double val(void *priv, double ch)
Definition: aeval.c:77
av_pix_fmt_get_chroma_sub_sample
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
AV_PIX_FMT_GRAY16
#define AV_PIX_FMT_GRAY16
Definition: pixfmt.h:528
HYuvDecContext::chroma_h_shift
int chroma_h_shift
Definition: huffyuvdec.c:67
HYuvDecContext::temp16
uint16_t * temp16[3]
Definition: huffyuvdec.c:75
LLVidDSPContext
Definition: lossless_videodsp.h:28
AV_PIX_FMT_YUV444P10
#define AV_PIX_FMT_YUV444P10
Definition: pixfmt.h:548
HYuvDecContext::chroma
int chroma
Definition: huffyuvdec.c:65
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
decode_plane_bitstream
static void decode_plane_bitstream(HYuvDecContext *s, int width, int plane)
Definition: huffyuvdec.c:714
AV_PIX_FMT_YUV422P16
#define AV_PIX_FMT_YUV422P16
Definition: pixfmt.h:557
init_get_bits8
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
Definition: get_bits.h:544
HYuvDecContext::yuy2
int yuy2
Definition: huffyuvdec.c:59
CLOSE_READER
#define CLOSE_READER(name, gb)
Definition: get_bits.h:189
AVCodecContext::extradata_size
int extradata_size
Definition: avcodec.h:527
FF_CODEC_DECODE_CB
#define FF_CODEC_DECODE_CB(func)
Definition: codec_internal.h:372
AV_PIX_FMT_YUVA420P
@ 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_YUV444P16
#define AV_PIX_FMT_YUV444P16
Definition: pixfmt.h:558
g
const char * g
Definition: vf_curves.c:128
ff_thread_get_buffer
int ff_thread_get_buffer(AVCodecContext *avctx, AVFrame *f, int flags)
Wrapper around get_buffer() for frame-multithreaded codecs.
Definition: pthread_frame.c:1036
bits
uint8_t bits
Definition: vp3data.h:128
MEDIAN
#define MEDIAN(x)
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:42
vlc_init
#define vlc_init(vlc, nb_bits, nb_codes, bits, bits_wrap, bits_size, codes, codes_wrap, codes_size, flags)
Definition: vlc.h:70
B
#define B
Definition: huffyuv.h:42
AV_PIX_FMT_YUV420P9
#define AV_PIX_FMT_YUV420P9
Definition: pixfmt.h:542
AV_PIX_FMT_YUV420P16
#define AV_PIX_FMT_YUV420P16
Definition: pixfmt.h:556
get_bits.h
AV_CODEC_ID_FFVHUFF
@ AV_CODEC_ID_FFVHUFF
Definition: codec_id.h:117
AV_PIX_FMT_YUV420P
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:73
av_mallocz
#define av_mallocz(s)
Definition: tableprint_vlc.h:31
read_huffman_tables
static int read_huffman_tables(HYuvDecContext *s, const uint8_t *src, int length)
Definition: huffyuvdec.c:257
CODEC_LONG_NAME
#define CODEC_LONG_NAME(str)
Definition: codec_internal.h:357
AVCodecContext::codec_id
enum AVCodecID codec_id
Definition: avcodec.h:453
HYuvDecContext::temp
uint8_t * temp[3]
Definition: huffyuvdec.c:74
if
if(ret)
Definition: filter_design.txt:179
AV_CODEC_CAP_FRAME_THREADS
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
Definition: codec.h:98
HYuvDecContext::bitstream_bpp
int bitstream_bpp
Definition: huffyuvdec.c:57
AV_PIX_FMT_GBRP16
#define AV_PIX_FMT_GBRP16
Definition: pixfmt.h:567
ff_bswapdsp_init
av_cold void ff_bswapdsp_init(BswapDSPContext *c)
Definition: bswapdsp.c:37
NULL
#define NULL
Definition: coverity.c:32
AVERROR_PATCHWELCOME
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:64
AV_PIX_FMT_YUYV422
@ AV_PIX_FMT_YUYV422
packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr
Definition: pixfmt.h:74
HYuvDecContext::gb
GetBitContext gb
Definition: huffyuvdec.c:53
HYuvDecContext::vlc
VLC vlc[8]
Definition: huffyuvdec.c:80
LAST_SKIP_BITS
#define LAST_SKIP_BITS(name, gb, num)
Definition: get_bits.h:235
classic_shift_chroma
static const uint8_t classic_shift_chroma[]
Definition: huffyuvdec.c:95
ff_huffyuv_generate_bits_table
int ff_huffyuv_generate_bits_table(uint32_t *dst, const uint8_t *len_table, int n)
Definition: huffyuv.c:40
AV_PIX_FMT_YUV422P10
#define AV_PIX_FMT_YUV422P10
Definition: pixfmt.h:546
HYuvDecContext::llviddsp
LLVidDSPContext llviddsp
Definition: huffyuvdec.c:85
AV_PIX_FMT_GRAY8
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
Definition: pixfmt.h:81
READ_2PIX_PLANE16
#define READ_2PIX_PLANE16(dst0, dst1, plane)
Definition: huffyuvdec.c:708
HYuvDecContext
Definition: huffyuvdec.c:52
AV_PIX_FMT_GBRP9
#define AV_PIX_FMT_GBRP9
Definition: pixfmt.h:563
get_vlc2
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
HYuvDecContext::flags
int flags
Definition: huffyuvdec.c:69
index
int index
Definition: gxfenc.c:90
READ_2PIX_PLANE
#define READ_2PIX_PLANE(dst0, dst1, plane, OP)
Definition: huffyuvdec.c:699
init
int(* init)(AVBSFContext *ctx)
Definition: dts2pts.c:608
AV_CODEC_CAP_DR1
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
Definition: codec.h:49
AV_CODEC_FLAG_GRAY
#define AV_CODEC_FLAG_GRAY
Only decode/encode grayscale.
Definition: avcodec.h:302
AVPacket::size
int size
Definition: packet.h:604
height
#define height
Definition: dsp.h:89
codec_internal.h
dst
uint8_t ptrdiff_t const uint8_t ptrdiff_t int intptr_t intptr_t int int16_t * dst
Definition: dsp.h:87
i
#define i(width, name, range_min, range_max)
Definition: cbs_h264.c:63
ff_huffyuvdsp_init
av_cold void ff_huffyuvdsp_init(HuffYUVDSPContext *c)
Definition: huffyuvdsp.c:84
for
for(k=2;k<=8;++k)
Definition: h264pred_template.c:424
AV_PIX_FMT_YUV422P12
#define AV_PIX_FMT_YUV422P12
Definition: pixfmt.h:550
AV_NUM_DATA_POINTERS
#define AV_NUM_DATA_POINTERS
Definition: frame.h:473
AV_PIX_FMT_YUV444P12
#define AV_PIX_FMT_YUV444P12
Definition: pixfmt.h:552
decode_end
static av_cold int decode_end(AVCodecContext *avctx)
Definition: huffyuvdec.c:325
av_malloc
#define av_malloc(s)
Definition: ops_static.c:52
LEFT
#define LEFT
Definition: cdgraphics.c:168
diff
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)
Definition: vf_paletteuse.c:166
OPEN_READER
#define OPEN_READER(name, gb)
Definition: get_bits.h:177
Predictor
Definition: ratecontrol.h:33
AV_PIX_FMT_RGB32
#define AV_PIX_FMT_RGB32
Definition: pixfmt.h:517
AV_PIX_FMT_YUVA444P
@ AV_PIX_FMT_YUVA444P
planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)
Definition: pixfmt.h:174
classic_add_chroma
static const unsigned char classic_add_chroma[256]
Definition: huffyuvdec.c:121
AV_PIX_FMT_YUVA444P10
#define AV_PIX_FMT_YUVA444P10
Definition: pixfmt.h:598
offset
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
Definition: writing_filters.txt:86
decode_slice
static int decode_slice(AVCodecContext *avctx, AVFrame *p, int height, int buf_size, int y_offset, int table_size)
Definition: huffyuvdec.c:922
ff_vlc_init_sparse
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
HYuvDecContext::interlaced
int interlaced
Definition: huffyuvdec.c:55
HYuvDecContext::bps
int bps
Definition: huffyuvdec.c:61
draw_slice
static void draw_slice(HYuvDecContext *s, AVCodecContext *avctx, AVFrame *frame, int y)
Definition: huffyuvdec.c:868
HYuvDecContext::chroma_v_shift
int chroma_v_shift
Definition: huffyuvdec.c:68
AVCodecContext::bits_per_coded_sample
int bits_per_coded_sample
bits per sample/pixel from the demuxer (needed for huffyuv).
Definition: avcodec.h:1564
interlaced
uint8_t interlaced
Definition: mxfenc.c:2336
code
and forward the test the status of outputs and forward it to the corresponding return FFERROR_NOT_READY If the filters stores internally one or a few frame for some it can consider them to be part of the FIFO and delay acknowledging a status change accordingly Example code
Definition: filter_design.txt:178
AVCodecContext::extradata
uint8_t * extradata
Out-of-band global headers that may be used by some codecs.
Definition: avcodec.h:526
ff_hymt_decoder
const FFCodec ff_hymt_decoder
ff_huffyuv_decoder
const FFCodec ff_huffyuv_decoder
Definition: huffyuvdec.c:1315
AV_PIX_FMT_GBRP12
#define AV_PIX_FMT_GBRP12
Definition: pixfmt.h:565
HYuvDecContext::pix_bgr_map
uint32_t pix_bgr_map[1<< VLC_BITS]
Definition: huffyuvdec.c:79
av_assert1
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition: avassert.h:58
s
uint8_t s
Definition: llvidencdsp.c:39
av_fast_padded_malloc
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
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
AVCodec::name
const char * name
Name of the codec implementation.
Definition: codec.h:182
len
int len
Definition: vorbis_enc_data.h:426
PLANE
@ PLANE
Definition: huffyuv.h:54
decode_gray_bitstream
static void decode_gray_bitstream(HYuvDecContext *s, int count)
Definition: huffyuvdec.c:775
AVCodecContext::height
int height
Definition: avcodec.h:604
AVCodecContext::pix_fmt
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
Definition: avcodec.h:643
AV_PIX_FMT_YUV444P9
#define AV_PIX_FMT_YUV444P9
Definition: pixfmt.h:544
avcodec.h
limit
static double limit(double x)
Definition: vf_pseudocolor.c:142
ff_vlc_free
void ff_vlc_free(VLC *vlc)
Definition: vlc.c:580
ret
ret
Definition: filter_design.txt:187
frame
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
Definition: filter_design.txt:265
AV_PIX_FMT_0RGB32
#define AV_PIX_FMT_0RGB32
Definition: pixfmt.h:521
AV_PIX_FMT_YUVA444P9
#define AV_PIX_FMT_YUVA444P9
Definition: pixfmt.h:595
AV_PIX_FMT_YUV420P12
#define AV_PIX_FMT_YUV420P12
Definition: pixfmt.h:549
left
Tag MUST be and< 10hcoeff half pel interpolation filter coefficients, hcoeff[0] are the 2 middle coefficients[1] are the next outer ones and so on, resulting in a filter like:...eff[2], hcoeff[1], hcoeff[0], hcoeff[0], hcoeff[1], hcoeff[2] ... the sign of the coefficients is not explicitly stored but alternates after each coeff and coeff[0] is positive, so ...,+,-,+,-,+,+,-,+,-,+,... hcoeff[0] is not explicitly stored but found by subtracting the sum of all stored coefficients with signs from 32 hcoeff[0]=32 - hcoeff[1] - hcoeff[2] - ... a good choice for hcoeff and htaps is htaps=6 hcoeff={40,-10, 2} an alternative which requires more computations at both encoder and decoder side and may or may not be better is htaps=8 hcoeff={42,-14, 6,-2}ref_frames minimum of the number of available reference frames and max_ref_frames for example the first frame after a key frame always has ref_frames=1spatial_decomposition_type wavelet type 0 is a 9/7 symmetric compact integer wavelet 1 is a 5/3 symmetric compact integer wavelet others are reserved stored as delta from last, last is reset to 0 if always_reset||keyframeqlog quality(logarithmic quantizer scale) stored as delta from last, last is reset to 0 if always_reset||keyframemv_scale stored as delta from last, last is reset to 0 if always_reset||keyframe FIXME check that everything works fine if this changes between framesqbias dequantization bias stored as delta from last, last is reset to 0 if always_reset||keyframeblock_max_depth maximum depth of the block tree stored as delta from last, last is reset to 0 if always_reset||keyframequant_table quantization tableHighlevel bitstream structure:==============================--------------------------------------------|Header|--------------------------------------------|------------------------------------|||Block0||||split?||||yes no||||......... intra?||||:Block01 :yes no||||:Block02 :....... ..........||||:Block03 ::y DC ::ref index:||||:Block04 ::cb DC ::motion x :||||......... :cr DC ::motion y :||||....... ..........|||------------------------------------||------------------------------------|||Block1|||...|--------------------------------------------|------------ ------------ ------------|||Y subbands||Cb subbands||Cr subbands||||--- ---||--- ---||--- ---|||||LL0||HL0||||LL0||HL0||||LL0||HL0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||LH0||HH0||||LH0||HH0||||LH0||HH0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HL1||LH1||||HL1||LH1||||HL1||LH1|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HH1||HL2||||HH1||HL2||||HH1||HL2|||||...||...||...|||------------ ------------ ------------|--------------------------------------------Decoding process:=================------------|||Subbands|------------||||------------|Intra DC||||LL0 subband prediction ------------|\ Dequantization ------------------- \||Reference frames|\ IDWT|------- -------|Motion \|||Frame 0||Frame 1||Compensation . OBMC v -------|------- -------|--------------. \------> Frame n output Frame Frame<----------------------------------/|...|------------------- Range Coder:============Binary Range Coder:------------------- The implemented range coder is an adapted version based upon "Range encoding: an algorithm for removing redundancy from a digitised message." by G. N. N. Martin. The symbols encoded by the Snow range coder are bits(0|1). The associated probabilities are not fix but change depending on the symbol mix seen so far. bit seen|new state ---------+----------------------------------------------- 0|256 - state_transition_table[256 - old_state];1|state_transition_table[old_state];state_transition_table={ 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 215, 215, 216, 217, 218, 219, 220, 220, 222, 223, 224, 225, 226, 227, 227, 229, 229, 230, 231, 232, 234, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 0, 0, 0, 0, 0, 0, 0};FIXME Range Coding of integers:------------------------- FIXME Neighboring Blocks:===================left and top are set to the respective blocks unless they are outside of the image in which case they are set to the Null block top-left is set to the top left block unless it is outside of the image in which case it is set to the left block if this block has no larger parent block or it is at the left side of its parent block and the top right block is not outside of the image then the top right block is used for top-right else the top-left block is used Null block y, cb, cr are 128 level, ref, mx and my are 0 Motion Vector Prediction:=========================1. the motion vectors of all the neighboring blocks are scaled to compensate for the difference of reference frames scaled_mv=(mv *(256 *(current_reference+1)/(mv.reference+1))+128)> the median of the scaled left
Definition: snow.txt:386
AV_RL32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_RL32
Definition: bytestream.h:92
AVCodecContext::draw_horiz_band
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
BITS_LEFT
#define BITS_LEFT(name, gb)
Definition: get_bits.h:227
AV_PIX_FMT_YUV422P14
#define AV_PIX_FMT_YUV422P14
Definition: pixfmt.h:554
left_prediction
static int left_prediction(HYuvDecContext *s, uint8_t *dst, const uint8_t *src, int w, int acc)
Definition: huffyuvdec.c:895
AVCodecContext
main external API structure.
Definition: avcodec.h:443
HYuvDecContext::yuv
int yuv
Definition: huffyuvdec.c:66
SHOW_UBITS
#define SHOW_UBITS(name, gb, num)
Definition: get_bits.h:247
HYuvDecContext::len
uint8_t len[4][MAX_VLC_N]
Definition: huffyuvdec.c:77
VLC
Definition: vlc.h:50
sign_extend
static av_const int sign_extend(int val, unsigned bits)
Definition: mathops.h:135
Windows::Graphics::DirectX::Direct3D11::p
IDirect3DDxgiInterfaceAccess _COM_Outptr_ void ** p
Definition: vsrc_gfxcapture_winrt.hpp:53
G
#define G
Definition: huffyuv.h:43
AV_PIX_FMT_YUV444P
@ 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_GBRP
@ AV_PIX_FMT_GBRP
planar GBR 4:4:4 24bpp
Definition: pixfmt.h:165
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
AV_PIX_FMT_YUV422P
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition: pixfmt.h:77
mem.h
lossless_videodsp.h
w
uint8_t w
Definition: llvidencdsp.c:39
map
const VDPAUPixFmtMap * map
Definition: hwcontext_vdpau.c:71
alpha
static const int16_t alpha[]
Definition: ilbcdata.h:55
AVPacket
This structure stores compressed data.
Definition: packet.h:580
AVCodecContext::priv_data
void * priv_data
Definition: avcodec.h:470
decode_422_bitstream
static void decode_422_bitstream(HYuvDecContext *s, int count)
Definition: huffyuvdec.c:670
HYuvDecContext::bdsp
BswapDSPContext bdsp
Definition: huffyuvdec.c:83
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
AV_PIX_FMT_YUV411P
@ AV_PIX_FMT_YUV411P
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
Definition: pixfmt.h:80
classic_shift_luma
static const uint8_t classic_shift_luma[]
Definition: huffyuvdec.c:89
AVCodecContext::width
int width
picture width / height.
Definition: avcodec.h:604
bytestream.h
imgutils.h
bytestream2_init
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
Definition: bytestream.h:137
AV_CODEC_CAP_DRAW_HORIZ_BAND
#define AV_CODEC_CAP_DRAW_HORIZ_BAND
Decoder can use draw_horiz_band callback.
Definition: codec.h:41
AV_PIX_FMT_YUV410P
@ AV_PIX_FMT_YUV410P
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
Definition: pixfmt.h:79
ff_ffvhuff_decoder
const FFCodec ff_ffvhuff_decoder
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
BswapDSPContext
Definition: bswapdsp.h:24
h
h
Definition: vp9dsp_template.c:2070
AV_PIX_FMT_YUV444P14
#define AV_PIX_FMT_YUV444P14
Definition: pixfmt.h:555
av_image_check_size
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
huffyuv.h
width
#define width
Definition: dsp.h:89
HYuvDecContext::hdsp
HuffYUVDSPContext hdsp
Definition: huffyuvdec.c:84
HYuvDecContext::decorrelate
int decorrelate
Definition: huffyuvdec.c:56
src
#define src
Definition: vp8dsp.c:248
AV_PIX_FMT_YUVA422P
@ 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_YUV420P14
#define AV_PIX_FMT_YUV420P14
Definition: pixfmt.h:553
HYuvDecContext::last_slice_end
int last_slice_end
Definition: huffyuvdec.c:71
HYuvDecContext::bitstream_buffer
uint8_t * bitstream_buffer
Definition: huffyuvdec.c:81