7 static GList *seekable_pads = NULL;
8 static GList *rate_pads = NULL;
9 static GList *seekable_elements = NULL;
11 static GstElement *pipeline;
12 static guint64 duration;
13 static GtkAdjustment *adjustment;
14 static gboolean stats = FALSE;
16 static guint update_id;
18 //#define SOURCE "gnomevfssrc"
19 #define SOURCE "filesrc"
21 #define UPDATE_INTERVAL 500
34 gst_element_factory_make_or_warn (gchar * type, gchar * name)
36 GstElement *element = gst_element_factory_make (type, name);
39 g_warning ("Failed to create element %s of type %s", name, type);
46 dynamic_link (GstPadTemplate * templ, GstPad * newpad, gpointer data)
48 dyn_link *connect = (dyn_link *) data;
50 if (!strcmp (gst_pad_get_name (newpad), connect->padname)) {
51 gst_element_set_state (pipeline, GST_STATE_PAUSED);
52 gst_bin_add (GST_BIN (pipeline), connect->bin);
53 gst_pad_link (newpad, connect->target);
54 gst_element_set_state (pipeline, GST_STATE_PLAYING);
56 seekable_pads = g_list_prepend (seekable_pads, newpad);
57 rate_pads = g_list_prepend (rate_pads, newpad);
62 setup_dynamic_link (GstElement * element, const gchar * padname,
63 GstPad * target, GstElement * bin)
67 connect = g_new0 (dyn_link, 1);
68 connect->padname = g_strdup (padname);
69 connect->target = target;
72 g_signal_connect (G_OBJECT (element), "new_pad", G_CALLBACK (dynamic_link),
77 make_mod_pipeline (const gchar * location)
80 GstElement *src, *decoder, *audiosink;
83 pipeline = gst_pipeline_new ("app");
85 src = gst_element_factory_make_or_warn (SOURCE, "src");
86 decoder = gst_element_factory_make_or_warn ("modplug", "decoder");
87 audiosink = gst_element_factory_make_or_warn ("osssink", "sink");
88 //g_object_set (G_OBJECT (audiosink), "sync", FALSE, NULL);
90 g_object_set (G_OBJECT (src), "location", location, NULL);
92 gst_bin_add (GST_BIN (pipeline), src);
93 gst_bin_add (GST_BIN (pipeline), decoder);
94 gst_bin_add (GST_BIN (pipeline), audiosink);
96 gst_element_link (src, decoder);
97 gst_element_link (decoder, audiosink);
99 seekable = gst_element_get_pad (decoder, "src");
100 seekable_pads = g_list_prepend (seekable_pads, seekable);
101 rate_pads = g_list_prepend (rate_pads, seekable);
102 rate_pads = g_list_prepend (rate_pads, gst_element_get_pad (decoder, "sink"));
108 make_dv_pipeline (const gchar * location)
110 GstElement *pipeline;
111 GstElement *src, *decoder, *audiosink, *videosink;
114 pipeline = gst_pipeline_new ("app");
116 src = gst_element_factory_make_or_warn (SOURCE, "src");
117 decoder = gst_element_factory_make_or_warn ("dvdec", "decoder");
118 videosink = gst_element_factory_make_or_warn ("xvideosink", "v_sink");
119 audiosink = gst_element_factory_make_or_warn ("osssink", "a_sink");
120 //g_object_set (G_OBJECT (audiosink), "sync", FALSE, NULL);
122 g_object_set (G_OBJECT (src), "location", location, NULL);
124 gst_bin_add (GST_BIN (pipeline), src);
125 gst_bin_add (GST_BIN (pipeline), decoder);
126 gst_bin_add (GST_BIN (pipeline), audiosink);
127 gst_bin_add (GST_BIN (pipeline), videosink);
129 gst_element_link (src, decoder);
130 gst_element_link (decoder, audiosink);
131 gst_element_link (decoder, videosink);
133 seekable = gst_element_get_pad (decoder, "video");
134 seekable_pads = g_list_prepend (seekable_pads, seekable);
135 rate_pads = g_list_prepend (rate_pads, seekable);
136 seekable = gst_element_get_pad (decoder, "audio");
137 seekable_pads = g_list_prepend (seekable_pads, seekable);
138 rate_pads = g_list_prepend (rate_pads, seekable);
139 rate_pads = g_list_prepend (rate_pads, gst_element_get_pad (decoder, "sink"));
145 make_wav_pipeline (const gchar * location)
147 GstElement *pipeline;
148 GstElement *src, *decoder, *audiosink;
151 pipeline = gst_pipeline_new ("app");
153 src = gst_element_factory_make_or_warn (SOURCE, "src");
154 decoder = gst_element_factory_make_or_warn ("wavparse", "decoder");
155 audiosink = gst_element_factory_make_or_warn ("osssink", "sink");
156 //g_object_set (G_OBJECT (audiosink), "sync", FALSE, NULL);
158 g_object_set (G_OBJECT (src), "location", location, NULL);
160 gst_bin_add (GST_BIN (pipeline), src);
161 gst_bin_add (GST_BIN (pipeline), decoder);
162 gst_bin_add (GST_BIN (pipeline), audiosink);
164 gst_element_link (src, decoder);
165 gst_element_link (decoder, audiosink);
167 seekable = gst_element_get_pad (decoder, "src");
168 seekable_pads = g_list_prepend (seekable_pads, seekable);
169 rate_pads = g_list_prepend (rate_pads, seekable);
170 rate_pads = g_list_prepend (rate_pads, gst_element_get_pad (decoder, "sink"));
176 make_flac_pipeline (const gchar * location)
178 GstElement *pipeline;
179 GstElement *src, *decoder, *audiosink;
182 pipeline = gst_pipeline_new ("app");
184 src = gst_element_factory_make_or_warn (SOURCE, "src");
185 decoder = gst_element_factory_make_or_warn ("flacdec", "decoder");
186 audiosink = gst_element_factory_make_or_warn ("osssink", "sink");
187 g_object_set (G_OBJECT (audiosink), "sync", FALSE, NULL);
189 g_object_set (G_OBJECT (src), "location", location, NULL);
191 gst_bin_add (GST_BIN (pipeline), src);
192 gst_bin_add (GST_BIN (pipeline), decoder);
193 gst_bin_add (GST_BIN (pipeline), audiosink);
195 gst_element_link (src, decoder);
196 gst_element_link (decoder, audiosink);
198 seekable = gst_element_get_pad (decoder, "src");
199 seekable_pads = g_list_prepend (seekable_pads, seekable);
200 rate_pads = g_list_prepend (rate_pads, seekable);
201 rate_pads = g_list_prepend (rate_pads, gst_element_get_pad (decoder, "sink"));
207 make_sid_pipeline (const gchar * location)
209 GstElement *pipeline;
210 GstElement *src, *decoder, *audiosink;
213 pipeline = gst_pipeline_new ("app");
215 src = gst_element_factory_make_or_warn (SOURCE, "src");
216 decoder = gst_element_factory_make_or_warn ("siddec", "decoder");
217 audiosink = gst_element_factory_make_or_warn ("osssink", "sink");
218 //g_object_set (G_OBJECT (audiosink), "sync", FALSE, NULL);
220 g_object_set (G_OBJECT (src), "location", location, NULL);
222 gst_bin_add (GST_BIN (pipeline), src);
223 gst_bin_add (GST_BIN (pipeline), decoder);
224 gst_bin_add (GST_BIN (pipeline), audiosink);
226 gst_element_link (src, decoder);
227 gst_element_link (decoder, audiosink);
229 seekable = gst_element_get_pad (decoder, "src");
230 seekable_pads = g_list_prepend (seekable_pads, seekable);
231 rate_pads = g_list_prepend (rate_pads, seekable);
232 rate_pads = g_list_prepend (rate_pads, gst_element_get_pad (decoder, "sink"));
238 make_parse_pipeline (const gchar * location)
240 GstElement *pipeline;
241 GstElement *src, *parser, *fakesink;
244 pipeline = gst_pipeline_new ("app");
246 src = gst_element_factory_make_or_warn (SOURCE, "src");
247 parser = gst_element_factory_make_or_warn ("mpegparse", "parse");
248 fakesink = gst_element_factory_make_or_warn ("fakesink", "sink");
249 g_object_set (G_OBJECT (fakesink), "silent", TRUE, NULL);
250 g_object_set (G_OBJECT (fakesink), "sync", TRUE, NULL);
252 g_object_set (G_OBJECT (src), "location", location, NULL);
254 gst_bin_add (GST_BIN (pipeline), src);
255 gst_bin_add (GST_BIN (pipeline), parser);
256 gst_bin_add (GST_BIN (pipeline), fakesink);
258 gst_element_link (src, parser);
259 gst_element_link (parser, fakesink);
261 seekable = gst_element_get_pad (parser, "src");
262 seekable_pads = g_list_prepend (seekable_pads, seekable);
263 rate_pads = g_list_prepend (rate_pads, seekable);
264 rate_pads = g_list_prepend (rate_pads, gst_element_get_pad (parser, "sink"));
270 make_vorbis_pipeline (const gchar * location)
272 GstElement *pipeline;
273 GstElement *src, *decoder, *audiosink;
276 pipeline = gst_pipeline_new ("app");
278 src = gst_element_factory_make_or_warn (SOURCE, "src");
279 decoder = gst_element_factory_make_or_warn ("vorbisfile", "decoder");
280 audiosink = gst_element_factory_make_or_warn ("osssink", "sink");
281 g_object_set (G_OBJECT (audiosink), "sync", TRUE, NULL);
283 g_object_set (G_OBJECT (src), "location", location, NULL);
285 gst_bin_add (GST_BIN (pipeline), src);
286 gst_bin_add (GST_BIN (pipeline), decoder);
287 gst_bin_add (GST_BIN (pipeline), audiosink);
289 gst_element_link (src, decoder);
290 gst_element_link (decoder, audiosink);
292 seekable = gst_element_get_pad (decoder, "src");
293 seekable_pads = g_list_prepend (seekable_pads, seekable);
294 rate_pads = g_list_prepend (rate_pads, seekable);
295 rate_pads = g_list_prepend (rate_pads, gst_element_get_pad (decoder, "sink"));
301 make_mp3_pipeline (const gchar * location)
303 GstElement *pipeline;
304 GstElement *src, *decoder, *osssink, *queue, *audio_thread;
307 pipeline = gst_pipeline_new ("app");
309 src = gst_element_factory_make_or_warn (SOURCE, "src");
310 decoder = gst_element_factory_make_or_warn ("mad", "dec");
311 queue = gst_element_factory_make_or_warn ("queue", "queue");
312 osssink = gst_element_factory_make_or_warn ("osssink", "sink");
314 audio_thread = gst_thread_new ("a_decoder_thread");
316 seekable_elements = g_list_prepend (seekable_elements, osssink);
318 g_object_set (G_OBJECT (src), "location", location, NULL);
319 g_object_set (G_OBJECT (osssink), "fragment", 0x00180008, NULL);
321 gst_bin_add (GST_BIN (pipeline), src);
322 gst_bin_add (GST_BIN (pipeline), decoder);
323 gst_bin_add (GST_BIN (audio_thread), queue);
324 gst_bin_add (GST_BIN (audio_thread), osssink);
325 gst_bin_add (GST_BIN (pipeline), audio_thread);
327 gst_element_link (src, decoder);
328 gst_element_link (decoder, queue);
329 gst_element_link (queue, osssink);
331 seekable = gst_element_get_pad (queue, "src");
332 seekable_pads = g_list_prepend (seekable_pads, seekable);
333 rate_pads = g_list_prepend (rate_pads, seekable);
334 rate_pads = g_list_prepend (rate_pads, gst_element_get_pad (decoder, "sink"));
340 make_avi_pipeline (const gchar * location)
342 GstElement *pipeline, *audio_bin, *video_bin;
343 GstElement *src, *demux, *a_decoder, *v_decoder, *audiosink, *videosink;
344 GstElement *a_queue = NULL, *audio_thread = NULL, *v_queue =
345 NULL, *video_thread = NULL;
348 pipeline = gst_pipeline_new ("app");
350 src = gst_element_factory_make_or_warn (SOURCE, "src");
351 g_object_set (G_OBJECT (src), "location", location, NULL);
353 demux = gst_element_factory_make_or_warn ("avidemux", "demux");
354 seekable_elements = g_list_prepend (seekable_elements, demux);
356 gst_bin_add (GST_BIN (pipeline), src);
357 gst_bin_add (GST_BIN (pipeline), demux);
358 gst_element_link (src, demux);
360 audio_bin = gst_bin_new ("a_decoder_bin");
361 a_decoder = gst_element_factory_make_or_warn ("mad", "a_dec");
362 audio_thread = gst_thread_new ("a_decoder_thread");
363 audiosink = gst_element_factory_make_or_warn ("osssink", "a_sink");
364 //g_object_set (G_OBJECT (audiosink), "fragment", 0x00180008, NULL);
365 a_queue = gst_element_factory_make_or_warn ("queue", "a_queue");
366 gst_element_link (a_decoder, a_queue);
367 gst_element_link (a_queue, audiosink);
368 gst_bin_add (GST_BIN (audio_bin), a_decoder);
369 gst_bin_add (GST_BIN (audio_bin), audio_thread);
370 gst_bin_add (GST_BIN (audio_thread), a_queue);
371 gst_bin_add (GST_BIN (audio_thread), audiosink);
372 gst_element_set_state (audio_bin, GST_STATE_PAUSED);
374 setup_dynamic_link (demux, "audio_00", gst_element_get_pad (a_decoder,
377 seekable = gst_element_get_pad (a_queue, "src");
378 seekable_pads = g_list_prepend (seekable_pads, seekable);
379 rate_pads = g_list_prepend (rate_pads, seekable);
381 g_list_prepend (rate_pads, gst_element_get_pad (a_decoder, "sink"));
383 video_bin = gst_bin_new ("v_decoder_bin");
384 //v_decoder = gst_element_factory_make_or_warn ("identity", "v_dec");
385 //v_decoder = gst_element_factory_make_or_warn ("windec", "v_dec");
386 v_decoder = gst_element_factory_make_or_warn ("ffmpegdecall", "v_dec");
387 video_thread = gst_thread_new ("v_decoder_thread");
388 videosink = gst_element_factory_make_or_warn ("xvideosink", "v_sink");
389 //videosink = gst_element_factory_make_or_warn ("fakesink", "v_sink");
390 //g_object_set (G_OBJECT (videosink), "sync", TRUE, NULL);
391 v_queue = gst_element_factory_make_or_warn ("queue", "v_queue");
392 //g_object_set (G_OBJECT (v_queue), "max_level", 10, NULL);
393 gst_element_link (v_decoder, v_queue);
394 gst_element_link (v_queue, videosink);
395 gst_bin_add (GST_BIN (video_bin), v_decoder);
396 gst_bin_add (GST_BIN (video_bin), video_thread);
397 gst_bin_add (GST_BIN (video_thread), v_queue);
398 gst_bin_add (GST_BIN (video_thread), videosink);
400 gst_element_set_state (video_bin, GST_STATE_PAUSED);
402 setup_dynamic_link (demux, "video_00", gst_element_get_pad (v_decoder,
405 seekable = gst_element_get_pad (v_queue, "src");
406 seekable_pads = g_list_prepend (seekable_pads, seekable);
407 rate_pads = g_list_prepend (rate_pads, seekable);
409 g_list_prepend (rate_pads, gst_element_get_pad (v_decoder, "sink"));
415 make_mpeg_pipeline (const gchar * location)
417 GstElement *pipeline, *audio_bin, *video_bin;
418 GstElement *src, *demux, *a_decoder, *v_decoder, *v_filter;
419 GstElement *audiosink, *videosink;
420 GstElement *a_queue, *audio_thread, *v_queue, *video_thread;
423 pipeline = gst_pipeline_new ("app");
425 src = gst_element_factory_make_or_warn (SOURCE, "src");
426 g_object_set (G_OBJECT (src), "location", location, NULL);
428 demux = gst_element_factory_make_or_warn ("mpegdemux", "demux");
429 g_object_set (G_OBJECT (demux), "sync", FALSE, NULL);
431 seekable_elements = g_list_prepend (seekable_elements, demux);
433 gst_bin_add (GST_BIN (pipeline), src);
434 gst_bin_add (GST_BIN (pipeline), demux);
435 gst_element_link (src, demux);
437 audio_bin = gst_bin_new ("a_decoder_bin");
438 a_decoder = gst_element_factory_make_or_warn ("mad", "a_dec");
439 audio_thread = gst_thread_new ("a_decoder_thread");
440 a_queue = gst_element_factory_make_or_warn ("queue", "a_queue");
441 audiosink = gst_element_factory_make_or_warn ("osssink", "a_sink");
442 g_object_set (G_OBJECT (audiosink), "fragment", 0x00180008, NULL);
443 gst_element_link (a_decoder, a_queue);
444 gst_element_link (a_queue, audiosink);
445 gst_bin_add (GST_BIN (audio_bin), a_decoder);
446 gst_bin_add (GST_BIN (audio_bin), audio_thread);
447 gst_bin_add (GST_BIN (audio_thread), a_queue);
448 gst_bin_add (GST_BIN (audio_thread), audiosink);
450 setup_dynamic_link (demux, "audio_00", gst_element_get_pad (a_decoder,
453 seekable = gst_element_get_pad (a_queue, "src");
454 seekable_pads = g_list_prepend (seekable_pads, seekable);
455 rate_pads = g_list_prepend (rate_pads, seekable);
457 g_list_prepend (rate_pads, gst_element_get_pad (a_decoder, "sink"));
459 video_bin = gst_bin_new ("v_decoder_bin");
460 v_decoder = gst_element_factory_make_or_warn ("mpeg2dec", "v_dec");
461 video_thread = gst_thread_new ("v_decoder_thread");
462 //g_object_set (G_OBJECT (video_thread), "priority", 2, NULL);
463 v_queue = gst_element_factory_make_or_warn ("queue", "v_queue");
464 v_filter = gst_element_factory_make_or_warn ("colorspace", "v_filter");
465 videosink = gst_element_factory_make_or_warn ("xvideosink", "v_sink");
466 gst_element_link_many (v_decoder, v_queue, v_filter, NULL);
468 gst_element_link (v_filter, videosink);
469 gst_bin_add_many (GST_BIN (video_bin), v_decoder, video_thread, NULL);
470 gst_bin_add_many (GST_BIN (video_thread), v_queue, v_filter, videosink, NULL);
472 setup_dynamic_link (demux, "video_00", gst_element_get_pad (v_decoder,
475 seekable = gst_element_get_pad (v_queue, "src");
476 seekable_pads = g_list_prepend (seekable_pads, seekable);
477 rate_pads = g_list_prepend (rate_pads, seekable);
479 g_list_prepend (rate_pads, gst_element_get_pad (v_decoder, "sink"));
485 make_mpegnt_pipeline (const gchar * location)
487 GstElement *pipeline, *audio_bin, *video_bin;
488 GstElement *src, *demux, *a_decoder, *v_decoder, *v_filter;
489 GstElement *audiosink, *videosink;
490 GstElement *a_queue, *audio_thread;
493 pipeline = gst_pipeline_new ("app");
495 src = gst_element_factory_make_or_warn (SOURCE, "src");
496 g_object_set (G_OBJECT (src), "location", location, NULL);
498 demux = gst_element_factory_make_or_warn ("mpegdemux", "demux");
499 //g_object_set (G_OBJECT (demux), "sync", TRUE, NULL);
501 seekable_elements = g_list_prepend (seekable_elements, demux);
503 gst_bin_add (GST_BIN (pipeline), src);
504 gst_bin_add (GST_BIN (pipeline), demux);
505 gst_element_link (src, demux);
507 audio_bin = gst_bin_new ("a_decoder_bin");
508 a_decoder = gst_element_factory_make_or_warn ("mad", "a_dec");
509 audio_thread = gst_thread_new ("a_decoder_thread");
510 a_queue = gst_element_factory_make_or_warn ("queue", "a_queue");
511 audiosink = gst_element_factory_make_or_warn ("osssink", "a_sink");
512 //g_object_set (G_OBJECT (audiosink), "fragment", 0x00180008, NULL);
513 g_object_set (G_OBJECT (audiosink), "sync", FALSE, NULL);
514 gst_element_link (a_decoder, a_queue);
515 gst_element_link (a_queue, audiosink);
516 gst_bin_add (GST_BIN (audio_bin), a_decoder);
517 gst_bin_add (GST_BIN (audio_bin), audio_thread);
518 gst_bin_add (GST_BIN (audio_thread), a_queue);
519 gst_bin_add (GST_BIN (audio_thread), audiosink);
521 setup_dynamic_link (demux, "audio_00", gst_element_get_pad (a_decoder,
524 seekable = gst_element_get_pad (a_queue, "src");
525 seekable_pads = g_list_prepend (seekable_pads, seekable);
526 rate_pads = g_list_prepend (rate_pads, seekable);
528 g_list_prepend (rate_pads, gst_element_get_pad (a_decoder, "sink"));
530 video_bin = gst_bin_new ("v_decoder_bin");
531 v_decoder = gst_element_factory_make_or_warn ("mpeg2dec", "v_dec");
532 v_filter = gst_element_factory_make_or_warn ("colorspace", "v_filter");
533 videosink = gst_element_factory_make_or_warn ("xvideosink", "v_sink");
534 gst_element_link_many (v_decoder, v_filter, videosink, NULL);
536 gst_bin_add_many (GST_BIN (video_bin), v_decoder, v_filter, videosink, NULL);
538 setup_dynamic_link (demux, "video_00", gst_element_get_pad (v_decoder,
541 seekable = gst_element_get_pad (v_decoder, "src");
542 seekable_pads = g_list_prepend (seekable_pads, seekable);
543 rate_pads = g_list_prepend (rate_pads, seekable);
545 g_list_prepend (rate_pads, gst_element_get_pad (v_decoder, "sink"));
551 make_playerbin_pipeline (const gchar * location)
557 format_value (GtkScale * scale, gdouble value)
563 real = value * duration / 100;
564 seconds = (gint64) real / GST_SECOND;
565 subseconds = (gint64) real / (GST_SECOND / 100);
567 return g_strdup_printf ("%02lld:%02lld:%02lld",
568 seconds / 60, seconds % 60, subseconds % 100);
574 const GstFormat format;
577 static seek_format seek_formats[] = {
578 {"tim", GST_FORMAT_TIME},
579 {"byt", GST_FORMAT_BYTES},
580 {"buf", GST_FORMAT_BUFFERS},
581 {"def", GST_FORMAT_DEFAULT},
585 G_GNUC_UNUSED static void
588 GList *walk = rate_pads;
591 GstPad *pad = GST_PAD (walk->data);
594 g_print ("rate/sec %8.8s: ", GST_PAD_NAME (pad));
595 while (seek_formats[i].name) {
599 format = seek_formats[i].format;
601 if (gst_pad_convert (pad, GST_FORMAT_TIME, GST_SECOND, &format, &value)) {
602 g_print ("%s %13lld | ", seek_formats[i].name, value);
604 g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*");
609 g_print (" %s:%s\n", GST_DEBUG_PAD_NAME (pad));
611 walk = g_list_next (walk);
615 G_GNUC_UNUSED static void
618 GList *walk = seekable_pads;
621 GstPad *pad = GST_PAD (walk->data);
624 g_print ("durations %8.8s: ", GST_PAD_NAME (pad));
625 while (seek_formats[i].name) {
630 format = seek_formats[i].format;
631 res = gst_pad_query (pad, GST_QUERY_TOTAL, &format, &value);
633 g_print ("%s %13lld | ", seek_formats[i].name, value);
635 g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*");
639 g_print (" %s:%s\n", GST_DEBUG_PAD_NAME (pad));
641 walk = g_list_next (walk);
645 G_GNUC_UNUSED static void
648 GList *walk = seekable_pads;
651 GstPad *pad = GST_PAD (walk->data);
654 g_print ("positions %8.8s: ", GST_PAD_NAME (pad));
655 while (seek_formats[i].name) {
660 format = seek_formats[i].format;
661 res = gst_pad_query (pad, GST_QUERY_POSITION, &format, &value);
663 g_print ("%s %13lld | ", seek_formats[i].name, value);
665 g_print ("%s %13.13s | ", seek_formats[i].name, "*NA*");
669 g_print (" %s:%s\n", GST_DEBUG_PAD_NAME (pad));
671 walk = g_list_next (walk);
676 update_scale (gpointer data)
680 GstFormat format = GST_FORMAT_TIME;
683 clock = gst_bin_get_clock (GST_BIN (pipeline));
686 GstPad *pad = GST_PAD (seekable_pads->data);
688 gst_pad_query (pad, GST_QUERY_TOTAL, &format, &duration);
690 position = gst_clock_get_time (clock);
693 g_print ("clock: %13llu (%s)\n", position,
694 gst_object_get_name (GST_OBJECT (clock)));
701 gtk_adjustment_set_value (adjustment, position * 100.0 / duration);
708 iterate (gpointer data)
712 res = gst_bin_iterate (GST_BIN (data));
714 gtk_timeout_remove (update_id);
715 g_print ("stopping iterations\n");
721 start_seek (GtkWidget * widget, GdkEventButton * event, gpointer user_data)
723 gst_element_set_state (pipeline, GST_STATE_PAUSED);
724 gtk_timeout_remove (update_id);
730 stop_seek (GtkWidget * widget, GdkEventButton * event, gpointer user_data)
732 gint64 real = gtk_range_get_value (GTK_RANGE (widget)) * duration / 100;
737 GList *walk = seekable_pads;
740 GstPad *seekable = GST_PAD (walk->data);
742 g_print ("seek to %lld on pad %s:%s\n", real,
743 GST_DEBUG_PAD_NAME (seekable));
745 gst_event_new_seek (GST_FORMAT_TIME | GST_SEEK_METHOD_SET |
746 GST_SEEK_FLAG_FLUSH, real);
748 res = gst_pad_send_event (seekable, s_event);
750 walk = g_list_next (walk);
753 GList *walk = seekable_elements;
756 GstElement *seekable = GST_ELEMENT (walk->data);
758 g_print ("seek to %lld on element %s\n", real,
759 gst_element_get_name (seekable));
761 gst_event_new_seek (GST_FORMAT_TIME | GST_SEEK_METHOD_SET |
762 GST_SEEK_FLAG_FLUSH, real);
764 res = gst_element_send_event (seekable, s_event);
766 walk = g_list_next (walk);
770 gst_element_set_state (pipeline, GST_STATE_PLAYING);
771 gtk_idle_add ((GtkFunction) iterate, pipeline);
773 gtk_timeout_add (UPDATE_INTERVAL, (GtkFunction) update_scale, pipeline);
779 play_cb (GtkButton * button, gpointer data)
781 if (gst_element_get_state (pipeline) != GST_STATE_PLAYING) {
782 gst_element_set_state (pipeline, GST_STATE_PLAYING);
783 gtk_idle_add ((GtkFunction) iterate, pipeline);
785 gtk_timeout_add (UPDATE_INTERVAL, (GtkFunction) update_scale, pipeline);
790 pause_cb (GtkButton * button, gpointer data)
792 if (gst_element_get_state (pipeline) != GST_STATE_PAUSED) {
793 gst_element_set_state (pipeline, GST_STATE_PAUSED);
794 gtk_timeout_remove (update_id);
799 stop_cb (GtkButton * button, gpointer data)
801 if (gst_element_get_state (pipeline) != GST_STATE_READY) {
802 gst_element_set_state (pipeline, GST_STATE_READY);
803 gtk_timeout_remove (update_id);
810 GstElement *(*func) (const gchar * location);
813 static Pipeline pipelines[] = {
814 {"mp3", make_mp3_pipeline},
815 {"avi", make_avi_pipeline},
816 {"mpeg1", make_mpeg_pipeline},
817 {"mpegparse", make_parse_pipeline},
818 {"vorbis", make_vorbis_pipeline},
819 {"sid", make_sid_pipeline},
820 {"flac", make_flac_pipeline},
821 {"wav", make_wav_pipeline},
822 {"mod", make_mod_pipeline},
823 {"dv", make_dv_pipeline},
824 {"mpeg1nothreads", make_mpegnt_pipeline},
825 {"playerbin", make_playerbin_pipeline},
829 #define NUM_TYPES ((sizeof (pipelines) / sizeof (Pipeline)) - 1)
832 print_usage (int argc, char **argv)
836 g_print ("usage: %s <type> <filename>\n", argv[0]);
837 g_print (" possible types:\n");
839 for (i = 0; i < NUM_TYPES; i++) {
840 g_print (" %d = %s\n", i, pipelines[i].name);
845 main (int argc, char **argv)
847 GtkWidget *window, *hbox, *vbox,
848 *play_button, *pause_button, *stop_button, *hscale;
849 struct poptOption options[] = {
850 {"stats", 's', POPT_ARG_NONE | POPT_ARGFLAG_STRIP, &stats, 0,
851 "Show pad stats", NULL},
856 gst_init_with_popt_table (&argc, &argv, options);
857 gtk_init (&argc, &argv);
860 print_usage (argc, argv);
864 type = atoi (argv[1]);
866 if (type < 0 || type >= NUM_TYPES) {
867 print_usage (argc, argv);
871 pipeline = pipelines[type].func (argv[2]);
874 /* initialize gui elements ... */
875 window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
876 hbox = gtk_hbox_new (FALSE, 0);
877 vbox = gtk_vbox_new (FALSE, 0);
878 play_button = gtk_button_new_with_label ("play");
879 pause_button = gtk_button_new_with_label ("pause");
880 stop_button = gtk_button_new_with_label ("stop");
883 GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.00, 100.0, 0.1, 1.0, 1.0));
884 hscale = gtk_hscale_new (adjustment);
885 gtk_scale_set_digits (GTK_SCALE (hscale), 2);
886 gtk_range_set_update_policy (GTK_RANGE (hscale), GTK_UPDATE_CONTINUOUS);
888 gtk_signal_connect (GTK_OBJECT (hscale),
889 "button_press_event", G_CALLBACK (start_seek), pipeline);
890 gtk_signal_connect (GTK_OBJECT (hscale),
891 "button_release_event", G_CALLBACK (stop_seek), pipeline);
892 gtk_signal_connect (GTK_OBJECT (hscale),
893 "format_value", G_CALLBACK (format_value), pipeline);
895 /* do the packing stuff ... */
896 gtk_window_set_default_size (GTK_WINDOW (window), 96, 96);
897 gtk_container_add (GTK_CONTAINER (window), vbox);
898 gtk_container_add (GTK_CONTAINER (vbox), hbox);
899 gtk_box_pack_start (GTK_BOX (hbox), play_button, FALSE, FALSE, 2);
900 gtk_box_pack_start (GTK_BOX (hbox), pause_button, FALSE, FALSE, 2);
901 gtk_box_pack_start (GTK_BOX (hbox), stop_button, FALSE, FALSE, 2);
902 gtk_box_pack_start (GTK_BOX (vbox), hscale, TRUE, TRUE, 2);
904 /* connect things ... */
905 g_signal_connect (G_OBJECT (play_button), "clicked", G_CALLBACK (play_cb),
907 g_signal_connect (G_OBJECT (pause_button), "clicked", G_CALLBACK (pause_cb),
909 g_signal_connect (G_OBJECT (stop_button), "clicked", G_CALLBACK (stop_cb),
911 g_signal_connect (G_OBJECT (window), "delete_event", gtk_main_quit, NULL);
914 gtk_widget_show_all (window);
916 g_signal_connect (pipeline, "deep_notify",
917 G_CALLBACK (gst_element_default_deep_notify), NULL);
918 g_signal_connect (pipeline, "error", G_CALLBACK (gst_element_default_error),
923 gst_element_set_state (pipeline, GST_STATE_NULL);
925 //gst_object_unref (GST_OBJECT (pipeline));
927 //g_mem_chunk_info();