d3d11convert: Add new subclasses for only color convert or resize
authorSeungha Yang <seungha@centricular.com>
Sun, 2 Aug 2020 18:19:34 +0000 (03:19 +0900)
committerGStreamer Merge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Fri, 16 Oct 2020 17:02:15 +0000 (17:02 +0000)
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>

sys/d3d11/gstd3d11colorconvert.c
sys/d3d11/gstd3d11colorconvert.h
sys/d3d11/plugin.c

index e32083f..2c9bc05 100644 (file)
@@ -54,8 +54,8 @@
 #include "gstd3d11device.h"
 #include "gstd3d11bufferpool.h"
 
-GST_DEBUG_CATEGORY_STATIC (gst_d3d11_color_convert_debug);
-#define GST_CAT_DEFAULT gst_d3d11_color_convert_debug
+GST_DEBUG_CATEGORY_STATIC (gst_d3d11_convert_debug);
+#define GST_CAT_DEFAULT gst_d3d11_convert_debug
 
 static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink",
     GST_PAD_SINK,
@@ -79,7 +79,7 @@ static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src",
             GST_D3D11_SRC_FORMATS))
     );
 
-struct _GstD3D11ColorConvert
+struct _GstD3D11Convert
 {
   GstD3D11BaseFilter parent;
 
@@ -101,34 +101,122 @@ struct _GstD3D11ColorConvert
   D3D11_BOX out_src_box;
 };
 
-#define gst_d3d11_color_convert_parent_class parent_class
-G_DEFINE_TYPE (GstD3D11ColorConvert,
-    gst_d3d11_color_convert, GST_TYPE_D3D11_BASE_FILTER);
+struct _GstD3D11ColorConvert
+{
+  GstD3D11Convert parent;
+};
 
-static void gst_d3d11_color_convert_dispose (GObject * object);
-static GstCaps *gst_d3d11_color_convert_transform_caps (GstBaseTransform *
+struct _GstD3D11Scale
+{
+  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);
-static GstCaps *gst_d3d11_color_convert_fixate_caps (GstBaseTransform *
+static GstCaps *gst_d3d11_convert_fixate_caps (GstBaseTransform *
     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);
 static gboolean
-gst_d3d11_color_convert_propose_allocation (GstBaseTransform * trans,
+gst_d3d11_convert_propose_allocation (GstBaseTransform * trans,
     GstQuery * decide_query, GstQuery * query);
 static gboolean
-gst_d3d11_color_convert_decide_allocation (GstBaseTransform * trans,
+gst_d3d11_convert_decide_allocation (GstBaseTransform * trans,
     GstQuery * query);
 
-static GstFlowReturn gst_d3d11_color_convert_transform (GstBaseTransform *
+static GstFlowReturn gst_d3d11_convert_transform (GstBaseTransform *
     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,
     GstVideoInfo * out_info);
 
 /* copies the given caps */
 static GstCaps *
-gst_d3d11_color_convert_caps_remove_format_and_rangify_size_info (GstCaps *
-    caps)
+gst_d3d11_convert_caps_remove_format_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_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;
   GstCapsFeatures *f;
@@ -172,14 +260,14 @@ gst_d3d11_color_convert_caps_remove_format_and_rangify_size_info (GstCaps *
 }
 
 static void
-gst_d3d11_color_convert_class_init (GstD3D11ColorConvertClass * klass)
+gst_d3d11_convert_class_init (GstD3D11ConvertClass * klass)
 {
   GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
   GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
   GstBaseTransformClass *trans_class = GST_BASE_TRANSFORM_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, &src_template);
@@ -194,32 +282,28 @@ gst_d3d11_color_convert_class_init (GstD3D11ColorConvertClass * klass)
   trans_class->passthrough_on_same_caps = TRUE;
 
   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);
-  trans_class->filter_meta =
-      GST_DEBUG_FUNCPTR (gst_d3d11_color_convert_filter_meta);
+      GST_DEBUG_FUNCPTR (gst_d3d11_convert_transform_caps);
+  trans_class->fixate_caps = GST_DEBUG_FUNCPTR (gst_d3d11_convert_fixate_caps);
+  trans_class->filter_meta = GST_DEBUG_FUNCPTR (gst_d3d11_convert_filter_meta);
   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 =
-      GST_DEBUG_FUNCPTR (gst_d3d11_color_convert_decide_allocation);
-  trans_class->transform =
-      GST_DEBUG_FUNCPTR (gst_d3d11_color_convert_transform);
+      GST_DEBUG_FUNCPTR (gst_d3d11_convert_decide_allocation);
+  trans_class->transform = GST_DEBUG_FUNCPTR (gst_d3d11_convert_transform);
 
-  bfilter_class->set_info =
-      GST_DEBUG_FUNCPTR (gst_d3d11_color_convert_set_info);
+  bfilter_class->set_info = GST_DEBUG_FUNCPTR (gst_d3d11_convert_set_info);
 
-  GST_DEBUG_CATEGORY_INIT (gst_d3d11_color_convert_debug,
+  GST_DEBUG_CATEGORY_INIT (gst_d3d11_convert_debug,
       "d3d11convert", 0, "d3d11convert element");
 }
 
 static void
-gst_d3d11_color_convert_init (GstD3D11ColorConvert * self)
+gst_d3d11_convert_init (GstD3D11Convert * self)
 {
 }
 
 static void
-gst_d3d11_color_convert_clear_shader_resource (GstD3D11ColorConvert * self)
+gst_d3d11_convert_clear_shader_resource (GstD3D11Convert * self)
 {
   gint i;
 
@@ -256,24 +340,24 @@ gst_d3d11_color_convert_clear_shader_resource (GstD3D11ColorConvert * self)
 }
 
 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);
 }
 
 static GstCaps *
-gst_d3d11_color_convert_transform_caps (GstBaseTransform *
+gst_d3d11_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_color_convert_caps_remove_format_and_rangify_size_info (caps);
+  tmp = gst_d3d11_convert_caps_remove_format_and_rangify_size_info (caps);
 
   if (filter) {
     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
-gst_d3d11_color_convert_fixate_format (GstBaseTransform * trans,
+gst_d3d11_convert_fixate_format (GstBaseTransform * trans,
     GstCaps * caps, GstCaps * result)
 {
   GstStructure *ins, *outs;
@@ -446,8 +530,7 @@ gst_d3d11_color_convert_fixate_format (GstBaseTransform * trans,
 
     tests = gst_caps_get_structure (result, i);
     format = gst_structure_get_value (tests, "format");
-    gst_structure_remove_fields (tests, "height", "width", "pixel-aspect-ratio",
-        "display-aspect-ratio", NULL);
+
     /* should not happen */
     if (format == NULL)
       continue;
@@ -477,7 +560,7 @@ gst_d3d11_color_convert_fixate_format (GstBaseTransform * trans,
 }
 
 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)
 {
   GstCaps *result;
@@ -488,7 +571,7 @@ gst_d3d11_color_convert_get_fixed_format (GstBaseTransform * trans,
     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 */
   result = gst_caps_fixate (result);
@@ -503,7 +586,7 @@ gst_d3d11_color_convert_get_fixed_format (GstBaseTransform * trans,
 }
 
 static GstCaps *
-gst_d3d11_color_convert_fixate_size (GstBaseTransform * base,
+gst_d3d11_convert_fixate_size (GstBaseTransform * base,
     GstPadDirection direction, GstCaps * caps, GstCaps * othercaps)
 {
   GstStructure *ins, *outs;
@@ -939,16 +1022,16 @@ done:
 }
 
 static GstCaps *
-gst_d3d11_color_convert_fixate_caps (GstBaseTransform * base,
+gst_d3d11_convert_fixate_caps (GstBaseTransform * base,
     GstPadDirection direction, GstCaps * caps, GstCaps * othercaps)
 {
-  GstCaps *format;
+  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_color_convert_get_fixed_format (base, direction, caps,
+  format = gst_d3d11_convert_get_fixed_format (base, direction, caps,
       othercaps);
 
   if (gst_caps_is_empty (format)) {
@@ -956,8 +1039,9 @@ gst_d3d11_color_convert_fixate_caps (GstBaseTransform * base,
     return format;
   }
 
-  othercaps =
-      gst_d3d11_color_convert_fixate_size (base, direction, caps, othercaps);
+  /* convert mode is "all" or "size" here */
+  othercaps = gst_d3d11_convert_fixate_size (base, direction, caps, othercaps);
+
   if (gst_caps_get_size (othercaps) == 1) {
     gint i;
     const gchar *format_fields[] = { "format", "colorimetry", "chroma-site" };
@@ -984,7 +1068,7 @@ gst_d3d11_color_convert_fixate_caps (GstBaseTransform * base,
 }
 
 static gboolean
-gst_d3d11_color_convert_filter_meta (GstBaseTransform * trans,
+gst_d3d11_convert_filter_meta (GstBaseTransform * trans,
     GstQuery * query, GType api, const GstStructure * params)
 {
   /* 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
-gst_d3d11_color_convert_propose_allocation (GstBaseTransform * trans,
+gst_d3d11_convert_propose_allocation (GstBaseTransform * trans,
     GstQuery * decide_query, GstQuery * query)
 {
   GstD3D11BaseFilter *filter = GST_D3D11_BASE_FILTER (trans);
@@ -1082,8 +1166,7 @@ config_failed:
 }
 
 static gboolean
-gst_d3d11_color_convert_decide_allocation (GstBaseTransform * trans,
-    GstQuery * query)
+gst_d3d11_convert_decide_allocation (GstBaseTransform * trans, GstQuery * query)
 {
   GstD3D11BaseFilter *filter = GST_D3D11_BASE_FILTER (trans);
   GstCaps *outcaps = NULL;
@@ -1153,7 +1236,7 @@ gst_d3d11_color_convert_decide_allocation (GstBaseTransform * trans,
 }
 
 static gboolean
-create_shader_input_resource (GstD3D11ColorConvert * self,
+create_shader_input_resource (GstD3D11Convert * self,
     GstD3D11Device * device, const GstD3D11Format * format, GstVideoInfo * info)
 {
   D3D11_TEXTURE2D_DESC texture_desc = { 0, };
@@ -1268,7 +1351,7 @@ error:
 }
 
 static gboolean
-create_shader_output_resource (GstD3D11ColorConvert * self,
+create_shader_output_resource (GstD3D11Convert * self,
     GstD3D11Device * device, const GstD3D11Format * format, GstVideoInfo * info)
 {
   D3D11_TEXTURE2D_DESC texture_desc = { 0, };
@@ -1381,17 +1464,17 @@ error:
 }
 
 static gboolean
-gst_d3d11_color_convert_set_info (GstD3D11BaseFilter * filter,
+gst_d3d11_convert_set_info (GstD3D11BaseFilter * filter,
     GstCaps * incaps, GstVideoInfo * in_info, GstCaps * outcaps,
     GstVideoInfo * out_info)
 {
-  GstD3D11ColorConvert *self = GST_D3D11_COLOR_CONVERT (filter);
+  GstD3D11Convert *self = GST_D3D11_CONVERT (filter);
   const GstVideoInfo *unknown_info;
 
   if (gst_base_transform_is_passthrough (GST_BASE_TRANSFORM (filter)))
     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_video_format_to_string (GST_VIDEO_INFO_FORMAT (in_info)),
@@ -1465,11 +1548,11 @@ format_unknown:
 }
 
 static GstFlowReturn
-gst_d3d11_color_convert_transform (GstBaseTransform * trans,
+gst_d3d11_convert_transform (GstBaseTransform * trans,
     GstBuffer * inbuf, GstBuffer * outbuf)
 {
   GstD3D11BaseFilter *filter = GST_D3D11_BASE_FILTER (trans);
-  GstD3D11ColorConvert *self = GST_D3D11_COLOR_CONVERT (trans);
+  GstD3D11Convert *self = GST_D3D11_CONVERT (trans);
   ID3D11DeviceContext *context_handle;
   ID3D11ShaderResourceView *resource_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;
 }
+
+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;
+}
index 331ca9c..ab4fc92 100644 (file)
 
 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())
-G_DECLARE_FINAL_TYPE (GstD3D11ColorConvert,
-    gst_d3d11_color_convert, GST, D3D11_COLOR_CONVERT, GstD3D11BaseFilter);
+G_DECLARE_FINAL_TYPE (GstD3D11ColorConvert, gst_d3d11_color_convert,
+    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
 
index ec07dd3..3dfddc8 100644 (file)
@@ -107,7 +107,11 @@ plugin_init (GstPlugin * plugin)
   gst_element_register (plugin,
       "d3d11download", GST_RANK_NONE, GST_TYPE_D3D11_DOWNLOAD);
   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,
       "d3d11videosinkelement", GST_RANK_NONE, GST_TYPE_D3D11_VIDEO_SINK);