rtspsrc Internal dataflow error

pneves pneves at airborneprojects.com
Mon Aug 1 09:48:57 UTC 2016


Hello,

I am having a bit of a problem using rtspsrc to open an rtsp stream from 
rtsp://184.72.239.149/vod/mp4:BigBuckBunny_115k.mov
<http://rtsp://184.72.239.149/vod/mp4:BigBuckBunny_115k.mov>  

First I would like to point that the documentation is not clear, and that if
there is any way I can contribute to it I would be happy to do it. It says
that the stream should be accessible through the stream_%u ghost pad. The
problem is that it doesn't say that we should wait for "pad-added" events.

I also did not find it clear that it only established a connection when it
was in GST_STATE_PLAYING. I know it's a live source and only produces data
in playing but all the connection configuration could happen in other
states. Forgive me if I overlooked some convention. To finish the ghost pad
stream_%u is never added and I don't really know why.

On the other hand, the pad-added signal or no-more-pads signal say a pad
*recv_rtp_src_1_179414008_97* is added, to which I successfully link the
sink of rtph264depay.

The caps of *recv_rtp_src_1_179414008_97*:
0:00:01.184836234 12464       0x9aa5e0 DEBUG                rtspsrc
gstrtspsrc.c:4372:gst_rtspsrc_configure_caps:<rtspsrc0> stream
0x7f73bc02ab40, pt 97, caps application/x-rtp, media=(string)video,
payload=(int)97, clock-rate=(int)90000, encoding-name=(string)H264,
packetization-mode=(string)1, profile-level-id=(string)42C01E,
sprop-parameter-sets=(string)"Z0LAHtkDxWhAAAADAEAAAAwDxYuS\,aMuMsg\=\=",
a-framesize=(string)240-160, a-sdplang=(string)en,
a-cliprect=(string)"0\,0\,160\,240", a-framerate=(string)24.0,
ssrc=(uint)179414008, clock-base=(uint)18720, seqnum-base=(uint)6,
npt-start=(guint64)208000000, npt-stop=(guint64)596480000000,
play-speed=(double)1, play-scale=(double)

Unfortunately I end up with a data flow error in like:

:8069:gst_rtspsrc_handle_message:<rtspsrc0> got error from udpsrc0
0:00:01.236465927 12509 0x7f980005db20 DEBUG                rtspsrc
gstrtspsrc.c:8083:gst_rtspsrc_handle_message:<rtspsrc0> combined flows:
not-linked
0:00:01.236479744 12509 0x7f980005dc00 DEBUG                rtspsrc
gstrtspsrc.c:8069:gst_rtspsrc_handle_message:<rtspsrc0> got error from
udpsrc2
0:00:01.236501261 12509 0x7f980005dc00 DEBUG                rtspsrc
gstrtspsrc.c:8083:gst_rtspsrc_handle_message:<rtspsrc0> combined flows:
not-linked

I am very positive it is linked because if I link to an incompatible element
it gives me a linking error. The pipeline is:
rtspsrc->rtph264deapy->h264parse->avdec_h264->queue->autovideosink

GstElement* Gstreamer::createElement(const char *element_type) {
	GstElement* new_element = gst_element_factory_make(element_type, NULL);
	AP_LOG("%s\n", element_type);
	if (new_element == nullptr) {
		throw GstreamerException(GstreamerException::NULL_ELEMENT);
	}
	return new_element;
}

GstElement* Gstreamer::pushElementToPipeline(const char* element_type,
	bool link_to_pipeline) {
	GstElement * new_element = createElement(element_type);
	addToBin(new_element);
	if (!element_vector.empty() && link_to_pipeline == true) {
		linkElements(element_vector.back(), new_element);

	}
	element_vector.push_back(new_element);
	return new_element;
}

void Gstreamer::connectRTSPNoMorePadsSignal(GstElement *element,
	RTSPSrcSignalData * const data) {
	data->instance.notifyConditionVariable();
}

void Gstreamer::setupRTSPSource(const std::string location, int latency,
	VideoType type) {

	GstElement * source = pushElementToPipeline("rtspsrc", true);
	g_object_set(source, "location", location.c_str(), NULL);
	g_object_set(source, "latency", latency, NULL);
	RTSPSrcSignalData signal_data = {nullptr, nullptr, *this};
	g_signal_connect(source, "no-more-pads",
		G_CALLBACK(Gstreamer::connectRTSPNoMorePadsSignal), &signal_data);
	setStateOnElement(source, GST_STATE_PLAYING);
	std::unique_lock<std::mutex> lock(instance_mutex);

	while(!condition_variable_predicate){
		condition_variable.wait(lock);
	}
	condition_variable_predicate = false;
	AP_LOG("RTSPsrc unblocked\n");
	GstElement *depay = pushElementToPipeline("rtph264depay", false);
	GstPad* depay_pad = gst_element_get_static_pad(depay, "sink");
	GstCaps *source_caps = gst_caps_new_simple("application/x-rtp", "media",
		G_TYPE_STRING, "video", NULL);
	GstPad* source_pad = gst_element_get_compatible_pad(source, depay_pad,
		source_caps);
	gchar * source_pad_name = gst_pad_get_name(source_pad);
	AP_LOG("Pad name %s\n", source_pad_name);
	if (source_pad != NULL) {
		gst_caps_unref(source_caps);
		GstPadLinkReturn r = gst_pad_link(source_pad, depay_pad);
		if (r != GST_PAD_LINK_OK)
			throw std::runtime_error("sdsad");
		AP_LOG("Pad linkes %s, %d\n", source_pad_name, r);
	}
	else {
		throw std::runtime_error("sdsad");
	}
	g_free(source_pad_name);
}

I have battled with this combined flows not linked for some time. What am I
doing wrong?

Best regards
Paulo Neves



--
View this message in context: http://gstreamer-devel.966125.n4.nabble.com/rtspsrc-Internal-dataflow-error-tp4678920.html
Sent from the GStreamer-devel mailing list archive at Nabble.com.


More information about the gstreamer-devel mailing list