1 /*
2 * Copyright (C) 2019 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 #define LOG_TAG "GCH_HidlCameraDeviceSession"
18 #define ATRACE_TAG ATRACE_TAG_CAMERA
19 //#define LOG_NDEBUG 0
20 #include <log/log.h>
21
22 #include <cutils/properties.h>
23 #include <cutils/trace.h>
24 #include <malloc.h>
25
26 #include "hidl_camera_device_session.h"
27 #include "hidl_profiler.h"
28 #include "hidl_utils.h"
29
30 namespace android {
31 namespace hardware {
32 namespace camera {
33 namespace device {
34 namespace V3_5 {
35 namespace implementation {
36
37 namespace hidl_utils = ::android::hardware::camera::implementation::hidl_utils;
38 namespace hidl_profiler =
39 ::android::hardware::camera::implementation::hidl_profiler;
40
41 using ::android::hardware::camera::device::V3_2::NotifyMsg;
42 using ::android::hardware::camera::device::V3_2::StreamBuffer;
43 using ::android::hardware::camera::device::V3_4::CaptureResult;
44 using ::android::hardware::camera::device::V3_4::HalStreamConfiguration;
45 using ::android::hardware::camera::device::V3_5::BufferRequestStatus;
46 using ::android::hardware::camera::device::V3_5::StreamBufferRet;
47 using ::android::hardware::thermal::V1_0::ThermalStatus;
48 using ::android::hardware::thermal::V1_0::ThermalStatusCode;
49 using ::android::hardware::thermal::V2_0::Temperature;
50 using ::android::hardware::thermal::V2_0::TemperatureType;
51
Create(const sp<V3_2::ICameraDeviceCallback> & callback,std::unique_ptr<google_camera_hal::CameraDeviceSession> device_session)52 std::unique_ptr<HidlCameraDeviceSession> HidlCameraDeviceSession::Create(
53 const sp<V3_2::ICameraDeviceCallback>& callback,
54 std::unique_ptr<google_camera_hal::CameraDeviceSession> device_session) {
55 auto session =
56 std::unique_ptr<HidlCameraDeviceSession>(new HidlCameraDeviceSession());
57 if (session == nullptr) {
58 ALOGE("%s: Cannot create a HidlCameraDeviceSession.", __FUNCTION__);
59 return nullptr;
60 }
61
62 status_t res = session->Initialize(callback, std::move(device_session));
63 if (res != OK) {
64 ALOGE("%s: Initializing HidlCameraDeviceSession failed: %s(%d)",
65 __FUNCTION__, strerror(-res), res);
66 return nullptr;
67 }
68
69 return session;
70 }
71
~HidlCameraDeviceSession()72 HidlCameraDeviceSession::~HidlCameraDeviceSession() {
73 close();
74 // camera's closing, so flush any unused malloc pages
75 mallopt(M_PURGE, 0);
76 }
77
ProcessCaptureResult(std::unique_ptr<google_camera_hal::CaptureResult> hal_result)78 void HidlCameraDeviceSession::ProcessCaptureResult(
79 std::unique_ptr<google_camera_hal::CaptureResult> hal_result) {
80 std::shared_lock lock(hidl_device_callback_lock_);
81 if (hidl_device_callback_ == nullptr) {
82 ALOGE("%s: hidl_device_callback_ is nullptr", __FUNCTION__);
83 return;
84 }
85
86 {
87 std::lock_guard<std::mutex> pending_lock(pending_first_frame_buffers_mutex_);
88 if (!hal_result->output_buffers.empty() &&
89 num_pending_first_frame_buffers_ > 0) {
90 num_pending_first_frame_buffers_ -= hal_result->output_buffers.size();
91 if (num_pending_first_frame_buffers_ == 0) {
92 hidl_profiler::OnFirstFrameResult();
93 }
94 }
95 }
96
97 hidl_vec<CaptureResult> hidl_results(1);
98 status_t res = hidl_utils::ConvertToHidlCaptureResult(
99 result_metadata_queue_.get(), std::move(hal_result), &hidl_results[0]);
100 if (res != OK) {
101 ALOGE("%s: Converting to HIDL result failed: %s(%d)", __FUNCTION__,
102 strerror(-res), res);
103 return;
104 }
105
106 auto hidl_res = hidl_device_callback_->processCaptureResult_3_4(hidl_results);
107 if (!hidl_res.isOk()) {
108 ALOGE("%s: processCaptureResult transaction failed: %s.", __FUNCTION__,
109 hidl_res.description().c_str());
110 return;
111 }
112 }
113
NotifyHalMessage(const google_camera_hal::NotifyMessage & hal_message)114 void HidlCameraDeviceSession::NotifyHalMessage(
115 const google_camera_hal::NotifyMessage& hal_message) {
116 std::shared_lock lock(hidl_device_callback_lock_);
117 if (hidl_device_callback_ == nullptr) {
118 ALOGE("%s: hidl_device_callback_ is nullptr", __FUNCTION__);
119 return;
120 }
121
122 hidl_vec<NotifyMsg> hidl_messages(1);
123 status_t res =
124 hidl_utils::ConverToHidlNotifyMessage(hal_message, &hidl_messages[0]);
125 if (res != OK) {
126 ALOGE("%s: Converting to HIDL message failed: %s(%d)", __FUNCTION__,
127 strerror(-res), res);
128 return;
129 }
130
131 auto hidl_res = hidl_device_callback_->notify(hidl_messages);
132 if (!hidl_res.isOk()) {
133 ALOGE("%s: notify transaction failed: %s.", __FUNCTION__,
134 hidl_res.description().c_str());
135 return;
136 }
137 }
138
139 google_camera_hal::BufferRequestStatus
RequestStreamBuffers(const std::vector<google_camera_hal::BufferRequest> & hal_buffer_requests,std::vector<google_camera_hal::BufferReturn> * hal_buffer_returns)140 HidlCameraDeviceSession::RequestStreamBuffers(
141 const std::vector<google_camera_hal::BufferRequest>& hal_buffer_requests,
142 std::vector<google_camera_hal::BufferReturn>* hal_buffer_returns) {
143 std::shared_lock lock(hidl_device_callback_lock_);
144 if (hidl_device_callback_ == nullptr) {
145 ALOGE("%s: hidl_device_callback_ is nullptr", __FUNCTION__);
146 return google_camera_hal::BufferRequestStatus::kFailedUnknown;
147 }
148
149 if (hal_buffer_returns == nullptr) {
150 ALOGE("%s: hal_buffer_returns is nullptr", __FUNCTION__);
151 return google_camera_hal::BufferRequestStatus::kFailedUnknown;
152 }
153
154 hidl_vec<BufferRequest> hidl_buffer_requests;
155 status_t res = hidl_utils::ConvertToHidlBufferRequest(hal_buffer_requests,
156 &hidl_buffer_requests);
157 if (res != OK) {
158 ALOGE("%s: Converting to Hidl buffer request failed: %s(%d)", __FUNCTION__,
159 strerror(-res), res);
160 return google_camera_hal::BufferRequestStatus::kFailedUnknown;
161 }
162
163 BufferRequestStatus hidl_status;
164 hidl_vec<StreamBufferRet> stream_buffer_returns;
165 auto cb_status = hidl_device_callback_->requestStreamBuffers(
166 hidl_buffer_requests, [&hidl_status, &stream_buffer_returns](
167 BufferRequestStatus status_ret,
168 const hidl_vec<StreamBufferRet>& buffer_ret) {
169 hidl_status = status_ret;
170 stream_buffer_returns = std::move(buffer_ret);
171 });
172 if (!cb_status.isOk()) {
173 ALOGE("%s: Transaction request stream buffers error: %s", __FUNCTION__,
174 cb_status.description().c_str());
175 return google_camera_hal::BufferRequestStatus::kFailedUnknown;
176 }
177
178 google_camera_hal::BufferRequestStatus hal_buffer_request_status;
179 res = hidl_utils::ConvertToHalBufferRequestStatus(hidl_status,
180 &hal_buffer_request_status);
181 if (res != OK) {
182 ALOGE("%s: Converting to Hal buffer request status failed: %s(%d)",
183 __FUNCTION__, strerror(-res), res);
184 return google_camera_hal::BufferRequestStatus::kFailedUnknown;
185 }
186
187 hal_buffer_returns->clear();
188 // Converting HIDL stream buffer returns to HAL stream buffer returns.
189 for (auto& stream_buffer_return : stream_buffer_returns) {
190 google_camera_hal::BufferReturn hal_buffer_return;
191 res = hidl_utils::ConvertToHalBufferReturnStatus(stream_buffer_return,
192 &hal_buffer_return);
193 if (res != OK) {
194 ALOGE("%s: Converting to Hal buffer return status failed: %s(%d)",
195 __FUNCTION__, strerror(-res), res);
196 return google_camera_hal::BufferRequestStatus::kFailedUnknown;
197 }
198
199 if (stream_buffer_return.val.getDiscriminator() ==
200 StreamBuffersVal::hidl_discriminator::buffers) {
201 const hidl_vec<StreamBuffer>& hidl_buffers =
202 stream_buffer_return.val.buffers();
203 for (auto& hidl_buffer : hidl_buffers) {
204 google_camera_hal::StreamBuffer hal_buffer = {};
205 hidl_utils::ConvertToHalStreamBuffer(hidl_buffer, &hal_buffer);
206 if (res != OK) {
207 ALOGE("%s: Converting to Hal stream buffer failed: %s(%d)",
208 __FUNCTION__, strerror(-res), res);
209 return google_camera_hal::BufferRequestStatus::kFailedUnknown;
210 }
211
212 if (hidl_buffer.acquireFence.getNativeHandle() != nullptr) {
213 hal_buffer.acquire_fence =
214 native_handle_clone(hidl_buffer.acquireFence.getNativeHandle());
215 if (hal_buffer.acquire_fence == nullptr) {
216 ALOGE("%s: Cloning Hal stream buffer acquire fence failed",
217 __FUNCTION__);
218 }
219 }
220
221 hal_buffer.release_fence = nullptr;
222 // If buffer handle is not null, we need to import buffer handle and
223 // return to the caller.
224 if (hidl_buffer.buffer.getNativeHandle() != nullptr) {
225 if (buffer_mapper_v4_ != nullptr) {
226 hal_buffer.buffer = ImportBufferHandle<
227 android::hardware::graphics::mapper::V4_0::IMapper,
228 android::hardware::graphics::mapper::V4_0::Error>(
229 buffer_mapper_v4_, hidl_buffer.buffer);
230 } else if (buffer_mapper_v3_ != nullptr) {
231 hal_buffer.buffer = ImportBufferHandle<
232 android::hardware::graphics::mapper::V3_0::IMapper,
233 android::hardware::graphics::mapper::V3_0::Error>(
234 buffer_mapper_v3_, hidl_buffer.buffer);
235 } else {
236 hal_buffer.buffer = ImportBufferHandle<
237 android::hardware::graphics::mapper::V2_0::IMapper,
238 android::hardware::graphics::mapper::V2_0::Error>(
239 buffer_mapper_v2_, hidl_buffer.buffer);
240 }
241 }
242
243 hal_buffer_return.val.buffers.push_back(hal_buffer);
244 }
245 }
246
247 hal_buffer_returns->push_back(hal_buffer_return);
248 }
249
250 return hal_buffer_request_status;
251 }
252
253 template <class T, class U>
ImportBufferHandle(const sp<T> buffer_mapper_,const hidl_handle & buffer_hidl_handle)254 buffer_handle_t HidlCameraDeviceSession::ImportBufferHandle(
255 const sp<T> buffer_mapper_, const hidl_handle& buffer_hidl_handle) {
256 U mapper_error;
257 buffer_handle_t imported_buffer_handle;
258
259 auto hidl_res = buffer_mapper_->importBuffer(
260 buffer_hidl_handle, [&](const auto& error, const auto& buffer_handle) {
261 mapper_error = error;
262 imported_buffer_handle = static_cast<buffer_handle_t>(buffer_handle);
263 });
264 if (!hidl_res.isOk() || mapper_error != U::NONE) {
265 ALOGE("%s: Importing buffer failed: %s, mapper error %u", __FUNCTION__,
266 hidl_res.description().c_str(), mapper_error);
267 return nullptr;
268 }
269
270 return imported_buffer_handle;
271 }
272
ReturnStreamBuffers(const std::vector<google_camera_hal::StreamBuffer> & return_hal_buffers)273 void HidlCameraDeviceSession::ReturnStreamBuffers(
274 const std::vector<google_camera_hal::StreamBuffer>& return_hal_buffers) {
275 std::shared_lock lock(hidl_device_callback_lock_);
276 if (hidl_device_callback_ == nullptr) {
277 ALOGE("%s: hidl_device_callback_ is nullptr", __FUNCTION__);
278 return;
279 }
280
281 status_t res = OK;
282 hidl_vec<StreamBuffer> hidl_return_buffers;
283 hidl_return_buffers.resize(return_hal_buffers.size());
284 for (uint32_t i = 0; i < return_hal_buffers.size(); i++) {
285 res = hidl_utils::ConvertToHidlStreamBuffer(return_hal_buffers[i],
286 &hidl_return_buffers[i]);
287 if (res != OK) {
288 ALOGE("%s: Converting to Hidl stream buffer failed: %s(%d)", __FUNCTION__,
289 strerror(-res), res);
290 return;
291 }
292 }
293
294 hidl_device_callback_->returnStreamBuffers(hidl_return_buffers);
295 }
296
InitializeBufferMapper()297 status_t HidlCameraDeviceSession::InitializeBufferMapper() {
298 buffer_mapper_v4_ =
299 android::hardware::graphics::mapper::V4_0::IMapper::getService();
300 if (buffer_mapper_v4_ != nullptr) {
301 return OK;
302 }
303
304 buffer_mapper_v3_ =
305 android::hardware::graphics::mapper::V3_0::IMapper::getService();
306 if (buffer_mapper_v3_ != nullptr) {
307 return OK;
308 }
309
310 buffer_mapper_v2_ =
311 android::hardware::graphics::mapper::V2_0::IMapper::getService();
312 if (buffer_mapper_v2_ != nullptr) {
313 return OK;
314 }
315
316 ALOGE("%s: Getting buffer mapper failed.", __FUNCTION__);
317 return UNKNOWN_ERROR;
318 }
319
Initialize(const sp<V3_2::ICameraDeviceCallback> & callback,std::unique_ptr<google_camera_hal::CameraDeviceSession> device_session)320 status_t HidlCameraDeviceSession::Initialize(
321 const sp<V3_2::ICameraDeviceCallback>& callback,
322 std::unique_ptr<google_camera_hal::CameraDeviceSession> device_session) {
323 if (device_session == nullptr) {
324 ALOGE("%s: device_session is nullptr.", __FUNCTION__);
325 return BAD_VALUE;
326 }
327
328 status_t res = CreateMetadataQueue(&request_metadata_queue_,
329 kRequestMetadataQueueSizeBytes,
330 "ro.vendor.camera.req.fmq.size");
331 if (res != OK) {
332 ALOGE("%s: Creating request metadata queue failed: %s(%d)", __FUNCTION__,
333 strerror(-res), res);
334 return res;
335 }
336
337 res = CreateMetadataQueue(&result_metadata_queue_,
338 kResultMetadataQueueSizeBytes,
339 "ro.vendor.camera.res.fmq.size");
340 if (res != OK) {
341 ALOGE("%s: Creating result metadata queue failed: %s(%d)", __FUNCTION__,
342 strerror(-res), res);
343 return res;
344 }
345
346 // Cast V3.2 callback to V3.5
347 auto cast_res = ICameraDeviceCallback::castFrom(callback);
348 if (!cast_res.isOk()) {
349 ALOGE("%s: Cannot convert to V3.5 device callback.", __FUNCTION__);
350 return UNKNOWN_ERROR;
351 }
352
353 // Initialize buffer mapper
354 res = InitializeBufferMapper();
355 if (res != OK) {
356 ALOGE("%s: Initialize buffer mapper failed: %s(%d)", __FUNCTION__,
357 strerror(-res), res);
358 return res;
359 }
360
361 thermal_ = android::hardware::thermal::V2_0::IThermal::getService();
362 if (thermal_ == nullptr) {
363 ALOGE("%s: Getting thermal failed.", __FUNCTION__);
364 // Continue without getting thermal information.
365 }
366
367 hidl_device_callback_ = cast_res;
368 device_session_ = std::move(device_session);
369
370 SetSessionCallbacks();
371 return OK;
372 }
373
SetSessionCallbacks()374 void HidlCameraDeviceSession::SetSessionCallbacks() {
375 google_camera_hal::CameraDeviceSessionCallback session_callback = {
376 .process_capture_result = google_camera_hal::ProcessCaptureResultFunc(
377 [this](std::unique_ptr<google_camera_hal::CaptureResult> result) {
378 ProcessCaptureResult(std::move(result));
379 }),
380 .notify = google_camera_hal::NotifyFunc(
381 [this](const google_camera_hal::NotifyMessage& message) {
382 NotifyHalMessage(message);
383 }),
384 .request_stream_buffers = google_camera_hal::RequestStreamBuffersFunc(
385 [this](
386 const std::vector<google_camera_hal::BufferRequest>&
387 hal_buffer_requests,
388 std::vector<google_camera_hal::BufferReturn>* hal_buffer_returns) {
389 return RequestStreamBuffers(hal_buffer_requests, hal_buffer_returns);
390 }),
391 .return_stream_buffers = google_camera_hal::ReturnStreamBuffersFunc(
392 [this](const std::vector<google_camera_hal::StreamBuffer>&
393 return_hal_buffers) {
394 ReturnStreamBuffers(return_hal_buffers);
395 }),
396 };
397
398 google_camera_hal::ThermalCallback thermal_callback = {
399 .register_thermal_changed_callback =
400 google_camera_hal::RegisterThermalChangedCallbackFunc(
401 [this](google_camera_hal::NotifyThrottlingFunc notify_throttling,
402 bool filter_type, google_camera_hal::TemperatureType type) {
403 return RegisterThermalChangedCallback(notify_throttling,
404 filter_type, type);
405 }),
406 .unregister_thermal_changed_callback =
407 google_camera_hal::UnregisterThermalChangedCallbackFunc(
408 [this]() { UnregisterThermalChangedCallback(); }),
409 };
410
411 device_session_->SetSessionCallback(session_callback, thermal_callback);
412 }
413
RegisterThermalChangedCallback(google_camera_hal::NotifyThrottlingFunc notify_throttling,bool filter_type,google_camera_hal::TemperatureType type)414 status_t HidlCameraDeviceSession::RegisterThermalChangedCallback(
415 google_camera_hal::NotifyThrottlingFunc notify_throttling, bool filter_type,
416 google_camera_hal::TemperatureType type) {
417 std::lock_guard<std::mutex> lock(hidl_thermal_mutex_);
418 if (thermal_ == nullptr) {
419 ALOGE("%s: thermal was not initialized.", __FUNCTION__);
420 return NO_INIT;
421 }
422
423 if (thermal_changed_callback_ != nullptr) {
424 ALOGE("%s: thermal changed callback is already registered.", __FUNCTION__);
425 return ALREADY_EXISTS;
426 }
427
428 TemperatureType hidl_type;
429 status_t res =
430 hidl_thermal_utils::ConvertToHidlTemperatureType(type, &hidl_type);
431 if (res != OK) {
432 ALOGE("%s: Converting to HIDL type failed: %s(%d)", __FUNCTION__,
433 strerror(-res), res);
434 return res;
435 }
436
437 std::unique_ptr<hidl_thermal_utils::HidlThermalChangedCallback> callback =
438 hidl_thermal_utils::HidlThermalChangedCallback::Create(notify_throttling);
439 thermal_changed_callback_ = callback.release();
440 ThermalStatus thermal_status;
441 auto hidl_res = thermal_->registerThermalChangedCallback(
442 thermal_changed_callback_, filter_type, hidl_type,
443 [&](ThermalStatus status) { thermal_status = status; });
444 if (!hidl_res.isOk() || thermal_status.code != ThermalStatusCode::SUCCESS) {
445 thermal_changed_callback_ = nullptr;
446 return UNKNOWN_ERROR;
447 }
448
449 return OK;
450 }
451
UnregisterThermalChangedCallback()452 void HidlCameraDeviceSession::UnregisterThermalChangedCallback() {
453 std::lock_guard<std::mutex> lock(hidl_thermal_mutex_);
454 if (thermal_changed_callback_ == nullptr) {
455 // no-op if no thermal changed callback is registered.
456 return;
457 }
458
459 if (thermal_ == nullptr) {
460 ALOGE("%s: thermal was not initialized.", __FUNCTION__);
461 return;
462 }
463
464 ThermalStatus thermal_status;
465 auto hidl_res = thermal_->unregisterThermalChangedCallback(
466 thermal_changed_callback_,
467 [&](ThermalStatus status) { thermal_status = status; });
468 if (!hidl_res.isOk() || thermal_status.code != ThermalStatusCode::SUCCESS) {
469 ALOGW("%s: Unregstering thermal callback failed: %s", __FUNCTION__,
470 thermal_status.debugMessage.c_str());
471 }
472
473 thermal_changed_callback_ = nullptr;
474 }
475
CreateMetadataQueue(std::unique_ptr<MetadataQueue> * metadata_queue,uint32_t default_size_bytes,const char * override_size_property)476 status_t HidlCameraDeviceSession::CreateMetadataQueue(
477 std::unique_ptr<MetadataQueue>* metadata_queue, uint32_t default_size_bytes,
478 const char* override_size_property) {
479 if (metadata_queue == nullptr) {
480 ALOGE("%s: metadata_queue is nullptr", __FUNCTION__);
481 return BAD_VALUE;
482 }
483
484 int32_t size = default_size_bytes;
485 if (override_size_property != nullptr) {
486 // Try to read the override size from the system property.
487 size = property_get_int32(override_size_property, default_size_bytes);
488 ALOGV("%s: request metadata queue size overridden to %d", __FUNCTION__,
489 size);
490 }
491
492 *metadata_queue = std::make_unique<MetadataQueue>(
493 static_cast<size_t>(size), /*configureEventFlagWord=*/false);
494 if (!(*metadata_queue)->isValid()) {
495 ALOGE("%s: Creating metadata queue (size %d) failed.", __FUNCTION__, size);
496 return NO_INIT;
497 }
498
499 return OK;
500 }
501
constructDefaultRequestSettings(RequestTemplate type,ICameraDeviceSession::constructDefaultRequestSettings_cb _hidl_cb)502 Return<void> HidlCameraDeviceSession::constructDefaultRequestSettings(
503 RequestTemplate type,
504 ICameraDeviceSession::constructDefaultRequestSettings_cb _hidl_cb) {
505 V3_2::CameraMetadata hidl_metadata;
506
507 if (device_session_ == nullptr) {
508 _hidl_cb(Status::INTERNAL_ERROR, hidl_metadata);
509 return Void();
510 }
511
512 google_camera_hal::RequestTemplate hal_type;
513 status_t res = hidl_utils::ConvertToHalTemplateType(type, &hal_type);
514 if (res != OK) {
515 _hidl_cb(Status::ILLEGAL_ARGUMENT, hidl_metadata);
516 return Void();
517 }
518
519 std::unique_ptr<google_camera_hal::HalCameraMetadata> settings = nullptr;
520 res = device_session_->ConstructDefaultRequestSettings(hal_type, &settings);
521 if (res != OK) {
522 _hidl_cb(hidl_utils::ConvertToHidlStatus(res), hidl_metadata);
523 return Void();
524 }
525
526 uint32_t metadata_size = settings->GetCameraMetadataSize();
527 hidl_metadata.setToExternal((uint8_t*)settings->ReleaseCameraMetadata(),
528 metadata_size, /*shouldOwn=*/true);
529 _hidl_cb(Status::OK, hidl_metadata);
530
531 return Void();
532 }
533
configureStreams_3_5(const StreamConfiguration & requestedConfiguration,ICameraDeviceSession::configureStreams_3_5_cb _hidl_cb)534 Return<void> HidlCameraDeviceSession::configureStreams_3_5(
535 const StreamConfiguration& requestedConfiguration,
536 ICameraDeviceSession::configureStreams_3_5_cb _hidl_cb) {
537 HalStreamConfiguration hidl_hal_configs;
538 if (device_session_ == nullptr) {
539 _hidl_cb(Status::ILLEGAL_ARGUMENT, hidl_hal_configs);
540 return Void();
541 }
542
543 auto profiler_item = hidl_profiler::OnCameraStreamConfigure();
544 first_frame_requested_ = false;
545 num_pending_first_frame_buffers_ = 0;
546
547 google_camera_hal::StreamConfiguration hal_stream_config;
548 status_t res = hidl_utils::ConverToHalStreamConfig(requestedConfiguration,
549 &hal_stream_config);
550 if (res != OK) {
551 _hidl_cb(Status::ILLEGAL_ARGUMENT, hidl_hal_configs);
552 return Void();
553 }
554
555 std::vector<google_camera_hal::HalStream> hal_configured_streams;
556 res = device_session_->ConfigureStreams(hal_stream_config,
557 &hal_configured_streams);
558 if (res != OK) {
559 ALOGE("%s: Configuring streams failed: %s(%d)", __FUNCTION__,
560 strerror(-res), res);
561 _hidl_cb(hidl_utils::ConvertToHidlStatus(res), hidl_hal_configs);
562 return Void();
563 }
564
565 res = hidl_utils::ConvertToHidlHalStreamConfig(hal_configured_streams,
566 &hidl_hal_configs);
567 _hidl_cb(hidl_utils::ConvertToHidlStatus(res), hidl_hal_configs);
568
569 return Void();
570 }
571
getCaptureRequestMetadataQueue(ICameraDeviceSession::getCaptureRequestMetadataQueue_cb _hidl_cb)572 Return<void> HidlCameraDeviceSession::getCaptureRequestMetadataQueue(
573 ICameraDeviceSession::getCaptureRequestMetadataQueue_cb _hidl_cb) {
574 _hidl_cb(*request_metadata_queue_->getDesc());
575 return Void();
576 }
577
getCaptureResultMetadataQueue(ICameraDeviceSession::getCaptureResultMetadataQueue_cb _hidl_cb)578 Return<void> HidlCameraDeviceSession::getCaptureResultMetadataQueue(
579 ICameraDeviceSession::getCaptureResultMetadataQueue_cb _hidl_cb) {
580 _hidl_cb(*result_metadata_queue_->getDesc());
581 return Void();
582 }
583
processCaptureRequest_3_4(const hidl_vec<CaptureRequest> & requests,const hidl_vec<BufferCache> & cachesToRemove,processCaptureRequest_3_4_cb _hidl_cb)584 Return<void> HidlCameraDeviceSession::processCaptureRequest_3_4(
585 const hidl_vec<CaptureRequest>& requests,
586 const hidl_vec<BufferCache>& cachesToRemove,
587 processCaptureRequest_3_4_cb _hidl_cb) {
588 if (device_session_ == nullptr) {
589 _hidl_cb(Status::ILLEGAL_ARGUMENT, 0);
590 return Void();
591 }
592
593 if (!first_frame_requested_) {
594 first_frame_requested_ = true;
595 num_pending_first_frame_buffers_ = requests[0].v3_2.outputBuffers.size();
596 hidl_profiler::OnFirstFrameRequest();
597 }
598
599 std::vector<google_camera_hal::BufferCache> hal_buffer_caches;
600
601 status_t res =
602 hidl_utils::ConvertToHalBufferCaches(cachesToRemove, &hal_buffer_caches);
603 if (res != OK) {
604 _hidl_cb(Status::ILLEGAL_ARGUMENT, 0);
605 return Void();
606 }
607
608 device_session_->RemoveBufferCache(hal_buffer_caches);
609
610 // Converting HIDL requests to HAL requests.
611 std::vector<google_camera_hal::CaptureRequest> hal_requests;
612 for (auto& request : requests) {
613 google_camera_hal::CaptureRequest hal_request = {};
614 res = hidl_utils::ConvertToHalCaptureRequest(
615 request, request_metadata_queue_.get(), &hal_request);
616 if (res != OK) {
617 ALOGE("%s: Converting to HAL capture request failed: %s(%d)",
618 __FUNCTION__, strerror(-res), res);
619 _hidl_cb(hidl_utils::ConvertToHidlStatus(res), 0);
620 return Void();
621 }
622
623 hal_requests.push_back(std::move(hal_request));
624 }
625
626 uint32_t num_processed_requests = 0;
627 res = device_session_->ProcessCaptureRequest(hal_requests,
628 &num_processed_requests);
629 if (res != OK) {
630 ALOGE(
631 "%s: Processing capture request failed: %s(%d). Only processed %u"
632 " out of %zu.",
633 __FUNCTION__, strerror(-res), res, num_processed_requests,
634 hal_requests.size());
635 }
636
637 _hidl_cb(hidl_utils::ConvertToHidlStatus(res), num_processed_requests);
638 return Void();
639 }
640
signalStreamFlush(const hidl_vec<int32_t> &,uint32_t)641 Return<void> HidlCameraDeviceSession::signalStreamFlush(
642 const hidl_vec<int32_t>& /*streamIds*/, uint32_t /*streamConfigCounter*/) {
643 // TODO(b/143902312): Implement this.
644 return Void();
645 }
646
flush()647 Return<Status> HidlCameraDeviceSession::flush() {
648 if (device_session_ == nullptr) {
649 return Status::INTERNAL_ERROR;
650 }
651
652 auto profiler_item = hidl_profiler::OnCameraFlush();
653
654 status_t res = device_session_->Flush();
655 if (res != OK) {
656 ALOGE("%s: Flushing device failed: %s(%d).", __FUNCTION__, strerror(-res),
657 res);
658 return Status::INTERNAL_ERROR;
659 }
660
661 return Status::OK;
662 }
663
close()664 Return<void> HidlCameraDeviceSession::close() {
665 if (device_session_ != nullptr) {
666 auto profiler_item = hidl_profiler::OnCameraClose();
667 device_session_ = nullptr;
668 }
669 return Void();
670 }
671
isReconfigurationRequired(const V3_2::CameraMetadata & oldSessionParams,const V3_2::CameraMetadata & newSessionParams,ICameraDeviceSession::isReconfigurationRequired_cb _hidl_cb)672 Return<void> HidlCameraDeviceSession::isReconfigurationRequired(
673 const V3_2::CameraMetadata& oldSessionParams,
674 const V3_2::CameraMetadata& newSessionParams,
675 ICameraDeviceSession::isReconfigurationRequired_cb _hidl_cb) {
676 std::unique_ptr<google_camera_hal::HalCameraMetadata> old_hal_session_metadata;
677 status_t res = hidl_utils::ConvertToHalMetadata(0, nullptr, oldSessionParams,
678 &old_hal_session_metadata);
679 if (res != OK) {
680 ALOGE("%s: Converting to old session metadata failed: %s(%d)", __FUNCTION__,
681 strerror(-res), res);
682 _hidl_cb(Status::INTERNAL_ERROR, true);
683 return Void();
684 }
685
686 std::unique_ptr<google_camera_hal::HalCameraMetadata> new_hal_session_metadata;
687 res = hidl_utils::ConvertToHalMetadata(0, nullptr, newSessionParams,
688 &new_hal_session_metadata);
689 if (res != OK) {
690 ALOGE("%s: Converting to new session metadata failed: %s(%d)", __FUNCTION__,
691 strerror(-res), res);
692 _hidl_cb(Status::INTERNAL_ERROR, true);
693 return Void();
694 }
695
696 bool reconfiguration_required = true;
697 res = device_session_->IsReconfigurationRequired(
698 old_hal_session_metadata.get(), new_hal_session_metadata.get(),
699 &reconfiguration_required);
700
701 if (res != OK) {
702 ALOGE("%s: IsReconfigurationRequired failed: %s(%d)", __FUNCTION__,
703 strerror(-res), res);
704 _hidl_cb(Status::INTERNAL_ERROR, true);
705 return Void();
706 }
707
708 _hidl_cb(Status::OK, reconfiguration_required);
709 return Void();
710 }
711
configureStreams(const V3_2::StreamConfiguration &,configureStreams_cb _hidl_cb)712 Return<void> HidlCameraDeviceSession::configureStreams(
713 const V3_2::StreamConfiguration&, configureStreams_cb _hidl_cb) {
714 _hidl_cb(Status::ILLEGAL_ARGUMENT, V3_2::HalStreamConfiguration());
715 return Void();
716 }
configureStreams_3_3(const V3_2::StreamConfiguration &,configureStreams_3_3_cb _hidl_cb)717 Return<void> HidlCameraDeviceSession::configureStreams_3_3(
718 const V3_2::StreamConfiguration&, configureStreams_3_3_cb _hidl_cb) {
719 _hidl_cb(Status::ILLEGAL_ARGUMENT, V3_3::HalStreamConfiguration());
720 return Void();
721 }
configureStreams_3_4(const V3_4::StreamConfiguration &,configureStreams_3_4_cb _hidl_cb)722 Return<void> HidlCameraDeviceSession::configureStreams_3_4(
723 const V3_4::StreamConfiguration&, configureStreams_3_4_cb _hidl_cb) {
724 _hidl_cb(Status::ILLEGAL_ARGUMENT, V3_4::HalStreamConfiguration());
725 return Void();
726 }
processCaptureRequest(const hidl_vec<V3_2::CaptureRequest> & requests,const hidl_vec<BufferCache> & cachesToRemove,processCaptureRequest_cb _hidl_cb)727 Return<void> HidlCameraDeviceSession::processCaptureRequest(
728 const hidl_vec<V3_2::CaptureRequest>& requests,
729 const hidl_vec<BufferCache>& cachesToRemove,
730 processCaptureRequest_cb _hidl_cb) {
731 hidl_vec<CaptureRequest> requests_3_4;
732 requests_3_4.resize(requests.size());
733 for (uint32_t i = 0; i < requests_3_4.size(); i++) {
734 requests_3_4[i].v3_2 = requests[i];
735 }
736
737 return processCaptureRequest_3_4(requests_3_4, cachesToRemove, _hidl_cb);
738 }
739
740 } // namespace implementation
741 } // namespace V3_5
742 } // namespace device
743 } // namespace camera
744 } // namespace hardware
745 } // namespace android
746