I am trying to create this pipeline:
appsrc(rgb jpeg) -> nvvidconv -> capsfilter(video/x-raw(memory:NVMM), format=(string)RGBA) -> nvstreammux -> nvinfer -> nvjpegenc -> appsink.
But for some reason I cannot link streammux to capsfilter and nvinfer.
Below is the code:
pipelineData.pipeline = gst_pipeline_new ("rtsp-pipeline");
pipelineData.source = gst_element_factory_make ("appsrc", "source");
pipelineData.convert = gst_element_factory_make ("nvvidconv", "videoconvert");
pipelineData.capsfilter = gst_element_factory_make ("capsfilter", "capsfilter");
pipelineData.nvstreammux = gst_element_factory_make ("nvstreammux", "nvstreammux");
pipelineData.nvinfer = gst_element_factory_make ("nvinfer", "nvinfer");
pipelineData.jpegenc = gst_element_factory_make ("nvjpegenc", "nvjpegenc");
pipelineData.sink = gst_element_factory_make ("appsink", "sink");
if (!pipelineData.source || !pipelineData.convert || !pipelineData.capsfilter ||
!pipelineData.nvstreammux || !pipelineData.nvinfer || !pipelineData.jpegenc || !pipelineData.sink) {
std::cout << " Pipelines could not be created " << std::endl;
terminate = TRUE;
}
GstCaps *caps = gst_caps_from_string(âvideo/x-raw(memory:NVMM), format=(string)RGBAâ);
g_object_set (G_OBJECT (pipelineData.capsfilter), âcapsâ, caps, NULL);
gst_bin_add_many (GST_BIN (pipelineData.pipeline), pipelineData.source , pipelineData.convert, pipelineData.capsfilter, pipelineData.nvstreammux, pipelineData.nvinfer, pipelineData.jpegenc, pipelineData.sink, NULL);
if (!gst_element_link_many (pipelineData.source, pipelineData.convert, pipelineData.capsfilter, NULL)) {
std::cout << âElements could not be linked.â <<std::endl;
gst_object_unref (pipelineData.pipeline);
terminate = TRUE;
}
if (!gst_element_link_many (pipelineData.nvstreammux, pipelineData.nvinfer, pipelineData.jpegenc, pipelineData.sink, NULL)) {
std::cout << âElements could not be linked.â <<std::endl;
gst_object_unref (pipelineData.pipeline);
terminate = TRUE;
}
GstPad *streamk_pad = gst_element_get_request_pad (pipelineData.nvstreammux, âsink_0â);
if (!streamk_pad) {
std::cout <<âStreammux request sink pad failed. Exiting.\nâ<<std::endl;
terminate = TRUE;
}
GstPad *caps_pad = gst_element_get_static_pad (pipelineData.capsfilter, "src");
if (!sink_pad) {
std::cout << "sink_pad request sink pad failed. Exiting.\n"<<std::endl;
terminate = TRUE;
}
if (gst_pad_link (caps_pad, streamk_pad) != GST_PAD_LINK_OK) { // Fails here
std::cout << "Failed to link caps_pad to stream muxer. Exiting.\n"<<std::endl;
terminate = TRUE;
}
Any help will be appreciated.
I also tried
g_signal_connect (pipelineData.capsfilter, âpad-addedâ, G_CALLBACK (pad_added_handler), &pipelineData);
but it never gets fired.