x264 帧级多线程编码中的线程同步
不同于 slice 级多线程,当开启帧级多线程的时候,视频编码是以帧为单位的,即每一帧只会由同一个线程编码完成,内部不会切分。
现在假设开启了 2 个编码线程,分别编码前一帧和后一帧,且后一帧运动搜索需要参考前一帧。这时:
- 由于线程 B 编码的帧运动搜索需要参考线程 A 正在编码的帧,所以线程 B 需要考虑和处理线程同步逻辑
- 线程 B 在编码当前宏块行的第一个宏块前,会等待线程 A 正在编码的帧,至少已经编码完毕了
当前位置 + i_mv_range_thread的长度

所以能够看到:
- 帧级多线程编码遇到参考依赖关系时,并不会完全等待被参考帧全部编码完毕后才会启动编码当前帧,而是设定一个等待范围,只要保证被参考帧这个范围内的宏块被编码完,就可以启动编码了
- 以宏块行为单位进行编码同步,而不是以整帧为单位,多线程同步粒度变小,提升了并行度
至于 i_mv_range_thread 变量的值是如何得到的,参考:https://blog.csdn.net/fantasy_ARM9/article/details/117840472
另外线程同步的逻辑见 encoder/analyse.c::mb_analyse_init() 函数

浙公网安备 33010602011771号