msdk: add async depth from each msdk element to GstMsdkContext to be shared
authorHyunjun Ko <zzoon@igalia.com>
Tue, 13 Feb 2018 22:52:14 +0000 (13:52 -0900)
committerSreerenj Balachandran <sreerenj.balachandran@intel.com>
Tue, 13 Feb 2018 22:52:14 +0000 (13:52 -0900)
In case that pipeline is like ".. ! decoder ! encoder ! ..." with using
video memory,
decoder needs to know the async depth of the following msdk element so
that it could
allocate the correct number of video memory.

Otherwise, decoder's memory is exhausted while processing.

https://bugzilla.gnome.org/show_bug.cgi?id=790752

sys/msdk/gstmsdkcontext.c
sys/msdk/gstmsdkcontext.h
sys/msdk/gstmsdkdec.c
sys/msdk/gstmsdkenc.c

index 5426f90..90950e2 100644 (file)
@@ -56,6 +56,7 @@ struct _GstMsdkContextPrivate
   gboolean hardware;
   gboolean is_joined;
   GstMsdkContextJobType job_type;
+  gint shared_async_depth;
 #ifndef _WIN32
   gint fd;
   VADisplay dpy;
@@ -348,3 +349,16 @@ gst_msdk_context_add_job_type (GstMsdkContext * context,
 {
   context->priv->job_type |= job_type;
 }
+
+gint
+gst_msdk_context_get_shared_async_depth (GstMsdkContext * context)
+{
+  return context->priv->shared_async_depth;
+}
+
+void
+gst_msdk_context_add_shared_async_depth (GstMsdkContext * context,
+    gint async_depth)
+{
+  context->priv->shared_async_depth += async_depth;
+}
index 5d56bcb..debed6f 100644 (file)
@@ -125,6 +125,12 @@ gst_msdk_context_get_job_type (GstMsdkContext * context);
 void
 gst_msdk_context_add_job_type (GstMsdkContext * context, GstMsdkContextJobType job_type);
 
+gint
+gst_msdk_context_get_shared_async_depth (GstMsdkContext * context);
+
+void
+gst_msdk_context_add_shared_async_depth (GstMsdkContext * context, gint async_depth);
+
 G_END_DECLS
 
 #endif /* GST_MSDK_CONTEXT_H */
index 916b3d2..bf5c8b1 100644 (file)
@@ -328,8 +328,13 @@ gst_msdkdec_init_decoder (GstMsdkDec * thiz)
   }
 
   if (thiz->use_video_memory) {
+    gint shared_async_depth;
+
+    shared_async_depth =
+        gst_msdk_context_get_shared_async_depth (thiz->context);
+    request.NumFrameSuggested += shared_async_depth;
+
     request.Type |= MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET;
-    request.NumFrameSuggested += thiz->async_depth;
     gst_msdk_frame_alloc (thiz->context, &request, &thiz->alloc_resp);
   }
 
@@ -501,6 +506,9 @@ gst_msdkdec_start (GstVideoDecoder * decoder)
 
       parent_context = thiz->context;
       thiz->context = gst_msdk_context_new_with_parent (parent_context);
+
+      gst_msdk_context_add_shared_async_depth (thiz->context,
+          gst_msdk_context_get_shared_async_depth (parent_context));
       gst_object_unref (parent_context);
 
       GST_INFO_OBJECT (thiz,
@@ -517,6 +525,8 @@ gst_msdkdec_start (GstVideoDecoder * decoder)
         thiz->context);
   }
 
+  gst_msdk_context_add_shared_async_depth (thiz->context, thiz->async_depth);
+
   return TRUE;
 }
 
index 50edcc3..79b47fc 100644 (file)
@@ -265,6 +265,9 @@ gst_msdkenc_init_encoder (GstMsdkEnc * thiz)
           msdk_status_to_string (status));
     }
 
+    if (thiz->use_video_memory)
+      request[0].NumFrameSuggested +=
+          gst_msdk_context_get_shared_async_depth (thiz->context);
     thiz->num_vpp_surfaces = request[0].NumFrameSuggested;
 
     if (thiz->use_video_memory)
@@ -1157,6 +1160,8 @@ gst_msdkenc_start (GstVideoEncoder * encoder)
         thiz->context);
   }
 
+  gst_msdk_context_add_shared_async_depth (thiz->context, thiz->async_depth);
+
   /* Set the minimum pts to some huge value (1000 hours). This keeps
      the dts at the start of the stream from needing to be
      negative. */