2010-10-17 19:36:39 +00:00
|
|
|
/* GStreamer media browser
|
|
|
|
* Copyright (C) 2010 Stefan Sauer <ensonic@user.sf.net>
|
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Library General Public
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 2 of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Library General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Library General Public
|
|
|
|
* License along with this library; if not, write to the
|
|
|
|
* Free Software Foundation, Inc., 51 Franklin Steet,
|
|
|
|
* Boston, MA 02110-1301, USA.
|
|
|
|
*/
|
|
|
|
|
|
|
|
using Gtk;
|
2010-10-17 20:21:16 +00:00
|
|
|
using Gst;
|
2010-10-17 19:36:39 +00:00
|
|
|
|
2010-10-18 14:14:46 +00:00
|
|
|
/*
|
|
|
|
we need to update the vapi for yet unreleased gstreamer api:
|
|
|
|
|
|
|
|
cd vala/mediainfo/vapi
|
|
|
|
vala-gen-introspect gstreamer-pbutils-0.10 packages/gstreamer-pbutils-0.10 && ../vapigen/vapigen --vapidir . --library \
|
|
|
|
gstreamer-pbutils-0.10 packages/gstreamer-pbutils-0.10/gstreamer-pbutils-0.10.gi
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
2010-10-17 19:36:39 +00:00
|
|
|
public class MediaInfo.Info : VBox
|
|
|
|
{
|
|
|
|
private Label uri;
|
2010-10-18 14:14:46 +00:00
|
|
|
private Discoverer dc;
|
2010-10-17 20:52:37 +00:00
|
|
|
private DrawingArea drawing_area;
|
|
|
|
private Pipeline pb;
|
2010-10-17 19:36:39 +00:00
|
|
|
|
|
|
|
public Info ()
|
|
|
|
{
|
2010-10-18 14:38:32 +00:00
|
|
|
Label label;
|
|
|
|
|
2010-10-17 20:21:16 +00:00
|
|
|
// configure the view
|
2010-10-17 19:36:39 +00:00
|
|
|
set_homogeneous (false);
|
|
|
|
|
2010-10-17 20:21:16 +00:00
|
|
|
// add widgets
|
2010-10-18 14:38:32 +00:00
|
|
|
// FIXME: handle aspect ration (AspectFrame.ratio)
|
|
|
|
// FIXME: paint it black from the start
|
2010-10-17 20:52:37 +00:00
|
|
|
drawing_area = new DrawingArea ();
|
|
|
|
drawing_area.set_size_request (300, 150);
|
|
|
|
pack_start (drawing_area, true, true, 0);
|
|
|
|
|
2010-10-18 14:38:32 +00:00
|
|
|
// FIXME: some alignment issues with the strings
|
|
|
|
uri = new Label (null);
|
2010-10-17 19:36:39 +00:00
|
|
|
pack_start (uri, false, false, 0);
|
2010-10-18 14:38:32 +00:00
|
|
|
|
|
|
|
label = new Label (null);
|
|
|
|
label.set_markup("<b>Container</b>");
|
|
|
|
pack_start (label, false, false, 0);
|
2010-10-17 19:36:39 +00:00
|
|
|
|
|
|
|
show_all ();
|
2010-10-17 20:21:16 +00:00
|
|
|
|
|
|
|
// set up the gstreamer components
|
2010-10-18 14:14:46 +00:00
|
|
|
try {
|
|
|
|
dc = new Discoverer ((ClockTime)(Gst.SECOND * 10));
|
|
|
|
} catch (Error e) {
|
|
|
|
debug ("Failed to create the discoverer: %s", e.message);
|
|
|
|
}
|
2010-10-17 20:52:37 +00:00
|
|
|
|
|
|
|
pb = ElementFactory.make ("playbin2", "player") as Pipeline;
|
|
|
|
Gst.Bus bus = pb.get_bus ();
|
2010-10-18 07:31:43 +00:00
|
|
|
bus.set_sync_handler (bus.sync_signal_handler);
|
|
|
|
bus.sync_message["element"].connect (on_element_sync_message);
|
2010-10-17 20:52:37 +00:00
|
|
|
|
2010-10-17 19:36:39 +00:00
|
|
|
}
|
|
|
|
|
2010-10-18 07:31:43 +00:00
|
|
|
~Info ()
|
|
|
|
{
|
|
|
|
// stop previous playback
|
|
|
|
pb.set_state (State.NULL);
|
|
|
|
}
|
|
|
|
|
2010-10-17 20:52:37 +00:00
|
|
|
// public methods
|
|
|
|
|
2010-10-17 19:36:39 +00:00
|
|
|
public bool discover (string uri)
|
|
|
|
{
|
2010-10-18 07:31:43 +00:00
|
|
|
bool res = true;
|
|
|
|
|
|
|
|
// stop previous playback
|
|
|
|
pb.set_state (State.NULL);
|
|
|
|
|
2010-10-17 19:36:39 +00:00
|
|
|
this.uri.set_text (uri);
|
2010-10-18 07:31:43 +00:00
|
|
|
if (uri != null) {
|
2010-10-18 14:14:46 +00:00
|
|
|
DiscovererInfo info;
|
|
|
|
|
|
|
|
try {
|
|
|
|
info = dc.discover_uri (uri);
|
|
|
|
} catch (Error e) {
|
|
|
|
debug ("Failed to extract metadata from %s: %s", uri, e.message);
|
|
|
|
}
|
2010-10-17 20:52:37 +00:00
|
|
|
|
2010-10-18 07:31:43 +00:00
|
|
|
// play file
|
|
|
|
((GLib.Object)pb).set_property ("uri", uri);
|
|
|
|
pb.set_state (State.PLAYING);
|
2010-10-17 20:52:37 +00:00
|
|
|
|
2010-10-18 07:31:43 +00:00
|
|
|
res = true;
|
|
|
|
}
|
2010-10-17 20:21:16 +00:00
|
|
|
|
2010-10-18 07:31:43 +00:00
|
|
|
return (res);
|
2010-10-17 19:36:39 +00:00
|
|
|
}
|
2010-10-17 20:52:37 +00:00
|
|
|
|
|
|
|
// signal handlers
|
|
|
|
|
2010-10-18 07:31:43 +00:00
|
|
|
private void on_element_sync_message (Gst.Bus bus, Message message)
|
2010-10-17 20:52:37 +00:00
|
|
|
{
|
|
|
|
Structure structure = message.get_structure ();
|
|
|
|
if (structure.has_name ("prepare-xwindow-id"))
|
|
|
|
{
|
2010-10-17 21:07:02 +00:00
|
|
|
XOverlay xoverlay = message.src as XOverlay;
|
|
|
|
xoverlay.set_xwindow_id (Gdk.x11_drawable_get_xid (drawing_area.window));
|
|
|
|
|
|
|
|
drawing_area.unset_flags(Gtk.WidgetFlags.DOUBLE_BUFFERED);
|
2010-10-17 20:52:37 +00:00
|
|
|
}
|
|
|
|
}
|
2010-10-17 21:07:02 +00:00
|
|
|
}
|