Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
7
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Open sidebar
Martin Finkel
LibVLCSharp
Commits
a9ed1790
Commit
a9ed1790
authored
Jan 09, 2019
by
Martin Finkel
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fix media track marshalling and tests
parent
4ad78708
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
161 additions
and
61 deletions
+161
-61
LibVLCSharp.Tests/MediaTests.cs
LibVLCSharp.Tests/MediaTests.cs
+2
-1
LibVLCSharp/Shared/Helpers/MarshalExtensions.cs
LibVLCSharp/Shared/Helpers/MarshalExtensions.cs
+41
-4
LibVLCSharp/Shared/Helpers/MarshalUtils.cs
LibVLCSharp/Shared/Helpers/MarshalUtils.cs
+5
-4
LibVLCSharp/Shared/Helpers/Utf8StringMarshaler.cs
LibVLCSharp/Shared/Helpers/Utf8StringMarshaler.cs
+3
-3
LibVLCSharp/Shared/Media.cs
LibVLCSharp/Shared/Media.cs
+7
-7
LibVLCSharp/Shared/Structures/AudioTrack.cs
LibVLCSharp/Shared/Structures/AudioTrack.cs
+0
-8
LibVLCSharp/Shared/Structures/MediaTrack.cs
LibVLCSharp/Shared/Structures/MediaTrack.cs
+96
-1
LibVLCSharp/Shared/Structures/MediaTrackData.cs
LibVLCSharp/Shared/Structures/MediaTrackData.cs
+7
-1
LibVLCSharp/Shared/Structures/SubtitleTrack.cs
LibVLCSharp/Shared/Structures/SubtitleTrack.cs
+0
-9
LibVLCSharp/Shared/Structures/VideoTrack.cs
LibVLCSharp/Shared/Structures/VideoTrack.cs
+0
-23
No files found.
LibVLCSharp.Tests/MediaTests.cs
View file @
a9ed1790
...
...
@@ -101,7 +101,8 @@ namespace LibVLCSharp.Tests
{
var
media
=
new
Media
(
new
LibVLC
(),
RealMp3Path
);
media
.
Parse
();
Assert
.
AreEqual
(
1
,
media
.
Tracks
);
Assert
.
AreEqual
(
media
.
Tracks
.
Single
().
Data
.
Audio
.
Channels
,
2
);
Assert
.
AreEqual
(
media
.
Tracks
.
Single
().
Data
.
Audio
.
Rate
,
44100
);
}
[
Test
]
...
...
LibVLCSharp/Shared/Helpers/MarshalExtensions.cs
View file @
a9ed1790
...
...
@@ -54,10 +54,47 @@ namespace LibVLCSharp.Shared.Helpers
/// </summary>
/// <param name="s">TrackDescriptionStructure from interop</param>
/// <returns>public TrackDescription to be consumed by the user</returns>
internal
static
MediaTrack
Build
(
this
MediaTrackStructure
s
)
=>
new
MediaTrack
(
s
.
Codec
,
s
.
OriginalFourcc
,
s
.
Id
,
s
.
TrackType
,
s
.
Profile
,
s
.
Level
,
s
.
Data
,
s
.
Bitrate
,
Utf8StringMarshaler
.
GetInstance
().
MarshalNativeToManaged
(
s
.
Language
)
as
string
,
Utf8StringMarshaler
.
GetInstance
().
MarshalNativeToManaged
(
s
.
Description
)
as
string
);
internal
static
MediaTrack
Build
(
this
MediaTrackStructure
s
)
{
AudioTrack
audioTrack
=
default
;
VideoTrack
videoTrack
=
default
;
SubtitleTrack
subtitleTrack
=
default
;
switch
(
s
.
TrackType
)
{
case
TrackType
.
Audio
:
audioTrack
=
MarshalUtils
.
PtrToStructure
<
AudioTrack
>(
s
.
TrackData
);
break
;
case
TrackType
.
Video
:
videoTrack
=
MarshalUtils
.
PtrToStructure
<
VideoTrack
>(
s
.
TrackData
);
break
;
case
TrackType
.
Text
:
subtitleTrack
=
MarshalUtils
.
PtrToStructure
<
SubtitleTrackStructure
>(
s
.
TrackData
).
Build
();
break
;
case
TrackType
.
Unknown
:
break
;
}
var
language
=
Utf8StringMarshaler
.
GetInstance
().
MarshalNativeToManaged
(
s
.
Language
)
as
string
;
var
des
=
Utf8StringMarshaler
.
GetInstance
().
MarshalNativeToManaged
(
s
.
Description
)
as
string
;
return
new
MediaTrack
(
s
.
Codec
,
s
.
OriginalFourcc
,
s
.
Id
,
s
.
TrackType
,
s
.
Profile
,
s
.
Level
,
new
MediaTrackData
(
audioTrack
,
videoTrack
,
subtitleTrack
),
s
.
Bitrate
,
language
,
des
);
}
/// <summary>
/// Helper method that creates a user friendly type from the internal interop structure.
/// </summary>
/// <param name="s">SubtitleTrackStructure from interop</param>
/// <returns>public SubtitleTrack to be consumed by the user</returns>
internal
static
SubtitleTrack
Build
(
this
SubtitleTrackStructure
s
)
=>
new
SubtitleTrack
(
Utf8StringMarshaler
.
GetInstance
().
MarshalNativeToManaged
(
s
.
Encoding
)
as
string
);
/// <summary>
/// Helper method that creates a user friendly type from the internal interop structure.
...
...
LibVLCSharp/Shared/Helpers/MarshalUtils.cs
View file @
a9ed1790
...
...
@@ -74,13 +74,13 @@ namespace LibVLCSharp.Shared.Helpers
return
resultList
.
ToArray
();
}
internal
static
TU
[]
Retrieve
<
T
,
TU
>(
IntPtr
nativeRef
,
Func
<
IntPtr
,
IntPtr
,
uint
>
getRef
,
Func
<
IntPtr
,
T
>
retrieve
,
internal
static
TU
[]
Retrieve
<
T
,
TU
>(
IntPtr
nativeRef
,
ArrayOut
getRef
,
Func
<
IntPtr
,
T
>
retrieve
,
Func
<
T
,
TU
>
create
,
Action
<
IntPtr
,
uint
>
releaseRef
)
where
T
:
struct
where
TU
:
struct
{
var
arrayPtr
=
IntPtr
.
Zero
;
var
count
=
getRef
(
nativeRef
,
arrayPtr
);
var
count
=
getRef
(
nativeRef
,
out
arrayPtr
);
if
(
count
==
0
)
{
#if NETSTANDARD1_1 || NET40
...
...
@@ -142,9 +142,10 @@ namespace LibVLCSharp.Shared.Helpers
return
resultList
.
ToArray
();
}
internal
delegate
ulong
CategoryArrayRef
<
T
>(
IntPtr
nativeRef
,
T
enumType
,
out
IntPtr
array
)
where
T
:
Enum
;
internal
delegate
ulong
CategoryArrayOut
<
T
>(
IntPtr
nativeRef
,
T
enumType
,
out
IntPtr
array
)
where
T
:
Enum
;
internal
delegate
uint
ArrayOut
(
IntPtr
nativeRef
,
out
IntPtr
array
);
internal
static
TU
[]
Retrieve
<
T
,
TU
,
TE
>(
IntPtr
nativeRef
,
TE
extraParam
,
CategoryArray
Ref
<
TE
>
getRef
,
Func
<
IntPtr
,
T
>
retrieve
,
internal
static
TU
[]
Retrieve
<
T
,
TU
,
TE
>(
IntPtr
nativeRef
,
TE
extraParam
,
CategoryArray
Out
<
TE
>
getRef
,
Func
<
IntPtr
,
T
>
retrieve
,
Func
<
T
,
TU
>
create
,
Action
<
IntPtr
,
ulong
>
releaseRef
)
where
T
:
struct
where
TU
:
struct
...
...
LibVLCSharp/Shared/Helpers/Utf8StringMarshaler.cs
View file @
a9ed1790
...
...
@@ -31,14 +31,14 @@ namespace LibVLCSharp.Shared.Helpers
return
ptr
;
}
public
object
MarshalNativeToManaged
(
IntPtr
p
NativeData
)
public
object
MarshalNativeToManaged
(
IntPtr
p
tr
)
{
if
(
p
NativeData
==
IntPtr
.
Zero
)
if
(
p
tr
==
IntPtr
.
Zero
)
return
null
;
List
<
byte
>
bytes
=
new
List
<
byte
>();
for
(
int
offset
=
0
;
;
offset
++)
{
byte
b
=
Marshal
.
ReadByte
(
p
NativeData
,
offset
);
byte
b
=
Marshal
.
ReadByte
(
p
tr
,
offset
);
if
(
b
==
0
)
break
;
else
bytes
.
Add
(
b
);
...
...
LibVLCSharp/Shared/Media.cs
View file @
a9ed1790
...
...
@@ -124,7 +124,7 @@ namespace LibVLCSharp.Shared
[
DllImport
(
Constants
.
LibraryName
,
CallingConvention
=
CallingConvention
.
Cdecl
,
EntryPoint
=
"libvlc_media_tracks_get"
)]
internal
static
extern
uint
LibVLCMediaTracksGet
(
IntPtr
media
,
ref
IntPtr
tracksPtr
);
internal
static
extern
uint
LibVLCMediaTracksGet
(
IntPtr
media
,
out
IntPtr
tracksPtr
);
[
DllImport
(
Constants
.
LibraryName
,
CallingConvention
=
CallingConvention
.
Cdecl
,
EntryPoint
=
"libvlc_media_tracks_release"
)]
...
...
@@ -148,7 +148,7 @@ namespace LibVLCSharp.Shared
[
DllImport
(
Constants
.
LibraryName
,
CallingConvention
=
CallingConvention
.
Cdecl
,
EntryPoint
=
"libvlc_media_slaves_get"
)]
internal
static
extern
uint
LibVLCMediaGetSlaves
(
IntPtr
media
,
ref
IntPtr
slaves
);
internal
static
extern
uint
LibVLCMediaGetSlaves
(
IntPtr
media
,
out
IntPtr
slaves
);
[
DllImport
(
Constants
.
LibraryName
,
CallingConvention
=
CallingConvention
.
Cdecl
,
EntryPoint
=
"libvlc_media_slaves_release"
)]
...
...
@@ -559,7 +559,7 @@ namespace LibVLCSharp.Shared
/// <para>Not doing this will result in an empty array.</para>
/// <para>LibVLC 2.1.0 and later.</para>
/// </remarks>
public
MediaTrack
[]
Tracks
=>
MarshalUtils
.
Retrieve
(
NativeReference
,
(
nativeRef
,
array
Ptr
)
=>
Native
.
LibVLCMediaTracksGet
(
nativeRef
,
ref
array
Ptr
),
public
MediaTrack
[]
Tracks
=>
MarshalUtils
.
Retrieve
(
NativeReference
,
(
IntPtr
nativeRef
,
out
IntPtr
array
)
=>
Native
.
LibVLCMediaTracksGet
(
nativeRef
,
out
array
),
MarshalUtils
.
PtrToStructure
<
MediaTrackStructure
>,
m
=>
m
.
Build
(),
Native
.
LibVLCMediaTracksRelease
);
...
...
@@ -609,10 +609,10 @@ namespace LibVLCSharp.Shared
/// <para>LibVLC 3.0.0 and later.</para>
/// <para>libvlc_media_slaves_add</para>
/// </remarks>
public
MediaSlave
[]
Slaves
=>
MarshalUtils
.
Retrieve
(
NativeReference
,
(
nativeRef
,
array
Ptr
)
=>
Native
.
LibVLCMediaGetSlaves
(
nativeRef
,
ref
array
Ptr
),
MarshalUtils
.
PtrToStructure
<
MediaSlaveStructure
>,
s
=>
s
.
Build
(),
Native
.
LibVLCMediaReleaseSlaves
);
public
MediaSlave
[]
Slaves
=>
MarshalUtils
.
Retrieve
(
NativeReference
,
(
IntPtr
nativeRef
,
out
IntPtr
array
)
=>
Native
.
LibVLCMediaGetSlaves
(
nativeRef
,
out
array
),
MarshalUtils
.
PtrToStructure
<
MediaSlaveStructure
>,
s
=>
s
.
Build
(),
Native
.
LibVLCMediaReleaseSlaves
);
public
override
bool
Equals
(
object
obj
)
{
...
...
LibVLCSharp/Shared/Structures/AudioTrack.cs
deleted
100644 → 0
View file @
4ad78708
namespace
LibVLCSharp.Shared
{
public
readonly
struct
AudioTrack
{
public
readonly
uint
Channels
;
public
readonly
uint
Rate
;
}
}
LibVLCSharp/Shared/Structures/MediaTrack.cs
View file @
a9ed1790
...
...
@@ -12,12 +12,107 @@ namespace LibVLCSharp.Shared
internal
readonly
TrackType
TrackType
;
internal
readonly
int
Profile
;
internal
readonly
int
Level
;
internal
readonly
MediaTrackData
Data
;
internal
readonly
IntPtr
Track
Data
;
internal
readonly
uint
Bitrate
;
internal
readonly
IntPtr
Language
;
internal
readonly
IntPtr
Description
;
}
internal
readonly
struct
SubtitleTrackStructure
{
internal
readonly
IntPtr
Encoding
;
}
/// <summary>
/// Audio track
/// </summary>
[
StructLayout
(
LayoutKind
.
Sequential
)]
public
readonly
struct
AudioTrack
{
internal
AudioTrack
(
uint
channels
,
uint
rate
)
{
Channels
=
channels
;
Rate
=
rate
;
}
/// <summary>
/// Audio track channels
/// </summary>
public
readonly
uint
Channels
;
/// <summary>
/// Audio track rate
/// </summary>
public
readonly
uint
Rate
;
}
/// <summary>
/// Video track
/// </summary>
[
StructLayout
(
LayoutKind
.
Sequential
)]
public
readonly
struct
VideoTrack
{
/// <summary>
/// Video height
/// </summary>
public
readonly
uint
Height
;
/// <summary>
/// Video Width
/// </summary>
public
readonly
uint
Width
;
/// <summary>
/// Video SarNum
/// </summary>
public
readonly
uint
SarNum
;
/// <summary>
/// Video SarDen
/// </summary>
public
readonly
uint
SarDen
;
/// <summary>
/// Video frame rate num
/// </summary>
public
readonly
uint
FrameRateNum
;
/// <summary>
/// Video frame rate den
/// </summary>
public
readonly
uint
FrameRateDen
;
/// <summary>
/// Video orientation
/// </summary>
public
readonly
VideoOrientation
Orientation
;
/// <summary>
/// Video projection
/// </summary>
public
readonly
VideoProjection
Projection
;
/// <summary>
/// Video viewpoint
/// </summary>
public
readonly
VideoViewpoint
Pose
;
}
/// <summary>
/// Subtitle track
/// </summary>
public
readonly
struct
SubtitleTrack
{
internal
SubtitleTrack
(
string
encoding
)
{
Encoding
=
encoding
;
}
/// <summary>
/// Subtitle encoding
/// </summary>
public
readonly
string
Encoding
;
}
/// <summary>
/// Media track information
/// </summary>
...
...
LibVLCSharp/Shared/Structures/MediaTrackData.cs
View file @
a9ed1790
...
...
@@ -5,6 +5,12 @@
/// </summary>
public
readonly
struct
MediaTrackData
{
internal
MediaTrackData
(
AudioTrack
audio
,
VideoTrack
video
,
SubtitleTrack
subtitle
)
{
Audio
=
audio
;
Video
=
video
;
Subtitle
=
subtitle
;
}
/// <summary>
/// Audio track
/// </summary>
...
...
@@ -20,4 +26,4 @@
/// </summary>
public
readonly
SubtitleTrack
Subtitle
;
}
}
}
\ No newline at end of file
LibVLCSharp/Shared/Structures/SubtitleTrack.cs
deleted
100644 → 0
View file @
4ad78708
using
System
;
namespace
LibVLCSharp.Shared
{
public
readonly
struct
SubtitleTrack
{
public
readonly
IntPtr
Encoding
;
}
}
LibVLCSharp/Shared/Structures/VideoTrack.cs
deleted
100644 → 0
View file @
4ad78708
namespace
LibVLCSharp.Shared
{
public
readonly
struct
VideoTrack
{
public
readonly
uint
Height
;
public
readonly
uint
Width
;
public
readonly
uint
SarNum
;
public
readonly
uint
SarDen
;
public
readonly
uint
FrameRateNum
;
public
readonly
uint
FrameRateDen
;
public
readonly
VideoOrientation
Orientation
;
public
readonly
VideoProjection
Projection
;
public
readonly
VideoViewpoint
Pose
;
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment