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