Using caps on videoscale element in the C API

Josh Doe josh at joshdoe.com
Mon Jul 15 11:06:11 UTC 2019


On Mon, Jul 15, 2019 at 5:31 AM Serhan Gül <serhan at fastmail.com> wrote:
>
> 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.

If the video from ximagesrc isn't already 640x480, then this will
fail. You need to filter the caps after videoscale if you want to
scale it to 640x480.


More information about the gstreamer-devel mailing list