Beispiel #1
0
    def footer_extra_parse(self):

        # Read file's end
        key = InterchangeObject.get_key(self.fd)
        while key != '060e2b34020501010d01020101110100':

            if key in (
             '060e2b34010101010201021001000000',
             '060e2b34010101010301021001000000'
            ):
                # KLV Fill item
                klv = KLVFill(self.fd)
                klv.read()

            else:
                # 060e2b34025301010d01020101100100 -> Index Table Segment
                klv = KLVDarkComponent(self.fd)
                klv.read()
                print klv

            self.data['footer']['klvs'].append(klv)

            key = InterchangeObject.get_key(self.fd)

        # SMTPE 377M: Random Index Pack (optional after Footer Partition)
        if key != '060e2b34020501010d01020101110100':
            raise Exception('Invalid RandomIndexMetadata key: %s' % InterchangeObject.get_key(self.fd))
        random_index_pack = RandomIndexMetadata(self.fd)
        random_index_pack.read()
        self.data['footer']['klvs'].append(random_index_pack)
        self.data['footer']['random_index_pack'] = random_index_pack
Beispiel #2
0
 def test_ber_short_encoding(self):
     """ Test short BER encoding compliance. """
     self.assertEqual(InterchangeObject.ber_encode_length(0, prefix=False), '00')
     self.assertEqual(InterchangeObject.ber_encode_length(1, prefix=False), '01')
     self.assertEqual(InterchangeObject.ber_encode_length(127, prefix=False), '7f')
     self.assertEqual(InterchangeObject.ber_encode_length(128, prefix=False), '80')
     self.assertEqual(InterchangeObject.ber_encode_length(255, prefix=False), 'ff')
Beispiel #3
0
    def __init__(self, fdesc, primer, debug=False, dark=False):
        InterchangeObject.__init__(self, fdesc, debug)
        self.primer = primer
        self.dark = dark
        self.data = OrderedDict()
        self.set_type = 'DataSet'
        self.element_mapping = {}

        if self.key.encode('hex_codec') not in MXFDataSet.dataset_names.keys():
            #print "MXFDataSet is dark", self.key.encode('hex_codec')
            self.dark = True
            self.set_type = 'Dark' + self.set_type
        else:
            self.set_type = MXFDataSet.dataset_names[self.key.encode(
                'hex_codec')]

        if not self.dark:
            if not self.key.encode('hex_codec').startswith('060e2b34'):
                raise S377MException('Not a SMPTE administrated label')

            if self.key[4] != '\x02':
                raise S377MException('Not an MXF Set/Pack')

            if self.key[5] != '\x53':
                raise S377MException(
                    'Non-Local set syntax not supported yet (0x%x)' %
                    ord(self.key[5]))
Beispiel #4
0
    def __init__(self, fdesc, debug=False):
        InterchangeObject.__init__(self, fdesc, debug)
        self.data = OrderedDict()

        if not re.search('060e2b34020501010d01020101(0[2-4])(0[0-4])00',
                         self.key.encode('hex_codec')):
            raise S377MException('Not a valid Partition Pack key: %s' %
                                 self.key.encode('hex_codec'))
 def test_non_ber_decoding(self):
     """ Test usability of the method for non BER decoding. """
     self.assertEqual(
         InterchangeObject.ber_decode_length('0100'.decode('hex_codec'), 2),
         256)
     self.assertEqual(
         InterchangeObject.ber_decode_length('01e5'.decode('hex_codec'), 2),
         485)
 def test_ber_long_encoding_with_bytes(self):
     """ Test long BER encoding compliance with forced bytes length. """
     self.assertEqual(InterchangeObject.ber_encode_length(1, bytes_num=2),
                      '820001')
     self.assertEqual(InterchangeObject.ber_encode_length(127, bytes_num=4),
                      '840000007f')
     self.assertEqual(InterchangeObject.ber_encode_length(128, bytes_num=4),
                      '8400000080')
     self.assertEqual(InterchangeObject.ber_encode_length(256, bytes_num=8),
                      '880000000000000100')
 def test_ber_short_decoding(self):
     """ Test short BER decoding compliance. """
     self.assertEqual(
         InterchangeObject.ber_decode_length('00'.decode('hex_codec')), 0)
     self.assertEqual(
         InterchangeObject.ber_decode_length('01'.decode('hex_codec')), 1)
     self.assertEqual(
         InterchangeObject.ber_decode_length('7f'.decode('hex_codec')), 127)
     self.assertEqual(
         InterchangeObject.ber_decode_length('80'.decode('hex_codec')), 0)
Beispiel #8
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'))
 def test_ber_short_encoding(self):
     """ Test short BER encoding compliance. """
     self.assertEqual(InterchangeObject.ber_encode_length(0, prefix=False),
                      '00')
     self.assertEqual(InterchangeObject.ber_encode_length(1, prefix=False),
                      '01')
     self.assertEqual(
         InterchangeObject.ber_encode_length(127, prefix=False), '7f')
     self.assertEqual(
         InterchangeObject.ber_encode_length(128, prefix=False), '80')
     self.assertEqual(
         InterchangeObject.ber_encode_length(255, prefix=False), 'ff')
Beispiel #10
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'))
Beispiel #11
0
    def body_parse(self):

        # Read until Footer Partition Pack key
        i = 0
        key = InterchangeObject.get_key(self.fd)
        while not key.startswith('060e2b34020501010d01020101040400'):

            klv = KLVDarkComponent(self.fd)
            klv.read()
            i += 1
            key = InterchangeObject.get_key(self.fd)
            print klv

        print "Skipped", i, "KLVs"
Beispiel #12
0
 def test_ber_long_decoding(self):
     """ Test long BER decoding compliance. """
     self.assertEqual(
         InterchangeObject.ber_decode_length('811C'.decode('hex_codec')),
         28)
     self.assertEqual(
         InterchangeObject.ber_decode_length('82001C'.decode('hex_codec')),
         28)
     self.assertEqual(
         InterchangeObject.ber_decode_length(
             '840000001C'.decode('hex_codec')), 28)
     self.assertEqual(
         InterchangeObject.ber_decode_length(
             '88000000000000001C'.decode('hex_codec')), 28)
Beispiel #13
0
 def test_ber_long_encoding(self):
     """ Test long BER encoding compliance. """
     self.assertEqual(InterchangeObject.ber_encode_length(0), '00')
     self.assertEqual(InterchangeObject.ber_encode_length(1), '01')
     self.assertEqual(InterchangeObject.ber_encode_length(127), '7f')
     self.assertEqual(InterchangeObject.ber_encode_length(128), '8180')
     self.assertEqual(InterchangeObject.ber_encode_length(255), '81ff')
     self.assertEqual(InterchangeObject.ber_encode_length(256), '820100')
Beispiel #14
0
 def test_ber_long_encoding(self):
     """ Test long BER encoding compliance. """
     self.assertEqual(InterchangeObject.ber_encode_length(0), '00')
     self.assertEqual(InterchangeObject.ber_encode_length(1), '01')
     self.assertEqual(InterchangeObject.ber_encode_length(127), '7f')
     self.assertEqual(InterchangeObject.ber_encode_length(128), '8180')
     self.assertEqual(InterchangeObject.ber_encode_length(255), '81ff')
     self.assertEqual(InterchangeObject.ber_encode_length(256), '820100')
Beispiel #15
0
    def footer_partition_parse(self):
        """ Parse MXF footer partition. """

        # SMTPE 377M: Footer Partition Pack
        footer_partition_pack = MXFPartition(self.fd)
        footer_partition_pack.read()
        self.data['footer']['partition'] = footer_partition_pack

        key = InterchangeObject.get_key(self.fd)
        if key in ('060e2b34010101010201021001000000',
            '060e2b34010101010301021001000000'):
            # KLV Fill item
            klv = KLVFill(self.fd)
            klv.read()
            self.data['footer']['klvs'].append(klv)
Beispiel #16
0
    def __init__(self, fdesc, primer, debug=False, dark=False):
        InterchangeObject.__init__(self, fdesc, debug)
        self.primer = primer
        self.dark = dark
        self.data = OrderedDict()
        self.set_type = 'DataSet'
        self.element_mapping = {}

        if self.key.encode('hex_codec') not in MXFDataSet.dataset_names.keys():
            #print "MXFDataSet is dark", self.key.encode('hex_codec')
            self.dark = True
            self.set_type = 'Dark' + self.set_type
        else:
            self.set_type = MXFDataSet.dataset_names[self.key.encode('hex_codec')]

        if not self.dark:
            if not self.key.encode('hex_codec').startswith('060e2b34'):
                raise S377MException('Not a SMPTE administrated label')

            if self.key[4] != '\x02':
                raise S377MException('Not an MXF Set/Pack')

            if self.key[5] != '\x53':
                raise S377MException('Non-Local set syntax not supported yet (0x%x)' % ord(self.key[5]))
Beispiel #17
0
 def test_runtime_short_encode(self):
     """ Test encoding returns an even sized string for short values. """
     for i in range(0, 127):
         self.assertEqual(
             len(InterchangeObject.ber_encode_length(i, prefix=False)) % 2,
             0)
Beispiel #18
0
 def test_non_ber_encoding(self):
     """ Test usability of the method for non BER encoding. """
     self.assertEqual(
         InterchangeObject.ber_encode_length(256, prefix=False), '0100')
     self.assertEqual(
         InterchangeObject.ber_encode_length(485, prefix=False), '01e5')
Beispiel #19
0
 def write(self):
     return InterchangeObject.ber_encode_length(self.value, self.length, prefix=False).decode('hex_codec')
Beispiel #20
0
 def read(self):
     return InterchangeObject.ber_decode_length(self.value, self.length)
Beispiel #21
0
 def test_non_ber_decoding(self):
     """ Test usability of the method for non BER decoding. """
     self.assertEqual(InterchangeObject.ber_decode_length('0100'.decode('hex_codec'), 2), 256)
     self.assertEqual(InterchangeObject.ber_decode_length('01e5'.decode('hex_codec'), 2), 485)
Beispiel #22
0
    def header_metadata_parse(self):

        dark = 0

        avid_metadata_preface = None
        header_metadata_preface = None
        header_end = self.fd.tell() + self.data['header']['partition'].data['header_byte_count']

        while self.fd.tell() < header_end:
            fd = self.fd
            key = InterchangeObject.get_key(self.fd)

            if key in ('060e2b34010101010201021001000000', \
                '060e2b34010101010301021001000000'):
                # KLV Fill item
                klv = KLVFill(fd)
                klv.read()

            elif key == '060e2b34020501010d01020101050100':
                # SMTPE 377M: Header Metadata (Primer Pack)
                #if not isinstance(header_klvs[-1], KLVFill) and \
                #    not isinstance(header_klvs[-1], MXFPartition):
                #    raise Exception('Error: MXFPrimer not located after Header Partition Pack')
                header_metadata_primer_pack = MXFPrimer(fd, debug=True)
                header_metadata_primer_pack.read()
                #print header_metadata_primer_pack
                klv = header_metadata_primer_pack
                #continue

            elif key == '060e2b34025301010d01010101012f00':
                # SMTPE 377M: Header Metadata (Preface)
                #if not isinstance(header_klvs[-1], KLVFill) and \
                #    not isinstance(header_klvs[-1], MXFPrimer):
                #    raise Exception('Error: MXFPrimer not located after Header Partition Pack')
                header_metadata_preface = MXFPreface(fd, header_metadata_primer_pack)
                header_metadata_preface.read()
                klv = header_metadata_preface

            elif key == '8053080036210804b3b398a51c9011d4':
                # Avid ???
                avid_metadata_preface = AvidMetadataPreface(fd, header_metadata_primer_pack)
                avid_metadata_preface.read()
                klv = avid_metadata_preface

            elif key in (
             # 416 chunk (dark)
             '060e2b34025301010d01010102010000',
             '060e2b34025301010d01010102020000',
             '060e2b34025301010d01010102040000',
             '060e2b34025301010d01010102050000',
             '060e2b34025301010d01010102060000',
             '060e2b34025301010d01010102070000',
             '060e2b34025301010d01010102080000',
             '060e2b34025301010d01010102090000',
             '060e2b34025301010d010101020a0000',
             '060e2b34025301010d010101020b0000',
             '060e2b34025301010d010101020c0000',
             '060e2b34025301010d010101020d0000',
             '060e2b34025301010d010101020e0000',

             '060e2b34025301010d01010102200000',
             '060e2b34025301010d01010102210000',
             '060e2b34025301010d01010102220000', # Dark Dictionary ?

             '060e2b34025301010d01010102250000',

             # 119 chunk: Metadata of type ???
             '060e2b34025301010d01010101011b00', # Dark Simple Type Definition
             '060e2b34025301010d01010101011f00', # Dark Derived Type Definition
             '060e2b34025301010d01010101012000', # Dark Concent Type Definition
             '060e2b34025301010d01010101012200', # Dark Links to Data/Container/Codecs definitions
            ):
                # Avid DataSet
                klv = AvidAAFDefinition(fd, header_metadata_primer_pack)
                klv.read()

            elif key in (
             # essence descriptions (130~180)
             # SMPTE 377M: Strutural Metadata Sets
             '060e2b34025301010d01010101010900', # Filler

             '060e2b34025301010d01010101010f00', # Sequence

             '060e2b34025301010d01010101011100', # Source Clip
             '060e2b34025301010d01010101011400', # Timecode Component

             '060e2b34025301010d01010101011800', # ContentStorage

             '060e2b34025301010d01010101012e00', # AVID

             '060e2b34025301010d01010101013700', # Source Package (File, Physical)

             '060e2b34025301010d01010101013b00', # Timeline Track

             '060e2b34025301010d01010101014200', # GenericSoundEssenceDescriptor
             '060e2b34025301010d01010101014400', # MultipleDescriptor
             '060e2b34025301010d01010101014800', # WaveAudioDescriptor
             ):
                klv = MXFDataSet(fd, header_metadata_primer_pack)
                klv.read()

            elif key in (
             '060e2b34025301010d01010101012800', # CDCI Essence Descriptor

             # avid does not use standard 10 bytes ProductVersion
             '060e2b34025301010d01010101013000', # Identification

             '060e2b34025301010d01010101013600', # Material Package
             '060e2b34025301010d01010101013f00', # AVID
            ):
                klv = AvidMXFDataSet(fd, header_metadata_primer_pack)
                klv.read()

            elif key == '9613b38a87348746f10296f056e04d2a':
                # Avid ObjectDirectory
                klv = AvidObjectDirectory(fd, True)
                klv.read()

            else:
                klv = KLVDarkComponent(fd)
                klv.read()
                dark += 1

            self.data['header']['klvs'].append(klv)

        ### End of the parsing loop 1

        if self.debug:
            print "Loaded ", len(self.data['header']['klvs']), "KLVs", self.fd.tell()
            print "Skipped", dark, "dark KLVs"

        self.data['header'].update({
            'primer': header_metadata_primer_pack,
            'preface': header_metadata_preface,
            'avid_preface': avid_metadata_preface,
        })
        return
Beispiel #23
0
 def test_non_ber_encoding(self):
     """ Test usability of the method for non BER encoding. """
     self.assertEqual(InterchangeObject.ber_encode_length(256, prefix=False), '0100')
     self.assertEqual(InterchangeObject.ber_encode_length(485, prefix=False), '01e5')
Beispiel #24
0
 def __init__(self, fdesc, debug=False):
     InterchangeObject.__init__(self, fdesc, debug)
Beispiel #25
0
 def test_runtime_long_encode(self):
     """ Test encoding returns an even sized string for longer values. """
     for i in range(128, 4096):
         self.assertEqual(len(InterchangeObject.ber_encode_length(i)) % 2, 0)
Beispiel #26
0
 def test_ber_short_decoding(self):
     """ Test short BER decoding compliance. """
     self.assertEqual(InterchangeObject.ber_decode_length('00'.decode('hex_codec')), 0)
     self.assertEqual(InterchangeObject.ber_decode_length('01'.decode('hex_codec')), 1)
     self.assertEqual(InterchangeObject.ber_decode_length('7f'.decode('hex_codec')), 127)
     self.assertEqual(InterchangeObject.ber_decode_length('80'.decode('hex_codec')), 0)
Beispiel #27
0
 def test_ber_long_decoding(self):
     """ Test long BER decoding compliance. """
     self.assertEqual(InterchangeObject.ber_decode_length('811C'.decode('hex_codec')), 28)
     self.assertEqual(InterchangeObject.ber_decode_length('82001C'.decode('hex_codec')), 28)
     self.assertEqual(InterchangeObject.ber_decode_length('840000001C'.decode('hex_codec')), 28)
     self.assertEqual(InterchangeObject.ber_decode_length('88000000000000001C'.decode('hex_codec')), 28)
Beispiel #28
0
 def __init__(self, fdesc, debug=False):
     InterchangeObject.__init__(self, fdesc, debug)
Beispiel #29
0
 def test_runtime_long_encode(self):
     """ Test encoding returns an even sized string for longer values. """
     for i in range(128, 4096):
         self.assertEqual(
             len(InterchangeObject.ber_encode_length(i)) % 2, 0)
Beispiel #30
0
 def test_runtime_short_encode(self):
     """ Test encoding returns an even sized string for short values. """
     for i in range(0, 127):
         self.assertEqual(len(InterchangeObject.ber_encode_length(i, prefix=False)) % 2, 0)
Beispiel #31
0
 def test_ber_long_encoding_with_bytes(self):
     """ Test long BER encoding compliance with forced bytes length. """
     self.assertEqual(InterchangeObject.ber_encode_length(1, bytes_num=2), '820001')
     self.assertEqual(InterchangeObject.ber_encode_length(127, bytes_num=4), '840000007f')
     self.assertEqual(InterchangeObject.ber_encode_length(128, bytes_num=4), '8400000080')
     self.assertEqual(InterchangeObject.ber_encode_length(256, bytes_num=8), '880000000000000100')
Beispiel #32
0
    def header_metadata_parse(self):

        dark = 0
        header_metadata_preface = None
        header_end = self.fd.tell() + self.data['header']['partition'].data['header_byte_count']

        while self.fd.tell() <= header_end:
            fd = self.fd
            key = InterchangeObject.get_key(self.fd)

            if key in ('060e2b34010101010201021001000000', \
                '060e2b34010101010301021001000000'):
                # KLV Fill item
                klv = KLVFill(fd)
                klv.read()

            elif key == '060e2b34020501010d01020101050100':
                # SMTPE 377M: Header Metadata (Primer Pack)
                #if not isinstance(header_klvs[-1], KLVFill) and \
                #    not isinstance(header_klvs[-1], MXFPartition):
                #    raise Exception('Error: MXFPrimer not located after Header Partition Pack')
                header_metadata_primer_pack = MXFPrimer(fd, debug=True)
                header_metadata_primer_pack.read()
                print header_metadata_primer_pack
                klv = header_metadata_primer_pack

            elif key == '060e2b34025301010d01010101012f00':
                # SMTPE 377M: Header Metadata (Preface)
                #if not isinstance(header_klvs[-1], KLVFill) and \
                #    not isinstance(header_klvs[-1], MXFPrimer):
                #    raise Exception('Error: MXFPrimer not located after Header Partition Pack')
                header_metadata_preface = MXFPreface(fd, header_metadata_primer_pack)
                header_metadata_preface.read()
                klv = header_metadata_preface

            elif key in (
             # essence descriptions (130~180)
             # SMPTE 377M: Strutural Metadata Sets
             '060e2b34025301010d01010101010900', # Filler

             '060e2b34025301010d01010101010f00', # Sequence

             '060e2b34025301010d01010101011100', # Source Clip
             '060e2b34025301010d01010101011400', # Timecode Component

             '060e2b34025301010d01010101011800', # ContentStorage

             '060e2b34025301010d01010101013000', # Identification
             '060e2b34025301010d01010101013700', # Source Package (File, Physical)
             '060e2b34025301010d01010101013600', # Material Package
             '060e2b34025301010d01010101013b00', # Timeline Track

             '060e2b34025301010d01010101012300', # EssenceContainerData
             '060e2b34025301010d01010101012800', # CDCI Essence Descriptor
             '060e2b34025301010d01010101014200', # GenericSoundEssenceDescriptor
             '060e2b34025301010d01010101014400', # MultipleDescriptor
             '060e2b34025301010d01010101014700', # AES3PCMDescriptor
             '060e2b34025301010d01010101014800', # WaveAudioDescriptor
             '060e2b34025301010d01010101015100', # MPEG2VideoDescriptor
             ):
                klv = MXFDataSet(fd, header_metadata_primer_pack)
                klv.read()

            else:
                klv = KLVDarkComponent(fd)
                klv.read()
                dark += 1

            self.data['header']['klvs'].append(klv)

        ### End of the parsing loop 1

        if self.debug:
            print "Loaded ", len(self.data['header']['klvs']), "KLVs", self.fd.tell()
            print "Skipped", dark, "dark KLVs"

        self.data['header'].update({
            'primer': header_metadata_primer_pack,
            'preface': header_metadata_preface,
        })
        return
Beispiel #33
0
    def __init__(self, fdesc, debug=False):
        InterchangeObject.__init__(self, fdesc, debug)
        self.data = OrderedDict()

        if not re.search('060e2b34020501010d01020101(0[2-4])(0[0-4])00', self.key.encode('hex_codec')):
            raise S377MException('Not a valid Partition Pack key: %s' % self.key.encode('hex_codec'))
Beispiel #34
0
 def __init__(self, fdesc, debug=False):
     InterchangeObject.__init__(self, fdesc, debug)
     self.data = {'partition': []}
Beispiel #35
0
    def __init__(self, fdesc, debug=False):
        InterchangeObject.__init__(self, fdesc, debug)
        self.data = []

        if self.key.encode("hex_codec") != "9613b38a87348746f10296f056e04d2a":
            raise Exception("Not a valid Avid ObjectDirectory key")
Beispiel #36
0
    def __init__(self, fdesc, debug=False):
        InterchangeObject.__init__(self, fdesc, debug)
        self.data = []

        if self.key.encode('hex_codec') != '9613b38a87348746f10296f056e04d2a':
            raise Exception('Not a valid Avid ObjectDirectory key')
Beispiel #37
0
 def __init__(self, fdesc, debug=False):
     InterchangeObject.__init__(self, fdesc, debug)
     self.data = {'partition': []}