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