All pastes #32901 Raw Edit

Unnamed

public c v1 · immutable
#32901 ·published 2005-12-08 01:07 UTC
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);        }