|
|
|
@@ -388,15 +388,26 @@ static void encode_band_info(AACEncContext *s, SingleChannelElement *sce) |
|
|
|
static void encode_scale_factors(AVCodecContext *avctx, AACEncContext *s, |
|
|
|
SingleChannelElement *sce) |
|
|
|
{ |
|
|
|
int off = sce->sf_idx[0], diff; |
|
|
|
int diff, off_sf = sce->sf_idx[0], off_pns = sce->sf_idx[0]; |
|
|
|
int noise_flag = 1; |
|
|
|
int i, w; |
|
|
|
|
|
|
|
for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) { |
|
|
|
for (i = 0; i < sce->ics.max_sfb; i++) { |
|
|
|
if (!sce->zeroes[w*16 + i]) { |
|
|
|
diff = sce->sf_idx[w*16 + i] - off + SCALE_DIFF_ZERO; |
|
|
|
if (sce->band_type[w*16 + i] == NOISE_BT) { |
|
|
|
diff = sce->sf_idx[w*16 + i] - off_pns; |
|
|
|
off_pns = sce->sf_idx[w*16 + i]; |
|
|
|
if (noise_flag-- > 0) { |
|
|
|
put_bits(&s->pb, NOISE_PRE_BITS, diff + NOISE_PRE); |
|
|
|
continue; |
|
|
|
} |
|
|
|
} else { |
|
|
|
diff = sce->sf_idx[w*16 + i] - off_sf; |
|
|
|
off_sf = sce->sf_idx[w*16 + i]; |
|
|
|
} |
|
|
|
diff += SCALE_DIFF_ZERO; |
|
|
|
av_assert0(diff >= 0 && diff <= 120); |
|
|
|
off = sce->sf_idx[w*16 + i]; |
|
|
|
put_bits(&s->pb, ff_aac_scalefactor_bits[diff], ff_aac_scalefactor_code[diff]); |
|
|
|
} |
|
|
|
} |
|
|
|
|