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