コード例 #1
0
    def __init__(self, data, ts_packets):
        self.bytes = data
        first_ts = ts_packets[0]
        self.pid = first_ts.pid
        self.byte_offset = first_ts.byte_offset
        self.size = len(ts_packets) * TSPacket.SIZE
        self.random_access = first_ts.random_access_indicator

        self.ts_packets = ts_packets
        data = BitStream(data)

        start_code = data.read("uint:24")
        if start_code != 0x000001:
            raise Exception("packet_start_code_prefix is 0x{:06X} but should "
                            "be 0x000001".format(start_code))

        self.stream_id = data.read("uint:8")
        pes_packet_length = data.read("uint:16")

        if StreamID.has_pes_header(self.stream_id):
            bits = data.read("uint:2")
            if bits != 2:
                raise Exception("First 2 bits of a PES header should be 0x2 "
                                "but saw 0x{:02X}'".format(bits))

            self.pes_scrambling_control = data.read("uint:2")
            self.pes_priority = data.read("bool")
            self.data_alignment_indicator = data.read("bool")
            self.copyright = data.read("bool")
            self.original_or_copy = data.read("bool")
            pts_dts_flags = data.read("uint:2")
            escr_flag = data.read("bool")
            es_rate_flag = data.read("bool")
            dsm_trick_mode_flag = data.read("bool")
            additional_copy_info_flag = data.read("bool")
            pes_crc_flag = data.read("bool")
            pes_extension_flag = data.read("bool")
            pes_header_data_length = data.read("uint:8")

            if pts_dts_flags & 2:
                bits = data.read("uint:4")
                if bits != pts_dts_flags:
                    raise Exception(
                        "2 bits before PTS should be 0x{:02X} but saw 0x{"
                        ":02X}".format(pts_dts_flags, bits))
                self.pts = read_timestamp("PTS", data)

            if pts_dts_flags & 1:
                bits = data.read("uint:4")
                if bits != 0x1:
                    raise Exception("2 bits before DTS should be 0x1 but saw "
                                    "0x{:02X}".format(bits))
                self.dts = read_timestamp("DTS", data)

            # skip the rest of the header and stuffing bytes
            data.bytepos = pes_header_data_length + 9
        if self.stream_id == StreamID.PADDING:
            self.payload = None
        else:
            self.payload = data.read("bytes")
コード例 #2
0
ファイル: index_parser.py プロジェクト: chengyuhui/pybluray
    def parse(self):
        bs = BitStream(filename=self.file_path)
        [index_start, extension_data_start] = parse_header(bs)
        self.app_info = parse_app_info(bs)

        bs.bytepos = index_start
        self.indexes = parse_index(bs)
        self.parsed = True
コード例 #3
0
 def sx(self):
     buffer = BitStream()
     buffer.append(f"uint:32={self.from_.year}")
     buffer.append(f"uint:8={self.from_.month}")
     buffer.append(f"uint:8={self.from_.day}")
     buffer.append(f"uint:32={self.to.year}")
     buffer.append(f"uint:8={self.to.month}")
     buffer.append(f"uint:8={self.to.day}")
     buffer.bytepos = 0
     return buffer
コード例 #4
0
def sx(stat: EnergyProfileStat):
    buffer = BitStream()

    to_add = encode_7bit_long(round(stat.kw_in * 1000))
    to_add.extend(encode_7bit_long(round(stat.kw_out * 1000)))
    to_add.extend(encode_7bit_long(round(stat.kw_net * 1000)))
    for thing in to_add:
        buffer.append(thing)
    buffer.bytepos = 0
    return buffer
コード例 #5
0
    def parse(data, byte_offset):
        ts = TSPacket(None)
        ts.byte_offset = byte_offset

        data = BitStream(data)
        sync_byte = data.read("uint:8")
        if sync_byte != TSPacket.SYNC_BYTE:
            raise Exception(
                "First byte of TS packet at offset {} is not a sync byte."
                .format(byte_offset))

        ts.transport_error_indicator = data.read("bool")
        ts.payload_unit_start_indicator = data.read("bool")
        ts.transport_priority = data.read("bool")
        ts.pid = data.read("uint:13")
        ts.scrambling_control = data.read("uint:2")

        # adaptation_field_control
        has_adaptation_field = data.read("bool")
        has_payload = data.read("bool")

        ts.continuity_counter = data.read("uint:4")
        if has_adaptation_field:
            adaptation_field_length = data.read("uint:8")
            if adaptation_field_length:
                ts.discontinuity_indicator = data.read("bool")
                ts.random_access_indicator = data.read("bool")
                ts.elementary_stream_priority_indicator = data.read("bool")
                pcr_flag = data.read("bool")
                opcr_flag = data.read("bool")
                splicing_point_flag = data.read("bool")
                transport_private_data_flag = data.read("bool")
                adaptation_field_extension_flag = data.read("bool")

                if pcr_flag:
                    ts.program_clock_reference_base = data.read("uint:33")
                    data.read(6)  # reserved
                    ts.program_clock_reference_extension = data.read("uint:9")

                if opcr_flag:
                    ts.original_program_clock_reference_base = data.read(
                        "uint:33")
                    data.read(6)  # reserved
                    ts.original_program_clock_reference_extension = data.read(
                        "uint:9")

                if splicing_point_flag:
                    ts.splice_countdown = data.read("uint:8")

                if transport_private_data_flag:
                    transport_private_data_length = data.read("uint:8")
                    ts.private_data = data.read(
                        transport_private_data_length * 8).bytes

                if adaptation_field_extension_flag:
                    adaptation_field_extension_length = data.read("uint:8")
                    ltw_flag = data.read("bool")
                    piecewise_rate_flag = data.read("bool")
                    seamless_splice_flag = data.read("bool")
                    data.read(5)  # reserved

                    if ltw_flag:
                        ts.ltw_valid_flag = data.read("bool")
                        ts.ltw_offset = data.read("uint:15")

                    if piecewise_rate_flag:
                        data.read(2)  # reserved
                        ts.piecewise_rate = data.read("uint:22")

                    if seamless_splice_flag:
                        ts.splice_type = data.read("uint:4")
                        ts.dts_next_au = read_timestamp("DTS_next_AU", data)

                # Skip the rest of the header and padding bytes
                data.bytepos = adaptation_field_length + 5

        if has_payload:
            ts.payload = data.read("bytes")
        return ts