d3d11converter: Objectify converter

... and set conversion options via property

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2622>
This commit is contained in:
Seungha Yang 2022-06-16 02:18:43 +09:00 committed by GStreamer Marge Bot
parent 3ed94c2dde
commit 59f39724b7
9 changed files with 696 additions and 504 deletions

View file

@ -1322,7 +1322,6 @@ gst_d3d11_compositor_pad_setup_converter (GstVideoAggregatorPad * pad,
{
GstD3D11CompositorPad *cpad = GST_D3D11_COMPOSITOR_PAD (pad);
GstD3D11Compositor *self = GST_D3D11_COMPOSITOR (vagg);
RECT rect;
gint width, height;
GstVideoInfo *info = &vagg->info;
GstVideoRectangle frame_rect;
@ -1333,36 +1332,20 @@ gst_d3d11_compositor_pad_setup_converter (GstVideoAggregatorPad * pad,
#endif
if (!cpad->convert || self->reconfigured) {
GstStructure *config;
if (cpad->convert)
gst_d3d11_converter_free (cpad->convert);
config = gst_structure_new_empty ("config");
if (cpad->alpha <= 1.0) {
gst_structure_set (config, GST_D3D11_CONVERTER_OPT_ALPHA_VALUE,
G_TYPE_DOUBLE, cpad->alpha, nullptr);
}
gst_clear_object (&cpad->convert);
cpad->convert =
gst_d3d11_converter_new (self->device, &pad->info, &vagg->info, config);
gst_d3d11_converter_new (self->device, &pad->info, &vagg->info);
if (!cpad->convert) {
GST_ERROR_OBJECT (pad, "Couldn't create converter");
return FALSE;
}
g_object_set (cpad->convert, "alpha", cpad->alpha, nullptr);
is_first = TRUE;
} else if (cpad->alpha_updated) {
GstStructure *config;
config = gst_structure_new_empty ("config");
if (cpad->alpha <= 1.0) {
gst_structure_set (config, GST_D3D11_CONVERTER_OPT_ALPHA_VALUE,
G_TYPE_DOUBLE, cpad->alpha, nullptr);
}
gst_d3d11_converter_update_config (cpad->convert, config);
g_object_set (cpad->convert, "alpha", cpad->alpha, nullptr);
cpad->alpha_updated = FALSE;
}
@ -1387,6 +1370,12 @@ gst_d3d11_compositor_pad_setup_converter (GstVideoAggregatorPad * pad,
}
cpad->blend = blend;
g_object_set (cpad->convert, "blend-state", blend,
"blend-factor-red", cpad->blend_factor[0],
"blend-factor-green", cpad->blend_factor[1],
"blend-factor-blue", cpad->blend_factor[2],
"blend-factor-alpha", cpad->blend_factor[3],
"blend-sample-mask", 0xffffffff, nullptr);
}
if (!is_first && !cpad->position_updated)
@ -1398,26 +1387,25 @@ gst_d3d11_compositor_pad_setup_converter (GstVideoAggregatorPad * pad,
frame_rect = clamp_rectangle (cpad->xpos + x_offset, cpad->ypos + y_offset,
width, height, GST_VIDEO_INFO_WIDTH (info), GST_VIDEO_INFO_HEIGHT (info));
rect.left = frame_rect.x;
rect.top = frame_rect.y;
rect.right = frame_rect.x + frame_rect.w;
rect.bottom = frame_rect.y + frame_rect.h;
#ifndef GST_DISABLE_GST_DEBUG
g_object_get (pad, "zorder", &zorder, NULL);
GST_LOG_OBJECT (pad, "Update position, pad-xpos %d, pad-ypos %d, "
"pad-zorder %d, pad-width %d, pad-height %d, in-resolution %dx%d, "
"out-resoution %dx%d, dst-{left,top,right,bottom} %d-%d-%d-%d",
"out-resoution %dx%d, dst-{x,y,width,height} %d-%d-%d-%d",
cpad->xpos, cpad->ypos, zorder, cpad->width, cpad->height,
GST_VIDEO_INFO_WIDTH (&pad->info), GST_VIDEO_INFO_HEIGHT (&pad->info),
GST_VIDEO_INFO_WIDTH (info), GST_VIDEO_INFO_HEIGHT (info),
(gint) rect.left, (gint) rect.top, (gint) rect.right, (gint) rect.bottom);
frame_rect.x, frame_rect.y, frame_rect.w, frame_rect.h);
#endif
cpad->position_updated = FALSE;
return gst_d3d11_converter_update_dest_rect (cpad->convert, &rect);
g_object_set (cpad->convert, "dest-x", frame_rect.x,
"dest-y", frame_rect.y, "dest-width", frame_rect.w,
"dest-height", frame_rect.h, nullptr);
return TRUE;
}
static GstStaticCaps pad_template_caps =
@ -1681,7 +1669,7 @@ gst_d3d11_compositor_pad_clear_resource (GstD3D11Compositor * self,
gst_buffer_pool_set_active (cpad->fallback_pool, FALSE);
gst_clear_object (&cpad->fallback_pool);
}
g_clear_pointer (&cpad->convert, gst_d3d11_converter_free);
gst_clear_object (&cpad->convert);
GST_D3D11_CLEAR_COM (cpad->blend);
return TRUE;
@ -2420,8 +2408,7 @@ gst_d3d11_compositor_aggregate_frames (GstVideoAggregator * vagg,
}
}
if (!gst_d3d11_converter_convert_unlocked (cpad->convert, srv, rtv,
cpad->blend, cpad->blend_factor)) {
if (!gst_d3d11_converter_convert_unlocked (cpad->convert, srv, rtv)) {
GST_ERROR_OBJECT (self, "Couldn't convert frame");
ret = GST_FLOW_ERROR;
break;

View file

@ -305,7 +305,7 @@ gst_d3d11_base_convert_clear_shader_resource (GstD3D11BaseConvert * self)
GST_D3D11_CLEAR_COM (self->out_texture[i]);
}
g_clear_pointer (&self->converter, gst_d3d11_converter_free);
gst_clear_object (&self->converter);
g_clear_pointer (&self->processor, gst_d3d11_video_processor_free);
self->processor_in_use = FALSE;
@ -1720,7 +1720,6 @@ gst_d3d11_base_convert_set_info (GstD3D11BaseFilter * filter,
GstD3D11BaseConvert *self = GST_D3D11_BASE_CONVERT (filter);
const GstVideoInfo *unknown_info;
gint from_dar_n, from_dar_d, to_dar_n, to_dar_d;
D3D11_VIEWPORT view_port;
gint border_offset_x = 0;
gint border_offset_y = 0;
@ -1799,9 +1798,7 @@ gst_d3d11_base_convert_set_info (GstD3D11BaseFilter * filter,
goto format_unknown;
}
self->converter =
gst_d3d11_converter_new (filter->device, in_info, out_info, nullptr);
self->converter = gst_d3d11_converter_new (filter->device, in_info, out_info);
if (!self->converter) {
GST_ERROR_OBJECT (self, "couldn't set converter");
return FALSE;
@ -1891,14 +1888,11 @@ gst_d3d11_base_convert_set_info (GstD3D11BaseFilter * filter,
self->out_rect.bottom = GST_VIDEO_INFO_HEIGHT (out_info);
}
view_port.TopLeftX = border_offset_x;
view_port.TopLeftY = border_offset_y;
view_port.Width = GST_VIDEO_INFO_WIDTH (out_info) - self->borders_w;
view_port.Height = GST_VIDEO_INFO_HEIGHT (out_info) - self->borders_h;
view_port.MinDepth = 0.0f;
view_port.MaxDepth = 1.0f;
gst_d3d11_converter_update_viewport (self->converter, &view_port);
g_object_set (self->converter, "dest-x", (gint) self->out_rect.left,
"dest-y", (gint) self->out_rect.top,
"dest-width", (gint) (self->out_rect.right - self->out_rect.left),
"dest-height", (gint) (self->out_rect.bottom - self->out_rect.top),
nullptr);
return TRUE;
@ -2137,7 +2131,7 @@ gst_d3d11_base_convert_transform (GstBaseTransform * trans,
if (!gst_d3d11_converter_convert (self->converter,
copy_input ? self->shader_resource_view : resource_view,
target_rtv, NULL, NULL)) {
target_rtv)) {
goto conversion_failed;
}

File diff suppressed because it is too large Load diff

View file

@ -26,46 +26,50 @@
G_BEGIN_DECLS
typedef struct _GstD3D11Converter GstD3D11Converter;
#define GST_TYPE_D3D11_CONVERTER (gst_d3d11_converter_get_type())
#define GST_D3D11_CONVERTER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_D3D11_CONVERTER,GstD3D11Converter))
#define GST_D3D11_CONVERTER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_D3D11_CONVERTER,GstD3D11ConverterClass))
#define GST_D3D11_CONVERTER_GET_CLASS(obj) (GST_D3D11_CONVERTER_CLASS(G_OBJECT_GET_CLASS(obj)))
#define GST_IS_D3D11_CONVERTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_D3D11_CONVERTER))
#define GST_IS_D3D11_CONVERTER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_D3D11_CONVERTER))
#define GST_D3D11_CONVERTER_CAST(obj) ((GstD3D11Converter*)(obj))
/**
* GST_D3D11_CONVERTER_OPT_ALPHA_VALUE
*
* #G_TYPE_FLOAT, the alpha value color value to use.
* Default is 1.0
*/
#define GST_D3D11_CONVERTER_OPT_ALPHA_VALUE "GstD3D11Converter.alpha-value"
typedef struct _GstD3D11Converter GstD3D11Converter;
typedef struct _GstD3D11ConverterClass GstD3D11ConverterClass;
typedef struct _GstD3D11ConverterPrivate GstD3D11ConverterPrivate;
struct _GstD3D11Converter
{
GstObject parent;
GstD3D11Device *device;
/*< private >*/
GstD3D11ConverterPrivate *priv;
gpointer _gst_reserved[GST_PADDING];
};
struct _GstD3D11ConverterClass
{
GstObjectClass parent_class;
/*< private >*/
gpointer _gst_reserved[GST_PADDING];
};
GType gst_d3d11_converter_get_type (void);
GstD3D11Converter * gst_d3d11_converter_new (GstD3D11Device * device,
const GstVideoInfo * in_info,
const GstVideoInfo * out_info,
GstStructure * config);
void gst_d3d11_converter_free (GstD3D11Converter * converter);
const GstVideoInfo * out_info);
gboolean gst_d3d11_converter_convert (GstD3D11Converter * converter,
ID3D11ShaderResourceView *srv[GST_VIDEO_MAX_PLANES],
ID3D11RenderTargetView *rtv[GST_VIDEO_MAX_PLANES],
ID3D11BlendState *blend,
gfloat blend_factor[4]);
ID3D11RenderTargetView *rtv[GST_VIDEO_MAX_PLANES]);
gboolean gst_d3d11_converter_convert_unlocked (GstD3D11Converter * converter,
ID3D11ShaderResourceView *srv[GST_VIDEO_MAX_PLANES],
ID3D11RenderTargetView *rtv[GST_VIDEO_MAX_PLANES],
ID3D11BlendState *blend,
gfloat blend_factor[4]);
gboolean gst_d3d11_converter_update_viewport (GstD3D11Converter * converter,
const D3D11_VIEWPORT * viewport);
gboolean gst_d3d11_converter_update_src_rect (GstD3D11Converter * converter,
const RECT * src_rect);
gboolean gst_d3d11_converter_update_dest_rect (GstD3D11Converter * converter,
const RECT * dest_rect);
gboolean gst_d3d11_converter_update_config (GstD3D11Converter * converter,
GstStructure * config);
ID3D11RenderTargetView *rtv[GST_VIDEO_MAX_PLANES]);
G_END_DECLS

View file

@ -1283,7 +1283,7 @@ gst_d3d11_test_src_clear_resource (GstD3D11TestSrc * self)
}
g_clear_pointer (&self->render, gst_d3d11_test_src_render_free);
g_clear_pointer (&self->converter, gst_d3d11_converter_free);
gst_clear_object (&self->converter);
}
static gboolean
@ -1297,7 +1297,7 @@ gst_d3d11_test_src_setup_resource (GstD3D11TestSrc * self, GstCaps * caps)
gst_video_info_set_format (&draw_info, GST_VIDEO_FORMAT_RGBA,
self->info.width, self->info.height);
self->converter = gst_d3d11_converter_new (self->device,
&draw_info, &self->info, nullptr);
&draw_info, &self->info);
if (!self->converter) {
GST_ERROR_OBJECT (self, "Failed to create converter");
@ -1775,7 +1775,7 @@ gst_d3d11_test_src_create (GstBaseSrc * bsrc, guint64 offset,
gst_d3d11_device_lock (self->device);
gst_d3d11_test_src_draw_pattern (self, context_handle, pattern_rtv);
gst_d3d11_converter_convert_unlocked (self->converter, pattern_srv,
convert_rtv, nullptr, nullptr);
convert_rtv);
gst_d3d11_device_unlock (self->device);
gst_memory_unmap (mem, &render_info);

View file

@ -265,13 +265,12 @@ gst_d3d11_window_dispose (GObject * object)
{
GstD3D11Window *self = GST_D3D11_WINDOW (object);
if (self->device) {
if (self->device)
gst_d3d11_window_release_resources (self->device, self);
}
g_clear_pointer (&self->processor, gst_d3d11_video_processor_free);
g_clear_pointer (&self->converter, gst_d3d11_converter_free);
g_clear_pointer (&self->compositor, gst_d3d11_overlay_compositor_free);
gst_clear_object (&self->converter);
gst_clear_buffer (&self->cached_buffer);
gst_clear_object (&self->device);
@ -460,8 +459,8 @@ gst_d3d11_window_prepare_default (GstD3D11Window * window, guint display_width,
/* Step 1: Clear old resources and objects */
gst_clear_buffer (&window->cached_buffer);
g_clear_pointer (&window->processor, gst_d3d11_video_processor_free);
g_clear_pointer (&window->converter, gst_d3d11_converter_free);
g_clear_pointer (&window->compositor, gst_d3d11_overlay_compositor_free);
gst_clear_object (&window->converter);
window->processor_in_use = FALSE;
@ -576,6 +575,8 @@ gst_d3d11_window_prepare_default (GstD3D11Window * window, guint display_width,
window->input_rect.right = GST_VIDEO_INFO_WIDTH (&window->info);
window->input_rect.bottom = GST_VIDEO_INFO_HEIGHT (&window->info);
window->prev_input_rect = window->input_rect;
/* Step 4: Decide render color space and set it on converter/processor */
{
GstVideoMasteringDisplayInfo minfo;
@ -721,7 +722,7 @@ gst_d3d11_window_prepare_default (GstD3D11Window * window, guint display_width,
/* configure shader even if video processor is available for fallback */
window->converter =
gst_d3d11_converter_new (window->device, &window->info,
&window->render_info, nullptr);
&window->render_info);
if (!window->converter) {
GST_ERROR_OBJECT (window, "Cannot create converter");
@ -846,13 +847,19 @@ gst_d3d11_window_do_convert (GstD3D11Window * self,
ID3D11ShaderResourceView * srv[GST_VIDEO_MAX_PLANES],
ID3D11RenderTargetView * rtv, RECT * input_rect)
{
if (!gst_d3d11_converter_update_src_rect (self->converter, input_rect)) {
GST_ERROR_OBJECT (self, "Failed to update src rect");
return FALSE;
RECT *prev = &self->prev_input_rect;
if (input_rect->left != prev->left || input_rect->top != prev->top ||
input_rect->right != prev->right || input_rect->bottom != prev->bottom) {
g_object_set (self->converter, "src-x", (gint) input_rect->left,
"src-y", (gint) input_rect->top,
"src-width", (gint) (input_rect->right - input_rect->left),
"src-height", (gint) (input_rect->bottom - input_rect->top), nullptr);
*prev = *input_rect;
}
if (!gst_d3d11_converter_convert_unlocked (self->converter,
srv, &rtv, NULL, NULL)) {
if (!gst_d3d11_converter_convert_unlocked (self->converter, srv, &rtv)) {
GST_ERROR_OBJECT (self, "Couldn't render to backbuffer using converter");
return FALSE;
} else {
@ -934,7 +941,13 @@ gst_d3d111_window_present (GstD3D11Window * self, GstBuffer * buffer,
viewport.Height = self->render_rect.bottom - self->render_rect.top;
viewport.MinDepth = 0.0f;
viewport.MaxDepth = 1.0f;
gst_d3d11_converter_update_viewport (self->converter, &viewport);
g_object_set (self->converter, "dest-x", (gint) self->render_rect.left,
"dest-y", (gint) self->render_rect.top,
"dest-width",
(gint) (self->render_rect.right - self->render_rect.left),
"dest-height",
(gint) (self->render_rect.bottom - self->render_rect.top), nullptr);
gst_d3d11_overlay_compositor_update_viewport (self->compositor,
&viewport);
}

View file

@ -108,6 +108,7 @@ struct _GstD3D11Window
/* input resolution */
RECT input_rect;
RECT prev_input_rect;
/* requested rect via gst_d3d11_window_render */
GstVideoRectangle rect;

View file

@ -86,8 +86,8 @@ gst_d3d11_window_dummy_prepare (GstD3D11Window * window,
gboolean * video_processor_available, GError ** error)
{
g_clear_pointer (&window->processor, gst_d3d11_video_processor_free);
g_clear_pointer (&window->converter, gst_d3d11_converter_free);
g_clear_pointer (&window->compositor, gst_d3d11_overlay_compositor_free);
gst_clear_object (&window->converter);
/* We are supporting only RGBA, BGRA or RGB10A2_LE formats but we don't know
* which format texture will be used at this moment */
@ -172,7 +172,7 @@ gst_d3d11_window_dummy_prepare (GstD3D11Window * window,
window->converter =
gst_d3d11_converter_new (window->device, &window->info,
&window->render_info, nullptr);
&window->render_info);
if (!window->converter) {
GST_ERROR_OBJECT (window, "Cannot create converter");

View file

@ -85,7 +85,6 @@
GST_DEBUG_CATEGORY (gst_d3d11_debug);
GST_DEBUG_CATEGORY (gst_d3d11_shader_debug);
GST_DEBUG_CATEGORY (gst_d3d11_converter_debug);
GST_DEBUG_CATEGORY (gst_d3d11_plugin_utils_debug);
GST_DEBUG_CATEGORY (gst_d3d11_format_debug);
GST_DEBUG_CATEGORY (gst_d3d11_device_debug);
@ -119,8 +118,6 @@ plugin_init (GstPlugin * plugin)
GST_DEBUG_CATEGORY_INIT (gst_d3d11_debug, "d3d11", 0, "direct3d 11 plugin");
GST_DEBUG_CATEGORY_INIT (gst_d3d11_shader_debug,
"d3d11shader", 0, "d3d11shader");
GST_DEBUG_CATEGORY_INIT (gst_d3d11_converter_debug,
"d3d11converter", 0, "d3d11converter");
GST_DEBUG_CATEGORY_INIT (gst_d3d11_plugin_utils_debug,
"d3d11pluginutils", 0, "d3d11 plugin utility functions");
GST_DEBUG_CATEGORY_INIT (gst_d3d11_overlay_compositor_debug,