天天看点

关于录像添加水印闪烁问题的总结

最近在做一个视频录像时添加水印的工作,添加水印的方式和实现暂且不提,有时间再详细说明,今天主要总结一下在添加水印过程中,出现的水印字符一直闪烁,字符中间出现断续线的问题。

       因为这个添加水印的原理其实就是修改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根本没有把写的东西刷新到真正的内存上,所以会出现断断续续的线,字符像素点时有时无。

      最后,写博客还是好习惯啊,只可惜在华为三四年,习惯丢了。如今重新捡起吧~~