h264长期参考帧管理,在x264编码器中并没有详细实现,因为这一块是用户自定义的行为。
L0表示向前参考,当没有B帧的时候,L0是一个滑动窗口,永远保存最近的refs帧个数。
reordering_of_pix_nums_idc == 0表示前向的参考帧 diff + 1, ==1 表示后向的。前向的时候,为啥有负值?因为帧序号有可能因为存储的bits不够,回绕了。
如果 == 2,表示这里存放的是长期参考帧的绝对值。 这里写这个语法的意思是,当前帧参考的哪些帧,如果这一帧解码完成之后,上面的帧都可以尝试释放掉了。 另外有一个问题就是, 我们不能严格的按照编码的顺序来排序参考帧,因为有重要的和不那么重要的。
比如以下这种结构
B B
I P P P
编码顺序是I P B P B P 这样,按照参考帧淘汰顺序,就是最先淘汰的是IDR,这样肯定不行。于是就要重新排序,把不那么重要的放在最前面。
这里是前向的参考,后向的参考是类似的。
这个是前后向解码的时候,参考帧淘汰逻辑。
接下来看看长期参考帧管理。
memory_manaement_control_opertaion 简称MMCO
当操作为1和3时,这里标记的是一个相对frame_nums值,当前帧解码完了,意思是可以删除当前帧参考的这个帧了。
当操作为2 时,意思是把某一个帧指定为长期参考帧,可能大多数时候都是指定的自己这一帧。把这个短期参考帧标记为长期参考帧,并且给他一个全局的帧序号。
4 的含义就是设置一个最大长期参考帧序号,大于这个最大值的长期参考帧可以从参考帧列表里面去掉了。
5 标记一个帧为IDR来了,清除参考帧列表。
6 标识一个帧为长期参考帧,并分配一个长期参考帧编号
具体这些如何使用,后面再分析下。 看起来这个逻辑关系设计有点复杂,解码倒是容易,编码的时候麻烦。