Ejemplo n.º 1
0
 def __update_offset_table(self, fileobj, fmt, atom, delta, offset):
     """Update offset table in the specified atom."""
     if atom.offset > offset:
         atom.offset += delta
     fileobj.seek(atom.offset + 12)
     data = fileobj.read(atom.length - 12)
     fmt = fmt % cdata.uint_be(data[:4])
     offsets = struct.unpack(fmt, data[4:])
     offsets = [o + (0, delta)[offset < o] for o in offsets]
     fileobj.seek(atom.offset + 16)
     fileobj.write(struct.pack(fmt, *offsets))
Ejemplo n.º 2
0
 def __update_offset_table(self, fileobj, fmt, atom, delta, offset):
     """Update offset table in the specified atom."""
     if atom.offset > offset:
         atom.offset += delta
     fileobj.seek(atom.offset + 12)
     data = fileobj.read(atom.length - 12)
     fmt = fmt % cdata.uint_be(data[:4])
     offsets = struct.unpack(fmt, data[4:])
     offsets = [o + (0, delta)[offset < o] for o in offsets]
     fileobj.seek(atom.offset + 16)
     fileobj.write(struct.pack(fmt, *offsets))
Ejemplo n.º 3
0
def parse_full_atom(data):
    """Some atoms are versioned. Split them up in (version, flags, payload).
    Can raise ValueError.
    """

    if len(data) < 4:
        raise ValueError("not enough data")

    version = ord(data[0:1])
    flags = cdata.uint_be(b"\x00" + data[1:4])
    return version, flags, data[4:]
Ejemplo n.º 4
0
 def __update_tfhd(self, fileobj, atom, delta, offset):
     if atom.offset > offset:
         atom.offset += delta
     fileobj.seek(atom.offset + 9)
     data = fileobj.read(atom.length - 9)
     flags = cdata.uint_be(b"\x00" + data[:3])
     if flags & 1:
         o = cdata.ulonglong_be(data[7:15])
         if o > offset:
             o += delta
         fileobj.seek(atom.offset + 16)
         fileobj.write(cdata.to_ulonglong_be(o))
Ejemplo n.º 5
0
 def __update_tfhd(self, fileobj, atom, delta, offset):
     if atom.offset > offset:
         atom.offset += delta
     fileobj.seek(atom.offset + 9)
     data = fileobj.read(atom.length - 9)
     flags = cdata.uint_be(b"\x00" + data[:3])
     if flags & 1:
         o = cdata.ulonglong_be(data[7:15])
         if o > offset:
             o += delta
         fileobj.seek(atom.offset + 16)
         fileobj.write(cdata.to_ulonglong_be(o))
Ejemplo n.º 6
0
    def __parse_freeform(self, atom, data):
        length = cdata.uint_be(data[:4])
        mean = data[12:length]
        pos = length
        length = cdata.uint_be(data[pos:pos + 4])
        name = data[pos + 12:pos + length]
        pos += length
        value = []
        while pos < atom.length - 8:
            length, atom_name = struct.unpack(">I4s", data[pos:pos + 8])
            if atom_name != b"data":
                raise MP4MetadataError(
                    "unexpected atom %r inside %r" % (atom_name, atom.name))

            version = ord(data[pos + 8:pos + 8 + 1])
            flags = struct.unpack(">I", b"\x00" + data[pos + 9:pos + 12])[0]
            value.append(MP4FreeForm(data[pos + 16:pos + length],
                                     dataformat=flags, version=version))
            pos += length

        key = _name2key(atom.name + b":" + mean + b":" + name)
        self.__add(key, value)
Ejemplo n.º 7
0
    def __parse_freeform(self, atom, data):
        length = cdata.uint_be(data[:4])
        mean = data[12:length]
        pos = length
        length = cdata.uint_be(data[pos:pos + 4])
        name = data[pos + 12:pos + length]
        pos += length
        value = []
        while pos < atom.length - 8:
            length, atom_name = struct.unpack(">I4s", data[pos:pos + 8])
            if atom_name != b"data":
                raise MP4MetadataError("unexpected atom %r inside %r" %
                                       (atom_name, atom.name))

            version = ord(data[pos + 8:pos + 8 + 1])
            flags = struct.unpack(">I", b"\x00" + data[pos + 9:pos + 12])[0]
            value.append(
                MP4FreeForm(data[pos + 16:pos + length],
                            dataformat=flags,
                            version=version))
            pos += length

        key = _name2key(atom.name + b":" + mean + b":" + name)
        self.__add(key, value)
Ejemplo n.º 8
0
 def __init__(self, fileobj):
     page = OggPage(fileobj)
     while not page.packets[0].startswith(b"\x80theora"):
         page = OggPage(fileobj)
     if not page.first:
         raise OggTheoraHeaderError("page has ID header, but doesn't start a stream")
     data = page.packets[0]
     vmaj, vmin = struct.unpack("2B", data[7:9])
     if (vmaj, vmin) != (3, 2):
         raise OggTheoraHeaderError("found Theora version %d.%d != 3.2" % (vmaj, vmin))
     fps_num, fps_den = struct.unpack(">2I", data[22:30])
     self.fps = fps_num / float(fps_den)
     self.bitrate = cdata.uint_be(b"\x00" + data[37:40])
     self.granule_shift = (cdata.ushort_be(data[40:42]) >> 5) & 0x1F
     self.serial = page.serial
Ejemplo n.º 9
0
    def __update_parents(self, fileobj, path, delta):
        """Update all parent atoms with the new size."""

        if delta == 0:
            return

        for atom in path:
            fileobj.seek(atom.offset)
            size = cdata.uint_be(fileobj.read(4))
            if size == 1:  # 64bit
                # skip name (4B) and read size (8B)
                size = cdata.ulonglong_be(fileobj.read(12)[4:])
                fileobj.seek(atom.offset + 8)
                fileobj.write(cdata.to_ulonglong_be(size + delta))
            else:  # 32bit
                fileobj.seek(atom.offset)
                fileobj.write(cdata.to_uint_be(size + delta))
Ejemplo n.º 10
0
 def __init__(self, fileobj):
     page = OggPage(fileobj)
     while not page.packets[0].startswith(b"\x80theora"):
         page = OggPage(fileobj)
     if not page.first:
         raise OggTheoraHeaderError(
             "page has ID header, but doesn't start a stream")
     data = page.packets[0]
     vmaj, vmin = struct.unpack("2B", data[7:9])
     if (vmaj, vmin) != (3, 2):
         raise OggTheoraHeaderError("found Theora version %d.%d != 3.2" %
                                    (vmaj, vmin))
     fps_num, fps_den = struct.unpack(">2I", data[22:30])
     self.fps = fps_num / float(fps_den)
     self.bitrate = cdata.uint_be(b"\x00" + data[37:40])
     self.granule_shift = (cdata.ushort_be(data[40:42]) >> 5) & 0x1F
     self.serial = page.serial
Ejemplo n.º 11
0
    def __update_parents(self, fileobj, path, delta):
        """Update all parent atoms with the new size."""

        if delta == 0:
            return

        for atom in path:
            fileobj.seek(atom.offset)
            size = cdata.uint_be(fileobj.read(4))
            if size == 1:  # 64bit
                # skip name (4B) and read size (8B)
                size = cdata.ulonglong_be(fileobj.read(12)[4:])
                fileobj.seek(atom.offset + 8)
                fileobj.write(cdata.to_ulonglong_be(size + delta))
            else:  # 32bit
                fileobj.seek(atom.offset)
                fileobj.write(cdata.to_uint_be(size + delta))