diff options
author | Thibault Saunier <tsaunier@igalia.com> | 2021-01-12 15:50:27 -0300 |
---|---|---|
committer | Thibault Saunier <tsaunier@igalia.com> | 2021-01-19 11:08:32 -0300 |
commit | 8e9e95b90a4c68364155b9e5e7cff5a4b5ca36a4 (patch) | |
tree | cae33f394807799161607530608f9456ee108943 | |
parent | d1aa359c2b6276db0c005685503e36c44a399425 (diff) |
audio-track: Respect track restrictions in our gaps
Avoiding not negotiated errors in specific cases.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-editing-services/-/merge_requests/225>
-rw-r--r-- | ges/ges-audio-track.c | 61 |
1 files changed, 57 insertions, 4 deletions
diff --git a/ges/ges-audio-track.c b/ges/ges-audio-track.c index 952f7864..48f25540 100644 --- a/ges/ges-audio-track.c +++ b/ges/ges-audio-track.c @@ -69,15 +69,68 @@ G_DEFINE_TYPE_WITH_PRIVATE (GESAudioTrack, ges_audio_track, GES_TYPE_TRACK); /**************************************************** * Private methods and utils * ****************************************************/ +static void +_sync_capsfilter_with_track (GESTrack * track, GstElement * capsfilter) +{ + GstCaps *restriction, *caps; + gint rate; + GstStructure *structure; + + g_object_get (track, "restriction-caps", &restriction, NULL); + if (restriction == NULL) + return; + + if (gst_caps_get_size (restriction) == 0) + goto done; + + structure = gst_caps_get_structure (restriction, 0); + if (!gst_structure_get_int (structure, "rate", &rate)) + goto done; + + caps = gst_caps_new_simple ("audio/x-raw", "rate", G_TYPE_INT, rate, NULL); + + g_object_set (capsfilter, "caps", caps, NULL); + gst_caps_unref (caps); + +done: + gst_caps_unref (restriction); +} + +static void +_track_restriction_changed_cb (GESTrack * track, GParamSpec * arg G_GNUC_UNUSED, + GstElement * capsfilter) +{ + _sync_capsfilter_with_track (track, capsfilter); +} + +static void +_weak_notify_cb (GESTrack * track, GstElement * capsfilter) +{ + g_signal_handlers_disconnect_by_func (track, + (GCallback) _track_restriction_changed_cb, capsfilter); +} + static GstElement * create_element_for_raw_audio_gap (GESTrack * track) { - GstElement *elem; + GstElement *bin; + GstElement *capsfilter; + + bin = gst_parse_bin_from_description + ("audiotestsrc wave=silence name=src ! audioconvert ! audioresample ! audioconvert ! capsfilter name=gapfilter caps=audio/x-raw", + TRUE, NULL); + + capsfilter = gst_bin_get_by_name (GST_BIN (bin), "gapfilter"); + g_object_weak_ref (G_OBJECT (capsfilter), (GWeakNotify) _weak_notify_cb, + track); + g_signal_connect (track, "notify::restriction-caps", + (GCallback) _track_restriction_changed_cb, capsfilter); + + _sync_capsfilter_with_track (track, capsfilter); - elem = gst_element_factory_make ("audiotestsrc", NULL); - g_object_set (elem, "wave", 4, NULL); + gst_object_unref (capsfilter); - return elem; + return bin; } |