static GstPadProbeReturn event_probe (GstPad * pad, GstPadProbeInfo * info, gpointer udata) { GstPadProbeReturn ret = GST_PAD_PROBE_OK; GstEvent *event = GST_PAD_PROBE_INFO_DATA (info); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_STREAM_START:{ guint group_id; g_mutex_lock (&test_mutex); fail_unless (gst_event_parse_group_id (event, &group_id)); if (have_group_id) { if (group_id_pre != group_id) { event = gst_event_copy (event); gst_event_set_group_id (event, group_id_pre); gst_event_replace ((GstEvent **) & info->data, event); gst_event_unref (event); } } else { group_id_pre = group_id; have_group_id = TRUE; } g_mutex_unlock (&test_mutex); break; } default: break; } return ret; }
/* The nav event handler handles nav events, but still forwards them, so you * should be able to even use puzzle while navigating a dvd menu. We return * TRUE of course even when noone downstream handles the event. */ static gboolean nav_event_handler (GstPad * pad, GstEvent * event) { GstPuzzle *puzzle; GstVideofilter *filter; const gchar *type; gboolean result = FALSE; gdouble x, y; gint xpos = 0, ypos = 0; puzzle = GST_PUZZLE (gst_pad_get_parent (pad)); filter = GST_VIDEOFILTER (puzzle); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_NAVIGATION: /* translate the event */ if (gst_structure_get_double (event->event_data.structure.structure, "pointer_x", &x) && gst_structure_get_double (event->event_data.structure.structure, "pointer_y", &y)) { gint width, height; width = gst_videofilter_get_input_width (filter); height = gst_videofilter_get_input_height (filter); width = (width / puzzle->columns) & ~3; height = (height / puzzle->rows) & ~3; xpos = (int) x / width; ypos = (int) y / height; if (xpos >= 0 && xpos < puzzle->columns && ypos >= 0 && ypos < puzzle->rows) { GstEvent *copy; guint lookup; lookup = puzzle->permutation[ypos * puzzle->columns + xpos]; GST_DEBUG_OBJECT (puzzle, "translated %dx%d (%gx%g) to %dx%d (%gx%g)", xpos, ypos, x, y, lookup % puzzle->columns, lookup / puzzle->columns, x + ((gint) (lookup % puzzle->columns) - xpos) * width, y + ((gint) (lookup / puzzle->columns) - ypos) * height); x += ((gint) (lookup % puzzle->columns) - xpos) * width; y += ((gint) (lookup / puzzle->columns) - ypos) * height; copy = gst_event_copy (event); gst_structure_set (copy->event_data.structure.structure, "pointer_x", G_TYPE_DOUBLE, x, "pointer_y", G_TYPE_DOUBLE, y, NULL); gst_event_unref (event); event = copy; } } /* handle the event. NOTE: it has already been translated! */ type = gst_structure_get_string (event->event_data.structure.structure, "event"); if (g_str_equal (type, "key-press")) { const gchar *key = gst_structure_get_string (event->event_data.structure.structure, "key"); if (g_str_equal (key, "space")) { if (gst_puzzle_is_solved (puzzle)) { gst_puzzle_shuffle (puzzle); } else { gst_puzzle_solve (puzzle); } } else { if (puzzle->solved) break; if (g_str_equal (key, "Left")) { gst_puzzle_move (puzzle, DIR_LEFT); } else if (g_str_equal (key, "Right")) { gst_puzzle_move (puzzle, DIR_RIGHT); } else if (g_str_equal (key, "Up")) { gst_puzzle_move (puzzle, DIR_UP); } else if (g_str_equal (key, "Down")) { gst_puzzle_move (puzzle, DIR_DOWN); } } puzzle->solved = gst_puzzle_is_solved (puzzle); } else if (g_str_equal (type, "mouse-button-press")) { gint button; if (gst_structure_get_int (event->event_data.structure.structure, "button", &button)) { if (button == 1) { if (xpos >= 0 && xpos < puzzle->columns && ypos >= 0 && ypos < puzzle->rows && !puzzle->solved) { gst_puzzle_swap (puzzle, ypos * puzzle->columns + xpos); puzzle->solved = gst_puzzle_is_solved (puzzle); } } else if (button == 2) { if (puzzle->solved) { gst_puzzle_shuffle (puzzle); } else { gst_puzzle_solve (puzzle); } puzzle->solved = gst_puzzle_is_solved (puzzle); } } } /* FIXME: only return TRUE for events we handle? */ result = TRUE; break; default: break; } return gst_pad_event_default (pad, event) || result; }
static gboolean gst_base_video_encoder_sink_eventfunc (GstBaseVideoEncoder * base_video_encoder, GstEvent * event) { GstBaseVideoEncoderClass *base_video_encoder_class; gboolean ret = FALSE; base_video_encoder_class = GST_BASE_VIDEO_ENCODER_GET_CLASS (base_video_encoder); switch (GST_EVENT_TYPE (event)) { case GST_EVENT_EOS: { GstFlowReturn flow_ret; GST_BASE_VIDEO_CODEC_STREAM_LOCK (base_video_encoder); base_video_encoder->a.at_eos = TRUE; if (base_video_encoder_class->finish) { flow_ret = base_video_encoder_class->finish (base_video_encoder); } else { flow_ret = GST_FLOW_OK; } ret = (flow_ret == GST_BASE_VIDEO_ENCODER_FLOW_DROPPED); GST_BASE_VIDEO_CODEC_STREAM_UNLOCK (base_video_encoder); break; } case GST_EVENT_NEWSEGMENT: { gboolean update; double rate; double applied_rate; GstFormat format; gint64 start; gint64 stop; gint64 position; GST_BASE_VIDEO_CODEC_STREAM_LOCK (base_video_encoder); gst_event_parse_new_segment_full (event, &update, &rate, &applied_rate, &format, &start, &stop, &position); GST_DEBUG_OBJECT (base_video_encoder, "newseg rate %g, applied rate %g, " "format %d, start = %" GST_TIME_FORMAT ", stop = %" GST_TIME_FORMAT ", pos = %" GST_TIME_FORMAT, rate, applied_rate, format, GST_TIME_ARGS (start), GST_TIME_ARGS (stop), GST_TIME_ARGS (position)); if (format != GST_FORMAT_TIME) { GST_DEBUG_OBJECT (base_video_encoder, "received non TIME newsegment"); GST_BASE_VIDEO_CODEC_STREAM_UNLOCK (base_video_encoder); break; } base_video_encoder->a.at_eos = FALSE; gst_segment_set_newsegment_full (&GST_BASE_VIDEO_CODEC (base_video_encoder)->segment, update, rate, applied_rate, format, start, stop, position); GST_BASE_VIDEO_CODEC_STREAM_UNLOCK (base_video_encoder); break; } case GST_EVENT_CUSTOM_DOWNSTREAM: { const GstStructure *s; s = gst_event_get_structure (event); if (gst_structure_has_name (s, "GstForceKeyUnit")) { GST_OBJECT_LOCK (base_video_encoder); base_video_encoder->force_keyframe = TRUE; if (base_video_encoder->force_keyunit_event) gst_event_unref (base_video_encoder->force_keyunit_event); base_video_encoder->force_keyunit_event = gst_event_copy (event); GST_OBJECT_UNLOCK (base_video_encoder); gst_event_unref (event); ret = TRUE; } break; } default: break; } return ret; }