gst_init(&argc, &argv);
loop = g_main_loop_new(NULL, FALSE);
pipeline = gst_pipeline_new("demo-pipeline");
source = gst_element_factory_make("filesrc", "file-source");
h264parser = gst_element_factory_make("h264parse", "h264parser");
decoder = gst_element_factory_make ("nvv4l2decoder", "nvv4l2-decoder");
streammux = gst_element_factory_make("nvstreammux", "stream-muxer");
pgie = gst_element_factory_make("nvinfer", "primary-nvinference-engine");
nvvidconv = gst_element_factory_make("nvvideoconvert", "nvvideo-converter->RGBA");
nvosd = gst_element_factory_make("nvdsosd", "nv-onscreendisplay");
queue1 = gst_element_factory_make("queue", "queue1");
nvvidconv2 = gst_element_factory_make("nvvideoconvert", "nvvideo-converter->NV12");
filter1 = gst_element_factory_make("capsfilter", "capsfilter-NV12");
caps1 = gst_caps_from_string ("video/x-raw(memory:NVMM), format=I420");
g_object_set (G_OBJECT (filter1), "caps", caps1, NULL);
gst_caps_unref (caps1);
sink = gst_element_factory_make("fakesink", "fakesink");
encoder = gst_element_factory_make("nvv412h264enc", "nvv412-encoder");
h264parser2 = gst_element_factory_make("h264parse", "h264parse2");
qtmux = gst_element_factory_make("MP4mux", "muxer");
if(!qtmux){
g_printerr("Unable to create code parser\n");
}
g_object_set(G_OBJECT(source), "location", input_files[0], NULL);
g_object_set(G_OBJECT(streammux), "width", 1920, "height", 1080,
"batch-size",1, "batched-push-timeout",4000000,NULL);
g_object_set(G_OBJECT(pgie), "config-file-path", "./config/dstest2_pgie_config.txt",
"unique-id", 1, NULL);
g_object_set (G_OBJECT (sink), "location", "out.mp4", "sync", 1,NULL);
g_object_set(G_OBJECT(encoder), "bitrate", 2000000, NULL);
bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));
bus_watch_id = gst_bus_add_watch(bus, bus_call, loop);
gst_object_unref(bus);
gst_bin_add_many(GST_BIN(pipeline),
source, h264parser, decoder, streammux, nvvidconv, nvosd, queue1, nvvidconv2, filter1, encoder, h264parser2,qtmux,sink, NULL);
gchar pad_name_sink[16] = "sink_0";
gchar pad_name_src[16] = "src";
sinkpad = gst_element_get_request_pad(streammux, pad_name_sink);
if (!sinkpad){
g_printerr ("Streammux request sink pad failed. Exiting.\n");
return -1;
}
srcpad = gst_element_get_static_pad(decoder, pad_name_src);
if (!srcpad){
g_printerr ("Decoder request src pad failed. Exiting.\n");
}
if (gst_pad_link(srcpad, sinkpad) != GST_PAD_LINK_OK){
g_printerr ("Failed to link decoder to stream muxer. Exiting.\n");
return -1;
}
gst_object_unref(sinkpad);
gst_object_unref(srcpad);
if (!gst_element_link_many(source, h264parser, decoder, NULL)){
g_printerr ("Elements could not be linked: 1. Exiting.\n");
return -1;
}
if (!gst_element_link_many(streammux, nvvidconv, nvosd, queue1, nvvidconv2, filter1, encoder, h264parser2, qtmux,sink, NULL)){
g_printerr ("Elements could not be linked: 2. Exiting.\n");
return -1;
}
osd_sink_pad = gst_element_get_static_pad(sink, "sink");
if (!osd_sink_pad)
g_print("Unable to get sink pad\n");
else
gst_pad_add_probe(osd_sink_pad, GST_PAD_PROBE_TYPE_BUFFER, osd_sink_pad_buffer_probe, NULL, NULL);