168 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			168 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			C++
		
	
	
	
| #include <sys/ioctl.h>
 | |
| #include <sys/mman.h>
 | |
| #include <linux/videodev2.h>
 | |
| 
 | |
| #include "libscaler-v4l2.h"
 | |
| #include "libscalerblend-v4l2.h"
 | |
| 
 | |
| bool CScalerBlendV4L2::DevSetCtrl()
 | |
| {
 | |
|     struct v4l2_control ctrl;
 | |
| 
 | |
|     if (!SetCtrl())
 | |
|         return false;
 | |
| 
 | |
|     /* Blending related ctls */
 | |
|     if (!TestFlag(m_fStatus, SCF_SRC_BLEND))
 | |
|         return false;
 | |
| 
 | |
|     ctrl.id = V4L2_CID_2D_BLEND_OP;
 | |
|     ctrl.value = m_SrcBlndCfg.blop;
 | |
|     if (ioctl(m_fdScaler, VIDIOC_S_CTRL, &ctrl) < 0) {
 | |
|         SC_LOGERR("Failed S_CTRL V4L2_CID_2D_BLEND_OP");
 | |
|         return false;
 | |
|     }
 | |
| 
 | |
|     if (m_SrcBlndCfg.globalalpha.enable) {
 | |
|         ctrl.id = V4L2_CID_GLOBAL_ALPHA;
 | |
|         ctrl.value = m_SrcBlndCfg.globalalpha.val;
 | |
|         if (ioctl(m_fdScaler, VIDIOC_S_CTRL, &ctrl) < 0) {
 | |
|                SC_LOGERR("Failed S_CTRL V4L2_CID_GLOBAL_ALPHA");
 | |
|                return false;
 | |
|         }
 | |
|     } else {
 | |
|         ctrl.id = V4L2_CID_GLOBAL_ALPHA;
 | |
|         ctrl.value = 0xff;
 | |
|         if (ioctl(m_fdScaler, VIDIOC_S_CTRL, &ctrl) < 0) {
 | |
|                 SC_LOGERR("Failed S_CTRL V4L2_CID_GLOBAL_ALPHA 0xff");
 | |
|                 return false;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     if (m_SrcBlndCfg.cscspec.enable) {
 | |
|         bool is_bt709 = (m_SrcBlndCfg.cscspec.space == COLORSPACE_REC709)? true : false;
 | |
| 
 | |
|         ctrl.id = V4L2_CID_CSC_EQ;
 | |
|         ctrl.value = is_bt709;
 | |
|         if (ioctl(m_fdScaler, VIDIOC_S_CTRL, &ctrl) < 0) {
 | |
|             SC_LOGERR("Failed S_CTRL V4L2_CID_CSC_EQ - %d",
 | |
|                                                    m_SrcBlndCfg.cscspec.space);
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
|         ctrl.id = V4L2_CID_CSC_RANGE;
 | |
|         ctrl.value = m_SrcBlndCfg.cscspec.wide;
 | |
|         if (ioctl(m_fdScaler, VIDIOC_S_CTRL, &ctrl) < 0) {
 | |
|             SC_LOGERR("Failed S_CTRL V4L2_CID_CSC_RANGE - %d",
 | |
|                                                    m_SrcBlndCfg.cscspec.wide);
 | |
|             return false;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     ctrl.id = V4L2_CID_2D_SRC_BLEND_SET_FMT;
 | |
|     ctrl.value = m_SrcBlndCfg.srcblendfmt;
 | |
|     if (ioctl(m_fdScaler, VIDIOC_S_CTRL, &ctrl) < 0) {
 | |
|         SC_LOGERR("Failed V4L2_CID_2D_SRC_BLEND_SET_FMT - %d",
 | |
|                                                   m_SrcBlndCfg.srcblendfmt);
 | |
|         return false;
 | |
|     }
 | |
| 
 | |
|     ctrl.id = V4L2_CID_2D_SRC_BLEND_FMT_PREMULTI;
 | |
|     ctrl.value = m_SrcBlndCfg.srcblendpremulti;
 | |
|     if (ioctl(m_fdScaler, VIDIOC_S_CTRL, &ctrl) < 0) {
 | |
|         SC_LOGERR("Failed V4L2_CID_2D_BLEND_FMT_PREMULTI - %d",
 | |
|                                                    m_SrcBlndCfg.srcblendpremulti);
 | |
|         return false;
 | |
|     }
 | |
| 
 | |
|     ctrl.id = V4L2_CID_2D_SRC_BLEND_SET_STRIDE;
 | |
|     ctrl.value = m_SrcBlndCfg.srcblendstride;
 | |
|     if (ioctl(m_fdScaler, VIDIOC_S_CTRL, &ctrl) < 0) {
 | |
|         SC_LOGERR("Failed V4L2_CID_2D_SRC_BLEND_SET_STRIDE - %d",
 | |
|                                                    m_SrcBlndCfg.srcblendstride);
 | |
|         return false;
 | |
|     }
 | |
| 
 | |
|     ctrl.id = V4L2_CID_2D_SRC_BLEND_SET_H_POS;
 | |
|     ctrl.value = m_SrcBlndCfg.srcblendhpos;
 | |
|     if (ioctl(m_fdScaler, VIDIOC_S_CTRL, &ctrl) < 0) {
 | |
|         SC_LOGERR("Failed V4L2_CID_2D_SRC_BLEND_SET_H_POS with degree %d",
 | |
|                                                    m_SrcBlndCfg.srcblendhpos);
 | |
|         return false;
 | |
|     }
 | |
| 
 | |
|     ctrl.id = V4L2_CID_2D_SRC_BLEND_SET_V_POS;
 | |
|     ctrl.value = m_SrcBlndCfg.srcblendvpos;
 | |
|     if (ioctl(m_fdScaler, VIDIOC_S_CTRL, &ctrl) < 0) {
 | |
|         SC_LOGERR("Failed V4L2_CID_2D_SRC_BLEND_SET_V_POS - %d",
 | |
|                                                    m_SrcBlndCfg.srcblendvpos);
 | |
|         return false;
 | |
|     }
 | |
| 
 | |
|     ctrl.id = V4L2_CID_2D_SRC_BLEND_SET_WIDTH;
 | |
|     ctrl.value = m_SrcBlndCfg.srcblendwidth;
 | |
|     if (ioctl(m_fdScaler, VIDIOC_S_CTRL, &ctrl) < 0) {
 | |
|         SC_LOGERR("Failed V4L2_CID_2D_SRC_BLEND_SET_WIDTH with degree %d",
 | |
|                                                    m_SrcBlndCfg.srcblendwidth);
 | |
|         return false;
 | |
|     }
 | |
| 
 | |
|     ctrl.id = V4L2_CID_2D_SRC_BLEND_SET_HEIGHT;
 | |
|     ctrl.value = m_SrcBlndCfg.srcblendheight;
 | |
|     if (ioctl(m_fdScaler, VIDIOC_S_CTRL, &ctrl) < 0) {
 | |
|         SC_LOGERR("Failed V4L2_CID_2D_SRC_BLEND_SET_HEIGHT - %d",
 | |
|                                                    m_SrcBlndCfg.srcblendheight);
 | |
|         return false;
 | |
|     }
 | |
| 
 | |
|     ClearFlag(m_fStatus, SCF_SRC_BLEND);
 | |
|     return true;
 | |
| }
 | |
| 
 | |
| void CScalerBlendV4L2::GetCustomAlphaBlendFmt(int32_t &src_color_space,
 | |
|                                                      unsigned int srcblendfmt) {
 | |
| 
 | |
|     if (src_color_space == V4L2_PIX_FMT_NV12M) {
 | |
|         if (srcblendfmt == V4L2_PIX_FMT_RGB32)
 | |
|             src_color_space = V4L2_PIX_FMT_NV12M_RGB32;
 | |
|         else if (srcblendfmt == V4L2_PIX_FMT_BGR32)
 | |
|             src_color_space = V4L2_PIX_FMT_NV12M_BGR32;
 | |
|         else if (srcblendfmt == V4L2_PIX_FMT_RGB565)
 | |
|             src_color_space = V4L2_PIX_FMT_NV12M_RGB565;
 | |
|         else if (srcblendfmt == V4L2_PIX_FMT_RGB444)
 | |
|             src_color_space = V4L2_PIX_FMT_NV12M_RGB444;
 | |
|         else if (srcblendfmt == V4L2_PIX_FMT_RGB555X)
 | |
|             src_color_space = V4L2_PIX_FMT_NV12M_RGB555X;
 | |
|     } else if (src_color_space == V4L2_PIX_FMT_NV12) {
 | |
|             if (srcblendfmt == V4L2_PIX_FMT_RGB32)
 | |
|             src_color_space = V4L2_PIX_FMT_NV12_RGB32;
 | |
|     } else if (src_color_space == V4L2_PIX_FMT_NV12N) {
 | |
|             if (srcblendfmt == V4L2_PIX_FMT_RGB32)
 | |
|             src_color_space = V4L2_PIX_FMT_NV12N_RGB32;
 | |
|     } else if (src_color_space == V4L2_PIX_FMT_NV12MT_16X16) {
 | |
|             if (srcblendfmt == V4L2_PIX_FMT_RGB32)
 | |
|             src_color_space = V4L2_PIX_FMT_NV12MT_16X16_RGB32;
 | |
|     } else if (src_color_space == V4L2_PIX_FMT_NV21M) {
 | |
|         if (srcblendfmt == V4L2_PIX_FMT_RGB32)
 | |
|             src_color_space = V4L2_PIX_FMT_NV21M_RGB32;
 | |
|         else if (srcblendfmt == V4L2_PIX_FMT_BGR32)
 | |
|             src_color_space = V4L2_PIX_FMT_NV21M_BGR32;
 | |
|     } else if (src_color_space == V4L2_PIX_FMT_NV21) {
 | |
|         if (srcblendfmt == V4L2_PIX_FMT_RGB32)
 | |
|             src_color_space = V4L2_PIX_FMT_NV21_RGB32;
 | |
|     } else if (src_color_space == V4L2_PIX_FMT_YVU420) {
 | |
|         if (srcblendfmt == V4L2_PIX_FMT_RGB32)
 | |
|             src_color_space = V4L2_PIX_FMT_YVU420_RGB32;
 | |
|     } else {
 | |
|         src_color_space = -1;
 | |
|     }
 | |
| }
 | |
| 
 | |
| CScalerBlendV4L2::CScalerBlendV4L2(int dev_num, int allow_drm) : CScalerV4L2(dev_num, allow_drm){
 | |
| 
 | |
| }
 | |
| 
 | |
| CScalerBlendV4L2::~CScalerBlendV4L2(){
 | |
| 
 | |
| }
 |