/**
* Set each encoded exponent in a block to the minimum of itself and the
- * exponent in the same frequency bin of a following block.
- * exp[i] = min(exp[i], exp1[i]
+ * exponents in the same frequency bin of up to 5 following blocks.
*/
-static void exponent_min(uint8_t *exp, uint8_t *exp1, int n)
+static void exponent_min(uint8_t *exp, int num_reuse_blocks, int nb_coefs)
{
- int i;
- for (i = 0; i < n; i++) {
- if (exp1[i] < exp[i])
- exp[i] = exp1[i];
+ int blk, i;
+
+ if (!num_reuse_blocks)
+ return;
+
+ for (i = 0; i < nb_coefs; i++) {
+ uint8_t min_exp = *exp;
+ uint8_t *exp1 = exp + AC3_MAX_COEFS;
+ for (blk = 0; blk < num_reuse_blocks; blk++) {
+ uint8_t next_exp = *exp1;
+ if (next_exp < min_exp)
+ min_exp = next_exp;
+ exp1 += AC3_MAX_COEFS;
+ }
+ *exp++ = min_exp;
}
}
{
int blk, blk1, ch;
uint8_t *exp, *exp1, *exp_strategy;
- int nb_coefs;
+ int nb_coefs, num_reuse_blocks;
for (ch = 0; ch < s->channels; ch++) {
exp = s->blocks[0].exp[ch];
blk = 0;
while (blk < AC3_MAX_BLOCKS) {
blk1 = blk + 1;
- exp1 = exp + AC3_MAX_COEFS;
- /* for the EXP_REUSE case we select the min of the exponents */
+
+ /* count the number of EXP_REUSE blocks after the current block */
while (blk1 < AC3_MAX_BLOCKS && exp_strategy[blk1] == EXP_REUSE) {
- exponent_min(exp, exp1, nb_coefs);
blk1++;
- exp1 += AC3_MAX_COEFS;
}
+ num_reuse_blocks = blk1 - blk - 1;
+
+ /* for the EXP_REUSE case we select the min of the exponents */
+ exponent_min(exp, num_reuse_blocks, nb_coefs);
+
encode_exponents_blk_ch(exp, nb_coefs,
exp_strategy[blk]);
/* copy encoded exponents for reuse case */