From 47c48ffd24fd0152daf689b8e96f90fde7455d5d Mon Sep 17 00:00:00 2001
From: zhengwenzheng <zhengwenzheng@example.com>
Date: Wed, 22 Oct 2025 10:41:30 +0800
Subject: [PATCH] support merge config

Scope:
IssueID:
Relation:
---
 sys/v4l2/ext/videodev2.h |  2 ++
 sys/v4l2/gstv4l2object.c | 13 +++++++++++++
 sys/v4l2/gstv4l2object.h |  2 ++
 sys/v4l2/v4l2_calls.c    | 30 +++++++++++++++++++++++++-----
 4 files changed, 42 insertions(+), 5 deletions(-)

diff --git a/sys/v4l2/ext/videodev2.h b/sys/v4l2/ext/videodev2.h
index ff27400..34adee6 100644
--- a/sys/v4l2/ext/videodev2.h
+++ b/sys/v4l2/ext/videodev2.h
@@ -2602,6 +2602,8 @@ struct v4l2_create_buffers {
 #define VIDIOC_SET_DMA_MERGE \
 	_IOWR('V', BASE_VIDIOC_PRIVATE + 50, unsigned char)
 
+#define V4L2_MODE_VIDEO	0x0002
+
 /* Deprecated definitions kept for backwards compatibility */
 #define V4L2_PIX_FMT_HM12 V4L2_PIX_FMT_NV12_16L16
 #define V4L2_PIX_FMT_SUNXI_TILED_NV12 V4L2_PIX_FMT_NV12_32L32
diff --git a/sys/v4l2/gstv4l2object.c b/sys/v4l2/gstv4l2object.c
index ee699fb..8408392 100644
--- a/sys/v4l2/gstv4l2object.c
+++ b/sys/v4l2/gstv4l2object.c
@@ -59,6 +59,7 @@ enum
 {
   PROP_0,
   V4L2_STD_OBJECT_PROPS,
+  PROP_ENABLE_LARGEMODE,
 };
 
 /*
@@ -433,6 +434,12 @@ gst_v4l2_object_install_properties_helper (GObjectClass * gobject_class,
           "When enabled, the pixel aspect ratio will be enforced", TRUE,
           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
+  g_object_class_install_property (gobject_class, PROP_ENABLE_LARGEMODE,
+      g_param_spec_boolean("en-largemode", "Enable AWISP using largemode",
+          "Enable/Disable AWISP largemode processing. Largemode using in big input size",
+          FALSE,
+          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
   gst_type_mark_as_plugin_api (GST_TYPE_V4L2_DEVICE_FLAGS, 0);
   gst_type_mark_as_plugin_api (GST_TYPE_V4L2_TV_NORM, 0);
   gst_type_mark_as_plugin_api (GST_TYPE_V4L2_IO_MODE, 0);
@@ -720,6 +727,9 @@ gst_v4l2_object_set_property_helper (GstV4l2Object * v4l2object,
     case PROP_FORCE_ASPECT_RATIO:
       v4l2object->keep_aspect = g_value_get_boolean (value);
       break;
+    case PROP_ENABLE_LARGEMODE:
+      v4l2object->use_large_image_mode = g_value_get_boolean (value);
+      break;
     default:
       return FALSE;
       break;
@@ -817,6 +827,9 @@ gst_v4l2_object_get_property_helper (GstV4l2Object * v4l2object,
     case PROP_FORCE_ASPECT_RATIO:
       g_value_set_boolean (value, v4l2object->keep_aspect);
       break;
+    case PROP_ENABLE_LARGEMODE:
+      g_value_set_boolean (value, v4l2object->use_large_image_mode);
+      break;
     default:
       return FALSE;
       break;
diff --git a/sys/v4l2/gstv4l2object.h b/sys/v4l2/gstv4l2object.h
index e5ed0ac..2ec5797 100644
--- a/sys/v4l2/gstv4l2object.h
+++ b/sys/v4l2/gstv4l2object.h
@@ -180,6 +180,8 @@ struct _GstV4l2Object {
   /* opened device specific capabilities */
   guint32 device_caps;
 
+  gboolean use_large_image_mode;
+
   /* lists... */
   GSList *formats;              /* list of available capture formats */
   GstCaps *probed_caps;
diff --git a/sys/v4l2/v4l2_calls.c b/sys/v4l2/v4l2_calls.c
index ad8ccb9..7b8f650 100644
--- a/sys/v4l2/v4l2_calls.c
+++ b/sys/v4l2/v4l2_calls.c
@@ -523,6 +523,7 @@ gst_v4l2_open (GstV4l2Object * v4l2object, GstV4l2Error * error)
   struct v4l2_input inp;
   char dma_merge_mode = 1;
   int sel = 0;
+  struct v4l2_streamparm parms;
 
   GST_DEBUG_OBJECT (v4l2object->dbg_obj, "Trying to open device %s",
       v4l2object->videodev);
@@ -548,16 +549,35 @@ gst_v4l2_open (GstV4l2Object * v4l2object, GstV4l2Error * error)
   if (!GST_V4L2_IS_OPEN (v4l2object))
     goto not_open;
 
-  if (-1 == ioctl(v4l2object->video_fd, VIDIOC_SET_DMA_MERGE, &dma_merge_mode)) {
-      GST_ERROR_OBJECT(v4l2object->dbg_obj,"VIDIOC_SET_DMA_MERGE error!\n");
-      return -1;
+  if (v4l2object->use_large_image_mode) {
+    GST_INFO_OBJECT (v4l2object->dbg_obj,"VIDIOC_SET_DMA_MERGE[%d] start\n", dma_merge_mode);
+    if (-1 == ioctl(v4l2object->video_fd, VIDIOC_SET_DMA_MERGE, &dma_merge_mode)) {
+        GST_ERROR_OBJECT(v4l2object->dbg_obj,"VIDIOC_SET_DMA_MERGE error!");
+        goto error;
+    }
   }
 
   inp.index = sel;
+  GST_INFO_OBJECT (v4l2object->dbg_obj,"VIDIOC_S_INPUT[%d] start\n", sel);
   if (-1 == ioctl(v4l2object->video_fd, VIDIOC_S_INPUT, &inp)) {
-      GST_ERROR_OBJECT(v4l2object->dbg_obj,"VIDIOC_S_INPUT %d error!\n", sel);
-      return -1;
+    GST_ERROR_OBJECT(v4l2object->dbg_obj,"VIDIOC_S_INPUT %d error!\n", sel);
+    goto error;
+  }
+
+  memset (&parms, 0x00, sizeof (struct v4l2_streamparm));
+  parms.type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+  parms.parm.capture.timeperframe.numerator = 1;
+  parms.parm.capture.timeperframe.denominator = 30;
+  parms.parm.capture.capturemode = V4L2_MODE_VIDEO;
+  parms.parm.capture.reserved[0] = 0;
+  parms.parm.capture.reserved[1] = 0;
+
+  GST_INFO_OBJECT (v4l2object->dbg_obj,"VIDIOC_S_PARM[%d] start\n", sel);
+  if (-1 == ioctl(v4l2object->video_fd, VIDIOC_S_PARM, &parms)) {
+    GST_ERROR_OBJECT(v4l2object->dbg_obj,"VIDIOC_S_PARM error!\n");
+    goto error;
   }
+
 #ifdef HAVE_LIBV4L2
   if (v4l2object->fd_open)
     libv4l2_fd = v4l2object->fd_open (v4l2object->video_fd,
-- 
2.25.1

