• 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 "EmulatedRequestProcessor"
18 #define ATRACE_TAG ATRACE_TAG_CAMERA
19 
20 #include "EmulatedRequestProcessor.h"
21 
22 #include <HandleImporter.h>
23 #include <hardware/gralloc.h>
24 #include <log/log.h>
25 #include <sync/sync.h>
26 #include <utils/Timers.h>
27 #include <utils/Trace.h>
28 
29 #include <memory>
30 
31 #include "GrallocSensorBuffer.h"
32 
33 namespace android {
34 
35 using ::android::frameworks::sensorservice::V1_0::ISensorManager;
36 using ::android::frameworks::sensorservice::V1_0::Result;
37 using android::hardware::camera::common::V1_0::helper::HandleImporter;
38 using ::android::hardware::sensors::V1_0::SensorInfo;
39 using ::android::hardware::sensors::V1_0::SensorType;
40 using google_camera_hal::ErrorCode;
41 using google_camera_hal::HwlPipelineResult;
42 using google_camera_hal::MessageType;
43 using google_camera_hal::NotifyMessage;
44 
EmulatedRequestProcessor(uint32_t camera_id,sp<EmulatedSensor> sensor,const HwlSessionCallback & session_callback)45 EmulatedRequestProcessor::EmulatedRequestProcessor(
46     uint32_t camera_id, sp<EmulatedSensor> sensor,
47     const HwlSessionCallback& session_callback)
48     : camera_id_(camera_id),
49       sensor_(sensor),
50       session_callback_(session_callback),
51       request_state_(std::make_unique<EmulatedLogicalRequestState>(camera_id)) {
52   ATRACE_CALL();
53   request_thread_ = std::thread([this] { this->RequestProcessorLoop(); });
54   importer_ = std::make_shared<HandleImporter>();
55 }
56 
~EmulatedRequestProcessor()57 EmulatedRequestProcessor::~EmulatedRequestProcessor() {
58   ATRACE_CALL();
59   processor_done_ = true;
60   request_thread_.join();
61 
62   auto ret = sensor_->ShutDown();
63   if (ret != OK) {
64     ALOGE("%s: Failed during sensor shutdown %s (%d)", __FUNCTION__,
65           strerror(-ret), ret);
66   }
67 
68   if (sensor_event_queue_.get() != nullptr) {
69     sensor_event_queue_->disableSensor(sensor_handle_);
70     sensor_event_queue_.clear();
71     sensor_event_queue_ = nullptr;
72   }
73 }
74 
ProcessPipelineRequests(uint32_t frame_number,std::vector<HwlPipelineRequest> & requests,const std::vector<EmulatedPipeline> & pipelines,const DynamicStreamIdMapType & dynamic_stream_id_map,bool use_default_physical_camera)75 status_t EmulatedRequestProcessor::ProcessPipelineRequests(
76     uint32_t frame_number, std::vector<HwlPipelineRequest>& requests,
77     const std::vector<EmulatedPipeline>& pipelines,
78     const DynamicStreamIdMapType& dynamic_stream_id_map,
79     bool use_default_physical_camera) {
80   ATRACE_CALL();
81   status_t res = OK;
82 
83   std::unique_lock<std::mutex> lock(process_mutex_);
84 
85   for (auto& request : requests) {
86     if (request.pipeline_id >= pipelines.size()) {
87       ALOGE("%s: Pipeline request with invalid pipeline id: %u", __FUNCTION__,
88             request.pipeline_id);
89       return BAD_VALUE;
90     }
91 
92     while (pending_requests_.size() > EmulatedSensor::kPipelineDepth) {
93       auto result = request_condition_.wait_for(
94           lock, std::chrono::nanoseconds(
95                     EmulatedSensor::kSupportedFrameDurationRange[1]));
96       if (result == std::cv_status::timeout) {
97         ALOGE("%s: Timed out waiting for a pending request slot", __FUNCTION__);
98         return TIMED_OUT;
99       }
100     }
101 
102     res = request_state_->UpdateRequestForDynamicStreams(
103         &request, pipelines, dynamic_stream_id_map, use_default_physical_camera);
104     if (res != OK) {
105       ALOGE("%s: Failed to update request for dynamic streams: %s(%d)",
106             __FUNCTION__, strerror(-res), res);
107       return res;
108     }
109 
110     auto output_buffers = CreateSensorBuffers(
111         frame_number, request.output_buffers,
112         pipelines[request.pipeline_id].streams, request.pipeline_id,
113         pipelines[request.pipeline_id].cb, /*override_width*/ 0,
114         /*override_height*/ 0);
115     if (output_buffers == nullptr) {
116       return NO_MEMORY;
117     }
118 
119     auto input_buffers = CreateSensorBuffers(
120         frame_number, request.input_buffers,
121         pipelines[request.pipeline_id].streams, request.pipeline_id,
122         pipelines[request.pipeline_id].cb, request.input_width,
123         request.input_height);
124 
125     // Check if there are any settings that need to be overridden.
126     camera_metadata_ro_entry_t entry;
127     if (request.settings.get() != nullptr) {
128       auto ret = request.settings.get()->Get(ANDROID_CONTROL_SETTINGS_OVERRIDE,
129                                              &entry);
130       if ((ret == OK) && (entry.count == 1)) {
131         std::unique_ptr<HalCameraMetadata> override_setting =
132             HalCameraMetadata::Clone(request.settings.get());
133         override_settings_.push({.settings = std::move(override_setting),
134                                  .frame_number = frame_number});
135       }
136     } else {
137       override_settings_.push(
138           {.settings = nullptr, .frame_number = frame_number});
139     }
140     pending_requests_.push(
141         {.frame_number = frame_number,
142          .pipeline_id = request.pipeline_id,
143          .callback = pipelines[request.pipeline_id].cb,
144          .settings = HalCameraMetadata::Clone(request.settings.get()),
145          .input_buffers = std::move(input_buffers),
146          .output_buffers = std::move(output_buffers)});
147   }
148 
149   return OK;
150 }
151 
CreateSensorBuffers(uint32_t frame_number,const std::vector<StreamBuffer> & buffers,const std::unordered_map<uint32_t,EmulatedStream> & streams,uint32_t pipeline_id,HwlPipelineCallback cb,int32_t override_width,int32_t override_height)152 std::unique_ptr<Buffers> EmulatedRequestProcessor::CreateSensorBuffers(
153     uint32_t frame_number, const std::vector<StreamBuffer>& buffers,
154     const std::unordered_map<uint32_t, EmulatedStream>& streams,
155     uint32_t pipeline_id, HwlPipelineCallback cb, int32_t override_width,
156     int32_t override_height) {
157   if (buffers.empty()) {
158     return nullptr;
159   }
160 
161   std::vector<StreamBuffer> requested_buffers;
162   for (auto& buffer : buffers) {
163     if (buffer.buffer != nullptr) {
164       requested_buffers.push_back(buffer);
165       continue;
166     }
167 
168     if (session_callback_.request_stream_buffers != nullptr) {
169       std::vector<StreamBuffer> one_requested_buffer;
170       status_t res = session_callback_.request_stream_buffers(
171           buffer.stream_id, 1, &one_requested_buffer, frame_number);
172       if (res != OK) {
173         ALOGE("%s: request_stream_buffers failed: %s(%d)", __FUNCTION__,
174               strerror(-res), res);
175         continue;
176       }
177       if (one_requested_buffer.size() != 1 ||
178           one_requested_buffer[0].buffer == nullptr) {
179         ALOGE("%s: request_stream_buffers failed to return a valid buffer",
180               __FUNCTION__);
181         continue;
182       }
183       requested_buffers.push_back(one_requested_buffer[0]);
184     }
185   }
186 
187   if (requested_buffers.size() < buffers.size()) {
188     ALOGE(
189         "%s: Failed to acquire all sensor buffers: %zu acquired, %zu requested",
190         __FUNCTION__, requested_buffers.size(), buffers.size());
191     // This only happens for HAL buffer manager use case.
192     if (session_callback_.return_stream_buffers != nullptr) {
193       session_callback_.return_stream_buffers(requested_buffers);
194     }
195     requested_buffers.clear();
196   }
197 
198   auto sensor_buffers = std::make_unique<Buffers>();
199   sensor_buffers->reserve(requested_buffers.size());
200   for (auto& buffer : requested_buffers) {
201     auto sensor_buffer = CreateSensorBuffer(
202         frame_number, streams.at(buffer.stream_id), pipeline_id, cb, buffer,
203         override_width, override_height);
204     if (sensor_buffer.get() != nullptr) {
205       sensor_buffers->push_back(std::move(sensor_buffer));
206     }
207   }
208 
209   return sensor_buffers;
210 }
211 
NotifyFailedRequest(const PendingRequest & request)212 void EmulatedRequestProcessor::NotifyFailedRequest(const PendingRequest& request) {
213   if (request.output_buffers != nullptr) {
214     // Mark all output buffers for this request in order not to send
215     // ERROR_BUFFER for them.
216     for (auto& output_buffer : *(request.output_buffers)) {
217       output_buffer->is_failed_request = true;
218     }
219   }
220 
221   NotifyMessage msg = {
222       .type = MessageType::kError,
223       .message.error = {.frame_number = request.frame_number,
224                         .error_stream_id = -1,
225                         .error_code = ErrorCode::kErrorRequest}};
226   request.callback.notify(request.pipeline_id, msg);
227 }
228 
Flush()229 status_t EmulatedRequestProcessor::Flush() {
230   std::lock_guard<std::mutex> lock(process_mutex_);
231   // First flush in-flight requests
232   auto ret = sensor_->Flush();
233 
234   // Then the rest of the pending requests
235   while (!pending_requests_.empty()) {
236     const auto& request = pending_requests_.front();
237     NotifyFailedRequest(request);
238     pending_requests_.pop();
239   }
240 
241   return ret;
242 }
243 
GetBufferSizeAndStride(const EmulatedStream & stream,buffer_handle_t buffer,uint32_t * size,uint32_t * stride)244 status_t EmulatedRequestProcessor::GetBufferSizeAndStride(
245     const EmulatedStream& stream, buffer_handle_t buffer,
246     uint32_t* size /*out*/, uint32_t* stride /*out*/) {
247   if (size == nullptr) {
248     return BAD_VALUE;
249   }
250 
251   switch (stream.override_format) {
252     case HAL_PIXEL_FORMAT_RGB_888:
253       *stride = stream.width * 3;
254       *size = (*stride) * stream.height;
255       break;
256     case HAL_PIXEL_FORMAT_RGBA_8888:
257       *stride = stream.width * 4;
258       *size = (*stride) * stream.height;
259       break;
260     case HAL_PIXEL_FORMAT_Y16:
261       if (stream.override_data_space == HAL_DATASPACE_DEPTH) {
262         *stride = AlignTo(AlignTo(stream.width, 2) * 2, 16);
263         *size = (*stride) * AlignTo(stream.height, 2);
264       } else {
265         return BAD_VALUE;
266       }
267       break;
268     case HAL_PIXEL_FORMAT_BLOB:
269       if (stream.override_data_space == HAL_DATASPACE_V0_JFIF) {
270         *size = stream.buffer_size;
271         *stride = *size;
272       } else {
273         return BAD_VALUE;
274       }
275       break;
276     case HAL_PIXEL_FORMAT_RAW16:
277       if (importer_->getMonoPlanarStrideBytes(buffer, stride) != NO_ERROR) {
278         *stride = stream.width * 2;
279       }
280       *size = (*stride) * stream.height;
281       break;
282     default:
283       return BAD_VALUE;
284   }
285 
286   return OK;
287 }
288 
LockSensorBuffer(const EmulatedStream & stream,buffer_handle_t buffer,int32_t width,int32_t height,SensorBuffer * sensor_buffer)289 status_t EmulatedRequestProcessor::LockSensorBuffer(
290     const EmulatedStream& stream, buffer_handle_t buffer, int32_t width,
291     int32_t height, SensorBuffer* sensor_buffer /*out*/) {
292   if (sensor_buffer == nullptr) {
293     return BAD_VALUE;
294   }
295 
296   auto usage = GRALLOC_USAGE_SW_WRITE_OFTEN;
297   bool isYUV_420_888 = stream.override_format == HAL_PIXEL_FORMAT_YCBCR_420_888;
298   bool isP010 = static_cast<android_pixel_format_v1_1_t>(
299                     stream.override_format) == HAL_PIXEL_FORMAT_YCBCR_P010;
300   if ((isYUV_420_888) || (isP010)) {
301     IMapper::Rect map_rect = {0, 0, width, height};
302     auto yuv_layout = importer_->lockYCbCr(buffer, usage, map_rect);
303     if ((yuv_layout.y != nullptr) && (yuv_layout.cb != nullptr) &&
304         (yuv_layout.cr != nullptr)) {
305       sensor_buffer->plane.img_y_crcb.img_y =
306           static_cast<uint8_t*>(yuv_layout.y);
307       sensor_buffer->plane.img_y_crcb.img_cb =
308           static_cast<uint8_t*>(yuv_layout.cb);
309       sensor_buffer->plane.img_y_crcb.img_cr =
310           static_cast<uint8_t*>(yuv_layout.cr);
311       sensor_buffer->plane.img_y_crcb.y_stride = yuv_layout.yStride;
312       sensor_buffer->plane.img_y_crcb.cbcr_stride = yuv_layout.cStride;
313       sensor_buffer->plane.img_y_crcb.cbcr_step = yuv_layout.chromaStep;
314       if (isYUV_420_888 && (yuv_layout.chromaStep == 2) &&
315           std::abs(sensor_buffer->plane.img_y_crcb.img_cb -
316                    sensor_buffer->plane.img_y_crcb.img_cr) != 1) {
317         ALOGE("%s: Unsupported YUV layout, chroma step: %u U/V plane delta: %u",
318               __FUNCTION__, yuv_layout.chromaStep,
319               static_cast<unsigned>(
320                   std::abs(sensor_buffer->plane.img_y_crcb.img_cb -
321                            sensor_buffer->plane.img_y_crcb.img_cr)));
322         return BAD_VALUE;
323       }
324       sensor_buffer->plane.img_y_crcb.bytesPerPixel = isP010 ? 2 : 1;
325     } else {
326       ALOGE("%s: Failed to lock output buffer!", __FUNCTION__);
327       return BAD_VALUE;
328     }
329   } else {
330     uint32_t buffer_size = 0, stride = 0;
331     auto ret = GetBufferSizeAndStride(stream, buffer, &buffer_size, &stride);
332     if (ret != OK) {
333       ALOGE("%s: Unsupported pixel format: 0x%x", __FUNCTION__,
334             stream.override_format);
335       return BAD_VALUE;
336     }
337     if (stream.override_format == HAL_PIXEL_FORMAT_BLOB) {
338       sensor_buffer->plane.img.img =
339           static_cast<uint8_t*>(importer_->lock(buffer, usage, buffer_size));
340     } else {
341       IMapper::Rect region{0, 0, width, height};
342       sensor_buffer->plane.img.img =
343           static_cast<uint8_t*>(importer_->lock(buffer, usage, region));
344     }
345     if (sensor_buffer->plane.img.img == nullptr) {
346       ALOGE("%s: Failed to lock output buffer!", __FUNCTION__);
347       return BAD_VALUE;
348     }
349     sensor_buffer->plane.img.stride_in_bytes = stride;
350     sensor_buffer->plane.img.buffer_size = buffer_size;
351   }
352 
353   return OK;
354 }
355 
CreateSensorBuffer(uint32_t frame_number,const EmulatedStream & emulated_stream,uint32_t pipeline_id,HwlPipelineCallback callback,StreamBuffer stream_buffer,int32_t override_width,int32_t override_height)356 std::unique_ptr<SensorBuffer> EmulatedRequestProcessor::CreateSensorBuffer(
357     uint32_t frame_number, const EmulatedStream& emulated_stream,
358     uint32_t pipeline_id, HwlPipelineCallback callback,
359     StreamBuffer stream_buffer, int32_t override_width,
360     int32_t override_height) {
361   auto buffer = std::make_unique<GrallocSensorBuffer>(importer_);
362 
363   auto stream = emulated_stream;
364   // Make sure input stream formats are correctly mapped here
365   if (stream.is_input) {
366     stream.override_format = EmulatedSensor::OverrideFormat(
367         stream.override_format,
368         ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD);
369   }
370   if (override_width > 0 && override_height > 0) {
371     buffer->width = override_width;
372     buffer->height = override_height;
373   } else {
374     buffer->width = stream.width;
375     buffer->height = stream.height;
376   }
377   buffer->format = static_cast<PixelFormat>(stream.override_format);
378   buffer->dataSpace = stream.override_data_space;
379   buffer->color_space = stream.color_space;
380   buffer->use_case = stream.use_case;
381   buffer->stream_buffer = stream_buffer;
382   buffer->pipeline_id = pipeline_id;
383   buffer->callback = callback;
384   buffer->frame_number = frame_number;
385   buffer->camera_id = emulated_stream.is_physical_camera_stream
386                           ? emulated_stream.physical_camera_id
387                           : camera_id_;
388   buffer->is_input = stream.is_input;
389   // In case buffer processing is successful, flip this flag accordingly
390   buffer->stream_buffer.status = BufferStatus::kError;
391 
392   if (buffer->stream_buffer.buffer != nullptr) {
393     auto ret = LockSensorBuffer(stream, buffer->stream_buffer.buffer,
394                                 buffer->width, buffer->height, buffer.get());
395     if (ret != OK) {
396       buffer->is_failed_request = true;
397       buffer = nullptr;
398     }
399   }
400 
401   if ((buffer.get() != nullptr) && (stream_buffer.acquire_fence != nullptr)) {
402     auto fence_status = importer_->importFence(stream_buffer.acquire_fence,
403                                                buffer->acquire_fence_fd);
404     if (!fence_status) {
405       ALOGE("%s: Failed importing acquire fence!", __FUNCTION__);
406       buffer->is_failed_request = true;
407       buffer = nullptr;
408     }
409   }
410 
411   return buffer;
412 }
413 
AcquireBuffers(Buffers * buffers)414 std::unique_ptr<Buffers> EmulatedRequestProcessor::AcquireBuffers(
415     Buffers* buffers) {
416   if ((buffers == nullptr) || (buffers->empty())) {
417     return nullptr;
418   }
419 
420   auto acquired_buffers = std::make_unique<Buffers>();
421   acquired_buffers->reserve(buffers->size());
422   auto output_buffer = buffers->begin();
423   while (output_buffer != buffers->end()) {
424     status_t ret = OK;
425     if ((*output_buffer)->acquire_fence_fd >= 0) {
426       ret = sync_wait((*output_buffer)->acquire_fence_fd,
427                       ns2ms(EmulatedSensor::kSupportedFrameDurationRange[1]));
428       if (ret != OK) {
429         ALOGE("%s: Fence sync failed: %s, (%d)", __FUNCTION__, strerror(-ret),
430               ret);
431       }
432     }
433 
434     if (ret == OK) {
435       acquired_buffers->push_back(std::move(*output_buffer));
436     }
437 
438     output_buffer = buffers->erase(output_buffer);
439   }
440 
441   return acquired_buffers;
442 }
443 
RequestProcessorLoop()444 void EmulatedRequestProcessor::RequestProcessorLoop() {
445   ATRACE_CALL();
446 
447   bool vsync_status_ = true;
448   while (!processor_done_ && vsync_status_) {
449     {
450       std::lock_guard<std::mutex> lock(process_mutex_);
451       if (!pending_requests_.empty()) {
452         status_t ret;
453         const auto& request = pending_requests_.front();
454         auto frame_number = request.frame_number;
455         auto notify_callback = request.callback;
456         auto pipeline_id = request.pipeline_id;
457 
458         auto output_buffers = AcquireBuffers(request.output_buffers.get());
459         auto input_buffers = AcquireBuffers(request.input_buffers.get());
460         if ((output_buffers != nullptr) && !output_buffers->empty()) {
461           std::unique_ptr<EmulatedSensor::LogicalCameraSettings> logical_settings =
462               std::make_unique<EmulatedSensor::LogicalCameraSettings>();
463 
464           std::unique_ptr<std::set<uint32_t>> physical_camera_output_ids =
465               std::make_unique<std::set<uint32_t>>();
466           for (const auto& it : *output_buffers) {
467             if (it->camera_id != camera_id_) {
468               physical_camera_output_ids->emplace(it->camera_id);
469             }
470           }
471 
472           // Repeating requests usually include valid settings only during the
473           // initial call. Afterwards an invalid settings pointer means that
474           // there are no changes in the parameters and Hal should re-use the
475           // last valid values.
476           // TODO: Add support for individual physical camera requests.
477           if (request.settings.get() != nullptr) {
478             auto override_frame_number =
479                 ApplyOverrideSettings(frame_number, request.settings);
480             ret = request_state_->InitializeLogicalSettings(
481                 HalCameraMetadata::Clone(request.settings.get()),
482                 std::move(physical_camera_output_ids), override_frame_number,
483                 logical_settings.get());
484             last_settings_ = HalCameraMetadata::Clone(request.settings.get());
485           } else {
486             auto override_frame_number =
487                 ApplyOverrideSettings(frame_number, last_settings_);
488             ret = request_state_->InitializeLogicalSettings(
489                 HalCameraMetadata::Clone(last_settings_.get()),
490                 std::move(physical_camera_output_ids), override_frame_number,
491                 logical_settings.get());
492           }
493 
494           if (ret == OK) {
495             auto result = request_state_->InitializeLogicalResult(pipeline_id,
496                                                                   frame_number);
497             // The screen rotation will be the same for all logical and physical devices
498             uint32_t screen_rotation = screen_rotation_;
499             for (auto it = logical_settings->begin();
500                  it != logical_settings->end(); it++) {
501               it->second.screen_rotation = screen_rotation;
502             }
503 
504             sensor_->SetCurrentRequest(
505                 std::move(logical_settings), std::move(result),
506                 std::move(input_buffers), std::move(output_buffers));
507           } else {
508             NotifyMessage msg{.type = MessageType::kError,
509                               .message.error = {
510                                   .frame_number = frame_number,
511                                   .error_stream_id = -1,
512                                   .error_code = ErrorCode::kErrorResult,
513                               }};
514 
515             notify_callback.notify(pipeline_id, msg);
516           }
517         } else {
518           // No further processing is needed, just fail the result which will
519           // complete this request.
520           NotifyMessage msg{.type = MessageType::kError,
521                             .message.error = {
522                                 .frame_number = frame_number,
523                                 .error_stream_id = -1,
524                                 .error_code = ErrorCode::kErrorResult,
525                             }};
526 
527           notify_callback.notify(pipeline_id, msg);
528         }
529 
530         pending_requests_.pop();
531         request_condition_.notify_one();
532       }
533     }
534 
535     vsync_status_ =
536         sensor_->WaitForVSync(EmulatedSensor::kSupportedFrameDurationRange[1]);
537   }
538 }
539 
Initialize(std::unique_ptr<HalCameraMetadata> static_meta,PhysicalDeviceMapPtr physical_devices)540 status_t EmulatedRequestProcessor::Initialize(
541     std::unique_ptr<HalCameraMetadata> static_meta,
542     PhysicalDeviceMapPtr physical_devices) {
543   std::lock_guard<std::mutex> lock(process_mutex_);
544   return request_state_->Initialize(std::move(static_meta),
545                                     std::move(physical_devices));
546 }
547 
SetSessionCallback(const HwlSessionCallback & hwl_session_callback)548 void EmulatedRequestProcessor::SetSessionCallback(
549     const HwlSessionCallback& hwl_session_callback) {
550   std::lock_guard<std::mutex> lock(process_mutex_);
551   session_callback_ = hwl_session_callback;
552 }
553 
GetDefaultRequest(RequestTemplate type,std::unique_ptr<HalCameraMetadata> * default_settings)554 status_t EmulatedRequestProcessor::GetDefaultRequest(
555     RequestTemplate type, std::unique_ptr<HalCameraMetadata>* default_settings) {
556   std::lock_guard<std::mutex> lock(process_mutex_);
557   return request_state_->GetDefaultRequest(type, default_settings);
558 }
559 
ApplyOverrideSettings(uint32_t frame_number,const std::unique_ptr<HalCameraMetadata> & request_settings)560 uint32_t EmulatedRequestProcessor::ApplyOverrideSettings(
561     uint32_t frame_number,
562     const std::unique_ptr<HalCameraMetadata>& request_settings) {
563   while (!override_settings_.empty() && request_settings.get() != nullptr) {
564     auto override_frame_number = override_settings_.front().frame_number;
565     bool repeatingOverride = (override_settings_.front().settings == nullptr);
566     const auto& override_setting = repeatingOverride
567                                        ? last_override_settings_
568                                        : override_settings_.front().settings;
569 
570     camera_metadata_ro_entry_t entry;
571     status_t ret =
572         override_setting->Get(ANDROID_CONTROL_SETTINGS_OVERRIDE, &entry);
573     bool overriding = false;
574     if ((ret == OK) && (entry.count == 1) &&
575         (entry.data.i32[0] == ANDROID_CONTROL_SETTINGS_OVERRIDE_ZOOM)) {
576       ApplyOverrideZoom(override_setting, request_settings,
577                         ANDROID_CONTROL_SETTINGS_OVERRIDE);
578       ApplyOverrideZoom(override_setting, request_settings,
579                         ANDROID_CONTROL_ZOOM_RATIO);
580       ApplyOverrideZoom(override_setting, request_settings,
581                         ANDROID_SCALER_CROP_REGION);
582       ApplyOverrideZoom(override_setting, request_settings,
583                         ANDROID_CONTROL_AE_REGIONS);
584       ApplyOverrideZoom(override_setting, request_settings,
585                         ANDROID_CONTROL_AWB_REGIONS);
586       ApplyOverrideZoom(override_setting, request_settings,
587                         ANDROID_CONTROL_AF_REGIONS);
588       overriding = true;
589     }
590     if (!repeatingOverride) {
591       last_override_settings_ = HalCameraMetadata::Clone(override_setting.get());
592     }
593 
594     override_settings_.pop();
595     // If there are multiple queued override settings, skip until the speed-up
596     // is at least 2 frames.
597     if (override_frame_number - frame_number >= kZoomSpeedup) {
598       // If the request's settings override isn't ON, do not return
599       // override_frame_number. Return 0 to indicate there is no
600       // override happening.
601       return overriding ? override_frame_number : 0;
602     }
603   }
604   return 0;
605 }
606 
ApplyOverrideZoom(const std::unique_ptr<HalCameraMetadata> & override_setting,const std::unique_ptr<HalCameraMetadata> & request_settings,camera_metadata_tag tag)607 void EmulatedRequestProcessor::ApplyOverrideZoom(
608     const std::unique_ptr<HalCameraMetadata>& override_setting,
609     const std::unique_ptr<HalCameraMetadata>& request_settings,
610     camera_metadata_tag tag) {
611   status_t ret;
612   camera_metadata_ro_entry_t entry;
613   ret = override_setting->Get(tag, &entry);
614   if (ret == OK) {
615     if (entry.type == TYPE_INT32) {
616       request_settings->Set(tag, entry.data.i32, entry.count);
617     } else if (entry.type == TYPE_FLOAT) {
618       request_settings->Set(tag, entry.data.f, entry.count);
619     } else {
620       ALOGE("%s: Unsupported override key %d", __FUNCTION__, tag);
621     }
622   } else {
623     auto missing_tag = get_camera_metadata_tag_name(tag);
624     ALOGE("%s: %s needs to be specified for overriding zoom", __func__,
625           missing_tag);
626   }
627 }
628 
onEvent(const Event & e)629 Return<void> EmulatedRequestProcessor::SensorHandler::onEvent(const Event& e) {
630   auto processor = processor_.lock();
631   if (processor.get() == nullptr) {
632     return Void();
633   }
634 
635   if (e.sensorType == SensorType::ACCELEROMETER) {
636     // Heuristic approach for deducing the screen
637     // rotation depending on the reported
638     // accelerometer readings. We switch
639     // the screen rotation when one of the
640     // x/y axis gets close enough to the earth
641     // acceleration.
642     const uint32_t earth_accel = 9;  // Switch threshold [m/s^2]
643     uint32_t x_accel = e.u.vec3.x;
644     uint32_t y_accel = e.u.vec3.y;
645     uint32_t z_accel = abs(e.u.vec3.z);
646     if (z_accel == earth_accel) {
647       return Void();
648     }
649 
650     if (x_accel == earth_accel) {
651       processor->screen_rotation_ = 270;
652     } else if (x_accel == -earth_accel) {
653       processor->screen_rotation_ = 90;
654     } else if (y_accel == -earth_accel) {
655       processor->screen_rotation_ = 180;
656     } else {
657       processor->screen_rotation_ = 0;
658     }
659   } else {
660     ALOGE("%s: unexpected event received type: %d", __func__, e.sensorType);
661   }
662   return Void();
663 }
664 
InitializeSensorQueue(std::weak_ptr<EmulatedRequestProcessor> processor)665 void EmulatedRequestProcessor::InitializeSensorQueue(
666     std::weak_ptr<EmulatedRequestProcessor> processor) {
667   if (sensor_event_queue_.get() != nullptr) {
668     return;
669   }
670 
671   sp<ISensorManager> manager = ISensorManager::getService();
672   if (manager == nullptr) {
673     ALOGE("%s: Cannot get ISensorManager", __func__);
674   } else {
675     bool sensor_found = false;
676     manager->getSensorList([&](const auto& list, auto result) {
677       if (result != Result::OK) {
678         ALOGE("%s: Failed to retrieve sensor list!", __func__);
679       } else {
680         for (const SensorInfo& it : list) {
681           if (it.type == SensorType::ACCELEROMETER) {
682             sensor_found = true;
683             sensor_handle_ = it.sensorHandle;
684           }
685         }
686       }
687     });
688     if (sensor_found) {
689       manager->createEventQueue(
690           new SensorHandler(processor), [&](const auto& q, auto result) {
691             if (result != Result::OK) {
692               ALOGE("%s: Cannot create event queue", __func__);
693               return;
694             }
695             sensor_event_queue_ = q;
696           });
697 
698       if (sensor_event_queue_.get() != nullptr) {
699         auto res = sensor_event_queue_->enableSensor(
700             sensor_handle_,
701             ns2us(EmulatedSensor::kSupportedFrameDurationRange[0]),
702             0 /*maxBatchReportLatencyUs*/);
703         if (res.isOk()) {
704         } else {
705           ALOGE("%s: Failed to enable sensor", __func__);
706         }
707       } else {
708         ALOGE("%s: Failed to create event queue", __func__);
709       }
710     }
711   }
712 }
713 
714 }  // namespace android
715