110 lines
4.0 KiB
C++
110 lines
4.0 KiB
C++
#include "sink_manager.hpp"
|
|
|
|
#define SET_GPU_ID(object, gpu_id) \
|
|
g_object_set(G_OBJECT(object), "gpu-id", gpu_id, NULL);
|
|
#define GPU_ID 0
|
|
|
|
using json = nlohmann::json;
|
|
|
|
SinkManager::SinkManager() {
|
|
json j;
|
|
std::ifstream i("../data/configuration.json");
|
|
i >> j;
|
|
j.at("output_video_path").get_to(output_video_path);
|
|
j.at("display_output").get_to(display_output);
|
|
}
|
|
|
|
bool SinkManager::create_sink(cudaDeviceProp prop) {
|
|
if (display_output == 0) {
|
|
output_sink = "fake_sink";
|
|
sink = gst_element_factory_make("fakesink", "nvvideo-renderer");
|
|
g_object_set(G_OBJECT(sink), "name", "fakesink", "qos", 0, "sync",
|
|
FALSE, NULL);
|
|
} else if (display_output == 1) {
|
|
output_sink = "displaying_window";
|
|
sink = gst_element_factory_make("nveglglessink", "nvvideo-renderer");
|
|
g_object_set(G_OBJECT(sink), "sync", FALSE, NULL);
|
|
g_object_set(G_OBJECT(sink), "qos", 0, NULL);
|
|
} else if (display_output == 2) {
|
|
output_sink = "to_vido_file";
|
|
sink = gst_element_factory_make("nvvideoencfilesinkbin",
|
|
"nvvideo-renderer");
|
|
g_object_set(G_OBJECT(sink), "container", 2, "output-file",
|
|
output_video_path.c_str(), NULL);
|
|
g_object_set(G_OBJECT(sink), "name", "nvvideoencfilesinkbin", "qos", 0,
|
|
"sync", FALSE, NULL);
|
|
} else if (display_output == 3) {
|
|
output_sink = "to_rtsp";
|
|
nvvidconv_postosd =
|
|
gst_element_factory_make("nvvideoconvert", "convertor_postosd");
|
|
if (!nvvidconv_postosd) {
|
|
g_printerr("Unable to create nvvidconv_postosd.\n");
|
|
return false;
|
|
}
|
|
|
|
// Create a caps filter
|
|
caps = gst_element_factory_make("capsfilter", "filter");
|
|
g_object_set(
|
|
caps, "caps",
|
|
gst_caps_from_string("video/x-raw(memory:NVMM), format=I420"),
|
|
NULL);
|
|
if (!caps) {
|
|
g_printerr("Unable to create caps. Exiting.\n");
|
|
return false;
|
|
}
|
|
|
|
// Make the encoder
|
|
if (!strcmp(codec.c_str(), "H264")) {
|
|
encoder = gst_element_factory_make("nvv4l2h264enc", "encoder");
|
|
g_printerr("Creating H264 Encoder.\n");
|
|
} else if (!strcmp(codec.c_str(), "H265")) {
|
|
encoder = gst_element_factory_make("nvv4l2h265enc", "encoder");
|
|
g_printerr("Creating H265 Encoder.\n");
|
|
} else {
|
|
g_printerr(
|
|
"RTSP Streaming Codec should be H264/H265 , "
|
|
"default=H264. Exiting.\n");
|
|
return false;
|
|
}
|
|
g_object_set(encoder, "bitrate", bitrate, NULL);
|
|
if (!encoder) {
|
|
g_printerr("Unable to create encoder. Exiting.\n");
|
|
return false;
|
|
}
|
|
|
|
// Make the payload-encode video into RTP packets
|
|
if (!strcmp(codec.c_str(), "H264")) {
|
|
rtppay = gst_element_factory_make("rtph264pay", "rtppay");
|
|
g_printerr("Creating H264 rtppay.\n");
|
|
} else if (!strcmp(codec.c_str(), "H265")) {
|
|
rtppay = gst_element_factory_make("rtph265pay", "rtppay");
|
|
g_printerr("Creating H265 rtppay.\n");
|
|
}
|
|
if (!rtppay) {
|
|
g_printerr("Unable to create rtppay. Exiting.\n");
|
|
return false;
|
|
}
|
|
|
|
// Make the UDP sink
|
|
sink = gst_element_factory_make("udpsink", "udpsink");
|
|
g_object_set(G_OBJECT(sink), "host", host.c_str(), NULL);
|
|
g_object_set(G_OBJECT(sink), "port", updsink_port_num, NULL);
|
|
g_object_set(G_OBJECT(sink), "async", FALSE, NULL);
|
|
g_object_set(G_OBJECT(sink), "sync", 1, NULL);
|
|
|
|
if (!sink) {
|
|
g_printerr("Unable to create udpsink. Exiting.\n");
|
|
return false;
|
|
}
|
|
}
|
|
|
|
if (!prop.integrated && display_output < 3) {
|
|
SET_GPU_ID(sink, GPU_ID);
|
|
}
|
|
|
|
if (!sink) {
|
|
g_printerr("Could not create sink. Exiting.\n");
|
|
return false;
|
|
}
|
|
return true;
|
|
} |