diff options
author | Emilian Peev <epeev@google.com> | 2023-05-13 00:26:17 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2023-05-13 00:26:17 +0000 |
commit | c8dc9e2564f7cbaedb568fa9020c3b234717913c (patch) | |
tree | bc08e0c45a1299078ebb9541662b719f83ac6d20 | |
parent | 768b20d2f8d5fc874957bbe9449615999e3cd26f (diff) | |
parent | a9574ed700248ce8a06b76d7d9bfb7cbba4d04b1 (diff) | |
download | camera-c8dc9e2564f7cbaedb568fa9020c3b234717913c.tar.gz |
EmulatedCamera: Improve Hal buffer management mode error handling am: a9574ed700
Original change: https://googleplex-android-review.googlesource.com/c/platform/hardware/google/camera/+/23192725
Change-Id: Ib113011350aa53aab5ff7504f8824e345571608d
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r-- | devices/EmulatedCamera/hwl/EmulatedRequestProcessor.cpp | 36 | ||||
-rw-r--r-- | devices/EmulatedCamera/hwl/EmulatedRequestProcessor.h | 3 |
2 files changed, 22 insertions, 17 deletions
diff --git a/devices/EmulatedCamera/hwl/EmulatedRequestProcessor.cpp b/devices/EmulatedCamera/hwl/EmulatedRequestProcessor.cpp index 08e7996..ef57437 100644 --- a/devices/EmulatedCamera/hwl/EmulatedRequestProcessor.cpp +++ b/devices/EmulatedCamera/hwl/EmulatedRequestProcessor.cpp @@ -138,7 +138,10 @@ status_t EmulatedRequestProcessor::ProcessPipelineRequests( {.settings = nullptr, .frame_number = frame_number}); } pending_requests_.push( - {.settings = HalCameraMetadata::Clone(request.settings.get()), + {.frame_number = frame_number, + .pipeline_id = request.pipeline_id, + .callback = pipelines[request.pipeline_id].cb, + .settings = HalCameraMetadata::Clone(request.settings.get()), .input_buffers = std::move(input_buffers), .output_buffers = std::move(output_buffers)}); } @@ -189,7 +192,7 @@ std::unique_ptr<Buffers> EmulatedRequestProcessor::CreateSensorBuffers( if (session_callback_.return_stream_buffers != nullptr) { session_callback_.return_stream_buffers(requested_buffers); } - return nullptr; + requested_buffers.clear(); } auto sensor_buffers = std::make_unique<Buffers>(); @@ -207,21 +210,20 @@ std::unique_ptr<Buffers> EmulatedRequestProcessor::CreateSensorBuffers( } void EmulatedRequestProcessor::NotifyFailedRequest(const PendingRequest& request) { - if (request.output_buffers->at(0)->callback.notify != nullptr) { + if (request.output_buffers != nullptr) { // Mark all output buffers for this request in order not to send // ERROR_BUFFER for them. for (auto& output_buffer : *(request.output_buffers)) { output_buffer->is_failed_request = true; } - - auto output_buffer = std::move(request.output_buffers->at(0)); - NotifyMessage msg = { - .type = MessageType::kError, - .message.error = {.frame_number = output_buffer->frame_number, - .error_stream_id = -1, - .error_code = ErrorCode::kErrorRequest}}; - output_buffer->callback.notify(output_buffer->pipeline_id, msg); } + + NotifyMessage msg = { + .type = MessageType::kError, + .message.error = {.frame_number = request.frame_number, + .error_stream_id = -1, + .error_code = ErrorCode::kErrorRequest}}; + request.callback.notify(request.pipeline_id, msg); } status_t EmulatedRequestProcessor::Flush() { @@ -391,7 +393,7 @@ std::unique_ptr<SensorBuffer> EmulatedRequestProcessor::CreateSensorBuffer( auto ret = LockSensorBuffer(stream, buffer->stream_buffer.buffer, buffer->width, buffer->height, buffer.get()); if (ret != OK) { - buffer.release(); + buffer->is_failed_request = true; buffer = nullptr; } } @@ -401,7 +403,7 @@ std::unique_ptr<SensorBuffer> EmulatedRequestProcessor::CreateSensorBuffer( buffer->acquire_fence_fd); if (!fence_status) { ALOGE("%s: Failed importing acquire fence!", __FUNCTION__); - buffer.release(); + buffer->is_failed_request = true; buffer = nullptr; } } @@ -449,13 +451,13 @@ void EmulatedRequestProcessor::RequestProcessorLoop() { if (!pending_requests_.empty()) { status_t ret; const auto& request = pending_requests_.front(); - auto frame_number = request.output_buffers->at(0)->frame_number; - auto notify_callback = request.output_buffers->at(0)->callback; - auto pipeline_id = request.output_buffers->at(0)->pipeline_id; + auto frame_number = request.frame_number; + auto notify_callback = request.callback; + auto pipeline_id = request.pipeline_id; auto output_buffers = AcquireBuffers(request.output_buffers.get()); auto input_buffers = AcquireBuffers(request.input_buffers.get()); - if (!output_buffers->empty()) { + if ((output_buffers != nullptr) && !output_buffers->empty()) { std::unique_ptr<EmulatedSensor::LogicalCameraSettings> logical_settings = std::make_unique<EmulatedSensor::LogicalCameraSettings>(); diff --git a/devices/EmulatedCamera/hwl/EmulatedRequestProcessor.h b/devices/EmulatedCamera/hwl/EmulatedRequestProcessor.h index 789fb58..0907fdb 100644 --- a/devices/EmulatedCamera/hwl/EmulatedRequestProcessor.h +++ b/devices/EmulatedCamera/hwl/EmulatedRequestProcessor.h @@ -45,6 +45,9 @@ using google_camera_hal::RequestTemplate; using google_camera_hal::StreamBuffer; struct PendingRequest { + uint32_t frame_number; + uint32_t pipeline_id; + HwlPipelineCallback callback; std::unique_ptr<HalCameraMetadata> settings; std::unique_ptr<Buffers> input_buffers; std::unique_ptr<Buffers> output_buffers; |