diff --git a/webrtc/tools/py_event_log_analyzer/misc.py b/webrtc/tools/py_event_log_analyzer/misc.py index 50ac28e9aa..bd70b75caa 100644 --- a/webrtc/tools/py_event_log_analyzer/misc.py +++ b/webrtc/tools/py_event_log_analyzer/misc.py @@ -72,6 +72,14 @@ def unwrap(data, mod): mod // 2) % mod - (mod // 2) return lst + +def ssrc_directions(data_points): + ssrc_is_incoming = {} + for point in data_points: + ssrc_is_incoming[point.ssrc] = point.incoming + return ssrc_is_incoming + + # Python 2/3-compatible input function if sys.version_info[0] <= 2: get_input = raw_input diff --git a/webrtc/tools/py_event_log_analyzer/pb_parse.py b/webrtc/tools/py_event_log_analyzer/pb_parse.py index b0ca2b3354..bd2f2b4314 100644 --- a/webrtc/tools/py_event_log_analyzer/pb_parse.py +++ b/webrtc/tools/py_event_log_analyzer/pb_parse.py @@ -17,13 +17,14 @@ class DataPoint(object): """Simple container class for RTP events.""" def __init__(self, rtp_header_str, packet_size, - arrival_timestamp_us): + 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 @@ -46,6 +47,6 @@ def parse_protobuf(file_path): return [DataPoint(event.rtp_packet.header, event.rtp_packet.packet_length, - event.timestamp_us) + event.timestamp_us, event.rtp_packet.incoming) for event in event_stream.stream if event.HasField("rtp_packet")] diff --git a/webrtc/tools/py_event_log_analyzer/rtp_analyzer.py b/webrtc/tools/py_event_log_analyzer/rtp_analyzer.py index 1a9b695c3a..c3374ca920 100644 --- a/webrtc/tools/py_event_log_analyzer/rtp_analyzer.py +++ b/webrtc/tools/py_event_log_analyzer/rtp_analyzer.py @@ -94,13 +94,22 @@ class RTPStatistics(object): self.print_ssrc_info("", chosen_ssrc) return chosen_ssrc - for (i, ssrc) in enumerate(self.ssrc_frequencies): + ssrc_is_incoming = misc.ssrc_directions(self.data_points) + incoming = [ssrc for ssrc in ssrc_is_incoming if ssrc_is_incoming[ssrc]] + outgoing = [ssrc for ssrc in ssrc_is_incoming if not ssrc_is_incoming[ssrc]] + + print("\nIncoming:\n") + for (i, ssrc) in enumerate(incoming): self.print_ssrc_info(i, ssrc) + print("\nOutgoing:\n") + for (i, ssrc) in enumerate(outgoing): + self.print_ssrc_info(i + len(incoming), ssrc) + while True: chosen_index = int(misc.get_input("choose one> ")) if 0 <= chosen_index < len(self.ssrc_frequencies): - return list(self.ssrc_frequencies)[chosen_index] + return (incoming + outgoing)[chosen_index] else: print("Invalid index!")