天天看點

【分享】保留VCU解碼圖像buffer和增加buffer個數的辦法

有些産品中,使用VCU解碼圖像後,還需要做一些特殊的處理。如果直接把位址傳遞給特殊處理子產品,大多數情況運作正常,有時會發現資料錯誤。

這個問題,是因為顯示函數釋放buffer造成的。解碼前,解碼器從buffer管理子產品申請buffer。由于有多個buffer,解碼器申請buffer時,通常申請到舊的buffer。看起來,buffer時循環使用的。但是有時候,解碼器申請到的buffer,也是兩三幀前剛使用過的。如果特殊處理子產品占用buffer時間太久,就會導緻解碼器把資料寫入了特殊處理子產品還在占用的buffer,進而發現資料錯誤。

正确的做法是,如果有特殊處理子產品,顯示函數就不要釋放buffer,應該等特殊處理子產品用完後再釋放buffer。最簡單的做法,顯示回調函數sFrameDisplay()調用的Display::Process()函數裡,不調用AL_Decoder_PutDisplayPicture(hDec, pFrame)。

當然,這又會觸發另外一個問題,由于特殊處理子產品占用buffer,解碼器申請不到buffer。這時,再更改檔案exe_decoder\Main.cpp裡的變量uDefaultNumBuffersHeldByNextComponent的初始值,就能額外申請一些buffer。VCU CTRL SW預設申請了一個。之後,再CTRL SW的decoder運作時,會列印解碼後YUV Buffer的個數。我們可以從列印中,檢查更改是否生效。比如,預設情況下,1080分辨率使用19個buffer。

Resolution: 1920x1080     FourCC: NV16     Profile: 4     Level: 51     Bitdepth: 8     Sequence picture: progressive     Buffers needed: 19 of size 4456448           

繼續閱讀