GstVaapiDisplay *display;
GstCaps *allowed_caps;
GstVaapiVideoPool *images;
+ GstVideoInfo image_info;
GstCaps *image_caps;
- GstVideoFormat image_format;
- guint image_width;
- guint image_height;
GstVaapiVideoPool *surfaces;
- guint surface_width;
- guint surface_height;
+ GstVideoInfo surface_info;
guint direct_rendering;
};
}
static gboolean
-ensure_image_pool(GstVaapiUploader *uploader, GstCaps *caps)
+ensure_image_pool(GstVaapiUploader *uploader, GstCaps *caps,
+ gboolean *caps_changed_ptr)
{
GstVaapiUploaderPrivate * const priv = uploader->priv;
+ GstVaapiVideoPool *pool;
GstVideoInfo vi;
GstVideoFormat format;
guint width, height;
width = GST_VIDEO_INFO_WIDTH(&vi);
height = GST_VIDEO_INFO_HEIGHT(&vi);
- if (format != priv->image_format ||
- width != priv->image_width ||
- height != priv->image_height) {
- priv->image_format = format;
- priv->image_width = width;
- priv->image_height = height;
- gst_vaapi_video_pool_replace(&priv->images, NULL);
- priv->images = gst_vaapi_image_pool_new(priv->display, &vi);
- if (!priv->images)
- return FALSE;
- gst_caps_replace(&priv->image_caps, caps);
- }
+ *caps_changed_ptr =
+ format != GST_VIDEO_INFO_FORMAT(&priv->image_info) ||
+ width != GST_VIDEO_INFO_WIDTH(&priv->image_info) ||
+ height != GST_VIDEO_INFO_HEIGHT(&priv->image_info);
+ if (!*caps_changed_ptr)
+ return TRUE;
+
+ pool = gst_vaapi_image_pool_new(priv->display, &vi);
+ if (!pool)
+ return FALSE;
+
+ gst_video_info_set_format(&priv->image_info, format, width, height);
+ gst_caps_replace(&priv->image_caps, caps);
+ gst_vaapi_video_pool_replace(&priv->images, pool);
+ gst_vaapi_video_pool_unref(pool);
return TRUE;
}
static gboolean
-ensure_surface_pool(GstVaapiUploader *uploader, GstCaps *caps)
+ensure_surface_pool(GstVaapiUploader *uploader, GstCaps *caps,
+ gboolean *caps_changed_ptr)
{
GstVaapiUploaderPrivate * const priv = uploader->priv;
+ GstVaapiVideoPool *pool;
GstVideoInfo vi;
+ GstVideoFormat format;
guint width, height;
if (!gst_video_info_from_caps(&vi, caps))
return FALSE;
+ format = GST_VIDEO_INFO_FORMAT(&vi);
width = GST_VIDEO_INFO_WIDTH(&vi);
height = GST_VIDEO_INFO_HEIGHT(&vi);
- if (width != priv->surface_width || height != priv->surface_height) {
- priv->surface_width = width;
- priv->surface_height = height;
- gst_vaapi_video_pool_replace(&priv->surfaces, NULL);
- priv->surfaces = gst_vaapi_surface_pool_new(priv->display, &vi);
- if (!priv->surfaces)
- return FALSE;
- }
+ *caps_changed_ptr =
+ format != GST_VIDEO_INFO_FORMAT(&priv->surface_info) ||
+ width != GST_VIDEO_INFO_WIDTH(&priv->surface_info) ||
+ height != GST_VIDEO_INFO_HEIGHT(&priv->surface_info);
+ if (!*caps_changed_ptr)
+ return TRUE;
+
+ pool = gst_vaapi_surface_pool_new(priv->display, &vi);
+ if (!pool)
+ return FALSE;
+
+ gst_video_info_set_format(&priv->surface_info, format, width, height);
+ gst_vaapi_video_pool_replace(&priv->surfaces, pool);
+ gst_vaapi_video_pool_unref(pool);
return TRUE;
}
priv = GST_VAAPI_UPLOADER_GET_PRIVATE(uploader);
uploader->priv = priv;
+
+ gst_video_info_init(&priv->image_info);
+ gst_video_info_init(&priv->surface_info);
}
GstVaapiUploader *
GstVaapiImage *image;
GstVideoFormat format;
GstVideoInfo vi;
+ gboolean image_caps_changed, surface_caps_changed;
g_return_val_if_fail(GST_VAAPI_IS_UPLOADER(uploader), FALSE);
g_return_val_if_fail(src_caps != NULL, FALSE);
- if (!ensure_image_pool(uploader, src_caps))
+ if (!out_caps)
+ out_caps = src_caps;
+
+ if (!ensure_image_pool(uploader, src_caps, &image_caps_changed))
return FALSE;
- if (!ensure_surface_pool(uploader, out_caps ? out_caps : src_caps))
+ if (!ensure_surface_pool(uploader, out_caps, &surface_caps_changed))
return FALSE;
+ if (!image_caps_changed && !surface_caps_changed)
+ return TRUE;
priv = uploader->priv;
priv->direct_rendering = 0;