1// THIS FILE IS EXPERIMENTAL. BREAKING CHANGES MAY BE MADE AT ANY TIME 2// WITHOUT PRIOR WARNING. THIS FILE SHOULD NOT BE USED IN PRODUCTION CODE. 3 4syntax = "proto2"; 5option optimize_for = LITE_RUNTIME; 6package webrtc.rtclog2; 7 8// At the top level, a WebRTC event log is just an EventStream object. Note that 9// concatenating multiple EventStreams in the same file is equivalent to a 10// single EventStream object containing the same events. Hence, it is not 11// necessary to wait for the entire log to be complete before beginning to 12// write it to a file. 13// Note: For all X_deltas fields, we rely on the default value being an 14// empty string. 15message EventStream { 16 // Deprecated - Maintained for compatibility with the old event log. 17 repeated Event stream = 1 [deprecated = true]; 18 repeated IncomingRtpPackets incoming_rtp_packets = 2; 19 repeated OutgoingRtpPackets outgoing_rtp_packets = 3; 20 repeated IncomingRtcpPackets incoming_rtcp_packets = 4; 21 repeated OutgoingRtcpPackets outgoing_rtcp_packets = 5; 22 repeated AudioPlayoutEvents audio_playout_events = 6; 23 repeated FrameDecodedEvents frame_decoded_events = 7; 24 // The field tags 8-15 are reserved for the most common events. 25 repeated BeginLogEvent begin_log_events = 16; 26 repeated EndLogEvent end_log_events = 17; 27 repeated LossBasedBweUpdates loss_based_bwe_updates = 18; 28 repeated DelayBasedBweUpdates delay_based_bwe_updates = 19; 29 repeated AudioNetworkAdaptations audio_network_adaptations = 20; 30 repeated BweProbeCluster probe_clusters = 21; 31 repeated BweProbeResultSuccess probe_success = 22; 32 repeated BweProbeResultFailure probe_failure = 23; 33 repeated AlrState alr_states = 24; 34 repeated IceCandidatePairConfig ice_candidate_configs = 25; 35 repeated IceCandidatePairEvent ice_candidate_events = 26; 36 repeated DtlsTransportStateEvent dtls_transport_state_events = 27; 37 repeated DtlsWritableState dtls_writable_states = 28; 38 repeated GenericPacketSent generic_packets_sent = 29; 39 repeated GenericPacketReceived generic_packets_received = 30; 40 repeated GenericAckReceived generic_acks_received = 31; 41 repeated RouteChange route_changes = 32; 42 repeated RemoteEstimates remote_estimates = 33; 43 44 repeated AudioRecvStreamConfig audio_recv_stream_configs = 101; 45 repeated AudioSendStreamConfig audio_send_stream_configs = 102; 46 repeated VideoRecvStreamConfig video_recv_stream_configs = 103; 47 repeated VideoSendStreamConfig video_send_stream_configs = 104; 48} 49 50// DEPRECATED. 51message Event { 52 // TODO(terelius): Do we want to preserve the old Event definition here? 53} 54 55message GenericPacketReceived { 56 // All fields are required. 57 optional int64 timestamp_ms = 1; 58 optional int64 packet_number = 2; 59 // Length of the packet in bytes. 60 optional int32 packet_length = 3; 61 62 // Provided if there are deltas in the batch. 63 optional uint32 number_of_deltas = 16; 64 optional bytes timestamp_ms_deltas = 17; 65 optional bytes packet_number_deltas = 18; 66 optional bytes packet_length_deltas = 19; 67} 68 69message GenericPacketSent { 70 // All fields are required. All lengths in bytes. 71 optional int64 timestamp_ms = 1; 72 optional int64 packet_number = 2; 73 // overhead+payload+padding length = packet_length in bytes. 74 optional int32 overhead_length = 3; 75 optional int32 payload_length = 4; 76 optional int32 padding_length = 5; 77 78 optional uint32 number_of_deltas = 16; 79 optional bytes timestamp_ms_deltas = 17; 80 optional bytes packet_number_deltas = 18; 81 optional bytes overhead_length_deltas = 19; 82 optional bytes payload_length_deltas = 20; 83 optional bytes padding_length_deltas = 21; 84} 85 86message GenericAckReceived { 87 optional int64 timestamp_ms = 1; 88 89 // ID of the received packet. 90 optional int64 packet_number = 2; 91 92 // ID of the packet that was acked. 93 optional int64 acked_packet_number = 3; 94 95 // Timestamp in ms when the packet was received by the other side. 96 optional int64 receive_acked_packet_time_ms = 4; 97 98 optional uint32 number_of_deltas = 16; 99 optional bytes timestamp_ms_deltas = 17; 100 optional bytes packet_number_deltas = 18; 101 optional bytes acked_packet_number_deltas = 19; 102 optional bytes receive_acked_packet_time_ms_deltas = 20; 103} 104 105message IncomingRtpPackets { 106 // required 107 optional int64 timestamp_ms = 1; 108 109 // required - RTP marker bit, used to label boundaries between video frames. 110 optional bool marker = 2; 111 112 // required - RTP payload type. 113 optional uint32 payload_type = 3; 114 115 // required - RTP sequence number. 116 optional uint32 sequence_number = 4; 117 118 // required - RTP monotonic clock timestamp (not actual time). 119 optional fixed32 rtp_timestamp = 5; 120 121 // required - Synchronization source of this packet's RTP stream. 122 optional fixed32 ssrc = 6; 123 124 // TODO(terelius/dinor): Add CSRCs. Field number 7 reserved for this purpose. 125 126 // required - The size (in bytes) of the media payload, not including 127 // RTP header or padding. The packet size is the sum of payload, header and 128 // padding. 129 optional uint32 payload_size = 8; 130 131 // required - The size (in bytes) of the RTP header. 132 optional uint32 header_size = 9; 133 134 // required - The size (in bytes) of the padding. 135 optional uint32 padding_size = 10; 136 137 // optional - required if the batch contains delta encoded events. 138 optional uint32 number_of_deltas = 11; 139 140 // Field numbers 12-14 reserved for future use. 141 142 // Optional header extensions. 143 optional uint32 transport_sequence_number = 15; 144 optional int32 transmission_time_offset = 16; 145 optional uint32 absolute_send_time = 17; 146 optional uint32 video_rotation = 18; 147 // `audio_level` and `voice_activity` are always used in conjunction. 148 optional uint32 audio_level = 19; 149 optional bool voice_activity = 20; 150 // TODO(terelius): Add other header extensions like playout delay? 151 152 // Delta encodings. 153 optional bytes timestamp_ms_deltas = 101; 154 optional bytes marker_deltas = 102; 155 optional bytes payload_type_deltas = 103; 156 optional bytes sequence_number_deltas = 104; 157 optional bytes rtp_timestamp_deltas = 105; 158 // Field number 107 reserved for CSRC. 159 optional bytes ssrc_deltas = 106; 160 optional bytes payload_size_deltas = 108; 161 optional bytes header_size_deltas = 109; 162 optional bytes padding_size_deltas = 110; 163 // Field number 111-114 reserved for future use. 164 optional bytes transport_sequence_number_deltas = 115; 165 optional bytes transmission_time_offset_deltas = 116; 166 optional bytes absolute_send_time_deltas = 117; 167 optional bytes video_rotation_deltas = 118; 168 // `audio_level` and `voice_activity` are always used in conjunction. 169 optional bytes audio_level_deltas = 119; 170 optional bytes voice_activity_deltas = 120; 171} 172 173message OutgoingRtpPackets { 174 // required 175 optional int64 timestamp_ms = 1; 176 177 // required - RTP marker bit, used to label boundaries between video frames. 178 optional bool marker = 2; 179 180 // required - RTP payload type. 181 optional uint32 payload_type = 3; 182 183 // required - RTP sequence number. 184 optional uint32 sequence_number = 4; 185 186 // required - RTP monotonic clock timestamp (not actual time). 187 optional fixed32 rtp_timestamp = 5; 188 189 // required - Synchronization source of this packet's RTP stream. 190 optional fixed32 ssrc = 6; 191 192 // TODO(terelius/dinor): Add CSRCs. Field number 7 reserved for this purpose. 193 194 // required - The size (in bytes) of the media payload, not including 195 // RTP header or padding. The packet size is the sum of payload, header and 196 // padding. 197 optional uint32 payload_size = 8; 198 199 // required - The size (in bytes) of the RTP header. 200 optional uint32 header_size = 9; 201 202 // required - The size (in bytes) of the padding. 203 optional uint32 padding_size = 10; 204 205 // optional - required if the batch contains delta encoded events. 206 optional uint32 number_of_deltas = 11; 207 208 // Field numbers 12-14 reserved for future use. 209 210 // Optional header extensions. 211 optional uint32 transport_sequence_number = 15; 212 optional int32 transmission_time_offset = 16; 213 optional uint32 absolute_send_time = 17; 214 optional uint32 video_rotation = 18; 215 // `audio_level` and `voice_activity` are always used in conjunction. 216 optional uint32 audio_level = 19; 217 optional bool voice_activity = 20; 218 // TODO(terelius): Add other header extensions like playout delay? 219 220 // Delta encodings. 221 optional bytes timestamp_ms_deltas = 101; 222 optional bytes marker_deltas = 102; 223 optional bytes payload_type_deltas = 103; 224 optional bytes sequence_number_deltas = 104; 225 optional bytes rtp_timestamp_deltas = 105; 226 optional bytes ssrc_deltas = 106; 227 // Field number 107 reserved for CSRC. 228 optional bytes payload_size_deltas = 108; 229 optional bytes header_size_deltas = 109; 230 optional bytes padding_size_deltas = 110; 231 // Field number 111-114 reserved for future use. 232 optional bytes transport_sequence_number_deltas = 115; 233 optional bytes transmission_time_offset_deltas = 116; 234 optional bytes absolute_send_time_deltas = 117; 235 optional bytes video_rotation_deltas = 118; 236 // `audio_level` and `voice_activity` are always used in conjunction. 237 optional bytes audio_level_deltas = 119; 238 optional bytes voice_activity_deltas = 120; 239} 240 241message IncomingRtcpPackets { 242 // required 243 optional int64 timestamp_ms = 1; 244 245 // required - The whole packet including both payload and header. 246 optional bytes raw_packet = 2; 247 // TODO(terelius): Feasible to log parsed RTCP instead? 248 249 // optional - required if the batch contains delta encoded events. 250 optional uint32 number_of_deltas = 3; 251 252 // Delta/blob encodings. 253 optional bytes timestamp_ms_deltas = 101; 254 optional bytes raw_packet_blobs = 102; 255} 256 257message OutgoingRtcpPackets { 258 // required 259 optional int64 timestamp_ms = 1; 260 261 // required - The whole packet including both payload and header. 262 optional bytes raw_packet = 2; 263 // TODO(terelius): Feasible to log parsed RTCP instead? 264 265 // optional - required if the batch contains delta encoded events. 266 optional uint32 number_of_deltas = 3; 267 268 // Delta/blob encodings. 269 optional bytes timestamp_ms_deltas = 101; 270 optional bytes raw_packet_blobs = 102; 271} 272 273message AudioPlayoutEvents { 274 // required 275 optional int64 timestamp_ms = 1; 276 277 // required - The SSRC of the audio stream associated with the playout event. 278 optional uint32 local_ssrc = 2; 279 280 // optional - required if the batch contains delta encoded events. 281 optional uint32 number_of_deltas = 3; 282 283 // Delta encodings. 284 optional bytes timestamp_ms_deltas = 101; 285 optional bytes local_ssrc_deltas = 102; 286} 287 288message FrameDecodedEvents { 289 enum Codec { 290 CODEC_UNKNOWN = 0; 291 CODEC_GENERIC = 1; 292 CODEC_VP8 = 2; 293 CODEC_VP9 = 3; 294 CODEC_AV1 = 4; 295 CODEC_H264 = 5; 296 } 297 298 // required 299 optional int64 timestamp_ms = 1; 300 301 // required - The SSRC of the video stream that the frame belongs to. 302 optional fixed32 ssrc = 2; 303 304 // required - The predicted render time of the frame. 305 optional int64 render_time_ms = 3; 306 307 // required - The width (in pixels) of the frame. 308 optional int32 width = 4; 309 310 // required - The height (in pixels) of the frame. 311 optional int32 height = 5; 312 313 // required - The codec type of the frame. 314 optional Codec codec = 6; 315 316 // required - The QP (quantization parameter) of the frame. Range [0,255]. 317 optional uint32 qp = 7; 318 319 // optional - required if the batch contains delta encoded events. 320 optional uint32 number_of_deltas = 15; 321 322 // Delta encodings. 323 optional bytes timestamp_ms_deltas = 101; 324 optional bytes ssrc_deltas = 102; 325 optional bytes render_time_ms_deltas = 103; 326 optional bytes width_deltas = 104; 327 optional bytes height_deltas = 105; 328 optional bytes codec_deltas = 106; 329 optional bytes qp_deltas = 107; 330} 331 332message BeginLogEvent { 333 // required 334 optional int64 timestamp_ms = 1; 335 336 // required 337 optional uint32 version = 2; 338 339 // required 340 optional int64 utc_time_ms = 3; 341} 342 343message EndLogEvent { 344 // required 345 optional int64 timestamp_ms = 1; 346} 347 348message LossBasedBweUpdates { 349 // required 350 optional int64 timestamp_ms = 1; 351 352 // TODO(terelius): Update log interface to unsigned. 353 // required - Bandwidth estimate (in bps) after the update. 354 optional uint32 bitrate_bps = 2; 355 356 // required - Fraction of lost packets since last receiver report 357 // computed as floor( 256 * (#lost_packets / #total_packets) ). 358 // The possible values range from 0 to 255. 359 optional uint32 fraction_loss = 3; 360 361 // TODO(terelius): Is this really needed? Remove or make optional? 362 // TODO(terelius): Update log interface to unsigned. 363 // required - Total number of packets that the BWE update is based on. 364 optional uint32 total_packets = 4; 365 366 // optional - required if the batch contains delta encoded events. 367 optional uint32 number_of_deltas = 5; 368 369 // Delta encodings. 370 optional bytes timestamp_ms_deltas = 101; 371 optional bytes bitrate_bps_deltas = 102; 372 optional bytes fraction_loss_deltas = 103; 373 optional bytes total_packets_deltas = 104; 374} 375 376message DelayBasedBweUpdates { 377 // required 378 optional int64 timestamp_ms = 1; 379 380 // required - Bandwidth estimate (in bps) after the update. 381 optional uint32 bitrate_bps = 2; 382 383 enum DetectorState { 384 BWE_UNKNOWN_STATE = 0; 385 BWE_NORMAL = 1; 386 BWE_UNDERUSING = 2; 387 BWE_OVERUSING = 3; 388 } 389 optional DetectorState detector_state = 3; 390 391 // optional - required if the batch contains delta encoded events. 392 optional uint32 number_of_deltas = 4; 393 394 // Delta encodings. 395 optional bytes timestamp_ms_deltas = 101; 396 optional bytes bitrate_bps_deltas = 102; 397 optional bytes detector_state_deltas = 103; 398} 399 400// Maps RTP header extension names to numerical IDs. 401message RtpHeaderExtensionConfig { 402 // Optional IDs for the header extensions. Each ID is a 4-bit number that is 403 // only set if that extension is configured. 404 // TODO: Can we skip audio level? 405 optional int32 transmission_time_offset_id = 1; 406 optional int32 absolute_send_time_id = 2; 407 optional int32 transport_sequence_number_id = 3; 408 optional int32 video_rotation_id = 4; 409 optional int32 audio_level_id = 5; 410 // TODO(terelius): Add other header extensions like playout delay? 411} 412 413message VideoRecvStreamConfig { 414 // required 415 optional int64 timestamp_ms = 1; 416 417 // required - Synchronization source (stream identifier) to be received. 418 optional uint32 remote_ssrc = 2; 419 420 // required - Sender SSRC used for sending RTCP (such as receiver reports). 421 optional uint32 local_ssrc = 3; 422 423 // optional - required if RTX is configured. SSRC for the RTX stream. 424 optional uint32 rtx_ssrc = 4; 425 426 // IDs for the header extension we care about. Only required if there are 427 // header extensions configured. 428 optional RtpHeaderExtensionConfig header_extensions = 5; 429 430 // TODO(terelius): Do we need codec-payload mapping? If so and rtx_ssrc is 431 // used, we also need a map between RTP payload type and RTX payload type. 432} 433 434message VideoSendStreamConfig { 435 // required 436 optional int64 timestamp_ms = 1; 437 438 // required - Synchronization source (stream identifier) for outgoing stream. 439 // When using simulcast, a separate config should be logged for each stream. 440 optional uint32 ssrc = 2; 441 442 // optional - required if RTX is configured. SSRC for the RTX stream. 443 optional uint32 rtx_ssrc = 3; 444 445 // IDs for the header extension we care about. Only required if there are 446 // header extensions configured. 447 optional RtpHeaderExtensionConfig header_extensions = 4; 448 449 // TODO(terelius): Do we need codec-payload mapping? If so and rtx_ssrc is 450 // used, we also need a map between RTP payload type and RTX payload type. 451} 452 453message AudioRecvStreamConfig { 454 // required 455 optional int64 timestamp_ms = 1; 456 457 // required - Synchronization source (stream identifier) to be received. 458 optional uint32 remote_ssrc = 2; 459 460 // required - Sender SSRC used for sending RTCP (such as receiver reports). 461 optional uint32 local_ssrc = 3; 462 463 // Field number 4 reserved for RTX SSRC. 464 465 // IDs for the header extension we care about. Only required if there are 466 // header extensions configured. 467 optional RtpHeaderExtensionConfig header_extensions = 5; 468 469 // TODO(terelius): Do we need codec-payload mapping? If so and rtx_ssrc is 470 // used, we also need a map between RTP payload type and RTX payload type. 471} 472 473message AudioSendStreamConfig { 474 // required 475 optional int64 timestamp_ms = 1; 476 477 // required - Synchronization source (stream identifier) for outgoing stream. 478 optional uint32 ssrc = 2; 479 480 // Field number 3 reserved for RTX SSRC. 481 482 // IDs for the header extension we care about. Only required if there are 483 // header extensions configured. 484 optional RtpHeaderExtensionConfig header_extensions = 4; 485 486 // TODO(terelius): Do we need codec-payload mapping? If so and rtx_ssrc is 487 // used, we also need a map between RTP payload type and RTX payload type. 488} 489 490message AudioNetworkAdaptations { 491 // required 492 optional int64 timestamp_ms = 1; 493 494 // Bit rate that the audio encoder is operating at. 495 // TODO(terelius): Signed vs unsigned? 496 optional int32 bitrate_bps = 2; 497 498 // Frame length that each encoded audio packet consists of. 499 // TODO(terelius): Signed vs unsigned? 500 optional int32 frame_length_ms = 3; 501 502 // Packet loss fraction that the encoder's forward error correction (FEC) is 503 // optimized for. 504 // Instead of encoding a float, we encode a value between 0 and 16383, which 505 // if divided by 16383, will give a value close to the original float. 506 // The value 16383 (2^14 - 1) was chosen so that it would give good precision 507 // on the one hand, and would be encodable with two bytes in varint form 508 // on the other hand. 509 optional uint32 uplink_packet_loss_fraction = 4; 510 511 // Whether forward error correction (FEC) is turned on or off. 512 optional bool enable_fec = 5; 513 514 // Whether discontinuous transmission (DTX) is turned on or off. 515 optional bool enable_dtx = 6; 516 517 // Number of audio channels that each encoded packet consists of. 518 optional uint32 num_channels = 7; 519 520 // optional - required if the batch contains delta encoded events. 521 optional uint32 number_of_deltas = 8; 522 523 // Delta encodings. 524 optional bytes timestamp_ms_deltas = 101; 525 optional bytes bitrate_bps_deltas = 102; 526 optional bytes frame_length_ms_deltas = 103; 527 optional bytes uplink_packet_loss_fraction_deltas = 104; 528 optional bytes enable_fec_deltas = 105; 529 optional bytes enable_dtx_deltas = 106; 530 optional bytes num_channels_deltas = 107; 531} 532 533message BweProbeCluster { 534 // required 535 optional int64 timestamp_ms = 1; 536 537 // required - The id of this probe cluster. 538 optional uint32 id = 2; 539 540 // required - The bitrate in bps that this probe cluster is meant to probe. 541 optional uint32 bitrate_bps = 3; 542 543 // required - The minimum number of packets used to probe the given bitrate. 544 optional uint32 min_packets = 4; 545 546 // required - The minimum number of bytes used to probe the given bitrate. 547 optional uint32 min_bytes = 5; 548} 549 550message BweProbeResultSuccess { 551 // required 552 optional int64 timestamp_ms = 1; 553 554 // required - The id of this probe cluster. 555 optional uint32 id = 2; 556 557 // required - The resulting bitrate in bps. 558 optional uint32 bitrate_bps = 3; 559} 560 561message BweProbeResultFailure { 562 // required 563 optional int64 timestamp_ms = 1; 564 565 // required - The id of this probe cluster. 566 optional uint32 id = 2; 567 568 enum FailureReason { 569 UNKNOWN = 0; 570 INVALID_SEND_RECEIVE_INTERVAL = 1; 571 INVALID_SEND_RECEIVE_RATIO = 2; 572 TIMEOUT = 3; 573 } 574 575 // required 576 optional FailureReason failure = 3; 577} 578 579message AlrState { 580 // required 581 optional int64 timestamp_ms = 1; 582 583 // required - True if the send rate is application limited. 584 optional bool in_alr = 2; 585} 586 587message IceCandidatePairConfig { 588 enum IceCandidatePairConfigType { 589 UNKNOWN_CONFIG_TYPE = 0; 590 ADDED = 1; 591 UPDATED = 2; 592 DESTROYED = 3; 593 SELECTED = 4; 594 } 595 596 enum IceCandidateType { 597 UNKNOWN_CANDIDATE_TYPE = 0; 598 LOCAL = 1; 599 STUN = 2; 600 PRFLX = 3; 601 RELAY = 4; 602 } 603 604 enum Protocol { 605 UNKNOWN_PROTOCOL = 0; 606 UDP = 1; 607 TCP = 2; 608 SSLTCP = 3; 609 TLS = 4; 610 } 611 612 enum AddressFamily { 613 UNKNOWN_ADDRESS_FAMILY = 0; 614 IPV4 = 1; 615 IPV6 = 2; 616 } 617 618 enum NetworkType { 619 UNKNOWN_NETWORK_TYPE = 0; 620 ETHERNET = 1; 621 WIFI = 2; 622 CELLULAR = 3; 623 VPN = 4; 624 LOOPBACK = 5; 625 } 626 627 // required 628 optional int64 timestamp_ms = 1; 629 630 // required 631 optional IceCandidatePairConfigType config_type = 2; 632 633 // required 634 optional uint32 candidate_pair_id = 3; 635 636 // required 637 optional IceCandidateType local_candidate_type = 4; 638 639 // required 640 optional Protocol local_relay_protocol = 5; 641 642 // required 643 optional NetworkType local_network_type = 6; 644 645 // required 646 optional AddressFamily local_address_family = 7; 647 648 // required 649 optional IceCandidateType remote_candidate_type = 8; 650 651 // required 652 optional AddressFamily remote_address_family = 9; 653 654 // required 655 optional Protocol candidate_pair_protocol = 10; 656} 657 658message IceCandidatePairEvent { 659 enum IceCandidatePairEventType { 660 UNKNOWN_CHECK_TYPE = 0; 661 CHECK_SENT = 1; 662 CHECK_RECEIVED = 2; 663 CHECK_RESPONSE_SENT = 3; 664 CHECK_RESPONSE_RECEIVED = 4; 665 } 666 667 // required 668 optional int64 timestamp_ms = 1; 669 670 // required 671 optional IceCandidatePairEventType event_type = 2; 672 673 // required 674 optional uint32 candidate_pair_id = 3; 675 676 // required 677 optional uint32 transaction_id = 4; 678} 679 680message DtlsTransportStateEvent { 681 enum DtlsTransportState { 682 UNKNOWN_DTLS_TRANSPORT_STATE = 0; 683 DTLS_TRANSPORT_NEW = 1; 684 DTLS_TRANSPORT_CONNECTING = 2; 685 DTLS_TRANSPORT_CONNECTED = 3; 686 DTLS_TRANSPORT_CLOSED = 4; 687 DTLS_TRANSPORT_FAILED = 5; 688 } 689 690 // required 691 optional int64 timestamp_ms = 1; 692 693 // required 694 optional DtlsTransportState dtls_transport_state = 2; 695} 696 697message DtlsWritableState { 698 // required 699 optional int64 timestamp_ms = 1; 700 701 // required 702 optional bool writable = 2; 703} 704 705message RouteChange { 706 // required 707 optional int64 timestamp_ms = 1; 708 // required - True if the route is ready for sending packets. 709 optional bool connected = 2; 710 // required - The per packet data overhead for this route. 711 optional uint32 overhead = 3; 712} 713 714message RemoteEstimates { 715 // required 716 optional int64 timestamp_ms = 1; 717 // optional - value used as a safe measure of available capacity. 718 optional uint32 link_capacity_lower_kbps = 2; 719 // optional - value used as limit for increasing bitrate. 720 optional uint32 link_capacity_upper_kbps = 3; 721 722 // optional - required if the batch contains delta encoded events. 723 optional uint32 number_of_deltas = 4; 724 725 // Delta encodings. 726 optional bytes timestamp_ms_deltas = 101; 727 optional bytes link_capacity_lower_kbps_deltas = 102; 728 optional bytes link_capacity_upper_kbps_deltas = 103; 729} 730