xref: /aosp_15_r20/frameworks/av/services/camera/virtualcamera/VirtualCameraCaptureResult.cc (revision ec779b8e0859a360c3d303172224686826e6e0e1)
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