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