blob: e36c2eae6e9b96774359684f4654bfd8ea19a93e [file] [log] [blame]
Jayant Chowdhary0c947272018-08-15 14:42:04 -07001/*
2 * Copyright (C) 2018 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#ifndef ANDROID_FRAMEWORKS_AIDL_CAMERADEVICECALLBACKS_H
18#define ANDROID_FRAMEWORKS_AIDL_CAMERADEVICECALLBACKS_H
19
20#include <mutex>
21#include <thread>
22
23#include <android/frameworks/cameraservice/common/2.0/types.h>
24#include <android/frameworks/cameraservice/service/2.0/types.h>
25#include <android/frameworks/cameraservice/device/2.0/ICameraDeviceCallback.h>
26#include <android/frameworks/cameraservice/device/2.0/types.h>
27#include <android/hardware/camera2/BnCameraDeviceCallbacks.h>
28#include <media/stagefright/foundation/ALooper.h>
29#include <media/stagefright/foundation/AHandler.h>
30#include <media/stagefright/foundation/AMessage.h>
31#include <fmq/MessageQueue.h>
32#include <hidl/MQDescriptor.h>
33#include <hidl/Status.h>
34#include <CameraService.h>
35#include <hidl/CameraHybridInterface.h>
36
37namespace android {
38namespace frameworks {
39namespace cameraservice {
40namespace device {
41namespace V2_0 {
42namespace implementation {
43
44using camerahybrid::H2BConverter;
45using HCameraDeviceCallback = cameraservice::device::V2_0::ICameraDeviceCallback;
46using HPhysicalCaptureResultInfo = cameraservice::device::V2_0::PhysicalCaptureResultInfo;
47using android::frameworks::cameraservice::device::V2_0::FmqSizeOrMetadata;
48
49using hardware::camera2::BnCameraDeviceCallbacks;
50using hardware::camera2::ICameraDeviceCallbacks;
51using hardware::camera2::impl::CaptureResultExtras;
52using hardware::camera2::impl::CameraMetadataNative;
53using hardware::camera2::impl::PhysicalCaptureResultInfo;
54using hardware::kSynchronizedReadWrite;
55using hardware::MessageQueue;
56using CaptureResultMetadataQueue = MessageQueue<uint8_t, kSynchronizedReadWrite>;
Jayant Chowdharydcae7962024-08-20 21:20:10 +000057using CameraMetadataInfo = android::hardware::camera2::CameraMetadataInfo;
Jayant Chowdhary0c947272018-08-15 14:42:04 -070058
59struct H2BCameraDeviceCallbacks :
60 public H2BConverter<HCameraDeviceCallback, ICameraDeviceCallbacks, BnCameraDeviceCallbacks> {
61 H2BCameraDeviceCallbacks(const sp<HalInterface>& base);
62
63 ~H2BCameraDeviceCallbacks();
64
Jayant Chowdhary2f686522022-05-09 14:52:16 +000065 bool initializeLooper(int vndkVersion);
Jayant Chowdhary0c947272018-08-15 14:42:04 -070066
67 virtual binder::Status onDeviceError(int32_t errorCode,
68 const CaptureResultExtras& resultExtras) override;
69
70 virtual binder::Status onDeviceIdle() override;
71
72 virtual binder::Status onCaptureStarted(const CaptureResultExtras& resultExtras,
73 int64_t timestamp) override;
74
75 virtual binder::Status onResultReceived(
Jayant Chowdharydcae7962024-08-20 21:20:10 +000076 const CameraMetadataInfo &,
77 const CaptureResultExtras& resultExtras,
Jayant Chowdhary0c947272018-08-15 14:42:04 -070078 const std::vector<PhysicalCaptureResultInfo>& physicalCaptureResultInfos) override;
79
80 virtual binder::Status onPrepared(int32_t streamId) override;
81
82 virtual binder::Status onRepeatingRequestError(int64_t lastFrameNumber,
83 int32_t repeatingRequestId) override;
84
85 virtual binder::Status onRequestQueueEmpty() override;
86
87 void setCaptureResultMetadataQueue(std::shared_ptr<CaptureResultMetadataQueue> metadataQueue) {
88 mCaptureResultMetadataQueue = metadataQueue;
89 }
90
Jyoti Bhayana1f9600b2024-10-29 20:25:32 -070091 virtual binder::Status onClientSharedAccessPriorityChanged(bool /*primaryClient*/) {
92 return binder::Status::ok();
93 }
94
Jayant Chowdhary0c947272018-08-15 14:42:04 -070095 private:
96 // Wrapper struct so that parameters to onResultReceived callback may be
97 // sent through an AMessage.
98 struct ResultWrapper : public RefBase {
99 CameraMetadataNative mResult;
100 CaptureResultExtras mResultExtras;
101 std::vector<PhysicalCaptureResultInfo> mPhysicalCaptureResultInfos;
102 ResultWrapper(CameraMetadataNative &result,
103 const CaptureResultExtras resultExtras,
104 const std::vector<PhysicalCaptureResultInfo> &physicalCaptureResultInfos) :
105 // TODO: make this std::movable
106 mResult(result), mResultExtras(resultExtras), mPhysicalCaptureResultInfos(physicalCaptureResultInfos) { }
107 };
108
109 struct CallbackHandler : public AHandler {
110 public:
111 void onMessageReceived(const sp<AMessage> &msg) override;
Jayant Chowdhary2f686522022-05-09 14:52:16 +0000112 CallbackHandler(H2BCameraDeviceCallbacks *converter, int vndkVersion) :
113 mConverter(converter), mVndkVersion(vndkVersion) { }
Jayant Chowdhary0c947272018-08-15 14:42:04 -0700114 private:
115 void processResultMessage(sp<ResultWrapper> &resultWrapper);
116 wp<H2BCameraDeviceCallbacks> mConverter = nullptr;
Jayant Chowdhary2f686522022-05-09 14:52:16 +0000117 int mVndkVersion = -1;
Jayant Chowdhary0c947272018-08-15 14:42:04 -0700118 Mutex mMetadataQueueLock;
119 };
120
121 void convertResultMetadataToHidl(const camera_metadata *rawMetadata,
122 FmqSizeOrMetadata *resultMetadata);
123 enum {
124 kWhatResultReceived,
125 };
126
127 static const char *kResultKey;
128
129 std::shared_ptr<CaptureResultMetadataQueue> mCaptureResultMetadataQueue = nullptr;
130 sp<CallbackHandler> mHandler = nullptr;
131 sp<ALooper> mCbLooper = nullptr;
132};
133
134} // implementation
135} // V2_0
136} // device
137} // cameraservice
138} // frameworks
139} // android
140#endif // ANDROID_FRAMEWORKS_AIDL_CAMERADEVICECALLBACKS_H