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:
int main(int argc, char *argv[]) { (...)
(...) 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. _______________________________________________ gstreamer-devel mailing list [hidden email] https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel |
Sorry, there is an error, the following part should be corrected as:
I still get the same error though. On Mon, Jul 15, 2019, at 11:31 AM, Serhan Gül wrote:
_______________________________________________ gstreamer-devel mailing list [hidden email] https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel |
In reply to this post by chronosynchlastic
On Mon, Jul 15, 2019 at 5:31 AM Serhan Gül <[hidden email]> 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. _______________________________________________ gstreamer-devel mailing list [hidden email] https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel |
Thanks, this solved my issue! The video I'm getting from ximagesrc is not 640x480 but it is the actual size of that window. My problem was solved when I linked the videoscale and nvh264enc element with a filter (instead of putting the filter between videoconvert and videoscale elmenets) . So I changed the relevant part of the code as follows: if ((gst_element_link (source, converter) && gst_element_link(converter, scaler) && link_elements_with_filter (scaler, 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; } -- Serhan Gül On Mon, Jul 15, 2019, at 1:06 PM, Josh Doe wrote: > On Mon, Jul 15, 2019 at 5:31 AM Serhan Gül <[hidden email]> 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. > _______________________________________________ > gstreamer-devel mailing list > https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel _______________________________________________ gstreamer-devel mailing list [hidden email] https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel |
Free forum by Nabble | Edit this page |