cnw8302的osd实现字符叠加原理

cnw8302osd实现字符叠加原理

 

基于caviumcnw8302平台上 实现 利用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位深度,1080pRGB565的输出方式,1080P代表逐行扫描,在这个平台上测试发现是从左往右,自上而下扫描显示的。并且要知道osdbuffer addr的像素格式,在这里经过测试得知,两个字节代表一个颜色。测试方法:先一行数据,知道是从左到右,在写一行。

 

 

当然平台的还支持的格式还有如下

 QQ截图20170329105347.jpg8212a5a286ec10b8b426bad975cd9278_380.png


 

 

选择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做成的。

 

sitemap