1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2024 The Android Open Source Project
3*ec779b8eSAndroid Build Coastguard Worker *
4*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*ec779b8eSAndroid Build Coastguard Worker *
8*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*ec779b8eSAndroid Build Coastguard Worker *
10*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*ec779b8eSAndroid Build Coastguard Worker * limitations under the License.
15*ec779b8eSAndroid Build Coastguard Worker */
16*ec779b8eSAndroid Build Coastguard Worker #include "VirtualCameraCaptureResult.h"
17*ec779b8eSAndroid Build Coastguard Worker
18*ec779b8eSAndroid Build Coastguard Worker #include <cstdint>
19*ec779b8eSAndroid Build Coastguard Worker #include <memory>
20*ec779b8eSAndroid Build Coastguard Worker
21*ec779b8eSAndroid Build Coastguard Worker #include "VirtualCameraCaptureRequest.h"
22*ec779b8eSAndroid Build Coastguard Worker #include "aidl/android/hardware/camera/device/CameraMetadata.h"
23*ec779b8eSAndroid Build Coastguard Worker #include "util/MetadataUtil.h"
24*ec779b8eSAndroid Build Coastguard Worker
25*ec779b8eSAndroid Build Coastguard Worker namespace android {
26*ec779b8eSAndroid Build Coastguard Worker namespace companion {
27*ec779b8eSAndroid Build Coastguard Worker namespace virtualcamera {
28*ec779b8eSAndroid Build Coastguard Worker
29*ec779b8eSAndroid Build Coastguard Worker using ::aidl::android::hardware::camera::device::CameraMetadata;
30*ec779b8eSAndroid Build Coastguard Worker namespace {
31*ec779b8eSAndroid Build Coastguard Worker // See REQUEST_PIPELINE_DEPTH in CaptureResult.java.
32*ec779b8eSAndroid Build Coastguard Worker // This roughly corresponds to frame latency, we set to
33*ec779b8eSAndroid Build Coastguard Worker // documented minimum of 2.
34*ec779b8eSAndroid Build Coastguard Worker static constexpr uint8_t kPipelineDepth = 2;
35*ec779b8eSAndroid Build Coastguard Worker
36*ec779b8eSAndroid Build Coastguard Worker } // namespace
37*ec779b8eSAndroid Build Coastguard Worker
createCaptureResultMetadata(const std::chrono::nanoseconds timestamp,const RequestSettings & requestSettings,const Resolution reportedSensorSize)38*ec779b8eSAndroid Build Coastguard Worker std::unique_ptr<CameraMetadata> createCaptureResultMetadata(
39*ec779b8eSAndroid Build Coastguard Worker const std::chrono::nanoseconds timestamp,
40*ec779b8eSAndroid Build Coastguard Worker const RequestSettings& requestSettings,
41*ec779b8eSAndroid Build Coastguard Worker const Resolution reportedSensorSize) {
42*ec779b8eSAndroid Build Coastguard Worker // All of the keys used in the response needs to be referenced in
43*ec779b8eSAndroid Build Coastguard Worker // availableResultKeys in CameraCharacteristics (see initCameraCharacteristics
44*ec779b8eSAndroid Build Coastguard Worker // in VirtualCameraDevice.cc).
45*ec779b8eSAndroid Build Coastguard Worker MetadataBuilder builder =
46*ec779b8eSAndroid Build Coastguard Worker MetadataBuilder()
47*ec779b8eSAndroid Build Coastguard Worker .setAberrationCorrectionMode(
48*ec779b8eSAndroid Build Coastguard Worker ANDROID_COLOR_CORRECTION_ABERRATION_MODE_OFF)
49*ec779b8eSAndroid Build Coastguard Worker .setControlAeAvailableAntibandingModes(
50*ec779b8eSAndroid Build Coastguard Worker {ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF})
51*ec779b8eSAndroid Build Coastguard Worker .setControlAeAntibandingMode(ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF)
52*ec779b8eSAndroid Build Coastguard Worker .setControlAeExposureCompensation(0)
53*ec779b8eSAndroid Build Coastguard Worker .setControlAeLockAvailable(false)
54*ec779b8eSAndroid Build Coastguard Worker .setControlAeLock(ANDROID_CONTROL_AE_LOCK_OFF)
55*ec779b8eSAndroid Build Coastguard Worker .setControlAeMode(ANDROID_CONTROL_AE_MODE_ON)
56*ec779b8eSAndroid Build Coastguard Worker .setControlAePrecaptureTrigger(
57*ec779b8eSAndroid Build Coastguard Worker // Limited devices are expected to have precapture ae enabled and
58*ec779b8eSAndroid Build Coastguard Worker // respond to cancellation request. Since we don't actuall support
59*ec779b8eSAndroid Build Coastguard Worker // AE at all, let's just respect the cancellation expectation in
60*ec779b8eSAndroid Build Coastguard Worker // case it's requested
61*ec779b8eSAndroid Build Coastguard Worker requestSettings.aePrecaptureTrigger ==
62*ec779b8eSAndroid Build Coastguard Worker ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL
63*ec779b8eSAndroid Build Coastguard Worker ? ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL
64*ec779b8eSAndroid Build Coastguard Worker : ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_IDLE)
65*ec779b8eSAndroid Build Coastguard Worker .setControlAeState(ANDROID_CONTROL_AE_STATE_INACTIVE)
66*ec779b8eSAndroid Build Coastguard Worker .setControlAfMode(ANDROID_CONTROL_AF_MODE_OFF)
67*ec779b8eSAndroid Build Coastguard Worker .setControlAfTrigger(ANDROID_CONTROL_AF_TRIGGER_IDLE)
68*ec779b8eSAndroid Build Coastguard Worker .setControlAfState(ANDROID_CONTROL_AF_STATE_INACTIVE)
69*ec779b8eSAndroid Build Coastguard Worker .setControlAwbMode(ANDROID_CONTROL_AWB_MODE_AUTO)
70*ec779b8eSAndroid Build Coastguard Worker .setControlAwbLock(ANDROID_CONTROL_AWB_LOCK_OFF)
71*ec779b8eSAndroid Build Coastguard Worker .setControlAwbState(ANDROID_CONTROL_AWB_STATE_INACTIVE)
72*ec779b8eSAndroid Build Coastguard Worker .setControlCaptureIntent(requestSettings.captureIntent)
73*ec779b8eSAndroid Build Coastguard Worker .setControlEffectMode(ANDROID_CONTROL_EFFECT_MODE_OFF)
74*ec779b8eSAndroid Build Coastguard Worker .setControlMode(ANDROID_CONTROL_MODE_AUTO)
75*ec779b8eSAndroid Build Coastguard Worker .setControlSceneMode(ANDROID_CONTROL_SCENE_MODE_DISABLED)
76*ec779b8eSAndroid Build Coastguard Worker .setControlVideoStabilizationMode(
77*ec779b8eSAndroid Build Coastguard Worker ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF)
78*ec779b8eSAndroid Build Coastguard Worker .setCropRegion(0, 0, reportedSensorSize.width,
79*ec779b8eSAndroid Build Coastguard Worker reportedSensorSize.height)
80*ec779b8eSAndroid Build Coastguard Worker .setFaceDetectMode(ANDROID_STATISTICS_FACE_DETECT_MODE_OFF)
81*ec779b8eSAndroid Build Coastguard Worker .setFlashState(ANDROID_FLASH_STATE_UNAVAILABLE)
82*ec779b8eSAndroid Build Coastguard Worker .setFlashMode(ANDROID_FLASH_MODE_OFF)
83*ec779b8eSAndroid Build Coastguard Worker .setFocalLength(VirtualCameraDevice::kFocalLength)
84*ec779b8eSAndroid Build Coastguard Worker .setJpegQuality(requestSettings.jpegQuality)
85*ec779b8eSAndroid Build Coastguard Worker .setJpegOrientation(requestSettings.jpegOrientation)
86*ec779b8eSAndroid Build Coastguard Worker .setJpegThumbnailSize(requestSettings.thumbnailResolution.width,
87*ec779b8eSAndroid Build Coastguard Worker requestSettings.thumbnailResolution.height)
88*ec779b8eSAndroid Build Coastguard Worker .setJpegThumbnailQuality(requestSettings.thumbnailJpegQuality)
89*ec779b8eSAndroid Build Coastguard Worker .setLensOpticalStabilizationMode(
90*ec779b8eSAndroid Build Coastguard Worker ANDROID_LENS_OPTICAL_STABILIZATION_MODE_OFF)
91*ec779b8eSAndroid Build Coastguard Worker .setNoiseReductionMode(ANDROID_NOISE_REDUCTION_MODE_OFF)
92*ec779b8eSAndroid Build Coastguard Worker .setPipelineDepth(kPipelineDepth)
93*ec779b8eSAndroid Build Coastguard Worker .setSensorTimestamp(timestamp)
94*ec779b8eSAndroid Build Coastguard Worker .setStatisticsHotPixelMapMode(
95*ec779b8eSAndroid Build Coastguard Worker ANDROID_STATISTICS_HOT_PIXEL_MAP_MODE_OFF)
96*ec779b8eSAndroid Build Coastguard Worker .setStatisticsLensShadingMapMode(
97*ec779b8eSAndroid Build Coastguard Worker ANDROID_STATISTICS_LENS_SHADING_MAP_MODE_OFF)
98*ec779b8eSAndroid Build Coastguard Worker .setStatisticsSceneFlicker(ANDROID_STATISTICS_SCENE_FLICKER_NONE);
99*ec779b8eSAndroid Build Coastguard Worker
100*ec779b8eSAndroid Build Coastguard Worker if (requestSettings.fpsRange.has_value()) {
101*ec779b8eSAndroid Build Coastguard Worker builder.setControlAeTargetFpsRange(requestSettings.fpsRange.value());
102*ec779b8eSAndroid Build Coastguard Worker }
103*ec779b8eSAndroid Build Coastguard Worker
104*ec779b8eSAndroid Build Coastguard Worker if (requestSettings.gpsCoordinates.has_value()) {
105*ec779b8eSAndroid Build Coastguard Worker const GpsCoordinates& coordinates = requestSettings.gpsCoordinates.value();
106*ec779b8eSAndroid Build Coastguard Worker builder.setJpegGpsCoordinates(coordinates);
107*ec779b8eSAndroid Build Coastguard Worker }
108*ec779b8eSAndroid Build Coastguard Worker
109*ec779b8eSAndroid Build Coastguard Worker std::unique_ptr<CameraMetadata> metadata = builder.build();
110*ec779b8eSAndroid Build Coastguard Worker
111*ec779b8eSAndroid Build Coastguard Worker if (metadata == nullptr) {
112*ec779b8eSAndroid Build Coastguard Worker ALOGE("%s: Failed to build capture result metadata", __func__);
113*ec779b8eSAndroid Build Coastguard Worker return std::make_unique<CameraMetadata>();
114*ec779b8eSAndroid Build Coastguard Worker }
115*ec779b8eSAndroid Build Coastguard Worker return metadata;
116*ec779b8eSAndroid Build Coastguard Worker }
117*ec779b8eSAndroid Build Coastguard Worker
118*ec779b8eSAndroid Build Coastguard Worker } // namespace virtualcamera
119*ec779b8eSAndroid Build Coastguard Worker } // namespace companion
120*ec779b8eSAndroid Build Coastguard Worker } // namespace android