You may try something like (I don’t know your camera format, used YUY2 here):
#include <stdbool.h>
#include <gst/gst.h>
static GMainLoop *loop;
gint
main (gint argc,
gchar *argv[])
{
GstElement *pipeline, *vidsrc, *conv, *enc, *mux, *pay, *udpsink;
GstCaps *vidsrc2conv_caps, *conv2enc_caps, *enc2mux_caps, *mux2pay_caps, *pay2udp_caps;
/* init GStreamer */
gst_init (&argc, &argv);
loop = g_main_loop_new (NULL, FALSE);
/* setup pipeline */
pipeline = gst_pipeline_new ("pipeline");
vidsrc = gst_element_factory_make ("v4l2src", "vidsrc");
g_object_set (G_OBJECT (vidsrc), "device", "/dev/video8", NULL);
g_object_set (G_OBJECT (vidsrc), "io-mode", 2, NULL);
vidsrc2conv_caps = gst_caps_from_string("video/x-raw, width=(int)1920, height=(int)1080, framerate=(fraction)25/1, format=(string)YUY2");
conv = gst_element_factory_make ("nvvidconv", "conv");
conv2enc_caps = gst_caps_from_string("video/x-raw(memory:NVMM), width=(int)1920, height=(int)1080, format=(string)NV12");
enc = gst_element_factory_make ("nvv4l2h264enc", "enc");
g_object_set (G_OBJECT (enc), "insert-sps-pps", true, NULL);
g_object_set (G_OBJECT (enc), "insert-vui", true, NULL);
g_object_set (G_OBJECT (enc), "idrinterval", 25, NULL);
enc2mux_caps = gst_caps_from_string("video/x-h264, stream-format=(string)byte-stream, alignment=(string)au, width=(int)1920, height=(int)1080, pixel-aspect-ratio=(fraction)1/1, framerate=(fraction)25/1");
mux = gst_element_factory_make ("mpegtsmux", "mux");
mux2pay_caps = gst_caps_from_string("video/mpegts, systemstream=(boolean)true, packetsize=(int)188");
pay = gst_element_factory_make ("rtpmp2tpay", "pay");
pay2udp_caps = gst_caps_from_string("application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)MP2T, payload=(int)33");
udpsink = gst_element_factory_make ("udpsink", "udpsink");
g_object_set (G_OBJECT (udpsink), "host", "10.0.3.30", NULL);
g_object_set (G_OBJECT (udpsink), "port", 11002, NULL);
g_object_set (G_OBJECT (udpsink), "auto-multicast", false, NULL);
gst_bin_add_many (GST_BIN (pipeline), vidsrc, conv, enc, mux, pay, udpsink, NULL);
if (!gst_element_link_filtered(vidsrc, conv, vidsrc2conv_caps)) {
g_printerr("Fail to gst_element_link_filtered vidsrc -> conv\n");
return -1;
}
if (!gst_element_link_filtered(conv, enc, conv2enc_caps)) {
g_printerr("Fail to gst_element_link_filtered conv -> enc\n");
return -1;
}
if (!gst_element_link_filtered(enc, mux, enc2mux_caps)) {
g_printerr("Fail to gst_element_link_filtered enc -> mux\n");
return -1;
}
if (!gst_element_link_filtered(mux, pay, mux2pay_caps)) {
g_printerr("Fail to gst_element_link_filtered mux -> pay\n");
return -1;
}
if (!gst_element_link_filtered(pay, udpsink, pay2udp_caps)) {
g_printerr("Fail to gst_element_link_filtered pay -> udpsink\n");
return -1;
}
/* Ok, pipeline successfully created */
/* This will output details of pipeline going to play */
g_signal_connect(pipeline, "deep-notify", G_CALLBACK(gst_object_default_deep_notify), NULL);
/* Set pipeline playing */
gst_element_set_state (pipeline, GST_STATE_PLAYING);
g_main_loop_run (loop);
/* Clean up */
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_object_unref (GST_OBJECT (pipeline));
g_main_loop_unref (loop);
return 0;
}