]> rtime.felk.cvut.cz Git - frescor/ffmpeg.git/blob - libavcodec/smacker.c
Smacker demuxer and decoder.
[frescor/ffmpeg.git] / libavcodec / smacker.c
1 /*
2  * Smacker decoder
3  * Copyright (c) 2006 Konstantin Shishkov
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18  *
19  */
20
21 /**
22  * @file smacker.c
23  * Smacker decoder
24  */
25
26 /*
27  * Based on http://wiki.multimedia.cx/index.php?title=Smacker
28  */
29
30 #include <stdio.h>
31 #include <stdlib.h>
32
33 #include "common.h"
34 #include "avcodec.h"
35
36 #define ALT_BITSTREAM_READER_LE
37 #include "bitstream.h"
38
39 #define SMKTREE_BITS 9
40 #define SMK_NODE 0x80000000
41
42 /*
43  * Decoder context
44  */
45 typedef struct SmackVContext {
46     AVCodecContext *avctx;
47     AVFrame pic;
48
49     int *mmap_tbl, *mclr_tbl, *full_tbl, *type_tbl;
50     int mmap_last[3], mclr_last[3], full_last[3], type_last[3];
51 } SmackVContext;
52
53 /**
54  * Context used for code reconstructing
55  */
56 typedef struct HuffContext {
57     int length;
58     int maxlength;
59     int current;
60     uint32_t *bits;
61     int *lengths;
62     int *values;
63 } HuffContext;
64
65 /* common parameters used for decode_bigtree */
66 typedef struct DBCtx {
67     VLC *v1, *v2;
68     int *recode1, *recode2;
69     int escapes[3];
70     int *last;
71     int lcur;
72 } DBCtx;
73
74 /* possible runs of blocks */
75 static const int block_runs[64] = {
76       1,    2,    3,    4,    5,    6,    7,    8,
77       9,   10,   11,   12,   13,   14,   15,   16,
78      17,   18,   19,   20,   21,   22,   23,   24,
79      25,   26,   27,   28,   29,   30,   31,   32,
80      33,   34,   35,   36,   37,   38,   39,   40,
81      41,   42,   43,   44,   45,   46,   47,   48,
82      49,   50,   51,   52,   53,   54,   55,   56,
83      57,   58,   59,  128,  256,  512, 1024, 2048 };
84
85 enum SmkBlockTypes {
86     SMK_BLK_MONO = 0,
87     SMK_BLK_FULL = 1,
88     SMK_BLK_SKIP = 2,
89     SMK_BLK_FILL = 3 };
90
91 /**
92  * Decode local frame tree
93  */
94 static int smacker_decode_tree(GetBitContext *gb, HuffContext *hc, uint32_t prefix, int length)
95 {
96     if(!get_bits1(gb)){ //Leaf
97         if(hc->current >= 256){
98             av_log(NULL, AV_LOG_ERROR, "Tree size exceeded!\n");
99             return -1;
100         }
101         if(length){
102             hc->bits[hc->current] = prefix;
103             hc->lengths[hc->current] = length;
104         } else {
105             hc->bits[hc->current] = 0;
106             hc->lengths[hc->current] = 0;
107         }
108         hc->values[hc->current] = get_bits(gb, 8);
109         hc->current++;
110         if(hc->maxlength < length)
111             hc->maxlength = length;
112         return 0;
113     } else { //Node
114         int r;
115         length++;
116         r = smacker_decode_tree(gb, hc, prefix, length);
117         if(r)
118             return r;
119         return smacker_decode_tree(gb, hc, prefix | (1 << (length - 1)), length);
120     }
121 }
122
123 /**
124  * Decode header tree
125  */
126 static int smacker_decode_bigtree(GetBitContext *gb, HuffContext *hc, DBCtx *ctx)
127 {
128     if(!get_bits1(gb)){ //Leaf
129         int val, i1, i2, b1, b2;
130         if(hc->current >= hc->length){
131             av_log(NULL, AV_LOG_ERROR, "Tree size exceeded!\n");
132             return -1;
133         }
134         b1 = get_bits_count(gb);
135         i1 = get_vlc2(gb, ctx->v1->table, SMKTREE_BITS, 3);
136         b1 = get_bits_count(gb) - b1;
137         b2 = get_bits_count(gb);
138         i2 = get_vlc2(gb, ctx->v2->table, SMKTREE_BITS, 3);
139         b2 = get_bits_count(gb) - b2;
140         val = ctx->recode1[i1] | (ctx->recode2[i2] << 8);
141         if(val == ctx->escapes[0]) {
142             ctx->last[0] = hc->current;
143             val = 0;
144         } else if(val == ctx->escapes[1]) {
145             ctx->last[1] = hc->current;
146             val = 0;
147         } else if(val == ctx->escapes[2]) {
148             ctx->last[2] = hc->current;
149             val = 0;
150         }
151
152         hc->values[hc->current++] = val;
153         return 1;
154     } else { //Node
155         int r = 0, t;
156
157         t = hc->current++;
158         r = smacker_decode_bigtree(gb, hc, ctx);
159         if(r < 0)
160             return r;
161         hc->values[t] = SMK_NODE | r;
162         r++;
163         r += smacker_decode_bigtree(gb, hc, ctx);
164         return r;
165     }
166 }
167
168 /**
169  * Store large tree as FFmpeg's vlc codes
170  */
171 static int smacker_decode_header_tree(SmackVContext *smk, GetBitContext *gb, int **recodes, int *last, int size)
172 {
173     int res;
174     HuffContext huff;
175     HuffContext tmp1, tmp2;
176     VLC vlc[2];
177     int escapes[3];
178     DBCtx ctx;
179
180     tmp1.length = 256;
181     tmp1.maxlength = 0;
182     tmp1.current = 0;
183     tmp1.bits = av_mallocz(256 * 4);
184     tmp1.lengths = av_mallocz(256 * sizeof(int));
185     tmp1.values = av_mallocz(256 * sizeof(int));
186
187     tmp2.length = 256;
188     tmp2.maxlength = 0;
189     tmp2.current = 0;
190     tmp2.bits = av_mallocz(256 * 4);
191     tmp2.lengths = av_mallocz(256 * sizeof(int));
192     tmp2.values = av_mallocz(256 * sizeof(int));
193
194     memset(&vlc[0], 0, sizeof(VLC));
195     memset(&vlc[1], 0, sizeof(VLC));
196
197     if(get_bits1(gb)) {
198         smacker_decode_tree(gb, &tmp1, 0, 0);
199         get_bits1(gb);
200         res = init_vlc(&vlc[0], SMKTREE_BITS, tmp1.length,
201                     tmp1.lengths, sizeof(int), sizeof(int),
202                     tmp1.bits, sizeof(uint32_t), sizeof(uint32_t), INIT_VLC_LE);
203         if(res < 0) {
204             av_log(smk->avctx, AV_LOG_ERROR, "Cannot build VLC table\n");
205             return -1;
206         }
207     } else {
208         av_log(smk->avctx, AV_LOG_ERROR, "Skipping low bytes tree\n");
209     }
210     if(get_bits1(gb)){
211         smacker_decode_tree(gb, &tmp2, 0, 0);
212         get_bits1(gb);
213         res = init_vlc(&vlc[1], SMKTREE_BITS, tmp2.length,
214                     tmp2.lengths, sizeof(int), sizeof(int),
215                     tmp2.bits, sizeof(uint32_t), sizeof(uint32_t), INIT_VLC_LE);
216         if(res < 0) {
217             av_log(smk->avctx, AV_LOG_ERROR, "Cannot build VLC table\n");
218             return -1;
219         }
220     } else {
221         av_log(smk->avctx, AV_LOG_ERROR, "Skipping high bytes tree\n");
222     }
223
224     escapes[0]  = get_bits(gb, 8);
225     escapes[0] |= get_bits(gb, 8) << 8;
226     escapes[1]  = get_bits(gb, 8);
227     escapes[1] |= get_bits(gb, 8) << 8;
228     escapes[2]  = get_bits(gb, 8);
229     escapes[2] |= get_bits(gb, 8) << 8;
230
231     last[0] = last[1] = last[2] = -1;
232
233     ctx.escapes[0] = escapes[0];
234     ctx.escapes[1] = escapes[1];
235     ctx.escapes[2] = escapes[2];
236     ctx.v1 = &vlc[0];
237     ctx.v2 = &vlc[1];
238     ctx.recode1 = tmp1.values;
239     ctx.recode2 = tmp2.values;
240     ctx.last = last;
241
242     huff.length = ((size + 3) >> 2) + 3;
243     huff.maxlength = 0;
244     huff.current = 0;
245     huff.values = av_mallocz(huff.length * sizeof(int));
246
247     smacker_decode_bigtree(gb, &huff, &ctx);
248     get_bits1(gb);
249     if(ctx.last[0] == -1) ctx.last[0] = huff.current++;
250     if(ctx.last[1] == -1) ctx.last[1] = huff.current++;
251     if(ctx.last[2] == -1) ctx.last[2] = huff.current++;
252
253     *recodes = huff.values;
254
255     if(vlc[0].table)
256         free_vlc(&vlc[0]);
257     if(vlc[1].table)
258         free_vlc(&vlc[1]);
259     av_free(tmp1.bits);
260     av_free(tmp1.lengths);
261     av_free(tmp1.values);
262     av_free(tmp2.bits);
263     av_free(tmp2.lengths);
264     av_free(tmp2.values);
265
266     return 0;
267 }
268
269 static int decode_header_trees(SmackVContext *smk) {
270     GetBitContext gb;
271     int mmap_size, mclr_size, full_size, type_size;
272
273     mmap_size = LE_32(smk->avctx->extradata);
274     mclr_size = LE_32(smk->avctx->extradata + 4);
275     full_size = LE_32(smk->avctx->extradata + 8);
276     type_size = LE_32(smk->avctx->extradata + 12);
277
278     init_get_bits(&gb, smk->avctx->extradata + 16, (smk->avctx->extradata_size - 16) * 8);
279
280     if(!get_bits1(&gb)) {
281         av_log(smk->avctx, AV_LOG_INFO, "Skipping MMAP tree\n");
282         smk->mmap_tbl = av_malloc(sizeof(int) * 2);
283         smk->mmap_tbl[0] = 0;
284         smk->mmap_last[0] = smk->mmap_last[1] = smk->mmap_last[2] = 1;
285     } else {
286         smacker_decode_header_tree(smk, &gb, &smk->mmap_tbl, smk->mmap_last, mmap_size);
287     }
288     if(!get_bits(&gb, 1)) {
289         av_log(smk->avctx, AV_LOG_INFO, "Skipping MCLR tree\n");
290         smk->mclr_tbl = av_malloc(sizeof(int) * 2);
291         smk->mclr_tbl[0] = 0;
292         smk->mclr_last[0] = smk->mclr_last[1] = smk->mclr_last[2] = 1;
293     } else {
294         smacker_decode_header_tree(smk, &gb, &smk->mclr_tbl, smk->mclr_last, mclr_size);
295     }
296     if(!get_bits(&gb, 1)) {
297         av_log(smk->avctx, AV_LOG_INFO, "Skipping FULL tree\n");
298         smk->full_tbl = av_malloc(sizeof(int) * 2);
299         smk->full_tbl[0] = 0;
300         smk->full_last[0] = smk->full_last[1] = smk->full_last[2] = 1;
301     } else {
302         smacker_decode_header_tree(smk, &gb, &smk->full_tbl, smk->full_last, full_size);
303     }
304     if(!get_bits(&gb, 1)) {
305         av_log(smk->avctx, AV_LOG_INFO, "Skipping TYPE tree\n");
306         smk->type_tbl = av_malloc(sizeof(int) * 2);
307         smk->type_tbl[0] = 0;
308         smk->type_last[0] = smk->type_last[1] = smk->type_last[2] = 1;
309     } else {
310         smacker_decode_header_tree(smk, &gb, &smk->type_tbl, smk->type_last, type_size);
311     }
312
313     return 0;
314 }
315
316 static always_inline void last_reset(int *recode, int *last) {
317     recode[last[0]] = recode[last[1]] = recode[last[2]] = 0;
318 }
319
320 /* get code and update history */
321 static always_inline int smk_get_code(GetBitContext *gb, int *recode, int *last) {
322     register int *table = recode;
323     int v, b;
324
325     b = get_bits_count(gb);
326     while(*table & SMK_NODE) {
327         if(get_bits1(gb))
328             table += (*table) & (~SMK_NODE);
329         table++;
330     }
331     v = *table;
332     b = get_bits_count(gb) - b;
333
334     if(v != recode[last[0]]) {
335         recode[last[2]] = recode[last[1]];
336         recode[last[1]] = recode[last[0]];
337         recode[last[0]] = v;
338     }
339     return v;
340 }
341
342 static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8_t *buf, int buf_size)
343 {
344     SmackVContext * const smk = (SmackVContext *)avctx->priv_data;
345     uint8_t *out;
346     uint32_t *pal;
347     GetBitContext gb;
348     int blocks, blk, bw, bh;
349     int i;
350     int stride;
351
352     if(buf_size == 769)
353         return 0;
354     if(smk->pic.data[0])
355             avctx->release_buffer(avctx, &smk->pic);
356
357     smk->pic.reference = 1;
358     smk->pic.buffer_hints = FF_BUFFER_HINTS_VALID | FF_BUFFER_HINTS_PRESERVE | FF_BUFFER_HINTS_REUSABLE;
359     if(avctx->reget_buffer(avctx, &smk->pic) < 0){
360         av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
361         return -1;
362     }
363
364     /* make the palette available on the way out */
365     out = buf + 1;
366     pal = (uint32_t*)smk->pic.data[1];
367     smk->pic.palette_has_changed = buf[0] & 1;
368     smk->pic.key_frame = !!(buf[0] & 2);
369     if(smk->pic.key_frame)
370         smk->pic.pict_type = FF_I_TYPE;
371     else
372         smk->pic.pict_type = FF_P_TYPE;
373
374     for(i = 0; i < 256; i++) {
375         int r, g, b;
376         r = *out++;
377         g = *out++;
378         b = *out++;
379         *pal++ = (r << 16) | (g << 8) | b;
380     }
381
382     last_reset(smk->mmap_tbl, smk->mmap_last);
383     last_reset(smk->mclr_tbl, smk->mclr_last);
384     last_reset(smk->full_tbl, smk->full_last);
385     last_reset(smk->type_tbl, smk->type_last);
386     init_get_bits(&gb, buf + 769, (buf_size - 769) * 8);
387
388     blk = 0;
389     bw = avctx->width >> 2;
390     bh = avctx->height >> 2;
391     blocks = bw * bh;
392     out = smk->pic.data[0];
393     stride = smk->pic.linesize[0];
394     while(blk < blocks) {
395         int type, run, mode;
396         uint16_t pix;
397
398         type = smk_get_code(&gb, smk->type_tbl, smk->type_last);
399         run = block_runs[(type >> 2) & 0x3F];
400         switch(type & 3){
401         case SMK_BLK_MONO:
402             while(run-- && blk < blocks){
403                 int clr, map;
404                 int hi, lo;
405                 clr = smk_get_code(&gb, smk->mclr_tbl, smk->mclr_last);
406                 map = smk_get_code(&gb, smk->mmap_tbl, smk->mmap_last);
407                 out = smk->pic.data[0] + (blk / bw) * (stride * 4) + (blk % bw) * 4;
408                 hi = clr >> 8;
409                 lo = clr & 0xFF;
410                 for(i = 0; i < 4; i++) {
411                     if(map & 1) out[0] = hi; else out[0] = lo;
412                     if(map & 2) out[1] = hi; else out[1] = lo;
413                     if(map & 4) out[2] = hi; else out[2] = lo;
414                     if(map & 8) out[3] = hi; else out[3] = lo;
415                     map >>= 4;
416                     out += stride;
417                 }
418                 blk++;
419             }
420             break;
421         case SMK_BLK_FULL:
422             mode = 0;
423             if(avctx->codec_tag != 0) { // In case of Smacker v4 we have three modes
424                 if(get_bits1(&gb)) mode = 1;
425                 else if(get_bits1(&gb)) mode = 2;
426             }
427             while(run-- && blk < blocks){
428                 out = smk->pic.data[0] + (blk / bw) * (stride * 4) + (blk % bw) * 4;
429                 switch(mode){
430                 case 0:
431                     for(i = 0; i < 4; i++) {
432                         pix = smk_get_code(&gb, smk->full_tbl, smk->full_last);
433                         out[2] = pix & 0xFF;
434                         out[3] = pix >> 8;
435                         pix = smk_get_code(&gb, smk->full_tbl, smk->full_last);
436                         out[0] = pix & 0xFF;
437                         out[1] = pix >> 8;
438                         out += stride;
439                     }
440                     break;
441                 case 1:
442                     pix = smk_get_code(&gb, smk->full_tbl, smk->full_last);
443                     out[0] = out[1] = pix & 0xFF;
444                     out[2] = out[3] = pix >> 8;
445                     out += stride;
446                     out[0] = out[1] = pix & 0xFF;
447                     out[2] = out[3] = pix >> 8;
448                     out += stride;
449                     pix = smk_get_code(&gb, smk->full_tbl, smk->full_last);
450                     out[0] = out[1] = pix & 0xFF;
451                     out[2] = out[3] = pix >> 8;
452                     out += stride;
453                     out[0] = out[1] = pix & 0xFF;
454                     out[2] = out[3] = pix >> 8;
455                     out += stride;
456                     break;
457                 case 2:
458                     for(i = 0; i < 2; i++) {
459                         uint16_t pix1, pix2;
460                         pix1 = smk_get_code(&gb, smk->full_tbl, smk->full_last);
461                         pix2 = smk_get_code(&gb, smk->full_tbl, smk->full_last);
462                         out[0] = pix1 & 0xFF; out[1] = pix1 >> 8;
463                         out[2] = pix2 & 0xFF; out[3] = pix2 >> 8;
464                         out += stride;
465                         out[0] = pix1 & 0xFF; out[1] = pix1 >> 8;
466                         out[2] = pix2 & 0xFF; out[3] = pix2 >> 8;
467                         out += stride;
468                     }
469                     break;
470                 }
471                 blk++;
472             }
473             break;
474         case SMK_BLK_SKIP:
475             while(run-- && blk < blocks)
476                 blk++;
477             break;
478         case SMK_BLK_FILL:
479             mode = type >> 8;
480             while(run-- && blk < blocks){
481                 uint32_t col;
482                 out = smk->pic.data[0] + (blk / bw) * (stride * 4) + (blk % bw) * 4;
483                 col = mode * 0x01010101;
484                 for(i = 0; i < 4; i++) {
485                     *((uint32_t*)out) = col;
486                     out += stride;
487                 }
488                 blk++;
489             }
490             break;
491         }
492
493     }
494
495     *data_size = sizeof(AVFrame);
496     *(AVFrame*)data = smk->pic;
497
498     /* always report that the buffer was completely consumed */
499     return buf_size;
500 }
501
502
503
504 /*
505  *
506  * Init smacker decoder
507  *
508  */
509 static int decode_init(AVCodecContext *avctx)
510 {
511     SmackVContext * const c = (SmackVContext *)avctx->priv_data;
512
513     c->avctx = avctx;
514     avctx->has_b_frames = 0;
515
516     c->pic.data[0] = NULL;
517
518     if (avcodec_check_dimensions(avctx, avctx->height, avctx->width) < 0) {
519         return 1;
520     }
521
522     avctx->pix_fmt = PIX_FMT_PAL8;
523
524
525     /* decode huffman trees from extradata */
526     if(avctx->extradata_size < 16){
527         av_log(avctx, AV_LOG_ERROR, "Extradata missing!\n");
528         return -1;
529     }
530
531     decode_header_trees(c);
532
533
534     return 0;
535 }
536
537
538
539 /*
540  *
541  * Uninit smacker decoder
542  *
543  */
544 static int decode_end(AVCodecContext *avctx)
545 {
546     SmackVContext * const smk = (SmackVContext *)avctx->priv_data;
547
548     if(smk->mmap_tbl)
549         av_free(smk->mmap_tbl);
550     if(smk->mclr_tbl)
551         av_free(smk->mclr_tbl);
552     if(smk->full_tbl)
553         av_free(smk->full_tbl);
554     if(smk->type_tbl)
555         av_free(smk->type_tbl);
556
557     if (smk->pic.data[0])
558         avctx->release_buffer(avctx, &smk->pic);
559
560     return 0;
561 }
562
563
564 static int smka_decode_init(AVCodecContext *avctx)
565 {
566     return 0;
567 }
568
569 /**
570  * Decode Smacker audio data
571  */
572 static int smka_decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8_t *buf, int buf_size)
573 {
574     GetBitContext gb;
575     HuffContext h[4];
576     VLC vlc[4];
577     int16_t *samples = data;
578     int val;
579     int i, res;
580     int unp_size;
581     int bits, stereo;
582     int pred[2] = {0, 0};
583
584     unp_size = LE_32(buf);
585
586     init_get_bits(&gb, buf + 4, (buf_size - 4) * 8);
587
588     if(!get_bits1(&gb)){
589         av_log(avctx, AV_LOG_INFO, "Sound: no data\n");
590         *data_size = 0;
591         return 1;
592     }
593     stereo = get_bits1(&gb);
594     bits = get_bits1(&gb);
595
596     memset(vlc, 0, sizeof(VLC) * 4);
597     memset(h, 0, sizeof(HuffContext) * 4);
598     // Initialize
599     for(i = 0; i < (1 << (bits + stereo)); i++) {
600         h[i].length = 256;
601         h[i].maxlength = 0;
602         h[i].current = 0;
603         h[i].bits = av_mallocz(256 * 4);
604         h[i].lengths = av_mallocz(256 * sizeof(int));
605         h[i].values = av_mallocz(256 * sizeof(int));
606         get_bits1(&gb);
607         smacker_decode_tree(&gb, &h[i], 0, 0);
608         get_bits1(&gb);
609         res = init_vlc(&vlc[i], SMKTREE_BITS, h[i].length,
610                     h[i].lengths, sizeof(int), sizeof(int),
611                     h[i].bits, sizeof(uint32_t), sizeof(uint32_t), INIT_VLC_LE);
612         if(res < 0) {
613             av_log(avctx, AV_LOG_ERROR, "Cannot build VLC table\n");
614             return -1;
615         }
616     }
617     if(bits) { //decode 16-bit data
618         pred[0]  = get_bits(&gb, 8);
619         pred[0] |= get_bits(&gb, 8);
620         if(stereo) {
621             pred[1]  = get_bits(&gb, 8);
622             pred[1] |= get_bits(&gb, 8);
623         }
624         for(i = 0; i < unp_size / 2; i++) {
625             if(i & stereo) {
626                 val  = h[2].values[get_vlc2(&gb, vlc[2].table, SMKTREE_BITS, 3)];
627                 val |= (int8_t)h[3].values[get_vlc2(&gb, vlc[3].table, SMKTREE_BITS, 3)] << 8;
628                 pred[1] += val;
629                 *samples++ = pred[1];
630             } else {
631                 val  = h[0].values[get_vlc2(&gb, vlc[0].table, SMKTREE_BITS, 3)];
632                 val |= (int8_t)h[1].values[get_vlc2(&gb, vlc[1].table, SMKTREE_BITS, 3)] << 8;
633                 pred[0] += val;
634                 *samples++ = pred[0];
635             }
636         }
637     } else { //8-bit data
638         pred[0] = get_bits(&gb, 8);
639         if(stereo)
640             pred[1] = get_bits(&gb, 8);
641         for(i = 0; i < unp_size; i++) {
642             if(i & stereo){
643                 pred[1] += (int8_t)h[1].values[get_vlc2(&gb, vlc[1].table, SMKTREE_BITS, 3)];
644                 *samples++ = (pred[1] - 0x80) << 8;
645             } else {
646                 pred[0] += (int8_t)h[0].values[get_vlc2(&gb, vlc[0].table, SMKTREE_BITS, 3)];
647                 *samples++ = (pred[0] - 0x80) << 8;
648             }
649         }
650         unp_size *= 2;
651     }
652
653     for(i = 0; i < 4; i++) {
654         if(vlc[i].table)
655             free_vlc(&vlc[i]);
656         if(h[i].bits)
657             av_free(h[i].bits);
658         if(h[i].lengths)
659             av_free(h[i].lengths);
660         if(h[i].values)
661             av_free(h[i].values);
662     }
663
664     *data_size = unp_size;
665     return buf_size;
666 }
667
668 AVCodec smacker_decoder = {
669     "smackvid",
670     CODEC_TYPE_VIDEO,
671     CODEC_ID_SMACKVIDEO,
672     sizeof(SmackVContext),
673     decode_init,
674     NULL,
675     decode_end,
676     decode_frame
677 };
678
679 AVCodec smackaud_decoder = {
680     "smackaud",
681     CODEC_TYPE_AUDIO,
682     CODEC_ID_SMACKAUDIO,
683     0,
684     smka_decode_init,
685     NULL,
686     NULL,
687     smka_decode_frame
688 };
689