From de4ea9476694c82ba4a3a47a9d552b5b93672241 Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Thu, 27 Feb 2020 17:16:45 +0530 Subject: [PATCH] transcodebin: force decoding if a filter is defined Filter operates on raw data so don't allow decodebin to produce encoded data if one is defined. My use case here is keeping the video stream untouched but apply a filter on the audio one, while keeping the same audio format. --- gst/transcode/gsttranscodebin.c | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/gst/transcode/gsttranscodebin.c b/gst/transcode/gsttranscodebin.c index 1d8b507..f1362f1 100644 --- a/gst/transcode/gsttranscodebin.c +++ b/gst/transcode/gsttranscodebin.c @@ -306,13 +306,29 @@ make_decodebin (GstTranscodeBin * self) gst_encoding_container_profile_get_profiles (GST_ENCODING_CONTAINER_PROFILE (self->profile)); tmp; tmp = tmp->next) { - GstCaps *restrictions = - gst_encoding_profile_get_restriction (tmp->data); + GstEncodingProfile *profile = tmp->data; + GstCaps *restrictions; - if (!restrictions || gst_caps_is_any (restrictions)) { - GstCaps *encodecaps = gst_encoding_profile_get_format (tmp->data); + restrictions = gst_encoding_profile_get_restriction (profile); - gst_caps_append (decodecaps, encodecaps); + if (!restrictions || gst_caps_is_any (restrictions)) { + GstCaps *encodecaps = gst_encoding_profile_get_format (profile); + GstElement *filter = NULL; + + /* Filter operates on raw data so don't allow decodebin to produce + * encoded data if one is defined. */ + if (GST_IS_ENCODING_VIDEO_PROFILE (profile) && self->video_filter) + filter = self->video_filter; + else if (GST_IS_ENCODING_AUDIO_PROFILE (profile) + && self->audio_filter) + filter = self->audio_filter; + + if (!filter) { + GST_DEBUG_OBJECT (self, + "adding %" GST_PTR_FORMAT " as output caps to decodebin", + encodecaps); + gst_caps_append (decodecaps, encodecaps); + } } else { gst_caps_unref (restrictions); } -- 2.7.4