mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-17 22:06:41 +00:00
vaapipostproc: notify if src pad caps changed
If src pad caps have changed, it needs to notify it downstream. In addition, do not set passthrough if they have changed. Otherwise, transform sometimes starts processing before caps change. The passthrough value will be set in fixate later in this case. https://bugzilla.gnome.org/show_bug.cgi?id=775204
This commit is contained in:
parent
a36b9b27e5
commit
b23640fb27
1 changed files with 15 additions and 6 deletions
|
@ -1273,12 +1273,13 @@ 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 sink_caps_changed = FALSE;
|
||||||
|
gboolean src_caps_changed = FALSE;
|
||||||
GstVideoInfo vinfo;
|
GstVideoInfo vinfo;
|
||||||
gboolean ret = FALSE;
|
gboolean ret = FALSE;
|
||||||
|
|
||||||
g_mutex_lock (&postproc->postproc_lock);
|
g_mutex_lock (&postproc->postproc_lock);
|
||||||
if (!gst_vaapipostproc_update_sink_caps (postproc, caps, &caps_changed))
|
if (!gst_vaapipostproc_update_sink_caps (postproc, caps, &sink_caps_changed))
|
||||||
goto done;
|
goto done;
|
||||||
/* HACK: This is a workaround to deal with the va-intel-driver for non-native
|
/* 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
|
* formats while doing advanced deinterlacing. The format of reference surfaces must
|
||||||
|
@ -1292,10 +1293,11 @@ gst_vaapipostproc_set_caps (GstBaseTransform * trans, GstCaps * caps,
|
||||||
"Advanced deinterlacing requires the native video formats used by the driver internally");
|
"Advanced deinterlacing requires the native video formats used by the driver internally");
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
if (!gst_vaapipostproc_update_src_caps (postproc, out_caps, &caps_changed))
|
if (!gst_vaapipostproc_update_src_caps (postproc, out_caps,
|
||||||
|
&src_caps_changed))
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
if (caps_changed) {
|
if (sink_caps_changed || src_caps_changed) {
|
||||||
gst_vaapipostproc_destroy (postproc);
|
gst_vaapipostproc_destroy (postproc);
|
||||||
if (!gst_vaapipostproc_create (postproc))
|
if (!gst_vaapipostproc_create (postproc))
|
||||||
goto done;
|
goto done;
|
||||||
|
@ -1309,13 +1311,20 @@ gst_vaapipostproc_set_caps (GstBaseTransform * trans, GstCaps * caps,
|
||||||
|
|
||||||
postproc->same_caps = gst_caps_is_equal (caps, out_caps);
|
postproc->same_caps = gst_caps_is_equal (caps, out_caps);
|
||||||
|
|
||||||
/* set passthrough according to caps changes or filter changes */
|
if (!src_caps_changed) {
|
||||||
gst_vaapipostproc_set_passthrough (trans);
|
/* set passthrough according to caps changes or filter changes */
|
||||||
|
gst_vaapipostproc_set_passthrough (trans);
|
||||||
|
}
|
||||||
|
|
||||||
ret = TRUE;
|
ret = TRUE;
|
||||||
|
|
||||||
done:
|
done:
|
||||||
g_mutex_unlock (&postproc->postproc_lock);
|
g_mutex_unlock (&postproc->postproc_lock);
|
||||||
|
|
||||||
|
/* Updates the srcpad caps and send the caps downstream */
|
||||||
|
if (ret && src_caps_changed)
|
||||||
|
gst_base_transform_update_src_caps (trans, out_caps);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue