Using caps on videoscale element in the C API

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

Using caps on videoscale element in the C API

chronosynchlastic
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.



_______________________________________________
gstreamer-devel mailing list
[hidden email]
https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
Reply | Threaded
Open this post in threaded view
|

Re: Using caps on videoscale element in the C API

chronosynchlastic
Sorry, there is an error, the following part should be corrected as:

   if ((gst_element_link (source, converter) && link_elements_with_filter(converter, scaler)
                                          && gst_element_link (scaler, encoder)
                                          && gst_element_link (encoder, payloader)
                                          && gst_element_link (payloader, sink)) != TRUE) {

I still get the same error though.

On Mon, Jul 15, 2019, at 11:31 AM, Serhan Gül 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.


_______________________________________________
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
Reply | Threaded
Open this post in threaded view
|

Re: Using caps on videoscale element in the C API

Josh Doe
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
Reply | Threaded
Open this post in threaded view
|

Re: Using caps on videoscale element in the C API

chronosynchlastic
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