Using caps on videoscale element in the C API

Serhan Gül serhan at fastmail.com
Mon Jul 15 09:31:01 UTC 2019


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. 

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. 

My code looks as follows:

*static *gboolean
link_elements_with_filter (GstElement *element1, GstElement *element2)
{
  gboolean link_ok;
  GstCaps *caps;

  caps = gst_caps_from_string(*"video/x-raw,width=640,height=480,framerate=20/1"*);

  link_ok = gst_element_link_filtered (element1, element2, caps);
  gst_caps_unref (caps);

  *if *(!link_ok) {
      *g_warning *(*"Failed to link element1 and element2!"*);
    }

  *return *link_ok;
}

*int *main(*int *argc, *char **argv[]) {
(...)

 */* Create the elements */
**  *source = gst_element_factory_make (*"ximagesrc"*, *"source"*);
  converter = gst_element_factory_make (*"videoconvert"*, *"converter"*);
  scaler = gst_element_factory_make (*"videoscale"*, *"scaler"*);
  encoder = gst_element_factory_make(*"nvh264enc"*, *"encoder"*);
  payloader = gst_element_factory_make(*"rtph264pay"*, *"payloader"*);
  sink = gst_element_factory_make (*"udpsink"*, *"sink"*);
*
  *g_object_set (source, *"use-damage"*, FALSE, *"xid"*, 0x5c0000c, NULL);
*  *g_object_set (encoder, *"gop-size"*, 25, *"rc-mode"*, 2, *"bitrate"*, 2000, NULL);
*  *g_object_set (payloader, *"config-interval"*, 1, NULL); *
  *g_object_set (sink, *"host"*, *"172.17.25.248"*, *"port"*, 5004, NULL);
*
  *pipeline = gst_pipeline_new (*"test-pipeline"*);

  *if *(!pipeline || !source || !converter || !encoder || !payloader || !sink) {
      g_printerr (*"Not all elements could be created.**\n**"*);
      *return *-1;
  }

   gst_bin_add_many (GST_BIN (pipeline), source, converter, scaler, encoder, payloader, sink,   NULL);
*   if *((gst_element_link (source, converter) && link_elements_with_filter(converter, scaler)
                                          && gst_element_link (converter, encoder)
                                          && gst_element_link (encoder, payloader)
                                          && gst_element_link (payloader, sink)) != TRUE) {
    g_printerr (*"Elements could not be linked.**\n**"*);
    gst_object_unref (pipeline);
    *return *-1;
}

(...)

When I run this code, I get the following:
** (gst_server:55698): WARNING **: 11:21:57.315: Failed to link element1 and element2!
Elements could not be linked.
Process finished with exit code 255

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? 
Thanks.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/gstreamer-devel/attachments/20190715/7b596d12/attachment-0001.html>


More information about the gstreamer-devel mailing list