I have a pipeline which simply streams data from the camera using QtGStreamer. The pipeline works and I can stream without any problems. The pipeline is defined as:
bool retval = true;
if (!m_streaming_pipeline) {
m_streaming_pipeline = QGst::Pipeline::create("Streamer");
if (m_streaming_pipeline) {
qDebug() << "Creating streamer";
QGst::ElementPtr source = QGst::ElementFactory::make("autovideosrc");
QGst::ElementPtr capsfilter = QGst::ElementFactory::make("capsfilter", "capsfilter");
capsfilter->setProperty("caps", QGst::Caps::fromString("video/x-raw, width=1920, height=1080"));
QGst::ElementPtr scale = QGst::ElementFactory::make("videoscale");
scale->setProperty("caps", QGst::Caps::fromString("video/x-raw, width=480,height=270"));
m_videoSink->setProperty("sync", false);
m_videoSink->setProperty("async", false);
m_videoSink->setProperty("enable-last-sample", true);
m_streaming_pipeline->setProperty("video-sink", m_videoSink);
m_streaming_pipeline->add(source, capsfilter, scale, m_videoSink);
retval &= source->link(capsfilter);
retval &= capsfilter->link(scale);
retval &= scale->link(m_videoSink);
QGst::BusPtr bus = m_streaming_pipeline->bus();
bus->addSignalWatch();
QGlib::connect(bus, "message", this, &Recorder::onStreamerBusMessage);
}
}
This works fine and when I am done, I dispose of the pipeline as:
if (m_streaming_pipeline) {
QGst::StateChangeReturn r = m_streaming_pipeline->setState(QGst::StateNull);
qDebug() << "State: " << r;
m_streaming_pipeline->remove(m_videoSink);
QGst::State currentState;
m_streaming_pipeline->getState(¤tState, NULL, -1);
if (currentState == QGst::StateNull) {
qDebug() << "NULL State";
}
m_streaming_pipeline.clear();
}
However, the issue is that this does not seem to release my camera resource. Trying to start the pipeline again or using an app like `cheese` comes back with the error that the camera resource is busy.
How can I ensure that the pipeline is really gone and all the resources are freed.