mirror of
https://github.com/mpv-player/mpv.git
synced 2025-12-28 05:33:14 +00:00
TOOLS/matroska.py: change to python3 syntax
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
#!/usr/bin/python
|
||||
#!/usr/bin/python3
|
||||
"""
|
||||
Generate C definitions for parsing Matroska files.
|
||||
Can also be used to directly parse Matroska files and display their contents.
|
||||
@@ -178,9 +178,10 @@ elements_matroska = (
|
||||
|
||||
import sys
|
||||
from math import ldexp
|
||||
from binascii import hexlify
|
||||
|
||||
def byte2num(s):
|
||||
return int(s.encode('hex'), 16)
|
||||
return int(hexlify(s), 16)
|
||||
|
||||
def camelcase_to_words(name):
|
||||
parts = []
|
||||
@@ -197,14 +198,14 @@ class MatroskaElement(object):
|
||||
|
||||
def __init__(self, name, elid, valtype, namespace):
|
||||
self.name = name
|
||||
self.definename = '%s_ID_%s' % (namespace, name.upper())
|
||||
self.definename = '{}_ID_{}'.format(namespace, name.upper())
|
||||
self.fieldname = camelcase_to_words(name)
|
||||
self.structname = 'ebml_' + self.fieldname
|
||||
self.elid = elid
|
||||
self.valtype = valtype
|
||||
if valtype == 'sub':
|
||||
self.ebmltype = 'EBML_TYPE_SUBELEMENTS'
|
||||
self.valname = 'struct %s' % self.structname
|
||||
self.valname = 'struct ' + self.structname
|
||||
else:
|
||||
self.ebmltype = 'EBML_TYPE_' + valtype.upper()
|
||||
try:
|
||||
@@ -242,53 +243,54 @@ parse_elems(elements_matroska, 'MATROSKA')
|
||||
|
||||
def generate_C_header():
|
||||
print('// Generated by TOOLS/matroska.py, do not edit manually')
|
||||
print
|
||||
print()
|
||||
|
||||
for el in elementlist:
|
||||
print('#define %-40s 0x%s' % (el.definename, el.elid))
|
||||
print('#define {0.definename:40} 0x{0.elid}'.format(el))
|
||||
|
||||
print
|
||||
print()
|
||||
|
||||
for el in reversed(elementlist):
|
||||
if not el.subelements:
|
||||
continue
|
||||
print
|
||||
print('struct %s {' % el.structname)
|
||||
print()
|
||||
print('struct {0.structname} {{'.format(el))
|
||||
l = max(len(subel.valname) for subel, multiple in el.subelements)+1
|
||||
for subel, multiple in el.subelements:
|
||||
print(' %-*s %s%s;' % (l, subel.valname, (' ', '*')[multiple],
|
||||
subel.fieldname))
|
||||
print
|
||||
print(' {e.valname:{l}} {star}{e.fieldname};'.format(
|
||||
e=subel, l=l, star=' *'[multiple]))
|
||||
print()
|
||||
for subel, multiple in el.subelements:
|
||||
print(' int n_%s;' % (subel.fieldname))
|
||||
print(' int n_{0.fieldname};'.format(subel))
|
||||
print('};')
|
||||
|
||||
for el in elementlist:
|
||||
if not el.subelements:
|
||||
continue
|
||||
print('extern const struct ebml_elem_desc %s_desc;' % el.structname)
|
||||
print('extern const struct ebml_elem_desc {0.structname}_desc;'.format(
|
||||
el))
|
||||
|
||||
print
|
||||
print('#define MAX_EBML_SUBELEMENTS %d' % max(len(el.subelements)
|
||||
for el in elementlist))
|
||||
print()
|
||||
print('#define MAX_EBML_SUBELEMENTS', max(len(el.subelements)
|
||||
for el in elementlist))
|
||||
|
||||
|
||||
|
||||
def generate_C_definitions():
|
||||
print('// Generated by TOOLS/matroska.py, do not edit manually')
|
||||
print
|
||||
print()
|
||||
for el in reversed(elementlist):
|
||||
print
|
||||
print()
|
||||
if el.subelements:
|
||||
print('#define N %s' % el.fieldname)
|
||||
print('E_S("%s", %d)' % (el.name, len(el.subelements)))
|
||||
print('#define N', el.fieldname)
|
||||
print('E_S("{}", {})'.format(el.name, len(el.subelements)))
|
||||
for subel, multiple in el.subelements:
|
||||
print('F(%s, %s, %d)' % (subel.definename, subel.fieldname,
|
||||
multiple))
|
||||
print('F({0.definename}, {0.fieldname}, {1})'.format(
|
||||
subel, int(multiple)))
|
||||
print('}};')
|
||||
print('#undef N')
|
||||
else:
|
||||
print('E("%s", %s, %s)' % (el.name, el.fieldname, el.ebmltype))
|
||||
print('E("{0.name}", {0.fieldname}, {0.ebmltype})'.format(el))
|
||||
|
||||
def read(s, length):
|
||||
t = s.read(length)
|
||||
@@ -317,7 +319,7 @@ def read_vint(s):
|
||||
while not ord(t) & mask:
|
||||
i += 1
|
||||
mask >>= 1
|
||||
t = chr(ord(t) & (mask - 1))
|
||||
t = bytes((ord(t) & (mask - 1),))
|
||||
t += read(s, i)
|
||||
return i+1, byte2num(t)
|
||||
|
||||
@@ -351,7 +353,7 @@ def read_float(s, length):
|
||||
return f
|
||||
|
||||
def parse_one(s, depth, parent, maxlen):
|
||||
elid = read_id(s).encode('hex')
|
||||
elid = hexlify(read_id(s)).decode('ascii')
|
||||
elem = elementd.get(elid)
|
||||
if parent is not None and elid not in parent.subids and elid not in ('ec', 'bf'):
|
||||
print('Unexpected:', elid)
|
||||
@@ -361,7 +363,7 @@ def parse_one(s, depth, parent, maxlen):
|
||||
this_length = len(elid) / 2 + size + length
|
||||
if elem is not None:
|
||||
if elem.valtype != 'skip':
|
||||
print depth, elid, elem.name, 'size:', length, 'value:',
|
||||
print(depth, elid, elem.name, 'size:', length, 'value:', end=' ')
|
||||
if elem.valtype == 'sub':
|
||||
print('subelements:')
|
||||
while length > 0:
|
||||
@@ -369,27 +371,27 @@ def parse_one(s, depth, parent, maxlen):
|
||||
if length < 0:
|
||||
raise SyntaxError
|
||||
elif elem.valtype == 'str':
|
||||
print 'string', repr(read_str(s, length))
|
||||
print('string', repr(read_str(s, length).decode('utf8', 'replace')))
|
||||
elif elem.valtype in ('binary', 'ebml_id'):
|
||||
t = read_str(s, length)
|
||||
dec = ''
|
||||
if elem.valtype == 'ebml_id':
|
||||
idelem = elementd.get(t.encode('hex'))
|
||||
idelem = elementd.get(hexlify(t).decode('ascii'))
|
||||
if idelem is None:
|
||||
dec = '(UNKNOWN)'
|
||||
else:
|
||||
dec = '(%s)' % idelem.name
|
||||
dec = '({0.name})'.format(idelem)
|
||||
if len(t) < 20:
|
||||
t = t.encode('hex')
|
||||
t = hexlify(t).decode('ascii')
|
||||
else:
|
||||
t = '<skipped %d bytes>' % len(t)
|
||||
print 'binary', t, dec
|
||||
t = '<skipped {} bytes>'.format(len(t))
|
||||
print('binary', t, dec)
|
||||
elif elem.valtype == 'uint':
|
||||
print 'uint', read_uint(s, length)
|
||||
print('uint', read_uint(s, length))
|
||||
elif elem.valtype == 'sint':
|
||||
print 'sint', read_sint(s, length)
|
||||
print('sint', read_sint(s, length))
|
||||
elif elem.valtype == 'float':
|
||||
print 'float', read_float(s, length)
|
||||
print('float', read_float(s, length))
|
||||
elif elem.valtype == 'skip':
|
||||
read(s, length)
|
||||
else:
|
||||
@@ -407,6 +409,6 @@ if sys.argv[1] == '--generate-header':
|
||||
elif sys.argv[1] == '--generate-definitions':
|
||||
generate_C_definitions()
|
||||
else:
|
||||
s = open(sys.argv[1])
|
||||
s = open(sys.argv[1], "rb")
|
||||
while 1:
|
||||
parse_toplevel(s)
|
||||
|
||||
Reference in New Issue
Block a user