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