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]); |
