免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3479 | 回复: 3
打印 上一主题 下一主题

嵌入式Flash流媒体解码库(libFAD-0.8.6) released [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-12-19 17:24 |只看该作者 |倒序浏览
libFAD是一个基于嵌入式的Flash流媒体(swf)解码库。
目前支持:
1: shape
2: morphing shape
3: font/static text
4: event/stream sound, include mp3 support
5:sprite/button
在Souce的tar包中,我们还提供了一个基于 Cairo/SDL的Flash player.
新手上路,Bug多多,希望大家能多提意见。谢谢。
详情见:
http://fad.sourceforge.net

论坛徽章:
0
2 [报告]
发表于 2011-02-20 09:07 |只看该作者
本帖最后由 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, 不知是否还在更新

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
3 [报告]
发表于 2011-02-21 16:32 |只看该作者
支持的是flash几?as几?

论坛徽章:
0
4 [报告]
发表于 2011-02-22 11:59 |只看该作者
新手,想学习下这个,看看先
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP