天天看點

關于錄像添加水印閃爍問題的總結

最近在做一個視訊錄像時添加水印的工作,添加水印的方式和實作暫且不提,有時間再詳細說明,今天主要總結一下在添加水印過程中,出現的水印字元一直閃爍,字元中間出現斷續線的問題。

       因為這個添加水印的原理其實就是修改YUV資料,在字元像素點出現的地方将對應位置的Y/UV數值改為對應的字元像素值,原理很簡單,但是為什麼出來的效果會是字元線條會有斷續呢? 第一反應是是不是修改YUV資料不對,但是把YUV資料dump出來後發現YUV資料是ok的,并且,加入write yuv檔案之後,由于寫檔案導緻流程變慢,問題解決了。但是,也不能一直都寫檔案啊...  寫檔案流程變慢,和時序有關?等等,這個問題怎麼好熟悉,似曾相識燕歸來.....

      那還是2014年,哥還在華為的時候,當時搞jpeg編解碼,當時和camera拍照對接的時候,就出現過類似的現象:camera拍完照之後,資料有問題,資料不完整,部分資料疊加的現象,dump YUV資料是好的... 

      當時是怎麼解決來着..... 腦袋裡空空,全沒影啊,隻記得到當時的懷疑和現在一樣,和時序有關.....是以說,好記性不如爛筆頭啊!

     ……

      折騰N久,終于搞定。曾嘗試的不同辦法和思路不提了。現在着重說下問題的原因和解決方法,以防再犯。

      兩個問題,同一個原因:cache沒重新整理......

      一般系統記憶體管理上都會使用緩存來提升對記憶體操作的性能,尤其在操作有硬體使用記憶體(JPEG資料來自isp,錄像資料也來自ISP)的時候,cpu在中間介入,對記憶體資料進行修改的時候,并不能立刻讓修改生效而需要重新整理記憶體。之前在華為解決拍照花屏問題,也是如此。隻是當時調用ion記憶體管理接口,出了問題之後最終定位是由記憶體管理子產品同僚一起幫着解決的,是以對問題的根源并未有太深的印象,隻記得當時ion更新了一把接口之後,問題就出現了(實際上是,ion老的接口是每次lock後都會自動重新整理系統cache,而由于這種方式代價比較大,是以,後續版本優化之後,變成有記憶體申請和調用者去主動通知底層重新整理cache,而這個api的改動我們并不知曉)。後來及時更新記憶體操作接口問題解決。

      而這次問題也一樣,我在對YUV資料進行cpu寫記憶體操作的時候,沒有進行cache重新整理。在解決問題過程中,曾懷疑是isp硬體在cpu未修改完YUV資料之前就重新整理了這一段記憶體,是以曾嘗試添加lock來鎖住,但實際上并不是isp更新快了,而是cpu根本沒有把寫的東西重新整理到真正的記憶體上,是以會出現斷斷續續的線,字元像素點時有時無。

      最後,寫部落格還是好習慣啊,隻可惜在華為三四年,習慣丢了。如今重新撿起吧~~