diff options
Diffstat (limited to 'libscaler/libscalerblend-v4l2.cpp')
-rw-r--r-- | libscaler/libscalerblend-v4l2.cpp | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/libscaler/libscalerblend-v4l2.cpp b/libscaler/libscalerblend-v4l2.cpp new file mode 100644 index 0000000..77ec956 --- /dev/null +++ b/libscaler/libscalerblend-v4l2.cpp @@ -0,0 +1,167 @@ +#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(){ + +} |