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