mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-23 02:01:12 +00:00
d3d11convert: Add support for sampling with anisotropic filter
Anisotropic filtering might produce better quality than linear filtering Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5572>
This commit is contained in:
parent
af31b46992
commit
b16665dc75
6 changed files with 101 additions and 74 deletions
|
@ -11036,6 +11036,11 @@
|
|||
"desc": "Linear minification, point magnification",
|
||||
"name": "linear-minification",
|
||||
"value": "2"
|
||||
},
|
||||
{
|
||||
"desc": "Anisotropic",
|
||||
"name": "anisotropic",
|
||||
"value": "3"
|
||||
}
|
||||
]
|
||||
},
|
||||
|
|
|
@ -84,6 +84,8 @@ gst_d3d11_converter_sampler_filter_get_type (void)
|
|||
"D3D11_FILTER_MIN_LINEAR_MAG_MIP_POINT", "min-linear-mag-mip-point"},
|
||||
{D3D11_FILTER_MIN_MAG_LINEAR_MIP_POINT,
|
||||
"D3D11_FILTER_MIN_MAG_LINEAR_MIP_POINT", "min-mag-linear-mip-point"},
|
||||
{D3D11_FILTER_COMPARISON_ANISOTROPIC,
|
||||
"D3D11_FILTER_COMPARISON_ANISOTROPIC", "anisotropic"},
|
||||
{0, nullptr, nullptr},
|
||||
};
|
||||
|
||||
|
|
|
@ -90,6 +90,7 @@ GType gst_d3d11_converter_backend_get_type (void);
|
|||
* @D3D11_FILTER_MIN_MAG_MIP_POINT
|
||||
* @D3D11_FILTER_MIN_LINEAR_MAG_MIP_POINT
|
||||
* @D3D11_FILTER_MIN_MAG_LINEAR_MIP_POINT
|
||||
* @D3D11_FILTER_COMPARISON_ANISOTROPIC,
|
||||
*
|
||||
* Default is #D3D11_FILTER_MIN_MAG_LINEAR_MIP_POINT.
|
||||
*
|
||||
|
|
|
@ -48,76 +48,6 @@ static GstStaticCaps src_template_caps =
|
|||
GST_CAPS_FEATURE_META_GST_VIDEO_OVERLAY_COMPOSITION,
|
||||
GST_D3D11_SRC_FORMATS));
|
||||
|
||||
/**
|
||||
* GstD3D11SamplingMethod:
|
||||
*
|
||||
* Texture sampling method
|
||||
*
|
||||
* Since: 1.24
|
||||
*/
|
||||
typedef enum
|
||||
{
|
||||
GST_D3D11_SAMPLING_METHOD_NEAREST,
|
||||
GST_D3D11_SAMPLING_METHOD_BILINEAR,
|
||||
GST_D3D11_SAMPLING_METHOD_LINEAR_MINIFICATION,
|
||||
} GstD3D11SamplingMethod;
|
||||
|
||||
static const GEnumValue gst_d3d11_sampling_methods[] = {
|
||||
/**
|
||||
* GstD3D11SamplingMethod::nearest-neighbour:
|
||||
*
|
||||
* Since: 1.24
|
||||
*/
|
||||
{GST_D3D11_SAMPLING_METHOD_NEAREST,
|
||||
"Nearest Neighbour", "nearest-neighbour"},
|
||||
|
||||
/**
|
||||
* GstD3D11SamplingMethod::bilinear:
|
||||
*
|
||||
* Since: 1.24
|
||||
*/
|
||||
{GST_D3D11_SAMPLING_METHOD_BILINEAR,
|
||||
"Bilinear", "bilinear"},
|
||||
|
||||
/**
|
||||
* GstD3D11SamplingMethod::linear-minification:
|
||||
*
|
||||
* Since: 1.24
|
||||
*/
|
||||
{GST_D3D11_SAMPLING_METHOD_LINEAR_MINIFICATION,
|
||||
"Linear minification, point magnification", "linear-minification"},
|
||||
{0, nullptr, nullptr},
|
||||
};
|
||||
|
||||
#define GST_TYPE_D3D11_SAMPLING_METHOD gst_d3d11_sampling_method_get_type()
|
||||
static GType
|
||||
gst_d3d11_sampling_method_get_type (void)
|
||||
{
|
||||
static GType type = 0;
|
||||
|
||||
GST_D3D11_CALL_ONCE_BEGIN {
|
||||
type = g_enum_register_static ("GstD3D11SamplingMethod",
|
||||
gst_d3d11_sampling_methods);
|
||||
} GST_D3D11_CALL_ONCE_END;
|
||||
|
||||
return type;
|
||||
}
|
||||
|
||||
static D3D11_FILTER
|
||||
gst_d3d11_base_convert_sampling_method_to_filter (GstD3D11SamplingMethod method)
|
||||
{
|
||||
static const D3D11_FILTER filters[] = {
|
||||
D3D11_FILTER_MIN_MAG_MIP_POINT, // GST_D3D11_SAMPLING_METHOD_NEAREST
|
||||
D3D11_FILTER_MIN_MAG_LINEAR_MIP_POINT, // GST_D3D11_SAMPLING_METHOD_BILINEAR
|
||||
D3D11_FILTER_MIN_LINEAR_MAG_MIP_POINT, // GST_D3D11_SAMPLING_METHOD_LINEAR_MINIFICATION
|
||||
};
|
||||
|
||||
G_STATIC_ASSERT_EXPR (G_N_ELEMENTS (filters) ==
|
||||
G_N_ELEMENTS (gst_d3d11_sampling_methods) - 1);
|
||||
|
||||
return filters[method];
|
||||
}
|
||||
|
||||
#define DEFAULT_ADD_BORDERS TRUE
|
||||
#define DEFAULT_BORDER_COLOR G_GUINT64_CONSTANT(0xffff000000000000)
|
||||
#define DEFAULT_GAMMA_MODE GST_VIDEO_GAMMA_MODE_NONE
|
||||
|
@ -1863,7 +1793,7 @@ gst_d3d11_base_convert_set_info (GstD3D11BaseFilter * filter,
|
|||
GST_TYPE_VIDEO_PRIMARIES_MODE, self->active_primaries_mode,
|
||||
GST_D3D11_CONVERTER_OPT_SAMPLER_FILTER,
|
||||
GST_TYPE_D3D11_CONVERTER_SAMPLER_FILTER,
|
||||
gst_d3d11_base_convert_sampling_method_to_filter
|
||||
gst_d3d11_sampling_method_to_native
|
||||
(self->active_sampling_method),
|
||||
GST_D3D11_CONVERTER_OPT_SRC_ALPHA_MODE,
|
||||
GST_TYPE_D3D11_CONVERTER_ALPHA_MODE,
|
||||
|
@ -2451,9 +2381,8 @@ gst_d3d11_base_convert_set_sampling_method (GstD3D11BaseConvert * self,
|
|||
{
|
||||
GstD3D11SRWLockGuard lk (&self->lock);
|
||||
|
||||
GST_DEBUG_OBJECT (self, "Sampling method %s -> %s",
|
||||
gst_d3d11_sampling_methods[self->sampling_method].value_nick,
|
||||
gst_d3d11_sampling_methods[method].value_nick);
|
||||
GST_DEBUG_OBJECT (self,
|
||||
"Sampling method %d -> %d", self->sampling_method, method);
|
||||
|
||||
self->sampling_method = method;
|
||||
if (self->sampling_method != self->active_sampling_method)
|
||||
|
|
|
@ -106,6 +106,58 @@ gst_d3d11_msaa_mode_get_type (void)
|
|||
return type;
|
||||
}
|
||||
|
||||
/**
|
||||
* GstD3D11SamplingMethod:
|
||||
*
|
||||
* Texture sampling method
|
||||
*
|
||||
* Since: 1.24
|
||||
*/
|
||||
GType
|
||||
gst_d3d11_sampling_method_get_type (void)
|
||||
{
|
||||
static GType type = 0;
|
||||
static const GEnumValue methods[] = {
|
||||
/**
|
||||
* GstD3D11SamplingMethod::nearest-neighbour:
|
||||
*
|
||||
* Since: 1.24
|
||||
*/
|
||||
{GST_D3D11_SAMPLING_METHOD_NEAREST,
|
||||
"Nearest Neighbour", "nearest-neighbour"},
|
||||
|
||||
/**
|
||||
* GstD3D11SamplingMethod::bilinear:
|
||||
*
|
||||
* Since: 1.24
|
||||
*/
|
||||
{GST_D3D11_SAMPLING_METHOD_BILINEAR,
|
||||
"Bilinear", "bilinear"},
|
||||
|
||||
/**
|
||||
* GstD3D11SamplingMethod::linear-minification:
|
||||
*
|
||||
* Since: 1.24
|
||||
*/
|
||||
{GST_D3D11_SAMPLING_METHOD_LINEAR_MINIFICATION,
|
||||
"Linear minification, point magnification", "linear-minification"},
|
||||
|
||||
/**
|
||||
* GstD3D11SamplingMethod::anisotropic:
|
||||
*
|
||||
* Since: 1.24
|
||||
*/
|
||||
{GST_D3D11_SAMPLING_METHOD_ANISOTROPIC, "Anisotropic", "anisotropic"},
|
||||
{0, nullptr, nullptr},
|
||||
};
|
||||
|
||||
GST_D3D11_CALL_ONCE_BEGIN {
|
||||
type = g_enum_register_static ("GstD3D11SamplingMethod", methods);
|
||||
} GST_D3D11_CALL_ONCE_END;
|
||||
|
||||
return type;
|
||||
}
|
||||
|
||||
/* Max Texture Dimension for feature level 11_0 ~ 12_1 */
|
||||
static guint _gst_d3d11_texture_max_dimension = 16384;
|
||||
|
||||
|
@ -1078,3 +1130,28 @@ gst_d3d11_calculate_transform_matrix (GstVideoOrientationMethod method,
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct SamplingMethodMap
|
||||
{
|
||||
GstD3D11SamplingMethod method;
|
||||
D3D11_FILTER filter;
|
||||
};
|
||||
|
||||
static const SamplingMethodMap sampling_method_map[] = {
|
||||
{GST_D3D11_SAMPLING_METHOD_NEAREST, D3D11_FILTER_MIN_MAG_MIP_POINT},
|
||||
{GST_D3D11_SAMPLING_METHOD_BILINEAR, D3D11_FILTER_MIN_MAG_LINEAR_MIP_POINT},
|
||||
{GST_D3D11_SAMPLING_METHOD_LINEAR_MINIFICATION,
|
||||
D3D11_FILTER_MIN_LINEAR_MAG_MIP_POINT},
|
||||
{GST_D3D11_SAMPLING_METHOD_ANISOTROPIC, D3D11_FILTER_COMPARISON_ANISOTROPIC},
|
||||
};
|
||||
|
||||
D3D11_FILTER
|
||||
gst_d3d11_sampling_method_to_native (GstD3D11SamplingMethod method)
|
||||
{
|
||||
for (guint i = 0; i < G_N_ELEMENTS (sampling_method_map); i++) {
|
||||
if (sampling_method_map[i].method == method)
|
||||
return sampling_method_map[i].filter;
|
||||
}
|
||||
|
||||
return D3D11_FILTER_MIN_MAG_MIP_POINT;
|
||||
}
|
||||
|
|
|
@ -61,6 +61,17 @@ typedef enum
|
|||
#define GST_TYPE_D3D11_MSAA_MODE (gst_d3d11_msaa_mode_get_type())
|
||||
GType gst_d3d11_msaa_mode_get_type (void);
|
||||
|
||||
typedef enum
|
||||
{
|
||||
GST_D3D11_SAMPLING_METHOD_NEAREST,
|
||||
GST_D3D11_SAMPLING_METHOD_BILINEAR,
|
||||
GST_D3D11_SAMPLING_METHOD_LINEAR_MINIFICATION,
|
||||
GST_D3D11_SAMPLING_METHOD_ANISOTROPIC,
|
||||
} GstD3D11SamplingMethod;
|
||||
|
||||
#define GST_TYPE_D3D11_SAMPLING_METHOD (gst_d3d11_sampling_method_get_type())
|
||||
GType gst_d3d11_sampling_method_get_type (void);
|
||||
|
||||
void gst_d3d11_plugin_utils_init (D3D_FEATURE_LEVEL feature_level);
|
||||
|
||||
GstCaps * gst_d3d11_get_updated_template_caps (GstStaticCaps * template_caps);
|
||||
|
@ -166,6 +177,8 @@ void gst_d3d11_calculate_transform_matrix (GstVideoOrientationMethod
|
|||
gfloat scale_y,
|
||||
gfloat transform_matrix[16]);
|
||||
|
||||
D3D11_FILTER gst_d3d11_sampling_method_to_native (GstD3D11SamplingMethod method);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GST_D3D11_PLUGIN_UTILS_H__ */
|
||||
|
|
Loading…
Reference in a new issue