64
on_got_metadata_event (BaconVideoWidget *bvw, TotemPropertiesView *props)
66
GValue value = { 0, };
64
update_general (TotemPropertiesView *props,
65
const GstTagList *list)
71
{ GST_TAG_TITLE, "title" },
72
{ GST_TAG_ARTIST, "artist" },
73
{ GST_TAG_ALBUM, "album" },
74
{ GST_TAG_COMMENT, "comment" },
79
for (i = 0; i < G_N_ELEMENTS(items); i++) {
82
if (gst_tag_list_get_string_index (list, items[i].tag_name, 0, &string) != FALSE) {
83
bacon_video_widget_properties_set_label (props->priv->props,
91
if (gst_tag_list_get_date (list, GST_TAG_DATE, &date)) {
94
string = g_strdup_printf ("%d", g_date_get_year (date));
96
bacon_video_widget_properties_set_label (props->priv->props,
104
set_codec (TotemPropertiesView *props,
105
GstDiscovererStreamInfo *info,
111
nick = gst_discoverer_stream_info_get_stream_type_nick (info);
112
if (g_str_equal (nick, "audio") == FALSE &&
113
g_str_equal (nick, "video") == FALSE &&
114
g_str_equal (nick, "container") == FALSE) {
115
bacon_video_widget_properties_set_label (props->priv->props,
121
caps = gst_discoverer_stream_info_get_caps (info);
123
if (gst_caps_is_fixed (caps)) {
126
string = gst_pb_utils_get_codec_description (caps);
127
bacon_video_widget_properties_set_label (props->priv->props,
132
gst_caps_unref (caps);
137
set_bitrate (TotemPropertiesView *props,
144
bacon_video_widget_properties_set_label (props->priv->props,
146
C_("Stream bit rate", "N/A"));
149
string = g_strdup_printf (_("%d kbps"), bitrate / 1000);
150
bacon_video_widget_properties_set_label (props->priv->props,
157
update_video (TotemPropertiesView *props,
158
GstDiscovererVideoInfo *info)
164
width = gst_discoverer_video_info_get_width (info);
165
height = gst_discoverer_video_info_get_height (info);
166
string = g_strdup_printf (N_("%d x %d"), width, height);
167
bacon_video_widget_properties_set_label (props->priv->props,
172
set_codec (props, (GstDiscovererStreamInfo *) info, "vcodec");
173
set_bitrate (props, gst_discoverer_video_info_get_bitrate (info), "video_bitrate");
175
/* Round up/down to the nearest integer framerate */
176
fps_n = gst_discoverer_video_info_get_framerate_num (info);
177
fps_d = gst_discoverer_video_info_get_framerate_denom (info);
179
bacon_video_widget_properties_set_framerate (props->priv->props, 0);
181
bacon_video_widget_properties_set_framerate (props->priv->props,
182
(fps_n + fps_d/2) / fps_d);
186
update_audio (TotemPropertiesView *props,
187
GstDiscovererAudioInfo *info)
189
guint samplerate, channels;
191
set_codec (props, (GstDiscovererStreamInfo *) info, "acodec");
193
set_bitrate (props, gst_discoverer_audio_info_get_bitrate (info), "audio_bitrate");
195
samplerate = gst_discoverer_audio_info_get_sample_rate (info);
198
string = g_strdup_printf (_("%d Hz"), samplerate);
199
bacon_video_widget_properties_set_label (props->priv->props,
203
bacon_video_widget_properties_set_label (props->priv->props,
205
C_("Sample rate", "N/A"));
208
channels = gst_discoverer_audio_info_get_channels (info);
213
string = g_strdup_printf ("%s %d.1", _("Surround"), channels - 1);
214
} else if (channels == 1) {
215
string = g_strdup (_("Mono"));
216
} else if (channels == 2) {
217
string = g_strdup (_("Stereo"));
219
bacon_video_widget_properties_set_label (props->priv->props,
223
bacon_video_widget_properties_set_label (props->priv->props,
225
C_("Number of audio channels", "N/A"));
230
discovered_cb (GstDiscoverer *discoverer,
231
GstDiscovererInfo *info,
233
TotemPropertiesView *props)
235
GList *video_streams, *audio_streams;
236
const GstTagList *taglist;
67
237
gboolean has_audio, has_video;
68
const char *label = NULL;
70
bacon_video_widget_get_metadata (BACON_VIDEO_WIDGET (bvw),
71
BVW_INFO_HAS_VIDEO, &value);
72
has_video = g_value_get_boolean (&value);
73
g_value_unset (&value);
75
bacon_video_widget_get_metadata (BACON_VIDEO_WIDGET (bvw),
76
BVW_INFO_HAS_AUDIO, &value);
77
has_audio = g_value_get_boolean (&value);
78
g_value_unset (&value);
80
if (has_audio == FALSE) {
81
if (has_video == FALSE) {
82
//FIXME this should be setting an error?
83
label = N_("Audio/Video");
88
if (has_video == FALSE) {
91
label = N_("Audio/Video");
239
GstClockTime duration;
240
GstDiscovererStreamInfo *sinfo;
243
g_warning ("Couldn't get information about '%s': %s",
244
gst_discoverer_info_get_uri (info),
249
video_streams = gst_discoverer_info_get_video_streams (info);
250
has_video = (video_streams != NULL);
251
audio_streams = gst_discoverer_info_get_audio_streams (info);
252
has_audio = (audio_streams != NULL);
254
if (has_audio == has_video)
255
label = N_("Audio/Video");
95
261
gtk_label_set_text (GTK_LABEL (props->priv->label), _(label));
97
bacon_video_widget_properties_update
98
(props->priv->props, GTK_WIDGET (props->priv->bvw));
264
bacon_video_widget_properties_set_has_type (props->priv->props,
269
duration = gst_discoverer_info_get_duration (info);
270
bacon_video_widget_properties_set_duration (props->priv->props, duration / GST_SECOND * 1000);
272
sinfo = gst_discoverer_info_get_stream_info (info);
274
set_codec (props, sinfo, "container");
275
gst_discoverer_stream_info_unref (sinfo);
278
taglist = gst_discoverer_info_get_tags (info);
279
update_general (props, taglist);
281
/* Video and Audio */
283
update_video (props, video_streams->data);
285
update_audio (props, audio_streams->data);
287
gst_discoverer_stream_info_list_free (video_streams);
288
gst_discoverer_stream_info_list_free (audio_streams);
106
296
props->priv = g_new0 (TotemPropertiesViewPriv, 1);
108
props->priv->bvw = BACON_VIDEO_WIDGET (bacon_video_widget_new
109
(-1, -1, BVW_USE_TYPE_METADATA, &err));
111
if (props->priv->bvw != NULL)
113
/* Reference it, so that it's not floating */
114
g_object_ref (props->priv->bvw);
116
g_signal_connect (G_OBJECT (props->priv->bvw),
118
G_CALLBACK (on_got_metadata_event),
121
g_warning ("Error: %s", err ? err->message : "bla");
124
298
props->priv->vbox = bacon_video_widget_properties_new ();
125
299
gtk_table_resize (GTK_TABLE (props), 1, 1);
126
300
gtk_container_add (GTK_CONTAINER (props), props->priv->vbox);
127
301
gtk_widget_show (GTK_WIDGET (props));
129
303
props->priv->props = BACON_VIDEO_WIDGET_PROPERTIES (props->priv->vbox);
305
props->priv->disco = gst_discoverer_new (GST_SECOND * 60, &err);
306
if (props->priv->disco == NULL) {
307
g_warning ("Could not create discoverer object: %s", err->message);
311
g_signal_connect (props->priv->disco, "discovered",
312
G_CALLBACK (discovered_cb), props);