blob: c832adc9effa84f77f8fa0bd6b8780fa863106d4 [file]
/* ------------------------------------------------------------------
* Copyright (C) 1998-2009 PacketVideo
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied.
* See the License for the specific language governing permissions
* and limitations under the License.
* -------------------------------------------------------------------
*/
#include "oscl_types.h"
#include "sbc.h"
#include "sbc_encoder.h"
#include "scalefactors.h"
/*
===============================================================================
*
===============================================================================
*/
void compute_scalefactors(enc_state_t *state)
{
Int sb, blk; /* channel, subband, block and bit counters */
sbc_t *sbc = &state->sbc;
UWord32 tmp1, tmp2, tmp3, tmp4, *ptr1, *ptr3;
if (sbc->channels == 1)
{
ptr1 = &sbc->scale_factor[0][0];
for (sb = 0; sb < sbc->subbands; sb++)
{
tmp1 = 0;
tmp2 = 2;
for (blk = 0; blk < sbc->blocks ; blk += 4)
{
while (tmp2 <= (UWord32)(fabs(sbc->sb_sample[blk][0][sb]) >> 15))
{
tmp1++;
tmp2 <<= 1;
}
while (tmp2 <= (UWord32)(fabs(sbc->sb_sample[blk+1][0][sb]) >> 15))
{
tmp1++;
tmp2 <<= 1;
}
while (tmp2 <= (UWord32)(fabs(sbc->sb_sample[blk+2][0][sb]) >> 15))
{
tmp1++;
tmp2 <<= 1;
}
while (tmp2 <= (UWord32)(fabs(sbc->sb_sample[blk+3][0][sb]) >> 15))
{
tmp1++;
tmp2 <<= 1;
}
}
*ptr1++ = tmp1;
}
}
else
{
ptr1 = &sbc->scale_factor[0][0];
ptr3 = &sbc->scale_factor[1][0];
for (sb = 0; sb < sbc->subbands; sb++)
{
tmp1 = 0;
tmp2 = 2;
tmp3 = 0;
tmp4 = 2;
for (blk = 0; blk < sbc->blocks ; blk += 4)
{
while (tmp2 <= (UWord32)(fabs(sbc->sb_sample[blk][0][sb]) >> 15))
{
tmp1++;
tmp2 <<= 1;
}
while (tmp2 <= (UWord32)(fabs(sbc->sb_sample[blk+1][0][sb]) >> 15))
{
tmp1++;
tmp2 <<= 1;
}
while (tmp2 <= (UWord32)(fabs(sbc->sb_sample[blk+2][0][sb]) >> 15))
{
tmp1++;
tmp2 <<= 1;
}
while (tmp2 <= (UWord32)(fabs(sbc->sb_sample[blk+3][0][sb]) >> 15))
{
tmp1++;
tmp2 <<= 1;
}
while (tmp4 <= (UWord32)(fabs(sbc->sb_sample[blk][1][sb]) >> 15))
{
tmp3++;
tmp4 <<= 1;
}
while (tmp4 <= (UWord32)(fabs(sbc->sb_sample[blk+1][1][sb]) >> 15))
{
tmp3++;
tmp4 <<= 1;
}
while (tmp4 <= (UWord32)(fabs(sbc->sb_sample[blk+2][1][sb]) >> 15))
{
tmp3++;
tmp4 <<= 1;
}
while (tmp4 <= (UWord32)(fabs(sbc->sb_sample[blk+3][1][sb]) >> 15))
{
tmp3++;
tmp4 <<= 1;
}
}
*ptr1++ = tmp1;
*ptr3++ = tmp3;
}
}
/********************************************************************************/
//Optimized code
if (sbc->channel_mode == CM_JOINT_STEREO)
{
Int sb_sample_j_0[16], sb_sample_j_1[16];
UWord32 tmp1, tmp2, tmp3, tmp4;
Int *ptr1, *ptr2, tmp5, tmp6;
sbc->join = 0;
for (sb = 0; sb < sbc->subbands - 1; sb++)
{
tmp1 = 0;
tmp2 = 2;
tmp3 = 0;
tmp4 = 2;
ptr1 = &sb_sample_j_0[0];
ptr2 = &sb_sample_j_1[0];
for (blk = 0; blk < sbc->blocks; blk++)
{
tmp5 = (sbc->sb_sample[blk][0][sb] + sbc->sb_sample[blk][1][sb]) >> 1;
tmp6 = (sbc->sb_sample[blk][0][sb] - sbc->sb_sample[blk][1][sb]) >> 1 ;
while (tmp2 <= (UWord32)(fabs(tmp5) >> 15))
{
tmp1++;
tmp2 <<= 1;
}
while (tmp4 <= (UWord32)(fabs(tmp6) >> 15))
{
tmp3++;
tmp4 <<= 1;
}
*ptr1++ = tmp5;
*ptr2++ = tmp6;
}
ptr1 -= sbc->blocks;
ptr2 -= sbc->blocks;
if ((sbc->scale_factor[0][sb] + sbc->scale_factor[1][sb]) > (tmp1 + tmp3))
{
sbc->join |= 1 << sb;
sbc->scale_factor[0][sb] = tmp1;
sbc->scale_factor[1][sb] = tmp3;
for (blk = 0; blk < sbc->blocks ; blk += 2)
{
tmp2 = *ptr1++;
tmp4 = *ptr1++;
tmp5 = *ptr2++;
tmp6 = *ptr2++;
sbc->sb_sample[blk][0][sb] = tmp2;
sbc->sb_sample[blk][1][sb] = tmp5;
sbc->sb_sample[blk+1][0][sb] = tmp4;
sbc->sb_sample[blk+1][1][sb] = tmp6;
}
}
}
}
}