msdk: don't reset the external frame allocator
authorHaihao Xiang <haihao.xiang@intel.com>
Sat, 29 Dec 2018 05:56:49 +0000 (13:56 +0800)
committerVíctor Manuel Jáquez Leal <vjaquez@igalia.com>
Tue, 8 Jan 2019 09:11:47 +0000 (09:11 +0000)
In gst-msdk, a mfx session may be shared between different gst
elements, each element tries to set the frame allocator. However, per
the MSDK documation[1], the behavior is undefined if reset the frame
allocator while the previous allocator is in use. Fortunately all
elements use the same frame allocator, so we can avoid to call
MFXVideoCORE_SetFrameAllocator again.

[1]: https://software.intel.com/en-us/node/628430#MFXVideoCORE3

sys/msdk/gstmsdkallocator_d3d.c
sys/msdk/gstmsdkallocator_libva.c
sys/msdk/gstmsdkcontext.c
sys/msdk/gstmsdkcontext.h

index 75b147e86b6d2626898dca4dc1b172e871da8e9b..27e457288b77ee5931a95444fe2cb03cc5ff2162 100644 (file)
@@ -75,6 +75,5 @@ gst_msdk_set_frame_allocator (GstMsdkContext * context)
     .Free = gst_msdk_frame_free,
   };
 
-  MFXVideoCORE_SetFrameAllocator (gst_msdk_context_get_session (context),
-      &gst_msdk_frame_allocator);
+  gst_msdk_context_set_frame_allocator (context, &gst_msdk_frame_allocator);
 }
index 74be0dffc12cd08aabb5f1d9a34e9619730aa354..e5200a3fe59cdfbacc96c8c9d64ed13cb8531930 100644 (file)
@@ -366,8 +366,7 @@ gst_msdk_set_frame_allocator (GstMsdkContext * context)
     .Free = gst_msdk_frame_free,
   };
 
-  MFXVideoCORE_SetFrameAllocator (gst_msdk_context_get_session (context),
-      &gst_msdk_frame_allocator);
+  gst_msdk_context_set_frame_allocator (context, &gst_msdk_frame_allocator);
 }
 
 gboolean
index ae7b305fdab8dfe5f9db2541e0da1c9d85102cdf..f1615ad603c711ce949fa135ef96a8bf2fe1dcab 100644 (file)
@@ -47,6 +47,7 @@ struct _GstMsdkContextPrivate
   GList *cached_alloc_responses;
   gboolean hardware;
   gboolean is_joined;
+  gboolean has_frame_allocator;
   GstMsdkContextJobType job_type;
   gint shared_async_depth;
   GMutex mutex;
@@ -597,3 +598,25 @@ gst_msdk_context_add_shared_async_depth (GstMsdkContext * context,
 {
   context->priv->shared_async_depth += async_depth;
 }
+
+void
+gst_msdk_context_set_frame_allocator (GstMsdkContext * context,
+    mfxFrameAllocator * allocator)
+{
+  GstMsdkContextPrivate *priv = context->priv;
+
+  g_mutex_lock (&priv->mutex);
+
+  if (!priv->has_frame_allocator) {
+    mfxStatus status;
+
+    status = MFXVideoCORE_SetFrameAllocator (priv->session, allocator);
+
+    if (status != MFX_ERR_NONE)
+      GST_ERROR ("Failed to set frame allocator");
+    else
+      priv->has_frame_allocator = 1;
+  }
+
+  g_mutex_unlock (&priv->mutex);
+}
index cbaf68937964e715fea374da8a70b6510bba7168..6abfa86ef9ea3f92190e335950268c41820496ca 100644 (file)
@@ -142,6 +142,10 @@ gst_msdk_context_get_shared_async_depth (GstMsdkContext * context);
 void
 gst_msdk_context_add_shared_async_depth (GstMsdkContext * context, gint async_depth);
 
+void
+gst_msdk_context_set_frame_allocator (GstMsdkContext * context,
+    mfxFrameAllocator * allocator);
+
 G_END_DECLS
 
 #endif /* GST_MSDK_CONTEXT_H */