Michael Paravicini
asked on
Calling unamanged function which takes a pointer to pointer parameter
I am trying to call a function in C from my .Net Core application. The C function comes from libmpv render.h and the head looks like this:
First of all I have declared the MpvRenderParam struct as follows in C#:
Previously I have defined the Data field to be of type
Following is the MpvRenderParamType enum:
Now I have explained all the data types that were transcribed to C# but the problem still lies in creating the correct definition of the mpv_render_context_create and calling it.
First I tried to define the method like this:
And I called it with:
I also tried changing the first parameter to be a ref or IntPtr but no matter what combination of parameter type and calling it, I always got the same exception:
And calling it with the following piece of code:
No matter what I tried, I always get the same exception. How can I call the mpv_render_context_create without it throwing an AccessViolationException?
int mpv_render_context_create(mpv_render_context **res, mpv_handle *mpv, mpv_render_param *params);
The problem is, that I have no clue how to call the function from C#. First of all I have declared the MpvRenderParam struct as follows in C#:
[StructLayout(LayoutKind.Sequential)]
public unsafe struct MpvRenderParam
{
public MpvRenderParamType Type;
public void* Data;
}
Previously I have defined the Data field to be of type
IntPtr
but in my opinion it makes more sense when it can be an all purpose pointer, so it matches the definition of the C Library.Following is the MpvRenderParamType enum:
public enum MpvRenderParamType
{
Invalid = 0,
ApiType = 1,
InitParams = 2,
Fbo = 3,
FlipY = 4,
Depth = 5,
IccProfile = 6,
AmbientLight = 7,
X11Display = 8,
WlDisplay = 9,
AdvancedControl = 10,
NextFrameInfo = 11,
BlockForTargetTime = 12,
SkipRendering = 13,
DrmDisplay = 14,
DrmDrawSurfaceSize = 15,
DrmDisplayV2 = 15
}
The actual problem
Now I have explained all the data types that were transcribed to C# but the problem still lies in creating the correct definition of the mpv_render_context_create and calling it.
First I tried to define the method like this:
[DllImport("mpv-1.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern int mpv_render_context_create([Out] out IntPtr renderContext, IntPtr mpvHandle,
MpvRenderParam[] parameters);
And I called it with:
var ptr = IntPtr.Zero;
var apiTypePtr = Marshal.StringToHGlobalAuto("opengl");
var i = mpv_render_context_create(out ptr, _mpvHandle, new []
{
new MpvRenderParam(MpvRenderParamType.ApiType, apiTypePtr),
new MpvRenderParam(MpvRenderParamType.Invalid, IntPtr.Zero
});
I also tried changing the first parameter to be a ref or IntPtr but no matter what combination of parameter type and calling it, I always got the same exception:
Exception thrown at 0x0000000055C73D60 (mpv-1.dll) in Otchi.App.exe: 0xC0000005: Access violation reading location 0x0000000000000010.My last attempt was going into the unsafe part of C# and declaring the method like this:
[DllImport(LibName, CallingConvention = CallingConvention.Cdecl)]
private static extern unsafe int mpv_render_context_create(IntPtr* renderContext, IntPtr mpvHandle,
MpvRenderParam[] parameters);
And calling it with the following piece of code:
IntPtr ptr;
var test = GCHandle.Alloc("opengl");
var test2 = GCHandle.ToIntPtr(test);
var apiTypePtr = Marshal.StringToHGlobalAuto("opengl");
var i = mpv_render_context_create(&ptr, _mpvHandle, new []
{
new MpvRenderParam{Type = MpvRenderParamType.ApiType, Data = &apiTypePtr},
new MpvRenderParam{Type = MpvRenderParamType.Invalid, Data = null}
});
No matter what I tried, I always get the same exception. How can I call the mpv_render_context_create without it throwing an AccessViolationException?
ASKER
Thanks for your reply, however, in the example they use the "wid" approach, where they just embed the video. This is not what i'm looking for, I want to render the video myself into a SharpGL context. I have taken many of the DllImports from the example you have provided, however the method I am having trouble with, is not part of the examples.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
thank you so much.... Cheers Michael
Hi!
My pleasure! Please, let me know if you need more help.
My pleasure! Please, let me know if you need more help.
Can you have a look at the following sample:
https://github.com/mpv-player/mpv-examples/tree/master/libmpv/csharp