cudaconvertscale, cudascale: Add "add-borders" property and support 8bits RGB planar formats
Adding "add-borders" property which is identical to that of videoscale and this will be enabled by default. And adding RGBP/BGRP/GBR/GBRA format support. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/3389>
This commit is contained in:
parent
c11f8fa930
commit
9d30f9dd59
@ -32,7 +32,7 @@ GST_DEBUG_CATEGORY_STATIC (gst_cuda_base_convert_debug);
|
|||||||
#define GST_CUDA_CONVET_FORMATS \
|
#define GST_CUDA_CONVET_FORMATS \
|
||||||
"{ I420, YV12, NV12, NV21, P010_10LE, P016_LE, I420_10LE, Y444, Y444_16LE, " \
|
"{ I420, YV12, NV12, NV21, P010_10LE, P016_LE, I420_10LE, Y444, Y444_16LE, " \
|
||||||
"BGRA, RGBA, RGBx, BGRx, ARGB, ABGR, RGB, BGR, BGR10A2_LE, RGB10A2_LE, " \
|
"BGRA, RGBA, RGBx, BGRx, ARGB, ABGR, RGB, BGR, BGR10A2_LE, RGB10A2_LE, " \
|
||||||
"Y42B, I422_10LE, I422_12LE }"
|
"Y42B, I422_10LE, I422_12LE, RGBP, BGRP, GBR, GBRA }"
|
||||||
|
|
||||||
static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink",
|
static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink",
|
||||||
GST_PAD_SINK,
|
GST_PAD_SINK,
|
||||||
@ -48,6 +48,8 @@ static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src",
|
|||||||
(GST_CAPS_FEATURE_MEMORY_CUDA_MEMORY, GST_CUDA_CONVET_FORMATS))
|
(GST_CAPS_FEATURE_MEMORY_CUDA_MEMORY, GST_CUDA_CONVET_FORMATS))
|
||||||
);
|
);
|
||||||
|
|
||||||
|
#define DEFAULT_ADD_BORDERS TRUE
|
||||||
|
|
||||||
struct _GstCudaBaseConvert
|
struct _GstCudaBaseConvert
|
||||||
{
|
{
|
||||||
GstCudaBaseTransform parent;
|
GstCudaBaseTransform parent;
|
||||||
@ -126,6 +128,7 @@ gst_cuda_base_convert_class_init (GstCudaBaseConvertClass * klass)
|
|||||||
static void
|
static void
|
||||||
gst_cuda_base_convert_init (GstCudaBaseConvert * self)
|
gst_cuda_base_convert_init (GstCudaBaseConvert * self)
|
||||||
{
|
{
|
||||||
|
self->add_borders = DEFAULT_ADD_BORDERS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -1282,10 +1285,21 @@ gst_cuda_base_convert_set_info (GstCudaBaseTransform * btrans,
|
|||||||
out_info->finfo->bits)) {
|
out_info->finfo->bits)) {
|
||||||
gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (self), TRUE);
|
gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (self), TRUE);
|
||||||
} else {
|
} else {
|
||||||
|
GstStructure *config;
|
||||||
|
|
||||||
gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (self), FALSE);
|
gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (self), FALSE);
|
||||||
|
|
||||||
|
config = gst_structure_new_empty ("GstCudaConverter");
|
||||||
|
gst_structure_set (config,
|
||||||
|
GST_CUDA_CONVERTER_OPT_DEST_X, G_TYPE_INT, self->borders_w / 2,
|
||||||
|
GST_CUDA_CONVERTER_OPT_DEST_Y, G_TYPE_INT, self->borders_h / 2,
|
||||||
|
GST_CUDA_CONVERTER_OPT_DEST_WIDTH,
|
||||||
|
G_TYPE_INT, out_info->width - self->borders_w,
|
||||||
|
GST_CUDA_CONVERTER_OPT_DEST_HEIGHT,
|
||||||
|
G_TYPE_INT, out_info->height - self->borders_h, NULL);
|
||||||
|
|
||||||
self->converter = gst_cuda_converter_new (in_info,
|
self->converter = gst_cuda_converter_new (in_info,
|
||||||
out_info, btrans->context, NULL);
|
out_info, btrans->context, config);
|
||||||
if (!self->converter) {
|
if (!self->converter) {
|
||||||
GST_ERROR_OBJECT (self, "Couldn't create converter");
|
GST_ERROR_OBJECT (self, "Couldn't create converter");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@ -1377,6 +1391,17 @@ gst_cuda_base_convert_transform (GstBaseTransform * trans,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gst_cuda_base_convert_set_add_border (GstCudaBaseConvert * self,
|
||||||
|
gboolean add_border)
|
||||||
|
{
|
||||||
|
gboolean prev = self->add_borders;
|
||||||
|
|
||||||
|
self->add_borders = add_border;
|
||||||
|
if (prev != self->add_borders)
|
||||||
|
gst_base_transform_reconfigure_src (GST_BASE_TRANSFORM_CAST (self));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* SECTION:element-cudaconvertscale
|
* SECTION:element-cudaconvertscale
|
||||||
* @title: cudaconvertscale
|
* @title: cudaconvertscale
|
||||||
@ -1396,19 +1421,41 @@ gst_cuda_base_convert_transform (GstBaseTransform * trans,
|
|||||||
* Since: 1.22
|
* Since: 1.22
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
PROP_CONVERT_SCALE_0,
|
||||||
|
PROP_CONVERT_SCALE_ADD_BORDERS,
|
||||||
|
};
|
||||||
|
|
||||||
struct _GstCudaConvertScale
|
struct _GstCudaConvertScale
|
||||||
{
|
{
|
||||||
GstCudaBaseConvert parent;
|
GstCudaBaseConvert parent;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void gst_cuda_convert_scale_set_property (GObject * object,
|
||||||
|
guint prop_id, const GValue * value, GParamSpec * pspec);
|
||||||
|
static void gst_cuda_convert_scale_get_property (GObject * object,
|
||||||
|
guint prop_id, GValue * value, GParamSpec * pspec);
|
||||||
|
|
||||||
G_DEFINE_TYPE (GstCudaConvertScale, gst_cuda_convert_scale,
|
G_DEFINE_TYPE (GstCudaConvertScale, gst_cuda_convert_scale,
|
||||||
GST_TYPE_CUDA_BASE_CONVERT);
|
GST_TYPE_CUDA_BASE_CONVERT);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_cuda_convert_scale_class_init (GstCudaConvertScaleClass * klass)
|
gst_cuda_convert_scale_class_init (GstCudaConvertScaleClass * klass)
|
||||||
{
|
{
|
||||||
|
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||||
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
|
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
|
||||||
|
|
||||||
|
gobject_class->set_property = gst_cuda_convert_scale_set_property;
|
||||||
|
gobject_class->get_property = gst_cuda_convert_scale_get_property;
|
||||||
|
|
||||||
|
g_object_class_install_property (gobject_class,
|
||||||
|
PROP_CONVERT_SCALE_ADD_BORDERS,
|
||||||
|
g_param_spec_boolean ("add-borders", "Add Borders",
|
||||||
|
"Add borders if necessary to keep the display aspect ratio",
|
||||||
|
DEFAULT_ADD_BORDERS, (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,
|
||||||
"CUDA colorspace converter and scaler",
|
"CUDA colorspace converter and scaler",
|
||||||
"Filter/Converter/Video/Scaler/Colorspace/Hardware",
|
"Filter/Converter/Video/Scaler/Colorspace/Hardware",
|
||||||
@ -1421,6 +1468,39 @@ gst_cuda_convert_scale_init (GstCudaConvertScale * self)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gst_cuda_convert_scale_set_property (GObject * object, guint prop_id,
|
||||||
|
const GValue * value, GParamSpec * pspec)
|
||||||
|
{
|
||||||
|
GstCudaBaseConvert *base = GST_CUDA_BASE_CONVERT (object);
|
||||||
|
|
||||||
|
switch (prop_id) {
|
||||||
|
case PROP_CONVERT_SCALE_ADD_BORDERS:
|
||||||
|
gst_cuda_base_convert_set_add_border (base, g_value_get_boolean (value));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gst_cuda_convert_scale_get_property (GObject * object, guint prop_id,
|
||||||
|
GValue * value, GParamSpec * pspec)
|
||||||
|
{
|
||||||
|
GstCudaBaseConvert *base = GST_CUDA_BASE_CONVERT (object);
|
||||||
|
|
||||||
|
switch (prop_id) {
|
||||||
|
case PROP_CONVERT_SCALE_ADD_BORDERS:
|
||||||
|
g_value_set_boolean (value, base->add_borders);
|
||||||
|
break;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* SECTION:element-cudaconvert
|
* SECTION:element-cudaconvert
|
||||||
* @title: cudaconvert
|
* @title: cudaconvert
|
||||||
@ -1533,11 +1613,21 @@ gst_cuda_convert_fixate_caps (GstBaseTransform * base,
|
|||||||
* Since: 1.20
|
* Since: 1.20
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
PROP_SCALE_0,
|
||||||
|
PROP_SCALE_ADD_BORDERS,
|
||||||
|
};
|
||||||
|
|
||||||
struct _GstCudaScale
|
struct _GstCudaScale
|
||||||
{
|
{
|
||||||
GstCudaBaseConvert parent;
|
GstCudaBaseConvert parent;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void gst_cuda_scale_set_property (GObject * object, guint prop_id,
|
||||||
|
const GValue * value, GParamSpec * pspec);
|
||||||
|
static void gst_cuda_scale_get_property (GObject * object, guint prop_id,
|
||||||
|
GValue * value, GParamSpec * pspec);
|
||||||
static GstCaps *gst_cuda_scale_transform_caps (GstBaseTransform *
|
static GstCaps *gst_cuda_scale_transform_caps (GstBaseTransform *
|
||||||
trans, GstPadDirection direction, GstCaps * caps, GstCaps * filter);
|
trans, GstPadDirection direction, GstCaps * caps, GstCaps * filter);
|
||||||
static GstCaps *gst_cuda_scale_fixate_caps (GstBaseTransform * base,
|
static GstCaps *gst_cuda_scale_fixate_caps (GstBaseTransform * base,
|
||||||
@ -1548,9 +1638,26 @@ G_DEFINE_TYPE (GstCudaScale, gst_cuda_scale, GST_TYPE_CUDA_BASE_CONVERT);
|
|||||||
static void
|
static void
|
||||||
gst_cuda_scale_class_init (GstCudaScaleClass * klass)
|
gst_cuda_scale_class_init (GstCudaScaleClass * 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);
|
||||||
|
|
||||||
|
gobject_class->set_property = gst_cuda_scale_set_property;
|
||||||
|
gobject_class->get_property = gst_cuda_scale_get_property;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GstCudaScale:add-borders:
|
||||||
|
*
|
||||||
|
* Add borders if necessary to keep the display aspect ratio
|
||||||
|
*
|
||||||
|
* Since: 1.22
|
||||||
|
*/
|
||||||
|
g_object_class_install_property (gobject_class, PROP_SCALE_ADD_BORDERS,
|
||||||
|
g_param_spec_boolean ("add-borders", "Add Borders",
|
||||||
|
"Add borders if necessary to keep the display aspect ratio",
|
||||||
|
DEFAULT_ADD_BORDERS, (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,
|
||||||
"CUDA video scaler",
|
"CUDA video scaler",
|
||||||
"Filter/Converter/Video/Scaler/Hardware",
|
"Filter/Converter/Video/Scaler/Hardware",
|
||||||
@ -1566,6 +1673,39 @@ gst_cuda_scale_init (GstCudaScale * self)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gst_cuda_scale_set_property (GObject * object, guint prop_id,
|
||||||
|
const GValue * value, GParamSpec * pspec)
|
||||||
|
{
|
||||||
|
GstCudaBaseConvert *base = GST_CUDA_BASE_CONVERT (object);
|
||||||
|
|
||||||
|
switch (prop_id) {
|
||||||
|
case PROP_SCALE_ADD_BORDERS:
|
||||||
|
gst_cuda_base_convert_set_add_border (base, g_value_get_boolean (value));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gst_cuda_scale_get_property (GObject * object, guint prop_id,
|
||||||
|
GValue * value, GParamSpec * pspec)
|
||||||
|
{
|
||||||
|
GstCudaBaseConvert *base = GST_CUDA_BASE_CONVERT (object);
|
||||||
|
|
||||||
|
switch (prop_id) {
|
||||||
|
case PROP_SCALE_ADD_BORDERS:
|
||||||
|
g_value_set_boolean (value, base->add_borders);
|
||||||
|
break;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static GstCaps *
|
static GstCaps *
|
||||||
gst_cuda_scale_transform_caps (GstBaseTransform * trans,
|
gst_cuda_scale_transform_caps (GstBaseTransform * trans,
|
||||||
GstPadDirection direction, GstCaps * caps, GstCaps * filter)
|
GstPadDirection direction, GstCaps * caps, GstCaps * filter)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user