liyujie
2025-08-28 867b8b7b729282c7e14e200ca277435329ebe747
android/hardware/interfaces/camera/device/3.4/default/ExternalCameraDevice.cpp
old mode 100755new mode 100644
....@@ -38,8 +38,8 @@
3838 // Other formats to consider in the future:
3939 // * V4L2_PIX_FMT_YVU420 (== YV12)
4040 // * V4L2_PIX_FMT_YVYU (YVYU: can be converted to YV12 or other YUV420_888 formats)
41
-const std::array<uint32_t, /*size*/ 2> kSupportedFourCCs{
42
- {V4L2_PIX_FMT_MJPEG, V4L2_PIX_FMT_Z16}}; // double braces required in C++11
41
+const std::array<uint32_t, /*size*/ 3> kSupportedFourCCs{
42
+ {V4L2_PIX_FMT_MJPEG, V4L2_PIX_FMT_Z16, V4L2_PIX_FMT_YUYV}}; // double braces required in C++11
4343
4444 constexpr int MAX_RETRY = 5; // Allow retry v4l2 open failures a few times.
4545 constexpr int OPEN_RETRY_SLEEP_US = 100000; // 100ms * MAX_RETRY = 0.5 seconds
....@@ -274,6 +274,7 @@
274274 switch (fmt.fourcc) {
275275 case V4L2_PIX_FMT_Z16: hasDepth = true; break;
276276 case V4L2_PIX_FMT_MJPEG: hasColor = true; break;
277
+ case V4L2_PIX_FMT_YUYV: hasColor = true; break;
277278 default: ALOGW("%s: Unsupported format found", __FUNCTION__);
278279 }
279280 }
....@@ -705,6 +706,12 @@
705706 // For V4L2_PIX_FMT_MJPEG
706707 std::array<int, /*size*/ 3> halFormats{{HAL_PIXEL_FORMAT_BLOB, HAL_PIXEL_FORMAT_YCbCr_420_888,
707708 HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED}};
709
+ // For V4L2_PIX_FMT_YUYV
710
+ std::array<int, /*size*/ 3> halYuyvFormats{{HAL_PIXEL_FORMAT_BLOB,
711
+ HAL_PIXEL_FORMAT_YCbCr_420_888,
712
+ HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED}};
713
+ bool isMJPEG = false;
714
+ bool isYUYV = false;
708715
709716 for (const auto& supportedFormat : mSupportedFormats) {
710717 switch (supportedFormat.fourcc) {
....@@ -713,6 +720,11 @@
713720 break;
714721 case V4L2_PIX_FMT_MJPEG:
715722 hasColor = true;
723
+ isMJPEG = true;
724
+ break;
725
+ case V4L2_PIX_FMT_YUYV:
726
+ hasColor = true;
727
+ isYUYV = true;
716728 break;
717729 default:
718730 ALOGW("%s: format %c%c%c%c is not supported!", __FUNCTION__,
....@@ -729,11 +741,19 @@
729741 ANDROID_DEPTH_AVAILABLE_DEPTH_STALL_DURATIONS);
730742 }
731743 if (hasColor) {
732
- initOutputCharskeysByFormat(metadata, V4L2_PIX_FMT_MJPEG, halFormats,
733
- ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT,
734
- ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS,
735
- ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS,
736
- ANDROID_SCALER_AVAILABLE_STALL_DURATIONS);
744
+ if (isMJPEG) {
745
+ initOutputCharskeysByFormat(metadata, V4L2_PIX_FMT_MJPEG, halFormats,
746
+ ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT,
747
+ ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS,
748
+ ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS,
749
+ ANDROID_SCALER_AVAILABLE_STALL_DURATIONS);
750
+ } else if (isYUYV) {
751
+ initOutputCharskeysByFormat(metadata, V4L2_PIX_FMT_YUYV, halYuyvFormats,
752
+ ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT,
753
+ ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS,
754
+ ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS,
755
+ ANDROID_SCALER_AVAILABLE_STALL_DURATIONS);
756
+ }
737757 }
738758
739759 calculateMinFps(metadata);