|
|
|
@@ -175,6 +175,14 @@ static inline void idx_to_quant(MPCContext *c, GetBitContext *gb, int idx, int * |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
static int get_scale_idx(GetBitContext *gb, int ref) |
|
|
|
{ |
|
|
|
int t = get_vlc2(gb, dscf_vlc.table, MPC7_DSCF_BITS, 1) - 7; |
|
|
|
if (t == 8) |
|
|
|
return get_bits(gb, 6); |
|
|
|
return ref + t; |
|
|
|
} |
|
|
|
|
|
|
|
static int mpc7_decode_frame(AVCodecContext * avctx, |
|
|
|
void *data, int *data_size, |
|
|
|
AVPacket *avpkt) |
|
|
|
@@ -222,24 +230,19 @@ static int mpc7_decode_frame(AVCodecContext * avctx, |
|
|
|
for(ch = 0; ch < 2; ch++){ |
|
|
|
if(bands[i].res[ch]){ |
|
|
|
bands[i].scf_idx[ch][2] = c->oldDSCF[ch][i]; |
|
|
|
t = get_vlc2(&gb, dscf_vlc.table, MPC7_DSCF_BITS, 1) - 7; |
|
|
|
bands[i].scf_idx[ch][0] = (t == 8) ? get_bits(&gb, 6) : (bands[i].scf_idx[ch][2] + t); |
|
|
|
bands[i].scf_idx[ch][0] = get_scale_idx(&gb, bands[i].scf_idx[ch][2]); |
|
|
|
switch(bands[i].scfi[ch]){ |
|
|
|
case 0: |
|
|
|
t = get_vlc2(&gb, dscf_vlc.table, MPC7_DSCF_BITS, 1) - 7; |
|
|
|
bands[i].scf_idx[ch][1] = (t == 8) ? get_bits(&gb, 6) : (bands[i].scf_idx[ch][0] + t); |
|
|
|
t = get_vlc2(&gb, dscf_vlc.table, MPC7_DSCF_BITS, 1) - 7; |
|
|
|
bands[i].scf_idx[ch][2] = (t == 8) ? get_bits(&gb, 6) : (bands[i].scf_idx[ch][1] + t); |
|
|
|
bands[i].scf_idx[ch][1] = get_scale_idx(&gb, bands[i].scf_idx[ch][0]); |
|
|
|
bands[i].scf_idx[ch][2] = get_scale_idx(&gb, bands[i].scf_idx[ch][1]); |
|
|
|
break; |
|
|
|
case 1: |
|
|
|
t = get_vlc2(&gb, dscf_vlc.table, MPC7_DSCF_BITS, 1) - 7; |
|
|
|
bands[i].scf_idx[ch][1] = (t == 8) ? get_bits(&gb, 6) : (bands[i].scf_idx[ch][0] + t); |
|
|
|
bands[i].scf_idx[ch][1] = get_scale_idx(&gb, bands[i].scf_idx[ch][0]); |
|
|
|
bands[i].scf_idx[ch][2] = bands[i].scf_idx[ch][1]; |
|
|
|
break; |
|
|
|
case 2: |
|
|
|
bands[i].scf_idx[ch][1] = bands[i].scf_idx[ch][0]; |
|
|
|
t = get_vlc2(&gb, dscf_vlc.table, MPC7_DSCF_BITS, 1) - 7; |
|
|
|
bands[i].scf_idx[ch][2] = (t == 8) ? get_bits(&gb, 6) : (bands[i].scf_idx[ch][1] + t); |
|
|
|
bands[i].scf_idx[ch][2] = get_scale_idx(&gb, bands[i].scf_idx[ch][1]); |
|
|
|
break; |
|
|
|
case 3: |
|
|
|
bands[i].scf_idx[ch][2] = bands[i].scf_idx[ch][1] = bands[i].scf_idx[ch][0]; |
|
|
|
|