Remove core_finish, use core_unload
[gstreamer-omap:gst-openmax.git] / omx / gstomx_util.h
1 /*
2  * Copyright (C) 2006-2007 Texas Instruments, Incorporated
3  * Copyright (C) 2007-2009 Nokia Corporation.
4  *
5  * Author: Felipe Contreras <felipe.contreras@nokia.com>
6  *
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.
11  *
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.
16  *
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
20  *
21  */
22
23 #ifndef GSTOMX_UTIL_H
24 #define GSTOMX_UTIL_H
25
26 #include <glib.h>
27 #include <OMX_Core.h>
28 #include <OMX_Component.h>
29
30 #include <async_queue.h>
31 #include <sem.h>
32
33 /* Typedefs. */
34
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
41 typedef void (*GOmxCb) (GOmxCore *core);
42 typedef void (*GOmxPortCb) (GOmxPort *port);
43
44 /* Enums. */
45
46 enum GOmxPortType
47 {
48     GOMX_PORT_INPUT,
49     GOMX_PORT_OUTPUT
50 };
51
52 /* Structures. */
53
54 struct GOmxSymbolTable
55 {
56     OMX_ERRORTYPE (*init) (void);
57     OMX_ERRORTYPE (*deinit) (void);
58     OMX_ERRORTYPE (*get_handle) (OMX_HANDLETYPE *handle,
59                                  OMX_STRING name,
60                                  OMX_PTR data,
61                                  OMX_CALLBACKTYPE *callbacks);
62     OMX_ERRORTYPE (*free_handle) (OMX_HANDLETYPE handle);
63 };
64
65 struct GOmxImp
66 {
67     guint client_count;
68     void *dl_handle;
69     GOmxSymbolTable sym_table;
70     GMutex *mutex;
71 };
72
73 struct GOmxCore
74 {
75     gpointer object; /**< GStreamer element. */
76
77     OMX_HANDLETYPE omx_handle;
78     OMX_ERRORTYPE omx_error;
79
80     OMX_STATETYPE omx_state;
81     GCond *omx_state_condition;
82     GMutex *omx_state_mutex;
83
84     GPtrArray *ports;
85
86     GSem *done_sem;
87     GSem *flush_sem;
88     GSem *port_sem;
89
90     GOmxCb settings_changed_cb;
91     GOmxImp *imp;
92
93     gboolean done;
94 };
95
96 struct GOmxPort
97 {
98     GOmxCore *core;
99     GOmxPortType type;
100
101     guint num_buffers;
102     gulong buffer_size;
103     guint port_index;
104     OMX_BUFFERHEADERTYPE **buffers;
105
106     GMutex *mutex;
107     gboolean enabled;
108     gboolean omx_allocate; /**< Setup with OMX_AllocateBuffer rather than OMX_UseBuffer */
109     AsyncQueue *queue;
110 };
111
112 /* Functions. */
113
114 void g_omx_init (void);
115 void g_omx_deinit (void);
116
117 GOmxCore *g_omx_core_new (void);
118 void g_omx_core_free (GOmxCore *core);
119 void g_omx_core_init (GOmxCore *core, const gchar *library_name, const gchar *component_name);
120 void g_omx_core_deinit (GOmxCore *core);
121 void g_omx_core_prepare (GOmxCore *core);
122 void g_omx_core_start (GOmxCore *core);
123 void g_omx_core_pause (GOmxCore *core);
124 void g_omx_core_stop (GOmxCore *core);
125 void g_omx_core_unload (GOmxCore *core);
126 void g_omx_core_set_done (GOmxCore *core);
127 void g_omx_core_wait_for_done (GOmxCore *core);
128 void g_omx_core_flush_start (GOmxCore *core);
129 void g_omx_core_flush_stop (GOmxCore *core);
130 GOmxPort *g_omx_core_setup_port (GOmxCore *core, OMX_PARAM_PORTDEFINITIONTYPE *omx_port);
131
132 GOmxPort *g_omx_port_new (GOmxCore *core);
133 void g_omx_port_free (GOmxPort *port);
134 void g_omx_port_setup (GOmxPort *port, OMX_PARAM_PORTDEFINITIONTYPE *omx_port);
135 void g_omx_port_push_buffer (GOmxPort *port, OMX_BUFFERHEADERTYPE *omx_buffer);
136 OMX_BUFFERHEADERTYPE *g_omx_port_request_buffer (GOmxPort *port);
137 void g_omx_port_release_buffer (GOmxPort *port, OMX_BUFFERHEADERTYPE *omx_buffer);
138 void g_omx_port_resume (GOmxPort *port);
139 void g_omx_port_pause (GOmxPort *port);
140 void g_omx_port_flush (GOmxPort *port);
141 void g_omx_port_enable (GOmxPort *port);
142 void g_omx_port_disable (GOmxPort *port);
143 void g_omx_port_finish (GOmxPort *port);
144
145 #endif /* GSTOMX_UTIL_H */