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