mirror of
https://github.com/iluvcapra/wavinfo.git
synced 2025-12-31 17:00:41 +00:00
Dolby
Removed supplemental metadata for now
This commit is contained in:
@@ -19,11 +19,9 @@ class TestDolby(TestCase):
|
|||||||
|
|
||||||
ddp = [x for x in d.segment_list if x[0] == SegmentType.DolbyDigitalPlus]
|
ddp = [x for x in d.segment_list if x[0] == SegmentType.DolbyDigitalPlus]
|
||||||
atmos = [x for x in d.segment_list if x[0] == SegmentType.DolbyAtmos]
|
atmos = [x for x in d.segment_list if x[0] == SegmentType.DolbyAtmos]
|
||||||
atmos_sup = [x for x in d.segment_list if x[0] == SegmentType.DolbyAtmosSupplemental]
|
|
||||||
|
|
||||||
self.assertEqual(len(ddp), 1)
|
self.assertEqual(len(ddp), 1)
|
||||||
self.assertEqual(len(atmos), 1)
|
self.assertEqual(len(atmos), 1)
|
||||||
self.assertEqual(len(atmos_sup), 1)
|
|
||||||
|
|
||||||
def test_checksums(self):
|
def test_checksums(self):
|
||||||
t1 = wavinfo.WavInfoReader(self.test_file)
|
t1 = wavinfo.WavInfoReader(self.test_file)
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ from enum import Enum
|
|||||||
class MyJSONEncoder(json.JSONEncoder):
|
class MyJSONEncoder(json.JSONEncoder):
|
||||||
def default(self, o):
|
def default(self, o):
|
||||||
if isinstance(o, Enum):
|
if isinstance(o, Enum):
|
||||||
return dict(name=o._name_, value=o._value_)
|
return o._name_
|
||||||
else:
|
else:
|
||||||
return super().default(o)
|
return super().default(o)
|
||||||
|
|
||||||
|
|||||||
@@ -473,6 +473,7 @@ class DolbyDigitalPlusMetadata:
|
|||||||
@dataclass
|
@dataclass
|
||||||
class DolbyAtmosMetadata:
|
class DolbyAtmosMetadata:
|
||||||
"""
|
"""
|
||||||
|
Dolby Atmos Metadata Segment
|
||||||
|
|
||||||
https://github.com/DolbyLaboratories/dbmd-atmos-parser/
|
https://github.com/DolbyLaboratories/dbmd-atmos-parser/
|
||||||
"""
|
"""
|
||||||
@@ -493,7 +494,8 @@ class DolbyAtmosMetadata:
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def load(cls, data: bytes):
|
def load(cls, data: bytes):
|
||||||
assert len(data) == cls.SEGMENT_LENGTH, "DolbyAtmosMetadata segment present in file is incorrect length"
|
assert len(data) == cls.SEGMENT_LENGTH, "DolbyAtmosMetadata segment "\
|
||||||
|
"is incorrect length, expected %i actual was %i" % (cls.SEGMENT_LENGTH, len(data))
|
||||||
|
|
||||||
h = BytesIO(data)
|
h = BytesIO(data)
|
||||||
|
|
||||||
@@ -514,12 +516,13 @@ class DolbyAtmosMetadata:
|
|||||||
tool_version=(major, minor, fix), warp_mode=DolbyAtmosMetadata.WarpMode(warp_mode))
|
tool_version=(major, minor, fix), warp_mode=DolbyAtmosMetadata.WarpMode(warp_mode))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class DolbyAtmosSupplementalMetadata:
|
class DolbyAtmosSupplementalMetadata:
|
||||||
|
"""
|
||||||
|
Dolby Atmos supplemental metadata segment.
|
||||||
|
|
||||||
|
https://github.com/DolbyLaboratories/dbmd-atmos-parser/blob/master/dbmd_atmos_parse/src/dbmd_atmos_parse.c
|
||||||
|
"""
|
||||||
|
|
||||||
class BinauralRenderMode(Enum):
|
class BinauralRenderMode(Enum):
|
||||||
BYPASS = 0x00
|
BYPASS = 0x00
|
||||||
@@ -530,13 +533,42 @@ class DolbyAtmosSupplementalMetadata:
|
|||||||
|
|
||||||
|
|
||||||
object_count: int
|
object_count: int
|
||||||
render_modes: List['DolbyAtmosMetadata.BinauralRenderMode']
|
render_modes: List['DolbyAtmosSupplementalMetadata.BinauralRenderMode']
|
||||||
trim_modes: List[int]
|
trim_modes: List[int]
|
||||||
|
|
||||||
|
|
||||||
|
MAGIC = 0xf8726fbd
|
||||||
|
TRIM_CONFIG_COUNT = 9
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def load(cls, data: bytes):
|
def load(cls, data: bytes):
|
||||||
pass
|
|
||||||
|
|
||||||
|
trim_modes = []
|
||||||
|
render_modes = []
|
||||||
|
|
||||||
|
h = BytesIO(data)
|
||||||
|
magic = unpack("<I", h.read(4))
|
||||||
|
assert magic == cls.MAGIC, "Magic value was not found"
|
||||||
|
|
||||||
|
object_count = unpack("<H", h.read(2))
|
||||||
|
|
||||||
|
h.read(1) #skip 1
|
||||||
|
|
||||||
|
for _ in range(cls.TRIM_CONFIG_COUNT):
|
||||||
|
auto_trim = unpack("B", h.read(1))
|
||||||
|
trim_modes.append(auto_trim)
|
||||||
|
|
||||||
|
h.read(14) #skip 14
|
||||||
|
|
||||||
|
h.read(object_count) # skip object_count bytes
|
||||||
|
|
||||||
|
for _ in range(object_count):
|
||||||
|
binaural_mode = unpack("B", h.read(1))
|
||||||
|
binaural_mode &= 0x7
|
||||||
|
render_modes.append(binaural_mode)
|
||||||
|
|
||||||
|
return DolbyAtmosSupplementalMetadata(object_count=object_count,
|
||||||
|
render_modes=render_modes,trim_modes=trim_modes)
|
||||||
|
|
||||||
|
|
||||||
class WavDolbyMetadataReader:
|
class WavDolbyMetadataReader:
|
||||||
@@ -593,8 +625,8 @@ class WavDolbyMetadataReader:
|
|||||||
segment = DolbyDigitalPlusMetadata.load(segment)
|
segment = DolbyDigitalPlusMetadata.load(segment)
|
||||||
elif stype == SegmentType.DolbyAtmos:
|
elif stype == SegmentType.DolbyAtmos:
|
||||||
segment = DolbyAtmosMetadata.load(segment)
|
segment = DolbyAtmosMetadata.load(segment)
|
||||||
elif stype == SegmentType.DolbyAtmosSupplemental:
|
# elif stype == SegmentType.DolbyAtmosSupplemental:
|
||||||
segment = DolbyAtmosSupplementalMetadata.load(segment)
|
# segment = DolbyAtmosSupplementalMetadata.load(segment)
|
||||||
|
|
||||||
self.segment_list.append( (stype, checksum == expected_checksum, segment) )
|
self.segment_list.append( (stype, checksum == expected_checksum, segment) )
|
||||||
|
|
||||||
@@ -612,19 +644,18 @@ class WavDolbyMetadataReader:
|
|||||||
return [x[2] for x in self.segment_list \
|
return [x[2] for x in self.segment_list \
|
||||||
if x[0] == SegmentType.DolbyAtmos and x[1]]
|
if x[0] == SegmentType.DolbyAtmos and x[1]]
|
||||||
|
|
||||||
def dolby_atmos_supplemental(self) -> List[DolbyAtmosSupplementalMetadata]:
|
# def dolby_atmos_supplemental(self) -> List[DolbyAtmosSupplementalMetadata]:
|
||||||
"""
|
# """
|
||||||
Every valid Dolby Atmos Supplemental metadata segment in the file.
|
# Every valid Dolby Atmos Supplemental metadata segment in the file.
|
||||||
"""
|
# """
|
||||||
return [x[2] for x in self.segment_list \
|
# return [x[2] for x in self.segment_list \
|
||||||
if x[0] == SegmentType.DolbyAtmosSupplemental and x[1]]
|
# if x[0] == SegmentType.DolbyAtmosSupplemental and x[1]]
|
||||||
|
|
||||||
def to_dict(self) -> dict:
|
def to_dict(self) -> dict:
|
||||||
|
|
||||||
ddp = map(lambda x: asdict(x), self.dolby_digital_plus())
|
ddp = map(lambda x: asdict(x), self.dolby_digital_plus())
|
||||||
atmos = map(lambda x: asdict(x), self.dolby_atmos())
|
atmos = map(lambda x: asdict(x), self.dolby_atmos())
|
||||||
atmos_sup = [] #map(lambda x: asdict(x), self.dolby_atmos_supplemental())
|
#atmos_sup = map(lambda x: asdict(x), self.dolby_atmos_supplemental())
|
||||||
|
|
||||||
return dict(dolby_digital_plus=list(ddp),
|
return dict(dolby_digital_plus=list(ddp),
|
||||||
dolby_atmos=list(atmos),
|
dolby_atmos=list(atmos))
|
||||||
dolby_atmos_supplemental=list(atmos_sup))
|
|
||||||
|
|||||||
Reference in New Issue
Block a user