123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243 |
- /*
- Copyright (c) 2012, Broadcom Europe Ltd
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- * Neither the name of the copyright holder nor the
- names of its contributors may be used to endorse or promote products
- derived from this software without specific prior written permission.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
- DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
- #ifndef MMAL_GRAPH_H
- #define MMAL_GRAPH_H
-
- #include "util/mmal_connection.h"
-
- /** \defgroup MmalGraphUtility Graph Utility
- * \ingroup MmalUtilities
- * The graph utility functions allows one to easily create graphs of MMAL components.
- *
- * @{
- */
-
- #ifdef __cplusplus
- extern "C" {
- #endif
-
- /** List of topology types */
- typedef enum
- {
- MMAL_GRAPH_TOPOLOGY_ALL = 0, /**< All input ports and output ports are linked */
- MMAL_GRAPH_TOPOLOGY_STRAIGHT, /**< Input ports and output ports of the same index are linked */
- MMAL_GRAPH_TOPOLOGY_CUSTOM, /**< Custom defined topology */
- MMAL_GRAPH_TOPOLOGY_MAX
-
- } MMAL_GRAPH_TOPOLOGY_T;
-
- /** Structure describing a graph */
- typedef struct MMAL_GRAPH_T
- {
- /** Pointer to private data of the client */
- struct MMAL_GRAPH_USERDATA_T *userdata;
-
- /** Optional callback that the client can set to get notified when the graph is going to be destroyed */
- void (*pf_destroy)(struct MMAL_GRAPH_T *);
-
- /** Optional callback that the client can set to intercept parameter requests on ports exposed by the graph */
- MMAL_STATUS_T (*pf_parameter_set)(struct MMAL_GRAPH_T *, MMAL_PORT_T *port, const MMAL_PARAMETER_HEADER_T *param);
- /** Optional callback that the client can set to intercept parameter requests on ports exposed by the graph */
- MMAL_STATUS_T (*pf_parameter_get)(struct MMAL_GRAPH_T *, MMAL_PORT_T *port, MMAL_PARAMETER_HEADER_T *param);
- /** Optional callback that the client can set to intercept format commit calls on ports exposed by the graph */
- MMAL_STATUS_T (*pf_format_commit)(struct MMAL_GRAPH_T *, MMAL_PORT_T *port);
- /** Optional callback that the client can set to intercept send buffer calls on ports exposed by the graph */
- MMAL_STATUS_T (*pf_send_buffer)(struct MMAL_GRAPH_T *, MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *buffer);
- /** Optional callback that the client can set to intercept buffer callbacks on ports exposed by the graph */
- MMAL_STATUS_T (*pf_return_buffer)(struct MMAL_GRAPH_T *, MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *buffer);
- /** Optional callback that the client can set to intercept payload alloc calls on ports exposed by the graph */
- MMAL_STATUS_T (*pf_payload_alloc)(struct MMAL_GRAPH_T *, MMAL_PORT_T *port, uint32_t payload_size, uint8_t **);
- /** Optional callback that the client can set to intercept payload free calls on ports exposed by the graph */
- MMAL_STATUS_T (*pf_payload_free)(struct MMAL_GRAPH_T *, MMAL_PORT_T *port, uint8_t *payload);
- /** Optional callback that the client can set to intercept flush calls on ports exposed by the graph */
- MMAL_STATUS_T (*pf_flush)(struct MMAL_GRAPH_T *, MMAL_PORT_T *port);
- /** Optional callback that the client can set to control callbacks from the internal components of the graph */
- /** Optional callback that the client can set to intercept enable calls on ports exposed by the graph */
- MMAL_STATUS_T (*pf_enable)(struct MMAL_GRAPH_T *, MMAL_PORT_T *port);
- /** Optional callback that the client can set to intercept disable calls on ports exposed by the graph */
- MMAL_STATUS_T (*pf_disable)(struct MMAL_GRAPH_T *, MMAL_PORT_T *port);
- /** Optional callback that the client can set to control callbacks from the internal components of the graph */
- MMAL_STATUS_T (*pf_control_callback)(struct MMAL_GRAPH_T *, MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *buffer);
- /** Optional callback that the client can set to intercept component_enable/disable calls made to the graph */
- MMAL_STATUS_T (*pf_graph_enable)(struct MMAL_GRAPH_T *, MMAL_BOOL_T enable);
- /** Optional callback that the client can set to intercept buffers going through internal connections.
- * This will only be triggered if the connection is not tunnelled */
- MMAL_STATUS_T (*pf_connection_buffer)(struct MMAL_GRAPH_T *, MMAL_CONNECTION_T *connection, MMAL_BUFFER_HEADER_T *buffer);
-
- } MMAL_GRAPH_T;
-
- /** Create an instance of a graph.
- * The newly created graph will need to be populated by the client.
- *
- * @param graph returned graph
- * @param userdata_size size to be allocated for the userdata field
- * @return MMAL_SUCCESS on success
- */
- MMAL_STATUS_T mmal_graph_create(MMAL_GRAPH_T **graph, unsigned int userdata_size);
-
- /** Add a component to a graph.
- * Allows the client to add a component to the graph.
- *
- * @param graph instance of the graph
- * @param component component to add to a graph
- * @return MMAL_SUCCESS on success
- */
- MMAL_STATUS_T mmal_graph_add_component(MMAL_GRAPH_T *graph, MMAL_COMPONENT_T *component);
-
- /** Describe the topology of the ports of a component.
- * Allows the client to describe the topology of a component. This information
- * is used by the graph to choose which action to perform when
- * enabling / disabling / committing / flushing a port exposed by the graph.
- * Note that by default the topology of a component is set to MMAL_GRAPH_TOPOLOGY_ALL.
- *
- * @param graph instance of the graph
- * @param component component to describe
- * @param topology type of topology used by this component
- * @param input output index (or -1 if sink) linked to each input port
- * @param input_num number of indexes in the input list
- * @param output input index (or -1 if source) linked to each output port
- * @param output_num number of indexes in the output list
- * @return MMAL_SUCCESS on success
- */
- MMAL_STATUS_T mmal_graph_component_topology(MMAL_GRAPH_T *graph, MMAL_COMPONENT_T *component,
- MMAL_GRAPH_TOPOLOGY_T topology, int8_t *input, unsigned int input_num,
- int8_t *output, unsigned int output_num);
-
- /** Add a port to a graph.
- * Allows the client to add an input or output port to a graph. The given port
- * will effectively become an end point for the graph.
- *
- * @param graph instance of the graph
- * @param port port to add to the graph
- * @return MMAL_SUCCESS on success
- */
- MMAL_STATUS_T mmal_graph_add_port(MMAL_GRAPH_T *graph, MMAL_PORT_T *port);
-
- /** Add a connection to a graph.
- * Allows the client to add an internal connection to a graph.
- *
- * @param graph instance of the graph
- * @param connection connection to add to the graph
- * @return MMAL_SUCCESS on success
- */
- MMAL_STATUS_T mmal_graph_add_connection(MMAL_GRAPH_T *graph, MMAL_CONNECTION_T *connection);
-
- /** Create a new component and add it to a graph.
- * Allows the client to create and add a component to the graph.
- *
- * @param graph instance of the graph
- * @param name name of the component to create
- * @param component if not NULL, will contain a pointer to the created component
- * @return MMAL_SUCCESS on success
- */
- MMAL_STATUS_T mmal_graph_new_component(MMAL_GRAPH_T *graph, const char *name,
- MMAL_COMPONENT_T **component);
-
- /** Create and add a connection to a graph.
- * Allows the client to create and add an internal connection to a graph.
- *
- * @param graph instance of the graph
- * @param out the output port to use for the connection
- * @param in the input port to use for the connection
- * @param flags the flags specifying which type of connection should be created
- * @param connection if not NULL, will contain a pointer to the created connection
- * @return MMAL_SUCCESS on success
- */
- MMAL_STATUS_T mmal_graph_new_connection(MMAL_GRAPH_T *graph, MMAL_PORT_T *out, MMAL_PORT_T *in,
- uint32_t flags, MMAL_CONNECTION_T **connection);
-
- /** Definition of the callback used by a graph to send events to the client.
- *
- * @param graph the graph sending the event
- * @param port the port which generated the event
- * @param buffer the buffer header containing the event data
- * @param cb_data data passed back to the client when the callback is invoked
- */
- typedef void (*MMAL_GRAPH_EVENT_CB)(MMAL_GRAPH_T *graph, MMAL_PORT_T *port, MMAL_BUFFER_HEADER_T *buffer,
- void *cb_data);
-
- /** Enable the graph and start processing.
- *
- * @param graph the graph to enable
- * @param cb the callback to invoke when an event occurs on any of the internal control ports
- * @param cb_data data passed back to the client when the callback is invoked
- *
- * @return MMAL_SUCCESS on success
- */
- MMAL_STATUS_T mmal_graph_enable(MMAL_GRAPH_T *graph, MMAL_GRAPH_EVENT_CB cb, void *cb_data);
-
- MMAL_STATUS_T mmal_graph_disable(MMAL_GRAPH_T *graph);
-
- /** Find a port in the graph.
- *
- * @param graph graph instance
- * @param name name of the component of interest
- * @param type type of port (in/out)
- * @param index which port index within the component
- *
- * @return port, or NULL if not found
- */
- MMAL_PORT_T *mmal_graph_find_port(MMAL_GRAPH_T *graph,
- const char *name,
- MMAL_PORT_TYPE_T type,
- unsigned index);
-
- /** Create an instance of a component from a graph.
- * The newly created component will expose input and output ports to the client.
- * Not that all the exposed ports will be in a disabled state by default.
- *
- * @param graph graph to create the component from
- * @param name name of the component to create
- * @param component returned component
- * @return MMAL_SUCCESS on success
- */
- MMAL_STATUS_T mmal_graph_build(MMAL_GRAPH_T *ctx,
- const char *name, MMAL_COMPONENT_T **component);
-
- /** Component constructor for a graph.
- * FIXME: private function
- *
- * @param name name of the component to create
- * @param component component
- * @return MMAL_SUCCESS on success
- */
- MMAL_STATUS_T mmal_graph_component_constructor(const char *name, MMAL_COMPONENT_T *component);
-
- /** Destroy a previously created graph
- * @param graph graph to destroy
- * @return MMAL_SUCCESS on success
- */
- MMAL_STATUS_T mmal_graph_destroy(MMAL_GRAPH_T *ctx);
-
- #ifdef __cplusplus
- }
- #endif
-
- /** @} */
-
- #endif /* MMAL_GRAPH_H */
|