From 6b1f65a64784831dad2f6d60717a0a562203f65d Mon Sep 17 00:00:00 2001 From: Andrew Voznytsa Date: Fri, 3 Apr 2020 23:10:42 +0300 Subject: [PATCH] Better video receiver customization support --- src/VideoReceiver/GstVideoReceiver.cc | 57 +++++++++++++++++++++++---- src/VideoReceiver/GstVideoReceiver.h | 1 - 2 files changed, 50 insertions(+), 8 deletions(-) diff --git a/src/VideoReceiver/GstVideoReceiver.cc b/src/VideoReceiver/GstVideoReceiver.cc index abed16316..fff93ade5 100644 --- a/src/VideoReceiver/GstVideoReceiver.cc +++ b/src/VideoReceiver/GstVideoReceiver.cc @@ -161,12 +161,35 @@ GstVideoReceiver::start(const QString& uri, unsigned timeout) break; } - g_signal_connect(_source, "pad-added", G_CALLBACK(_onNewPad), this); - gst_bin_add_many(GST_BIN(_pipeline), _source, _tee, decoderQueue, _decoderValve, recorderQueue, _recorderValve, nullptr); pipelineUp = true; + GstPad* srcPad = nullptr; + + GstIterator* it; + + if ((it = gst_element_iterate_src_pads(_source)) != nullptr) { + GValue vpad = G_VALUE_INIT; + + if (gst_iterator_next(it, &vpad) == GST_ITERATOR_OK) { + srcPad = GST_PAD(g_value_get_object(&vpad)); + gst_object_ref(srcPad); + g_value_reset(&vpad); + } + + gst_iterator_free(it); + it = nullptr; + } + + if (srcPad != nullptr) { + _onNewSourcePad(srcPad); + gst_object_unref(srcPad); + srcPad = nullptr; + } else { + g_signal_connect(_source, "pad-added", G_CALLBACK(_onNewPad), this); + } + if(!gst_element_link_many(_tee, decoderQueue, _decoderValve, nullptr)) { qCCritical(VideoReceiverLog) << "Unable to link decoder queue"; break; @@ -1003,11 +1026,6 @@ GstVideoReceiver::_addDecoder(GstElement* src) gst_caps_unref(caps); caps = nullptr; - // FIXME: AV: check if srcpad exists - if it does then no need to wait for new pad - // int probeRes = 0; - // gst_element_foreach_src_pad(source, _padProbe, &probeRes); - g_signal_connect(_decoder, "pad-added", G_CALLBACK(_onNewPad), this); - gst_bin_add(GST_BIN(_pipeline), _decoder); gst_element_sync_state_with_parent(_decoder); @@ -1019,6 +1037,31 @@ GstVideoReceiver::_addDecoder(GstElement* src) return false; } + GstPad* srcPad = nullptr; + + GstIterator* it; + + if ((it = gst_element_iterate_src_pads(_decoder)) != nullptr) { + GValue vpad = G_VALUE_INIT; + + if (gst_iterator_next(it, &vpad) == GST_ITERATOR_OK) { + srcPad = GST_PAD(g_value_get_object(&vpad)); + gst_object_ref(srcPad); + g_value_reset(&vpad); + } + + gst_iterator_free(it); + it = nullptr; + } + + if (srcPad != nullptr) { + _onNewDecoderPad(srcPad); + gst_object_unref(srcPad); + srcPad = nullptr; + } else { + g_signal_connect(_decoder, "pad-added", G_CALLBACK(_onNewPad), this); + } + return true; } diff --git a/src/VideoReceiver/GstVideoReceiver.h b/src/VideoReceiver/GstVideoReceiver.h index 13b38330f..0cee37d08 100644 --- a/src/VideoReceiver/GstVideoReceiver.h +++ b/src/VideoReceiver/GstVideoReceiver.h @@ -120,7 +120,6 @@ protected: bool _needDispatch(void); void _dispatchSignal(std::function emitter); -private: static gboolean _onBusMessage(GstBus* bus, GstMessage* message, gpointer user_data); static void _onNewPad(GstElement* element, GstPad* pad, gpointer data); static void _wrapWithGhostPad(GstElement* element, GstPad* pad, gpointer data); -- 2.22.0