| @@ -560,56 +560,47 @@ static void extract_exponents(AC3EncodeContext *s) | |||
| #define EXP_DIFF_THRESHOLD 500 | |||
| /** | |||
| * Calculate exponent strategies for all blocks in a single channel. | |||
| */ | |||
| static void compute_exp_strategy_ch(AC3EncodeContext *s, uint8_t *exp_strategy, | |||
| uint8_t *exp) | |||
| { | |||
| int blk, blk1; | |||
| int exp_diff; | |||
| /* estimate if the exponent variation & decide if they should be | |||
| reused in the next frame */ | |||
| exp_strategy[0] = EXP_NEW; | |||
| exp += AC3_MAX_COEFS; | |||
| for (blk = 1; blk < AC3_MAX_BLOCKS; blk++) { | |||
| exp_diff = s->dsp.sad[0](NULL, exp, exp - AC3_MAX_COEFS, 16, 16); | |||
| if (exp_diff > EXP_DIFF_THRESHOLD) | |||
| exp_strategy[blk] = EXP_NEW; | |||
| else | |||
| exp_strategy[blk] = EXP_REUSE; | |||
| exp += AC3_MAX_COEFS; | |||
| } | |||
| /* now select the encoding strategy type : if exponents are often | |||
| recoded, we use a coarse encoding */ | |||
| blk = 0; | |||
| while (blk < AC3_MAX_BLOCKS) { | |||
| blk1 = blk + 1; | |||
| while (blk1 < AC3_MAX_BLOCKS && exp_strategy[blk1] == EXP_REUSE) | |||
| blk1++; | |||
| switch (blk1 - blk) { | |||
| case 1: exp_strategy[blk] = EXP_D45; break; | |||
| case 2: | |||
| case 3: exp_strategy[blk] = EXP_D25; break; | |||
| default: exp_strategy[blk] = EXP_D15; break; | |||
| } | |||
| blk = blk1; | |||
| } | |||
| } | |||
| /** | |||
| * Calculate exponent strategies for all channels. | |||
| * Array arrangement is reversed to simplify the per-channel calculation. | |||
| */ | |||
| static void compute_exp_strategy(AC3EncodeContext *s) | |||
| { | |||
| int ch, blk; | |||
| int ch, blk, blk1; | |||
| for (ch = 0; ch < s->fbw_channels; ch++) { | |||
| compute_exp_strategy_ch(s, s->exp_strategy[ch], s->blocks[0].exp[ch]); | |||
| uint8_t *exp_strategy = s->exp_strategy[ch]; | |||
| uint8_t *exp = s->blocks[0].exp[ch]; | |||
| int exp_diff; | |||
| /* estimate if the exponent variation & decide if they should be | |||
| reused in the next frame */ | |||
| exp_strategy[0] = EXP_NEW; | |||
| exp += AC3_MAX_COEFS; | |||
| for (blk = 1; blk < AC3_MAX_BLOCKS; blk++) { | |||
| exp_diff = s->dsp.sad[0](NULL, exp, exp - AC3_MAX_COEFS, 16, 16); | |||
| if (exp_diff > EXP_DIFF_THRESHOLD) | |||
| exp_strategy[blk] = EXP_NEW; | |||
| else | |||
| exp_strategy[blk] = EXP_REUSE; | |||
| exp += AC3_MAX_COEFS; | |||
| } | |||
| /* now select the encoding strategy type : if exponents are often | |||
| recoded, we use a coarse encoding */ | |||
| blk = 0; | |||
| while (blk < AC3_MAX_BLOCKS) { | |||
| blk1 = blk + 1; | |||
| while (blk1 < AC3_MAX_BLOCKS && exp_strategy[blk1] == EXP_REUSE) | |||
| blk1++; | |||
| switch (blk1 - blk) { | |||
| case 1: exp_strategy[blk] = EXP_D45; break; | |||
| case 2: | |||
| case 3: exp_strategy[blk] = EXP_D25; break; | |||
| default: exp_strategy[blk] = EXP_D15; break; | |||
| } | |||
| blk = blk1; | |||
| } | |||
| } | |||
| if (s->lfe_on) { | |||
| ch = s->lfe_channel; | |||