• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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