1 /* 2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 /****************************************************************** 12 13 iLBC Speech Coder ANSI-C Source Code 14 15 WebRtcIlbcfix_PackBits.c 16 17 ******************************************************************/ 18 19 #include "modules/audio_coding/codecs/ilbc/defines.h" 20 21 /*----------------------------------------------------------------* 22 * unpacking of bits from bitstream, i.e., vector of bytes 23 *---------------------------------------------------------------*/ 24 WebRtcIlbcfix_PackBits(uint16_t * bitstream,iLBC_bits * enc_bits,int16_t mode)25void WebRtcIlbcfix_PackBits( 26 uint16_t *bitstream, /* (o) The packetized bitstream */ 27 iLBC_bits *enc_bits, /* (i) Encoded bits */ 28 int16_t mode /* (i) Codec mode (20 or 30) */ 29 ){ 30 uint16_t *bitstreamPtr; 31 int i, k; 32 int16_t *tmpPtr; 33 34 bitstreamPtr=bitstream; 35 36 /* Class 1 bits of ULP */ 37 /* First int16_t */ 38 (*bitstreamPtr) = ((uint16_t)enc_bits->lsf[0])<<10; /* Bit 0..5 */ 39 (*bitstreamPtr) |= (enc_bits->lsf[1])<<3; /* Bit 6..12 */ 40 (*bitstreamPtr) |= (enc_bits->lsf[2]&0x70)>>4; /* Bit 13..15 */ 41 bitstreamPtr++; 42 /* Second int16_t */ 43 (*bitstreamPtr) = ((uint16_t)enc_bits->lsf[2]&0xF)<<12; /* Bit 0..3 */ 44 45 if (mode==20) { 46 (*bitstreamPtr) |= (enc_bits->startIdx)<<10; /* Bit 4..5 */ 47 (*bitstreamPtr) |= (enc_bits->state_first)<<9; /* Bit 6 */ 48 (*bitstreamPtr) |= (enc_bits->idxForMax)<<3; /* Bit 7..12 */ 49 (*bitstreamPtr) |= ((enc_bits->cb_index[0])&0x70)>>4; /* Bit 13..15 */ 50 bitstreamPtr++; 51 /* Third int16_t */ 52 (*bitstreamPtr) = ((enc_bits->cb_index[0])&0xE)<<12; /* Bit 0..2 */ 53 (*bitstreamPtr) |= ((enc_bits->gain_index[0])&0x18)<<8; /* Bit 3..4 */ 54 (*bitstreamPtr) |= ((enc_bits->gain_index[1])&0x8)<<7; /* Bit 5 */ 55 (*bitstreamPtr) |= ((enc_bits->cb_index[3])&0xFE)<<2; /* Bit 6..12 */ 56 (*bitstreamPtr) |= ((enc_bits->gain_index[3])&0x10)>>2; /* Bit 13 */ 57 (*bitstreamPtr) |= ((enc_bits->gain_index[4])&0x8)>>2; /* Bit 14 */ 58 (*bitstreamPtr) |= ((enc_bits->gain_index[6])&0x10)>>4; /* Bit 15 */ 59 } else { /* mode==30 */ 60 (*bitstreamPtr) |= (enc_bits->lsf[3])<<6; /* Bit 4..9 */ 61 (*bitstreamPtr) |= (enc_bits->lsf[4]&0x7E)>>1; /* Bit 10..15 */ 62 bitstreamPtr++; 63 /* Third int16_t */ 64 (*bitstreamPtr) = ((uint16_t)enc_bits->lsf[4]&0x1)<<15; /* Bit 0 */ 65 (*bitstreamPtr) |= (enc_bits->lsf[5])<<8; /* Bit 1..7 */ 66 (*bitstreamPtr) |= (enc_bits->startIdx)<<5; /* Bit 8..10 */ 67 (*bitstreamPtr) |= (enc_bits->state_first)<<4; /* Bit 11 */ 68 (*bitstreamPtr) |= ((enc_bits->idxForMax)&0x3C)>>2; /* Bit 12..15 */ 69 bitstreamPtr++; 70 /* 4:th int16_t */ 71 (*bitstreamPtr) = ((uint16_t)enc_bits->idxForMax&0x3)<<14; /* Bit 0..1 */ 72 (*bitstreamPtr) |= (enc_bits->cb_index[0]&0x78)<<7; /* Bit 2..5 */ 73 (*bitstreamPtr) |= (enc_bits->gain_index[0]&0x10)<<5; /* Bit 6 */ 74 (*bitstreamPtr) |= (enc_bits->gain_index[1]&0x8)<<5; /* Bit 7 */ 75 (*bitstreamPtr) |= (enc_bits->cb_index[3]&0xFC); /* Bit 8..13 */ 76 (*bitstreamPtr) |= (enc_bits->gain_index[3]&0x10)>>3; /* Bit 14 */ 77 (*bitstreamPtr) |= (enc_bits->gain_index[4]&0x8)>>3; /* Bit 15 */ 78 } 79 /* Class 2 bits of ULP */ 80 /* 4:th to 6:th int16_t for 20 ms case 81 5:th to 7:th int16_t for 30 ms case */ 82 bitstreamPtr++; 83 tmpPtr=enc_bits->idxVec; 84 for (k=0; k<3; k++) { 85 (*bitstreamPtr) = 0; 86 for (i=15; i>=0; i--) { 87 (*bitstreamPtr) |= ((uint16_t)((*tmpPtr)&0x4)>>2)<<i; 88 /* Bit 15-i */ 89 tmpPtr++; 90 } 91 bitstreamPtr++; 92 } 93 94 if (mode==20) { 95 /* 7:th int16_t */ 96 (*bitstreamPtr) = 0; 97 for (i=15; i>6; i--) { 98 (*bitstreamPtr) |= ((uint16_t)((*tmpPtr)&0x4)>>2)<<i; 99 /* Bit 15-i */ 100 tmpPtr++; 101 } 102 (*bitstreamPtr) |= (enc_bits->gain_index[1]&0x4)<<4; /* Bit 9 */ 103 (*bitstreamPtr) |= (enc_bits->gain_index[3]&0xC)<<2; /* Bit 10..11 */ 104 (*bitstreamPtr) |= (enc_bits->gain_index[4]&0x4)<<1; /* Bit 12 */ 105 (*bitstreamPtr) |= (enc_bits->gain_index[6]&0x8)>>1; /* Bit 13 */ 106 (*bitstreamPtr) |= (enc_bits->gain_index[7]&0xC)>>2; /* Bit 14..15 */ 107 108 } else { /* mode==30 */ 109 /* 8:th int16_t */ 110 (*bitstreamPtr) = 0; 111 for (i=15; i>5; i--) { 112 (*bitstreamPtr) |= ((uint16_t)((*tmpPtr)&0x4)>>2)<<i; 113 /* Bit 15-i */ 114 tmpPtr++; 115 } 116 (*bitstreamPtr) |= (enc_bits->cb_index[0]&0x6)<<3; /* Bit 10..11 */ 117 (*bitstreamPtr) |= (enc_bits->gain_index[0]&0x8); /* Bit 12 */ 118 (*bitstreamPtr) |= (enc_bits->gain_index[1]&0x4); /* Bit 13 */ 119 (*bitstreamPtr) |= (enc_bits->cb_index[3]&0x2); /* Bit 14 */ 120 (*bitstreamPtr) |= (enc_bits->cb_index[6]&0x80)>>7; /* Bit 15 */ 121 bitstreamPtr++; 122 /* 9:th int16_t */ 123 (*bitstreamPtr) = ((uint16_t)enc_bits->cb_index[6]&0x7E)<<9;/* Bit 0..5 */ 124 (*bitstreamPtr) |= (enc_bits->cb_index[9]&0xFE)<<2; /* Bit 6..12 */ 125 (*bitstreamPtr) |= (enc_bits->cb_index[12]&0xE0)>>5; /* Bit 13..15 */ 126 bitstreamPtr++; 127 /* 10:th int16_t */ 128 (*bitstreamPtr) = ((uint16_t)enc_bits->cb_index[12]&0x1E)<<11;/* Bit 0..3 */ 129 (*bitstreamPtr) |= (enc_bits->gain_index[3]&0xC)<<8; /* Bit 4..5 */ 130 (*bitstreamPtr) |= (enc_bits->gain_index[4]&0x6)<<7; /* Bit 6..7 */ 131 (*bitstreamPtr) |= (enc_bits->gain_index[6]&0x18)<<3; /* Bit 8..9 */ 132 (*bitstreamPtr) |= (enc_bits->gain_index[7]&0xC)<<2; /* Bit 10..11 */ 133 (*bitstreamPtr) |= (enc_bits->gain_index[9]&0x10)>>1; /* Bit 12 */ 134 (*bitstreamPtr) |= (enc_bits->gain_index[10]&0x8)>>1; /* Bit 13 */ 135 (*bitstreamPtr) |= (enc_bits->gain_index[12]&0x10)>>3; /* Bit 14 */ 136 (*bitstreamPtr) |= (enc_bits->gain_index[13]&0x8)>>3; /* Bit 15 */ 137 } 138 bitstreamPtr++; 139 /* Class 3 bits of ULP */ 140 /* 8:th to 14:th int16_t for 20 ms case 141 11:th to 17:th int16_t for 30 ms case */ 142 tmpPtr=enc_bits->idxVec; 143 for (k=0; k<7; k++) { 144 (*bitstreamPtr) = 0; 145 for (i=14; i>=0; i-=2) { 146 (*bitstreamPtr) |= ((uint16_t)((*tmpPtr)&0x3))<<i; /* Bit 15-i..14-i*/ 147 tmpPtr++; 148 } 149 bitstreamPtr++; 150 } 151 152 if (mode==20) { 153 /* 15:th int16_t */ 154 (*bitstreamPtr) = ((uint16_t)((enc_bits->idxVec[56])&0x3))<<14;/* Bit 0..1 */ 155 (*bitstreamPtr) |= (((enc_bits->cb_index[0])&1))<<13; /* Bit 2 */ 156 (*bitstreamPtr) |= ((enc_bits->cb_index[1]))<<6; /* Bit 3..9 */ 157 (*bitstreamPtr) |= ((enc_bits->cb_index[2])&0x7E)>>1; /* Bit 10..15 */ 158 bitstreamPtr++; 159 /* 16:th int16_t */ 160 (*bitstreamPtr) = ((uint16_t)((enc_bits->cb_index[2])&0x1))<<15; 161 /* Bit 0 */ 162 (*bitstreamPtr) |= ((enc_bits->gain_index[0])&0x7)<<12; /* Bit 1..3 */ 163 (*bitstreamPtr) |= ((enc_bits->gain_index[1])&0x3)<<10; /* Bit 4..5 */ 164 (*bitstreamPtr) |= ((enc_bits->gain_index[2]))<<7; /* Bit 6..8 */ 165 (*bitstreamPtr) |= ((enc_bits->cb_index[3])&0x1)<<6; /* Bit 9 */ 166 (*bitstreamPtr) |= ((enc_bits->cb_index[4])&0x7E)>>1; /* Bit 10..15 */ 167 bitstreamPtr++; 168 /* 17:th int16_t */ 169 (*bitstreamPtr) = ((uint16_t)((enc_bits->cb_index[4])&0x1))<<15; 170 /* Bit 0 */ 171 (*bitstreamPtr) |= (enc_bits->cb_index[5])<<8; /* Bit 1..7 */ 172 (*bitstreamPtr) |= (enc_bits->cb_index[6]); /* Bit 8..15 */ 173 bitstreamPtr++; 174 /* 18:th int16_t */ 175 (*bitstreamPtr) = ((uint16_t)(enc_bits->cb_index[7]))<<8; /* Bit 0..7 */ 176 (*bitstreamPtr) |= (enc_bits->cb_index[8]); /* Bit 8..15 */ 177 bitstreamPtr++; 178 /* 19:th int16_t */ 179 (*bitstreamPtr) = ((uint16_t)((enc_bits->gain_index[3])&0x3))<<14; 180 /* Bit 0..1 */ 181 (*bitstreamPtr) |= ((enc_bits->gain_index[4])&0x3)<<12; /* Bit 2..3 */ 182 (*bitstreamPtr) |= ((enc_bits->gain_index[5]))<<9; /* Bit 4..6 */ 183 (*bitstreamPtr) |= ((enc_bits->gain_index[6])&0x7)<<6; /* Bit 7..9 */ 184 (*bitstreamPtr) |= ((enc_bits->gain_index[7])&0x3)<<4; /* Bit 10..11 */ 185 (*bitstreamPtr) |= (enc_bits->gain_index[8])<<1; /* Bit 12..14 */ 186 } else { /* mode==30 */ 187 /* 18:th int16_t */ 188 (*bitstreamPtr) = ((uint16_t)((enc_bits->idxVec[56])&0x3))<<14;/* Bit 0..1 */ 189 (*bitstreamPtr) |= (((enc_bits->idxVec[57])&0x3))<<12; /* Bit 2..3 */ 190 (*bitstreamPtr) |= (((enc_bits->cb_index[0])&1))<<11; /* Bit 4 */ 191 (*bitstreamPtr) |= ((enc_bits->cb_index[1]))<<4; /* Bit 5..11 */ 192 (*bitstreamPtr) |= ((enc_bits->cb_index[2])&0x78)>>3; /* Bit 12..15 */ 193 bitstreamPtr++; 194 /* 19:th int16_t */ 195 (*bitstreamPtr) = ((uint16_t)(enc_bits->cb_index[2])&0x7)<<13; 196 /* Bit 0..2 */ 197 (*bitstreamPtr) |= ((enc_bits->gain_index[0])&0x7)<<10; /* Bit 3..5 */ 198 (*bitstreamPtr) |= ((enc_bits->gain_index[1])&0x3)<<8; /* Bit 6..7 */ 199 (*bitstreamPtr) |= ((enc_bits->gain_index[2])&0x7)<<5; /* Bit 8..10 */ 200 (*bitstreamPtr) |= ((enc_bits->cb_index[3])&0x1)<<4; /* Bit 11 */ 201 (*bitstreamPtr) |= ((enc_bits->cb_index[4])&0x78)>>3; /* Bit 12..15 */ 202 bitstreamPtr++; 203 /* 20:th int16_t */ 204 (*bitstreamPtr) = ((uint16_t)(enc_bits->cb_index[4])&0x7)<<13; 205 /* Bit 0..2 */ 206 (*bitstreamPtr) |= ((enc_bits->cb_index[5]))<<6; /* Bit 3..9 */ 207 (*bitstreamPtr) |= ((enc_bits->cb_index[6])&0x1)<<5; /* Bit 10 */ 208 (*bitstreamPtr) |= ((enc_bits->cb_index[7])&0xF8)>>3; /* Bit 11..15 */ 209 bitstreamPtr++; 210 /* 21:st int16_t */ 211 (*bitstreamPtr) = ((uint16_t)(enc_bits->cb_index[7])&0x7)<<13; 212 /* Bit 0..2 */ 213 (*bitstreamPtr) |= ((enc_bits->cb_index[8]))<<5; /* Bit 3..10 */ 214 (*bitstreamPtr) |= ((enc_bits->cb_index[9])&0x1)<<4; /* Bit 11 */ 215 (*bitstreamPtr) |= ((enc_bits->cb_index[10])&0xF0)>>4; /* Bit 12..15 */ 216 bitstreamPtr++; 217 /* 22:nd int16_t */ 218 (*bitstreamPtr) = ((uint16_t)(enc_bits->cb_index[10])&0xF)<<12; 219 /* Bit 0..3 */ 220 (*bitstreamPtr) |= ((enc_bits->cb_index[11]))<<4; /* Bit 4..11 */ 221 (*bitstreamPtr) |= ((enc_bits->cb_index[12])&0x1)<<3; /* Bit 12 */ 222 (*bitstreamPtr) |= ((enc_bits->cb_index[13])&0xE0)>>5; /* Bit 13..15 */ 223 bitstreamPtr++; 224 /* 23:rd int16_t */ 225 (*bitstreamPtr) = ((uint16_t)(enc_bits->cb_index[13])&0x1F)<<11; 226 /* Bit 0..4 */ 227 (*bitstreamPtr) |= ((enc_bits->cb_index[14]))<<3; /* Bit 5..12 */ 228 (*bitstreamPtr) |= ((enc_bits->gain_index[3])&0x3)<<1; /* Bit 13..14 */ 229 (*bitstreamPtr) |= ((enc_bits->gain_index[4])&0x1); /* Bit 15 */ 230 bitstreamPtr++; 231 /* 24:rd int16_t */ 232 (*bitstreamPtr) = ((uint16_t)(enc_bits->gain_index[5]))<<13; 233 /* Bit 0..2 */ 234 (*bitstreamPtr) |= ((enc_bits->gain_index[6])&0x7)<<10; /* Bit 3..5 */ 235 (*bitstreamPtr) |= ((enc_bits->gain_index[7])&0x3)<<8; /* Bit 6..7 */ 236 (*bitstreamPtr) |= ((enc_bits->gain_index[8]))<<5; /* Bit 8..10 */ 237 (*bitstreamPtr) |= ((enc_bits->gain_index[9])&0xF)<<1; /* Bit 11..14 */ 238 (*bitstreamPtr) |= ((enc_bits->gain_index[10])&0x4)>>2; /* Bit 15 */ 239 bitstreamPtr++; 240 /* 25:rd int16_t */ 241 (*bitstreamPtr) = ((uint16_t)(enc_bits->gain_index[10])&0x3)<<14; 242 /* Bit 0..1 */ 243 (*bitstreamPtr) |= ((enc_bits->gain_index[11]))<<11; /* Bit 2..4 */ 244 (*bitstreamPtr) |= ((enc_bits->gain_index[12])&0xF)<<7; /* Bit 5..8 */ 245 (*bitstreamPtr) |= ((enc_bits->gain_index[13])&0x7)<<4; /* Bit 9..11 */ 246 (*bitstreamPtr) |= ((enc_bits->gain_index[14]))<<1; /* Bit 12..14 */ 247 } 248 /* Last bit is automatically zero */ 249 250 return; 251 } 252