>>dsp移植
一个是算法层。用替代算法调整,使得丧失一定的性能下能大幅度的提高计算速度。比如修改运动搜索等。
一个是组织结构层。分数据结构和代码结构。一个简单的道理,如果有一个函数每个宏块都需要调用。但是当该宏块该函数调用后。其他函数的调用。冲掉了PM的的一级甚至二级CACHE内的代码。则下一次宏块调用必须要从外部MEMORY提取,这就是数据等代码,危害很大。而同样的道理。比如有个计算需要用到MV的信息。而MV的信息是分开存储到每个宏块的记录结构中。那么对相临的MV的操作,CACHE内很难击中相临宏块的MV。另,对于imgpel如果是INT边界对齐,那么提取imgpel时,可以按int直接提取4个数据后再处理,这比取4次8位的要快。
一个是代码层。利用空间换速度。比如4X4的简单计算,就扩展代码等等。利用?:修改if else。有些编译器和硬件对执行?:与if else的效率是不一样的。
一个是汇编层。主要针对并行计算或CPU特定资源的利用。一般不需要写汇编。而是告诉编译器指定位置如何特殊编译就可。
就我的认为,与其在汇编代码上做文章,花这个时间,做什么都能或得更好的效率提升。毕竟现在各个大公司的编译器都做的不错。
>>运动估计
1. 以pmv为起始点做小菱形搜索;
2. 以(0,0)为起始点做小菱形搜索;
3. 如果是16x16以前一帧相同位置MB的mv作为起始点做小菱形搜索;如果不是16x16以前面做过的16x16搜索到的 mv_uplayer做起始点做小菱形搜索;
4. 以当前最好位置做小菱形搜索;
5. 提前退出判断;
6. 在x,y轴上分别振荡搜索,y轴搜索范围是x轴的一半;
7. 提前退出判断;
8. 以当前最好位置为起点 螺旋搜索;
9. 提前退出判断;
10. 以当前最好位置为起点 大六边形搜索;
11. 提前退出判断;
12. 以当前最好位置为起点 小六边形搜索;
13. 小菱形搜索