Home | History | Annotate | Download | only in src
      1 /* ------------------------------------------------------------------
      2  * Copyright (C) 1998-2009 PacketVideo
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
     13  * express or implied.
     14  * See the License for the specific language governing permissions
     15  * and limitations under the License.
     16  * -------------------------------------------------------------------
     17  */
     18 #include "oscl_types.h"
     19 #include "sbc.h"
     20 #include "sbcenc_crc8.h"
     21 #include "oscl_mem.h"
     22 #include "sbcenc_filter.h"
     23 #include "sbc_encoder.h"
     24 #include "sbcenc_bitstream.h"
     25 
     26 
     27 Int pack_bitstream(UWord8 *data, enc_state_t *state, UInt len)
     28 {
     29     Int ch, sb, blk, tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, t_var1, t_var2, temp ;
     30     Int *ptr1, *ptr2, levels[16], audio_samp;
     31     sbc_t *sbc;
     32     crc_t *crc;
     33 
     34     sbc = &state->sbc;
     35     crc = &state->crc;
     36 
     37     oscl_memset(crc, 0, sizeof(crc_t));
     38     oscl_memset(data, 0, len);
     39 
     40     tmp0 = (sbc->sf_index << 6);
     41 
     42     switch (sbc->blocks)
     43     {
     44         case 8:
     45             tmp0 |= 16;
     46             break;
     47 
     48         case 12:
     49             tmp0 |= 32;
     50             break;
     51 
     52         case 16:
     53             tmp0 |= 48;
     54             break;
     55     }
     56 
     57     tmp0 |= (sbc->channel_mode & 0x03) << 2;
     58     tmp0 |= (sbc->allocation_method & 0x01) << 1;
     59     tmp2 = sbc->subbands;
     60 
     61     if (tmp2 == 8)
     62         tmp0 |= 0x01;
     63 
     64     data[0] = 0x9C;
     65     data[1] = tmp0;
     66     data[2] = sbc->bitpool;
     67     data[3] = 0x00;
     68 
     69     sbc->bitpointer = 32;
     70     crc->crc_buffer[0] = data[1];
     71     crc->crc_buffer[1] = data[2];
     72     crc->crc_consumed = 16;
     73 
     74     if (sbc->channel_mode == CM_JOINT_STEREO)
     75     {
     76         if ((len << 3) < (UInt)(32 + tmp2))
     77             return(-1);
     78         else
     79         {
     80             tmp0 = sbc->join;
     81             tmp1 = 0;
     82 
     83             for (sb = 0; sb < tmp2 - 1  ; sb ++)
     84                 tmp1 |= ((tmp0 >> sb) & 0x01) << (7 - sb);
     85 
     86             if (tmp2 == 4)
     87                 crc->crc_buffer[2] = tmp1 & 0xf0;
     88             else
     89                 crc->crc_buffer[2] = tmp1;
     90 
     91             sbc->bitpointer = tmp2 + 32;
     92             crc->crc_consumed += tmp2;
     93         }
     94 
     95         data[4] = tmp1;
     96     }
     97 
     98     tmp0 = crc->crc_consumed;
     99     tmp1 = sbc->bitpointer;
    100 
    101     if ((len << 3) < (UInt)(tmp1 + ((tmp2 * sbc->channels) << 2)))
    102         return -1;
    103     else
    104     {
    105         for (ch = 0; ch < sbc->channels; ch ++)
    106         {
    107             for (sb = 0; sb < tmp2; sb ++)
    108             {
    109                 tmp3 = sbc->scale_factor[ch][sb];
    110                 tmp3 &= 0x0f;
    111 
    112                 tmp4 = tmp1 & 0x07;
    113                 tmp4 = 4 - tmp4;
    114                 tmp4 = tmp3 << tmp4;
    115                 tmp5 = tmp1 >> 3;
    116                 data [tmp5] |= tmp4;
    117 
    118                 crc->crc_buffer[tmp0 >> 3] |= (tmp3 << (4 - (tmp0 & 0x07)));
    119 
    120                 tmp1 += 4;
    121                 tmp0 += 4;
    122             }
    123         }
    124     }
    125     sbc->bitpointer = tmp1;
    126     crc->crc_consumed = tmp0;
    127 
    128     data[3] = crc8(crc->crc_buffer, crc->crc_consumed);
    129 
    130     ptr1 = &levels[0];
    131     for (ch = 0; ch < sbc->channels; ch++)
    132     {
    133         ptr2 = &sbc->bits[ch][0];
    134 
    135         for (sb = (tmp2 >> 2); sb != 0 ; sb--)
    136         {
    137             tmp1 = *ptr2++;
    138             tmp3 = *ptr2++;
    139 
    140             *ptr1++ = (1 << tmp1) - 1;
    141             *ptr1++ = (1 << tmp3) - 1;
    142 
    143             tmp4 = *ptr2++;
    144             tmp5 = *ptr2++;
    145             *ptr1++ = (1 << tmp4) - 1;
    146             *ptr1++ = (1 << tmp5) - 1;
    147         }
    148     }
    149 
    150     t_var1 = sbc->bitpointer;
    151     for (blk = 0; blk < sbc->blocks; blk++)
    152     {
    153         ptr1 = &levels[0];
    154         for (ch = 0; ch < sbc->channels; ch++)
    155         {
    156             for (sb = 0; sb < sbc->subbands; sb++)
    157             {
    158                 tmp1 = *ptr1++;
    159 
    160                 if (tmp1 > 0)
    161                 {
    162                     //Changed the order of multiplication & right shifting
    163 
    164                     temp = (sbc->sb_sample[blk][ch][sb] >> 1);
    165                     tmp5 = (32768 << sbc->scale_factor[ch][sb]);
    166                     audio_samp = FMULT_2((temp + tmp5), tmp1) ;
    167                     audio_samp = audio_samp >> sbc->scale_factor[ch][sb] ;
    168 
    169                     t_var2 = sbc->bits[ch][sb];
    170 
    171                     if (8 - (t_var1 & 0x7) >= t_var2)
    172                     {
    173                         data[t_var1 >> 3] |= audio_samp << (8 - (t_var1 & 0x7) - t_var2);
    174                         t_var1 += t_var2;
    175                     }
    176                     else if (16 - (t_var1 & 0x7) >= t_var2)
    177                     {
    178                         data[t_var1 >> 3] |= audio_samp >> (t_var2 + (t_var1 & 0x7) - 8);
    179                         data[(t_var1 >> 3) + 1] = audio_samp << (16 - (t_var1 & 0x7) - t_var2);
    180                         t_var1 += t_var2;
    181                     }
    182                     else
    183                     {
    184                         data[t_var1 >> 3] |= audio_samp >> (t_var2 + (t_var1 & 0x7) - 8);
    185                         data[(t_var1 >> 3) + 1] = (audio_samp >> ((t_var1 & 0x7) + t_var2 - 16)) & 0xff;
    186                         data[(t_var1 >> 3) + 2] = audio_samp << (24 - (t_var1 & 0x7) - t_var2);
    187                         t_var1 += t_var2;
    188                     }
    189                 }
    190             }
    191         }
    192     }
    193 
    194     if (t_var1 & 0x7)
    195         t_var1 += 8 - (t_var1 & 0x7);
    196 
    197     sbc->bitpointer = t_var1;
    198 
    199     return(sbc->bitpointer >> 3);
    200 }
    201