summaryrefslogtreecommitdiff
path: root/libscaler/libscalerblend-v4l2.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libscaler/libscalerblend-v4l2.cpp')
-rw-r--r--libscaler/libscalerblend-v4l2.cpp167
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(){
+
+}