[gnac] Fixed a bug
- From: BenoÃt Dupasquier <bdupasqu src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnac] Fixed a bug
- Date: Sun, 29 Jan 2012 12:20:42 +0000 (UTC)
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]