From 264e321aa30311ff7bc16035924e4f0e234d0d61 Mon Sep 17 00:00:00 2001
From: chenjuncong <chenjuncong@allwinnertech.com>
Date: Thu, 27 Mar 2025 19:12:07 +0800
Subject: [PATCH] add raw10 format

Scope:
IssueID:
Relation:
---
 sys/v4l2/gstv4l2object.c | 30 ++++++++++++++++++++++++++++++
 sys/v4l2/v4l2_calls.c    |  7 +++++++
 2 files changed, 37 insertions(+)

diff --git a/sys/v4l2/gstv4l2object.c b/sys/v4l2/gstv4l2object.c
index 9eb3b8e..e4fb772 100644
--- a/sys/v4l2/gstv4l2object.c
+++ b/sys/v4l2/gstv4l2object.c
@@ -166,6 +166,10 @@ static const GstV4L2FormatDesc gst_v4l2_formats[] = {
   {V4L2_PIX_FMT_SGBRG8, TRUE, GST_V4L2_RAW},
   {V4L2_PIX_FMT_SGRBG8, TRUE, GST_V4L2_RAW},
   {V4L2_PIX_FMT_SRGGB8, TRUE, GST_V4L2_RAW},
+  {V4L2_PIX_FMT_SBGGR10, TRUE, GST_V4L2_RAW},
+  {V4L2_PIX_FMT_SGBRG10, TRUE, GST_V4L2_RAW},
+  {V4L2_PIX_FMT_SGRBG10, TRUE, GST_V4L2_RAW},
+  {V4L2_PIX_FMT_SRGGB10, TRUE, GST_V4L2_RAW},

   /* compressed formats */
   {V4L2_PIX_FMT_MJPEG, FALSE, GST_V4L2_CODEC},
@@ -1118,6 +1122,10 @@ gst_v4l2_object_format_get_rank (const struct v4l2_fmtdesc *fmt)
     case V4L2_PIX_FMT_SGBRG8:
     case V4L2_PIX_FMT_SGRBG8:
     case V4L2_PIX_FMT_SRGGB8:
+    case V4L2_PIX_FMT_SBGGR10:
+    case V4L2_PIX_FMT_SGBRG10:
+    case V4L2_PIX_FMT_SGRBG10:
+    case V4L2_PIX_FMT_SRGGB10:
       rank = BAYER_BASE_RANK;
       break;

@@ -1417,6 +1425,10 @@ gst_v4l2_object_v4l2fourcc_is_rgb (guint32 fourcc)
     case V4L2_PIX_FMT_BGRX32:
     case V4L2_PIX_FMT_ABGR32:
     case V4L2_PIX_FMT_ARGB32:
+    case V4L2_PIX_FMT_SBGGR10:
+    case V4L2_PIX_FMT_SGBRG10:
+    case V4L2_PIX_FMT_SGRBG10:
+    case V4L2_PIX_FMT_SRGGB10:
     case V4L2_PIX_FMT_SBGGR8:
     case V4L2_PIX_FMT_SGBRG8:
     case V4L2_PIX_FMT_SGRBG8:
@@ -1556,6 +1568,16 @@ gst_v4l2_object_v4l2fourcc_to_bare_struct (guint32 fourcc)
           fourcc == V4L2_PIX_FMT_SGRBG8 ? "grbg" :
           /* fourcc == V4L2_PIX_FMT_SRGGB8 ? */ "rggb", NULL);
       break;
+    case V4L2_PIX_FMT_SBGGR10:
+    case V4L2_PIX_FMT_SGBRG10:
+    case V4L2_PIX_FMT_SGRBG10:
+    case V4L2_PIX_FMT_SRGGB10:
+      structure = gst_structure_new ("video/x-bayer", "format", G_TYPE_STRING,
+          fourcc == V4L2_PIX_FMT_SBGGR10 ? "bg10" :
+          fourcc == V4L2_PIX_FMT_SGBRG10 ? "gb10" :
+          fourcc == V4L2_PIX_FMT_SGRBG10 ? "gr10" :
+          /* fourcc == V4L2_PIX_FMT_SRGGB8 ? */ "rg10", NULL);
+      break;
     case V4L2_PIX_FMT_SN9C10X:
       structure = gst_structure_new_empty ("video/x-sonix");
       break;
@@ -1919,6 +1941,14 @@ gst_v4l2_object_get_caps_info (GstV4l2Object * v4l2object, GstCaps * caps,
           fourcc = V4L2_PIX_FMT_SGRBG8;
         else if (!g_ascii_strcasecmp (format, "rggb"))
           fourcc = V4L2_PIX_FMT_SRGGB8;
+        else if (!g_ascii_strcasecmp (format, "bg10"))
+          fourcc = V4L2_PIX_FMT_SBGGR10;
+        else if (!g_ascii_strcasecmp (format, "gb10"))
+          fourcc = V4L2_PIX_FMT_SGBRG10;
+        else if (!g_ascii_strcasecmp (format, "gr10"))
+          fourcc = V4L2_PIX_FMT_SGRBG10;
+         else if (!g_ascii_strcasecmp (format, "rg"))
+          fourcc = V4L2_PIX_FMT_SRGGB10;
       }
     } else if (g_str_equal (mimetype, "video/x-sonix")) {
       fourcc = V4L2_PIX_FMT_SN9C10X;
diff --git a/sys/v4l2/v4l2_calls.c b/sys/v4l2/v4l2_calls.c
index c13b142..cdc4092 100644
--- a/sys/v4l2/v4l2_calls.c
+++ b/sys/v4l2/v4l2_calls.c
@@ -520,6 +520,8 @@ gst_v4l2_open (GstV4l2Object * v4l2object, GstV4l2Error * error)
 {
   struct stat st;
   int libv4l2_fd = -1;
+  struct v4l2_input inp;
+  int sel = 0;

   GST_DEBUG_OBJECT (v4l2object->dbg_obj, "Trying to open device %s",
       v4l2object->videodev);
@@ -545,6 +547,11 @@ gst_v4l2_open (GstV4l2Object * v4l2object, GstV4l2Error * error)
   if (!GST_V4L2_IS_OPEN (v4l2object))
     goto not_open;

+  inp.index = 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;
+  }
 #ifdef HAVE_LIBV4L2
   if (v4l2object->fd_open)
     libv4l2_fd = v4l2object->fd_open (v4l2object->video_fd,
--
2.25.1

