\usetikzlibrary{arrows,matrix} % \usepackage{amssymb, amsmath, mathptmx} \begin{tikzpicture}[font=\footnotesize,node distance=1.5cm] \tikzstyle{sumBlock}=[draw,circle, inner sep=0cm, minimum size=0.1cm] \tikzstyle{templateBlock} = [inner sep=0.1cm, text centered] \tikzstyle{processBlock} = [templateBlock, draw, fill=TikZColorFill, minimum height=0.9cm, text width=2cm] \tikzstyle{proposedBlock} = [processBlock, fill=gray!30] \tikzstyle{labels} = [templateBlock, text width=2cm, font=\scriptsize] \tikzstyle{blockArrow} = [draw,-latex] \tikzstyle{arrowControl} = [blockArrow, dashed] \tikzstyle{arrowOutput} = [blockArrow, shorten >=6, thick] \tikzstyle{point} = [draw, fill=black, circle,inner sep=1pt] \tikzstyle{frame} = [anchor=north west, inner sep=0] \tikzstyle{ctu} = [draw, step=12.8mm] \def\framescale{0.23753} %% CUs % \begin{scope}[scale=\framescale, every node/.style={scale=\framescale}] \node[frame, on grid] at (0,0) (FrameCU) {\includegraphics[width=2cm]{FrameList/RaceCUCrop} }; % \draw[ctu] (0,0) grid ++(84.2mm,-48.0mm); % \end{scope} \node[labels, above=0 of FrameCU] {Coding Units quad-tree}; %% CTUs \node[frame, on grid] at (0,-2.5cm) (FrameCTU) {\includegraphics[width=2cm]{FrameList/RaceCTUCrop} }; \begin{scope}[yshift=-5cm] \def\spacing{.1} \node[frame] at (\spacing*-2 ,\spacing*0 ) (is) {\includegraphics[width=2cm]{FrameList/Race_CodedCrop} }; \node[frame] at (\spacing*-1 ,\spacing*-1) {\includegraphics[width=2cm]{FrameList/Race_CodedCrop} }; \node[frame] at (\spacing*0 ,\spacing*-2) {\includegraphics[width=2cm]{FrameList/Race_CodedCrop} }; \node[frame] at (\spacing*1 ,\spacing*-3) {\includegraphics[width=2cm]{FrameList/Race_CodedCrop} }; \node[frame] at (\spacing*2 ,\spacing*-4) (ie) {\includegraphics[width=2cm]{FrameList/Race_CodedCrop} }; \node[fit=(is) (ie), inner sep=1pt] (in) {}; \end{scope} \path[blockArrow] (in) -- (FrameCTU) node[labels, text width=1.5cm, midway, left] {Partitioning into CTUs}; \path[blockArrow] (FrameCTU) -- (FrameCU); \node[sumBlock, right=1.2 of FrameCU] (ResidueDiff) {$+$}; %% CTUs \node[frame, right=2.2cm of FrameCU] (FTu) {\includegraphics[width=2cm]{FrameList/RaceTUCrop} }; \node[labels, text width=2.3cm, above=0 of FTu] {Transform Units \\quad-tree}; \node[processBlock, text width=.9cm, right=0.5 of FTu] (Transf) {$T$}; \node[processBlock, text width=.9cm, right=0.5 of Transf] (Quant) {$Q$}; \node[processBlock, text width=3.3cm, above=1 of Transf, xshift=.5cm] (GCC) {Encoder control}; \node[labels,right=1.8 of Quant] (QuantCoef) {Quantized Coefficients}; \node[labels,right=2.7 of GCC] (ControlData) {Control data}; \path[blockArrow] (Quant) -- (QuantCoef) node [point,pos=0.5] (pointQuant) {}; \node[processBlock, below=0.5 of pointQuant, text width=.9cm,] (InvQuant) {$Q^{-1}$}; \node[processBlock, below=0.5 of InvQuant, text width=.9cm, ] (InvTransf) {$T^{-1}$}; \node[sumBlock, below=0.6 of InvTransf] (ReconResidue) {$+$}; \node[processBlock, below=.9 of FTu, xshift=.9cm] (IntraEstm) {Intra-frame estimation}; \node[labels, scale=.8, below=0 of IntraEstm.200, align=right, yshift=-3] {34 modes}; \node[processBlock, below=.6 of IntraEstm] (Intra) {Intra prediction}; \node[processBlock, below=.9 of Intra] (Inter) {Inter prediction}; \node[processBlock, below=.6 of Inter] (MotionSearch) {Motion Estimation}; % \node[labels, scale=.8, below=0 of MotionSearch, text width=2cm] {Symmetric \& asymmetric partitions}; \node[labels, scale=.8, below=0 of MotionSearch.200, align=right, yshift=-3, text width=4cm] {AMVP, Merge Mode}; \node[processBlock, below=1.2 of ReconResidue, text width=2.3cm] (Filters) {Deblocking \& SAO filters}; % \node[processBlock, text width=2.3cm] at (Filters |- MotionSearch) (RefBuffer) {Decoded Picture Buffer}; \node[processBlock, text width=2.3cm] at (Filters |- MotionSearch) (RPSet) {Reference Picture Set}; %% Intra / Inter prediction arrows \node [point,left=.7 of Intra] (IntraPred) {}; \node [point,left=.7 of Inter] (InterPred) {}; \path[blockArrow,-] (Intra) -- (IntraPred); \path[blockArrow,-] (Inter) -- (InterPred); \node[coordinate,left of=IntraPred, below of=IntraPred, node distance=0.15cm] (w1) {}; \node[coordinate,left of=InterPred, above of=InterPred, node distance=0.15cm] (w2) {}; \path (IntraPred) -- (InterPred) node [coordinate, midway] (pointPred) {}; \path (pointPred) -- (pointPred -| ResidueDiff) node [point] (pointPred) {}; \draw[-latex,densely dashed] (w1) to [bend left=60] (w2); \draw[thick,blockArrow] (IntraPred)+(0.1,-0.1) -- (pointPred); \path[blockArrow] (pointPred) -- node[pos=0.96,right] {-} (ResidueDiff); \path[blockArrow] (FrameCU) -- (ResidueDiff) node [point, midway] (pointIn) {}; \path[blockArrow] (ReconResidue) -- (Filters) node[point,pos=.4] (pointRecon) {}; % \path[blockArrow] (ResidueDiff) -- (Transf); \path[blockArrow] (ResidueDiff) -- (FTu); \path[blockArrow] (FTu) -- (Transf); \path[blockArrow] (pointIn) |- (GCC); \path[blockArrow] (GCC) -- (ControlData); \path[blockArrow] (pointQuant) -- (InvQuant); \path[blockArrow] (InvQuant) -- (InvTransf); \path[blockArrow] (InvTransf) -- (ReconResidue); \path[blockArrow] (pointRecon) -| (Intra); % \path[blockArrow] (RefBuffer) -- (RPSet); % \path[blockArrow] (RPSet) -- (MotionSearch); \path[blockArrow] (Filters) -- (RPSet); \path[blockArrow] (RPSet) -- (MotionSearch); \path[blockArrow] (IntraEstm) -- (Intra); \path[blockArrow] (MotionSearch) -- (Inter); \path[blockArrow] (pointIn) |- (MotionSearch); \path[blockArrow] (pointIn |- IntraEstm) node[point] {} -- (IntraEstm); \node[left=.6 of InvQuant, coordinate] (x1) {}; \path[blockArrow,-] (x1 -| ResidueDiff) node[point] () {} -- (x1); \path[blockArrow] (x1) |- (ReconResidue); \node[processBlock,right=2.5 of ReconResidue] (VLC) {Header Formatting \& CABAC}; \begin{pgfonlayer}{background} \path[arrowControl] (GCC -| Quant.90) -- (Quant.90); \path[arrowControl] (GCC -| IntraEstm.30) -- (IntraEstm.30); \path[arrowControl] (GCC -| MotionSearch.60) -- (MotionSearch.60); \path[arrowOutput] (QuantCoef) -- (VLC.135); \path[arrowOutput] (ControlData.-30) -- (VLC); \path[arrowOutput] (MotionSearch) -- (VLC.190) node[labels,above, pos=0.7, yshift=.2cm] {Motion \\ vectors}; \path[arrowOutput] (IntraEstm) -- (VLC) node[labels,above, pos=0.8, yshift=.2cm] {Intra \\ modes}; \path[arrowOutput] (Filters) -- (VLC.220) node[labels,below, pos=0.7, yshift=-.2cm] {Filter \\ data}; \end{pgfonlayer} \node[right=1 of VLC, text centered,text width=1.7cm] (Output) {\textbf{HEVC NALUs}}; \path[blockArrow] (VLC) -- (Output); \end{tikzpicture}