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