mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-10 17:35:59 +00:00
va: filter & postproc: Match color with caps features.
When fixating color, there might be "other caps" with color spaces not supported by the caps features exposed in the vapostproc's source pad caps template (perhaps it's a bug somewhere else in GStreamer). This solution checks if the proposed format exists in the filter within the caps feature associated with the proposed format. The check is done with the new filter's function gst_va_filter_has_video_format(). Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/1559>
This commit is contained in:
parent
2f7ec968f4
commit
c7e52e869d
3 changed files with 60 additions and 7 deletions
|
@ -1753,3 +1753,43 @@ gst_va_buffer_get_surface_flags (GstBuffer * buffer, GstVideoInfo * info)
|
||||||
|
|
||||||
return surface_flags;
|
return surface_flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
gst_va_filter_has_video_format (GstVaFilter * self, GstVideoFormat format,
|
||||||
|
GstCapsFeatures * feature)
|
||||||
|
{
|
||||||
|
guint i;
|
||||||
|
GstVideoFormat fmt;
|
||||||
|
|
||||||
|
g_return_val_if_fail (GST_IS_VA_FILTER (self), FALSE);
|
||||||
|
g_return_val_if_fail (format != GST_VIDEO_FORMAT_UNKNOWN, FALSE);
|
||||||
|
g_return_val_if_fail (GST_IS_CAPS_FEATURES (feature)
|
||||||
|
&& !gst_caps_features_is_any (feature), FALSE);
|
||||||
|
|
||||||
|
|
||||||
|
GST_OBJECT_LOCK (self);
|
||||||
|
for (i = 0; i < self->surface_formats->len; i++) {
|
||||||
|
fmt = g_array_index (self->surface_formats, GstVideoFormat, i);
|
||||||
|
if (format == fmt) {
|
||||||
|
GST_OBJECT_UNLOCK (self);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
GST_OBJECT_UNLOCK (self);
|
||||||
|
|
||||||
|
if (!gst_caps_features_is_equal (feature,
|
||||||
|
GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
GST_OBJECT_LOCK (self);
|
||||||
|
for (i = 0; i < self->image_formats->len; i++) {
|
||||||
|
fmt = g_array_index (self->image_formats, GstVideoFormat, i);
|
||||||
|
if (format == fmt) {
|
||||||
|
GST_OBJECT_UNLOCK (self);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
GST_OBJECT_UNLOCK (self);
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
|
@ -118,4 +118,8 @@ gboolean gst_va_filter_process (GstVaFilter * self,
|
||||||
guint32 gst_va_buffer_get_surface_flags (GstBuffer * buffer,
|
guint32 gst_va_buffer_get_surface_flags (GstBuffer * buffer,
|
||||||
GstVideoInfo * info);
|
GstVideoInfo * info);
|
||||||
|
|
||||||
|
gboolean gst_va_filter_has_video_format (GstVaFilter * self,
|
||||||
|
GstVideoFormat format,
|
||||||
|
GstCapsFeatures * feature);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
|
@ -974,15 +974,14 @@ bail:
|
||||||
/* calculate how much loss a conversion would be */
|
/* calculate how much loss a conversion would be */
|
||||||
static gboolean
|
static gboolean
|
||||||
score_value (GstVaVpp * self, const GstVideoFormatInfo * in_info,
|
score_value (GstVaVpp * self, const GstVideoFormatInfo * in_info,
|
||||||
const GValue * val, gint * min_loss, const GstVideoFormatInfo ** out_info)
|
GstVideoFormat format, gint * min_loss,
|
||||||
|
const GstVideoFormatInfo ** out_info)
|
||||||
{
|
{
|
||||||
const gchar *fname;
|
|
||||||
const GstVideoFormatInfo *t_info;
|
const GstVideoFormatInfo *t_info;
|
||||||
GstVideoFormatFlags in_flags, t_flags;
|
GstVideoFormatFlags in_flags, t_flags;
|
||||||
gint loss;
|
gint loss;
|
||||||
|
|
||||||
fname = g_value_get_string (val);
|
t_info = gst_video_format_get_info (format);
|
||||||
t_info = gst_video_format_get_info (gst_video_format_from_string (fname));
|
|
||||||
if (!t_info || t_info->format == GST_VIDEO_FORMAT_UNKNOWN)
|
if (!t_info || t_info->format == GST_VIDEO_FORMAT_UNKNOWN)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
@ -1057,9 +1056,12 @@ score_value (GstVaVpp * self, const GstVideoFormatInfo * in_info,
|
||||||
static GstCaps *
|
static GstCaps *
|
||||||
gst_va_vpp_fixate_format (GstVaVpp * self, GstCaps * caps, GstCaps * result)
|
gst_va_vpp_fixate_format (GstVaVpp * self, GstCaps * caps, GstCaps * result)
|
||||||
{
|
{
|
||||||
|
GstVaBaseTransform *btrans = GST_VA_BASE_TRANSFORM (self);
|
||||||
GstStructure *ins;
|
GstStructure *ins;
|
||||||
const gchar *in_format;
|
const gchar *in_format;
|
||||||
const GstVideoFormatInfo *in_info, *out_info = NULL;
|
const GstVideoFormatInfo *in_info, *out_info = NULL;
|
||||||
|
GstCapsFeatures *features;
|
||||||
|
GstVideoFormat fmt;
|
||||||
gint min_loss = G_MAXINT;
|
gint min_loss = G_MAXINT;
|
||||||
guint i, best_i, capslen;
|
guint i, best_i, capslen;
|
||||||
|
|
||||||
|
@ -1088,6 +1090,8 @@ gst_va_vpp_fixate_format (GstVaVpp * self, GstCaps * caps, GstCaps * result)
|
||||||
if (format == NULL)
|
if (format == NULL)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
features = gst_caps_get_features (result, i);
|
||||||
|
|
||||||
if (GST_VALUE_HOLDS_LIST (format)) {
|
if (GST_VALUE_HOLDS_LIST (format)) {
|
||||||
gint j, len;
|
gint j, len;
|
||||||
|
|
||||||
|
@ -1098,14 +1102,20 @@ gst_va_vpp_fixate_format (GstVaVpp * self, GstCaps * caps, GstCaps * result)
|
||||||
|
|
||||||
val = gst_value_list_get_value (format, j);
|
val = gst_value_list_get_value (format, j);
|
||||||
if (G_VALUE_HOLDS_STRING (val)) {
|
if (G_VALUE_HOLDS_STRING (val)) {
|
||||||
if (score_value (self, in_info, val, &min_loss, &out_info))
|
fmt = gst_video_format_from_string (g_value_get_string (val));
|
||||||
|
if (!gst_va_filter_has_video_format (btrans->filter, fmt, features))
|
||||||
|
continue;
|
||||||
|
if (score_value (self, in_info, fmt, &min_loss, &out_info))
|
||||||
best_i = i;
|
best_i = i;
|
||||||
if (min_loss == 0)
|
if (min_loss == 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (G_VALUE_HOLDS_STRING (format)) {
|
} else if (G_VALUE_HOLDS_STRING (format)) {
|
||||||
if (score_value (self, in_info, format, &min_loss, &out_info))
|
fmt = gst_video_format_from_string (g_value_get_string (format));
|
||||||
|
if (!gst_va_filter_has_video_format (btrans->filter, fmt, features))
|
||||||
|
continue;
|
||||||
|
if (score_value (self, in_info, fmt, &min_loss, &out_info))
|
||||||
best_i = i;
|
best_i = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1116,7 +1126,6 @@ gst_va_vpp_fixate_format (GstVaVpp * self, GstCaps * caps, GstCaps * result)
|
||||||
if (out_info) {
|
if (out_info) {
|
||||||
GstCaps *ret;
|
GstCaps *ret;
|
||||||
GstStructure *out;
|
GstStructure *out;
|
||||||
GstCapsFeatures *features;
|
|
||||||
|
|
||||||
features = gst_caps_features_copy (gst_caps_get_features (result, best_i));
|
features = gst_caps_features_copy (gst_caps_get_features (result, best_i));
|
||||||
out = gst_structure_copy (gst_caps_get_structure (result, best_i));
|
out = gst_structure_copy (gst_caps_get_structure (result, best_i));
|
||||||
|
|
Loading…
Reference in a new issue