d3d11videosink: set_render_rectangle not working
Hi,
I've been trying for a few days to connect GStreamer with the Flutter framework.
The code using GStreamer is written in Rust.
With the help of set_window_handle
, I managed to pin the VideoOverlay
to the Flutter window. Unfortunately, it displays full screen every time. I tried set_render_rectangle
, but it doesn't do anything.
I wonder where the problem lies? Is it flutter's fault or something else?
Below is the code I'm using on the GStreamer side and the video.
Click to expand code
fn main_loop(uri: &str, hwnd: &u32) -> Result<(), Error> {
println!("Handler:");
println!("{hwnd}");
println!("====");
gstreamer::init()?;
let main_loop = glib::MainLoop::new(None, false);
let videosink = gstreamer::ElementFactory::make("d3d11videosink")
.property("emit-present", true)
.property_from_str("display-format", "DXGI_FORMAT_B8G8R8A8_UNORM")
.build()
.unwrap();
let playbin = gstreamer::ElementFactory::make("playbin")
.property("uri", uri)
.property("video-sink", &videosink)
.build()
.unwrap();
let video_overlay: gstreamer_video::VideoOverlay = playbin
.clone()
.dynamic_cast::<gstreamer_video::VideoOverlay>()
.unwrap();
let hwnd_usize = usize::try_from(hwnd.clone()).unwrap();
unsafe {
video_overlay.set_window_handle(hwnd_usize);
}
video_overlay
.set_render_rectangle(50, 50, 200, 200)
.unwrap();
let main_loop_clone = main_loop.clone();
let bus = playbin.bus().unwrap();
let _bus_watch = bus
.add_watch(move |_, msg| {
use gstreamer::MessageView;
let main_loop = &main_loop_clone;
match msg.view() {
MessageView::Eos(..) => {
println!("received eos");
main_loop.quit()
}
MessageView::Error(err) => {
println!(
"Error from {:?}: {} ({:?})",
err.src().map(|s| s.path_string()),
err.error(),
err.debug()
);
main_loop.quit();
}
_ => (),
};
glib::Continue(true)
})
.unwrap();
match playbin.set_state(gstreamer::State::Playing) {
Ok(_) => {}
Err(e) => {
println!("Not good");
}
}
main_loop.run();
playbin.set_state(gstreamer::State::Null).unwrap();
Ok(())
}