Mercurial > libavcodec.hg
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]); |