Can't connect nvh264enc to webrtcsink
I have a webrtcsink element that I am adding a nvh264enc encoder to via the "encoder-setup" signal.
I see vram being used by the program in nvidia-smi
and I see an encoder session being created, however the encoder session shows 0, 0 for fps and latency
# GPU Session Process Codec H V Average Average
# Idx Id Id Type Res Res FPS Latency(us)
0 9 623032 H.264 480 304 0 0
I also know that it isn't using the nvh264enc encoder because changing the bitrate and max-bitrate does nothing to the bandwidth usage observed via nload
I am using HEAD of gst-plugins-rs and I've tried using both 1.22.10 and 1.23.90 for nvcodec.
I am running this in a podman container and I'm 99% sure I've set up the nvidia container stuff up correct since if I don't, nvidia-smi
complains if I try to run it in the container.
Here are the relevant snippets of my code. Any help would be greatly appreciated :)
// main
///////
g_object_set(G_OBJECT(webrtcsink), "meta",
gst_structure_from_string(("meta,name=" + webrtc_stream_id).c_str(), nullptr), nullptr);
GstCaps* webrtcsink_caps = gst_caps_from_string("video/x-h264,stream-format=byte-stream,alignment=au");
g_object_set(G_OBJECT(webrtcsink), "video-caps", webrtcsink_caps, nullptr);
gst_caps_unref(webrtcsink_caps);
g_object_set(G_OBJECT(webrtcsink), "congestion-control", 0, nullptr);
//g_object_set(G_OBJECT(webrtcsink), "max-bitrate", 2048000, nullptr);
g_signal_connect(webrtcsink, "encoder-setup", G_CALLBACK(EncoderSetupCallback), nullptr);
// pipeline
///////////
src -> watchdog -> bayer2rgb -> videorate -> videorate_capsfilter -> videoconvert -> queue -> webrtcsink
// callback
///////////
gboolean EncoderSetupCallback(GstElement* webrtcsink, gchararray arg0, gchararray arg1,
GstElement* encoder, gpointer udata) {
if (!GST_IS_ELEMENT(webrtcsink) || !arg0 || !arg1 || !GST_IS_ELEMENT(encoder)) {
g_warning("Invalid arguments received in EncoderSetupCallback.");
return false;
}
// Create an instance of the nvh264enc encoder.
encoder = gst_element_factory_make("nvh264enc", "nvh264enc");
if (encoder == nullptr || !GST_IS_ELEMENT(encoder)) {
g_warning("Failed to create nvh264enc encoder.");
return false;
}
g_warning("Created nvh264enc encoder.");
g_object_set(G_OBJECT(encoder), "preset", 3, nullptr);
g_object_set(G_OBJECT(encoder), "bitrate", 2048, nullptr);
g_object_set(G_OBJECT(encoder), "max-bitrate", 2048, nullptr);
g_object_set(G_OBJECT(encoder), "rc-mode", 3, nullptr);
return encoder != nullptr;
}