2 * Copyright (C) 2006-2007 Texas Instruments, Incorporated
3 * Copyright (C) 2007-2009 Nokia Corporation.
5 * Author: Felipe Contreras <felipe.contreras@nokia.com>
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation
10 * version 2.1 of the License.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
28 #include <OMX_Component.h>
30 #include <async_queue.h>
35 typedef struct GOmxCore GOmxCore;
36 typedef struct GOmxPort GOmxPort;
37 typedef struct GOmxImp GOmxImp;
38 typedef struct GOmxSymbolTable GOmxSymbolTable;
39 typedef enum GOmxPortType GOmxPortType;
40 /* MODIFICATION: omx vender */
41 typedef enum GOmxVendor GOmxVendor;
43 typedef void (*GOmxCb) (GOmxCore * core);
44 typedef void (*GOmxPortCb) (GOmxPort * port);
46 /* MODIFICATION: ignore init fail when going to stop. for S.LSI case.*/
47 #define OMX_ErrorMFCInit 0x90000004
48 #define OMX_UNRECOVERABLE_ERROR_MAX_COUNT 10
58 /* Add_component_vendor */
68 struct GOmxSymbolTable
70 OMX_ERRORTYPE (*init) (void);
71 OMX_ERRORTYPE (*deinit) (void);
72 OMX_ERRORTYPE (*get_handle) (OMX_HANDLETYPE * handle,
73 OMX_STRING name, OMX_PTR data, OMX_CALLBACKTYPE * callbacks);
74 OMX_ERRORTYPE (*free_handle) (OMX_HANDLETYPE handle);
81 GOmxSymbolTable sym_table;
87 gpointer object; /**< GStreamer element. */
89 OMX_HANDLETYPE omx_handle;
90 OMX_ERRORTYPE omx_error;
92 OMX_STATETYPE omx_state;
93 GCond *omx_state_condition;
94 GMutex *omx_state_mutex;
102 GOmxCb settings_changed_cb;
108 gchar *component_name;
109 gchar *component_role;
110 /* MODIFICATION: omx vender */
111 GOmxVendor component_vendor;
113 gint omx_unrecover_err_cnt;
124 OMX_BUFFERHEADERTYPE **buffers;
128 gboolean omx_allocate; /**< Setup with OMX_AllocateBuffer rather than OMX_UseBuffer */
131 gboolean shared_buffer; /* Modification */
136 void g_omx_init (void);
137 void g_omx_deinit (void);
139 GOmxCore *g_omx_core_new (void *object);
140 void g_omx_core_free (GOmxCore * core);
141 void g_omx_core_init (GOmxCore * core);
142 void g_omx_core_prepare (GOmxCore * core);
143 void g_omx_core_start (GOmxCore * core);
144 void g_omx_core_pause (GOmxCore * core);
145 void g_omx_core_stop (GOmxCore * core);
146 void g_omx_core_unload (GOmxCore * core);
147 void g_omx_core_set_done (GOmxCore * core);
148 void g_omx_core_wait_for_done (GOmxCore * core);
149 void g_omx_core_flush_start (GOmxCore * core);
150 void g_omx_core_flush_stop (GOmxCore * core);
151 GOmxPort *g_omx_core_new_port (GOmxCore * core, guint index);
153 GOmxPort *g_omx_port_new (GOmxCore * core, guint index);
154 void g_omx_port_free (GOmxPort * port);
155 void g_omx_port_setup (GOmxPort * port);
156 void g_omx_port_push_buffer (GOmxPort * port,
157 OMX_BUFFERHEADERTYPE * omx_buffer);
158 OMX_BUFFERHEADERTYPE *g_omx_port_request_buffer (GOmxPort * port);
159 void g_omx_port_release_buffer (GOmxPort * port,
160 OMX_BUFFERHEADERTYPE * omx_buffer);
161 void g_omx_port_resume (GOmxPort * port);
162 void g_omx_port_pause (GOmxPort * port);
163 void g_omx_port_flush (GOmxPort * port);
164 void g_omx_port_enable (GOmxPort * port);
165 void g_omx_port_disable (GOmxPort * port);
166 void g_omx_port_finish (GOmxPort * port);
171 * Basically like GST_BOILERPLATE / GST_BOILERPLATE_FULL, but follows the
172 * init fxn naming conventions used by gst-openmax. It expects the following
173 * functions to be defined in the same src file following this macro
175 * <li> type_base_init(gpointer g_class)
176 * <li> type_class_init(gpointer g_class, gpointer class_data)
177 * <li> type_instance_init(GTypeInstance *instance, gpointer g_class)
180 #define GSTOMX_BOILERPLATE_FULL(type, type_as_function, parent_type, parent_type_macro, additional_initializations) \
181 static void type_base_init (gpointer g_class); \
182 static void type_class_init (gpointer g_class, gpointer class_data); \
183 static void type_instance_init (GTypeInstance *instance, gpointer g_class); \
184 static parent_type ## Class *parent_class; \
185 static void type_class_init_trampoline (gpointer g_class, gpointer class_data)\
187 parent_class = g_type_class_ref (parent_type_macro); \
188 type_class_init (g_class, class_data); \
190 GType type_as_function ## _get_type (void) \
192 /* The typedef for GType may be gulong or gsize, depending on the \
193 * system and whether the compiler is c++ or not. The g_once_init_* \
194 * functions always take a gsize * though ... */ \
195 static volatile gsize gonce_data = 0; \
196 if (g_once_init_enter (&gonce_data)) { \
198 GTypeInfo *type_info; \
199 type_info = g_new0 (GTypeInfo, 1); \
200 type_info->class_size = sizeof (type ## Class); \
201 type_info->base_init = type_base_init; \
202 type_info->class_init = type_class_init_trampoline; \
203 type_info->instance_size = sizeof (type); \
204 type_info->instance_init = type_instance_init; \
205 _type = g_type_register_static (parent_type_macro, #type, type_info, 0);\
206 g_free (type_info); \
207 additional_initializations (_type); \
208 g_once_init_leave (&gonce_data, (gsize) _type); \
210 return (GType) gonce_data; \
213 #define GSTOMX_BOILERPLATE(type,type_as_function,parent_type,parent_type_macro) \
214 GSTOMX_BOILERPLATE_FULL (type, type_as_function, parent_type, parent_type_macro, \
217 #include <string.h> /* for memset */
218 #define G_OMX_INIT_PARAM(param) G_STMT_START { \
219 memset (&(param), 0, sizeof ((param))); \
220 (param).nSize = sizeof (param); \
221 (param).nVersion.s.nVersionMajor = 1; \
222 (param).nVersion.s.nVersionMinor = 1; \
226 #endif /* GSTOMX_UTIL_H */