I’m trying to modify the deepstream_test1_app.c to save the output of nvosd to a file (.h264 or mp4), I have tried with few pipelines but have not got a playable output file.
My last attempt has been:
gst_element_link_many(source, h264parser, decoder, pgie, filter1, nvvidconv,
filter2, nvosd, converter, filter3, qtmux, sink, NULL);
filter3 === “video/x-h264”
When I try this pipeline the app executes correctly but, it hangs after the detection is printed out since the app never finishes cleanly I interrupt with ctrl-c and the output file is there but has no bytes.
Any help is greatly appreciated.
This is the diff between the original code provided in the sdk and my current code (I can provide the full code if needed):
diff --git a/sources/apps/deepstream-test1/deepstream_test1_app.c b/sources/apps/deepstream-test1/deepstream_test1_app.c
index 94787b7…0e72a87 100644
— a/sources/apps/deepstream-test1/deepstream_test1_app.c
+++ b/sources/apps/deepstream-test1/deepstream_test1_app.c
@@ -150,18 +150,26 @@ static gboolean bus_call(GstBus * bus, GstMessage * msg, gpointer data) {
int main(int argc, char *argv) {
GMainLoop *loop = NULL;
- GstElement *pipeline = NULL, *source = NULL, *h264parser = NULL, *decoder =
-
NULL, *sink = NULL, *pgie = NULL, *nvvidconv = NULL, *nvosd = NULL,
-
*filter1 = NULL, *filter2 = NULL;
- GstElement *pipeline = NULL;
- GstElement *source = NULL, *h264parser = NULL, *decoder = NULL,
-
*pgie = NULL, *nvvidconv = NULL, *nvosd = NULL, *sink = NULL;
- GstElement *filter1 = NULL, *filter2 = NULL, *filter3 = NULL;
- GstElement *qtmux = NULL, *converter = NULL;
- GstBus *bus = NULL;
guint bus_watch_id;
- GstCaps *caps1 = NULL, *caps2 = NULL;
-
GstCaps *caps1 = NULL, *caps2 = NULL, *caps3 = NULL;
-
;
gulong osd_probe_id = 0;
GstPad *osd_sink_pad = NULL;/* Check input arguments */
- if (argc != 2) {
-
g_printerr("Usage: %s <H264 filename>\n", argv[0]);
- if (argc != 3) {
-
g_printerr("Usage: %s <H264 input filename> <output filename>\n",
-
}argv[0]); return -1;
@@ -193,15 +201,24 @@ int main(int argc, char argv[]) {
/ Create OSD to draw on the converted RGBA buffer */
nvosd = gst_element_factory_make(“nvosd”, “nv-onscreendisplay”);
- /* Finally render the osd output */
- sink = gst_element_factory_make(“nveglglessink”, “nvvideo-renderer”);
-
/* Creating the converter to switch back to UYVY */
-
converter = gst_element_factory_make(“videoconvert”, “videoconverter”);
-
/* Creating the mp4 mux */
-
qtmux = gst_element_factory_make(“qtmux”, “mux”);
-
/* Finally save the file */
-
sink = gst_element_factory_make(“filesink”, “save-file”);
/* caps filter for nvvidconv to convert NV12 to RGBA as nvosd expects input
- in RGBA format */
filter1 = gst_element_factory_make(“capsfilter”, “filter1”);
filter2 = gst_element_factory_make(“capsfilter”, “filter2”);
- in RGBA format */
-
filter3 = gst_element_factory_make(“capsfilter”, “filter3”);
-
if (!pipeline || !source || !h264parser || !decoder || !pgie || !filter1
-
|| !nvvidconv || !filter2 || !nvosd || !sink) {
-
|| !nvvidconv || !filter2 || !nvosd || !converter || !filter3
-
|| !qtmux || !sink) { g_printerr("One element could not be created. Exiting.\n"); return -1;
}
@@ -209,6 +226,9 @@ int main(int argc, char argv[]) {
/ we set the input filename to the source element */
g_object_set(G_OBJECT(source), “location”, argv[1], NULL); -
/* we set the output filename to the source element */
-
g_object_set(G_OBJECT(sink), “location”, argv[2], NULL);
-
/* Set all the necessary properties of the nvinfer element,
- the necessary ones are : */
g_object_set(G_OBJECT(pgie), “config-file-path”, “dstest1_pgie_config.txt”,
@@ -225,19 +245,26 @@ int main(int argc, char argv[]) {
/ Set up the pipeline /
/ we add all elements into the pipeline */
gst_bin_add_many(GST_BIN(pipeline), source, h264parser, decoder, pgie,
- the necessary ones are : */
-
filter1, nvvidconv, filter2, nvosd, sink, NULL);
-
filter1, nvvidconv, filter2, nvosd, converter, filter3, qtmux, sink,
-
NULL);
-
caps1 = gst_caps_from_string(“video/x-raw(memory:NVMM), format=NV12”);
g_object_set(G_OBJECT(filter1), “caps”, caps1, NULL);
gst_caps_unref(caps1); -
caps2 = gst_caps_from_string(“video/x-raw(memory:NVMM), format=RGBA”);
g_object_set(G_OBJECT(filter2), “caps”, caps2, NULL);
gst_caps_unref(caps2); -
caps3 = gst_caps_from_string(“video/x-h264”);
-
g_object_set(G_OBJECT(filter3), “caps”, caps3, NULL);
-
gst_caps_unref(caps3);
-
/* we link the elements together /
/ file-source → h264-parser → nvh264-decoder →- nvinfer → filter1 → nvvidconv → filter2 → nvosd → video-renderer */
gst_element_link_many(source, h264parser, decoder, pgie, filter1, nvvidconv,
- nvinfer → filter1 → nvvidconv → filter2 → nvosd → video-renderer */
-
filter2, nvosd, sink, NULL);
-
filter2, nvosd, converter, filter3, qtmux, sink, NULL);
/* Lets add probe to get informed of the meta data generated, we add probe to
- the sink pad of the osd element, since by that time, the buffer would have