📄 dec_if.c
字号:
/*
*===================================================================
* 3GPP AMR Wideband Floating-point Speech Codec
*===================================================================
*/
#include <stdlib.h>
#include <memory.h>
#include "typedef.h"
#include "dec_if.h"
#include "if_rom.h"
#include "dec.h"
#define L_FRAME16k 320 /* Frame size at 16kHz */
#define MODE_7k 0 /* modes */
#define MODE_9k 1
#define MODE_12k 2
#define MODE_14k 3
#define MODE_16k 4
#define MODE_18k 5
#define MODE_20k 6
#define MODE_23k 7
#define MODE_24k 8
#define MRDTX 10
#define NUM_OF_MODES 11
#define LOST_FRAME 14
#define MRNO_DATA 15
#define EHF_MASK (Word16)0x0008 /* homing frame pattern */
typedef struct
{
Word16 reset_flag_old; /* previous was homing frame */
Word16 prev_ft; /* previous frame type */
Word16 prev_mode; /* previous mode */
void *decoder_state; /* Points decoder state */
} WB_dec_if_state;
Word16 nb_of_param_first[NUM_OF_SPMODES]=
{
9, 14, 15,
15, 15, 19,
19, 19, 19
};
extern const Word16 mode_7k[];
extern const Word16 mode_9k[];
extern const Word16 mode_12k[];
extern const Word16 mode_14k[];
extern const Word16 mode_16k[];
extern const Word16 mode_18k[];
extern const Word16 mode_20k[];
extern const Word16 mode_23k[];
extern const Word16 mode_24k[];
extern const Word16 mode_DTX[];
extern const Word16 nb_of_param[];
extern const Word16 dfh_M7k[];
extern const Word16 dfh_M9k[];
extern const Word16 dfh_M12k[];
extern const Word16 dfh_M14k[];
extern const Word16 dfh_M16k[];
extern const Word16 dfh_M18k[];
extern const Word16 dfh_M20k[];
extern const Word16 dfh_M23k[];
extern const Word16 dfh_M24k[];
/* overall table with the parameters of the
decoder homing frames for all modes */
extern const Word16 *dhf[10];
/*
* Decoder_Interface_Homing_Frame_test
*
* Parameters:
* input_frame I: input parameters
* mode I: speech mode
*
* Function:
* Check parameters for matching homing frame
*
* Returns:
* If homing frame
*/
Word16 D_IF_homing_frame_test(Word16 input_frame[], Word16 mode)
{
if (mode != MODE_24k)
{
/* perform test for COMPLETE parameter frame */
return (Word16)!memcmp(input_frame, dhf[mode], nb_of_param[mode] * sizeof(Word16));
}
else
{
/* discard high-band energy */
return (Word16)!(
(memcmp(input_frame, dhf[MODE_24k], 19 * sizeof(Word16))) |
(memcmp(input_frame + 20, dhf[MODE_24k] + 20, 11 * sizeof(Word16))) |
(memcmp(input_frame + 32, dhf[MODE_24k] + 32, 11 * sizeof(Word16))) |
(memcmp(input_frame + 44, dhf[MODE_24k] + 44, 11 * sizeof(Word16))) );
}
}
Word16 D_IF_homing_frame_test_first(Word16 input_frame[], Word16 mode)
{
/* perform test for FIRST SUBFRAME of parameter frame ONLY */
return (Word16)!memcmp(input_frame, dhf[mode], nb_of_param_first[mode] * sizeof(Word16));
}
#ifdef IF2
/*
* D_IF_conversion
*
*
* Parameters:
* param O: AMR parameters
* stream I: input bitstream
* frame_type O: frame type
* speech_mode O: speech mode in DTX
* fqi O: frame quality indicator
*
* Function:
* Unpacks IF2 octet stream
*
* Returns:
* mode used mode
*/
Word16 D_IF_conversion(Word16 *param, UWord8 *stream, UWord8 *frame_type,
Word16 *speech_mode, Word16 *fqi)
{
Word32 mode;
Word32 j;
Word16 const *mask;
memset(param, 0, PRMNO_24k << 1);
mode = *stream >> 4;
/* SID indication IF2 corresponds to mode 10 */
if (mode == 9)
{
mode ++;
}
*fqi = (Word16)((*stream >> 3) & 0x1);
*stream <<= (HEADER_SIZE - 1);
switch (mode)
{
case MRDTX:
mask = mode_DTX;
for (j = HEADER_SIZE; j < T_NBBITS_SID; j++)
{
if (*stream & 0x80)
{
param[*mask] = (Word16)(param[*mask] + *(mask + 1));
}
mask += 2;
if ( j % 8 )
{
*stream <<= 1;
}
else
{
stream++;
}
}
/* get SID type bit */
*frame_type = RX_SID_FIRST;
if (*stream & 0x80)
{
*frame_type = RX_SID_UPDATE;
}
*stream <<= 1;
/* speech mode indicator */
*speech_mode = (Word16)(*stream >> 4);
break;
case MRNO_DATA:
*frame_type = RX_NO_DATA;
break;
case LOST_FRAME:
*frame_type = RX_SPEECH_LOST;
break;
case MODE_7k:
mask = mode_7k;
for (j = HEADER_SIZE; j < T_NBBITS_7k; j++)
{
if ( *stream & 0x80 )
{
param[*mask] = (Word16)(param[*mask] + *(mask + 1));
}
mask += 2;
if (j % 8)
{
*stream <<= 1;
}
else
{
stream++;
}
}
*frame_type = RX_SPEECH_GOOD;
break;
case MODE_9k:
mask = mode_9k;
for (j = HEADER_SIZE; j < T_NBBITS_9k; j++)
{
if (*stream & 0x80)
{
param[*mask] = (Word16)(param[*mask] + *(mask + 1));
}
mask += 2;
if (j % 8)
{
*stream <<= 1;
}
else
{
stream++;
}
}
*frame_type = RX_SPEECH_GOOD;
break;
case MODE_12k:
mask = mode_12k;
for (j = HEADER_SIZE; j < T_NBBITS_12k; j++)
{
if (*stream & 0x80)
{
param[*mask] = (Word16)(param[*mask] + *(mask + 1));
}
mask += 2;
if ( j % 8 )
{
*stream <<= 1;
}
else
{
stream++;
}
}
*frame_type = RX_SPEECH_GOOD;
break;
case MODE_14k:
mask = mode_14k;
for (j = HEADER_SIZE; j < T_NBBITS_14k; j++)
{
if (*stream & 0x80)
{
param[*mask] = (Word16)(param[*mask] + *(mask + 1));
}
mask += 2;
if ( j % 8 )
{
*stream <<= 1;
}
else
{
stream++;
}
}
*frame_type = RX_SPEECH_GOOD;
break;
case MODE_16k:
mask = mode_16k;
for (j = HEADER_SIZE; j < T_NBBITS_16k; j++)
{
if (*stream & 0x80)
{
param[*mask] = (Word16)(param[*mask] + *(mask + 1));
}
mask += 2;
if (j % 8)
{
*stream <<= 1;
}
else
{
stream++;
}
}
*frame_type = RX_SPEECH_GOOD;
break;
case MODE_18k:
mask = mode_18k;
for (j = HEADER_SIZE; j < T_NBBITS_18k; j++)
{
if (*stream & 0x80)
{
param[*mask] = (Word16)(param[*mask] + *(mask + 1));
}
mask += 2;
if (j % 8)
{
*stream <<= 1;
}
else
{
stream++;
}
}
*frame_type = RX_SPEECH_GOOD;
break;
case MODE_20k:
mask = mode_20k;
for (j = HEADER_SIZE; j < T_NBBITS_20k; j++)
{
if (*stream & 0x80)
{
param[*mask] = (Word16)(param[*mask] + *(mask + 1));
}
mask += 2;
if (j % 8)
{
*stream <<= 1;
}
else
{
stream++;
}
}
*frame_type = RX_SPEECH_GOOD;
break;
case MODE_23k:
mask = mode_23k;
for (j = HEADER_SIZE; j < T_NBBITS_23k; j++)
{
if (*stream & 0x80)
{
param[*mask] = (Word16)(param[*mask] + *(mask + 1));
}
mask += 2;
if (j % 8)
{
*stream <<= 1;
}
else
{
stream++;
}
}
*frame_type = RX_SPEECH_GOOD;
break;
case MODE_24k:
mask = mode_24k;
for (j = HEADER_SIZE; j < T_NBBITS_24k; j++)
{
if (*stream & 0x80)
{
param[*mask] = (Word16)(param[*mask] + *(mask + 1));
}
mask += 2;
if (j % 8)
{
*stream <<= 1;
}
else
{
stream++;
}
}
*frame_type = RX_SPEECH_GOOD;
break;
default:
*frame_type = RX_SPEECH_LOST;
*fqi = 0;
break;
}
if (*fqi == 0)
{
if (*frame_type == RX_SPEECH_GOOD)
{
*frame_type = RX_SPEECH_BAD;
}
if ((*frame_type == RX_SID_FIRST) | (*frame_type == RX_SID_UPDATE))
{
*frame_type = RX_SID_BAD;
}
}
return (Word16)mode;
}
#else
/*
* D_IF_mms_conversion
*
*
* Parameters:
* param O: AMR parameters
* stream I: input bitstream
* frame_type O: frame type
* speech_mode O: speech mode in DTX
* fqi O: frame quality indicator
*
* Function:
* Unpacks MMS formatted octet stream (see RFC 3267, section 5.3)
*
* Returns:
* mode used mode
*/
Word16 D_IF_mms_conversion(Word16 *param, UWord8 *stream, UWord8 *frame_type,
Word16 *speech_mode, Word16 *fqi)
{
Word32 mode;
Word32 j;
Word16 const *mask;
memset(param, 0, PRMNO_24k << 1);
*fqi = (Word16)((*stream >> 2) & 0x01);
mode = (Word32)((*stream >> 3) & 0x0F);
/* SID indication IF2 corresponds to mode 10 */
if (mode == 9)
{
mode ++;
}
stream++;
switch (mode)
{
case MRDTX:
mask = mode_DTX;
for (j = 1; j <= NBBITS_SID; j++)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -