Mercurial > libavcodec.hg
comparison mlpdec.c @ 9280:e3eff8a463ec libavcodec
mlpdec: Split filter_state_buffer into [fi]irbuf and fp to [fi]ir.
author | ramiro |
---|---|
date | Mon, 30 Mar 2009 03:05:38 +0000 |
parents | b65ab36734f8 |
children | 19a7de05b1ae |
comparison
equal
deleted
inserted
replaced
9279:b65ab36734f8 | 9280:e3eff8a463ec |
---|---|
650 | 650 |
651 static void filter_channel(MLPDecodeContext *m, unsigned int substr, | 651 static void filter_channel(MLPDecodeContext *m, unsigned int substr, |
652 unsigned int channel) | 652 unsigned int channel) |
653 { | 653 { |
654 SubStream *s = &m->substream[substr]; | 654 SubStream *s = &m->substream[substr]; |
655 int32_t filter_state_buffer[NUM_FILTERS][MAX_BLOCKSIZE + MAX_FIR_ORDER]; | 655 int32_t firbuf[MAX_BLOCKSIZE + MAX_FIR_ORDER]; |
656 FilterParams *fp[NUM_FILTERS] = { &m->channel_params[channel].filter_params[FIR], | 656 int32_t iirbuf[MAX_BLOCKSIZE + MAX_IIR_ORDER]; |
657 &m->channel_params[channel].filter_params[IIR], }; | 657 FilterParams *fir = &m->channel_params[channel].filter_params[FIR]; |
658 unsigned int filter_shift = fp[FIR]->shift; | 658 FilterParams *iir = &m->channel_params[channel].filter_params[IIR]; |
659 unsigned int filter_shift = fir->shift; | |
659 int32_t mask = MSB_MASK(s->quant_step_size[channel]); | 660 int32_t mask = MSB_MASK(s->quant_step_size[channel]); |
660 int index = MAX_BLOCKSIZE; | 661 int index = MAX_BLOCKSIZE; |
661 int i; | 662 int i; |
662 | 663 |
663 memcpy(&filter_state_buffer[FIR][MAX_BLOCKSIZE], &fp[FIR]->state[0], | 664 memcpy(&firbuf[MAX_BLOCKSIZE], &fir->state[0], |
664 MAX_FIR_ORDER * sizeof(int32_t)); | 665 MAX_FIR_ORDER * sizeof(int32_t)); |
665 memcpy(&filter_state_buffer[IIR][MAX_BLOCKSIZE], &fp[IIR]->state[0], | 666 memcpy(&iirbuf[MAX_BLOCKSIZE], &iir->state[0], |
666 MAX_IIR_ORDER * sizeof(int32_t)); | 667 MAX_IIR_ORDER * sizeof(int32_t)); |
667 | 668 |
668 for (i = 0; i < s->blocksize; i++) { | 669 for (i = 0; i < s->blocksize; i++) { |
669 int32_t residual = m->sample_buffer[i + s->blockpos][channel]; | 670 int32_t residual = m->sample_buffer[i + s->blockpos][channel]; |
670 unsigned int order; | 671 unsigned int order; |
671 int64_t accum = 0; | 672 int64_t accum = 0; |
672 int32_t result; | 673 int32_t result; |
673 | 674 |
674 /* TODO: Move this code to DSPContext? */ | 675 /* TODO: Move this code to DSPContext? */ |
675 | 676 |
676 for (order = 0; order < fp[FIR]->order; order++) | 677 for (order = 0; order < fir->order; order++) |
677 accum += (int64_t)filter_state_buffer[FIR][index + order] * | 678 accum += (int64_t)firbuf[index + order] * |
678 fp[FIR]->coeff[order]; | 679 fir->coeff[order]; |
679 for (order = 0; order < fp[IIR]->order; order++) | 680 for (order = 0; order < iir->order; order++) |
680 accum += (int64_t)filter_state_buffer[IIR][index + order] * | 681 accum += (int64_t)iirbuf[index + order] * |
681 fp[IIR]->coeff[order]; | 682 iir->coeff[order]; |
682 | 683 |
683 accum = accum >> filter_shift; | 684 accum = accum >> filter_shift; |
684 result = (accum + residual) & mask; | 685 result = (accum + residual) & mask; |
685 | 686 |
686 --index; | 687 --index; |
687 | 688 |
688 filter_state_buffer[FIR][index] = result; | 689 firbuf[index] = result; |
689 filter_state_buffer[IIR][index] = result - accum; | 690 iirbuf[index] = result - accum; |
690 | 691 |
691 m->sample_buffer[i + s->blockpos][channel] = result; | 692 m->sample_buffer[i + s->blockpos][channel] = result; |
692 } | 693 } |
693 | 694 |
694 memcpy(&fp[FIR]->state[0], &filter_state_buffer[FIR][index], | 695 memcpy(&fir->state[0], &firbuf[index], |
695 MAX_FIR_ORDER * sizeof(int32_t)); | 696 MAX_FIR_ORDER * sizeof(int32_t)); |
696 memcpy(&fp[IIR]->state[0], &filter_state_buffer[IIR][index], | 697 memcpy(&iir->state[0], &iirbuf[index], |
697 MAX_IIR_ORDER * sizeof(int32_t)); | 698 MAX_IIR_ORDER * sizeof(int32_t)); |
698 } | 699 } |
699 | 700 |
700 /** Read a block of PCM residual data (or actual if no filtering active). */ | 701 /** Read a block of PCM residual data (or actual if no filtering active). */ |
701 | 702 |