| /* | |
| * Copyright (C) 2022 The Android Open Source Project | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); | |
| * you may not use this file except in compliance with the License. | |
| * You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| */ | |
| #ifndef HARDWARE_INTERFACES_CAMERA_DEVICE_DEFAULT_EXTERNALCAMERAOFFLINESESSION_H_ | |
| #define HARDWARE_INTERFACES_CAMERA_DEVICE_DEFAULT_EXTERNALCAMERAOFFLINESESSION_H_ | |
| #include <ExternalCameraDeviceSession.h> | |
| #include <ExternalCameraUtils.h> | |
| #include <aidl/android/hardware/camera/common/Status.h> | |
| #include <aidl/android/hardware/camera/device/BnCameraOfflineSession.h> | |
| #include <aidl/android/hardware/camera/device/Stream.h> | |
| #include <fmq/AidlMessageQueue.h> | |
| #include <utils/RefBase.h> | |
| #include <deque> | |
| namespace android { | |
| namespace hardware { | |
| namespace camera { | |
| namespace device { | |
| namespace implementation { | |
| using ::aidl::android::hardware::camera::common::Status; | |
| using ::aidl::android::hardware::camera::device::BnCameraOfflineSession; | |
| using ::aidl::android::hardware::camera::device::ICameraDeviceCallback; | |
| using ::aidl::android::hardware::camera::device::Stream; | |
| using ::aidl::android::hardware::common::fmq::MQDescriptor; | |
| using ::aidl::android::hardware::common::fmq::SynchronizedReadWrite; | |
| class ExternalCameraOfflineSession final : public BnCameraOfflineSession, | |
| public virtual RefBase, | |
| public virtual OutputThreadInterface { | |
| public: | |
| ExternalCameraOfflineSession(const CroppingType& croppingType, | |
| const common::V1_0::helper::CameraMetadata& chars, | |
| const std::string& cameraId, const std::string& exifMake, | |
| const std::string& exifModel, uint32_t blobBufferSize, | |
| bool afTrigger, const std::vector<Stream>& offlineStreams, | |
| std::deque<std::shared_ptr<HalRequest>>& offlineReqs, | |
| const std::map<int, CirculatingBuffers>& circulatingBuffers); | |
| ~ExternalCameraOfflineSession() override; | |
| bool initialize(); | |
| // Methods from OutputThreadInterface | |
| Status importBuffer(int32_t streamId, uint64_t bufId, buffer_handle_t buf, | |
| /*out*/ buffer_handle_t** outBufPtr) override; | |
| Status processCaptureResult(std::shared_ptr<HalRequest>&) override; | |
| Status processCaptureRequestError(const std::shared_ptr<HalRequest>&, | |
| /*out*/ std::vector<NotifyMsg>* msgs, | |
| /*out*/ std::vector<CaptureResult>* results) override; | |
| ssize_t getJpegBufferSize(int32_t width, int32_t height) const override; | |
| void notifyError(int32_t frameNumber, int32_t streamId, ErrorCode ec) override; | |
| // End of OutputThreadInterface methods | |
| ScopedAStatus setCallback(const std::shared_ptr<ICameraDeviceCallback>& in_cb) override; | |
| ScopedAStatus getCaptureResultMetadataQueue( | |
| MQDescriptor<int8_t, SynchronizedReadWrite>* _aidl_return) override; | |
| ScopedAStatus close() override; | |
| private: | |
| class OutputThread : public ExternalCameraDeviceSession::OutputThread { | |
| 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) | |
| : ExternalCameraDeviceSession::OutputThread(std::move(parent), ct, chars, | |
| std::move(bufReqThread)), | |
| mOfflineReqs(offlineReqs) {} | |
| bool threadLoop() override; | |
| protected: | |
| std::deque<std::shared_ptr<HalRequest>> mOfflineReqs; | |
| }; // OutputThread | |
| status_t fillCaptureResult(common::V1_0::helper::CameraMetadata md, nsecs_t timestamp); | |
| void invokeProcessCaptureResultCallback(std::vector<CaptureResult>& results, bool tryWriteFmq); | |
| void initOutputThread(); | |
| void cleanupBuffersLocked(int32_t id); | |
| // Protect (most of) HIDL interface methods from synchronized-entering | |
| mutable Mutex mInterfaceLock; | |
| mutable Mutex mLock; // Protect all data members except otherwise noted | |
| bool mClosed = false; | |
| const CroppingType mCroppingType; | |
| const common::V1_0::helper::CameraMetadata mChars; | |
| const std::string mCameraId; | |
| const std::string mExifMake; | |
| const std::string mExifModel; | |
| const uint32_t mBlobBufferSize; | |
| std::mutex mAfTriggerLock; // protect mAfTrigger | |
| bool mAfTrigger; | |
| const std::vector<Stream> mOfflineStreams; | |
| std::deque<std::shared_ptr<HalRequest>> mOfflineReqs; | |
| // Protect mCirculatingBuffers, must not lock mLock after acquiring this lock | |
| mutable Mutex mCbsLock; | |
| std::map<int, CirculatingBuffers> mCirculatingBuffers; | |
| static HandleImporter sHandleImporter; | |
| using ResultMetadataQueue = AidlMessageQueue<int8_t, SynchronizedReadWrite>; | |
| std::shared_ptr<ResultMetadataQueue> mResultMetadataQueue; | |
| // Protect against invokeProcessCaptureResultCallback() | |
| Mutex mProcessCaptureResultLock; | |
| std::shared_ptr<ICameraDeviceCallback> mCallback; | |
| std::shared_ptr<ExternalCameraDeviceSession::BufferRequestThread> mBufferRequestThread; | |
| std::shared_ptr<OutputThread> mOutputThread; | |
| }; | |
| } // namespace implementation | |
| } // namespace device | |
| } // namespace camera | |
| } // namespace hardware | |
| } // namespace android | |
| #endif // HARDWARE_INTERFACES_CAMERA_DEVICE_DEFAULT_EXTERNALCAMERAOFFLINESESSION_H_ |