User can get the required buffer size by using buffer pool config.
Since d3d11 implementation is a candidate for public library in the future,
we need to hide everything from header as much as possible.
Note that the total size of allocated d3d11 texture memory by GPU is not
controllable factor. It depends on hardware specific alignment/padding
requirement. So, GstD3D11 implementation updates actual buffer size
by allocating D3D11 texture, since there's no way to get CPU accessible
memory size without allocating real D3D11 texture.
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2482>
priv->offset[1] = priv->stride[0] * desc[0].Height;
}
- self->buffer_size = offset;
-
gst_buffer_pool_config_set_params (config,
- caps, self->buffer_size, min_buffers, max_buffers);
+ caps, offset, min_buffers, max_buffers);
return GST_BUFFER_POOL_CLASS (parent_class)->set_config (pool, config) && ret;
GstD3D11Device *device;
- /* re-calculated buffer size based on d3d11 pitch and stride */
- guint buffer_size;
-
/*< private >*/
GstD3D11BufferPoolPrivate *priv;
if (gst_query_get_n_allocation_pools (query) == 0) {
GstD3D11AllocationParams *d3d11_params;
+ GstStructure *config;
d3d11_params = gst_d3d11_allocation_params_new (self->device, &info,
(GstD3D11AllocationFlags) 0, D3D11_BIND_SHADER_RESOURCE);
return FALSE;
}
- /* d3d11 buffer pool might update buffer size by self */
- size = GST_D3D11_BUFFER_POOL (pool)->buffer_size;
+ /* d3d11 buffer pool will update buffer size based on allocated texture,
+ * get size from config again */
+ config = gst_buffer_pool_get_config (pool);
+ gst_buffer_pool_config_get_params (config,
+ nullptr, &size, nullptr, nullptr);
+ gst_structure_free (config);
gst_query_add_allocation_pool (query, pool, size, 0, 0);
gst_object_unref (pool);
gst_d3d11_allocation_params_free (d3d11_params);
gst_buffer_pool_set_config (pool, config);
- /* d3d11 buffer pool might update buffer size by self */
- size = GST_D3D11_BUFFER_POOL (pool)->buffer_size;
+
+ /* d3d11 buffer pool will update buffer size based on allocated texture,
+ * get size from config again */
+ config = gst_buffer_pool_get_config (pool);
+ gst_buffer_pool_config_get_params (config, nullptr, &size, nullptr, nullptr);
+ gst_structure_free (config);
if (n > 0)
gst_query_set_nth_allocation_pool (query, 0, pool, size, min, max);
gst_query_add_allocation_meta (query,
GST_VIDEO_OVERLAY_COMPOSITION_META_API_TYPE, NULL);
- size = GST_D3D11_BUFFER_POOL (pool)->buffer_size;
+ /* d3d11 buffer pool will update buffer size based on allocated texture,
+ * get size from config again */
+ config = gst_buffer_pool_get_config (pool);
+ gst_buffer_pool_config_get_params (config, nullptr, &size, nullptr, nullptr);
+ gst_structure_free (config);
+
gst_query_add_allocation_pool (query, pool, size, 0, 0);
gst_object_unref (pool);
gst_buffer_pool_config_set_params (config, outcaps, size, min, max);
gst_buffer_pool_set_config (pool, config);
- size = GST_D3D11_BUFFER_POOL (pool)->buffer_size;
+ /* d3d11 buffer pool will update buffer size based on allocated texture,
+ * get size from config again */
+ config = gst_buffer_pool_get_config (pool);
+ gst_buffer_pool_config_get_params (config, nullptr, &size, nullptr, nullptr);
+ gst_structure_free (config);
if (update_pool)
gst_query_set_nth_allocation_pool (query, 0, pool, size, min, max);
}
gst_buffer_pool_set_config (pool, config);
- if (use_d3d11_pool)
- size = GST_D3D11_BUFFER_POOL (pool)->buffer_size;
+ if (use_d3d11_pool) {
+ /* d3d11 buffer pool will update buffer size based on allocated texture,
+ * get size from config again */
+ config = gst_buffer_pool_get_config (pool);
+ gst_buffer_pool_config_get_params (config,
+ nullptr, &size, nullptr, nullptr);
+ gst_structure_free (config);
+ }
if (n > 0)
gst_query_set_nth_allocation_pool (query, 0, pool, size, min, max);
gst_query_add_allocation_meta (query,
GST_VIDEO_OVERLAY_COMPOSITION_META_API_TYPE, NULL);
- size = GST_D3D11_BUFFER_POOL (pool)->buffer_size;
+ /* d3d11 buffer pool will update buffer size based on allocated texture,
+ * get size from config again */
+ config = gst_buffer_pool_get_config (pool);
+ gst_buffer_pool_config_get_params (config, nullptr, &size, nullptr, nullptr);
+ gst_structure_free (config);
+
gst_query_add_allocation_pool (query, pool, size, min_buffers, 0);
gst_object_unref (pool);
gst_buffer_pool_config_set_params (config, outcaps, size, min, max);
gst_buffer_pool_set_config (pool, config);
- size = GST_D3D11_BUFFER_POOL (pool)->buffer_size;
+ /* d3d11 buffer pool will update buffer size based on allocated texture,
+ * get size from config again */
+ config = gst_buffer_pool_get_config (pool);
+ gst_buffer_pool_config_get_params (config, nullptr, &size, nullptr, nullptr);
+ gst_structure_free (config);
if (update_pool)
gst_query_set_nth_allocation_pool (query, 0, pool, size, min, max);
gst_buffer_pool_set_config (pool, config);
- /* buffer size might be recalculated by pool depending on
- * device's stride/padding constraints */
- size = GST_D3D11_BUFFER_POOL (pool)->buffer_size;
+ /* d3d11 buffer pool will update buffer size based on allocated texture,
+ * get size from config again */
+ config = gst_buffer_pool_get_config (pool);
+ gst_buffer_pool_config_get_params (config, nullptr, &size, nullptr, nullptr);
+ gst_structure_free (config);
if (update_pool)
gst_query_set_nth_allocation_pool (query, 0, pool, size, min, max);
gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL);
- /* d3d11 buffer pool might update buffer size by self */
if (is_d3d11) {
- size = GST_D3D11_BUFFER_POOL (pool)->buffer_size;
+ /* d3d11 buffer pool will update buffer size based on allocated texture,
+ * get size from config again */
+ config = gst_buffer_pool_get_config (pool);
+ gst_buffer_pool_config_get_params (config, nullptr, &size, nullptr,
+ nullptr);
+ gst_structure_free (config);
}
gst_query_add_allocation_pool (query, pool, size, 0, 0);
if (!gst_buffer_pool_set_config (pool, config))
goto config_failed;
- /* d3d11 buffer pool might update buffer size by self */
- if (is_d3d11)
- size = GST_D3D11_BUFFER_POOL (pool)->buffer_size;
+ /* d3d11 buffer pool will update buffer size based on allocated texture,
+ * get size from config again */
+ if (is_d3d11) {
+ config = gst_buffer_pool_get_config (pool);
+ gst_buffer_pool_config_get_params (config,
+ nullptr, &size, nullptr, nullptr);
+ gst_structure_free (config);
+ }
gst_query_add_allocation_pool (query, pool, size, 0, 0);
gst_object_unref (pool);
gst_buffer_pool_set_config (pool, config);
- /* update size with calculated one */
- size = GST_D3D11_BUFFER_POOL (pool)->buffer_size;
+ /* d3d11 buffer pool will update buffer size based on allocated texture,
+ * get size from config again */
+ config = gst_buffer_pool_get_config (pool);
+ gst_buffer_pool_config_get_params (config, nullptr, &size, nullptr, nullptr);
+ gst_structure_free (config);
if (update_pool)
gst_query_set_nth_allocation_pool (query, 0, pool, size, min, max);
return FALSE;
}
- if (is_d3d11)
- size = GST_D3D11_BUFFER_POOL (pool)->buffer_size;
+ if (is_d3d11) {
+ /* d3d11 buffer pool will update buffer size based on allocated texture,
+ * get size from config again */
+ config = gst_buffer_pool_get_config (pool);
+ gst_buffer_pool_config_get_params (config, nullptr, &size, nullptr,
+ nullptr);
+ gst_structure_free (config);
+ }
}
/* We need at least 2 buffers because we hold on to the last one for redrawing
if (!gst_buffer_pool_set_config (pool, config))
goto config_failed;
- /* d3d11 buffer pool might update buffer size by self */
- if (is_d3d11)
- size = GST_D3D11_BUFFER_POOL (pool)->buffer_size;
+ /* d3d11 buffer pool will update buffer size based on allocated texture,
+ * get size from config again */
+ if (is_d3d11) {
+ config = gst_buffer_pool_get_config (pool);
+ gst_buffer_pool_config_get_params (config,
+ nullptr, &size, nullptr, nullptr);
+ gst_structure_free (config);
+ }
gst_query_add_allocation_pool (query, pool, size, 0, 0);
gst_object_unref (pool);