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 ANDROID_SERVERS_AIDL_CAMERA3OFFLINESESSION_H 18 #define ANDROID_SERVERS_AIDL_CAMERA3OFFLINESESSION_H 19 20 #include <memory> 21 #include <mutex> 22 23 #include <utils/String8.h> 24 #include <utils/String16.h> 25 26 #include "AidlCamera3OutputUtils.h" 27 #include <aidl/android/hardware/camera/device/BnCameraDeviceCallback.h> 28 #include <aidl/android/hardware/camera/device/ICameraOfflineSession.h> 29 30 #include <fmq/AidlMessageQueue.h> 31 32 #include "common/CameraOfflineSessionBase.h" 33 34 #include "device3/Camera3BufferManager.h" 35 #include "device3/Camera3OfflineSession.h" 36 #include "utils/TagMonitor.h" 37 #include <camera_metadata_hidden.h> 38 39 namespace android { 40 41 namespace camera3 { 42 43 class Camera3Stream; 44 class Camera3OutputStreamInterface; 45 class Camera3StreamInterface; 46 47 } // namespace camera3 48 49 /** 50 * AidlCamera3OfflineSession for offline session defined in AIDL ICameraOfflineSession 51 */ 52 class AidlCamera3OfflineSession : 53 public Camera3OfflineSession { 54 public: 55 56 virtual ~AidlCamera3OfflineSession(); 57 58 virtual status_t initialize(wp<NotificationListener> listener) override; 59 60 /** 61 * Implementation of aidl::android::hardware::camera::device::ICameraDeviceCallback 62 */ 63 ::ndk::ScopedAStatus processCaptureResult( 64 const std::vector<aidl::android::hardware::camera::device::CaptureResult>& results); 65 ::ndk::ScopedAStatus notify( 66 const std::vector<aidl::android::hardware::camera::device::NotifyMsg>& msgs); 67 ::ndk::ScopedAStatus requestStreamBuffers( 68 const std::vector<aidl::android::hardware::camera::device::BufferRequest>& bufReqs, 69 std::vector<aidl::android::hardware::camera::device::StreamBufferRet>* outBuffers, 70 aidl::android::hardware::camera::device::BufferRequestStatus* status); 71 72 ::ndk::ScopedAStatus returnStreamBuffers( 73 const std::vector<aidl::android::hardware::camera::device::StreamBuffer>& buffers); 74 75 // See explanation for why we need a separate class for this in 76 // AidlCamera3Device::AidlCameraDeviceCallbacks in AidlCamera3Device.h 77 class AidlCameraDeviceCallbacks : 78 public aidl::android::hardware::camera::device::BnCameraDeviceCallback { 79 public: 80 AidlCameraDeviceCallbacks(wp<AidlCamera3OfflineSession> parent)81 AidlCameraDeviceCallbacks(wp<AidlCamera3OfflineSession> parent) : mParent(parent) { } ~AidlCameraDeviceCallbacks()82 ~AidlCameraDeviceCallbacks() {} 83 ::ndk::ScopedAStatus processCaptureResult( 84 const std::vector< 85 aidl::android::hardware::camera::device::CaptureResult>& results) override; 86 ::ndk::ScopedAStatus notify( 87 const std::vector< 88 aidl::android::hardware::camera::device::NotifyMsg>& msgs) override; 89 90 ::ndk::ScopedAStatus requestStreamBuffers( 91 const std::vector< 92 aidl::android::hardware::camera::device::BufferRequest>& bufReqs, 93 std::vector<aidl::android::hardware::camera::device::StreamBufferRet>* out_buffers, 94 aidl::android::hardware::camera::device::BufferRequestStatus* _aidl_return 95 ) override; 96 97 ::ndk::ScopedAStatus returnStreamBuffers( 98 const std::vector< 99 aidl::android::hardware::camera::device::StreamBuffer>& buffers) override; 100 protected: 101 102 ::ndk::SpAIBinder createBinder() override; 103 104 private: 105 wp<AidlCamera3OfflineSession> mParent = nullptr; 106 }; 107 108 // initialize by Camera3Device. AidlCamera3OfflineSession(const String8 & id,const sp<camera3::Camera3Stream> & inputStream,const camera3::StreamSet & offlineStreamSet,camera3::BufferRecords && bufferRecords,const camera3::InFlightRequestMap & offlineReqs,const Camera3OfflineStates & offlineStates,std::shared_ptr<aidl::android::hardware::camera::device::ICameraOfflineSession> offlineSession)109 explicit AidlCamera3OfflineSession(const String8& id, 110 const sp<camera3::Camera3Stream>& inputStream, 111 const camera3::StreamSet& offlineStreamSet, 112 camera3::BufferRecords&& bufferRecords, 113 const camera3::InFlightRequestMap& offlineReqs, 114 const Camera3OfflineStates& offlineStates, 115 std::shared_ptr<aidl::android::hardware::camera::device::ICameraOfflineSession> 116 offlineSession) : 117 Camera3OfflineSession(id, inputStream, offlineStreamSet, std::move(bufferRecords), 118 offlineReqs, offlineStates), 119 mSession(offlineSession) { 120 mCallbacks = ndk::SharedRefBase::make<AidlCameraDeviceCallbacks>(this); 121 }; 122 123 /** 124 * End of CameraOfflineSessionBase interface 125 */ 126 127 private: 128 std::shared_ptr<aidl::android::hardware::camera::device::ICameraOfflineSession> mSession; 129 // FMQ to write result on. Must be guarded by mProcessCaptureResultLock. 130 std::unique_ptr<AidlResultMetadataQueue> mResultMetadataQueue; 131 132 std::shared_ptr<AidlCameraDeviceCallbacks> mCallbacks; 133 134 virtual void disconnectSession() override; 135 136 }; // class AidlCamera3OfflineSession 137 138 }; // namespace android 139 140 #endif 141