From 867b8b7b729282c7e14e200ca277435329ebe747 Mon Sep 17 00:00:00 2001
From: liyujie <2352380935@qq.com>
Date: Thu, 28 Aug 2025 12:04:19 +0000
Subject: [PATCH] [3/4]解决USB摄像头打开相机预览界面绿屏

---
 android/hardware/interfaces/camera/device/3.4/default/ExternalCameraDevice.cpp |   34 +++++++++++++++++++++++++++-------
 1 files changed, 27 insertions(+), 7 deletions(-)

diff --git a/android/hardware/interfaces/camera/device/3.4/default/ExternalCameraDevice.cpp b/android/hardware/interfaces/camera/device/3.4/default/ExternalCameraDevice.cpp
old mode 100755
new mode 100644
index 4c78563..d556aba
--- a/android/hardware/interfaces/camera/device/3.4/default/ExternalCameraDevice.cpp
+++ b/android/hardware/interfaces/camera/device/3.4/default/ExternalCameraDevice.cpp
@@ -38,8 +38,8 @@
 // Other formats to consider in the future:
 // * V4L2_PIX_FMT_YVU420 (== YV12)
 // * V4L2_PIX_FMT_YVYU (YVYU: can be converted to YV12 or other YUV420_888 formats)
-const std::array<uint32_t, /*size*/ 2> kSupportedFourCCs{
-    {V4L2_PIX_FMT_MJPEG, V4L2_PIX_FMT_Z16}};  // double braces required in C++11
+const std::array<uint32_t, /*size*/ 3> kSupportedFourCCs{
+    {V4L2_PIX_FMT_MJPEG, V4L2_PIX_FMT_Z16, V4L2_PIX_FMT_YUYV}};  // double braces required in C++11
 
 constexpr int MAX_RETRY = 5; // Allow retry v4l2 open failures a few times.
 constexpr int OPEN_RETRY_SLEEP_US = 100000; // 100ms * MAX_RETRY = 0.5 seconds
@@ -274,6 +274,7 @@
         switch (fmt.fourcc) {
             case V4L2_PIX_FMT_Z16: hasDepth = true; break;
             case V4L2_PIX_FMT_MJPEG: hasColor = true; break;
+            case V4L2_PIX_FMT_YUYV: hasColor = true; break;
             default: ALOGW("%s: Unsupported format found", __FUNCTION__);
         }
     }
@@ -705,6 +706,12 @@
     // For V4L2_PIX_FMT_MJPEG
     std::array<int, /*size*/ 3> halFormats{{HAL_PIXEL_FORMAT_BLOB, HAL_PIXEL_FORMAT_YCbCr_420_888,
                                             HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED}};
+    // For V4L2_PIX_FMT_YUYV
+    std::array<int, /*size*/ 3> halYuyvFormats{{HAL_PIXEL_FORMAT_BLOB,
+                                                HAL_PIXEL_FORMAT_YCbCr_420_888,
+                                                HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED}};
+    bool isMJPEG = false;
+    bool isYUYV  = false;
 
     for (const auto& supportedFormat : mSupportedFormats) {
         switch (supportedFormat.fourcc) {
@@ -713,6 +720,11 @@
                 break;
             case V4L2_PIX_FMT_MJPEG:
                 hasColor = true;
+                isMJPEG = true;
+                break;
+            case V4L2_PIX_FMT_YUYV:
+                hasColor = true;
+                isYUYV = true;
                 break;
             default:
                 ALOGW("%s: format %c%c%c%c is not supported!", __FUNCTION__,
@@ -729,11 +741,19 @@
                 ANDROID_DEPTH_AVAILABLE_DEPTH_STALL_DURATIONS);
     }
     if (hasColor) {
-        initOutputCharskeysByFormat(metadata, V4L2_PIX_FMT_MJPEG, halFormats,
-                ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT,
-                ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS,
-                ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS,
-                ANDROID_SCALER_AVAILABLE_STALL_DURATIONS);
+        if (isMJPEG) {
+            initOutputCharskeysByFormat(metadata, V4L2_PIX_FMT_MJPEG, halFormats,
+                    ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT,
+                    ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS,
+                    ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS,
+                    ANDROID_SCALER_AVAILABLE_STALL_DURATIONS);
+        } else if (isYUYV) {
+            initOutputCharskeysByFormat(metadata, V4L2_PIX_FMT_YUYV, halYuyvFormats,
+                    ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT,
+                    ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS,
+                    ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS,
+                    ANDROID_SCALER_AVAILABLE_STALL_DURATIONS);
+        }
     }
 
     calculateMinFps(metadata);

--
Gitblit v1.6.2