示例#1
0
    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'))
示例#2
0
 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'
示例#3
0
    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'))
示例#4
0
 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
示例#5
0
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
示例#6
0
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