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
50
52
60 int yuy2;
//use yuy2 instead of 422P
61 int bgr32;
//use bgr32 instead of bgr24
64 int vlc_n;
// number of vlc codes (FFMIN(1<<bps, MAX_VLC_N))
73
74 union {
77 };
88
89
91 34, 36, 35, 69, 135, 232, 9, 16, 10, 24, 11, 23, 12, 16, 13, 10,
92 14, 8, 15, 8, 16, 8, 17, 20, 16, 10, 207, 206, 205, 236, 11, 8,
93 10, 21, 9, 23, 8, 8, 199, 70, 69, 68,
94 };
95
97 66, 36, 37, 38, 39, 40, 41, 75, 76, 77, 110, 239, 144, 81, 82, 83,
98 84, 85, 118, 183, 56, 57, 88, 89, 56, 89, 154, 57, 58, 57, 26, 141,
99 57, 56, 58, 57, 58, 57, 184, 119, 214, 245, 116, 83, 82, 49, 80, 79,
100 78, 77, 44, 75, 41, 40, 39, 38, 37, 36, 34,
101 };
102
104 3, 9, 5, 12, 10, 35, 32, 29, 27, 50, 48, 45, 44, 41, 39, 37,
105 73, 70, 68, 65, 64, 61, 58, 56, 53, 50, 49, 46, 44, 41, 38, 36,
106 68, 65, 63, 61, 58, 55, 53, 51, 48, 46, 45, 43, 41, 39, 38, 36,
107 35, 33, 32, 30, 29, 27, 26, 25, 48, 47, 46, 44, 43, 41, 40, 39,
108 37, 36, 35, 34, 32, 31, 30, 28, 27, 26, 24, 23, 22, 20, 19, 37,
109 35, 34, 33, 31, 30, 29, 27, 26, 24, 23, 21, 20, 18, 17, 15, 29,
110 27, 26, 24, 22, 21, 19, 17, 16, 14, 26, 25, 23, 21, 19, 18, 16,
111 15, 27, 25, 23, 21, 19, 17, 16, 14, 26, 25, 23, 21, 18, 17, 14,
112 12, 17, 19, 13, 4, 9, 2, 11, 1, 7, 8, 0, 16, 3, 14, 6,
113 12, 10, 5, 15, 18, 11, 10, 13, 15, 16, 19, 20, 22, 24, 27, 15,
114 18, 20, 22, 24, 26, 14, 17, 20, 22, 24, 27, 15, 18, 20, 23, 25,
115 28, 16, 19, 22, 25, 28, 32, 36, 21, 25, 29, 33, 38, 42, 45, 49,
116 28, 31, 34, 37, 40, 42, 44, 47, 49, 50, 52, 54, 56, 57, 59, 60,
117 62, 64, 66, 67, 69, 35, 37, 39, 40, 42, 43, 45, 47, 48, 51, 52,
118 54, 55, 57, 59, 60, 62, 63, 66, 67, 69, 71, 72, 38, 40, 42, 43,
119 46, 47, 49, 51, 26, 28, 30, 31, 33, 34, 18, 19, 11, 13, 7, 8,
120 };
121
123 3, 1, 2, 2, 2, 2, 3, 3, 7, 5, 7, 5, 8, 6, 11, 9,
124 7, 13, 11, 10, 9, 8, 7, 5, 9, 7, 6, 4, 7, 5, 8, 7,
125 11, 8, 13, 11, 19, 15, 22, 23, 20, 33, 32, 28, 27, 29, 51, 77,
126 43, 45, 76, 81, 46, 82, 75, 55, 56, 144, 58, 80, 60, 74, 147, 63,
127 143, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
128 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 27, 30, 21, 22,
129 17, 14, 5, 6, 100, 54, 47, 50, 51, 53, 106, 107, 108, 109, 110, 111,
130 112, 113, 114, 115, 4, 117, 118, 92, 94, 121, 122, 3, 124, 103, 2, 1,
131 0, 129, 130, 131, 120, 119, 126, 125, 136, 137, 138, 139, 140, 141, 142, 134,
132 135, 132, 133, 104, 64, 101, 62, 57, 102, 95, 93, 59, 61, 28, 97, 96,
133 52, 49, 48, 29, 32, 25, 24, 46, 23, 98, 45, 44, 43, 20, 42, 41,
134 19, 18, 99, 40, 15, 39, 38, 16, 13, 12, 11, 37, 10, 9, 8, 36,
135 7, 128, 127, 105, 123, 116, 35, 34, 33, 145, 31, 79, 42, 146, 78, 26,
136 83, 48, 49, 50, 44, 47, 26, 31, 30, 18, 17, 19, 21, 24, 25, 13,
137 14, 16, 17, 18, 20, 21, 12, 14, 15, 9, 10, 6, 9, 6, 5, 8,
138 6, 12, 8, 10, 7, 9, 6, 4, 6, 2, 2, 3, 3, 3, 3, 2,
139 };
140
142 {
144
145 for (
i = 0;
i < n;) {
148 repeat = bytestream2_peek_byteu(gb) >> 5;
149 val = bytestream2_get_byteu(gb) & 0x1F;
150 if (repeat == 0) {
153 repeat = bytestream2_get_byteu(gb);
154 }
157 while (repeat--)
159 }
160 return 0;
161
165 }
166
168 {
173 if (!symbols)
177
178 if (
s->bitstream_bpp < 24 ||
s->version > 2) {
179 int count = 1 +
s->alpha + 2 *
s->chroma;
181 for (p = 0; p < count; p++) {
182 int p0 =
s->version > 2 ? p : 0;
183 for (
i = y = 0; y <
s->vlc_n; y++) {
184 int len0 =
s->len[p0][y];
186 if (
limit <= 0 || !len0)
187 continue;
189 continue;
190 for (
u = 0;
u <
s->vlc_n;
u++) {
191 int len1 =
s->len[p][
u];
192 if (len1 >
limit || !len1)
193 continue;
195 continue;
197 len[
i] = len0 + len1;
198 bits[
i] = (
s->bits[p0][y] << len1) +
s->bits[p][
u];
199 symbols[
i] = (y << 8) + (
u & 0xFF);
201 }
202 }
205 bits, 2, 2, symbols, 2, 2, 0)) < 0)
207 }
208 } else {
209 uint8_t (*
map)[4] = (uint8_t(*)[4])
s->pix_bgr_map;
211 int p0 =
s->decorrelate;
212 int p1 = !
s->decorrelate;
213 /* Restrict the range to +/-16 because that's pretty much guaranteed
214 * to cover all the combinations that fit in 11 bits total, and it
215 * does not matter if we miss a few rare codes. */
216 for (
i = 0,
g = -16;
g < 16;
g++) {
217 int len0 =
s->len[p0][
g & 255];
219 if (limit0 < 2 || !len0)
220 continue;
221 for (
b = -16;
b < 16;
b++) {
222 int len1 =
s->len[p1][
b & 255];
223 int limit1 = limit0 - len1;
224 if (limit1 < 1 || !len1)
225 continue;
226 code = (
s->bits[p0][
g & 255] << len1) +
s->bits[p1][
b & 255];
227 for (
r = -16;
r < 16;
r++) {
228 int len2 =
s->len[2][
r & 255];
229 if (len2 > limit1 || !len2)
230 continue;
232 len[
i] = len0 + len1 + len2;
234 if (
s->decorrelate) {
238 } else {
242 }
244 }
245 }
246 }
251 }
256 }
257
259 {
262 int count = 3;
263
265
267 count = 1 +
s->alpha + 2*
s->chroma;
268
269 for (
i = 0;
i < count;
i++) {
276 s->bits[
i], 4, 4, 0)) < 0)
278 }
279
282
284 }
285
287 {
290
295
300
301 for (
i = 0;
i < 256;
i++)
305
306 if (
s->bitstream_bpp >= 24) {
307 memcpy(
s->bits[1],
s->bits[0], 256 *
sizeof(uint32_t));
308 memcpy(
s->len[1],
s->len[0], 256 *
sizeof(uint8_t));
309 }
310 memcpy(
s->bits[2],
s->bits[1], 256 *
sizeof(uint32_t));
311 memcpy(
s->len[2],
s->len[1], 256 *
sizeof(uint8_t));
312
313 for (
i = 0;
i < 4;
i++) {
316 s->bits[
i], 4, 4, 0)) < 0)
318 }
319
322
323 return 0;
324 }
325
327 {
330
331 for (
int i = 0;
i < 3;
i++)
333
335
336 for (
i = 0;
i < 8;
i++)
338
339 return 0;
340 }
341
343 {
346
350
352
356
357 s->interlaced = avctx->
height > 288;
359
363 s->version = 1;
// do such files exist at all?
366 else
368 } else
370
375 if (
s->version >= 2) {
376 int method, interlace;
377
380
382 s->decorrelate = method & 64 ? 1 : 0;
383 s->predictor = method & 63;
384 if (
s->version == 2) {
386 if (
s->bitstream_bpp == 0)
388 } else {
393 s->chroma_v_shift = (avctx->
extradata[1] >> 2) & 3;
397 }
398 interlace = (avctx->
extradata[2] & 0x30) >> 4;
399 s->interlaced = (interlace == 1) ? 1 : (interlace == 2) ? 0 :
s->interlaced;
400 s->context = avctx->
extradata[2] & 0x40 ? 1 : 0;
401
405 } else {
407 case 1:
410 break;
411 case 2:
414 break;
415 case 3:
418 break;
419 case 4:
422 break;
423 default:
424 s->predictor =
LEFT;
// OLD
426 break;
427 }
430
433 }
434
435 if (
s->version <= 2) {
436 switch (
s->bitstream_bpp) {
437 case 12:
440 break;
441 case 16:
444 else
447 break;
448 case 24:
451 else
453 break;
454 case 32:
458 break;
459 default:
461 }
465 } else {
466 switch ( (
s->chroma<<10) | (
s->yuv<<9) | (
s->alpha<<8) | ((
s->bps-1)<<4) |
s->chroma_h_shift | (
s->chroma_v_shift<<2)) {
467 case 0x070:
469 break;
470 case 0x0F0:
472 break;
473 case 0x470:
475 break;
476 case 0x480:
478 break;
479 case 0x490:
481 break;
482 case 0x4B0:
484 break;
485 case 0x4D0:
487 break;
488 case 0x4F0:
490 break;
491 case 0x570:
493 break;
494 case 0x670:
496 break;
497 case 0x680:
499 break;
500 case 0x690:
502 break;
503 case 0x6B0:
505 break;
506 case 0x6D0:
508 break;
509 case 0x6F0:
511 break;
512 case 0x671:
514 break;
515 case 0x681:
517 break;
518 case 0x691:
520 break;
521 case 0x6B1:
523 break;
524 case 0x6D1:
526 break;
527 case 0x6F1:
529 break;
530 case 0x672:
532 break;
533 case 0x674:
535 break;
536 case 0x675:
538 break;
539 case 0x685:
541 break;
542 case 0x695:
544 break;
545 case 0x6B5:
547 break;
548 case 0x6D5:
550 break;
551 case 0x6F5:
553 break;
554 case 0x67A:
556 break;
557 case 0x770:
559 break;
560 case 0x780:
562 break;
563 case 0x790:
565 break;
566 case 0x7F0:
568 break;
569 case 0x771:
571 break;
572 case 0x781:
574 break;
575 case 0x791:
577 break;
578 case 0x7F1:
580 break;
581 case 0x775:
583 break;
584 case 0x785:
586 break;
587 case 0x795:
589 break;
590 case 0x7F5:
592 break;
593 default:
595 }
596 }
597
601 }
605 "for this combination of colorspace and predictor type.\n");
607 }
608
609 for (
int i = 0;
i < 3;
i++) {
613 }
614
615 return 0;
616 }
617
618 /** Subset of GET_VLC for use in hand-roller VLC code */
619 #define VLC_INTERN(dst, table, gb, name, bits, max_depth) \
620 code = table[index].sym; \
621 n = table[index].len; \
622 if (max_depth > 1 && n < 0) { \
623 LAST_SKIP_BITS(name, gb, bits); \
624 UPDATE_CACHE(name, gb); \
625 \
626 nb_bits = -n; \
627 index = SHOW_UBITS(name, gb, nb_bits) + code; \
628 code = table[index].sym; \
629 n = table[index].len; \
630 if (max_depth > 2 && n < 0) { \
631 LAST_SKIP_BITS(name, gb, nb_bits); \
632 UPDATE_CACHE(name, gb); \
633 \
634 nb_bits = -n; \
635 index = SHOW_UBITS(name, gb, nb_bits) + code; \
636 code = table[index].sym; \
637 n = table[index].len; \
638 } \
639 } \
640 dst = code; \
641 LAST_SKIP_BITS(name, gb, n)
642
643
644 #define GET_VLC_DUAL(dst0, dst1, name, gb, dtable, table1, table2, \
645 bits, max_depth, OP) \
646 do { \
647 unsigned int index = SHOW_UBITS(name, gb, bits); \
648 int code, n = dtable[index].len; \
649 \
650 if (n<=0) { \
651 int nb_bits; \
652 VLC_INTERN(dst0, table1, gb, name, bits, max_depth); \
653 \
654 UPDATE_CACHE(re, gb); \
655 index = SHOW_UBITS(name, gb, bits); \
656 VLC_INTERN(dst1, table2, gb, name, bits, max_depth); \
657 } else { \
658 code = dtable[index].sym; \
659 OP(dst0, dst1, code); \
660 LAST_SKIP_BITS(name, gb, n); \
661 } \
662 } while (0)
663
664 #define OP8bits(dst0, dst1, code) dst0 = code>>8; dst1 = code
665
666 #define READ_2PIX(dst0, dst1, plane1) \
667 UPDATE_CACHE(re, &s->gb); \
668 GET_VLC_DUAL(dst0, dst1, re, &s->gb, s->vlc[4+plane1].table, \
669 s->vlc[0].table, s->vlc[plane1].table, VLC_BITS, 3, OP8bits)
670
672 {
675 count /= 2;
676
678 if (count >= icount) {
679 for (
i = 0;
i < icount;
i++) {
682 }
687 }
688 for (;
i < count;
i++)
689 s->temp[0][2 *
i ] =
s->temp[1][
i] =
690 s->temp[0][2 *
i + 1] =
s->temp[2][
i] = 0;
691 } else {
692 for (
i = 0;
i < count;
i++) {
695 }
696 }
698 }
699
700 #define READ_2PIX_PLANE(dst0, dst1, plane, OP) \
701 UPDATE_CACHE(re, &s->gb); \
702 GET_VLC_DUAL(dst0, dst1, re, &s->gb, s->vlc[4+plane].table, \
703 s->vlc[plane].table, s->vlc[plane].table, VLC_BITS, 3, OP)
704
705 #define OP14bits(dst0, dst1, code) dst0 = code>>8; dst1 = sign_extend(code, 8)
706
707 /* TODO instead of restarting the read when the code isn't in the first level
708 * of the joint table, jump into the 2nd level of the individual table. */
709 #define READ_2PIX_PLANE16(dst0, dst1, plane){\
710 dst0 = get_vlc2(&s->gb, s->vlc[plane].table, VLC_BITS, 3)*4;\
711 dst0 += get_bits(&s->gb, 2);\
712 dst1 = get_vlc2(&s->gb, s->vlc[plane].table, VLC_BITS, 3)*4;\
713 dst1 += get_bits(&s->gb, 2);\
714 }
716 {
718
724 }
725 } else {
726 for(
i=0;
i<count;
i++){
728 }
729 }
732 int nb_bits,
code, n;
737 }
739 }
else if (
s->bps <= 14) {
744 }
745 } else {
746 for(
i=0;
i<count;
i++){
748 }
749 }
752 int nb_bits,
code, n;
757 }
759 } else {
763 }
764 } else {
765 for(
i=0;
i<count;
i++){
767 }
768 }
772 }
773 }
774 }
775
777 {
780 count /= 2;
781
785 }
786 for (;
i < count;
i++)
787 s->temp[0][2 *
i] =
s->temp[0][2 *
i + 1] = 0;
788 } else {
789 for (
i = 0;
i < count;
i++) {
791 }
792 }
794 }
795
798 {
801
804 int code, n, nb_bits;
805
808 n =
s->vlc[4].table[
index].len;
809
810 if (n>0) {
812 *(uint32_t *) &
s->temp[0][4 *
i] =
s->pix_bgr_map[
code];
814 } else {
818
822 s->temp[0][4 *
i +
B] =
code +
s->temp[0][4 *
i +
G];
823
827 s->temp[0][4 *
i +
R] =
code +
s->temp[0][4 *
i +
G];
828 } else {
831
836
841 }
842 }
848 } else
849 s->temp[0][4 *
i +
A] = 0;
850 }
852 }
853
855 {
856 if (
s->decorrelate) {
857 if (
s->bitstream_bpp == 24)
859 else
861 } else {
862 if (
s->bitstream_bpp == 24)
864 else
866 }
867 }
868
870 {
873
875 return;
876
877 h = y -
s->last_slice_end;
879
880 if (
s->bitstream_bpp == 12)
881 cy = y >> 1;
882 else
883 cy = y;
884
891
893
894 s->last_slice_end = y +
h;
895 }
896
898 {
900 return s->llviddsp.add_left_pred(
dst,
src,
w, acc);
901 } else {
902 return s->llviddsp.add_left_pred_int16(( uint16_t *)
dst, (
const uint16_t *)
src,
s->n-1,
w, acc);
903 }
904 }
905
907 {
910 } else {
911 s->hdsp.add_int16((uint16_t*)
dst, (
const uint16_t*)
src,
s->n - 1,
w);
912 }
913 }
914
916 {
919 } else {
920 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);
921 }
922 }
923
925 int buf_size, int y_offset, int table_size)
926 {
928 int fake_ystride, fake_ustride, fake_vstride;
930 const int width2 = avctx->
width >> 1;
932
933 if ((
ret =
init_get_bits8(&
s->gb,
s->bitstream_buffer + table_size, buf_size - table_size)) < 0)
935
939
940 if (
s->version > 2) {
941 int plane;
942 for(plane = 0; plane < 1 + 2*
s->chroma +
s->alpha; plane++) {
943 int left, lefttop, y;
946 int fake_stride = fake_ystride;
947
948 if (
s->chroma && (plane == 1 || plane == 2)) {
949 w >>=
s->chroma_h_shift;
950 h >>=
s->chroma_v_shift;
951 fake_stride = plane == 1 ? fake_ustride : fake_vstride;
952 }
953
954 switch (
s->predictor) {
959
960 for (y = 1; y <
h; y++) {
962
965 if (
s->predictor ==
PLANE) {
966 if (y >
s->interlaced) {
968 }
969 }
970 }
971
972 break;
976
977 y = 1;
979 break;
980
981 /* second line is left predicted for interlaced case */
985 y++;
987 break;
988 }
989
990 lefttop = p->
data[plane][0];
993 y++;
994
997
999
1001
1003 }
1004
1005 break;
1006 }
1007 }
1009 }
else if (
s->bitstream_bpp < 24) {
1010 int y, cy;
1011 int lefty, leftu, leftv;
1012 int lefttopy, lefttopu, lefttopv;
1013
1019
1021 "YUY2 output is not implemented yet\n");
1023 } else {
1024 leftv =
1026 lefty =
1028 leftu =
1031
1032 switch (
s->predictor) {
1036 lefty =
s->llviddsp.add_left_pred(p->
data[0] + p->
linesize[0] * y_offset + 2,
s->temp[0],
1039 leftu =
s->llviddsp.add_left_pred(p->
data[1] + p->
linesize[1] * y_offset + 1,
s->temp[1], width2 - 1, leftu);
1040 leftv =
s->llviddsp.add_left_pred(p->
data[2] + p->
linesize[2] * y_offset + 1,
s->temp[2], width2 - 1, leftv);
1041 }
1042
1043 for (cy = y = 1; y <
height; y++, cy++) {
1044 uint8_t *ydst, *udst, *vdst;
1045
1046 if (
s->bitstream_bpp == 12) {
1048
1050
1051 lefty =
s->llviddsp.add_left_pred(ydst,
s->temp[0],
1053 if (
s->predictor ==
PLANE) {
1054 if (y >
s->interlaced)
1055 s->llviddsp.add_bytes(ydst, ydst - fake_ystride,
width);
1056 }
1057 y++;
1059 break;
1060 }
1061
1063
1067
1069 lefty =
s->llviddsp.add_left_pred(ydst,
s->temp[0],
1072 leftu =
s->llviddsp.add_left_pred(udst,
s->temp[1], width2, leftu);
1073 leftv =
s->llviddsp.add_left_pred(vdst,
s->temp[2], width2, leftv);
1074 }
1075 if (
s->predictor ==
PLANE) {
1076 if (cy >
s->interlaced) {
1077 s->llviddsp.add_bytes(ydst, ydst - fake_ystride,
width);
1079 s->llviddsp.add_bytes(udst, udst - fake_ustride, width2);
1080 s->llviddsp.add_bytes(vdst, vdst - fake_vstride, width2);
1081 }
1082 }
1083 }
1084 }
1086
1087 break;
1089 /* first line except first 2 pixels is left predicted */
1091 lefty =
s->llviddsp.add_left_pred(p->
data[0] + 2,
s->temp[0],
1094 leftu =
s->llviddsp.add_left_pred(p->
data[1] + 1,
s->temp[1], width2 - 1, leftu);
1095 leftv =
s->llviddsp.add_left_pred(p->
data[2] + 1,
s->temp[2], width2 - 1, leftv);
1096 }
1097
1098 cy = y = 1;
1100 break;
1101
1102 /* second line is left predicted for interlaced case */
1103 if (
s->interlaced) {
1105 lefty =
s->llviddsp.add_left_pred(p->
data[0] + p->
linesize[0],
1106 s->temp[0],
width, lefty);
1108 leftu =
s->llviddsp.add_left_pred(p->
data[1] + p->
linesize[2],
s->temp[1], width2, leftu);
1109 leftv =
s->llviddsp.add_left_pred(p->
data[2] + p->
linesize[1],
s->temp[2], width2, leftv);
1110 }
1111 y++;
1112 cy++;
1114 break;
1115 }
1116
1117 /* next 4 pixels are left predicted too */
1119 lefty =
s->llviddsp.add_left_pred(p->
data[0] + fake_ystride,
1120 s->temp[0], 4, lefty);
1122 leftu =
s->llviddsp.add_left_pred(p->
data[1] + fake_ustride,
s->temp[1], 2, leftu);
1123 leftv =
s->llviddsp.add_left_pred(p->
data[2] + fake_vstride,
s->temp[2], 2, leftv);
1124 }
1125
1126 /* next line except the first 4 pixels is median predicted */
1127 lefttopy = p->
data[0][3];
1129 s->llviddsp.add_median_pred(p->
data[0] + fake_ystride + 4,
1130 p->
data[0] + 4,
s->temp[0],
1131 width - 4, &lefty, &lefttopy);
1133 lefttopu = p->
data[1][1];
1134 lefttopv = p->
data[2][1];
1135 s->llviddsp.add_median_pred(p->
data[1] + fake_ustride + 2, p->
data[1] + 2,
s->temp[1], width2 - 2, &leftu, &lefttopu);
1136 s->llviddsp.add_median_pred(p->
data[2] + fake_vstride + 2, p->
data[2] + 2,
s->temp[2], width2 - 2, &leftv, &lefttopv);
1137 }
1138 y++;
1139 cy++;
1140
1141 for (; y <
height; y++, cy++) {
1142 uint8_t *ydst, *udst, *vdst;
1143
1144 if (
s->bitstream_bpp == 12) {
1145 while (2 * cy > y) {
1148 s->llviddsp.add_median_pred(ydst, ydst - fake_ystride,
1150 &lefty, &lefttopy);
1151 y++;
1152 }
1154 break;
1155 }
1157
1159
1163
1164 s->llviddsp.add_median_pred(ydst, ydst - fake_ystride,
1166 &lefty, &lefttopy);
1168 s->llviddsp.add_median_pred(udst, udst - fake_ustride,
s->temp[1], width2, &leftu, &lefttopu);
1169 s->llviddsp.add_median_pred(vdst, vdst - fake_vstride,
s->temp[2], width2, &leftv, &lefttopv);
1170 }
1171 }
1172
1174 break;
1175 }
1176 }
1177 } else {
1178 int y;
1181
1182 if (
s->bitstream_bpp == 32) {
1187 } else {
1193 }
1194
1196 switch (
s->predictor) {
1200 s->hdsp.add_hfyu_left_pred_bgr32(p->
data[0] + last_line + 4,
1202
1203 for (y =
height - 2; y >= 0; y--) {
// Yes it is stored upside down.
1205
1206 s->hdsp.add_hfyu_left_pred_bgr32(p->
data[0] + p->
linesize[0] * (y + y_offset),
1208 if (
s->predictor ==
PLANE) {
1209 if (
s->bitstream_bpp != 32)
1212 s->llviddsp.add_bytes(p->
data[0] + p->
linesize[0] * (y + y_offset),
1214 fake_ystride, 4 *
width);
1215 }
1216 }
1217 }
1218 // just 1 large slice as this is not possible in reverse order
1220 break;
1221 default:
1223 "prediction type not supported!\n");
1224 }
1225 } else {
1227 "BGR24 output is not implemented yet\n");
1229 }
1230 }
1231
1232 return 0;
1233 }
1234
1237 {
1238 const uint8_t *buf = avpkt->
data;
1239 int buf_size = avpkt->
size;
1243 int slice, table_size = 0,
ret, nb_slices;
1244 unsigned slices_info_offset;
1245 int slice_height;
1246
1249
1251 &
s->bitstream_buffer_size,
1252 buf_size);
1253 if (!
s->bitstream_buffer)
1255
1256 s->bdsp.bswap_buf((uint32_t *)
s->bitstream_buffer,
1257 (const uint32_t *) buf, buf_size / 4);
1258
1261
1264 if (table_size < 0)
1265 return table_size;
1266 }
1267
1268 if ((unsigned) (buf_size - table_size) >= INT_MAX / 8)
1270
1271 s->last_slice_end = 0;
1272
1274 (buf_size > 32 &&
AV_RL32(avpkt->
data + buf_size - 16) == 0)) {
1275 slices_info_offset =
AV_RL32(avpkt->
data + buf_size - 4);
1276 slice_height =
AV_RL32(avpkt->
data + buf_size - 8);
1278 if (nb_slices * 8LL + slices_info_offset > buf_size - 16 ||
1279 s->chroma_v_shift ||
1280 slice_height <= 0 || nb_slices * (uint64_t)slice_height >
height)
1282 } else {
1284 nb_slices = 1;
1285 }
1286
1287 for (slice = 0; slice < nb_slices; slice++) {
1288 int y_offset, slice_offset, slice_size;
1289
1290 if (nb_slices > 1) {
1291 slice_offset =
AV_RL32(avpkt->
data + slices_info_offset + slice * 8);
1292 slice_size =
AV_RL32(avpkt->
data + slices_info_offset + slice * 8 + 4);
1293
1294 if (slice_offset < 0 || slice_size <= 0 || (slice_offset&3) ||
1295 slice_offset + (
int64_t)slice_size > buf_size)
1297
1298 y_offset =
height - (slice + 1) * slice_height;
1299 s->bdsp.bswap_buf((uint32_t *)
s->bitstream_buffer,
1300 (const uint32_t *)(buf + slice_offset), slice_size / 4);
1301 } else {
1302 y_offset = 0;
1303 slice_offset = 0;
1304 slice_size = buf_size;
1305 }
1306
1307 ret =
decode_slice(avctx, p, slice_height, slice_size, y_offset, table_size);
1311 }
1312
1313 *got_frame = 1;
1314
1316 }
1317
1319 .
p.
name =
"huffyuv",
1330 };
1331
1332 #if CONFIG_FFVHUFF_DECODER
1334 .
p.
name =
"ffvhuff",
1345 };
1346 #endif /* CONFIG_FFVHUFF_DECODER */
1347
1348 #if CONFIG_HYMT_DECODER
1361 };
1362 #endif /* CONFIG_HYMT_DECODER */