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