digraph {
rankdir=LR;
node [shape=plaintext];
subgraph cluster__rtcp_payload {
label="RtcpPayload";
graph[style=dotted];
rtcp_payload__seq [label=<
pos | size | type | id |
0 | ... | RtcpPacket | rtcp_packets |
repeat to end of stream |
>];
subgraph cluster__psfb_afb_remb_packet {
label="RtcpPayload::PsfbAfbRembPacket";
graph[style=dotted];
psfb_afb_remb_packet__seq [label=<
pos | size | type | id |
0 | 1 | u1 | num_ssrc |
1 | 6b | b6 | br_exp |
1:6 | 18b | b18 | br_mantissa |
4 | 4 | u4be | ssrc_list |
repeat num_ssrc times |
>];
psfb_afb_remb_packet__inst__max_total_bitrate [label=<
id | value |
max_total_bitrate | (br_mantissa * (1 << br_exp)) |
>];
}
subgraph cluster__sr_packet {
label="RtcpPayload::SrPacket";
graph[style=dotted];
sr_packet__seq [label=<
pos | size | type | id |
0 | 4 | u4be | ssrc |
4 | 4 | u4be | ntp_msw |
8 | 4 | u4be | ntp_lsw |
12 | 4 | u4be | rtp_timestamp |
16 | 4 | u4be | sender_packet_count |
20 | 4 | u4be | sender_octet_count |
24 | 21 | ReportBlock | report_block |
repeat _parent.subtype times |
>];
sr_packet__inst__ntp [label=<
id | value |
ntp | ((ntp_msw << 32) & ntp_lsw) |
>];
}
subgraph cluster__rr_packet {
label="RtcpPayload::RrPacket";
graph[style=dotted];
rr_packet__seq [label=<
pos | size | type | id |
0 | 4 | u4be | ssrc |
4 | 21 | ReportBlock | report_block |
repeat _parent.subtype times |
>];
}
subgraph cluster__rtcp_packet {
label="RtcpPayload::RtcpPacket";
graph[style=dotted];
rtcp_packet__seq [label=<
pos | size | type | id |
0 | 2b | b2 | version |
0:2 | 1b | BitsType1(BigBitEndian) | padding |
0:3 | 5b | b5 | subtype |
1 | 1 | u1→PayloadType | payload_type |
2 | 2 | u2be | length |
4 | ... | switch (payload_type) | body |
>];
rtcp_packet__seq_body_switch [label=<
case | type |
:payload_type_sr | SrPacket |
:payload_type_psfb | PsfbPacket |
:payload_type_rr | RrPacket |
:payload_type_rtpfb | RtpfbPacket |
:payload_type_sdes | SdesPacket |
>];
}
subgraph cluster__sdes_tlv {
label="RtcpPayload::SdesTlv";
graph[style=dotted];
sdes_tlv__seq [label=<
pos | size | type | id |
0 | 1 | u1→SdesSubtype | type |
1 | 1 | u1 | length |
2 | length | | value |
>];
}
subgraph cluster__report_block {
label="RtcpPayload::ReportBlock";
graph[style=dotted];
report_block__seq [label=<
pos | size | type | id |
0 | 4 | u4be | ssrc_source |
4 | 1 | u1 | lost_val |
5 | 4 | u4be | highest_seq_num_received |
9 | 4 | u4be | interarrival_jitter |
13 | 4 | u4be | lsr |
17 | 4 | u4be | dlsr |
>];
report_block__inst__fraction_lost [label=<
id | value |
fraction_lost | (lost_val >> 24) |
>];
report_block__inst__cumulative_packets_lost [label=<
id | value |
cumulative_packets_lost | (lost_val & 16777215) |
>];
}
subgraph cluster__rtpfb_transport_feedback_packet {
label="RtcpPayload::RtpfbTransportFeedbackPacket";
graph[style=dotted];
rtpfb_transport_feedback_packet__seq [label=<
pos | size | type | id |
0 | 2 | u2be | base_sequence_number |
2 | 2 | u2be | packet_status_count |
4 | 4 | u4be | b4 |
8 | ⇲ | | remaining |
>];
rtpfb_transport_feedback_packet__inst__reference_time [label=<
id | value |
reference_time | (b4 >> 8) |
>];
rtpfb_transport_feedback_packet__inst__fb_pkt_count [label=<
id | value |
fb_pkt_count | (b4 & 255) |
>];
rtpfb_transport_feedback_packet__inst__packet_status [label=<
pos | size | type | id |
... | 0 | | packet_status |
>];
rtpfb_transport_feedback_packet__inst__recv_delta [label=<
pos | size | type | id |
... | 0 | | recv_delta |
>];
}
subgraph cluster__psfb_packet {
label="RtcpPayload::PsfbPacket";
graph[style=dotted];
psfb_packet__seq [label=<
pos | size | type | id |
0 | 4 | u4be | ssrc |
4 | 4 | u4be | ssrc_media_source |
8 | ... | switch (fmt) | fci_block |
>];
psfb_packet__inst__fmt [label=<
id | value |
fmt | Kaitai::Struct::Stream::resolve_enum(RtcpPayload::PSFB_SUBTYPE, _parent.subtype) |
>];
psfb_packet__seq_fci_block_switch [label=<
case | type |
:psfb_subtype_afb | PsfbAfbPacket |
>];
}
subgraph cluster__source_chunk {
label="RtcpPayload::SourceChunk";
graph[style=dotted];
source_chunk__seq [label=<
pos | size | type | id |
0 | 4 | u4be | ssrc |
4 | ... | SdesTlv | sdes_tlv |
repeat to end of stream |
>];
}
subgraph cluster__sdes_packet {
label="RtcpPayload::SdesPacket";
graph[style=dotted];
sdes_packet__seq [label=<
pos | size | type | id |
0 | ... | SourceChunk | source_chunk |
repeat source_count times |
>];
sdes_packet__inst__source_count [label=<
id | value |
source_count | _parent.subtype |
>];
}
subgraph cluster__rtpfb_packet {
label="RtcpPayload::RtpfbPacket";
graph[style=dotted];
rtpfb_packet__seq [label=<
pos | size | type | id |
0 | 4 | u4be | ssrc |
4 | 4 | u4be | ssrc_media_source |
8 | ... | switch (fmt) | fci_block |
>];
rtpfb_packet__inst__fmt [label=<
id | value |
fmt | Kaitai::Struct::Stream::resolve_enum(RtcpPayload::RTPFB_SUBTYPE, _parent.subtype) |
>];
rtpfb_packet__seq_fci_block_switch [label=<
case | type |
:rtpfb_subtype_transport_feedback | RtpfbTransportFeedbackPacket |
>];
}
subgraph cluster__packet_status_chunk {
label="RtcpPayload::PacketStatusChunk";
graph[style=dotted];
packet_status_chunk__seq [label=<
pos | size | type | id |
0 | 1b | BitsType1(BigBitEndian) | t |
0:1 | 2b | b2 | s2 |
0:3 | 1b | BitsType1(BigBitEndian) | s1 |
0:4 | 13b | b13 | rle |
2:1 | 14b | b14 | symbol_list |
>];
packet_status_chunk__inst__s [label=<
id | value |
s | ((t ? 1 : 0) == 0 ? s2 : ((s1 ? 1 : 0) == 0 ? 1 : 0)) |
>];
}
subgraph cluster__psfb_afb_packet {
label="RtcpPayload::PsfbAfbPacket";
graph[style=dotted];
psfb_afb_packet__seq [label=<
pos | size | type | id |
0 | 4 | u4be | uid |
4 | ... | switch (uid) | contents |
>];
psfb_afb_packet__seq_contents_switch [label=<
case | type |
1380273474 | PsfbAfbRembPacket |
>];
}
}
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"];
}