| // 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_OUTPUT_NODE_H_ |
| #define SRC_CAMERA_DRIVERS_CONTROLLER_OUTPUT_NODE_H_ |
| |
| #include <fuchsia/camera2/cpp/fidl.h> |
| |
| #include "src/camera/drivers/controller/processing_node.h" |
| #include "src/camera/drivers/controller/stream_pipeline_info.h" |
| #include "src/camera/drivers/controller/stream_protocol.h" |
| |
| // |OutputNode| represents a |ProcessNode| of NodeType |kOutputStream|. |
| // This node handles the communication with the clients. |
| namespace camera { |
| class OutputNode : public ProcessNode { |
| public: |
| OutputNode(async_dispatcher_t* dispatcher, ProcessNode* parent_node, |
| const camera::InternalConfigNode& internal_output_node, |
| fuchsia::sysmem::BufferCollectionInfo_2 output_buffer_collection, |
| fuchsia::camera2::CameraStreamType current_stream_type, |
| uint32_t current_image_format_index) |
| : ProcessNode(NodeType::kOutputStream, parent_node, current_stream_type, |
| internal_output_node.image_formats, std::move(output_buffer_collection), |
| internal_output_node.supported_streams, dispatcher, |
| internal_output_node.output_frame_rate, current_image_format_index) {} |
| |
| // Creates an |OutputNode| object. |
| // Args: |
| // |dispatcher| : Dispatcher on which GDC tasks can be queued up. |
| // |info| : StreamCreationData for the requested stream. |
| // |parent_node| : pointer to the node to which we need to append this |OutputNode|. |
| // |internal_output_node| : InternalConfigNode corresponding to this node. |
| static fit::result<OutputNode*, zx_status_t> CreateOutputNode( |
| async_dispatcher_t* dispatcher, StreamCreationData* info, ProcessNode* parent_node, |
| const InternalConfigNode& internal_output_node); |
| |
| // Binds a channel to the stream. |
| // Args: |
| // |channel|: the channel to bind |
| // |disconnect_handler|: called when the client on |channel| disconnects. |
| zx_status_t Attach(zx::channel channel, fit::function<void(void)> disconnect_handler); |
| |
| void set_client_stream(std::unique_ptr<StreamImpl> client_stream) { |
| client_stream_ = std::move(client_stream); |
| } |
| std::unique_ptr<camera::StreamImpl>& client_stream() { return client_stream_; } |
| |
| // Notifies that a frame is ready to be sent to the client. |
| void OnReadyToProcess(const frame_available_info_t* info) override; |
| |
| // Called by the client to release a frame. |
| void OnReleaseFrame(uint32_t buffer_index) override; |
| |
| // Shut down routine. |
| void OnShutdown(fit::function<void(void)> shutdown_callback) override { |
| shutdown_requested_ = true; |
| shutdown_callback(); |
| } |
| |
| // Notifies that the client has requested to change resolution. |
| void OnResolutionChangeRequest(uint32_t output_format_index) override {} |
| |
| private: |
| std::unique_ptr<StreamImpl> client_stream_; |
| }; |
| |
| } // namespace camera |
| |
| #endif // SRC_CAMERA_DRIVERS_CONTROLLER_OUTPUT_NODE_H_ |