/* | |
** Copyright 2003-2010, VisualOn, Inc. | |
** | |
** Licensed under the Apache License, Version 2.0 (the "License"); | |
** you may not use this file except in compliance with the License. | |
** You may obtain a copy of the License at | |
** | |
** http://www.apache.org/licenses/LICENSE-2.0 | |
** | |
** Unless required by applicable law or agreed to in writing, software | |
** distributed under the License is distributed on an "AS IS" BASIS, | |
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
** See the License for the specific language governing permissions and | |
** limitations under the License. | |
*/ | |
/*********************************************************************** | |
File: bits.c | |
Description: Performs bit stream manipulation | |
************************************************************************/ | |
#include <stdlib.h> | |
#include <stdio.h> | |
#include "typedef.h" | |
#include "basic_op.h" | |
#include "cnst.h" | |
#include "bits.h" | |
#include "acelp.h" | |
#include "dtx.h" | |
#include "mime_io.tab" | |
int PackBits(Word16 prms[], /* i: analysis parameters */ | |
Word16 coding_mode, /* i: coding bit-stream ratio mode */ | |
Word16 mode, /* i: coding bit-stream ratio mode*/ | |
Coder_State *st /*i/o: coder global parameters struct */ | |
) | |
{ | |
Word16 i, frame_type; | |
UWord8 temp; | |
UWord8 *stream_ptr; | |
Word16 bitstreamformat = st->frameType; | |
unsigned short* dataOut = st->outputStream; | |
if (coding_mode == MRDTX) | |
{ | |
st->sid_update_counter--; | |
if (st->prev_ft == TX_SPEECH) | |
{ | |
frame_type = TX_SID_FIRST; | |
st->sid_update_counter = 3; | |
} else | |
{ | |
if ((st->sid_handover_debt > 0) && (st->sid_update_counter > 2)) | |
{ | |
/* ensure extra updates are properly delayed after a possible SID_FIRST */ | |
frame_type = TX_SID_UPDATE; | |
st->sid_handover_debt--; | |
} else | |
{ | |
if (st->sid_update_counter == 0) | |
{ | |
frame_type = TX_SID_UPDATE; | |
st->sid_update_counter = 8; | |
} else | |
{ | |
frame_type = TX_NO_DATA; | |
} | |
} | |
} | |
} else | |
{ | |
st->sid_update_counter = 8; | |
frame_type = TX_SPEECH; | |
} | |
st->prev_ft = frame_type; | |
if(bitstreamformat == 0) /* default file format */ | |
{ | |
*(dataOut) = TX_FRAME_TYPE; | |
*(dataOut + 1) = frame_type; | |
*(dataOut + 2) = mode; | |
for (i = 0; i < nb_of_bits[coding_mode]; i++) | |
{ | |
*(dataOut + 3 + i) = prms[i]; | |
} | |
return (3 + nb_of_bits[coding_mode])<<1; | |
} else | |
{ | |
if (bitstreamformat == 1) /* ITU file format */ | |
{ | |
*(dataOut) = 0x6b21; | |
if(frame_type != TX_NO_DATA && frame_type != TX_SID_FIRST) | |
{ | |
*(dataOut + 1) = nb_of_bits[coding_mode]; | |
for (i = 0; i < nb_of_bits[coding_mode]; i++) | |
{ | |
if(prms[i] == BIT_0){ | |
*(dataOut + 2 + i) = BIT_0_ITU; | |
} | |
else{ | |
*(dataOut + 2 + i) = BIT_1_ITU; | |
} | |
} | |
return (2 + nb_of_bits[coding_mode])<<1; | |
} else | |
{ | |
*(dataOut + 1) = 0; | |
return 2<<1; | |
} | |
} else /* MIME/storage file format */ | |
{ | |
#define MRSID 9 | |
/* change mode index in case of SID frame */ | |
if (coding_mode == MRDTX) | |
{ | |
coding_mode = MRSID; | |
if (frame_type == TX_SID_FIRST) | |
{ | |
for (i = 0; i < NBBITS_SID; i++) prms[i] = BIT_0; | |
} | |
} | |
/* -> force NO_DATA frame */ | |
if (coding_mode < 0 || coding_mode > 15 || (coding_mode > MRSID && coding_mode < 14)) | |
{ | |
coding_mode = 15; | |
} | |
/* mark empty frames between SID updates as NO_DATA frames */ | |
if (coding_mode == MRSID && frame_type == TX_NO_DATA) | |
{ | |
coding_mode = 15; | |
} | |
/* set pointer for packed frame, note that we handle data as bytes */ | |
stream_ptr = (UWord8*)dataOut; | |
/* insert table of contents (ToC) byte at the beginning of the packet */ | |
*stream_ptr = toc_byte[coding_mode]; | |
stream_ptr++; | |
temp = 0; | |
/* sort and pack AMR-WB speech or SID bits */ | |
for (i = 1; i < unpacked_size[coding_mode] + 1; i++) | |
{ | |
if (prms[sort_ptr[coding_mode][i-1]] == BIT_1) | |
{ | |
temp++; | |
} | |
if (i&0x7) | |
{ | |
temp <<= 1; | |
} | |
else | |
{ | |
*stream_ptr = temp; | |
stream_ptr++; | |
temp = 0; | |
} | |
} | |
/* insert SID type indication and speech mode in case of SID frame */ | |
if (coding_mode == MRSID) | |
{ | |
if (frame_type == TX_SID_UPDATE) | |
{ | |
temp++; | |
} | |
temp <<= 4; | |
temp += mode & 0x000F; | |
} | |
/* insert unused bits (zeros) at the tail of the last byte */ | |
if (unused_size[coding_mode]) | |
{ | |
temp <<= (unused_size[coding_mode] - 1); | |
} | |
*stream_ptr = temp; | |
/* write packed frame into file (1 byte added to cover ToC entry) */ | |
return (1 + packed_size[coding_mode]); | |
} | |
} | |
} | |
/*-----------------------------------------------------* | |
* Parm_serial -> convert parameters to serial stream * | |
*-----------------------------------------------------*/ | |
void Parm_serial( | |
Word16 value, /* input : parameter value */ | |
Word16 no_of_bits, /* input : number of bits */ | |
Word16 ** prms | |
) | |
{ | |
Word16 i, bit; | |
*prms += no_of_bits; | |
for (i = 0; i < no_of_bits; i++) | |
{ | |
bit = (Word16) (value & 0x0001); /* get lsb */ | |
if (bit == 0) | |
*--(*prms) = BIT_0; | |
else | |
*--(*prms) = BIT_1; | |
value >>= 1; | |
} | |
*prms += no_of_bits; | |
return; | |
} | |