1e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* 2e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Copyright 2003-2010, VisualOn, Inc. 3e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** 4e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Licensed under the Apache License, Version 2.0 (the "License"); 5e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** you may not use this file except in compliance with the License. 6e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** You may obtain a copy of the License at 7e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** 8e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** http://www.apache.org/licenses/LICENSE-2.0 9e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** 10e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Unless required by applicable law or agreed to in writing, software 11e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** distributed under the License is distributed on an "AS IS" BASIS, 12e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** See the License for the specific language governing permissions and 14e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** limitations under the License. 15e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard */ 16e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 17e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*********************************************************************** 18e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard File: bits.c 19e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 20e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Description: Performs bit stream manipulation 21e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 22e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard************************************************************************/ 23e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 24e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include <stdlib.h> 25e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include <stdio.h> 26e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "typedef.h" 27e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "basic_op.h" 28e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "cnst.h" 29e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "bits.h" 30e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "acelp.h" 31e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "dtx.h" 32e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "mime_io.tab" 33e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 34e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 35e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardint PackBits(Word16 prms[], /* i: analysis parameters */ 36e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 coding_mode, /* i: coding bit-stream ratio mode */ 37b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard Word16 mode, /* i: coding bit-stream ratio mode*/ 38b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard Coder_State *st /*i/o: coder global parameters struct */ 39e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ) 40e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 41e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 i, frame_type; 42e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard UWord8 temp; 43e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard UWord8 *stream_ptr; 44e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 bitstreamformat = st->frameType; 45e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 46e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard unsigned short* dataOut = st->outputStream; 47e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 48e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (coding_mode == MRDTX) 49b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard { 50e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard st->sid_update_counter--; 51e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 52e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (st->prev_ft == TX_SPEECH) 53e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 54e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard frame_type = TX_SID_FIRST; 55e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard st->sid_update_counter = 3; 56e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } else 57e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 58e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if ((st->sid_handover_debt > 0) && (st->sid_update_counter > 2)) 59e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 60e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* ensure extra updates are properly delayed after a possible SID_FIRST */ 61e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard frame_type = TX_SID_UPDATE; 62e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard st->sid_handover_debt--; 63e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } else 64e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 65e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (st->sid_update_counter == 0) 66e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 67e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard frame_type = TX_SID_UPDATE; 68e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard st->sid_update_counter = 8; 69e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } else 70e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 71e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard frame_type = TX_NO_DATA; 72e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 73e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 74e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 75e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } else 76e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 77e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard st->sid_update_counter = 8; 78e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard frame_type = TX_SPEECH; 79e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 80e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard st->prev_ft = frame_type; 81e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 82e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if(bitstreamformat == 0) /* default file format */ 83e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 84e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *(dataOut) = TX_FRAME_TYPE; 85e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *(dataOut + 1) = frame_type; 86e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *(dataOut + 2) = mode; 87e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < nb_of_bits[coding_mode]; i++) 88e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 89e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *(dataOut + 3 + i) = prms[i]; 90e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 91e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (3 + nb_of_bits[coding_mode])<<1; 92e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } else 93e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 94e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (bitstreamformat == 1) /* ITU file format */ 95b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard { 96e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *(dataOut) = 0x6b21; 97e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if(frame_type != TX_NO_DATA && frame_type != TX_SID_FIRST) 98e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 99e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *(dataOut + 1) = nb_of_bits[coding_mode]; 100e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < nb_of_bits[coding_mode]; i++) 101e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 102e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if(prms[i] == BIT_0){ 103b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard *(dataOut + 2 + i) = BIT_0_ITU; 104e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 105e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else{ 106e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *(dataOut + 2 + i) = BIT_1_ITU; 107e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 108e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 109b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard return (2 + nb_of_bits[coding_mode])<<1; 110e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } else 111e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 112e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *(dataOut + 1) = 0; 113b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard return 2<<1; 114e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 115e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } else /* MIME/storage file format */ 116e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 117e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define MRSID 9 118e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* change mode index in case of SID frame */ 119e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (coding_mode == MRDTX) 120e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 121e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard coding_mode = MRSID; 122e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (frame_type == TX_SID_FIRST) 123e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 124e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < NBBITS_SID; i++) prms[i] = BIT_0; 125e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 126e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 127e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* -> force NO_DATA frame */ 128e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (coding_mode < 0 || coding_mode > 15 || (coding_mode > MRSID && coding_mode < 14)) 129e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 130e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard coding_mode = 15; 131e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 132e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* mark empty frames between SID updates as NO_DATA frames */ 133e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (coding_mode == MRSID && frame_type == TX_NO_DATA) 134e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 135e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard coding_mode = 15; 136e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 137e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* set pointer for packed frame, note that we handle data as bytes */ 138e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard stream_ptr = (UWord8*)dataOut; 139e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* insert table of contents (ToC) byte at the beginning of the packet */ 140e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *stream_ptr = toc_byte[coding_mode]; 141e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard stream_ptr++; 142e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard temp = 0; 143e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* sort and pack AMR-WB speech or SID bits */ 144e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 1; i < unpacked_size[coding_mode] + 1; i++) 145e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 146e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (prms[sort_ptr[coding_mode][i-1]] == BIT_1) 147e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 148e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard temp++; 149e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 150e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (i&0x7) 151e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 152e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard temp <<= 1; 153e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 154e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else 155e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 156e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *stream_ptr = temp; 157e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard stream_ptr++; 158e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard temp = 0; 159e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 160e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 161e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* insert SID type indication and speech mode in case of SID frame */ 162e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (coding_mode == MRSID) 163e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 164e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (frame_type == TX_SID_UPDATE) 165e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 166e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard temp++; 167e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 168e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard temp <<= 4; 169e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard temp += mode & 0x000F; 170e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 171e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* insert unused bits (zeros) at the tail of the last byte */ 172e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (unused_size[coding_mode]) 173e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 174e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard temp <<= (unused_size[coding_mode] - 1); 175e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 176e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *stream_ptr = temp; 177e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* write packed frame into file (1 byte added to cover ToC entry) */ 178e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return (1 + packed_size[coding_mode]); 179e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 180e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 181e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 182e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 183e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*-----------------------------------------------------* 184e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Parm_serial -> convert parameters to serial stream * 185e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*-----------------------------------------------------*/ 186e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 187e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid Parm_serial( 188e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 value, /* input : parameter value */ 189e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 no_of_bits, /* input : number of bits */ 190e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 ** prms 191e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ) 192e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 193e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 i, bit; 194b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard *prms += no_of_bits; 195e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < no_of_bits; i++) 196e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 197e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard bit = (Word16) (value & 0x0001); /* get lsb */ 198e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (bit == 0) 199e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *--(*prms) = BIT_0; 200e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard else 201e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *--(*prms) = BIT_1; 202b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard value >>= 1; 203e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 204b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard *prms += no_of_bits; 205e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return; 206e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 207e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 208e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 209e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 210e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 211