blob: 1fee8244f9c37d5e807f1df726ef6e9b42dad4f0 [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.
#ifndef SRC_CAMERA_DRIVERS_CONTROLLER_INPUT_NODE_H_
#define SRC_CAMERA_DRIVERS_CONTROLLER_INPUT_NODE_H_
#include <fuchsia/camera2/cpp/fidl.h>
#include <fuchsia/hardware/isp/cpp/banjo.h>
#include <lib/trace/event.h>
#include <zircon/assert.h>
#include "src/camera/drivers/controller/isp_stream_protocol.h"
#include "src/camera/drivers/controller/memory_allocation.h"
#include "src/camera/drivers/controller/processing_node.h"
#include "src/camera/drivers/controller/stream_pipeline_info.h"
// |InputNode| represents a |ProcessNode| which would talk to the
// ISP driver.
namespace camera {
class InputNode : public ProcessNode {
public:
InputNode(StreamCreationData* info,
fuchsia::sysmem::BufferCollectionInfo_2 output_buffer_collection,
async_dispatcher_t* dispatcher, const ddk::IspProtocolClient& isp)
: ProcessNode(NodeType::kInputStream, nullptr, info->stream_type(), info->node.image_formats,
std::move(output_buffer_collection), info->node.supported_streams, dispatcher,
info->node.output_frame_rate, info->image_format_index),
isp_stream_type_(info->node.input_stream_type),
isp_frame_callback_{OnIspFrameAvailable, this},
isp_(isp) {}
// Creates an |InputNode| object.
// 1. Creates the ISP stream protocol
// 2. Creates the requested ISP stream
// 3. Allocates buffers if needed
// Args:
// |info| : StreamCreationData for the requested stream.
// |memory_allocator| : Memory allocator object to allocate memory using sysmem.
// |dispatcher| : Dispatcher on which GDC tasks can be queued up.
// |isp| : ISP protocol to talk to the driver.
static fit::result<std::unique_ptr<InputNode>, zx_status_t> CreateInputNode(
StreamCreationData* info, const ControllerMemoryAllocator& memory_allocator,
async_dispatcher_t* dispatcher, const ddk::IspProtocolClient& isp);
const hw_accel_frame_callback_t* isp_frame_callback() { return &isp_frame_callback_; }
std::unique_ptr<camera::IspStreamProtocol>& isp_stream_protocol() { return isp_stream_protocol_; }
void set_isp_stream_protocol(std::unique_ptr<camera::IspStreamProtocol> isp_stream_protocol) {
isp_stream_protocol_ = std::move(isp_stream_protocol);
}
// Notifies that a frame is ready to be sent to the client.
void OnReadyToProcess(const frame_available_info_t* info) override;
// Releases the frame associated with | buffer_index |.
void OnReleaseFrame(uint32_t buffer_index) override;
// Notifies that a frame is done processing by this node.
void OnFrameAvailable(const frame_available_info_t* info) override;
// Shuts down the stream with ISP.
void OnShutdown(fit::function<void(void)> shutdown_callback) override;
// Notifies that the client has requested to start streaming.
void OnStartStreaming() override;
// Notifies that the client has requested to stop streaming.
void OnStopStreaming() override;
// Notifies that the client has requested to change resolution.
void OnResolutionChangeRequest(uint32_t output_format_index) override {}
private:
// Notifies when a new frame is available from the ISP.
static void OnIspFrameAvailable(void* ctx, const frame_available_info_t* info) {
auto nonce = TRACE_NONCE();
TRACE_DURATION("camera", "OnIspFrameAvailable");
TRACE_FLOW_BEGIN("camera", "post_ready_to_process", nonce);
// This method is invoked by the ISP in its own thread,
// so the event must be marshalled to the
// controller's thread.
auto* input_node = static_cast<InputNode*>(ctx);
input_node->RunOnMainThread([input_node, nonce, info = *info]() {
TRACE_DURATION("camera", "OnIspFrameAvailable.task");
TRACE_FLOW_END("camera", "post_ready_to_process", nonce);
input_node->OnReadyToProcess(&info);
});
}
// ISP stream type.
__UNUSED fuchsia::camera2::CameraStreamType isp_stream_type_;
// ISP Frame callback.
hw_accel_frame_callback_t isp_frame_callback_;
// ISP stream protocol.
std::unique_ptr<IspStreamProtocol> isp_stream_protocol_;
// Protocol to talk to ISP driver.
ddk::IspProtocolClient isp_;
};
} // namespace camera
#endif // SRC_CAMERA_DRIVERS_CONTROLLER_INPUT_NODE_H_