1*4882a593SmuzhiyunFrom 00a2a00ba8e95ad9d339cb9479e512c2439b1888 Mon Sep 17 00:00:00 2001
2*4882a593SmuzhiyunFrom: Jeffy Chen <jeffy.chen@rock-chips.com>
3*4882a593SmuzhiyunDate: Wed, 11 May 2022 18:12:39 +0800
4*4882a593SmuzhiyunSubject: [PATCH 33/41] waylandsink: Parse video size in propose_allocation()
5*4882a593Smuzhiyun
6*4882a593SmuzhiyunIn some cases it would be called before set_caps().
7*4882a593Smuzhiyun
8*4882a593SmuzhiyunSigned-off-by: Jeffy Chen <jeffy.chen@rock-chips.com>
9*4882a593Smuzhiyun---
10*4882a593Smuzhiyun ext/wayland/gstwaylandsink.c | 24 +++++++++++++++++++-----
11*4882a593Smuzhiyun 1 file changed, 19 insertions(+), 5 deletions(-)
12*4882a593Smuzhiyun
13*4882a593Smuzhiyundiff --git a/ext/wayland/gstwaylandsink.c b/ext/wayland/gstwaylandsink.c
14*4882a593Smuzhiyunindex 262805e..183529a 100644
15*4882a593Smuzhiyun--- a/ext/wayland/gstwaylandsink.c
16*4882a593Smuzhiyun+++ b/ext/wayland/gstwaylandsink.c
17*4882a593Smuzhiyun@@ -766,11 +766,10 @@ gst_wayland_sink_get_caps (GstBaseSink * bsink, GstCaps * filter)
18*4882a593Smuzhiyun }
19*4882a593Smuzhiyun
20*4882a593Smuzhiyun static GstBufferPool *
21*4882a593Smuzhiyun-gst_wayland_create_pool (GstWaylandSink * self, GstCaps * caps)
22*4882a593Smuzhiyun+gst_wayland_create_pool (GstWaylandSink * self, GstCaps * caps, gsize size)
23*4882a593Smuzhiyun {
24*4882a593Smuzhiyun   GstBufferPool *pool = NULL;
25*4882a593Smuzhiyun   GstStructure *structure;
26*4882a593Smuzhiyun-  gsize size = self->video_info.size;
27*4882a593Smuzhiyun   GstAllocator *alloc;
28*4882a593Smuzhiyun
29*4882a593Smuzhiyun   pool = gst_wl_video_buffer_pool_new ();
30*4882a593Smuzhiyun@@ -819,7 +818,7 @@ gst_wayland_sink_set_caps (GstBaseSink * bsink, GstCaps * caps)
31*4882a593Smuzhiyun   /* create a new pool for the new caps */
32*4882a593Smuzhiyun   if (self->pool)
33*4882a593Smuzhiyun     gst_object_unref (self->pool);
34*4882a593Smuzhiyun-  self->pool = gst_wayland_create_pool (self, caps);
35*4882a593Smuzhiyun+  self->pool = gst_wayland_create_pool (self, caps, self->video_info.size);
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun   use_dmabuf = gst_caps_features_contains (gst_caps_get_features (caps, 0),
38*4882a593Smuzhiyun       GST_CAPS_FEATURE_MEMORY_DMABUF);
39*4882a593Smuzhiyun@@ -858,10 +857,15 @@ gst_wayland_sink_propose_allocation (GstBaseSink * bsink, GstQuery * query)
40*4882a593Smuzhiyun   GstBufferPool *pool = NULL;
41*4882a593Smuzhiyun   gboolean need_pool;
42*4882a593Smuzhiyun   GstAllocator *alloc;
43*4882a593Smuzhiyun+  GstVideoInfo info;
44*4882a593Smuzhiyun   GstStructure *s;
45*4882a593Smuzhiyun   gint value;
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun   gst_query_parse_allocation (query, &caps, &need_pool);
48*4882a593Smuzhiyun+  if (!caps)
49*4882a593Smuzhiyun+    goto no_caps;
50*4882a593Smuzhiyun+  if (!gst_video_info_from_caps (&info, caps))
51*4882a593Smuzhiyun+    goto invalid_caps;
52*4882a593Smuzhiyun
53*4882a593Smuzhiyun   s = gst_caps_get_structure (caps, 0);
54*4882a593Smuzhiyun   if (gst_structure_get_int (s, "arm-afbc", &value) && value) {
55*4882a593Smuzhiyun@@ -870,9 +874,9 @@ gst_wayland_sink_propose_allocation (GstBaseSink * bsink, GstQuery * query)
56*4882a593Smuzhiyun   }
57*4882a593Smuzhiyun
58*4882a593Smuzhiyun   if (need_pool)
59*4882a593Smuzhiyun-    pool = gst_wayland_create_pool (self, caps);
60*4882a593Smuzhiyun+    pool = gst_wayland_create_pool (self, caps, info.size);
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun-  gst_query_add_allocation_pool (query, pool, self->video_info.size, 2, 0);
63*4882a593Smuzhiyun+  gst_query_add_allocation_pool (query, pool, info.size, 2, 0);
64*4882a593Smuzhiyun   if (pool)
65*4882a593Smuzhiyun     g_object_unref (pool);
66*4882a593Smuzhiyun
67*4882a593Smuzhiyun@@ -883,6 +887,16 @@ gst_wayland_sink_propose_allocation (GstBaseSink * bsink, GstQuery * query)
68*4882a593Smuzhiyun   g_object_unref (alloc);
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun   return TRUE;
71*4882a593Smuzhiyun+no_caps:
72*4882a593Smuzhiyun+  {
73*4882a593Smuzhiyun+    GST_DEBUG_OBJECT (bsink, "no caps specified");
74*4882a593Smuzhiyun+    return FALSE;
75*4882a593Smuzhiyun+  }
76*4882a593Smuzhiyun+invalid_caps:
77*4882a593Smuzhiyun+  {
78*4882a593Smuzhiyun+    GST_DEBUG_OBJECT (bsink, "invalid caps specified");
79*4882a593Smuzhiyun+    return FALSE;
80*4882a593Smuzhiyun+  }
81*4882a593Smuzhiyun }
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun static void
84*4882a593Smuzhiyun--
85*4882a593Smuzhiyun2.20.1
86*4882a593Smuzhiyun
87