Getting garbage data when marshalling C structure with union to C# code
I am trying to use following C struct in managed application
typedef struct libvlc_media_track_t
{
uint32_t i_codec;
uint32_t i_original_fourcc;
int i_id;
libvlc_track_type_t i_type;
int i_profile;
int i_level;
union {
libvlc_audio_track_t *audio;
libvlc_video_track_t *video;
libvlc_subtitle_track_t *subtitle;
};
unsigned int i_bitrate;
char *psz_language;
char *psz_description;
} libvlc_media_track_t;
typedef struct libvlc_audio_track_t
{
unsigned i_channels;
unsigned i_rate;
} libvlc_audio_track_t;
typedef struct libvlc_video_track_t
{
unsigned i_height;
unsigned i_width;
unsigned i_sar_num;
unsigned i_sar_den;
unsigned i_frame_rate_num;
unsigned i_frame_rate_den;
} libvlc_video_track_t;
typedef struct libvlc_subtitle_track_t
{
char *psz_encoding;
} libvlc_subtitle_track_t;
unsigned libvlc_media_tracks_get( libvlc_media_t *p_md,
libvlc_media_track_t ***tracks );
And .NET version looks like this:
[StructLayout(LayoutKind.Explicit)]
public struct libvlc_media_track_t
{
[FieldOffset(0)]
public uint i_codec;
[FieldOffset(4)]
public uint i_original_fourcc;
[FieldOffset(8)]
public int i_id;
[FieldOffset(12)]
public libvlc_track_type_t i_type;
[FieldOffset(16)]
public int i_profile;
[FieldOffset(20)]
public int i_level;
[FieldOffset(24)]
public libvlc_audio_track_t audio;
[FieldOffset(24)]
public libvlc_video_track_t video;
[FieldOffset(24)]
public libvlc_subtitle_track_t subtitle;
[FieldOffset(48)]
public uint i_bitrate;
[FieldOffset(52)]
public IntPtr psz_language;
[FieldOffset(56)]
public IntPtr psz_description;
}
[StructLayout(LayoutKind.Sequential)]
public struct libvlc_audio_track_t
{
public uint i_channels;
public uint i_rate;
}
[StructLayout(LayoutKind.Sequential)]
public struct libvlc_video_track_t
{
public uint i_height;
public uint i_width;
public uint i_sar_num;
public uint i_sar_den;
public uint i_frame_rate_num;
public uint i_frame_rate_den;
}
[StructLayout(LayoutKind.Sequential)]
public struct libvlc_subtitle_track_t
{
public IntPtr psz_encoding;
}
[DllImport("libvlc", CallingConvention = CallingConvention.Cdecl)]
public static unsafe extern int libvlc_media_tracks_get(IntPtr media,
libvlc_media_track_t*** ppTracks);
unsafe
{
libvlc_media_track_t** ppTracks;
int num = LibVlcMethods.libvlc_media_tracks_get(m_hMedia, &ppTracks);
if (num == 0 || ppTracks == null)
{
throw new Exception();
}
for (int i = 0; i < num; i++)
{
libvlc_media_track_t* pTrackInfo = ppTracks[i];
}
LibVlcMethods.libvlc_media_tracks_release(ppTracks, num);
}
The code works without any exception but I get garbage data in most of the
structure/union fields.
Please advise, Thanks in advance
No comments:
Post a Comment