|
|
|
@ -310,6 +310,7 @@ VideoReceiver::_makeSource(const QString& uri)
@@ -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)
@@ -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)
@@ -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; |
|
|
|
|