digraph {
rankdir=LR;
node [shape=plaintext];
subgraph cluster__id3v2_4 {
label="Id3v24";
graph[style=dotted];
id3v2_4__seq [label=<
>];
subgraph cluster__u1be_synchsafe {
label="Id3v24::U1beSynchsafe";
graph[style=dotted];
u1be_synchsafe__seq [label=<
pos | size | type | id |
0 | 1b | BitsType1(BigBitEndian) | padding |
0:1 | 7b | b7 | value |
>];
}
subgraph cluster__u2be_synchsafe {
label="Id3v24::U2beSynchsafe";
graph[style=dotted];
u2be_synchsafe__seq [label=<
pos | size | type | id |
0 | 1 | U1beSynchsafe | byte0 |
1 | 1 | U1beSynchsafe | byte1 |
>];
u2be_synchsafe__inst__value [label=<
id | value |
value | ((byte0.value << 7) | byte1.value) |
>];
}
subgraph cluster__tag {
label="Id3v24::Tag";
graph[style=dotted];
tag__seq [label=<
pos | size | type | id |
0 | 10 | Header | header |
10 | ... | HeaderEx | header_ex |
... | ... | Frame | frames |
repeat until (((_io.pos + _.size.value) > header.size.value) || (_.is_invalid)) |
... | ... | Padding | padding |
... | 10 | Footer | footer |
>];
}
subgraph cluster__u4be_synchsafe {
label="Id3v24::U4beSynchsafe";
graph[style=dotted];
u4be_synchsafe__seq [label=<
pos | size | type | id |
0 | 2 | U2beSynchsafe | short0 |
2 | 2 | U2beSynchsafe | short1 |
>];
u4be_synchsafe__inst__value [label=<
id | value |
value | ((short0.value << 14) | short1.value) |
>];
}
subgraph cluster__frame {
label="Id3v24::Frame";
graph[style=dotted];
frame__seq [label=<
pos | size | type | id |
0 | 4 | str(ASCII) | id |
4 | 4 | U4beSynchsafe | size |
8 | 1 | FlagsStatus | flags_status |
9 | 1 | FlagsFormat | flags_format |
10 | size.value | | data |
>];
frame__inst__is_invalid [label=<
id | value |
is_invalid | id == "\000\000\000\000" |
>];
subgraph cluster__flags_status {
label="Id3v24::Frame::FlagsStatus";
graph[style=dotted];
flags_status__seq [label=<
pos | size | type | id |
0 | 1b | BitsType1(BigBitEndian) | reserved1 |
0:1 | 1b | BitsType1(BigBitEndian) | flag_discard_alter_tag |
0:2 | 1b | BitsType1(BigBitEndian) | flag_discard_alter_file |
0:3 | 1b | BitsType1(BigBitEndian) | flag_read_only |
0:4 | 4b | b4 | reserved2 |
>];
}
subgraph cluster__flags_format {
label="Id3v24::Frame::FlagsFormat";
graph[style=dotted];
flags_format__seq [label=<
pos | size | type | id |
0 | 1b | BitsType1(BigBitEndian) | reserved1 |
0:1 | 1b | BitsType1(BigBitEndian) | flag_grouping |
0:2 | 2b | b2 | reserved2 |
0:4 | 1b | BitsType1(BigBitEndian) | flag_compressed |
0:5 | 1b | BitsType1(BigBitEndian) | flag_encrypted |
0:6 | 1b | BitsType1(BigBitEndian) | flag_unsynchronisated |
0:7 | 1b | BitsType1(BigBitEndian) | flag_indicator |
>];
}
}
subgraph cluster__header_ex {
label="Id3v24::HeaderEx";
graph[style=dotted];
header_ex__seq [label=<
pos | size | type | id |
0 | 4 | U4beSynchsafe | size |
4 | 1 | FlagsEx | flags_ex |
5 | (size.value - 5) | | data |
>];
subgraph cluster__flags_ex {
label="Id3v24::HeaderEx::FlagsEx";
graph[style=dotted];
flags_ex__seq [label=<
pos | size | type | id |
0 | 1b | BitsType1(BigBitEndian) | reserved1 |
0:1 | 1b | BitsType1(BigBitEndian) | flag_update |
0:2 | 1b | BitsType1(BigBitEndian) | flag_crc |
0:3 | 1b | BitsType1(BigBitEndian) | flag_restrictions |
0:4 | 4b | b4 | reserved2 |
>];
}
}
subgraph cluster__header {
label="Id3v24::Header";
graph[style=dotted];
header__seq [label=<
pos | size | type | id |
0 | 3 | | magic |
3 | 1 | u1 | version_major |
4 | 1 | u1 | version_revision |
5 | 1 | Flags | flags |
6 | 4 | U4beSynchsafe | size |
>];
subgraph cluster__flags {
label="Id3v24::Header::Flags";
graph[style=dotted];
flags__seq [label=<
pos | size | type | id |
0 | 1b | BitsType1(BigBitEndian) | flag_unsynchronization |
0:1 | 1b | BitsType1(BigBitEndian) | flag_headerex |
0:2 | 1b | BitsType1(BigBitEndian) | flag_experimental |
0:3 | 1b | BitsType1(BigBitEndian) | flag_footer |
0:4 | 4b | b4 | reserved |
>];
}
}
subgraph cluster__padding {
label="Id3v24::Padding";
graph[style=dotted];
padding__seq [label=<
pos | size | type | id |
0 | (_root.tag.header.size.value - _io.pos) | | padding |
>];
}
subgraph cluster__footer {
label="Id3v24::Footer";
graph[style=dotted];
footer__seq [label=<
pos | size | type | id |
0 | 3 | | magic |
3 | 1 | u1 | version_major |
4 | 1 | u1 | version_revision |
5 | 1 | Flags | flags |
6 | 4 | U4beSynchsafe | size |
>];
subgraph cluster__flags {
label="Id3v24::Footer::Flags";
graph[style=dotted];
flags__seq [label=<
pos | size | type | id |
0 | 1b | BitsType1(BigBitEndian) | flag_unsynchronization |
0:1 | 1b | BitsType1(BigBitEndian) | flag_headerex |
0:2 | 1b | BitsType1(BigBitEndian) | flag_experimental |
0:3 | 1b | BitsType1(BigBitEndian) | flag_footer |
0:4 | 4b | b4 | reserved |
>];
}
}
}
id3v2_4__seq:tag_type -> tag__seq [style=bold];
u2be_synchsafe__seq:byte0_type -> u1be_synchsafe__seq [style=bold];
u2be_synchsafe__seq:byte1_type -> u1be_synchsafe__seq [style=bold];
u1be_synchsafe__seq:value_type -> u2be_synchsafe__inst__value [color="#404040"];
u1be_synchsafe__seq:value_type -> u2be_synchsafe__inst__value [color="#404040"];
tag__seq:header_type -> header__seq [style=bold];
tag__seq:header_ex_type -> header_ex__seq [style=bold];
tag__seq:frames_type -> frame__seq [style=bold];
u4be_synchsafe__inst__value:value_type -> tag__seq:frames__repeat [color="#404040"];
u4be_synchsafe__inst__value:value_type -> tag__seq:frames__repeat [color="#404040"];
frame__inst__is_invalid:is_invalid_type -> tag__seq:frames__repeat [color="#404040"];
tag__seq:padding_type -> padding__seq [style=bold];
tag__seq:footer_type -> footer__seq [style=bold];
u4be_synchsafe__seq:short0_type -> u2be_synchsafe__seq [style=bold];
u4be_synchsafe__seq:short1_type -> u2be_synchsafe__seq [style=bold];
u2be_synchsafe__inst__value:value_type -> u4be_synchsafe__inst__value [color="#404040"];
u2be_synchsafe__inst__value:value_type -> u4be_synchsafe__inst__value [color="#404040"];
frame__seq:size_type -> u4be_synchsafe__seq [style=bold];
frame__seq:flags_status_type -> flags_status__seq [style=bold];
frame__seq:flags_format_type -> flags_format__seq [style=bold];
u4be_synchsafe__inst__value:value_type -> frame__seq:data_size [color="#404040"];
frame__seq:id_type -> frame__inst__is_invalid [color="#404040"];
header_ex__seq:size_type -> u4be_synchsafe__seq [style=bold];
header_ex__seq:flags_ex_type -> flags_ex__seq [style=bold];
u4be_synchsafe__inst__value:value_type -> header_ex__seq:data_size [color="#404040"];
header__seq:flags_type -> flags__seq [style=bold];
header__seq:size_type -> u4be_synchsafe__seq [style=bold];
u4be_synchsafe__inst__value:value_type -> padding__seq:padding_size [color="#404040"];
footer__seq:flags_type -> flags__seq [style=bold];
footer__seq:size_type -> u4be_synchsafe__seq [style=bold];
}