diff --git a/src/aaf2/auid.py b/src/aaf2/auid.py index f0922f6..c56187c 100644 --- a/src/aaf2/auid.py +++ b/src/aaf2/auid.py @@ -2,6 +2,9 @@ import struct import traceback +LOCAL_SET_PREFIX = bytearray([0x06, 0x0e, 0x2b, 0x34, 0x02, 0x53]) +CLASS_ID_PREFIX = bytearray([0x06, 0x0e, 0x2b, 0x34, 0x02, 0x06]) + class AUID(object): """ A higher performance UUID class that is more specialized for AAF. @@ -30,6 +33,56 @@ def __init__(self, hex=None, bytes_le=None, bytes_be=None, int=None): raise TypeError('one of the hex, bytes_le, bytes_be ' 'or int arguments must be given') + @staticmethod + def from_mxf_label(klv_data): + a = AUID(bytes_le=bytearray(16)) + a.bytes_le[8:] = klv_data[:8] + + d1 = 0 + d1 += klv_data[8] << 24 + d1 += klv_data[9] << 16 + d1 += klv_data[10] << 8 + d1 += klv_data[11] + a.data1 = d1 + + d2 = 0 + d2 += klv_data[12] << 8 + d2 += klv_data[13] + a.data2 = d2 + + d3 = 0 + d3 += klv_data[14] << 8 + d3 += klv_data[15] + a.data3 = d3 + + if klv_data[:6] == LOCAL_SET_PREFIX: + a.bytes_le[13] = 0x06 + + return a + + def to_mxf_label(self): + key = bytearray(16) + key[0:8] = self.bytes_le[8:] + + d1 = self.data1 + key[8] = (d1 >> 24) & 0xFF + key[9] = (d1 >> 16) & 0xFF + key[10] = (d1 >> 8) & 0xFF + key[11] = d1 & 0xFF + + d2 = self.data2 + key[12] = (d2 >> 8) & 0xFF + key[13] = d2 & 0xFF + + d3 = self.data3 + key[14] = (d3 >> 8) & 0xFF + key[15] = d3 & 0xFF + + if key[:6] == CLASS_ID_PREFIX: + key[5] = 0x53 + + return key + @property def bytes_be(self): return bytearray(self.bytes_le[4-1::-1] + self.bytes_le[6-1:4-1:-1] + @@ -84,18 +137,30 @@ def data1(self): value += self.bytes_le[3] << 24 return value + @data1.setter + def data1(self, value): + self.bytes_le[0:4] = struct.pack(b" self.header_partition_size: break - if key == AUID("060e2b34-0205-0101-0d01-020101050100"): + if key == mxf_label_to_auid("06.0e.2b.34.02.05.01.01.0d.01.02.01.01.05.01.00"): self.local_tags = self.read_primer(f, length) - elif key == AUID("060e2b34-0205-0101-0d01-020101020400"): + elif key == mxf_label_to_auid("06.0e.2b.34.02.05.01.01.0d.01.02.01.01.02.04.00"): self.read_header(f, length) else: # print('{') @@ -972,12 +978,8 @@ def read_primer(self, f, length): return tags def read_object(self, f, key, length): - - b = bytearray(key.bytes_be) - if not b[5] == 0x53: - return - obj_class = MXF_CLASSES.get(key, None) + if obj_class: obj = obj_class() @@ -1031,7 +1033,7 @@ def operation_pattern(self): if not op: return - op = bytearray(op.bytes_be) + op = op.to_mxf_label() prefix1 = bytearray([0x06, 0x0e, 0x2b, 0x34, 0x04, 0x01, 0x01, 0x01, 0x0d, 0x01, 0x02, 0x01]) prefix2 = bytearray([0x06, 0x0e, 0x2b, 0x34, 0x04, 0x01, 0x01, 0x02, 0x0d, 0x01, 0x02, 0x01])