digraph picture_pipeline { label="Initialization dependencies of elements"; subgraph cluster_environment { label="Graphics environment"; style=dotted; { decoderdevice [label="vlc_decoder_device_t"]; window [label="vout_window_t"]; } } subgraph cluster_picture_chain { label="Picture pipeline"; labelloc="b"; margin="10,40"; rank=same; { rank=same; decoder [label="decoder_t"]; filter1 [label="filter_t"]; filter2 [label="filter_t"]; display [label="vout_display_t"]; edge[style=invis,minlen=5]; decoder -> filter1 -> filter2 -> display; } subgraph cluster_context_chain { node [style=filled,color=white,shape=box]; {rank = same; videocontext0 [label="vlc_video_context_t"]; videocontext1 [label="vlc_video_context_t"]; videocontext2 [label="vlc_video_context_t"];} label="video context pipeline"; color="grey"; style="filled"; } } decoder -> videocontext0; filter1 -> videocontext1; filter2 -> videocontext2; videocontext0 -> filter1; videocontext1 -> filter2; videocontext2 -> display; window -> decoderdevice; window -> display [constraint=false]; decoderdevice -> decoder; decoderdevice -> filter1; decoderdevice -> filter2; } digraph picture_pipeline { label="Push pipeline"; subgraph cluster_picture_chain { label="Picture pipeline"; labelloc="b"; margin="10,40"; rank=same; { rank=same; { node [shape=box]; decoder [label="decoder_t"]; filter1 [label="filter_t"]; filter2 [label="filter_t"]; display [label="vout_display_t"]; } picture0 [label="picture_t"]; picture1 [label="picture_t"]; picture2 [label="picture_t"]; { edge[style=invis]; decoder -> filter1 -> filter2 -> display; } decoder -> picture0; filter1 -> picture1; filter2 -> picture2; picture0 -> filter1; picture1 -> filter2; picture2 -> display; } subgraph cluster_context_chain { node [style=filled,color=white,shape=box]; {rank = same; videocontext0 [label="vlc_video_context_t"]; videocontext1 [label="vlc_video_context_t"]; videocontext2 [label="vlc_video_context_t"];} label="video context pipeline"; labelloc="t"; color="grey" style="filled" } } videocontext0 -> picture0; videocontext1 -> picture1; videocontext2 -> picture2; } digraph picture_pipeline { graph[splines=ortho]; label="Push pipeline"; compound=true; subgraph cluster_decoder { label="Decoder"; decoder [label="decoder_t"]; videocontext0_0 [label="vlc_video_context_t"]; videocontext0_1 [label="vlc_video_context_t"]; { edge[style="invis"]; decoder -> videocontext0_0 -> videocontext0_1; } } subgraph cluster_filter1 { label="Filter 1"; filter1 [label="filter_t"]; videocontext1_0 [label="vlc_video_context_t"]; videocontext1_1 [label="vlc_video_context_t"]; { edge[style="invis"]; filter1 -> videocontext1_0 -> videocontext1_1; } } subgraph cluster_filter2 { label="Filter 2"; filter2 [label="filter_t"]; videocontext2_0 [label="vlc_video_context_t"]; { edge [style="invis"]; filter2 -> videocontext2_0; } } subgraph cluster_decoder_pictures { label="Pictures from decoder"; node[shape=box]; picture0_0 [label="picture_t"]; picture0_1 [label="picture_t"]; picture0_2 [label="picture_t"]; { edge[constraint=false]; picture0_0 -> videocontext0_0; picture0_1 -> videocontext0_0; picture0_2 -> videocontext0_1; } { edge[style="invis"]; picture0_0 -> picture0_1 -> picture0_2; } } subgraph cluster_filter1_pictures { label="Pictures from filter 1"; node[shape=box]; picture1_0 [label="picture_t"]; picture1_1 [label="picture_t"]; picture1_2 [label="picture_t"]; { edge[constraint=false]; picture1_0 -> videocontext1_0; picture1_1 -> videocontext1_0; picture1_2 -> videocontext1_1; } { edge[style="invis"]; picture1_0 -> picture1_1 ->picture1_2; } } subgraph cluster_filter2_pictures { label="Pictures from filter 2"; node[shape=box]; picture2_0 [label="picture_t"]; { edge[constraint=false]; picture2_0 -> videocontext2_0; } } subgraph cluster_vout { label="Video output"; display [label="vout_display_t"]; } edge[constraint=false,minlen=8]; decoder -> picture0_0[lhead=cluster_decoder_pictures]; //decoder -> picture0_0; //decoder -> picture0_1; //decoder -> picture0_2; picture0_0 -> filter1[ltail=cluster_decoder_pictures]; //picture0_0 -> filter1; //picture0_1 -> filter1; //picture0_2 -> filter1; filter1 -> picture1_0[lhead=cluster_filter1_pictures]; //filter1 -> picture1_0; //filter1 -> picture1_1; //filter1 -> picture1_2; picture1_0 -> filter2[ltail=cluster_filter2_pictures]; //picture1_0 -> filter2; //picture1_1 -> filter2; //picture1_2 -> filter2; filter2 -> picture2_0[lhead=cluster_filter2_pictures]; picture2_0 -> display[ltail=cluster_filter2_pictures]; }