• 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 #ifndef HARDWARE_INTERFACES_CAMERA_DEVICE_DEFAULT_EXTERNALCAMERAOFFLINESESSION_H_
18 #define HARDWARE_INTERFACES_CAMERA_DEVICE_DEFAULT_EXTERNALCAMERAOFFLINESESSION_H_
19 
20 #include <ExternalCameraDeviceSession.h>
21 #include <ExternalCameraUtils.h>
22 #include <aidl/android/hardware/camera/common/Status.h>
23 #include <aidl/android/hardware/camera/device/BnCameraOfflineSession.h>
24 #include <aidl/android/hardware/camera/device/Stream.h>
25 #include <fmq/AidlMessageQueue.h>
26 #include <utils/RefBase.h>
27 #include <deque>
28 
29 namespace android {
30 namespace hardware {
31 namespace camera {
32 namespace device {
33 namespace implementation {
34 
35 using ::aidl::android::hardware::camera::common::Status;
36 using ::aidl::android::hardware::camera::device::BnCameraOfflineSession;
37 using ::aidl::android::hardware::camera::device::ICameraDeviceCallback;
38 using ::aidl::android::hardware::camera::device::Stream;
39 using ::aidl::android::hardware::common::fmq::MQDescriptor;
40 using ::aidl::android::hardware::common::fmq::SynchronizedReadWrite;
41 
42 class ExternalCameraOfflineSession final : public BnCameraOfflineSession,
43                                            public virtual RefBase,
44                                            public virtual OutputThreadInterface {
45   public:
46     ExternalCameraOfflineSession(const CroppingType& croppingType,
47                                  const common::V1_0::helper::CameraMetadata& chars,
48                                  const std::string& cameraId, const std::string& exifMake,
49                                  const std::string& exifModel, uint32_t blobBufferSize,
50                                  bool afTrigger, const std::vector<Stream>& offlineStreams,
51                                  std::deque<std::shared_ptr<HalRequest>>& offlineReqs,
52                                  const std::map<int, CirculatingBuffers>& circulatingBuffers);
53 
54     ~ExternalCameraOfflineSession() override;
55 
56     bool initialize();
57 
58     // Methods from OutputThreadInterface
59     Status importBuffer(int32_t streamId, uint64_t bufId, buffer_handle_t buf,
60                         /*out*/ buffer_handle_t** outBufPtr) override;
61 
62     Status processCaptureResult(std::shared_ptr<HalRequest>&) override;
63 
64     Status processCaptureRequestError(const std::shared_ptr<HalRequest>&,
65                                       /*out*/ std::vector<NotifyMsg>* msgs,
66                                       /*out*/ std::vector<CaptureResult>* results) override;
67 
68     ssize_t getJpegBufferSize(int32_t width, int32_t height) const override;
69 
70     void notifyError(int32_t frameNumber, int32_t streamId, ErrorCode ec) override;
71     // End of OutputThreadInterface methods
72 
73     ScopedAStatus setCallback(const std::shared_ptr<ICameraDeviceCallback>& in_cb) override;
74     ScopedAStatus getCaptureResultMetadataQueue(
75             MQDescriptor<int8_t, SynchronizedReadWrite>* _aidl_return) override;
76     ScopedAStatus close() override;
77 
78   private:
79     class OutputThread : public ExternalCameraDeviceSession::OutputThread {
80       public:
OutputThread(std::weak_ptr<OutputThreadInterface> parent,CroppingType ct,const common::V1_0::helper::CameraMetadata & chars,std::shared_ptr<ExternalCameraDeviceSession::BufferRequestThread> bufReqThread,std::deque<std::shared_ptr<HalRequest>> & offlineReqs)81         OutputThread(std::weak_ptr<OutputThreadInterface> parent, CroppingType ct,
82                      const common::V1_0::helper::CameraMetadata& chars,
83                      std::shared_ptr<ExternalCameraDeviceSession::BufferRequestThread> bufReqThread,
84                      std::deque<std::shared_ptr<HalRequest>>& offlineReqs)
85             : ExternalCameraDeviceSession::OutputThread(std::move(parent), ct, chars,
86                                                         std::move(bufReqThread)),
87               mOfflineReqs(offlineReqs) {}
88 
89         bool threadLoop() override;
90 
91       protected:
92         std::deque<std::shared_ptr<HalRequest>> mOfflineReqs;
93     };  // OutputThread
94 
95     status_t fillCaptureResult(common::V1_0::helper::CameraMetadata md, nsecs_t timestamp);
96     void invokeProcessCaptureResultCallback(std::vector<CaptureResult>& results, bool tryWriteFmq);
97     void initOutputThread();
98     void cleanupBuffersLocked(int32_t id);
99 
100     // Protect (most of) HIDL interface methods from synchronized-entering
101     mutable Mutex mInterfaceLock;
102 
103     mutable Mutex mLock;  // Protect all data members except otherwise noted
104 
105     bool mClosed = false;
106     const CroppingType mCroppingType;
107     const common::V1_0::helper::CameraMetadata mChars;
108     const std::string mCameraId;
109     const std::string mExifMake;
110     const std::string mExifModel;
111     const uint32_t mBlobBufferSize;
112 
113     std::mutex mAfTriggerLock;  // protect mAfTrigger
114     bool mAfTrigger;
115 
116     const std::vector<Stream> mOfflineStreams;
117     std::deque<std::shared_ptr<HalRequest>> mOfflineReqs;
118 
119     // Protect mCirculatingBuffers, must not lock mLock after acquiring this lock
120     mutable Mutex mCbsLock;
121     std::map<int, CirculatingBuffers> mCirculatingBuffers;
122 
123     static HandleImporter sHandleImporter;
124 
125     using ResultMetadataQueue = AidlMessageQueue<int8_t, SynchronizedReadWrite>;
126     std::shared_ptr<ResultMetadataQueue> mResultMetadataQueue;
127 
128     // Protect against invokeProcessCaptureResultCallback()
129     Mutex mProcessCaptureResultLock;
130 
131     std::shared_ptr<ICameraDeviceCallback> mCallback;
132 
133     std::shared_ptr<ExternalCameraDeviceSession::BufferRequestThread> mBufferRequestThread;
134     std::shared_ptr<OutputThread> mOutputThread;
135 };
136 
137 }  // namespace implementation
138 }  // namespace device
139 }  // namespace camera
140 }  // namespace hardware
141 }  // namespace android
142 
143 #endif  // HARDWARE_INTERFACES_CAMERA_DEVICE_DEFAULT_EXTERNALCAMERAOFFLINESESSION_H_
144