how to use filter in C source?
Nicolas Dufresne
nicolas at ndufresne.ca
Fri Apr 27 11:41:57 UTC 2018
Le vendredi 27 avril 2018 à 00:14 -0700, dhkdlasdnr a écrit :
> Hi.
>
> I try to make some simple gstreamer application.
>
> My pipeline is v4l2src ! video/x-raw, format=YUY2, width=640, height=480,
> framerate=30/1 ! videoconvert ! video/x-raw, format=GRAY8 ! videoconvert !
> ximagesink
>
> That pipeline is well running on gst-launch-1.0.
>
> I tested no filter version pipeline. this v4l2src ! videoconvert !
> ximagesink pipeline.
>
> and That test application working well.
>
> Point is, I don't know how to use filter in C source code. so I try some
> searching to use filter.
>
> and I make this code
>
> #include <string.h>
> #include <gst/gst.h>
> #include <signal.h>
> #include <unistd.h>
> #include <stdlib.h>
>
> GMainLoop *loop;
> GstElement *pipeline, *src, *conv, *sink;
>
> static gboolean link_element_with_filter (GstElement *e1, GstElement *e2)
> {
> gboolean link_ok;
> GstCaps *caps;
>
> caps = gst_caps_new_simple("video/x-raw",
> "format", G_TYPE_STRING, "YUY2",
> "width", G_TYPE_INT, 640,
> "height", G_TYPE_INT, 480,
> "framerate", GST_TYPE_FRACTION, 30, 1,
> NULL);
>
> link_ok = gst_element_link_filtered (e1, e2, caps);
> gst_caps_unref(caps);
>
> if(!link_ok){
> g_warning("Failed to link e1 and e2.\n");
> }
> return link_ok;
> }
>
> static void on_pad_added(GstElement *element, GstPad *pad, gpointer data)
> {
> GstPad *sinkpad;
> GstElement *decoder = (GstElement *) data;
>
> g_print("Dynamic pad created, linking demuxer/decoder\n");
>
> sinkpad = gst_element_get_static_pad(decoder, "sink");
> gst_pad_link(pad, sinkpad);
>
> gst_object_unref(sinkpad);
> }
>
> int main (int argc, char *argv[])
> {
> GstBus *bus;
> gboolean res;
>
> signal(SIGINT, sigintHandler);
> gst_init(&argc, &argv);
>
> loop = g_main_loop_new(NULL, FALSE);
>
> pipeline = gst_pipeline_new("v4l2_test");
> src = gst_element_factory_make("v4l2src", "v4l2src");
> conv = gst_element_factory_make("videoconvert", "converter");
> sink = gst_element_factory_make("ximagesink", "videosink");
> if(!pipeline || !src || !conv || !sink){
> g_error("Failed to create elements.\n");
> return -1;
> }
>
> gst_element_link(src, conv);
> gst_element_link(conv, sink);
You are trying to link unparented GstElement. You need to call
gst_bin_add() prior to linking. Check your return values, this way
you're error won't go un-seen.
>
> g_signal_connect(conv, "pad-added", G_CALLBACK(on_pad_added), sink);
>
> res = link_element_with_filter(src, conv);
Still unparented, and this is your second attempt to link. You can only
link once an element.
>
> gst_bin_add_many(GST_BIN(pipeline), src, conv, sink, NULL);
>
> if(!gst_element_link_many(src, conv, sink, NULL)){
> g_error("Failed to link elements.\n");
> return -2;
> }
>
> bus = gst_pipeline_get_bus(GST_PIPELINE (pipeline));
>
> gst_bus_add_signal_watch(bus);
>
> g_signal_connect(G_OBJECT(bus), "message", G_CALLBACK(message_cb), NULL);
>
> gst_object_unref(GST_OBJECT(bus));
>
> gst_element_set_state(pipeline, GST_STATE_PLAYING);
>
> g_print("Starting loop.\n");
>
> g_main_loop_run(loop);
>
> return 0;
> }
>
> but this code not work. when execute this code, can't working filter and
> some warning messages.
>
> and then play no filter v4l2src media.
>
> warning message is
> "Gstreamer-CRITICAL **: gst_element_link_pads_filtered: assertion
> 'GST_IS_BIN' (parent) failed'
> "WARNING **: Failed to link e1 and e2."
>
> I know second message's reason, but I don't understand first message.
>
> Please help me.
>
>
>
>
> --
> Sent from: http://gstreamer-devel.966125.n4.nabble.com/
> _______________________________________________
> gstreamer-devel mailing list
> gstreamer-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
More information about the gstreamer-devel
mailing list