discoverer: retrieve audio track language from tags too
authorVincent Penquerc'h <vincent.penquerch@collabora.co.uk>
Wed, 24 Aug 2011 15:29:08 +0000 (16:29 +0100)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Fri, 26 Aug 2011 08:05:51 +0000 (10:05 +0200)
https://bugzilla.gnome.org/show_bug.cgi?id=657257

gst-libs/gst/pbutils/gstdiscoverer-types.c
gst-libs/gst/pbutils/gstdiscoverer.c
gst-libs/gst/pbutils/gstdiscoverer.h
gst-libs/gst/pbutils/pbutils-private.h
tools/gst-discoverer.c

index f705a94..ee357ba 100644 (file)
@@ -207,15 +207,22 @@ G_DEFINE_TYPE (GstDiscovererAudioInfo, gst_discoverer_audio_info,
     GST_TYPE_DISCOVERER_STREAM_INFO);
 
 static void
+gst_discoverer_audio_info_finalize (GstDiscovererAudioInfo * info)
+{
+  g_free (info->language);
+}
+
+static void
 gst_discoverer_audio_info_class_init (GstDiscovererAudioInfoClass * klass)
 {
-  /* Nothing to initialize */
+  klass->finalize =
+      (GstMiniObjectFinalizeFunction) gst_discoverer_audio_info_finalize;
 }
 
 static void
 gst_discoverer_audio_info_init (GstDiscovererAudioInfo * info)
 {
-  /* Nothing to initialize */
+  info->language = NULL;
 }
 
 static GstDiscovererAudioInfo *
@@ -237,6 +244,7 @@ gst_discoverer_audio_info_copy_int (GstDiscovererAudioInfo * ptr)
   ret->depth = ptr->depth;
   ret->bitrate = ptr->bitrate;
   ret->max_bitrate = ptr->max_bitrate;
+  ret->language = g_strdup (ptr->language);
 
   return ret;
 }
@@ -750,6 +758,17 @@ AUDIO_INFO_ACCESSOR_CODE (bitrate, guint, 0);
 
 AUDIO_INFO_ACCESSOR_CODE (max_bitrate, guint, 0);
 
+/**
+ * gst_discoverer_audio_info_get_language:
+ * @info: a #GstDiscovererAudioInfo
+ *
+ * Returns: the language of the stream, or NULL if unknown.
+ *
+ * Since: 0.10.36
+ */
+
+AUDIO_INFO_ACCESSOR_CODE (language, const gchar *, NULL);
+
 /* GstDiscovererVideoInfo */
 
 #define VIDEO_INFO_ACCESSOR_CODE(fieldname, type, failval)             \
index 1b90310..21e4f52 100644 (file)
@@ -667,6 +667,14 @@ collect_information (GstDiscoverer * dc, const GstStructure * st,
       gst_structure_free (tags_st);
     }
 
+    if (!info->language && ((GstDiscovererStreamInfo *) info)->tags) {
+      gchar *language;
+      if (gst_tag_list_get_string (((GstDiscovererStreamInfo *) info)->tags,
+              GST_TAG_LANGUAGE_CODE, &language)) {
+        info->language = language;
+      }
+    }
+
     return (GstDiscovererStreamInfo *) info;
 
   } else if (g_str_has_prefix (name, "video/") ||
index f0100b6..61236fd 100644 (file)
@@ -110,6 +110,7 @@ guint gst_discoverer_audio_info_get_sample_rate(const GstDiscovererAudioInfo* in
 guint gst_discoverer_audio_info_get_depth(const GstDiscovererAudioInfo* info);
 guint gst_discoverer_audio_info_get_bitrate(const GstDiscovererAudioInfo* info);
 guint gst_discoverer_audio_info_get_max_bitrate(const GstDiscovererAudioInfo* info);
+const gchar * gst_discoverer_audio_info_get_language(const GstDiscovererAudioInfo* info);
 
 /**
  * GstDiscovererVideoInfo:
index 99606bc..2efaa17 100644 (file)
@@ -44,6 +44,8 @@ struct _GstDiscovererAudioInfo {
 
   guint bitrate;
   guint max_bitrate;
+
+  gchar *language;
 };
 
 struct _GstDiscovererVideoInfo {
index 19aef90..210c1ed 100644 (file)
@@ -47,6 +47,7 @@ gst_stream_audio_information_to_string (GstDiscovererStreamInfo * info,
   GstDiscovererAudioInfo *audio_info;
   GString *s;
   gchar *tmp;
+  const gchar *ctmp;
   int len = 400;
   const GstTagList *tags;
   GstCaps *caps;
@@ -72,6 +73,8 @@ gst_stream_audio_information_to_string (GstDiscovererStreamInfo * info,
   }
 
   audio_info = (GstDiscovererAudioInfo *) info;
+  ctmp = gst_discoverer_audio_info_get_language (audio_info);
+  my_g_string_append_printf (s, "Language: %s\n", ctmp ? ctmp : "<unknown>");
   my_g_string_append_printf (s, "Channels: %u\n",
       gst_discoverer_audio_info_get_channels (audio_info));
   my_g_string_append_printf (s, "Sample rate: %u\n",