#include "resample.h"
#include
#include
#include
#include
#define FRAC_BITS16
#define FRAC(1 << FRAC_BITS)
#define av_free(p){if(p) free(p);}
#define av_malloc(size)malloc(size)
//
// Construction/Destruction
//
CResample::CResample()
{
}
CResample::~CResample()
{
}
// 8bit_to_16bit(注意:输出数据是有符号的还是无符号的)
// output: para 1: 16bit的数据
// input: para 2: 8bit数据
// para 3: 要转换数据的次数,为原数据长度,
//注:因为一次转换1个字节变两个字节,所以转换后数据的总长度为8位数据的两倍
int CResample::mono_8bit_to_16bit(short* lp16bits, unsigned char* lp8bits, int len)
{
int i=0;
for(i=0; i
*lp16bits++ = ((*lp8bits++) -128) << 8;
}
return i<<1;
}
void CResample::init_mono_resample(ReSampleChannelContext *s, float ratio)
{
ratio = (float)(1.0 / ratio);
s->iratio = (int)floorf(ratio);
if (s->iratio == 0)
s->iratio = 1;
s->incr = (int)((ratio / s->iratio) * FRAC);
s->frac = FRAC;
s->last_sample = 0;
s->icount = s->iratio;
s->isum = 0;
s->inv = (FRAC / s->iratio);
}
/* fractional audio resampling */
int CResample::fractional_resample(ReSampleChannelContext *s, short *output, short *input, int nb_samples)
{
unsigned int frac, incr;
int l0, l1;
short *q, *p, *pend;
l0 = s->last_sample;
incr = s->incr;
frac = s->frac;
p = input;
pend = input + nb_samples;
q = output;
l1 = *p++;
for(;;) {
/* interpolate */
*q++ = (l0 * (FRAC - frac) + l1 * frac) >> FRAC_BITS;
frac = frac + s->incr;
while (frac >= FRAC) {
frac -= FRAC;
if (p >= pend)
goto the_end;
l0 = l1;
l1 = *p++;
}
}
the_end:
s->last_sample = l1;
s->frac = frac;
return q - output;
}
int CResample::integer_downsample(ReSampleChannelContext *s, short *output, short *input, int nb_samples)
{
short *q, *p, *pend;
int c, sum;
p = input;
pend = input + nb_samples;
q = output;
c = s->icount;
sum = s->isum;
for(;;) {
sum += *p++;
if (--c == 0) {
*q++ = (sum * s->inv) >> FRAC_BITS;
c = s->iratio;
sum = 0;
}
if (p >= pend)
break;
}
s->isum = sum;
s->icount &#