6 static GstElement *_buid_pipeline(gchar *filename, Ecore_Pipe *pipe);
8 static void new_decoded_pad_cb(GstElement *demuxer,
13 handler(void *data, void *buf, unsigned int len)
15 GstBuffer *buffer = *((GstBuffer **)buf);
17 printf("handler : %p\n", buffer);
18 printf("frame : %d %p %lld %p\n", nbr++, data, (long long)GST_BUFFER_DURATION(buffer), buffer);
19 gst_buffer_unref(buffer);
23 handoff(GstElement *object,
30 pipe = (Ecore_Pipe *)user_data;
31 printf("handoff : %p\n", arg0);
33 ecore_pipe_write(pipe, &arg0, sizeof(arg0));
37 main(int argc, char *argv[])
43 gst_init(&argc, &argv);
51 pipe = ecore_pipe_add(handler);
61 g_print("usage: %s file.avi\n", argv[0]);
69 pipeline = _buid_pipeline(filename, pipe);
72 g_print("Error during the pipeline building\n");
79 gst_element_set_state(pipeline, GST_STATE_PLAYING);
81 ecore_main_loop_begin();
91 new_decoded_pad_cb(GstElement *demuxer,
100 caps = gst_pad_get_caps(new_pad);
101 str = gst_caps_to_string(caps);
103 if (g_str_has_prefix(str, "video/"))
105 decoder = GST_ELEMENT(user_data);
107 pad = gst_element_get_pad(decoder, "sink");
108 if (GST_PAD_LINK_FAILED(gst_pad_link(new_pad, pad)))
110 g_warning("Failed to link %s:%s to %s:%s", GST_DEBUG_PAD_NAME(new_pad),
111 GST_DEBUG_PAD_NAME(pad));
115 gst_caps_unref(caps);
119 _buid_pipeline(gchar *filename, Ecore_Pipe *pipe)
121 GstElement *pipeline;
126 GstStateChangeReturn res;
128 pipeline = gst_pipeline_new("pipeline");
132 filesrc = gst_element_factory_make("filesrc", "filesrc");
135 printf("no filesrc");
138 g_object_set(G_OBJECT(filesrc), "location", filename, NULL);
140 demuxer = gst_element_factory_make("oggdemux", "demuxer");
147 decoder = gst_element_factory_make("theoradec", "decoder");
154 g_signal_connect(demuxer, "pad-added",
155 G_CALLBACK(new_decoded_pad_cb), decoder);
157 sink = gst_element_factory_make("fakesink", "sink");
163 g_object_set(G_OBJECT(sink), "sync", EINA_TRUE, NULL);
164 g_object_set(G_OBJECT(sink), "signal-handoffs", EINA_TRUE, NULL);
165 g_signal_connect(sink, "handoff",
166 G_CALLBACK(handoff), pipe);
168 gst_bin_add_many(GST_BIN(pipeline),
169 filesrc, demuxer, decoder, sink, NULL);
171 if (!gst_element_link(filesrc, demuxer))
173 if (!gst_element_link(decoder, sink))
176 res = gst_element_set_state(pipeline, GST_STATE_PAUSED);
177 if (res == GST_STATE_CHANGE_FAILURE)
180 res = gst_element_get_state(pipeline, NULL, NULL, GST_CLOCK_TIME_NONE);
181 if (res != GST_STATE_CHANGE_SUCCESS)
187 gst_object_unref(GST_OBJECT(pipeline));