1 /* 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_HARDWARE_CAMERA_DEVICE_V3_5_EXTCAMERADEVICESESSION_H 18 #define ANDROID_HARDWARE_CAMERA_DEVICE_V3_5_EXTCAMERADEVICESESSION_H 19 20 #include <android/hardware/camera/device/3.5/ICameraDeviceCallback.h> 21 #include <android/hardware/camera/device/3.5/ICameraDeviceSession.h> 22 #include <../../3.4/default/include/ext_device_v3_4_impl/ExternalCameraDeviceSession.h> 23 24 namespace android { 25 namespace hardware { 26 namespace camera { 27 namespace device { 28 namespace V3_5 { 29 namespace implementation { 30 31 using ::android::hardware::camera::device::V3_2::BufferCache; 32 using ::android::hardware::camera::device::V3_5::BufferRequest; 33 using ::android::hardware::camera::device::V3_5::BufferRequestStatus; 34 using ::android::hardware::camera::device::V3_2::BufferStatus; 35 using ::android::hardware::camera::device::V3_2::CameraMetadata; 36 using ::android::hardware::camera::device::V3_2::CaptureRequest; 37 using ::android::hardware::camera::device::V3_2::CaptureResult; 38 using ::android::hardware::camera::device::V3_2::ErrorCode; 39 using ::android::hardware::camera::device::V3_5::ICameraDeviceCallback; 40 using ::android::hardware::camera::device::V3_2::MsgType; 41 using ::android::hardware::camera::device::V3_2::NotifyMsg; 42 using ::android::hardware::camera::device::V3_2::RequestTemplate; 43 using ::android::hardware::camera::device::V3_2::Stream; 44 using ::android::hardware::camera::device::V3_5::StreamConfiguration; 45 using ::android::hardware::camera::device::V3_2::StreamConfigurationMode; 46 using ::android::hardware::camera::device::V3_2::StreamRotation; 47 using ::android::hardware::camera::device::V3_2::StreamType; 48 using ::android::hardware::camera::device::V3_2::DataspaceFlags; 49 using ::android::hardware::camera::device::V3_2::CameraBlob; 50 using ::android::hardware::camera::device::V3_2::CameraBlobId; 51 using ::android::hardware::camera::device::V3_4::HalStreamConfiguration; 52 using ::android::hardware::camera::device::V3_5::ICameraDeviceSession; 53 using ::android::hardware::camera::common::V1_0::Status; 54 using ::android::hardware::camera::common::V1_0::helper::HandleImporter; 55 using ::android::hardware::camera::common::V1_0::helper::ExifUtils; 56 using ::android::hardware::camera::external::common::ExternalCameraConfig; 57 using ::android::hardware::camera::external::common::Size; 58 using ::android::hardware::camera::external::common::SizeHasher; 59 using ::android::hardware::graphics::common::V1_0::BufferUsage; 60 using ::android::hardware::graphics::common::V1_0::Dataspace; 61 using ::android::hardware::graphics::common::V1_0::PixelFormat; 62 using ::android::hardware::kSynchronizedReadWrite; 63 using ::android::hardware::MessageQueue; 64 using ::android::hardware::MQDescriptorSync; 65 using ::android::hardware::Return; 66 using ::android::hardware::Void; 67 using ::android::hardware::hidl_vec; 68 using ::android::hardware::hidl_string; 69 using ::android::sp; 70 using ::android::Mutex; 71 using ::android::base::unique_fd; 72 73 using ::android::hardware::camera::device::V3_4::implementation::SupportedV4L2Format; 74 using ::android::hardware::camera::device::V3_4::implementation::CroppingType; 75 using ::android::hardware::camera::device::V3_4::implementation::HalStreamBuffer; 76 77 struct ExternalCameraDeviceSession : public V3_4::implementation::ExternalCameraDeviceSession { 78 79 ExternalCameraDeviceSession(const sp<V3_2::ICameraDeviceCallback>&, 80 const ExternalCameraConfig& cfg, 81 const std::vector<SupportedV4L2Format>& sortedFormats, 82 const CroppingType& croppingType, 83 const common::V1_0::helper::CameraMetadata& chars, 84 const std::string& cameraId, 85 unique_fd v4l2Fd); 86 virtual ~ExternalCameraDeviceSession(); 87 88 // Retrieve the HIDL interface, split into its own class to avoid inheritance issues when 89 // dealing with minor version revs and simultaneous implementation and interface inheritance getInterfaceExternalCameraDeviceSession90 virtual sp<V3_4::ICameraDeviceSession> getInterface() override { 91 return new TrampolineSessionInterface_3_5(this); 92 } 93 isStreamCombinationSupportedExternalCameraDeviceSession94 static Status isStreamCombinationSupported(const V3_2::StreamConfiguration& config, 95 const std::vector<SupportedV4L2Format>& supportedFormats, 96 const ExternalCameraConfig& devCfg) { 97 return V3_4::implementation::ExternalCameraDeviceSession::isStreamCombinationSupported( 98 config, supportedFormats, devCfg); 99 } 100 101 class BufferRequestThread : public android::Thread { 102 public: 103 BufferRequestThread( 104 wp<OutputThreadInterface> parent, 105 sp<V3_5::ICameraDeviceCallback> callbacks); 106 107 int requestBufferStart(const std::vector<HalStreamBuffer>&); 108 int waitForBufferRequestDone( 109 /*out*/std::vector<HalStreamBuffer>*); 110 111 virtual bool threadLoop() override; 112 113 private: 114 void waitForNextRequest(); 115 116 const wp<OutputThreadInterface> mParent; 117 const sp<V3_5::ICameraDeviceCallback> mCallbacks; 118 119 std::mutex mLock; 120 bool mRequestingBuffer = false; 121 122 std::vector<HalStreamBuffer> mBufferReqs; 123 std::vector<HalStreamBuffer> mPendingReturnBufferReqs; 124 // mHalBufferReqs is not under mLock protection during the HIDL transaction 125 hidl_vec<BufferRequest> mHalBufferReqs; 126 127 // request buffers takes much less time in steady state, but can take much longer 128 // when requesting 1st buffer from a stream. 129 // TODO: consider a separate timeout for new vs. steady state? 130 // TODO: or make sure framework is warming up the pipeline during configure new stream? 131 static const int kReqProcTimeoutMs = 66; 132 133 static const int kReqWaitTimeoutMs = 33; 134 static const int kReqWaitTimesWarn = 90; // 33ms * 90 ~= 3 sec 135 std::condition_variable mRequestCond; // signaled when a new buffer request incoming 136 std::condition_variable mRequestDoneCond; // signaled when a request is done 137 }; 138 139 class OutputThread : 140 public V3_4::implementation::ExternalCameraDeviceSession::OutputThread { 141 public: 142 // TODO: pass buffer request thread to OutputThread ctor 143 OutputThread(wp<OutputThreadInterface> parent, CroppingType, 144 const common::V1_0::helper::CameraMetadata&, 145 sp<BufferRequestThread> bufReqThread); 146 virtual ~OutputThread(); 147 148 protected: 149 // Methods to request output buffer in parallel 150 virtual int requestBufferStart(const std::vector<HalStreamBuffer>&) override; 151 virtual int waitForBufferRequestDone( 152 /*out*/std::vector<HalStreamBuffer>*) override; 153 154 const sp<BufferRequestThread> mBufferRequestThread; 155 }; 156 157 protected: 158 // Methods from v3.4 and earlier will trampoline to inherited implementation 159 Return<void> configureStreams_3_5( 160 const StreamConfiguration& requestedConfiguration, 161 ICameraDeviceSession::configureStreams_3_5_cb _hidl_cb); 162 163 Return<void> signalStreamFlush( 164 const hidl_vec<int32_t>& requests, 165 uint32_t streamConfigCounter); 166 167 Return<void> isReconfigurationRequired(const V3_2::CameraMetadata& oldSessionParams, 168 const V3_2::CameraMetadata& newSessionParams, 169 ICameraDeviceSession::isReconfigurationRequired_cb _hidl_cb); 170 171 virtual void initOutputThread() override; 172 virtual void closeOutputThread() override; 173 void closeOutputThreadImpl(); 174 175 virtual Status importRequestLocked( 176 const CaptureRequest& request, 177 hidl_vec<buffer_handle_t*>& allBufPtrs, 178 hidl_vec<int>& allFences) override; 179 180 sp<BufferRequestThread> mBufferRequestThread; 181 182 sp<V3_5::ICameraDeviceCallback> mCallback_3_5; 183 bool mSupportBufMgr; 184 185 private: 186 187 struct TrampolineSessionInterface_3_5 : public ICameraDeviceSession { TrampolineSessionInterface_3_5ExternalCameraDeviceSession::TrampolineSessionInterface_3_5188 TrampolineSessionInterface_3_5(sp<ExternalCameraDeviceSession> parent) : 189 mParent(parent) {} 190 constructDefaultRequestSettingsExternalCameraDeviceSession::TrampolineSessionInterface_3_5191 virtual Return<void> constructDefaultRequestSettings( 192 RequestTemplate type, 193 V3_3::ICameraDeviceSession::constructDefaultRequestSettings_cb _hidl_cb) override { 194 return mParent->constructDefaultRequestSettings(type, _hidl_cb); 195 } 196 configureStreamsExternalCameraDeviceSession::TrampolineSessionInterface_3_5197 virtual Return<void> configureStreams( 198 const V3_2::StreamConfiguration& requestedConfiguration, 199 V3_3::ICameraDeviceSession::configureStreams_cb _hidl_cb) override { 200 return mParent->configureStreams(requestedConfiguration, _hidl_cb); 201 } 202 processCaptureRequestExternalCameraDeviceSession::TrampolineSessionInterface_3_5203 virtual Return<void> processCaptureRequest(const hidl_vec<V3_2::CaptureRequest>& requests, 204 const hidl_vec<V3_2::BufferCache>& cachesToRemove, 205 V3_3::ICameraDeviceSession::processCaptureRequest_cb _hidl_cb) override { 206 return mParent->processCaptureRequest(requests, cachesToRemove, _hidl_cb); 207 } 208 getCaptureRequestMetadataQueueExternalCameraDeviceSession::TrampolineSessionInterface_3_5209 virtual Return<void> getCaptureRequestMetadataQueue( 210 V3_3::ICameraDeviceSession::getCaptureRequestMetadataQueue_cb _hidl_cb) override { 211 return mParent->getCaptureRequestMetadataQueue(_hidl_cb); 212 } 213 getCaptureResultMetadataQueueExternalCameraDeviceSession::TrampolineSessionInterface_3_5214 virtual Return<void> getCaptureResultMetadataQueue( 215 V3_3::ICameraDeviceSession::getCaptureResultMetadataQueue_cb _hidl_cb) override { 216 return mParent->getCaptureResultMetadataQueue(_hidl_cb); 217 } 218 flushExternalCameraDeviceSession::TrampolineSessionInterface_3_5219 virtual Return<Status> flush() override { 220 return mParent->flush(); 221 } 222 closeExternalCameraDeviceSession::TrampolineSessionInterface_3_5223 virtual Return<void> close() override { 224 return mParent->close(); 225 } 226 configureStreams_3_3ExternalCameraDeviceSession::TrampolineSessionInterface_3_5227 virtual Return<void> configureStreams_3_3( 228 const V3_2::StreamConfiguration& requestedConfiguration, 229 configureStreams_3_3_cb _hidl_cb) override { 230 return mParent->configureStreams_3_3(requestedConfiguration, _hidl_cb); 231 } 232 configureStreams_3_4ExternalCameraDeviceSession::TrampolineSessionInterface_3_5233 virtual Return<void> configureStreams_3_4( 234 const V3_4::StreamConfiguration& requestedConfiguration, 235 configureStreams_3_4_cb _hidl_cb) override { 236 return mParent->configureStreams_3_4(requestedConfiguration, _hidl_cb); 237 } 238 processCaptureRequest_3_4ExternalCameraDeviceSession::TrampolineSessionInterface_3_5239 virtual Return<void> processCaptureRequest_3_4(const hidl_vec<V3_4::CaptureRequest>& requests, 240 const hidl_vec<V3_2::BufferCache>& cachesToRemove, 241 ICameraDeviceSession::processCaptureRequest_3_4_cb _hidl_cb) override { 242 return mParent->processCaptureRequest_3_4(requests, cachesToRemove, _hidl_cb); 243 } 244 configureStreams_3_5ExternalCameraDeviceSession::TrampolineSessionInterface_3_5245 virtual Return<void> configureStreams_3_5( 246 const StreamConfiguration& requestedConfiguration, 247 configureStreams_3_5_cb _hidl_cb) override { 248 return mParent->configureStreams_3_5(requestedConfiguration, _hidl_cb); 249 } 250 signalStreamFlushExternalCameraDeviceSession::TrampolineSessionInterface_3_5251 virtual Return<void> signalStreamFlush( 252 const hidl_vec<int32_t>& requests, 253 uint32_t streamConfigCounter) override { 254 return mParent->signalStreamFlush(requests, streamConfigCounter); 255 } 256 isReconfigurationRequiredExternalCameraDeviceSession::TrampolineSessionInterface_3_5257 virtual Return<void> isReconfigurationRequired(const V3_2::CameraMetadata& oldSessionParams, 258 const V3_2::CameraMetadata& newSessionParams, 259 ICameraDeviceSession::isReconfigurationRequired_cb _hidl_cb) override { 260 return mParent->isReconfigurationRequired(oldSessionParams, newSessionParams, _hidl_cb); 261 } 262 263 private: 264 sp<ExternalCameraDeviceSession> mParent; 265 }; 266 }; 267 268 } // namespace implementation 269 } // namespace V3_5 270 } // namespace device 271 } // namespace camera 272 } // namespace hardware 273 } // namespace android 274 275 #endif // ANDROID_HARDWARE_CAMERA_DEVICE_V3_5_EXTCAMERADEVICESESSION_H 276