mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-25 01:30:38 +00:00
d3d11: Add a helper method for d3d11buffferpool setup
Remove duplicated code for d3d11buffferpool setup. Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1892>
This commit is contained in:
parent
ac04681b6f
commit
f1e3e5276a
5 changed files with 91 additions and 121 deletions
|
@ -799,8 +799,8 @@ static gboolean
|
||||||
gst_d3d11_compositor_configure_fallback_pool (GstD3D11Compositor * self,
|
gst_d3d11_compositor_configure_fallback_pool (GstD3D11Compositor * self,
|
||||||
GstVideoInfo * info, gint bind_flags, GstBufferPool ** pool)
|
GstVideoInfo * info, gint bind_flags, GstBufferPool ** pool)
|
||||||
{
|
{
|
||||||
GstStructure *config;
|
|
||||||
GstD3D11AllocationParams *d3d11_params;
|
GstD3D11AllocationParams *d3d11_params;
|
||||||
|
GstBufferPool *new_pool;
|
||||||
GstCaps *caps;
|
GstCaps *caps;
|
||||||
|
|
||||||
if (*pool) {
|
if (*pool) {
|
||||||
|
@ -814,28 +814,21 @@ gst_d3d11_compositor_configure_fallback_pool (GstD3D11Compositor * self,
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
*pool = gst_d3d11_buffer_pool_new (self->device);
|
d3d11_params = gst_d3d11_allocation_params_new (self->device,
|
||||||
config = gst_buffer_pool_get_config (*pool);
|
info, 0, bind_flags);
|
||||||
gst_buffer_pool_config_set_params (config,
|
|
||||||
caps, GST_VIDEO_INFO_SIZE (info), 0, 0);
|
new_pool = gst_d3d11_buffer_pool_new_with_options (self->device,
|
||||||
|
caps, d3d11_params, 0, 0);
|
||||||
gst_caps_unref (caps);
|
gst_caps_unref (caps);
|
||||||
|
|
||||||
d3d11_params = gst_buffer_pool_config_get_d3d11_allocation_params (config);
|
|
||||||
if (!d3d11_params) {
|
|
||||||
d3d11_params = gst_d3d11_allocation_params_new (self->device,
|
|
||||||
info, 0, bind_flags);
|
|
||||||
} else {
|
|
||||||
gint i;
|
|
||||||
for (i = 0; i < GST_VIDEO_INFO_N_PLANES (info); i++)
|
|
||||||
d3d11_params->desc[i].BindFlags |= bind_flags;
|
|
||||||
}
|
|
||||||
|
|
||||||
gst_buffer_pool_config_set_d3d11_allocation_params (config, d3d11_params);
|
|
||||||
gst_d3d11_allocation_params_free (d3d11_params);
|
gst_d3d11_allocation_params_free (d3d11_params);
|
||||||
|
|
||||||
gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META);
|
if (!new_pool) {
|
||||||
gst_buffer_pool_set_config (*pool, config);
|
GST_ERROR_OBJECT (self, "Failed to configure fallback pool");
|
||||||
gst_buffer_pool_set_active (*pool, TRUE);
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
gst_buffer_pool_set_active (new_pool, TRUE);
|
||||||
|
*pool = new_pool;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -1742,35 +1735,19 @@ gst_d3d11_compositor_propose_allocation (GstAggregator * aggregator,
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (gst_query_get_n_allocation_pools (query) == 0) {
|
if (gst_query_get_n_allocation_pools (query) == 0) {
|
||||||
GstStructure *config;
|
|
||||||
GstD3D11AllocationParams *d3d11_params;
|
GstD3D11AllocationParams *d3d11_params;
|
||||||
gint i;
|
|
||||||
|
|
||||||
pool = gst_d3d11_buffer_pool_new (self->device);
|
d3d11_params = gst_d3d11_allocation_params_new (self->device, &info, 0,
|
||||||
config = gst_buffer_pool_get_config (pool);
|
D3D11_BIND_SHADER_RESOURCE);
|
||||||
|
|
||||||
gst_buffer_pool_config_add_option (config,
|
pool = gst_d3d11_buffer_pool_new_with_options (self->device,
|
||||||
GST_BUFFER_POOL_OPTION_VIDEO_META);
|
caps, d3d11_params, 0, 0);
|
||||||
|
|
||||||
d3d11_params = gst_buffer_pool_config_get_d3d11_allocation_params (config);
|
|
||||||
if (!d3d11_params) {
|
|
||||||
d3d11_params = gst_d3d11_allocation_params_new (self->device, &info, 0,
|
|
||||||
D3D11_BIND_SHADER_RESOURCE);
|
|
||||||
} else {
|
|
||||||
/* Set bind flag */
|
|
||||||
for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&info); i++) {
|
|
||||||
d3d11_params->desc[i].BindFlags |= D3D11_BIND_SHADER_RESOURCE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
gst_buffer_pool_config_set_d3d11_allocation_params (config, d3d11_params);
|
|
||||||
gst_d3d11_allocation_params_free (d3d11_params);
|
gst_d3d11_allocation_params_free (d3d11_params);
|
||||||
|
|
||||||
size = GST_VIDEO_INFO_SIZE (&info);
|
if (!pool) {
|
||||||
gst_buffer_pool_config_set_params (config, caps, size, 0, 0);
|
GST_ERROR_OBJECT (self, "Failed to create buffer pool");
|
||||||
|
return FALSE;
|
||||||
if (!gst_buffer_pool_set_config (pool, config))
|
}
|
||||||
goto config_failed;
|
|
||||||
|
|
||||||
/* d3d11 buffer pool might update buffer size by self */
|
/* d3d11 buffer pool might update buffer size by self */
|
||||||
size = GST_D3D11_BUFFER_POOL (pool)->buffer_size;
|
size = GST_D3D11_BUFFER_POOL (pool)->buffer_size;
|
||||||
|
@ -1782,14 +1759,6 @@ gst_d3d11_compositor_propose_allocation (GstAggregator * aggregator,
|
||||||
gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL);
|
gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
/* ERRORS */
|
|
||||||
config_failed:
|
|
||||||
{
|
|
||||||
GST_ERROR_OBJECT (self, "failed to set config");
|
|
||||||
gst_object_unref (pool);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
|
|
@ -376,7 +376,6 @@ gst_d3d11_decoder_prepare_output_view_pool (GstD3D11Decoder * self,
|
||||||
GstD3D11DecoderPrivate *priv = self->priv;
|
GstD3D11DecoderPrivate *priv = self->priv;
|
||||||
GstD3D11AllocationParams *alloc_params = NULL;
|
GstD3D11AllocationParams *alloc_params = NULL;
|
||||||
GstBufferPool *pool = NULL;
|
GstBufferPool *pool = NULL;
|
||||||
GstStructure *config = NULL;
|
|
||||||
GstCaps *caps = NULL;
|
GstCaps *caps = NULL;
|
||||||
GstVideoAlignment align;
|
GstVideoAlignment align;
|
||||||
GstD3D11AllocationFlags alloc_flags = 0;
|
GstD3D11AllocationFlags alloc_flags = 0;
|
||||||
|
@ -410,29 +409,19 @@ gst_d3d11_decoder_prepare_output_view_pool (GstD3D11Decoder * self,
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
pool = gst_d3d11_buffer_pool_new (priv->device);
|
|
||||||
if (!pool) {
|
|
||||||
GST_ERROR_OBJECT (self, "Failed to create buffer pool");
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Setup buffer pool */
|
|
||||||
config = gst_buffer_pool_get_config (pool);
|
|
||||||
caps = gst_video_info_to_caps (info);
|
caps = gst_video_info_to_caps (info);
|
||||||
if (!caps) {
|
if (!caps) {
|
||||||
GST_ERROR_OBJECT (self, "Couldn't convert video info to caps");
|
GST_ERROR_OBJECT (self, "Couldn't convert video info to caps");
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
gst_buffer_pool_config_set_params (config, caps, GST_VIDEO_INFO_SIZE (info),
|
pool = gst_d3d11_buffer_pool_new_with_options (priv->device,
|
||||||
0, pool_size);
|
caps, alloc_params, 0, pool_size);
|
||||||
gst_buffer_pool_config_set_d3d11_allocation_params (config, alloc_params);
|
gst_clear_caps (&caps);
|
||||||
gst_caps_unref (caps);
|
g_clear_pointer (&alloc_params, gst_d3d11_allocation_params_free);
|
||||||
gst_d3d11_allocation_params_free (alloc_params);
|
|
||||||
gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META);
|
|
||||||
|
|
||||||
if (!gst_buffer_pool_set_config (pool, config)) {
|
if (!pool) {
|
||||||
GST_ERROR_OBJECT (self, "Invalid pool config");
|
GST_ERROR_OBJECT (self, "Failed to create buffer pool");
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
|
|
||||||
#include "gstd3d11utils.h"
|
#include "gstd3d11utils.h"
|
||||||
#include "gstd3d11device.h"
|
#include "gstd3d11device.h"
|
||||||
#include "gstd3d11memory.h"
|
#include "gstd3d11bufferpool.h"
|
||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <versionhelpers.h>
|
#include <versionhelpers.h>
|
||||||
|
@ -668,3 +668,38 @@ gst_d3d11_buffer_copy_into (GstBuffer * dst, GstBuffer * src)
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GstBufferPool *
|
||||||
|
gst_d3d11_buffer_pool_new_with_options (GstD3D11Device * device,
|
||||||
|
GstCaps * caps, GstD3D11AllocationParams * alloc_params,
|
||||||
|
guint min_buffers, guint max_buffers)
|
||||||
|
{
|
||||||
|
GstBufferPool *pool;
|
||||||
|
GstStructure *config;
|
||||||
|
GstVideoInfo info;
|
||||||
|
|
||||||
|
g_return_val_if_fail (GST_IS_D3D11_DEVICE (device), NULL);
|
||||||
|
g_return_val_if_fail (GST_IS_CAPS (caps), NULL);
|
||||||
|
g_return_val_if_fail (alloc_params != NULL, NULL);
|
||||||
|
|
||||||
|
if (!gst_video_info_from_caps (&info, caps)) {
|
||||||
|
GST_ERROR_OBJECT (device, "invalid caps");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
pool = gst_d3d11_buffer_pool_new (device);
|
||||||
|
config = gst_buffer_pool_get_config (pool);
|
||||||
|
gst_buffer_pool_config_set_params (config,
|
||||||
|
caps, GST_VIDEO_INFO_SIZE (&info), min_buffers, max_buffers);
|
||||||
|
|
||||||
|
gst_buffer_pool_config_set_d3d11_allocation_params (config, alloc_params);
|
||||||
|
|
||||||
|
gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META);
|
||||||
|
if (!gst_buffer_pool_set_config (pool, config)) {
|
||||||
|
GST_ERROR_OBJECT (pool, "Couldn't set config");
|
||||||
|
gst_object_unref (pool);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return pool;
|
||||||
|
}
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
#include <gst/video/video.h>
|
#include <gst/video/video.h>
|
||||||
|
|
||||||
#include "gstd3d11_fwd.h"
|
#include "gstd3d11_fwd.h"
|
||||||
|
#include "gstd3d11memory.h"
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
|
@ -67,6 +68,13 @@ GstBuffer * gst_d3d11_allocate_staging_buffer_for (GstBuffer * buffer,
|
||||||
gboolean gst_d3d11_buffer_copy_into (GstBuffer * dst,
|
gboolean gst_d3d11_buffer_copy_into (GstBuffer * dst,
|
||||||
GstBuffer * src);
|
GstBuffer * src);
|
||||||
|
|
||||||
|
GstBufferPool * gst_d3d11_buffer_pool_new_with_options (GstD3D11Device * device,
|
||||||
|
GstCaps * caps,
|
||||||
|
GstD3D11AllocationParams * alloc_params,
|
||||||
|
guint min_buffers,
|
||||||
|
guint max_buffers);
|
||||||
|
|
||||||
|
|
||||||
gboolean _gst_d3d11_result (HRESULT hr,
|
gboolean _gst_d3d11_result (HRESULT hr,
|
||||||
GstD3D11Device * device,
|
GstD3D11Device * device,
|
||||||
GstDebugCategory * cat,
|
GstDebugCategory * cat,
|
||||||
|
|
|
@ -367,8 +367,6 @@ gst_d3d11_video_sink_set_caps (GstBaseSink * sink, GstCaps * caps)
|
||||||
gint display_par_n = 1, display_par_d = 1; /* display's PAR */
|
gint display_par_n = 1, display_par_d = 1; /* display's PAR */
|
||||||
guint num, den;
|
guint num, den;
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
GstStructure *config;
|
|
||||||
gint i;
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (self, "set caps %" GST_PTR_FORMAT, caps);
|
GST_DEBUG_OBJECT (self, "set caps %" GST_PTR_FORMAT, caps);
|
||||||
|
|
||||||
|
@ -462,14 +460,9 @@ gst_d3d11_video_sink_set_caps (GstBaseSink * sink, GstCaps * caps)
|
||||||
|
|
||||||
if (self->fallback_pool) {
|
if (self->fallback_pool) {
|
||||||
gst_buffer_pool_set_active (self->fallback_pool, FALSE);
|
gst_buffer_pool_set_active (self->fallback_pool, FALSE);
|
||||||
gst_object_unref (self->fallback_pool);
|
gst_clear_object (&self->fallback_pool);
|
||||||
}
|
}
|
||||||
|
|
||||||
self->fallback_pool = gst_d3d11_buffer_pool_new (self->device);
|
|
||||||
config = gst_buffer_pool_get_config (self->fallback_pool);
|
|
||||||
gst_buffer_pool_config_set_params (config,
|
|
||||||
caps, GST_VIDEO_INFO_SIZE (&self->info), 0, 2);
|
|
||||||
|
|
||||||
{
|
{
|
||||||
GstD3D11AllocationParams *d3d11_params;
|
GstD3D11AllocationParams *d3d11_params;
|
||||||
gint bind_flags = D3D11_BIND_SHADER_RESOURCE;
|
gint bind_flags = D3D11_BIND_SHADER_RESOURCE;
|
||||||
|
@ -488,23 +481,18 @@ gst_d3d11_video_sink_set_caps (GstBaseSink * sink, GstCaps * caps)
|
||||||
bind_flags |= D3D11_BIND_RENDER_TARGET;
|
bind_flags |= D3D11_BIND_RENDER_TARGET;
|
||||||
}
|
}
|
||||||
|
|
||||||
d3d11_params = gst_buffer_pool_config_get_d3d11_allocation_params (config);
|
d3d11_params = gst_d3d11_allocation_params_new (self->device,
|
||||||
if (!d3d11_params) {
|
&self->info, 0, bind_flags);
|
||||||
d3d11_params = gst_d3d11_allocation_params_new (self->device,
|
|
||||||
&self->info, 0, bind_flags);
|
|
||||||
} else {
|
|
||||||
/* Set bind flag */
|
|
||||||
for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&self->info); i++) {
|
|
||||||
d3d11_params->desc[i].BindFlags |= bind_flags;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
gst_buffer_pool_config_set_d3d11_allocation_params (config, d3d11_params);
|
self->fallback_pool = gst_d3d11_buffer_pool_new_with_options (self->device,
|
||||||
|
caps, d3d11_params, 0, 2);
|
||||||
gst_d3d11_allocation_params_free (d3d11_params);
|
gst_d3d11_allocation_params_free (d3d11_params);
|
||||||
}
|
}
|
||||||
|
|
||||||
gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META);
|
if (!self->fallback_pool) {
|
||||||
gst_buffer_pool_set_config (self->fallback_pool, config);
|
GST_ERROR_OBJECT (self, "Failed to configure fallback pool");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
|
@ -685,7 +673,6 @@ static gboolean
|
||||||
gst_d3d11_video_sink_propose_allocation (GstBaseSink * sink, GstQuery * query)
|
gst_d3d11_video_sink_propose_allocation (GstBaseSink * sink, GstQuery * query)
|
||||||
{
|
{
|
||||||
GstD3D11VideoSink *self = GST_D3D11_VIDEO_SINK (sink);
|
GstD3D11VideoSink *self = GST_D3D11_VIDEO_SINK (sink);
|
||||||
GstStructure *config;
|
|
||||||
GstCaps *caps;
|
GstCaps *caps;
|
||||||
GstBufferPool *pool = NULL;
|
GstBufferPool *pool = NULL;
|
||||||
GstVideoInfo info;
|
GstVideoInfo info;
|
||||||
|
@ -707,39 +694,26 @@ gst_d3d11_video_sink_propose_allocation (GstBaseSink * sink, GstQuery * query)
|
||||||
size = info.size;
|
size = info.size;
|
||||||
|
|
||||||
if (need_pool) {
|
if (need_pool) {
|
||||||
gint i;
|
|
||||||
GstD3D11AllocationParams *d3d11_params;
|
GstD3D11AllocationParams *d3d11_params;
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (self, "create new pool");
|
GST_DEBUG_OBJECT (self, "create new pool");
|
||||||
|
|
||||||
pool = gst_d3d11_buffer_pool_new (self->device);
|
d3d11_params = gst_d3d11_allocation_params_new (self->device, &info, 0,
|
||||||
config = gst_buffer_pool_get_config (pool);
|
D3D11_BIND_SHADER_RESOURCE);
|
||||||
gst_buffer_pool_config_set_params (config, caps, size, 2,
|
pool = gst_d3d11_buffer_pool_new_with_options (self->device, caps,
|
||||||
DXGI_MAX_SWAP_CHAIN_BUFFERS);
|
d3d11_params, 0, 2);
|
||||||
|
|
||||||
d3d11_params = gst_buffer_pool_config_get_d3d11_allocation_params (config);
|
|
||||||
if (!d3d11_params) {
|
|
||||||
d3d11_params = gst_d3d11_allocation_params_new (self->device, &info, 0,
|
|
||||||
D3D11_BIND_SHADER_RESOURCE);
|
|
||||||
} else {
|
|
||||||
/* Set bind flag */
|
|
||||||
for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&info); i++) {
|
|
||||||
d3d11_params->desc[i].BindFlags |= D3D11_BIND_SHADER_RESOURCE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
gst_buffer_pool_config_set_d3d11_allocation_params (config, d3d11_params);
|
|
||||||
gst_d3d11_allocation_params_free (d3d11_params);
|
gst_d3d11_allocation_params_free (d3d11_params);
|
||||||
gst_buffer_pool_config_add_option (config,
|
|
||||||
GST_BUFFER_POOL_OPTION_VIDEO_META);
|
|
||||||
|
|
||||||
if (!gst_buffer_pool_set_config (pool, config)) {
|
if (!pool) {
|
||||||
g_object_unref (pool);
|
GST_ERROR_OBJECT (self, "Failed to create buffer pool");
|
||||||
goto config_failed;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size = GST_D3D11_BUFFER_POOL (pool)->buffer_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
gst_query_add_allocation_pool (query, pool, size, 2, 0);
|
/* We don't need more than two buffers */
|
||||||
|
gst_query_add_allocation_pool (query, pool, size, 0, 2);
|
||||||
if (pool)
|
if (pool)
|
||||||
g_object_unref (pool);
|
g_object_unref (pool);
|
||||||
|
|
||||||
|
@ -760,11 +734,6 @@ invalid_caps:
|
||||||
GST_WARNING_OBJECT (self, "invalid caps specified");
|
GST_WARNING_OBJECT (self, "invalid caps specified");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
config_failed:
|
|
||||||
{
|
|
||||||
GST_WARNING_OBJECT (self, "failed setting config");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue