def __init__(self, fileobj, length): """Raises DescriptorError""" r = BitReader(fileobj) try: self.ES_ID = r.bits(16) self.streamDependenceFlag = r.bits(1) self.URL_Flag = r.bits(1) self.OCRstreamFlag = r.bits(1) self.streamPriority = r.bits(5) if self.streamDependenceFlag: self.dependsOn_ES_ID = r.bits(16) if self.URL_Flag: URLlength = r.bits(8) self.URLstring = r.bytes(URLlength) if self.OCRstreamFlag: self.OCR_ES_Id = r.bits(16) tag = r.bits(8) except BitReaderError as e: raise DescriptorError(e) if tag != DecoderConfigDescriptor.TAG: raise DescriptorError("unexpected DecoderConfigDescrTag %d" % tag) assert r.is_aligned() self.decConfigDescr = DecoderConfigDescriptor.parse(fileobj)
def __init__(self, xing, fileobj): """Raises LAMEError if parsing fails""" payload = fileobj.read(27) if len(payload) != 27: raise LAMEError("Not enough data") # extended lame header r = BitReader(cBytesIO(payload)) revision = r.bits(4) if revision != 0: raise LAMEError("unsupported header revision %d" % revision) self.vbr_method = r.bits(4) self.lowpass_filter = r.bits(8) * 100 # these have a different meaning for lame; expose them again here self.quality = (100 - xing.vbr_scale) % 10 self.vbr_quality = (100 - xing.vbr_scale) // 10 track_peak_data = r.bytes(4) if track_peak_data == b"\x00\x00\x00\x00": self.track_peak = None else: # see PutLameVBR() in LAME's VbrTag.c self.track_peak = ( cdata.uint32_be(track_peak_data) - 0.5) / 2 ** 23 track_gain_type = r.bits(3) self.track_gain_origin = r.bits(3) sign = r.bits(1) gain_adj = r.bits(9) / 10.0 if sign: gain_adj *= -1 if track_gain_type == 1: self.track_gain_adjustment = gain_adj else: self.track_gain_adjustment = None assert r.is_aligned() album_gain_type = r.bits(3) self.album_gain_origin = r.bits(3) sign = r.bits(1) album_gain_adj = r.bits(9) / 10.0 if album_gain_type == 2: self.album_gain_adjustment = album_gain_adj else: self.album_gain_adjustment = None self.encoding_flags = r.bits(4) self.ath_type = r.bits(4) self.bitrate = r.bits(8) self.encoder_delay_start = r.bits(12) self.encoder_padding_end = r.bits(12) self.source_sample_frequency_enum = r.bits(2) self.unwise_setting_used = r.bits(1) self.stereo_mode = r.bits(3) self.noise_shaping = r.bits(2) sign = r.bits(1) mp3_gain = r.bits(7) if sign: mp3_gain *= -1 self.mp3_gain = mp3_gain r.skip(2) self.surround_info = r.bits(3) self.preset_used = r.bits(11) self.music_length = r.bits(32) self.music_crc = r.bits(16) self.header_crc = r.bits(16) assert r.is_aligned()
def test_bytes_unaligned(self): r = BitReader(cBytesIO(b"\xAB\xCD\xEF")) r.skip(4) self.assertEqual(r.bytes(2), b"\xBC\xDE")
def test_bytes(self): r = BitReader(cBytesIO(b"\xAB\xCD\xEF")) self.assertEqual(r.bytes(2), b"\xAB\xCD") self.assertEqual(r.bytes(0), b"")
def test_bytes_unaligned(self): r = BitReader(BytesIO(b"\xAB\xCD\xEF")) r.skip(4) self.assertEqual(r.bytes(2), b"\xBC\xDE")
def test_bytes(self): r = BitReader(BytesIO(b"\xAB\xCD\xEF")) self.assertEqual(r.bytes(2), b"\xAB\xCD") self.assertEqual(r.bytes(0), b"")