1*4882a593SmuzhiyunFrom a86f9dcec915d368bb46e311da18f1948493d074 Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Jeffy Chen <jeffy.chen@rock-chips.com> 3*4882a593SmuzhiyunDate: Thu, 9 Jun 2022 12:01:28 +0800 4*4882a593SmuzhiyunSubject: [PATCH 13/14] xvimagesink: Defer prepare window when getting zero 5*4882a593Smuzhiyun window handle 6*4882a593Smuzhiyun 7*4882a593SmuzhiyunThe window might not ready when we requesting it. 8*4882a593Smuzhiyun 9*4882a593SmuzhiyunSigned-off-by: Jeffy Chen <jeffy.chen@rock-chips.com> 10*4882a593Smuzhiyun--- 11*4882a593Smuzhiyun sys/xvimage/xvimagesink.c | 30 +++++++++++++++++------------- 12*4882a593Smuzhiyun sys/xvimage/xvimagesink.h | 2 ++ 13*4882a593Smuzhiyun 2 files changed, 19 insertions(+), 13 deletions(-) 14*4882a593Smuzhiyun 15*4882a593Smuzhiyundiff --git a/sys/xvimage/xvimagesink.c b/sys/xvimage/xvimagesink.c 16*4882a593Smuzhiyunindex 44c98a9..fea70a5 100644 17*4882a593Smuzhiyun--- a/sys/xvimage/xvimagesink.c 18*4882a593Smuzhiyun+++ b/sys/xvimage/xvimagesink.c 19*4882a593Smuzhiyun@@ -424,6 +424,10 @@ gst_xv_image_sink_xvimage_put (GstXvImageSink * xvimagesink, 20*4882a593Smuzhiyun GstVideoRectangle mem_crop; 21*4882a593Smuzhiyun GstXWindow *xwindow; 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun+ /* Ask for window handle */ 24*4882a593Smuzhiyun+ if (G_UNLIKELY (!xvimagesink->xwindow)) 25*4882a593Smuzhiyun+ gst_video_overlay_prepare_window_handle (GST_VIDEO_OVERLAY (xvimagesink)); 26*4882a593Smuzhiyun+ 27*4882a593Smuzhiyun /* We take the flow_lock. If expose is in there we don't want to run 28*4882a593Smuzhiyun concurrently from the data flow thread */ 29*4882a593Smuzhiyun g_mutex_lock (&xvimagesink->flow_lock); 30*4882a593Smuzhiyun@@ -1147,7 +1151,9 @@ gst_xv_image_sink_setcaps (GstBaseSink * bsink, GstCaps * caps) 31*4882a593Smuzhiyun goto no_display_size; 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun g_mutex_lock (&xvimagesink->flow_lock); 34*4882a593Smuzhiyun- if (!xvimagesink->xwindow) { 35*4882a593Smuzhiyun+ if (!xvimagesink->xwindow_id) { 36*4882a593Smuzhiyun+ GST_WARNING_OBJECT (xvimagesink, "overlay window not ready"); 37*4882a593Smuzhiyun+ } else if (!xvimagesink->xwindow) { 38*4882a593Smuzhiyun xvimagesink->xwindow = gst_xv_image_sink_xwindow_new (xvimagesink, 39*4882a593Smuzhiyun GST_VIDEO_SINK_WIDTH (xvimagesink), 40*4882a593Smuzhiyun GST_VIDEO_SINK_HEIGHT (xvimagesink)); 41*4882a593Smuzhiyun@@ -1434,6 +1440,12 @@ invalid_buffer: 42*4882a593Smuzhiyun } 43*4882a593Smuzhiyun no_window: 44*4882a593Smuzhiyun { 45*4882a593Smuzhiyun+ /* HACK: Defer window prepare when getting zero window handle */ 46*4882a593Smuzhiyun+ if (!xvimagesink->xwindow_id) { 47*4882a593Smuzhiyun+ GST_WARNING_OBJECT (xvimagesink, "buffer dropped (window not ready)"); 48*4882a593Smuzhiyun+ goto done; 49*4882a593Smuzhiyun+ } 50*4882a593Smuzhiyun+ 51*4882a593Smuzhiyun /* No Window available to put our image into */ 52*4882a593Smuzhiyun GST_WARNING_OBJECT (xvimagesink, "could not output image - no window"); 53*4882a593Smuzhiyun res = GST_FLOW_ERROR; 54*4882a593Smuzhiyun@@ -1646,18 +1658,7 @@ gst_xv_image_sink_set_window_handle (GstVideoOverlay * overlay, guintptr id) 55*4882a593Smuzhiyun xvimagesink->xwindow = NULL; 56*4882a593Smuzhiyun } 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun- /* If the xid is 0 we go back to an internal window */ 59*4882a593Smuzhiyun- if (xwindow_id == 0) { 60*4882a593Smuzhiyun- /* If no width/height caps nego did not happen window will be created 61*4882a593Smuzhiyun- during caps nego then */ 62*4882a593Smuzhiyun- if (GST_VIDEO_SINK_WIDTH (xvimagesink) 63*4882a593Smuzhiyun- && GST_VIDEO_SINK_HEIGHT (xvimagesink)) { 64*4882a593Smuzhiyun- xwindow = 65*4882a593Smuzhiyun- gst_xv_image_sink_xwindow_new (xvimagesink, 66*4882a593Smuzhiyun- GST_VIDEO_SINK_WIDTH (xvimagesink), 67*4882a593Smuzhiyun- GST_VIDEO_SINK_HEIGHT (xvimagesink)); 68*4882a593Smuzhiyun- } 69*4882a593Smuzhiyun- } else { 70*4882a593Smuzhiyun+ if ((xvimagesink->xwindow_id = xwindow_id)) { 71*4882a593Smuzhiyun xwindow = gst_xvcontext_create_xwindow_from_xid (context, xwindow_id); 72*4882a593Smuzhiyun gst_xwindow_set_event_handling (xwindow, xvimagesink->handle_events); 73*4882a593Smuzhiyun } 74*4882a593Smuzhiyun@@ -2306,6 +2307,9 @@ gst_xv_image_sink_init (GstXvImageSink * xvimagesink) 75*4882a593Smuzhiyun xvimagesink->handle_expose = TRUE; 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun xvimagesink->draw_borders = TRUE; 78*4882a593Smuzhiyun+ 79*4882a593Smuzhiyun+ /* HACK: Use a non-zero initial ID to detect overlay mode */ 80*4882a593Smuzhiyun+ xvimagesink->xwindow_id = -1; 81*4882a593Smuzhiyun } 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun static void 84*4882a593Smuzhiyundiff --git a/sys/xvimage/xvimagesink.h b/sys/xvimage/xvimagesink.h 85*4882a593Smuzhiyunindex 35a3081..c84eeea 100644 86*4882a593Smuzhiyun--- a/sys/xvimage/xvimagesink.h 87*4882a593Smuzhiyun+++ b/sys/xvimage/xvimagesink.h 88*4882a593Smuzhiyun@@ -134,6 +134,8 @@ struct _GstXvImageSink 89*4882a593Smuzhiyun /* saved render rectangle until we have a window */ 90*4882a593Smuzhiyun gboolean pending_render_rect; 91*4882a593Smuzhiyun GstVideoRectangle render_rect; 92*4882a593Smuzhiyun+ 93*4882a593Smuzhiyun+ guintptr xwindow_id; 94*4882a593Smuzhiyun }; 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun struct _GstXvImageSinkClass 97*4882a593Smuzhiyun-- 98*4882a593Smuzhiyun2.20.1 99*4882a593Smuzhiyun 100