mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-03-30 12:49:40 +00:00
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:
parent
5f41422215
commit
a6dfb6e5be
1 changed files with 27 additions and 21 deletions
|
@ -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 (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;
|
||||
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);
|
||||
/* 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 */
|
||||
|
|
Loading…
Reference in a new issue