RTCP is the Real-Time Control Protocol
This page hosts a formal specification of rtcp network payload (single udp packet) using Kaitai Struct. This specification can be automatically translated into a variety of programming languages to get a parsing library.
digraph {
rankdir=LR;
node [shape=plaintext];
subgraph cluster__rtcp_payload {
label="RtcpPayload";
graph[style=dotted];
rtcp_payload__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
<TR><TD PORT="rtcp_packets_pos">0</TD><TD PORT="rtcp_packets_size">...</TD><TD>RtcpPacket</TD><TD PORT="rtcp_packets_type">rtcp_packets</TD></TR>
<TR><TD COLSPAN="4" PORT="rtcp_packets__repeat">repeat to end of stream</TD></TR>
</TABLE>>];
subgraph cluster__psfb_afb_remb_packet {
label="RtcpPayload::PsfbAfbRembPacket";
graph[style=dotted];
psfb_afb_remb_packet__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
<TR><TD PORT="num_ssrc_pos">0</TD><TD PORT="num_ssrc_size">1</TD><TD>u1</TD><TD PORT="num_ssrc_type">num_ssrc</TD></TR>
<TR><TD PORT="br_exp_pos">1</TD><TD PORT="br_exp_size">6b</TD><TD>b6</TD><TD PORT="br_exp_type">br_exp</TD></TR>
<TR><TD PORT="br_mantissa_pos">1:6</TD><TD PORT="br_mantissa_size">18b</TD><TD>b18</TD><TD PORT="br_mantissa_type">br_mantissa</TD></TR>
<TR><TD PORT="ssrc_list_pos">4</TD><TD PORT="ssrc_list_size">4</TD><TD>u4be</TD><TD PORT="ssrc_list_type">ssrc_list</TD></TR>
<TR><TD COLSPAN="4" PORT="ssrc_list__repeat">repeat num_ssrc times</TD></TR>
</TABLE>>];
psfb_afb_remb_packet__inst__max_total_bitrate [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
<TR><TD>max_total_bitrate</TD><TD>(br_mantissa * (1 << br_exp))</TD></TR>
</TABLE>>];
}
subgraph cluster__sr_packet {
label="RtcpPayload::SrPacket";
graph[style=dotted];
sr_packet__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
<TR><TD PORT="ssrc_pos">0</TD><TD PORT="ssrc_size">4</TD><TD>u4be</TD><TD PORT="ssrc_type">ssrc</TD></TR>
<TR><TD PORT="ntp_msw_pos">4</TD><TD PORT="ntp_msw_size">4</TD><TD>u4be</TD><TD PORT="ntp_msw_type">ntp_msw</TD></TR>
<TR><TD PORT="ntp_lsw_pos">8</TD><TD PORT="ntp_lsw_size">4</TD><TD>u4be</TD><TD PORT="ntp_lsw_type">ntp_lsw</TD></TR>
<TR><TD PORT="rtp_timestamp_pos">12</TD><TD PORT="rtp_timestamp_size">4</TD><TD>u4be</TD><TD PORT="rtp_timestamp_type">rtp_timestamp</TD></TR>
<TR><TD PORT="sender_packet_count_pos">16</TD><TD PORT="sender_packet_count_size">4</TD><TD>u4be</TD><TD PORT="sender_packet_count_type">sender_packet_count</TD></TR>
<TR><TD PORT="sender_octet_count_pos">20</TD><TD PORT="sender_octet_count_size">4</TD><TD>u4be</TD><TD PORT="sender_octet_count_type">sender_octet_count</TD></TR>
<TR><TD PORT="report_block_pos">24</TD><TD PORT="report_block_size">21</TD><TD>ReportBlock</TD><TD PORT="report_block_type">report_block</TD></TR>
<TR><TD COLSPAN="4" PORT="report_block__repeat">repeat _parent.subtype times</TD></TR>
</TABLE>>];
sr_packet__inst__ntp [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
<TR><TD>ntp</TD><TD>((ntp_msw << 32) & ntp_lsw)</TD></TR>
</TABLE>>];
}
subgraph cluster__rr_packet {
label="RtcpPayload::RrPacket";
graph[style=dotted];
rr_packet__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
<TR><TD PORT="ssrc_pos">0</TD><TD PORT="ssrc_size">4</TD><TD>u4be</TD><TD PORT="ssrc_type">ssrc</TD></TR>
<TR><TD PORT="report_block_pos">4</TD><TD PORT="report_block_size">21</TD><TD>ReportBlock</TD><TD PORT="report_block_type">report_block</TD></TR>
<TR><TD COLSPAN="4" PORT="report_block__repeat">repeat _parent.subtype times</TD></TR>
</TABLE>>];
}
subgraph cluster__rtcp_packet {
label="RtcpPayload::RtcpPacket";
graph[style=dotted];
rtcp_packet__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
<TR><TD PORT="version_pos">0</TD><TD PORT="version_size">2b</TD><TD>b2</TD><TD PORT="version_type">version</TD></TR>
<TR><TD PORT="padding_pos">0:2</TD><TD PORT="padding_size">1b</TD><TD>BitsType1(BigBitEndian)</TD><TD PORT="padding_type">padding</TD></TR>
<TR><TD PORT="subtype_pos">0:3</TD><TD PORT="subtype_size">5b</TD><TD>b5</TD><TD PORT="subtype_type">subtype</TD></TR>
<TR><TD PORT="payload_type_pos">1</TD><TD PORT="payload_type_size">1</TD><TD>u1→PayloadType</TD><TD PORT="payload_type_type">payload_type</TD></TR>
<TR><TD PORT="length_pos">2</TD><TD PORT="length_size">2</TD><TD>u2be</TD><TD PORT="length_type">length</TD></TR>
<TR><TD PORT="body_pos">4</TD><TD PORT="body_size">...</TD><TD>switch (payload_type)</TD><TD PORT="body_type">body</TD></TR>
</TABLE>>];
rtcp_packet__seq_body_switch [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#F0F2E4">case</TD><TD BGCOLOR="#F0F2E4">type</TD></TR>
<TR><TD>:payload_type_sr</TD><TD PORT="case0">SrPacket</TD></TR>
<TR><TD>:payload_type_psfb</TD><TD PORT="case1">PsfbPacket</TD></TR>
<TR><TD>:payload_type_rr</TD><TD PORT="case2">RrPacket</TD></TR>
<TR><TD>:payload_type_rtpfb</TD><TD PORT="case3">RtpfbPacket</TD></TR>
<TR><TD>:payload_type_sdes</TD><TD PORT="case4">SdesPacket</TD></TR>
</TABLE>>];
}
subgraph cluster__sdes_tlv {
label="RtcpPayload::SdesTlv";
graph[style=dotted];
sdes_tlv__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
<TR><TD PORT="type_pos">0</TD><TD PORT="type_size">1</TD><TD>u1→SdesSubtype</TD><TD PORT="type_type">type</TD></TR>
<TR><TD PORT="length_pos">1</TD><TD PORT="length_size">1</TD><TD>u1</TD><TD PORT="length_type">length</TD></TR>
<TR><TD PORT="value_pos">2</TD><TD PORT="value_size">length</TD><TD></TD><TD PORT="value_type">value</TD></TR>
</TABLE>>];
}
subgraph cluster__report_block {
label="RtcpPayload::ReportBlock";
graph[style=dotted];
report_block__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
<TR><TD PORT="ssrc_source_pos">0</TD><TD PORT="ssrc_source_size">4</TD><TD>u4be</TD><TD PORT="ssrc_source_type">ssrc_source</TD></TR>
<TR><TD PORT="lost_val_pos">4</TD><TD PORT="lost_val_size">1</TD><TD>u1</TD><TD PORT="lost_val_type">lost_val</TD></TR>
<TR><TD PORT="highest_seq_num_received_pos">5</TD><TD PORT="highest_seq_num_received_size">4</TD><TD>u4be</TD><TD PORT="highest_seq_num_received_type">highest_seq_num_received</TD></TR>
<TR><TD PORT="interarrival_jitter_pos">9</TD><TD PORT="interarrival_jitter_size">4</TD><TD>u4be</TD><TD PORT="interarrival_jitter_type">interarrival_jitter</TD></TR>
<TR><TD PORT="lsr_pos">13</TD><TD PORT="lsr_size">4</TD><TD>u4be</TD><TD PORT="lsr_type">lsr</TD></TR>
<TR><TD PORT="dlsr_pos">17</TD><TD PORT="dlsr_size">4</TD><TD>u4be</TD><TD PORT="dlsr_type">dlsr</TD></TR>
</TABLE>>];
report_block__inst__fraction_lost [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
<TR><TD>fraction_lost</TD><TD>(lost_val >> 24)</TD></TR>
</TABLE>>];
report_block__inst__cumulative_packets_lost [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
<TR><TD>cumulative_packets_lost</TD><TD>(lost_val & 16777215)</TD></TR>
</TABLE>>];
}
subgraph cluster__rtpfb_transport_feedback_packet {
label="RtcpPayload::RtpfbTransportFeedbackPacket";
graph[style=dotted];
rtpfb_transport_feedback_packet__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
<TR><TD PORT="base_sequence_number_pos">0</TD><TD PORT="base_sequence_number_size">2</TD><TD>u2be</TD><TD PORT="base_sequence_number_type">base_sequence_number</TD></TR>
<TR><TD PORT="packet_status_count_pos">2</TD><TD PORT="packet_status_count_size">2</TD><TD>u2be</TD><TD PORT="packet_status_count_type">packet_status_count</TD></TR>
<TR><TD PORT="b4_pos">4</TD><TD PORT="b4_size">4</TD><TD>u4be</TD><TD PORT="b4_type">b4</TD></TR>
<TR><TD PORT="remaining_pos">8</TD><TD PORT="remaining_size">⇲</TD><TD></TD><TD PORT="remaining_type">remaining</TD></TR>
</TABLE>>];
rtpfb_transport_feedback_packet__inst__reference_time [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
<TR><TD>reference_time</TD><TD>(b4 >> 8)</TD></TR>
</TABLE>>];
rtpfb_transport_feedback_packet__inst__fb_pkt_count [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
<TR><TD>fb_pkt_count</TD><TD>(b4 & 255)</TD></TR>
</TABLE>>];
rtpfb_transport_feedback_packet__inst__packet_status [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
<TR><TD PORT="packet_status_pos">...</TD><TD PORT="packet_status_size">0</TD><TD></TD><TD PORT="packet_status_type">packet_status</TD></TR>
</TABLE>>];
rtpfb_transport_feedback_packet__inst__recv_delta [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
<TR><TD PORT="recv_delta_pos">...</TD><TD PORT="recv_delta_size">0</TD><TD></TD><TD PORT="recv_delta_type">recv_delta</TD></TR>
</TABLE>>];
}
subgraph cluster__psfb_packet {
label="RtcpPayload::PsfbPacket";
graph[style=dotted];
psfb_packet__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
<TR><TD PORT="ssrc_pos">0</TD><TD PORT="ssrc_size">4</TD><TD>u4be</TD><TD PORT="ssrc_type">ssrc</TD></TR>
<TR><TD PORT="ssrc_media_source_pos">4</TD><TD PORT="ssrc_media_source_size">4</TD><TD>u4be</TD><TD PORT="ssrc_media_source_type">ssrc_media_source</TD></TR>
<TR><TD PORT="fci_block_pos">8</TD><TD PORT="fci_block_size">...</TD><TD>switch (fmt)</TD><TD PORT="fci_block_type">fci_block</TD></TR>
</TABLE>>];
psfb_packet__inst__fmt [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
<TR><TD>fmt</TD><TD>Kaitai::Struct::Stream::resolve_enum(RtcpPayload::PSFB_SUBTYPE, _parent.subtype)</TD></TR>
</TABLE>>];
psfb_packet__seq_fci_block_switch [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#F0F2E4">case</TD><TD BGCOLOR="#F0F2E4">type</TD></TR>
<TR><TD>:psfb_subtype_afb</TD><TD PORT="case0">PsfbAfbPacket</TD></TR>
</TABLE>>];
}
subgraph cluster__source_chunk {
label="RtcpPayload::SourceChunk";
graph[style=dotted];
source_chunk__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
<TR><TD PORT="ssrc_pos">0</TD><TD PORT="ssrc_size">4</TD><TD>u4be</TD><TD PORT="ssrc_type">ssrc</TD></TR>
<TR><TD PORT="sdes_tlv_pos">4</TD><TD PORT="sdes_tlv_size">...</TD><TD>SdesTlv</TD><TD PORT="sdes_tlv_type">sdes_tlv</TD></TR>
<TR><TD COLSPAN="4" PORT="sdes_tlv__repeat">repeat to end of stream</TD></TR>
</TABLE>>];
}
subgraph cluster__sdes_packet {
label="RtcpPayload::SdesPacket";
graph[style=dotted];
sdes_packet__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
<TR><TD PORT="source_chunk_pos">0</TD><TD PORT="source_chunk_size">...</TD><TD>SourceChunk</TD><TD PORT="source_chunk_type">source_chunk</TD></TR>
<TR><TD COLSPAN="4" PORT="source_chunk__repeat">repeat source_count times</TD></TR>
</TABLE>>];
sdes_packet__inst__source_count [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
<TR><TD>source_count</TD><TD>_parent.subtype</TD></TR>
</TABLE>>];
}
subgraph cluster__rtpfb_packet {
label="RtcpPayload::RtpfbPacket";
graph[style=dotted];
rtpfb_packet__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
<TR><TD PORT="ssrc_pos">0</TD><TD PORT="ssrc_size">4</TD><TD>u4be</TD><TD PORT="ssrc_type">ssrc</TD></TR>
<TR><TD PORT="ssrc_media_source_pos">4</TD><TD PORT="ssrc_media_source_size">4</TD><TD>u4be</TD><TD PORT="ssrc_media_source_type">ssrc_media_source</TD></TR>
<TR><TD PORT="fci_block_pos">8</TD><TD PORT="fci_block_size">...</TD><TD>switch (fmt)</TD><TD PORT="fci_block_type">fci_block</TD></TR>
</TABLE>>];
rtpfb_packet__inst__fmt [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
<TR><TD>fmt</TD><TD>Kaitai::Struct::Stream::resolve_enum(RtcpPayload::RTPFB_SUBTYPE, _parent.subtype)</TD></TR>
</TABLE>>];
rtpfb_packet__seq_fci_block_switch [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#F0F2E4">case</TD><TD BGCOLOR="#F0F2E4">type</TD></TR>
<TR><TD>:rtpfb_subtype_transport_feedback</TD><TD PORT="case0">RtpfbTransportFeedbackPacket</TD></TR>
</TABLE>>];
}
subgraph cluster__packet_status_chunk {
label="RtcpPayload::PacketStatusChunk";
graph[style=dotted];
packet_status_chunk__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
<TR><TD PORT="t_pos">0</TD><TD PORT="t_size">1b</TD><TD>BitsType1(BigBitEndian)</TD><TD PORT="t_type">t</TD></TR>
<TR><TD PORT="s2_pos">0:1</TD><TD PORT="s2_size">2b</TD><TD>b2</TD><TD PORT="s2_type">s2</TD></TR>
<TR><TD PORT="s1_pos">0:3</TD><TD PORT="s1_size">1b</TD><TD>BitsType1(BigBitEndian)</TD><TD PORT="s1_type">s1</TD></TR>
<TR><TD PORT="rle_pos">0:4</TD><TD PORT="rle_size">13b</TD><TD>b13</TD><TD PORT="rle_type">rle</TD></TR>
<TR><TD PORT="symbol_list_pos">2:1</TD><TD PORT="symbol_list_size">14b</TD><TD>b14</TD><TD PORT="symbol_list_type">symbol_list</TD></TR>
</TABLE>>];
packet_status_chunk__inst__s [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">id</TD><TD BGCOLOR="#E0FFE0">value</TD></TR>
<TR><TD>s</TD><TD>((t ? 1 : 0) == 0 ? s2 : ((s1 ? 1 : 0) == 0 ? 1 : 0))</TD></TR>
</TABLE>>];
}
subgraph cluster__psfb_afb_packet {
label="RtcpPayload::PsfbAfbPacket";
graph[style=dotted];
psfb_afb_packet__seq [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#E0FFE0">pos</TD><TD BGCOLOR="#E0FFE0">size</TD><TD BGCOLOR="#E0FFE0">type</TD><TD BGCOLOR="#E0FFE0">id</TD></TR>
<TR><TD PORT="uid_pos">0</TD><TD PORT="uid_size">4</TD><TD>u4be</TD><TD PORT="uid_type">uid</TD></TR>
<TR><TD PORT="contents_pos">4</TD><TD PORT="contents_size">...</TD><TD>switch (uid)</TD><TD PORT="contents_type">contents</TD></TR>
</TABLE>>];
psfb_afb_packet__seq_contents_switch [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0">
<TR><TD BGCOLOR="#F0F2E4">case</TD><TD BGCOLOR="#F0F2E4">type</TD></TR>
<TR><TD>1380273474</TD><TD PORT="case0">PsfbAfbRembPacket</TD></TR>
</TABLE>>];
}
}
rtcp_payload__seq:rtcp_packets_type -> rtcp_packet__seq [style=bold];
psfb_afb_remb_packet__seq:num_ssrc_type -> psfb_afb_remb_packet__seq:ssrc_list__repeat [color="#404040"];
psfb_afb_remb_packet__seq:br_mantissa_type -> psfb_afb_remb_packet__inst__max_total_bitrate [color="#404040"];
psfb_afb_remb_packet__seq:br_exp_type -> psfb_afb_remb_packet__inst__max_total_bitrate [color="#404040"];
sr_packet__seq:report_block_type -> report_block__seq [style=bold];
rtcp_packet__seq:subtype_type -> sr_packet__seq:report_block__repeat [color="#404040"];
sr_packet__seq:ntp_msw_type -> sr_packet__inst__ntp [color="#404040"];
sr_packet__seq:ntp_lsw_type -> sr_packet__inst__ntp [color="#404040"];
rr_packet__seq:report_block_type -> report_block__seq [style=bold];
rtcp_packet__seq:subtype_type -> rr_packet__seq:report_block__repeat [color="#404040"];
rtcp_packet__seq:body_type -> rtcp_packet__seq_body_switch [style=bold];
rtcp_packet__seq_body_switch:case0 -> sr_packet__seq [style=bold];
rtcp_packet__seq_body_switch:case1 -> psfb_packet__seq [style=bold];
rtcp_packet__seq_body_switch:case2 -> rr_packet__seq [style=bold];
rtcp_packet__seq_body_switch:case3 -> rtpfb_packet__seq [style=bold];
rtcp_packet__seq_body_switch:case4 -> sdes_packet__seq [style=bold];
rtcp_packet__seq:payload_type_type -> rtcp_packet__seq:body_type [color="#404040"];
sdes_tlv__seq:length_type -> sdes_tlv__seq:value_size [color="#404040"];
report_block__seq:lost_val_type -> report_block__inst__fraction_lost [color="#404040"];
report_block__seq:lost_val_type -> report_block__inst__cumulative_packets_lost [color="#404040"];
rtpfb_transport_feedback_packet__seq:b4_type -> rtpfb_transport_feedback_packet__inst__reference_time [color="#404040"];
rtpfb_transport_feedback_packet__seq:b4_type -> rtpfb_transport_feedback_packet__inst__fb_pkt_count [color="#404040"];
psfb_packet__seq:fci_block_type -> psfb_packet__seq_fci_block_switch [style=bold];
psfb_packet__seq_fci_block_switch:case0 -> psfb_afb_packet__seq [style=bold];
psfb_packet__inst__fmt:fmt_type -> psfb_packet__seq:fci_block_type [color="#404040"];
rtcp_packet__seq:subtype_type -> psfb_packet__inst__fmt [color="#404040"];
source_chunk__seq:sdes_tlv_type -> sdes_tlv__seq [style=bold];
sdes_packet__seq:source_chunk_type -> source_chunk__seq [style=bold];
sdes_packet__inst__source_count:source_count_type -> sdes_packet__seq:source_chunk__repeat [color="#404040"];
rtcp_packet__seq:subtype_type -> sdes_packet__inst__source_count [color="#404040"];
rtpfb_packet__seq:fci_block_type -> rtpfb_packet__seq_fci_block_switch [style=bold];
rtpfb_packet__seq_fci_block_switch:case0 -> rtpfb_transport_feedback_packet__seq [style=bold];
rtpfb_packet__inst__fmt:fmt_type -> rtpfb_packet__seq:fci_block_type [color="#404040"];
rtcp_packet__seq:subtype_type -> rtpfb_packet__inst__fmt [color="#404040"];
packet_status_chunk__seq:t_type -> packet_status_chunk__inst__s [color="#404040"];
packet_status_chunk__seq:s2_type -> packet_status_chunk__inst__s [color="#404040"];
packet_status_chunk__seq:s1_type -> packet_status_chunk__inst__s [color="#404040"];
psfb_afb_packet__seq:contents_type -> psfb_afb_packet__seq_contents_switch [style=bold];
psfb_afb_packet__seq_contents_switch:case0 -> psfb_afb_remb_packet__seq [style=bold];
psfb_afb_packet__seq:uid_type -> psfb_afb_packet__seq:contents_type [color="#404040"];
}