d3d11convert: Add border-color property

Use user specified border-color instead of black color

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2697>
This commit is contained in:
Seungha Yang 2022-07-01 04:12:23 +09:00
parent 6a59dd95e8
commit 993b9b36db

View File

@ -50,6 +50,7 @@ static GstStaticCaps src_template_caps =
GST_D3D11_SRC_FORMATS)); GST_D3D11_SRC_FORMATS));
#define DEFAULT_ADD_BORDERS TRUE #define DEFAULT_ADD_BORDERS TRUE
#define DEFAULT_BORDER_COLOR G_GUINT64_CONSTANT(0xffff000000000000)
struct _GstD3D11BaseConvert struct _GstD3D11BaseConvert
{ {
@ -69,6 +70,9 @@ struct _GstD3D11BaseConvert
/* Updated by subclass */ /* Updated by subclass */
gboolean add_borders; gboolean add_borders;
guint64 border_color;
GMutex lock;
}; };
/** /**
@ -85,6 +89,7 @@ G_DEFINE_ABSTRACT_TYPE_WITH_CODE (GstD3D11BaseConvert, gst_d3d11_base_convert,
"d3d11convert")); "d3d11convert"));
static void gst_d3d11_base_convert_dispose (GObject * object); static void gst_d3d11_base_convert_dispose (GObject * object);
static void gst_d3d11_base_convert_finalize (GObject * object);
static GstCaps *gst_d3d11_base_convert_transform_caps (GstBaseTransform * static GstCaps *gst_d3d11_base_convert_transform_caps (GstBaseTransform *
trans, GstPadDirection direction, GstCaps * caps, GstCaps * filter); trans, GstPadDirection direction, GstCaps * caps, GstCaps * filter);
static GstCaps *gst_d3d11_base_convert_fixate_caps (GstBaseTransform * static GstCaps *gst_d3d11_base_convert_fixate_caps (GstBaseTransform *
@ -241,6 +246,7 @@ gst_d3d11_base_convert_class_init (GstD3D11BaseConvertClass * klass)
GstCaps *caps; GstCaps *caps;
gobject_class->dispose = gst_d3d11_base_convert_dispose; gobject_class->dispose = gst_d3d11_base_convert_dispose;
gobject_class->finalize = gst_d3d11_base_convert_finalize;
caps = gst_d3d11_get_updated_template_caps (&sink_template_caps); caps = gst_d3d11_get_updated_template_caps (&sink_template_caps);
gst_element_class_add_pad_template (element_class, gst_element_class_add_pad_template (element_class,
@ -278,6 +284,9 @@ static void
gst_d3d11_base_convert_init (GstD3D11BaseConvert * self) gst_d3d11_base_convert_init (GstD3D11BaseConvert * self)
{ {
self->add_borders = DEFAULT_ADD_BORDERS; self->add_borders = DEFAULT_ADD_BORDERS;
self->border_color = DEFAULT_BORDER_COLOR;
g_mutex_init (&self->lock);
} }
static void static void
@ -285,11 +294,23 @@ gst_d3d11_base_convert_dispose (GObject * object)
{ {
GstD3D11BaseConvert *self = GST_D3D11_BASE_CONVERT (object); GstD3D11BaseConvert *self = GST_D3D11_BASE_CONVERT (object);
g_mutex_lock (&self->lock);
gst_clear_object (&self->converter); gst_clear_object (&self->converter);
g_mutex_unlock (&self->lock);
G_OBJECT_CLASS (parent_class)->dispose (object); G_OBJECT_CLASS (parent_class)->dispose (object);
} }
static void
gst_d3d11_base_convert_finalize (GObject * object)
{
GstD3D11BaseConvert *self = GST_D3D11_BASE_CONVERT (object);
g_mutex_clear (&self->lock);
G_OBJECT_CLASS (parent_class)->finalize (object);
}
static GstCaps * static GstCaps *
gst_d3d11_base_convert_transform_caps (GstBaseTransform * gst_d3d11_base_convert_transform_caps (GstBaseTransform *
trans, GstPadDirection direction, GstCaps * caps, GstCaps * filter) trans, GstPadDirection direction, GstCaps * caps, GstCaps * filter)
@ -1399,6 +1420,7 @@ gst_d3d11_base_convert_set_info (GstD3D11BaseFilter * filter,
} }
} }
g_mutex_lock (&self->lock);
gst_clear_object (&self->converter); gst_clear_object (&self->converter);
GST_DEBUG_OBJECT (self, "Setup convert with format %s -> %s", GST_DEBUG_OBJECT (self, "Setup convert with format %s -> %s",
@ -1406,8 +1428,11 @@ gst_d3d11_base_convert_set_info (GstD3D11BaseFilter * filter,
gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (out_info))); gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (out_info)));
/* if present, these must match */ /* if present, these must match */
if (in_info->interlace_mode != out_info->interlace_mode) if (in_info->interlace_mode != out_info->interlace_mode) {
goto format_mismatch; GST_ERROR_OBJECT (self, "input and output formats do not match");
g_mutex_unlock (&self->lock);
return FALSE;
}
if (in_info->width == out_info->width && in_info->height == out_info->height if (in_info->width == out_info->width && in_info->height == out_info->height
&& in_info->finfo == out_info->finfo && self->borders_w == 0 && && in_info->finfo == out_info->finfo && self->borders_w == 0 &&
@ -1415,6 +1440,7 @@ gst_d3d11_base_convert_set_info (GstD3D11BaseFilter * filter,
gst_video_colorimetry_is_equal (&in_info->colorimetry, gst_video_colorimetry_is_equal (&in_info->colorimetry,
&out_info->colorimetry)) { &out_info->colorimetry)) {
self->same_caps = TRUE; self->same_caps = TRUE;
g_mutex_unlock (&self->lock);
return TRUE; return TRUE;
} }
@ -1422,6 +1448,7 @@ gst_d3d11_base_convert_set_info (GstD3D11BaseFilter * filter,
nullptr); nullptr);
if (!self->converter) { if (!self->converter) {
GST_ERROR_OBJECT (self, "Couldn't create converter"); GST_ERROR_OBJECT (self, "Couldn't create converter");
g_mutex_unlock (&self->lock);
return FALSE; return FALSE;
} }
@ -1463,17 +1490,14 @@ gst_d3d11_base_convert_set_info (GstD3D11BaseFilter * filter,
"dest-height", (gint) (self->out_rect.bottom - self->out_rect.top), "dest-height", (gint) (self->out_rect.bottom - self->out_rect.top),
nullptr); nullptr);
if (self->borders_w > 0 || self->borders_h > 0) if (self->borders_w > 0 || self->borders_h > 0) {
g_object_set (self->converter, "fill-border", TRUE, nullptr); g_object_set (self->converter, "fill-border", TRUE, "border-color",
self->border_color, nullptr);
}
g_mutex_unlock (&self->lock);
return TRUE; return TRUE;
/* ERRORS */
format_mismatch:
{
GST_ERROR_OBJECT (self, "input and output formats do not match");
return FALSE;
}
} }
static gboolean static gboolean
@ -1783,6 +1807,17 @@ gst_d3d11_base_convert_set_add_border (GstD3D11BaseConvert * self,
gst_base_transform_reconfigure_src (GST_BASE_TRANSFORM_CAST (self)); gst_base_transform_reconfigure_src (GST_BASE_TRANSFORM_CAST (self));
} }
static void
gst_d3d11_base_convert_set_border_color (GstD3D11BaseConvert * self,
guint64 border_color)
{
g_mutex_lock (&self->lock);
self->border_color = border_color;
if (self->converter)
g_object_set (self->converter, "border-color", self->border_color, nullptr);
g_mutex_unlock (&self->lock);
}
/** /**
* SECTION:element-d3d11convert * SECTION:element-d3d11convert
* @title: d3d11convert * @title: d3d11convert
@ -1811,6 +1846,7 @@ enum
{ {
PROP_CONVERT_0, PROP_CONVERT_0,
PROP_CONVERT_ADD_BORDERS, PROP_CONVERT_ADD_BORDERS,
PROP_CONVERT_BORDER_COLOR,
}; };
struct _GstD3D11Convert struct _GstD3D11Convert
@ -1837,7 +1873,7 @@ gst_d3d11_convert_class_init (GstD3D11ConvertClass * klass)
/** /**
* GstD3D11Convert:add-borders: * GstD3D11Convert:add-borders:
* *
* Add black borders if necessary to keep the display aspect ratio * Add borders if necessary to keep the display aspect ratio
* *
* Since: 1.20 * Since: 1.20
*/ */
@ -1847,6 +1883,19 @@ gst_d3d11_convert_class_init (GstD3D11ConvertClass * klass)
DEFAULT_ADD_BORDERS, (GParamFlags) (GST_PARAM_MUTABLE_PLAYING | DEFAULT_ADD_BORDERS, (GParamFlags) (GST_PARAM_MUTABLE_PLAYING |
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
/**
* GstD3D11Convert:border-color:
*
* Border color to use in ARGB64 format
*
* Since: 1.22
*/
g_object_class_install_property (gobject_class, PROP_CONVERT_BORDER_COLOR,
g_param_spec_uint64 ("border-color", "Border color",
"Border color to use in ARGB64 format", 0, G_MAXUINT64,
DEFAULT_BORDER_COLOR, (GParamFlags) (GST_PARAM_MUTABLE_PLAYING |
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
gst_element_class_set_static_metadata (element_class, gst_element_class_set_static_metadata (element_class,
"Direct3D11 colorspace converter and scaler", "Direct3D11 colorspace converter and scaler",
"Filter/Converter/Scaler/Video/Hardware", "Filter/Converter/Scaler/Video/Hardware",
@ -1870,6 +1919,10 @@ gst_d3d11_convert_set_property (GObject * object, guint prop_id,
case PROP_CONVERT_ADD_BORDERS: case PROP_CONVERT_ADD_BORDERS:
gst_d3d11_base_convert_set_add_border (base, g_value_get_boolean (value)); gst_d3d11_base_convert_set_add_border (base, g_value_get_boolean (value));
break; break;
case PROP_CONVERT_BORDER_COLOR:
gst_d3d11_base_convert_set_border_color (base,
g_value_get_uint64 (value));
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break; break;
@ -1886,6 +1939,9 @@ gst_d3d11_convert_get_property (GObject * object, guint prop_id,
case PROP_CONVERT_ADD_BORDERS: case PROP_CONVERT_ADD_BORDERS:
g_value_set_boolean (value, base->add_borders); g_value_set_boolean (value, base->add_borders);
break; break;
case PROP_CONVERT_BORDER_COLOR:
g_value_set_uint64 (value, base->border_color);
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break; break;
@ -2014,6 +2070,7 @@ enum
{ {
PROP_SCALE_0, PROP_SCALE_0,
PROP_SCALE_ADD_BORDERS, PROP_SCALE_ADD_BORDERS,
PROP_SCALE_BORDER_COLOR,
}; };
struct _GstD3D11Scale struct _GstD3D11Scale
@ -2045,7 +2102,7 @@ gst_d3d11_scale_class_init (GstD3D11ScaleClass * klass)
/** /**
* GstD3D11Scale:add-borders: * GstD3D11Scale:add-borders:
* *
* Add black borders if necessary to keep the display aspect ratio * Add borders if necessary to keep the display aspect ratio
* *
* Since: 1.20 * Since: 1.20
*/ */
@ -2055,6 +2112,19 @@ gst_d3d11_scale_class_init (GstD3D11ScaleClass * klass)
DEFAULT_ADD_BORDERS, (GParamFlags) (GST_PARAM_MUTABLE_PLAYING | DEFAULT_ADD_BORDERS, (GParamFlags) (GST_PARAM_MUTABLE_PLAYING |
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))); G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
/**
* GstD3D11Scale:border-color:
*
* Border color to use in ARGB64 format
*
* Since: 1.22
*/
g_object_class_install_property (gobject_class, PROP_SCALE_BORDER_COLOR,
g_param_spec_uint64 ("border-color", "Border color",
"Border color to use in ARGB64 format", 0, G_MAXUINT64,
DEFAULT_BORDER_COLOR, (GParamFlags) (GST_PARAM_MUTABLE_PLAYING |
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
gst_element_class_set_static_metadata (element_class, gst_element_class_set_static_metadata (element_class,
"Direct3D11 scaler", "Direct3D11 scaler",
"Filter/Converter/Video/Scaler/Hardware", "Filter/Converter/Video/Scaler/Hardware",
@ -2078,9 +2148,13 @@ gst_d3d11_scale_set_property (GObject * object, guint prop_id,
GstD3D11BaseConvert *base = GST_D3D11_BASE_CONVERT (object); GstD3D11BaseConvert *base = GST_D3D11_BASE_CONVERT (object);
switch (prop_id) { switch (prop_id) {
case PROP_CONVERT_ADD_BORDERS: case PROP_SCALE_ADD_BORDERS:
gst_d3d11_base_convert_set_add_border (base, g_value_get_boolean (value)); gst_d3d11_base_convert_set_add_border (base, g_value_get_boolean (value));
break; break;
case PROP_SCALE_BORDER_COLOR:
gst_d3d11_base_convert_set_border_color (base,
g_value_get_uint64 (value));
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break; break;
@ -2094,9 +2168,12 @@ gst_d3d11_scale_get_property (GObject * object, guint prop_id,
GstD3D11BaseConvert *base = GST_D3D11_BASE_CONVERT (object); GstD3D11BaseConvert *base = GST_D3D11_BASE_CONVERT (object);
switch (prop_id) { switch (prop_id) {
case PROP_CONVERT_ADD_BORDERS: case PROP_SCALE_ADD_BORDERS:
g_value_set_boolean (value, base->add_borders); g_value_set_boolean (value, base->add_borders);
break; break;
case PROP_SCALE_BORDER_COLOR:
g_value_set_uint64 (value, base->border_color);
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break; break;