<br>Hi All,<br><br><br>I have a non generic audio video capture device with multiple inputs and i am trying to integrate it as my first gstreamer plugin.<br><br>To start simple i am only aiming at creating an element with one video source. So I am extending GstBaseSrc.<br><br>The device provide mmap yuv buffers in either PAL or NTSC resolution through ioctl calls.<br><br>I have tried to take as an example the v4l2src source code.<br><br><br>i test it with the command<br><br>gst-launch-0.10 myfilter device=&quot;/dev/xecap0&quot; video-mode=0 chan-bitmap=0xffff chan-select=0 ! fakesink<br><br><br>And get the following<br><br><br>/********************BEGIN**********************/<br><br><br>Setting pipeline to PAUSED ...<br><br>Pipeline is live and does not need PREROLL ...<br><br>Setting pipeline to PLAYING ...<br><br>New clock: GstSystemClock<br><br><br>(gst-launch-0.10:854): GStreamer-CRITICAL **: gst_pad_push: assertion `GST_IS_BUFFER (buffer)&#39; failed<br><br>ERROR: from element /pipeline0/myfilter0: Internal data flow error.<br><br>Additional debug info:<br><br>gstbasesrc.c(2165): gst_base_src_loop (): /pipeline0/myfilter0:<br><br>streaming task paused, reason error (-5)<br><br>Execution ended after 426026 ns.<br><br>Setting pipeline to PAUSED ...<br><br>Setting pipeline to READY ...<br><br><br>(gst-launch-0.10:854): GStreamer-CRITICAL **: gst_mini_object_unref: assertion `mini_object-&gt;refcount &gt; 0&#39; failed<br><br>gst_myfilter_stopped<br><br>Setting pipeline to NULL ...<br><br>FREEING pipeline ...<br><br><br>/********************END***********************/<br><br><br>With gst-debug=*:3, everything seems fine until i get the following warning and the pipeline stops ...<br><br>/********************BEGIN**********************/<br><br>(gst-launch-0.10:796): GStreamer-CRITICAL **: gst_pad_push: assertion `GST_IS_BUFFER (buffer)&#39; failed<br><br>0:00:00.211305419   796 0x929a770 INFO               basesrc gstbasesrc.c:2114:gst_base_src_loop:&lt;myfilter0&gt; pausing after gst_pad_push() = error<br><br>0:00:00.211320520   796 0x929a770 WARN               basesrc gstbasesrc.c:2165:gst_base_src_loop:&lt;myfilter0&gt; error: Internal data flow error.<br><br>0:00:00.211328857   796 0x929a770 WARN               basesrc gstbasesrc.c:2165:gst_base_src_loop:&lt;myfilter0&gt; error: streaming task paused, reason error (-5)<br><br>/********************END***********************/<br><br><br>I have implemented the following methods<br><br><br>gstbasesrc_class-&gt;set_caps = GST_DEBUG_FUNCPTR (gst_myfilter_set_caps);<br><br>gstbasesrc_class-&gt;start = GST_DEBUG_FUNCPTR (gst_myfilter_start);<br><br>gstbasesrc_class-&gt;stop = GST_DEBUG_FUNCPTR (gst_myfilter_stop);<br><br>gstbasesrc_class-&gt;create = GST_DEBUG_FUNCPTR (gst_myfilter_create);<br><br><br>I initialise the buffer in the set_caps method like this:<br><br><br>static gboolean<br><br>gst_myfilter_set_caps (GstBaseSrc * src, GstCaps * caps)<br><br>{<br><br>     .<br><br>     .<br><br>     .<br><br><br>     if (!gst_pad_set_caps (src-&gt;srcpad, caps))<br><br>    {<br><br>        GST_WARNING (&quot;gst_myfilter_set_caps caps negotiation failed %&quot; GST_PTR_FORMAT &quot;from elem&quot;,<br><br>                caps, GST_ELEMENT_NAME(src));<br><br>        return FALSE;<br><br>    }<br><br><br>    .<br><br>    .<br><br>    .<br><br>    GST_BUFFER_DATA (filter-&gt;my_buffer) = (guchar*)dev_buf;<br><br>    GST_BUFFER_SIZE (filter-&gt;my_buffer) = (filter-&gt;video_mode == 0)?704*576*2:704*480*2;<br><br>    GST_BUFFER_FLAG_SET (filter-&gt;my_buffer, GST_BUFFER_FLAG_READONLY);<br><br>    gst_buffer_set_caps (GST_BUFFER (filter-&gt;my_buffer), caps);<br><br><br>   return TRUE;<br><br>}<br><br><br>Here is the create method, it always seems to get called 3 times ok untils the error shows which puzzle me the most.<br><br><br>static GstFlowReturn<br><br>gst_myfilter_create (GstBaseSrc * basesrc, guint64 offset, guint length,<br><br>    GstBuffer ** buffer)<br><br>{<br><br>    Gstmyfilter *src;<br><br><br>    GstState state = GST_STATE (basesrc);<br><br>    if(state != GST_STATE_PLAYING)<br><br>    {<br><br>        return GST_FLOW_WRONG_STATE;<br><br>    }<br><br><br>    src = GST_MYFILTER (basesrc);<br><br><br>    gchar * dev_buf = NULL;<br><br><br>    dev_error dev_ret = dev_get_framebuffer(src-&gt;chan_select, src-&gt;dev_handle, &amp;dev_buf);<br><br><br>    if(dev_ret == DEV_ERROR || dev_buf == NULL)<br><br>    {<br><br>        return GST_FLOW_ERROR;<br><br>    }<br><br><br>    GST_BUFFER_OFFSET (src-&gt;my_buffer) = src-&gt;offset++;<br><br>    GST_BUFFER_OFFSET_END (src-&gt;my_buffer) = src-&gt;offset;<br><br>    GST_BUFFER_TIMESTAMP (src-&gt;my_buffer) = GST_CLOCK_TIME_NONE;<br><br><br>    GST_BUFFER_DATA (src-&gt;my_buffer) = (guint8*)dev_buf;<br><br><br>    *buffer = src-&gt;my_buffer;<br><br><br>    return GST_FLOW_OK;<br><br>}<br><br><br>Any ideas why the (gst-launch-0.10:796): GStreamer-CRITICAL **: gst_pad_push: assertion `GST_IS_BUFFER (buffer)&#39; failed error shows up ?<br><br><br>Regards,<br><br><br>Pierre<br><br><br><br>