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