rework joint subband test--uses a lot less stack space, simplify multiple

loops into one, unroll one tiny loop
This commit is contained in:
Brad Midgley 2007-11-27 02:42:29 +00:00
parent 7e88afe4f8
commit 75d93a3225

View File

@ -1071,52 +1071,56 @@ static int sbc_pack_frame(uint8_t *data, struct sbc_frame *frame, size_t len)
if (frame->channel_mode == JOINT_STEREO) {
/* like frame->sb_sample but joint stereo */
int32_t sb_sample_j[16][2][7];
int32_t sb_sample_j[16][2];
/* scalefactor and scale_factor in joint case */
int scalefactor_j[2][7], scale_factor_j[2][7];
u_int32_t scalefactor_j[2];
uint8_t scale_factor_j[2];
frame->join = 0;
/* Calculate joint stereo signal */
for (sb = 0; sb < frame->subbands - 1; sb++) {
/* Calculate joint stereo signal */
for (blk = 0; blk < frame->blocks; blk++) {
sb_sample_j[blk][0][sb] =
sb_sample_j[blk][0] =
(frame->sb_sample_f[blk][0][sb] +
frame->sb_sample_f[blk][1][sb]) >> 1;
sb_sample_j[blk][1][sb] =
sb_sample_j[blk][1] =
(frame->sb_sample_f[blk][0][sb] -
frame->sb_sample_f[blk][1][sb]) >> 1;
}
}
/* calculate scale_factor_j and scalefactor_j for joint case */
for (ch = 0; ch < 2; ch++) {
for (sb = 0; sb < frame->subbands - 1; sb++) {
scale_factor_j[ch][sb] = 0;
scalefactor_j[ch][sb] = 2;
for (blk = 0; blk < frame->blocks; blk++) {
while (scalefactor_j[ch][sb] < fabs(sb_sample_j[blk][ch][sb])) {
scale_factor_j[ch][sb]++;
scalefactor_j[ch][sb] *= 2;
}
/* calculate scale_factor_j and scalefactor_j for joint case */
scale_factor_j[0] = 0;
scalefactor_j[0] = 2;
for (blk = 0; blk < frame->blocks; blk++) {
while (scalefactor_j[0] < fabs(sb_sample_j[blk][0])) {
scale_factor_j[0]++;
scalefactor_j[0] *= 2;
}
}
scale_factor_j[1] = 0;
scalefactor_j[1] = 2;
for (blk = 0; blk < frame->blocks; blk++) {
while (scalefactor_j[1] < fabs(sb_sample_j[blk][1])) {
scale_factor_j[1]++;
scalefactor_j[1] *= 2;
}
}
}
/* decide which subbands to join */
frame->join = 0;
for (sb = 0; sb < frame->subbands - 1; sb++) {
/* decide whether to join this subband */
if ((scalefactor[0][sb] + scalefactor[1][sb]) >
(scalefactor_j[0][sb] + scalefactor_j[1][sb]) ) {
(scalefactor_j[0] + scalefactor_j[1]) ) {
/* use joint stereo for this subband */
frame->join |= 1 << sb;
frame->scale_factor[0][sb] = scale_factor_j[0][sb];
frame->scale_factor[1][sb] = scale_factor_j[1][sb];
scalefactor[0][sb] = scalefactor_j[0][sb];
scalefactor[1][sb] = scalefactor_j[1][sb];
frame->scale_factor[0][sb] = scale_factor_j[0];
frame->scale_factor[1][sb] = scale_factor_j[1];
scalefactor[0][sb] = scalefactor_j[0];
scalefactor[1][sb] = scalefactor_j[1];
for (blk = 0; blk < frame->blocks; blk++) {
frame->sb_sample_f[blk][0][sb] =
sb_sample_j[blk][0][sb];
sb_sample_j[blk][0];
frame->sb_sample_f[blk][1][sb] =
sb_sample_j[blk][1][sb];
sb_sample_j[blk][1];
}
}
}