blob: 43767bd3a51deb6ab0791d0931678bd006d1e7d3 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "processing_node.h"
#include <lib/ddk/trace/event.h>
#include <lib/syslog/cpp/macros.h>
#include <zircon/assert.h>
#include <zircon/errors.h>
#include <zircon/types.h>
#include "stream_protocol.h"
namespace camera {
void ProcessNode::UpdateFrameCounterForAllChildren() {
// Update the current frame counter.
for (auto& node : child_nodes_) {
node->AddToCurrentFrameCount(node->output_fps());
}
}
bool ProcessNode::NeedToDropFrame() {
return !enabled_ || AllChildNodesDisabled() ||
std::none_of(child_nodes_.begin(), child_nodes_.end(),
[this](auto& node) { return node->current_frame_count() >= output_fps(); });
}
void ProcessNode::OnFrameAvailable(const frame_available_info_t* info) {
ZX_ASSERT(thread_checker_.is_thread_valid());
ZX_ASSERT_MSG(type_ != NodeType::kOutputStream, "Invalid for OuputNode");
TRACE_DURATION("camera", "ProcessNode::OnFrameAvailable");
for (auto& node : child_nodes_) {
// Check if this frame needs to be passed on to the next node.
if (node->enabled() && node->current_frame_count() >= output_fps()) {
node->SubtractFromCurrentFrameCount(output_fps());
{
fbl::AutoLock al(&in_use_buffer_lock_);
ZX_ASSERT(info->buffer_id < in_use_buffer_count_.size());
in_use_buffer_count_[info->buffer_id]++;
}
node->OnReadyToProcess(info);
}
}
}
void ProcessNode::OnStartStreaming() {
if (!shutdown_requested_) {
enabled_ = true;
parent_node_->OnStartStreaming();
}
}
bool ProcessNode::AllChildNodesDisabled() {
return std::none_of(child_nodes_.begin(), child_nodes_.end(),
[](auto& node) { return node->enabled(); });
}
void ProcessNode::OnStopStreaming() {
if (!shutdown_requested_) {
if (AllChildNodesDisabled()) {
enabled_ = false;
parent_node_->OnStopStreaming();
}
}
}
void ProcessNode::OnResolutionChanged(const frame_available_info* info) {
TRACE_DURATION("camera", "ProcessNode::OnResolutionChanged", "index",
info->metadata.image_format_index);
for (auto& node : child_nodes_) {
if (node->enabled()) {
node->OnResolutionChangeRequest(info->metadata.image_format_index);
}
}
}
} // namespace camera