Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-1.1
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc-1.1
Commits
a7a9cc09
Commit
a7a9cc09
authored
Sep 04, 2009
by
Olivier Aubert
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
python-ctypes: improve enum conversion
parent
e826f642
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
79 additions
and
24 deletions
+79
-24
bindings/python-ctypes/generate.py
bindings/python-ctypes/generate.py
+14
-8
bindings/python-ctypes/header.py
bindings/python-ctypes/header.py
+31
-10
bindings/python-ctypes/override.py
bindings/python-ctypes/override.py
+11
-6
bindings/python-ctypes/test.py
bindings/python-ctypes/test.py
+23
-0
No files found.
bindings/python-ctypes/generate.py
View file @
a7a9cc09
...
@@ -402,7 +402,6 @@ class PythonGenerator(object):
...
@@ -402,7 +402,6 @@ class PythonGenerator(object):
self
.
fd
=
open
(
filename
,
'w'
)
self
.
fd
=
open
(
filename
,
'w'
)
self
.
insert_code
(
'header.py'
)
self
.
insert_code
(
'header.py'
)
self
.
generate_enums
(
self
.
parser
.
enums
)
wrapped_methods
=
self
.
generate_wrappers
(
self
.
parser
.
methods
)
wrapped_methods
=
self
.
generate_wrappers
(
self
.
parser
.
methods
)
for
l
in
self
.
parser
.
methods
:
for
l
in
self
.
parser
.
methods
:
self
.
output_ctypes
(
*
l
)
self
.
output_ctypes
(
*
l
)
...
@@ -437,10 +436,13 @@ class PythonGenerator(object):
...
@@ -437,10 +436,13 @@ class PythonGenerator(object):
"""
"""
f
=
open
(
filename
,
'r'
)
f
=
open
(
filename
,
'r'
)
for
l
in
f
:
for
l
in
f
:
if
'build_date'
in
l
:
if
l
.
startswith
(
'build_date'
)
:
self
.
output
(
'build_date="%s"'
%
time
.
ctime
())
self
.
output
(
'build_date="%s"'
%
time
.
ctime
())
elif
l
.
startswith
(
'# GENERATED_ENUMS'
):
self
.
generate_enums
(
self
.
parser
.
enums
)
else
:
else
:
self
.
output
(
l
.
rstrip
())
self
.
output
(
l
.
rstrip
())
f
.
close
()
f
.
close
()
def
convert_enum_names
(
self
,
enums
):
def
convert_enum_names
(
self
,
enums
):
...
@@ -462,7 +464,7 @@ class PythonGenerator(object):
...
@@ -462,7 +464,7 @@ class PythonGenerator(object):
raise
Exception
(
'This method only handles enums'
)
raise
Exception
(
'This method only handles enums'
)
pyname
=
self
.
type2class
[
name
]
pyname
=
self
.
type2class
[
name
]
self
.
output
(
"class %s(ctypes.c_u
int
):"
%
pyname
)
self
.
output
(
"class %s(ctypes.c_u
long
):"
%
pyname
)
self
.
output
(
' """%s
\
n
"""'
%
comment
)
self
.
output
(
' """%s
\
n
"""'
%
comment
)
conv
=
{}
conv
=
{}
...
@@ -477,9 +479,6 @@ class PythonGenerator(object):
...
@@ -477,9 +479,6 @@ class PythonGenerator(object):
n
=
'_'
+
n
n
=
'_'
+
n
conv
[
k
]
=
n
conv
[
k
]
=
n
for
k
,
v
in
values
:
self
.
output
(
" %s=ctypes.c_uint(%s)"
%
(
conv
[
k
],
v
))
self
.
output
(
" _names={"
)
self
.
output
(
" _names={"
)
for
k
,
v
in
values
:
for
k
,
v
in
values
:
self
.
output
(
" %s: '%s',"
%
(
v
,
conv
[
k
]))
self
.
output
(
" %s: '%s',"
%
(
v
,
conv
[
k
]))
...
@@ -490,12 +489,19 @@ class PythonGenerator(object):
...
@@ -490,12 +489,19 @@ class PythonGenerator(object):
return ".".join((self.__class__.__module__, self.__class__.__name__, self._names[self.value]))
return ".".join((self.__class__.__module__, self.__class__.__name__, self._names[self.value]))
def __eq__(self, other):
def __eq__(self, other):
return (isinstance(other, ctypes.c_uint) and self.value == other.value)
return ( (isinstance(other, ctypes.c_ulong) and self.value == other.value)
or (isinstance(other, (int, long)) and self.value == other ) )
def __ne__(self, other):
def __ne__(self, other):
return not self.__eq__(other)
return not self.__eq__(other)
"""
)
"""
)
for
k
,
v
in
values
:
self
.
output
(
"%(class)s.%(attribute)s=%(class)s(%(value)s)"
%
{
'class'
:
pyname
,
'attribute'
:
conv
[
k
],
'value'
:
v
})
self
.
output
(
""
)
def
output_ctypes
(
self
,
rtype
,
method
,
params
,
comment
):
def
output_ctypes
(
self
,
rtype
,
method
,
params
,
comment
):
"""Output ctypes decorator for the given method.
"""Output ctypes decorator for the given method.
...
...
bindings/python-ctypes/header.py
View file @
a7a9cc09
...
@@ -76,6 +76,16 @@ elif sys.platform == 'darwin':
...
@@ -76,6 +76,16 @@ elif sys.platform == 'darwin':
# FIXME: should find a means to configure path
# FIXME: should find a means to configure path
dll
=
ctypes
.
CDLL
(
'/Applications/VLC.app/Contents/MacOS/lib/libvlc.2.dylib'
)
dll
=
ctypes
.
CDLL
(
'/Applications/VLC.app/Contents/MacOS/lib/libvlc.2.dylib'
)
#
# Generated enum types.
#
# GENERATED_ENUMS
#
# End of generated enum types.
#
class
ListPOINTER
(
object
):
class
ListPOINTER
(
object
):
'''Just like a POINTER but accept a list of ctype as an argument.
'''Just like a POINTER but accept a list of ctype as an argument.
'''
'''
...
@@ -157,24 +167,35 @@ class LogMessage(ctypes.Structure):
...
@@ -157,24 +167,35 @@ class LogMessage(ctypes.Structure):
class
MediaControlPosition
(
ctypes
.
Structure
):
class
MediaControlPosition
(
ctypes
.
Structure
):
_fields_
=
[
_fields_
=
[
(
'origin'
,
ctypes
.
c_int
),
(
'origin'
,
PositionOrigin
),
(
'key'
,
ctypes
.
c_int
),
(
'key'
,
PositionKey
),
(
'value'
,
ctypes
.
c_longlong
),
(
'value'
,
ctypes
.
c_longlong
),
]
]
def
__init__
(
self
,
value
=
0
,
origin
=
None
,
key
=
None
):
# We override the __init__ method so that instanciating the
# class with an int as parameter will create the appropriate
# default position (absolute position, media time, with the
# int as value).
self
.
value
=
value
if
origin
is
None
:
origin
=
PositionOrigin
.
AbsolutePosition
if
key
is
None
:
key
=
PositionKey
.
MediaTime
self
.
origin
=
origin
self
.
key
=
key
def
__str__
(
self
):
def
__str__
(
self
):
return
"MediaControlPosition %ld (%s, %s)"
%
(
return
"MediaControlPosition %ld (%s, %s)"
%
(
self
.
value
,
self
.
value
,
str
(
PositionOrigin
(
self
.
origin
)
),
str
(
self
.
origin
),
str
(
PositionKey
(
self
.
key
)
)
str
(
self
.
key
)
)
)
@
staticmethod
@
staticmethod
def
from_param
(
arg
):
def
from_param
(
arg
):
if
isinstance
(
arg
,
(
int
,
long
)):
if
isinstance
(
arg
,
(
int
,
long
)):
p
=
MediaControlPosition
()
p
=
MediaControlPosition
(
arg
)
p
.
value
=
arg
p
.
key
=
2
return
p
return
p
else
:
else
:
return
arg
return
arg
...
@@ -192,15 +213,15 @@ class MediaControlException(ctypes.Structure):
...
@@ -192,15 +213,15 @@ class MediaControlException(ctypes.Structure):
class
MediaControlStreamInformation
(
ctypes
.
Structure
):
class
MediaControlStreamInformation
(
ctypes
.
Structure
):
_fields_
=
[
_fields_
=
[
(
'status'
,
ctypes
.
c_int
),
(
'status'
,
PlayerStatus
),
(
'url'
,
ctypes
.
c_char_p
),
(
'url'
,
ctypes
.
c_char_p
),
(
'position'
,
ctypes
.
c_longlong
),
(
'position'
,
ctypes
.
c_longlong
),
(
'length'
,
ctypes
.
c_longlong
),
(
'length'
,
ctypes
.
c_longlong
),
]
]
def
__str__
(
self
):
def
__str__
(
self
):
return
"%s (%s) : %ld / %ld"
%
(
self
.
url
,
return
"%s (%s) : %ld / %ld"
%
(
self
.
url
or
"<No defined URL>"
,
str
(
PlayerStatus
(
self
.
status
)
),
str
(
self
.
status
),
self
.
position
,
self
.
position
,
self
.
length
)
self
.
length
)
...
...
bindings/python-ctypes/override.py
View file @
a7a9cc09
...
@@ -91,7 +91,7 @@ class MediaControl:
...
@@ -91,7 +91,7 @@ class MediaControl:
@param pos: a MediaControlPosition or an integer (in ms)
@param pos: a MediaControlPosition or an integer (in ms)
"""
"""
if
not
isinstance
(
pos
,
MediaControlPosition
):
if
not
isinstance
(
pos
,
MediaControlPosition
):
pos
=
MediaControlPosition
(
origin
=
PositionOrigin
.
AbsolutePosition
,
key
=
PositionKey
.
MediaTime
,
value
=
long
(
pos
))
pos
=
MediaControlPosition
(
long
(
pos
))
e
=
MediaControlException
()
e
=
MediaControlException
()
mediacontrol_set_media_position
(
self
,
pos
,
e
)
mediacontrol_set_media_position
(
self
,
pos
,
e
)
...
@@ -101,7 +101,7 @@ class MediaControl:
...
@@ -101,7 +101,7 @@ class MediaControl:
@param pos: a MediaControlPosition or an integer (in ms)
@param pos: a MediaControlPosition or an integer (in ms)
"""
"""
if
not
isinstance
(
pos
,
MediaControlPosition
):
if
not
isinstance
(
pos
,
MediaControlPosition
):
pos
=
MediaControlPosition
(
origin
=
PositionOrigin
.
AbsolutePosition
,
key
=
PositionKey
.
MediaTime
,
value
=
long
(
pos
))
pos
=
MediaControlPosition
(
long
(
pos
))
e
=
MediaControlException
()
e
=
MediaControlException
()
mediacontrol_start
(
self
,
pos
,
e
)
mediacontrol_start
(
self
,
pos
,
e
)
...
@@ -115,11 +115,16 @@ class MediaControl:
...
@@ -115,11 +115,16 @@ class MediaControl:
@param pos: a MediaControlPosition or an integer (in ms)
@param pos: a MediaControlPosition or an integer (in ms)
"""
"""
if
not
isinstance
(
pos
,
MediaControlPosition
):
if
not
isinstance
(
pos
,
MediaControlPosition
):
pos
=
MediaControlPosition
(
origin
=
PositionOrigin
.
AbsolutePosition
,
key
=
PositionKey
.
MediaTime
,
value
=
long
(
pos
))
pos
=
MediaControlPosition
(
long
(
pos
))
e
=
MediaControlException
()
e
=
MediaControlException
()
p
=
mediacontrol_snapshot
(
self
,
pos
,
e
)
p
=
mediacontrol_snapshot
(
self
,
pos
,
e
)
if
p
:
if
p
:
return
p
.
contents
snap
=
p
.
contents
# FIXME: there is a bug in the current mediacontrol_snapshot
# implementation, which sets an incorrect date.
# Workaround here:
snap
.
date
=
self
.
get_media_position
().
value
return
snap
else
:
else
:
return
None
return
None
...
@@ -131,9 +136,9 @@ class MediaControl:
...
@@ -131,9 +136,9 @@ class MediaControl:
@param end: the end position
@param end: the end position
"""
"""
if
not
isinstance
(
begin
,
MediaControlPosition
):
if
not
isinstance
(
begin
,
MediaControlPosition
):
begin
=
MediaControlPosition
(
origin
=
PositionOrigin
.
AbsolutePosition
,
key
=
PositionKey
.
MediaTime
,
value
=
long
(
begin
)
)
begin
=
self
.
value2position
(
pos
)
if
not
isinstance
(
end
,
MediaControlPosition
):
if
not
isinstance
(
end
,
MediaControlPosition
):
begin
=
MediaControlPosition
(
origin
=
PositionOrigin
.
AbsolutePosition
,
key
=
PositionKey
.
MediaTime
,
value
=
long
(
end
)
)
end
=
self
.
value2position
(
end
)
e
=
MediaControlException
()
e
=
MediaControlException
()
mediacontrol_display_text
(
self
,
message
,
begin
,
end
,
e
)
mediacontrol_display_text
(
self
,
message
,
begin
,
end
,
e
)
...
...
bindings/python-ctypes/test.py
View file @
a7a9cc09
...
@@ -84,6 +84,29 @@ class TestVLCAPI(unittest.TestCase):
...
@@ -84,6 +84,29 @@ class TestVLCAPI(unittest.TestCase):
mc
.
set_mrl
(
mrl
)
mc
.
set_mrl
(
mrl
)
self
.
assertEqual
(
mc
.
get_mrl
(),
mrl
)
self
.
assertEqual
(
mc
.
get_mrl
(),
mrl
)
def
test_mediacontrol_position
(
self
):
p
=
vlc
.
MediaControlPosition
(
value
=
2
,
origin
=
vlc
.
PositionOrigin
.
RelativePosition
,
key
=
vlc
.
PositionKey
.
MediaTime
)
self
.
assertEqual
(
p
.
value
,
2
)
def
test_mediacontrol_position_shortcut
(
self
):
p
=
vlc
.
MediaControlPosition
(
2
)
self
.
assertEqual
(
p
.
value
,
2
)
self
.
assertEqual
(
p
.
key
,
vlc
.
PositionKey
.
MediaTime
)
self
.
assertEqual
(
p
.
origin
,
vlc
.
PositionOrigin
.
AbsolutePosition
)
def
test_mediacontrol_get_media_position
(
self
):
mc
=
vlc
.
MediaControl
()
p
=
mc
.
get_media_position
()
self
.
assertEqual
(
p
.
value
,
-
1
)
def
test_mediacontrol_get_stream_information
(
self
):
mc
=
vlc
.
MediaControl
()
s
=
mc
.
get_stream_information
()
self
.
assertEqual
(
s
.
position
,
0
)
self
.
assertEqual
(
s
.
length
,
0
)
# Basic libvlc tests
# Basic libvlc tests
def
test_instance_creation
(
self
):
def
test_instance_creation
(
self
):
i
=
vlc
.
Instance
()
i
=
vlc
.
Instance
()
...
...
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