1. 引言
在播放H.264码流的时候,进行NALU的搜索的效率高低影响着系统的性能。有采用普通逐字节搜索的算法,有利用cpu的simd的单指令多数据操作的并行功能进行搜索的算法,今天要介绍的是一个非常简单而且高效的快速搜索算法,而且不需要利用simd指令,搜索的速度甚至快于我之前开发的simd版本的搜索算法, simd版本可以参考[H264/H265 NALU 起始码搜索性能优化(2)]
2. 算法原理
我们假设有一个待搜索的H264视频的缓冲区,当前搜索指针是p,如下图:
下面我分几种情况来进行讨论:
2.1 情况1
2.2 情况2
2.3 情况3
2.4 情况4
2.5 总结
在本算法中,巧妙地采用了从后向前匹配的方式进行搜索,先,再,最后再,一旦知道 > 0(这种情况是大概率事件),直接往后跳3个字节,这样子就大大提升了搜索的性能。
3. 算法实现
按照上述的原理描述,可以很容易写出以下代码:
void split_nalu(const uint8_t *data, size_t size, vector<int>& nalus)
{
const uint8_t *p = data;
const uint8_t *end = data + size;
p = data + 3;
while (p < end) {
if (p[-1] > 1 ) p += 3;
else if (p[-2] ) p += 2;
else if (p[-3]|(p[-1]-1)) p++;
else {
nalus.emplace_back(p - 3 - data);
p++;
}
}
return;
}