1 /*
2 * Copyright (C) 2022 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include <cutils/properties.h>
18
19 #include "SessionConfigurationUtils.h"
20 #include "SessionConfigurationUtilsHidl.h"
21
22 #include "../CameraService.h"
23 #include "device3/aidl/AidlCamera3Device.h"
24 #include "device3/hidl/HidlCamera3Device.h"
25 #include "device3/Camera3OutputStream.h"
26 #include "utils/Utils.h"
27
28 using android::camera3::OutputStreamInfo;
29 using android::hardware::camera2::ICameraDeviceUser;
30 using android::hardware::camera::metadata::V3_6::CameraMetadataEnumAndroidSensorPixelMode;
31
32 namespace android {
33 namespace camera3 {
34
35 namespace SessionConfigurationUtils {
36
37 status_t
convertAidlToHidl37StreamCombination(const aidl::android::hardware::camera::device::StreamConfiguration & aidl,hardware::camera::device::V3_7::StreamConfiguration & hidl)38 convertAidlToHidl37StreamCombination(
39 const aidl::android::hardware::camera::device::StreamConfiguration &aidl,
40 hardware::camera::device::V3_7::StreamConfiguration &hidl) {
41 hidl.operationMode =
42 static_cast<hardware::camera::device::V3_2::StreamConfigurationMode>(aidl.operationMode);
43 if (aidl.streamConfigCounter < 0) {
44 return BAD_VALUE;
45 }
46 hidl.streamConfigCounter = static_cast<uint32_t>(aidl.streamConfigCounter);
47 hidl.multiResolutionInputImage = aidl.multiResolutionInputImage;
48 hidl.sessionParams = aidl.sessionParams.metadata;
49 hidl.streams.resize(aidl.streams.size());
50 size_t i = 0;
51 for (const auto &stream : aidl.streams) {
52 if (eToI(stream.dynamicRangeProfile) !=
53 ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD) {
54 ALOGE("%s Dynamic range profile %" PRId64 " not supported by HIDL", __FUNCTION__,
55 eToI(stream.dynamicRangeProfile));
56 return BAD_VALUE;
57 }
58
59 if (eToI(stream.useCase) != ANDROID_SCALER_AVAILABLE_STREAM_USE_CASES_DEFAULT) {
60 ALOGE("%s Stream use case %" PRId64 "not supported by HIDL", __FUNCTION__,
61 eToI(stream.useCase));
62 return BAD_VALUE;
63 }
64
65 // hidl v3_7
66 hidl.streams[i].groupId = stream.groupId;
67 hidl.streams[i].sensorPixelModesUsed.resize(stream.sensorPixelModesUsed.size());
68 size_t j = 0;
69 for (const auto &mode : stream.sensorPixelModesUsed) {
70 hidl.streams[i].sensorPixelModesUsed[j] =
71 static_cast<CameraMetadataEnumAndroidSensorPixelMode>(mode);
72 j++;
73 }
74
75 //hidl v3_4
76 hidl.streams[i].v3_4.physicalCameraId = stream.physicalCameraId;
77
78 if (stream.bufferSize < 0) {
79 return BAD_VALUE;
80 }
81 hidl.streams[i].v3_4.bufferSize = static_cast<uint32_t>(stream.bufferSize);
82
83 // hild v3_2
84 hidl.streams[i].v3_4.v3_2.id = stream.id;
85 hidl.streams[i].v3_4.v3_2.format =
86 static_cast<hardware::graphics::common::V1_0::PixelFormat>(stream.format);
87
88 if (stream.width < 0 || stream.height < 0) {
89 return BAD_VALUE;
90 }
91 hidl.streams[i].v3_4.v3_2.width = static_cast<uint32_t>(stream.width);
92 hidl.streams[i].v3_4.v3_2.height = static_cast<uint32_t>(stream.height);
93 hidl.streams[i].v3_4.v3_2.usage =
94 static_cast<hardware::camera::device::V3_2::BufferUsageFlags>(stream.usage);
95 hidl.streams[i].v3_4.v3_2.streamType =
96 static_cast<hardware::camera::device::V3_2::StreamType>(stream.streamType);
97 hidl.streams[i].v3_4.v3_2.dataSpace =
98 static_cast<hardware::camera::device::V3_2::DataspaceFlags>(stream.dataSpace);
99 hidl.streams[i].v3_4.v3_2.rotation =
100 static_cast<hardware::camera::device::V3_2::StreamRotation>(stream.rotation);
101 i++;
102 }
103 return OK;
104 }
105
106 binder::Status
convertToHALStreamCombination(const SessionConfiguration & sessionConfiguration,const std::string & logicalCameraId,const CameraMetadata & deviceInfo,metadataGetter getMetadata,const std::vector<std::string> & physicalCameraIds,hardware::camera::device::V3_7::StreamConfiguration & streamConfiguration,bool overrideForPerfClass,metadata_vendor_id_t vendorTagId,bool * earlyExit)107 convertToHALStreamCombination(
108 const SessionConfiguration& sessionConfiguration,
109 const std::string &logicalCameraId, const CameraMetadata &deviceInfo,
110 metadataGetter getMetadata, const std::vector<std::string> &physicalCameraIds,
111 hardware::camera::device::V3_7::StreamConfiguration &streamConfiguration,
112 bool overrideForPerfClass, metadata_vendor_id_t vendorTagId, bool *earlyExit) {
113 aidl::android::hardware::camera::device::StreamConfiguration aidlStreamConfiguration;
114 auto ret = convertToHALStreamCombination(
115 sessionConfiguration, logicalCameraId, deviceInfo, false /*isCompositeJpegRDisabled*/,
116 false /*isCompositeHeicDisabled*/, false /*isCompositeHeicUltraHDRDisabled*/,
117 getMetadata, physicalCameraIds, aidlStreamConfiguration, overrideForPerfClass,
118 vendorTagId, /*checkSessionParams*/ false, /*additionalKeys*/ {}, earlyExit);
119 if (!ret.isOk()) {
120 return ret;
121 }
122 if (earlyExit != nullptr && *earlyExit) {
123 return binder::Status::ok();
124 }
125
126 if (convertAidlToHidl37StreamCombination(aidlStreamConfiguration, streamConfiguration) != OK) {
127 return STATUS_ERROR(CameraService::ERROR_ILLEGAL_ARGUMENT,
128 "Invalid AIDL->HIDL3.7 conversion");
129 }
130
131 return binder::Status::ok();
132 }
133
convertHALStreamCombinationFromV37ToV34(hardware::camera::device::V3_4::StreamConfiguration & streamConfigV34,const hardware::camera::device::V3_7::StreamConfiguration & streamConfigV37)134 bool convertHALStreamCombinationFromV37ToV34(
135 hardware::camera::device::V3_4::StreamConfiguration &streamConfigV34,
136 const hardware::camera::device::V3_7::StreamConfiguration &streamConfigV37) {
137 if (streamConfigV37.multiResolutionInputImage) {
138 // ICameraDevice older than 3.7 doesn't support multi-resolution input image.
139 return false;
140 }
141
142 streamConfigV34.streams.resize(streamConfigV37.streams.size());
143 for (size_t i = 0; i < streamConfigV37.streams.size(); i++) {
144 if (streamConfigV37.streams[i].groupId != -1) {
145 // ICameraDevice older than 3.7 doesn't support multi-resolution output
146 // image
147 return false;
148 }
149 streamConfigV34.streams[i] = streamConfigV37.streams[i].v3_4;
150 }
151 streamConfigV34.operationMode = streamConfigV37.operationMode;
152 streamConfigV34.sessionParams = streamConfigV37.sessionParams;
153
154 return true;
155 }
156
157 } // namespace SessionConfigurationUtils
158 } // namespace camera3
159 } // namespace android
160