static void nav_send_event (GstNavigation * navigation, GstStructure * structure) { GstEvent *event = gst_event_new_navigation (structure); GstNavigationEventType etype = gst_navigation_event_get_type (event); TestElement *self = (TestElement *) (navigation); fail_if (etype == GST_NAVIGATION_EVENT_INVALID, "Received navigation event could not be parsed"); fail_unless (etype == self->sent_type, "Received navigation event did not match sent"); switch (etype) { case GST_NAVIGATION_EVENT_KEY_PRESS: case GST_NAVIGATION_EVENT_KEY_RELEASE:{ const gchar *key; fail_unless (gst_navigation_event_parse_key_event (event, &key)); fail_unless (strcmp (key, self->sent_key) == 0); break; } case GST_NAVIGATION_EVENT_MOUSE_BUTTON_PRESS: case GST_NAVIGATION_EVENT_MOUSE_BUTTON_RELEASE:{ gint button; gdouble x, y; fail_unless (gst_navigation_event_parse_mouse_button_event (event, &button, &x, &y)); fail_unless (button == self->sent_button); fail_unless (x == self->sent_x); fail_unless (y == self->sent_y); break; } case GST_NAVIGATION_EVENT_MOUSE_MOVE:{ gdouble x, y; fail_unless (gst_navigation_event_parse_mouse_move_event (event, &x, &y)); fail_unless (x == self->sent_x); fail_unless (y == self->sent_y); break; } case GST_NAVIGATION_EVENT_COMMAND:{ GstNavigationCommand cmd; fail_unless (gst_navigation_event_parse_command (event, &cmd)); fail_unless (cmd == self->sent_command); } default: break; } gst_event_unref (event); }
/** * gst_navigation_event_parse_key_event: * @event: A #GstEvent to inspect. * @key: A pointer to a location to receive the string identifying the key * press. The returned string is owned by the event, and valid only until the * event is unreffed. * * Since: 0.10.23 */ gboolean gst_navigation_event_parse_key_event (GstEvent * event, const gchar ** key) { GstNavigationEventType e_type; const GstStructure *s; e_type = gst_navigation_event_get_type (event); g_return_val_if_fail (e_type == GST_NAVIGATION_EVENT_KEY_PRESS || e_type == GST_NAVIGATION_EVENT_KEY_RELEASE, FALSE); if (key) { s = gst_event_get_structure (event); *key = gst_structure_get_string (s, "key"); if (*key == NULL) return FALSE; } return TRUE; }
void gst_3d_scene_navigation_event (Gst3DScene * self, GstEvent * event) { gst_3d_camera_navigation_event (self->camera, event); GstNavigationEventType event_type = gst_navigation_event_get_type (event); switch (event_type) { case GST_NAVIGATION_EVENT_KEY_PRESS:{ GstStructure *structure = (GstStructure *) gst_event_get_structure (event); const gchar *key = gst_structure_get_string (structure, "key"); if (key != NULL && g_strcmp0 (key, "Tab") == 0) gst_3d_scene_toggle_wireframe_mode (self); break; } default: break; } }
EXPORT_C #endif gboolean gst_navigation_event_parse_mouse_button_event (GstEvent * event, gint * button, gdouble * x, gdouble * y) { GstNavigationEventType e_type; const GstStructure *s; e_type = gst_navigation_event_get_type (event); g_return_val_if_fail (e_type == GST_NAVIGATION_EVENT_MOUSE_BUTTON_PRESS || e_type == GST_NAVIGATION_EVENT_MOUSE_BUTTON_RELEASE, FALSE); s = gst_event_get_structure (event); if (x) g_return_val_if_fail (gst_structure_get_double (s, "pointer_x", x), FALSE); if (y) g_return_val_if_fail (gst_structure_get_double (s, "pointer_y", y), FALSE); if (button) g_return_val_if_fail (gst_structure_get_int (s, "button", button), FALSE); return TRUE; }
/** * gst_navigation_event_parse_mouse_button_event: * @event: A #GstEvent to inspect. * @button: Pointer to a gint that will receive the button number associated * with the event. * @x: Pointer to a gdouble to receive the x coordinate of the mouse button * event. * @y: Pointer to a gdouble to receive the y coordinate of the mouse button * event. * * Retrieve the details of either a #GstNavigation mouse button press event or * a mouse button release event. Determine which type the event is using * gst_navigation_event_get_type() to retrieve the #GstNavigationEventType. * * Returns: TRUE if the button number and both coordinates could be extracted, * otherwise FALSE. * * Since: 0.10.23 */ gboolean gst_navigation_event_parse_mouse_button_event (GstEvent * event, gint * button, gdouble * x, gdouble * y) { GstNavigationEventType e_type; const GstStructure *s; gboolean ret = TRUE; e_type = gst_navigation_event_get_type (event); g_return_val_if_fail (e_type == GST_NAVIGATION_EVENT_MOUSE_BUTTON_PRESS || e_type == GST_NAVIGATION_EVENT_MOUSE_BUTTON_RELEASE, FALSE); s = gst_event_get_structure (event); if (x) ret &= gst_structure_get_double (s, "pointer_x", x); if (y) ret &= gst_structure_get_double (s, "pointer_y", y); if (button) ret &= gst_structure_get_int (s, "button", button); WARN_IF_FAIL (ret, "Couldn't extract details from mouse button event"); return ret; }
static gboolean play_bus_msg (GstBus * bus, GstMessage * msg, gpointer user_data) { GstPlay *play = user_data; switch (GST_MESSAGE_TYPE (msg)) { case GST_MESSAGE_ASYNC_DONE: /* dump graph on preroll */ GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS (GST_BIN (play->playbin), GST_DEBUG_GRAPH_SHOW_ALL, "gst-play.async-done"); g_print ("Prerolled.\r"); if (play->missing != NULL && play_install_missing_plugins (play)) { g_print ("New plugins installed, trying again...\n"); --play->cur_idx; play_next (play); } break; case GST_MESSAGE_BUFFERING:{ gint percent; if (!play->buffering) g_print ("\n"); gst_message_parse_buffering (msg, &percent); g_print ("%s %d%% \r", _("Buffering..."), percent); if (percent == 100) { /* a 100% message means buffering is done */ if (play->buffering) { play->buffering = FALSE; /* no state management needed for live pipelines */ if (!play->is_live) gst_element_set_state (play->playbin, play->desired_state); } } else { /* buffering... */ if (!play->buffering) { if (!play->is_live) gst_element_set_state (play->playbin, GST_STATE_PAUSED); play->buffering = TRUE; } } break; } case GST_MESSAGE_CLOCK_LOST:{ g_print (_("Clock lost, selecting a new one\n")); gst_element_set_state (play->playbin, GST_STATE_PAUSED); gst_element_set_state (play->playbin, GST_STATE_PLAYING); break; } case GST_MESSAGE_LATENCY: g_print ("Redistribute latency...\n"); gst_bin_recalculate_latency (GST_BIN (play->playbin)); break; case GST_MESSAGE_REQUEST_STATE:{ GstState state; gchar *name; name = gst_object_get_path_string (GST_MESSAGE_SRC (msg)); gst_message_parse_request_state (msg, &state); g_print ("Setting state to %s as requested by %s...\n", gst_element_state_get_name (state), name); gst_element_set_state (play->playbin, state); g_free (name); break; } case GST_MESSAGE_EOS: /* print final position at end */ play_timeout (play); g_print ("\n"); /* and switch to next item in list */ if (!play_next (play)) { g_print ("%s\n", _("Reached end of play list.")); g_main_loop_quit (play->loop); } break; case GST_MESSAGE_WARNING:{ GError *err; gchar *dbg = NULL; /* dump graph on warning */ GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS (GST_BIN (play->playbin), GST_DEBUG_GRAPH_SHOW_ALL, "gst-play.warning"); gst_message_parse_warning (msg, &err, &dbg); g_printerr ("WARNING %s\n", err->message); if (dbg != NULL) g_printerr ("WARNING debug information: %s\n", dbg); g_clear_error (&err); g_free (dbg); break; } case GST_MESSAGE_ERROR:{ GError *err; gchar *dbg; /* dump graph on error */ GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS (GST_BIN (play->playbin), GST_DEBUG_GRAPH_SHOW_ALL, "gst-play.error"); gst_message_parse_error (msg, &err, &dbg); g_printerr ("ERROR %s for %s\n", err->message, play->uris[play->cur_idx]); if (dbg != NULL) g_printerr ("ERROR debug information: %s\n", dbg); g_clear_error (&err); g_free (dbg); /* flush any other error messages from the bus and clean up */ gst_element_set_state (play->playbin, GST_STATE_NULL); if (play->missing != NULL && play_install_missing_plugins (play)) { g_print ("New plugins installed, trying again...\n"); --play->cur_idx; play_next (play); break; } /* try next item in list then */ if (!play_next (play)) { g_print ("%s\n", _("Reached end of play list.")); g_main_loop_quit (play->loop); } break; } case GST_MESSAGE_ELEMENT: { GstNavigationMessageType mtype = gst_navigation_message_get_type (msg); if (mtype == GST_NAVIGATION_MESSAGE_EVENT) { GstEvent *ev = NULL; if (gst_navigation_message_parse_event (msg, &ev)) { GstNavigationEventType e_type = gst_navigation_event_get_type (ev); switch (e_type) { case GST_NAVIGATION_EVENT_KEY_PRESS: { const gchar *key; if (gst_navigation_event_parse_key_event (ev, &key)) { GST_INFO ("Key press: %s", key); if (strcmp (key, "Left") == 0) key = GST_PLAY_KB_ARROW_LEFT; else if (strcmp (key, "Right") == 0) key = GST_PLAY_KB_ARROW_RIGHT; else if (strcmp (key, "Up") == 0) key = GST_PLAY_KB_ARROW_UP; else if (strcmp (key, "Down") == 0) key = GST_PLAY_KB_ARROW_DOWN; else if (strcmp (key, "space") == 0) key = " "; else if (strlen (key) > 1) break; keyboard_cb (key, user_data); } break; } case GST_NAVIGATION_EVENT_MOUSE_BUTTON_PRESS: { gint button; if (gst_navigation_event_parse_mouse_button_event (ev, &button, NULL, NULL)) { if (button == 4) { /* wheel up */ relative_seek (play, +0.08); } else if (button == 5) { /* wheel down */ relative_seek (play, -0.01); } } break; } default: break; } } if (ev) gst_event_unref (ev); } break; } default: if (gst_is_missing_plugin_message (msg)) { gchar *desc; desc = gst_missing_plugin_message_get_description (msg); g_print ("Missing plugin: %s\n", desc); g_free (desc); play->missing = g_list_append (play->missing, gst_message_ref (msg)); } break; } return TRUE; }
static gboolean master_bus_msg (GstBus * bus, GstMessage * msg, gpointer data) { GstPipeline *pipeline = data; switch (GST_MESSAGE_TYPE (msg)) { case GST_MESSAGE_ERROR:{ GError *err; gchar *dbg; gst_message_parse_error (msg, &err, &dbg); g_printerr ("MASTER: ERROR: %s\n", err->message); if (dbg != NULL) g_printerr ("MASTER: ERROR debug information: %s\n", dbg); g_error_free (err); g_free (dbg); GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS (GST_BIN (pipeline), GST_DEBUG_GRAPH_SHOW_ALL, "ipc.master.error"); g_main_loop_quit (loop); break; } case GST_MESSAGE_WARNING:{ GError *err; gchar *dbg; gst_message_parse_warning (msg, &err, &dbg); g_printerr ("MASTER: WARNING: %s\n", err->message); if (dbg != NULL) g_printerr ("MASTER: WARNING debug information: %s\n", dbg); g_error_free (err); g_free (dbg); GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS (GST_BIN (pipeline), GST_DEBUG_GRAPH_SHOW_ALL, "ipc.master.warning"); break; } case GST_MESSAGE_ASYNC_DONE: GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS (GST_BIN (pipeline), GST_DEBUG_GRAPH_SHOW_ALL, "ipc.master.async-done"); break; case GST_MESSAGE_EOS: g_print ("EOS on master\n"); gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_NULL); g_main_loop_quit (loop); break; case GST_MESSAGE_BUFFERING:{ gint percent; GstBufferingMode bufmode; if (!buffering) g_print ("\n"); gst_message_parse_buffering (msg, &percent); g_print ("%s %d%% \r", "Buffering...", percent); gst_message_parse_buffering_stats (msg, &bufmode, NULL, NULL, NULL); /* no state management needed for live pipelines */ if (bufmode != GST_BUFFERING_LIVE) { if (percent == 100) { /* a 100% message means buffering is done */ if (buffering) { buffering = FALSE; gst_element_set_state (GST_ELEMENT (pipeline), desired_state); g_print ("\n%s\n", gst_element_state_get_name (desired_state)); } } else { /* buffering... */ if (!buffering) { gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PAUSED); buffering = TRUE; } } } break; } case GST_MESSAGE_CLOCK_LOST:{ g_print ("Clock lost, selecting a new one\n"); gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PAUSED); gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING); break; } case GST_MESSAGE_LATENCY: { gst_bin_recalculate_latency (GST_BIN (pipeline)); break; } case GST_MESSAGE_REQUEST_STATE:{ GstState state; gchar *name; name = gst_object_get_path_string (GST_MESSAGE_SRC (msg)); gst_message_parse_request_state (msg, &state); GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS (GST_BIN (pipeline), GST_DEBUG_GRAPH_SHOW_VERBOSE, "ipc.slave.reqstate"); g_print ("Setting state to %s as requested by %s...\n", gst_element_state_get_name (state), name); gst_element_set_state (GST_ELEMENT (pipeline), state); g_free (name); break; } case GST_MESSAGE_ELEMENT: { GstNavigationMessageType mtype = gst_navigation_message_get_type (msg); if (mtype == GST_NAVIGATION_MESSAGE_EVENT) { GstEvent *ev = NULL; if (gst_navigation_message_parse_event (msg, &ev)) { GstNavigationEventType e_type = gst_navigation_event_get_type (ev); switch (e_type) { case GST_NAVIGATION_EVENT_KEY_PRESS: { const gchar *key; if (gst_navigation_event_parse_key_event (ev, &key)) { GST_INFO ("Key press: %s", key); if (strcmp (key, "Left") == 0) key = GST_PLAY_KB_ARROW_LEFT; else if (strcmp (key, "Right") == 0) key = GST_PLAY_KB_ARROW_RIGHT; else if (strcmp (key, "Up") == 0) key = GST_PLAY_KB_ARROW_UP; else if (strcmp (key, "Down") == 0) key = GST_PLAY_KB_ARROW_DOWN; else if (strcmp (key, "space") == 0) key = " "; else if (strlen (key) > 1) break; keyboard_cb (key, GST_ELEMENT (pipeline)); } break; } case GST_NAVIGATION_EVENT_MOUSE_BUTTON_PRESS: { gint button; if (gst_navigation_event_parse_mouse_button_event (ev, &button, NULL, NULL)) { if (button == 4) { /* wheel up */ relative_seek (GST_ELEMENT (pipeline), +0.08); } else if (button == 5) { /* wheel down */ relative_seek (GST_ELEMENT (pipeline), -0.01); } } break; } default: break; } } if (ev) gst_event_unref (ev); } break; } default: break; } return TRUE; }
MbEvent * handle_navigation_message (GstMessage *message) { MbEvent *mb_event = NULL; GstNavigationMessageType nav_msg_type; nav_msg_type = gst_navigation_message_get_type (message); switch (nav_msg_type) { case GST_NAVIGATION_MESSAGE_EVENT: { GstEvent *event; GstNavigationEventType nav_evt_type; gst_navigation_message_parse_event (message, &event); nav_evt_type = gst_navigation_event_get_type (event); switch (nav_evt_type) { case GST_NAVIGATION_EVENT_MOUSE_BUTTON_PRESS: case GST_NAVIGATION_EVENT_MOUSE_BUTTON_RELEASE: { int button; double x, y; gst_navigation_event_parse_mouse_button_event (event, &button, &x, &y); mb_event = create_mouse_button_event ( nav_evt_type == GST_NAVIGATION_EVENT_MOUSE_BUTTON_PRESS ? MB_MOUSE_BUTTON_PRESS : MB_MOUSE_BUTTON_RELEASE, button, (int)x, (int) y); if (button == MB_MOUSE_LEFT_BUTTON && mb_event->type == MB_MOUSE_BUTTON_PRESS) { MbMedia *selected_media = compute_media_selection(x, y); if (selected_media != NULL) { MbEvent *selection_event = create_media_selection_event (MB_MEDIA_SELECTION, selected_media->name); notify_handler (selection_event); free (selection_event); } } break; } case GST_NAVIGATION_EVENT_MOUSE_MOVE: { double x, y; if (gst_navigation_event_parse_mouse_move_event (event, &x, &y)) mb_event = create_mouse_move_event (MB_MOUSE_MOVE, (int)x, (int) y); break; } case GST_NAVIGATION_EVENT_KEY_PRESS: case GST_NAVIGATION_EVENT_KEY_RELEASE: { const char *key; if (gst_navigation_event_parse_key_event (event, &key)) mb_event = create_keyboard_event ( nav_evt_type == GST_NAVIGATION_EVENT_KEY_PRESS ? MB_KEY_PRESS : MB_KEY_RELEASE, key); } default: break; } gst_event_unref (event); break; } default: break; } return mb_event; }