def __init__(self, fdesc, rp210=None, debug=False): InterchangeObject.__init__(self, fdesc, debug) self.data = OrderedDict() if rp210: self.rp210 = rp210 else: self.rp210 = Singleton(RP210) if self.key and not re.search('060e2b34020501..0d01020101050100', self.key.encode('hex_codec')): raise S377MException('Not a valid Primer Pack key: %s' % self.key.encode('hex_codec'))
def __init__(self, fdesc, primer, debug=False): # Prepare object specific Primer aprim = MXFPrimer.customize(primer, Singleton(RP210, 'AvidAAFDefinition'), self._extra_mappings) MXFDataSet.__init__(self, fdesc, aprim, debug=debug, dark=True) self.set_type = 'AvidAAFDefinition'
def __init__(self, fdesc, primer, debug=False): aprim = MXFPrimer.customize(primer, Singleton(RP210Avid), self._extra_mappings) MXFDataSet.__init__(self, fdesc, aprim, debug=debug, dark=True) self.set_type = 'Avid' + self.set_type
class MXFPrimer(InterchangeObject): """ MXF Primer Pack parser. """ def __init__(self, fdesc, rp210=None, debug=False): InterchangeObject.__init__(self, fdesc, debug) self.data = OrderedDict() if rp210: self.rp210 = rp210 else: self.rp210 = Singleton(RP210) if self.key and not re.search('060e2b34020501..0d01020101050100', self.key.encode('hex_codec')): raise S377MException('Not a valid Primer Pack key: %s' % self.key.encode('hex_codec')) def __str__(self): ret = ['<MXFPrimer'] ret += ['pos=%d' % self.pos] ret += ['size=%d' % self.length] ret += ['localtags=%d' % len(self.data)] if self.debug: ret += ['\n'] for i, j in self.data.items(): ret += ['%s: %s\n' % (i.encode('hex_codec'), j.encode('hex_codec'))] return ' '.join(ret) + '>' @staticmethod def customize(primer, spec, mappings=None): """ Modifies a primer to abide @spec rules with optional @mappings. @spec: instance of a sjmxf.rp210 like object @mappings: a dictionary that is passed to inject method @returns: custimized Primer object. """ import copy aprim = copy.copy(primer) if mappings: spec.inject(mappings) aprim.data = {} aprim.data.update(primer.data) aprim.rp210 = spec if mappings: aprim.inject(mappings.keys()) return aprim def inject(self, mappings): """ Insert new mappings in Primer. Allows insertion of new local tag to format UL mappings with their RP210 basic type. """ for item in mappings: self.data[item.decode('hex_codec')] = item.rjust(32, '0').decode('hex_codec') return def read(self): data = self.fdesc.read(self.length) lt_list_size = Integer(data[0:4], 'UInt32').read() lt_item_size = Integer(data[4:8], 'UInt32').read() idx = 8 while lt_list_size > len(self.data): self.data[data[idx:idx+2]] = Reference(data[idx+2:idx+lt_item_size], 'Universal Label').read() idx += lt_item_size if self.debug: print "%d local tag mappings in Primer Pack" % len(self.data) return def write(self): ret = "" for tag, ful in self.data.items(): ret += tag + Reference(ful, 'Universal Label').write() lt_list_size = Integer(len(self.data), 'UInt32').write() lt_item_size = Integer(len(ret) / len(self.data), 'UInt32').write() ret = lt_list_size + lt_item_size + ret self.pos = self.fdesc.tell() self.length = len(ret) self.fdesc.write(self.key + self.ber_encode_length(self.length, bytes_num=8).decode('hex_codec') + ret) return def decode_from_local_tag(self, tag, value): """ Decode data according to local tag mapping to format Universal Labels. """ etag = tag.encode('hex_codec') evalue = value.encode('hex_codec') if tag not in self.data.keys(): print "Error: Local key '%s' not found in primer" % etag return etag, evalue #if not self.data[tag].startswith('060e2b34'.decode('hex_codec')): # return "Error: '%s' does not map to a SMPTE format UL '%s'" % (etag, self.data[tag].encode('hex_codec')) key = "unkown_data_format" # SMTPE RP 210 conversion try: key = self.rp210.get_triplet_from_format_ul(self.data[tag])[1] return key, self.rp210.convert(self.data[tag], value) except RP210Exception, error: print error return key, evalue
class MXFPrimer(InterchangeObject): """ MXF Primer Pack parser. """ def __init__(self, fdesc, rp210=None, debug=False): InterchangeObject.__init__(self, fdesc, debug) self.data = OrderedDict() if rp210: self.rp210 = rp210 else: self.rp210 = Singleton(RP210) if self.key and not re.search('060e2b34020501..0d01020101050100', self.key.encode('hex_codec')): raise S377MException('Not a valid Primer Pack key: %s' % self.key.encode('hex_codec')) def __str__(self): ret = ['<MXFPrimer'] ret += ['pos=%d' % self.pos] ret += ['size=%d' % self.length] ret += ['localtags=%d' % len(self.data)] if self.debug: ret += ['\n'] for i, j in self.data.items(): ret += [ '%s: %s\n' % (i.encode('hex_codec'), j.encode('hex_codec')) ] return ' '.join(ret) + '>' @staticmethod def customize(primer, spec, mappings=None): """ Modifies a primer to abide @spec rules with optional @mappings. @spec: instance of a sjmxf.rp210 like object @mappings: a dictionary that is passed to inject method @returns: custimized Primer object. """ import copy aprim = copy.copy(primer) if mappings: spec.inject(mappings) aprim.data = {} aprim.data.update(primer.data) aprim.rp210 = spec if mappings: aprim.inject(mappings.keys()) return aprim def inject(self, mappings): """ Insert new mappings in Primer. Allows insertion of new local tag to format UL mappings with their RP210 basic type. """ for item in mappings: self.data[item.decode('hex_codec')] = item.rjust( 32, '0').decode('hex_codec') return def read(self): data = self.fdesc.read(self.length) lt_list_size = Integer(data[0:4], 'UInt32').read() lt_item_size = Integer(data[4:8], 'UInt32').read() idx = 8 while lt_list_size > len(self.data): self.data[data[idx:idx + 2]] = Reference( data[idx + 2:idx + lt_item_size], 'Universal Label').read() idx += lt_item_size if self.debug: print "%d local tag mappings in Primer Pack" % len(self.data) return def write(self): ret = "" for tag, ful in self.data.items(): ret += tag + Reference(ful, 'Universal Label').write() lt_list_size = Integer(len(self.data), 'UInt32').write() lt_item_size = Integer(len(ret) / len(self.data), 'UInt32').write() ret = lt_list_size + lt_item_size + ret self.pos = self.fdesc.tell() self.length = len(ret) self.fdesc.write(self.key + self.ber_encode_length( self.length, bytes_num=8).decode('hex_codec') + ret) return def decode_from_local_tag(self, tag, value): """ Decode data according to local tag mapping to format Universal Labels. """ etag = tag.encode('hex_codec') evalue = value.encode('hex_codec') if tag not in self.data.keys(): print "Error: Local key '%s' not found in primer" % etag return etag, evalue #if not self.data[tag].startswith('060e2b34'.decode('hex_codec')): # return "Error: '%s' does not map to a SMPTE format UL '%s'" % (etag, self.data[tag].encode('hex_codec')) key = "unkown_data_format" # SMTPE RP 210 conversion try: key = self.rp210.get_triplet_from_format_ul(self.data[tag])[1] return key, self.rp210.convert(self.data[tag], value) except RP210Exception, error: print error return key, evalue