webrtcsink: Add support for d3d11 memory and qsvh264enc

Adding d3d11 memory and qsvh264enc support

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-rs/-/merge_requests/1330>
This commit is contained in:
Seungha Yang 2023-09-09 21:39:26 +09:00 committed by Sebastian Dröge
parent 1ec74d8569
commit 938d3d73b9
2 changed files with 24 additions and 3 deletions

View file

@ -5940,7 +5940,7 @@
"presence": "request" "presence": "request"
}, },
"video_%%u": { "video_%%u": {
"caps": "video/x-raw:\n\nvideo/x-raw(memory:CUDAMemory):\n\nvideo/x-raw(memory:GLMemory):\n\nvideo/x-raw(memory:NVMM):\n", "caps": "video/x-raw:\n\nvideo/x-raw(memory:CUDAMemory):\n\nvideo/x-raw(memory:GLMemory):\n\nvideo/x-raw(memory:NVMM):\n\nvideo/x-raw(memory:D3D11Memory):\n",
"direction": "sink", "direction": "sink",
"presence": "request" "presence": "request"
} }

View file

@ -34,6 +34,7 @@ static CAT: Lazy<gst::DebugCategory> = Lazy::new(|| {
const CUDA_MEMORY_FEATURE: &str = "memory:CUDAMemory"; const CUDA_MEMORY_FEATURE: &str = "memory:CUDAMemory";
const GL_MEMORY_FEATURE: &str = "memory:GLMemory"; const GL_MEMORY_FEATURE: &str = "memory:GLMemory";
const NVMM_MEMORY_FEATURE: &str = "memory:NVMM"; const NVMM_MEMORY_FEATURE: &str = "memory:NVMM";
const D3D11_MEMORY_FEATURE: &str = "memory:D3D11Memory";
const RTP_TWCC_URI: &str = const RTP_TWCC_URI: &str =
"http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01"; "http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01";
@ -347,6 +348,14 @@ fn make_converter_for_video_caps(caps: &gst::Caps, codec: &Codec) -> Result<gst:
gst::Element::link_many(&[&queue, &nvconvert])?; gst::Element::link_many(&[&queue, &nvconvert])?;
(queue, nvconvert) (queue, nvconvert)
} else if feature.contains(D3D11_MEMORY_FEATURE) {
let d3d11upload = make_element("d3d11upload", None)?;
let d3d11convert = make_element("d3d11convert", None)?;
ret.add_many(&[&d3d11upload, &d3d11convert])?;
d3d11upload.link(&d3d11convert)?;
(d3d11upload, d3d11convert)
} else if feature.contains(CUDA_MEMORY_FEATURE) { } else if feature.contains(CUDA_MEMORY_FEATURE) {
if let Some(convert_factory) = gst::ElementFactory::find("cudaconvert") { if let Some(convert_factory) = gst::ElementFactory::find("cudaconvert") {
let cudaupload = make_element("cudaupload", None)?; let cudaupload = make_element("cudaupload", None)?;
@ -516,6 +525,13 @@ fn configure_encoder(enc: &gst::Element, start_bitrate: u32) {
enc.set_property_from_str("control-rate", "constant_bitrate"); enc.set_property_from_str("control-rate", "constant_bitrate");
add_nv4l2enc_force_keyunit_workaround(enc); add_nv4l2enc_force_keyunit_workaround(enc);
} }
"qsvh264enc" => {
enc.set_property("bitrate", start_bitrate / 1000);
enc.set_property("gop-size", 2560u32);
enc.set_property("low-latency", true);
enc.set_property("disable-hrd-conformance", true);
enc.set_property_from_str("rate-control", "cbr");
}
_ => (), _ => (),
} }
} }
@ -688,7 +704,7 @@ impl VideoEncoder {
pub fn bitrate(&self) -> i32 { pub fn bitrate(&self) -> i32 {
match self.factory_name.as_str() { match self.factory_name.as_str() {
"vp8enc" | "vp9enc" => self.element.property::<i32>("target-bitrate"), "vp8enc" | "vp9enc" => self.element.property::<i32>("target-bitrate"),
"x264enc" | "nvh264enc" | "vaapih264enc" | "vaapivp8enc" => { "x264enc" | "nvh264enc" | "vaapih264enc" | "vaapivp8enc" | "qsvh264enc" => {
(self.element.property::<u32>("bitrate") * 1000) as i32 (self.element.property::<u32>("bitrate") * 1000) as i32
} }
"nvv4l2h264enc" | "nvv4l2vp8enc" | "nvv4l2vp9enc" => { "nvv4l2h264enc" | "nvv4l2vp8enc" | "nvv4l2vp9enc" => {
@ -715,7 +731,7 @@ impl VideoEncoder {
pub fn set_bitrate(&mut self, element: &super::WebRTCSink, bitrate: i32) { pub fn set_bitrate(&mut self, element: &super::WebRTCSink, bitrate: i32) {
match self.factory_name.as_str() { match self.factory_name.as_str() {
"vp8enc" | "vp9enc" => self.element.set_property("target-bitrate", bitrate), "vp8enc" | "vp9enc" => self.element.set_property("target-bitrate", bitrate),
"x264enc" | "nvh264enc" | "vaapih264enc" | "vaapivp8enc" => self "x264enc" | "nvh264enc" | "vaapih264enc" | "vaapivp8enc" | "qsvh264enc" => self
.element .element
.set_property("bitrate", (bitrate / 1000) as u32), .set_property("bitrate", (bitrate / 1000) as u32),
"nvv4l2h264enc" | "nvv4l2vp8enc" | "nvv4l2vp9enc" => { "nvv4l2h264enc" | "nvv4l2vp8enc" | "nvv4l2vp9enc" => {
@ -2871,7 +2887,12 @@ impl ElementImpl for WebRTCSink {
gst::Structure::builder("video/x-raw").build(), gst::Structure::builder("video/x-raw").build(),
gst::CapsFeatures::new([NVMM_MEMORY_FEATURE]), gst::CapsFeatures::new([NVMM_MEMORY_FEATURE]),
) )
.structure_with_features(
gst::Structure::builder("video/x-raw").build(),
gst::CapsFeatures::new([D3D11_MEMORY_FEATURE]),
)
.build(); .build();
let video_pad_template = gst::PadTemplate::new( let video_pad_template = gst::PadTemplate::new(
"video_%u", "video_%u",
gst::PadDirection::Sink, gst::PadDirection::Sink,