[gnac] Fixed a bug



commit bfb95144c32082335f449a7ff32f1d45bceab376
Author: BenoÃt Dupasquier <bdupasqu src gnome org>
Date:   Sun Jan 29 12:19:10 2012 +0000

    Fixed a bug

 libgnac/libgnac-gst.c           |   22 ++++++++++++++++------
 libgnac/libgnac-gst.h           |    3 ---
 libgnac/libgnac-media-item.c    |   21 ++++++++++++++-------
 libgnac/libgnac-media-item.h    |    6 ++++++
 libgnac/libgnac-metadata-tags.h |    5 +++++
 libgnac/libgnac-metadata.c      |   16 +++++++++++-----
 6 files changed, 52 insertions(+), 21 deletions(-)
---
diff --git a/libgnac/libgnac-gst.c b/libgnac/libgnac-gst.c
index a879db1..c93fc8a 100644
--- a/libgnac/libgnac-gst.c
+++ b/libgnac/libgnac-gst.c
@@ -33,6 +33,7 @@
 #include "libgnac-error.h"
 #include "libgnac-gst.h"
 #include "libgnac-gst-utils.h"
+#include "libgnac-media-item.h"
 
 
 #define libgnac_gst_element_add_ghost_pad(element, pad, name) \
@@ -193,8 +194,6 @@ libgnac_gst_get_video_bin(LibgnacMediaItem  *item,
 
 void
 libgnac_gst_build_pipeline(LibgnacMediaItem  *item,
-                           LibgnacProfile    *profile,
-                           gboolean           has_video,
                            GError           **error)
 {
   g_return_if_fail(!error || !*error);
@@ -224,7 +223,7 @@ libgnac_gst_build_pipeline(LibgnacMediaItem  *item,
 
   /* decodebin */
   GstElement *decodebin = libgnac_gstu_make_pipeline_element(item->pipeline,
-      "decodebin", NULL, &err);
+      "decodebin2", NULL, &err);
   if (err) {
     g_propagate_error(error, err);
     return;
@@ -237,6 +236,8 @@ libgnac_gst_build_pipeline(LibgnacMediaItem  *item,
     return;
   }
 
+  LibgnacProfile *profile = item->profile;
+
   /* audio_bin */
   GstElement *audio_bin = libgnac_gst_get_audio_bin(item, profile, &err);
   if (err) {
@@ -263,6 +264,9 @@ libgnac_gst_build_pipeline(LibgnacMediaItem  *item,
 
   g_object_set(G_OBJECT(sink), "file", item->destination, NULL);
 
+  gboolean has_audio = libgnac_item_has_audio(item);
+  gboolean has_video = libgnac_item_has_video(item);
+
   if (has_video && item->video_channel != -1) {
     /* muxer */
     GstElement *muxer = libgnac_gstu_make_pipeline_element(item->pipeline,
@@ -326,7 +330,7 @@ libgnac_gst_build_pipeline(LibgnacMediaItem  *item,
       return;
     }
   }
-  else /* audio file */
+  else if (has_audio)
   {
     libgnac_gstu_element_link(audio_bin, sink, &err);
     if (err) {
@@ -335,8 +339,15 @@ libgnac_gst_build_pipeline(LibgnacMediaItem  *item,
       return;
     }
   }
+  else
+  {
+    libgnac_debug("file %s contains no usable audio nor video data");
+    g_set_error(error, LIBGNAC_ERROR, LIBGNAC_ERROR_PIPELINE_CREATION,
+        _("Unable to create pipeline"));
+    return;
+  }
 
-  g_signal_connect(decodebin, "new-decoded-pad", 
+  g_signal_connect(decodebin, "pad-added",
       G_CALLBACK(libgnac_gst_newpad_cb), item);
 }
 
@@ -368,7 +379,6 @@ libgnac_gst_clean_pipeline(LibgnacMediaItem *item)
 void
 libgnac_gst_newpad_cb(GstElement *decodebin,
                       GstPad     *pad,
-                      gboolean    last,
                       gpointer    data)
 {
   LibgnacMediaItem *item = (LibgnacMediaItem *) data;
diff --git a/libgnac/libgnac-gst.h b/libgnac/libgnac-gst.h
index 85950c8..8ad4835 100644
--- a/libgnac/libgnac-gst.h
+++ b/libgnac/libgnac-gst.h
@@ -52,8 +52,6 @@ libgnac_gst_pause(LibgnacMediaItem  *item,
 
 void
 libgnac_gst_build_pipeline(LibgnacMediaItem  *item,
-                           LibgnacProfile    *profile,
-                           gboolean           has_video,
                            GError           **error);
 
 void
@@ -62,7 +60,6 @@ libgnac_gst_clean_pipeline(LibgnacMediaItem *item);
 void
 libgnac_gst_newpad_cb(GstElement *decodebin,
                       GstPad     *pad,
-                      gboolean    last,
                       gpointer    data);
 
 G_END_DECLS
diff --git a/libgnac/libgnac-media-item.c b/libgnac/libgnac-media-item.c
index 1bdeb04..c8663bd 100644
--- a/libgnac/libgnac-media-item.c
+++ b/libgnac/libgnac-media-item.c
@@ -40,9 +40,6 @@
 
 extern LibgnacMetadata *metadata;
 
-static gboolean
-libgnac_item_has_video(LibgnacMediaItem *item);
-
 
 LibgnacMediaItem *
 libgnac_item_new(GFile          *source,
@@ -107,9 +104,7 @@ libgnac_item_build(LibgnacMediaItem  *item,
     return;
   }
 
-  gboolean has_video = libgnac_item_has_video(item);
-
-  libgnac_gst_build_pipeline(item, item->profile, has_video, &err);
+  libgnac_gst_build_pipeline(item, &err);
   if (err) {
     if (g_error_matches(err, LIBGNAC_ERROR, LIBGNAC_ERROR_MISSING_PLUGIN) &&
         gst_install_plugins_supported())
@@ -128,7 +123,19 @@ libgnac_item_build(LibgnacMediaItem  *item,
 }
 
 
-static gboolean
+gboolean
+libgnac_item_has_audio(LibgnacMediaItem *item)
+{
+  LibgnacTags *tags = libgnac_metadata_extract(metadata, item->source, NULL);
+  if (libgnac_metadata_tag_exists(tags, GNAC_TAG_HAS_AUDIO)) {
+    return TRUE;
+  }
+
+  return FALSE;
+}
+
+
+gboolean
 libgnac_item_has_video(LibgnacMediaItem *item)
 {
   LibgnacTags *tags = libgnac_metadata_extract(metadata, item->source, NULL);
diff --git a/libgnac/libgnac-media-item.h b/libgnac/libgnac-media-item.h
index 696fa23..789fe08 100644
--- a/libgnac/libgnac-media-item.h
+++ b/libgnac/libgnac-media-item.h
@@ -57,6 +57,12 @@ libgnac_item_new(GFile          *source,
                  LibgnacProfile *profile,
                  gpointer        parent);
 
+gboolean
+libgnac_item_has_audio(LibgnacMediaItem *item);
+
+gboolean
+libgnac_item_has_video(LibgnacMediaItem *item);
+
 void
 libgnac_item_run(LibgnacMediaItem  *item, 
                  GError           **error);
diff --git a/libgnac/libgnac-metadata-tags.h b/libgnac/libgnac-metadata-tags.h
index e8aeee0..342193d 100644
--- a/libgnac/libgnac-metadata-tags.h
+++ b/libgnac/libgnac-metadata-tags.h
@@ -37,6 +37,7 @@ typedef GHashTable LibgnacTags;
 #define GNAC_TAG_FILENAME   "filename"
 #define GNAC_TAG_FILE_SIZE  "file-size"
 #define GNAC_TAG_FRAMERATE  "framerate"
+#define GNAC_TAG_HAS_AUDIO  "has-audio"
 #define GNAC_TAG_HAS_VIDEO  "has-video"
 #define GNAC_TAG_HEIGHT     "height"
 #define GNAC_TAG_MODE       "mode"
@@ -76,6 +77,8 @@ typedef GHashTable LibgnacTags;
     (g_str_equal((tag), GNAC_TAG_FRAMERATE))
 #define LIBGNAC_METADATA_TAG_IS_GENRE(tag) \
     (g_str_equal((tag), GST_TAG_GENRE))
+#define LIBGNAC_METADATA_TAG_IS_HAS_AUDIO(tag) \
+    (g_str_equal((tag), GNAC_TAG_HAS_AUDIO))
 #define LIBGNAC_METADATA_TAG_IS_HAS_VIDEO(tag) \
     (g_str_equal((tag), GNAC_TAG_HAS_VIDEO))
 #define LIBGNAC_METADATA_TAG_IS_HEIGHT(tag) \
@@ -137,6 +140,8 @@ typedef GHashTable LibgnacTags;
     (g_hash_table_lookup((GHashTable*)(tags), GNAC_TAG_FRAMERATE))
 #define LIBGNAC_METADATA_TAG_GENRE(tags) \
     (g_hash_table_lookup((GHashTable*)(tags), GST_TAG_GENRE))
+#define LIBGNAC_METADATA_TAG_HAS_AUDIO(tags) \
+    (g_hash_table_lookup((GHashTable*)(tags), GNAC_TAG_HAS_AUDIO))
 #define LIBGNAC_METADATA_TAG_HAS_VIDEO(tags) \
     (g_hash_table_lookup((GHashTable*)(tags), GNAC_TAG_HAS_VIDEO))
 #define LIBGNAC_METADATA_TAG_HEIGHT(tags) \
diff --git a/libgnac/libgnac-metadata.c b/libgnac/libgnac-metadata.c
index e677e29..8b420a5 100644
--- a/libgnac/libgnac-metadata.c
+++ b/libgnac/libgnac-metadata.c
@@ -436,9 +436,8 @@ libgnac_metadata_bus_sync_handler(GstBus          *bus,
 
 
 static void
-libgnac_metadata_new_decoded_pad_cb(GstElement      *element,
+libgnac_metadata_new_decoded_pad_cb(GstElement      *decodebin,
                                     GstPad          *pad,
-                                    gboolean         last,
                                     LibgnacMetadata *md)
 {
   GstPad *sink_pad = gst_element_get_pad(md->priv->sink, "sink");
@@ -467,7 +466,14 @@ libgnac_metadata_new_decoded_pad_cb(GstElement      *element,
     g_value_set_boolean(val, TRUE);
     g_hash_table_insert(md->priv->metadata, GNAC_TAG_HAS_VIDEO, val);
   }
-  else if (!g_str_has_prefix(mimetype, "audio"))
+  else if (g_str_has_prefix(mimetype, "audio"))
+  {
+    GValue *val = g_new0(GValue, 1);
+    g_value_init(val, G_TYPE_BOOLEAN);
+    g_value_set_boolean(val, TRUE);
+    g_hash_table_insert(md->priv->metadata, GNAC_TAG_HAS_AUDIO, val);
+  }
+  else
   {
     libgnac_debug("Got a non audio or video pad: %s", mimetype);
   }
@@ -612,8 +618,8 @@ libgnac_metadata_extract(LibgnacMetadata  *md,
 
     g_signal_connect(decodebin, "autoplug-continue", 
         G_CALLBACK(libgnac_metadata_autoplug_continue_cb), md);
-    g_signal_connect_object(decodebin, "new-decoded-pad", 
-        G_CALLBACK(libgnac_metadata_new_decoded_pad_cb), md, 0);
+    g_signal_connect(decodebin, "pad-added",
+        G_CALLBACK(libgnac_metadata_new_decoded_pad_cb), md);
 
     g_return_val_if_fail(
         libgnac_gstu_element_link(source, decodebin, error),



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]