summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThibault Saunier <tsaunier@gnome.org>2015-11-05 11:16:31 +0100
committerThibault Saunier <tsaunier@gnome.org>2015-11-05 12:26:41 +0100
commit713c8dd6a436c832c0efc061e358d72e27b17727 (patch)
tree0f99595e1b344d0f03c10d4602e77c69b426db25
parent4adca15a0372fed8f19baaa3ef590c9dabe5f271 (diff)
ges: Set restriction caps in the audio source caps filter
Otherwise we could have not negotiated errors in audiomixer when the channel/channel-mask do not match Differential Revision: https://phabricator.freedesktop.org/D493
-rw-r--r--.arcconfig5
-rw-r--r--ges/ges-audio-source.c48
-rw-r--r--ges/ges-smart-adder.c27
3 files changed, 72 insertions, 8 deletions
diff --git a/.arcconfig b/.arcconfig
index 728aa7a4..b837cea3 100644
--- a/.arcconfig
+++ b/.arcconfig
@@ -1,3 +1,6 @@
{
- "phabricator.uri" : "https:\/\/phabricator.freedesktop.org\/api\/"
+ "phabricator.uri" : "https://phabricator.freedesktop.org/",
+ "repository.callsign" : "GES",
+ "project": "GStreamer Editing Services",
+ "default-reviewers": "thiblahute,Mathieu_Du"
}
diff --git a/ges/ges-audio-source.c b/ges/ges-audio-source.c
index 64f5b2a4..7d0a5296 100644
--- a/ges/ges-audio-source.c
+++ b/ges/ges-audio-source.c
@@ -58,8 +58,8 @@ G_DEFINE_ABSTRACT_TYPE (GESAudioSource, ges_audio_source, GES_TYPE_SOURCE);
struct _GESAudioSourcePrivate
{
- /* Dummy variable */
- void *nothing;
+ GstElement *capsfilter;
+ GESTrack *current_track;
};
static void
@@ -89,6 +89,41 @@ _sync_element_to_layer_property_float (GESTrackElement * trksrc,
gst_object_unref (layer);
}
+static void
+restriction_caps_cb (GESTrack * track,
+ GParamSpec * arg G_GNUC_UNUSED, GESAudioSource * self)
+{
+ GstCaps *caps;
+
+ g_object_get (track, "restriction-caps", &caps, NULL);
+
+ GST_DEBUG_OBJECT (self, "Setting capsfilter caps to %" GST_PTR_FORMAT, caps);
+ g_object_set (self->priv->capsfilter, "caps", caps, NULL);
+
+ if (caps)
+ gst_caps_unref (caps);
+}
+
+static void
+_track_changed_cb (GESAudioSource * self, GParamSpec * arg G_GNUC_UNUSED,
+ gpointer udata)
+{
+ GESTrack *track = ges_track_element_get_track (GES_TRACK_ELEMENT (self));
+
+ if (self->priv->current_track) {
+ g_signal_handlers_disconnect_by_func (self->priv->current_track,
+ (GCallback) restriction_caps_cb, self);
+ }
+
+ self->priv->current_track = track;
+ if (track) {
+ restriction_caps_cb (track, NULL, self);
+
+ g_signal_connect (track, "notify::restriction-caps",
+ G_CALLBACK (restriction_caps_cb), self);
+ }
+}
+
static GstElement *
ges_audio_source_create_element (GESTrackElement * trksrc)
{
@@ -97,6 +132,7 @@ ges_audio_source_create_element (GESTrackElement * trksrc)
GstElement *sub_element;
GESAudioSourceClass *source_class = GES_AUDIO_SOURCE_GET_CLASS (trksrc);
const gchar *props[] = { "volume", "mute", NULL };
+ GESAudioSource *self = GES_AUDIO_SOURCE (trksrc);
if (!source_class->create_source)
return NULL;
@@ -106,9 +142,15 @@ ges_audio_source_create_element (GESTrackElement * trksrc)
GST_DEBUG_OBJECT (trksrc, "Creating a bin sub_element ! volume");
vbin =
gst_parse_bin_from_description
- ("audioconvert ! audioresample ! volume name=v", TRUE, NULL);
+ ("audioconvert ! audioresample ! volume name=v ! capsfilter name=audio-track-caps-filter",
+ TRUE, NULL);
topbin = ges_source_create_topbin ("audiosrcbin", sub_element, vbin, NULL);
volume = gst_bin_get_by_name (GST_BIN (vbin), "v");
+ self->priv->capsfilter = gst_bin_get_by_name (GST_BIN (vbin),
+ "audio-track-caps-filter");
+
+ g_signal_connect (self, "notify::track", (GCallback) _track_changed_cb, NULL);
+ _track_changed_cb (self, NULL, NULL);
_sync_element_to_layer_property_float (trksrc, volume, GES_META_VOLUME,
"volume");
diff --git a/ges/ges-smart-adder.c b/ges/ges-smart-adder.c
index 4c9504a8..c21e2ae3 100644
--- a/ges/ges-smart-adder.c
+++ b/ges/ges-smart-adder.c
@@ -219,20 +219,39 @@ ges_smart_adder_init (GESSmartAdder * self)
NULL, (GDestroyNotify) destroy_pad);
}
+static void
+restriction_caps_cb (GESTrack * track,
+ GParamSpec * arg G_GNUC_UNUSED, GESSmartAdder * self)
+{
+ GstCaps *caps;
+
+ g_object_get (track, "restriction-caps", &caps, NULL);
+
+ if (!caps)
+ caps = gst_caps_from_string (DEFAULT_CAPS);
+
+ GST_DEBUG_OBJECT (self, "Setting adder caps to %" GST_PTR_FORMAT, caps);
+ g_object_set (self->adder, "caps", caps, NULL);
+ gst_caps_unref (caps);
+}
+
GstElement *
ges_smart_adder_new (GESTrack * track)
{
GESSmartAdder *self;
- GstCaps *caps;
self = g_object_new (GES_TYPE_SMART_ADDER, NULL);
self->track = track;
+ if (track) {
+ restriction_caps_cb (track, NULL, self);
+
+ g_signal_connect (track, "notify::restriction-caps",
+ G_CALLBACK (restriction_caps_cb), self);
+ }
+
/* FIXME Make adder smart and let it properly negotiate caps! */
- caps = gst_caps_from_string (DEFAULT_CAPS);
- g_object_set (self->adder, "caps", caps, NULL);
- gst_caps_unref (caps);
return GST_ELEMENT (self);
}