diff options
author | Seungha Yang <seungha@centricular.com> | 2020-12-20 22:12:44 +0900 |
---|---|---|
committer | Tim-Philipp Müller <tim@centricular.com> | 2020-12-23 12:28:43 +0000 |
commit | 13818c24bf5aad2fb5772e665bbc6972cefb3468 (patch) | |
tree | 31fb31ff9ffbdc1655cdfa7e82c0df91dabf33f4 /sys | |
parent | 50df74ce6004add53f6537f95c69fc52eef3653f (diff) | |
download | gstreamer-plugins-bad-13818c24bf5aad2fb5772e665bbc6972cefb3468.tar.gz |
d3d11videosink: Prepare window once streaming started
... instead of READY state. READY state is too early for setting
overlay window handle especially playbin/playsink scenario
since playsink will set given overlay handle on videosink once
READY state change of videosink is ensured.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1905>
Diffstat (limited to 'sys')
-rw-r--r-- | sys/d3d11/gstd3d11videosink.c | 43 |
1 files changed, 32 insertions, 11 deletions
diff --git a/sys/d3d11/gstd3d11videosink.c b/sys/d3d11/gstd3d11videosink.c index 2d36896ab..57d6b6214 100644 --- a/sys/d3d11/gstd3d11videosink.c +++ b/sys/d3d11/gstd3d11videosink.c @@ -94,6 +94,7 @@ static gboolean gst_d3d11_video_sink_unlock_stop (GstBaseSink * sink); static GstFlowReturn gst_d3d11_video_sink_show_frame (GstVideoSink * sink, GstBuffer * buf); +static gboolean gst_d3d11_video_sink_prepare_window (GstD3D11VideoSink * self); #define gst_d3d11_video_sink_parent_class parent_class G_DEFINE_TYPE_WITH_CODE (GstD3D11VideoSink, gst_d3d11_video_sink, @@ -319,6 +320,9 @@ gst_d3d11_video_sink_set_caps (GstBaseSink * sink, GstCaps * caps) GST_DEBUG_OBJECT (self, "set caps %" GST_PTR_FORMAT, caps); + if (!gst_d3d11_video_sink_prepare_window (self)) + goto no_window; + if (!gst_video_info_from_caps (&self->info, caps)) goto invalid_format; @@ -459,6 +463,12 @@ invalid_format: "Could not locate image format from caps %" GST_PTR_FORMAT, caps); return FALSE; } +no_window: + { + GST_ELEMENT_ERROR (sink, RESOURCE, NOT_FOUND, (NULL), + ("Failed to open window.")); + return FALSE; + } no_disp_ratio: { GST_ELEMENT_ERROR (sink, CORE, NEGOTIATION, (NULL), @@ -500,7 +510,6 @@ gst_d3d11_video_sink_start (GstBaseSink * sink) { GstD3D11VideoSink *self = GST_D3D11_VIDEO_SINK (sink); gboolean is_hardware = TRUE; - GstD3D11WindowNativeType window_type = GST_D3D11_WINDOW_NATIVE_TYPE_HWND; GST_DEBUG_OBJECT (self, "Start"); @@ -510,6 +519,25 @@ gst_d3d11_video_sink_start (GstBaseSink * sink) return FALSE; } + g_object_get (self->device, "hardware", &is_hardware, NULL); + if (!is_hardware) { + GST_WARNING_OBJECT (self, "D3D11 device is running on software emulation"); + self->can_convert = FALSE; + } else { + self->can_convert = TRUE; + } + + return TRUE; +} + +static gboolean +gst_d3d11_video_sink_prepare_window (GstD3D11VideoSink * self) +{ + GstD3D11WindowNativeType window_type = GST_D3D11_WINDOW_NATIVE_TYPE_HWND; + + if (self->window) + return TRUE; + if (!self->window_id) gst_video_overlay_prepare_window_handle (GST_VIDEO_OVERLAY (self)); @@ -518,6 +546,8 @@ gst_d3d11_video_sink_start (GstBaseSink * sink) gst_d3d11_window_get_native_type_from_handle (self->window_id); if (window_type != GST_D3D11_WINDOW_NATIVE_TYPE_NONE) { + GST_DEBUG_OBJECT (self, "Have window handle %" G_GUINTPTR_FORMAT, + self->window_id); gst_video_overlay_got_window_handle (GST_VIDEO_OVERLAY (self), self->window_id); } @@ -554,7 +584,7 @@ gst_d3d11_video_sink_start (GstBaseSink * sink) } if (!self->window) { - GST_ERROR_OBJECT (sink, "Cannot create d3d11window"); + GST_ERROR_OBJECT (self, "Cannot create d3d11window"); return FALSE; } @@ -571,15 +601,6 @@ gst_d3d11_video_sink_start (GstBaseSink * sink) g_signal_connect (self->window, "mouse-event", G_CALLBACK (gst_d3d11_video_mouse_key_event), self); - g_object_get (self->device, "hardware", &is_hardware, NULL); - - if (!is_hardware) { - GST_WARNING_OBJECT (self, "D3D11 device is running on software emulation"); - self->can_convert = FALSE; - } else { - self->can_convert = TRUE; - } - return TRUE; } |