mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-24 17:20:36 +00:00
msdk: allocator: get dmabuf handle during allocation if required
https://bugzilla.gnome.org/show_bug.cgi?id=793707
This commit is contained in:
parent
c3438b5a0f
commit
bd8ffcb29d
2 changed files with 32 additions and 0 deletions
|
@ -46,6 +46,7 @@ struct _GstMsdkMemoryID {
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
VASurfaceID *surface;
|
VASurfaceID *surface;
|
||||||
VAImage image;
|
VAImage image;
|
||||||
|
VABufferInfo info;
|
||||||
#else
|
#else
|
||||||
/* TODO: This is just to avoid compile errors on Windows.
|
/* TODO: This is just to avoid compile errors on Windows.
|
||||||
* Implement handling Windows-specific video-memory.
|
* Implement handling Windows-specific video-memory.
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <va/va.h>
|
#include <va/va.h>
|
||||||
|
#include <va/va_drmcommon.h>
|
||||||
#include "gstmsdkallocator.h"
|
#include "gstmsdkallocator.h"
|
||||||
#include "msdk_libva.h"
|
#include "msdk_libva.h"
|
||||||
|
|
||||||
|
@ -104,6 +105,31 @@ gst_msdk_frame_alloc (mfxHDL pthis, mfxFrameAllocRequest * req,
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < surfaces_num; i++) {
|
for (i = 0; i < surfaces_num; i++) {
|
||||||
|
/* Get dmabuf handle if MFX_MEMTYPE_EXPORT_FRAME */
|
||||||
|
if (req->Type & MFX_MEMTYPE_EXPORT_FRAME) {
|
||||||
|
msdk_mids[i].info.mem_type = VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME;
|
||||||
|
va_status =
|
||||||
|
vaDeriveImage (gst_msdk_context_get_handle (context), surfaces[i],
|
||||||
|
&msdk_mids[i].image);
|
||||||
|
status = gst_msdk_get_mfx_status_from_va_status (va_status);
|
||||||
|
|
||||||
|
if (MFX_ERR_NONE != status) {
|
||||||
|
GST_ERROR ("failed to derive image");
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
va_status =
|
||||||
|
vaAcquireBufferHandle (gst_msdk_context_get_handle (context),
|
||||||
|
msdk_mids[i].image.buf, &msdk_mids[i].info);
|
||||||
|
status = gst_msdk_get_mfx_status_from_va_status (va_status);
|
||||||
|
|
||||||
|
if (MFX_ERR_NONE != status) {
|
||||||
|
GST_ERROR ("failed to get dmabuf handle");
|
||||||
|
vaDestroyImage (gst_msdk_context_get_handle (context),
|
||||||
|
msdk_mids[i].image.image_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
msdk_mids[i].surface = &surfaces[i];
|
msdk_mids[i].surface = &surfaces[i];
|
||||||
mids[i] = (mfxMemId *) & msdk_mids[i];
|
mids[i] = (mfxMemId *) & msdk_mids[i];
|
||||||
}
|
}
|
||||||
|
@ -170,6 +196,11 @@ gst_msdk_frame_free (mfxHDL pthis, mfxFrameAllocResponse * resp)
|
||||||
/* Make sure that all the vaImages are destroyed */
|
/* Make sure that all the vaImages are destroyed */
|
||||||
for (i = 0; i < resp->NumFrameActual; i++) {
|
for (i = 0; i < resp->NumFrameActual; i++) {
|
||||||
GstMsdkMemoryID *mem = resp->mids[i];
|
GstMsdkMemoryID *mem = resp->mids[i];
|
||||||
|
|
||||||
|
/* Release dmabuf handle if used */
|
||||||
|
if (mem->info.mem_type == VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME)
|
||||||
|
vaReleaseBufferHandle (dpy, mem->image.buf);
|
||||||
|
|
||||||
vaDestroyImage (dpy, mem->image.image_id);
|
vaDestroyImage (dpy, mem->image.image_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue