xref: /aosp_15_r20/frameworks/av/services/camera/libcameraservice/device3/hidl/HidlCamera3OutputUtils.cpp (revision ec779b8e0859a360c3d303172224686826e6e0e1)
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 #define LOG_TAG "HidlCamera3-OutputUtils"
18 #define ATRACE_TAG ATRACE_TAG_CAMERA
19 //#define LOG_NDEBUG 0
20 // Convenience macros for transitioning to the error state
21 #define SET_ERR(fmt, ...) states.setErrIntf.setErrorState(   \
22     "%s: " fmt, __FUNCTION__,                         \
23     ##__VA_ARGS__)
24 
25 #include <inttypes.h>
26 
27 #include <utils/Log.h>
28 #include <utils/SortedVector.h>
29 #include <utils/Trace.h>
30 
31 #include <android/hardware/camera2/ICameraDeviceCallbacks.h>
32 
33 #include <android/hardware/camera/device/3.4/ICameraDeviceCallback.h>
34 #include <android/hardware/camera/device/3.5/ICameraDeviceCallback.h>
35 #include <android/hardware/camera/device/3.5/ICameraDeviceSession.h>
36 
37 #include <camera/CameraUtils.h>
38 #include <camera_metadata_hidden.h>
39 
40 #include "device3/hidl/HidlCamera3OutputUtils.h"
41 #include "device3/aidl/AidlCamera3OutputUtils.h"
42 #include "device3/Camera3Device.h"
43 #include "device3/Camera3OutputUtilsTemplated.h"
44 
45 #include "system/camera_metadata.h"
46 
47 using namespace android::camera3;
48 using namespace android::hardware::camera;
49 
50 namespace android {
51 namespace camera3 {
52 
processOneCaptureResultLocked(HidlCaptureOutputStates & states,const hardware::camera::device::V3_2::CaptureResult & result,const hardware::hidl_vec<hardware::camera::device::V3_4::PhysicalCameraMetadata> & physicalCameraMetadata)53 void processOneCaptureResultLocked(
54         HidlCaptureOutputStates& states,
55         const hardware::camera::device::V3_2::CaptureResult& result,
56         const hardware::hidl_vec<
57                 hardware::camera::device::V3_4::PhysicalCameraMetadata> &physicalCameraMetadata) {
58     processOneCaptureResultLockedT<HidlCaptureOutputStates,
59         hardware::camera::device::V3_2::CaptureResult,
60         hardware::hidl_vec<hardware::camera::device::V3_4::PhysicalCameraMetadata>,
61         hardware::hidl_vec<uint8_t>, ResultMetadataQueue,
62         hardware::camera::device::V3_2::BufferStatus>(states, result, physicalCameraMetadata);
63 }
64 
notify(CaptureOutputStates & states,const hardware::camera::device::V3_2::NotifyMsg & msg)65 void notify(CaptureOutputStates& states,
66         const hardware::camera::device::V3_2::NotifyMsg& msg) {
67 
68     using android::hardware::camera::device::V3_2::MsgType;
69     using android::hardware::camera::device::V3_2::ErrorCode;
70 
71     ATRACE_CALL();
72     camera_notify_msg m;
73     switch (msg.type) {
74         case MsgType::ERROR:
75             m.type = CAMERA_MSG_ERROR;
76             m.message.error.frame_number = msg.msg.error.frameNumber;
77             if (msg.msg.error.errorStreamId >= 0) {
78                 sp<Camera3StreamInterface> stream =
79                         states.outputStreams.get(msg.msg.error.errorStreamId);
80                 if (stream == nullptr) {
81                     ALOGE("%s: Frame %d: Invalid error stream id %d", __FUNCTION__,
82                             m.message.error.frame_number, msg.msg.error.errorStreamId);
83                     return;
84                 }
85                 m.message.error.error_stream = stream->asHalStream();
86             } else {
87                 m.message.error.error_stream = nullptr;
88             }
89             switch (msg.msg.error.errorCode) {
90                 case ErrorCode::ERROR_DEVICE:
91                     m.message.error.error_code = CAMERA_MSG_ERROR_DEVICE;
92                     break;
93                 case ErrorCode::ERROR_REQUEST:
94                     m.message.error.error_code = CAMERA_MSG_ERROR_REQUEST;
95                     break;
96                 case ErrorCode::ERROR_RESULT:
97                     m.message.error.error_code = CAMERA_MSG_ERROR_RESULT;
98                     break;
99                 case ErrorCode::ERROR_BUFFER:
100                     m.message.error.error_code = CAMERA_MSG_ERROR_BUFFER;
101                     break;
102             }
103             break;
104         case MsgType::SHUTTER:
105             m.type = CAMERA_MSG_SHUTTER;
106             m.message.shutter.frame_number = msg.msg.shutter.frameNumber;
107             m.message.shutter.timestamp = msg.msg.shutter.timestamp;
108             m.message.shutter.readout_timestamp_valid = false;
109             m.message.shutter.readout_timestamp = 0LL;
110             break;
111     }
112     notify(states, &m);
113 }
114 
convertToAidl(const hardware::hidl_vec<hardware::camera::device::V3_5::BufferRequest> & hidlBufReqs,std::vector<aidl::android::hardware::camera::device::BufferRequest> & aidlBufReqs)115 static void convertToAidl(
116         const hardware::hidl_vec<hardware::camera::device::V3_5::BufferRequest>& hidlBufReqs,
117         std::vector<aidl::android::hardware::camera::device::BufferRequest> &aidlBufReqs) {
118     size_t i = 0;
119     aidlBufReqs.resize(hidlBufReqs.size());
120     for (const auto &hidlBufReq : hidlBufReqs) {
121         aidlBufReqs[i].streamId = hidlBufReq.streamId;
122         aidlBufReqs[i].numBuffersRequested = hidlBufReq.numBuffersRequested;
123         i++;
124     }
125 }
126 
127 static hardware::camera::device::V3_5::StreamBufferRequestError
convertToHidl(aidl::android::hardware::camera::device::StreamBufferRequestError aError)128 convertToHidl(aidl::android::hardware::camera::device::StreamBufferRequestError aError) {
129     using AError = aidl::android::hardware::camera::device::StreamBufferRequestError;
130     using HError = hardware::camera::device::V3_5::StreamBufferRequestError;
131 
132     switch(aError) {
133         case AError::NO_BUFFER_AVAILABLE:
134             return HError::NO_BUFFER_AVAILABLE;
135         case AError::MAX_BUFFER_EXCEEDED:
136             return HError::MAX_BUFFER_EXCEEDED;
137         case AError::STREAM_DISCONNECTED:
138             return HError::STREAM_DISCONNECTED;
139         default:
140             return HError::UNKNOWN_ERROR;
141     }
142 }
143 
144 static hardware::camera::device::V3_5::BufferRequestStatus
convertToHidl(const aidl::android::hardware::camera::device::BufferRequestStatus & aBufStatus)145 convertToHidl(const aidl::android::hardware::camera::device::BufferRequestStatus &aBufStatus) {
146     using AStatus = aidl::android::hardware::camera::device::BufferRequestStatus;
147     using HStatus = hardware::camera::device::V3_5::BufferRequestStatus;
148     switch (aBufStatus) {
149         case AStatus::OK:
150             return HStatus::OK;
151         case AStatus::FAILED_PARTIAL:
152             return HStatus::FAILED_PARTIAL;
153         case AStatus::FAILED_CONFIGURING:
154             return HStatus::FAILED_CONFIGURING;
155         case AStatus::FAILED_ILLEGAL_ARGUMENTS:
156             return HStatus::FAILED_ILLEGAL_ARGUMENTS;
157         case AStatus::FAILED_UNKNOWN:
158             return HStatus::FAILED_UNKNOWN;
159     }
160     return HStatus::FAILED_UNKNOWN;
161 }
162 
163 static hardware::camera::device::V3_2::BufferStatus
convertToHidl(const aidl::android::hardware::camera::device::BufferStatus & aBufStatus)164 convertToHidl(const aidl::android::hardware::camera::device::BufferStatus &aBufStatus) {
165     using AStatus = aidl::android::hardware::camera::device::BufferStatus;
166     using HStatus = hardware::camera::device::V3_2::BufferStatus;
167     switch (aBufStatus) {
168         case AStatus::OK:
169             return HStatus::OK;
170         case AStatus::ERROR:
171             return HStatus::ERROR;
172     }
173     return HStatus::ERROR;
174 }
175 
convertToHidl(const aidl::android::hardware::common::NativeHandle & ah,std::vector<native_handle_t * > & handlesCreated)176 static native_handle_t *convertToHidl(const aidl::android::hardware::common::NativeHandle &ah,
177         std::vector<native_handle_t *> &handlesCreated) {
178     if (isHandleNull(ah)) {
179         return nullptr;
180     }
181     native_handle_t *nh = makeFromAidl(ah);
182     handlesCreated.emplace_back(nh);
183     return nh;
184 }
185 
convertToHidl(const std::vector<aidl::android::hardware::camera::device::StreamBuffer> & aBuffers,hardware::camera::device::V3_5::StreamBuffersVal & hBuffersVal,std::vector<native_handle_t * > & handlesCreated)186 static void convertToHidl(
187         const std::vector<aidl::android::hardware::camera::device::StreamBuffer> &aBuffers,
188         hardware::camera::device::V3_5::StreamBuffersVal &hBuffersVal,
189         std::vector<native_handle_t *> &handlesCreated) {
190     using HStreamBuffer = hardware::camera::device::V3_2::StreamBuffer;
191     hardware::hidl_vec<HStreamBuffer> tmpBuffers(aBuffers.size());
192     size_t i = 0;
193     for (const auto &aBuf : aBuffers) {
194         tmpBuffers[i].status = convertToHidl(aBuf.status);
195         tmpBuffers[i].streamId = aBuf.streamId;
196         tmpBuffers[i].bufferId = aBuf.bufferId;
197         tmpBuffers[i].buffer = convertToHidl(aBuf.buffer, handlesCreated);
198         tmpBuffers[i].acquireFence = convertToHidl(aBuf.acquireFence, handlesCreated);
199         tmpBuffers[i].releaseFence = convertToHidl(aBuf.releaseFence, handlesCreated);
200         i++;
201     }
202     hBuffersVal.buffers(std::move(tmpBuffers));
203 }
204 
convertToHidl(const std::vector<aidl::android::hardware::camera::device::StreamBufferRet> & aidlBufRets,hardware::hidl_vec<hardware::camera::device::V3_5::StreamBufferRet> & hidlBufRets,std::vector<native_handle_t * > & handlesCreated)205 static void convertToHidl(
206         const std::vector<aidl::android::hardware::camera::device::StreamBufferRet> &aidlBufRets,
207         hardware::hidl_vec<hardware::camera::device::V3_5::StreamBufferRet> &hidlBufRets,
208         std::vector<native_handle_t *> &handlesCreated) {
209     size_t i = 0;
210     using Tag = aidl::android::hardware::camera::device::StreamBuffersVal::Tag;
211     hidlBufRets.resize(aidlBufRets.size());
212     for (const auto &aidlBufRet : aidlBufRets) {
213         auto &hidlBufRet = hidlBufRets[i];
214         hidlBufRet.streamId = aidlBufRet.streamId;
215         switch(aidlBufRet.val.getTag()) {
216           case Tag::error:
217               hidlBufRet.val.error(convertToHidl(aidlBufRet.val.get<Tag::error>()));
218               break;
219           case Tag::buffers:
220               convertToHidl(aidlBufRet.val.get<Tag::buffers>(), hidlBufRet.val, handlesCreated);
221               break;
222         }
223         i++;
224     }
225 }
226 
227 // The buffers requested through this call are not tied to any CaptureRequest in
228 // particular. They may used by the hal for a particular frame's output buffer
229 // or for its internal use as well. In the case that the hal does use any buffer
230 // from the requested list here, for a particular frame's output buffer, the
231 // buffer will be returned with the processCaptureResult call corresponding to
232 // the frame. The other buffers will be returned through returnStreamBuffers.
233 // The buffers returned via returnStreamBuffers will not have a valid
234 // timestamp(0) and will be dropped by the bufferqueue.
requestStreamBuffers(RequestBufferStates & states,const hardware::hidl_vec<hardware::camera::device::V3_5::BufferRequest> & bufReqs,hardware::camera::device::V3_5::ICameraDeviceCallback::requestStreamBuffers_cb _hidl_cb)235 void requestStreamBuffers(RequestBufferStates& states,
236         const hardware::hidl_vec<hardware::camera::device::V3_5::BufferRequest>& bufReqs,
237         hardware::camera::device::V3_5::ICameraDeviceCallback::requestStreamBuffers_cb _hidl_cb) {
238    using android::hardware::camera::device::V3_2::BufferStatus;
239     using android::hardware::camera::device::V3_2::StreamBuffer;
240     using android::hardware::camera::device::V3_5::BufferRequestStatus;
241     using android::hardware::camera::device::V3_5::StreamBufferRet;
242     using android::hardware::camera::device::V3_5::StreamBufferRequestError;
243     std::vector<aidl::android::hardware::camera::device::BufferRequest> aidlBufReqs;
244     hardware::hidl_vec<hardware::camera::device::V3_5::StreamBufferRet> hidlBufRets;
245     convertToAidl(bufReqs, aidlBufReqs);
246     std::vector<::aidl::android::hardware::camera::device::StreamBufferRet> aidlBufRets;
247     ::aidl::android::hardware::camera::device::BufferRequestStatus aidlBufRetStatus;
248 
249     requestStreamBuffers(states, aidlBufReqs, &aidlBufRets, &aidlBufRetStatus);
250     std::vector<native_handle_t *> handlesCreated;
251     convertToHidl(aidlBufRets, hidlBufRets, handlesCreated);
252     _hidl_cb(convertToHidl(aidlBufRetStatus), hidlBufRets);
253     Camera3Device::cleanupNativeHandles(&handlesCreated);
254 }
255 
returnStreamBuffers(ReturnBufferStates & states,const hardware::hidl_vec<hardware::camera::device::V3_2::StreamBuffer> & buffers)256 void returnStreamBuffers(ReturnBufferStates& states,
257         const hardware::hidl_vec<hardware::camera::device::V3_2::StreamBuffer>& buffers) {
258     returnStreamBuffersT(states, buffers);
259 }
260 
261 } // camera3
262 } // namespace android
263