Tizen 2.1 base
[framework/uifw/ecore.git] / src / examples / ecore_pipe_gstreamer_example.c
1 #include <gst/gst.h>
2 #include <Ecore.h>
3
4 static int nbr = 0;
5
6 static GstElement *_buid_pipeline(gchar *filename, Ecore_Pipe *pipe);
7
8 static void        new_decoded_pad_cb(GstElement *demuxer,
9                                       GstPad *new_pad,
10                                       gpointer user_data);
11
12 static void
13 handler(void *data, void *buf, unsigned int len)
14 {
15    GstBuffer *buffer = *((GstBuffer **)buf);
16
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);
20 }
21
22 static void
23 handoff(GstElement *object,
24         GstBuffer *arg0,
25         GstPad *arg1,
26         gpointer user_data)
27 {
28    Ecore_Pipe *pipe;
29
30    pipe = (Ecore_Pipe *)user_data;
31    printf("handoff : %p\n", arg0);
32    gst_buffer_ref(arg0);
33    ecore_pipe_write(pipe, &arg0, sizeof(arg0));
34 }
35
36 int
37 main(int argc, char *argv[])
38 {
39    GstElement *pipeline;
40    char *filename;
41    Ecore_Pipe *pipe;
42
43    gst_init(&argc, &argv);
44
45    if (!ecore_init())
46      {
47         gst_deinit();
48         return 0;
49      }
50
51    pipe = ecore_pipe_add(handler);
52    if (!pipe)
53      {
54         ecore_shutdown();
55         gst_deinit();
56         return 0;
57      }
58
59    if (argc < 2)
60      {
61         g_print("usage: %s file.avi\n", argv[0]);
62         ecore_pipe_del(pipe);
63         ecore_shutdown();
64         gst_deinit();
65         return 0;
66      }
67    filename = argv[1];
68
69    pipeline = _buid_pipeline(filename, pipe);
70    if (!pipeline)
71      {
72         g_print("Error during the pipeline building\n");
73         ecore_pipe_del(pipe);
74         ecore_shutdown();
75         gst_deinit();
76         return -1;
77      }
78
79    gst_element_set_state(pipeline, GST_STATE_PLAYING);
80
81    ecore_main_loop_begin();
82
83    ecore_pipe_del(pipe);
84    ecore_shutdown();
85    gst_deinit();
86
87    return 0;
88 }
89
90 static void
91 new_decoded_pad_cb(GstElement *demuxer,
92                    GstPad *new_pad,
93                    gpointer user_data)
94 {
95    GstElement *decoder;
96    GstPad *pad;
97    GstCaps *caps;
98    gchar *str;
99
100    caps = gst_pad_get_caps(new_pad);
101    str = gst_caps_to_string(caps);
102
103    if (g_str_has_prefix(str, "video/"))
104      {
105         decoder = GST_ELEMENT(user_data);
106
107         pad = gst_element_get_pad(decoder, "sink");
108         if (GST_PAD_LINK_FAILED(gst_pad_link(new_pad, pad)))
109           {
110              g_warning("Failed to link %s:%s to %s:%s", GST_DEBUG_PAD_NAME(new_pad),
111                        GST_DEBUG_PAD_NAME(pad));
112           }
113      }
114    g_free(str);
115    gst_caps_unref(caps);
116 }
117
118 static GstElement
119 _buid_pipeline(gchar *filename, Ecore_Pipe *pipe)
120 {
121    GstElement *pipeline;
122    GstElement *filesrc;
123    GstElement *demuxer;
124    GstElement *decoder;
125    GstElement *sink;
126    GstStateChangeReturn res;
127
128    pipeline = gst_pipeline_new("pipeline");
129    if (!pipeline)
130      return NULL;
131
132    filesrc = gst_element_factory_make("filesrc", "filesrc");
133    if (!filesrc)
134      {
135         printf("no filesrc");
136         goto failure;
137      }
138    g_object_set(G_OBJECT(filesrc), "location", filename, NULL);
139
140    demuxer = gst_element_factory_make("oggdemux", "demuxer");
141    if (!demuxer)
142      {
143         printf("no demux");
144         goto failure;
145      }
146
147    decoder = gst_element_factory_make("theoradec", "decoder");
148    if (!decoder)
149      {
150         printf("no dec");
151         goto failure;
152      }
153
154    g_signal_connect(demuxer, "pad-added",
155                     G_CALLBACK(new_decoded_pad_cb), decoder);
156
157    sink = gst_element_factory_make("fakesink", "sink");
158    if (!sink)
159      {
160         printf("no sink");
161         goto failure;
162      }
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);
167
168    gst_bin_add_many(GST_BIN(pipeline),
169                     filesrc, demuxer, decoder, sink, NULL);
170
171    if (!gst_element_link(filesrc, demuxer))
172      goto failure;
173    if (!gst_element_link(decoder, sink))
174      goto failure;
175
176    res = gst_element_set_state(pipeline, GST_STATE_PAUSED);
177    if (res == GST_STATE_CHANGE_FAILURE)
178      goto failure;
179
180    res = gst_element_get_state(pipeline, NULL, NULL, GST_CLOCK_TIME_NONE);
181    if (res != GST_STATE_CHANGE_SUCCESS)
182      goto failure;
183
184    return pipeline;
185
186 failure:
187    gst_object_unref(GST_OBJECT(pipeline));
188    return NULL;
189 }
190