Corrects retrieving metadata for gstreamer module
authorcaptainigloo <captainigloo>
Fri, 4 Jul 2008 17:56:24 +0000 (17:56 +0000)
committercaptainigloo <captainigloo@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Fri, 4 Jul 2008 17:56:24 +0000 (17:56 +0000)
http://bugs.enlightenment.org/show_bug.cgi?id=504

git-svn-id: http://svn.enlightenment.org/svn/e/trunk/e17/libs/emotion@35001 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/modules/gstreamer/emotion_gstreamer.c
src/modules/gstreamer/emotion_gstreamer.h

index e2036df..b86cc9f 100644 (file)
@@ -12,6 +12,9 @@ static int _eos_timer_fct (void *data);
 
 static int   _em_fd_ev_active(void *data, Ecore_Fd_Handler *fdh);
 
+static void _for_each_tag (GstTagList const* list, gchar const* tag, void *data);
+
+static void _free_metadata (Emotion_Gstreamer_Metadata *m);
 
 /* Interface */
 
@@ -318,6 +321,7 @@ em_shutdown(void *video)
    return 1;
 }
 
+
 static unsigned char
 em_file_open(const char   *file,
             Evas_Object  *obj,
@@ -428,6 +432,12 @@ em_file_open(const char   *file,
      }
    }
 
+   if (ev->metadata)
+     _free_metadata(ev->metadata);
+   ev->metadata = calloc(1, sizeof(Emotion_Gstreamer_Metadata));
+
+   _eos_timer_fct(ev);
+
    return 1;
 }
 
@@ -452,9 +462,16 @@ em_file_close(void *video)
 
    if (ev->eos_bus)
      {
-        gst_object_unref (GST_OBJECT (ev->eos_bus));
-        ev->eos_bus = NULL;
+       gst_object_unref (GST_OBJECT (ev->eos_bus));
+       ev->eos_bus = NULL;
+     }
+
+   if(ev->metadata)
+     {
+       _free_metadata(ev->metadata);
+       ev->metadata = NULL;
      }
+
    if (ev->pipeline)
      {
         gst_element_set_state (ev->pipeline, GST_STATE_NULL);
@@ -1113,6 +1130,8 @@ em_speed_get(void *video)
 
 static int
 em_eject(void *video)
+
+
 {
    Emotion_Gstreamer_Video *ev;
 
@@ -1125,90 +1144,37 @@ static const char *
 em_meta_get(void *video, int meta)
 {
    Emotion_Gstreamer_Video *ev;
-   GstBus                  *bus;
-   gchar                   *str = NULL;
-   gboolean                 done;
+   const char *str;
 
    ev = (Emotion_Gstreamer_Video *)video;
-   if (!ev) return NULL;
-
-   done = FALSE;
-   bus = gst_element_get_bus (ev->pipeline);
-   if (!bus) return NULL;
-
-   while (!done) {
-      GstMessage *message;
-
-      message = gst_bus_pop (bus);
-      if (message == NULL)
-        /* All messages read, we're done */
-         break;
-
-      switch (GST_MESSAGE_TYPE (message)) {
-      case GST_MESSAGE_TAG: {
-         GstTagList *new_tags;
-
-         gst_message_parse_tag (message, &new_tags);
-
-         switch (meta) {
-         case META_TRACK_TITLE:
-            gst_tag_list_get_string (new_tags, GST_TAG_TITLE, &str);
-            if (str) done = TRUE;
-            break;
-         case META_TRACK_ARTIST:
-            gst_tag_list_get_string (new_tags, GST_TAG_ARTIST, &str);
-            if (str) done = TRUE;
-            break;
-         case META_TRACK_GENRE:
-            gst_tag_list_get_string (new_tags, GST_TAG_GENRE, &str);
-            if (str) done = TRUE;
-            break;
-         case META_TRACK_COMMENT:
-            gst_tag_list_get_string (new_tags, GST_TAG_COMMENT, &str);
-            if (str) done = TRUE;
-            break;
-         case META_TRACK_ALBUM:
-            gst_tag_list_get_string (new_tags, GST_TAG_ALBUM, &str);
-            if (str) done = TRUE;
-            break;
-         case META_TRACK_YEAR: {
-            const GValue *date;
-
-            date = gst_tag_list_get_value_index (new_tags, GST_TAG_DATE, 0);
-            if (date)
-               str = g_strdup_value_contents (date);
-            if (str) done = TRUE;
-            break;
-         }
-         case META_TRACK_DISCID:
-#ifdef GST_TAG_CDDA_CDDB_DISCID
-            gst_tag_list_get_string (new_tags, GST_TAG_CDDA_CDDB_DISCID, &str);
-#endif
-            if (str) done = TRUE;
-            break;
-         case META_TRACK_COUNT: {
-            int track_count;
-
-            track_count = emotion_pipeline_cdda_track_count_get (video);
-            if (track_count > 0) {
-               char buf[64];
-
-               g_snprintf (buf, 64, "%d", track_count);
-               str = g_strdup (buf);
-               done = TRUE;
-            }
-            break;
-         }
-         }
-         break;
-      }
-      default:
-         break;
-      }
-      gst_message_unref (message);
-   }
 
-   gst_object_unref (GST_OBJECT (bus));
+   if (!ev || !ev->metadata) return NULL;
+   switch (meta)
+     {
+      case META_TRACK_TITLE:
+        str = ev->metadata->title;
+        break;
+      case META_TRACK_ARTIST:
+        str = ev->metadata->artist;
+        break;
+      case  META_TRACK_ALBUM:
+        str = ev->metadata->album;
+        break;
+      case META_TRACK_YEAR:
+        str = ev->metadata->year;
+        break;
+      case META_TRACK_GENRE:
+        str = ev->metadata->genre;
+        break;
+      case META_TRACK_COMMENT:
+        str = ev->metadata->comment;
+        break;
+      case META_TRACK_DISCID:
+        str = ev->metadata->disc_id;
+        break;
+      default:
+        break;
+     }
 
    return str;
 }
@@ -1236,6 +1202,141 @@ module_close(Emotion_Video_Module *module,
    em_module.shutdown(video);
 }
 
+static void
+_for_each_tag (GstTagList const* list,
+                   gchar const* tag,
+                   void *data)
+{
+   Emotion_Gstreamer_Video *ev;
+   const GValue *val;
+   int i;
+   int count;
+
+
+   ev = (Emotion_Gstreamer_Video*)data;
+
+   if (!ev || !ev->metadata) return;
+
+   count = gst_tag_list_get_tag_size (list, tag);
+   val = gst_tag_list_get_value_index (list, tag, 0);
+
+   for ( i = 0; i < count; ++i)
+     {
+       if (!strcmp (tag, GST_TAG_TITLE))
+         {
+            char *str;
+            if (ev->metadata->title) g_free(ev->metadata->title);
+            if (gst_tag_list_get_string (list, GST_TAG_TITLE, &str))
+              ev->metadata->title = str;
+            else
+              ev->metadata->title = NULL;
+            break;
+         }
+       if (!strcmp (tag, GST_TAG_ALBUM))
+         {
+            gchar *str;
+            if (ev->metadata->album) g_free(ev->metadata->album);
+            if (gst_tag_list_get_string (list, GST_TAG_ALBUM, &str))
+              ev->metadata->album = str;
+            else
+              ev->metadata->album = NULL;
+            break;
+         }
+       if (!strcmp (tag, GST_TAG_ARTIST))
+         {
+            gchar *str;
+            if (ev->metadata->artist) g_free( ev->metadata->artist);
+            if (gst_tag_list_get_string (list, GST_TAG_ARTIST, &str))
+              ev->metadata->artist = str;
+            else
+              ev->metadata->artist = NULL;
+            break;
+         }
+       if (!strcmp (tag, GST_TAG_GENRE))
+         {
+            gchar *str;
+            if (ev->metadata->genre) g_free( ev->metadata->genre);
+            if (gst_tag_list_get_string (list, GST_TAG_GENRE, &str))
+              ev->metadata->genre = str;
+            else
+              ev->metadata->genre = NULL;
+            break;
+         }
+       if (!strcmp (tag, GST_TAG_COMMENT))
+         {
+            gchar *str;
+            if (ev->metadata->comment) g_free(ev->metadata->comment);
+            if (gst_tag_list_get_string (list, GST_TAG_COMMENT, &str))
+              ev->metadata->comment = str;
+            else
+              ev->metadata->comment = NULL;
+            break;
+         }
+       if (!strcmp (tag, GST_TAG_DATE))
+         {
+            gchar *str;
+            const GValue *date;
+            if (ev->metadata->year) g_free(ev->metadata->year);
+            date = gst_tag_list_get_value_index (list, GST_TAG_DATE, 0);
+            if (date)
+               str = g_strdup_value_contents (date);
+            else
+              str = NULL;
+            ev->metadata->year = str;
+            break;
+         }
+
+       if (!strcmp (tag, GST_TAG_TRACK_NUMBER))
+         {
+            gchar *str;
+            const GValue *track;
+            if (ev->metadata->count) g_free( ev->metadata->count);
+            track = gst_tag_list_get_value_index (list, GST_TAG_TRACK_NUMBER, 0);
+            if (track)
+              str = g_strdup_value_contents (track);
+            else
+              str = NULL;
+            ev->metadata->count = str;
+            break;
+         }
+
+#ifdef GST_TAG_CDDA_CDDB_DISCID
+       if (!strcmp (tag, GST_TAG_CDDA_CDDB_DISCID))
+         {
+            gchar *str;
+            const GValue *discid;
+            if (ev->metadata->disc_id) g_free(ev->metadata->disc_id);
+            discid = gst_tag_list_get_value_index (list, GST_TAG_CDDA_CDDB_DISCID, 0);
+            if (discid)
+              str = g_strdup_value_contents (discid);
+            else
+              str = NULL;
+            ev->metadata->disc_id = str;
+            break;
+         }
+#endif
+     }
+
+}
+
+static void
+_free_metadata (Emotion_Gstreamer_Metadata *m)
+{
+  if (!m) return;
+
+  if (m->title)   g_free(m->title);
+  if (m->album)   g_free(m->album);
+  if (m->artist)  g_free(m->artist);
+  if (m->genre)   g_free(m->genre);
+  if (m->comment) g_free(m->comment);
+  if (m->year)    g_free(m->year);
+  if (m->count)   g_free(m->count);
+  if (m->disc_id) g_free(m->disc_id);
+
+  free(m);
+
+}
+
 static int
 _em_fd_ev_active(void *data, Ecore_Fd_Handler *fdh)
 {
@@ -1271,7 +1372,7 @@ int _eos_timer_fct (void *data)
    GstMessage              *msg;
 
    ev = (Emotion_Gstreamer_Video *)data;
-   while ((msg = gst_bus_poll (ev->eos_bus, GST_MESSAGE_ERROR | GST_MESSAGE_EOS, 0))) {
+   while ((msg = gst_bus_poll (ev->eos_bus, GST_MESSAGE_ERROR | GST_MESSAGE_EOS | GST_MESSAGE_TAG, 0))) {
      switch (GST_MESSAGE_TYPE(msg)) {
      case GST_MESSAGE_ERROR: {
        gchar *debug;
@@ -1295,8 +1396,19 @@ int _eos_timer_fct (void *data)
        _emotion_decode_stop(ev->obj);
        _emotion_playback_finished(ev->obj);
        break;
-     default:
-       break;
+      case GST_MESSAGE_TAG:
+       {
+          GstTagList *new_tags;
+          gst_message_parse_tag (msg, &new_tags);
+          if (new_tags)
+            {
+               gst_tag_list_foreach (new_tags, (GstTagForeachFunc)_for_each_tag, ev);
+               gst_tag_list_free (new_tags);
+            }
+          break;
+       }
+      default:
+        break;
      }
      gst_message_unref (msg);
    }
index 09f0fe6..45c1673 100644 (file)
@@ -6,6 +6,8 @@
 #include <Ecore.h>
 #include <Ecore_Data.h>
 
+#define HTTP_STREAM 0
+#define RTSP_STREAM 1
 #include <gst/gst.h>
 
 #include "emotion_private.h"
@@ -34,6 +36,21 @@ struct _Emotion_Audio_Sink
   gint        samplerate;
 };
 
+typedef struct _Emotion_Gstreamer_Metadata Emotion_Gstreamer_Metadata;
+
+struct _Emotion_Gstreamer_Metadata
+{
+   char *title;
+   char *album;
+   char *artist;
+   char *genre;
+   char *comment;
+   char *year;
+   char *count;
+   char *disc_id;
+};
+
+
 typedef struct _Emotion_Gstreamer_Video Emotion_Gstreamer_Video;
 
 struct _Emotion_Gstreamer_Video
@@ -69,6 +86,8 @@ struct _Emotion_Gstreamer_Video
   int               fd_ev_write;
   Ecore_Fd_Handler *fd_ev_handler;
 
+  Emotion_Gstreamer_Metadata *metadata;
+
   Emotion_Vis       vis;
 
   unsigned char     play : 1;