comparison smacker.c @ 9219:00a9a7336fc6 libavcodec

Make Smacker audio decoder output audio in original bit depth Patch by Daniel Verkamp ($firstname) at (three-letter file extension for drivers in Win 3.1) dot (nu) Thread: [PATCH] Smacker: Output audio in original bit depth
author kostya
date Sat, 21 Mar 2009 15:52:14 +0000
parents e9d9d946f213
children 54bc8a2727b0
comparison
equal deleted inserted replaced
9218:18dffa8f2382 9219:00a9a7336fc6
556 } 556 }
557 557
558 558
559 static av_cold int smka_decode_init(AVCodecContext *avctx) 559 static av_cold int smka_decode_init(AVCodecContext *avctx)
560 { 560 {
561 avctx->sample_fmt = SAMPLE_FMT_S16;
562 avctx->channel_layout = (avctx->channels==2) ? CH_LAYOUT_STEREO : CH_LAYOUT_MONO; 561 avctx->channel_layout = (avctx->channels==2) ? CH_LAYOUT_STEREO : CH_LAYOUT_MONO;
563 return 0; 562 return 0;
564 } 563 }
565 564
566 /** 565 /**
570 { 569 {
571 GetBitContext gb; 570 GetBitContext gb;
572 HuffContext h[4]; 571 HuffContext h[4];
573 VLC vlc[4]; 572 VLC vlc[4];
574 int16_t *samples = data; 573 int16_t *samples = data;
574 int8_t *samples8 = data;
575 int val; 575 int val;
576 int i, res; 576 int i, res;
577 int unp_size; 577 int unp_size;
578 int bits, stereo; 578 int bits, stereo;
579 int pred[2] = {0, 0}; 579 int pred[2] = {0, 0};
587 *data_size = 0; 587 *data_size = 0;
588 return 1; 588 return 1;
589 } 589 }
590 stereo = get_bits1(&gb); 590 stereo = get_bits1(&gb);
591 bits = get_bits1(&gb); 591 bits = get_bits1(&gb);
592 if (unp_size & 0xC0000000 || (unp_size << !bits) > *data_size) { 592 if (unp_size & 0xC0000000 || unp_size > *data_size) {
593 av_log(avctx, AV_LOG_ERROR, "Frame is too large to fit in buffer\n"); 593 av_log(avctx, AV_LOG_ERROR, "Frame is too large to fit in buffer\n");
594 return -1; 594 return -1;
595 } 595 }
596 596
597 memset(vlc, 0, sizeof(VLC) * 4); 597 memset(vlc, 0, sizeof(VLC) * 4);
653 } 653 }
654 } else { //8-bit data 654 } else { //8-bit data
655 for(i = stereo; i >= 0; i--) 655 for(i = stereo; i >= 0; i--)
656 pred[i] = get_bits(&gb, 8); 656 pred[i] = get_bits(&gb, 8);
657 for(i = 0; i < stereo; i++) 657 for(i = 0; i < stereo; i++)
658 *samples++ = (pred[i] - 0x80) << 8; 658 *samples8++ = pred[i];
659 for(i = 0; i < unp_size; i++) { 659 for(i = 0; i < unp_size; i++) {
660 if(i & stereo){ 660 if(i & stereo){
661 if(vlc[1].table) 661 if(vlc[1].table)
662 res = get_vlc2(&gb, vlc[1].table, SMKTREE_BITS, 3); 662 res = get_vlc2(&gb, vlc[1].table, SMKTREE_BITS, 3);
663 else 663 else
664 res = 0; 664 res = 0;
665 pred[1] += (int8_t)h[1].values[res]; 665 pred[1] += (int8_t)h[1].values[res];
666 *samples++ = (pred[1] - 0x80) << 8; 666 *samples8++ = pred[1];
667 } else { 667 } else {
668 if(vlc[0].table) 668 if(vlc[0].table)
669 res = get_vlc2(&gb, vlc[0].table, SMKTREE_BITS, 3); 669 res = get_vlc2(&gb, vlc[0].table, SMKTREE_BITS, 3);
670 else 670 else
671 res = 0; 671 res = 0;
672 pred[0] += (int8_t)h[0].values[res]; 672 pred[0] += (int8_t)h[0].values[res];
673 *samples++ = (pred[0] - 0x80) << 8; 673 *samples8++ = pred[0];
674 } 674 }
675 } 675 }
676 unp_size *= 2;
677 } 676 }
678 677
679 for(i = 0; i < 4; i++) { 678 for(i = 0; i < 4; i++) {
680 if(vlc[i].table) 679 if(vlc[i].table)
681 free_vlc(&vlc[i]); 680 free_vlc(&vlc[i]);