大家好,
davinci平台下有个问题一直让我比较困惑,就是其中问OSD的显示问题,我现在的做法是将点阵字库转为YUV格式的图片然后向视频YUV叠加的,如果想要OSD不透明显示还好,但是如果透明的话在DM36X上是非常耗费CPU资源的,大约20%左右。
所以我想请教:
1:我可以利用DMA进行透明数据的copy么?不要像现在这样要对比每个像素点的值,如果为某个值的话不进行替换来实现透明。
2:不知道可不可以使用矢量字库来进行替代,矢量字库要进行运算进行显示,davinci有没有方案可以参考?
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
大家好,
davinci平台下有个问题一直让我比较困惑,就是其中问OSD的显示问题,我现在的做法是将点阵字库转为YUV格式的图片然后向视频YUV叠加的,如果想要OSD不透明显示还好,但是如果透明的话在DM36X上是非常耗费CPU资源的,大约20%左右。
所以我想请教:
1:我可以利用DMA进行透明数据的copy么?不要像现在这样要对比每个像素点的值,如果为某个值的话不进行替换来实现透明。
2:不知道可不可以使用矢量字库来进行替代,矢量字库要进行运算进行显示,davinci有没有方案可以参考?
你好,我也有类似的问题。请问你是如何将点阵字库转为YUV格式的图片然后向视频YUV叠加?我还在做这步骤.
参考原来OSD的实现方案就好了。
我的做法是将点阵字库压缩,压的非常小之后放到文件系统当中,
然后显示中文的时候将指定的数据取出,转成需要的YUV数据然后叠加到视频流上就可以了。
透明的话基本上就是一个指定区域的遍历加赋值过程,比较耗费CPU
OSD 的实现方案在哪里啊?我用的是这个开发包dvsdk_dm368-evm_4_02_00_06?如何将点阵装成YUV?又如何叠加?
参考videoswosd.c在avserver里面,是一个单独的处理线程。
这个线程会传递YUV格式的video stream给你,可以获取到地址,然后你手里有点阵字库,叠加而已了。
你用的IPNC了,我不是用那个开发环境,我这里有一种叠加方法,不知你认为怎样。内容如下:
分辨率width*height的YUV图片数据流格式Y + U + V
Y 数据的长度是 width*height
U 数据的长度 (width/2)*(height/2)
V 数据的长度 (width/2)*(height/2)
所以一祯图像数据流总长度是 width*height * 1.5
以此为依据分解两帧数据,然后对Y/U/V分别操作,
比如,两帧数据分别为
YUV0[]; // w640 x h480
YUV1[]; // w320 x h240
以pos{0,0}对准合并, 结果覆盖YUV0。
BYTE* buf0_y = YUV0[0];
BYTE* buf0_U = buf0_y + w640 * h480 ;
BYTE* buf0_V = buf0_U + w640 * h480/4;
BYTE* buf1_y = YUV1[0];
BYTE* buf1_U = buf1_y + w320 * h240 ;
BYTE* buf1_V = buf1_U + w320 * h240/4;
for ( int i = 0; i < h240; i ++)
{
memcpy(buf0_y,buf1_y,w320);
memcpy(buf0_u,buf1_u,w320/2);
memcpy(buf0_v,buf1_v,w320/2);
buf0_y += w640;
buf0_u += w640/2;
buf0_v += w640/2;
buf1_y += w320;
buf1_u += w320/2;
buf1_v += w320/2;
}
YUV是三部分组成的,Y 占1/2 U 1/2 V 1/2
你要把小图合并到大图里,等于是要将三部分分别COPY
大图
111111111111111111111111111
111111111111111111111111111
111111111111111111111111111
111111111111111111111111111
111111111111111111111111111
小图
222
222
222
合并之后是
222111111111111111111111111
222111111111111111111111111
222111111111111111111111111
111111111111111111111111111
111111111111111111111111111
U 和 V以此类推
若是不用IPNC,你觉得有啥好的方法将点阵转换成YUV数据,我只要显示一种颜色,对于UV应该统一处理为一个固定值就好了吧?
你用的方法和我类似吧,UV数据不需要处理,直接将Y覆盖上就可以了,还可以出现半透明效果。
这样copy效率比较低,可以将想要使用的汉字先组合好成为YUV数据,然后使用DMA进行矩形块copy。基本没什么CPU损耗。推荐使用。
。。。我想问的是怎么样透明显示而不费CPU 为啥没人回复呢