mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-09-20 11:00:16 +00:00
vaapipostproc: prevent advanced-deinterlacing of non-native video formats.
This is a workaround to deal with the va-intel-driver for non-native formats while doing advanced deinterlacing. The format of reference surfaces must be same as the format used by the driver internally for motion adaptive deinterlacing and motion compensated deinterlacing. A permanent solution could be to do the color space conversion internally for reference surfaces. https://bugzilla.gnome.org/show_bug.cgi?id=730925 Signed-off-by: Sreerenj Balachandran <sreerenj.balachandran@intel.com>
This commit is contained in:
parent
d946e7972e
commit
a1eef1c355
1 changed files with 25 additions and 0 deletions
|
@ -91,6 +91,9 @@ G_DEFINE_TYPE_WITH_CODE (GstVaapiPostproc, gst_vaapipostproc,
|
||||||
G_IMPLEMENT_INTERFACE (GST_TYPE_COLOR_BALANCE,
|
G_IMPLEMENT_INTERFACE (GST_TYPE_COLOR_BALANCE,
|
||||||
gst_vaapipostproc_colorbalance_init));
|
gst_vaapipostproc_colorbalance_init));
|
||||||
|
|
||||||
|
static GstVideoFormat native_formats[] =
|
||||||
|
{ GST_VIDEO_FORMAT_NV12, GST_VIDEO_FORMAT_YV12, GST_VIDEO_FORMAT_I420 };
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
PROP_0,
|
PROP_0,
|
||||||
|
@ -1238,15 +1241,37 @@ ensure_srcpad_buffer_pool (GstVaapiPostproc * postproc, GstCaps * caps)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
is_native_video_format (GstVideoFormat format)
|
||||||
|
{
|
||||||
|
guint i = 0;
|
||||||
|
for (i = 0; i < G_N_ELEMENTS (native_formats); i++)
|
||||||
|
if (native_formats[i] == format)
|
||||||
|
return TRUE;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_vaapipostproc_set_caps (GstBaseTransform * trans, GstCaps * caps,
|
gst_vaapipostproc_set_caps (GstBaseTransform * trans, GstCaps * caps,
|
||||||
GstCaps * out_caps)
|
GstCaps * out_caps)
|
||||||
{
|
{
|
||||||
GstVaapiPostproc *const postproc = GST_VAAPIPOSTPROC (trans);
|
GstVaapiPostproc *const postproc = GST_VAAPIPOSTPROC (trans);
|
||||||
gboolean caps_changed = FALSE;
|
gboolean caps_changed = FALSE;
|
||||||
|
GstVideoInfo vinfo;
|
||||||
|
|
||||||
if (!gst_vaapipostproc_update_sink_caps (postproc, caps, &caps_changed))
|
if (!gst_vaapipostproc_update_sink_caps (postproc, caps, &caps_changed))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
/* HACK: This is a workaround to deal with the va-intel-driver for non-native
|
||||||
|
* formats while doing advanced deinterlacing. The format of reference surfaces must
|
||||||
|
* be same as the format used by the driver internally for motion adaptive
|
||||||
|
* deinterlacing and motion compensated deinterlacing */
|
||||||
|
gst_video_info_from_caps (&vinfo, caps);
|
||||||
|
if (deint_method_is_advanced (postproc->deinterlace_method)
|
||||||
|
&& !is_native_video_format (GST_VIDEO_INFO_FORMAT (&vinfo))) {
|
||||||
|
GST_WARNING_OBJECT (postproc,
|
||||||
|
"Advanced deinterlacing requires the native video formats used by the driver internally");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
if (!gst_vaapipostproc_update_src_caps (postproc, out_caps, &caps_changed))
|
if (!gst_vaapipostproc_update_src_caps (postproc, out_caps, &caps_changed))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue