📄 ima_adpcm.c
字号:
bufferstep = 0;
len *= 2;
for ( ; len > 0 ; len-- ) {
/* Step 1 - get the delta value */
if ( bufferstep ) {
delta = inputbuffer & 0xf;
} else {
inputbuffer = *inp++;
delta = (inputbuffer >> 4) & 0xf;
}
bufferstep = !bufferstep;
/* Step 2 - Find new index value (for later) */
index += indexTable[delta];
if ( index < 0 ) index = 0;
if ( index > 88 ) index = 88;
/* Step 3 - Separate sign and magnitude */
sign = delta & 8;
delta = delta & 7;
/* Step 4 - Compute difference and new predicted value */
/*
** Computes 'vpdiff = (delta+0.5)*step/4', but see comment
** in adpcm_coder.
*/
vpdiff = step >> 3;
if ( delta & 4 ) vpdiff += step;
if ( delta & 2 ) vpdiff += step>>1;
if ( delta & 1 ) vpdiff += step>>2;
if ( sign )
valpred -= vpdiff;
else
valpred += vpdiff;
/* Step 5 - clamp output value */
if ( valpred > 32767 )
valpred = 32767;
else if ( valpred < -32768 )
valpred = -32768;
/* Step 6 - Update step value */
step = stepsizeTable[index];
/* Step 7 - Output value */
*outp++ = (char)valpred;
}
}
/////////////////////////////////////////////////////////////////////////////
static void * create_codec(const struct PluginCodec_Definition * codec)
{
struct adpcm_state * s_adpcm = malloc(sizeof (struct adpcm_state));
s_adpcm->valprev = 0;
s_adpcm->index = 0;
return s_adpcm;
}
static int codec_encoder(const struct PluginCodec_Definition * codec,
void * _context,
const void * from,
unsigned * fromLen,
void * to,
unsigned * toLen,
unsigned int * flag)
{
struct adpcm_state * s_adpcm = (struct adpcm_state *)_context;
if (*fromLen < (IMA_SAMPLES_PER_FRAME*2) || (*toLen < IMA_BYTES_PER_FRAME))
return 0;
adpcm_coder((short *)from, (char *)to, IMA_SAMPLES_PER_FRAME, s_adpcm);
return 1;
}
static int codec_decoder(const struct PluginCodec_Definition * codec,
void * _context,
const void * from,
unsigned * fromLen,
void * to,
unsigned * toLen,
unsigned int * flag)
{
//struct adpcm_state * s_adpcm = (struct adpcm_state *)_context;
if (*toLen < (IMA_SAMPLES_PER_FRAME*2) || (*fromLen < IMA_BYTES_PER_FRAME))
return 0;
adpcm_decoder((char *)from, (short *)to, IMA_BYTES_PER_FRAME);
return 1;
}
static void destroy_codec(const struct PluginCodec_Definition * codec, void * _context)
{
free(_context);
}
/////////////////////////////////////////////////////////////////////////////
static struct PluginCodec_information licenseInfo = {
1084190703, // timestamp = Mon 10 May 2004 12:05:03 PM UTC =
"Craig Southeren, Post Increment", // source code author
"1.0", // source code version
"craigs@postincrement.com", // source code email
"http://www.postincrement.com", // source code URL
"Copyright (C) 2004 by Post Increment, All Rights Reserved", // source code copyright
"MPL 1.0", // source code license
PluginCodec_License_MPL, // source code license
NULL, // codec description
NULL, // codec author
NULL, // codec version
NULL, // codec email
NULL, // codec URL
NULL, // codec copyright information
NULL, // codec license
PluginCodec_Licence_None // codec license code
};
/////////////////////////////////////////////////////////////////////////////
static const char L16Desc[] = { "L16" };
static const char imaADPCM[] = "MS-IMA-ADPCM";
/////////////////////////////////////////////////////////////////////////////
#define MICROSOFT_COUNTRY_CODE 181
#define MICROSOFT_T35EXTENSION 0
#define MICROSOFT_MANUFACTURER 21324
int imaCompareFunc(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(msIMAHeader) - data->dataLength;
if (val != 0)
return val;
return memcmp(data->data+IMA_FIXED_START, msIMAHeader+IMA_FIXED_START, IMA_FIXED_LEN);
}
static struct PluginCodec_H323NonStandardCodecData imaADPCM_Cap =
{
NULL,
MICROSOFT_COUNTRY_CODE, MICROSOFT_T35EXTENSION, MICROSOFT_MANUFACTURER,
msIMAHeader, sizeof(msIMAHeader),
imaCompareFunc
};
static struct PluginCodec_Definition imaADPCMCodecDefn[] = {
{
// 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
imaADPCM, // text decription
L16Desc, // source format
imaADPCM, // destination format
0, // user data
8000, // samples per second
IMA_BITS_SECOND, // raw bits per second
IMA_NS_PER_FRAME, // nanoseconds per frame
IMA_SAMPLES_PER_FRAME, // samples per frame
IMA_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
0, // no IANA RTP payload code
NULL, // RTP payload name
create_codec, // create codec function
destroy_codec, // destroy codec
codec_encoder, // encode/decode
NULL, // codec controls
PluginCodec_H323Codec_nonStandard, // h323CapabilityType
&imaADPCM_Cap // 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
imaADPCM, // text decription
imaADPCM, // source format
L16Desc, // destination format
0, // user data
8000, // samples per second
IMA_BITS_SECOND, // raw bits per second
IMA_NS_PER_FRAME, // nanoseconds per frame
IMA_SAMPLES_PER_FRAME, // samples per frame
IMA_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
0, // no IANA RTP payload code
NULL, // RTP payload name
create_codec, // create codec function
destroy_codec, // destroy codec
codec_decoder, // encode/decode
NULL, // codec controls
PluginCodec_H323Codec_nonStandard, // h323CapabilityType
&imaADPCM_Cap // h323CapabilityData
},
};
#define NUM_DEFNS (sizeof(imaADPCMCodecDefn) / sizeof(struct PluginCodec_Definition))
/////////////////////////////////////////////////////////////////////////////
PLUGIN_CODEC_DLL_API struct PluginCodec_Definition * PLUGIN_CODEC_GET_CODEC_FN(unsigned * count, unsigned version)
{
*count = NUM_DEFNS;
return imaADPCMCodecDefn;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -