ensure_srcpad_allocator (GstVaapiPluginBase * plugin, GstVideoInfo * vinfo,
GstCaps * caps)
{
- gboolean different_caps;
const GstVideoInfo *image_info;
if (!reset_allocator (plugin->srcpad_allocator, vinfo))
/* 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 */