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 "config_components.h"
36
46
47 #define classic_shift_luma_table_size 42
49 34, 36, 35, 69, 135, 232, 9, 16, 10, 24, 11, 23, 12, 16, 13, 10,
50 14, 8, 15, 8, 16, 8, 17, 20, 16, 10, 207, 206, 205, 236, 11, 8,
51 10, 21, 9, 23, 8, 8, 199, 70, 69, 68, 0,
52 0,0,0,0,0,0,0,0,
53 };
54
55 #define classic_shift_chroma_table_size 59
57 66, 36, 37, 38, 39, 40, 41, 75, 76, 77, 110, 239, 144, 81, 82, 83,
58 84, 85, 118, 183, 56, 57, 88, 89, 56, 89, 154, 57, 58, 57, 26, 141,
59 57, 56, 58, 57, 58, 57, 184, 119, 214, 245, 116, 83, 82, 49, 80, 79,
60 78, 77, 44, 75, 41, 40, 39, 38, 37, 36, 34, 0,
61 0,0,0,0,0,0,0,0,
62 };
63
65 3, 9, 5, 12, 10, 35, 32, 29, 27, 50, 48, 45, 44, 41, 39, 37,
66 73, 70, 68, 65, 64, 61, 58, 56, 53, 50, 49, 46, 44, 41, 38, 36,
67 68, 65, 63, 61, 58, 55, 53, 51, 48, 46, 45, 43, 41, 39, 38, 36,
68 35, 33, 32, 30, 29, 27, 26, 25, 48, 47, 46, 44, 43, 41, 40, 39,
69 37, 36, 35, 34, 32, 31, 30, 28, 27, 26, 24, 23, 22, 20, 19, 37,
70 35, 34, 33, 31, 30, 29, 27, 26, 24, 23, 21, 20, 18, 17, 15, 29,
71 27, 26, 24, 22, 21, 19, 17, 16, 14, 26, 25, 23, 21, 19, 18, 16,
72 15, 27, 25, 23, 21, 19, 17, 16, 14, 26, 25, 23, 21, 18, 17, 14,
73 12, 17, 19, 13, 4, 9, 2, 11, 1, 7, 8, 0, 16, 3, 14, 6,
74 12, 10, 5, 15, 18, 11, 10, 13, 15, 16, 19, 20, 22, 24, 27, 15,
75 18, 20, 22, 24, 26, 14, 17, 20, 22, 24, 27, 15, 18, 20, 23, 25,
76 28, 16, 19, 22, 25, 28, 32, 36, 21, 25, 29, 33, 38, 42, 45, 49,
77 28, 31, 34, 37, 40, 42, 44, 47, 49, 50, 52, 54, 56, 57, 59, 60,
78 62, 64, 66, 67, 69, 35, 37, 39, 40, 42, 43, 45, 47, 48, 51, 52,
79 54, 55, 57, 59, 60, 62, 63, 66, 67, 69, 71, 72, 38, 40, 42, 43,
80 46, 47, 49, 51, 26, 28, 30, 31, 33, 34, 18, 19, 11, 13, 7, 8,
81 };
82
84 3, 1, 2, 2, 2, 2, 3, 3, 7, 5, 7, 5, 8, 6, 11, 9,
85 7, 13, 11, 10, 9, 8, 7, 5, 9, 7, 6, 4, 7, 5, 8, 7,
86 11, 8, 13, 11, 19, 15, 22, 23, 20, 33, 32, 28, 27, 29, 51, 77,
87 43, 45, 76, 81, 46, 82, 75, 55, 56, 144, 58, 80, 60, 74, 147, 63,
88 143, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
89 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 27, 30, 21, 22,
90 17, 14, 5, 6, 100, 54, 47, 50, 51, 53, 106, 107, 108, 109, 110, 111,
91 112, 113, 114, 115, 4, 117, 118, 92, 94, 121, 122, 3, 124, 103, 2, 1,
92 0, 129, 130, 131, 120, 119, 126, 125, 136, 137, 138, 139, 140, 141, 142, 134,
93 135, 132, 133, 104, 64, 101, 62, 57, 102, 95, 93, 59, 61, 28, 97, 96,
94 52, 49, 48, 29, 32, 25, 24, 46, 23, 98, 45, 44, 43, 20, 42, 41,
95 19, 18, 99, 40, 15, 39, 38, 16, 13, 12, 11, 37, 10, 9, 8, 36,
96 7, 128, 127, 105, 123, 116, 35, 34, 33, 145, 31, 79, 42, 146, 78, 26,
97 83, 48, 49, 50, 44, 47, 26, 31, 30, 18, 17, 19, 21, 24, 25, 13,
98 14, 16, 17, 18, 20, 21, 12, 14, 15, 9, 10, 6, 9, 6, 5, 8,
99 6, 12, 8, 10, 7, 9, 6, 4, 6, 2, 2, 3, 3, 3, 3, 2,
100 };
101
103 {
105
106 for (
i = 0;
i < n;) {
109 if (repeat == 0)
114 }
115 while (repeat--)
117 }
118 return 0;
119 }
120
122 {
127 if (!symbols)
131
132 if (
s->bitstream_bpp < 24 ||
s->version > 2) {
134 for (p = 0; p < 4; p++) {
135 int p0 =
s->version > 2 ? p : 0;
136 for (
i = y = 0; y <
s->vlc_n; y++) {
137 int len0 =
s->len[p0][y];
139 if (
limit <= 0 || !len0)
140 continue;
142 continue;
143 for (
u = 0;
u <
s->vlc_n;
u++) {
144 int len1 =
s->len[p][
u];
145 if (len1 >
limit || !len1)
146 continue;
148 continue;
150 len[
i] = len0 + len1;
151 bits[
i] = (
s->bits[p0][y] << len1) +
s->bits[p][
u];
152 symbols[
i] = (y << 8) + (
u & 0xFF);
154 }
155 }
158 bits, 2, 2, symbols, 2, 2, 0)) < 0)
160 }
161 } else {
162 uint8_t (*
map)[4] = (uint8_t(*)[4])
s->pix_bgr_map;
164 int p0 =
s->decorrelate;
165 int p1 = !
s->decorrelate;
166 /* Restrict the range to +/-16 because that's pretty much guaranteed
167 * to cover all the combinations that fit in 11 bits total, and it
168 * does not matter if we miss a few rare codes. */
169 for (
i = 0,
g = -16;
g < 16;
g++) {
170 int len0 =
s->len[p0][
g & 255];
172 if (limit0 < 2 || !len0)
173 continue;
174 for (
b = -16;
b < 16;
b++) {
175 int len1 =
s->len[p1][
b & 255];
176 int limit1 = limit0 - len1;
177 if (limit1 < 1 || !len1)
178 continue;
179 code = (
s->bits[p0][
g & 255] << len1) +
s->bits[p1][
b & 255];
180 for (
r = -16;
r < 16;
r++) {
181 int len2 =
s->len[2][
r & 255];
182 if (len2 > limit1 || !len2)
183 continue;
185 len[
i] = len0 + len1 + len2;
187 if (
s->decorrelate) {
191 } else {
195 }
197 }
198 }
199 }
204 }
209 }
210
212 {
215 int count = 3;
216
219
221 count = 1 +
s->alpha + 2*
s->chroma;
222
223 for (
i = 0;
i < count;
i++) {
230 s->bits[
i], 4, 4, 0)) < 0)
232 }
233
236
238 }
239
241 {
244
249
254
255 for (
i = 0;
i < 256;
i++)
259
260 if (
s->bitstream_bpp >= 24) {
261 memcpy(
s->bits[1],
s->bits[0], 256 *
sizeof(uint32_t));
262 memcpy(
s->len[1],
s->len[0], 256 *
sizeof(uint8_t));
263 }
264 memcpy(
s->bits[2],
s->bits[1], 256 *
sizeof(uint32_t));
265 memcpy(
s->len[2],
s->len[1], 256 *
sizeof(uint8_t));
266
267 for (
i = 0;
i < 4;
i++) {
270 s->bits[
i], 4, 4, 0)) < 0)
272 }
273
276
277 return 0;
278 }
279
281 {
284
287
288 for (
i = 0;
i < 8;
i++)
290
291 return 0;
292 }
293
295 {
298
302
305 memset(
s->vlc, 0, 4 *
sizeof(
VLC));
306
307 s->interlaced = avctx->
height > 288;
309
313 s->version = 1;
// do such files exist at all?
316 else
318 } else
320
325 if (
s->version >= 2) {
326 int method, interlace;
327
330
332 s->decorrelate = method & 64 ? 1 : 0;
333 s->predictor = method & 63;
334 if (
s->version == 2) {
336 if (
s->bitstream_bpp == 0)
338 } else {
343 s->chroma_v_shift = (avctx->
extradata[1] >> 2) & 3;
347 }
348 interlace = (avctx->
extradata[2] & 0x30) >> 4;
349 s->interlaced = (interlace == 1) ? 1 : (interlace == 2) ? 0 :
s->interlaced;
350 s->context = avctx->
extradata[2] & 0x40 ? 1 : 0;
351
355 } else {
357 case 1:
360 break;
361 case 2:
364 break;
365 case 3:
368 break;
369 case 4:
372 break;
373 default:
374 s->predictor =
LEFT;
// OLD
376 break;
377 }
380
383 }
384
385 if (
s->version <= 2) {
386 switch (
s->bitstream_bpp) {
387 case 12:
390 break;
391 case 16:
394 else
397 break;
398 case 24:
401 else
403 break;
404 case 32:
408 break;
409 default:
411 }
415 } else {
416 switch ( (
s->chroma<<10) | (
s->yuv<<9) | (
s->alpha<<8) | ((
s->bps-1)<<4) |
s->chroma_h_shift | (
s->chroma_v_shift<<2)) {
417 case 0x070:
419 break;
420 case 0x0F0:
422 break;
423 case 0x470:
425 break;
426 case 0x480:
428 break;
429 case 0x490:
431 break;
432 case 0x4B0:
434 break;
435 case 0x4D0:
437 break;
438 case 0x4F0:
440 break;
441 case 0x570:
443 break;
444 case 0x670:
446 break;
447 case 0x680:
449 break;
450 case 0x690:
452 break;
453 case 0x6B0:
455 break;
456 case 0x6D0:
458 break;
459 case 0x6F0:
461 break;
462 case 0x671:
464 break;
465 case 0x681:
467 break;
468 case 0x691:
470 break;
471 case 0x6B1:
473 break;
474 case 0x6D1:
476 break;
477 case 0x6F1:
479 break;
480 case 0x672:
482 break;
483 case 0x674:
485 break;
486 case 0x675:
488 break;
489 case 0x685:
491 break;
492 case 0x695:
494 break;
495 case 0x6B5:
497 break;
498 case 0x6D5:
500 break;
501 case 0x6F5:
503 break;
504 case 0x67A:
506 break;
507 case 0x770:
509 break;
510 case 0x780:
512 break;
513 case 0x790:
515 break;
516 case 0x7F0:
518 break;
519 case 0x771:
521 break;
522 case 0x781:
524 break;
525 case 0x791:
527 break;
528 case 0x7F1:
530 break;
531 case 0x775:
533 break;
534 case 0x785:
536 break;
537 case 0x795:
539 break;
540 case 0x7F5:
542 break;
543 default:
545 }
546 }
547
549
553 }
557 "for this combination of colorspace and predictor type.\n");
559 }
560
563
564 return 0;
565 }
566
567 /** Subset of GET_VLC for use in hand-roller VLC code */
568 #define VLC_INTERN(dst, table, gb, name, bits, max_depth) \
569 code = table[index].sym; \
570 n = table[index].len; \
571 if (max_depth > 1 && n < 0) { \
572 LAST_SKIP_BITS(name, gb, bits); \
573 UPDATE_CACHE(name, gb); \
574 \
575 nb_bits = -n; \
576 index = SHOW_UBITS(name, gb, nb_bits) + code; \
577 code = table[index].sym; \
578 n = table[index].len; \
579 if (max_depth > 2 && n < 0) { \
580 LAST_SKIP_BITS(name, gb, nb_bits); \
581 UPDATE_CACHE(name, gb); \
582 \
583 nb_bits = -n; \
584 index = SHOW_UBITS(name, gb, nb_bits) + code; \
585 code = table[index].sym; \
586 n = table[index].len; \
587 } \
588 } \
589 dst = code; \
590 LAST_SKIP_BITS(name, gb, n)
591
592
593 #define GET_VLC_DUAL(dst0, dst1, name, gb, dtable, table1, table2, \
594 bits, max_depth, OP) \
595 do { \
596 unsigned int index = SHOW_UBITS(name, gb, bits); \
597 int code, n = dtable[index].len; \
598 \
599 if (n<=0) { \
600 int nb_bits; \
601 VLC_INTERN(dst0, table1, gb, name, bits, max_depth); \
602 \
603 UPDATE_CACHE(re, gb); \
604 index = SHOW_UBITS(name, gb, bits); \
605 VLC_INTERN(dst1, table2, gb, name, bits, max_depth); \
606 } else { \
607 code = dtable[index].sym; \
608 OP(dst0, dst1, code); \
609 LAST_SKIP_BITS(name, gb, n); \
610 } \
611 } while (0)
612
613 #define OP8bits(dst0, dst1, code) dst0 = code>>8; dst1 = code
614
615 #define READ_2PIX(dst0, dst1, plane1) \
616 UPDATE_CACHE(re, &s->gb); \
617 GET_VLC_DUAL(dst0, dst1, re, &s->gb, s->vlc[4+plane1].table, \
618 s->vlc[0].table, s->vlc[plane1].table, VLC_BITS, 3, OP8bits)
619
621 {
624 count /= 2;
625
627 if (count >= icount) {
628 for (
i = 0;
i < icount;
i++) {
631 }
636 }
637 for (;
i < count;
i++)
638 s->temp[0][2 *
i ] =
s->temp[1][
i] =
639 s->temp[0][2 *
i + 1] =
s->temp[2][
i] = 0;
640 } else {
641 for (
i = 0;
i < count;
i++) {
644 }
645 }
647 }
648
649 #define READ_2PIX_PLANE(dst0, dst1, plane, OP) \
650 UPDATE_CACHE(re, &s->gb); \
651 GET_VLC_DUAL(dst0, dst1, re, &s->gb, s->vlc[4+plane].table, \
652 s->vlc[plane].table, s->vlc[plane].table, VLC_BITS, 3, OP)
653
654 #define OP14bits(dst0, dst1, code) dst0 = code>>8; dst1 = sign_extend(code, 8)
655
656 /* TODO instead of restarting the read when the code isn't in the first level
657 * of the joint table, jump into the 2nd level of the individual table. */
658 #define READ_2PIX_PLANE16(dst0, dst1, plane){\
659 dst0 = get_vlc2(&s->gb, s->vlc[plane].table, VLC_BITS, 3)<<2;\
660 dst0 += get_bits(&s->gb, 2);\
661 dst1 = get_vlc2(&s->gb, s->vlc[plane].table, VLC_BITS, 3)<<2;\
662 dst1 += get_bits(&s->gb, 2);\
663 }
665 {
667
673 }
674 } else {
675 for(
i=0;
i<count;
i++){
677 }
678 }
681 int nb_bits,
code, n;
686 }
688 }
else if (
s->bps <= 14) {
693 }
694 } else {
695 for(
i=0;
i<count;
i++){
697 }
698 }
701 int nb_bits,
code, n;
706 }
708 } else {
712 }
713 } else {
714 for(
i=0;
i<count;
i++){
716 }
717 }
721 }
722 }
723 }
724
726 {
729 count /= 2;
730
734 }
735 } else {
736 for (
i = 0;
i < count;
i++) {
738 }
739 }
741 }
742
745 {
748
751 int code, n, nb_bits;
752
755 n =
s->vlc[4].table[
index].len;
756
757 if (n>0) {
759 *(uint32_t *) &
s->temp[0][4 *
i] =
s->pix_bgr_map[
code];
761 } else {
765
769 s->temp[0][4 *
i +
B] =
code +
s->temp[0][4 *
i +
G];
770
774 s->temp[0][4 *
i +
R] =
code +
s->temp[0][4 *
i +
G];
775 } else {
778
783
788 }
789 }
795 } else
796 s->temp[0][4 *
i +
A] = 0;
797 }
799 }
800
802 {
803 if (
s->decorrelate) {
804 if (
s->bitstream_bpp == 24)
806 else
808 } else {
809 if (
s->bitstream_bpp == 24)
811 else
813 }
814 }
815
817 {
820
821 if (!
s->avctx->draw_horiz_band)
822 return;
823
824 h = y -
s->last_slice_end;
826
827 if (
s->bitstream_bpp == 12)
828 cy = y >> 1;
829 else
830 cy = y;
831
837 emms_c();
838
840
841 s->last_slice_end = y +
h;
842 }
843
845 {
847 return s->llviddsp.add_left_pred(dst,
src,
w,
acc);
848 } else {
849 return s->llviddsp.add_left_pred_int16(( uint16_t *)dst, (
const uint16_t *)
src,
s->n-1,
w,
acc);
850 }
851 }
852
854 {
856 s->llviddsp.add_bytes(dst,
src,
w);
857 } else {
858 s->hdsp.add_int16((uint16_t*)dst, (
const uint16_t*)
src,
s->n - 1,
w);
859 }
860 }
861
863 {
865 s->llviddsp.add_median_pred(dst,
src,
diff,
w,
left, left_top);
866 } else {
867 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);
868 }
869 }
870
872 int buf_size, int y_offset, int table_size)
873 {
875 int fake_ystride, fake_ustride, fake_vstride;
876 const int width =
s->width;
877 const int width2 =
s->width >> 1;
879
880 if ((
ret =
init_get_bits8(&
s->gb,
s->bitstream_buffer + table_size, buf_size - table_size)) < 0)
882
886
887 if (
s->version > 2) {
888 int plane;
889 for(plane = 0; plane < 1 + 2*
s->chroma +
s->alpha; plane++) {
890 int left, lefttop, y;
893 int fake_stride = fake_ystride;
894
895 if (
s->chroma && (plane == 1 || plane == 2)) {
896 w >>=
s->chroma_h_shift;
897 h >>=
s->chroma_v_shift;
898 fake_stride = plane == 1 ? fake_ustride : fake_vstride;
899 }
900
901 switch (
s->predictor) {
906
907 for (y = 1; y <
h; y++) {
909
912 if (
s->predictor ==
PLANE) {
913 if (y >
s->interlaced) {
915 }
916 }
917 }
918
919 break;
923
924 y = 1;
926 break;
927
928 /* second line is left predicted for interlaced case */
932 y++;
934 break;
935 }
936
937 lefttop = p->
data[plane][0];
940 y++;
941
943 uint8_t *dst;
944
946
948
950 }
951
952 break;
953 }
954 }
956 }
else if (
s->bitstream_bpp < 24) {
957 int y, cy;
958 int lefty, leftu, leftv;
959 int lefttopy, lefttopu, lefttopv;
960
966
968 "YUY2 output is not implemented yet\n");
970 } else {
971 leftv =
973 lefty =
975 leftu =
978
979 switch (
s->predictor) {
983 lefty =
s->llviddsp.add_left_pred(p->
data[0] + p->
linesize[0] * y_offset + 2,
s->temp[0],
986 leftu =
s->llviddsp.add_left_pred(p->
data[1] + p->
linesize[1] * y_offset + 1,
s->temp[1], width2 - 1, leftu);
987 leftv =
s->llviddsp.add_left_pred(p->
data[2] + p->
linesize[2] * y_offset + 1,
s->temp[2], width2 - 1, leftv);
988 }
989
990 for (cy = y = 1; y <
height; y++, cy++) {
991 uint8_t *ydst, *udst, *vdst;
992
993 if (
s->bitstream_bpp == 12) {
995
997
998 lefty =
s->llviddsp.add_left_pred(ydst,
s->temp[0],
1000 if (
s->predictor ==
PLANE) {
1001 if (y >
s->interlaced)
1002 s->llviddsp.add_bytes(ydst, ydst - fake_ystride,
width);
1003 }
1004 y++;
1006 break;
1007 }
1008
1010
1014
1016 lefty =
s->llviddsp.add_left_pred(ydst,
s->temp[0],
1019 leftu =
s->llviddsp.add_left_pred(udst,
s->temp[1], width2, leftu);
1020 leftv =
s->llviddsp.add_left_pred(vdst,
s->temp[2], width2, leftv);
1021 }
1022 if (
s->predictor ==
PLANE) {
1023 if (cy >
s->interlaced) {
1024 s->llviddsp.add_bytes(ydst, ydst - fake_ystride,
width);
1026 s->llviddsp.add_bytes(udst, udst - fake_ustride, width2);
1027 s->llviddsp.add_bytes(vdst, vdst - fake_vstride, width2);
1028 }
1029 }
1030 }
1031 }
1033
1034 break;
1036 /* first line except first 2 pixels is left predicted */
1038 lefty =
s->llviddsp.add_left_pred(p->
data[0] + 2,
s->temp[0],
1041 leftu =
s->llviddsp.add_left_pred(p->
data[1] + 1,
s->temp[1], width2 - 1, leftu);
1042 leftv =
s->llviddsp.add_left_pred(p->
data[2] + 1,
s->temp[2], width2 - 1, leftv);
1043 }
1044
1045 cy = y = 1;
1047 break;
1048
1049 /* second line is left predicted for interlaced case */
1050 if (
s->interlaced) {
1052 lefty =
s->llviddsp.add_left_pred(p->
data[0] + p->
linesize[0],
1053 s->temp[0],
width, lefty);
1055 leftu =
s->llviddsp.add_left_pred(p->
data[1] + p->
linesize[2],
s->temp[1], width2, leftu);
1056 leftv =
s->llviddsp.add_left_pred(p->
data[2] + p->
linesize[1],
s->temp[2], width2, leftv);
1057 }
1058 y++;
1059 cy++;
1061 break;
1062 }
1063
1064 /* next 4 pixels are left predicted too */
1066 lefty =
s->llviddsp.add_left_pred(p->
data[0] + fake_ystride,
1067 s->temp[0], 4, lefty);
1069 leftu =
s->llviddsp.add_left_pred(p->
data[1] + fake_ustride,
s->temp[1], 2, leftu);
1070 leftv =
s->llviddsp.add_left_pred(p->
data[2] + fake_vstride,
s->temp[2], 2, leftv);
1071 }
1072
1073 /* next line except the first 4 pixels is median predicted */
1074 lefttopy = p->
data[0][3];
1076 s->llviddsp.add_median_pred(p->
data[0] + fake_ystride + 4,
1077 p->
data[0] + 4,
s->temp[0],
1078 width - 4, &lefty, &lefttopy);
1080 lefttopu = p->
data[1][1];
1081 lefttopv = p->
data[2][1];
1082 s->llviddsp.add_median_pred(p->
data[1] + fake_ustride + 2, p->
data[1] + 2,
s->temp[1], width2 - 2, &leftu, &lefttopu);
1083 s->llviddsp.add_median_pred(p->
data[2] + fake_vstride + 2, p->
data[2] + 2,
s->temp[2], width2 - 2, &leftv, &lefttopv);
1084 }
1085 y++;
1086 cy++;
1087
1088 for (; y <
height; y++, cy++) {
1089 uint8_t *ydst, *udst, *vdst;
1090
1091 if (
s->bitstream_bpp == 12) {
1092 while (2 * cy > y) {
1095 s->llviddsp.add_median_pred(ydst, ydst - fake_ystride,
1097 &lefty, &lefttopy);
1098 y++;
1099 }
1101 break;
1102 }
1104
1106
1110
1111 s->llviddsp.add_median_pred(ydst, ydst - fake_ystride,
1113 &lefty, &lefttopy);
1115 s->llviddsp.add_median_pred(udst, udst - fake_ustride,
s->temp[1], width2, &leftu, &lefttopu);
1116 s->llviddsp.add_median_pred(vdst, vdst - fake_vstride,
s->temp[2], width2, &leftv, &lefttopv);
1117 }
1118 }
1119
1121 break;
1122 }
1123 }
1124 } else {
1125 int y;
1128
1129 if (
s->bitstream_bpp == 32) {
1134 } else {
1140 }
1141
1143 switch (
s->predictor) {
1147 s->hdsp.add_hfyu_left_pred_bgr32(p->
data[0] + last_line + 4,
1149
1150 for (y =
height - 2; y >= 0; y--) {
// Yes it is stored upside down.
1152
1153 s->hdsp.add_hfyu_left_pred_bgr32(p->
data[0] + p->
linesize[0] * (y + y_offset),
1155 if (
s->predictor ==
PLANE) {
1156 if (
s->bitstream_bpp != 32)
1159 s->llviddsp.add_bytes(p->
data[0] + p->
linesize[0] * (y + y_offset),
1161 fake_ystride, 4 *
width);
1162 }
1163 }
1164 }
1165 // just 1 large slice as this is not possible in reverse order
1167 break;
1168 default:
1170 "prediction type not supported!\n");
1171 }
1172 } else {
1174 "BGR24 output is not implemented yet\n");
1176 }
1177 }
1178
1179 return 0;
1180 }
1181
1184 {
1185 const uint8_t *buf = avpkt->
data;
1186 int buf_size = avpkt->
size;
1188 const int width =
s->width;
1190 int slice, table_size = 0,
ret, nb_slices;
1191 unsigned slices_info_offset;
1192 int slice_height;
1193
1196
1198 &
s->bitstream_buffer_size,
1199 buf_size);
1200 if (!
s->bitstream_buffer)
1202
1203 s->bdsp.bswap_buf((uint32_t *)
s->bitstream_buffer,
1204 (const uint32_t *) buf, buf_size / 4);
1205
1208
1211 if (table_size < 0)
1212 return table_size;
1213 }
1214
1215 if ((unsigned) (buf_size - table_size) >= INT_MAX / 8)
1217
1218 s->last_slice_end = 0;
1219
1221 (buf_size > 32 &&
AV_RL32(avpkt->
data + buf_size - 16) == 0)) {
1222 slices_info_offset =
AV_RL32(avpkt->
data + buf_size - 4);
1223 slice_height =
AV_RL32(avpkt->
data + buf_size - 8);
1225 if (nb_slices * 8LL + slices_info_offset > buf_size - 16 ||
1226 s->chroma_v_shift ||
1227 slice_height <= 0 || nb_slices * (uint64_t)slice_height >
height)
1229 } else {
1231 nb_slices = 1;
1232 }
1233
1234 for (slice = 0; slice < nb_slices; slice++) {
1235 int y_offset, slice_offset, slice_size;
1236
1237 if (nb_slices > 1) {
1238 slice_offset =
AV_RL32(avpkt->
data + slices_info_offset + slice * 8);
1239 slice_size =
AV_RL32(avpkt->
data + slices_info_offset + slice * 8 + 4);
1240
1241 if (slice_offset < 0 || slice_size <= 0 || (slice_offset&3) ||
1242 slice_offset + (int64_t)slice_size > buf_size)
1244
1245 y_offset =
height - (slice + 1) * slice_height;
1246 s->bdsp.bswap_buf((uint32_t *)
s->bitstream_buffer,
1247 (const uint32_t *)(buf + slice_offset), slice_size / 4);
1248 } else {
1249 y_offset = 0;
1250 slice_offset = 0;
1251 slice_size = buf_size;
1252 }
1253
1254 ret =
decode_slice(avctx, p, slice_height, slice_size, y_offset, table_size);
1255 emms_c();
1258 }
1259
1260 *got_frame = 1;
1261
1263 }
1264
1266 .
p.
name =
"huffyuv",
1277 };
1278
1279 #if CONFIG_FFVHUFF_DECODER
1281 .
p.
name =
"ffvhuff",
1292 };
1293 #endif /* CONFIG_FFVHUFF_DECODER */
1294
1295 #if CONFIG_HYMT_DECODER
1308 };
1309 #endif /* CONFIG_HYMT_DECODER */