| @@ -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; | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||