FFmpeg HEVC 環路濾波Bug分析一

2021-08-21 11:19:38 字數 1445 閱讀 4926

環路濾波以ctb為單位進行處理,且dbf先於sao進行處理。dbf的處理順序是:首先對整個影象的垂直邊緣進行水平濾波,然後對水平邊緣進行垂直濾波。sao演算法有邊界補充和邊帶補償兩種。由於dbf和sao兩種濾波器之間的先後關係,在實現時可以有多種不同的實現:可以先對整幀做dbf,然後做sao,標準的hm就是這樣做的;也可以先對乙個ctb做dbf,然後對另乙個符合條件的ctb做sao,ffmpeg中就是這樣子做的;也可以先對乙個ctb行做dbf然後再對乙個ctb行做sao,ittiam hevc decoder(ittiam是家印度公司,他們的解碼器被google整合到了android源**裡)。ittiam hevc decoder是目前已知的最快的開源解碼器,當然最快並不是因為它的濾波部分的原因,主要是由於它其他方面的設計:比如指令集的優化,引數解析和解碼的順序,以及資料的儲存設計等。

下面主要針對ffmpeg中dbf和sao部分的乙個bug進行分析。

在hevc標準中dbf以ctb為單位,在處理的時候以8×8的塊為單位進行濾波,濾波是先對垂直邊界做水平濾波,然後對水平邊界做垂直濾波,如下圖所示,先做ab邊的濾波,再做de邊的濾波,最後做ac邊濾波。在做ab邊的濾波的時候需要用到ab邊左右各四個畫素值,也就是由133、140、245和252所圍成的四邊形區域的畫素值,濾波的同時可能會改變134、139、246和251所圍成的四邊形區域的畫素值。做de邊濾波是也可能會改變對應的畫素值,最後對ac邊進行濾波,在對ac邊進行濾波的時候用到的畫素值是已經經過垂直濾波處理過後的畫素值。

sao是在dbf之後,用到的是經過dbf處理之後的畫素值。如下圖所示,圖中每個小方格表示乙個ctb,假設當前處理的是第12個ctb,由於幀內**需要使用未經dbf濾波的原始畫素值,所以處理第12個ctb的時候,第9、10、11和12的dbf都不能做,因為,如果做了dbf濾波,那麼第13、14、15和16等ctb在做幀內**的時候就無法獲取到未經濾波的畫素值,那麼就只能做第7個ctb的dbf,做第2個ctb的sao操作,這是ffmpeg的實現設計。當sao採用邊界補償的方式,並且符合第三種對角型別的時候,處理第7個ctb需要使用第12個ctb左上角的乙個畫素值,但此時第12個ctb還沒有經過dbf處理,顯然不可行,所以第7個ctb的dbf處理完成的時候,只能處理第2個ctb的sao。在處理第7個ctb的dbf的時候,最上面的邊的最右邊的8個畫素不能處理,需要等到第8個ctb的最左邊的垂直邊處理完成後才能處理第7個ctb最上面邊的最右邊的8個畫素,因為,處理第8個ctb的最左邊的垂直邊的時候會改變第7個ctb的畫素值,在這之後再處理第7個ctb的上面邊的8個畫素,才符合整體上先垂直邊,然後水平邊的設計思路。

bug程度分析

此欄位描述 bug 的嚴重等級。blocker,critical,major,normal,minor,trivial,enhancement blocker 會擋掉所有開發中 測試中的工作 critical 系統發生 crash 資料遺失 嚴重的記憶體流失 major 功能出現較大型的問題 nor...

深入BUG分析

一 認識bug 軟體bug是由於軟體開發者的疏忽和失誤造成的。軟體bug是軟體生命週期內發現和未被發現的所有問題總和。全面質量管理和全程軟體測試 軟體bug不單指軟體測試階段發現的軟體系統的功能性錯誤,還應包括軟體開發過程中需求 設計 開發等階段評審過程發現的問題,以及軟體發布後客戶發現並反饋的問題...

定位到bug之後,分析bug

1.抓包分析 web測試過程中,怎麼判斷前端bug還是後端bug?可以通過抓包工具來進行抓包分析。大多數的瀏覽器都有自帶的抓包外掛程式,如firefox的firebug外掛程式,chrome 360急速模式 搜狗高速模式自帶的developtools外掛程式,f12開啟抓包後,在network中可以...