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