快乐虾
http://blog.csdn.net/lights_joy/
本文适用于
ADSP-BF561
Visual DSP++ 5.0 (update 7)
x264-snapshot-20091118-2245
欢迎转载,但请保留作者信息
移植完成后就需要进行正确性验证了。
首先将561的CCLK调整到600M,SCLK调整到100M,再打开编译器的优化。
因为希望达到adi的264编码库的水平,因此直接采用adi的264编码库中提供的测试视频做为输入源,用下面的参数调用x264进行压缩:
x264 -o my.264 f://media//enc-demo-320x240.eyuv
这是一段320x240的YV12格式的视频,共300帧。
不想第一次运行发生了一个错误:
Device 0:a: x264 [info]: 320x240 (given by file name) @ 25.00 fps
x264 [info]: using cpu capabilities: none!
x264 [error]: MV cost test failed: x264 has been miscompiled!
x264 [error]: x264_encoder_open failed
查了下原因,错误发生在计算mv_cost的时候:
int x264_analyse_init_costs( x264_t *h, int qp )
{
…………
for( i = 0; i <= 2*4*2048; i++ )
{
h->cost_mv[lambda][-i] =
h->cost_mv[lambda][i] = lambda * (log2f(i+1)*2 + 0.718f + !!i) + .5f;
}
…………
}
在这里,由于vdsp没有直接提供log2f函数,这是我们自己添加的,编译器自然没有看到log2f的函数声明,因而自以为是地认为它将返回一个整数,故此计算出错。
在config.h里加上函数声明:
extern float log2f(float x);
就OK了。
接下来运行:
Device 0:a: x264 [info]: 320x240 (given by file name) @ 25.00 fps
x264 [info]: using cpu capabilities: none!
x264 [info]: profile High, level 1.3
[0.3%] 1/301 frames, 5076.14 fps, 5612.40 kb/s, eta 0:00:00
[0.7%] 2/301 frames, 8230.45 fps, 3359.50 kb/s, eta 0:00:00
[1.0%] 3/301 frames, 11235.96 fps, 2274.20 kb/s, eta 0:00:00
显然,这里的帧率和码率的计算是错误的,原因在于x264使用了一个叫x264_mdate的函数来计算时间:
int64_t x264_mdate( void )
{
#ifndef __MINGW32__
struct timeval tv_date;
gettimeofday( &tv_date, NULL );
return( (int64_t) tv_date.tv_sec * 1000000 + (int64_t) tv_date.tv_usec );
#else
struct _timeb tb;
_ftime(&tb);
return ((int64_t)tb.time * (1000) + (int64_t)tb.millitm) * (1000);
#endif
return 0;
}
显然我们在这里犯了错误,由于在系统中这个函数的作用仅仅是计算时间差做为依据,因而我们用clock代替它:
int64_t x264_mdate( void )
{
return clock() / CCLK;
}
clock函数将返回自程序启动以来的tick数,我们将之除以内核的运行频率(以M为单位),自然就得到了自程序启动以来的微秒数。
再运行:
Device 0:a: x264 [info]: 320x240 (given by file name) @ 25.00 fps
x264 [info]: using cpu capabilities: none!
x264 [info]: profile High, level 1.3
[0.3%] 1/301 frames, 0.00 fps, 5612.40 kb/s, eta 19:42:44
[0.7%] 2/301 frames, 0.01 fps, 3359.50 kb/s, eta 12:07:15
[1.0%] 3/301 frames, 0.01 fps, 2274.20 kb/s, eta 8:51:35
[1.3%] 4/301 frames, 0.01 fps, 1951.05 kb/s, eta 8:32:14
………………
[49.5%] 149/301 frames, 0.01 fps, 689.16 kb/s, eta 2:52:01
[49.8%] 150/301 frames, 0.01 fps, 692.47 kb/s, eta 2:51:29
[50.2%] 151/301 frames, 0.01 fps, 687.98 kb/s, eta 2:49:39
[50.5%] 152/301 frames, 0.01 fps, 692.33 kb/s, eta 2:49:05
…………………
[89.7%] 270/301 frames, 0.01 fps, 823.95 kb/s, eta 0:35:07
[90.0%] 271/301 frames, 0.01 fps, 820.94 kb/s, eta 0:33:55
[90.4%] 272/301 frames, 0.01 fps, 824.79 kb/s, eta 0:32:49
…………..
[99.3%] 299/301 frames, 0.01 fps, 817.51 kb/s, eta 0:02:13
[99.7%] 300/301 frames, 0.01 fps, 814.85 kb/s, eta 0:01:06
[100.0%] 301/301 frames, 0.02 fps, 812.22 kb/s, eta 0:00:00
x264 [info]: frame I:2 Avg QP:19.15 size: 32354
x264 [info]: frame P:156 Avg QP:22.17 size: 6896
x264 [info]: frame B:143 Avg QP:27.90 size: 573
x264 [info]: consecutive B-frames: 5.7% 90.3% 4.0% 0.0%
x264 [info]: mb I I16..4: 0.5% 30.3% 69.2%
x264 [info]: mb P I16..4: 0.0% 0.1% 0.2% P16..4: 39.7% 24.8% 29.0% 0.0% 0.0% skip: 6.1%
x264 [info]: mb B I16..4: 0.0% 0.0% 0.0% B16..8: 24.7% 1.1% 2.6% direct: 7.2% skip:64.5% L0:40.6% L1:34.6% BI:24.8%
x264 [info]: 8x8 transform intra:30.9% inter:29.9%
x264 [info]: coded y,uvDC,uvAC intra: 99.7% 100.0% 98.4% inter: 38.7% 39.1% 31.5%
x264 [info]: i16 v,h,dc,p: 0% 0% 0% 100%
x264 [info]: i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 11% 10% 14% 12% 10% 8% 7% 13% 15%
x264 [info]: i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 14% 9% 11% 11% 10% 11% 8% 12% 13%
x264 [info]: Weighted P-Frames: Y:0.0%
x264 [info]: ref P L0: 49.8% 25.6% 9.7% 14.9%
x264 [info]: ref B L0: 79.9% 20.1%
x264 [info]: kb/s:812.22
encoded 301 frames, 0.02 fps, 812.22 kb/s
这个速度不是一般的慢。
用vlc对生成的my.264进行解码,一切OK。
再用baseline profile跑一下:
x264 –profile baseline -o my.264 f://media//enc-demo-320x240.eyuv
Device 0:a: x264 [info]: 320x240 (given by file name) @ 25.00 fps
x264 [info]: using cpu capabilities: none!
x264 [info]: profile Baseline, level 1.3
[0.3%] 1/301 frames, 0.03 fps, 5262.60 kb/s, eta 3:07:48
[0.7%] 2/301 frames, 0.04 fps, 2975.30 kb/s, eta 2:00:19
[1.0%] 3/301 frames, 0.05 fps, 2289.33 kb/s, eta 1:47:20
……………
[99.3%] 299/301 frames, 0.06 fps, 1089.09 kb/s, eta 0:00:31
[99.7%] 300/301 frames, 0.06 fps, 1085.47 kb/s, eta 0:00:15
[100.0%] 301/301 frames, 0.06 fps, 1081.88 kb/s, eta 0:00:00
x264 [info]: frame I:2 Avg QP:20.08 size: 30999
x264 [info]: frame P:299 Avg QP:23.04 size: 5238
x264 [info]: mb I I16..4: 2.3% 0.0% 97.7%
x264 [info]: mb P I16..4: 0.0% 0.0% 0.1% P16..4: 46.6% 22.8% 15.0% 0.0% 0.0% skip:15.5%
x264 [info]: coded y,uvDC,uvAC intra: 99.6% 100.0% 98.9% inter: 51.1% 55.4% 44.2%
x264 [info]: i16 v,h,dc,p: 0% 0% 67% 33%
x264 [info]: i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 14% 10% 11% 12% 9% 10% 8% 13% 13%
x264 [info]: ref P L0: 65.3% 16.3% 18.4%
x264 [info]: kb/s:1081.88
encoded 301 frames, 0.06 fps, 1081.88 kb/s
300帧图像编码完成总共用了 0x294 * 2^32 个CYCLE。
现在我们有了一个可以正确运行的版本,虽然它很慢。
下面我们先针对baseline profile进行优化。
近日,我家6岁的小姑娘参加了第六届POP全国少儿英语风采大赛,拉票进行中(2011-6-15前)。
请帮忙点击新东方网站的链接:
http://popdasai.xdf.cn/toupiao.php?do=space&uid=4237
投她一票,谢谢!
ADSP-BF561软件优化(2):移植x264(2009-11-19)
ADSP-BF561软件优化(1):开篇(2009-11-18)