Ritesh Panchal
Ritesh Panchal

Reputation: 79

Gstreamer Pause/Resume pipeline issue

I am using qt-gstreamer 1.2 with gstreamer 1.2.4 on nVidia TX1 running Ubuntu 14.04.

I am having a pipeline with camera preview + recording + Ethernet Streaming + Wifi Streaming and i want to make pipeline dynamic. ex i can add/remove recording/Streaming on running pipeline.

I pause pipeline to add/remove elements and then resume without using pads and its blocking capabilities. This works fine. But pipeline hangs after several add/remove of elements. and it hangs when i paused the pipeline.

I found that its Pause/Resume which hangs pipeline not Linking/Unlinking elements on pause. If i add less elements in pipeline like only adding elements required for preview and recording then pipeline hangs after long time then with all elements.

All sink element sync and async are false.

m_pipeline  =   QGst::Pipeline::create();
m_source    =   QGst::ElementFactory::make("v4l2src", "v4l2src");
m_filter1   =   QGst::ElementFactory::make("capsfilter", "capsfilter");
m_convert   =   QGst::ElementFactory::make("nvvidconv", "videoconvert");
m_filter2   =   QGst::ElementFactory::make("capsfilter", "capsfilter1");
m_filter3   =   QGst::ElementFactory::make("capsfilter", "capsfilter2");
m_tee       =   QGst::ElementFactory::make("tee", "tee");
m_tee1      =   QGst::ElementFactory::make("tee", "tee1");
m_enc       =   QGst::ElementFactory::make("omxh264enc", "omxh264enc");
m_enc1      =   QGst::ElementFactory::make("omxh264enc", "omxh264enc1");
m_parse     =   QGst::ElementFactory::make("h264parse", "h264parse");
m_parse1    =   QGst::ElementFactory::make("h264parse", "h264parse1");
m_parse2    =   QGst::ElementFactory::make("h264parse", "h264parse2");
m_mux       =   QGst::ElementFactory::make("qtmux", "qtmux");
m_filesink  =   QGst::ElementFactory::make("filesink", "filesink");
m_queue1    =   QGst::ElementFactory::make("queue", "queue1");
m_queue2    =   QGst::ElementFactory::make("queue", "queue2");
m_queue3    =   QGst::ElementFactory::make("queue", "queue3");
m_queue4    =   QGst::ElementFactory::make("queue", "queue4");
m_queue5    =   QGst::ElementFactory::make("queue", "queue5");
m_queue6    =   QGst::ElementFactory::make("queue", "queue6");
m_queue7    =   QGst::ElementFactory::make("queue", "queue7");
m_queue8    =   QGst::ElementFactory::make("queue", "queue8");
m_fakesink  =   QGst::ElementFactory::make("fakesink", "fakesink");
m_rtppay1   =   QGst::ElementFactory::make("rtph264pay", "rtph264pay");
m_rtppay2   =   QGst::ElementFactory::make("rtph264pay", "rtph264pay1");
m_udpsink   =   QGst::ElementFactory::make("udpsink", "udpsink");
m_udpsink1  =   QGst::ElementFactory::make("udpsink", "udpsink1");
m_videoSink =   QGst::ElementFactory::make("nvoverlaysink", "sink");
m_tee2      =   QGst::ElementFactory::make("tee", "tee3");
m_fakesink1 =   QGst::ElementFactory::make("fakesink", "fakesink1");
m_mux1       =   QGst::ElementFactory::make("qtmux", "qtmux1");
m_filesink1 =   QGst::ElementFactory::make("filesink", "filesink1");

m_filter1->setProperty("caps", QGst::Caps::fromString("video/x-raw, width=1920, height=1080, format=UYVY, framerate=60/1"));
m_filter2->setProperty("caps", QGst::Caps::fromString("video/x-raw(memory:NVMM), width=1920, height=1080, format=I420, framerate=60/1"));
m_filter3->setProperty("caps", QGst::Caps::fromString("video/x-h264, stream-format=(string)byte-stream"));

m_videoSink->setProperty("sync", false);
m_videoSink->setProperty("async", false);

m_pipeline->setProperty("video-sink", m_videoSink);

m_filesink->setProperty("sync", false);
m_filesink->setProperty("async", false);
m_enc->setProperty("bitrate", 19000000);
m_enc->setProperty("low-latency", 1);
m_enc->setProperty("control-rate", 2);
m_filesink->setProperty("location", "/home/ubuntu/video.mp4");
m_rtppay1->setProperty("mtu", 1400);
m_rtppay2->setProperty("mtu", 1400);

m_filesink1->setProperty("sync", false);
m_filesink1->setProperty("async", false);
m_filesink1->setProperty("location", "/home/ubuntu/video1.mp4");

m_udpsink->setProperty("port", 5000);
m_udpsink->setProperty("sync", false);
m_udpsink->setProperty("async", false);
m_udpsink->setProperty("host", "127.0.0.1");

m_udpsink1->setProperty("port", 8554);
m_udpsink1->setProperty("sync", false);
m_udpsink1->setProperty("async", false);
m_udpsink1->setProperty("host", "172.10.10.135");

m_pipeline->add(m_source, m_filter1, m_tee2, m_queue6, m_fakesink1);
m_pipeline->add(m_queue7, m_convert, m_filter2, m_tee, m_queue1, m_videoSink);
m_pipeline->add(m_queue2, m_enc, m_filter3, m_tee1, m_queue8, m_fakesink);
m_pipeline->add(m_queue3, m_parse, m_mux, m_filesink);
m_pipeline->add(m_queue4, m_parse1, m_rtppay1, m_udpsink);
m_pipeline->add(m_queue5, m_parse2, m_rtppay2, m_udpsink1);

m_pipeline->linkMany(m_source, m_filter1, m_tee2, m_queue6, m_fakesink1);
m_pipeline->linkMany(m_tee2, m_queue7, m_convert, m_filter2, m_tee, m_queue1, m_videoSink);
m_pipeline->linkMany(m_tee, m_queue2, m_enc, m_filter3, m_tee1, m_queue8, m_fakesink);
m_pipeline->linkMany(m_tee1, m_queue3, m_parse, m_mux, m_filesink);
m_pipeline->linkMany(m_tee1, m_queue4, m_parse1, m_rtppay1, m_udpsink);
m_pipeline->linkMany(m_tee1, m_queue5, m_parse2, m_rtppay2, m_udpsink1);

for testing i am pause and play pipeline every 1 sec.

m_pipeline->setState(QGst::StatePaused);
QThread::msleep(10);
m_pipeline->setState(QGst::StatePlaying);

The pipeline hangs after several Pause/Resume. If i remove last 2 lines of linkmany and add the i can pause/resume more times than with all elements added.

So whats the problem here? How can i pause / play pipeline efficiently?

Upvotes: 1

Views: 1675

Answers (0)

Related Questions