對于解碼的每一幀視頻數據,解碼器都必須從緩沖池中找到一個尚未被使用的幀緩沖區插槽來存儲解碼后的數據。分配的幀緩沖區插槽用于臨時保存解碼過程中生成的幀數據,直到它們被用于顯示或進一步的處理。函數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從平滑緩沖區刪除的時間。