diff --git a/girs/GstVa-1.0.gir b/girs/GstVa-1.0.gir
index 930fb410de..49f671b4cd 100644
--- a/girs/GstVa-1.0.gir
+++ b/girs/GstVa-1.0.gir
@@ -794,10 +794,6 @@ the most widely used VA drivers.
the #GstCaps of the buffers handled by the new pool.
-
- the size of the frames to hold.
-
-
minimum number of frames to create.
@@ -825,6 +821,24 @@ the most widely used VA drivers.
+
+ Helper function to retrieve the VA surface size provided by @pool.
+
+
+ whether the surface size was retrieved.
+
+
+
+
+ a #GstBufferPool
+
+
+
+ the declared surface size
+
+
+
+
Retuns: %TRUE if @pool always add #GstVideoMeta to its
buffers. Otherwise, %FALSE.
diff --git a/subprojects/gst-plugins-bad/gst-libs/gst/va/gstvapool.c b/subprojects/gst-plugins-bad/gst-libs/gst/va/gstvapool.c
index 3a82c9cada..2530cf1fbb 100644
--- a/subprojects/gst-plugins-bad/gst-libs/gst/va/gstvapool.c
+++ b/subprojects/gst-plugins-bad/gst-libs/gst/va/gstvapool.c
@@ -465,7 +465,6 @@ gst_buffer_pool_config_set_va_alignment (GstStructure * config,
gboolean
gst_va_pool_requires_video_meta (GstBufferPool * pool)
{
-
g_return_val_if_fail (GST_IS_VA_POOL (pool), FALSE);
return GST_VA_POOL (pool)->force_videometa;
@@ -474,7 +473,6 @@ gst_va_pool_requires_video_meta (GstBufferPool * pool)
/**
* gst_va_pool_new_with_config:
* @caps: the #GstCaps of the buffers handled by the new pool.
- * @size: the size of the frames to hold.
* @min_buffers: minimum number of frames to create.
* @max_buffers: maximum number of frames to create.
* @usage_hint: VA usage hint
@@ -490,7 +488,7 @@ gst_va_pool_requires_video_meta (GstBufferPool * pool)
* Since: 1.22
*/
GstBufferPool *
-gst_va_pool_new_with_config (GstCaps * caps, guint size, guint min_buffers,
+gst_va_pool_new_with_config (GstCaps * caps, guint min_buffers,
guint max_buffers, guint usage_hint, GstVaFeature use_derived,
GstAllocator * allocator, GstAllocationParams * alloc_params)
{
@@ -500,8 +498,8 @@ gst_va_pool_new_with_config (GstCaps * caps, guint size, guint min_buffers,
pool = gst_va_pool_new ();
config = gst_buffer_pool_get_config (pool);
- gst_buffer_pool_config_set_params (config, caps, size, min_buffers,
- max_buffers);
+ /* ignore the size since it's calculated by the driver */
+ gst_buffer_pool_config_set_params (config, caps, 0, min_buffers, max_buffers);
gst_buffer_pool_config_set_va_allocation_params (config, usage_hint,
use_derived);
gst_buffer_pool_config_set_allocator (config, allocator, alloc_params);
@@ -512,3 +510,28 @@ gst_va_pool_new_with_config (GstCaps * caps, guint size, guint min_buffers,
return pool;
}
+
+/**
+ * gst_va_pool_get_buffer_size:
+ * @pool: a #GstBufferPool
+ * @size: (out) (allow-null-none): the declared surface size
+ *
+ * Helper function to retrieve the VA surface size provided by @pool.
+ *
+ * Returns: whether the surface size was retrieved.
+ *
+ * Since: 1.24
+ */
+gboolean
+gst_va_pool_get_buffer_size (GstBufferPool * pool, guint * size)
+{
+ gboolean ret;
+ GstStructure *config;
+
+ g_return_val_if_fail (GST_IS_VA_POOL (pool), FALSE);
+
+ config = gst_buffer_pool_get_config (pool);
+ ret = gst_buffer_pool_config_get_params (config, NULL, size, NULL, NULL);
+ gst_structure_free (config);
+ return ret && *size > 0;
+}
diff --git a/subprojects/gst-plugins-bad/gst-libs/gst/va/gstvapool.h b/subprojects/gst-plugins-bad/gst-libs/gst/va/gstvapool.h
index 86fe9dc60c..64f437aa0b 100644
--- a/subprojects/gst-plugins-bad/gst-libs/gst/va/gstvapool.h
+++ b/subprojects/gst-plugins-bad/gst-libs/gst/va/gstvapool.h
@@ -48,12 +48,14 @@ void gst_buffer_pool_config_set_va_alignment (GstStructure * con
const GstVideoAlignment * align);
GST_VA_API
GstBufferPool * gst_va_pool_new_with_config (GstCaps * caps,
- guint size,
guint min_buffers,
guint max_buffers,
guint usage_hint,
GstVaFeature use_derived,
GstAllocator * allocator,
GstAllocationParams * alloc_params);
+GST_VA_API
+gboolean gst_va_pool_get_buffer_size (GstBufferPool * pool,
+ guint * size);
G_END_DECLS
diff --git a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkdec.c b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkdec.c
index fb9d9cbb5d..4a3e2170a8 100644
--- a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkdec.c
+++ b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkdec.c
@@ -1772,9 +1772,7 @@ gst_msdk_create_va_pool (GstMsdkDec * thiz, GstVideoInfo * info,
caps = gst_video_info_to_caps (info);
}
- pool =
- gst_va_pool_new_with_config (caps,
- GST_VIDEO_INFO_SIZE (info), num_buffers, num_buffers,
+ pool = gst_va_pool_new_with_config (caps, num_buffers, num_buffers,
VA_SURFACE_ATTRIB_USAGE_HINT_DECODER, GST_VA_FEATURE_AUTO,
allocator, &alloc_params);
diff --git a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkenc.c b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkenc.c
index b2700651a4..a6b5a2395f 100644
--- a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkenc.c
+++ b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkenc.c
@@ -1200,9 +1200,8 @@ gst_msdk_create_va_pool (GstMsdkEnc * thiz, GstVideoInfo * info,
} else
aligned_caps = gst_video_info_to_caps (info);
- pool =
- gst_va_pool_new_with_config (aligned_caps, GST_VIDEO_INFO_SIZE (info),
- num_buffers, 0, VA_SURFACE_ATTRIB_USAGE_HINT_GENERIC, GST_VA_FEATURE_AUTO,
+ pool = gst_va_pool_new_with_config (aligned_caps, num_buffers, 0,
+ VA_SURFACE_ATTRIB_USAGE_HINT_GENERIC, GST_VA_FEATURE_AUTO,
allocator, &alloc_params);
gst_object_unref (allocator);
diff --git a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkvpp.c b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkvpp.c
index 24102f8053..9f8ddf441b 100644
--- a/subprojects/gst-plugins-bad/sys/msdk/gstmsdkvpp.c
+++ b/subprojects/gst-plugins-bad/sys/msdk/gstmsdkvpp.c
@@ -429,10 +429,8 @@ gst_msdk_create_va_pool (GstMsdkVPP * thiz, GstVideoInfo * info,
} else
aligned_caps = gst_video_info_to_caps (info);
- pool =
- gst_va_pool_new_with_config (aligned_caps,
- GST_VIDEO_INFO_SIZE (info), min_buffers, 0,
- usage_hint, GST_VA_FEATURE_AUTO, allocator, &alloc_params);
+ pool = gst_va_pool_new_with_config (aligned_caps, min_buffers, 0, usage_hint,
+ GST_VA_FEATURE_AUTO, allocator, &alloc_params);
gst_object_unref (allocator);
gst_caps_unref (aligned_caps);
diff --git a/subprojects/gst-plugins-bad/sys/qsv/gstqsvencoder.cpp b/subprojects/gst-plugins-bad/sys/qsv/gstqsvencoder.cpp
index 4c3fa7418b..c33805e8d2 100644
--- a/subprojects/gst-plugins-bad/sys/qsv/gstqsvencoder.cpp
+++ b/subprojects/gst-plugins-bad/sys/qsv/gstqsvencoder.cpp
@@ -981,8 +981,7 @@ gst_qsv_encoder_prepare_va_pool (GstQsvEncoder * self,
gst_allocation_params_init (¶ms);
- priv->internal_pool = gst_va_pool_new_with_config (caps,
- GST_VIDEO_INFO_SIZE (aligned_info), 0, 0,
+ priv->internal_pool = gst_va_pool_new_with_config (caps, 0, 0,
VA_SURFACE_ATTRIB_USAGE_HINT_GENERIC, GST_VA_FEATURE_AUTO,
allocator, ¶ms);
gst_object_unref (allocator);
@@ -1592,8 +1591,7 @@ gst_qsv_encoder_propose_allocation (GstVideoEncoder * encoder, GstQuery * query)
return FALSE;
}
- pool = gst_va_pool_new_with_config (caps,
- GST_VIDEO_INFO_SIZE (&info), priv->surface_pool->len, 0,
+ pool = gst_va_pool_new_with_config (caps, priv->surface_pool->len, 0,
VA_SURFACE_ATTRIB_USAGE_HINT_GENERIC, GST_VA_FEATURE_AUTO,
allocator, ¶ms);
diff --git a/subprojects/gst-plugins-bad/sys/va/gstvaav1dec.c b/subprojects/gst-plugins-bad/sys/va/gstvaav1dec.c
index 9852547605..5730d2ac96 100644
--- a/subprojects/gst-plugins-bad/sys/va/gstvaav1dec.c
+++ b/subprojects/gst-plugins-bad/sys/va/gstvaav1dec.c
@@ -293,8 +293,8 @@ _create_internal_pool (GstVaAV1Dec * self, gint width, gint height)
usage_hint = va_get_surface_usage_hint (base->display,
VAEntrypointVLD, GST_PAD_SRC, FALSE);
- pool = gst_va_pool_new_with_config (caps, GST_VIDEO_INFO_SIZE (&info),
- 1, 0, usage_hint, GST_VA_FEATURE_AUTO, allocator, ¶ms);
+ pool = gst_va_pool_new_with_config (caps, 1, 0, usage_hint,
+ GST_VA_FEATURE_AUTO, allocator, ¶ms);
gst_clear_caps (&caps);
gst_object_unref (allocator);
diff --git a/subprojects/gst-plugins-bad/sys/va/gstvabaseenc.c b/subprojects/gst-plugins-bad/sys/va/gstvabaseenc.c
index 9d112a934f..082edbea74 100644
--- a/subprojects/gst-plugins-bad/sys/va/gstvabaseenc.c
+++ b/subprojects/gst-plugins-bad/sys/va/gstvabaseenc.c
@@ -201,7 +201,7 @@ _get_sinkpad_pool (GstElement * element, gpointer data)
GstVaBaseEnc *base = GST_VA_BASE_ENC (element);
GstAllocator *allocator;
GstAllocationParams params = { 0, };
- guint size, usage_hint;
+ guint usage_hint;
GArray *surface_formats = NULL;
GstCaps *caps = NULL;
@@ -219,8 +219,6 @@ _get_sinkpad_pool (GstElement * element, gpointer data)
gst_allocation_params_init (¶ms);
- size = GST_VIDEO_INFO_SIZE (&base->in_info);
-
surface_formats = gst_va_encoder_get_surface_formats (base->encoder);
allocator = gst_va_allocator_new (base->display, surface_formats);
@@ -228,8 +226,8 @@ _get_sinkpad_pool (GstElement * element, gpointer data)
usage_hint = va_get_surface_usage_hint (base->display,
VAEntrypointEncSlice, GST_PAD_SINK, FALSE);
- base->priv->raw_pool = gst_va_pool_new_with_config (caps, size, 1, 0,
- usage_hint, GST_VA_FEATURE_AUTO, allocator, ¶ms);
+ base->priv->raw_pool = gst_va_pool_new_with_config (caps, 1, 0, usage_hint,
+ GST_VA_FEATURE_AUTO, allocator, ¶ms);
gst_clear_caps (&caps);
if (!base->priv->raw_pool) {
@@ -356,38 +354,33 @@ gst_va_base_enc_propose_allocation (GstVideoEncoder * venc, GstQuery * query)
GstAllocationParams params = { 0, };
GstBufferPool *pool;
GstCaps *caps;
- GstVideoInfo info;
gboolean need_pool = FALSE;
- guint size, usage_hint;
+ guint size = 0, usage_hint;
gst_query_parse_allocation (query, &caps, &need_pool);
if (!caps)
return FALSE;
- if (!gst_video_info_from_caps (&info, caps)) {
- GST_ERROR_OBJECT (base, "Cannot parse caps %" GST_PTR_FORMAT, caps);
- return FALSE;
- }
-
usage_hint = va_get_surface_usage_hint (base->display,
VAEntrypointEncSlice, GST_PAD_SINK, gst_video_is_dma_drm_caps (caps));
- size = GST_VIDEO_INFO_SIZE (&info);
-
gst_allocation_params_init (¶ms);
if (!(allocator = _allocator_from_caps (base, caps)))
return FALSE;
- pool = gst_va_pool_new_with_config (caps, size, 1, 0, usage_hint,
+ pool = gst_va_pool_new_with_config (caps, 1, 0, usage_hint,
GST_VA_FEATURE_AUTO, allocator, ¶ms);
if (!pool) {
gst_object_unref (allocator);
goto config_failed;
}
+ if (!gst_va_pool_get_buffer_size (pool, &size))
+ goto config_failed;
+
gst_query_add_allocation_param (query, allocator, ¶ms);
- gst_query_add_allocation_pool (query, pool, size, 0, 0);
+ gst_query_add_allocation_pool (query, pool, size, 1, 0);
GST_DEBUG_OBJECT (base,
"proposing %" GST_PTR_FORMAT " with allocator %" GST_PTR_FORMAT,
diff --git a/subprojects/gst-plugins-bad/sys/va/gstvabasetransform.c b/subprojects/gst-plugins-bad/sys/va/gstvabasetransform.c
index 98f9e8d4ac..9b262b5fef 100644
--- a/subprojects/gst-plugins-bad/sys/va/gstvabasetransform.c
+++ b/subprojects/gst-plugins-bad/sys/va/gstvabasetransform.c
@@ -240,7 +240,6 @@ gst_va_base_transform_propose_allocation (GstBaseTransform * trans,
GstAllocationParams params = { 0, };
GstBufferPool *pool;
GstCaps *caps;
- GstVideoInfo info;
gboolean update_allocator = FALSE;
guint size, usage_hint;
@@ -261,16 +260,9 @@ gst_va_base_transform_propose_allocation (GstBaseTransform * trans,
if (!caps)
return FALSE;
- if (!gst_va_video_info_from_caps (&info, NULL, caps)) {
- GST_ERROR_OBJECT (self, "Cannot parse caps %" GST_PTR_FORMAT, caps);
- return FALSE;
- }
-
usage_hint = va_get_surface_usage_hint (self->display,
VAEntrypointVideoProc, GST_PAD_SINK, gst_video_is_dma_drm_caps (caps));
- size = GST_VIDEO_INFO_SIZE (&info);
-
if (gst_query_get_n_allocation_params (query) > 0) {
gst_query_parse_nth_allocation_param (query, 0, &allocator, ¶ms);
if (!GST_IS_VA_DMABUF_ALLOCATOR (allocator)
@@ -286,8 +278,8 @@ gst_va_base_transform_propose_allocation (GstBaseTransform * trans,
return FALSE;
}
- pool = gst_va_pool_new_with_config (caps, size, 1 + self->extra_min_buffers,
- 0, usage_hint, GST_VA_FEATURE_AUTO, allocator, ¶ms);
+ pool = gst_va_pool_new_with_config (caps, 1 + self->extra_min_buffers, 0,
+ usage_hint, GST_VA_FEATURE_AUTO, allocator, ¶ms);
if (!pool) {
gst_object_unref (allocator);
goto config_failed;
@@ -298,6 +290,9 @@ gst_va_base_transform_propose_allocation (GstBaseTransform * trans,
else
gst_query_add_allocation_param (query, allocator, ¶ms);
+ if (!gst_va_pool_get_buffer_size (pool, &size))
+ goto config_failed;
+
gst_query_add_allocation_pool (query, pool, size, 1 + self->extra_min_buffers,
0);
@@ -760,8 +755,7 @@ _get_sinkpad_pool (GstElement * element, gpointer data)
GstAllocator *allocator;
GstAllocationParams params = { 0, };
GstCaps *caps;
- GstVideoInfo in_info;
- guint size, usage_hint;
+ guint usage_hint;
if (self->priv->sinkpad_pool)
return self->priv->sinkpad_pool;
@@ -787,21 +781,13 @@ _get_sinkpad_pool (GstElement * element, gpointer data)
gst_caps_set_simple (caps, "height", G_TYPE_INT,
self->priv->uncropped_height, NULL);
- if (!gst_video_info_from_caps (&in_info, caps)) {
- GST_ERROR_OBJECT (self, "Cannot parse caps %" GST_PTR_FORMAT, caps);
- gst_caps_unref (caps);
- return NULL;
- }
-
usage_hint = va_get_surface_usage_hint (self->display,
VAEntrypointVideoProc, GST_PAD_SINK, FALSE);
- size = GST_VIDEO_INFO_SIZE (&in_info);
-
allocator = gst_va_base_transform_allocator_from_caps (self, caps);
g_assert (GST_IS_VA_ALLOCATOR (allocator));
- self->priv->sinkpad_pool = gst_va_pool_new_with_config (caps, size, 1, 0,
+ self->priv->sinkpad_pool = gst_va_pool_new_with_config (caps, 1, 0,
usage_hint, GST_VA_FEATURE_AUTO, allocator, ¶ms);
if (!self->priv->sinkpad_pool) {
gst_caps_unref (caps);
diff --git a/subprojects/gst-plugins-bad/sys/va/gstvacompositor.c b/subprojects/gst-plugins-bad/sys/va/gstvacompositor.c
index 2131dc263b..924d209365 100644
--- a/subprojects/gst-plugins-bad/sys/va/gstvacompositor.c
+++ b/subprojects/gst-plugins-bad/sys/va/gstvacompositor.c
@@ -580,8 +580,6 @@ gst_va_compositor_propose_allocation (GstAggregator * agg,
usage_hint = va_get_surface_usage_hint (self->display,
VAEntrypointVideoProc, GST_PAD_SINK, gst_video_is_dma_drm_caps (caps));
- size = GST_VIDEO_INFO_SIZE (&info);
-
if (gst_query_get_n_allocation_params (query) > 0) {
gst_query_parse_nth_allocation_param (query, 0, &allocator, ¶ms);
if (!GST_IS_VA_DMABUF_ALLOCATOR (allocator)
@@ -599,13 +597,16 @@ gst_va_compositor_propose_allocation (GstAggregator * agg,
/* Now we have a VA-based allocator */
- pool = gst_va_pool_new_with_config (caps, size, 1, 0, usage_hint,
+ pool = gst_va_pool_new_with_config (caps, 1, 0, usage_hint,
GST_VA_FEATURE_AUTO, allocator, ¶ms);
if (!pool) {
gst_object_unref (allocator);
goto config_failed;
}
+ if (!gst_va_pool_get_buffer_size (pool, &size))
+ goto config_failed;
+
if (update_allocator)
gst_query_set_nth_allocation_param (query, 0, allocator, ¶ms);
else
@@ -803,7 +804,7 @@ _get_sinkpad_pool (GstElement * element, gpointer data)
GstAllocationParams params = { 0, };
GstCaps *caps;
GstVideoInfo info;
- guint size, usage_hint;
+ guint usage_hint;
if (pad->pool)
return pad->pool;
@@ -822,10 +823,8 @@ _get_sinkpad_pool (GstElement * element, gpointer data)
usage_hint = va_get_surface_usage_hint (self->display,
VAEntrypointVideoProc, GST_PAD_SINK, FALSE);
- size = GST_VIDEO_INFO_SIZE (&info);
-
allocator = gst_va_compositor_allocator_from_caps (self, caps);
- pad->pool = gst_va_pool_new_with_config (caps, size, 1, 0, usage_hint,
+ pad->pool = gst_va_pool_new_with_config (caps, 1, 0, usage_hint,
GST_VA_FEATURE_AUTO, allocator, ¶ms);
gst_caps_unref (caps);
diff --git a/subprojects/gst-plugins-bad/sys/va/gstvaencoder.c b/subprojects/gst-plugins-bad/sys/va/gstvaencoder.c
index abe5171a03..e9e9291391 100644
--- a/subprojects/gst-plugins-bad/sys/va/gstvaencoder.c
+++ b/subprojects/gst-plugins-bad/sys/va/gstvaencoder.c
@@ -310,7 +310,6 @@ _create_reconstruct_pool (GstVaDisplay * display, GArray * surface_formats,
GstVideoInfo info;
GstAllocationParams params = { 0, };
GstBufferPool *pool;
- guint size;
GstCaps *caps = NULL;
gst_video_info_set_format (&info, format, coded_width, coded_height);
@@ -318,17 +317,13 @@ _create_reconstruct_pool (GstVaDisplay * display, GArray * surface_formats,
usage_hint = va_get_surface_usage_hint (display,
VAEntrypointEncSlice, GST_PAD_SINK, FALSE);
- size = GST_VIDEO_INFO_SIZE (&info);
-
caps = gst_video_info_to_caps (&info);
gst_caps_set_features_simple (caps,
gst_caps_features_from_string (GST_CAPS_FEATURE_MEMORY_VA));
allocator = gst_va_allocator_new (display, surface_formats);
- gst_allocation_params_init (¶ms);
-
- pool = gst_va_pool_new_with_config (caps, size, 0, max_buffers, usage_hint,
+ pool = gst_va_pool_new_with_config (caps, 0, max_buffers, usage_hint,
GST_VA_FEATURE_AUTO, allocator, ¶ms);
gst_clear_object (&allocator);