📄 enc_if.c
字号:
for (j = 1; j <= NBBITS_7k; j++)
{
if (param[*mask] & *(mask + 1))
{
*stream += 0x1;
}
mask += 2;
if (j % 8)
{
*stream <<= 1;
}
else
{
stream++;
}
}
while (j % 8)
{
*stream <<= 1;
j++;
}
break;
case MODE_9k:
mask = mode_9k;
*stream = 0x0C; /* frame_type = 1, fqi = 1 */
stream++;
for (j = 1; j <= NBBITS_9k; j++)
{
if (param[*mask] & *(mask + 1))
{
*stream += 0x1;
}
mask += 2;
if (j % 8)
{
*stream <<= 1;
}
else
{
stream++;
}
}
while (j % 8)
{
*stream <<= 1;
j++;
}
break;
case MODE_12k:
mask = mode_12k;
*stream = 0x14; /* frame_type = 2, fqi = 1 */
stream++;
for (j = 1; j <= NBBITS_12k; j++)
{
if (param[*mask] & *(mask + 1))
{
*stream += 0x1;
}
mask += 2;
if (j % 8)
{
*stream <<= 1;
}
else
{
stream++;
}
}
while (j % 8)
{
*stream <<= 1;
j++;
}
break;
case MODE_14k:
mask = mode_14k;
*stream = 0x1C; /* frame_type = 3, fqi = 1 */
stream++;
for ( j = 1; j <= NBBITS_14k; j++ )
{
if (param[*mask] & *(mask + 1))
{
*stream += 0x1;
}
mask += 2;
if (j % 8)
{
*stream <<= 1;
}
else
{
stream++;
}
}
while (j % 8)
{
*stream <<= 1;
j++;
}
break;
case MODE_16k:
mask = mode_16k;
*stream = 0x24; /* frame_type = 4, fqi = 1 */
stream++;
for (j = 1; j <= NBBITS_16k; j++)
{
if (param[*mask] & *(mask + 1))
{
*stream += 0x1;
}
mask += 2;
if (j % 8)
{
*stream <<= 1;
}
else
{
stream++;
}
}
while (j % 8)
{
*stream <<= 1;
j++;
}
break;
case MODE_18k:
mask = mode_18k;
*stream = 0x2C; /* frame_type = 5, fqi = 1 */
stream++;
for (j = 1; j <= NBBITS_18k; j++)
{
if (param[*mask] & *(mask + 1))
{
*stream += 0x1;
}
mask += 2;
if (j % 8)
{
*stream <<= 1;
}
else
{
stream++;
}
}
while (j % 8)
{
*stream <<= 1;
j++;
}
break;
case MODE_20k:
mask = mode_20k;
*stream = 0x34; /* frame_type = 6, fqi = 1 */
stream++;
for (j = 1; j <= NBBITS_20k; j++)
{
if (param[*mask] & *( mask + 1))
{
*stream += 0x1;
}
mask += 2;
if (j % 8)
{
*stream <<= 1;
}
else
{
stream++;
}
}
while (j % 8)
{
*stream <<= 1;
j++;
}
break;
case MODE_23k:
mask = mode_23k;
*stream = 0x3C; /* frame_type = 7, fqi = 1 */
stream++;
for (j = 1; j <= NBBITS_23k; j++)
{
if (param[*mask] & *( mask + 1))
{
*stream += 0x1;
}
mask += 2;
if (j % 8)
{
*stream <<= 1;
}
else
{
stream++;
}
}
while (j % 8)
{
*stream <<= 1;
j++;
}
break;
case MODE_24k:
mask = mode_24k;
*stream = 0x44; /* frame_type = 8, fqi = 1 */
stream++;
for (j = 1; j <= NBBITS_24k; j++)
{
if (param[*mask] & *( mask + 1))
{
*stream += 0x1;
}
mask += 2;
if (j % 8)
{
*stream <<= 1;
}
else
{
stream++;
}
}
while (j % 8)
{
*stream <<= 1;
j++;
}
break;
case MRDTX:
mask = mode_DTX;
*stream = 0x4C; /* frame_type = 9, fqi = 1 */
stream++;
for ( j = 1; j <= NBBITS_SID; j++ )
{
if (param[*mask] & *(mask + 1))
{
*stream += 0x1;
}
mask += 2;
if (j % 8)
{
*stream <<= 1;
}
else
{
stream++;
}
}
/* sid type */
if (frame_type == TX_SID_UPDATE)
{
/* sid update */
*stream += 0x1;
}
/* speech mode indicator */
*stream <<= 4;
*stream = (UWord8)(*stream + speech_mode);
j = 40;
break;
default:
break;
}
return j/8 + 1;
}
#endif
/*
* E_IF_sid_sync_reset
*
* Parameters:
* st O: state structure
*
* Function:
* Initializes state memory
*
* Returns:
* void
*/
static void E_IF_sid_sync_reset(WB_enc_if_state *st)
{
st->sid_update_counter = 3;
st->sid_handover_debt = 0;
st->prev_ft = TX_SPEECH;
}
/*
* E_IF_encode
*
*
* Parameters:
* st I: pointer to state structure
* mode I: Speech Mode
* speech I: Input speech
* serial O: Output octet structure IF2 or 16-bit serial stream
* dtx I: use DTX
*
* Function:
* Encoding and packing one frame of speech
*
* Returns:
* number of octets
*/
int E_IF_encode(void *st, Word16 req_mode, Word16 *speech, UWord8 *serial,
Word16 dtx)
{
Word16 prms[NB_PARM_MAX];
Word16 i;
Word16 frame_type, mode, reset_flag;
WB_enc_if_state *s;
s = (WB_enc_if_state *)st;
mode = req_mode;
/* check for homing frame */
reset_flag = E_IF_homing_frame_test(speech);
if (!reset_flag)
{
for (i = 0; i < L_FRAME16k; i++) /* Delete the 2 LSBs (14-bit input) */
{
speech[i] = (Word16) (speech[i] & 0xfffC);
}
E_MAIN_encode(&mode, speech, prms, s->encoder_state, dtx);
if (mode == MRDTX)
{
s->sid_update_counter--;
if (s->prev_ft == TX_SPEECH)
{
frame_type = TX_SID_FIRST;
s->sid_update_counter = 3;
}
else
{
if ((s->sid_handover_debt > 0) && (s->sid_update_counter > 2))
{
/*
* ensure extra updates are
* properly delayed after a possible SID_FIRST
*/
frame_type = TX_SID_UPDATE;
s->sid_handover_debt--;
}
else
{
if (s->sid_update_counter == 0)
{
frame_type = TX_SID_UPDATE;
s->sid_update_counter = 8;
}
else
{
frame_type = TX_NO_DATA;
mode = MRNO_DATA;
}
}
}
}
else
{
s->sid_update_counter = 8;
frame_type = TX_SPEECH;
}
s->prev_ft = frame_type;
}
/* perform homing if homing frame was detected at encoder input */
else
{
E_MAIN_reset(s->encoder_state, 1);
E_IF_sid_sync_reset(s);
E_IF_homing_coding(prms, mode);
frame_type = TX_SPEECH;
}
#ifdef IF2
return E_IF_if2_conversion(mode, prms, serial, frame_type, req_mode);
#else
return E_IF_mms_conversion(mode, prms, serial, frame_type, req_mode);
#endif
}
/*
* E_IF_init
*
* Parameters:
* none
*
* Function:
* Allocates state memory and initializes state memory
*
* Returns:
* pointer to encoder interface structure
*/
void *E_IF_init(void)
{
WB_enc_if_state * s;
/* allocate memory */
if ((s = (WB_enc_if_state *)malloc(sizeof(WB_enc_if_state))) == NULL)
{
return NULL;
}
E_MAIN_init(&(s->encoder_state));
if (s->encoder_state == NULL)
{
free(s);
return NULL;
}
E_IF_sid_sync_reset(s);
return s;
}
/*
* E_IF_exit
*
* Parameters:
* state I: state structure
*
* Function:
* The memory used for state memory is freed
*
* Returns:
* Void
*/
void E_IF_exit(void *state)
{
WB_enc_if_state *s;
s = (WB_enc_if_state *)state;
/* free memory */
E_MAIN_close(&s->encoder_state);
free(s);
state = NULL;
}
/*
*
*/
void E_IF_encode_first(void *st, Word16 *speech)
{
Word16 i;
WB_enc_if_state *s;
s = (WB_enc_if_state *)st;
for (i = 0; i < L_FRAME16k; i++) /* Delete the 2 LSBs (14-bit input) */
{
speech[i] = (Word16) (speech[i] & 0xfffC);
}
E_MAIN_encode_first(speech, s->encoder_state);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -