rendered paste body#include <gdv.h>#include <gdvbase.h>#define MEDIA_0 "/home/mdk/test.dv"//#define MEDIA_0 "../media/mjpeg.avi" //#define MEDIA_0 "../media/m1.avi"GstBusSyncHandler OrigSyncHandler;gpointer OrigSyncHandlerData;GstPad *videopad;struct _Private { GstPadLinkFunction OrigLinkFunc;} typedef Private;GstCaps *pad_getcaps (GstPad *pad){ if (gst_ghost_pad_get_target (pad) == NULL) return GST_CAPS_ANY; else return gst_pad_get_caps (gst_ghost_pad_get_target (pad));}GstPadLinkReturn pad_link (GstPad *pad, GstPad *peer){ g_debug ("GhostPad link function"); if (gst_ghost_pad_get_target (pad) != NULL) { g_debug ("LINKING!"); Private *priv = gst_pad_get_element_private (pad); priv->OrigLinkFunc (pad, peer); } return GST_PAD_LINK_OK;}GstPad *pad_new (void){ g_debug ("New ghostpad"); GstPad *pad = gst_ghost_pad_new_no_target ("vsrc", GST_PAD_SRC); Private *priv = g_new (Private, 1); priv->OrigLinkFunc = pad->linkfunc; gst_pad_set_element_private (pad, priv); gst_pad_set_getcaps_function (pad, pad_getcaps); gst_pad_set_link_function (pad, pad_link); return pad;}void pad_settarget (GstPad *pad, GstPad *target){ g_debug ("GhostPad settarget function"); Private *priv = gst_pad_get_element_private (pad); gst_ghost_pad_set_target (pad, target); if (gst_pad_is_linked (pad) == TRUE) priv->OrigLinkFunc (pad, GST_PAD_PEER (pad));}gboolean bus_callback (GstBus *bus, GstMessage *message, GdvPlaySink *this){ GDV_DEBUG_ELEMENT ("Bus callback for '%s' message '%s'", GST_OBJECT_NAME (this), gst_message_type_get_name (GST_MESSAGE_TYPE (message))); switch (GST_MESSAGE_TYPE (message)) { default: break; } return TRUE;}void blocked (GstPad *pad, gboolean block, GstElement *element){ g_debug ("Blocked pad signal %d", block); if (block == FALSE) return; GstEvent *event = gst_event_new_seek (1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_SEGMENT, GST_SEEK_TYPE_SET, GST_SECOND * 9, GST_SEEK_TYPE_SET, GST_SECOND * 10); //gst_element_seek (element, 1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_SEGMENT, // GST_SEEK_TYPE_SET, GST_SECOND * 2, // GST_SEEK_TYPE_SET, GST_SECOND * 3); gst_pad_send_event (pad, event); pad_settarget (gst_element_get_pad (element, "vsrc"), videopad); gst_pad_set_blocked_async (pad, FALSE, blocked, element);}GstBusSyncReply sync_handler (GstBus *bus, GstMessage *message, GstBin *this){ GDV_DEBUG_ELEMENT ("Entering the GdvClip sync_handler message:%s", gst_message_type_get_name (GST_MESSAGE_TYPE (message))); switch (GST_MESSAGE_TYPE (message)) { case GST_MESSAGE_SEGMENT_DONE: { } break; case GST_MESSAGE_SEGMENT_START: { } break; default: { } break; } // Finish return OrigSyncHandler (bus, message, OrigSyncHandlerData); }void new_pad (GstElement *element, GstPad *pad, GstBin *bin){ g_debug ("New pad"); GstCaps *caps; GstStructure *str; caps = gst_pad_get_caps (pad); g_assert (caps != NULL); str = gst_caps_get_structure (caps, 0); g_assert (str != NULL); if (g_strrstr (gst_structure_get_name (str), "video")) { g_debug ("Got video pad"); //GstPad *target = gst_ghost_pad_get_target (pad); //g_debug ("PAD NAME: %s:%s", GST_PAD_NAME (target), GST_OBJECT_NAME (gst_pad_get_parent (target))); videopad = pad; GstPad *p = gst_ghost_pad_get_target (pad); gst_pad_set_blocked_async (p, TRUE, blocked, bin); //gst_pad_set_blocked_async (gst_ghost_pad_get_target (pad) , TRUE, blocked, NULL); //gst_pad_link (pad, gst_element_get_pad (to, "sink")); }}int main (int argc, char *argv[]){ //gdv_init (argc, argv, NULL); gdv_main_gst_init (&argc, &argv); GstElement *xvimagesink = gst_element_factory_make ("xvimagesink", NULL); GstPipeline *pipe = (GstPipeline *) gst_pipeline_new (NULL); GstElement *filesrc = gst_element_factory_make ("filesrc", NULL); GstElement *decodebin = gst_element_factory_make ("decodebin", NULL); GstBin *bin = gst_bin_new ("bin"); gst_element_add_pad (bin, pad_new ()); gst_bin_add_many (bin, filesrc, decodebin, NULL); g_object_set (G_OBJECT (filesrc), "location", MEDIA_0, NULL); g_signal_connect (G_OBJECT(decodebin), "pad-added", G_CALLBACK(new_pad), bin); gst_bin_add_many (GST_BIN (pipe), bin, xvimagesink, NULL); gst_element_link (filesrc, decodebin); GstBus *bus = bin->child_bus; GST_OBJECT_LOCK (bus); OrigSyncHandler = bus->sync_handler; OrigSyncHandlerData = bus->sync_handler_data; bus->sync_handler = sync_handler; bus->sync_handler_data = bin; GST_OBJECT_UNLOCK (bus); //guint watch = gst_bus_add_watch (gst_pipeline_get_bus ((GstPipeline *) pipe), // (gpointer) bus_callback, pipe); gboolean l1 = gst_element_link (bin, xvimagesink); g_assert (l1 == TRUE); //GMainLoop *loop = g_main_loop_new (NULL, FALSE); gst_element_set_state (pipe, GST_STATE_PAUSED); gst_element_get_state (pipe, NULL, NULL, GST_CLOCK_TIME_NONE); //_debug ("*** BIN *** Changed state"); //gst_element_set_state (pipe, GST_STATE_PAUSED); //gst_element_get_state (pipe, NULL, NULL, GST_CLOCK_TIME_NONE); g_usleep (G_USEC_PER_SEC * 1); g_assert_not_reached (); gst_element_seek (pipe, 1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_SEGMENT, GST_SEEK_TYPE_SET, GST_SECOND * 2, GST_SEEK_TYPE_SET, GST_SECOND * 3); //GstEvent *event = gst_event_new_seek (1.0, GST_FORMAT_TIME, // GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_SEGMENT, // GST_SEEK_TYPE_SET, GST_SECOND, // GST_SEEK_TYPE_SET, GST_SECOND * 3); //gst_pad_send_event (gst_element_get_pad (bin, "vsrc"), event); gst_element_set_state (pipe, GST_STATE_PLAYING); gst_element_get_state (pipe, NULL, NULL, GST_CLOCK_TIME_NONE); g_usleep (G_USEC_PER_SEC * 5); }