mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-19 20:46:22 +00:00
vapostproc: Add add-borders property to keep dar
Just as videoscale, it enables add-borders property (FALSE by default) in vapostproc to add border, if necessary, to keep the display aspect ratio from the original image. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1169>
This commit is contained in:
parent
52c09778b7
commit
ff0fae50af
3 changed files with 83 additions and 1 deletions
|
@ -706,6 +706,21 @@ gst_va_filter_install_properties (GstVaFilter * self, GObjectClass * klass)
|
||||||
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS
|
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS
|
||||||
| GST_PARAM_MUTABLE_READY));
|
| GST_PARAM_MUTABLE_READY));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GstVaPostProc:add-borders:
|
||||||
|
*
|
||||||
|
* If set to %TRUE the filter will add black borders if necessary to
|
||||||
|
* keep the display aspect ratio.
|
||||||
|
*
|
||||||
|
* Since: 1.20
|
||||||
|
*/
|
||||||
|
g_object_class_install_property (klass, GST_VA_FILTER_PROP_ADD_BORDERS,
|
||||||
|
g_param_spec_boolean ("add-borders", "Add Borders",
|
||||||
|
"Add black borders if necessary to keep the display aspect ratio",
|
||||||
|
FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS
|
||||||
|
| GST_PARAM_MUTABLE_PLAYING));
|
||||||
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1524,6 +1539,10 @@ _fill_va_sample (GstVaFilter * self, GstVaSample * sample,
|
||||||
if (direction == GST_PAD_SRC) {
|
if (direction == GST_PAD_SRC) {
|
||||||
GST_OBJECT_LOCK (self);
|
GST_OBJECT_LOCK (self);
|
||||||
sample->rect = self->output_region;
|
sample->rect = self->output_region;
|
||||||
|
sample->rect.x = sample->borders_w / 2;
|
||||||
|
sample->rect.y = sample->borders_h / 2;
|
||||||
|
sample->rect.width -= sample->borders_w;
|
||||||
|
sample->rect.height -= sample->borders_h;
|
||||||
GST_OBJECT_UNLOCK (self);
|
GST_OBJECT_UNLOCK (self);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
|
@ -52,6 +52,7 @@ enum {
|
||||||
GST_VA_FILTER_PROP_AUTO_CONTRAST,
|
GST_VA_FILTER_PROP_AUTO_CONTRAST,
|
||||||
GST_VA_FILTER_PROP_DISABLE_PASSTHROUGH,
|
GST_VA_FILTER_PROP_DISABLE_PASSTHROUGH,
|
||||||
GST_VA_FILTER_PROP_DEINTERLACE_METHOD,
|
GST_VA_FILTER_PROP_DEINTERLACE_METHOD,
|
||||||
|
GST_VA_FILTER_PROP_ADD_BORDERS,
|
||||||
GST_VA_FILTER_PROP_LAST
|
GST_VA_FILTER_PROP_LAST
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -67,6 +68,10 @@ struct _GstVaSample
|
||||||
VASurfaceID *backward_references;
|
VASurfaceID *backward_references;
|
||||||
guint num_backward_references;
|
guint num_backward_references;
|
||||||
|
|
||||||
|
/* borders to preserve dar */
|
||||||
|
gint borders_h;
|
||||||
|
gint borders_w;
|
||||||
|
|
||||||
/*< private >*/
|
/*< private >*/
|
||||||
VASurfaceID surface;
|
VASurfaceID surface;
|
||||||
VARectangle rect;
|
VARectangle rect;
|
||||||
|
|
|
@ -118,6 +118,9 @@ struct _GstVaVpp
|
||||||
GstVideoOrientationMethod direction;
|
GstVideoOrientationMethod direction;
|
||||||
GstVideoOrientationMethod prev_direction;
|
GstVideoOrientationMethod prev_direction;
|
||||||
GstVideoOrientationMethod tag_direction;
|
GstVideoOrientationMethod tag_direction;
|
||||||
|
gboolean add_borders;
|
||||||
|
gint borders_h;
|
||||||
|
gint borders_w;
|
||||||
|
|
||||||
GList *channels;
|
GList *channels;
|
||||||
};
|
};
|
||||||
|
@ -299,6 +302,9 @@ gst_va_vpp_set_property (GObject * object, guint prop_id,
|
||||||
self->op_flags &= ~VPP_CONVERT_DUMMY;
|
self->op_flags &= ~VPP_CONVERT_DUMMY;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case GST_VA_FILTER_PROP_ADD_BORDERS:
|
||||||
|
self->add_borders = g_value_get_boolean (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;
|
||||||
|
@ -357,6 +363,9 @@ gst_va_vpp_get_property (GObject * object, guint prop_id, GValue * value,
|
||||||
case GST_VA_FILTER_PROP_DISABLE_PASSTHROUGH:
|
case GST_VA_FILTER_PROP_DISABLE_PASSTHROUGH:
|
||||||
g_value_set_boolean (value, (self->op_flags & VPP_CONVERT_DUMMY));
|
g_value_set_boolean (value, (self->op_flags & VPP_CONVERT_DUMMY));
|
||||||
break;
|
break;
|
||||||
|
case GST_VA_FILTER_PROP_ADD_BORDERS:
|
||||||
|
g_value_set_boolean (value, self->add_borders);
|
||||||
|
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;
|
||||||
|
@ -391,6 +400,7 @@ gst_va_vpp_set_info (GstVaBaseTransform * btrans, GstCaps * incaps,
|
||||||
{
|
{
|
||||||
GstVaVpp *self = GST_VA_VPP (btrans);
|
GstVaVpp *self = GST_VA_VPP (btrans);
|
||||||
GstCapsFeatures *infeat, *outfeat;
|
GstCapsFeatures *infeat, *outfeat;
|
||||||
|
gint from_dar_n, from_dar_d, to_dar_n, to_dar_d;
|
||||||
|
|
||||||
if (GST_VIDEO_INFO_INTERLACE_MODE (in_info) !=
|
if (GST_VIDEO_INFO_INTERLACE_MODE (in_info) !=
|
||||||
GST_VIDEO_INFO_INTERLACE_MODE (out_info)) {
|
GST_VIDEO_INFO_INTERLACE_MODE (out_info)) {
|
||||||
|
@ -398,6 +408,47 @@ gst_va_vpp_set_info (GstVaBaseTransform * btrans, GstCaps * incaps,
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* calculate possible borders if display-aspect-ratio change */
|
||||||
|
{
|
||||||
|
if (!gst_util_fraction_multiply (GST_VIDEO_INFO_WIDTH (in_info),
|
||||||
|
GST_VIDEO_INFO_HEIGHT (in_info), GST_VIDEO_INFO_PAR_N (in_info),
|
||||||
|
GST_VIDEO_INFO_PAR_D (in_info), &from_dar_n, &from_dar_d)) {
|
||||||
|
from_dar_n = from_dar_d = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!gst_util_fraction_multiply (GST_VIDEO_INFO_WIDTH (out_info),
|
||||||
|
GST_VIDEO_INFO_HEIGHT (out_info), GST_VIDEO_INFO_PAR_N (out_info),
|
||||||
|
GST_VIDEO_INFO_PAR_D (out_info), &to_dar_n, &to_dar_d)) {
|
||||||
|
to_dar_n = to_dar_d = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
self->borders_h = self->borders_w = 0;
|
||||||
|
if (to_dar_n != from_dar_n || to_dar_d != from_dar_d) {
|
||||||
|
if (self->add_borders) {
|
||||||
|
gint n, d, to_h, to_w;
|
||||||
|
|
||||||
|
if (from_dar_n != -1 && from_dar_d != -1
|
||||||
|
&& gst_util_fraction_multiply (from_dar_n, from_dar_d,
|
||||||
|
out_info->par_d, out_info->par_n, &n, &d)) {
|
||||||
|
to_h = gst_util_uint64_scale_int (out_info->width, d, n);
|
||||||
|
if (to_h <= out_info->height) {
|
||||||
|
self->borders_h = out_info->height - to_h;
|
||||||
|
self->borders_w = 0;
|
||||||
|
} else {
|
||||||
|
to_w = gst_util_uint64_scale_int (out_info->height, n, d);
|
||||||
|
g_assert (to_w <= out_info->width);
|
||||||
|
self->borders_h = 0;
|
||||||
|
self->borders_w = out_info->width - to_w;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
GST_WARNING_OBJECT (self, "Can't calculate borders");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
GST_WARNING_OBJECT (self, "Can't keep DAR!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!gst_video_info_is_equal (in_info, out_info)) {
|
if (!gst_video_info_is_equal (in_info, out_info)) {
|
||||||
if (GST_VIDEO_INFO_FORMAT (in_info) != GST_VIDEO_INFO_FORMAT (out_info))
|
if (GST_VIDEO_INFO_FORMAT (in_info) != GST_VIDEO_INFO_FORMAT (out_info))
|
||||||
self->op_flags |= VPP_CONVERT_FORMAT;
|
self->op_flags |= VPP_CONVERT_FORMAT;
|
||||||
|
@ -405,7 +456,8 @@ gst_va_vpp_set_info (GstVaBaseTransform * btrans, GstCaps * incaps,
|
||||||
self->op_flags &= ~VPP_CONVERT_FORMAT;
|
self->op_flags &= ~VPP_CONVERT_FORMAT;
|
||||||
|
|
||||||
if (GST_VIDEO_INFO_WIDTH (in_info) != GST_VIDEO_INFO_WIDTH (out_info)
|
if (GST_VIDEO_INFO_WIDTH (in_info) != GST_VIDEO_INFO_WIDTH (out_info)
|
||||||
|| GST_VIDEO_INFO_HEIGHT (in_info) != GST_VIDEO_INFO_HEIGHT (out_info))
|
|| GST_VIDEO_INFO_HEIGHT (in_info) != GST_VIDEO_INFO_HEIGHT (out_info)
|
||||||
|
|| self->borders_h > 0 || self->borders_w > 0)
|
||||||
self->op_flags |= VPP_CONVERT_SIZE;
|
self->op_flags |= VPP_CONVERT_SIZE;
|
||||||
else
|
else
|
||||||
self->op_flags &= ~VPP_CONVERT_SIZE;
|
self->op_flags &= ~VPP_CONVERT_SIZE;
|
||||||
|
@ -420,6 +472,10 @@ gst_va_vpp_set_info (GstVaBaseTransform * btrans, GstCaps * incaps,
|
||||||
else
|
else
|
||||||
self->op_flags &= ~VPP_CONVERT_FEATURE;
|
self->op_flags &= ~VPP_CONVERT_FEATURE;
|
||||||
|
|
||||||
|
if (self->op_flags & VPP_CONVERT_SIZE) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
if (gst_va_filter_set_video_info (btrans->filter, in_info, out_info)) {
|
if (gst_va_filter_set_video_info (btrans->filter, in_info, out_info)) {
|
||||||
gst_va_vpp_update_passthrough (self, FALSE);
|
gst_va_vpp_update_passthrough (self, FALSE);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -662,6 +718,8 @@ gst_va_vpp_transform (GstBaseTransform * trans, GstBuffer * inbuf,
|
||||||
|
|
||||||
dst = (GstVaSample) {
|
dst = (GstVaSample) {
|
||||||
.buffer = outbuf,
|
.buffer = outbuf,
|
||||||
|
.borders_h = self->borders_h,
|
||||||
|
.borders_w = self->borders_w,
|
||||||
.flags = gst_va_buffer_get_surface_flags (outbuf, &btrans->out_info),
|
.flags = gst_va_buffer_get_surface_flags (outbuf, &btrans->out_info),
|
||||||
};
|
};
|
||||||
/* *INDENT-ON* */
|
/* *INDENT-ON* */
|
||||||
|
|
Loading…
Reference in a new issue