renatofilho@615: #include renatofilho@615: #include renatofilho@615: #include renatofilho@615: #include renatofilho@615: renatofilho@615: #include renatofilho@615: #include 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: }