QtGstreamer fails creating pipeline after QGst::cleanup()
Karl Phillip
maxphil at gmail.com
Tue Nov 29 03:36:09 PST 2011
Hi all,
I spent a lot of time to pinpoint this problem and I wonder if it's a bug
of QtGstreamer or not.
If it's not, we seriously need to make this thing more clear on the
documentation and prevent others from making the same mistake as I did.
I wrote a VideoPlayer class to deal with video files using QtGstreamer
under the hood. I was able to instantiate a VideoPlayer object and display
the video with no problems.
Then, I tried to destroy the current player and instantiate a new one
(within the same thread) to watch another video. That's when it happend:
the second object failed to create it's pipeline.
Hours of investigation went by until I found the source of the problem: the
constructor of VideoPlayer initialized the library through "QGst::init();"
and the destructor did the opposite with "QGst::cleanup();".
It was my understanding that after a
cleanup()<http://gstreamer.freedesktop.org/data/doc/gstreamer/head/qt-gstreamer/html/namespaceQGst.html#af854931adda54e40b759bf4f736f1cbb>operation,
a call to init() would restore things back to it's operational
state, but so it happens that cleanup() makes it impossible.
What is also strange is that calling QGst::init() after a cleanup() doesn't
return any errors nor throw exceptions, which I think it should, since you
can't use the library to create a new pipeline rendering it pretty much
useless.
I wrote a small demo to reproduce this behavior:
#include <QObject>
#include <QGst/Init>
#include <QGst/Pipeline>
#include <QGst/Element>
int main()
{
qDebug() << "#1 call QGst::init()";
QGst::init();
QGst::PipelinePtr _pipeline = QGst::Pipeline::create();
if (!_pipeline)
{
qDebug() << "#1 Failed creating pipeline !!!";
return -1;
}
qDebug() << "#1 Setting pipeline to Playing";
_pipeline->setState(QGst::StatePlaying);
qDebug() << "#1 Setting pipeline to Null";
_pipeline->setState(QGst::StateNull);
qDebug() << "#1 call pipeline.clear()";
_pipeline.clear();
qDebug() << "#1 call QGst::cleanup()";
QGst::cleanup();
qDebug() << "\n* Press <enter> to restart the pipeline setup";
getchar();
qDebug() << "#2 call QGst::init()";
QGst::init();
_pipeline = QGst::Pipeline::create();
if (!_pipeline)
{
qDebug() << "#2 Failed creating pipeline !!!";
return -1;
}
return 0;
}
Thanks!
--
Karl Phillip
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20111129/b0804a43/attachment.htm>
More information about the gstreamer-devel
mailing list