Does your StreamThread inherits from QThread? If not you have the answer.<br><br>I think generally you have a problem here because you are using singal/slot mechanism which was designed for GUI not for normal (fast) operation. I could not find it in the documentation (somebody please correct me if wrong) but my guess is that signal/slot mechanism is using qtimer.<br>

Excerpt from the documentation: &quot;In general, emitting a signal that is connected to some slots, is 
approximately ten times slower than calling the receivers directly, with
 non-virtual function calls.&quot; From here <a href="http://doc.qt.nokia.com/latest/signalsandslots.html">http://doc.qt.nokia.com/latest/signalsandslots.html</a>.<br><br>So if you want some real-time processing to happen and you have a producer-consumer scenario I would suggest to use semaphores (QSemaphore ) for that.<br>

<br>Otherways (if qtimer is involved in multithreading) you will get performance issues sooner or later. <br>Checked on my own skin.<br><br><br><br>If not I guess it should <br><br><div class="gmail_quote">2011/4/13 Matias Hernandez Arellano <span dir="ltr">&lt;<a href="mailto:msdark@archlinux.cl">msdark@archlinux.cl</a>&gt;</span><br>

<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">(me again)...<br>
Well i try it a lot of things and finally i get a proof of concept of the final application semi functional using Qt+OpenCV+QGstreamer ...<br>
but.. yet.. i have a problem..<br>
<br>
Here some snippets of code<br>
<br>
main.cpp<br>
 int main(int argc, char *argv[]){<br>
    QCoreApplication a(argc, argv);<br>
    QGst::init(&amp;argc,&amp;argv);<br>
    FrameBuffer *buffer = new FrameBuffer(3);<br>
    FrameBuffer *buffer2 = new FrameBuffer(3);<br>
    CaptureThread *capture = new CaptureThread(buffer,0);<br>
    ProcessingThread *processing = new ProcessingThread(buffer,buffer2,capture-&gt;getSourceWidth(),capture-&gt;getSourceHeight());<br>
    StreamThread     *stream     = new StreamThread(buffer2);<br>
    QCoreApplication::connect(processing,SIGNAL(newframe()),stream,SLOT(update()),Qt::QueuedConnection);<br>
    capture-&gt;start();<br>
    processing-&gt;start();<br>
    stream-&gt;start();<br>
    return a.exec();;<br>
}<br>
<br>
buffer and buffer2 are Circular Buffers that hold cv::Mat (OpenCV Images).<br>
buffer hold cv::Mat obtained with CaptureThread. ProcessingThread pull images from here.<br>
ProcessingThread push images into buffer2 and StreamThread pull images from here.<br>
<br>
The cycle works good...<br>
now the StreamThread<br>
<br>
 StreamThread::StreamThread(FrameBuffer *b, QObject *parent): ImageBuffer(b),QThread(parent){<br>
    QString pipe_str = QString(&quot;appsrc name=\&quot;appsrc\&quot; caps=\&quot;video/x-raw-rgb,width=320,height=240\&quot; ! queue ! videoparse format=14 width=%1 height=%1 ! videorate &quot;<br>
                               &quot; ! videoscale ! video/x-raw-rgb,width=320,height=240 &quot;<br>
                               &quot; ! queue ! ffmpegcolorspace ! jpegenc  ! queue  &quot;<br>
                               &quot; ! tcpserversink port=5000  &quot;).arg(WIDTH,HEIGHT);<br>
    this-&gt;pipeline = QGst::Parse::launch(pipe_str).dynamicCast&lt;QGst::Pipeline&gt;();<br>
    QGlib::connect(this-&gt;pipeline-&gt;bus(),&quot;message&quot;,this,&amp;StreamThread::onBusMessage);<br>
    this-&gt;pipeline-&gt;bus()-&gt;addSignalWatch();<br>
    this-&gt;pipeline-&gt;setState(QGst::StatePlaying);<br>
    this-&gt;m_src.setElement(this-&gt;pipeline-&gt;getElementByName(&quot;appsrc&quot;));<br>
}<br>
void StreamThread::onBusMessage(const QGst::MessagePtr &amp;message){<br>
    switch (message-&gt;type()) {<br>
    case QGst::MessageEos:<br>
        quit();<br>
        break;<br>
    case QGst::MessageError:<br>
        qCritical() &lt;&lt; message.staticCast&lt;QGst::ErrorMessage&gt;()-&gt;error();<br>
        break;<br>
    default:<br>
        break;<br>
    }<br>
}<br>
void StreamThread::run(){<br>
    this-&gt;exec();<br>
}<br>
<br>
//This SLOT fires up when ProcessingThread calls the newImage() SIGNAL ..<br>
// this signal ocurrs when a new processing image was push into the buffer<br>
void StreamThread::update(){<br>
    if(!this-&gt;m_src.element().isNull()){<br>
        this-&gt;pipeline-&gt;setState(QGst::StatePlaying);<br>
        QGst::BufferPtr buffer = QGst::Buffer::create(WIDTH*HEIGHT*3*sizeof(quint8*));<br>
        quint8 *data = buffer-&gt;data();<br>
        Mat frame = this-&gt;ImageBuffer-&gt;getFrame();<br>
        data      = (quint8*)frame.data;<br>
        QGst::FlowReturn ret = this-&gt;m_src.pushBuffer(buffer);<br>
        if(ret!=QGst::FlowOk){<br>
            qDebug()&lt;&lt;&quot;Error pushing data&quot;;<br>
        }<br>
    }<br>
}<br>
StreamThread::~StreamThread(){<br>
    this-&gt;pipeline-&gt;setState(QGst::StateNull);<br>
}<br>
<br>
When i run this app i don&#39;t get errors, just this warning (this doesn&#39;t show if i don&#39;t execute StreamThread)<br>
<div class="im">QObject::startTimer: QTimer can only be used with threads started with QThread<br>
</div>So i suppose that QGstreamer use QTimer in some hidden part.<br>
<br>
And... if i try to see the stream using<br>
gst-launch tcpclientsrc host=127.0.0.1 port=5000 !  jpegdec ! queue ! video/x-raw-rgb,width=320,height=240 ! ffmpegcolorspace ! queue ! glimagesink sync=false<br>
<br>
I get:<br>
Estableciendo el conducto a PAUSA ?<br>
El conducto est? PREPAR?NDOSE ?<br>
<br>
But the pipeline never goes to PLAYING and nothing happen (i can&#39;t see the result)...<br>
<br>
Any idea??<br>
<br>
Thanks in advance<br>
<div class="im"><br>
<br>
El 08-04-2011, a las 4:34, Tim-Philipp Müller escribió:<br>
<br>
</div><div><div></div><div class="h5">&gt; On Thu, 2011-04-07 at 18:20 -0400, Matias Hernandez Arellano wrote:<br>
&gt;<br>
&gt;&gt; It&#39;s possible to use gstreamer in a multithread app?<br>
&gt;<br>
&gt; Yes.<br>
&gt;<br>
&gt;&gt; I have an Producer/Consumer application where i have two groups 1 with<br>
&gt;&gt; 1 Producer and 1 Cosumer (Capture Video with Opencv/Process Image) and<br>
&gt;&gt; other group equal ... Take de Process Frame  / Stream the frames...<br>
&gt;<br>
&gt; Have you considered writing a simple source element that captures and<br>
&gt; processes the frame directly in a GStreamer pipeline?<br>
&gt;<br>
&gt;&gt; The communication between threads works good, but know i need to add<br>
&gt;&gt; the stream part .. I have another app where i test the functionality of<br>
&gt;&gt; AppSrc and works!!! .. So i need to add this (Read from the Buffer<br>
&gt;&gt; where i have images, push into AppSrc and Stream over network) in a<br>
&gt;&gt; thread.<br>
&gt;&gt;<br>
&gt;&gt; is this possible??<br>
&gt;<br>
&gt; Why would this not be possible? Have you tried it and run into problems?<br>
&gt;<br>
&gt; GStreamer does (almost) all of its processing in dedicated threads of<br>
&gt; its own (&quot;streaming threads&quot;). You should be able to push buffers into<br>
&gt; appsrc from any application thread (they will get queued internally in<br>
&gt; appsrc and then processed in the GStreamer streaming thread).<br>
&gt;<br>
&gt; Cheers<br>
&gt; -Tim<br>
&gt;<br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; gstreamer-devel mailing list<br>
&gt; <a href="mailto:gstreamer-devel@lists.freedesktop.org">gstreamer-devel@lists.freedesktop.org</a><br>
&gt; <a href="http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel" target="_blank">http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel</a><br>
<br>
</div></div><div class="im">Matías Hernandez Arellano<br>
Ingeniero de Software/Proyectos en VisionLabs S.A<br>
CDA Archlinux-CL<br>
<a href="http://www.msdark.archlinux.cl" target="_blank">www.msdark.archlinux.cl</a><br>
<br>
<br>
<br>
<br>
_______________________________________________<br>
</div><div><div></div><div class="h5">gstreamer-devel mailing list<br>
<a href="mailto:gstreamer-devel@lists.freedesktop.org">gstreamer-devel@lists.freedesktop.org</a><br>
<a href="http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel" target="_blank">http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel</a><br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br>Your Sincerely<br>Michal Joachimiak<br>