renatofilho@615
|
1 |
#include <sys/stat.h>
|
renatofilho@615
|
2 |
#include <fcntl.h>
|
renatofilho@615
|
3 |
#include <unistd.h>
|
renatofilho@615
|
4 |
#include <string.h>
|
renatofilho@615
|
5 |
|
renatofilho@615
|
6 |
#include <gst/gst.h>
|
renatofilho@615
|
7 |
#include <glib.h>
|
renatofilho@615
|
8 |
|
renatofilho@615
|
9 |
|
renatofilho@615
|
10 |
static GMainLoop *mainloop = NULL;
|
renatofilho@615
|
11 |
static gint64 d = 0;
|
renatofilho@615
|
12 |
static gint64 gap = 10;
|
renatofilho@615
|
13 |
|
renatofilho@615
|
14 |
typedef enum {
|
renatofilho@615
|
15 |
MY_STREAM_TYPE_AUDIO = 0,
|
renatofilho@615
|
16 |
MY_STREAM_TYPE_VIDEO = 1
|
renatofilho@615
|
17 |
} MyStreamType;
|
renatofilho@615
|
18 |
|
renatofilho@615
|
19 |
typedef struct _StreamData StreamData;
|
renatofilho@615
|
20 |
struct _StreamData {
|
renatofilho@615
|
21 |
GstElement *bin;
|
renatofilho@615
|
22 |
MyStreamType type;
|
renatofilho@615
|
23 |
};
|
renatofilho@615
|
24 |
|
renatofilho@615
|
25 |
static void
|
renatofilho@615
|
26 |
_stream_decode_pad_added_cb (GstElement *decode,
|
renatofilho@615
|
27 |
GstPad *pad,
|
renatofilho@615
|
28 |
gboolean arg1,
|
renatofilho@615
|
29 |
gpointer user_data)
|
renatofilho@615
|
30 |
{
|
renatofilho@615
|
31 |
StreamData *data = (StreamData *) user_data;
|
renatofilho@615
|
32 |
GstElement *queue;
|
renatofilho@615
|
33 |
GstPad* sink_pad;
|
renatofilho@615
|
34 |
GstCaps* caps = gst_pad_get_caps (pad);
|
renatofilho@615
|
35 |
gchar *str_caps = gst_caps_to_string (caps);
|
renatofilho@615
|
36 |
|
renatofilho@615
|
37 |
g_debug ("decode caps: [%d] [%s]", data->type, str_caps);
|
renatofilho@615
|
38 |
|
renatofilho@615
|
39 |
switch (data->type)
|
renatofilho@615
|
40 |
{
|
renatofilho@615
|
41 |
case MY_STREAM_TYPE_AUDIO:
|
renatofilho@615
|
42 |
g_debug ("Audio");
|
renatofilho@615
|
43 |
if (strstr (str_caps, "audio") == NULL)
|
renatofilho@615
|
44 |
goto done;
|
renatofilho@615
|
45 |
break;
|
renatofilho@615
|
46 |
case MY_STREAM_TYPE_VIDEO:
|
renatofilho@615
|
47 |
g_debug ("Video");
|
renatofilho@615
|
48 |
if (strstr (str_caps, "video") == NULL)
|
renatofilho@615
|
49 |
goto done;
|
renatofilho@615
|
50 |
break;
|
renatofilho@615
|
51 |
}
|
renatofilho@615
|
52 |
|
renatofilho@615
|
53 |
queue = gst_bin_get_by_name (GST_BIN (data->bin), "queue");
|
renatofilho@615
|
54 |
sink_pad = gst_element_get_pad (queue, "sink");
|
renatofilho@615
|
55 |
|
renatofilho@615
|
56 |
if (gst_pad_link (pad, sink_pad) != GST_PAD_LINK_OK) {
|
renatofilho@615
|
57 |
g_warning ("Failed to link decode");
|
renatofilho@615
|
58 |
}
|
renatofilho@615
|
59 |
|
renatofilho@615
|
60 |
gst_object_unref (queue);
|
renatofilho@615
|
61 |
gst_object_unref (sink_pad);
|
renatofilho@615
|
62 |
//g_free (data);
|
renatofilho@615
|
63 |
g_debug ("Linked");
|
renatofilho@615
|
64 |
|
renatofilho@615
|
65 |
done:
|
renatofilho@615
|
66 |
gst_caps_unref (caps);
|
renatofilho@615
|
67 |
g_free (str_caps);
|
renatofilho@615
|
68 |
}
|
renatofilho@615
|
69 |
|
renatofilho@615
|
70 |
|
renatofilho@615
|
71 |
static GstElement*
|
renatofilho@615
|
72 |
_create_src_element (const gchar* name,
|
renatofilho@615
|
73 |
const gchar* uri,
|
renatofilho@615
|
74 |
MyStreamType type,
|
renatofilho@615
|
75 |
guint priority)
|
renatofilho@615
|
76 |
{
|
renatofilho@615
|
77 |
StreamData *data;
|
renatofilho@615
|
78 |
GstElement *bin;
|
renatofilho@615
|
79 |
GstElement *src;
|
renatofilho@615
|
80 |
GstElement *decode;
|
renatofilho@615
|
81 |
GstElement *queue;
|
renatofilho@615
|
82 |
GstPad *src_pad;
|
renatofilho@615
|
83 |
|
renatofilho@615
|
84 |
GstElement *gnl_src;
|
renatofilho@615
|
85 |
|
renatofilho@615
|
86 |
g_debug ("element from uri: %s", uri);
|
renatofilho@615
|
87 |
|
renatofilho@615
|
88 |
bin = gst_bin_new ("bin");
|
renatofilho@615
|
89 |
src = gst_element_make_from_uri (GST_URI_SRC, uri, "src");
|
renatofilho@615
|
90 |
g_return_val_if_fail (src != NULL, NULL);
|
renatofilho@615
|
91 |
|
renatofilho@615
|
92 |
decode = gst_element_factory_make ("decodebin", NULL);
|
renatofilho@615
|
93 |
g_return_val_if_fail (decode != NULL, NULL);
|
renatofilho@615
|
94 |
|
renatofilho@615
|
95 |
queue = gst_element_factory_make ("queue", "queue");
|
renatofilho@615
|
96 |
g_return_val_if_fail (queue != NULL, NULL);
|
renatofilho@615
|
97 |
|
renatofilho@615
|
98 |
gst_bin_add_many (GST_BIN (bin), src, decode, queue, NULL);
|
renatofilho@615
|
99 |
gst_element_link (src, decode);
|
renatofilho@615
|
100 |
|
renatofilho@615
|
101 |
data = g_new0 (StreamData, 1);
|
renatofilho@615
|
102 |
data->bin = bin;
|
renatofilho@615
|
103 |
data->type = type;
|
renatofilho@615
|
104 |
g_debug ("Type : %d = %d", type, data->type);
|
renatofilho@615
|
105 |
|
renatofilho@615
|
106 |
g_signal_connect (G_OBJECT (decode), "new-decoded-pad",
|
renatofilho@615
|
107 |
G_CALLBACK (_stream_decode_pad_added_cb),
|
renatofilho@615
|
108 |
data);
|
renatofilho@615
|
109 |
|
renatofilho@615
|
110 |
|
renatofilho@615
|
111 |
src_pad = gst_element_get_pad (queue, "src");
|
renatofilho@615
|
112 |
g_return_val_if_fail (src_pad != NULL, NULL);
|
renatofilho@615
|
113 |
|
renatofilho@615
|
114 |
gst_element_add_pad (bin,
|
renatofilho@615
|
115 |
gst_ghost_pad_new ("src", src_pad));
|
renatofilho@615
|
116 |
|
renatofilho@615
|
117 |
gst_object_unref (src_pad);
|
renatofilho@615
|
118 |
|
renatofilho@615
|
119 |
gnl_src = gst_element_factory_make ("gnlsource", name);
|
renatofilho@615
|
120 |
g_return_val_if_fail (gnl_src != NULL, NULL);
|
renatofilho@615
|
121 |
gst_bin_add (GST_BIN (gnl_src), bin);
|
renatofilho@615
|
122 |
|
renatofilho@615
|
123 |
g_debug ("ADDING WITH: START [%lli] DUR [%lli]", d, gap);
|
renatofilho@615
|
124 |
if (d == 0) {
|
renatofilho@615
|
125 |
g_object_set (G_OBJECT (gnl_src),
|
renatofilho@615
|
126 |
//"start", 0L,
|
renatofilho@615
|
127 |
"duration", 10 * GST_SECOND,
|
renatofilho@615
|
128 |
//"media-start", 0L,
|
renatofilho@615
|
129 |
//"media-duration", 10 * GST_SECOND,
|
renatofilho@615
|
130 |
"priority", priority,
|
renatofilho@615
|
131 |
NULL);
|
renatofilho@615
|
132 |
|
renatofilho@615
|
133 |
} else {
|
renatofilho@615
|
134 |
g_object_set (G_OBJECT (gnl_src),
|
renatofilho@615
|
135 |
"start", 10 * GST_SECOND,
|
renatofilho@615
|
136 |
"duration", 10 * GST_SECOND,
|
renatofilho@615
|
137 |
///"media-start", 10 * GST_SECOND,
|
renatofilho@615
|
138 |
//"media-duration", 10 * GST_SECOND,
|
renatofilho@615
|
139 |
"priority", priority,
|
renatofilho@615
|
140 |
NULL);
|
renatofilho@615
|
141 |
|
renatofilho@615
|
142 |
}
|
renatofilho@615
|
143 |
d++;
|
renatofilho@615
|
144 |
|
renatofilho@615
|
145 |
return gnl_src;
|
renatofilho@615
|
146 |
}
|
renatofilho@615
|
147 |
|
renatofilho@615
|
148 |
static void
|
renatofilho@615
|
149 |
_composition_pad_added_cb (GstElement *composition,
|
renatofilho@615
|
150 |
GstPad *pad,
|
renatofilho@615
|
151 |
gpointer data)
|
renatofilho@615
|
152 |
{
|
renatofilho@615
|
153 |
GstPad *sink_pad = gst_element_get_pad (GST_ELEMENT (data), "sink");
|
renatofilho@615
|
154 |
g_debug ("compose pad added");
|
renatofilho@615
|
155 |
|
renatofilho@615
|
156 |
if (gst_pad_link (pad, sink_pad) != GST_PAD_LINK_OK) {
|
renatofilho@615
|
157 |
g_warning ("Failed to link decode");
|
renatofilho@615
|
158 |
}
|
renatofilho@615
|
159 |
|
renatofilho@615
|
160 |
g_debug ("Linked ok");
|
renatofilho@615
|
161 |
}
|
renatofilho@615
|
162 |
|
renatofilho@615
|
163 |
static void
|
renatofilho@615
|
164 |
_compose_add_file (GstElement *compose,
|
renatofilho@615
|
165 |
const gchar* e_name,
|
renatofilho@615
|
166 |
const gchar* uri,
|
renatofilho@615
|
167 |
MyStreamType type,
|
renatofilho@615
|
168 |
guint priority)
|
renatofilho@615
|
169 |
{
|
renatofilho@615
|
170 |
GstElement *src;
|
renatofilho@615
|
171 |
|
renatofilho@615
|
172 |
src = _create_src_element (e_name, uri, type, priority);
|
renatofilho@615
|
173 |
gst_bin_add (GST_BIN (compose), src);
|
renatofilho@615
|
174 |
}
|
renatofilho@615
|
175 |
|
renatofilho@615
|
176 |
|
renatofilho@615
|
177 |
int
|
renatofilho@615
|
178 |
main (int argc, char** argv)
|
renatofilho@615
|
179 |
{
|
renatofilho@615
|
180 |
GstElement* pipe;
|
renatofilho@615
|
181 |
GstElement* gnl_compose_a;
|
renatofilho@615
|
182 |
GstElement* gnl_compose_v;
|
renatofilho@615
|
183 |
GstElement* asink;
|
renatofilho@615
|
184 |
GstElement* vsink;
|
renatofilho@615
|
185 |
GstElement* aqueue;
|
renatofilho@615
|
186 |
GstElement* vqueue;
|
renatofilho@615
|
187 |
|
renatofilho@615
|
188 |
g_type_init ();
|
renatofilho@615
|
189 |
gst_init (&argc, &argv);
|
renatofilho@615
|
190 |
|
renatofilho@615
|
191 |
mainloop = g_main_loop_new (NULL, FALSE);
|
renatofilho@615
|
192 |
|
renatofilho@615
|
193 |
pipe = gst_pipeline_new ("test_pipeline");
|
renatofilho@615
|
194 |
|
renatofilho@615
|
195 |
gnl_compose_a = gst_element_factory_make ("gnlcomposition", "acompose");
|
renatofilho@615
|
196 |
g_return_val_if_fail (gnl_compose_a != NULL, 1);
|
renatofilho@615
|
197 |
|
renatofilho@615
|
198 |
gnl_compose_v = gst_element_factory_make ("gnlcomposition", "vcompose");
|
renatofilho@615
|
199 |
g_return_val_if_fail (gnl_compose_v != NULL, 1);
|
renatofilho@615
|
200 |
|
renatofilho@615
|
201 |
|
renatofilho@615
|
202 |
//_compose_add_file (gnl_compose_a, "src0", argv[1], MY_STREAM_TYPE_AUDIO, 1);
|
renatofilho@615
|
203 |
//_compose_add_file (gnl_compose_a, "src1", argv[2], MY_STREAM_TYPE_AUDIO, 1);
|
renatofilho@615
|
204 |
|
renatofilho@615
|
205 |
d = 0;
|
renatofilho@615
|
206 |
|
renatofilho@615
|
207 |
_compose_add_file (gnl_compose_v, "src2", argv[1], MY_STREAM_TYPE_VIDEO, 1);
|
renatofilho@615
|
208 |
_compose_add_file (gnl_compose_v, "src3", argv[2], MY_STREAM_TYPE_VIDEO, 1);
|
renatofilho@615
|
209 |
|
renatofilho@615
|
210 |
|
renatofilho@615
|
211 |
//aqueue = gst_element_factory_make ("queue", "aqueue");
|
renatofilho@615
|
212 |
//asink = gst_element_factory_make ("alsasink", "asink");
|
renatofilho@615
|
213 |
|
renatofilho@615
|
214 |
vqueue = gst_element_factory_make ("queue", "vqueue");
|
renatofilho@615
|
215 |
vsink = gst_element_factory_make ("xvimagesink", "vsink");
|
renatofilho@615
|
216 |
|
renatofilho@615
|
217 |
gst_bin_add_many (GST_BIN (pipe), gnl_compose_a, gnl_compose_v,
|
renatofilho@615
|
218 |
vqueue, vsink,
|
renatofilho@615
|
219 |
//aqueue, asink,
|
renatofilho@615
|
220 |
NULL);
|
renatofilho@615
|
221 |
|
renatofilho@615
|
222 |
gst_element_link (vqueue, vsink);
|
renatofilho@615
|
223 |
//gst_element_link (aqueue, asink);
|
renatofilho@615
|
224 |
|
renatofilho@615
|
225 |
//g_signal_connect (G_OBJECT (gnl_compose_a), "pad-added",
|
renatofilho@615
|
226 |
// G_CALLBACK (_composition_pad_added_cb), aqueue);
|
renatofilho@615
|
227 |
|
renatofilho@615
|
228 |
g_signal_connect (G_OBJECT (gnl_compose_v), "pad-added",
|
renatofilho@615
|
229 |
G_CALLBACK (_composition_pad_added_cb), vqueue);
|
renatofilho@615
|
230 |
|
renatofilho@615
|
231 |
|
renatofilho@615
|
232 |
//g_idle_add (_play, pipe);
|
renatofilho@615
|
233 |
gst_element_set_state (GST_ELEMENT (pipe), GST_STATE_PLAYING);
|
renatofilho@615
|
234 |
g_main_loop_run (mainloop);
|
renatofilho@615
|
235 |
|
renatofilho@615
|
236 |
return 0;
|
renatofilho@615
|
237 |
}
|