1 /*
2 * Resolume DXV decoder
3 * Copyright (C) 2015 Vittorio Giovara <vittorio.giovara@gmail.com>
4 * Copyright (C) 2018 Paul B Mahol
5 *
6 * This file is part of FFmpeg.
7 *
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22
23 #include <stdint.h>
24
26
34
38
46
47 /* Optimal number of slices for parallel decoding */
49
52
55
58
59 /* Pointer to the selected decompression function */
62 uint8_t *plane1, ptrdiff_t stride1,
63 const uint8_t *
block);
65
67 {
69
72
73 /* Unpack 8x3 bit from last 3 byte block */
74 for (
i = 0;
i < 8;
i++)
75 dst[
i] = (
tmp >> (
i * 3)) & 0x7;
76
78 dst += 8;
79 }
80 }
81
83 {
84 int yo;
85
86 if (yo0 == yo1) {
87 yo = yo0;
88 }
else if (
code == 0) {
89 yo = yo0;
90 }
else if (
code == 1) {
91 yo = yo1;
92 } else {
93 if (yo0 > yo1) {
94 yo = (uint8_t) (((8 -
code) * yo0 +
95 (
code - 1) * yo1) / 7);
96 } else {
98 yo = 0;
99 }
else if (
code == 7) {
100 yo = 255;
101 } else {
102 yo = (uint8_t) (((6 -
code) * yo0 +
103 (
code - 1) * yo1) / 5);
104 }
105 }
106 }
107
108 return yo;
109 }
110
112 uint8_t *plane1, ptrdiff_t stride1,
113 const uint8_t *
block)
114 {
115 uint8_t co_indices[16];
116 uint8_t cg_indices[16];
117 uint8_t co0 = *(
block);
118 uint8_t co1 = *(
block + 1);
119 uint8_t cg0 = *(
block + 8);
120 uint8_t cg1 = *(
block + 9);
121 int x, y;
122
125
126 for (y = 0; y < 4; y++) {
127 for (x = 0; x < 4; x++) {
128 int co_code = co_indices[x + y * 4];
129 int cg_code = cg_indices[x + y * 4];
130
133 }
134 plane0 += stride0;
135 plane1 += stride1;
136 }
137
138 return 16;
139 }
140
143 {
144 uint8_t yo0 = *(
block);
145 uint8_t yo1 = *(
block + 1);
146 int x, y;
147
149
150 for (y = 0; y < 4; y++) {
151 for (x = 0; x < 4; x++) {
152 int yo_code = yo_indices[x + y * 4];
153
155 }
157 }
158 }
159
161 uint8_t *unused0, ptrdiff_t unused1,
162 const uint8_t *
block)
163 {
164 uint8_t yo_indices[16];
165
170
171 return 32;
172 }
173
174 static int yao_block(uint8_t *plane0, ptrdiff_t stride0,
175 uint8_t *plane3, ptrdiff_t stride1,
176 const uint8_t *
block)
177 {
178 uint8_t yo_indices[16];
179 uint8_t a_indices[16];
180
189
190 return 64;
191 }
192
194 int slice, int thread_nb)
195 {
198 const uint8_t *
d =
ctx->tex_data;
201 int x, y;
202 int start_slice, end_slice;
203
204 start_slice = h_block * slice /
ctx->slice_count;
205 end_slice = h_block * (slice + 1) /
ctx->slice_count;
206
207 if (
ctx->tex_funct) {
208 for (y = start_slice; y < end_slice; y++) {
209 uint8_t *p =
frame->data[0] + y *
frame->linesize[0] *
ctx->texture_block_h;
210 int off = y * w_block;
211 for (x = 0; x < w_block; x++) {
212 ctx->tex_funct(p + x * 4 *
ctx->texture_block_w,
frame->linesize[0],
213 d + (off + x) *
ctx->tex_step);
214 }
215 }
216 } else {
217 const uint8_t *
c =
ctx->ctex_data;
218
219 for (y = start_slice; y < end_slice; y++) {
220 uint8_t *p0 =
frame->data[0] + y *
frame->linesize[0] *
ctx->texture_block_h;
221 uint8_t *p3 =
ctx->tex_step != 64 ?
NULL :
frame->data[3] + y *
frame->linesize[3] *
ctx->texture_block_h;
222 int off = y * w_block;
223 for (x = 0; x < w_block; x++) {
224 ctx->tex_funct_planar[0](p0 + x *
ctx->texture_block_w,
frame->linesize[0],
226 d + (off + x) *
ctx->tex_step);
227 }
228 }
229
232 start_slice = h_block * slice /
ctx->slice_count;
233 end_slice = h_block * (slice + 1) /
ctx->slice_count;
234
235 for (y = start_slice; y < end_slice; y++) {
236 uint8_t *p0 =
frame->data[1] + y *
frame->linesize[1] *
ctx->ctexture_block_h;
237 uint8_t *p1 =
frame->data[2] + y *
frame->linesize[2] *
ctx->ctexture_block_h;
238 int off = y * w_block;
239 for (x = 0; x < w_block; x++) {
240 ctx->tex_funct_planar[1](p0 + x *
ctx->ctexture_block_w,
frame->linesize[1],
241 p1 + x *
ctx->ctexture_block_w,
frame->linesize[2],
242 c + (off + x) *
ctx->ctex_step);
243 }
244 }
245 }
246
247 return 0;
248 }
249
250 /* This scheme addresses already decoded elements depending on 2-bit status:
251 * 0 -> copy new element
252 * 1 -> copy one element from position -x
253 * 2 -> copy one element from position -(get_byte() + 2) * x
254 * 3 -> copy one element from position -(get_16le() + 0x102) * x
255 * x is always 2 for dxt1 and 4 for dxt5. */
256 #define CHECKPOINT(x) \
257 do { \
258 if (state == 0) { \
259 if (bytestream2_get_bytes_left(gbc) < 4) \
260 return AVERROR_INVALIDDATA; \
261 value = bytestream2_get_le32(gbc); \
262 state = 16; \
263 } \
264 op = value & 0x3; \
265 value >>= 2; \
266 state--; \
267 switch (op) { \
268 case 1: \
269 idx = x; \
270 break; \
271 case 2: \
272 idx = (bytestream2_get_byte(gbc) + 2) * x; \
273 if (idx > pos) { \
274 av_log(avctx, AV_LOG_ERROR, "idx %d > %d\n", idx, pos); \
275 return AVERROR_INVALIDDATA; \
276 } \
277 break; \
278 case 3: \
279 idx = (bytestream2_get_le16(gbc) + 0x102) * x; \
280 if (idx > pos) { \
281 av_log(avctx, AV_LOG_ERROR, "idx %d > %d\n", idx, pos); \
282 return AVERROR_INVALIDDATA; \
283 } \
284 break; \
285 } \
286 } while(0)
287
289 {
293 int idx = 0,
state = 0;
295
296 /* Copy the first two elements */
297 AV_WL32(
ctx->tex_data, bytestream2_get_le32(gbc));
298 AV_WL32(
ctx->tex_data + 4, bytestream2_get_le32(gbc));
299
300 /* Process input until the whole texture has been filled */
301 while (
pos + 2 <=
ctx->tex_size / 4) {
303
304 /* Copy two elements from a previous offset or from the input buffer */
309
313 } else {
315
318 else
319 prev = bytestream2_get_le32(gbc);
322
324
327 else
328 prev = bytestream2_get_le32(gbc);
331 }
332 }
333
334 return 0;
335 }
336
342
344 {
346 int value, counter = 0, rshift = 10, lshift = 30;
347
348 mask = bytestream2_get_le32(gb) >> 2;
350 if (counter >= 256)
355 lshift -= rshift;
357 if (lshift < 16) {
360
361 input = bytestream2_get_le16(gb);
363 lshift += 16;
364 }
368 rshift--;
369 }
370 }
371
372 for (; !
table[counter - 1]; counter--)
373 if (counter <= 0)
375
376 *nb_elements = counter;
377
378 if (counter < 256)
379 memset(&
table[counter], 0, 4 * (256 - counter));
380
381 if (lshift >= 16)
383
384 return 0;
385 }
386
388 {
389 unsigned table2[256] = { 0 };
390 unsigned x = 0;
391 int val0, val1,
i, j = 2, k = 0;
392
393 table2[0] = table0[0];
394 for (
i = 0;
i < nb_elements - 1;
i++, table2[
i] = val0) {
395 val0 = table0[
i + 1] + table2[
i];
396 }
397
398 if (!table2[0]) {
399 do {
400 k++;
401 } while (!table2[k]);
402 }
403
404 j = 2;
405 for (
i = 1024;
i > 0;
i--) {
406 for (table1[x].val1 = k; k < 256 && j > table2[k]; k++);
407 x = (x - 383) & 0x3FF;
408 j++;
409 }
410
411 if (nb_elements > 0)
412 memcpy(&table2[0], table0, 4 * nb_elements);
413
414 for (
i = 0;
i < 1024;
i++) {
415 val0 = table1[
i].
val1;
416 val1 = table2[val0];
417 table2[val0]++;
419 if (x > 10)
421 table1[
i].
val2 = 10 - x;
422 table1[
i].
next = (val1 << table1[
i].
val2) - 1024;
423 }
424
425 return 0;
426 }
427
429 {
431 int sum, x,
val, lshift, rshift,
ret,
i, idx;
432 int64_t size_in_bits;
433 unsigned endoffset, newoffset,
offset;
434 unsigned next;
436
440
441 size_in_bits = bytestream2_get_le32(gb);
442 endoffset = ((size_in_bits + 7) >> 3) - 4;
445
448 rshift = (((size_in_bits & 0xFF) - 1) & 7) + 15;
449 lshift = 32 - rshift;
450 idx = (next >> rshift) & 0x3FF;
451 for (
i = 0;
i < op_size;
i++) {
452 dst[
i] = optable[idx].
val1;
455 x = (next << lshift) >> 1 >> (31 -
val);
456 newoffset =
offset - (sum >> 3);
457 lshift = sum & 7;
458 idx = x + optable[idx].
next;
463 }
464
466
467 return 0;
468 }
469
471 {
473 int flag = bytestream2_peek_byte(gb);
474
475 if ((
flag & 3) == 0) {
478 }
else if ((
flag & 3) == 1) {
480 memset(dstp, bytestream2_get_byte(gb), op_size);
481 } else {
484
491 }
493 }
494
496 uint8_t *tex_data, int tex_size,
497 uint8_t *op_data, int *oindex,
498 int op_size,
499 uint8_t **dstp, int *statep,
500 uint8_t **tab0, uint8_t **
tab1,
502 {
503 uint8_t *dst = *dstp;
504 uint8_t *tptr0, *tptr1, *tptr3;
505 int oi = *oindex;
507 int opcode, v, vv;
508
510 if (oi >= op_size)
512 opcode = op_data[oi++];
513 if (!opcode) {
514 v = bytestream2_get_byte(gb);
515 if (v == 255) {
516 do {
519 opcode = bytestream2_get_le16(gb);
520 v += opcode;
521 } while (opcode == 0xFFFF);
522 }
526 goto done;
527 }
528
529 switch (opcode) {
530 case 1:
533 break;
534 case 2:
535 vv = (8 +
offset) * (bytestream2_get_le16(gb) + 1);
536 if (vv < 0 || vv > dst - tex_data)
538 tptr0 = dst - vv;
542 tab0[0x9E3779B1 * (uint16_t)v >> 24] = dst;
543 tab1[0x9E3779B1 * (
AV_RL32(dst + 2) & 0xFFFFFF
u) >> 24] = dst + 2;
544 break;
545 case 3:
546 AV_WL32(dst, bytestream2_get_le32(gb));
547 AV_WL32(dst + 4, bytestream2_get_le32(gb));
548 tab0[0x9E3779B1 *
AV_RL16(dst) >> 24] = dst;
549 tab1[0x9E3779B1 * (
AV_RL32(dst + 2) & 0xFFFFFF
u) >> 24] = dst + 2;
550 break;
551 case 4:
552 tptr3 =
tab1[bytestream2_get_byte(gb)];
553 if (!tptr3)
555 AV_WL16(dst, bytestream2_get_le16(gb));
557 dst[4] = tptr3[2];
558 AV_WL16(dst + 5, bytestream2_get_le16(gb));
559 dst[7] = bytestream2_get_byte(gb);
560 tab0[0x9E3779B1 *
AV_RL16(dst) >> 24] = dst;
561 break;
562 case 5:
563 tptr3 =
tab1[bytestream2_get_byte(gb)];
564 if (!tptr3)
566 AV_WL16(dst, bytestream2_get_le16(gb));
567 AV_WL16(dst + 2, bytestream2_get_le16(gb));
568 dst[4] = bytestream2_get_byte(gb);
570 dst[7] = tptr3[2];
571 tab0[0x9E3779B1 *
AV_RL16(dst) >> 24] = dst;
572 tab1[0x9E3779B1 * (
AV_RL32(dst + 2) & 0xFFFFFF
u) >> 24] = dst + 2;
573 break;
574 case 6:
575 tptr0 =
tab1[bytestream2_get_byte(gb)];
576 if (!tptr0)
578 tptr1 =
tab1[bytestream2_get_byte(gb)];
579 if (!tptr1)
581 AV_WL16(dst, bytestream2_get_le16(gb));
583 dst[4] = tptr0[2];
585 dst[7] = tptr1[2];
586 tab0[0x9E3779B1 *
AV_RL16(dst) >> 24] = dst;
587 break;
588 case 7:
589 v = (8 +
offset) * (bytestream2_get_le16(gb) + 1);
590 if (v < 0 || v > dst - tex_data)
592 tptr0 = dst - v;
593 AV_WL16(dst, bytestream2_get_le16(gb));
596 tab0[0x9E3779B1 *
AV_RL16(dst) >> 24] = dst;
597 tab1[0x9E3779B1 * (
AV_RL32(dst + 2) & 0xFFFFFF
u) >> 24] = dst + 2;
598 break;
599 case 8:
600 tptr1 = tab0[bytestream2_get_byte(gb)];
601 if (!tptr1)
604 AV_WL16(dst + 2, bytestream2_get_le16(gb));
605 AV_WL32(dst + 4, bytestream2_get_le32(gb));
606 tab1[0x9E3779B1 * (
AV_RL32(dst + 2) & 0xFFFFFF
u) >> 24] = dst + 2;
607 break;
608 case 9:
609 tptr1 = tab0[bytestream2_get_byte(gb)];
610 if (!tptr1)
612 tptr3 =
tab1[bytestream2_get_byte(gb)];
613 if (!tptr3)
617 dst[4] = tptr3[2];
618 AV_WL16(dst + 5, bytestream2_get_le16(gb));
619 dst[7] = bytestream2_get_byte(gb);
620 tab1[0x9E3779B1 * (
AV_RL32(dst + 2) & 0xFFFFFF
u) >> 24] = dst + 2;
621 break;
622 case 10:
623 tptr1 = tab0[bytestream2_get_byte(gb)];
624 if (!tptr1)
626 tptr3 =
tab1[bytestream2_get_byte(gb)];
627 if (!tptr3)
630 AV_WL16(dst + 2, bytestream2_get_le16(gb));
631 dst[4] = bytestream2_get_byte(gb);
633 dst[7] = tptr3[2];
634 tab1[0x9E3779B1 * (
AV_RL32(dst + 2) & 0xFFFFFF
u) >> 24] = dst + 2;
635 break;
636 case 11:
637 tptr0 = tab0[bytestream2_get_byte(gb)];
638 if (!tptr0)
640 tptr3 =
tab1[bytestream2_get_byte(gb)];
641 if (!tptr3)
643 tptr1 =
tab1[bytestream2_get_byte(gb)];
644 if (!tptr1)
648 dst[4] = tptr3[2];
650 dst[7] = tptr1[2];
651 break;
652 case 12:
653 tptr1 = tab0[bytestream2_get_byte(gb)];
654 if (!tptr1)
656 v = (8 +
offset) * (bytestream2_get_le16(gb) + 1);
657 if (v < 0 || v > dst - tex_data)
659 tptr0 = dst - v;
663 tab1[0x9E3779B1 * (
AV_RL32(dst + 2) & 0xFFFFFF
u) >> 24] = dst + 2;
664 break;
665 case 13:
667 AV_WL16(dst + 2, bytestream2_get_le16(gb));
668 AV_WL32(dst + 4, bytestream2_get_le32(gb));
669 tab1[0x9E3779B1 * (
AV_RL32(dst + 2) & 0xFFFFFF
u) >> 24] = dst + 2;
670 break;
671 case 14:
672 tptr3 =
tab1[bytestream2_get_byte(gb)];
673 if (!tptr3)
677 dst[4] = tptr3[2];
678 AV_WL16(dst + 5, bytestream2_get_le16(gb));
679 dst[7] = bytestream2_get_byte(gb);
680 tab1[0x9E3779B1 * (
AV_RL32(dst + 2) & 0xFFFFFF
u) >> 24] = dst + 2;
681 break;
682 case 15:
683 tptr3 =
tab1[bytestream2_get_byte(gb)];
684 if (!tptr3)
687 AV_WL16(dst + 2, bytestream2_get_le16(gb));
688 dst[4] = bytestream2_get_byte(gb);
690 dst[7] = tptr3[2];
691 tab1[0x9E3779B1 * (
AV_RL32(dst + 2) & 0xFFFFFF
u) >> 24] = dst + 2;
692 break;
693 case 16:
694 tptr3 =
tab1[bytestream2_get_byte(gb)];
695 if (!tptr3)
697 tptr1 =
tab1[bytestream2_get_byte(gb)];
698 if (!tptr1)
702 dst[4] = tptr3[2];
704 dst[7] = tptr1[2];
705 break;
706 case 17:
707 v = (8 +
offset) * (bytestream2_get_le16(gb) + 1);
708 if (v < 0 || v > dst - tex_data)
713 tab1[0x9E3779B1 * (
AV_RL32(dst + 2) & 0xFFFFFF
u) >> 24] = dst + 2;
714 break;
715 default:
716 break;
717 }
718 } else {
719 done:
723 }
724 if (dst - tex_data + 8 > tex_size)
726 dst += 8;
727
728 *oindex = oi;
729 *dstp = dst;
731
732 return 0;
733 }
734
736 uint8_t *tex_data, int tex_size,
737 uint8_t *op_data0, uint8_t *op_data1,
738 int max_op_size0, int max_op_size1)
739 {
740 uint8_t *dst, *
tab2[256] = { 0 }, *tab0[256] = { 0 }, *tab3[256] = { 0 }, *
tab1[256] = { 0 };
741 int op_offset = bytestream2_get_le32(gb);
742 unsigned op_size0 = bytestream2_get_le32(gb);
743 unsigned op_size1 = bytestream2_get_le32(gb);
745 int skip0, skip1, oi0 = 0, oi1 = 0;
746 int ret, state0 = 0, state1 = 0;
747
750
751 dst = tex_data;
753 if (op_size0 > max_op_size0)
756 if (skip0 < 0)
757 return skip0;
758 if (op_size1 > max_op_size1)
761 if (skip1 < 0)
762 return skip1;
764
765 AV_WL32(dst, bytestream2_get_le32(gb));
766 AV_WL32(dst + 4, bytestream2_get_le32(gb));
767 AV_WL32(dst + 8, bytestream2_get_le32(gb));
768 AV_WL32(dst + 12, bytestream2_get_le32(gb));
769
770 tab0[0x9E3779B1 *
AV_RL16(dst) >> 24] = dst;
771 tab1[0x9E3779B1 * (
AV_RL32(dst + 2) & 0xFFFFFF) >> 24] = dst + 2;
772 tab2[0x9E3779B1 *
AV_RL16(dst + 8) >> 24] = dst + 8;
773 tab3[0x9E3779B1 * (
AV_RL32(dst + 10) & 0xFFFFFF) >> 24] = dst + 10;
774 dst += 16;
775 while (dst + 10 < tex_data + tex_size) {
777 &dst, &state0, tab0,
tab1, 8);
781 &dst, &state1,
tab2, tab3, 8);
784 }
785
786 bytestream2_seek(gb, data_start - 12 + op_offset + skip0 + skip1, SEEK_SET);
787
788 return 0;
789 }
790
792 uint8_t *tex_data, int tex_size,
793 uint8_t *op_data, int max_op_size)
794 {
795 int op_offset = bytestream2_get_le32(gb);
796 unsigned op_size = bytestream2_get_le32(gb);
798 uint8_t *dst, *table0[256] = { 0 }, *table1[256] = { 0 };
799 int ret,
state = 0, skip, oi = 0, v, vv;
800
803
804 dst = tex_data;
806 if (op_size > max_op_size)
809 if (skip < 0)
810 return skip;
812
813 v = bytestream2_get_le32(gb);
815 vv = bytestream2_get_le32(gb);
816 table0[0x9E3779B1 * (uint16_t)v >> 24] = dst;
818 table1[0x9E3779B1 * (
AV_RL32(dst + 2) & 0xFFFFFF) >> 24] = dst + 2;
819 dst += 8;
820
821 while (dst < tex_data + tex_size) {
823 &dst, &
state, table0, table1, 0);
826 }
827
829
830 return 0;
831 }
832
834 {
838
840 ctx->op_data[0],
ctx->op_size[0]);
843
845 ctx->op_data[1],
ctx->op_data[2],
846 ctx->op_size[1],
ctx->op_size[2]);
847 }
848
850 {
854
856 ctx->op_data[0],
ctx->op_data[3],
857 ctx->op_size[0],
ctx->op_size[3]);
860
862 ctx->op_data[1],
ctx->op_data[2],
863 ctx->op_size[1],
ctx->op_size[2]);
864 }
865
867 {
875
876 /* Copy the first four elements */
877 AV_WL32(
ctx->tex_data + 0, bytestream2_get_le32(gbc));
878 AV_WL32(
ctx->tex_data + 4, bytestream2_get_le32(gbc));
879 AV_WL32(
ctx->tex_data + 8, bytestream2_get_le32(gbc));
880 AV_WL32(
ctx->tex_data + 12, bytestream2_get_le32(gbc));
881
882 /* Process input until the whole texture has been filled */
883 while (
pos + 2 <=
ctx->tex_size / 4) {
886
893 } else {
897 value = bytestream2_get_le32(gbc);
899 }
903
905 case 0:
906 /* Long copy */
907 check = bytestream2_get_byte(gbc) + 1;
909 do {
910 probe = bytestream2_get_le16(gbc);
912 }
while (
probe == 0xFFFF);
913 }
918
922
926
930
932 }
933
934 /* Restart (or exit) the loop */
935 continue;
936 break;
937 case 1:
938 /* Load new run value */
939 run = bytestream2_get_byte(gbc);
941 do {
942 probe = bytestream2_get_le16(gbc);
944 }
while (
probe == 0xFFFF);
945 }
946
947 /* Copy two dwords from previous data */
951
955 break;
956 case 2:
957 /* Copy two dwords from a previous index */
958 idx = 8 + bytestream2_get_le16(gbc);
959 if (idx >
pos || (
unsigned int)(
pos - idx) + 2 >
ctx->tex_size / 4)
964
968 break;
969 case 3:
970 /* Copy two dwords from input */
971 prev = bytestream2_get_le32(gbc);
974
975 prev = bytestream2_get_le32(gbc);
978 break;
979 }
980 }
981
983 if (
pos + 2 >
ctx->tex_size / 4)
985
986 /* Copy two elements from a previous offset or from the input buffer */
988 if (idx >
pos || (
unsigned int)(
pos - idx) + 2 >
ctx->tex_size / 4)
993
997 } else {
999
1000 if (
op && (idx >
pos || (
unsigned int)(
pos - idx) + 2 >
ctx->tex_size / 4))
1004 else
1005 prev = bytestream2_get_le32(gbc);
1008
1010
1013 else
1014 prev = bytestream2_get_le32(gbc);
1017 }
1018 }
1019
1020 return 0;
1021 }
1022
1024 {
1027 }
1028
1030 {
1033
1036
1038 return 0;
1039 }
1040
1043 {
1048 const char *msgcomp, *msgtext;
1050 int version_major, version_minor = 0;
1051 int size = 0, old_type = 0;
1053
1055
1056 ctx->texture_block_h = 4;
1057 ctx->texture_block_w = 4;
1058
1061
1063 ctx->tex_funct_planar[0] =
NULL;
1064 ctx->tex_funct_planar[1] =
NULL;
1065
1066 tag = bytestream2_get_le32(gbc);
1068 case MKBETAG(
'D',
'X',
'T',
'1'):
1070 ctx->tex_funct =
ctx->texdsp.dxt1_block;
1073 msgcomp = "DXTR1";
1074 msgtext = "DXT1";
1075 break;
1076 case MKBETAG(
'D',
'X',
'T',
'5'):
1078 ctx->tex_funct =
ctx->texdsp.dxt5_block;
1081 msgcomp = "DXTR5";
1082 msgtext = "DXT5";
1083 break;
1084 case MKBETAG(
'Y',
'C',
'G',
'6'):
1090 ctx->ctex_step = 16;
1091 msgcomp = "YOCOCG6";
1092 msgtext = "YCG6";
1094 ctx->texture_block_h = 4;
1095 ctx->texture_block_w = 16;
1096 ctx->ctexture_block_h = 4;
1097 ctx->ctexture_block_w = 4;
1100 break;
1101 case MKBETAG(
'Y',
'G',
'1',
'0'):
1107 ctx->ctex_step = 16;
1108 msgcomp = "YAOCOCG10";
1109 msgtext = "YG10";
1111 ctx->texture_block_h = 4;
1112 ctx->texture_block_w = 16;
1113 ctx->ctexture_block_h = 4;
1114 ctx->ctexture_block_w = 4;
1117 break;
1118 default:
1119 /* Old version does not have a real header, just size and type. */
1121 old_type =
tag >> 24;
1122 version_major = (old_type & 0x0F) - 1;
1123
1124 if (old_type & 0x80) {
1125 msgcomp = "RAW";
1127 } else {
1128 msgcomp = "LZF";
1130 }
1131
1132 if (old_type & 0x40) {
1133 msgtext = "DXT5";
1134
1135 ctx->tex_funct =
ctx->texdsp.dxt5_block;
1137 } else if (old_type & 0x20 || version_major == 1) {
1138 msgtext = "DXT1";
1139
1140 ctx->tex_funct =
ctx->texdsp.dxt1_block;
1142 } else {
1145 }
1147 break;
1148 }
1149
1152 ctx->ctexture_block_h));
1153
1154 /* New header is 12 bytes long. */
1155 if (!old_type) {
1156 version_major = bytestream2_get_byte(gbc) - 1;
1157 version_minor = bytestream2_get_byte(gbc);
1158
1159 /* Encoder copies texture data when compression is not advantageous. */
1160 if (bytestream2_get_byte(gbc)) {
1161 msgcomp = "RAW";
1164 }
1165
1167 size = bytestream2_get_le32(gbc);
1168 }
1170 "%s compression with %s texture (version %d.%d)\n",
1171 msgcomp, msgtext, version_major, version_minor);
1172
1175 "Incomplete or invalid file (header %d, left %u).\n",
1178 }
1179
1184
1185 if (
ctx->ctex_size) {
1187
1192
1196 for (
i = 0;
i < 4;
i++) {
1200 }
1201 }
1202
1203 /* Decompress texture out of the intermediate compression. */
1204 ret = decompress_tex(avctx);
1207 {
1210 if (w_block * h_block *
ctx->tex_step >
ctx->tex_size * 8LL)
1212 }
1213
1218
1219 /* Now decompress the texture with the standard functions. */
1222
1223 /* Frame is ready to be output. */
1226 *got_frame = 1;
1227
1229 }
1230
1232 {
1235
1240 }
1241
1242 /* Codec requires 16x16 alignment. */
1245
1247
1248 return 0;
1249 }
1250
1252 {
1254
1261
1262 return 0;
1263 }
1264
1279 };