📄 interf_enc.c
字号:
/*
* ===================================================================
* TS 26.104
* REL-5 V5.4.0 2004-03
* REL-6 V6.1.0 2004-03
* 3GPP AMR Floating-point Speech Codec
* ===================================================================
*
*/
/*
* interf_enc.c
*
*
* Project:
* AMR Floating-Point Codec
*
* Contains:
* This module contains all the functions needed encoding 160
* 16-bit speech samples to AMR encoder parameters.
*
*/
/*
* include files
*/
#include <stdlib.h>
#include <stdio.h>
//#include <memory.h>
#include <string.h>
#include "sp_enc.h"
#include "interf_rom.h"
#define TX_SPEECH_GOOD 0
#define TX_SID_FIRST 1
#define TX_SID_UPDATE 2
#define TX_NO_DATA 3
#define TX_SPEECH_DEGRADED 4
#define TX_SPEECH_BAD 5
#define TX_SID_BAD 6
#define TX_ONSET 7
#define TX_N_FRAMETYPES 8
/*
* Declare structure types
*/
/* Declaration transmitted frame types */
//enum TXFrameType { TX_SPEECH_GOOD = 0,
// TX_SID_FIRST,
// TX_SID_UPDATE,
// TX_NO_DATA,
// TX_SPEECH_DEGRADED,
// TX_SPEECH_BAD,
// TX_SID_BAD,
// TX_ONSET,
// TX_N_FRAMETYPES /* number of frame types */
//};
/* Declaration of interface structure */
typedef struct
{
Word16 sid_update_counter; /* Number of frames since last SID */
Word16 sid_handover_debt; /* Number of extra SID_UPD frames to schedule */
Word32 dtx;
int prev_ft; /* Type of the previous frame */
void *encoderState; /* Points encoder state structure */
} enc_interface_State;
#ifdef ETSI
/*
* Prm2Bits
*
*
* Parameters:
* value I: value to be converted to binary
* no_of_bits I: number of bits associated with value
* bitstream O: address where bits are written
*
* Function:
* Convert integer to binary and write the bits to the array.
* The most significant bits are written first.
* Returns:
* void
*/
static void Int2Bin( Word16 value, Word16 no_of_bits, Word16 *bitstream )
{
Word32 i, bit;
Word16 *pt_bitstream;
pt_bitstream = &bitstream[no_of_bits];
for ( i = 0; i < no_of_bits; i++ ) {
bit = value & 0x0001;
if ( bit == 0 ) {
* --pt_bitstream = 0;
}
else {
* --pt_bitstream = 1;
}
value = ( Word16 )( value >> 1 );
}
}
/*
* Prm2Bits
*
*
* Parameters:
* mode I: AMR mode
* prm I: analysis parameters
* bits O: serial bits
*
* Function:
* converts the encoder parameter vector into a vector of serial bits.
* Returns:
* void
*/
static void Prm2Bits(int mode, Word16 prm[], Word16 bits[] )
{
Word32 i;
switch ( mode ) {
case MR122:
for ( i = 0; i < PRMNO_MR122; i++ ) {
Int2Bin( prm[i], bitno_MR122[i], bits );
bits += bitno_MR122[i];
}
break;
case MR102:
for ( i = 0; i < PRMNO_MR102; i++ ) {
Int2Bin( prm[i], bitno_MR102[i], bits );
bits += bitno_MR102[i];
}
break;
case MR795:
for ( i = 0; i < PRMNO_MR795; i++ ) {
Int2Bin( prm[i], bitno_MR795[i], bits );
bits += bitno_MR795[i];
}
break;
case MR74:
for ( i = 0; i < PRMNO_MR74; i++ ) {
Int2Bin( prm[i], bitno_MR74[i], bits );
bits += bitno_MR74[i];
}
break;
case MR67:
for ( i = 0; i < PRMNO_MR67; i++ ) {
Int2Bin( prm[i], bitno_MR67[i], bits );
bits += bitno_MR67[i];
}
break;
case MR59:
for ( i = 0; i < PRMNO_MR59; i++ ) {
Int2Bin( prm[i], bitno_MR59[i], bits );
bits += bitno_MR59[i];
}
break;
case MR515:
for ( i = 0; i < PRMNO_MR515; i++ ) {
Int2Bin( prm[i], bitno_MR515[i], bits );
bits += bitno_MR515[i];
}
break;
case MR475:
for ( i = 0; i < PRMNO_MR475; i++ ) {
Int2Bin( prm[i], bitno_MR475[i], bits );
bits += bitno_MR475[i];
}
break;
case MRDTX:
for ( i = 0; i < PRMNO_MRDTX; i++ ) {
Int2Bin( prm[i], bitno_MRDTX[i], bits );
bits += bitno_MRDTX[i];
}
break;
}
return;
}
#else
#ifndef IF2
/*
* EncoderMMS
*
*
* Parameters:
* mode I: AMR mode
* param I: Encoder output parameters
* stream O: packed speech frame
* frame_type I: frame type (DTX)
* speech_mode I: speech mode (DTX)
*
* Function:
* Pack encoder output parameters to octet structure according
* importance table and AMR file storage format according to
* RFC 3267.
* Returns:
* number of octets
*/
static int EncoderMMS(int mode, Word16 *param, UWord8 *stream, int frame_type, int speech_mode )
{
Word32 j = 0, k;
Word16 *mask;
memset(stream, 0, block_size[mode]);
*stream = toc_byte[mode];
stream++;
if ( mode == 15 ) {
return 1;
}
else if ( mode == MRDTX ) {
mask = order_MRDTX;
for ( j = 1; j < 36; j++ ) {
if ( param[ * mask] & *( mask + 1 ) )
*stream += 0x01;
mask += 2;
if ( j % 8 )
*stream <<= 1;
else
stream++;
}
/* add SID type information */
if ( frame_type == TX_SID_UPDATE )
*stream += 0x01;
*stream <<= 3;
/* speech mode indication */
*stream += ( unsigned char )(speech_mode & 0x0007);
*stream <<= 1;
/* don't shift at the end of the function */
return 6;
}
else if ( mode == MR475 ) {
mask = order_MR475;
for ( j = 1; j < 96; j++ ) {
if ( param[ * mask] & *( mask + 1 ) )
*stream += 0x01;
mask += 2;
if ( j % 8 )
*stream <<= 1;
else
stream++;
}
}
else if ( mode == MR515 ) {
mask = order_MR515;
for ( j = 1; j < 104; j++ ) {
if ( param[ * mask] & *( mask + 1 ) )
*stream += 0x01;
mask += 2;
if ( j % 8 )
*stream <<= 1;
else
stream++;
}
}
else if ( mode == MR59 ) {
mask = order_MR59;
for ( j = 1; j < 119; j++ ) {
if ( param[ * mask] & *( mask + 1 ) )
*stream += 0x01;
mask += 2;
if ( j % 8 )
*stream <<= 1;
else
stream++;
}
}
else if ( mode == MR67 ) {
mask = order_MR67;
for ( j = 1; j < 135; j++ ) {
if ( param[ * mask] & *( mask + 1 ) )
*stream += 0x01;
mask += 2;
if ( j % 8 )
*stream <<= 1;
else
stream++;
}
}
else if ( mode == MR74 ) {
mask = order_MR74;
for ( j = 1; j < 149; j++ ) {
if ( param[ * mask] & *( mask + 1 ) )
*stream += 0x01;
mask += 2;
if ( j % 8 )
*stream <<= 1;
else
stream++;
}
}
else if ( mode == MR795 ) {
mask = order_MR795;
for ( j = 1; j < 160; j++ ) {
if ( param[ * mask] & *( mask + 1 ) )
*stream += 0x01;
mask += 2;
if ( j % 8 )
*stream <<= 1;
else
stream++;
}
}
else if ( mode == MR102 ) {
mask = order_MR102;
for ( j = 1; j < 205; j++ ) {
if ( param[ * mask] & *( mask + 1 ) )
*stream += 0x01;
mask += 2;
if ( j % 8 )
*stream <<= 1;
else
stream++;
}
}
else if ( mode == MR122 ) {
mask = order_MR122;
for ( j = 1; j < 245; j++ ) {
if ( param[ * mask] & *( mask + 1 ) )
*stream += 0x01;
mask += 2;
if ( j % 8 )
*stream <<= 1;
else
stream++;
}
}
/* shift remaining bits */
if ( k = j % 8 ) *stream <<= ( 8 - k );
return( (int)block_size[mode] );
}
#else
/*
* Encoder3GPP
*
*
* Parameters:
* mode I: AMR mode
* param I: Encoder output parameters
* stream O: packed speech frame
* frame_type I: frame type (DTX)
* speech_mode I: speech mode (DTX)
*
* Function:
* Pack encoder output parameters to octet structure according
* importance table.
* Returns:
* number of octets
*/
static int Encoder3GPP(int mode, Word16 *param, UWord8 *stream, int frame_type, int speech_mode )
{
Word32 j = 0;
Word16 *mask;
memset(stream, 0, block_size[mode]);
if ( mode == 15 ) {
*stream = 0xF;
return 1;
}
else if ( mode == MRDTX ) {
mask = order_MRDTX;
*stream = 0x40;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -