*
* Copyright (C) 2010-2011 Splitted-Desktop Systems
* Author: Gwenole Beauchesne <gwenole.beauchesne@splitted-desktop.com>
- * Copyright (C) 2011-2013 Intel Corporation
+ * Copyright (C) 2011-2014 Intel Corporation
* Author: Gwenole Beauchesne <gwenole.beauchesne@intel.com>
*
* This library is free software; you can redistribute it and/or
gst_vaapi_surface_proxy_finalize(GstVaapiSurfaceProxy *proxy)
{
if (proxy->surface) {
- if (proxy->pool)
+ if (proxy->pool && !proxy->parent)
gst_vaapi_video_pool_put_object(proxy->pool, proxy->surface);
gst_vaapi_object_unref(proxy->surface);
proxy->surface = NULL;
}
gst_vaapi_video_pool_replace(&proxy->pool, NULL);
+ gst_vaapi_surface_proxy_replace(&proxy->parent, NULL);
/* Notify the user function that the object is now destroyed */
if (proxy->destroy_func)
return &GstVaapiSurfaceProxyClass;
}
+/**
+ * gst_vaapi_surface_proxy_new_from_pool:
+ * @pool: a #GstVaapiSurfacePool
+ *
+ * Allocates a new surface from the supplied surface @pool and creates
+ * the wrapped surface proxy object from it. When the last reference
+ * to the proxy object is released, then the underlying VA surface is
+ * pushed back to its parent pool.
+ *
+ * Returns: The same newly allocated @proxy object, or %NULL on error
+ */
GstVaapiSurfaceProxy *
gst_vaapi_surface_proxy_new_from_pool(GstVaapiSurfacePool *pool)
{
if (!proxy)
return NULL;
+ proxy->parent = NULL;
proxy->destroy_func = NULL;
proxy->pool = gst_vaapi_video_pool_ref(pool);
proxy->surface = gst_vaapi_video_pool_get_object(proxy->pool);
if (!proxy->surface)
goto error;
+ proxy->view_id = 0;
proxy->timestamp = GST_CLOCK_TIME_NONE;
proxy->duration = GST_CLOCK_TIME_NONE;
proxy->has_crop_rect = FALSE;
return NULL;
}
+
+/**
+ * gst_vaapi_surface_proxy_copy:
+ * @proxy: the parent #GstVaapiSurfaceProxy
+ *
+ * Creates are new VA surface proxy object from the supplied parent
+ * @proxy object with the same initial information, e.g. timestamp,
+ * duration.
+ *
+ * Note: the destroy notify function is not copied into the new
+ * surface proxy object.
+ *
+ * Returns: The same newly allocated @proxy object, or %NULL on error
+ */
+GstVaapiSurfaceProxy *
+gst_vaapi_surface_proxy_copy(GstVaapiSurfaceProxy *proxy)
+{
+ GstVaapiSurfaceProxy *copy;
+
+ g_return_val_if_fail(proxy != NULL, NULL);
+
+ copy = (GstVaapiSurfaceProxy *)
+ gst_vaapi_mini_object_new(gst_vaapi_surface_proxy_class());
+ if (!copy)
+ return NULL;
+
+ GST_VAAPI_SURFACE_PROXY_FLAGS(copy) =
+ GST_VAAPI_SURFACE_PROXY_FLAGS(proxy);
+
+ copy->parent = gst_vaapi_surface_proxy_ref(proxy->parent ?
+ proxy->parent : proxy);
+ copy->pool = gst_vaapi_video_pool_ref(proxy->pool);
+ copy->surface = gst_vaapi_object_ref(proxy->surface);
+ copy->timestamp = proxy->timestamp;
+ copy->duration = proxy->duration;
+ copy->destroy_func = NULL;
+ copy->has_crop_rect = proxy->has_crop_rect;
+ if (copy->has_crop_rect)
+ copy->crop_rect = proxy->crop_rect;
+ return copy;
+}
+
/**
* gst_vaapi_surface_proxy_ref:
* @proxy: a #GstVaapiSurfaceProxy
GstVaapiID
gst_vaapi_surface_proxy_get_surface_id(GstVaapiSurfaceProxy *proxy)
{
- g_return_val_if_fail(proxy != NULL, 0);
- g_return_val_if_fail(proxy->surface != NULL, 0);
+ g_return_val_if_fail(proxy != NULL, VA_INVALID_ID);
+ g_return_val_if_fail(proxy->surface != NULL, VA_INVALID_ID);
return GST_VAAPI_SURFACE_PROXY_SURFACE_ID(proxy);
}
/**
+ * gst_vaapi_surface_proxy_get_view_id:
+ * @proxy: a #GstVaapiSurfaceProxy
+ *
+ * Returns the decoded view-id stored in the @proxy.
+ *
+ * Return value: the #GstVaapiID
+ */
+guintptr
+gst_vaapi_surface_proxy_get_view_id(GstVaapiSurfaceProxy *proxy)
+{
+ g_return_val_if_fail(proxy != NULL, 0);
+
+ return GST_VAAPI_SURFACE_PROXY_VIEW_ID(proxy);
+}
+
+/**
* gst_vaapi_surface_proxy_get_timestamp:
* @proxy: a #GstVaapiSurfaceProxy
*