<!DOCTYPE html><html><head><title></title><style type="text/css">p.MsoNormal,p.MsoNoSpacing{margin:0}</style></head><body><div>I'm trying to grab video from a window using ximagesrc and scale it to a certain size before encoding in H.264 and streaming with RTP to another machine. I implemented my pipeline in the C API and it works fine unless I add a videoscale element with capsfilter. <br></div><div><br></div><div>Specifically, I have a problem understanding how to use the videoscale element correctly and how to link it with a videoconvert element programmatically. The function 'gst_element_link_filtered' returns false when I try to connect the videoconvert and videoscale element using a capsfilter for scaling to the resolution I want. <br></div><div><br></div><div>My code looks as follows:<br></div><div><br></div><pre style="background-color:rgb(255, 255, 255);color:rgb(0, 0, 0);font-family:"DejaVu Sans Mono";font-size:10.5pt;"><div><span style="color:rgb(0, 0, 128)" class="colour"><b>static </b></span><span style="color:rgb(55, 31, 128)" class="colour">gboolean<br></span>link_elements_with_filter (<span style="color:rgb(55, 31, 128)" class="colour">GstElement </span>*element1, <span style="color:rgb(55, 31, 128)" class="colour">GstElement </span>*element2)</div><div>{<br></div><div>  <span style="color:rgb(55, 31, 128)" class="colour">gboolean </span>link_ok;<br></div><div>  <span style="color:rgb(55, 31, 128)" class="colour">GstCaps </span>*caps;<br></div><div><br></div><div>  caps = gst_caps_from_string(<span style="color:rgb(0, 128, 0)" class="colour"><b>"video/x-raw,width=640,height=480,framerate=20/1"</b></span>);<br></div><div><br></div><div>  link_ok = gst_element_link_filtered (element1, element2, caps);<br></div><div>  gst_caps_unref (caps);<br></div><div><br></div><div>  <span style="color:rgb(0, 0, 128)" class="colour"><b>if </b></span>(!link_ok) {<br></div><div>      <span style="color:rgb(31, 84, 46)" class="colour"><b>g_warning </b></span>(<span style="color:rgb(0, 128, 0)" class="colour"><b>"Failed to link element1 and element2!"</b></span>);<br></div><div>    }<br></div><div><br></div><div>  <span style="color:rgb(0, 0, 128)" class="colour"><b>return </b></span>link_ok;<br></div><div>}<br></div></pre><div><br></div><pre style="background-color:rgb(255, 255, 255);color:rgb(0, 0, 0);font-family:"DejaVu Sans Mono";font-size:10.5pt;"><span style="color:rgb(0, 0, 128)" class="colour"><b>int </b></span>main(<span style="color:rgb(0, 0, 128)" class="colour"><b>int </b></span>argc, <span style="color:rgb(0, 0, 128)" class="colour"><b>char </b></span>*argv[]) {<br></pre><div>(...)<br></div><div><br></div><pre style="background-color:rgb(255, 255, 255);color:rgb(0, 0, 0);font-family:"DejaVu Sans Mono";font-size:10.5pt;"><div> <span style="color:rgb(128, 128, 128)" class="colour"><i>/* Create the elements */<br></i></span><span style="color:rgb(128, 128, 128)" class="colour"><i>  </i></span>source = gst_element_factory_make (<span style="color:rgb(0, 128, 0)" class="colour"><b>"ximagesrc"</b></span>, <span style="color:rgb(0, 128, 0)" class="colour"><b>"source"</b></span>);</div><div>  converter = gst_element_factory_make (<span style="color:rgb(0, 128, 0)" class="colour"><b>"videoconvert"</b></span>, <span style="color:rgb(0, 128, 0)" class="colour"><b>"converter"</b></span>);<br></div><div>  scaler = gst_element_factory_make (<span style="color:rgb(0, 128, 0)" class="colour"><b>"videoscale"</b></span>, <span style="color:rgb(0, 128, 0)" class="colour"><b>"scaler"</b></span>);<br></div><div>  encoder = gst_element_factory_make(<span style="color:rgb(0, 128, 0)" class="colour"><b>"nvh264enc"</b></span>, <span style="color:rgb(0, 128, 0)" class="colour"><b>"encoder"</b></span>);<br></div><div>  payloader = gst_element_factory_make(<span style="color:rgb(0, 128, 0)" class="colour"><b>"rtph264pay"</b></span>, <span style="color:rgb(0, 128, 0)" class="colour"><b>"payloader"</b></span>);<br></div><div>  sink = gst_element_factory_make (<span style="color:rgb(0, 128, 0)" class="colour"><b>"udpsink"</b></span>, <span style="color:rgb(0, 128, 0)" class="colour"><b>"sink"</b></span>);<br></div><div><span style="color:rgb(128, 128, 128)" class="colour"><i>
  </i></span>g_object_set (source, <span style="color:rgb(0, 128, 0)" class="colour"><b>"use-damage"</b></span>, FALSE, <span style="color:rgb(0, 128, 0)" class="colour"><b>"xid"</b></span>, <span style="color:rgb(0, 0, 255)" class="colour">0x5c0000c</span>, NULL);<br></div><div><span style="color:rgb(128, 128, 128)" class="colour"><i>  </i></span>g_object_set (encoder, <span style="color:rgb(0, 128, 0)" class="colour"><b>"gop-size"</b></span>, <span style="color:rgb(0, 0, 255)" class="colour">25</span>, <span style="color:rgb(0, 128, 0)" class="colour"><b>"rc-mode"</b></span>, <span style="color:rgb(0, 0, 255)" class="colour">2</span>, <span style="color:rgb(0, 128, 0)" class="colour"><b>"bitrate"</b></span>, <span style="color:rgb(0, 0, 255)" class="colour">2000</span>, NULL);<br></div><div><span style="color:rgb(128, 128, 128)" class="colour"><i>  </i></span>g_object_set (payloader, <span style="color:rgb(0, 128, 0)" class="colour"><b>"config-interval"</b></span>, <span style="color:rgb(0, 0, 255)" class="colour">1</span>, NULL); <span style="color:rgb(128, 128, 128)" class="colour"><i><br>  </i></span>g_object_set (sink, <span style="color:rgb(0, 128, 0)" class="colour"><b>"host"</b></span>, <span style="color:rgb(0, 128, 0)" class="colour"><b>"172.17.25.248"</b></span>, <span style="color:rgb(0, 128, 0)" class="colour"><b>"port"</b></span>, <span style="color:rgb(0, 0, 255)" class="colour">5004</span>, NULL);</div><div><span style="color:rgb(128, 128, 128)" class="colour"><i>
  </i></span>pipeline = gst_pipeline_new (<span style="color:rgb(0, 128, 0)" class="colour"><b>"test-pipeline"</b></span>);<br></div><div><br></div><div>  <span style="color:rgb(0, 0, 128)" class="colour"><b>if </b></span>(!pipeline || !source || !converter || !encoder || !payloader || !sink) {<br></div><div>      g_printerr (<span style="color:rgb(0, 128, 0)" class="colour"><b>"Not all elements could be created.</b></span><span style="color:rgb(0, 0, 128)" class="colour"><b>\n</b></span><span style="color:rgb(0, 128, 0)" class="colour"><b>"</b></span>);<br></div><div>      <span style="color:rgb(0, 0, 128)" class="colour"><b>return </b></span>-<span style="color:rgb(0, 0, 255)" class="colour">1</span>;<br></div><div>  }<br></div></pre><div><br></div><pre style="background-color:rgb(255, 255, 255);color:rgb(0, 0, 0);font-family:"DejaVu Sans Mono";font-size:10.5pt;"><div>   gst_bin_add_many (GST_BIN (pipeline), source, converter, scaler, encoder, payloader, sink,   NULL);<br></div><div><span style="color:rgb(0, 0, 128)" class="colour"><b>   if </b></span>((gst_element_link (source, converter) && link_elements_with_filter(converter, scaler)<br></div><div>                                          && gst_element_link (converter, encoder)<br></div><div>                                          && gst_element_link (encoder, payloader)<br></div><div>                                          && gst_element_link (payloader, sink)) != TRUE) {<br></div><div>    g_printerr (<span style="color:rgb(0, 128, 0)" class="colour"><b>"Elements could not be linked.</b></span><span style="color:rgb(0, 0, 128)" class="colour"><b>\n</b></span><span style="color:rgb(0, 128, 0)" class="colour"><b>"</b></span>);<br></div><div>    gst_object_unref (pipeline);<br></div><div>    <span style="color:rgb(0, 0, 128)" class="colour"><b>return </b></span>-<span style="color:rgb(0, 0, 255)" class="colour">1</span>;<br></div><div>}
<br></div></pre><div>(...)<br></div><div><br></div><div>When I run this code,  I get the following:<br></div><div>** (gst_server:55698): WARNING **: 11:21:57.315: Failed to link element1 and element2!<br></div><div>Elements could not be linked.<br></div><div>Process finished with exit code 255<br></div><div><br></div><div>So I have problems connecting the videoconvert and videoscale elements. Is there something wrong with the order of the elements in the pipeline, or perhaps with my usage of caps?  <br></div><div>Thanks.<br></div><div><br></div><div><br></div></body></html>