Move run level decode functionality to ff_wma_run_level_decode
so that it can be reused for wmapro Originally committed as revision 19171 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
@@ -349,7 +349,7 @@ static void wma_window(WMACodecContext *s, float *out)
|
||||
*/
|
||||
static int wma_decode_block(WMACodecContext *s)
|
||||
{
|
||||
int n, v, a, ch, code, bsize;
|
||||
int n, v, a, ch, bsize;
|
||||
int coef_nb_bits, total_gain;
|
||||
int nb_coefs[MAX_CHANNELS];
|
||||
float mdct_norm;
|
||||
@@ -485,53 +485,17 @@ static int wma_decode_block(WMACodecContext *s)
|
||||
/* parse spectral coefficients : just RLE encoding */
|
||||
for(ch = 0; ch < s->nb_channels; ch++) {
|
||||
if (s->channel_coded[ch]) {
|
||||
VLC *coef_vlc;
|
||||
int level, run, sign, tindex;
|
||||
int16_t *ptr, *eptr;
|
||||
const uint16_t *level_table, *run_table;
|
||||
int tindex;
|
||||
int16_t* ptr = &s->coefs1[ch][0];
|
||||
|
||||
/* special VLC tables are used for ms stereo because
|
||||
there is potentially less energy there */
|
||||
tindex = (ch == 1 && s->ms_stereo);
|
||||
coef_vlc = &s->coef_vlc[tindex];
|
||||
run_table = s->run_table[tindex];
|
||||
level_table = s->level_table[tindex];
|
||||
/* XXX: optimize */
|
||||
ptr = &s->coefs1[ch][0];
|
||||
eptr = ptr + nb_coefs[ch];
|
||||
memset(ptr, 0, s->block_len * sizeof(int16_t));
|
||||
for(;;) {
|
||||
code = get_vlc2(&s->gb, coef_vlc->table, VLCBITS, VLCMAX);
|
||||
if (code < 0)
|
||||
return -1;
|
||||
if (code == 1) {
|
||||
/* EOB */
|
||||
break;
|
||||
} else if (code == 0) {
|
||||
/* escape */
|
||||
level = get_bits(&s->gb, coef_nb_bits);
|
||||
/* NOTE: this is rather suboptimal. reading
|
||||
block_len_bits would be better */
|
||||
run = get_bits(&s->gb, s->frame_len_bits);
|
||||
} else {
|
||||
/* normal code */
|
||||
run = run_table[code];
|
||||
level = level_table[code];
|
||||
}
|
||||
sign = get_bits1(&s->gb);
|
||||
if (!sign)
|
||||
level = -level;
|
||||
ptr += run;
|
||||
if (ptr >= eptr)
|
||||
{
|
||||
av_log(NULL, AV_LOG_ERROR, "overflow in spectral RLE, ignoring\n");
|
||||
break;
|
||||
}
|
||||
*ptr++ = level;
|
||||
/* NOTE: EOB can be omitted */
|
||||
if (ptr >= eptr)
|
||||
break;
|
||||
}
|
||||
ff_wma_run_level_decode(s->avctx, &s->gb, &s->coef_vlc[tindex],
|
||||
s->level_table[tindex], s->run_table[tindex],
|
||||
0, ptr, 0, nb_coefs[ch],
|
||||
s->block_len, s->frame_len_bits, coef_nb_bits);
|
||||
}
|
||||
if (s->version == 1 && s->nb_channels >= 2) {
|
||||
align_get_bits(&s->gb);
|
||||
|
||||
Reference in New Issue
Block a user