定点的wma解压库

发布于 2009-08-20 07:50:11
在2007 GSoC项目中,RockBox完成了libwma的定点解压库:
General
In the summer of 2006, Paul Jones began work on converting the ffmpeg SoundCodecWMA decoder to fixed point so that it could be used with Rockbox (FS#4984). Although he did not complete the project, it raised interest in eventually getting ffmpeg's decoder working in Rockbox. This Google Summer of Code 2007 project completed his task.

Status
Codec is currently in SVN and functioning well above real time on all software targets. Results appear comparable to ffmpeg for nearly all files. Noise coding and line spectral pairs are implemented, and appear to function as well as ffmpeg. Seeking has been implemented and appears robust. Performance is now extremely good on ARM. Coldfire performance is also very good but could be further improved.

Both WMA Std. flavors are supported. No special WMA variants are supported (Pro, Voice, Lossless) due to lack of an open source decoder.

Todo:
* Additional ASM optimization (requantization, etc)
* Review Tremolo and see if more ASM code can be used in WMA too
* Improve the makefile to allow compiling a stand alone codec for testing

Who's working on this
* Michael Giacomelli (saratoga)

with lots of help from:

* preglow
* linuxstb (developed the ASF parser)
* marsdaddy (Paul Jones)

为了把它移植到这个网络收音机项目中来还需要修改其中的汇编代码,从ARM指令转换成Thumb2指令。

查看更多

关注者
0
被浏览
11.1k
12 个回答
bernard
bernard 2009-08-21
希望有感兴趣的兄弟来先做个移植,看看效果如何。难度应该不是太大。
bernard
bernard 2009-09-11
全都移植到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)上速度立马慢了一大截。
bernard
bernard 2009-09-11
几个用到的变量(占用空间比较大的变量)
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)
guanhai
guanhai 2010-01-28
版主,能不能发一个编译好的wma解码的程序给我,我编译好了,但是解出来的文件却不对的,还比原来小,而且解出来的文件不能听,码率竟然是1.41 Mbps!不知道为什么?我的邮箱guanhaili2008@126.com,xiexie!
aozima
aozima 2010-01-28
拒绝白嫖,拒绝键盘侠!
解出来的是PCM原始数据,应该确实是1.4Mbps的吧,比原文件还小就不知道了.
guanhai
guanhai 2010-01-28
我运行可执行文件时,./wmaplay 1.wma 2.wav执行的,但是出现这样的情况***decode_frame: 0 size=2048
***decode_block: 0:0 (0)
0shit
***decode_frame: 1 size=2048
***decode_block: 1:0 (2048)
***decode_block: 1:1 (512)
***decode_frame: 2 size=2048
***decode_block: 2:0 (128)
***decode_frame: 3 size=2048
***decode_block: 3:0 (512)
***decode_frame: 4 size=2048
***decode_block: 4:0 (2048)
***decode_frame: 5 size=2048
***decode_block: 5:0 (2048)
***decode_frame: 6 size=2048
***decode_block: 6:0 (2048)
0shit
出来的2.wav只有一秒时间,然后一直在那反复的播放这一秒的音乐,而且听不出来是什么东西,解码出来的东西不对!你有没有你用过的代码,我用的是wmadeci那个代码,你有发给我一个吧!guanhaili2008@126.com,非常感谢!
guanhai
guanhai 2010-01-28
aozima !想和你探讨探讨,能不能留个联系方式呀!我的qq252350123
aozima
aozima 2010-01-28
拒绝白嫖,拒绝键盘侠!
aozima !想和你探讨探讨,能不能留个联系方式呀!我的qq252350123

嗯,我有QQ,不过,这个软件解码我是完全不懂,问了也白问,你还是BBS上面发贴吧,期待高手解答.
bernard
bernard 2010-01-28
我运行可执行文件时,./wmaplay 1.wma 2.wav执行的,但是出现这样的情况***decode_frame: 0 size=2048
***decode_block: 0:0 (0)
0shit
***decode_frame: 1 size=2048
***decode_block: 1:0 (2048)
***decode_block: 1:1 (512)
***decode_frame: 2 size=2048
***decode_block: 2:0 (128)
***decode_frame: 3 size=2048
***decode_block: 3:0 (512)
***decode_frame: 4 size=2048
***decode_block: 4:0 (2048)
***decode_frame: 5 size=2048
***decode_block: 5:0 (2048)
***decode_frame: 6 size=2048
***decode_block: 6:0 (2048)
0shit
出来的2.wav只有一秒时间,然后一直在那反复的播放这一秒的音乐,而且听不出来是什么东西,解码出来的东西不对!你有没有你用过的代码,我用的是wmadeci那个代码,你有发给我一个吧!guanhaili2008@126.com,非常感谢!


你在什么环境下执行?
guanhai
guanhai 2010-01-28
gcc4.2,是不是 因为编译环境的原因

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友