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