renatofilho@615: #include <sys/stat.h>
renatofilho@615: #include <fcntl.h>
renatofilho@615: #include <unistd.h>
renatofilho@615: #include <string.h>
renatofilho@615: 
renatofilho@615: #include <gst/gst.h>
renatofilho@615: #include <glib.h> 
renatofilho@615: 
renatofilho@615: 
renatofilho@615: static GMainLoop *mainloop = NULL;
renatofilho@615: static gint64 d = 0;
renatofilho@615: static gint64 gap = 10;
renatofilho@615: 
renatofilho@615: typedef enum {
renatofilho@615:     MY_STREAM_TYPE_AUDIO = 0,
renatofilho@615:     MY_STREAM_TYPE_VIDEO = 1
renatofilho@615: } MyStreamType;
renatofilho@615: 
renatofilho@615: typedef struct _StreamData StreamData;
renatofilho@615: struct _StreamData {
renatofilho@615:     GstElement *bin;
renatofilho@615:     MyStreamType type;
renatofilho@615: };
renatofilho@615: 
renatofilho@615: static void
renatofilho@615: _stream_decode_pad_added_cb (GstElement *decode, 
renatofilho@615:                             GstPad *pad,
renatofilho@615:                             gboolean arg1,
renatofilho@615:                             gpointer user_data)
renatofilho@615: {
renatofilho@615:     StreamData *data = (StreamData *) user_data;
renatofilho@615:     GstElement *queue;
renatofilho@615:     GstPad* sink_pad;
renatofilho@615:     GstCaps* caps = gst_pad_get_caps (pad);
renatofilho@615:     gchar *str_caps = gst_caps_to_string (caps);
renatofilho@615: 
renatofilho@615:     g_debug ("decode caps: [%d] [%s]", data->type, str_caps);
renatofilho@615: 
renatofilho@615:     switch (data->type)
renatofilho@615:     {
renatofilho@615:         case MY_STREAM_TYPE_AUDIO:
renatofilho@615:             g_debug ("Audio");
renatofilho@615:             if (strstr (str_caps, "audio") == NULL) 
renatofilho@615:                 goto done;
renatofilho@615:             break;
renatofilho@615:         case MY_STREAM_TYPE_VIDEO:
renatofilho@615:             g_debug ("Video");
renatofilho@615:             if (strstr (str_caps, "video") == NULL)
renatofilho@615:                 goto done;
renatofilho@615:             break;
renatofilho@615:     }
renatofilho@615: 
renatofilho@615:     queue = gst_bin_get_by_name (GST_BIN (data->bin), "queue");
renatofilho@615:     sink_pad = gst_element_get_pad (queue, "sink");
renatofilho@615: 
renatofilho@615:     if (gst_pad_link (pad, sink_pad) != GST_PAD_LINK_OK) {
renatofilho@615:         g_warning ("Failed to link decode");
renatofilho@615:     }
renatofilho@615: 
renatofilho@615:     gst_object_unref (queue);
renatofilho@615:     gst_object_unref (sink_pad);
renatofilho@615:     //g_free (data);
renatofilho@615:     g_debug ("Linked");
renatofilho@615: 
renatofilho@615: done:
renatofilho@615:     gst_caps_unref (caps);
renatofilho@615:     g_free (str_caps);
renatofilho@615: }
renatofilho@615: 
renatofilho@615: 
renatofilho@615: static GstElement*
renatofilho@615: _create_src_element (const gchar* name,
renatofilho@615:                      const gchar* uri,                 
renatofilho@615:                      MyStreamType type,
renatofilho@615:                      guint priority)
renatofilho@615: {
renatofilho@615:     StreamData *data;
renatofilho@615:     GstElement *bin;
renatofilho@615:     GstElement *src;
renatofilho@615:     GstElement *decode;
renatofilho@615:     GstElement *queue;
renatofilho@615:     GstPad *src_pad;
renatofilho@615: 
renatofilho@615:     GstElement *gnl_src;
renatofilho@615: 
renatofilho@615:     g_debug ("element from uri: %s", uri);
renatofilho@615: 
renatofilho@615:     bin = gst_bin_new ("bin");
renatofilho@615:     src = gst_element_make_from_uri (GST_URI_SRC, uri, "src");
renatofilho@615:     g_return_val_if_fail (src != NULL, NULL);
renatofilho@615: 
renatofilho@615:     decode = gst_element_factory_make ("decodebin", NULL);
renatofilho@615:     g_return_val_if_fail (decode != NULL, NULL);
renatofilho@615: 
renatofilho@615:     queue = gst_element_factory_make ("queue", "queue");
renatofilho@615:     g_return_val_if_fail (queue != NULL, NULL);
renatofilho@615: 
renatofilho@615:     gst_bin_add_many (GST_BIN (bin), src, decode, queue, NULL);
renatofilho@615:     gst_element_link (src, decode);
renatofilho@615: 
renatofilho@615:     data = g_new0 (StreamData, 1);
renatofilho@615:     data->bin = bin;
renatofilho@615:     data->type = type;
renatofilho@615:     g_debug ("Type : %d = %d", type, data->type);
renatofilho@615: 
renatofilho@615:     g_signal_connect (G_OBJECT (decode), "new-decoded-pad",
renatofilho@615:                       G_CALLBACK (_stream_decode_pad_added_cb), 
renatofilho@615:                       data);
renatofilho@615: 
renatofilho@615:     
renatofilho@615:     src_pad = gst_element_get_pad (queue, "src");
renatofilho@615:     g_return_val_if_fail (src_pad != NULL, NULL);
renatofilho@615: 
renatofilho@615:     gst_element_add_pad (bin,
renatofilho@615:         gst_ghost_pad_new ("src", src_pad));
renatofilho@615: 
renatofilho@615:     gst_object_unref (src_pad);
renatofilho@615: 
renatofilho@615:     gnl_src = gst_element_factory_make ("gnlsource", name);
renatofilho@615:     g_return_val_if_fail (gnl_src != NULL, NULL);
renatofilho@615:     gst_bin_add (GST_BIN (gnl_src), bin);
renatofilho@615: 
renatofilho@615:     g_debug ("ADDING WITH: START [%lli] DUR [%lli]", d, gap);
renatofilho@615:     if (d == 0) {
renatofilho@615:         g_object_set (G_OBJECT (gnl_src),
renatofilho@615:                         //"start", 0L,
renatofilho@615:                         "duration", 10 * GST_SECOND,
renatofilho@615:                         //"media-start", 0L,
renatofilho@615:                         //"media-duration", 10 * GST_SECOND,
renatofilho@615:                         "priority", priority,
renatofilho@615:                         NULL);
renatofilho@615: 
renatofilho@615:     } else {
renatofilho@615:         g_object_set (G_OBJECT (gnl_src),
renatofilho@615:                         "start", 10 * GST_SECOND,
renatofilho@615:                         "duration", 10 * GST_SECOND,
renatofilho@615:                         ///"media-start", 10 * GST_SECOND,
renatofilho@615:                         //"media-duration", 10 * GST_SECOND,
renatofilho@615:                         "priority", priority,
renatofilho@615:                         NULL);
renatofilho@615: 
renatofilho@615:     }
renatofilho@615:     d++;
renatofilho@615: 
renatofilho@615:     return gnl_src;
renatofilho@615: }
renatofilho@615: 
renatofilho@615: static void
renatofilho@615: _composition_pad_added_cb (GstElement *composition, 
renatofilho@615:                            GstPad *pad,
renatofilho@615:                            gpointer data)
renatofilho@615: {
renatofilho@615:     GstPad *sink_pad = gst_element_get_pad (GST_ELEMENT (data), "sink");
renatofilho@615:     g_debug ("compose pad added");
renatofilho@615: 
renatofilho@615:     if (gst_pad_link (pad, sink_pad) != GST_PAD_LINK_OK) {
renatofilho@615:         g_warning ("Failed to link decode");
renatofilho@615:     }
renatofilho@615: 
renatofilho@615:     g_debug ("Linked ok");
renatofilho@615: }
renatofilho@615: 
renatofilho@615: static void
renatofilho@615: _compose_add_file (GstElement *compose,
renatofilho@615:                    const gchar* e_name,
renatofilho@615:                    const gchar* uri,
renatofilho@615:                    MyStreamType type, 
renatofilho@615:                    guint priority)
renatofilho@615: {
renatofilho@615:     GstElement *src;
renatofilho@615: 
renatofilho@615:     src = _create_src_element (e_name, uri, type, priority);
renatofilho@615:     gst_bin_add (GST_BIN (compose), src);
renatofilho@615: }
renatofilho@615: 
renatofilho@615: 
renatofilho@615: int 
renatofilho@615: main (int argc, char** argv)
renatofilho@615: {
renatofilho@615:     GstElement* pipe;
renatofilho@615:     GstElement* gnl_compose_a;
renatofilho@615:     GstElement* gnl_compose_v;
renatofilho@615:     GstElement* asink;
renatofilho@615:     GstElement* vsink;
renatofilho@615:     GstElement* aqueue;
renatofilho@615:     GstElement* vqueue;
renatofilho@615: 
renatofilho@615:     g_type_init ();
renatofilho@615:     gst_init (&argc, &argv);
renatofilho@615: 
renatofilho@615: 	mainloop = g_main_loop_new (NULL, FALSE);
renatofilho@615: 
renatofilho@615:     pipe = gst_pipeline_new ("test_pipeline");
renatofilho@615: 
renatofilho@615:     gnl_compose_a = gst_element_factory_make ("gnlcomposition", "acompose");
renatofilho@615:     g_return_val_if_fail (gnl_compose_a != NULL, 1);
renatofilho@615: 
renatofilho@615:     gnl_compose_v = gst_element_factory_make ("gnlcomposition", "vcompose");
renatofilho@615:     g_return_val_if_fail (gnl_compose_v != NULL, 1);
renatofilho@615: 
renatofilho@615: 
renatofilho@615:     //_compose_add_file (gnl_compose_a, "src0", argv[1], MY_STREAM_TYPE_AUDIO, 1);
renatofilho@615:     //_compose_add_file (gnl_compose_a, "src1", argv[2], MY_STREAM_TYPE_AUDIO, 1);
renatofilho@615: 
renatofilho@615:     d = 0;
renatofilho@615: 
renatofilho@615:     _compose_add_file (gnl_compose_v, "src2", argv[1], MY_STREAM_TYPE_VIDEO, 1);
renatofilho@615:     _compose_add_file (gnl_compose_v, "src3", argv[2], MY_STREAM_TYPE_VIDEO, 1);
renatofilho@615: 
renatofilho@615: 
renatofilho@615:     //aqueue = gst_element_factory_make ("queue", "aqueue");
renatofilho@615:     //asink = gst_element_factory_make ("alsasink", "asink");
renatofilho@615: 
renatofilho@615:     vqueue = gst_element_factory_make ("queue", "vqueue");
renatofilho@615:     vsink = gst_element_factory_make ("xvimagesink", "vsink");
renatofilho@615: 
renatofilho@615:     gst_bin_add_many (GST_BIN (pipe), gnl_compose_a, gnl_compose_v, 
renatofilho@615:             vqueue, vsink, 
renatofilho@615:             //aqueue, asink, 
renatofilho@615:             NULL);
renatofilho@615: 
renatofilho@615:     gst_element_link (vqueue, vsink);
renatofilho@615:     //gst_element_link (aqueue, asink);
renatofilho@615: 
renatofilho@615:     //g_signal_connect (G_OBJECT (gnl_compose_a), "pad-added",
renatofilho@615:     //                  G_CALLBACK (_composition_pad_added_cb), aqueue);
renatofilho@615: 
renatofilho@615:     g_signal_connect (G_OBJECT (gnl_compose_v), "pad-added",
renatofilho@615:                       G_CALLBACK (_composition_pad_added_cb), vqueue);
renatofilho@615: 
renatofilho@615: 
renatofilho@615:     //g_idle_add (_play, pipe);
renatofilho@615:     gst_element_set_state (GST_ELEMENT (pipe), GST_STATE_PLAYING);
renatofilho@615: 	g_main_loop_run (mainloop);
renatofilho@615: 
renatofilho@615: 	return 0;
renatofilho@615: }