diff --git a/mediainfo/src/mi-info.vala b/mediainfo/src/mi-info.vala index 3fde93dd88..3c5831df38 100644 --- a/mediainfo/src/mi-info.vala +++ b/mediainfo/src/mi-info.vala @@ -24,47 +24,89 @@ using Gst; 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 +vala-gen-introspect gstreamer-pbutils-0.10 packages/gstreamer-pbutils-0.10 +vapigen --vapidir . --library gstreamer-pbutils-0.10 packages/gstreamer-pbutils-0.10/gstreamer-pbutils-0.10.gi */ public class MediaInfo.Info : VBox { - private Label uri; - private Discoverer dc; + // ui components + private Label mime_type; + private Label duration; private DrawingArea drawing_area; + // gstreamer objects + private Discoverer dc; private Pipeline pb; public Info () { Label label; + Table table; + AttachOptions fill = AttachOptions.FILL; + AttachOptions fill_exp = AttachOptions.EXPAND|AttachOptions.FILL; + uint row = 0; // configure the view set_homogeneous (false); // add widgets - // FIXME: handle aspect ration (AspectFrame.ratio) + // FIXME: handle aspect ratio (AspectFrame.ratio) // FIXME: paint it black from the start drawing_area = new DrawingArea (); drawing_area.set_size_request (300, 150); pack_start (drawing_area, true, true, 0); - // FIXME: some alignment issues with the strings - uri = new Label (null); - pack_start (uri, false, false, 0); - + table = new Table (5, 2, false); + pack_start (table, false, false, 0); + label = new Label (null); label.set_markup("Container"); - pack_start (label, false, false, 0); + label.set_alignment (0.0f, 0.5f); + table.attach (label, 0, 2, row, row+1, fill_exp, 0, 0, 1); + row++; + label = new Label ("Mime-Type:"); + label.set_alignment (1.0f, 0.5f); + table.attach (label, 0, 1, row, row+1, fill, 0, 0, 0); + mime_type = new Label (null); + mime_type.set_alignment (0.0f, 0.5f); + table.attach (mime_type, 1, 2, row, row+1, fill_exp, 0, 3, 1); + row++; + + label = new Label ("Duration:"); + label.set_alignment (1.0f, 0.5f); + table.attach (label, 0, 1, row, row+1, fill, 0, 0, 0); + duration = new Label (null); + duration.set_alignment (0.0f, 0.5f); + table.attach (duration, 1, 2, row, row+1, fill_exp, 0, 3, 1); + row++; + + label = new Label (null); + label.set_markup("Video Streams"); + label.set_alignment (0.0f, 0.5f); + table.attach (label, 0, 2, row, row+1, fill_exp, 0, 0, 1); + row++; + + // TODO: add video stream info widgets + + label = new Label (null); + label.set_markup("Audio Streams"); + label.set_alignment (0.0f, 0.5f); + table.attach (label, 0, 2, row, row+1, fill_exp, 0, 0, 1); + row++; + + // TODO: add audio stream info widgets + + + show_all (); // set up the gstreamer components try { dc = new Discoverer ((ClockTime)(Gst.SECOND * 10)); } catch (Error e) { - debug ("Failed to create the discoverer: %s", e.message); + debug ("Failed to create the discoverer: %s: %s", e.domain.to_string (), e.message); } pb = ElementFactory.make ("playbin2", "player") as Pipeline; @@ -89,14 +131,38 @@ public class MediaInfo.Info : VBox // stop previous playback pb.set_state (State.NULL); - this.uri.set_text (uri); + // TODO: check if uri is a regular (local file)? if (uri != null) { DiscovererInfo info; + bool uncertain; + + string mime_type = g_content_type_guess (uri, null, out uncertain); + if (uncertain) { + this.mime_type.set_markup (@"$mime_type"); + } else { + this.mime_type.set_text (mime_type); + } try { info = dc.discover_uri (uri); + + ClockTime dur = info.get_duration (); + string dur_str = "%u:%02u:%02u.%09u".printf ( + (uint) (dur / (SECOND * 60 * 60)), + (uint) ((dur / (SECOND * 60)) % 60), + (uint) ((dur / SECOND) % 60), + (uint) ((dur) % SECOND)); + this.duration.set_text (dur_str); + + //stdout.printf ("Duration: %s\n", dur_str); + + // TODO: get more info + // list = info.get_video_streams (); + // list = info.get_audio_streams (); + // list = info.get_container_streams (); + } catch (Error e) { - debug ("Failed to extract metadata from %s: %s", uri, e.message); + debug ("Failed to extract metadata from %s: %s: %s", uri, e.domain.to_string (), e.message); } // play file @@ -118,7 +184,11 @@ public class MediaInfo.Info : VBox { XOverlay xoverlay = message.src as XOverlay; xoverlay.set_xwindow_id (Gdk.x11_drawable_get_xid (drawing_area.window)); - + + if (message.src.get_class ().find_property ("force-aspect-ratio") != null) { + ((GLib.Object)message.src).set_property ("force-aspect-ratio", true); + } + drawing_area.unset_flags(Gtk.WidgetFlags.DOUBLE_BUFFERED); } }