📄 gsm06_10_codec.c
字号:
};
static const unsigned char msGSMHeader[] =
{
// unknown data
0x02, 0x00, 0x00, 0x00,
0x00, 0x00, 0x40, 0x01,
0x00, 0x00, 0x40, 0x01,
0x02, 0x00, 0x08, 0x00,
0x00, 0x00, 0x00, 0x00,
#define GSM_FIXED_START 20 // Offset to this point in header
// standard MS waveformatex structure follows
0x31, 0x00, // WORD wFormatTag; /* format type */
0x01, 0x00, // WORD nChannels; /* number of channels (i.e. mono, stereo...) */
0x40, 0x1f, 0x00, 0x00, // DWORD nSamplesPerSec; /* sample rate */
0x59, 0x06, 0x00, 0x00, // DWORD nAvgBytesPerSec; /* for buffer estimation */
0x41, 0x00, // WORD nBlockAlign; /* block size of data */
0x00, 0x00, // WORD wBitsPerSample; /* Number of bits per sample of mono data */
0x02, 0x00, // WORD cbSize; /* The count in bytes of the size of
#define GSM_FIXED_LEN 18 // Number of bytes from GSM_FIXED_START to here
// extra GSM information
0x40, 0x01, // WORD numberOfSamples /* 320 */
// unknown data
0x00, 0x00
};
#define MICROSOFT_COUNTRY_CODE 181
#define MICROSOFT_T35EXTENSION 0
#define MICROSOFT_MANUFACTURER 21324
int msgsmCompareFunc(struct PluginCodec_H323NonStandardCodecData * data)
{
int val;
if ((data == NULL) || (data->objectId != NULL) || (data->data == NULL))
return -1;
val = MICROSOFT_COUNTRY_CODE - data->t35CountryCode;
if (val != 0)
return val;
val = MICROSOFT_T35EXTENSION - data->t35Extension;
if (val != 0)
return val;
val = MICROSOFT_MANUFACTURER - data->manufacturerCode;
if (val != 0)
return val;
val = sizeof(msGSMHeader) - data->dataLength;
if (val != 0)
return val;
return memcmp(data->data+GSM_FIXED_START, msGSMHeader+GSM_FIXED_START, GSM_FIXED_LEN);
}
static struct PluginCodec_H323NonStandardCodecData msgsmCap =
{
NULL,
MICROSOFT_COUNTRY_CODE, MICROSOFT_T35EXTENSION, MICROSOFT_MANUFACTURER,
msGSMHeader, sizeof(msGSMHeader),
msgsmCompareFunc
};
/////////////////////////////////////////////////////////////////////////////
static struct PluginCodec_Definition gsmCodecDefn[4] = {
{
// encoder
PLUGIN_CODEC_VERSION, // codec API version
&licenseInfo, // license information
PluginCodec_MediaTypeAudio | // audio codec
PluginCodec_InputTypeRaw | // raw input data
PluginCodec_OutputTypeRaw | // raw output data
PluginCodec_RTPTypeExplicit, // specified RTP type
gsm0610, // text decription
L16Desc, // source format
gsm0610, // destination format
0, // user data (no WAV49)
8000, // samples per second
BITS_PER_SECOND, // raw bits per second
20000, // nanoseconds per frame
SAMPLES_PER_FRAME, // samples per frame
BYTES_PER_FRAME, // bytes per frame
PREF_FRAMES_PER_PACKET, // recommended number of frames per packet
MAX_FRAMES_PER_PACKET, // maximum number of frames per packe
PAYLOAD_CODE, // IANA RTP payload code
sdpGSM, // RTP payload name
create_codec, // create codec function
destroy_codec, // destroy codec
codec_encoder, // encode/decode
NULL, // codec controls
PluginCodec_H323AudioCodec_gsmFullRate, // h323CapabilityType
&gsmCaps // h323CapabilityData
},
{
// decoder
PLUGIN_CODEC_VERSION, // codec API version
&licenseInfo, // license information
PluginCodec_MediaTypeAudio | // audio codec
PluginCodec_InputTypeRaw | // raw input data
PluginCodec_OutputTypeRaw | // raw output data
PluginCodec_RTPTypeExplicit, // dynamic RTP type
gsm0610, // text decription
gsm0610, // source format
L16Desc, // destination format
0, // user data (no WAV49)
8000, // samples per second
BITS_PER_SECOND, // raw bits per second
20000, // nanoseconds per frame
SAMPLES_PER_FRAME, // samples per frame
BYTES_PER_FRAME, // bytes per frame
PREF_FRAMES_PER_PACKET, // recommended number of frames per packet
MAX_FRAMES_PER_PACKET, // maximum number of frames per packe
PAYLOAD_CODE, // IANA RTP payload code
sdpGSM, // RTP payload name
create_codec, // create codec function
destroy_codec, // destroy codec
codec_decoder, // encode/decode
NULL, // codec controls
PluginCodec_H323AudioCodec_gsmFullRate, // h323CapabilityType
&gsmCaps // h323CapabilityData
},
// MS-GSM
{
// encoder
PLUGIN_CODEC_VERSION, // codec API version
&licenseInfo, // license information
PluginCodec_MediaTypeAudio | // audio codec
PluginCodec_InputTypeRaw | // raw input data
PluginCodec_OutputTypeRaw | // raw output data
PluginCodec_RTPTypeDynamic, // specified RTP type
msGSM, // text decription
L16Desc, // source format
msGSM, // destination format
(const void *)1, // user data (enable WAV49)
8000, // samples per second
BITS_PER_SECOND, // raw bits per second
40000, // nanoseconds per frame
MSGSM_SAMPLES_PER_FRAME, // samples per frame
MSGSM_BYTES_PER_FRAME, // bytes per frame
1, // recommended number of frames per packet
1, // maximum number of frames per packe
0, // IANA RTP payload code
sdpMSGSM, // RTP payload name
create_codec, // create codec function
destroy_codec, // destroy codec
codec_msgsm_encoder, // encode/decode
NULL, // codec controls
PluginCodec_H323Codec_nonStandard, // h323CapabilityType
&msgsmCap // h323CapabilityData
},
{
// decoder
PLUGIN_CODEC_VERSION, // codec API version
&licenseInfo, // license information
PluginCodec_MediaTypeAudio | // audio codec
PluginCodec_InputTypeRaw | // raw input data
PluginCodec_OutputTypeRaw | // raw output data
PluginCodec_RTPTypeDynamic, // dynamic RTP type
msGSM, // text decription
msGSM, // source format
L16Desc, // destination format
(const void *)1, // user data (enable WAV49)
8000, // samples per second
BITS_PER_SECOND, // raw bits per second
40000, // nanoseconds per frame
MSGSM_SAMPLES_PER_FRAME, // samples per frame
MSGSM_BYTES_PER_FRAME, // bytes per frame
1, // recommended number of frames per packet
1, // maximum number of frames per packe
0, // IANA RTP payload code
sdpMSGSM, // RTP payload name
create_codec, // create codec function
destroy_codec, // destroy codec
codec_msgsm_decoder, // encode/decode
NULL, // codec controls
PluginCodec_H323Codec_nonStandard, // h323CapabilityType
&msgsmCap // h323CapabilityData
},
};
#define NUM_DEFNS (sizeof(gsmCodecDefn) / sizeof(struct PluginCodec_Definition))
/////////////////////////////////////////////////////////////////////////////
PLUGIN_CODEC_DLL_API struct PluginCodec_Definition * PLUGIN_CODEC_GET_CODEC_FN(unsigned * count, unsigned version)
{
*count = NUM_DEFNS;
return gsmCodecDefn;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -