最近需要修改Davinci本地输出显示的Logo,但是TI的
Software OSD on DM36x
User Guide写得很模糊,很多东西都不全,于是决定绕开TI提供的工具,使用开源社区的工具重新制作一遍。
1. 生成一副160x64的jpeg图片这里推荐用Ubuntu下的GIMP工具,不过也可以用其他工具
2. 将160x64的jpeg图片转换成yuv422这里使用IMAGE MAGICK工具,在ubuntu需要安装如下包:sudo apt-get install imagemagick
安装完之后对应使用convert命令:convert LAB1307.jpg LAB1307.uyvy
这里转换后的顺序是uyvy4223. 将得到的图片重命名,否则ffmpeg无法识别cp LAB1307.uyvy LAB1307.yuv
4. 用ffmpeg将uyvy422格式转换成yuv420pffmpeg在ubuntu下有大量的安装包和插件,尽量装全吧:ffmpeg -pix_fmt uyvy422 -s 160x64 -i LAB1307.yuv -pix_fmt yuv420p LAB1307_420p.yuv
注意:这里解释一下,用-pix_fmt设置图像的格式,用-s设置图像大小,-i用来指定输出文件,ffmpeg -pix_fmts命令可以查看所有支持的格式, 这里务必需要使用-pix_fmt以及-s选项,否则无法正常转换另外这里生成的LAB1307_420p.yuv可以使用mplayer播放来验证是否是yuv420p格式的图像,如下图所示:mplayer -demuxer rawvideo -rawvideo w=160:h=64:format=i420 LAB1307_420p.yuv -loop 0
mplayer在ubuntu下也有大量的安装包和插件,尽量装全吧
5. 用bin2c得到yuv数组bin2c是一个很简单的小程序,sourceforge上可以下载源码:http://sourceforge.net/projects/bin2c/files/latest/download ,下载下来之后解压,然后直接用gcc编译即可,因为只有一个文件,所以没有makefile吧,囧。
unzip bin2c-1.0.zip
cd bin2c/gcc bin2c . c - o bin2c
然后用bin2c命令得到yuv数组
bin2c -o C_YUV.c LAB1307_420p.yuv
6. 分离Y通道和UV通道
由于IPNC上需要分离Y和UV通道,因此还需要将得到的C_YUV.c数组中的Y和UV分量提取出来,其实YUV420P的存放顺序很简单,可以参考yuv的wiki: http://en.wikipedia.org/wiki/YUV,这里引用一张wiki上的图片:
如果假设图片宽x,高y,那么前x*y个像素点都是Y,再往后面x*y/4个像素点是U,再往后面x*y/4个像素点是V, 得到C_YUV.c之后打开看到定义的数组,如果是160x64的话,取前160x64,即10240个数组元素作为Y的值,取剩下的160x64/2,即5120个数组元素作为UV的值,其他尺寸的类似。![]()
注意:在IPNC里面并不是这样定义的,它认为的yuv420p最后存放UV通道的顺序是U0V0U1V1U2V2.....,而不是上图中的U0U1U2...V0V1V2...的顺序,所以得到c数组以后还需要人工转换一下顺序,编写一个简单的C程序即可。
7. 替换IPNC提供的开发包中TI LOGO对应的数组
对应的数组文件在ipnc/av_capture/application/ipnc/av_server/src/fonts目录下,找到对应的分辨率文件修改即可。
8. 重新编译av_server