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