1 | /* GStreamer Navigation |
2 | * Copyright (C) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net> |
3 | * Copyright (C) 2003 David A. Schleef <ds@schleef.org> |
4 | * |
5 | * navigation.h: navigation interface design |
6 | * |
7 | * This library is free software; you can redistribute it and/or |
8 | * modify it under the terms of the GNU Library General Public |
9 | * License as published by the Free Software Foundation; either |
10 | * version 2 of the License, or (at your option) any later version. |
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 | * Library General Public License for more details. |
16 | * |
17 | * You should have received a copy of the GNU Library General Public |
18 | * License along with this library; if not, write to the |
19 | * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, |
20 | * Boston, MA 02110-1301, USA. |
21 | */ |
22 | |
23 | #ifndef __GST_NAVIGATION_H__ |
24 | #define __GST_NAVIGATION_H__ |
25 | |
26 | #include <gst/gst.h> |
27 | #include <gst/video/video-prelude.h> |
28 | |
29 | G_BEGIN_DECLS |
30 | |
31 | #define GST_TYPE_NAVIGATION \ |
32 | (gst_navigation_get_type ()) |
33 | #define GST_NAVIGATION(obj) \ |
34 | (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_NAVIGATION, GstNavigation)) |
35 | #define GST_IS_NAVIGATION(obj) \ |
36 | (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_NAVIGATION)) |
37 | #define GST_NAVIGATION_GET_INTERFACE(obj) \ |
38 | (G_TYPE_INSTANCE_GET_INTERFACE ((obj), GST_TYPE_NAVIGATION, GstNavigationInterface)) |
39 | |
40 | typedef struct _GstNavigation GstNavigation; |
41 | typedef struct _GstNavigationInterface GstNavigationInterface; |
42 | |
43 | /** |
44 | * GstNavigationInterface: |
45 | * @iface: the parent interface |
46 | * @send_event: sending a navigation event |
47 | * |
48 | * Navigation interface. |
49 | */ |
50 | struct _GstNavigationInterface { |
51 | GTypeInterface iface; |
52 | |
53 | /* virtual functions */ |
54 | void (*send_event) (GstNavigation *navigation, GstStructure *structure); |
55 | }; |
56 | |
57 | GST_VIDEO_API |
58 | GType gst_navigation_get_type (void); |
59 | |
60 | /* Navigation commands */ |
61 | |
62 | /** |
63 | * GstNavigationCommand: |
64 | * @GST_NAVIGATION_COMMAND_INVALID: An invalid command entry |
65 | * @GST_NAVIGATION_COMMAND_MENU1: Execute navigation menu command 1. For DVD, |
66 | * this enters the DVD root menu, or exits back to the title from the menu. |
67 | * @GST_NAVIGATION_COMMAND_MENU2: Execute navigation menu command 2. For DVD, |
68 | * this jumps to the DVD title menu. |
69 | * @GST_NAVIGATION_COMMAND_MENU3: Execute navigation menu command 3. For DVD, |
70 | * this jumps into the DVD root menu. |
71 | * @GST_NAVIGATION_COMMAND_MENU4: Execute navigation menu command 4. For DVD, |
72 | * this jumps to the Subpicture menu. |
73 | * @GST_NAVIGATION_COMMAND_MENU5: Execute navigation menu command 5. For DVD, |
74 | * the jumps to the audio menu. |
75 | * @GST_NAVIGATION_COMMAND_MENU6: Execute navigation menu command 6. For DVD, |
76 | * this jumps to the angles menu. |
77 | * @GST_NAVIGATION_COMMAND_MENU7: Execute navigation menu command 7. For DVD, |
78 | * this jumps to the chapter menu. |
79 | * @GST_NAVIGATION_COMMAND_LEFT: Select the next button to the left in a menu, |
80 | * if such a button exists. |
81 | * @GST_NAVIGATION_COMMAND_RIGHT: Select the next button to the right in a menu, |
82 | * if such a button exists. |
83 | * @GST_NAVIGATION_COMMAND_UP: Select the button above the current one in a |
84 | * menu, if such a button exists. |
85 | * @GST_NAVIGATION_COMMAND_DOWN: Select the button below the current one in a |
86 | * menu, if such a button exists. |
87 | * @GST_NAVIGATION_COMMAND_ACTIVATE: Activate (click) the currently selected |
88 | * button in a menu, if such a button exists. |
89 | * @GST_NAVIGATION_COMMAND_PREV_ANGLE: Switch to the previous angle in a |
90 | * multiangle feature. |
91 | * @GST_NAVIGATION_COMMAND_NEXT_ANGLE: Switch to the next angle in a multiangle |
92 | * feature. |
93 | * |
94 | * A set of commands that may be issued to an element providing the |
95 | * #GstNavigation interface. The available commands can be queried via |
96 | * the gst_navigation_query_new_commands() query. |
97 | * |
98 | * For convenience in handling DVD navigation, the MENU commands are aliased as: |
99 | * GST_NAVIGATION_COMMAND_DVD_MENU = @GST_NAVIGATION_COMMAND_MENU1 |
100 | * GST_NAVIGATION_COMMAND_DVD_TITLE_MENU = @GST_NAVIGATION_COMMAND_MENU2 |
101 | * GST_NAVIGATION_COMMAND_DVD_ROOT_MENU = @GST_NAVIGATION_COMMAND_MENU3 |
102 | * GST_NAVIGATION_COMMAND_DVD_SUBPICTURE_MENU = @GST_NAVIGATION_COMMAND_MENU4 |
103 | * GST_NAVIGATION_COMMAND_DVD_AUDIO_MENU = @GST_NAVIGATION_COMMAND_MENU5 |
104 | * GST_NAVIGATION_COMMAND_DVD_ANGLE_MENU = @GST_NAVIGATION_COMMAND_MENU6 |
105 | * GST_NAVIGATION_COMMAND_DVD_CHAPTER_MENU = @GST_NAVIGATION_COMMAND_MENU7 |
106 | */ |
107 | typedef enum { |
108 | GST_NAVIGATION_COMMAND_INVALID = 0, |
109 | |
110 | GST_NAVIGATION_COMMAND_MENU1 = 1, |
111 | GST_NAVIGATION_COMMAND_MENU2 = 2, |
112 | GST_NAVIGATION_COMMAND_MENU3 = 3, |
113 | GST_NAVIGATION_COMMAND_MENU4 = 4, |
114 | GST_NAVIGATION_COMMAND_MENU5 = 5, |
115 | GST_NAVIGATION_COMMAND_MENU6 = 6, |
116 | GST_NAVIGATION_COMMAND_MENU7 = 7, |
117 | |
118 | GST_NAVIGATION_COMMAND_LEFT = 20, |
119 | GST_NAVIGATION_COMMAND_RIGHT = 21, |
120 | GST_NAVIGATION_COMMAND_UP = 22, |
121 | GST_NAVIGATION_COMMAND_DOWN = 23, |
122 | GST_NAVIGATION_COMMAND_ACTIVATE = 24, |
123 | |
124 | GST_NAVIGATION_COMMAND_PREV_ANGLE = 30, |
125 | GST_NAVIGATION_COMMAND_NEXT_ANGLE = 31 |
126 | } GstNavigationCommand; |
127 | |
128 | /* Some aliases for the menu command types */ |
129 | #define GST_NAVIGATION_COMMAND_DVD_MENU GST_NAVIGATION_COMMAND_MENU1 |
130 | #define GST_NAVIGATION_COMMAND_DVD_TITLE_MENU GST_NAVIGATION_COMMAND_MENU2 |
131 | #define GST_NAVIGATION_COMMAND_DVD_ROOT_MENU GST_NAVIGATION_COMMAND_MENU3 |
132 | #define GST_NAVIGATION_COMMAND_DVD_SUBPICTURE_MENU GST_NAVIGATION_COMMAND_MENU4 |
133 | #define GST_NAVIGATION_COMMAND_DVD_AUDIO_MENU GST_NAVIGATION_COMMAND_MENU5 |
134 | #define GST_NAVIGATION_COMMAND_DVD_ANGLE_MENU GST_NAVIGATION_COMMAND_MENU6 |
135 | #define GST_NAVIGATION_COMMAND_DVD_CHAPTER_MENU GST_NAVIGATION_COMMAND_MENU7 |
136 | |
137 | /* Queries */ |
138 | /** |
139 | * GstNavigationQueryType: |
140 | * @GST_NAVIGATION_QUERY_INVALID: invalid query |
141 | * @GST_NAVIGATION_QUERY_COMMANDS: command query |
142 | * @GST_NAVIGATION_QUERY_ANGLES: viewing angle query |
143 | * |
144 | * Types of navigation interface queries. |
145 | */ |
146 | typedef enum |
147 | { |
148 | GST_NAVIGATION_QUERY_INVALID = 0, |
149 | GST_NAVIGATION_QUERY_COMMANDS = 1, |
150 | GST_NAVIGATION_QUERY_ANGLES = 2 |
151 | } GstNavigationQueryType; |
152 | |
153 | GST_VIDEO_API |
154 | GstNavigationQueryType gst_navigation_query_get_type (GstQuery *query); |
155 | |
156 | GST_VIDEO_API |
157 | GstQuery * gst_navigation_query_new_commands (void); |
158 | |
159 | GST_VIDEO_API |
160 | void gst_navigation_query_set_commands (GstQuery *query, gint n_cmds, ...); |
161 | |
162 | GST_VIDEO_API |
163 | void gst_navigation_query_set_commandsv (GstQuery *query, gint n_cmds, |
164 | GstNavigationCommand *cmds); |
165 | |
166 | GST_VIDEO_API |
167 | gboolean gst_navigation_query_parse_commands_length (GstQuery *query, |
168 | guint *n_cmds); |
169 | |
170 | GST_VIDEO_API |
171 | gboolean gst_navigation_query_parse_commands_nth (GstQuery *query, guint nth, |
172 | GstNavigationCommand *cmd); |
173 | |
174 | GST_VIDEO_API |
175 | GstQuery * gst_navigation_query_new_angles (void); |
176 | |
177 | GST_VIDEO_API |
178 | void gst_navigation_query_set_angles (GstQuery *query, guint cur_angle, |
179 | guint n_angles); |
180 | |
181 | GST_VIDEO_API |
182 | gboolean gst_navigation_query_parse_angles (GstQuery *query, guint *cur_angle, |
183 | guint *n_angles); |
184 | |
185 | /* Element messages */ |
186 | /** |
187 | * GstNavigationMessageType: |
188 | * @GST_NAVIGATION_MESSAGE_INVALID: Returned from |
189 | * gst_navigation_message_get_type() when the passed message is not a |
190 | * navigation message. |
191 | * @GST_NAVIGATION_MESSAGE_MOUSE_OVER: Sent when the mouse moves over or leaves a |
192 | * clickable region of the output, such as a DVD menu button. |
193 | * @GST_NAVIGATION_MESSAGE_COMMANDS_CHANGED: Sent when the set of available commands |
194 | * changes and should re-queried by interested applications. |
195 | * @GST_NAVIGATION_MESSAGE_ANGLES_CHANGED: Sent when display angles in a multi-angle |
196 | * feature (such as a multiangle DVD) change - either angles have appeared or |
197 | * disappeared. |
198 | * @GST_NAVIGATION_MESSAGE_EVENT: Sent when a navigation event was not handled |
199 | * by any element in the pipeline (Since: 1.6) |
200 | * |
201 | * A set of notifications that may be received on the bus when navigation |
202 | * related status changes. |
203 | */ |
204 | typedef enum { |
205 | GST_NAVIGATION_MESSAGE_INVALID, |
206 | GST_NAVIGATION_MESSAGE_MOUSE_OVER, |
207 | GST_NAVIGATION_MESSAGE_COMMANDS_CHANGED, |
208 | GST_NAVIGATION_MESSAGE_ANGLES_CHANGED, |
209 | GST_NAVIGATION_MESSAGE_EVENT |
210 | } GstNavigationMessageType; |
211 | |
212 | GST_VIDEO_API |
213 | GstNavigationMessageType gst_navigation_message_get_type (GstMessage *message); |
214 | |
215 | GST_VIDEO_API |
216 | GstMessage * gst_navigation_message_new_mouse_over (GstObject *src, |
217 | gboolean active); |
218 | |
219 | GST_VIDEO_API |
220 | gboolean gst_navigation_message_parse_mouse_over (GstMessage *message, |
221 | gboolean *active); |
222 | |
223 | GST_VIDEO_API |
224 | GstMessage * gst_navigation_message_new_commands_changed (GstObject *src); |
225 | |
226 | GST_VIDEO_API |
227 | GstMessage * gst_navigation_message_new_angles_changed (GstObject *src, |
228 | guint cur_angle, |
229 | guint n_angles); |
230 | |
231 | GST_VIDEO_API |
232 | gboolean gst_navigation_message_parse_angles_changed (GstMessage *message, |
233 | guint *cur_angle, |
234 | guint *n_angles); |
235 | |
236 | GST_VIDEO_API |
237 | GstMessage * gst_navigation_message_new_event (GstObject *src, |
238 | GstEvent *event); |
239 | |
240 | GST_VIDEO_API |
241 | gboolean gst_navigation_message_parse_event (GstMessage *message, |
242 | GstEvent ** event); |
243 | /* event parsing functions */ |
244 | /** |
245 | * GstNavigationEventType: |
246 | * @GST_NAVIGATION_EVENT_INVALID: Returned from |
247 | * gst_navigation_event_get_type() when the passed event is not a navigation event. |
248 | * @GST_NAVIGATION_EVENT_KEY_PRESS: A key press event. Use |
249 | * gst_navigation_event_parse_key_event() to extract the details from the event. |
250 | * @GST_NAVIGATION_EVENT_KEY_RELEASE: A key release event. Use |
251 | * gst_navigation_event_parse_key_event() to extract the details from the event. |
252 | * @GST_NAVIGATION_EVENT_MOUSE_BUTTON_PRESS: A mouse button press event. Use |
253 | * gst_navigation_event_parse_mouse_button_event() to extract the details from the |
254 | * event. |
255 | * @GST_NAVIGATION_EVENT_MOUSE_BUTTON_RELEASE: A mouse button release event. Use |
256 | * gst_navigation_event_parse_mouse_button_event() to extract the details from the |
257 | * event. |
258 | * @GST_NAVIGATION_EVENT_MOUSE_MOVE: A mouse movement event. Use |
259 | * gst_navigation_event_parse_mouse_move_event() to extract the details from the |
260 | * event. |
261 | * @GST_NAVIGATION_EVENT_COMMAND: A navigation command event. Use |
262 | * gst_navigation_event_parse_command() to extract the details from the event. |
263 | * @GST_NAVIGATION_EVENT_MOUSE_SCROLL: A mouse scroll event. Use |
264 | * gst_navigation_event_parse_mouse_scroll_event() to extract the details from |
265 | * the event. (Since: 1.18) |
266 | * |
267 | * Enum values for the various events that an element implementing the |
268 | * GstNavigation interface might send up the pipeline. |
269 | */ |
270 | typedef enum { |
271 | GST_NAVIGATION_EVENT_INVALID = 0, |
272 | GST_NAVIGATION_EVENT_KEY_PRESS = 1, |
273 | GST_NAVIGATION_EVENT_KEY_RELEASE = 2, |
274 | GST_NAVIGATION_EVENT_MOUSE_BUTTON_PRESS = 3, |
275 | GST_NAVIGATION_EVENT_MOUSE_BUTTON_RELEASE = 4, |
276 | GST_NAVIGATION_EVENT_MOUSE_MOVE = 5, |
277 | GST_NAVIGATION_EVENT_COMMAND = 6, |
278 | |
279 | /** |
280 | * GST_NAVIGATION_EVENT_MOUSE_SCROLL: |
281 | * |
282 | * A mouse scroll event. Use gst_navigation_event_parse_mouse_scroll_event() |
283 | * to extract the details from the event. |
284 | * |
285 | * Since: 1.18 |
286 | */ |
287 | GST_NAVIGATION_EVENT_MOUSE_SCROLL = 7 |
288 | } GstNavigationEventType; |
289 | |
290 | GST_VIDEO_API |
291 | GstNavigationEventType gst_navigation_event_get_type (GstEvent *event); |
292 | |
293 | GST_VIDEO_API |
294 | gboolean gst_navigation_event_parse_key_event (GstEvent *event, |
295 | const gchar **key); |
296 | |
297 | GST_VIDEO_API |
298 | gboolean gst_navigation_event_parse_mouse_button_event (GstEvent *event, |
299 | gint *button, gdouble *x, gdouble *y); |
300 | |
301 | GST_VIDEO_API |
302 | gboolean gst_navigation_event_parse_mouse_move_event (GstEvent *event, |
303 | gdouble *x, gdouble *y); |
304 | |
305 | GST_VIDEO_API |
306 | gboolean gst_navigation_event_parse_mouse_scroll_event (GstEvent *event, |
307 | gdouble *x, gdouble *y, |
308 | gdouble *delta_x, gdouble *delta_y); |
309 | |
310 | GST_VIDEO_API |
311 | gboolean gst_navigation_event_parse_command (GstEvent *event, |
312 | GstNavigationCommand *command); |
313 | |
314 | /* interface virtual function wrappers */ |
315 | |
316 | GST_VIDEO_API |
317 | void gst_navigation_send_event (GstNavigation *navigation, |
318 | GstStructure *structure); |
319 | |
320 | GST_VIDEO_API |
321 | void gst_navigation_send_key_event (GstNavigation *navigation, |
322 | const char *event, const char *key); |
323 | |
324 | GST_VIDEO_API |
325 | void gst_navigation_send_mouse_event (GstNavigation *navigation, |
326 | const char *event, int button, double x, double y); |
327 | |
328 | GST_VIDEO_API |
329 | void gst_navigation_send_mouse_scroll_event (GstNavigation *navigation, |
330 | double x, double y, double delta_x, double delta_y); |
331 | |
332 | GST_VIDEO_API |
333 | void gst_navigation_send_command (GstNavigation *navigation, |
334 | GstNavigationCommand command); |
335 | |
336 | G_END_DECLS |
337 | |
338 | #endif /* __GST_NAVIGATION_H__ */ |
339 | |