• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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