d3d11convert: Add new subclasses for only color convert or resize

New d3d11colorconvert and d3d11scale elements will perform only
colorspace conversion and rescale, respectively. Those new elements
would be useful when only colorspace conversion or rescale is required
and the other part should be done by another elements.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/1323>
This commit is contained in:
Seungha Yang 2020-08-03 03:19:34 +09:00 committed by GStreamer Merge Bot
parent 4c19962997
commit eecb130bd9
3 changed files with 318 additions and 62 deletions

View file

@ -54,8 +54,8 @@
#include "gstd3d11device.h" #include "gstd3d11device.h"
#include "gstd3d11bufferpool.h" #include "gstd3d11bufferpool.h"
GST_DEBUG_CATEGORY_STATIC (gst_d3d11_color_convert_debug); GST_DEBUG_CATEGORY_STATIC (gst_d3d11_convert_debug);
#define GST_CAT_DEFAULT gst_d3d11_color_convert_debug #define GST_CAT_DEFAULT gst_d3d11_convert_debug
static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink",
GST_PAD_SINK, GST_PAD_SINK,
@ -79,7 +79,7 @@ static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src",
GST_D3D11_SRC_FORMATS)) GST_D3D11_SRC_FORMATS))
); );
struct _GstD3D11ColorConvert struct _GstD3D11Convert
{ {
GstD3D11BaseFilter parent; GstD3D11BaseFilter parent;
@ -101,34 +101,122 @@ struct _GstD3D11ColorConvert
D3D11_BOX out_src_box; D3D11_BOX out_src_box;
}; };
#define gst_d3d11_color_convert_parent_class parent_class struct _GstD3D11ColorConvert
G_DEFINE_TYPE (GstD3D11ColorConvert, {
gst_d3d11_color_convert, GST_TYPE_D3D11_BASE_FILTER); GstD3D11Convert parent;
};
static void gst_d3d11_color_convert_dispose (GObject * object); struct _GstD3D11Scale
static GstCaps *gst_d3d11_color_convert_transform_caps (GstBaseTransform * {
GstD3D11Convert parent;
};
#define gst_d3d11_convert_parent_class parent_class
G_DEFINE_TYPE (GstD3D11Convert, gst_d3d11_convert, GST_TYPE_D3D11_BASE_FILTER);
static void gst_d3d11_convert_dispose (GObject * object);
static GstCaps *gst_d3d11_convert_transform_caps (GstBaseTransform *
trans, GstPadDirection direction, GstCaps * caps, GstCaps * filter); trans, GstPadDirection direction, GstCaps * caps, GstCaps * filter);
static GstCaps *gst_d3d11_color_convert_fixate_caps (GstBaseTransform * static GstCaps *gst_d3d11_convert_fixate_caps (GstBaseTransform *
base, GstPadDirection direction, GstCaps * caps, GstCaps * othercaps); base, GstPadDirection direction, GstCaps * caps, GstCaps * othercaps);
static gboolean gst_d3d11_color_convert_filter_meta (GstBaseTransform * trans, static gboolean gst_d3d11_convert_filter_meta (GstBaseTransform * trans,
GstQuery * query, GType api, const GstStructure * params); GstQuery * query, GType api, const GstStructure * params);
static gboolean static gboolean
gst_d3d11_color_convert_propose_allocation (GstBaseTransform * trans, gst_d3d11_convert_propose_allocation (GstBaseTransform * trans,
GstQuery * decide_query, GstQuery * query); GstQuery * decide_query, GstQuery * query);
static gboolean static gboolean
gst_d3d11_color_convert_decide_allocation (GstBaseTransform * trans, gst_d3d11_convert_decide_allocation (GstBaseTransform * trans,
GstQuery * query); GstQuery * query);
static GstFlowReturn gst_d3d11_color_convert_transform (GstBaseTransform * static GstFlowReturn gst_d3d11_convert_transform (GstBaseTransform *
trans, GstBuffer * inbuf, GstBuffer * outbuf); trans, GstBuffer * inbuf, GstBuffer * outbuf);
static gboolean gst_d3d11_color_convert_set_info (GstD3D11BaseFilter * filter, static gboolean gst_d3d11_convert_set_info (GstD3D11BaseFilter * filter,
GstCaps * incaps, GstVideoInfo * in_info, GstCaps * outcaps, GstCaps * incaps, GstVideoInfo * in_info, GstCaps * outcaps,
GstVideoInfo * out_info); GstVideoInfo * out_info);
/* copies the given caps */ /* copies the given caps */
static GstCaps * static GstCaps *
gst_d3d11_color_convert_caps_remove_format_and_rangify_size_info (GstCaps * gst_d3d11_convert_caps_remove_format_info (GstCaps * caps)
caps) {
GstStructure *st;
GstCapsFeatures *f;
gint i, n;
GstCaps *res;
GstCapsFeatures *feature =
gst_caps_features_from_string (GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY);
res = gst_caps_new_empty ();
n = gst_caps_get_size (caps);
for (i = 0; i < n; i++) {
st = gst_caps_get_structure (caps, i);
f = gst_caps_get_features (caps, i);
/* If this is already expressed by the existing caps
* skip this structure */
if (i > 0 && gst_caps_is_subset_structure_full (res, st, f))
continue;
st = gst_structure_copy (st);
/* Only remove format info for the cases when we can actually convert */
if (!gst_caps_features_is_any (f)
&& gst_caps_features_is_equal (f, feature)) {
gst_structure_remove_fields (st, "format", "colorimetry", "chroma-site",
NULL);
}
gst_caps_append_structure_full (res, st, gst_caps_features_copy (f));
}
gst_caps_features_free (feature);
return res;
}
static GstCaps *
gst_d3d11_convert_caps_rangify_size_info (GstCaps * caps)
{
GstStructure *st;
GstCapsFeatures *f;
gint i, n;
GstCaps *res;
GstCapsFeatures *feature =
gst_caps_features_from_string (GST_CAPS_FEATURE_MEMORY_D3D11_MEMORY);
res = gst_caps_new_empty ();
n = gst_caps_get_size (caps);
for (i = 0; i < n; i++) {
st = gst_caps_get_structure (caps, i);
f = gst_caps_get_features (caps, i);
/* If this is already expressed by the existing caps
* skip this structure */
if (i > 0 && gst_caps_is_subset_structure_full (res, st, f))
continue;
st = gst_structure_copy (st);
/* Only remove format info for the cases when we can actually convert */
if (!gst_caps_features_is_any (f)
&& gst_caps_features_is_equal (f, feature)) {
gst_structure_set (st, "width", GST_TYPE_INT_RANGE, 1, G_MAXINT,
"height", GST_TYPE_INT_RANGE, 1, G_MAXINT, NULL);
/* if pixel aspect ratio, make a range of it */
if (gst_structure_has_field (st, "pixel-aspect-ratio")) {
gst_structure_set (st, "pixel-aspect-ratio",
GST_TYPE_FRACTION_RANGE, 1, G_MAXINT, G_MAXINT, 1, NULL);
}
}
gst_caps_append_structure_full (res, st, gst_caps_features_copy (f));
}
gst_caps_features_free (feature);
return res;
}
static GstCaps *
gst_d3d11_convert_caps_remove_format_and_rangify_size_info (GstCaps * caps)
{ {
GstStructure *st; GstStructure *st;
GstCapsFeatures *f; GstCapsFeatures *f;
@ -172,14 +260,14 @@ gst_d3d11_color_convert_caps_remove_format_and_rangify_size_info (GstCaps *
} }
static void static void
gst_d3d11_color_convert_class_init (GstD3D11ColorConvertClass * klass) gst_d3d11_convert_class_init (GstD3D11ConvertClass * klass)
{ {
GObjectClass *gobject_class = G_OBJECT_CLASS (klass); GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
GstElementClass *element_class = GST_ELEMENT_CLASS (klass); GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
GstBaseTransformClass *trans_class = GST_BASE_TRANSFORM_CLASS (klass); GstBaseTransformClass *trans_class = GST_BASE_TRANSFORM_CLASS (klass);
GstD3D11BaseFilterClass *bfilter_class = GST_D3D11_BASE_FILTER_CLASS (klass); GstD3D11BaseFilterClass *bfilter_class = GST_D3D11_BASE_FILTER_CLASS (klass);
gobject_class->dispose = gst_d3d11_color_convert_dispose; gobject_class->dispose = gst_d3d11_convert_dispose;
gst_element_class_add_static_pad_template (element_class, &sink_template); gst_element_class_add_static_pad_template (element_class, &sink_template);
gst_element_class_add_static_pad_template (element_class, &src_template); gst_element_class_add_static_pad_template (element_class, &src_template);
@ -194,32 +282,28 @@ gst_d3d11_color_convert_class_init (GstD3D11ColorConvertClass * klass)
trans_class->passthrough_on_same_caps = TRUE; trans_class->passthrough_on_same_caps = TRUE;
trans_class->transform_caps = trans_class->transform_caps =
GST_DEBUG_FUNCPTR (gst_d3d11_color_convert_transform_caps); GST_DEBUG_FUNCPTR (gst_d3d11_convert_transform_caps);
trans_class->fixate_caps = trans_class->fixate_caps = GST_DEBUG_FUNCPTR (gst_d3d11_convert_fixate_caps);
GST_DEBUG_FUNCPTR (gst_d3d11_color_convert_fixate_caps); trans_class->filter_meta = GST_DEBUG_FUNCPTR (gst_d3d11_convert_filter_meta);
trans_class->filter_meta =
GST_DEBUG_FUNCPTR (gst_d3d11_color_convert_filter_meta);
trans_class->propose_allocation = trans_class->propose_allocation =
GST_DEBUG_FUNCPTR (gst_d3d11_color_convert_propose_allocation); GST_DEBUG_FUNCPTR (gst_d3d11_convert_propose_allocation);
trans_class->decide_allocation = trans_class->decide_allocation =
GST_DEBUG_FUNCPTR (gst_d3d11_color_convert_decide_allocation); GST_DEBUG_FUNCPTR (gst_d3d11_convert_decide_allocation);
trans_class->transform = trans_class->transform = GST_DEBUG_FUNCPTR (gst_d3d11_convert_transform);
GST_DEBUG_FUNCPTR (gst_d3d11_color_convert_transform);
bfilter_class->set_info = bfilter_class->set_info = GST_DEBUG_FUNCPTR (gst_d3d11_convert_set_info);
GST_DEBUG_FUNCPTR (gst_d3d11_color_convert_set_info);
GST_DEBUG_CATEGORY_INIT (gst_d3d11_color_convert_debug, GST_DEBUG_CATEGORY_INIT (gst_d3d11_convert_debug,
"d3d11convert", 0, "d3d11convert element"); "d3d11convert", 0, "d3d11convert element");
} }
static void static void
gst_d3d11_color_convert_init (GstD3D11ColorConvert * self) gst_d3d11_convert_init (GstD3D11Convert * self)
{ {
} }
static void static void
gst_d3d11_color_convert_clear_shader_resource (GstD3D11ColorConvert * self) gst_d3d11_convert_clear_shader_resource (GstD3D11Convert * self)
{ {
gint i; gint i;
@ -256,24 +340,24 @@ gst_d3d11_color_convert_clear_shader_resource (GstD3D11ColorConvert * self)
} }
static void static void
gst_d3d11_color_convert_dispose (GObject * object) gst_d3d11_convert_dispose (GObject * object)
{ {
GstD3D11ColorConvert *self = GST_D3D11_COLOR_CONVERT (object); GstD3D11Convert *self = GST_D3D11_CONVERT (object);
gst_d3d11_color_convert_clear_shader_resource (self); gst_d3d11_convert_clear_shader_resource (self);
G_OBJECT_CLASS (parent_class)->dispose (object); G_OBJECT_CLASS (parent_class)->dispose (object);
} }
static GstCaps * static GstCaps *
gst_d3d11_color_convert_transform_caps (GstBaseTransform * gst_d3d11_convert_transform_caps (GstBaseTransform *
trans, GstPadDirection direction, GstCaps * caps, GstCaps * filter) trans, GstPadDirection direction, GstCaps * caps, GstCaps * filter)
{ {
GstCaps *tmp, *tmp2; GstCaps *tmp, *tmp2;
GstCaps *result; GstCaps *result;
/* Get all possible caps that we can transform to */ /* Get all possible caps that we can transform to */
tmp = gst_d3d11_color_convert_caps_remove_format_and_rangify_size_info (caps); tmp = gst_d3d11_convert_caps_remove_format_and_rangify_size_info (caps);
if (filter) { if (filter) {
tmp2 = gst_caps_intersect_full (filter, tmp, GST_CAPS_INTERSECT_FIRST); tmp2 = gst_caps_intersect_full (filter, tmp, GST_CAPS_INTERSECT_FIRST);
@ -414,7 +498,7 @@ score_value (GstBaseTransform * base, const GstVideoFormatInfo * in_info,
} }
static void static void
gst_d3d11_color_convert_fixate_format (GstBaseTransform * trans, gst_d3d11_convert_fixate_format (GstBaseTransform * trans,
GstCaps * caps, GstCaps * result) GstCaps * caps, GstCaps * result)
{ {
GstStructure *ins, *outs; GstStructure *ins, *outs;
@ -446,8 +530,7 @@ gst_d3d11_color_convert_fixate_format (GstBaseTransform * trans,
tests = gst_caps_get_structure (result, i); tests = gst_caps_get_structure (result, i);
format = gst_structure_get_value (tests, "format"); format = gst_structure_get_value (tests, "format");
gst_structure_remove_fields (tests, "height", "width", "pixel-aspect-ratio",
"display-aspect-ratio", NULL);
/* should not happen */ /* should not happen */
if (format == NULL) if (format == NULL)
continue; continue;
@ -477,7 +560,7 @@ gst_d3d11_color_convert_fixate_format (GstBaseTransform * trans,
} }
static GstCaps * static GstCaps *
gst_d3d11_color_convert_get_fixed_format (GstBaseTransform * trans, gst_d3d11_convert_get_fixed_format (GstBaseTransform * trans,
GstPadDirection direction, GstCaps * caps, GstCaps * othercaps) GstPadDirection direction, GstCaps * caps, GstCaps * othercaps)
{ {
GstCaps *result; GstCaps *result;
@ -488,7 +571,7 @@ gst_d3d11_color_convert_get_fixed_format (GstBaseTransform * trans,
result = gst_caps_copy (othercaps); result = gst_caps_copy (othercaps);
} }
gst_d3d11_color_convert_fixate_format (trans, caps, result); gst_d3d11_convert_fixate_format (trans, caps, result);
/* fixate remaining fields */ /* fixate remaining fields */
result = gst_caps_fixate (result); result = gst_caps_fixate (result);
@ -503,7 +586,7 @@ gst_d3d11_color_convert_get_fixed_format (GstBaseTransform * trans,
} }
static GstCaps * static GstCaps *
gst_d3d11_color_convert_fixate_size (GstBaseTransform * base, gst_d3d11_convert_fixate_size (GstBaseTransform * base,
GstPadDirection direction, GstCaps * caps, GstCaps * othercaps) GstPadDirection direction, GstCaps * caps, GstCaps * othercaps)
{ {
GstStructure *ins, *outs; GstStructure *ins, *outs;
@ -939,16 +1022,16 @@ done:
} }
static GstCaps * static GstCaps *
gst_d3d11_color_convert_fixate_caps (GstBaseTransform * base, gst_d3d11_convert_fixate_caps (GstBaseTransform * base,
GstPadDirection direction, GstCaps * caps, GstCaps * othercaps) GstPadDirection direction, GstCaps * caps, GstCaps * othercaps)
{ {
GstCaps *format; GstCaps *format = NULL;
GST_DEBUG_OBJECT (base, GST_DEBUG_OBJECT (base,
"trying to fixate othercaps %" GST_PTR_FORMAT " based on caps %" "trying to fixate othercaps %" GST_PTR_FORMAT " based on caps %"
GST_PTR_FORMAT, othercaps, caps); GST_PTR_FORMAT, othercaps, caps);
format = gst_d3d11_color_convert_get_fixed_format (base, direction, caps, format = gst_d3d11_convert_get_fixed_format (base, direction, caps,
othercaps); othercaps);
if (gst_caps_is_empty (format)) { if (gst_caps_is_empty (format)) {
@ -956,8 +1039,9 @@ gst_d3d11_color_convert_fixate_caps (GstBaseTransform * base,
return format; return format;
} }
othercaps = /* convert mode is "all" or "size" here */
gst_d3d11_color_convert_fixate_size (base, direction, caps, othercaps); othercaps = gst_d3d11_convert_fixate_size (base, direction, caps, othercaps);
if (gst_caps_get_size (othercaps) == 1) { if (gst_caps_get_size (othercaps) == 1) {
gint i; gint i;
const gchar *format_fields[] = { "format", "colorimetry", "chroma-site" }; const gchar *format_fields[] = { "format", "colorimetry", "chroma-site" };
@ -984,7 +1068,7 @@ gst_d3d11_color_convert_fixate_caps (GstBaseTransform * base,
} }
static gboolean static gboolean
gst_d3d11_color_convert_filter_meta (GstBaseTransform * trans, gst_d3d11_convert_filter_meta (GstBaseTransform * trans,
GstQuery * query, GType api, const GstStructure * params) GstQuery * query, GType api, const GstStructure * params)
{ {
/* This element cannot passthrough the crop meta, because it would convert the /* This element cannot passthrough the crop meta, because it would convert the
@ -998,7 +1082,7 @@ gst_d3d11_color_convert_filter_meta (GstBaseTransform * trans,
} }
static gboolean static gboolean
gst_d3d11_color_convert_propose_allocation (GstBaseTransform * trans, gst_d3d11_convert_propose_allocation (GstBaseTransform * trans,
GstQuery * decide_query, GstQuery * query) GstQuery * decide_query, GstQuery * query)
{ {
GstD3D11BaseFilter *filter = GST_D3D11_BASE_FILTER (trans); GstD3D11BaseFilter *filter = GST_D3D11_BASE_FILTER (trans);
@ -1082,8 +1166,7 @@ config_failed:
} }
static gboolean static gboolean
gst_d3d11_color_convert_decide_allocation (GstBaseTransform * trans, gst_d3d11_convert_decide_allocation (GstBaseTransform * trans, GstQuery * query)
GstQuery * query)
{ {
GstD3D11BaseFilter *filter = GST_D3D11_BASE_FILTER (trans); GstD3D11BaseFilter *filter = GST_D3D11_BASE_FILTER (trans);
GstCaps *outcaps = NULL; GstCaps *outcaps = NULL;
@ -1153,7 +1236,7 @@ gst_d3d11_color_convert_decide_allocation (GstBaseTransform * trans,
} }
static gboolean static gboolean
create_shader_input_resource (GstD3D11ColorConvert * self, create_shader_input_resource (GstD3D11Convert * self,
GstD3D11Device * device, const GstD3D11Format * format, GstVideoInfo * info) GstD3D11Device * device, const GstD3D11Format * format, GstVideoInfo * info)
{ {
D3D11_TEXTURE2D_DESC texture_desc = { 0, }; D3D11_TEXTURE2D_DESC texture_desc = { 0, };
@ -1268,7 +1351,7 @@ error:
} }
static gboolean static gboolean
create_shader_output_resource (GstD3D11ColorConvert * self, create_shader_output_resource (GstD3D11Convert * self,
GstD3D11Device * device, const GstD3D11Format * format, GstVideoInfo * info) GstD3D11Device * device, const GstD3D11Format * format, GstVideoInfo * info)
{ {
D3D11_TEXTURE2D_DESC texture_desc = { 0, }; D3D11_TEXTURE2D_DESC texture_desc = { 0, };
@ -1381,17 +1464,17 @@ error:
} }
static gboolean static gboolean
gst_d3d11_color_convert_set_info (GstD3D11BaseFilter * filter, gst_d3d11_convert_set_info (GstD3D11BaseFilter * filter,
GstCaps * incaps, GstVideoInfo * in_info, GstCaps * outcaps, GstCaps * incaps, GstVideoInfo * in_info, GstCaps * outcaps,
GstVideoInfo * out_info) GstVideoInfo * out_info)
{ {
GstD3D11ColorConvert *self = GST_D3D11_COLOR_CONVERT (filter); GstD3D11Convert *self = GST_D3D11_CONVERT (filter);
const GstVideoInfo *unknown_info; const GstVideoInfo *unknown_info;
if (gst_base_transform_is_passthrough (GST_BASE_TRANSFORM (filter))) if (gst_base_transform_is_passthrough (GST_BASE_TRANSFORM (filter)))
return TRUE; return TRUE;
gst_d3d11_color_convert_clear_shader_resource (self); gst_d3d11_convert_clear_shader_resource (self);
GST_DEBUG_OBJECT (self, "Setup convert with format %s -> %s", GST_DEBUG_OBJECT (self, "Setup convert with format %s -> %s",
gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (in_info)), gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (in_info)),
@ -1465,11 +1548,11 @@ format_unknown:
} }
static GstFlowReturn static GstFlowReturn
gst_d3d11_color_convert_transform (GstBaseTransform * trans, gst_d3d11_convert_transform (GstBaseTransform * trans,
GstBuffer * inbuf, GstBuffer * outbuf) GstBuffer * inbuf, GstBuffer * outbuf)
{ {
GstD3D11BaseFilter *filter = GST_D3D11_BASE_FILTER (trans); GstD3D11BaseFilter *filter = GST_D3D11_BASE_FILTER (trans);
GstD3D11ColorConvert *self = GST_D3D11_COLOR_CONVERT (trans); GstD3D11Convert *self = GST_D3D11_CONVERT (trans);
ID3D11DeviceContext *context_handle; ID3D11DeviceContext *context_handle;
ID3D11ShaderResourceView *resource_view[GST_VIDEO_MAX_PLANES] = { NULL, }; ID3D11ShaderResourceView *resource_view[GST_VIDEO_MAX_PLANES] = { NULL, };
ID3D11RenderTargetView *render_view[GST_VIDEO_MAX_PLANES] = { NULL, }; ID3D11RenderTargetView *render_view[GST_VIDEO_MAX_PLANES] = { NULL, };
@ -1597,3 +1680,150 @@ gst_d3d11_color_convert_transform (GstBaseTransform * trans,
return GST_FLOW_OK; return GST_FLOW_OK;
} }
static GstCaps *gst_d3d11_color_convert_transform_caps (GstBaseTransform *
trans, GstPadDirection direction, GstCaps * caps, GstCaps * filter);
static GstCaps *gst_d3d11_color_convert_fixate_caps (GstBaseTransform * base,
GstPadDirection direction, GstCaps * caps, GstCaps * othercaps);
G_DEFINE_TYPE (GstD3D11ColorConvert, gst_d3d11_color_convert,
GST_TYPE_D3D11_CONVERT);
static void
gst_d3d11_color_convert_class_init (GstD3D11ColorConvertClass * klass)
{
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
GstBaseTransformClass *trans_class = GST_BASE_TRANSFORM_CLASS (klass);
gst_element_class_set_static_metadata (element_class,
"Direct3D11 colorspace converter",
"Filter/Converter/Video/Hardware",
"Color conversion using D3D11",
"Seungha Yang <seungha.yang@navercorp.com>, "
"Jeongki Kim <jeongki.kim@jeongki.kim>");
trans_class->transform_caps =
GST_DEBUG_FUNCPTR (gst_d3d11_color_convert_transform_caps);
trans_class->fixate_caps =
GST_DEBUG_FUNCPTR (gst_d3d11_color_convert_fixate_caps);
}
static void
gst_d3d11_color_convert_init (GstD3D11ColorConvert * self)
{
}
static GstCaps *
gst_d3d11_color_convert_transform_caps (GstBaseTransform *
trans, GstPadDirection direction, GstCaps * caps, GstCaps * filter)
{
GstCaps *tmp, *tmp2;
GstCaps *result;
/* Get all possible caps that we can transform to */
tmp = gst_d3d11_convert_caps_remove_format_info (caps);
if (filter) {
tmp2 = gst_caps_intersect_full (filter, tmp, GST_CAPS_INTERSECT_FIRST);
gst_caps_unref (tmp);
tmp = tmp2;
}
result = tmp;
GST_DEBUG_OBJECT (trans, "transformed %" GST_PTR_FORMAT " into %"
GST_PTR_FORMAT, caps, result);
return result;
}
static GstCaps *
gst_d3d11_color_convert_fixate_caps (GstBaseTransform * base,
GstPadDirection direction, GstCaps * caps, GstCaps * othercaps)
{
GstCaps *format = NULL;
GST_DEBUG_OBJECT (base,
"trying to fixate othercaps %" GST_PTR_FORMAT " based on caps %"
GST_PTR_FORMAT, othercaps, caps);
format = gst_d3d11_convert_get_fixed_format (base, direction, caps,
othercaps);
if (gst_caps_is_empty (format)) {
GST_ERROR_OBJECT (base, "Could not convert formats");
} else {
GST_DEBUG_OBJECT (base, "fixated othercaps to %" GST_PTR_FORMAT, format);
}
return format;
}
static GstCaps *gst_d3d11_scale_transform_caps (GstBaseTransform *
trans, GstPadDirection direction, GstCaps * caps, GstCaps * filter);
static GstCaps *gst_d3d11_scale_fixate_caps (GstBaseTransform * base,
GstPadDirection direction, GstCaps * caps, GstCaps * othercaps);
G_DEFINE_TYPE (GstD3D11Scale, gst_d3d11_scale, GST_TYPE_D3D11_CONVERT);
static void
gst_d3d11_scale_class_init (GstD3D11ScaleClass * klass)
{
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
GstBaseTransformClass *trans_class = GST_BASE_TRANSFORM_CLASS (klass);
gst_element_class_set_static_metadata (element_class,
"Direct3D11 scaler",
"Filter/Converter/Video/Scaler/Hardware",
"Resizes video using D3D11",
"Seungha Yang <seungha.yang@navercorp.com>, "
"Jeongki Kim <jeongki.kim@jeongki.kim>");
trans_class->transform_caps =
GST_DEBUG_FUNCPTR (gst_d3d11_scale_transform_caps);
trans_class->fixate_caps = GST_DEBUG_FUNCPTR (gst_d3d11_scale_fixate_caps);
}
static void
gst_d3d11_scale_init (GstD3D11Scale * self)
{
}
static GstCaps *
gst_d3d11_scale_transform_caps (GstBaseTransform *
trans, GstPadDirection direction, GstCaps * caps, GstCaps * filter)
{
GstCaps *tmp, *tmp2;
GstCaps *result;
/* Get all possible caps that we can transform to */
tmp = gst_d3d11_convert_caps_rangify_size_info (caps);
if (filter) {
tmp2 = gst_caps_intersect_full (filter, tmp, GST_CAPS_INTERSECT_FIRST);
gst_caps_unref (tmp);
tmp = tmp2;
}
result = tmp;
GST_DEBUG_OBJECT (trans, "transformed %" GST_PTR_FORMAT " into %"
GST_PTR_FORMAT, caps, result);
return result;
}
static GstCaps *
gst_d3d11_scale_fixate_caps (GstBaseTransform * base,
GstPadDirection direction, GstCaps * caps, GstCaps * othercaps)
{
GST_DEBUG_OBJECT (base,
"trying to fixate othercaps %" GST_PTR_FORMAT " based on caps %"
GST_PTR_FORMAT, othercaps, caps);
othercaps = gst_d3d11_convert_fixate_size (base, direction, caps, othercaps);
GST_DEBUG_OBJECT (base, "fixated othercaps to %" GST_PTR_FORMAT, othercaps);
return othercaps;
}

View file

@ -26,9 +26,31 @@
G_BEGIN_DECLS G_BEGIN_DECLS
#define GST_TYPE_D3D11_CONVERT (gst_d3d11_convert_get_type())
#define GST_D3D11_CONVERT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_D3D11_CONVERT,GstD3D11Convert))
#define GST_D3D11_CONVERT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_D3D11_CONVERT,GstD3D11ConvertClass))
#define GST_D3D11_CONVERT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GST_TYPE_D3D11_CONVERT,GstD3D11ConvertClass))
#define GST_IS_D3D11_CONVERT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_D3D11_CONVERT))
#define GST_IS_D3D11_CONVERT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_D3D11_CONVERT))
typedef struct _GstD3D11Convert GstD3D11Convert;
typedef struct _GstD3D11ConvertClass GstD3D11ConvertClass;
struct _GstD3D11ConvertClass
{
GstD3D11BaseFilterClass parent_class;
};
GType gst_d3d11_convert_get_type (void);
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstD3D11Convert, gst_object_unref)
#define GST_TYPE_D3D11_COLOR_CONVERT (gst_d3d11_color_convert_get_type()) #define GST_TYPE_D3D11_COLOR_CONVERT (gst_d3d11_color_convert_get_type())
G_DECLARE_FINAL_TYPE (GstD3D11ColorConvert, G_DECLARE_FINAL_TYPE (GstD3D11ColorConvert, gst_d3d11_color_convert,
gst_d3d11_color_convert, GST, D3D11_COLOR_CONVERT, GstD3D11BaseFilter); GST, D3D11_COLOR_CONVERT, GstD3D11Convert)
#define GST_TYPE_D3D11_SCALE (gst_d3d11_scale_get_type())
G_DECLARE_FINAL_TYPE (GstD3D11Scale, gst_d3d11_scale,
GST, D3D11_SCALE, GstD3D11Convert)
G_END_DECLS G_END_DECLS

View file

@ -107,7 +107,11 @@ plugin_init (GstPlugin * plugin)
gst_element_register (plugin, gst_element_register (plugin,
"d3d11download", GST_RANK_NONE, GST_TYPE_D3D11_DOWNLOAD); "d3d11download", GST_RANK_NONE, GST_TYPE_D3D11_DOWNLOAD);
gst_element_register (plugin, gst_element_register (plugin,
"d3d11convert", GST_RANK_NONE, GST_TYPE_D3D11_COLOR_CONVERT); "d3d11convert", GST_RANK_NONE, GST_TYPE_D3D11_CONVERT);
gst_element_register (plugin,
"d3d11colorconvert", GST_RANK_NONE, GST_TYPE_D3D11_COLOR_CONVERT);
gst_element_register (plugin,
"d3d11scale", GST_RANK_NONE, GST_TYPE_D3D11_SCALE);
gst_element_register (plugin, gst_element_register (plugin,
"d3d11videosinkelement", GST_RANK_NONE, GST_TYPE_D3D11_VIDEO_SINK); "d3d11videosinkelement", GST_RANK_NONE, GST_TYPE_D3D11_VIDEO_SINK);