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
This commit is contained in:
U. Artie Eoff 2019-06-10 20:46:30 -07:00
parent 5f41422215
commit a6dfb6e5be

View file

@ -532,7 +532,6 @@ static gboolean
ensure_srcpad_allocator (GstVaapiPluginBase * plugin, GstVideoInfo * vinfo, ensure_srcpad_allocator (GstVaapiPluginBase * plugin, GstVideoInfo * vinfo,
GstCaps * caps) GstCaps * caps)
{ {
gboolean different_caps;
const GstVideoInfo *image_info; const GstVideoInfo *image_info;
if (!reset_allocator (plugin->srcpad_allocator, vinfo)) if (!reset_allocator (plugin->srcpad_allocator, vinfo))
@ -576,30 +575,37 @@ valid_allocator:
/* update the size with the one generated by the allocator */ /* update the size with the one generated by the allocator */
GST_VIDEO_INFO_SIZE (vinfo) = GST_VIDEO_INFO_SIZE (image_info); GST_VIDEO_INFO_SIZE (vinfo) = GST_VIDEO_INFO_SIZE (image_info);
/* the received caps are the "allocation caps" which may be if (GST_IS_VIDEO_DECODER (plugin)) {
* different from the "negotiation caps". In this case, we should /* the received caps are the "allocation caps" which may be
* indicate the allocator to store the negotiation caps since they * different from the "negotiation caps". In this case, we should
* are the one should be used for frame mapping with GstVideoMeta */ * indicate the allocator to store the negotiation caps since they
different_caps = GST_IS_VIDEO_DECODER (plugin) && plugin->srcpad_caps && * are the one should be used for frame mapping with GstVideoMeta */
!gst_caps_is_strictly_equal (plugin->srcpad_caps, caps); 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) { if (different_caps) {
guint i; guint i;
GstVideoInfo vi = plugin->srcpad_info; GstVideoInfo vi = plugin->srcpad_info;
/* update the planes and the size with the allocator image/surface /* update the planes and the size with the allocator image/surface
* info, but not the resolution */ * info, but not the resolution */
for (i = 0; i < GST_VIDEO_INFO_N_PLANES (image_info); i++) { for (i = 0; i < GST_VIDEO_INFO_N_PLANES (image_info); i++) {
GST_VIDEO_INFO_PLANE_OFFSET (&vi, i) = GST_VIDEO_INFO_PLANE_OFFSET (&vi, i) =
GST_VIDEO_INFO_PLANE_OFFSET (image_info, i); GST_VIDEO_INFO_PLANE_OFFSET (image_info, i);
GST_VIDEO_INFO_PLANE_STRIDE (&vi, i) = GST_VIDEO_INFO_PLANE_STRIDE (&vi, i) =
GST_VIDEO_INFO_PLANE_STRIDE (image_info, 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; return TRUE;
/* ERRORS */ /* ERRORS */