AV1平滑缓冲区
对于解码的每一帧视频数据,解码器都必须从缓冲池中找到一个尚未被使用的帧缓冲区插槽来存储解码后的数据。分配的帧缓冲区插槽用于临时保存解码过程中生成的帧数据,直到它们被用于显示或进一步的处理。函数get_free_buffer的作用是在缓冲池中搜索尚未被分配使用的帧缓冲区。在解码过程中,解码器需要统计存储在缓冲池中的解码帧数量,来计算显示帧的显示时间。函数frames_in_buffer_pool 的作用是统计并返回缓冲池中已经被使用的帧缓冲区插槽总数。函数get_free_buffer 和frames_in_buffer_pool定义如下
2.5.2 平滑缓冲区
除了缓冲池之外,AV1解码器还包含平滑缓冲区Smoothing Buffer. 平滑缓冲区用于存储还未被解码的比特流。在解码过程中,平滑缓冲区要确保解码器有足够的内部存储器来存储达到的比特流数据。并且还要确保下一帧的压缩数据在解码器需要时已经在缓冲区中。
2.5.3 帧时序定义
为了描述平缓缓冲区的状态变化,解码器模式对帧时序进行了定义。AV1解码器模型以DFG 为单位来描述平滑缓冲区的状态。索引为i的DFG是指由所有位于帧i - 1 的最后一个OBU于帧i的最后一个OBU之间的OBU。这里需要注意的是,DFG i除了包含构成帧i的OBU之外,还可能包含位于帧i - 1和帧i之间的show_existing_frame等于i的帧头OBU。此外DFG的索引i仅仅在show_existing_frame 标志为0的帧中递增,这意味着只有在需要进行解码操作的帧中,DFG的索引才会更新,这是因为,当show_existing_frame标志为1时,表示输出已经解码完成的帧,在这种情况下,解码器并不会解码新的视频帧,而只是输出已经解码完成的帧,所以DFG的索引i不会被更新。
1 到达开始和结束时间
在AV1的解码器模型中,比特流到达平滑缓冲区的速率只有两种,以恒定速率BitRate到达缓冲区,或者以速率0到达缓冲区,其中BitRate 的峰值比特率,BitRate = MaxBitrate * BitrateProfileFactor,其中MaxBitrate和BitrateProfileFactor由Profile来确定,参数Bitrate的具体设置方式请参考AV1标准文档A.3 节。AV1解码器模型使用变量FirstBitArrial[i]表示DFG i的第一个比特到达平滑缓冲区时间,使用变量LastBitArrial[i] 表示DFG i最后一个比特到平滑达到平滑缓冲区的时间,使用变量ScheduleRemoval[i]表示计划吧DFG i从平滑缓冲区删除的时间。