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