From 7e27e066317242cc124587b1ac68d84c8b46ee5f Mon Sep 17 00:00:00 2001 From: Andrew Voznytsa Date: Tue, 10 Mar 2020 10:51:44 +0200 Subject: [PATCH] Fix MPEG-2 TS recording --- src/VideoStreaming/VideoReceiver.cc | 39 +++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/src/VideoStreaming/VideoReceiver.cc b/src/VideoStreaming/VideoReceiver.cc index 321ae04bc1..038b1a740a 100644 --- a/src/VideoStreaming/VideoReceiver.cc +++ b/src/VideoStreaming/VideoReceiver.cc @@ -310,6 +310,7 @@ VideoReceiver::_makeSource(const QString& uri) GstElement* source = nullptr; GstElement* buffer = nullptr; + GstElement* tsdemux = nullptr; GstElement* parser = nullptr; GstElement* bin = nullptr; GstElement* srcbin = nullptr; @@ -358,26 +359,37 @@ VideoReceiver::_makeSource(const QString& uri) break; } + if ((bin = gst_bin_new("sourcebin")) == nullptr) { + qCCritical(VideoReceiverLog) << "gst_bin_new('sourcebin') failed"; + break; + } + + if ((parser = gst_element_factory_make("parsebin", "parser")) == nullptr) { + qCCritical(VideoReceiverLog) << "gst_element_factory_make('parsebin') failed"; + break; + } + + gst_bin_add_many(GST_BIN(bin), source, parser, nullptr); + // FIXME: AV: Android does not determine MPEG2-TS via parsebin - have to explicitly state which demux to use + // FIXME: AV: tsdemux handling is a bit ugly - let's try to find elegant solution for that later if (isTcpMPEGTS || isUdpMPEGTS) { - if ((parser = gst_element_factory_make("tsdemux", "parser")) == nullptr) { - qCritical(VideoReceiverLog) << "gst_element_factory_make('tsdemux') failed"; + if ((tsdemux = gst_element_factory_make("tsdemux", nullptr)) == nullptr) { + qCCritical(VideoReceiverLog) << "gst_element_factory_make('tsdemux') failed"; break; } - } else { - if ((parser = gst_element_factory_make("parsebin", "parser")) == nullptr) { - qCritical() << "VideoReceiver::_makeSource() failed. Error with gst_element_factory_make('parsebin')"; + + gst_bin_add(GST_BIN(bin), tsdemux); + + if (!gst_element_link(source, tsdemux)) { + qCCritical(VideoReceiverLog) << "gst_element_link() failed"; break; } - } - if ((bin = gst_bin_new("sourcebin")) == nullptr) { - qCCritical(VideoReceiverLog) << "gst_bin_new('sourcebin') failed"; - break; + source = tsdemux; + tsdemux = nullptr; } - gst_bin_add_many(GST_BIN(bin), source, parser, nullptr); - int probeRes = 0; gst_element_foreach_src_pad(source, _padProbe, &probeRes); @@ -423,6 +435,11 @@ VideoReceiver::_makeSource(const QString& uri) parser = nullptr; } + if (tsdemux != nullptr) { + gst_object_unref(tsdemux); + tsdemux = nullptr; + } + if (buffer != nullptr) { gst_object_unref(buffer); buffer = nullptr; -- GitLab