1 /*
2 * Smacker decoder
3 * Copyright (c) 2006 Konstantin Shishkov
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22 /**
23 * @file
24 * Smacker decoder
25 */
26
27 /*
28 * Based on http://wiki.multimedia.cx/index.php?title=Smacker
29 */
30
31 #include <stdio.h>
32 #include <stdlib.h>
33
38
39 #define BITSTREAM_READER_LE
42
43 #define SMKTREE_BITS 9
44 #define SMK_NODE 0x80000000
45
46 /*
47 * Decoder context
48 */
52
56
57 /**
58 * Context used for code reconstructing
59 */
68
69 /* common parameters used for decode_bigtree */
77
78 /* possible runs of blocks */
80 1, 2, 3, 4, 5, 6, 7, 8,
81 9, 10, 11, 12, 13, 14, 15, 16,
82 17, 18, 19, 20, 21, 22, 23, 24,
83 25, 26, 27, 28, 29, 30, 31, 32,
84 33, 34, 35, 36, 37, 38, 39, 40,
85 41, 42, 43, 44, 45, 46, 47, 48,
86 49, 50, 51, 52, 53, 54, 55, 56,
87 57, 58, 59, 128, 256, 512, 1024, 2048 };
88
94
95 /**
96 * Decode local frame tree
97 */
99 {
103 }
108 }
109 if(length){
112 } else {
115 }
120 return 0;
121 } else { //Node
123 length++;
125 if(r)
128 }
129 }
130
131 /**
132 * Decode header tree
133 */
135 {
139 }
144 if (i1 < 0 || i2 < 0)
149 val = 0;
150 }
else if(val == ctx->
escapes[1]) {
152 val = 0;
153 }
else if(val == ctx->
escapes[2]) {
155 val = 0;
156 }
157
159 return 1;
160 } else { //Node
162
165 if(r < 0)
168 r++;
170 if (r_new < 0)
171 return r_new;
172 return r + r_new;
173 }
174 }
175
176 /**
177 * Store large tree as FFmpeg's vlc codes
178 */
180 {
181 int res;
184 VLC vlc[2] = { { 0 } };
185 int escapes[3];
187 int err = 0;
188
189 if(size >= UINT_MAX>>4){ // (((size + 3) >> 2) + 3) << 2 must not overflow
192 }
193
200
210 goto error;
211 }
212
215 if (res < 0) {
216 err = res;
217 goto error;
218 }
222 tmp1.
lengths,
sizeof(
int),
sizeof(
int),
224 if(res < 0) {
226 err = res;
227 goto error;
228 }
229 }
230 }
233 }
236 if (res < 0) {
237 err = res;
238 goto error;
239 }
243 tmp2.
lengths,
sizeof(
int),
sizeof(
int),
245 if(res < 0) {
247 err = res;
248 goto error;
249 }
250 }
251 }
252 if (!vlc[1].table) {
254 }
255
259
260 last[0] = last[1] = last[2] = -1;
261
270
271 huff.
length = ((size + 3) >> 2) + 4;
277 goto error;
278 }
279
281 err = -1;
291 }
292
294
295 error:
296 if(vlc[0].table)
298 if(vlc[1].table)
306
307 return err;
308 }
309
312 int mmap_size, mclr_size, full_size, type_size,
ret;
313
318
320
328 } else {
330 if (ret < 0)
332 }
340 } else {
342 if (ret < 0)
344 }
352 } else {
354 if (ret < 0)
356 }
364 } else {
366 if (ret < 0)
368 }
369
370 return 0;
371 }
372
374 recode[last[0]] = recode[last[1]] = recode[last[2]] = 0;
375 }
376
377 /* get code and update history */
379 register int *
table = recode;
381
384 table += (*table) & (~SMK_NODE);
385 table++;
386 }
388
389 if(v != recode[last[0]]) {
390 recode[last[2]] = recode[last[1]];
391 recode[last[1]] = recode[last[0]];
393 }
395 }
396
399 {
402 uint32_t *pal;
405 int blocks,
blk, bw, bh;
409
410 if (avpkt->
size <= 769)
412
415
416 /* make the palette available on the way out */
417 pal = (uint32_t*)smk->
pic->
data[1];
419 flags = bytestream2_get_byteu(&gb2);
424 else
426
427 for(i = 0; i < 256; i++)
428 *pal++ = 0xFFU << 24 | bytestream2_get_be24u(&gb2);
429
436
437 blk = 0;
438 bw = avctx->
width >> 2;
440 blocks = bw * bh;
442 while(blk < blocks) {
444 uint16_t pix;
445
448 switch(type & 3){
450 while(run-- && blk < blocks){
451 int clr, map;
452 int hi, lo;
455 out = smk->
pic->
data[0] + (blk / bw) * (stride * 4) + (blk % bw) * 4;
456 hi = clr >> 8;
457 lo = clr & 0xFF;
458 for(i = 0; i < 4; i++) {
459 if(map & 1) out[0] = hi; else out[0] = lo;
460 if(map & 2) out[1] = hi; else out[1] = lo;
461 if(map & 4) out[2] = hi; else out[2] = lo;
462 if(map & 8) out[3] = hi; else out[3] = lo;
463 map >>= 4;
464 out += stride;
465 }
466 blk++;
467 }
468 break;
470 mode = 0;
471 if(avctx->
codec_tag ==
MKTAG(
'S',
'M',
'K',
'4')) {
// In case of Smacker v4 we have three modes
474 }
475 while(run-- && blk < blocks){
476 out = smk->
pic->
data[0] + (blk / bw) * (stride * 4) + (blk % bw) * 4;
477 switch(mode){
478 case 0:
479 for(i = 0; i < 4; i++) {
484 out += stride;
485 }
486 break;
487 case 1:
489 out[0] = out[1] = pix & 0xFF;
490 out[2] = out[3] = pix >> 8;
491 out += stride;
492 out[0] = out[1] = pix & 0xFF;
493 out[2] = out[3] = pix >> 8;
494 out += stride;
496 out[0] = out[1] = pix & 0xFF;
497 out[2] = out[3] = pix >> 8;
498 out += stride;
499 out[0] = out[1] = pix & 0xFF;
500 out[2] = out[3] = pix >> 8;
501 break;
502 case 2:
503 for(i = 0; i < 2; i++) {
504 uint16_t pix1, pix2;
509 out += stride;
512 out += stride;
513 }
514 break;
515 }
516 blk++;
517 }
518 break;
520 while(run-- && blk < blocks)
521 blk++;
522 break;
524 mode = type >> 8;
525 while(run-- && blk < blocks){
526 uint32_t col;
527 out = smk->
pic->
data[0] + (blk / bw) * (stride * 4) + (blk % bw) * 4;
528 col = mode * 0x01010101;
529 for(i = 0; i < 4; i++) {
530 *((uint32_t*)out) = col;
531 out += stride;
532 }
533 blk++;
534 }
535 break;
536 }
537
538 }
539
542
543 *got_frame = 1;
544
545 /* always report that the buffer was completely consumed */
547 }
548
549
550
551 /*
552 *
553 * Uninit smacker decoder
554 *
555 */
557 {
559
564
566
567 return 0;
568 }
569
570
571 /*
572 *
573 * Init smacker decoder
574 *
575 */
577 {
580
582
584
588
589 /* decode huffman trees from extradata */
594 }
595
597 if (ret < 0) {
600 }
601
602 return 0;
603 }
604
605
607 {
611 }
614
615 return 0;
616 }
617
618 /**
619 * Decode Smacker audio data
620 */
622 int *got_frame_ptr,
AVPacket *avpkt)
623 {
626 int buf_size = avpkt->
size;
629 VLC vlc[4] = { { 0 } };
630 int16_t *samples;
634 int unp_size;
636 int pred[2] = {0, 0};
637
638 if (buf_size <= 4) {
641 }
642
644
645 if (unp_size > (1
U<<24)) {
648 }
649
652
655 *got_frame_ptr = 0;
656 return 1;
657 }
660 if (stereo ^ (avctx->
channels != 1)) {
663 }
667 }
668
669 /* get output buffer */
673 samples = (int16_t *)frame->
data[0];
674 samples8 = frame->
data[0];
675
676 // Initialize
677 for(i = 0; i < (1 << (bits + stereo)); i++) {
684 if (!h[i].bits || !h[i].lengths || !h[i].values) {
686 goto error;
687 }
691 goto error;
692 }
694 if(h[i].current > 1) {
696 h[i].lengths, sizeof(int), sizeof(int),
697 h[i].bits,
sizeof(uint32_t),
sizeof(uint32_t),
INIT_VLC_LE);
698 if(res < 0) {
701 goto error;
702 }
703 }
704 }
705 /* this codec relies on wraparound instead of clipping audio */
706 if(bits) { //decode 16-bit data
707 for(i = stereo; i >= 0; i--)
709 for(i = 0; i <= stereo; i++)
710 *samples++ = pred[i];
711 for(; i < unp_size / 2; i++) {
714 if(i & stereo) {
717 else
718 res = 0;
719 if (res < 0) {
722 }
724 if(vlc[3].table)
726 else
727 res = 0;
728 if (res < 0) {
731 }
732 val |= h[3].
values[res] << 8;
734 *samples++ = pred[1];
735 } else {
738 else
739 res = 0;
740 if (res < 0) {
743 }
745 if(vlc[1].table)
747 else
748 res = 0;
749 if (res < 0) {
752 }
753 val |= h[1].
values[res] << 8;
755 *samples++ = pred[0];
756 }
757 }
758 } else { //8-bit data
759 for(i = stereo; i >= 0; i--)
761 for(i = 0; i <= stereo; i++)
762 *samples8++ = pred[i];
763 for(; i < unp_size; i++) {
766 if(i & stereo){
769 else
770 res = 0;
771 if (res < 0) {
774 }
776 *samples8++ = pred[1];
777 } else {
780 else
781 res = 0;
782 if (res < 0) {
785 }
787 *samples8++ = pred[0];
788 }
789 }
790 }
791
792 *got_frame_ptr = 1;
793 ret = buf_size;
794
795 error:
796 for(i = 0; i < 4; i++) {
802 }
803
805 }
806
817 };
818
827 };