|
楼主 |
发表于 2009-9-11 17:03:00
|
显示全部楼层
libwma全都移植到CM3上了,不过占用的体积很大:
Code (inc. data) RO Data RW Data ZI Data Debug Object Name
2314 30 8216 0 0 4760 mdct2.o
1128 14 0 0 0 612 mdct_arm.o
4756 308 166 12 70528 29134 wma.o
170 0 0 0 0 412 wma_arm.o
694 0 384 0 0 8274 wmabitstream.o
7930 218 30736 32784 112000 26410 wmadeci.o
688 46 128 0 0 5112 wmafixed.o
ZI,112k + 70k
RW,32k
现在就看ZI怎么处理了,是全部可以放到heap上的,不过放到heap(STM32F103ZE的外扩SRAM)上速度立马慢了一大截。
几个用到的变量(占用空间比较大的变量)
wmadeci.c中的
fixed32 coefsarray[MAX_CHANNELS][BLOCK_MAX_SIZE] ; /* 16384 */
fixed32 frame_out_buf[MAX_CHANNELS][BLOCK_MAX_SIZE * 2] ; /* 32768 */
fixed32 stat0[2048], stat1[1024], stat2[512], stat3[256], stat4[128];
/* 大小分别为8192, 4096, 2048, 1024, 512,用于放fsincos的窗口,基本上是定值 */
uint16_t runtab0[1336], runtab1[1336], levtab0[1336], levtab1[1336];
/* 大小分别为2672, 2672, 2672, 2672 */
VLC_TYPE vlcbuf1[VLCBUF1SIZE][2]; /* 18392 */
VLC_TYPE vlcbuf2[VLCBUF2SIZE][2]; /* 14296 */
VLC_TYPE vlcbuf3[VLCBUF3SIZE][2]; /* 1440 */
VLC_TYPE vlcbuf4[VLCBUF4SIZE][2]; /* 2160 */
/* 用于放置vlc的一个快速查找表 */
这几个总计112000字节
而一个wma解码的上下文需要53400字节大小
wma解码时主要的函数调用流程:
wma->asf_read_packet (读取wma原始数据), wma_decode_superframe_init(获得帧头数据)->针对每个帧做解码:wma_decode_superframe_frame -> wma_decode_frame -> wma_decode_block -> mdct_backward (faster IMDCT), wma_window (Apply MDCT window and add into output)
解码部分主要在mdct_backward,因为wma是基于MDCT的,需要做一个反变换。libwma是基于帧的方式进行解码,所以每次的数据缓存需要一个最大的超帧大小(superframe) |
|