海思3559万能平台搭建:YUV422的踩坑记录
前言
万里长征永远不可能一帆风顺,记录下一个看似寻常却对后续开发举足轻重的一次踩坑记录,这次之后,全新的问答搜索乱撞式的debug就要翻篇,开始正向的定位开发啦!
背景
经过一番对YUV420的折腾,相对而言差不太多的422格式本没放在心上,再加上有前同事用过这样的格式,似乎只是修改属性参数PIXEL_FORMAT_E的事情呗?
过程记录
最开始肯定是想当然的改了vpss的参数,自然不生效,因为对vi的理解并不深刻,之前由于都是传感器加载的问题,感觉自己配了也没用反正会调api从传感器里取参数,就没改,这样肯定是不对滴。而后尝试将vi也改成PIXEL_FORMAT_YVU_SEMIPLANAR_422之后,却还是在目前构建的通路上没有后续输出。所幸,角度旋转的坑让我注意到venc的设置肯定有哪里是不完善的。
可是基本参数的配置里,也就是venc通道的属性结构体又是没有这个成员的啊!这个绝对是肯定的!按理来讲海思这样严谨统一的代码风格,应该和vivpss一脉相承下来啊!为什么死活找不到呢?
面对越来越刁钻越不好搜索的问题,单单搜索看帖就花费了大量时间精力却回报甚微,突然在某次按下回车后感觉到每次都这样依靠问答来解决问题肯定不是个办法,除了要解决问题,我还要找到解决问题的办法!正所谓授人以鱼不如授人以渔。
回想起接触海思有段时间了,正向的排查更正思路老是建立不起来,不可能所有人都像大佬一样经验丰富触类旁通啊,在论坛和相关资源都不完善的时候,之前的开发者都是怎么做的呢?!他们是怎么排查解决问题的呢?只靠一本薄薄的开发手册吗?手册虽然详尽却很难及时快速的找到坑的注意事项啊!
思路一
最基本的学习办法肯定是搭配手册啃sample,既然给了这么丰富的sdk自然要利用起来。
首先搜索的就是422格式在sample里是怎么用的。所幸venc的最后一个case就用到了,反复对比从mpp初始化到vi再到vpss venc的所有通道属性,再在手册venc部分反复查找,
肯定是没看仔细,容我再看一遍
大佬,真没有啊
真的吗我不信,你上次就说真没有了
我。。我真的详细对比了,除了要实现的功能外,真的都一样啊
是吗,那为什么sample就可以呢?
是啊,为什么就可以呢?!
思路二
还是老办法,论坛搜索随缘靠同样的踩坑者找答案。提高搜商还是在解决问题性价比较高的方案了,毕竟最快解决问题才是王道。当然更高级一层的是直接避免问题,那就需要长年累月的积累靠基本功体系了,没法速成,但一定一定不能摒弃。
思路三
海思的log机制.搜着搜着,发现即便是解答了无数海思平台疑难杂症的大神也不可能面面俱到什么坑都踩过啊,他又是怎么定位的呢?答案是看log。海思平台有着非常完善的log机制。手册里详细的介绍了/proc/umap下的各个模块,之前倒是也简单看过一点,但是没有把他当成正经的分析工具,而且最为重要的排查logmpp,实际是放在/dev目录下的,并不在/proc下(这章的目录叫proc调试信息说明,看目录清单也是),其实深入仔细看13.4的LOG章节,也提到了/dev目录下的log(手册是真的基本都有,但是真的不好找啊)
既然想到日志了,那就用日志先结合思路一,看看sample到底有什么妖
修改vivpss的通道属性后,远程登录
cat /proc/venc观察,发现编码通道的图像格式仍然是YUV420,类似之前旋转的分辨率问题,也定位到了venc部分,是在编码设置的问题
主进程超时
再跑sample里422格式的进程
同样查看venc通道属性,这不,说明编码通道肯定是支持YUV422SP的
可就是完全找不到修改编码通道属性中关于图片格式的设置入口啊
反复对比两个sample差异,做了两个实验:
实验条件:
sample1 h264编码 默认设置YUV420SP sample5 mjpe编码 默认设置YUV422SP
实验1:
将sample1的vi vpss属性设置为yuv422sp,此时cat到的venc通道属性仍未YUV420sp
实验2:
将sample5中的vi vpss属性设置为yuv420sp,此时cat到的venc通道属性自己变成了YUV420sp!
这就再一次确定了这个属性确实可以更改且都支持两个格式
思路二开始立大功了。在论坛刷见这样一个说法
会不会3559也是这样呢?
于是就又做了实验,将sample5的编码类型改为了h264,其余还是默认设置YUV422SP,果然发现venc通道属性自动变成了YUV420SP!
结论
也就是说手册上并没有明确的表述。但是venc的通道属性确实没有单独配置的入口,是通过venc_sendframe中VIDEO_FRAME_INFO_S结构体里的属性都保持一致的,但是由于编码类型不一样,h264不允许YUV422SP格式,就会强行转为YUV420SP
思路三的作用要是仅止于此肯定就不会单开一篇记录了,第二天一觉清醒后又刷到了logmpp的提醒,终于真相大白(格式25在枚举类型里就是YUV422SP。26是YUV420SP)
这时思路一再次跳出来争宠了:我这最基本的指南不认真看,出了问题怪谁!(真不好找啊对于完全不熟悉框架的小白而言)
HI_MPI_VENC_SendFrame函数的注意事项中提及完完全全盖章定论,sample最底层实际上肯定调用到了这一函数,vpss的图像开始编码都经过了他,(虽然表象上只是vpss和venc做了绑定就再也没管了),所以说sample的编码格式更改h264后编码通道也强行变成了420.而且我们自己搭建的通路不是还特意调用了吗!代码框架设计就不符合人家的规范了呀!
补充
对了,下一篇提到的ive工具里也有海思自带的420和422互相转换的办法
想到一个理论上最简单的方式,可能底层也跟这个差不多吧?
YUV4:2:2 —> YUV4:2:0 : Y不变,将U和V信号值在行(垂直方向)在进行一次隔行抽样。
YUV4:2:0 —> YUV4:2:2 :Y不变,将U和V信号值的每一行分别拷贝一份形成连续两行数据。
教训。
解决问题的思路肯定是不能每次都瞎蒙或者单纯靠搜的,最最离不开的就是自身基础知识的积累,经验的丰富,眼界的提升,这是看待问题解决问题的基础,搜索的即时性补强只能起到添砖加瓦的作用,毕竟是工作,要第一时间解决问题,但一定一定不能忘了减少问题避免问题需要系统体系的学习积累;
其次就是要尽量用正向的思维去解决问题,每个平台会有自己独有的醒悟方式,但也会有共同的debug办法,比如遇见段错误后拿gdb调试啊,看dump文件啊,像海思类似的日志功能更是提供不少方便,同理在以后的工程框架里是不是也需要加入日志呢(之前的glog也是个很棒的开源项目),最最最不济,老苯办法printf定位大法总会有所帮助吧
不要慌不要紧,即便是全新的工作环境也要重拾信心,技术固然各领域有所不同,但也总会有殊途同归的部分,加油!
海思3559万能平台搭建:YUV422的踩坑记录相关推荐
- 海思3559万能平台搭建:DDR移植的一些问题
前言: 开发板是绝对无误的硬件环境,但是我们平时的开发肯定会接触自己搭建的硬件环境,难免会有这样那样的小问题,这里给出一次DDR的调试过程 问题描述 海思3559开发板可以用默认配置表格生成的 ...
- 海思3559万能平台搭建:串口编程
前言 平常的工作使用中,总是免不了要和串口打交道,协议的收发也经常通过串口来实现,海思3559下的串口和标准的linux下串口大同小异,可以参考之前zynq的串口编程,也可以直接阅读本文 使能串口 ...
- 海思3559万能平台搭建:OSD实时叠加的支持1SDL库 FREETYPE库 SDL_TTF库的移植
前言 万能平台字符叠加的功能自然少不了,但海思默认支持的都是静态位图,如果实时刷新或者我们向在屏幕上显示一些中文信息就捉襟见肘了,所以这里需要参考移植开源项目SDL的库来帮我们实现这一想法 网 ...
- 海思3559万能平台搭建:获取数据帧修改后编码
前言 有了这么长的铺垫和反复的啃sample,现在开始搭建自己的平台就底气多了,倒也不至于万能平台哈哈,只是在完成配置文件的功能后,可以不用改代码重新编译,就可以实现多场景多平台多功能下的使用了 ...
- 海思3559万能平台搭建:在截获的YUV图像上画框
前言 万里长征第二步,YUV的认识和编码还在进行中,熟悉了YUV格式的原理和储存方式后,我们就可以结合第一步中从vpss通道截获的YUV图像上尝试修改,叠加自己的算法,先简单粗暴的改改,后续在替换 ...
- 海思3559万能平台搭建:添加一个新的sensor
前言 海思对摄像头的支持是只有固定的,如果我们想更换新的相机,让fpga接入通过lvds接口给3559提供视频源的话,除了相关配置,还需要添加新的sensor库,编译新的isp库,而且,如果移植不 ...
- 海思3559万能平台搭建:OSD功能的优化
前言: 功能测试的OSD使用还是比较简单的,随便找个位置做个时间戳,背景还是黑色,且只能显示一行,很明显效果并不是那么理想,这里做一个升级,对海思区域叠加的配置以及osd窗口的创建等都在本文一并写 ...
- 海思3559万能平台搭建:OSD的自动反色
前言 OSD功能在之前两篇中已经满足了大部分的应用场景,为了进一步提升效率和自适应环境亮度和反色,这里介绍改进方法 效率提升 我们之前整体的流程框架是这样的:TTF初始化,打开字体,区域初始化 ...
- 海思3559万能平台:VGS的画线处理
前言 海思的OSD功能除了之前提到的第三方库,自己的VGS也可以做到一些简单的诸如画线之类的操作,这里介绍下假如类似识别时需要画矩形框的时候可以的一种做法 海思VGS简介 海思的VGS 是视频 ...
- STF环境搭建运行及踩坑记录
最初是在centos环境上搭建STF,由于种种依赖缺失.nodejs/npm版本不兼容.以及无解的"Segmentation fault (core dumped)"错误,最终还是 ...
最新文章
- pandas使用idxmin函数获取dataframe每个数据行中最小值对应的列名称(column label of min value in each row in dataframe)
- ADO读取EXCEL
- 2019谷歌学术指标出炉,影响因子何去何从?
- Java 集合类图(转)
- Leetcode 141. Linked List CycleJAVA语言
- .net中C#代码与javaScript函数的相互调用问题
- java单例模式7种_Java 单例模式的7种写法
- python编程是啥-什么是Python编程课程
- 互联网的未来之下:政权 金权 人权 无关平权
- 一个用python写的从数字高程格式文件(DEM)中提取水系的模块
- paip.mysql 性能跟iops的以及硬盘缓存的关系
- 很火的清新PHP在线扒站程序源码
- 能源巨头BP称已经测试了“内部”代币
- 阿里云“芝麻信用互查”产品接入使用过程中遇到的那些坑以及解决方案
- html表格(table)的基本结构
- [Unity]摘录笔记UnityShader(解读shader代码构成)
- 计算机基础文化课认识,【计算机基础论文】计算机基础的教学改革解析(共4653字)...
- java零项目经验,找工作前该如何准备项目?面试时又该怎么说?
- 十二星座匹配对象_来看十二星座最配与最不配的对象是谁
- 从零开始搭建自己的网站二十一:网站IP/PV统计功能设计
热门文章
- JavaWeb项目为什么我们要放弃jsp?为什么要前后端解耦?为什么要前后端分离?2.0版,为分布式架构打基础。
- minium环境配置——微信开发者工具
- 编程c语言中文图形代码,C语言图形编程代码
- 非主流文字转换_一篇搞定微信公众号文字排版(全干货,推荐收藏)
- Python基础教程,Python入门教程(超详细)
- Ubuntu22.04(Linux Mint 21)安装使用绿联USB无线网卡CM448(rtl8821CU)的方法
- 信息系统项目管理师必背核心考点(二十四)WBS分解的原则
- 2019年技术盘点容器篇(三):阿里专家谈容器:既叫好又叫座? | 程序员硬核评测
- 杨永强“兑”现承诺 乐视云发力VaaS
- 《金字塔原理》读书摘记