Browse Source

ac3enc: restructure coupling coordinate reuse calculation

tags/n0.9
Justin Ruggles 14 years ago
parent
commit
fce33f9ead
1 changed files with 27 additions and 21 deletions
  1. +27
    -21
      libavcodec/ac3enc_template.c

+ 27
- 21
libavcodec/ac3enc_template.c View File

@@ -202,33 +202,29 @@ static void apply_channel_coupling(AC3EncodeContext *s)
bnd++; bnd++;
} }


/* calculate coupling coordinates for all blocks for all channels */
for (blk = 0; blk < s->num_blocks; blk++) {
AC3Block *block = &s->blocks[blk];
if (!block->cpl_in_use)
continue;
for (ch = 1; ch <= s->fbw_channels; ch++) {
if (!block->channel_in_cpl[ch])
continue;
for (bnd = 0; bnd < s->num_cpl_bands; bnd++) {
cpl_coords[blk][ch][bnd] = calc_cpl_coord(energy[blk][ch][bnd],
energy[blk][CPL_CH][bnd]);
}
}
}

/* determine which blocks to send new coupling coordinates for */ /* determine which blocks to send new coupling coordinates for */
for (blk = 0; blk < s->num_blocks; blk++) { for (blk = 0; blk < s->num_blocks; blk++) {
AC3Block *block = &s->blocks[blk]; AC3Block *block = &s->blocks[blk];
AC3Block *block0 = blk ? &s->blocks[blk-1] : NULL; AC3Block *block0 = blk ? &s->blocks[blk-1] : NULL;
CoefSumType coord_diff[AC3_MAX_CHANNELS] = {0,};


memset(block->new_cpl_coords, 0, sizeof(block->new_cpl_coords)); memset(block->new_cpl_coords, 0, sizeof(block->new_cpl_coords));


if (block->cpl_in_use) { if (block->cpl_in_use) {
/* calculate coupling coordinates for all blocks and calculate the
average difference between coordinates in successive blocks */
for (ch = 1; ch <= s->fbw_channels; ch++) {
if (!block->channel_in_cpl[ch])
continue;

for (bnd = 0; bnd < s->num_cpl_bands; bnd++) {
cpl_coords[blk][ch][bnd] = calc_cpl_coord(energy[blk][ch][bnd],
energy[blk][CPL_CH][bnd]);
if (blk > 0 && block0->cpl_in_use &&
block0->channel_in_cpl[ch]) {
coord_diff[ch] += fabs(cpl_coords[blk-1][ch][bnd] -
cpl_coords[blk ][ch][bnd]);
}
}
coord_diff[ch] /= s->num_cpl_bands;
}

/* send new coordinates if this is the first block, if previous /* send new coordinates if this is the first block, if previous
* block did not use coupling but this block does, the channels * block did not use coupling but this block does, the channels
* using coupling has changed from the previous block, or the * using coupling has changed from the previous block, or the
@@ -239,9 +235,19 @@ static void apply_channel_coupling(AC3EncodeContext *s)
block->new_cpl_coords[ch] = 1; block->new_cpl_coords[ch] = 1;
} else { } else {
for (ch = 1; ch <= s->fbw_channels; ch++) { for (ch = 1; ch <= s->fbw_channels; ch++) {
if ((block->channel_in_cpl[ch] && !block0->channel_in_cpl[ch]) ||
(block->channel_in_cpl[ch] && coord_diff[ch] > 0.03)) {
if (!block->channel_in_cpl[ch])
continue;
if (!block0->channel_in_cpl[ch]) {
block->new_cpl_coords[ch] = 1; block->new_cpl_coords[ch] = 1;
} else {
CoefSumType coord_diff = 0;
for (bnd = 0; bnd < s->num_cpl_bands; bnd++) {
coord_diff += fabs(cpl_coords[blk-1][ch][bnd] -
cpl_coords[blk ][ch][bnd]);
}
coord_diff /= s->num_cpl_bands;
if (coord_diff > 0.03)
block->new_cpl_coords[ch] = 1;
} }
} }
} }


Loading…
Cancel
Save