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

---
 android/hardware/aw/camera/3_4/v4l2_camera.cpp |   56 +++++++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 47 insertions(+), 9 deletions(-)

diff --git a/android/hardware/aw/camera/3_4/v4l2_camera.cpp b/android/hardware/aw/camera/3_4/v4l2_camera.cpp
index e717bca..174d996 100755
--- a/android/hardware/aw/camera/3_4/v4l2_camera.cpp
+++ b/android/hardware/aw/camera/3_4/v4l2_camera.cpp
@@ -57,7 +57,8 @@
 
 V4L2Camera* V4L2Camera::NewV4L2Camera(
     int id,
-    std::shared_ptr<CCameraConfig> pCameraCfg) {
+    std::shared_ptr<CCameraConfig> pCameraCfg,
+    bool mergeStreamStatus) {
   HAL_LOG_ENTER();
   // Select one stream for fill metadata.
   // The path has been pick the stream for query format.
@@ -80,13 +81,15 @@
   return new V4L2Camera(id,
                         std::move(v4l2_wrapper),
                         std::move(metadata),
-                        std::move(pCameraCfg));
+                        std::move(pCameraCfg),
+                        mergeStreamStatus);
 }
 
 V4L2Camera::V4L2Camera(int id,
                        std::shared_ptr<V4L2Wrapper> v4l2_wrapper,
                        std::unique_ptr<Metadata> metadata,
-                       std::shared_ptr<CCameraConfig> pCameraCfg)
+                       std::shared_ptr<CCameraConfig> pCameraCfg,
+                       bool mergeStreamStatus)
     : default_camera_hal::Camera(id),
       mCameraConfig(std::move(pCameraCfg)),
       device_(std::move(v4l2_wrapper)),
@@ -101,7 +104,9 @@
       FlashStatusFlag(0),
       MarkFrameNum(0),
       curFlashStateE(CAM_FLASH_STATE_MAX),
-      curFlashModeE(CAM_FLASH_MODE_MAX) {
+      curFlashModeE(CAM_FLASH_MODE_MAX),
+      merge_stream_status_(mergeStreamStatus),
+      is_merge_stream_flag(false){
 
     HAL_LOG_ENTER();
     instance = std::shared_ptr<V4L2Camera>(this);
@@ -1224,7 +1229,7 @@
   return true;
 }
 
-int V4L2Camera::sResultCallback(uint32_t frameNumber, struct timeval /*ts*/) {
+int V4L2Camera::sResultCallback(uint32_t frameNumber, struct timeval ts) {
   std::unique_lock<std::mutex> lock(frameNumber_request_lock_);
   int res = 0;
   int ret = 0;
@@ -1272,6 +1277,17 @@
           HAL_LOGE("Failed to update metadata tag 0x%x",
               ANDROID_JPEG_THUMBNAIL_SIZE);
         }
+      }
+
+      if(!is_merge_stream_flag)
+      {
+        int64_t timestamp = 0;
+        timestamp = ts.tv_sec * 1000000000ULL + ts.tv_usec*1000;
+        ret = (&map_entry->second->settings)->update(ANDROID_SENSOR_TIMESTAMP, &timestamp, 1);
+        if (ret) {
+          HAL_LOGE("Failed to update metadata tag 0x%x", ANDROID_SENSOR_TIMESTAMP);
+        }
+        res = 404;
       }
 
       if (mCameraConfig->supportFlashMode()) {
@@ -1533,6 +1549,19 @@
       while (!wfequest_queue_stream_.empty()) {
         if (rfequest_queue_stream_.front()->frame_number ==
             wfequest_queue_stream_.front()->frame_number) {
+
+          if (!is_merge_stream_flag) {
+              int64_t timestamp_w = 0;
+              timestamp_w = ts.tv_sec * 1000000000ULL + ts.tv_usec*1000;
+              ret = (&map_entry->second->settings)->update(
+                  ANDROID_SENSOR_TIMESTAMP, &timestamp_w, 1);
+              if (ret) {
+                  HAL_LOGE("Failed to update metadata tag 0x%x",
+                      ANDROID_SENSOR_TIMESTAMP);
+              }
+              res = 404;
+          }
+
           completeRequest(wfequest_queue_stream_.front(), res);
           wfequest_queue_stream_.pop();
           rfequest_queue_stream_.pop();
@@ -1638,7 +1667,8 @@
               stream_config->streams[retIndex]->height,
               stream_config->streams[retIndex]->format,
               stream_config->streams[retIndex]->usage,
-              isBlob));
+              isBlob,
+              merge_stream_status_));
       if (nullptr == stream_config->streams[retIndex]->priv) {
         HAL_LOGE("Failed create main stream!");
         return -EINVAL;
@@ -1676,7 +1706,8 @@
             stream_config->streams[retIndex]->height,
             stream_config->streams[retIndex]->format,
             stream_config->streams[retIndex]->usage,
-            isBlob));
+            isBlob,
+            merge_stream_status_));
       if (nullptr == stream_config->streams[retIndex]->priv) {
         HAL_LOGE("Failed create sub stream!");
         return -EINVAL;
@@ -1731,7 +1762,8 @@
                 stream_config->streams[thirdIndex]->height,
                 stream_config->streams[thirdIndex]->format,
                 stream_config->streams[thirdIndex]->usage,
-                isBlob));
+                isBlob,
+                merge_stream_status_));
 
           if (nullptr == stream_config->streams[thirdIndex]->priv) {
             HAL_LOGE("Failed create third stream!");
@@ -1772,7 +1804,8 @@
               stream_config->streams[thirdIndex]->height,
               stream_config->streams[thirdIndex]->format,
               stream_config->streams[thirdIndex]->usage,
-              isBlob));
+              isBlob,
+              merge_stream_status_));
 
         camera3_stream_t* subIndexStream = stream_config->streams[subIndex];
         camera3_stream_t* thirdIndexStream = stream_config->streams[thirdIndex];
@@ -1829,6 +1862,7 @@
   for (uint32_t i = 0; i < stream_config->num_streams; ++i) {
     fillStreamInfo(stream_config->streams[i]);
   }
+  is_merge_stream_flag = false;
   for (uint32_t i = 0; i < stream_config->num_streams; ++i) {
     HAL_LOGD("stream %d is format %d(%s), width %d, height %d, "
         "usage %d(%s), stream_type %d, data_space %d, num_streams:%d.",
@@ -1842,6 +1876,10 @@
         stream_config->streams[i]->stream_type,
         stream_config->streams[i]->data_space,
         stream_config->num_streams);
+    if(stream_config->streams[i]->width * stream_config->streams[i]->height > 
+        4000*3000) {
+      is_merge_stream_flag = true;
+    }
   }
 
   HAL_LOGI("setupStreams finished");

--
Gitblit v1.6.2