decoder: propagate MVC metadata ("view-id", head of multiview set).
[platform/upstream/gstreamer-vaapi.git] / gst-libs / gst / vaapi / gstvaapisurfaceproxy.c
index 2d8fcfa..ab8f508 100644 (file)
@@ -3,7 +3,7 @@
  *
  *  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
@@ -39,12 +39,13 @@ static void
 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)
@@ -61,6 +62,17 @@ gst_vaapi_surface_proxy_class(void)
     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)
 {
@@ -73,11 +85,13 @@ 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;
@@ -89,6 +103,48 @@ error:
     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
@@ -184,13 +240,29 @@ gst_vaapi_surface_proxy_get_flags(GstVaapiSurfaceProxy *proxy)
 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
  *