// THIS FILE IS EXPERIMENTAL. BREAKING CHANGES MAY BE MADE AT ANY TIME // WITHOUT PRIOR WARNING. THIS FILE SHOULD NOT BE USED IN PRODUCTION CODE. syntax = "proto2"; option optimize_for = LITE_RUNTIME; package webrtc.rtclog2; // At the top level, a WebRTC event log is just an EventStream object. Note that // concatenating multiple EventStreams in the same file is equivalent to a // single EventStream object containing the same events. Hence, it is not // necessary to wait for the entire log to be complete before beginning to // write it to a file. message EventStream { // Deprecated - Maintained for compatibility with the old event log. // TODO(terelius): Maybe we can remove this and instead check the stream for // presence of a version field. That requires a custom protobuf parser, but we // have that already anyway. repeated Event stream = 1 [deprecated = true]; // required - The version number must be 2 for this version of the event log. optional uint32 version = 2; repeated IncomingRtpPackets incoming_rtp_packets = 3; repeated OutgoingRtpPackets outgoing_rtp_packets = 4; repeated IncomingRtcpPackets incoming_rtcp_packets = 5; repeated OutgoingRtcpPackets outgoing_rtcp_packets = 6; repeated AudioPlayoutEvents audio_playout_events = 7; // The field tags 8-15 are reserved for the most common events repeated BeginLogEvent begin_log_events = 16; repeated EndLogEvent end_log_events = 17; repeated LossBasedBweUpdates loss_based_bwe_updates = 18; repeated DelayBasedBweUpdates delay_based_bwe_updates = 19; repeated AudioNetworkAdaptations audio_network_adaptations = 20; repeated BweProbeCluster probe_clusters = 21; repeated BweProbeResultSuccess probe_success = 22; repeated BweProbeResultFailure probe_failure = 23; repeated AudioRecvStreamConfig audio_recv_stream_configs = 101; repeated AudioSendStreamConfig audio_send_stream_configs = 102; repeated VideoRecvStreamConfig video_recv_stream_configs = 103; repeated VideoSendStreamConfig video_send_stream_configs = 104; } // DEPRECATED. message Event { // TODO(terelius): Do we want to preserve the old Event definition here? } message IncomingRtpPackets { optional int64 timestamp_ms = 1; // RTP marker bit, used to label boundaries within e.g. video frames. optional bool marker = 2; // RTP payload type. optional uint32 payload_type = 3; // RTP sequence number. optional uint32 sequence_number = 4; // RTP monotonic clock timestamp (not actual time). optional fixed32 rtp_timestamp = 5; // Synchronization source of this packet's RTP stream. optional fixed32 ssrc = 6; // TODO(terelius/dinor): Add CSRCs. Field number 7 reserved for this purpose. // required - The size of the packet including both payload and header. optional uint32 packet_size = 8; // Optional header extensions. optional int32 transmission_time_offset = 9; optional uint32 absolute_send_time = 10; optional uint32 transport_sequence_number = 11; optional uint32 audio_level = 12; // TODO(terelius): Add header extensions like video rotation, playout delay? // Delta encodings optional bytes timestamp_deltas_ms = 101; optional bytes marker_deltas = 102; optional bytes payload_type_deltas = 103; optional bytes sequence_number_deltas = 104; optional bytes rtp_timestamp_deltas = 105; optional bytes ssrc_deltas = 106; optional bytes packet_size_deltas = 107; optional bytes transmission_time_offset_deltas = 108; optional bytes absolute_send_time_deltas = 109; optional bytes transport_sequence_number_deltas = 110; optional bytes audio_level_deltas = 111; } message OutgoingRtpPackets { optional int64 timestamp_ms = 1; // RTP marker bit, used to label boundaries within e.g. video frames. optional bool marker = 2; optional uint32 payload_type = 3; // RTP sequence number. optional uint32 sequence_number = 4; // RTP monotonic clock timestamp (not actual time). optional fixed32 rtp_timestamp = 5; // Synchronization source of this packet's RTP stream. optional fixed32 ssrc = 6; // TODO(terelius/dinor): Add CSRCs. Field number 7 reserved for this purpose. // required - The size of the packet including both payload and header. optional uint32 packet_size = 8; // Optional header extensions. optional int32 transmission_time_offset = 9; optional uint32 absolute_send_time = 10; optional uint32 transport_sequence_number = 11; optional uint32 audio_level = 12; // TODO(terelius): Add header extensions like video rotation, playout delay? // Delta encodings optional bytes timestamp_deltas_ms = 101; optional bytes marker_deltas = 102; optional bytes payload_type_deltas = 103; optional bytes sequence_number_deltas = 104; optional bytes rtp_timestamp_deltas = 105; optional bytes ssrc_deltas = 106; optional bytes packet_size_deltas = 107; optional bytes probe_cluster_id_deltas = 108; optional bytes transmission_time_offset_deltas = 109; optional bytes absolute_send_time_deltas = 110; optional bytes transport_sequence_number_deltas = 111; } message IncomingRtcpPackets { optional int64 timestamp_ms = 1; // required - The whole packet including both payload and header. optional bytes raw_packet = 2; // TODO(terelius): Feasible to log parsed RTCP instead? // Delta encodings optional bytes timestamp_deltas_ms = 101; optional bytes raw_packet_deltas = 102; } message OutgoingRtcpPackets { optional int64 timestamp_ms = 1; // required - The whole packet including both payload and header. optional bytes raw_packet = 2; // TODO(terelius): Feasible to log parsed RTCP instead? // Delta encodings optional bytes timestamp_deltas_ms = 101; optional bytes raw_packet_deltas = 102; } message AudioPlayoutEvents { optional int64 timestamp_ms = 1; // required - The SSRC of the audio stream associated with the playout event. optional uint32 local_ssrc = 2; // Delta encodings optional bytes timestamp_deltas_ms = 101; optional bytes local_ssrc_deltas = 102; } message BeginLogEvent { optional int64 timestamp_ms = 1; } message EndLogEvent { optional int64 timestamp_ms = 1; } message LossBasedBweUpdates { optional int64 timestamp_ms = 1; // TODO(terelius): Update log interface to unsigned. // required - Bandwidth estimate (in bps) after the update. optional uint32 bitrate_bps = 2; // required - Fraction of lost packets since last receiver report // computed as floor( 256 * (#lost_packets / #total_packets) ). // The possible values range from 0 to 255. optional uint32 fraction_loss = 3; // TODO(terelius): Is this really needed? Remove or make optional? // TODO(terelius): Update log interface to unsigned. // required - Total number of packets that the BWE update is based on. optional uint32 total_packets = 4; // Delta encodings optional bytes timestamp_deltas_ms = 101; optional bytes bitrate_deltas_bps = 102; optional bytes fraction_loss_deltas = 103; optional bytes total_packets_deltas = 104; } message DelayBasedBweUpdates { optional int64 timestamp_ms = 1; // required - Bandwidth estimate (in bps) after the update. optional uint32 bitrate_bps = 2; enum DetectorState { BWE_NORMAL = 0; BWE_UNDERUSING = 1; BWE_OVERUSING = 2; } optional DetectorState detector_state = 3; // Delta encodings optional bytes timestamp_deltas_ms = 101; optional bytes bitrate_deltas_bps = 102; optional bytes detector_state_deltas = 103; } // Maps RTP header extension names to numerical IDs. message RtpHeaderExtensionConfig { // Optional IDs for the header extensions. Each ID is a 4-bit number that is // only set if that extension is configured. // TODO(terelius): Can we skip transmission_time_offset? When is it used? optional int32 transmission_time_offset_id = 1; optional int32 absolute_send_time_id = 2; optional int32 transport_sequence_number_id = 3; optional int32 audio_level_id = 4; // TODO(terelius): Add video_rotation and playout delay? } message VideoRecvStreamConfig { optional int64 timestamp_ms = 1; // required - Synchronization source (stream identifier) to be received. optional uint32 remote_ssrc = 2; // required - Sender SSRC used for sending RTCP (such as receiver reports). optional uint32 local_ssrc = 3; // required if RTX is configured optional uint32 rtx_ssrc = 4; // optional - RTP source stream ID optional bytes rsid = 5; // IDs for the header extension we care about. Only required if there are // header extensions configured. optional RtpHeaderExtensionConfig header_extensions = 6; // TODO(terelius): Do we need codec-payload mapping? If so and rtx_ssrc is // used, we also need a map between RTP payload type and RTX payload type. } message VideoSendStreamConfig { optional int64 timestamp_ms = 1; // Synchronization source (stream identifier) for outgoing stream. // One stream can have several ssrcs for e.g. simulcast. optional uint32 ssrc = 2; // SSRC for the RTX stream optional uint32 rtx_ssrc = 3; // RTP source stream ID optional bytes rsid = 4; // IDs for the header extension we care about. Only required if there are // header extensions configured. optional RtpHeaderExtensionConfig header_extensions = 5; // TODO(terelius): Do we need codec-payload mapping? If so and rtx_ssrc is // used, we also need a map between RTP payload type and RTX payload type. } message AudioRecvStreamConfig { optional int64 timestamp_ms = 1; // required - Synchronization source (stream identifier) to be received. optional uint32 remote_ssrc = 2; // required - Sender SSRC used for sending RTCP (such as receiver reports). optional uint32 local_ssrc = 3; // Field number 4 reserved for RTX SSRC. // optional - RTP source stream ID optional bytes rsid = 5; // IDs for the header extension we care about. Only required if there are // header extensions configured. optional RtpHeaderExtensionConfig header_extensions = 6; // TODO(terelius): Do we need codec-payload mapping? If so and rtx_ssrc is // used, we also need a map between RTP payload type and RTX payload type. } message AudioSendStreamConfig { optional int64 timestamp_ms = 1; // Synchronization source (stream identifier) for outgoing stream. // One stream can have several ssrcs for e.g. simulcast. optional uint32 ssrc = 2; // Field number 3 reserved for RTX SSRC // RTP source stream ID optional bytes rsid = 4; // IDs for the header extension we care about. Only required if there are // header extensions configured. optional RtpHeaderExtensionConfig header_extensions = 5; // TODO(terelius): Do we need codec-payload mapping? If so and rtx_ssrc is // used, we also need a map between RTP payload type and RTX payload type. } message AudioNetworkAdaptations { optional int64 timestamp_ms = 1; // Bit rate that the audio encoder is operating at. // TODO(terelius): Signed vs unsigned? optional int32 bitrate_bps = 2; // Frame length that each encoded audio packet consists of. // TODO(terelius): Signed vs unsigned? optional int32 frame_length_ms = 3; // Packet loss fraction that the encoder's forward error correction (FEC) is // optimized for. optional float uplink_packet_loss_fraction = 4; // Whether forward error correction (FEC) is turned on or off. optional bool enable_fec = 5; // Whether discontinuous transmission (DTX) is turned on or off. optional bool enable_dtx = 6; // Number of audio channels that each encoded packet consists of. optional uint32 num_channels = 7; // Delta encodings optional bytes timestamp_deltas_ms = 101; optional bytes bitrate_deltas_bps = 102; optional bytes frame_length_deltas_ms = 103; optional bytes uplink_packet_loss_fraction_deltas = 104; optional bytes enable_fec_deltas = 105; optional bytes enable_dtx_deltas = 106; optional bytes num_channels_deltas = 107; } message BweProbeCluster { optional int64 timestamp_ms = 1; // required - The id of this probe cluster. optional uint32 id = 2; // required - The bitrate in bps that this probe cluster is meant to probe. optional uint32 bitrate_bps = 3; // required - The minimum number of packets used to probe the given bitrate. optional uint32 min_packets = 4; // required - The minimum number of bytes used to probe the given bitrate. optional uint32 min_bytes = 5; } message BweProbeResultSuccess { optional int64 timestamp_ms = 1; // required - The id of this probe cluster. optional uint32 id = 2; // required - The resulting bitrate in bps. optional uint32 bitrate_bps = 3; } message BweProbeResultFailure { optional int64 timestamp_ms = 1; // required - The id of this probe cluster. optional uint32 id = 2; enum FailureReason { UNKNOWN = 0; INVALID_SEND_RECEIVE_INTERVAL = 1; INVALID_SEND_RECEIVE_RATIO = 2; TIMEOUT = 3; } // required optional FailureReason failure = 3; }