<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Hello everyone,<div class=""><br class=""></div><div class="">I am currently in the process of making a custom plugin that would alter frames from a video file or a stream.</div><div class="">As i could gather the best base for this is to subclass BaseTransform.</div><div class=""><br class=""></div><div class="">The base code for this is :</div><div class=""><br class=""></div><div class="">*****</div><div class=""><div class="">class TfObjectDetection(GstBase.BaseTransform):</div><div class="">    __gsttemplates__ = (</div><div class="">        Gst.PadTemplate.new(</div><div class="">            "src",</div><div class="">            Gst.PadDirection.SRC,</div><div class="">            Gst.PadPresence.ALWAYS,</div><div class="">            Gst.Caps.from_string("video/x-raw,format=(string)RGB")),</div><div class=""><br class=""></div><div class="">        Gst.PadTemplate.new(</div><div class="">            "sink",</div><div class="">            Gst.PadDirection.SINK,</div><div class="">            Gst.PadPresence.ALWAYS,</div><div class="">            Gst.Caps.from_string("video/x-raw,format=(string)RGB"))</div><div class="">    )</div><div class=""><br class=""></div><div class="">    def __init__(self):</div><div class="">        GstBase.BaseTransform.__init__(self)</div><div class=""><br class=""></div><div class="">        self.set_passthrough(False)</div><div class="">        self.set_in_place(False)</div><div class=""><br class=""></div><div class="">    def do_transform(self, inbuf, outbuf):</div><div class="">        print("Tensorflow plugin    :   processing frame at timestamp(buffer):%s" % (Gst.TIME_ARGS(inbuf.pts)))</div><div class="">        print("                         buffer size is :%s" % (inbuf.get_size()))</div><div class=""><br class=""></div><div class="">        * do stuff *</div><div class=""><br class=""></div><div class="">        outbuf.fill(0, data)</div><div class=""><br class=""></div><div class="">        return Gst.FlowReturn.OK</div></div><div class="">*****</div><div class=""><br class=""></div><div class="">Nothing fancy but whatever i try : <span style="color: rgb(244, 244, 244); font-family: Monaco; font-size: 10px; background-color: rgba(0, 0, 0, 0.85098); font-variant-ligatures: no-common-ligatures;" class="">(<unknown>:63739): GStreamer-</span><span style="font-family: Monaco; font-size: 10px; background-color: rgba(0, 0, 0, 0.85098); font-variant-ligatures: no-common-ligatures; color: rgb(213, 59, 211);" class="">CRITICAL</span><span style="color: rgb(244, 244, 244); font-family: Monaco; font-size: 10px; background-color: rgba(0, 0, 0, 0.85098); font-variant-ligatures: no-common-ligatures;" class=""> **: gst_buffer_fill: assertion 'gst_buffer_is_writable (buffer)' failed</span></div><div class="">Trying in-place result in the same error so i really don’t know what i should do.</div><div class="">I also tried to subclass Element but i cannot fathom how caps negotiations works and it always fail with a « non negotiated » error.</div><div class="">I listened to queries and put a method like this :</div><div class=""><pre style="background-color:#2b2b2b;color:#a9b7c6;font-family:'Menlo';font-size:9.0pt;" class=""><span style="color:#cc7832;" class="">def </span><span style="color:#ffc66d;" class="">_src_query</span>(<span style="color:#94558d;" class="">self</span><span style="color:#cc7832;" class="">, </span>pad<span style="color:#cc7832;" class="">, </span>parent<span style="color:#cc7832;" class="">, </span>query):<br class="">    <span style="color:#cc7832;" class="">if </span>query.type == Gst.QueryType.CAPS:<br class="">        <span style="color:#8888c6;" class="">print</span>(<span style="color:#6a8759;" class="">"Got query '" </span>+ Gst.QueryType.get_name(query.type) + <span style="color:#6a8759;" class="">"' on pad '" </span>+ pad.get_name() + <span style="color:#6a8759;" class="">"'"</span>)<br class="">        query.set_caps_result(Gst.Caps.from_string(<span style="color:#6a8759;" class="">"video/x-raw,format=(string)RGB,width=4096,height=2160,framerate=0/1"</span>))<br class="">        <span style="color:#cc7832;" class="">return True<br class=""></span><span style="color:#cc7832;" class="">    else</span>:<br class="">        <span style="color:#cc7832;" class="">return </span>pad.query_default(parent<span style="color:#cc7832;" class="">, </span>query)</pre><div class="">but i have no idea what i should do in there so the next element accept my source pad.</div></div><div class=""><br class=""></div><div class="">Checking the C code for BaseTransform is way too complicated, after all my plugin used fixed caps since it only support RGB frame on its sink.</div><div class=""><br class=""></div><div class="">Version for gstreamer is 1.12.3 and it is installed on OSX using brew.</div><div class="">Python is 3.6</div><div class=""><br class=""></div><div class="">I’ve been stuck on this for a week now and i don’t really know what to do.</div><div class="">I could abandon Python and write everything in C but that would require all my frame processing code to be rewritten in C as well which i would rather avoid.</div><div class=""><br class=""></div><div class="">I would be very grateful for any insight.</div><div class="">Thanks</div><div class=""><span style="color: rgb(244, 244, 244); font-family: Monaco; font-size: 10px; background-color: rgba(0, 0, 0, 0.85098);" class=""><br class=""></span></div></body></html>