mirror of
https://github.com/moonlight-stream/moonlight-embedded.git
synced 2025-07-01 15:25:35 +00:00
1040 lines
44 KiB
C
1040 lines
44 KiB
C
/*
|
|
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.
|
|
*/
|
|
|
|
/*
|
|
* \file
|
|
*
|
|
* \brief This API defines helper functions for writing IL clients.
|
|
*
|
|
* This file defines an IL client side library. This is useful when
|
|
* writing IL clients, since there tends to be much repeated and
|
|
* common code across both single and multiple clients. This library
|
|
* seeks to remove that common code and abstract some of the
|
|
* interactions with components. There is a wrapper around a
|
|
* component and tunnel, and some operations can be done on lists of
|
|
* these. The callbacks from components are handled, and specific
|
|
* events can be checked or waited for.
|
|
*/
|
|
|
|
#ifndef _IL_CLIENT_H
|
|
#define _IL_CLIENT_H
|
|
|
|
#include "IL/OMX_Broadcom.h"
|
|
#include "interface/vcos/vcos.h"
|
|
|
|
/**
|
|
* The <DFN>ILCLIENT_T</DFN> structure encapsulates the state needed for the IL
|
|
* Client API. It contains a set of callback functions used to
|
|
* communicate with the user. It also includes a linked list of free
|
|
* event structures.
|
|
***********************************************************/
|
|
typedef struct _ILCLIENT_T ILCLIENT_T;
|
|
|
|
|
|
/**
|
|
* Each <DFN>ILEVENT_T</DFN> structure stores the result of an <DFN>EventHandler</DFN>
|
|
* callback from a component, storing the event message type and any
|
|
* parameters returned.
|
|
***********************************************************/
|
|
typedef struct _ILEVENT_T ILEVENT_T;
|
|
|
|
|
|
|
|
struct _COMPONENT_T;
|
|
|
|
/**
|
|
* The <DFN>COMPONENT_T</DFN> structure represents an IL component,
|
|
* together with the necessary extra information required by the IL
|
|
* Client API. This structure stores the handle to the OMX component,
|
|
* as well as the event list containing all events sent by this
|
|
* component. The component state structure also holds a pair of
|
|
* buffer queues, for input and output buffers returned to the client
|
|
* by the <DFN>FillBufferDone</DFN> and <DFN>EmptyBufferDone</DFN>
|
|
* callbacks. As some operations result in error callbacks that can
|
|
* be ignored, an error mask is maintained to allow some errors to be
|
|
* ignored. A pointer to the client state structure is also added.
|
|
***********************************************************/
|
|
typedef struct _COMPONENT_T COMPONENT_T;
|
|
|
|
|
|
/**
|
|
* The generic callback function is used for communicating events from
|
|
* a particular component to the user.
|
|
*
|
|
* @param userdata The data returned from when the callback was registered.
|
|
*
|
|
* @param comp The component structure representing the component that
|
|
* originated this event.
|
|
*
|
|
* @param data The relevant data field from the event.
|
|
*
|
|
* @return Void.
|
|
***********************************************************/
|
|
typedef void (*ILCLIENT_CALLBACK_T)(void *userdata, COMPONENT_T *comp, OMX_U32 data);
|
|
|
|
|
|
/**
|
|
* The buffer callback function is used for indicating that a
|
|
* component has returned a buffer on a port using client buffer
|
|
* communication.
|
|
*
|
|
* @param data The data returned from when the callback was registered.
|
|
*
|
|
* @param comp The component from which the buffer originated.
|
|
*
|
|
* @return Void.
|
|
***********************************************************/
|
|
typedef void (*ILCLIENT_BUFFER_CALLBACK_T)(void *data, COMPONENT_T *comp);
|
|
|
|
|
|
/**
|
|
* The malloc function is passed into
|
|
* <DFN>ilclient_enable_port_buffers()</DFN> and used for allocating the
|
|
* buffer payload.
|
|
*
|
|
* @param userdata Private pointer passed into
|
|
* <DFN>ilclient_enable_port_buffers()</DFN> call.
|
|
*
|
|
* @param size Size in bytes of the requested memory region.
|
|
*
|
|
* @param align Alignment requirement in bytes for the base memory address.
|
|
*
|
|
* @param description Text description of the memory being allocated.
|
|
*
|
|
* @return The memory address on success, <DFN>NULL</DFN> on failure.
|
|
***********************************************************/
|
|
typedef void *(*ILCLIENT_MALLOC_T)(void *userdata, VCOS_UNSIGNED size, VCOS_UNSIGNED align, const char *description);
|
|
|
|
|
|
/**
|
|
* The free function is passed into
|
|
* <DFN>ilclient_enable_port_buffers()</DFN> and
|
|
* <DFN>ilclient_disable_port_buffers()</DFN> and used for freeing the
|
|
* buffer payload.
|
|
*
|
|
* @param userdata Private pointer passed into
|
|
* <DFN>ilclient_enable_port_buffers()</DFN> and
|
|
* <DFN>ilclient_disable_port_buffers()</DFN>.
|
|
*
|
|
* @param pointer Memory address to free, that was previously returned
|
|
* from <DFN>ILCLIENT_MALLOC_T</DFN> function.
|
|
*
|
|
* @return Void.
|
|
***********************************************************/
|
|
typedef void (*ILCLIENT_FREE_T)(void *userdata, void *pointer);
|
|
|
|
|
|
/**
|
|
* The event mask enumeration describes the possible events that the
|
|
* user can ask to wait for when waiting for a particular event.
|
|
***********************************************************/
|
|
typedef enum {
|
|
ILCLIENT_EMPTY_BUFFER_DONE = 0x1, /**< Set when a buffer is
|
|
returned from an input
|
|
port */
|
|
|
|
ILCLIENT_FILL_BUFFER_DONE = 0x2, /**< Set when a buffer is
|
|
returned from an output
|
|
port */
|
|
|
|
ILCLIENT_PORT_DISABLED = 0x4, /**< Set when a port indicates
|
|
it has completed a disable
|
|
command. */
|
|
|
|
ILCLIENT_PORT_ENABLED = 0x8, /**< Set when a port indicates
|
|
is has completed an enable
|
|
command. */
|
|
|
|
ILCLIENT_STATE_CHANGED = 0x10, /**< Set when a component
|
|
indicates it has completed
|
|
a state change command. */
|
|
|
|
ILCLIENT_BUFFER_FLAG_EOS = 0x20, /**< Set when a port signals
|
|
an EOS event. */
|
|
|
|
ILCLIENT_PARAMETER_CHANGED = 0x40, /**< Set when a port signals a
|
|
port settings changed
|
|
event. */
|
|
|
|
ILCLIENT_EVENT_ERROR = 0x80, /**< Set when a component
|
|
indicates an error. */
|
|
|
|
ILCLIENT_PORT_FLUSH = 0x100, /**< Set when a port indicates
|
|
is has completed a flush
|
|
command. */
|
|
|
|
ILCLIENT_MARKED_BUFFER = 0x200, /**< Set when a port indicates
|
|
it has marked a buffer. */
|
|
|
|
ILCLIENT_BUFFER_MARK = 0x400, /**< Set when a port indicates
|
|
it has received a buffer
|
|
mark. */
|
|
|
|
ILCLIENT_CONFIG_CHANGED = 0x800 /**< Set when a config parameter
|
|
changed. */
|
|
} ILEVENT_MASK_T;
|
|
|
|
|
|
/**
|
|
* On component creation the user can set flags to control the
|
|
* creation of that component.
|
|
***********************************************************/
|
|
typedef enum {
|
|
ILCLIENT_FLAGS_NONE = 0x0, /**< Used if no flags are
|
|
set. */
|
|
|
|
ILCLIENT_ENABLE_INPUT_BUFFERS = 0x1, /**< If set we allow the
|
|
client to communicate with
|
|
input ports via buffer
|
|
communication, rather than
|
|
tunneling with another
|
|
component. */
|
|
|
|
ILCLIENT_ENABLE_OUTPUT_BUFFERS = 0x2, /**< If set we allow the
|
|
client to communicate with
|
|
output ports via buffer
|
|
communication, rather than
|
|
tunneling with another
|
|
component. */
|
|
|
|
ILCLIENT_DISABLE_ALL_PORTS = 0x4, /**< If set we disable all
|
|
ports on creation. */
|
|
|
|
ILCLIENT_HOST_COMPONENT = 0x8, /**< Create a host component.
|
|
The default host ilcore
|
|
only can create host components
|
|
by being locally hosted
|
|
so should only be used for testing
|
|
purposes. */
|
|
|
|
ILCLIENT_OUTPUT_ZERO_BUFFERS = 0x10 /**< All output ports will have
|
|
nBufferCountActual set to zero,
|
|
if supported by the component. */
|
|
} ILCLIENT_CREATE_FLAGS_T;
|
|
|
|
|
|
/**
|
|
* \brief This structure represents a tunnel in the OpenMAX IL API.
|
|
*
|
|
* Some operations in this API act on a tunnel, so the tunnel state
|
|
* structure (<DFN>TUNNEL_T</DFN>) is a convenient store of the source and sink
|
|
* of the tunnel. For each, a pointer to the relevant component state
|
|
* structure and the port index is stored.
|
|
***********************************************************/
|
|
typedef struct {
|
|
COMPONENT_T *source; /**< The source component */
|
|
int source_port; /**< The output port index on the source component */
|
|
COMPONENT_T *sink; /**< The sink component */
|
|
int sink_port; /**< The input port index on the sink component */
|
|
} TUNNEL_T;
|
|
|
|
|
|
/**
|
|
* The <DFN>set_tunnel</DFN> macro is a useful function that initialises a
|
|
* <DFN>TUNNEL_T</DFN> structure.
|
|
***********************************************************/
|
|
#define set_tunnel(t,a,b,c,d) do {TUNNEL_T *_ilct = (t); \
|
|
_ilct->source = (a); _ilct->source_port = (b); \
|
|
_ilct->sink = (c); _ilct->sink_port = (d);} while(0)
|
|
|
|
/**
|
|
* For calling OpenMAX IL methods directory, we need to access the
|
|
* <DFN>OMX_HANDLETYPE</DFN> corresponding to the <DFN>COMPONENT_T</DFN> structure. This
|
|
* macro enables this while keeping the <DFN>COMPONENT_T</DFN> structure opaque.
|
|
* The parameter <DFN>x</DFN> should be of the type <DFN>*COMPONENT_T</DFN>.
|
|
***********************************************************/
|
|
#define ILC_GET_HANDLE(x) ilclient_get_handle(x)
|
|
|
|
/**
|
|
* An IL Client structure is created by the <DFN>ilclient_init()</DFN>
|
|
* method. This structure is used when creating components, but
|
|
* otherwise is not needed in other API functions as a pointer to this
|
|
* structure is maintained in the <DFN>COMPONENT_T</DFN> structure.
|
|
*
|
|
* @return pointer to client structure
|
|
***********************************************************/
|
|
VCHPRE_ ILCLIENT_T VCHPOST_ *ilclient_init(void);
|
|
|
|
/**
|
|
* When all components have been deleted, the IL Client structure can
|
|
* be destroyed by calling the <DFN>ilclient_destroy()</DFN> function.
|
|
*
|
|
* @param handle The client handle. After calling this function, this
|
|
* handle should not be used.
|
|
*
|
|
* @return void
|
|
***********************************************************/
|
|
VCHPRE_ void VCHPOST_ ilclient_destroy(ILCLIENT_T *handle);
|
|
|
|
/**
|
|
* The <DFN>ilclient_set_port_settings_callback()</DFN> function registers a
|
|
* callback to be used when the <DFN>OMX_EventPortSettingsChanged</DFN> event is
|
|
* received. When the event is received, a pointer to the component
|
|
* structure and port index is returned by the callback.
|
|
*
|
|
* @param handle The client handle
|
|
*
|
|
* @param func The callback function to use. Calling this function
|
|
* with a <DFN>NULL</DFN> function pointer will deregister any existing
|
|
* registered callback.
|
|
*
|
|
* @param userdata Data to be passed back when calling the callback
|
|
* function.
|
|
*
|
|
* @return void
|
|
***********************************************************/
|
|
VCHPRE_ void VCHPOST_ ilclient_set_port_settings_callback(ILCLIENT_T *handle,
|
|
ILCLIENT_CALLBACK_T func,
|
|
void *userdata);
|
|
|
|
/**
|
|
* The <DFN>ilclient_set_eos_callback()</DFN> function registers a callback to be
|
|
* used when the <DFN>OMX_EventBufferFlag</DFN> is received with the
|
|
* <DFN>OMX_BUFFERFLAG_EOS</DFN> flag set. When the event is received, a pointer
|
|
* to the component structure and port index is returned by the
|
|
* callback.
|
|
*
|
|
* @param handle The client handle
|
|
*
|
|
* @param func The callback function to use. Calling this function
|
|
* with a <DFN>NULL</DFN> function pointer will deregister any existing
|
|
* registered callback.
|
|
*
|
|
* @param userdata Data to be passed back when calling the callback
|
|
* function.
|
|
*
|
|
* @return void
|
|
***********************************************************/
|
|
VCHPRE_ void VCHPOST_ ilclient_set_eos_callback(ILCLIENT_T *handle,
|
|
ILCLIENT_CALLBACK_T func,
|
|
void *userdata);
|
|
|
|
/**
|
|
* The <DFN>ilclient_set_error_callback()</DFN> function registers a callback to be
|
|
* used when the <DFN>OMX_EventError</DFN> is received from a component. When
|
|
* the event is received, a pointer to the component structure and the
|
|
* error code are reported by the callback.
|
|
*
|
|
* @param handle The client handle
|
|
*
|
|
* @param func The callback function to use. Calling this function
|
|
* with a <DFN>NULL</DFN> function pointer will deregister any existing
|
|
* registered callback.
|
|
*
|
|
* @param userdata Data to be passed back when calling the callback
|
|
* function.
|
|
*
|
|
* @return void
|
|
***********************************************************/
|
|
VCHPRE_ void VCHPOST_ ilclient_set_error_callback(ILCLIENT_T *handle,
|
|
ILCLIENT_CALLBACK_T func,
|
|
void *userdata);
|
|
|
|
/**
|
|
* The <DFN>ilclient_set_configchanged_callback()</DFN> function
|
|
* registers a callback to be used when an
|
|
* <DFN>OMX_EventParamOrConfigChanged</DFN> event occurs. When the
|
|
* event is received, a pointer to the component structure and the
|
|
* index value that has changed are reported by the callback. The
|
|
* user may then use an <DFN>OMX_GetConfig</DFN> call with the index
|
|
* as specified to retrieve the updated information.
|
|
*
|
|
* @param handle The client handle
|
|
*
|
|
* @param func The callback function to use. Calling this function
|
|
* with a <DFN>NULL</DFN> function pointer will deregister any existing
|
|
* registered callback.
|
|
*
|
|
* @param userdata Data to be passed back when calling the callback
|
|
* function.
|
|
*
|
|
* @return void
|
|
***********************************************************/
|
|
VCHPRE_ void VCHPOST_ ilclient_set_configchanged_callback(ILCLIENT_T *handle,
|
|
ILCLIENT_CALLBACK_T func,
|
|
void *userdata);
|
|
|
|
|
|
/**
|
|
* The <DFN>ilclient_set_fill_buffer_done_callback()</DFN> function registers a
|
|
* callback to be used when a buffer passed to an output port using the
|
|
* <DFN>OMX_FillBuffer</DFN> call is returned with the <DFN>OMX_FillBufferDone</DFN>
|
|
* callback. When the event is received, a pointer to the component
|
|
* structure is returned by the callback. The user may then use the
|
|
* <DFN>ilclient_get_output_buffer()</DFN> function to retrieve the buffer.
|
|
*
|
|
* @param handle The client handle
|
|
*
|
|
* @param func The callback function to use. Calling this function
|
|
* with a <DFN>NULL</DFN> function pointer will deregister any existing
|
|
* registered callback.
|
|
*
|
|
* @param userdata Data to be passed back when calling the callback
|
|
* function.
|
|
*
|
|
* @return void
|
|
***********************************************************/
|
|
VCHPRE_ void VCHPOST_ ilclient_set_fill_buffer_done_callback(ILCLIENT_T *handle,
|
|
ILCLIENT_BUFFER_CALLBACK_T func,
|
|
void *userdata);
|
|
|
|
/**
|
|
* The <DFN>ilclient_set_empty_buffer_done_callback()</DFN> function registers a
|
|
* callback to be used when a buffer passed to an input port using the
|
|
* <DFN>OMX_EmptyBuffer</DFN> call is returned with the <DFN>OMX_EmptyBufferDone</DFN>
|
|
* callback. When the event is received, a pointer to the component
|
|
* structure is returned by the callback. The user may then use the
|
|
* <DFN>ilclient_get_input_buffer()</DFN> function to retrieve the buffer.
|
|
*
|
|
* @param handle The client handle
|
|
*
|
|
* @param func The callback function to use. Calling this function
|
|
* with a <DFN>NULL</DFN> function pointer will deregister any existing
|
|
* registered callback.
|
|
*
|
|
* @param userdata Data to be passed back when calling the callback
|
|
* function.
|
|
*
|
|
* @return void
|
|
***********************************************************/
|
|
VCHPRE_ void VCHPOST_ ilclient_set_empty_buffer_done_callback(ILCLIENT_T *handle,
|
|
ILCLIENT_BUFFER_CALLBACK_T func,
|
|
void *userdata);
|
|
|
|
|
|
/**
|
|
* Components are created using the <DFN>ilclient_create_component()</DFN>
|
|
* function.
|
|
*
|
|
* @param handle The client handle
|
|
*
|
|
* @param comp On successful creation, the component structure pointer
|
|
* will be written back into <DFN>comp</DFN>.
|
|
*
|
|
* @param name The name of the component to be created. Component
|
|
* names as provided are automatically prefixed with
|
|
* <DFN>"OMX.broadcom."</DFN> before passing to the IL core. The name
|
|
* provided will also be used in debugging messages added about this
|
|
* component.
|
|
*
|
|
* @param flags The client can specify some creation behaviour by using
|
|
* the <DFN>flags</DFN> field. The meaning of each flag is defined
|
|
* by the <DFN>ILCLIENT_CREATE_FLAGS_T</DFN> type.
|
|
*
|
|
* @return 0 on success, -1 on failure
|
|
***********************************************************/
|
|
VCHPRE_ int VCHPOST_ ilclient_create_component(ILCLIENT_T *handle,
|
|
COMPONENT_T **comp,
|
|
char *name,
|
|
ILCLIENT_CREATE_FLAGS_T flags);
|
|
|
|
/**
|
|
* The <DFN>ilclient_cleanup_components()</DFN> function deallocates all
|
|
* state associated with components and frees the OpenMAX component
|
|
* handles. All tunnels connecting components should have been torn
|
|
* down explicitly, and all components must be in loaded state.
|
|
*
|
|
* @param list A null-terminated list of component pointers to be
|
|
* deallocated.
|
|
*
|
|
* @return void
|
|
***********************************************************/
|
|
VCHPRE_ void VCHPOST_ ilclient_cleanup_components(COMPONENT_T *list[]);
|
|
|
|
|
|
/**
|
|
* The <DFN>ilclient_change_component_state()</DFN> function changes the
|
|
* state of an individual component. This will trigger the state
|
|
* change, and also wait for that state change to be completed. It
|
|
* should not be called if this state change has dependencies on other
|
|
* components also changing states. Trying to change a component to
|
|
* its current state is treated as success.
|
|
*
|
|
* @param comp The component to change.
|
|
*
|
|
* @param state The new state to transition to.
|
|
*
|
|
* @return 0 on success, -1 on failure.
|
|
***********************************************************/
|
|
VCHPRE_ int VCHPOST_ ilclient_change_component_state(COMPONENT_T *comp,
|
|
OMX_STATETYPE state);
|
|
|
|
|
|
/**
|
|
* The <DFN>ilclient_state_transition()</DFN> function transitions a set of
|
|
* components that need to perform a simultaneous state transition;
|
|
* for example, when two components are tunnelled and the buffer
|
|
* supplier port needs to allocate and pass buffers to a non-supplier
|
|
* port. All components are sent a command to change state, then the
|
|
* function will wait for all components to signal that they have
|
|
* changed state.
|
|
*
|
|
* @param list A null-terminated list of component pointers.
|
|
*
|
|
* @param state The new state to which to transition all components.
|
|
*
|
|
* @return void
|
|
***********************************************************/
|
|
VCHPRE_ void VCHPOST_ ilclient_state_transition(COMPONENT_T *list[],
|
|
OMX_STATETYPE state);
|
|
|
|
|
|
/**
|
|
* The <DFN>ilclient_disable_port()</DFN> function disables a port on a
|
|
* given component. This function sends the disable port message to
|
|
* the component and waits for the component to signal that this has
|
|
* taken place. If the port is already disabled, this is treated as a
|
|
* sucess.
|
|
*
|
|
* @param comp The component containing the port to disable.
|
|
*
|
|
* @param portIndex The port index of the port to disable. This must
|
|
* be a named port index, rather than a <DFN>OMX_ALL</DFN> value.
|
|
*
|
|
* @return void
|
|
***********************************************************/
|
|
VCHPRE_ void VCHPOST_ ilclient_disable_port(COMPONENT_T *comp,
|
|
int portIndex);
|
|
|
|
|
|
/**
|
|
* The <DFN>ilclient_enable_port()</DFN> function enables a port on a
|
|
* given component. This function sends the enable port message to
|
|
* the component and waits for the component to signal that this has
|
|
* taken place. If the port is already disabled, this is treated as a
|
|
* sucess.
|
|
*
|
|
* @param comp The component containing the port to enable.
|
|
*
|
|
* @param portIndex The port index of the port to enable. This must
|
|
* be a named port index, rather than a <DFN>OMX_ALL</DFN> value.
|
|
*
|
|
* @return void
|
|
***********************************************************/
|
|
VCHPRE_ void VCHPOST_ ilclient_enable_port(COMPONENT_T *comp,
|
|
int portIndex);
|
|
|
|
|
|
|
|
/**
|
|
* The <DFN>ilclient_enable_port_buffers()</DFN> function enables a port
|
|
* in base profile mode on a given component. The port is not
|
|
* tunneled, so requires buffers to be allocated.
|
|
*
|
|
* @param comp The component containing the port to enable.
|
|
*
|
|
* @param portIndex The port index of the port to enable. This must
|
|
* be a named port index, rather than a <DFN>OMX_ALL</DFN> value.
|
|
*
|
|
* @param ilclient_malloc This function will be used to allocate
|
|
* buffer payloads. If <DFN>NULL</DFN> then
|
|
* <DFN>vcos_malloc_aligned</DFN> will be used.
|
|
*
|
|
* @param ilclient_free If an error occurs, this function is used to
|
|
* free previously allocated payloads. If <DFN>NULL</DFN> then
|
|
* <DFN>vcos_free</DFN> will be used.
|
|
*
|
|
* @param userdata The first argument to calls to
|
|
* <DFN>ilclient_malloc</DFN> and <DFN>ilclient_free</DFN>, if these
|
|
* arguments are not <DFN>NULL</DFN>.
|
|
*
|
|
* @return 0 indicates success. -1 indicates failure.
|
|
***********************************************************/
|
|
VCHPRE_ int VCHPOST_ ilclient_enable_port_buffers(COMPONENT_T *comp,
|
|
int portIndex,
|
|
ILCLIENT_MALLOC_T ilclient_malloc,
|
|
ILCLIENT_FREE_T ilclient_free,
|
|
void *userdata);
|
|
|
|
|
|
/**
|
|
* The <DFN>ilclient_disable_port_buffers()</DFN> function disables a
|
|
* port in base profile mode on a given component. The port is not
|
|
* tunneled, and has been supplied with buffers by the client.
|
|
*
|
|
* @param comp The component containing the port to disable.
|
|
*
|
|
* @param portIndex The port index of the port to disable. This must
|
|
* be a named port index, rather than a <DFN>OMX_ALL</DFN> value.
|
|
*
|
|
* @param bufferList A list of buffers, using <DFN>pAppPrivate</DFN>
|
|
* as the next pointer that were allocated on this port, and currently
|
|
* held by the application. If buffers on this port are held by IL
|
|
* client or the component then these are automatically freed.
|
|
*
|
|
* @param ilclient_free This function is used to free the buffer payloads.
|
|
* If <DFN>NULL</DFN> then <DFN>vcos_free</DFN> will be used.
|
|
*
|
|
* @param userdata The first argument to calls to
|
|
* <DFN>ilclient_free</DFN>.
|
|
*
|
|
* @return void
|
|
*/
|
|
VCHPRE_ void VCHPOST_ ilclient_disable_port_buffers(COMPONENT_T *comp,
|
|
int portIndex,
|
|
OMX_BUFFERHEADERTYPE *bufferList,
|
|
ILCLIENT_FREE_T ilclient_free,
|
|
void *userdata);
|
|
|
|
|
|
/**
|
|
* With a populated tunnel structure, the
|
|
* <DFN>ilclient_setup_tunnel()</DFN> function connects the tunnel. It
|
|
* first transitions the source component to idle if currently in
|
|
* loaded state, and then optionally checks the source event list for
|
|
* a port settings changed event from the source port. If this event
|
|
* is not in the event queue then this function optionally waits for
|
|
* it to arrive. To disable this check for the port settings changed
|
|
* event, set <DFN>timeout</DFN> to zero.
|
|
*
|
|
* Both ports are then disabled, and the source port is inspected for
|
|
* a port streams parameter. If this is supported, then the
|
|
* <DFN>portStream</DFN> argument is used to select which port stream
|
|
* to use. The two ports are then tunnelled using the
|
|
* <DFN>OMX_SetupTunnel</DFN> function. If this is successful, then
|
|
* both ports are enabled. Note that for disabling and enabling the
|
|
* tunnelled ports, the functions <DFN>ilclient_disable_tunnel()</DFN>
|
|
* and <DFN>ilclient_enable_tunnel()</DFN> are used, so the relevant
|
|
* documentation for those functions applies here.
|
|
*
|
|
* @param tunnel The tunnel structure representing the tunnel to
|
|
* set up.
|
|
*
|
|
* @param portStream If port streams are supported on the output port
|
|
* of the tunnel, then this parameter indicates the port stream to
|
|
* select on this port.
|
|
*
|
|
* @param timeout The time duration in milliseconds to wait for the
|
|
* output port to signal a port settings changed event before
|
|
* returning a timeout failure. If this is 0, then we do not check
|
|
* for a port settings changed before setting up the tunnel.
|
|
*
|
|
* @return 0 indicates success, negative indicates failure:
|
|
* - -1: a timeout waiting for the parameter changed
|
|
* - -2: an error was returned instead of parameter changed
|
|
* - -3: no streams are available from this port
|
|
* - -4: requested stream is not available from this port
|
|
* - -5: the data format was not acceptable to the sink
|
|
***********************************************************/
|
|
VCHPRE_ int VCHPOST_ ilclient_setup_tunnel(TUNNEL_T *tunnel,
|
|
unsigned int portStream,
|
|
int timeout);
|
|
|
|
|
|
/**
|
|
* The <DFN>ilclient_disable_tunnel()</DFN> function disables both ports listed in
|
|
* the tunnel structure. It will send a port disable command to each
|
|
* port, then waits for both to indicate they have completed the
|
|
* transition. The errors <DFN>OMX_ErrorPortUnpopulated</DFN> and
|
|
* <DFN>OMX_ErrorSameState</DFN> are both ignored by this function; the former
|
|
* since the first port to disable may deallocate buffers before the
|
|
* second port has been disabled, leading to the second port reporting
|
|
* the unpopulated error.
|
|
*
|
|
* @param tunnel The tunnel to disable.
|
|
*
|
|
* @return void
|
|
***********************************************************/
|
|
VCHPRE_ void VCHPOST_ ilclient_disable_tunnel(TUNNEL_T *tunnel);
|
|
|
|
|
|
/**
|
|
* The <DFN>ilclient_enable_tunnel()</DFN> function enables both ports listed in
|
|
* the tunnel structure. It will first send a port enable command to
|
|
* each port. It then checks whether the sink component is not in
|
|
* loaded state - if so, the function waits for both ports to complete
|
|
* the requested port enable. If the sink component was in loaded
|
|
* state, then this component is transitioned to idle to allow the
|
|
* ports to exchange buffers and enable the ports. This is since
|
|
* typically this function is used when creating a tunnel between two
|
|
* components, where the source component is processing data to enable
|
|
* it to report the port settings changed event, and the sink port has
|
|
* yet to be used. Before transitioning the sink component to idle,
|
|
* this function waits for the sink port to be enabled - since the
|
|
* component is in loaded state, this will happen quickly. If the
|
|
* transition to idle fails, the sink component is transitioned back
|
|
* to loaded and the source port disabled. If the transition
|
|
* succeeds, the function then waits for the source port to complete
|
|
* the requested port enable.
|
|
*
|
|
* @param tunnel The tunnel to enable.
|
|
*
|
|
* @return 0 on success, -1 on failure.
|
|
***********************************************************/
|
|
VCHPRE_ int VCHPOST_ ilclient_enable_tunnel(TUNNEL_T *tunnel);
|
|
|
|
|
|
/**
|
|
* The <DFN>ilclient_flush_tunnels()</DFN> function will flush a number of tunnels
|
|
* from the list of tunnels presented. For each tunnel that is to be
|
|
* flushed, both source and sink ports are sent a flush command. The
|
|
* function then waits for both ports to report they have completed
|
|
* the flush operation.
|
|
*
|
|
* @param tunnel List of tunnels. The list must be terminated with a
|
|
* tunnel structure with <DFN>NULL</DFN> component entries.
|
|
*
|
|
* @param max The maximum number of tunnels to flush from the list.
|
|
* A value of 0 indicates that all tunnels in the list are flushed.
|
|
*
|
|
* @return void
|
|
***********************************************************/
|
|
VCHPRE_ void VCHPOST_ ilclient_flush_tunnels(TUNNEL_T *tunnel,
|
|
int max);
|
|
|
|
|
|
/**
|
|
* The <DFN>ilclient_teardown_tunnels()</DFN> function tears down all tunnels in
|
|
* the list of tunnels presented. For each tunnel in the list, the
|
|
* <DFN>OMX_SetupTunnel</DFN> is called on the source port and on the sink port,
|
|
* where for both calls the destination component is <DFN>NULL</DFN> and the
|
|
* destination port is zero. The VMCSX IL implementation requires
|
|
* that all tunnels are torn down in this manner before components are
|
|
* freed.
|
|
*
|
|
* @param tunnels List of tunnels to teardown. The list must be
|
|
* terminated with a tunnel structure with <DFN>NULL</DFN> component entries.
|
|
*
|
|
* @return void
|
|
***********************************************************/
|
|
VCHPRE_ void VCHPOST_ ilclient_teardown_tunnels(TUNNEL_T *tunnels);
|
|
|
|
|
|
/**
|
|
* The <DFN>ilclient_get_output_buffer()</DFN> function returns a buffer
|
|
* that was sent to an output port and that has been returned from a
|
|
* component using the <DFN>OMX_FillBufferDone</DFN> callback.
|
|
*
|
|
* @param comp The component that returned the buffer.
|
|
*
|
|
* @param portIndex The port index on the component that the buffer
|
|
* was returned from.
|
|
*
|
|
* @param block If non-zero, the function will block until a buffer is available.
|
|
*
|
|
* @return Pointer to buffer if available, otherwise <DFN>NULL</DFN>.
|
|
***********************************************************/
|
|
VCHPRE_ OMX_BUFFERHEADERTYPE* VCHPOST_ ilclient_get_output_buffer(COMPONENT_T *comp,
|
|
int portIndex,
|
|
int block);
|
|
|
|
|
|
/**
|
|
* The <DFN>ilclient_get_input_buffer()</DFN> function returns a buffer
|
|
* that was sent to an input port and that has been returned from a
|
|
* component using the <DFN>OMX_EmptyBufferDone</DFN> callback.
|
|
*
|
|
* @param comp The component that returned the buffer.
|
|
*
|
|
* @param portIndex The port index on the component from which the buffer
|
|
* was returned.
|
|
*
|
|
* @param block If non-zero, the function will block until a buffer is available.
|
|
*
|
|
* @return pointer to buffer if available, otherwise <DFN>NULL</DFN>
|
|
***********************************************************/
|
|
VCHPRE_ OMX_BUFFERHEADERTYPE* VCHPOST_ ilclient_get_input_buffer(COMPONENT_T *comp,
|
|
int portIndex,
|
|
int block);
|
|
|
|
|
|
/**
|
|
* The <DFN>ilclient_remove_event()</DFN> function queries the event list for the
|
|
* given component, matching against the given criteria. If a matching
|
|
* event is found, it is removed and added to the free event list.
|
|
*
|
|
* @param comp The component that returned the matching event.
|
|
*
|
|
* @param event The event type of the matching event.
|
|
*
|
|
* @param nData1 The <DFN>nData1</DFN> field of the matching event.
|
|
*
|
|
* @param ignore1 Whether to ignore the <DFN>nData1</DFN> field when finding a
|
|
* matching event. A value of 0 indicates that <DFN>nData1</DFN> must match, a
|
|
* value of 1 indicates that <DFN>nData1</DFN> does not have to match.
|
|
*
|
|
* @param nData2 The <DFN>nData2</DFN> field of the matching event.
|
|
*
|
|
* @param ignore2 Whether to ignore the <DFN>nData2</DFN> field when finding a
|
|
* matching event. A value of 0 indicates that <DFN>nData2</DFN> must match, a
|
|
* value of 1 indicates that <DFN>nData2</DFN> does not have to match.
|
|
*
|
|
* @return 0 if the event was removed. -1 if no matching event was
|
|
* found.
|
|
***********************************************************/
|
|
VCHPRE_ int VCHPOST_ ilclient_remove_event(COMPONENT_T *comp,
|
|
OMX_EVENTTYPE event,
|
|
OMX_U32 nData1,
|
|
int ignore1,
|
|
OMX_U32 nData2,
|
|
int ignore2);
|
|
|
|
|
|
/**
|
|
* The <DFN>ilclient_return_events()</DFN> function removes all events
|
|
* from a component event list and adds them to the IL client free
|
|
* event list. This function is automatically called when components
|
|
* are freed.
|
|
*
|
|
* @param comp The component from which all events should be moved to
|
|
* the free list.
|
|
*
|
|
* @return void
|
|
***********************************************************/
|
|
VCHPRE_ void VCHPOST_ ilclient_return_events(COMPONENT_T *comp);
|
|
|
|
|
|
/**
|
|
* The <DFN>ilclient_wait_for_event()</DFN> function is similar to
|
|
* <DFN>ilclient_remove_event()</DFN>, but allows the caller to block until that
|
|
* event arrives.
|
|
*
|
|
* @param comp The component that returned the matching event.
|
|
*
|
|
* @param event The event type of the matching event.
|
|
*
|
|
* @param nData1 The <DFN>nData1</DFN> field of the matching event.
|
|
*
|
|
* @param ignore1 Whether to ignore the <DFN>nData1</DFN> field when finding a
|
|
* matching event. A value of 0 indicates that <DFN>nData1</DFN> must match, a
|
|
* value of 1 indicates that <DFN>nData1</DFN> does not have to match.
|
|
*
|
|
* @param nData2 The <DFN>nData2</DFN> field of the matching event.
|
|
*
|
|
* @param ignore2 Whether to ignore the <DFN>nData2</DFN> field when finding a
|
|
* matching event. A value of 0 indicates that <DFN>nData2</DFN> must match, a
|
|
* value of 1 indicates that <DFN>nData2</DFN> does not have to match.
|
|
*
|
|
* @param event_flag Specifies a bitfield of IL client events to wait
|
|
* for, given in <DFN>ILEVENT_MASK_T</DFN>. If any of these events
|
|
* are signalled by the component, the event list is then re-checked
|
|
* for a matching event. If the <DFN>ILCLIENT_EVENT_ERROR</DFN> bit
|
|
* is included, and an error is signalled by the component, then the
|
|
* function will return an error code. If the
|
|
* <DFN>ILCLIENT_CONFIG_CHANGED</DFN> bit is included, and this bit is
|
|
* signalled by the component, then the function will return an error
|
|
* code.
|
|
*
|
|
* @param timeout Specifies how long to block for in milliseconds
|
|
* before returning a failure.
|
|
*
|
|
* @return 0 indicates success, a matching event has been removed from
|
|
* the component's event queue. A negative return indicates failure,
|
|
* in this case no events have been removed from the component's event
|
|
* queue.
|
|
* - -1: a timeout was received.
|
|
* - -2: an error event was received.
|
|
* - -3: a config changed event was received.
|
|
***********************************************************/
|
|
VCHPRE_ int VCHPOST_ ilclient_wait_for_event(COMPONENT_T *comp,
|
|
OMX_EVENTTYPE event,
|
|
OMX_U32 nData1,
|
|
int ignore1,
|
|
OMX_U32 nData2,
|
|
int ignore2,
|
|
int event_flag,
|
|
int timeout);
|
|
|
|
|
|
/**
|
|
* The <DFN>ilclient_wait_for_command_complete()</DFN> function waits
|
|
* for a message from a component that indicates that the command
|
|
* has completed. This is either a command success message, or an
|
|
* error message that signals the completion of an event.
|
|
*
|
|
* @param comp The component currently processing a command.
|
|
*
|
|
* @param command The command being processed. This must be either
|
|
* <DFN>OMX_CommandStateSet</DFN>, <DFN>OMX_CommandPortDisable</DFN>
|
|
* or <DFN>OMX_CommandPortEnable</DFN>.
|
|
*
|
|
* @param nData2 The expected value of <DFN>nData2</DFN> in the
|
|
* command complete message.
|
|
*
|
|
* @return 0 indicates success, either the command successfully completed
|
|
* or the <DFN>OMX_ErrorSameState</DFN> was returned. -1 indicates
|
|
* that the command terminated with a different error message.
|
|
***********************************************************/
|
|
VCHPRE_ int VCHPOST_ ilclient_wait_for_command_complete(COMPONENT_T *comp,
|
|
OMX_COMMANDTYPE command,
|
|
OMX_U32 nData2);
|
|
|
|
|
|
/**
|
|
* The <DFN>ilclient_wait_for_command_complete_dual()</DFN> function
|
|
* is similar to <DFN>ilclient_wait_for_command_complete()</DFN>. The
|
|
* difference is that while waiting for the component to complete the
|
|
* event or raise an error, we can also report if another reports an
|
|
* error that terminates a command. This is useful if the two
|
|
* components are tunneled, and we need to wait for one component to
|
|
* enable a port, or change state to <DFN>OMX_StateIdle</DFN>. If the
|
|
* other component is the buffer supplier and reports an error, then
|
|
* it will not allocate buffers, so our first component may stall.
|
|
*
|
|
* @param comp The component currently processing a command.
|
|
*
|
|
* @param command The command being processed. This must be either
|
|
* <DFN>OMX_CommandStateSet</DFN>, <DFN>OMX_CommandPortDisable</DFN>
|
|
* or <DFN>OMX_CommandPortEnable</DFN>.
|
|
*
|
|
* @param nData2 The expected value of <DFN>nData2</DFN> in the
|
|
* command complete message.
|
|
*
|
|
* @param related Another component, where we will return if this
|
|
* component raises an error that terminates a command.
|
|
*
|
|
* @return 0 indicates success, either the command successfully
|
|
* completed or the <DFN>OMX_ErrorSameState</DFN> was returned. -1
|
|
* indicates that the command terminated with a different error
|
|
* message. -2 indicates that the related component raised an error.
|
|
* In this case, the error is not cleared from the related
|
|
* component's event list.
|
|
***********************************************************/
|
|
VCHPRE_ int VCHPOST_ ilclient_wait_for_command_complete_dual(COMPONENT_T *comp,
|
|
OMX_COMMANDTYPE command,
|
|
OMX_U32 nData2,
|
|
COMPONENT_T *related);
|
|
|
|
|
|
/**
|
|
* The <DFN>ilclient_debug_output()</DFN> function adds a message to a
|
|
* host-specific debug display. For a local VideoCore host the message is
|
|
* added to the internal message log. For a Win32 host the message is
|
|
* printed to the debug display. This function should be customised
|
|
* when IL client is ported to another platform.
|
|
*
|
|
* @param format A message to add, together with the variable
|
|
* argument list similar to <DFN>printf</DFN> and other standard C functions.
|
|
*
|
|
* @return void
|
|
***********************************************************/
|
|
VCHPRE_ void VCHPOST_ ilclient_debug_output(char *format, ...);
|
|
|
|
/**
|
|
* The <DFN>ilclient_get_handle()</DFN> function returns the
|
|
* underlying OMX component held by an IL component handle. This is
|
|
* needed when calling methods such as <DFN>OMX_SetParameter</DFN> on
|
|
* a component created using the IL client library.
|
|
*
|
|
* @param comp IL component handle
|
|
*
|
|
* @return The <DFN>OMX_HANDLETYPE</DFN> value for the component.
|
|
***********************************************************/
|
|
VCHPRE_ OMX_HANDLETYPE VCHPOST_ ilclient_get_handle(COMPONENT_T *comp);
|
|
|
|
|
|
#ifndef OMX_SKIP64BIT
|
|
|
|
/**
|
|
* Macro to return <DFN>OMX_TICKS</DFN> from a signed 64 bit value.
|
|
* This is the version where <DFN>OMX_TICKS</DFN> is a signed 64 bit
|
|
* value, an alternative definition is used when <DFN>OMX_TICKS</DFN>
|
|
* is a structure.
|
|
*/
|
|
#define ilclient_ticks_from_s64(s) (s)
|
|
|
|
/**
|
|
* Macro to return signed 64 bit value from <DFN>OMX_TICKS</DFN>.
|
|
* This is the version where <DFN>OMX_TICKS</DFN> is a signed 64 bit
|
|
* value, an alternative definition is used when <DFN>OMX_TICKS</DFN>
|
|
* is a structure.
|
|
*/
|
|
#define ilclient_ticks_to_s64(t) (t)
|
|
|
|
#else
|
|
|
|
/**
|
|
* Inline function to return <DFN>OMX_TICKS</DFN> from a signed 64 bit
|
|
* value. This is the version where <DFN>OMX_TICKS</DFN> is a
|
|
* structure, an alternative definition is used when
|
|
* <DFN>OMX_TICKS</DFN> is a signed 64 bit value.
|
|
*/
|
|
static inline OMX_TICKS ilclient_ticks_from_s64(int64_t s) {
|
|
OMX_TICKS ret;
|
|
ret.nLowPart = s;
|
|
ret.nHighPart = s>>32;
|
|
return ret;
|
|
}
|
|
|
|
/**
|
|
* Inline function to return signed 64 bit value from
|
|
* <DFN>OMX_TICKS</DFN>. This is the version where
|
|
* <DFN>OMX_TICKS</DFN> is a structure, an alternative definition is
|
|
* used when <DFN>OMX_TICKS</DFN> is a signed 64 bit value.
|
|
*/
|
|
static inline int64_t ilclient_ticks_to_s64(OMX_TICKS t) {
|
|
uint64_t u = t.nLowPart | ((uint64_t)t.nHighPart << 32);
|
|
return u;
|
|
}
|
|
|
|
|
|
#endif /* OMX_SKIP64BIT */
|
|
|
|
/**
|
|
* The <DFN>ilclient_get_port_index()</DFN> function returns the n'th
|
|
* port index of the specified type and direction for the given
|
|
* component.
|
|
*
|
|
* @param comp The component of interest
|
|
* @param dir The direction
|
|
* @param type The type, or -1 for any type.
|
|
* @param index Which port (counting from 0).
|
|
*
|
|
* @return The port index, or -1 if not found.
|
|
***********************************************************/
|
|
VCHPRE_ int VCHPOST_ ilclient_get_port_index(COMPONENT_T *comp,
|
|
OMX_DIRTYPE dir,
|
|
OMX_PORTDOMAINTYPE type,
|
|
int index);
|
|
|
|
|
|
/**
|
|
* The <DFN>ilclient_suggest_bufsize()</DFN> function gives a
|
|
* component a hint about the size of buffer it should use. This size
|
|
* is set on the component by setting the
|
|
* <DFN>OMX_IndexParamBrcmOutputBufferSize</DFN> index on the given
|
|
* component.
|
|
*
|
|
* @param comp IL component handle
|
|
* @param nBufSizeHint Size of buffer in bytes
|
|
*
|
|
* @return 0 indicates success, -1 indicates failure.
|
|
***********************************************************/
|
|
VCHPRE_ int VCHPOST_ ilclient_suggest_bufsize(COMPONENT_T *comp,
|
|
OMX_U32 nBufSizeHint);
|
|
|
|
|
|
/**
|
|
* The <DFN>ilclient_stack_size()</DFN> function suggests a minimum
|
|
* stack size that tasks calling into with API will require.
|
|
*
|
|
* @return Suggested stack size in bytes.
|
|
***********************************************************/
|
|
VCHPRE_ unsigned int VCHPOST_ ilclient_stack_size(void);
|
|
|
|
#endif /* ILCLIENT_H */
|