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