cnw8302的osd实现字符叠加原理
cnw8302的osd实现字符叠加原理
基于cavium的cnw8302平台上 实现 利用osd 功能 往输出的屏幕上写字符及数字功能。
Cnw8302硬件平台是基于Linux的,硬件接口提供像素设置,格式设置,分辨率设置,keycolor设置等一些常见的参数。Osdbuffer可以理解为液晶屏的GRAM,但是根据每一个图像处理器的功能不同,osd不同于GRAM,可以理解为屏幕的显示为三层,最底层为硬件层,第二层为硬件抽象层,第三层为osd层,osd层将底层的图像覆盖。
接口函数如下
osd_handle = CSOSD_Open(OSD_LAYER_0);
if(!osd_handle)
{
printf("CSOSD_Open error\n");
}
CSOSD_Enable(osd_handle);
ret=CSVID_SetLayerOrder(osd_handle, 7);
if(ret == CSAPI_SUCCEED )
{
printf("CSVID_SetLayerOrder success \n");
}
ret= CSOSD_EnableKeyColor(osd_handle);
if(ret == CSAPI_SUCCEED )
{
printf("CSOSD_EnableKeyColor success \n");
}
CSOSD_Config config;
CSOSD_GetConfig(osd_handle, &config);
printf("config.mode %x ,config.mode:%x ,config.color_format: %x \n",config.mode,config.color_depth,config.color_format);
config.mode = OSD_MODE_1080P60;
config.color_depth = OSD_COLOR_DEPTH_16 ;
config.color_format = OSD_COLOR_FORMAT_RGB565 ;
ret=CSOSD_SetConfig(osd_handle, &config);
if(ret == CSAPI_SUCCEED )
{
printf("CSOSD_SetConfig success ! \n");
}
CSOSD_SetAlpha(osd_handle, 255);
CSOSD_Opaque(osd_handle, 0);
unsigned char* addr;
ret=CSOSD_GetBaseAddr(osd_handle, &addr);
if(ret == CSAPI_SUCCEED )
{
printf("get addr success %x! \n",addr);
}
如上是平台的函数接口,我们配置osd层为16位深度,1080p,RGB565的输出方式,1080P代表逐行扫描,在这个平台上测试发现是从左往右,自上而下扫描显示的。并且要知道osdbuffer 的addr的像素格式,在这里经过测试得知,两个字节代表一个颜色。测试方法:先一行数据,知道是从左到右,在写一行。
当然平台的还支持的格式还有如下
选择RGB565是因为大多数屏幕都支持5656,并且占用字节就两个,我们可以编写函数将常见的颜色值转换为两个字节。
如下是RGB888的颜色值,不过他是三个字来的。
通过函数转换
bool RGB2U16(unsigned int RGB,unsigned int* cr,unsigned int* cg,unsigned int* cb)
{
*cr=RGB>>16;
*cg=RGB>>8;
*cb=(unsigned char)RGB;
}
#define RED_RGB 0Xff0000
#define YELLOW_RGB 0XFFFF00
#define BLUE_RGB 0X0000FF
#define GREEN_RGB 0X00FF00
#define PURPLE_RGB 0XA020F0
#define BRWOWN_RGB 0X802A2A
unsigned int bg_r_color = 160, bg_g_color = 32, bg_b_color = 240;//
RGB2U16(PURPLE_RGB,&bg_r_color,&bg_g_color,&bg_b_color);
bg_color =
(unsigned int)(((bg_b_color)&0xf8)>>3)|(((bg_g_color)&0xfc)<<3)|(((bg_r_color)&0xf8)<<8) ;
这里得到的 bg_color 就是两个字节的RGB5656值。
然后将该颜色值按照点阵格式写入buffer,字符点阵是有第三方工具freetype做成的。