Camera: Support TEST_PATTERN_MODE_BLACK for camera muting
If test pattern mode BLACK is supported, but SOLID_COLOR is not,
use it for implementing camera muting.
Also fix up incorrect docs for test patterns
Test: Camera CTS continues to pass
Bug: 189507251
Change-Id: I3db57f42c5615bba28f1b59e61adcde1d0640590
diff --git a/camera/ndk/include/camera/NdkCameraMetadataTags.h b/camera/ndk/include/camera/NdkCameraMetadataTags.h
index 1609c7b..541c21e 100644
--- a/camera/ndk/include/camera/NdkCameraMetadataTags.h
+++ b/camera/ndk/include/camera/NdkCameraMetadataTags.h
@@ -9224,10 +9224,10 @@
* respective color channel provided in
* ACAMERA_SENSOR_TEST_PATTERN_DATA.</p>
* <p>For example:</p>
- * <pre><code>android.control.testPatternData = [0, 0xFFFFFFFF, 0xFFFFFFFF, 0]
+ * <pre><code>ACAMERA_SENSOR_TEST_PATTERN_DATA = [0, 0xFFFFFFFF, 0xFFFFFFFF, 0]
* </code></pre>
* <p>All green pixels are 100% green. All red/blue pixels are black.</p>
- * <pre><code>android.control.testPatternData = [0xFFFFFFFF, 0, 0xFFFFFFFF, 0]
+ * <pre><code>ACAMERA_SENSOR_TEST_PATTERN_DATA = [0xFFFFFFFF, 0, 0xFFFFFFFF, 0]
* </code></pre>
* <p>All red pixels are 100% red. Only the odd green pixels
* are 100% green. All blue pixels are 100% black.</p>
diff --git a/services/camera/libcameraservice/device3/Camera3Device.cpp b/services/camera/libcameraservice/device3/Camera3Device.cpp
index d05a2e1..4b042f7 100644
--- a/services/camera/libcameraservice/device3/Camera3Device.cpp
+++ b/services/camera/libcameraservice/device3/Camera3Device.cpp
@@ -353,9 +353,15 @@
camera_metadata_entry_t availableTestPatternModes = mDeviceInfo.find(
ANDROID_SENSOR_AVAILABLE_TEST_PATTERN_MODES);
for (size_t i = 0; i < availableTestPatternModes.count; i++) {
- if (availableTestPatternModes.data.i32[i] == ANDROID_SENSOR_TEST_PATTERN_MODE_SOLID_COLOR) {
+ if (availableTestPatternModes.data.i32[i] ==
+ ANDROID_SENSOR_TEST_PATTERN_MODE_SOLID_COLOR) {
mSupportCameraMute = true;
+ mSupportTestPatternSolidColor = true;
break;
+ } else if (availableTestPatternModes.data.i32[i] ==
+ ANDROID_SENSOR_TEST_PATTERN_MODE_BLACK) {
+ mSupportCameraMute = true;
+ mSupportTestPatternSolidColor = false;
}
}
@@ -4163,7 +4169,7 @@
mCurrentAfTriggerId(0),
mCurrentPreCaptureTriggerId(0),
mRotateAndCropOverride(ANDROID_SCALER_ROTATE_AND_CROP_NONE),
- mCameraMute(false),
+ mCameraMute(ANDROID_SENSOR_TEST_PATTERN_MODE_OFF),
mCameraMuteChanged(false),
mRepeatingLastFrameNumber(
hardware::camera2::ICameraDeviceUser::NO_IN_FLIGHT_REPEATING_FRAMES),
@@ -5265,11 +5271,11 @@
return OK;
}
-status_t Camera3Device::RequestThread::setCameraMute(bool enabled) {
+status_t Camera3Device::RequestThread::setCameraMute(int32_t muteMode) {
ATRACE_CALL();
Mutex::Autolock l(mTriggerMutex);
- if (enabled != mCameraMute) {
- mCameraMute = enabled;
+ if (muteMode != mCameraMute) {
+ mCameraMute = muteMode;
mCameraMuteChanged = true;
}
return OK;
@@ -5844,8 +5850,8 @@
request->mOriginalTestPatternData[3]
};
- if (mCameraMute) {
- testPatternMode = ANDROID_SENSOR_TEST_PATTERN_MODE_SOLID_COLOR;
+ if (mCameraMute != ANDROID_SENSOR_TEST_PATTERN_MODE_OFF) {
+ testPatternMode = mCameraMute;
testPatternData[0] = 0;
testPatternData[1] = 0;
testPatternData[2] = 0;
@@ -6535,7 +6541,11 @@
if (mRequestThread == nullptr || !mSupportCameraMute) {
return INVALID_OPERATION;
}
- return mRequestThread->setCameraMute(enabled);
+ int32_t muteMode =
+ !enabled ? ANDROID_SENSOR_TEST_PATTERN_MODE_OFF :
+ mSupportTestPatternSolidColor ? ANDROID_SENSOR_TEST_PATTERN_MODE_SOLID_COLOR :
+ ANDROID_SENSOR_TEST_PATTERN_MODE_BLACK;
+ return mRequestThread->setCameraMute(muteMode);
}
status_t Camera3Device::injectCamera(const String8& injectedCamId,
diff --git a/services/camera/libcameraservice/device3/Camera3Device.h b/services/camera/libcameraservice/device3/Camera3Device.h
index f962c78..b27f1a5 100644
--- a/services/camera/libcameraservice/device3/Camera3Device.h
+++ b/services/camera/libcameraservice/device3/Camera3Device.h
@@ -918,7 +918,7 @@
status_t setRotateAndCropAutoBehavior(
camera_metadata_enum_android_scaler_rotate_and_crop_t rotateAndCropValue);
- status_t setCameraMute(bool enabled);
+ status_t setCameraMute(int32_t muteMode);
status_t setHalInterface(sp<HalInterface> newHalInterface);
@@ -1069,7 +1069,7 @@
uint32_t mCurrentAfTriggerId;
uint32_t mCurrentPreCaptureTriggerId;
camera_metadata_enum_android_scaler_rotate_and_crop_t mRotateAndCropOverride;
- bool mCameraMute;
+ int32_t mCameraMute; // 0 = no mute, otherwise the TEST_PATTERN_MODE to use
bool mCameraMuteChanged;
int64_t mRepeatingLastFrameNumber;
@@ -1342,6 +1342,8 @@
// Whether the HAL supports camera muting via test pattern
bool mSupportCameraMute = false;
+ // Whether the HAL supports SOLID_COLOR or BLACK if mSupportCameraMute is true
+ bool mSupportTestPatternSolidColor = false;
// Injection camera related methods.
class Camera3DeviceInjectionMethods : public virtual RefBase {