msdk: specify the way to find a proper cached response by request
authorHyunjun Ko <zzoon@igalia.com>
Fri, 30 Mar 2018 19:02:26 +0000 (11:02 -0800)
committerSreerenj Balachandran <sreerenj.balachandran@intel.com>
Fri, 30 Mar 2018 19:02:26 +0000 (11:02 -0800)
The current way to find proper response by just comparing request's
value is wrong.  We need to compare the size of a frame and the
number of suggested frames.

Refer to the sample in https://github.com/Intel-Media-SDK/samples.

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

sys/msdk/gstmsdkallocator_libva.c
sys/msdk/gstmsdkcontext.c

index 364ee49..a7fc253 100644 (file)
@@ -56,6 +56,10 @@ gst_msdk_frame_alloc (mfxHDL pthis, mfxFrameAllocRequest * req,
     GstMsdkAllocResponse *cached =
         gst_msdk_context_get_cached_alloc_responses_by_request (context, req);
     if (cached) {
+      /* check if enough frames were allocated */
+      if (req->NumFrameSuggested > cached->response->NumFrameActual)
+        return MFX_ERR_MEMORY_ALLOC;
+
       *resp = *cached->response;
       return MFX_ERR_NONE;
     }
index 4447474..883fdb5 100644 (file)
@@ -354,7 +354,14 @@ _find_request (gconstpointer resp, gconstpointer req)
   GstMsdkAllocResponse *cached_resp = (GstMsdkAllocResponse *) resp;
   mfxFrameAllocRequest *_req = (mfxFrameAllocRequest *) req;
 
-  return cached_resp ? cached_resp->request.Type != _req->Type : -1;
+  /* Confirm if it's under the size of the cached response */
+  if (_req->Info.Width <= cached_resp->request.Info.Width &&
+      _req->Info.Height <= cached_resp->request.Info.Height) {
+    return _req->Type & cached_resp->
+        request.Type & MFX_MEMTYPE_FROM_DECODE ? 0 : -1;
+  }
+
+  return -1;
 }
 
 GstMsdkAllocResponse *