Commit a6dfb6e5 authored by U. Artie Eoff's avatar U. Artie Eoff

plugins: remove last negotiated video info if caps are same

If the allocation caps and negotiated caps are the same,
then ensure any previously negotiated video info is also
removed.  This can occur when multi-resolution video
decoding returns to it's original resolution.

Fixes #170
parent 5f414222
Pipeline #41712 failed with stages
in 14 minutes and 36 seconds
......@@ -532,7 +532,6 @@ static gboolean
ensure_srcpad_allocator (GstVaapiPluginBase * plugin, GstVideoInfo * vinfo,
GstCaps * caps)
{
gboolean different_caps;
const GstVideoInfo *image_info;
if (!reset_allocator (plugin->srcpad_allocator, vinfo))
......@@ -576,30 +575,37 @@ valid_allocator:
/* update the size with the one generated by the allocator */
GST_VIDEO_INFO_SIZE (vinfo) = GST_VIDEO_INFO_SIZE (image_info);
/* the received caps are the "allocation caps" which may be
* different from the "negotiation caps". In this case, we should
* indicate the allocator to store the negotiation caps since they
* are the one should be used for frame mapping with GstVideoMeta */
different_caps = GST_IS_VIDEO_DECODER (plugin) && plugin->srcpad_caps &&
!gst_caps_is_strictly_equal (plugin->srcpad_caps, caps);
if (different_caps) {
guint i;
GstVideoInfo vi = plugin->srcpad_info;
/* update the planes and the size with the allocator image/surface
* info, but not the resolution */
for (i = 0; i < GST_VIDEO_INFO_N_PLANES (image_info); i++) {
GST_VIDEO_INFO_PLANE_OFFSET (&vi, i) =
GST_VIDEO_INFO_PLANE_OFFSET (image_info, i);
GST_VIDEO_INFO_PLANE_STRIDE (&vi, i) =
GST_VIDEO_INFO_PLANE_STRIDE (image_info, i);
if (GST_IS_VIDEO_DECODER (plugin)) {
/* the received caps are the "allocation caps" which may be
* different from the "negotiation caps". In this case, we should
* indicate the allocator to store the negotiation caps since they
* are the one should be used for frame mapping with GstVideoMeta */
gboolean different_caps = plugin->srcpad_caps &&
!gst_caps_is_strictly_equal (plugin->srcpad_caps, caps);
const GstVideoInfo *previous_negotiated =
gst_allocator_get_vaapi_negotiated_video_info
(plugin->srcpad_allocator);
if (different_caps) {
guint i;
GstVideoInfo vi = plugin->srcpad_info;
/* update the planes and the size with the allocator image/surface
* info, but not the resolution */
for (i = 0; i < GST_VIDEO_INFO_N_PLANES (image_info); i++) {
GST_VIDEO_INFO_PLANE_OFFSET (&vi, i) =
GST_VIDEO_INFO_PLANE_OFFSET (image_info, i);
GST_VIDEO_INFO_PLANE_STRIDE (&vi, i) =
GST_VIDEO_INFO_PLANE_STRIDE (image_info, i);
}
GST_VIDEO_INFO_SIZE (&vi) = GST_VIDEO_INFO_SIZE (image_info);
gst_allocator_set_vaapi_negotiated_video_info (plugin->srcpad_allocator,
&vi);
} else if (previous_negotiated) {
gst_allocator_set_vaapi_negotiated_video_info (plugin->srcpad_allocator,
NULL);
}
GST_VIDEO_INFO_SIZE (&vi) = GST_VIDEO_INFO_SIZE (image_info);
gst_allocator_set_vaapi_negotiated_video_info (plugin->srcpad_allocator,
&vi);
}
return TRUE;
/* ERRORS */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment