transcodebin: force decoding if a filter is defined
authorGuillaume Desmottes <guillaume.desmottes@collabora.com>
Thu, 27 Feb 2020 11:46:45 +0000 (17:16 +0530)
committerGStreamer Merge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Fri, 28 Feb 2020 16:57:30 +0000 (16:57 +0000)
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

index 1d8b507..f1362f1 100644 (file)
@@ -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);
         }