annotate ffmpeg/libavcodec/smacker.c @ 13:844d341cf643 tip

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