renatofilho@787
|
1 |
/* GStreamer
|
renatofilho@787
|
2 |
* Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
|
renatofilho@787
|
3 |
*
|
renatofilho@787
|
4 |
* This library is free software; you can redistribute it and/or
|
renatofilho@787
|
5 |
* modify it under the terms of the GNU Library General Public
|
renatofilho@787
|
6 |
* License as published by the Free Software Foundation; either
|
renatofilho@787
|
7 |
* version 2 of the License, or (at your option) any later version.
|
renatofilho@787
|
8 |
*
|
renatofilho@787
|
9 |
* This library is distributed in the hope that it will be useful,
|
renatofilho@787
|
10 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
renatofilho@787
|
11 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
renatofilho@787
|
12 |
* Library General Public License for more details.
|
renatofilho@787
|
13 |
*
|
renatofilho@787
|
14 |
* You should have received a copy of the GNU Library General Public
|
renatofilho@787
|
15 |
* License along with this library; if not, write to the
|
renatofilho@787
|
16 |
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
renatofilho@787
|
17 |
* Boston, MA 02111-1307, USA.
|
renatofilho@787
|
18 |
*/
|
renatofilho@787
|
19 |
|
renatofilho@787
|
20 |
#ifdef HAVE_CONFIG_H
|
renatofilho@787
|
21 |
#include "config.h"
|
renatofilho@787
|
22 |
#endif
|
renatofilho@787
|
23 |
|
renatofilho@787
|
24 |
#include <glib/gi18n.h>
|
renatofilho@787
|
25 |
#include <string.h>
|
renatofilho@787
|
26 |
#include <gst/gst.h>
|
renatofilho@787
|
27 |
#include <gst/gsterror.h>
|
renatofilho@787
|
28 |
#include <gst/gstplugin.h>
|
renatofilho@787
|
29 |
#include <gst/interfaces/xoverlay.h>
|
renatofilho@787
|
30 |
#include <X11/Xlib.h>
|
renatofilho@787
|
31 |
//#include <gst/pbutils/pbutils.h>
|
renatofilho@787
|
32 |
#include "gstplaybinmaemo.h"
|
renatofilho@787
|
33 |
|
renatofilho@787
|
34 |
|
renatofilho@787
|
35 |
GST_DEBUG_CATEGORY_STATIC (gst_play_bin_maemo_debug);
|
renatofilho@787
|
36 |
#define GST_CAT_DEFAULT gst_play_bin_maemo_debug
|
renatofilho@787
|
37 |
|
renatofilho@787
|
38 |
#define DEFAULT_VOLUME 10
|
renatofilho@787
|
39 |
#define DEFAULT_XID -1
|
renatofilho@787
|
40 |
|
renatofilho@787
|
41 |
/* props */
|
renatofilho@787
|
42 |
enum
|
renatofilho@787
|
43 |
{
|
renatofilho@787
|
44 |
ARG_0,
|
renatofilho@787
|
45 |
ARG_URI,
|
renatofilho@787
|
46 |
ARG_QUEUE_SIZE,
|
renatofilho@787
|
47 |
ARG_QUEUE_MIN_THRESHOLD,
|
renatofilho@787
|
48 |
ARG_SOURCE,
|
renatofilho@787
|
49 |
ARG_VOLUME,
|
renatofilho@787
|
50 |
ARG_XID
|
renatofilho@787
|
51 |
};
|
renatofilho@787
|
52 |
|
renatofilho@787
|
53 |
static const GstElementDetails gst_play_bin_maemo_details =
|
renatofilho@787
|
54 |
GST_ELEMENT_DETAILS("Nuv demuxer",
|
renatofilho@787
|
55 |
"Generic/Bin/Player",
|
renatofilho@787
|
56 |
"Autoplug and play media from an uri used on maemo plataform",
|
renatofilho@787
|
57 |
"Renato Araujo Oliveira Filho <renato.filho@indt.org.br>");
|
renatofilho@787
|
58 |
|
renatofilho@787
|
59 |
static void gst_play_bin_maemo_dispose (GObject * object);
|
renatofilho@787
|
60 |
static void gst_play_bin_maemo_finalize (GObject * object);
|
renatofilho@787
|
61 |
static void gst_play_bin_maemo_set_property (GObject * object, guint prop_id,
|
renatofilho@787
|
62 |
const GValue * value, GParamSpec * spec);
|
renatofilho@787
|
63 |
static void gst_play_bin_maemo_get_property (GObject * object, guint prop_id,
|
renatofilho@787
|
64 |
GValue * value, GParamSpec * spec);
|
renatofilho@787
|
65 |
static GstStateChangeReturn
|
renatofilho@787
|
66 |
gst_play_bin_maemo_change_state (GstElement *element,
|
renatofilho@787
|
67 |
GstStateChange transition);
|
renatofilho@787
|
68 |
static gboolean factory_filter_sinks (GstPluginFeature *feature,
|
renatofilho@787
|
69 |
GstPlayBinMaemo *pbm);
|
renatofilho@787
|
70 |
static gint compare_ranks (GstPluginFeature * f1,
|
renatofilho@787
|
71 |
GstPluginFeature * f2);
|
renatofilho@787
|
72 |
static GList *find_compatibles (GstPlayBinMaemo *pbm,
|
renatofilho@787
|
73 |
const GstCaps *caps);
|
renatofilho@787
|
74 |
static GstPad *find_sink_pad (GstElement * element);
|
renatofilho@787
|
75 |
static void update_volume (GstPlayBinMaemo *pbm);
|
renatofilho@787
|
76 |
static void update_xid (GstPlayBinMaemo *pbm);
|
renatofilho@787
|
77 |
static void new_decoded_pad_cb (GstElement *object,
|
renatofilho@787
|
78 |
GstPad* pad,
|
renatofilho@787
|
79 |
gboolean arg,
|
renatofilho@787
|
80 |
gpointer user_data);
|
renatofilho@787
|
81 |
static void unknown_type_cb (GstElement *object,
|
renatofilho@787
|
82 |
GstPad *pad,
|
renatofilho@787
|
83 |
GstCaps *casp,
|
renatofilho@787
|
84 |
gpointer user_data);
|
renatofilho@787
|
85 |
static gboolean autoplug_continue_cb (GstElement* object,
|
renatofilho@787
|
86 |
GstCaps* caps,
|
renatofilho@787
|
87 |
gpointer user_data);
|
renatofilho@787
|
88 |
static void decode_new_pad_cb (GstElement *element,
|
renatofilho@787
|
89 |
GObject *new_pad,
|
renatofilho@787
|
90 |
gpointer user_data);
|
renatofilho@787
|
91 |
static void queue_underrun_cb (GstElement* queue,
|
renatofilho@787
|
92 |
gpointer user_data);
|
renatofilho@787
|
93 |
static void queue_sink_underrun_cb (GstElement* queue,
|
renatofilho@787
|
94 |
gpointer user_data);
|
renatofilho@787
|
95 |
static void queue_sink_overrun_cb (GstElement* queue,
|
renatofilho@787
|
96 |
gpointer user_data);
|
renatofilho@787
|
97 |
|
renatofilho@787
|
98 |
|
renatofilho@787
|
99 |
|
renatofilho@787
|
100 |
|
renatofilho@787
|
101 |
|
renatofilho@787
|
102 |
GST_BOILERPLATE(GstPlayBinMaemo, gst_play_bin_maemo, GstPipeline, GST_TYPE_PIPELINE)
|
renatofilho@787
|
103 |
|
renatofilho@787
|
104 |
|
renatofilho@787
|
105 |
static void
|
renatofilho@787
|
106 |
gst_play_bin_maemo_base_init (gpointer klass)
|
renatofilho@787
|
107 |
{
|
renatofilho@787
|
108 |
GstElementClass *element_class = GST_ELEMENT_CLASS(klass);
|
renatofilho@787
|
109 |
|
renatofilho@787
|
110 |
gst_element_class_set_details (element_class, &gst_play_bin_maemo_details);
|
renatofilho@787
|
111 |
}
|
renatofilho@787
|
112 |
|
renatofilho@787
|
113 |
static void
|
renatofilho@787
|
114 |
gst_play_bin_maemo_class_init (GstPlayBinMaemoClass * klass)
|
renatofilho@787
|
115 |
{
|
renatofilho@787
|
116 |
GObjectClass *gobject_klass;
|
renatofilho@787
|
117 |
GstElementClass *gstelement_klass;
|
renatofilho@787
|
118 |
GstBinClass *gstbin_klass;
|
renatofilho@787
|
119 |
|
renatofilho@787
|
120 |
gobject_klass = (GObjectClass *) klass;
|
renatofilho@787
|
121 |
gstelement_klass = (GstElementClass *) klass;
|
renatofilho@787
|
122 |
gstbin_klass = (GstBinClass *) klass;
|
renatofilho@787
|
123 |
|
renatofilho@787
|
124 |
parent_class = g_type_class_peek_parent (klass);
|
renatofilho@787
|
125 |
|
renatofilho@787
|
126 |
gobject_klass->set_property = gst_play_bin_maemo_set_property;
|
renatofilho@787
|
127 |
gobject_klass->get_property = gst_play_bin_maemo_get_property;
|
renatofilho@787
|
128 |
|
renatofilho@787
|
129 |
g_object_class_install_property (gobject_klass, ARG_URI,
|
renatofilho@787
|
130 |
g_param_spec_string ("uri", "URI", "URI of the media to play",
|
renatofilho@787
|
131 |
NULL, G_PARAM_READWRITE));
|
renatofilho@787
|
132 |
|
renatofilho@787
|
133 |
g_object_class_install_property (gobject_klass, ARG_VOLUME,
|
renatofilho@787
|
134 |
g_param_spec_uint ("volume", "Audio volume", "volume",
|
renatofilho@787
|
135 |
0, 10, (guint) DEFAULT_VOLUME, G_PARAM_READWRITE));
|
renatofilho@787
|
136 |
|
renatofilho@787
|
137 |
g_object_class_install_property (gobject_klass, ARG_XID,
|
renatofilho@787
|
138 |
g_param_spec_long ("xid", "xid", "X windown ID",
|
renatofilho@787
|
139 |
-1, G_MAXLONG, DEFAULT_XID, G_PARAM_READWRITE));
|
renatofilho@787
|
140 |
|
renatofilho@787
|
141 |
g_object_class_install_property (gobject_klass, ARG_SOURCE,
|
renatofilho@787
|
142 |
g_param_spec_object ("source", "Source", "Source element",
|
renatofilho@787
|
143 |
GST_TYPE_ELEMENT, G_PARAM_READABLE));
|
renatofilho@787
|
144 |
|
renatofilho@787
|
145 |
GST_DEBUG_CATEGORY_INIT (gst_play_bin_maemo_debug, "playbinmaemo", 0,
|
renatofilho@787
|
146 |
"playbinmaemo");
|
renatofilho@787
|
147 |
|
renatofilho@787
|
148 |
gobject_klass->dispose = GST_DEBUG_FUNCPTR (gst_play_bin_maemo_dispose);
|
renatofilho@787
|
149 |
gobject_klass->finalize = GST_DEBUG_FUNCPTR (gst_play_bin_maemo_finalize);
|
renatofilho@787
|
150 |
|
renatofilho@787
|
151 |
gstelement_klass->change_state =
|
renatofilho@787
|
152 |
GST_DEBUG_FUNCPTR (gst_play_bin_maemo_change_state);
|
renatofilho@787
|
153 |
}
|
renatofilho@787
|
154 |
|
renatofilho@787
|
155 |
static void
|
renatofilho@787
|
156 |
gst_play_bin_maemo_init (GstPlayBinMaemo * play_bin_maemo, GstPlayBinMaemoClass *class)
|
renatofilho@787
|
157 |
{
|
renatofilho@787
|
158 |
GList *factories;
|
renatofilho@787
|
159 |
|
renatofilho@787
|
160 |
play_bin_maemo->uri = NULL;
|
renatofilho@787
|
161 |
play_bin_maemo->source = NULL;
|
renatofilho@787
|
162 |
|
renatofilho@787
|
163 |
play_bin_maemo->volume = DEFAULT_VOLUME * 65535 / 10;
|
renatofilho@787
|
164 |
play_bin_maemo->xid = DEFAULT_XID;
|
renatofilho@787
|
165 |
|
renatofilho@787
|
166 |
factories = gst_default_registry_feature_filter ((GstPluginFeatureFilter) factory_filter_sinks,
|
renatofilho@787
|
167 |
FALSE, play_bin_maemo);
|
renatofilho@787
|
168 |
|
renatofilho@787
|
169 |
play_bin_maemo->factories = g_list_sort (factories, (GCompareFunc) compare_ranks);
|
renatofilho@787
|
170 |
}
|
renatofilho@787
|
171 |
|
renatofilho@787
|
172 |
static void
|
renatofilho@787
|
173 |
gst_play_bin_maemo_dispose (GObject * object)
|
renatofilho@787
|
174 |
{
|
renatofilho@787
|
175 |
GstPlayBinMaemo *play_bin_maemo;
|
renatofilho@787
|
176 |
|
renatofilho@787
|
177 |
play_bin_maemo = GST_PLAY_BIN_MAEMO (object);
|
renatofilho@787
|
178 |
g_free (play_bin_maemo->uri);
|
renatofilho@787
|
179 |
play_bin_maemo->uri = NULL;
|
renatofilho@787
|
180 |
|
renatofilho@787
|
181 |
G_OBJECT_CLASS (parent_class)->dispose (object);
|
renatofilho@787
|
182 |
}
|
renatofilho@787
|
183 |
|
renatofilho@787
|
184 |
static void
|
renatofilho@787
|
185 |
gst_play_bin_maemo_finalize (GObject * object)
|
renatofilho@787
|
186 |
{
|
renatofilho@787
|
187 |
G_OBJECT_CLASS (parent_class)->finalize (object);
|
renatofilho@787
|
188 |
}
|
renatofilho@787
|
189 |
|
renatofilho@787
|
190 |
static gboolean
|
renatofilho@787
|
191 |
array_has_value (const gchar * values[], const gchar * value)
|
renatofilho@787
|
192 |
{
|
renatofilho@787
|
193 |
gint i;
|
renatofilho@787
|
194 |
|
renatofilho@787
|
195 |
for (i = 0; values[i]; i++) {
|
renatofilho@787
|
196 |
if (g_str_has_prefix (value, values[i]))
|
renatofilho@787
|
197 |
return TRUE;
|
renatofilho@787
|
198 |
}
|
renatofilho@787
|
199 |
return FALSE;
|
renatofilho@787
|
200 |
}
|
renatofilho@787
|
201 |
|
renatofilho@787
|
202 |
/* list of URIs that we consider to be streams and that need buffering.
|
renatofilho@787
|
203 |
* We have no mechanism yet to figure this out with a query. */
|
renatofilho@787
|
204 |
static const gchar *stream_uris[] = { "http://", "mms://", "mmsh://",
|
renatofilho@787
|
205 |
"mmsu://", "mmst://", NULL
|
renatofilho@787
|
206 |
};
|
renatofilho@787
|
207 |
|
renatofilho@787
|
208 |
/* blacklisted URIs, we know they will always fail. */
|
renatofilho@787
|
209 |
static const gchar *blacklisted_uris[] = { NULL };
|
renatofilho@787
|
210 |
|
renatofilho@787
|
211 |
/* mime types that we don't consider to be media types */
|
renatofilho@787
|
212 |
static const gchar *no_media_mimes[] = {
|
renatofilho@787
|
213 |
"application/x-executable", "application/x-bzip", "application/x-gzip",
|
renatofilho@787
|
214 |
"application/zip", "application/x-compress", NULL
|
renatofilho@787
|
215 |
};
|
renatofilho@787
|
216 |
|
renatofilho@787
|
217 |
/* mime types we consider raw media */
|
renatofilho@787
|
218 |
static const gchar *raw_mimes[] = {
|
renatofilho@787
|
219 |
"audio/x-raw", "video/x-raw", NULL
|
renatofilho@787
|
220 |
};
|
renatofilho@787
|
221 |
|
renatofilho@787
|
222 |
#define IS_STREAM_URI(uri) (array_has_value (stream_uris, uri))
|
renatofilho@787
|
223 |
#define IS_BLACKLISTED_URI(uri) (array_has_value (blacklisted_uris, uri))
|
renatofilho@787
|
224 |
#define IS_NO_MEDIA_MIME(mime) (array_has_value (no_media_mimes, mime))
|
renatofilho@787
|
225 |
#define IS_RAW_MIME(mime) (array_has_value (raw_mimes, mime))
|
renatofilho@787
|
226 |
|
renatofilho@787
|
227 |
/*
|
renatofilho@787
|
228 |
* Generate and configure a source element.
|
renatofilho@787
|
229 |
*/
|
renatofilho@787
|
230 |
static GstElement *
|
renatofilho@787
|
231 |
gen_source_element (GstPlayBinMaemo * play_bin_maemo)
|
renatofilho@787
|
232 |
{
|
renatofilho@787
|
233 |
GstElement *source;
|
renatofilho@787
|
234 |
|
renatofilho@787
|
235 |
if (!play_bin_maemo->uri)
|
renatofilho@787
|
236 |
goto no_uri;
|
renatofilho@787
|
237 |
|
renatofilho@787
|
238 |
if (!gst_uri_is_valid (play_bin_maemo->uri))
|
renatofilho@787
|
239 |
goto invalid_uri;
|
renatofilho@787
|
240 |
|
renatofilho@787
|
241 |
if (IS_BLACKLISTED_URI (play_bin_maemo->uri))
|
renatofilho@787
|
242 |
goto uri_blacklisted;
|
renatofilho@787
|
243 |
|
renatofilho@787
|
244 |
source = gst_element_make_from_uri (GST_URI_SRC, play_bin_maemo->uri,
|
renatofilho@787
|
245 |
"source");
|
renatofilho@787
|
246 |
if (!source)
|
renatofilho@787
|
247 |
goto no_source;
|
renatofilho@787
|
248 |
|
renatofilho@787
|
249 |
play_bin_maemo->is_stream = IS_STREAM_URI (play_bin_maemo->uri);
|
renatofilho@787
|
250 |
|
renatofilho@787
|
251 |
/* make HTTP sources send extra headers so we get icecast
|
renatofilho@787
|
252 |
* metadata in case the stream is an icecast stream */
|
renatofilho@787
|
253 |
if (!strncmp (play_bin_maemo->uri, "http://", 7) &&
|
renatofilho@787
|
254 |
g_object_class_find_property (G_OBJECT_GET_CLASS (source),
|
renatofilho@787
|
255 |
"iradio-mode")) {
|
renatofilho@787
|
256 |
g_object_set (source, "iradio-mode", TRUE, NULL);
|
renatofilho@787
|
257 |
}
|
renatofilho@787
|
258 |
return source;
|
renatofilho@787
|
259 |
|
renatofilho@787
|
260 |
/* ERRORS */
|
renatofilho@787
|
261 |
no_uri:
|
renatofilho@787
|
262 |
{
|
renatofilho@787
|
263 |
GST_ELEMENT_ERROR (play_bin_maemo, RESOURCE, NOT_FOUND,
|
renatofilho@787
|
264 |
(_("No URI specified to play from.")), (NULL));
|
renatofilho@787
|
265 |
return NULL;
|
renatofilho@787
|
266 |
}
|
renatofilho@787
|
267 |
invalid_uri:
|
renatofilho@787
|
268 |
{
|
renatofilho@787
|
269 |
GST_ELEMENT_ERROR (play_bin_maemo, RESOURCE, NOT_FOUND,
|
renatofilho@787
|
270 |
(_("Invalid URI \"%s\"."), play_bin_maemo->uri), (NULL));
|
renatofilho@787
|
271 |
return NULL;
|
renatofilho@787
|
272 |
}
|
renatofilho@787
|
273 |
uri_blacklisted:
|
renatofilho@787
|
274 |
{
|
renatofilho@787
|
275 |
GST_ELEMENT_ERROR (play_bin_maemo, RESOURCE, FAILED,
|
renatofilho@787
|
276 |
(_("RTSP streams cannot be played yet.")), (NULL));
|
renatofilho@787
|
277 |
return NULL;
|
renatofilho@787
|
278 |
}
|
renatofilho@787
|
279 |
no_source:
|
renatofilho@787
|
280 |
{
|
renatofilho@787
|
281 |
gchar *prot = gst_uri_get_protocol (play_bin_maemo->uri);
|
renatofilho@787
|
282 |
|
renatofilho@787
|
283 |
/* whoops, could not create the source element, dig a little deeper to
|
renatofilho@787
|
284 |
* figure out what might be wrong. */
|
renatofilho@787
|
285 |
if (prot) {
|
renatofilho@787
|
286 |
gchar *desc;
|
renatofilho@787
|
287 |
|
renatofilho@787
|
288 |
/*
|
renatofilho@787
|
289 |
gst_element_post_message (GST_ELEMENT (play_bin_maemo),
|
renatofilho@787
|
290 |
gst_missing_uri_source_message_new (GST_ELEMENT (play_bin_maemo),
|
renatofilho@787
|
291 |
prot));
|
renatofilho@787
|
292 |
|
renatofilho@787
|
293 |
desc = gst_pb_utils_get_source_description (prot);
|
renatofilho@787
|
294 |
GST_ELEMENT_ERROR (play_bin_maemo, CORE, MISSING_PLUGIN,
|
renatofilho@787
|
295 |
(_("A %s plugin is required to play this stream, but not installed."),
|
renatofilho@787
|
296 |
desc), ("No URI handler for %s", prot));
|
renatofilho@787
|
297 |
*/
|
renatofilho@787
|
298 |
g_free (desc);
|
renatofilho@787
|
299 |
g_free (prot);
|
renatofilho@787
|
300 |
} else
|
renatofilho@787
|
301 |
goto invalid_uri;
|
renatofilho@787
|
302 |
|
renatofilho@787
|
303 |
return NULL;
|
renatofilho@787
|
304 |
}
|
renatofilho@787
|
305 |
}
|
renatofilho@787
|
306 |
|
renatofilho@787
|
307 |
static void
|
renatofilho@787
|
308 |
remove_source (GstPlayBinMaemo *pbm)
|
renatofilho@787
|
309 |
{
|
renatofilho@787
|
310 |
GstElement *source = pbm->source;
|
renatofilho@787
|
311 |
|
renatofilho@787
|
312 |
if (source) {
|
renatofilho@787
|
313 |
GST_DEBUG_OBJECT (pbm, "removing old src element");
|
renatofilho@787
|
314 |
gst_element_set_state (source, GST_STATE_NULL);
|
renatofilho@787
|
315 |
gst_bin_remove (GST_BIN_CAST (pbm), source);
|
renatofilho@787
|
316 |
pbm->source = NULL;
|
renatofilho@787
|
317 |
}
|
renatofilho@787
|
318 |
}
|
renatofilho@787
|
319 |
|
renatofilho@787
|
320 |
static void
|
renatofilho@787
|
321 |
remove_decoders (GstPlayBinMaemo *pbm)
|
renatofilho@787
|
322 |
{
|
renatofilho@787
|
323 |
if (pbm->queue != NULL) {
|
renatofilho@787
|
324 |
gst_element_set_state (pbm->queue, GST_STATE_NULL);
|
renatofilho@787
|
325 |
gst_bin_remove (GST_BIN_CAST (pbm), pbm->queue);
|
renatofilho@787
|
326 |
pbm->queue = NULL;
|
renatofilho@787
|
327 |
}
|
renatofilho@787
|
328 |
|
renatofilho@787
|
329 |
if (pbm->decoder != NULL) {
|
renatofilho@787
|
330 |
gst_element_set_state (pbm->decoder, GST_STATE_NULL);
|
renatofilho@787
|
331 |
gst_bin_remove (GST_BIN_CAST (pbm), pbm->decoder);
|
renatofilho@787
|
332 |
pbm->decoder = NULL;
|
renatofilho@787
|
333 |
}
|
renatofilho@787
|
334 |
}
|
renatofilho@787
|
335 |
|
renatofilho@787
|
336 |
static void
|
renatofilho@787
|
337 |
remove_sinks (GstPlayBinMaemo *pbm)
|
renatofilho@787
|
338 |
{
|
renatofilho@787
|
339 |
GSList *walk;
|
renatofilho@787
|
340 |
|
renatofilho@787
|
341 |
for(walk=pbm->sinks; walk != NULL; walk = walk->next) {
|
renatofilho@787
|
342 |
GstElement *element = (GstElement *) walk->data;
|
renatofilho@787
|
343 |
|
renatofilho@787
|
344 |
gst_element_set_state (element, GST_STATE_NULL);
|
renatofilho@787
|
345 |
gst_bin_remove (GST_BIN_CAST (pbm), element);
|
renatofilho@787
|
346 |
}
|
renatofilho@787
|
347 |
|
renatofilho@787
|
348 |
g_slist_free (pbm->sinks);
|
renatofilho@787
|
349 |
pbm->sinks = NULL;
|
renatofilho@787
|
350 |
}
|
renatofilho@787
|
351 |
|
renatofilho@787
|
352 |
static void
|
renatofilho@787
|
353 |
prepare_elements (GstPlayBinMaemo *pbm)
|
renatofilho@787
|
354 |
{
|
renatofilho@787
|
355 |
if (pbm->decoder == NULL) {
|
renatofilho@787
|
356 |
pbm->decoder = gst_element_factory_make ("decodebin2", "decode");
|
renatofilho@787
|
357 |
gst_bin_add (GST_BIN (pbm), pbm->decoder);
|
renatofilho@787
|
358 |
g_signal_connect (G_OBJECT (pbm->decoder),
|
renatofilho@787
|
359 |
"autoplug-continue",
|
renatofilho@787
|
360 |
G_CALLBACK (autoplug_continue_cb),
|
renatofilho@787
|
361 |
pbm);
|
renatofilho@787
|
362 |
g_signal_connect (G_OBJECT (pbm->decoder),
|
renatofilho@787
|
363 |
"unknown-type",
|
renatofilho@787
|
364 |
G_CALLBACK (unknown_type_cb),
|
renatofilho@787
|
365 |
pbm);
|
renatofilho@787
|
366 |
g_signal_connect (G_OBJECT (pbm->decoder),
|
renatofilho@787
|
367 |
"new-decoded-pad",
|
renatofilho@787
|
368 |
G_CALLBACK (new_decoded_pad_cb),
|
renatofilho@787
|
369 |
pbm);
|
renatofilho@787
|
370 |
}
|
renatofilho@787
|
371 |
|
renatofilho@787
|
372 |
if (pbm->queue == NULL) {
|
renatofilho@787
|
373 |
pbm->queue = gst_element_factory_make ("queue", NULL);
|
renatofilho@787
|
374 |
gst_bin_add (GST_BIN (pbm), pbm->queue);
|
renatofilho@787
|
375 |
}
|
renatofilho@787
|
376 |
|
renatofilho@787
|
377 |
if (gst_element_link_many (pbm->source, pbm->queue, pbm->decoder, NULL) == FALSE) {
|
renatofilho@787
|
378 |
g_warning ("FAIL TO LINK SRC WITH DECODEBIN2");
|
renatofilho@787
|
379 |
}
|
renatofilho@787
|
380 |
}
|
renatofilho@787
|
381 |
|
renatofilho@787
|
382 |
static gboolean
|
renatofilho@787
|
383 |
setup_source (GstPlayBinMaemo *pbm)
|
renatofilho@787
|
384 |
{
|
renatofilho@787
|
385 |
if (!pbm->need_rebuild)
|
renatofilho@787
|
386 |
return TRUE;
|
renatofilho@787
|
387 |
|
renatofilho@787
|
388 |
GST_DEBUG_OBJECT (pbm, "setup source");
|
renatofilho@787
|
389 |
|
renatofilho@787
|
390 |
/* delete old src */
|
renatofilho@787
|
391 |
remove_source (pbm);
|
renatofilho@787
|
392 |
|
renatofilho@787
|
393 |
/* create and configure an element that can handle the uri */
|
renatofilho@787
|
394 |
if (!(pbm->source = gen_source_element (pbm)))
|
renatofilho@787
|
395 |
goto no_source;
|
renatofilho@787
|
396 |
|
renatofilho@787
|
397 |
|
renatofilho@787
|
398 |
gst_bin_add (GST_BIN_CAST (pbm), pbm->source);
|
renatofilho@787
|
399 |
|
renatofilho@787
|
400 |
remove_decoders (pbm);
|
renatofilho@787
|
401 |
|
renatofilho@787
|
402 |
remove_sinks (pbm);
|
renatofilho@787
|
403 |
|
renatofilho@787
|
404 |
#if 0
|
renatofilho@787
|
405 |
if (verify_src_have_sink (pbm)) {
|
renatofilho@787
|
406 |
/* source can be linked with sinks directly */
|
renatofilho@787
|
407 |
return TRUE;
|
renatofilho@787
|
408 |
}
|
renatofilho@787
|
409 |
#endif
|
renatofilho@787
|
410 |
|
renatofilho@787
|
411 |
prepare_elements (pbm);
|
renatofilho@787
|
412 |
|
renatofilho@787
|
413 |
return TRUE;
|
renatofilho@787
|
414 |
|
renatofilho@787
|
415 |
no_source:
|
renatofilho@787
|
416 |
return FALSE;
|
renatofilho@787
|
417 |
}
|
renatofilho@787
|
418 |
|
renatofilho@787
|
419 |
static void
|
renatofilho@787
|
420 |
gst_play_bin_maemo_set_property (GObject *object,
|
renatofilho@787
|
421 |
guint prop_id,
|
renatofilho@787
|
422 |
const GValue *value,
|
renatofilho@787
|
423 |
GParamSpec *pspec)
|
renatofilho@787
|
424 |
{
|
renatofilho@787
|
425 |
GstPlayBinMaemo *play_bin_maemo;
|
renatofilho@787
|
426 |
|
renatofilho@787
|
427 |
g_return_if_fail (GST_IS_PLAY_BIN_MAEMO (object));
|
renatofilho@787
|
428 |
|
renatofilho@787
|
429 |
play_bin_maemo = GST_PLAY_BIN_MAEMO (object);
|
renatofilho@787
|
430 |
|
renatofilho@787
|
431 |
switch (prop_id) {
|
renatofilho@787
|
432 |
case ARG_URI:
|
renatofilho@787
|
433 |
{
|
renatofilho@787
|
434 |
const gchar *uri = g_value_get_string (value);
|
renatofilho@787
|
435 |
|
renatofilho@787
|
436 |
if (uri == NULL) {
|
renatofilho@787
|
437 |
g_warning ("cannot set NULL uri");
|
renatofilho@787
|
438 |
return;
|
renatofilho@787
|
439 |
}
|
renatofilho@787
|
440 |
/* if we have no previous uri, or the new uri is different from the
|
renatofilho@787
|
441 |
* old one, replug */
|
renatofilho@787
|
442 |
if (play_bin_maemo->uri == NULL || strcmp (play_bin_maemo->uri, uri) != 0) {
|
renatofilho@787
|
443 |
g_free (play_bin_maemo->uri);
|
renatofilho@787
|
444 |
play_bin_maemo->uri = g_strdup (uri);
|
renatofilho@787
|
445 |
|
renatofilho@787
|
446 |
GST_DEBUG ("setting new uri to %s", uri);
|
renatofilho@787
|
447 |
|
renatofilho@787
|
448 |
play_bin_maemo->need_rebuild = TRUE;
|
renatofilho@787
|
449 |
}
|
renatofilho@787
|
450 |
break;
|
renatofilho@787
|
451 |
}
|
renatofilho@787
|
452 |
case ARG_VOLUME:
|
renatofilho@787
|
453 |
{
|
renatofilho@787
|
454 |
guint volume;
|
renatofilho@787
|
455 |
volume = g_value_get_uint (value);
|
renatofilho@787
|
456 |
if (volume != 0) {
|
renatofilho@787
|
457 |
volume = (guint) (65535 * volume / 10);
|
renatofilho@787
|
458 |
}
|
renatofilho@787
|
459 |
|
renatofilho@787
|
460 |
if (play_bin_maemo->volume != volume) {
|
renatofilho@787
|
461 |
play_bin_maemo->volume = volume;
|
renatofilho@787
|
462 |
update_volume (play_bin_maemo);
|
renatofilho@787
|
463 |
}
|
renatofilho@787
|
464 |
break;
|
renatofilho@787
|
465 |
}
|
renatofilho@787
|
466 |
case ARG_XID:
|
renatofilho@787
|
467 |
{
|
renatofilho@787
|
468 |
long xid;
|
renatofilho@787
|
469 |
xid = g_value_get_long (value);
|
renatofilho@787
|
470 |
if (play_bin_maemo->xid != xid) {
|
renatofilho@787
|
471 |
play_bin_maemo->xid = xid;
|
renatofilho@787
|
472 |
update_xid (play_bin_maemo);
|
renatofilho@787
|
473 |
}
|
renatofilho@787
|
474 |
break;
|
renatofilho@787
|
475 |
}
|
renatofilho@787
|
476 |
default:
|
renatofilho@787
|
477 |
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
renatofilho@787
|
478 |
break;
|
renatofilho@787
|
479 |
}
|
renatofilho@787
|
480 |
}
|
renatofilho@787
|
481 |
|
renatofilho@787
|
482 |
static void
|
renatofilho@787
|
483 |
gst_play_bin_maemo_get_property (GObject * object, guint prop_id, GValue * value,
|
renatofilho@787
|
484 |
GParamSpec * pspec)
|
renatofilho@787
|
485 |
{
|
renatofilho@787
|
486 |
GstPlayBinMaemo *play_bin_maemo;
|
renatofilho@787
|
487 |
|
renatofilho@787
|
488 |
g_return_if_fail (GST_IS_PLAY_BIN_MAEMO (object));
|
renatofilho@787
|
489 |
|
renatofilho@787
|
490 |
play_bin_maemo = GST_PLAY_BIN_MAEMO (object);
|
renatofilho@787
|
491 |
|
renatofilho@787
|
492 |
switch (prop_id) {
|
renatofilho@787
|
493 |
case ARG_URI:
|
renatofilho@787
|
494 |
g_value_set_string (value, play_bin_maemo->uri);
|
renatofilho@787
|
495 |
break;
|
renatofilho@787
|
496 |
case ARG_SOURCE:
|
renatofilho@787
|
497 |
g_value_set_object (value, play_bin_maemo->source);
|
renatofilho@787
|
498 |
break;
|
renatofilho@787
|
499 |
case ARG_VOLUME:
|
renatofilho@787
|
500 |
g_value_set_uint (value, play_bin_maemo->volume);
|
renatofilho@787
|
501 |
break;
|
renatofilho@787
|
502 |
case ARG_XID:
|
renatofilho@787
|
503 |
g_value_set_long (value, play_bin_maemo->xid);
|
renatofilho@787
|
504 |
break;
|
renatofilho@787
|
505 |
default:
|
renatofilho@787
|
506 |
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
renatofilho@787
|
507 |
break;
|
renatofilho@787
|
508 |
}
|
renatofilho@787
|
509 |
}
|
renatofilho@787
|
510 |
|
renatofilho@787
|
511 |
static GstStateChangeReturn
|
renatofilho@787
|
512 |
gst_play_bin_maemo_change_state (GstElement * element, GstStateChange transition)
|
renatofilho@787
|
513 |
{
|
renatofilho@787
|
514 |
GstStateChangeReturn ret;
|
renatofilho@787
|
515 |
GstPlayBinMaemo *play_bin_maemo;
|
renatofilho@787
|
516 |
|
renatofilho@787
|
517 |
play_bin_maemo = GST_PLAY_BIN_MAEMO (element);
|
renatofilho@787
|
518 |
|
renatofilho@787
|
519 |
switch (transition) {
|
renatofilho@787
|
520 |
case GST_STATE_CHANGE_READY_TO_PAUSED:
|
renatofilho@787
|
521 |
if (!setup_source (play_bin_maemo))
|
renatofilho@787
|
522 |
goto source_failed;
|
renatofilho@787
|
523 |
break;
|
renatofilho@787
|
524 |
default:
|
renatofilho@787
|
525 |
break;
|
renatofilho@787
|
526 |
}
|
renatofilho@787
|
527 |
|
renatofilho@787
|
528 |
ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
|
renatofilho@787
|
529 |
|
renatofilho@787
|
530 |
switch (transition) {
|
renatofilho@787
|
531 |
case GST_STATE_CHANGE_READY_TO_PAUSED:
|
renatofilho@787
|
532 |
if (ret == GST_STATE_CHANGE_FAILURE) {
|
renatofilho@787
|
533 |
play_bin_maemo->need_rebuild = TRUE;
|
renatofilho@787
|
534 |
return GST_STATE_CHANGE_FAILURE;
|
renatofilho@787
|
535 |
}
|
renatofilho@787
|
536 |
break;
|
renatofilho@787
|
537 |
/* clean-up in both cases, READY=>NULL clean-up is if there was an error */
|
renatofilho@787
|
538 |
case GST_STATE_CHANGE_PAUSED_TO_READY:
|
renatofilho@787
|
539 |
case GST_STATE_CHANGE_READY_TO_NULL:
|
renatofilho@787
|
540 |
play_bin_maemo->need_rebuild = TRUE;
|
renatofilho@787
|
541 |
remove_decoders (play_bin_maemo);
|
renatofilho@787
|
542 |
remove_source (play_bin_maemo);
|
renatofilho@787
|
543 |
break;
|
renatofilho@787
|
544 |
default:
|
renatofilho@787
|
545 |
break;
|
renatofilho@787
|
546 |
}
|
renatofilho@787
|
547 |
return ret;
|
renatofilho@787
|
548 |
|
renatofilho@787
|
549 |
/* ERRORS */
|
renatofilho@787
|
550 |
source_failed:
|
renatofilho@787
|
551 |
{
|
renatofilho@787
|
552 |
play_bin_maemo->need_rebuild = TRUE;
|
renatofilho@787
|
553 |
|
renatofilho@787
|
554 |
return GST_STATE_CHANGE_FAILURE;
|
renatofilho@787
|
555 |
}
|
renatofilho@787
|
556 |
}
|
renatofilho@787
|
557 |
|
renatofilho@787
|
558 |
static gboolean
|
renatofilho@787
|
559 |
factory_filter_sinks (GstPluginFeature *feature,
|
renatofilho@787
|
560 |
GstPlayBinMaemo *pbm)
|
renatofilho@787
|
561 |
{
|
renatofilho@787
|
562 |
guint rank;
|
renatofilho@787
|
563 |
const gchar *klass;
|
renatofilho@787
|
564 |
|
renatofilho@787
|
565 |
if (!GST_IS_ELEMENT_FACTORY (feature))
|
renatofilho@787
|
566 |
return FALSE;
|
renatofilho@787
|
567 |
|
renatofilho@787
|
568 |
klass = gst_element_factory_get_klass (GST_ELEMENT_FACTORY (feature));
|
renatofilho@787
|
569 |
|
renatofilho@787
|
570 |
if ((strstr (klass, "Sink/Video") == NULL) && (strstr (klass, "Sink/Audio") == NULL))
|
renatofilho@787
|
571 |
return FALSE;
|
renatofilho@787
|
572 |
|
renatofilho@787
|
573 |
g_debug ("Fitered: %s", gst_element_factory_get_longname ((GST_ELEMENT_FACTORY (feature))));
|
renatofilho@787
|
574 |
rank = gst_plugin_feature_get_rank (feature);
|
renatofilho@787
|
575 |
if (rank < GST_RANK_MARGINAL)
|
renatofilho@787
|
576 |
return FALSE;
|
renatofilho@787
|
577 |
|
renatofilho@787
|
578 |
return TRUE;
|
renatofilho@787
|
579 |
}
|
renatofilho@787
|
580 |
|
renatofilho@787
|
581 |
static gint
|
renatofilho@787
|
582 |
compare_ranks (GstPluginFeature * f1, GstPluginFeature * f2)
|
renatofilho@787
|
583 |
{
|
renatofilho@787
|
584 |
gint diff;
|
renatofilho@787
|
585 |
const gchar *rname1, *rname2;
|
renatofilho@787
|
586 |
|
renatofilho@787
|
587 |
diff = gst_plugin_feature_get_rank (f2) - gst_plugin_feature_get_rank (f1);
|
renatofilho@787
|
588 |
if (diff != 0)
|
renatofilho@787
|
589 |
return diff;
|
renatofilho@787
|
590 |
|
renatofilho@787
|
591 |
rname1 = gst_plugin_feature_get_name (f1);
|
renatofilho@787
|
592 |
rname2 = gst_plugin_feature_get_name (f2);
|
renatofilho@787
|
593 |
|
renatofilho@787
|
594 |
diff = strcmp (rname2, rname1);
|
renatofilho@787
|
595 |
|
renatofilho@787
|
596 |
return diff;
|
renatofilho@787
|
597 |
}
|
renatofilho@787
|
598 |
|
renatofilho@787
|
599 |
|
renatofilho@787
|
600 |
static GList *
|
renatofilho@787
|
601 |
find_compatibles (GstPlayBinMaemo *pbm, const GstCaps *caps)
|
renatofilho@787
|
602 |
{
|
renatofilho@787
|
603 |
GList *factories;
|
renatofilho@787
|
604 |
GList *to_try = NULL;
|
renatofilho@787
|
605 |
|
renatofilho@787
|
606 |
/* loop over all the factories */
|
renatofilho@787
|
607 |
for (factories = pbm->factories; factories; factories = g_list_next (factories)) {
|
renatofilho@787
|
608 |
GstElementFactory *factory = GST_ELEMENT_FACTORY (factories->data);
|
renatofilho@787
|
609 |
const GList *templates;
|
renatofilho@787
|
610 |
GList *walk;
|
renatofilho@787
|
611 |
|
renatofilho@787
|
612 |
/* get the templates from the element factory */
|
renatofilho@787
|
613 |
templates = gst_element_factory_get_static_pad_templates (factory);
|
renatofilho@787
|
614 |
for (walk = (GList *) templates; walk; walk = g_list_next (walk)) {
|
renatofilho@787
|
615 |
GstStaticPadTemplate *templ = walk->data;
|
renatofilho@787
|
616 |
|
renatofilho@787
|
617 |
/* we only care about the sink templates */
|
renatofilho@787
|
618 |
if (templ->direction == GST_PAD_SINK) {
|
renatofilho@787
|
619 |
GstCaps *intersect;
|
renatofilho@787
|
620 |
GstCaps *tmpl_caps;
|
renatofilho@787
|
621 |
|
renatofilho@787
|
622 |
/* try to intersect the caps with the caps of the template */
|
renatofilho@787
|
623 |
tmpl_caps = gst_static_caps_get (&templ->static_caps);
|
renatofilho@787
|
624 |
|
renatofilho@787
|
625 |
intersect = gst_caps_intersect (caps, tmpl_caps);
|
renatofilho@787
|
626 |
gst_caps_unref (tmpl_caps);
|
renatofilho@787
|
627 |
|
renatofilho@787
|
628 |
/* check if the intersection is empty */
|
renatofilho@787
|
629 |
if (!gst_caps_is_empty (intersect)) {
|
renatofilho@787
|
630 |
/* non empty intersection, we can use this element */
|
renatofilho@787
|
631 |
to_try = g_list_prepend (to_try, factory);
|
renatofilho@787
|
632 |
gst_caps_unref (intersect);
|
renatofilho@787
|
633 |
break;
|
renatofilho@787
|
634 |
}
|
renatofilho@787
|
635 |
gst_caps_unref (intersect);
|
renatofilho@787
|
636 |
}
|
renatofilho@787
|
637 |
}
|
renatofilho@787
|
638 |
}
|
renatofilho@787
|
639 |
to_try = g_list_reverse (to_try);
|
renatofilho@787
|
640 |
|
renatofilho@787
|
641 |
return to_try;
|
renatofilho@787
|
642 |
}
|
renatofilho@787
|
643 |
|
renatofilho@787
|
644 |
|
renatofilho@787
|
645 |
static gboolean
|
renatofilho@787
|
646 |
autoplug_continue_cb (GstElement* object,
|
renatofilho@787
|
647 |
GstCaps* caps,
|
renatofilho@787
|
648 |
gpointer user_data)
|
renatofilho@787
|
649 |
{
|
renatofilho@787
|
650 |
GList *comp = NULL;
|
renatofilho@787
|
651 |
gboolean ret = TRUE;
|
renatofilho@787
|
652 |
|
renatofilho@787
|
653 |
comp = find_compatibles (GST_PLAY_BIN_MAEMO (user_data), caps);
|
renatofilho@787
|
654 |
if (comp != NULL) {
|
renatofilho@787
|
655 |
g_list_free (comp);
|
renatofilho@787
|
656 |
ret = FALSE;
|
renatofilho@787
|
657 |
}
|
renatofilho@787
|
658 |
|
renatofilho@787
|
659 |
return ret;
|
renatofilho@787
|
660 |
}
|
renatofilho@787
|
661 |
|
renatofilho@787
|
662 |
static void
|
renatofilho@787
|
663 |
unknown_type_cb (GstElement *object,
|
renatofilho@787
|
664 |
GstPad *pad,
|
renatofilho@787
|
665 |
GstCaps *caps,
|
renatofilho@787
|
666 |
gpointer user_data)
|
renatofilho@787
|
667 |
{
|
renatofilho@787
|
668 |
g_debug ("unknown_type_cb: %s", gst_caps_to_string (caps));
|
renatofilho@787
|
669 |
}
|
renatofilho@787
|
670 |
|
renatofilho@787
|
671 |
static GstPad *
|
renatofilho@787
|
672 |
find_sink_pad (GstElement * element)
|
renatofilho@787
|
673 |
{
|
renatofilho@787
|
674 |
GstIterator *it;
|
renatofilho@787
|
675 |
GstPad *pad = NULL;
|
renatofilho@787
|
676 |
gpointer point;
|
renatofilho@787
|
677 |
|
renatofilho@787
|
678 |
it = gst_element_iterate_sink_pads (element);
|
renatofilho@787
|
679 |
|
renatofilho@787
|
680 |
if ((gst_iterator_next (it, &point)) == GST_ITERATOR_OK)
|
renatofilho@787
|
681 |
pad = (GstPad *) point;
|
renatofilho@787
|
682 |
|
renatofilho@787
|
683 |
gst_iterator_free (it);
|
renatofilho@787
|
684 |
|
renatofilho@787
|
685 |
return pad;
|
renatofilho@787
|
686 |
}
|
renatofilho@787
|
687 |
|
renatofilho@787
|
688 |
static void
|
renatofilho@787
|
689 |
new_decoded_pad_cb (GstElement *object,
|
renatofilho@787
|
690 |
GstPad* pad,
|
renatofilho@787
|
691 |
gboolean arg,
|
renatofilho@787
|
692 |
gpointer user_data)
|
renatofilho@787
|
693 |
{
|
renatofilho@787
|
694 |
GList *comp = NULL;
|
renatofilho@787
|
695 |
GList *walk;
|
renatofilho@787
|
696 |
GstCaps *caps;
|
renatofilho@787
|
697 |
gboolean linked;
|
renatofilho@787
|
698 |
GstPlayBinMaemo *pbm;
|
renatofilho@787
|
699 |
|
renatofilho@787
|
700 |
pbm = GST_PLAY_BIN_MAEMO (user_data);
|
renatofilho@787
|
701 |
caps = gst_pad_get_caps (pad);
|
renatofilho@787
|
702 |
|
renatofilho@787
|
703 |
g_debug ("new_decoded_pad_cb: %s", gst_caps_to_string (caps));
|
renatofilho@787
|
704 |
|
renatofilho@787
|
705 |
comp = find_compatibles (GST_PLAY_BIN_MAEMO (user_data), caps);
|
renatofilho@787
|
706 |
|
renatofilho@787
|
707 |
|
renatofilho@787
|
708 |
if (comp == NULL) {
|
renatofilho@787
|
709 |
g_warning ("flow error: dont find comaptible");
|
renatofilho@787
|
710 |
return;
|
renatofilho@787
|
711 |
}
|
renatofilho@787
|
712 |
|
renatofilho@787
|
713 |
GST_PAD_STREAM_LOCK (pad);
|
renatofilho@787
|
714 |
|
renatofilho@787
|
715 |
linked = FALSE;
|
renatofilho@787
|
716 |
for (walk=comp; walk != NULL; walk = walk->next) {
|
renatofilho@787
|
717 |
GstElementFactory *factory = (GstElementFactory *) walk->data;
|
renatofilho@787
|
718 |
GstElement *element;
|
renatofilho@787
|
719 |
GstPad *sinkpad;
|
renatofilho@787
|
720 |
|
renatofilho@787
|
721 |
if ((element = gst_element_factory_create (factory, NULL)) == NULL) {
|
renatofilho@787
|
722 |
GST_WARNING_OBJECT (pbm, "Could not create an element from %s",
|
renatofilho@787
|
723 |
gst_plugin_feature_get_name (GST_PLUGIN_FEATURE (factory)));
|
renatofilho@787
|
724 |
continue;
|
renatofilho@787
|
725 |
}
|
renatofilho@787
|
726 |
|
renatofilho@787
|
727 |
if (strstr (gst_element_factory_get_klass (factory), "Sink/Video") != NULL) {
|
renatofilho@787
|
728 |
pbm->sink_video = element;
|
renatofilho@787
|
729 |
update_xid (pbm);
|
renatofilho@787
|
730 |
} else if (strstr (gst_element_factory_get_klass (factory), "Sink/Audio") != NULL) {
|
renatofilho@787
|
731 |
pbm->volume_element = element;
|
renatofilho@787
|
732 |
update_volume (pbm);
|
renatofilho@787
|
733 |
}
|
renatofilho@787
|
734 |
|
renatofilho@787
|
735 |
if (!(gst_bin_add (GST_BIN (user_data), element))) {
|
renatofilho@787
|
736 |
GST_WARNING_OBJECT (pbm, "Couldn't set %s to READY",
|
renatofilho@787
|
737 |
GST_ELEMENT_NAME (element));
|
renatofilho@787
|
738 |
gst_object_unref (element);
|
renatofilho@787
|
739 |
continue;
|
renatofilho@787
|
740 |
}
|
renatofilho@787
|
741 |
|
renatofilho@787
|
742 |
if ((gst_element_set_state (element, GST_STATE_READY))
|
renatofilho@787
|
743 |
== GST_STATE_CHANGE_FAILURE) {
|
renatofilho@787
|
744 |
gst_element_set_state (element, GST_STATE_NULL);
|
renatofilho@787
|
745 |
gst_object_unref (sinkpad);
|
renatofilho@787
|
746 |
gst_bin_remove (GST_BIN (user_data), element);
|
renatofilho@787
|
747 |
continue;
|
renatofilho@787
|
748 |
}
|
renatofilho@787
|
749 |
|
renatofilho@787
|
750 |
if (!(sinkpad = find_sink_pad (element))) {
|
renatofilho@787
|
751 |
GST_WARNING_OBJECT (pbm, "Element %s doesn't have a sink pad", GST_ELEMENT_NAME (element));
|
renatofilho@787
|
752 |
gst_object_unref (element);
|
renatofilho@787
|
753 |
continue;
|
renatofilho@787
|
754 |
}
|
renatofilho@787
|
755 |
|
renatofilho@787
|
756 |
|
renatofilho@787
|
757 |
if ((gst_pad_link (pad, sinkpad)) != GST_PAD_LINK_OK) {
|
renatofilho@787
|
758 |
GST_WARNING_OBJECT (pbm, "Link failed on pad %s:%s",
|
renatofilho@787
|
759 |
GST_DEBUG_PAD_NAME (sinkpad));
|
renatofilho@787
|
760 |
gst_element_set_state (element, GST_STATE_NULL);
|
renatofilho@787
|
761 |
gst_object_unref (sinkpad);
|
renatofilho@787
|
762 |
gst_bin_remove (GST_BIN (user_data), element);
|
renatofilho@787
|
763 |
continue;
|
renatofilho@787
|
764 |
}
|
renatofilho@787
|
765 |
|
renatofilho@787
|
766 |
gst_object_unref (sinkpad);
|
renatofilho@787
|
767 |
|
renatofilho@787
|
768 |
if ((gst_element_set_state (element, GST_STATE_PAUSED)) == GST_STATE_CHANGE_FAILURE) {
|
renatofilho@787
|
769 |
gst_element_set_state (element, GST_STATE_NULL);
|
renatofilho@787
|
770 |
gst_bin_remove (GST_BIN (user_data), element);
|
renatofilho@787
|
771 |
continue;
|
renatofilho@787
|
772 |
}
|
renatofilho@787
|
773 |
|
renatofilho@787
|
774 |
|
renatofilho@787
|
775 |
pbm->sinks = g_slist_append (pbm->sinks, element);
|
renatofilho@787
|
776 |
linked = TRUE;
|
renatofilho@787
|
777 |
break;
|
renatofilho@787
|
778 |
}
|
renatofilho@787
|
779 |
|
renatofilho@787
|
780 |
g_list_free (comp);
|
renatofilho@787
|
781 |
if (linked == FALSE) {
|
renatofilho@787
|
782 |
g_warning ("GstFlow ERROR");
|
renatofilho@787
|
783 |
}
|
renatofilho@787
|
784 |
GST_PAD_STREAM_UNLOCK (pad);
|
renatofilho@787
|
785 |
}
|
renatofilho@787
|
786 |
|
renatofilho@787
|
787 |
static void
|
renatofilho@787
|
788 |
update_volume (GstPlayBinMaemo *pbm)
|
renatofilho@787
|
789 |
{
|
renatofilho@787
|
790 |
if (pbm->volume_element != NULL) {
|
renatofilho@787
|
791 |
if (pbm->volume > 0) {
|
renatofilho@787
|
792 |
g_object_set (G_OBJECT (pbm->volume_element),
|
renatofilho@787
|
793 |
"volume", pbm->volume,
|
renatofilho@787
|
794 |
NULL);
|
renatofilho@787
|
795 |
} else {
|
renatofilho@787
|
796 |
g_object_set (G_OBJECT (pbm->volume_element),
|
renatofilho@787
|
797 |
"mute", TRUE,
|
renatofilho@787
|
798 |
NULL);
|
renatofilho@787
|
799 |
}
|
renatofilho@787
|
800 |
}
|
renatofilho@787
|
801 |
}
|
renatofilho@787
|
802 |
|
renatofilho@787
|
803 |
static void
|
renatofilho@787
|
804 |
update_xid (GstPlayBinMaemo *pbm)
|
renatofilho@787
|
805 |
{
|
renatofilho@787
|
806 |
if ((pbm->sink_video != NULL) &&
|
renatofilho@787
|
807 |
(pbm->xid != -1) &&
|
renatofilho@787
|
808 |
(GST_IS_X_OVERLAY (pbm->sink_video))) {
|
renatofilho@787
|
809 |
XGCValues values;
|
renatofilho@787
|
810 |
Display *disp;
|
renatofilho@787
|
811 |
g_object_set (G_OBJECT (pbm->sink_video),
|
renatofilho@787
|
812 |
"force-aspect-ratio", TRUE, NULL);
|
renatofilho@787
|
813 |
g_debug ("Update XID to %ld", pbm->xid);
|
renatofilho@787
|
814 |
|
renatofilho@787
|
815 |
gst_x_overlay_set_xwindow_id (GST_X_OVERLAY (pbm->sink_video),
|
renatofilho@787
|
816 |
pbm->xid);
|
renatofilho@787
|
817 |
}
|
renatofilho@787
|
818 |
}
|
renatofilho@787
|
819 |
|
renatofilho@787
|
820 |
static gboolean
|
renatofilho@787
|
821 |
plugin_init(GstPlugin * plugin)
|
renatofilho@787
|
822 |
{
|
renatofilho@787
|
823 |
#ifdef ENABLE_NLS
|
renatofilho@787
|
824 |
setlocale(LC_ALL, "");
|
renatofilho@787
|
825 |
bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);
|
renatofilho@787
|
826 |
#endif /* ENABLE_NLS */
|
renatofilho@787
|
827 |
|
renatofilho@787
|
828 |
if (!gst_element_register(plugin, "playbinmaemo", GST_RANK_SECONDARY,
|
renatofilho@787
|
829 |
GST_TYPE_PLAY_BIN_MAEMO)) {
|
renatofilho@787
|
830 |
return FALSE;
|
renatofilho@787
|
831 |
}
|
renatofilho@787
|
832 |
|
renatofilho@787
|
833 |
return TRUE;
|
renatofilho@787
|
834 |
}
|
renatofilho@787
|
835 |
|
renatofilho@787
|
836 |
GST_PLUGIN_DEFINE(GST_VERSION_MAJOR,
|
renatofilho@787
|
837 |
GST_VERSION_MINOR,
|
renatofilho@787
|
838 |
"playbinmaemo",
|
renatofilho@787
|
839 |
"Demuxes and muxes audio and video",
|
renatofilho@787
|
840 |
plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME,
|
renatofilho@787
|
841 |
GST_PACKAGE_ORIGIN)
|