diff options
Diffstat (limited to 'third_party/libwebrtc/rtc_tools/py_event_log_analyzer/pb_parse.py')
-rw-r--r-- | third_party/libwebrtc/rtc_tools/py_event_log_analyzer/pb_parse.py | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/third_party/libwebrtc/rtc_tools/py_event_log_analyzer/pb_parse.py b/third_party/libwebrtc/rtc_tools/py_event_log_analyzer/pb_parse.py new file mode 100644 index 0000000000..23e6ae4487 --- /dev/null +++ b/third_party/libwebrtc/rtc_tools/py_event_log_analyzer/pb_parse.py @@ -0,0 +1,51 @@ +# Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. +# +# Use of this source code is governed by a BSD-style license +# that can be found in the LICENSE file in the root of the source +# tree. An additional intellectual property rights grant can be found +# in the file PATENTS. All contributing project authors may +# be found in the AUTHORS file in the root of the source tree. +"""Parses protobuf RTC dumps.""" + +from __future__ import division +import struct +import pyproto.logging.rtc_event_log.rtc_event_log_pb2 as rtc_pb + + +class DataPoint(object): + """Simple container class for RTP events.""" + + def __init__(self, rtp_header_str, packet_size, arrival_timestamp_us, + incoming): + """Builds a data point by parsing an RTP header, size and arrival time. + + RTP header structure is defined in RFC 3550 section 5.1. + """ + self.size = packet_size + self.arrival_timestamp_ms = arrival_timestamp_us / 1000 + self.incoming = incoming + header = struct.unpack_from("!HHII", rtp_header_str, 0) + (first2header_bytes, self.sequence_number, self.timestamp, + self.ssrc) = header + self.payload_type = first2header_bytes & 0b01111111 + self.marker_bit = (first2header_bytes & 0b10000000) >> 7 + + +def ParseProtobuf(file_path): + """Parses RTC event log from protobuf file. + + Args: + file_path: path to protobuf file of RTC event stream + + Returns: + all RTP packet events from the event stream as a list of DataPoints + """ + event_stream = rtc_pb.EventStream() + with open(file_path, "rb") as f: + event_stream.ParseFromString(f.read()) + + return [ + DataPoint(event.rtp_packet.header, event.rtp_packet.packet_length, + event.timestamp_us, event.rtp_packet.incoming) + for event in event_stream.stream if event.HasField("rtp_packet") + ] |