Trying translate working gst-launch command to the API

Kelly Wiles rkwiles at twc.com
Sun Aug 23 19:12:44 UTC 2020


I am getting a segment fault when I try and convert the following, which 
works into the C API.

gst-launch-1.0 -e -v v4l2src ! 
'video/x-raw,width=1280,height=720,framerate=30/1,format=UYVY' ! tee 
name=t ! queue ! v4l2h264enc 
extra-controls="controls,h264_profile=4,h264_level=10,video_bitrate=500000;" 
! h264parse ! filesink location=foo1.h264 t. ! queue ! v4l2h264enc 
extra-controls="controls,h264_profile=4,h264_level=10,video_bitrate=2000000;" 
! h264parse ! filesink location=foo2.h264

I run the v4l2-ctl commands before executing the gst command.

v4l2-ctl --set-edid=file=edid5.txt --fix-edid-checksums
v4l2-ctl -v pixelformat=UYVY
v4l2-ctl --set-dv-bt-timings query

The edid5.txt is.

00,FF,FF,FF,FF,FF,FF,00,52,62,88,88,00,88,88,88,1C,15,01,03,80,00,00,78,0A,EE,91,A3,54,4C,99,26,0F,50,54,00,00,00,01,01,01,01,01,0
1,01,01,01,01,01,01,01,01,01,01,01,1D,00,72,51,D0,1E,20,6E,28,55,00,C4,8E,21,00,00,1E,8C,0A,D0,8A,20,E0,2D,10,10,3E,96,00,13,8E,21
,00,00,1E,00,00,00,FC,00,54,6F,73,68,69,62,61,2D,48,32,43,0A,20,00,00,00,FD,00,3B,3D,0F,2E,0F,00,0A,20,20,20,20,20,20,01,6D,02,03,
21,41,4D,84,13,03,02,12,11,01,20,21,22,3C,3D,3E,23,09,07,07,66,03,0C,00,30,00,80,E3,00,7F,8C,8C,0A,D0,8A,20,E0,2D,10,10,3E,96,00,C
4,8E,21,00,00,18,8C,0A,D0,8A,20,E0,2D,10,10,3E,96,00,13,8E,21,00,00,18,8C,0A,A0,14,51,F0,16,00,26,7C,43,00,13,8E,21,00,00,98,00,00
,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,BE

When I run this code it crashes with a segment fault on the g_object_set 
function.

#include <gst/gst.h>
#include <stdio.h>

// gst-launch-1.0 -e -v v4l2src ! 
'video/x-raw,width=1280,height=720,framerate=30/1,format=UYVY' ! tee 
name=t ! queue ! v4l2h264enc 
extra-controls="controls,h264_profile=4,h264_level=10,video_bitrate=500000;" 
! h264parse ! filesink location=foo1.h264 t. ! queue ! v4l2h264enc 
extra-controls="controls,h264_profile=4,h264_level=10,video_bitrate=2000000;" 
! h264parse ! filesink location=foo2.h264

typedef struct _App {
         GstElement *pipeline;
         GstElement *appsrc;

         GMainLoop *loop;
         guint sourceid;

         GTimer *timer;
} App;

App app;

gint main(gint argc, gchar *argv[]) {

         GstElement *src, *split, *enc1, *enc2, *f1, *f2, *h1, *h2, *q1, 
*q2;
         GstCaps *filtercaps;
         GstCaps *enccaps;

         gst_init(&argc, &argv);

         app.loop = g_main_loop_new(NULL, FALSE);

         app.pipeline = gst_pipeline_new("my-pipeline");

         src = gst_element_factory_make("v4l2src", "src");
         split = gst_element_factory_make("tee", "split");
         h1 = gst_element_factory_make("h264parse", "h1");
         h2 = gst_element_factory_make("h264parse", "h2");
         q1 = gst_element_factory_make("queue", "q1");
         q2 = gst_element_factory_make("queue", "q2");
         enc1 = gst_element_factory_make("v4l2h264enc", "enc1");
         enc2 = gst_element_factory_make("v4l2h264enc", "enc2");
         f1 = gst_element_factory_make("filesink", "f1");
         f2 = gst_element_factory_make("filesink", "f2");

         if (!app.pipeline || !src || !split || !enc1 || !enc2 || !f1 || 
!f2 || !h1 || !h2 || !q1 || !q2) {
                 g_error ("Could not create 
elements\npip=%p\nsrc=%p\nsplit=%p\nenc1=%p\nenc2=%p\nf1=%p\nf2=%p\nh1=%p\nh2=%p\nq1=%p\nq2=%p",
                                 app.pipeline, src, split, enc1, enc2, 
f1, f2, h1, h2, q1, q2);
                 return -1;
         }

         g_object_set(f1, "location", "foo1.h264", NULL);
         g_object_set(f2, "location", "foo2.h264", NULL);

         fprintf(stderr, "Here 1\n");
         // g_object_set(enc1, "extra-controls", 
"controls,h264_profile=4,h264_level=10,video_bitrate=500000;", NULL);
         enccaps = gst_caps_new_simple ("controls",
                         "h264_profile", G_TYPE_INT, 4,
                         "h264_level", G_TYPE_INT, 10,
                         "video_bitrate", G_TYPE_INT, 500000,
                         NULL);
         g_object_set (G_OBJECT (enc1), "extra-controls", enccaps, NULL);
         fprintf(stderr, "Here 2\n");
         g_object_set(enc2, "extra-controls", 
"controls,h264_profile=4,h264_level=10,video_bitrate=2000000;", NULL);
         fprintf(stderr, "Here 3\n");

         gst_bin_add_many(GST_BIN(app.pipeline), src, split, q1, enc1, 
h1, f1, q2, enc2, h2, f2, NULL);

         if (!gst_element_link_many(src, split, NULL)
                 || !gst_element_link_many(split, q1, enc1, h1, f1, NULL)
                 || !gst_element_link_many(split, q2, enc2, h2, f2, NULL)) {
                 g_error("Failed to link elements ...");
                 return -2;
         }

         filtercaps = gst_caps_new_simple ("video/x-raw",
                "format", G_TYPE_STRING, "UYVY",
                "width", G_TYPE_INT, 1280,
                "height", G_TYPE_INT, 720,
                "framerate", GST_TYPE_FRACTION, 30, 1,
                NULL);
         g_object_set (G_OBJECT (src), "caps", filtercaps, NULL);
         gst_caps_unref (filtercaps);

         gst_element_set_state (app.pipeline, GST_STATE_PLAYING);

         if (gst_element_get_state (app.pipeline, NULL, NULL, -1) == 
GST_STATE_CHANGE_FAILURE) {
                 g_error ("Failed to go into PLAYING state");
         }

         g_print ("Running ...\n");
         g_main_loop_run (app.loop);

         /* exit */
         gst_element_set_state (app.pipeline, GST_STATE_NULL);
         gst_object_unref (app.pipeline);

         return 0;
}

The 'Here 1' prints then it dies, can any one help me to understand why?

Either method of calling g_object_set fails the same way.

Thanks



-- 
This email has been checked for viruses by AVG.
https://www.avg.com



More information about the gstreamer-devel mailing list