/* ** 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 #include #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; }