- 论坛徽章:
- 0
|
本帖最后由 pamire 于 2011-02-20 09:10 编辑
libfad是个很不错的开源库,个人在mingw下编译,发现一个小问题,播放swf出现异常(内存溢出)
由于自己对swf了解不多,而你的库主要用于嵌入式开发,把发现的问题说明一下
void fad_sound_render_adpcm (fad_render_t *render, u8_t *data, u8_t attr, s32_t nsize) {
u8_t nbits;
bits_t bits;
adpcm_state_t lstate, rstate;
u16_t *samples = NULL, nsample;//4096<<(attr&0x01);
bits_init(&bits);
bits_buffer(&bits, data);
nbits = bits_get_ubits(&bits, 2)+2;
lstate.valprev = bits_get_u16(&bits);
lstate.index = bits_get_ubits(&bits, 6);
nsample = (nbits<<12) * 2; //2. 分配足够大的内存
samples = calloc(nsample, sizeof(u16_t));
if(samples == NULL)
goto mem_error;
if(attr&0x01) {
_adpcm_decode(&bits, samples, nbits, &lstate, ADPCM_DEC_MONO);
} else {
rstate.valprev = bits_get_u16(&bits);
rstate.index = bits_get_ubits(&bits, 6);
_adpcm_decode(&bits, samples, nbits, &lstate, ADPCM_DEC_STEREO_LEFT);
_adpcm_decode(&bits, samples, nbits, &rstate, ADPCM_DEC_STEREO_RIGHT);
}
default_render_write_pcm(render, samples, nsample);
free(samples);
mem_error:
bits_finish(&bits);
}
static void _adpcm_decode(bits_t* bits, s16_t* buffer, u8_t nbits, adpcm_state_t* state, adpcm_decode_type_t type) {
u8_t val[4] = {2, 4, 8, 16};
s16_t* outptr = NULL;
s32_t sign, delta, step, valpred, vpdiff, index, size = nbits<<12; //3. 需要2的大小与它保持一致(x2)
if(type == ADPCM_DEC_STEREO_RIGHT) {
outptr = ++buffer;
bits->npad = nbits;
} else {
bits->npad = 0;
outptr = buffer;
}
valpred = state->valprev;
index = state->index;
step = stepsize_table[index];
while(size--) {
delta = bits_get_ubits(bits, nbits);
if(type != ADPCM_DEC_MONO) {
/**stereo sound skip left/right sample*/
bits->npad += nbits;
if(bits->npad >= {
bits->npad -= 8;
bits->bufptr++;
}
}
index += idx_table[nbits-2][delta-val[nbits-2]];
if(index < 0) index = 0;
if(index > 8 index = 88;
sign = delta&(1<<nbits);
delta = delta&(0x7F>>(8-nbits));
vpdiff = step>>(nbits-1);
switch(nbits) {
case 2:
if(delta&1) vpdiff += step;
break;
case 3:
if(delta&2) vpdiff += step;
if(delta&1) vpdiff += step>>1;
break;
case 4:
if(delta&4) vpdiff += step;
if(delta&2) vpdiff += step>>1;
if(delta&1) vpdiff += step>>2;
break;
case 5:
if(delta& vpdiff += step;
if(delta&4) vpdiff += step>>1;
if(delta&2) vpdiff += step>>2;
if(delta&1) vpdiff += step>>3;
break;
}
if(sign)
valpred -= vpdiff;
else
valpred += vpdiff;
if(valpred > 32767)
valpred = 32767;
else if(valpred < -32767)
valpred = -32767;
step = stepsize_table[index];
*outptr++ = valpred; //1. 越界
if(type != ADPCM_DEC_MONO)
outptr++; } //4. 可能outprt为sizex2
state->valprev = valpred;
state->index = index;
}
此库相对于swfdec来说,播放时cpu占用率比较高,目前用的是0.9.6, 不知是否还在更新 |
|