RF64 implementation

This commit is contained in:
Jamie Hardt
2019-06-25 13:10:26 -07:00
parent 4b6407c1f4
commit 1827b46e34
2 changed files with 58 additions and 12 deletions

View File

@@ -2,6 +2,7 @@
import struct
import pdb
from collections import namedtuple
from .rf64_parser import parse_rf64
class ListChunkDescriptor(namedtuple('ListChunkDescriptor' , 'signature children')):
@@ -18,19 +19,20 @@ class ListChunkDescriptor(namedtuple('ListChunkDescriptor' , 'signature children
return chunk
class ChunkDescriptor(namedtuple('ChunkDescriptor', 'ident start length') ):
class ChunkDescriptor(namedtuple('ChunkDescriptor', 'ident start length rf64_context') ):
def read_data(self, from_stream):
from_stream.seek(self.start)
return from_stream.read(self.length)
def parse_list_chunk(stream, length):
def parse_list_chunk(stream, length, rf64_context =None):
start = stream.tell()
signature = stream.read(4)
#print("Parsing list chunk with siganture: ", signature)
children = []
while (stream.tell() - start) < length:
child_chunk = parse_chunk(stream)
child_chunk = parse_chunk(stream, rf64_context= rf64_context)
if child_chunk:
children.append(child_chunk)
else:
@@ -38,27 +40,31 @@ def parse_list_chunk(stream, length):
return ListChunkDescriptor(signature=signature, children=children)
def parse_chunk(stream):
#breakpoint()
def parse_chunk(stream, rf64_context=None):
ident = stream.read(4)
if len(ident) != 4:
return
sizeb = stream.read(4)
size = struct.unpack('<I',sizeb)[0]
if size == 0xFFFFFFFF:
if rf64_context is None and ident == b'RF64':
rf64_context = parse_rf64(stream=stream)
size = rf64_context.bigchunk_table[ident]
displacement = size
if displacement % 2 is not 0:
displacement = displacement + 1
if ident in [b'RIFF',b'LIST']:
return parse_list_chunk(stream=stream, length=size)
if ident in [b'RIFF',b'LIST', b'RF64']:
#print("Parsing list chunk with ident: ", ident)
return parse_list_chunk(stream=stream, length=size, rf64_context=rf64_context)
else:
start = stream.tell()
stream.seek(displacement,1)
return ChunkDescriptor(ident=ident, start=start, length=size)
#print("Parsing chunk with start=%i, ident=%s" % (start, ident))
return ChunkDescriptor(ident=ident, start=start, length=size, rf64_context=rf64_context)