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