|
@@ -78,7 +78,7 @@ typedef struct AC3Block {
|
|
|
int16_t **band_psd; ///< psd per critical band
|
|
|
int16_t **mask; ///< masking curve
|
|
|
uint16_t **qmant; ///< quantized mantissas
|
|
|
- int8_t coeff_shift[AC3_MAX_CHANNELS]; ///< fixed-point coefficient shift values
|
|
|
+ int8_t exp_shift[AC3_MAX_CHANNELS]; ///< exponent shift values
|
|
|
uint8_t new_rematrixing_strategy; ///< send new rematrixing flags in this block
|
|
|
uint8_t rematrixing_flags[4]; ///< rematrixing flags
|
|
|
} AC3Block;
|
|
@@ -269,7 +269,7 @@ static void apply_mdct(AC3EncodeContext *s)
|
|
|
|
|
|
apply_window(&s->dsp, s->windowed_samples, input_samples, s->mdct.window, AC3_WINDOW_SIZE);
|
|
|
|
|
|
- block->coeff_shift[ch] = normalize_samples(s);
|
|
|
+ block->exp_shift[ch] = normalize_samples(s);
|
|
|
|
|
|
mdct512(&s->mdct, block->mdct_coef[ch], s->windowed_samples);
|
|
|
}
|
|
@@ -416,13 +416,14 @@ static void extract_exponents(AC3EncodeContext *s)
|
|
|
AC3Block *block = &s->blocks[blk];
|
|
|
uint8_t *exp = block->exp[ch];
|
|
|
int32_t *coef = block->fixed_coef[ch];
|
|
|
+ int exp_shift = block->exp_shift[ch];
|
|
|
for (i = 0; i < AC3_MAX_COEFS; i++) {
|
|
|
int e;
|
|
|
int v = abs(coef[i]);
|
|
|
if (v == 0)
|
|
|
e = 24;
|
|
|
else {
|
|
|
- e = 23 - av_log2(v);
|
|
|
+ e = 23 - av_log2(v) + exp_shift;
|
|
|
if (e >= 24) {
|
|
|
e = 24;
|
|
|
coef[i] = 0;
|
|
@@ -1138,7 +1139,7 @@ static inline int asym_quant(int c, int e, int qbits)
|
|
|
* Quantize a set of mantissas for a single channel in a single block.
|
|
|
*/
|
|
|
static void quantize_mantissas_blk_ch(AC3EncodeContext *s, int32_t *fixed_coef,
|
|
|
- uint8_t *exp,
|
|
|
+ int8_t exp_shift, uint8_t *exp,
|
|
|
uint8_t *bap, uint16_t *qmant, int n)
|
|
|
{
|
|
|
int i;
|
|
@@ -1146,7 +1147,7 @@ static void quantize_mantissas_blk_ch(AC3EncodeContext *s, int32_t *fixed_coef,
|
|
|
for (i = 0; i < n; i++) {
|
|
|
int v;
|
|
|
int c = fixed_coef[i];
|
|
|
- int e = exp[i];
|
|
|
+ int e = exp[i] - exp_shift;
|
|
|
int b = bap[i];
|
|
|
switch (b) {
|
|
|
case 0:
|
|
@@ -1242,7 +1243,7 @@ static void quantize_mantissas(AC3EncodeContext *s)
|
|
|
s->qmant1_ptr = s->qmant2_ptr = s->qmant4_ptr = NULL;
|
|
|
|
|
|
for (ch = 0; ch < s->channels; ch++) {
|
|
|
- quantize_mantissas_blk_ch(s, block->fixed_coef[ch],
|
|
|
+ quantize_mantissas_blk_ch(s, block->fixed_coef[ch], block->exp_shift[ch],
|
|
|
block->exp[ch], block->bap[ch],
|
|
|
block->qmant[ch], s->nb_coefs[ch]);
|
|
|
}
|