diff --git a/mediainfo/src/mi-info.vala b/mediainfo/src/mi-info.vala index 5561550476..a5108e58ce 100644 --- a/mediainfo/src/mi-info.vala +++ b/mediainfo/src/mi-info.vala @@ -27,11 +27,10 @@ public class MediaInfo.Info : Box // layout private bool compact_mode = false; // ui components - private Label container_caps; - private Label container_name; private Label mime_type; private Label duration; private Image icon_image; + private Notebook container_streams; private Notebook all_streams; // there is either all or separate a/mediainfo/v/st private Notebook video_streams; // depending on screen resolution private Notebook audio_streams; @@ -184,27 +183,10 @@ public class MediaInfo.Info : Box table.attach (duration, 1, 2, row, row+1, fill_exp, 0, 3, 1); row++; - /* TODO: also use tabs for containers - * - this is needed for e.g. mpeg-ts or mp3 inside ape - */ - container_caps = new Label (null); - container_caps.set_alignment (0.0f, 0.5f); - container_caps.set_selectable (true); - container_caps.set_use_markup (true); - table.attach (container_caps, 0, 2, row, row+1, fill_exp, 0, 3, 1); + container_streams = new Notebook (); + table.attach (container_streams, 0, 3, row, row+1, fill_exp, 0, 0, 1); row++; - label = new Label ("Format:"); - label.set_alignment (1.0f, 0.5f); - table.attach (label, 0, 1, row, row+1, fill, 0, 0, 0); - container_name = new Label (null); - container_name.set_alignment (0.0f, 0.5f); - container_name.set_selectable (true); - container_name.set_use_markup (true); - table.attach (container_name, 1, 2, row, row+1, fill_exp, 0, 3, 1); - row++; - - if (compact_mode) { label = new Label (null); label.set_markup("Streams"); @@ -262,10 +244,6 @@ public class MediaInfo.Info : Box table.attach (toc_entries, 0, 3, row, row+1, fill_exp, 0, 0, 1); row++; - // TODO: add container stream info widgets - - // TODO: add tag list widget - // TODO: add message list widget show_all (); @@ -330,27 +308,18 @@ public class MediaInfo.Info : Box private void on_uri_discovered (DiscovererInfo info, Error e) { if (e != null) { debug ("Failed to extract metadata from %s: %s: %s", info.get_uri(), e.domain.to_string (), e.message); - container_caps.set_text (""); - container_name.set_text (""); - duration.set_text (""); + process_new_uri (null); + } else { + process_new_uri (info); } - process_new_uri (info); } - private void process_new_uri (DiscovererInfo info) { + private void process_new_uri (DiscovererInfo? info) { string uri = info.get_uri(); GLib.List l; DiscovererStreamInfo sinfo; - Table table; - Label label; Notebook nb; - uint row; - AttachOptions fill = AttachOptions.FILL; - AttachOptions fill_exp = AttachOptions.EXPAND|AttachOptions.FILL; string str; - Caps caps; - unowned Structure s; - unowned TagList t; unowned Toc toc = null; // sort streams ArrayList sids = new ArrayList (); @@ -358,6 +327,7 @@ public class MediaInfo.Info : Box int page_offset = 0; // reset notebooks + clear_notebook (container_streams); if (compact_mode) { clear_notebook (all_streams); } else { @@ -367,8 +337,6 @@ public class MediaInfo.Info : Box } if (info == null) { - container_caps.set_text (""); - container_name.set_text (""); duration.set_text (""); return; } @@ -387,28 +355,33 @@ public class MediaInfo.Info : Box < bilboed-pi> (yes, they exist) < bilboed-pi> I'd recommend grabbing the top-level stream_info and walking your way down */ - /* + // do container streams + nb = container_streams; + sinfo = info.get_stream_info (); + toc = sinfo.get_toc(); + nb.append_page (describe_container_stream (sinfo), new Label (@"container 0")); + six = 1; + //l = info.get_stream_list (); + // FIXME: this is always null? l = info.get_container_streams (); for (int i = 0; i < l.length (); i++) { sinfo = l.nth_data (i); - debug ("container[%d]: %s", i, sinfo.get_caps ().to_string ()); - } - l = info.get_stream_list (); - for (int i = 0; i < l.length (); i++) { - sinfo = l.nth_data (i); - debug ("stream[%d:%s]: %s", i, sinfo.get_stream_type_nick(), sinfo.get_caps ().to_string ()); - } - */ - // do container streams - sinfo = info.get_stream_info (); - if (sinfo != null) { - caps = sinfo.get_caps (); - container_caps.set_text (caps.to_string ()); - set_wikilink (container_name, caps); - toc = sinfo.get_toc(); - // irks: we can also have the toc on a *_stream + // need to skip audio/video/subtitle streams + string nick = sinfo.get_stream_type_nick(); + debug("container[%d]=%s : %s", i, nick,sinfo.get_stream_id()); + if ((nick != "container") && (nick != "unknown")) { + continue; + } + + if (toc == null) { + toc = sinfo.get_toc(); + } + + nb.append_page (describe_container_stream (sinfo), new Label (@"container $six")); + six++; } + nb.show_all(); // do video streams nb = compact_mode ? all_streams : video_streams; @@ -419,127 +392,14 @@ public class MediaInfo.Info : Box sids.clear(); for (int i = 0; i < num_video_streams; i++) { sinfo = l.nth_data (i); - caps = sinfo.get_caps (); - - Gdk.Point res = { - (int)((DiscovererVideoInfo)sinfo).get_width(), - (int)((DiscovererVideoInfo)sinfo).get_height() - }; - video_resolutions.add(res); - - row = 0; - table = new Table (2, 8, false); - - label = new Label (caps.to_string ()); - label.set_ellipsize (Pango.EllipsizeMode.END); - label.set_alignment (0.0f, 0.5f); - label.set_selectable (true); - table.attach (label, 0, 2, row, row+1, fill_exp, 0, 0, 1); - row++; - - label = new Label ("Codec:"); - label.set_alignment (1.0f, 0.5f); - table.attach (label, 0, 1, row, row+1, fill, 0, 0, 0); - label = new Label (null); - label.set_alignment (0.0f, 0.5f); - label.set_selectable (true); - label.set_use_markup (true); - set_wikilink (label, caps); - table.attach (label, 1, 2, row, row+1, fill_exp, 0, 3, 1); - row++; - - label = new Label ("Bitrate:"); - label.set_alignment (1.0f, 0.5f); - table.attach (label, 0, 1, row, row+1, fill, 0, 0, 0); - str = "%u / %u bits/second".printf (((DiscovererVideoInfo)sinfo).get_bitrate(),((DiscovererVideoInfo)sinfo).get_max_bitrate()); - label = new Label (str); - label.set_alignment (0.0f, 0.5f); - label.set_selectable (true); - table.attach (label, 1, 2, row, row+1, fill_exp, 0, 3, 1); - row++; - - // add named resolutions: (640x480=VGA) - label = new Label ("Resolution:"); - label.set_alignment (1.0f, 0.5f); - table.attach (label, 0, 1, row, row+1, fill, 0, 0, 0); - string resolution = "%u x %u".printf (res.x, res.y); - string named_res = resolutions[resolution]; - if (named_res != null) { - str = "%s (%s)".printf (named_res, resolution); - } else { - str = resolution; - } - label = new Label (str); - label.set_alignment (0.0f, 0.5f); - label.set_selectable (true); - table.attach (label, 1, 2, row, row+1, fill_exp, 0, 3, 1); - row++; - - label = new Label ("Framerate:"); - label.set_alignment (1.0f, 0.5f); - table.attach (label, 0, 1, row, row+1, fill, 0, 0, 0); - double fps_num = (double)((DiscovererVideoInfo)sinfo).get_framerate_num(); - double fps_denom = (double)((DiscovererVideoInfo)sinfo).get_framerate_denom(); - str = "%.3lf frames/second".printf (fps_num/fps_denom); - label = new Label (str); - label.set_alignment (0.0f, 0.5f); - label.set_selectable (true); - table.attach (label, 1, 2, row, row+1, fill_exp, 0, 3, 1); - row++; - - label = new Label ("PixelAspect:"); - label.set_alignment (1.0f, 0.5f); - table.attach (label, 0, 1, row, row+1, fill, 0, 0, 0); - str = "%u : %u".printf (((DiscovererVideoInfo)sinfo).get_par_num(),((DiscovererVideoInfo)sinfo).get_par_denom()); - label = new Label (str); - label.set_alignment (0.0f, 0.5f); - label.set_selectable (true); - table.attach (label, 1, 2, row, row+1, fill_exp, 0, 3, 1); - row++; - - label = new Label ("Bitdepth:"); - label.set_alignment (1.0f, 0.5f); - table.attach (label, 0, 1, row, row+1, fill, 0, 0, 0); - str = "%u bits/pixel".printf (((DiscovererVideoInfo)sinfo).get_depth()); - label = new Label (str); - label.set_alignment (0.0f, 0.5f); - label.set_selectable (true); - table.attach (label, 1, 2, row, row+1, fill_exp, 0, 3, 1); - row++; - - if ((s = sinfo.get_misc ()) != null) { - label = new Label ("Details:"); - label.set_alignment (1.0f, 0.5f); - table.attach (label, 0, 1, row, row+1, fill, 0, 0, 0); - label = new Label (s.to_string ()); - label.set_ellipsize (Pango.EllipsizeMode.END); - label.set_alignment (0.0f, 0.5f); - label.set_selectable (true); - table.attach (label, 1, 2, row, row+1, fill_exp, 0, 0, 1); - row++; - } - - if ((t = sinfo.get_tags ()) != null) { - // FIXME: use treeview inside scrolled window - label = new Label ("Tags:"); - label.set_alignment (1.0f, 0.0f); - table.attach (label, 0, 1, row, row+1, fill, fill, 0, 0); - str = build_taglist_info (t); - label = new Label (str); - label.set_ellipsize (Pango.EllipsizeMode.END); - label.set_alignment (0.0f, 0.5f); - label.set_selectable (true); - label.set_use_markup (true); - table.attach (label, 1, 2, row, row+1, fill_exp, 0, 0, 1); - row++; - } + debug("video[%d]=%s", i, sinfo.get_stream_id()); if (toc == null) { toc = sinfo.get_toc(); } six = get_stream_index (sinfo, sids); - nb.insert_page (table, new Label (@"video $i"), page_offset + six); + nb.insert_page (describe_video_stream (sinfo), new Label (@"video $i"), page_offset + six); } if (compact_mode) { page_offset += (int)num_video_streams; @@ -554,103 +414,14 @@ public class MediaInfo.Info : Box sids.clear(); for (int i = 0; i < num_audio_streams; i++) { sinfo = l.nth_data (i); - caps = sinfo.get_caps (); - - row = 0; - table = new Table (2, 7, false); - - label = new Label (caps.to_string ()); - label.set_ellipsize (Pango.EllipsizeMode.END); - label.set_alignment (0.0f, 0.5f); - label.set_selectable (true); - table.attach (label, 0, 2, row, row+1, fill_exp, 0, 0, 1); - row++; - - label = new Label ("Codec:"); - label.set_alignment (1.0f, 0.5f); - table.attach (label, 0, 1, row, row+1, fill, 0, 0, 0); - label = new Label (null); - label.set_alignment (0.0f, 0.5f); - label.set_selectable (true); - label.set_use_markup (true); - set_wikilink (label, caps); - table.attach (label, 1, 2, row, row+1, fill_exp, 0, 3, 1); - row++; - - label = new Label ("Bitrate:"); - label.set_alignment (1.0f, 0.5f); - table.attach (label, 0, 1, row, row+1, fill, 0, 0, 0); - str = "%u / %u bits/second".printf (((DiscovererAudioInfo)sinfo).get_bitrate(),((DiscovererAudioInfo)sinfo).get_max_bitrate()); - label = new Label (str); - label.set_alignment (0.0f, 0.5f); - label.set_selectable (true); - table.attach (label, 1, 2, row, row+1, fill_exp, 0, 3, 1); - row++; - - label = new Label ("Samplerate:"); - label.set_alignment (1.0f, 0.5f); - table.attach (label, 0, 1, row, row+1, fill, 0, 0, 0); - str = "%u samples/second".printf (((DiscovererAudioInfo)sinfo).get_sample_rate()); - label = new Label (str); - label.set_alignment (0.0f, 0.5f); - label.set_selectable (true); - table.attach (label, 1, 2, row, row+1, fill_exp, 0, 3, 1); - row++; - - // TODO: check channel layouts, can we have some nice names here ? - label = new Label ("Channels:"); - label.set_alignment (1.0f, 0.5f); - table.attach (label, 0, 1, row, row+1, fill, 0, 0, 0); - str = "%u".printf (((DiscovererAudioInfo)sinfo).get_channels()); - label = new Label (str); - label.set_alignment (0.0f, 0.5f); - label.set_selectable (true); - table.attach (label, 1, 2, row, row+1, fill_exp, 0, 3, 1); - row++; - - label = new Label ("Bitdepth:"); - label.set_alignment (1.0f, 0.5f); - table.attach (label, 0, 1, row, row+1, fill, 0, 0, 0); - str = "%u bits/sample".printf (((DiscovererAudioInfo)sinfo).get_depth()); - label = new Label (str); - label.set_alignment (0.0f, 0.5f); - label.set_selectable (true); - table.attach (label, 1, 2, row, row+1, fill_exp, 0, 3, 1); - row++; - - if ((s = sinfo.get_misc ()) != null) { - label = new Label ("Details:"); - label.set_alignment (1.0f, 0.5f); - table.attach (label, 0, 1, row, row+1, fill, 0, 0, 0); - label = new Label (s.to_string ()); - label.set_ellipsize (Pango.EllipsizeMode.END); - label.set_alignment (0.0f, 0.5f); - label.set_selectable (true); - table.attach (label, 1, 2, row, row+1, fill_exp, 0, 0, 1); - row++; - } - - if ((t = sinfo.get_tags ()) != null) { - // FIXME: use treeview inside scrolled window - label = new Label ("Tags:"); - label.set_alignment (1.0f, 0.0f); - table.attach (label, 0, 1, row, row+1, fill, fill, 0, 0); - str = build_taglist_info (t); - label = new Label (str); - label.set_ellipsize (Pango.EllipsizeMode.END); - label.set_alignment (0.0f, 0.5f); - label.set_selectable (true); - label.set_use_markup (true); - table.attach (label, 1, 2, row, row+1, fill_exp, 0, 0, 1); - row++; - } + debug("audio[%d]=%s", i, sinfo.get_stream_id()); if (toc == null) { toc = sinfo.get_toc(); } six = get_stream_index (sinfo, sids); - nb.insert_page (table, new Label (@"audio $i"), page_offset + six); + nb.insert_page (describe_audio_stream (sinfo), new Label (@"audio $i"), page_offset + six); } if (compact_mode) { page_offset += (int)num_audio_streams; @@ -665,62 +436,13 @@ public class MediaInfo.Info : Box sids.clear(); for (int i = 0; i < num_subtitle_streams; i++) { sinfo = l.nth_data (i); - caps = sinfo.get_caps (); - - row = 0; - table = new Table (2, 7, false); - - label = new Label (caps.to_string ()); - label.set_ellipsize (Pango.EllipsizeMode.END); - label.set_alignment (0.0f, 0.5f); - label.set_selectable (true); - table.attach (label, 0, 2, row, row+1, fill_exp, 0, 0, 1); - row++; - - label = new Label ("Codec:"); - label.set_alignment (1.0f, 0.5f); - table.attach (label, 0, 1, row, row+1, fill, 0, 0, 0); - label = new Label (null); - label.set_alignment (0.0f, 0.5f); - label.set_selectable (true); - label.set_use_markup (true); - set_wikilink (label, caps); - table.attach (label, 1, 2, row, row+1, fill_exp, 0, 3, 1); - row++; - - if ((s = sinfo.get_misc ()) != null) { - label = new Label ("Details:"); - label.set_alignment (1.0f, 0.5f); - table.attach (label, 0, 1, row, row+1, fill, 0, 0, 0); - label = new Label (s.to_string ()); - label.set_ellipsize (Pango.EllipsizeMode.END); - label.set_alignment (0.0f, 0.5f); - label.set_selectable (true); - table.attach (label, 1, 2, row, row+1, fill_exp, 0, 0, 1); - row++; - } - - if ((t = sinfo.get_tags ()) != null) { - // FIXME: use treeview inside scrolled window - label = new Label ("Tags:"); - label.set_alignment (1.0f, 0.0f); - table.attach (label, 0, 1, row, row+1, fill, fill, 0, 0); - str = build_taglist_info (t); - label = new Label (str); - label.set_ellipsize (Pango.EllipsizeMode.END); - label.set_alignment (0.0f, 0.5f); - label.set_selectable (true); - label.set_use_markup (true); - table.attach (label, 1, 2, row, row+1, fill_exp, 0, 0, 1); - row++; - } if (toc == null) { toc = sinfo.get_toc(); } six = get_stream_index (sinfo, sids); - nb.insert_page (table, new Label (@"subtitle $i"), page_offset + six); + nb.insert_page (describe_subtitle_stream (sinfo), new Label (@"subtitle $i"), page_offset + six); } if (compact_mode) { page_offset += (int)num_subtitle_streams; @@ -830,6 +552,297 @@ public class MediaInfo.Info : Box // helpers + private Widget describe_container_stream (DiscovererStreamInfo sinfo) { + Table table; + Label label; + AttachOptions fill = AttachOptions.FILL; + AttachOptions fill_exp = AttachOptions.EXPAND|AttachOptions.FILL; + Caps caps = sinfo.get_caps (); + uint row = 0; + + table = new Table (2, 7, false); + + label = new Label (caps.to_string ()); + label.set_ellipsize (Pango.EllipsizeMode.END); + label.set_alignment (0.0f, 0.5f); + label.set_selectable (true); + table.attach (label, 0, 2, row, row+1, fill_exp, 0, 0, 1); + row++; + + label = new Label ("Format:"); + label.set_alignment (1.0f, 0.5f); + table.attach (label, 0, 1, row, row+1, fill, 0, 0, 0); + label = new Label (null); + label.set_alignment (0.0f, 0.5f); + label.set_selectable (true); + label.set_use_markup (true); + set_wikilink (label, caps); + table.attach (label, 1, 2, row, row+1, fill_exp, 0, 3, 1); + row++; + + if (add_table_row_for_structure (table, row, sinfo.get_misc ())) { + row++; + } + if (add_table_row_for_taglist (table, row, sinfo.get_tags ())) { + row++; + } + + return (Widget)table; + } + + private Widget describe_video_stream (DiscovererStreamInfo sinfo) { + Table table; + Label label; + AttachOptions fill = AttachOptions.FILL; + AttachOptions fill_exp = AttachOptions.EXPAND|AttachOptions.FILL; + Caps caps = sinfo.get_caps (); + DiscovererVideoInfo vinfo = (DiscovererVideoInfo)sinfo; + string str; + uint row = 0; + + Gdk.Point res = { + (int)((DiscovererVideoInfo)sinfo).get_width(), + (int)((DiscovererVideoInfo)sinfo).get_height() + }; + video_resolutions.add(res); + + table = new Table (2, 8, false); + + label = new Label (caps.to_string ()); + label.set_ellipsize (Pango.EllipsizeMode.END); + label.set_alignment (0.0f, 0.5f); + label.set_selectable (true); + table.attach (label, 0, 2, row, row+1, fill_exp, 0, 0, 1); + row++; + + label = new Label ("Codec:"); + label.set_alignment (1.0f, 0.5f); + table.attach (label, 0, 1, row, row+1, fill, 0, 0, 0); + label = new Label (null); + label.set_alignment (0.0f, 0.5f); + label.set_selectable (true); + label.set_use_markup (true); + set_wikilink (label, caps); + table.attach (label, 1, 2, row, row+1, fill_exp, 0, 3, 1); + row++; + + label = new Label ("Bitrate:"); + label.set_alignment (1.0f, 0.5f); + table.attach (label, 0, 1, row, row+1, fill, 0, 0, 0); + str = "%u / %u bits/second".printf (vinfo.get_bitrate(), vinfo.get_max_bitrate()); + label = new Label (str); + label.set_alignment (0.0f, 0.5f); + label.set_selectable (true); + table.attach (label, 1, 2, row, row+1, fill_exp, 0, 3, 1); + row++; + + // add named resolutions: (640x480=VGA) + label = new Label ("Resolution:"); + label.set_alignment (1.0f, 0.5f); + table.attach (label, 0, 1, row, row+1, fill, 0, 0, 0); + string resolution = "%u x %u".printf (res.x, res.y); + string named_res = resolutions[resolution]; + if (named_res != null) { + str = "%s (%s)".printf (named_res, resolution); + } else { + str = resolution; + } + label = new Label (str); + label.set_alignment (0.0f, 0.5f); + label.set_selectable (true); + table.attach (label, 1, 2, row, row+1, fill_exp, 0, 3, 1); + row++; + + label = new Label ("Framerate:"); + label.set_alignment (1.0f, 0.5f); + table.attach (label, 0, 1, row, row+1, fill, 0, 0, 0); + double fps_num = (double)vinfo.get_framerate_num(); + double fps_denom = (double)vinfo.get_framerate_denom(); + str = "%.3lf frames/second".printf (fps_num/fps_denom); + label = new Label (str); + label.set_alignment (0.0f, 0.5f); + label.set_selectable (true); + table.attach (label, 1, 2, row, row+1, fill_exp, 0, 3, 1); + row++; + + label = new Label ("PixelAspect:"); + label.set_alignment (1.0f, 0.5f); + table.attach (label, 0, 1, row, row+1, fill, 0, 0, 0); + str = "%u : %u".printf (vinfo.get_par_num(),vinfo.get_par_denom()); + label = new Label (str); + label.set_alignment (0.0f, 0.5f); + label.set_selectable (true); + table.attach (label, 1, 2, row, row+1, fill_exp, 0, 3, 1); + row++; + + label = new Label ("Bitdepth:"); + label.set_alignment (1.0f, 0.5f); + table.attach (label, 0, 1, row, row+1, fill, 0, 0, 0); + str = "%u bits/pixel".printf (vinfo.get_depth()); + label = new Label (str); + label.set_alignment (0.0f, 0.5f); + label.set_selectable (true); + table.attach (label, 1, 2, row, row+1, fill_exp, 0, 3, 1); + row++; + + label = new Label ("Interlaced:"); + label.set_alignment (1.0f, 0.5f); + table.attach (label, 0, 1, row, row+1, fill, 0, 0, 0); + str = "%s".printf (vinfo.is_interlaced() ? "true" : "false"); + label = new Label (str); + label.set_alignment (0.0f, 0.5f); + label.set_selectable (true); + table.attach (label, 1, 2, row, row+1, fill_exp, 0, 3, 1); + row++; + + if (add_table_row_for_structure (table, row, sinfo.get_misc ())) { + row++; + } + if (add_table_row_for_taglist (table, row, sinfo.get_tags ())) { + row++; + } + + return (Widget)table; + } + + private Widget describe_audio_stream (DiscovererStreamInfo sinfo) { + Table table; + Label label; + AttachOptions fill = AttachOptions.FILL; + AttachOptions fill_exp = AttachOptions.EXPAND|AttachOptions.FILL; + Caps caps = sinfo.get_caps (); + DiscovererAudioInfo ainfo = (DiscovererAudioInfo)sinfo; + string str; + uint row = 0; + + table = new Table (2, 7, false); + + label = new Label (caps.to_string ()); + label.set_ellipsize (Pango.EllipsizeMode.END); + label.set_alignment (0.0f, 0.5f); + label.set_selectable (true); + table.attach (label, 0, 2, row, row+1, fill_exp, 0, 0, 1); + row++; + + label = new Label ("Codec:"); + label.set_alignment (1.0f, 0.5f); + table.attach (label, 0, 1, row, row+1, fill, 0, 0, 0); + label = new Label (null); + label.set_alignment (0.0f, 0.5f); + label.set_selectable (true); + label.set_use_markup (true); + set_wikilink (label, caps); + table.attach (label, 1, 2, row, row+1, fill_exp, 0, 3, 1); + row++; + + label = new Label ("Bitrate:"); + label.set_alignment (1.0f, 0.5f); + table.attach (label, 0, 1, row, row+1, fill, 0, 0, 0); + str = "%u / %u bits/second".printf (ainfo.get_bitrate(),ainfo.get_max_bitrate()); + label = new Label (str); + label.set_alignment (0.0f, 0.5f); + label.set_selectable (true); + table.attach (label, 1, 2, row, row+1, fill_exp, 0, 3, 1); + row++; + + label = new Label ("Samplerate:"); + label.set_alignment (1.0f, 0.5f); + table.attach (label, 0, 1, row, row+1, fill, 0, 0, 0); + str = "%u samples/second".printf (ainfo.get_sample_rate()); + label = new Label (str); + label.set_alignment (0.0f, 0.5f); + label.set_selectable (true); + table.attach (label, 1, 2, row, row+1, fill_exp, 0, 3, 1); + row++; + + // TODO: check channel layouts, can we have some nice names here ? + label = new Label ("Channels:"); + label.set_alignment (1.0f, 0.5f); + table.attach (label, 0, 1, row, row+1, fill, 0, 0, 0); + str = "%u".printf (ainfo.get_channels()); + label = new Label (str); + label.set_alignment (0.0f, 0.5f); + label.set_selectable (true); + table.attach (label, 1, 2, row, row+1, fill_exp, 0, 3, 1); + row++; + + label = new Label ("Bitdepth:"); + label.set_alignment (1.0f, 0.5f); + table.attach (label, 0, 1, row, row+1, fill, 0, 0, 0); + str = "%u bits/sample".printf (ainfo.get_depth()); + label = new Label (str); + label.set_alignment (0.0f, 0.5f); + label.set_selectable (true); + table.attach (label, 1, 2, row, row+1, fill_exp, 0, 3, 1); + row++; + + label = new Label ("Language:"); + label.set_alignment (1.0f, 0.5f); + table.attach (label, 0, 1, row, row+1, fill, 0, 0, 0); + label = new Label (ainfo.get_language()); + label.set_alignment (0.0f, 0.5f); + label.set_selectable (true); + table.attach (label, 1, 2, row, row+1, fill_exp, 0, 3, 1); + row++; + + if (add_table_row_for_structure (table, row, sinfo.get_misc ())) { + row++; + } + if (add_table_row_for_taglist (table, row, sinfo.get_tags ())) { + row++; + } + + return (Widget)table; + } + + private Widget describe_subtitle_stream (DiscovererStreamInfo sinfo) { + Table table; + Label label; + AttachOptions fill = AttachOptions.FILL; + AttachOptions fill_exp = AttachOptions.EXPAND|AttachOptions.FILL; + Caps caps = sinfo.get_caps (); + DiscovererSubtitleInfo tinfo = (DiscovererSubtitleInfo) sinfo; + uint row = 0; + + table = new Table (2, 7, false); + + label = new Label (caps.to_string ()); + label.set_ellipsize (Pango.EllipsizeMode.END); + label.set_alignment (0.0f, 0.5f); + label.set_selectable (true); + table.attach (label, 0, 2, row, row+1, fill_exp, 0, 0, 1); + row++; + + label = new Label ("Codec:"); + label.set_alignment (1.0f, 0.5f); + table.attach (label, 0, 1, row, row+1, fill, 0, 0, 0); + label = new Label (null); + label.set_alignment (0.0f, 0.5f); + label.set_selectable (true); + label.set_use_markup (true); + set_wikilink (label, caps); + table.attach (label, 1, 2, row, row+1, fill_exp, 0, 3, 1); + row++; + + label = new Label ("Language:"); + label.set_alignment (1.0f, 0.5f); + table.attach (label, 0, 1, row, row+1, fill, 0, 0, 0); + label = new Label (tinfo.get_language()); + label.set_alignment (0.0f, 0.5f); + label.set_selectable (true); + table.attach (label, 1, 2, row, row+1, fill_exp, 0, 3, 1); + row++; + + if (add_table_row_for_structure (table, row, sinfo.get_misc ())) { + row++; + } + if (add_table_row_for_taglist (table, row, sinfo.get_tags ())) { + row++; + } + + return (Widget)table; + } + private void clear_notebook (Notebook nb) { while (nb.get_n_pages() > 0) { nb.remove_page (-1); @@ -850,6 +863,43 @@ public class MediaInfo.Info : Box label.set_text (str); } } + + private bool add_table_row_for_structure (Table table, uint row, Structure s) { + if (s == null) + return false; + + AttachOptions fill = AttachOptions.FILL; + AttachOptions fill_exp = AttachOptions.EXPAND|AttachOptions.FILL; + + Label label = new Label ("Details:"); + label.set_alignment (1.0f, 0.5f); + table.attach (label, 0, 1, row, row+1, fill, 0, 0, 0); + label = new Label (s.to_string ()); + label.set_ellipsize (Pango.EllipsizeMode.END); + label.set_alignment (0.0f, 0.5f); + label.set_selectable (true); + table.attach (label, 1, 2, row, row+1, fill_exp, 0, 0, 1); + return true; + } + + private bool add_table_row_for_taglist (Table table, uint row, TagList t) { + if (t == null) + return false; + + AttachOptions fill = AttachOptions.FILL; + AttachOptions fill_exp = AttachOptions.EXPAND|AttachOptions.FILL; + + Label label = new Label ("Tags:"); + label.set_alignment (1.0f, 0.0f); + table.attach (label, 0, 1, row, row+1, fill, fill, 0, 0); + label = new Label (build_taglist_info (t)); + label.set_ellipsize (Pango.EllipsizeMode.END); + label.set_alignment (0.0f, 0.5f); + label.set_selectable (true); + label.set_use_markup (true); + table.attach (label, 1, 2, row, row+1, fill_exp, 0, 0, 1); + return true; + } // get stream index where streams are orderd by stream_id private int get_stream_index (DiscovererStreamInfo sinfo, ArrayList sids) {