Browse Source

Fix MPEG-2 TS recording

QGC4.4
Andrew Voznytsa 5 years ago
parent
commit
7e27e06631
  1. 35
      src/VideoStreaming/VideoReceiver.cc

35
src/VideoStreaming/VideoReceiver.cc

@ -310,6 +310,7 @@ VideoReceiver::_makeSource(const QString& uri)
GstElement* source = nullptr; GstElement* source = nullptr;
GstElement* buffer = nullptr; GstElement* buffer = nullptr;
GstElement* tsdemux = nullptr;
GstElement* parser = nullptr; GstElement* parser = nullptr;
GstElement* bin = nullptr; GstElement* bin = nullptr;
GstElement* srcbin = nullptr; GstElement* srcbin = nullptr;
@ -358,25 +359,36 @@ VideoReceiver::_makeSource(const QString& uri)
break; break;
} }
// FIXME: AV: Android does not determine MPEG2-TS via parsebin - have to explicitly state which demux to use if ((bin = gst_bin_new("sourcebin")) == nullptr) {
if (isTcpMPEGTS || isUdpMPEGTS) { qCCritical(VideoReceiverLog) << "gst_bin_new('sourcebin') failed";
if ((parser = gst_element_factory_make("tsdemux", "parser")) == nullptr) {
qCritical(VideoReceiverLog) << "gst_element_factory_make('tsdemux') failed";
break; break;
} }
} else {
if ((parser = gst_element_factory_make("parsebin", "parser")) == nullptr) { if ((parser = gst_element_factory_make("parsebin", "parser")) == nullptr) {
qCritical() << "VideoReceiver::_makeSource() failed. Error with gst_element_factory_make('parsebin')"; qCCritical(VideoReceiverLog) << "gst_element_factory_make('parsebin') failed";
break; 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 ((tsdemux = gst_element_factory_make("tsdemux", nullptr)) == nullptr) {
qCCritical(VideoReceiverLog) << "gst_element_factory_make('tsdemux') failed";
break;
} }
if ((bin = gst_bin_new("sourcebin")) == nullptr) { gst_bin_add(GST_BIN(bin), tsdemux);
qCCritical(VideoReceiverLog) << "gst_bin_new('sourcebin') failed";
if (!gst_element_link(source, tsdemux)) {
qCCritical(VideoReceiverLog) << "gst_element_link() failed";
break; break;
} }
gst_bin_add_many(GST_BIN(bin), source, parser, nullptr); source = tsdemux;
tsdemux = nullptr;
}
int probeRes = 0; int probeRes = 0;
@ -423,6 +435,11 @@ VideoReceiver::_makeSource(const QString& uri)
parser = nullptr; parser = nullptr;
} }
if (tsdemux != nullptr) {
gst_object_unref(tsdemux);
tsdemux = nullptr;
}
if (buffer != nullptr) { if (buffer != nullptr) {
gst_object_unref(buffer); gst_object_unref(buffer);
buffer = nullptr; buffer = nullptr;

Loading…
Cancel
Save