xref: /aosp_15_r20/external/webrtc/rtc_tools/py_event_log_analyzer/pb_parse.py (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1#  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
2#
3#  Use of this source code is governed by a BSD-style license
4#  that can be found in the LICENSE file in the root of the source
5#  tree. An additional intellectual property rights grant can be found
6#  in the file PATENTS.  All contributing project authors may
7#  be found in the AUTHORS file in the root of the source tree.
8"""Parses protobuf RTC dumps."""
9
10from __future__ import division
11import struct
12import pyproto.logging.rtc_event_log.rtc_event_log_pb2 as rtc_pb
13
14
15class DataPoint(object):
16    """Simple container class for RTP events."""
17
18    def __init__(self, rtp_header_str, packet_size, arrival_timestamp_us,
19                 incoming):
20        """Builds a data point by parsing an RTP header, size and arrival time.
21
22    RTP header structure is defined in RFC 3550 section 5.1.
23    """
24        self.size = packet_size
25        self.arrival_timestamp_ms = arrival_timestamp_us / 1000
26        self.incoming = incoming
27        header = struct.unpack_from("!HHII", rtp_header_str, 0)
28        (first2header_bytes, self.sequence_number, self.timestamp,
29         self.ssrc) = header
30        self.payload_type = first2header_bytes & 0b01111111
31        self.marker_bit = (first2header_bytes & 0b10000000) >> 7
32
33
34def ParseProtobuf(file_path):
35    """Parses RTC event log from protobuf file.
36
37  Args:
38       file_path: path to protobuf file of RTC event stream
39
40  Returns:
41    all RTP packet events from the event stream as a list of DataPoints
42  """
43    event_stream = rtc_pb.EventStream()
44    with open(file_path, "rb") as f:
45        event_stream.ParseFromString(f.read())
46
47    return [
48        DataPoint(event.rtp_packet.header, event.rtp_packet.packet_length,
49                  event.timestamp_us, event.rtp_packet.incoming)
50        for event in event_stream.stream if event.HasField("rtp_packet")
51    ]
52