aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec
diff options
context:
space:
mode:
authorJustin Ruggles <justin.ruggles@gmail.com>2011-08-05 17:34:53 -0400
committerJustin Ruggles <justin.ruggles@gmail.com>2011-08-09 16:44:34 -0400
commitfce33f9ead3cff5640828eff5b0faff6025acc40 (patch)
treec1caae9b4ac47d3e484cf4bef6a457be6122beda /libavcodec
parentc3d63262fe61a8e219c4b69c61af6e0c9d49be2d (diff)
downloadffmpeg-fce33f9ead3cff5640828eff5b0faff6025acc40.tar.gz
ac3enc: restructure coupling coordinate reuse calculation
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/ac3enc_template.c48
1 files changed, 27 insertions, 21 deletions
diff --git a/libavcodec/ac3enc_template.c b/libavcodec/ac3enc_template.c
index 4b0c768e63..8960124bc6 100644
--- a/libavcodec/ac3enc_template.c
+++ b/libavcodec/ac3enc_template.c
@@ -202,33 +202,29 @@ static void apply_channel_coupling(AC3EncodeContext *s)
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 */
for (blk = 0; blk < s->num_blocks; blk++) {
AC3Block *block = &s->blocks[blk];
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));
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
* block did not use coupling but this block does, the channels
* 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;
} else {
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;
+ } 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;
}
}
}