From cd670b8b5157ed31095ca74aaa5a63fa7e1a0c00 Mon Sep 17 00:00:00 2001 From: Joao Carreira Date: Wed, 1 Aug 2018 03:13:39 +0100 Subject: [PATCH] Fix figures and add intro figure --- .latexmkrc | 6 +- 010_Introduction/Introduction.tex | 19 +- 021_VideoCoding/Figures/HEVCBlockDiagram.pdf | Bin 1283212 -> 1283226 bytes 021_VideoCoding/Figures/HEVCBlockDiagram.tikz | 2 +- .../Figures/HybridCodingBlockDiagram.png | Bin 81104 -> 0 bytes .../HybridCodingBlockDiagramPrePost.tikz | 2 +- .../Figures/IntraPredictionPlanar.tikz | 4 +- .../Figures/IntraPredictionsDirectional.tikz | 2 +- .../PictureTypes_Leading_Trailing.tikz | 2 +- 021_VideoCoding/Figures/PictureTypes_TSA.tikz | 2 +- 021_VideoCoding/VideoCodingReview.tex | 162 ++++++++-------- 022_ErrorResilience/Figures/BMAAlgorithm.pdf | Bin 022_ErrorResilience/Figures/BMAAlgorithm.tex | 0 .../Figures/BiDirMotionCopy.tex | 0 .../Figures/BiDirMotionCopy2011.pdf | Bin 022_ErrorResilience/Figures/DBFDPCon2009.pdf | Bin 022_ErrorResilience/Figures/DFDPMethod.tex | 0 .../Figures/EdgesDirectionSDV.pdf | Bin .../Figures/EdgesInterception.pdf | Bin .../Figures/EdgesInterception_a.pdf | Bin .../Figures/EdgesInterception_b.pdf | Bin .../Figures/EdgesInterception_c.pdf | Bin .../Figures/FlowchartIlluminationStereo.pdf | Bin 022_ErrorResilience/Figures/IVSMID2010.pdf | Bin .../Figures/LinearInterpolation.tex | 0 022_ErrorResilience/Figures/MVE.pdf | Bin 022_ErrorResilience/Figures/MVE.vsd | Bin .../Figures/MaximallySmoothimageRecovery.pdf | Bin .../Figures/ModAverageAlgorithm.pdf | Bin .../Figures/ModEdgeOriented.pdf | Bin .../Figures/MotionDisparityProjection.pdf | Bin .../Figures/OcclusionsDetection.pdf | Bin .../Figures/POCSBlockDiagram.pdf | Bin 022_ErrorResilience/Figures/PixelBasedMVE.pdf | Bin 022_ErrorResilience/Figures/PixelBasedMVE.tex | 0 .../Figures/RefinedMotionCopy.tex | 0 .../SpatialTemporalErrorPropagation.tikz | 177 ------------------ .../RobustTransmissionReview.tex | 54 +++--- .../Figures/BlockDiagram.tikz | 4 +- .../ConcealmentAwareEncoding.tex | 148 ++++++++------- .../Figures/BlockDiagram.tikz | 8 +- .../Figures/ConcealmentCandidates.tikz | 2 +- .../Figures/MotionVectorExtrapolation.tikz | 4 +- .../Figures/BlockDiagram.tikz | 4 +- .../Figures/JointlyRobustnessDiagram.tikz | 6 +- .../Figures/NeuralNetwork.tikz | 6 +- TikzThesisTemplate.pgs | 4 +- carreira_phd_thesis.sty | 14 +- carreira_phd_thesis.tex | 2 +- carreira_phd_thesis_abr.sty | 2 - estgleiria.cls | 2 +- 51 files changed, 243 insertions(+), 395 deletions(-) delete mode 100644 021_VideoCoding/Figures/HybridCodingBlockDiagram.png mode change 100755 => 100644 022_ErrorResilience/Figures/BMAAlgorithm.pdf mode change 100755 => 100644 022_ErrorResilience/Figures/BMAAlgorithm.tex mode change 100755 => 100644 022_ErrorResilience/Figures/BiDirMotionCopy.tex mode change 100755 => 100644 022_ErrorResilience/Figures/BiDirMotionCopy2011.pdf mode change 100755 => 100644 022_ErrorResilience/Figures/DBFDPCon2009.pdf mode change 100755 => 100644 022_ErrorResilience/Figures/DFDPMethod.tex mode change 100755 => 100644 022_ErrorResilience/Figures/EdgesDirectionSDV.pdf mode change 100755 => 100644 022_ErrorResilience/Figures/EdgesInterception.pdf mode change 100755 => 100644 022_ErrorResilience/Figures/EdgesInterception_a.pdf mode change 100755 => 100644 022_ErrorResilience/Figures/EdgesInterception_b.pdf mode change 100755 => 100644 022_ErrorResilience/Figures/EdgesInterception_c.pdf mode change 100755 => 100644 022_ErrorResilience/Figures/FlowchartIlluminationStereo.pdf mode change 100755 => 100644 022_ErrorResilience/Figures/IVSMID2010.pdf mode change 100755 => 100644 022_ErrorResilience/Figures/LinearInterpolation.tex mode change 100755 => 100644 022_ErrorResilience/Figures/MVE.pdf mode change 100755 => 100644 022_ErrorResilience/Figures/MVE.vsd mode change 100755 => 100644 022_ErrorResilience/Figures/MaximallySmoothimageRecovery.pdf mode change 100755 => 100644 022_ErrorResilience/Figures/ModAverageAlgorithm.pdf mode change 100755 => 100644 022_ErrorResilience/Figures/ModEdgeOriented.pdf mode change 100755 => 100644 022_ErrorResilience/Figures/MotionDisparityProjection.pdf mode change 100755 => 100644 022_ErrorResilience/Figures/OcclusionsDetection.pdf mode change 100755 => 100644 022_ErrorResilience/Figures/POCSBlockDiagram.pdf mode change 100755 => 100644 022_ErrorResilience/Figures/PixelBasedMVE.pdf mode change 100755 => 100644 022_ErrorResilience/Figures/PixelBasedMVE.tex mode change 100755 => 100644 022_ErrorResilience/Figures/RefinedMotionCopy.tex delete mode 100644 022_ErrorResilience/Figures/SpatialTemporalErrorPropagation.tikz diff --git a/.latexmkrc b/.latexmkrc index 5ddd588..1df49e7 100644 --- a/.latexmkrc +++ b/.latexmkrc @@ -19,9 +19,9 @@ $force_mode = 0; # Define all output directories to be "tmp" # All build files will now be placed in this directory -#$aux_dir = "tmp"; -#$tmpdir = "tmp"; -#$out_dir = 'tmp'; +$aux_dir = "tmp"; +$tmpdir = "tmp"; +$out_dir = 'tmp'; add_cus_dep('glo', 'gls', 0, 'makeglossaries'); add_cus_dep('acn', 'acr', 0, 'makeglossaries'); diff --git a/010_Introduction/Introduction.tex b/010_Introduction/Introduction.tex index a700fe3..ad55684 100755 --- a/010_Introduction/Introduction.tex +++ b/010_Introduction/Introduction.tex @@ -22,17 +22,6 @@ Similar to its predecessor, \ac{hevc} is a block-based hybrid video codec using The coding flexibility and efficiency of \ac{hevc}, results from the use of new coding tools and block structures, which enables new block partitions\cite{HEVCBlock2012}, improved prediction modes \cite{IntraCodingHEVC2012,AMPCodingHEVCJun2012} and new high-level features~\cite{HEVCHighLevelReferenceDez2012}, such as explicit reference picture management and new parameter sets. However, it is known that higher coding efficiency leads to lower robustness to transmission errors and data loss. Therefore, the new coding tools in \ac{hevc} bring not only high compression efficiency~\cite{HEVCComparisonDec2012}, but also some other disadvantages, such as increased complexity~\cite{PerformanceComplexityDez2012} and inherent reduction in error robustness. - -\begin{figure}[tb] -\centering -%\includegraphics[width=0.5\columnwidth]{./010_Introduction/HEVCTransmissionStack} -%\includegraphics[width=0.7\columnwidth]{./010_Introduction/HEVCTransmissionStackOverview} -%\caption{System layer stack compatible with \ac{hevc} video transmission~\cite{HEVCLayerIntegrationDez2012}.} -\input{./010_Introduction/RobustVideoSystem.tikz} -\caption{Generalised diagram of a robust video transmission system.} -\label{fig:HEVCStack} -\end{figure} - %\cite{StudyHEVCErrorsDez2012} Earlier studies about the error robustness characteristics of \ac{hevc} have shown that in general the use of high efficiency coding tools results in poor error resilience performance, in comparison with previous standards. Thus, when \ac{hevc} streams incur in transmission losses, this leads to significant degradation of both objective and subjective quality~\cite{QoEHEVCMay2014,SubjectiveEvalSep2013}. @@ -62,9 +51,15 @@ the overall error robustness of video transmission may also benefit from the inc %follows. - +\begin{figure}[tb] + \centering + \input{./010_Introduction/RobustVideoSystem.tikz} + \caption{Generalised diagram of a robust video transmission system.} + \label{FIG1:RobustVideoTransmission} +\end{figure} In summary, increasing the error robustness of the highly compressed video streams is a relevant research problem whose solutions will be useful to increase the adaptability for transmission diverse network conditions and to achieve robust communications in order to provide acceptable levels of \ac{qoe} to the end users at all times. +In general, increased error robustness in video transmission can be jointly achieved at three different stages: (i) using robust video encoding, by selecting robust coding modes, (ii) after encoding, by adding robust features to the compressed streams as side-information and (iii) using robust video decoding techniques, e.g., efficient \ac{ec}. This is exemplified in Figure~\ref{FIG1:RobustVideoTransmission} where at the encoder different layer are used to increase the error robustness, which results in a video stream composed by a \ac{vcl} and \ac{sei} layers. Finally, at the decoder two processing layers are used to achieve robust video decoding. The \ac{hevc} reference codec is continuously being improved and extended development by multiple proponents from around the world, also addressing the problem of error resilience and robust delivered transmission Although the \ac{ec} methods have been developed during the past years for \ac{h264}~\cite{2DRecursiveRefinement2010} and recently for \ac{hevc}~\cite{HEVCMCBlockAug2013}, a combined and optimised approach between encoder and decoder is yet to be developed, which would improve the users’ \ac{qoe} by exploiting shared information between the encoder and the decoder sides. diff --git a/021_VideoCoding/Figures/HEVCBlockDiagram.pdf b/021_VideoCoding/Figures/HEVCBlockDiagram.pdf index c188945ef8f37ed0d1da0afad5eac6352001108f..903ee0f98faaf2221a4260e2f0574c6159c28fb2 100644 GIT binary patch delta 4667 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 delta 4627 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 diff --git a/021_VideoCoding/Figures/HEVCBlockDiagram.tikz b/021_VideoCoding/Figures/HEVCBlockDiagram.tikz index 40f23b6..75fb4b5 100644 --- a/021_VideoCoding/Figures/HEVCBlockDiagram.tikz +++ b/021_VideoCoding/Figures/HEVCBlockDiagram.tikz @@ -7,7 +7,7 @@ \tikzstyle{templateBlock} = [inner sep=0.1cm, text centered] -\tikzstyle{processBlock} = [templateBlock, draw, fill=\TikZColorFill, minimum height=0.9cm, text width=2cm] +\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] diff --git a/021_VideoCoding/Figures/HybridCodingBlockDiagram.png b/021_VideoCoding/Figures/HybridCodingBlockDiagram.png deleted file mode 100644 index ac17d8f713f460d7c66675e93bfd65567feaf1c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81104 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%0DI&?vwDKSFgr_29d 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 Vmd;HI`&4d7JHvZ=*6)_Y{1ec_d`18O diff --git a/021_VideoCoding/Figures/HybridCodingBlockDiagramPrePost.tikz b/021_VideoCoding/Figures/HybridCodingBlockDiagramPrePost.tikz index 1c23e13..3953471 100644 --- a/021_VideoCoding/Figures/HybridCodingBlockDiagramPrePost.tikz +++ b/021_VideoCoding/Figures/HybridCodingBlockDiagramPrePost.tikz @@ -6,7 +6,7 @@ \tikzstyle{simpleBlock}=[inner sep=0.1cm, minimum size=.9cm,text centered, minimum width=1cm, text width=1.2cm,scale=.9] -\tikzstyle{processBlock}=[simpleBlock, fill=\TikZColorFill, thick, draw] +\tikzstyle{processBlock}=[simpleBlock, fill=TikZColorFill, thick, draw] \tikzstyle{sumBlock}=[draw,circle, inner sep=0cm, minimum size=0.4cm] \tikzstyle{proposedBlock}=[processBlock, fill=gray!30] \tikzstyle{blockArrow}=[draw,-latex] diff --git a/021_VideoCoding/Figures/IntraPredictionPlanar.tikz b/021_VideoCoding/Figures/IntraPredictionPlanar.tikz index 996ad0f..001857f 100644 --- a/021_VideoCoding/Figures/IntraPredictionPlanar.tikz +++ b/021_VideoCoding/Figures/IntraPredictionPlanar.tikz @@ -9,11 +9,11 @@ \tikzstyle{PixelAnchor} =[xshift=.5cm, yshift=-.5cm] - \tikzstyle{Pixel} =[circle, thin, fill=\TikZColorFill, inner sep=0, minimum size=10pt] + \tikzstyle{Pixel} =[circle, thin, fill=TikZColorFill, inner sep=0, minimum size=10pt] \tikzstyle{PixelNeighbour} =[Pixel, fill=black!70] \tikzstyle{Arrow} =[-latex,thick, draw=black] - \tikzstyle{NeighbourSquares} =[fill=\TikZColorFillDark] + \tikzstyle{NeighbourSquares} =[fill=TikZColorFillDark] \tikzstyle{EllipseDup} =[PixelAnchor, draw, ellipse, minimum width=5cm, minimum height=.7cm, inner sep=0] diff --git a/021_VideoCoding/Figures/IntraPredictionsDirectional.tikz b/021_VideoCoding/Figures/IntraPredictionsDirectional.tikz index e35746a..554f113 100644 --- a/021_VideoCoding/Figures/IntraPredictionsDirectional.tikz +++ b/021_VideoCoding/Figures/IntraPredictionsDirectional.tikz @@ -13,7 +13,7 @@ \tikzstyle{PixelNeighbour} =[Pixel, fill=black!70] \tikzstyle{Arrow} =[-latex,thick, draw=black] - \tikzstyle{NeighbourSquares} =[fill=\TikZColorFillDark] + \tikzstyle{NeighbourSquares} =[fill=TikZColorFillDark] \draw[Pixel] (0,0) grid ++(4.5,4.5); diff --git a/021_VideoCoding/Figures/PictureTypes_Leading_Trailing.tikz b/021_VideoCoding/Figures/PictureTypes_Leading_Trailing.tikz index a33847c..53b708f 100644 --- a/021_VideoCoding/Figures/PictureTypes_Leading_Trailing.tikz +++ b/021_VideoCoding/Figures/PictureTypes_Leading_Trailing.tikz @@ -1,6 +1,6 @@ \begin{tikzpicture}[auto] \def\yshift{1.2cm} -\tikzstyle{frame}=[thick,draw, fill=\TikZColorFill, yslant=0,xscale=1,minimum size=1cm] +\tikzstyle{frame}=[thick,draw, fill=TikZColorFill, yslant=0,xscale=1,minimum size=1cm] \tikzstyle{dependency}=[thick,draw,-latex, shorten <=3 pt, shorten >=3 pt] \tikzstyle{label}=[text centered, font=\small] \node[frame] at (-6 ,0*\yshift) (P0) {$P_0$}; diff --git a/021_VideoCoding/Figures/PictureTypes_TSA.tikz b/021_VideoCoding/Figures/PictureTypes_TSA.tikz index 7df6edf..20bb26c 100644 --- a/021_VideoCoding/Figures/PictureTypes_TSA.tikz +++ b/021_VideoCoding/Figures/PictureTypes_TSA.tikz @@ -1,6 +1,6 @@ \begin{tikzpicture}[auto] \def\yshift{1.2cm} -\tikzstyle{frame}=[thick,draw, fill=\TikZColorFill, yslant=0,xscale=1,minimum size=1cm] +\tikzstyle{frame}=[thick,draw, fill=TikZColorFill, yslant=0,xscale=1,minimum size=1cm] \tikzstyle{dependency}=[thick,draw,-latex, shorten <=3 pt, shorten >=3 pt] \tikzstyle{label}=[text centered, font=\small] \node[frame] at (-6 ,0*\yshift) (P0) {$P_0$}; diff --git a/021_VideoCoding/VideoCodingReview.tex b/021_VideoCoding/VideoCodingReview.tex index 502f604..0b13a50 100755 --- a/021_VideoCoding/VideoCodingReview.tex +++ b/021_VideoCoding/VideoCodingReview.tex @@ -15,17 +15,17 @@ \glsunset{h264} \glsreset{hevc} -This chapter describes the H.265~-~\ac{hevc}~\cite{H265StandardFeb2018} standard, focusing on the most relevant features of the encoding algorithm in the scope of the work developed in this thesis. +This chapter describes the H.265~-~\ac{hevc}~\cite{H265StandardFeb2018} standard, focusing on the most relevant features of the encoding algorithm in the scope of the work developed in this thesis. In short, the \ac{hevc} standard essentially aims to support all existing applications of \ac{h264}~\cite{H264AVCStandard2003}, while extending two keys aspects: increased video resolution with higher compression ratio and also more efficient use of parallel processing architectures. -In order to increase the coding flexibility and higher video resolutions, the \ac{hevc} standard adopts a new block partition structure, as well as, new prediction modes. -In this chapter the new data structures coding techniques specifically introduced to increase the coding efficiency are described. +In order to increase the coding flexibility and higher video resolutions, the \ac{hevc} standard adopts a new block partition structure, as well as, new prediction modes. +In this chapter the new data structures coding techniques specifically introduced to increase the coding efficiency are described. Particular emphasis is given to those which may have a significant impact in the error robustness characteristics of \ac{hevc} streams. -This chapter is organized as follows. -Section~\ref{Section2:GeneraVideoSystem} introduces the functional blocks of a generic hybrid video coding system, and Section~\ref{Section2:Overview} provides an overview of the \ac{hevc} standard. +This chapter is organized as follows. +Section~\ref{Section2:GeneraVideoSystem} introduces the functional blocks of a generic hybrid video coding system, and Section~\ref{Section2:Overview} provides an overview of the \ac{hevc} standard. Then, Section~\ref{Section2:HighLevel} describes the high-level syntax elements which are used to carry relevant information in coded streams. -Section~\ref{Section2:CodingStructures} describes the data structures used to divide the video frames into smaller partitions and Section~\ref{Section2:PredictionModes} describes particular aspects of the main predictions techniques, namely intra and inter coding. -Finally, a brief description of the transform and quantisation, entropy coding and in-loop filters is provided in Sections~\ref{Section2:TransformQuant}, \ref{Section2:Entropy} and \ref{Section2:Filters}, respectively. +Section~\ref{Section2:CodingStructures} describes the data structures used to divide the video frames into smaller partitions and Section~\ref{Section2:PredictionModes} describes particular aspects of the main predictions techniques, namely intra and inter coding. +Finally, a brief description of the transform and quantisation, entropy coding and in-loop filters is provided in Sections~\ref{Section2:TransformQuant}, \ref{Section2:Entropy} and \ref{Section2:Filters}, respectively. Section~\ref{Section2:Summary} concludes this chapter. \clearpage @@ -35,7 +35,7 @@ Section~\ref{Section2:Summary} concludes this chapter. \section{General hybrid video coding} \label{Section2:GeneraVideoSystem} -A digital video signal is a temporal succession of images, also referred to as pictures or frames, which usually presents a significant amount of temporal and spatial correlations. +A digital video signal is a temporal succession of images, also referred to as pictures or frames, which usually presents a significant amount of temporal and spatial correlations. In general, video coding and distribution systems follow through a generic chain of processing and delivery stages: pre-processing, encoding, storage or transmission, decoding and post-processing. The pre-processing stage is used adapt the raw video signal, either analogue or digital, to an appropriate format, such as RGB or YUV~\cite{DataCompression1997}. Then, the video data is compressed by the respective encoding module, mostly reducing its redundancy and visual irrelevancy. The encoding process is responsible for representing the raw video in a highly compressed format, while maintaining a good trade-off between video quality and bitrate through high efficient algorithms and coding tools. @@ -50,7 +50,7 @@ In the last stages of the chain, the compressed format is decoded video and pres -Since the early days of video compressing, hybrid video coding has been the basic structure for all video coding standards and recommendations of ITU-T \ac{vceg} and \ac{iso}/\ac{iec} \ac{mpeg}, e.g., from H.261 to \ac{hevc}. +Since the early days of video compressing, hybrid video coding has been the basic structure for all video coding standards and recommendations of ITU-T \ac{vceg} and \ac{iso}/\ac{iec} \ac{mpeg}, e.g., from H.261 to \ac{hevc}. Figure~\ref{Figure2:HybridCodec} shows the block diagram of a generic hybrid video coding system~\cite{BookLucas2017}. While the algorithmic structure has not been changed, the specific techniques represented by the building blocks have been refined and the applicable coding configuration has become more and more flexible over years through the use of an increasing variety of coding tools. This is the reason why coding scheme is called hybrid, as it combines quiet different prediction modes between pictures with transform and entropy coding~\cite{VideoCodingFundamentals2015}. @@ -69,12 +69,12 @@ On the one hand, the spatial redundancy is exploited through intra frame predict This is possible due to a high correlation between neighbouring pixels within a frame. As result, in intra frame prediction, a block of pixels can be reconstructed from the blocks previously processed. On the other hand, inter frame prediction is designed to exploit the temporal redundancy that exists between consecutive frames such as those temporally adjacent, e.g., the past frame or the future frame in regard to the current one Temporal redundancy is normally referred to as the correlation between two adjacent frames since they usually have quiet similar visual content, such as visual objects and background. -Thus, the purpose of inter-frame prediction is to search for the best matching block for the current one in a set of reference frames. +Thus, the purpose of inter-frame prediction is to search for the best matching block for the current one in a set of reference frames. After finding the best matching candidate for the current block, either by intra- or inter-frame prediction, only the difference between the original block and the predicted one needs to be encoded. -As shown in Figure~\ref{Figure2:HybridCodec}, these differences (also known as residual signal) are further processed and transformed (T) into the coefficients in the frequency domain. +As shown in Figure~\ref{Figure2:HybridCodec}, these differences (also known as residual signal) are further processed and transformed (T) into the coefficients in the frequency domain. Such a transformation decorrelates the residue signal and concentrates the signal energy in few coefficients, mostly at low frequencies. -Subsequently, the transformed coefficients are quantized (Q) to reduce the representation accuracy of the signal, and consequently reduce the number of bits required for coding. +Subsequently, the transformed coefficients are quantized (Q) to reduce the representation accuracy of the signal, and consequently reduce the number of bits required for coding. Finally, the quantized transform coefficients together with the prediction information are further compressed by the entropy encoder, forming an output stream suitable for transmission or storage, as shown in Figure~\ref{Figure2:HybridCodec}. On the other side of the communication chain, the decoding stage performs the inverse operations on the stream to reconstruct the video signal. In the next section, the aforementioned blocks are described in the context of \ac{hevc} standard. @@ -113,7 +113,7 @@ The encoder uses both intra- and inter-picture prediction to exploit spatial and \glsreset{rpset} There are some novelties introduced in the \ac{hevc} standard. As depicted in Figure \ref{fig:HEVCBlockDiagram}, the encoding process follows a block-based approach, therefore each picture is partitioned into larger blocks, referred to as \acs{ctu}, with a maximum size of $64\times64$. Subsequently, a dynamic quad-tree partitioning is used to divide the picture into \acs{cu}. These units are introduced as the basic processing units for prediction, and for the transform and quantisation operations \acs{tu} are used. -In order to generate the prediction residue the \ac{hevc} may use one of 34 intra-prediction modes or take advantage of symmetric and asymmetric partitions for motion estimation and inter-prediction. +In order to generate the prediction residue the \ac{hevc} may use one of 34 intra-prediction modes or take advantage of symmetric and asymmetric partitions for motion estimation and inter-prediction. The motion estimation is performed in those pictures listed in the \ac{rpset} which was introduced in the \ac{hevc} to increase the error robustness of reference picture lists. To improve the overall quality of the reconstructed pictures and smooth the coding artefacts, \ac{hevc} not only uses a deblocking filter but also a \ac{sao} filter. Finally, the control data, quantised coefficients, prediction modes, motion vectors and filter information are compressed using the \ac{cabac} entropy coder and generate a compressed bitstream composed of different \acs{nalu}. @@ -144,7 +144,7 @@ Similar to \ac{h264}~\cite{H264AVCStandard2003}, the \ac{hevc} streams are based \bitbox{#2}{#3}} \begin{bytefield}[bitwidth=20pt]{16} % \bitheader{0-15} \\ - \colorbitbox{\TikZColorFill}{1}{F} & \colorbitbox{gray!60}{6}{NAL Type} & \colorbitbox{\TikZColorFill}{6}{Reserved} & \colorbitbox{gray!60}{3}{TIDP} + \colorbitbox{TikZColorFill}{1}{F} & \colorbitbox{gray!60}{6}{NAL Type} & \colorbitbox{TikZColorFill}{6}{Reserved} & \colorbitbox{gray!60}{3}{TIDP} \end{bytefield} \caption{Two bytes \ac{nal} unit header in \ac{hevc}.} \label{Figure2:NalHeader} @@ -209,7 +209,7 @@ The new set of parameters \ac{vps} contains information related to the different \end{tabular} \end{table} -The \ac{hevc} standard supports several pictures types as show in Table~\ref{Table2:PictureTypes}, which are divided in the following categories: (i) random-access points, (ii) leading pictures and (iii) temporal sub-layer access pictures~\cite{HEVCHighLevelReferenceDez2012,BookHEVC2014}. +The \ac{hevc} standard supports several pictures types as show in Table~\ref{Table2:PictureTypes}, which are divided in the following categories: (i) random-access points, (ii) leading pictures and (iii) temporal sub-layer access pictures~\cite{HEVCHighLevelReferenceDez2012,BookHEVC2014}. The use of different types of pictures allows the \ac{hevc} stream to be more flexible and support a wider range of applications and a robust video communications. They are important to perform random-access, which is a critical feature for channel switching, seek operations and dynamic streaming services. Moreover, introducing random-access points into the bitstream increases its error robustness as they provide anchor points for a clean decoding after data loss or synchronisation problems. @@ -219,25 +219,25 @@ Moreover, introducing random-access points into the bitstream increases its erro \subsubsection{Random-Access Point} -The \ac{rap} pictures are used to provide points in the bitstream with no dependencies, where it is possible to start the decoding process. The standard defines that a conforming bitstream must start with a \ac{rap} picture. -These frames must belong to temporal sub-layer 0 and coded using intra coding techniques, i.e., must not using previous decoded frames as reference. -One should note that there may be frames solely compressed with solely intra prediction but not be marked as random-access points. +The \ac{rap} pictures are used to provide points in the bitstream with no dependencies, where it is possible to start the decoding process. The standard defines that a conforming bitstream must start with a \ac{rap} picture. +These frames must belong to temporal sub-layer 0 and coded using intra coding techniques, i.e., must not using previous decoded frames as reference. +One should note that there may be frames solely compressed with solely intra prediction but not be marked as random-access points. It is always possible to start decoding from a \ac{rap} frame onwards, and to output any subsequent pictures in display order even if all pictures that precede the \ac{rap} in decoding order are discarded from the bitstream. The \ac{idr} frame is an intra coded picture that completely refreshes the decoding process and starts a new conforming video stream. This means that neither the \ac{idr} nor any other subsequent frame in the decoding order have prior dependencies. \ac{idr} frames are allowed to have leading pictures, but they must be decodable, thus creating a true random-access point where all subsequent frames in the decoding order can be decoded and displayed. Introducing \ac{rap} reduces the coding efficiency since no prior reference frames can be used. -In order to reduce this impact, the \ac{hevc} standard introduces a new \ac{rap} picture, referred to as \ac{cra} picture. -These frames do not refresh the decoding process and allow leading pictures to depend on frames that precede the \ac{cra} picture in the decoding order. +In order to reduce this impact, the \ac{hevc} standard introduces a new \ac{rap} picture, referred to as \ac{cra} picture. +These frames do not refresh the decoding process and allow leading pictures to depend on frames that precede the \ac{cra} picture in the decoding order. This enables a more efficient prediction structure, while maintaining an access point to begin the decoding process. However, it results in leading pictures which may not be decodable, which are explained in the next sub-section. The introduction of \ac{cra} frames in \ac{hevc} was able to improve the coding efficiency by up to 6\% \cite{HEVCCRAPics2011}. %\HERE -The \ac{hevc} supports bitstream splicing, which means taking a particular bitstream starting from a \ac{rap} (both \ac{idr} and \ac{cra} frames) and insert it into another bitstream at a random-access point. +The \ac{hevc} supports bitstream splicing, which means taking a particular bitstream starting from a \ac{rap} (both \ac{idr} and \ac{cra} frames) and insert it into another bitstream at a random-access point. In case of bitstream splicing starting from an \ac{idr} frame the leading pictures does not have dependencies to frames prior the \ac{rap}, thus all frames are decodable. -However, whenever this is performed for a bitstream starting from a \ac{cra} frame, the leading associated frames might not be correctly decoded because some of their reference pictures are not present in the combined bitstream. +However, whenever this is performed for a bitstream starting from a \ac{cra} frame, the leading associated frames might not be correctly decoded because some of their reference pictures are not present in the combined bitstream. Therefore, in order to make splicing operation straightforward the \acs{nalu} containing the \ac{cra} picture are changed to \acs{nalu} of type \ac{bla}. This way the decoder is aware that the leading frames should be discarded, namely the \ac{rasl} pictures. @@ -260,13 +260,13 @@ Due to the introduction of more flexible random-access points using \ac{cra} pic There are two types of leading pictures as shown in Table~\ref{Table2:PictureTypes}. The \ac{radl} pictures which only depend on the associated \ac{rap} picture and do not have any prior dependencies to trailing pictures associated with previous \ac{rap} frame and can be correctly decoded. -On contrary, the \ac{rasl} pictures may have dependencies to a prior trailing pictures. +On contrary, the \ac{rasl} pictures may have dependencies to a prior trailing pictures. Therefore, when a random-access is performed at the associated \ac{rap} frame, these frames cannot be correctly decoded, and should be skipped. The example of ~\ref{Figure2:LeadingTralingPics} the leading pictures represented correspond to \ac{rasl} pictures. \subsubsection{Temporal sub-layer switching pictures} -A \ac{tsa} picture is a trailing picture that marks a temporal layer switching point. +A \ac{tsa} picture is a trailing picture that marks a temporal layer switching point. When decoding a sub-set of the temporal layers and a \ac{tsa} picture is found from the temporal layer just above the maximum temporal layer currently being decoded, it is possible for the decoder to start decoding any number of additional temporal layers. For example, frame $P_6$ in Figure~\ref{Figure2:TSAExample} is considered a \ac{tsa} picture since it only depends on a frame belonging to temporal layer 0 for prediction, as well as, any subsequent frame predicted from the \ac{tsa} frame $P_6$. In this example, if the decoder was only decoding the temporal layer 0 it can after $P_6$ starts decoding both layer 0 and 1 or decode all the available three layers. Although theses frame allows higher flexibility in terms of layer switching, they severely constrain the prediction of frames following the \ac{tsa} picture. @@ -279,10 +279,10 @@ In this example, if the decoder was only decoding the temporal layer 0 it can af \label{Figure2:TSAExample} \end{figure} -To reduce the constrains in frame prediction due to layer switching, \ac{hevc} introduces the \ac{stsa} picture. +To reduce the constrains in frame prediction due to layer switching, \ac{hevc} introduces the \ac{stsa} picture. These pictures have similar purpose as the \ac{tsa} frames but they only guarantee that frames in the same temporal layer as the \ac{stsa} frame in the decoding order are able to be correctly reconstructed. This is guaranteed by preventing any dependency from frames preceding the \ac{stsa} to be used as reference in its temporal layer. -One example of a \ac{stsa} frame is also shown in Figure~\ref{Figure2:TSAExample} in frame $P_2$. -This frame can be used to switch to the layer 1 as it does not have dependencies to any prior frame in the same layer ($P_2$ only depends on $I_0$). +One example of a \ac{stsa} frame is also shown in Figure~\ref{Figure2:TSAExample} in frame $P_2$. +This frame can be used to switch to the layer 1 as it does not have dependencies to any prior frame in the same layer ($P_2$ only depends on $I_0$). However, it cannot be classified as \ac{tsa} picture because $P_3$ has dependencies to prior frame in the decoding order to $P_1$. Summarising, \ac{stsa} frames can be used to switch to a particular layer as the \ac{tsa} can be used to switch to any layer. @@ -294,10 +294,10 @@ The high-level segmentation of a picture in \ac{hevc} is achieved through four t \item[Error robustness:] partitioning the picture into smaller self-contained units in order to gain error robustness by the ability to re-synchronize both the parsing and decoding processes in case of data losses. - + \item[Network adaptation:] adapt to the network constraint of \ac{mtu} size, found for example in \ac{ip} networks. Such packetisation scheme restricts the maximum number of payload bits within a slice regardless of the size of the coded frame. To keep each slice within this limit and minimise the packetisation overhead, a variable number of coding units is used for each slice. - + \item[Parallel processing:] partitioning the coded frame into processing data units which can be encoded in parallel. This is achieved by dividing the coding units in such way that they can be encoded and decoded independently of each other’s. \end{description} @@ -323,7 +323,7 @@ Another partitioning tool in \ac{hevc} standard is the dependent slices. These s A new data partition has been included in the \ac{hevc} standard, referred to as Tiles\cite{HEVCTilesDec2013}. Tiles enable the partition of a coded frame into a smaller group of \acs{ctu} using horizontal and/or vertical boundaries. Figure~\ref{Figure2:HEVCTiles} shows two examples of slice partitioning using tiles. In both cases the frame is partitioned into three tiles by using two vertical boundaries. By only using boundaries to define tiles, signalling is achieved with a small overhead. These boundaries are defined in the \ac{pps} \acs{nalu} . -Although the \ac{hevc} standard enables the use of both slices and tiles at the same time, some constrains are imposed in order to reduce the implementation complexity. +Although the \ac{hevc} standard enables the use of both slices and tiles at the same time, some constrains are imposed in order to reduce the implementation complexity. One of two cases must be used: (i) all \acs{ctu} within a tile must belong to the same slice, or (ii) all \acs{ctu} within a slice must belong to the same tile. These cases are illustrated in Figure~\ref{Figure2:HEVCTiles} (a) and (b), respectively. The use of tiles provide several advantages. Specifically, they improve frame partitioning for parallel processing~\cite{WPPTilesParallelHEVC2017} when compared to slices, by reducing the required overhead. Moreover, they also improve the \ac{mtu} size matching and reduce the line buffer memory (by dividing the frame as in Figure~\ref{Figure2:HEVCTiles}). Finally, as tiles allow flexible partitioning, they enable the definition of \acs{roi} for asymmetric video coding. @@ -363,13 +363,13 @@ In \ac{h264} each frame is divided into units so-called \acs{mb}, which are comp \glsreset{ctu} \glsreset{cu} -The basic data structures in \ac{hevc} are quite different from \ac{h264}. Each picture is divided into blocks named as \ac{ctu}~\cite{BlockPartHEVC2012}. The maximum \ac{ctu} size is an encoder configuration parameter and signalled to the decoder, and should be one of the following: $64\times64$, $32\times32$ and $16\times16$. The use of data structures with larger size in \ac{hevc} was adopted to achieve higher coding efficiency especially in high resolution video. Each \ac{ctu} can be recursively partitioned into four smaller units, referred to as \acs{cu}, until it reaches the minimum unit size, which cannot be smaller than to $8\times8$ pixels. Similar to the maximum \ac{ctu} size, the minimum size is also defined at the encoding time. +The basic data structures in \ac{hevc} are quite different from \ac{h264}. Each picture is divided into blocks named as \ac{ctu}~\cite{BlockPartHEVC2012}. The maximum \ac{ctu} size is an encoder configuration parameter and signalled to the decoder, and should be one of the following: $64\times64$, $32\times32$ and $16\times16$. The use of data structures with larger size in \ac{hevc} was adopted to achieve higher coding efficiency especially in high resolution video. Each \ac{ctu} can be recursively partitioned into four smaller units, referred to as \acs{cu}, until it reaches the minimum unit size, which cannot be smaller than to $8\times8$ pixels. Similar to the maximum \ac{ctu} size, the minimum size is also defined at the encoding time. Figure~\ref{Figure2:HEVCCodingStructure} illustrates an example of a \ac{ctu} partitioning into \acs{cu}. The partitioning illustrated in the figure leads to the quad-tree structure represented on the left side with the corresponding coding order shown on the right side. \glsreset{pu} \glsreset{tu} -The \ac{cu} is the basic processing unit in \ac{hevc}. It is further partitioned into two types of units, specifically \ac{pu} and \ac{tu}, which are data blocks used for prediction and transform operations, respectively. +The \ac{cu} is the basic processing unit in \ac{hevc}. It is further partitioned into two types of units, specifically \ac{pu} and \ac{tu}, which are data blocks used for prediction and transform operations, respectively. The decision whether to use intra-frame or inter-frame prediction modes is taken at \ac{cu} level. However, depending on the partitioning of the \ac{cu} into \acs{pu} different intra or inter coding modes can be used for each \ac{pu}. \HERE @@ -392,22 +392,22 @@ This section describes the prediction techniques used in the \ac{hevc} standard \subsection{Intra-frame prediction} -Intra-frame prediction is used to efficiently reduce the spatial redundancy in video frames. -Intra predicted blocks are obtained using the previously encoded pixels around the current \ac{pu}. +Intra-frame prediction is used to efficiently reduce the spatial redundancy in video frames. +Intra predicted blocks are obtained using the previously encoded pixels around the current \ac{pu}. When the intra prediction mode is chosen for a \ac{cu}, the size of the \ac{pu} need to be the same as the \ac{cu}, except when the smaller \ac{cu} is selected and further splitting into four \acs{pu} is done. For example, when the smaller \ac{cu} size is $8\times8$, the encoder may decide to divide it into four \acs{pu} of $4\times4$ pixels, each one having its own intra prediction mode. This is signalled using a binary flag. The use of small \acs{pu} is useful for complex regions that require fine-granularity prediction. -In \ac{hevc} there are 35 different of intra-frame prediction modes: Planar, DC and 33 angular modes as shown on the left of Figure~\ref{Figure2:IntraModesHEVC}~\cite{IntraCodingHEVC2012,HEVCIntraperformance2012}. -%Figure~\ref{Figure2:IntraModesHEVC} illustrates these intra prediction modes. -%As shown, the predictions are applied to square blocks only. +In \ac{hevc} there are 35 different of intra-frame prediction modes: Planar, DC and 33 angular modes as shown on the left of Figure~\ref{Figure2:IntraModesHEVC}~\cite{IntraCodingHEVC2012,HEVCIntraperformance2012}. +%Figure~\ref{Figure2:IntraModesHEVC} illustrates these intra prediction modes. +%As shown, the predictions are applied to square blocks only. %The border around the square blocks corresponds to the reference pixels from which the prediction is applied (different colours correspond to different pixel values). %The example in the figure corresponds to a \ac{pu} size of $8\times8$ pixels, but block sizes ranging from $4\times4$ to $32\times32$ are also allowed. The encoder chooses among all the available intra prediction modes and signals the best mode to the decoder, which must generate an identical prediction block, based on the previously reconstructed pixels. The reconstructed reference pixels used in the prediction process belong to the neighbouring blocks at left-down, left, top-left, top and top-right positions, as -can be seen in the example shown on the right in Figure~\ref{Figure2:IntraModesHEVC}. +can be seen in the example shown on the right in Figure~\ref{Figure2:IntraModesHEVC}. Given a $N \times N$ \ac{pu}, intra prediction requires the top neighbouring row of $2N$ pixels, the left column of $2N$ pixels and the top-left neighbouring pixel. -Due to data unit boundaries, e.g., slice or tile boundaries, neighbouring pixels might not be all available to use intra prediction. +Due to data unit boundaries, e.g., slice or tile boundaries, neighbouring pixels might not be all available to use intra prediction. In addition, when constrained intra prediction is enabled, i.e., reference pixels belonging to inter-predicted \acs{pu} are not used in order to remove error propagation from potentially erroneous reconstructed reference frames. This may results in an incomplete set of neighbouring reference pixels. In order to overcome this issue and to allow all possible modes, \ac{hevc} uses reference sample substitution to replace the unavailable reference pixels with the closest available ones, so that all intra prediction modes can be used. @@ -427,7 +427,7 @@ In order to overcome this issue and to allow all possible modes, \ac{hevc} uses \subsubsection{Angular modes} Directional intra prediction was first introduced in the \ac{h264} standard~\cite{H264OverviewJul2003}, to estimate regions with a structured texture or directional edges. -Directional prediction projects the reconstructed samples in the block neighbourhood (see reference pixels in Figure~\ref{Figure2:IntraModesHEVC}) along a specific direction. The \ac{hevc} increases the number of possible directions from 8 (in \ac{h264}) to 33~\cite{IntraCodingHEVC2012}. The direction of each projection is illustrated in the left-side of Figure~\ref{Figure2:IntraModesHEVC} by the directional modes 2 to 34. +Directional prediction projects the reconstructed samples in the block neighbourhood (see reference pixels in Figure~\ref{Figure2:IntraModesHEVC}) along a specific direction. The \ac{hevc} increases the number of possible directions from 8 (in \ac{h264}) to 33~\cite{IntraCodingHEVC2012}. The direction of each projection is illustrated in the left-side of Figure~\ref{Figure2:IntraModesHEVC} by the directional modes 2 to 34. %In the figure it is possible to notice that directional modes 2 to 10 only project the pixels from the left neighbouring border in a horizontal direction, modes 10 to 25 use both the left and top neighbouring pixels in a diagonal direction and modes 26 to 34 project the top neighbours in vertical direction. As shown in the figure, the angular modes are designed to provide a dense coverage near the horizontal (i.e., mode 10) and vertical (i.e., mode 26) directions. Moreover, the angular directions are more coarse as it gets closer to the diagonals. This reflects the observed statistical prevalence of the angles and the prediction efficiency. @@ -454,15 +454,15 @@ Since the right and bottom neighbourhood is not available (not coded yet), the s \subsubsection{Sample smoothing} -In \ac{hevc} sample smoothing is applied in two distinct cases to improve the overall performance of the prediction accuracy. -Firstly, the reference samples are filtered and secondly the \ac{pu} is filtered after prediction. +In \ac{hevc} sample smoothing is applied in two distinct cases to improve the overall performance of the prediction accuracy. +Firstly, the reference samples are filtered and secondly the \ac{pu} is filtered after prediction. %In comparison with previous standard \ac{h264}, where only reference samples were filtered. In \ac{hevc}, the reference sample smoothing is conditionally applied, based on the \ac{pu} and intra prediction mode. Similar to \ac{h264}, a three tap smoothing filter (i.e., $\left[1\ 2\ 1\right]/4$) is applied, except for \ac{pu} sizes of $4\times4$. The prediction resulting from Planar mode is also filtered when the \ac{pu} size is greater than $8\times8$, and it is not used for the DC mode. The second filter in \ac{hevc} is the boundary smoothing. This filter aims at removing the discontinuities along block boundaries due to intra prediction. -This filter is only applied when the block size is smaller than $32\times32$ to the DC and angular modes 10 and 26 (exactly the horizontal and vertical directions, respectively). -For the DC mode a two-tap filter ($\left[3\ 1\right]/4$), fed by the original predicted value and the adjacent reference sample, is applied to both the top row and the left-most column of predicted pixels. +This filter is only applied when the block size is smaller than $32\times32$ to the DC and angular modes 10 and 26 (exactly the horizontal and vertical directions, respectively). +For the DC mode a two-tap filter ($\left[3\ 1\right]/4$), fed by the original predicted value and the adjacent reference sample, is applied to both the top row and the left-most column of predicted pixels. In the case of angular mode 10 (horizontal direction), only the predicted samples of the first column are changed by adding half of the difference between the adjacent reference sample and the top-left reference sample. A similar filtering is done for angular mode 26 (vertical direction), but only for the first row of predicted samples. @@ -473,33 +473,33 @@ Only the mentioned boundaries are filtered, as they are the most likely to intro \subsection{Inter-frame prediction} -The efficiency of video coding algorithms consistently rely on inter-frame prediction techniques to reduce temporal redundancy. +The efficiency of video coding algorithms consistently rely on inter-frame prediction techniques to reduce temporal redundancy. The underlying idea of inter-frame prediction is to estimate the current frame from one or more previously encoded frames used as reference with block-based motion compensation. The most common technique used for motion estimation in \ac{hevc} is the block matching algorithm. In the \ac{hevc} standard an \ac{amvp} is used for efficient motion vector coding, which defines the Merge Mode and differential coding of the motion information. \subsubsection{Motion estimation and compensation} -Motion estimation consists in searching for a block with the highest similarity with the current block to be predicted (\ac{pu} in \ac{hevc}), using block-matching algorithms over previously encoded frames, i.e. the reference frames. -Typically, reference frames correspond to past or future temporally adjacent frames. -The frame encoding order determines which references are selected and which future frames are available. +Motion estimation consists in searching for a block with the highest similarity with the current block to be predicted (\ac{pu} in \ac{hevc}), using block-matching algorithms over previously encoded frames, i.e. the reference frames. +Typically, reference frames correspond to past or future temporally adjacent frames. +The frame encoding order determines which references are selected and which future frames are available. The reference block that results in the lowest error is selected as the best block for prediction. To identify the best matching block to be used for motion compensation, the different between the target and the reference block positions is encoded as a two-dimensional \glsfirst{mv}. The \ac{hevc} allows for either one or two \acs{mv} to be used for each \ac{pu}. Video frames of type P are predicted from one single reference (one \ac{mv}) while frame of type B are predicted from two references (two \acs{mv}). -This results in uni-direction or bi-directional coding, respectively. +This results in uni-direction or bi-directional coding, respectively. Furthermore, weighted prediction can also be used, which consists in scaling and offset operations performed on the prediction block to improve efficiency. The \acs{mv} only refer to frames included in a reference frame list, where each frame is identified by an index. Therefore, to fully describe inter-frame prediction a combination of two parameters is required: \ac{mv} and reference frame index. -Since MPEG-2, motion estimation/compensation has been performed using blocks of variable size. +Since MPEG-2, motion estimation/compensation has been performed using blocks of variable size. In \ac{h264} block sizes ranging from $4\times4$ up to $16\times$ pixels are allowed, while \ac{hevc} extends the possible block sizes up to $64\times64$ pixels, and also to asymmetric rectangular block sizes. By using larger prediction units less \ac{mv} are required and fewer bits are spent in coding motion information. In order to increase the efficiency of motion estimation fractional \acs{mv} are used, which has been proven to improve motion compensation accuracy. This is accomplished through interpolation to generate non-integer pixels in the reference frame, resulting in \acs{mv} up to quarter-pixel accuracy for luma samples. -For chroma samples, the \ac{mv} accuracy is determined according to the chroma sampling format, which for 4:2:0 results in eighth-pixel accuracy. +For chroma samples, the \ac{mv} accuracy is determined according to the chroma sampling format, which for 4:2:0 results in eighth-pixel accuracy. In contrast with the two-stage approach used in \ac{h264}, \ac{hevc} uses a single separable approach for the interpolation process without intermediate rounding operations. This improves the precision and simplifies the architecture of the fractional interpolation. The block matching-based motion estimation is one of the most computationally intensive procedures in video encoders. -In general, the optimal solution for motion estimation is provided by the full-search algorithm, which tests all the possible candidate blocks in the search area. However, although the full-search algorithm achieves the optimal performance, it requires the highest computational complexity. +In general, the optimal solution for motion estimation is provided by the full-search algorithm, which tests all the possible candidate blocks in the search area. However, although the full-search algorithm achieves the optimal performance, it requires the highest computational complexity. Therefore, sub-optimal algorithms have been proposed over the years to reduce the motion estimation complexity and decrease encoding time~\cite{HEVCME2012,HEVCME2017,HEVCME2014}. For example, the HM reference software implements a fast algorithm based on Test Zone Search~\cite{HEVCME2012}. Since motion estimation is a non-normative procedure, encoders may implement any alternative motion search algorithms. @@ -508,9 +508,9 @@ Since motion estimation is a non-normative procedure, encoders may implement any \subsubsection{Reference picture management} Another improvement in \ac{hevc} is related with the reference picture management scheme. \ac{hevc} introduces the \ac{rpset} concept~\cite{HEVCHighLevelReferenceDez2012}, which defines how previously decoded pictures are managed in the \ac{dpb}. -Decoded frames in the \ac{dpb} are grouped in one of the following categories: (i) \emph{short-term reference}, (ii) \emph{long-term reference} and (iii) \emph{unused for reference}. +Decoded frames in the \ac{dpb} are grouped in one of the following categories: (i) \emph{short-term reference}, (ii) \emph{long-term reference} and (iii) \emph{unused for reference}. Once a frame is marked as \emph{unused for reference} it is no longer used for motion compensation and it will be discarded from the \ac{dpb} after being sent to the displayed. -In \ac{h264} a sliding window approach is used to implicitly manage the reference picture list. +In \ac{h264} a sliding window approach is used to implicitly manage the reference picture list. This process discards a given frame whenever the \ac{dpb} has the number of defined reference frames (which is controlled by the encoder). Moreover, \ac{h264} uses an explicitly \ac{mmco} to send commands to the decoder and change the normal reference picture management process. \begin{table}[tb] @@ -534,17 +534,17 @@ This process discards a given frame whenever the \ac{dpb} has the number of defi In the \ac{hevc} standard the status of the \ac{dpb} is encoded for every slice, instead of the implicit managing used in the past. The most fundamental difference in \ac{rpset} concept compared to \ac{mmco}/sliding window of \ac{h264} is that each particular frame has a complete set of the reference frames that are used or will be used (or will be used in subsequent frames). Thus, a complete set of all frames that must be kept in the \ac{dpb} explicitly provided. -This is different from \ac{h264} where only relative changes to the \ac{dpb} encoded. -With the \ac{rpset} concept, no information from earlier frames in decoding order is needed to maintain the correct status of the \ac{dpb}. +This is different from \ac{h264} where only relative changes to the \ac{dpb} encoded. +With the \ac{rpset} concept, no information from earlier frames in decoding order is needed to maintain the correct status of the \ac{dpb}. Table~\ref{Table2:ReferencePictureListExample} shows the \ac{rpset} for some frames illustrated in Figure~\ref{Figure2:LeadingTralingPics}. -As expected for the \ac{cra} frame ($I_2$) no information is sent to the decoder because there is not inter-prediction and the \ac{dpb} should be empty. +As expected for the \ac{cra} frame ($I_2$) no information is sent to the decoder because there is not inter-prediction and the \ac{dpb} should be empty. For the remaining frames, two types of information are encoded: frame number and a binary flag to indicate whether it is currently used. This is required because any frame not listed in a given \ac{rpset} will be discarded by the decoder and then subsequent frames cannot use them as reference. -The \ac{rpset} concept provides a basic level of error robustness to the reference picture management. -In \ac{h264} whenever a reference frame is lost the decoder can look at the value of the \emph{FrameNum} (incremental value associated with each reference frame) to detect the loss event. +The \ac{rpset} concept provides a basic level of error robustness to the reference picture management. +In \ac{h264} whenever a reference frame is lost the decoder can look at the value of the \emph{FrameNum} (incremental value associated with each reference frame) to detect the loss event. However, as gaps in \emph{FrameNum} are allowed the decoder might not be able to decide whether the missing frame was intentional or resulted of a transmission loss event. -%Moreover, even if the decoded if able to detect the loss event it might not be able to correctly compute the value the \ac{poc} associated with the concealed frame. +%Moreover, even if the decoded if able to detect the loss event it might not be able to correctly compute the value the \ac{poc} associated with the concealed frame. Using the \ac{rpset} concept the decoder is always able to detect loss events and correctly identify the missing frames. \subsubsection{Asymmetric block partitions} @@ -560,16 +560,16 @@ Using the \ac{rpset} concept the decoder is always able to detect loss events an \end{figure} -When inter prediction mode is selected a higher range of partitioning schemes is allowed, thus dividing the \ac{cu} into one, two or four \acs{pu}. -The splitting into four \acs{pu} is only allowed when the \ac{cu} size is equal to the minimum. -%Otherwise, the splitting should be carried out at the \ac{cu} level which leads to the same partition tree. -Figure~\ref{Figure2:InterPuPartitions} illustrates the possible \ac{cu} partitioning into \acs{pu}. +When inter prediction mode is selected a higher range of partitioning schemes is allowed, thus dividing the \ac{cu} into one, two or four \acs{pu}. +The splitting into four \acs{pu} is only allowed when the \ac{cu} size is equal to the minimum. +%Otherwise, the splitting should be carried out at the \ac{cu} level which leads to the same partition tree. +Figure~\ref{Figure2:InterPuPartitions} illustrates the possible \ac{cu} partitioning into \acs{pu}. %One should note that the partition type applied to the \ac{cu} is also applied to divide the \ac{cb} into \acs{pb}. -Figure~\ref{Figure2:InterPuPartitions}~(a) shows the symmetric partitions. -The $N \times N$ corresponds to the case where the \ac{cu} is not further divided. -Then, the standard defines the horizontal and vertical division into two \acs{pu}, corresponding to the $\frac{N}{2}\times N$ and $N \times \frac{N}{2}$ cases, respectively. +Figure~\ref{Figure2:InterPuPartitions}~(a) shows the symmetric partitions. +The $N \times N$ corresponds to the case where the \ac{cu} is not further divided. +Then, the standard defines the horizontal and vertical division into two \acs{pu}, corresponding to the $\frac{N}{2}\times N$ and $N \times \frac{N}{2}$ cases, respectively. Finally, the $\frac{N}{2} \times \frac{N}{2}$ case results in four \acs{pu}. -The partitions shown in Figure~\ref{Figure2:InterPuPartitions}~(b) correspond to the asymmetric partitioning, which is one of the main improvements introduced in \ac{hevc}, as it allows higher flexibility in motion estimation, leading to higher compression efficiency~\cite{HEVCBlock2012}. +The partitions shown in Figure~\ref{Figure2:InterPuPartitions}~(b) correspond to the asymmetric partitioning, which is one of the main improvements introduced in \ac{hevc}, as it allows higher flexibility in motion estimation, leading to higher compression efficiency~\cite{HEVCBlock2012}. These partitions types are only allowed for \acs{cu} with $16\times16$ pixels or larger. \subsubsection{Merge mode} @@ -583,23 +583,23 @@ These partitions types are only allowed for \acs{cu} with $16\times16$ pixels or \end{figure} The Merge mode was introduced in \ac{hevc} as a new technique to derive motion information from spatial and temporal neighbouring blocks~\cite{MotionCodingHEVC2013}. This technique extends the concepts of the Direct and Skip modes used in \ac{h264}~\cite{H264OverviewJul2003}, using a more sophisticated approach with two key differences. -Firstly, the Merge Mode allows for more \ac{mv} candidates than the Skip in \ac{h264}. -Thus, an index is used to identify one out of several \ac{mv} candidates. +Firstly, the Merge Mode allows for more \ac{mv} candidates than the Skip in \ac{h264}. +Thus, an index is used to identify one out of several \ac{mv} candidates. Secondly, the reference picture index is explicitly identified. -This results in improved flexibility, compared with the predefined values used in \ac{h264}. -The \ac{mv} candidates allowed in the Merge Mode\cite{MotionCodingHEVC2013} are illustrated in Figure \ref{Figure2:MVCandidates}. +This results in improved flexibility, compared with the predefined values used in \ac{h264}. +The \ac{mv} candidates allowed in the Merge Mode\cite{MotionCodingHEVC2013} are illustrated in Figure \ref{Figure2:MVCandidates}. The figure shows the positions of the spatial \ac{mv} candidates ($A_0$, $A_1$, $B_0$, $B_1$, $B_2$). Moreover, it also uses a temporal \ac{mv} candidate, derived from the co-located position on the temporally adjacent frame at positions $T_0$ or $T_1$. From the \ac{mv} candidate list the unavailable candidates are not considered, and duplicated candidates (i.e. with the same motion information) are removed. The Merge Mode uses a $C-1$ spatial \ac{mv} candidates, selected from the aforementioned order, and one temporal \ac{mv} candidate to fulfil the total number of \acs{mv} ($C$). The value of $C$ is defined at the slice header and a flag controlling the use of temporal \ac{mv} candidates is encoded at the \ac{pps}-level. For B-slices, additional \ac{mv} candidates are considered by choosing two existing candidates according to a predefined order for reference picture list 0 and list 1. A total number of twelve combinations are specified in \ac{hevc}, which are listed in~\cite{HEVCOverviewDez2012}. For P-slices, if the number of candidates is less than $C$, then zero \acs{mv} are included to fill the remaining entries. -The Merge Mode defines how to encode the \ac{mv} candidate and the residual information. +The Merge Mode defines how to encode the \ac{mv} candidate and the residual information. In \ac{hevc}, the Skip mode, i.e., transmitting only the \ac{mv} without residual information, is treated as a special case of the Merge Mode. In this case only a skip flag is enabled, and the corresponding merge index is transmitted. \subsubsection{Motion vector prediction} -The \ac{hevc} also improves the performance of the \ac{mv} coding for those cases where the Merge Mode is not used. +The \ac{hevc} also improves the performance of the \ac{mv} coding for those cases where the Merge Mode is not used. \ac{hevc} always use a differential encoding approach for efficiently representing the motion information. It considers the same \ac{mv} candidates of the Merge mode, illustrated in Figure~\ref{Figure2:MVCandidates}, to derive the \ac{mv} predictors from which the difference vector is obtained. From these \ac{mv} candidates only the first two available candidates are selected based on the following order: @@ -610,7 +610,7 @@ From these \ac{mv} candidates only the first two available candidates are select \end{enumerate} Therefore, the use of the temporal \ac{mv} candidate is limited to those cases where the spatial neighbours are not able to provide two valid candidates. -For \ac{mv} prediction only a much lower number of candidates is allowed, since the encoder can still send a \ac{mv} difference. Moreover, the encoder performs motion estimation for each candidate, which increases the encoding complexity for every possibility tested. +For \ac{mv} prediction only a much lower number of candidates is allowed, since the encoder can still send a \ac{mv} difference. Moreover, the encoder performs motion estimation for each candidate, which increases the encoding complexity for every possibility tested. %For those cases where the reference index is not the same as the current \ac{pu} and the neighbouring one, a scaling version of the \ac{mv} is used. %In the \ac{h264} standard, along different motion compensated coding techniques~\cite{H264OverviewJul2003}, the so-called P\_SKIP mode was introduced. In this mode, neither the quantised residual information, nor the \ac{mv} is transmitted. This mode is useful for large areas with no change or just constant motion, and it is only enabled for $16\times16$ blocks, \emph{i.e.}, the whole \ac{mb}. The \ac{mv} for the P\_SKIP mode is derived based on the surrounding neighbour MBs\cite{H264MotionVectorPrediction2003}. When no neighbours are available, or the left or top \acs{mv} are equal to zero, a zero \ac{mv} is used. Otherwise, the \ac{mv} is derived from the median value of the following three neighbours: left, above and above right, as shown in Figure \ref{SkipMergeMode}~(a) by $MV_A$, $MV_B$ and $MV_C$, respectively. Whenever the $MV_C$ is not available, the $MV_D$ is used instead. @@ -634,7 +634,7 @@ The residual block is partitioned into multiple square blocks, referred to as \a A 2D transform of the residual information is obtained by applying 1D transforms in both the horizontal and vertical directions. The core transform matrices are obtained from the \ac{dct} basis functions to define a integer matrix of $32\times32$ points. Sub-sampled versions of this matrix are used to derive the remaining transform matrix sizes down to $4\times4$. -A special case is applied for coding the residual of $4\times4$ intra coded block. +A special case is applied for coding the residual of $4\times4$ intra coded block. In this case an alternative integer transform based on the \ac{dst} is used. The motivation for \ac{dst} is related to the statistics of the residual signal of these blocks, which tend to present higher residue as the distance to the boundary used for prediction (i.e, top or left boundary) increases. Experiments have shown that \ac{dst} provides up to 1\% of bitrate savings for the compression of $4\times4$ intra predicted blocks, without significantly increase the computational complexity \cite{DCTDSTComp2013}. @@ -643,8 +643,8 @@ Experiments have shown that \ac{dst} provides up to 1\% of bitrate savings for \glsreset{qp} -The \ac{hevc} follows the same principle introduced previous standards for quantisation. -After applying the transform operation to prediction residue transform a quantisation is applied to the resulting coefficients using a uniform-reconstruction quantiser scheme based on a \ac{qp}. +The \ac{hevc} follows the same principle introduced previous standards for quantisation. +After applying the transform operation to prediction residue transform a quantisation is applied to the resulting coefficients using a uniform-reconstruction quantiser scheme based on a \ac{qp}. The standard supports \ac{qp} values ranging from 0 to 51, and an increase of 6 in the \ac{qp} corresponds to doubling the quantisation step. This procedure is the main responsible for the coding distortion as it performs many-to-one mapping, which cannot be reversed. @@ -656,7 +656,7 @@ The standard supports \ac{qp} values ranging from 0 to 51, and an increase of 6 \glsreset{cabac} -\ac{hevc} only uses the \ac{cabac}, which is an arithmetic coding method that only uses binary symbols, considering different probability models for each symbol~\cite{H264Cabac2003}. +\ac{hevc} only uses the \ac{cabac}, which is an arithmetic coding method that only uses binary symbols, considering different probability models for each symbol~\cite{H264Cabac2003}. Entropy coding efficiency is closely linked with the context model selected. Therefore, this was carefully designed in the \ac{hevc} standard, extending the functionality previously defined for \ac{h264}. For example, the \ac{hevc} standard exploits the depth of the partition tree or residual transform tree in order to derive the context models for several syntax elements. Regarding transform coefficient coding, \ac{cabac} uses a scanning method to firstly organise the coefficients and then encodes the position of the last non-zero transform coefficient. @@ -676,9 +676,9 @@ The coefficient scanning is implicitly selected and always performed in $4\times The \ac{hevc} standard uses two filtering procedures over the reconstructed pixels before writing them into the frame buffer, namely the \ac{dbf} and the \ac{sao} filter. The main purpose of deblocking filter is to reduce blocking artefacts caused by the block-based coding tools.%, operating similarly to the deblocking filter of the \ac{h264} standard. -\ac{dbf} is applied to the samples that are spatially adjacent to the \ac{pu} or \ac{tu} boundaries, considering a $8\times8$ grid. +\ac{dbf} is applied to the samples that are spatially adjacent to the \ac{pu} or \ac{tu} boundaries, considering a $8\times8$ grid. Such grid-based restriction reduces the computational complexity and improves parallel-processing -implementation which is one of the main goals of \ac{hevc}. +implementation which is one of the main goals of \ac{hevc}. Three strength levels can be used by the \ac{dbf} depending on the coded block characteristics. The \ac{sao} is a non-linear filter, that is adaptively applied to all samples of the image, after the deblocking filter. In its operation, the \ac{sao} filter modifies the samples diff --git a/022_ErrorResilience/Figures/BMAAlgorithm.pdf b/022_ErrorResilience/Figures/BMAAlgorithm.pdf old mode 100755 new mode 100644 diff --git a/022_ErrorResilience/Figures/BMAAlgorithm.tex b/022_ErrorResilience/Figures/BMAAlgorithm.tex old mode 100755 new mode 100644 diff --git a/022_ErrorResilience/Figures/BiDirMotionCopy.tex b/022_ErrorResilience/Figures/BiDirMotionCopy.tex old mode 100755 new mode 100644 diff --git a/022_ErrorResilience/Figures/BiDirMotionCopy2011.pdf b/022_ErrorResilience/Figures/BiDirMotionCopy2011.pdf old mode 100755 new mode 100644 diff --git a/022_ErrorResilience/Figures/DBFDPCon2009.pdf b/022_ErrorResilience/Figures/DBFDPCon2009.pdf old mode 100755 new mode 100644 diff --git a/022_ErrorResilience/Figures/DFDPMethod.tex b/022_ErrorResilience/Figures/DFDPMethod.tex old mode 100755 new mode 100644 diff --git a/022_ErrorResilience/Figures/EdgesDirectionSDV.pdf b/022_ErrorResilience/Figures/EdgesDirectionSDV.pdf old mode 100755 new mode 100644 diff --git a/022_ErrorResilience/Figures/EdgesInterception.pdf b/022_ErrorResilience/Figures/EdgesInterception.pdf old mode 100755 new mode 100644 diff --git a/022_ErrorResilience/Figures/EdgesInterception_a.pdf b/022_ErrorResilience/Figures/EdgesInterception_a.pdf old mode 100755 new mode 100644 diff --git a/022_ErrorResilience/Figures/EdgesInterception_b.pdf b/022_ErrorResilience/Figures/EdgesInterception_b.pdf old mode 100755 new mode 100644 diff --git a/022_ErrorResilience/Figures/EdgesInterception_c.pdf b/022_ErrorResilience/Figures/EdgesInterception_c.pdf old mode 100755 new mode 100644 diff --git a/022_ErrorResilience/Figures/FlowchartIlluminationStereo.pdf b/022_ErrorResilience/Figures/FlowchartIlluminationStereo.pdf old mode 100755 new mode 100644 diff --git a/022_ErrorResilience/Figures/IVSMID2010.pdf b/022_ErrorResilience/Figures/IVSMID2010.pdf old mode 100755 new mode 100644 diff --git a/022_ErrorResilience/Figures/LinearInterpolation.tex b/022_ErrorResilience/Figures/LinearInterpolation.tex old mode 100755 new mode 100644 diff --git a/022_ErrorResilience/Figures/MVE.pdf b/022_ErrorResilience/Figures/MVE.pdf old mode 100755 new mode 100644 diff --git a/022_ErrorResilience/Figures/MVE.vsd b/022_ErrorResilience/Figures/MVE.vsd old mode 100755 new mode 100644 diff --git a/022_ErrorResilience/Figures/MaximallySmoothimageRecovery.pdf b/022_ErrorResilience/Figures/MaximallySmoothimageRecovery.pdf old mode 100755 new mode 100644 diff --git a/022_ErrorResilience/Figures/ModAverageAlgorithm.pdf b/022_ErrorResilience/Figures/ModAverageAlgorithm.pdf old mode 100755 new mode 100644 diff --git a/022_ErrorResilience/Figures/ModEdgeOriented.pdf b/022_ErrorResilience/Figures/ModEdgeOriented.pdf old mode 100755 new mode 100644 diff --git a/022_ErrorResilience/Figures/MotionDisparityProjection.pdf b/022_ErrorResilience/Figures/MotionDisparityProjection.pdf old mode 100755 new mode 100644 diff --git a/022_ErrorResilience/Figures/OcclusionsDetection.pdf b/022_ErrorResilience/Figures/OcclusionsDetection.pdf old mode 100755 new mode 100644 diff --git a/022_ErrorResilience/Figures/POCSBlockDiagram.pdf b/022_ErrorResilience/Figures/POCSBlockDiagram.pdf old mode 100755 new mode 100644 diff --git a/022_ErrorResilience/Figures/PixelBasedMVE.pdf b/022_ErrorResilience/Figures/PixelBasedMVE.pdf old mode 100755 new mode 100644 diff --git a/022_ErrorResilience/Figures/PixelBasedMVE.tex b/022_ErrorResilience/Figures/PixelBasedMVE.tex old mode 100755 new mode 100644 diff --git a/022_ErrorResilience/Figures/RefinedMotionCopy.tex b/022_ErrorResilience/Figures/RefinedMotionCopy.tex old mode 100755 new mode 100644 diff --git a/022_ErrorResilience/Figures/SpatialTemporalErrorPropagation.tikz b/022_ErrorResilience/Figures/SpatialTemporalErrorPropagation.tikz deleted file mode 100644 index 28ca1d1..0000000 --- a/022_ErrorResilience/Figures/SpatialTemporalErrorPropagation.tikz +++ /dev/null @@ -1,177 +0,0 @@ - - -\newcommand{\scale}{1} - -\newcommand{\frameScale}{.3} -% \newcommand{\TikZxscale}{0.55} -\newcommand{\xfshift}{8cm} -% \newcommand{\TikZyslant}{0.4} -% \newcommand{\TikZyfshift}{0.05cm} - -\definecolor{colorFrameBackground}{rgb}{.82,.89,.95} -% \definecolor{colorErrorsRegion}{rgb}{.163,.547,.757} -\definecolor{colorErrors}{rgb}{.16,.40,.40} -\definecolor{colorErrorsRegion}{rgb}{.209,.705,.740} - - -\usetikzlibrary{patterns} - -\makeatletter -\pgfdeclareshape{test shape} -{ - \inheritsavedanchors[from=rectangle] - \inheritanchor[from=rectangle]{center} - - \backgroundpath - { - \def\my@color{.}% - \ifx\tikz@strokecolor\pgfutil@empty - \else - \let\my@color\tikz@strokecolor - \fi - \pgfsetfillpattern{north east lines}{\my@color} - \pgfpathrectanglecorners{\pgfpoint{0}{0}}{\pgfpoint{1cm}{1cm}} - \pgfusepath{fill} - } -} -\makeatother - -\newcommand{\FillFrame}[1] -{ - \draw[fill=#1,fill opacity=1, very thick] (0,0) rectangle (8+1,8+1); % Opacity -% \draw[thick] (0,0) rectangle (#2+1,#2+1); -% \foreach \x in {1,...,#2} -% \draw (\x,0) -- ++(0,#2+1); -% \foreach \y in {1,...,#2} -% \draw (0,\y) -- ++(#2+1,0); -} - -\newcommand{\DrawFrame}[1] -{ - \draw[fill=#1,fill opacity=1, very thick] (0,0) rectangle (8+1,8+1); % Opacity -% \draw[thick] (0,0) rectangle (#2+1,#2+1); -% \foreach \x in {1,...,#2} -% \draw (\x,0) -- ++(0,#2+1); -% \foreach \y in {1,...,#2} -% \draw (0,\y) -- ++(#2+1,0); -} - -\newcommand{\DrawBlock}[3] -{ - \DrawBlockWithSize{#1}{#2}{#3}{1}{1} -} -\newcommand{\DrawBlockWithSize}[5] -{ - \draw[draw=#1, fill=#1] (#2,#3) rectangle ++(#4 cm,#5 cm); -} - - -\begin{tikzpicture}[use Hobby shortcut,closed=true] - -\tikzstyle{refmv_line}=[thick,draw=black] -\tikzstyle{refmv}=[refmv_line,-latex,densely dashed] -\tikzstyle{refmv_0}=[refmv,] -\tikzstyle{refmv_1}=[refmv_0] - -\tikzstyle{errorBlock}=[draw=colorErrors, fill=colorErrors] -\tikzstyle{errorPropagation}=[draw=colorErrorsRegion, fill=colorErrorsRegion] - -\coordinate (ErrorPosition) at (4,4); - - -\def\errorPosX{3} -\def\errorPosY{6} - -\begin{scope}[scale=\frameScale*.95, yshift=2*\TikZyfshift, xshift=-2*\xfshift] - \DrawFrame{colorFrameBackground} -% \node at (12cm/2,-1.5cm) { $f_{t}$ }; - - \draw[errorBlock] (\errorPosX,\errorPosY) rectangle ++(1cm,1cm); - - \foreach \x in {\errorPosX,...,7} - \draw[errorPropagation] (\x+1,\errorPosY) rectangle ++(1 cm,1 cm); - \foreach \y in {0.1,1,2,3,4,5} - \foreach \x in {0.1,1,2,3,4,5,6,7,8} - \draw[errorPropagation] (\x,\y) rectangle ++(1 cm,1 cm); - - \draw (0,\errorPosY) -- ++(\errorPosX + 1,0) -- ++(0,1) -- ++(8-\errorPosX,0); - -\end{scope} - -\begin{scope}[scale=\frameScale, yshift=2*\TikZyfshift, xshift=0*\xfshift, yslant=\TikZyslant,xscale=\TikZxscale] - \DrawFrame{colorFrameBackground} - \node at (12cm/2,-1.5cm) { $f_{t}$ }; - - \draw[errorBlock] (\errorPosX,\errorPosY) rectangle ++(1cm,1cm); -\end{scope} - -\begin{scope}[scale=\frameScale, yshift=2*\TikZyfshift, xshift=1*\xfshift, yslant=\TikZyslant,xscale=\TikZxscale] - \DrawFrame{colorFrameBackground} - \node at (12cm/2,-1.5cm) { $f_{t+1}$ }; -% \begin{scope}[yshift=3.8cm, xshift=2.4cm] -% \draw[erros] plot[scale=.3,smooth, tension=.7] coordinates {(0,0) (.5,3) (2.5,4) (5,3.5) (7.5,4) (8.5,3) (8.5,1) (10,-1.5) (3.5,0) (.5,-1.5) (0,0)}; -% \end{scope} - - \draw[errorPropagation] (\errorPosX,\errorPosY) rectangle ++(1cm,1cm); - \draw[errorPropagation] (\errorPosX,\errorPosY -1) rectangle ++(1cm,1cm); - \draw[errorPropagation] (\errorPosX +1,\errorPosY) rectangle ++(1cm,1cm); - -\end{scope} - -\begin{scope}[scale=\frameScale, yshift=2*\TikZyfshift, xshift=2*\xfshift, yslant=\TikZyslant,xscale=\TikZxscale] - \DrawFrame{colorFrameBackground} - \node at (12cm/2,-1.5cm) { $f_{t+2}$ }; - - \draw[errorPropagation] (\errorPosX,\errorPosY) rectangle ++(1cm,1cm); - \draw[errorPropagation] (\errorPosX +1,\errorPosY) rectangle ++(1cm,1cm); - \draw[errorPropagation] (\errorPosX +2,\errorPosY) rectangle ++(1cm,1cm); - \draw[errorPropagation] (\errorPosX,\errorPosY -1) rectangle ++(1cm,1cm); - \draw[errorPropagation] (\errorPosX+1,\errorPosY -1) rectangle ++(1cm,1cm); - \draw[errorPropagation] (\errorPosX+1,\errorPosY -2) rectangle ++(1cm,1cm); -\end{scope} - -\begin{scope}[scale=\frameScale, yshift=3*\TikZyfshift, xshift=3*\xfshift, yslant=\TikZyslant,xscale=\TikZxscale] - \DrawFrame{colorFrameBackground} - \node at (12cm/2,-1.5cm) { $f_{t+3}$ }; -% \begin{scope}[yshift=3.1cm, xshift=1.9cm] -% \draw[erros] plot[scale=.5,smooth, tension=.7] coordinates {(0,0) (.5,3) (2.5,4) (5,3.5) (7.5,4) (8.5,3) (8.5,1) (10,-1.5) (3.5,0) (.5,-1.5) (0,0)}; -% \end{scope} - - \draw[errorPropagation] (\errorPosX ,\errorPosY) rectangle ++(1cm,1cm); - \draw[errorPropagation] (\errorPosX +1,\errorPosY) rectangle ++(1cm,1cm); - \draw[errorPropagation] (\errorPosX +2,\errorPosY) rectangle ++(1cm,1cm); - \draw[errorPropagation] (\errorPosX ,\errorPosY -1) rectangle ++(1cm,1cm); - \draw[errorPropagation] (\errorPosX +1,\errorPosY -1) rectangle ++(1cm,1cm); - \draw[errorPropagation] (\errorPosX +2,\errorPosY -1) rectangle ++(1cm,1cm); - \draw[errorPropagation] (\errorPosX +0,\errorPosY -2) rectangle ++(1cm,1cm); - \draw[errorPropagation] (\errorPosX +1,\errorPosY -2) rectangle ++(1cm,1cm); - \draw[errorPropagation] (\errorPosX +0,\errorPosY -3) rectangle ++(1cm,1cm); - -\end{scope} - -\begin{scope}[scale=\frameScale, yshift=4*\TikZyfshift, xshift=4*\xfshift, yslant=\TikZyslant,xscale=\TikZxscale] - \DrawFrame{colorFrameBackground} - \node at (12cm/2,-1.5cm) { $f_{t+4}$ }; -% \begin{scope}[yshift=3cm, xshift=1.8cm] -% \draw[erros] plot[scale=.6,smooth, tension=.7] coordinates {(0,0) (.5,3) (2.5,4) (5,3.5) (7.5,4) (8.5,3) (8.5,1) (10,-1.5) (3.5,0) (.5,-1.5) (0,0)}; -% \end{scope} - \draw[errorPropagation] (\errorPosX ,\errorPosY) rectangle ++(1cm,1cm); - \draw[errorPropagation] (\errorPosX +1,\errorPosY) rectangle ++(1cm,1cm); - \draw[errorPropagation] (\errorPosX +2,\errorPosY) rectangle ++(1cm,1cm); - \draw[errorPropagation] (\errorPosX +3,\errorPosY) rectangle ++(1cm,1cm); - \draw[errorPropagation] (\errorPosX ,\errorPosY -1) rectangle ++(1cm,1cm); - \draw[errorPropagation] (\errorPosX +1,\errorPosY -1) rectangle ++(1cm,1cm); - \draw[errorPropagation] (\errorPosX +2,\errorPosY -1) rectangle ++(1cm,1cm); - \draw[errorPropagation] (\errorPosX +3,\errorPosY -1) rectangle ++(1cm,1cm); - \draw[errorPropagation] (\errorPosX +4,\errorPosY -1) rectangle ++(1cm,1cm); - \draw[errorPropagation] (\errorPosX +0,\errorPosY -2) rectangle ++(1cm,1cm); - \draw[errorPropagation] (\errorPosX +1,\errorPosY -2) rectangle ++(1cm,1cm); - \draw[errorPropagation] (\errorPosX +2,\errorPosY -2) rectangle ++(1cm,1cm); - \draw[errorPropagation] (\errorPosX +0,\errorPosY -3) rectangle ++(1cm,1cm); - \draw[errorPropagation] (\errorPosX +2,\errorPosY -3) rectangle ++(1cm,1cm); - -\end{scope} - -\path[draw, -latex, thick] (-.5cm,-.5cm) -- ++(12.5cm,0) node[pos=1, yshift=-.2cm] {$t$}; - -\end{tikzpicture} diff --git a/022_ErrorResilience/RobustTransmissionReview.tex b/022_ErrorResilience/RobustTransmissionReview.tex index a146761..7733d66 100755 --- a/022_ErrorResilience/RobustTransmissionReview.tex +++ b/022_ErrorResilience/RobustTransmissionReview.tex @@ -71,18 +71,28 @@ Finally, concealment-aware techniques are used at the encoder, to either adapt t \label{Section22:Localisation} -Localization techniques break the predictive coding loop in order to reduce the likelihood of errors affect large regions of the video stream, both in the spatial and temporal domains. -As expected since localization techniques break the predictive coding, it reduces the efficiency of such methods. This leads to lower compression ratios and increasing bitrate. +The basic principle of localization techniques is to break the predictive coding loop at certain predictive points, in order to reduce the likelihood of errors affecting large regions of the video signal, considering both the spatial and temporal domains. +Since these techniques break the predictive coding, they have a negative impact in compression efficiency as expected. \begin{figure}[tb] - \centering - \includegraphics[width=0.7\columnwidth]{\TransmissionResiliencefigs/ErrorPropagation_1.png} - \caption{Examples of spatial and temporal error propagation and how it can be reduce using localisation techniques \cite{ErrorResilienceAug2005}.} - \label{fig2:ErrorPropagation} +\centering +%\subfloat{\input{./022_ErrorResilience/Figures/LocalizationTechniquesSpatial.tikz}}\\ +%\subfloat{\input{./022_ErrorResilience/Figures/LocalizationTechniquesTemporal.tikz}} +\input{./022_ErrorResilience/Figures/LocalizationTechniques_v2.tikz} +\caption{Examples of spatial and temporal error propagation and how it can be reduced using localisation techniques \cite{ErrorResilienceAug2005}.} \end{figure} -This category of error resilience techniques are able to reduce the error propagation at two levels, i.e., temporal and spatial levels as shown in Figure~\ref{fig2:ErrorPropagation}. -As shown in the figure spatial techniques break the dependencies within a single frame, as temporal error propagation can be reduce by selectively breaking the dependencies across different frames. +%\begin{figure}[tb] +% \centering +% \includegraphics[width=0.7\columnwidth]{\TransmissionResiliencefigs/ErrorPropagation_1.png} +% \caption{Examples of spatial and temporal error propagation and how it can be reduce using localisation techniques \cite{ErrorResilienceAug2005}.} +% \label{fig2:ErrorPropagation} +%\end{figure} + +This group of error resilience techniques are able to reduce the error propagation at two levels, i.e., temporal and spatial levels. +This is illustrated in in Figure~\ref{fig2:ErrorPropagation}, where one can observe that spatial techniques break the dependencies within a single frame, while temporal error propagation can be reduce by selectively breaking the dependencies across different frames. + +\HERE \subsection{Error resilient rate-distortion optimisation} @@ -93,26 +103,26 @@ A common localization technique addresses the error resilience problem of the ra where $D$ is the distortion of all pixels, $R$ the required bitrate, and $\lambda$ is the Lagrangian multiplier. In \cite{ROPEJun2000,ROPE2007,ROPERefGenJan2010} a rate distortion optimisation for error resilience was presented. In order to take into consideration possible network losses a \ac{rope} of the end-to-end distortion is applied at the encoder-side. -Let $f_n^i$ denote the original value of pixel $i$ in frame $n$, $\hat f_n^i$ denote its encoder reconstruction and $\tilde f_n^i$ the decoder reconstruction after error concealment if needed. -Since data loss may occur in the transmission channel, $tilde f_n^i$ is considered a random variable at the encoder. +Let $f_t^i$ denote the original value of pixel $i$ in frame at instant $t$, $\hat f_t^i$ denote its encoder reconstruction and $\tilde f_t^i$ the decoder reconstruction after error concealment if needed. +Since data loss may occur in the transmission channel, $\tilde f_t^i$ is considered a random variable at the encoder. The expected mean square error of each pixel is given by: \begin{align} -E\left\{d_n^i\right\} &= E\left\{ \left( f_n^i - \tilde f_n^i\right)^2 \right\} \nonumber \\ - &= (f_n^i)^2 - 2 f_n^i E\left\{ \tilde f_n^i \right\} + E\left\{ \left(\tilde f_n^i\right)^2 \right\} +E\left\{d_t^i\right\} &= E\left\{ \left( f_t^i - \tilde f_t^i\right)^2 \right\} \nonumber \\ + &= (f_t^i)^2 - 2 f_t^i E\left\{ \tilde f_t^i \right\} + E\left\{ \left(\tilde f_t^i\right)^2 \right\} \end{align} Then to take into consideration the channel losses packet loss probability ($p$) must be used in the distortion measurement. This leads to the following for intra-coded pixels: \begin{align}\label{EQ2:E2EDIntra} -E\left\{ \tilde f_n^i \right\} &= \left(1-p\right) \hat f_n^i + p E\left\{ \tilde f_{n-1}^i \right\} \nonumber \\ -E\left\{\left( \tilde f_n^i \right)^2 \right\} &= \left(1-p\right) \left( \hat f_n^i \right) + p E\left\{ \left( \tilde f_{n-1}^i \right)^2 \right\}, +E\left\{ \tilde f_t^i \right\} &= \left(1-p\right) \hat f_t^i + p E\left\{ \tilde f_{n-1}^i \right\} \nonumber \\ +E\left\{\left( \tilde f_t^i \right)^2 \right\} &= \left(1-p\right) \left( \hat f_t^i \right) + p E\left\{ \left( \tilde f_{n-1}^i \right)^2 \right\}, \end{align} and inter-coded pixels: \begin{align}\label{EQ2:E2EDInter} -E\left\{ \tilde f_n^i \right\} &= \left(1-p\right) \left( \hat e_n^i + E\left\{ \tilde f_{n-1}^{j} \right\} \right) + p E\left\{ \tilde f_{n-1}^i \right\} \nonumber \\ -E\left\{\left( \tilde f_n^i \right)^2 \right\} &= \left(1-p\right) \left( \left( \hat e_n^i \right)^2 + 2 \hat e_n^i E\left\{ \tilde f_{n-1}^{j} \right\} + E\left\{ \left( \tilde f_{n-1}^{j} \right)^2 \right\} \right) + p E\left\{ \left( \tilde f_{n-1}^i \right)^2 \right\} +E\left\{ \tilde f_t^i \right\} &= \left(1-p\right) \left( \hat e_t^i + E\left\{ \tilde f_{n-1}^{j} \right\} \right) + p E\left\{ \tilde f_{n-1}^i \right\} \nonumber \\ +E\left\{\left( \tilde f_t^i \right)^2 \right\} &= \left(1-p\right) \left( \left( \hat e_t^i \right)^2 + 2 \hat e_t^i E\left\{ \tilde f_{n-1}^{j} \right\} + E\left\{ \left( \tilde f_{n-1}^{j} \right)^2 \right\} \right) + p E\left\{ \left( \tilde f_{n-1}^i \right)^2 \right\} \end{align} where the inter-coded pixel $i$ is predicted from pixel $j$ in the previous frame. -The prediction error $e_n^i$, is quantized to the value $\hat e_n^i$, which is transmitted to the decoder along with the motion information. +The prediction error $e_t^i$, is quantized to the value $\hat e_t^i$, which is transmitted to the decoder along with the motion information. Equations \ref{EQ2:E2EDIntra} and \ref{EQ2:E2EDInter} allow to measure the distortion taking into consideration the compression error but also the possible of frame loss and consequent \ac{ec} distortion. This technique was used in \cite{ROPEJun2000} to switch between intra and inter coding modes reducing the temporal dependencies, and, thus achieving superior error robustness in video transmission. In \cite{AdvancesROPEHE2642007} this technique was optimized to quarter pixel estimation in \ac{h264} standard. Moreover, in \cite{ROPEBurst2009} this method is extended for burst losses by introducing the probability of burst losses into the original end-to-end estimation. This shown to improve the quality under frame loss. In \cite{EndToEndDistortionConcealment2014} the distortion estimation assumes a temporal \ac{ec} at the decoder-side. @@ -155,17 +165,17 @@ In order to reduce error propagation one can employ leaky predictions \cite{Leak This leads to an exponential decay of error propagation, which leads to higher error robustness. In order to generate such reference frames the following can be applied \begin{equation}\label{EQ2:LeakyPredConstant} - \check f_n^i = \alpha \hat f_n^i + (1- \alpha)C, + \check f_t^i = \alpha \hat f_t^i + (1- \alpha)C, \end{equation} -where $\check f_n^i$ is a reference frame pixel, $\alpha$ is the leak factor, and $C$ is a constant value. +where $\check f_t^i$ is a reference frame pixel, $\alpha$ is the leak factor, and $C$ is a constant value. The use of leaky predictions has been used in the past for error control especially in scalable video coding \cite{LeakyPredScalable2002}, where $C$ in Equation~(\ref{EQ2:LeakyPredConstant}) is replace by a lower layer error-free reconstruction. In case of single layer coding, the use of a constant value has significant impact on the coding efficiency leading to higher bitrate as shown in \cite{LeakyPredConstant1973}. In order to overcome the coding efficiency problem weighted prediction can be used with similar advantages. Since \ac{h264} motion compensation can be applied from two individual previously encoded frames and combined together to generate a single prediction for the current frame \cite{WeightedBiPred2005}. In the case of \ac{hevc}, a method was proposed to force the use of dual inter-frame prediction~\cite{DualFrameME2015} leading to lower error propagations. In case of leaky prediction instead of applying motion compensation is applied once, but with an interpolated frame obtained as follow: \begin{equation}\label{EQ2:LeakyPredDual} - \check f_n^i = \alpha \hat f_n^i + (1- \alpha) \hat f_{n-1}^i. + \check f_t^i = \alpha \hat f_t^i + (1- \alpha) \hat f_{n-1}^i. \end{equation} -Using $\check f_n^i$ as reference frame for prediction significantly decrease error propagation if only one of the original coded frames is lost (i.e., $\hat f_{n}^i$ or $\hat f_{n-1}^i$). +Using $\check f_t^i$ as reference frame for prediction significantly decrease error propagation if only one of the original coded frames is lost (i.e., $\hat f_{n}^i$ or $\hat f_{n-1}^i$). \begin{figure}[tb] \centering @@ -182,7 +192,7 @@ In \cite{ROILeakyPred2009} in order to increase the error robustness with lower Figure \ref{fig2:ErrorPropagationROI} shows an example of error propagation within two different regions: \ac{roi} region and background. As show in the figure, since the \ac{roi} regions have predictions from regions in the background error propagation across regions occurs. Therefore, the method in \cite{ROILeakyPred2009} uses a weighted prediction for the \ac{roi} region obtained as follows: 1) a globally optimal prediction obtained by unrestricted motion estimation, 2) a prediction obtained by restricting motion estimation within the \ac{roi} region. This limits the impact on \ac{roi} from errors that affect background region. Moreover, since the leaky predictions are confined to a specific regions higher coding efficiency is achieved when compared with other methods. -Equation (\ref{EQ2:LeakyPredDual}) results in a finite impulse response based weighting of reference frames, as previously weighted frames are not considered. In \cite{ROPERefGenJan2010} an infinitive impulse response based scheme is proposed to increase the decay in error propagation. To accomplish that, in Equation (\ref{EQ2:LeakyPredDual}) the use of the previous encoded frame ($\hat f_{n-1}^i.$) is replaced by the previous interpolated frame ($\check f_n^i$). +Equation (\ref{EQ2:LeakyPredDual}) results in a finite impulse response based weighting of reference frames, as previously weighted frames are not considered. In \cite{ROPERefGenJan2010} an infinitive impulse response based scheme is proposed to increase the decay in error propagation. To accomplish that, in Equation (\ref{EQ2:LeakyPredDual}) the use of the previous encoded frame ($\hat f_{n-1}^i.$) is replaced by the previous interpolated frame ($\check f_t^i$). The idea of combining multiple predictions was also been used in the \ac{hevc} standard by combining it with end-to-end distortion to select the optimal predictions. \subsection{Reference picture selection} diff --git a/041_ImprovedErrorResilience/Figures/BlockDiagram.tikz b/041_ImprovedErrorResilience/Figures/BlockDiagram.tikz index 9179d8d..d27a0eb 100644 --- a/041_ImprovedErrorResilience/Figures/BlockDiagram.tikz +++ b/041_ImprovedErrorResilience/Figures/BlockDiagram.tikz @@ -11,8 +11,8 @@ arrow/.style={template, draw, -latex}, point/.style={template, draw, fill=black, circle,inner sep=0, minimum size=3}] \tikzstyle{sumBlock}=[template, draw,circle, inner sep=0cm, minimum size=0.1cm] -\tikzstyle{processBlock}=[template, draw, inner sep=0.2cm, minimum size=1cm,text width=1.5cm,fill=\TikZColorFill] -\tikzstyle{methodBlock}=[processBlock, fill=\TikZColorFillProp] +\tikzstyle{processBlock}=[template, draw, inner sep=0.2cm, minimum size=1cm,text width=1.5cm,fill=TikZColorFill] +\tikzstyle{methodBlock}=[processBlock, fill=TikZColorFillProp] \tikzstyle{blockArrow}=[arrow,draw,-latex] \tikzstyle{point} = [draw, fill=black, circle,inner sep=1pt] \coordinate (sumPoint) at (0,0); diff --git a/042_ConcealmentAwareEncoding/ConcealmentAwareEncoding.tex b/042_ConcealmentAwareEncoding/ConcealmentAwareEncoding.tex index 8700474..96693f5 100644 --- a/042_ConcealmentAwareEncoding/ConcealmentAwareEncoding.tex +++ b/042_ConcealmentAwareEncoding/ConcealmentAwareEncoding.tex @@ -18,14 +18,10 @@ \glsreset{rd} In this chapter an error concealment-aware encoding scheme is proposed to improve the quality of decoded video in broadcast environments prone to transmission errors and data loss. The method aims to improve the quality of recovered lost frames by optimising the efficiency of the \ac{ec} beforehand at the encoder-side. -The proposed scheme is based on a scalable coding approach where the best \ac{ec} methods to be used at the decoder are optimally determined at the encoder and signalled to the decoder through \ac{sei} messages. Such optimal \ac{ec} modes are found by simulating transmission losses followed by a lagrangian optimisation of the \textit{signalling rate - \ac{ec} distortion} cost. A generalised saliency-weighted distortion is used and the residue between coded frames and their EC substitutes is encoded using a rate-controlled enhancement layer. When data loss occurs the decoder uses the signalling information is used at the decoder, in case of data loss, to improve the reconstruction quality. +The proposed scheme is based on a scalable coding approach where the best \ac{ec} methods to be used at the decoder are optimally determined at the encoder and signalled through \ac{sei} messages. Such optimal \ac{ec} modes are found by simulating transmission losses followed by a lagrangian optimisation of the \textit{signalling rate - \ac{ec} distortion} cost. A generalised saliency-weighted distortion is used and the residue between coded frames and their EC substitutes is encoded using a rate-controlled enhancement layer. When data loss occurs the decoder uses the signalling information to improve the reconstruction quality. -%In this chapter a novel error concealment-aware video encoding scheme is proposed to increase the robustness of \ac{hevc} streams over transmission channels prone to errors or data loss, such as broadcasting networks. -%The method aims to improve the quality of recovered lost frames by optimising the efficiency of the error concealment (\ac{ec}) beforehand at the encoder-side. The proposed approach is based on finding the optimal \ac{ec} mode, in \ac{rd} sense, to be used at the decoder side. The process includes data loss simulation and minimisation of a lagrangian cost based on saliency-weighted distortion and signalling rate. Furthermore the residue -%between the coded frame and its error reconstructed version is also encoded using a rate-controlled enhancement scalable layer. - -This chapter is organized as follows. Section~\ref{Section5:Problem} presents the problem formulation and motivation for the method proposed in this chapter. In Section~\ref{Section5:ECCandidates} does an initial evaluation of different error concealment schemes in order to evaluate the relevant ones to be used in the proposed error concealment-aware coding scheme. -Section~\ref{Section5:OverviewProposedMethod} provides an overview of the architecture of the proposed method and Section~\ref{Section5:ProposedMethod} describe the proposed method in detail. +This chapter is organized as follows. Section~\ref{Section5:Problem} presents the problem formulation and motivation for the method proposed in this chapter. In Section~\ref{Section5:ECCandidates} does an initial evaluation of different error concealment schemes in order to find the relevant ones to be used in the proposed error concealment-aware coding scheme. +Section~\ref{Section5:OverviewProposedMethod} provides an overview of the architecture of the proposed method followed by a detailed description in Section~\ref{Section5:ProposedMethod}. Section~\ref{Section5:ECSignallingPerformance} presents a discussion of the performance of the proposed \ac{ec} optimisation and signalling, and Section~\ref{Section5:OverallPerformance} presents an overall performance of the proposed method. Finally, Section~\ref{Section5:Summary} concludes this chapter. @@ -37,12 +33,17 @@ Finally, Section~\ref{Section5:Summary} concludes this chapter. \label{Section5:Problem} \glsreset{mve} +\glsunset{mb} -Chapter~\ref{Chapter:ErrorResilienceReview} described different \ac{ec} algorithms that can effectively reconstruct lost data, leading to lower error propagation. However, as mentioned before different algorithms might not present the same accuracy for every lost frame or slice. Moreover, selection at the \ac{mb}/\ac{pu} level is not straightforward. Approaches in the past proposed the combination of spatial and temporal \ac{ec} strategies to improve the reconstruction quality~\cite{HybridConcTB2008}. Regarding temporal \ac{ec}, there are hybrid algorithms to optimise the \ac{mve} at the pixel and block levels \cite{HybridConcealmentTB2008,2DConcHybridMotion2010}. Regarding the \ac{hevc}, existing algorithms also aim to improve the reconstruction accuracy of the motion-based recovery by using the information of correctly received neighbours, e.g., block partitions~\cite{HEVCMCBlockAug2013} and prediction residue~\cite{HEVCMCResidueDec2013}. Although such methods are able to improve the reconstruction quality and reduce the artefacts, decoder-based decisions are still not fully accurate, as they do not have enough reference information to ease the decision process. Therefore, higher performance can be achieved by performing encoding-side estimations and decisions based on the error-free information. This approach not only improves quality but also reduces the complexity of the video decoders. +In Chapter~\ref{Chapter:ErrorResilienceReview} different \ac{ec} algorithms that can effectively reconstruct lost data were described. However, different algorithms might not present the same accuracy for every lost frame or slice. Moreover, selection at the \ac{mb}/\ac{pu} level is not straightforward. +In the past, hybrid \ac{ec} schemes were proposed to improve the reconstruction quality by either combining spatial and temporal \ac{ec} algorithms~\cite{HybridConcTB2008} or by optimising the \ac{mve} at the pixel and block levels~\cite{HybridConcealmentTB2008,2DConcHybridMotion2010}. +Regarding the \ac{hevc}, existing algorithms also aim to improve the reconstruction accuracy of the motion-based recovery by using the information of correctly received neighbours, e.g., block partitions~\cite{HEVCMCBlockAug2013} and prediction residue~\cite{HEVCMCResidueDec2013}. Although such methods are able to reduce the reconstruction artefacts and improve the overall quality, decoder-based decisions are still not fully accurate, as they do not have enough reference information to ease the decision process. Therefore, higher performance can be achieved by performing encoding-side estimation and decision based on the error-free information. +%Such approach not only improves quality but also reduces the complexity of the video decoders. +%In this chapter a robust coding driven by \ac{ec} methods is developed with the objective of enhancing the quality of reconstructed video at decoders receiving erroneous streams from the transmission network. The proposed approach combines error resilience tools at the encoder-side with \ac{ec} at the decoder-side. +Different approaches were proposed in the past to address the problem of \ac{ec} at the encoder-side \cite{ConcealmentDrivenSliceOrdering2008,ConcealmentAwareME2006,ErrorResilienceModeHEVC2016}. Moreover, extra information was used to aid the \ac{ec} operation at the decoder-side, either by sending redundant data \cite{ResilienceRECAP_ICASSP2009,SaliencyErrorConcealment_TM2013} or by embedding data into the bitstream \cite{ConcealmentIntraDataHidng2009}. Although the above methods facilitate the \ac{ec} performance either through slice reordering or based on \acs{mv}, they always rely on the assumption that a fixed \ac{ec} method is used at the decoder. +% The work presented in \cite{ConcealmentSignalling2008,SignallingRobustScalable2015} proposes testing several methods with transmission of extra symbols to indicate the best method to be applied by the decoder. Although such approaches achieves reasonably good performance, it relies on the spatial neighbouring information or multi-layer video, which may not be available in all cases. -In this chapter a robust coding driven by \ac{ec} methods with the objective of enhancing the quality of reconstructed video at decoders receiving erroneous streams from the transmission network. The proposed approach combines error resilience tools at the encoder-side with \ac{ec} at the decoder-side. Different approaches were proposed in the past to that address the problem of \ac{ec} at the encoder-side \cite{ConcealmentDrivenSliceOrdering2008,ConcealmentAwareME2006,ErrorResilienceModeHEVC2016}. Moreover, extra information was used to aid the \ac{ec} operation at the decoder-side, either by sending redundant data \cite{ResilienceRECAP_ICASSP2009,SaliencyErrorConcealment_TM2013} or by embedding data into the bitstream \cite{ConcealmentIntraDataHidng2009}. Although the above methods facilitate the EC performance either through slice reordering or based on \acs{mv}, they always rely on the assumption that a fixed \ac{ec} method is used at the decoder. The work presented in \cite{ConcealmentSignalling2008,SignallingRobustScalable2015} proposes testing several methods with transmission of extra symbols to indicate the best method to be applied by the decoder. Although such approaches achieves reasonably good performance, it relies on the spatial neighbouring information or multi-layer video, which may not be available in all cases. - -To advance one step further, in this chapter an EC-aware encoding scheme is proposed to achieve higher flexibility in terms of the error concealment approaches which leads to higher recovered video quality. +To advance one step further, in this chapter an concealment-aware encoding scheme is proposed to achieve higher flexibility in terms of the \ac{ec} approaches, leading to higher recovered video quality. This is accomplished by selecting at the encoder, among several \ac{ec} algorithms with different characteristics, the one that yields the lowest reconstruction distortion at the decoder and also minimises the \ac{rd} cost considering the necessary signalling rate. Thus, the proposed approach outperforms similar previous methods \cite{ConcealmentAwareME2006,ErrorResilienceModeHEVC2016} by selecting the best error concealment method without affecting the encoder optimisation. To further improve the quality of recovered frames, an enhancement layer is encoded with the mismatch residue between the transmitted and recovered frames. This is a dynamic optimisation process, which is more efficient than traditional approaches based on redundant pictures \cite{RedudantPicsJan2009,VPxResiliencePCS2016}, which transmit the whole frame as redundancy. In contrast with previous work presented in Chapter~\ref{Chapter:ErrorResilienceTechniques} that addressed the error resilience problem by optimising the coding dependencies, the approach followed in this work considers both \ac{ec} performance and the rate required for signalling the best \ac{ec} mode to the decoder. @@ -54,100 +55,106 @@ In contrast with previous work presented in Chapter~\ref{Chapter:ErrorResilience \section{Traditional error concealment algorithms} \label{Section5:ECCandidates} -In order to proposed a novel error concealment-aware technique different algorithms were taken into consideration. This section provides a description and evaluation of the error concealment candidates used in the proposed method. Firstly, a detailed description of each approach is provided followed by a performance comparison between each method. +In order to proposed a novel error concealment-aware technique different algorithms were taken into consideration. This section provides a description and an evaluation of the error concealment candidates used in the proposed method. +Firstly, a detailed description of each approach is provided followed by a performance comparison between each method. \subsection{Motion-compensation algorithms} %\subsection{Motion-compensated reconstruction} -The most common algorithms to recover missing frames used the correctly received \acs{mv} from the neighbouring frames. This has been widely used in the past for \ac{h264} standard \cite{H264RefConc2006,BlockBasedMVE2002,BlockBasedMVEOverllaped2011} and also in the \ac{hevc} standard~\cite{HEVCMCBlockAug2013,HEVCMCResidueDec2013,DownhillHEVCCon_ICCE2017}. +The most common algorithms to recover missing frames takes advantage of the correctly received \acs{mv} from the neighbouring frames. +This has been widely used in the past for \ac{h264} standard \cite{H264RefConc2006,BlockBasedMVE2002,BlockBasedMVEOverllaped2011} and also in the \ac{hevc} standard~\cite{HEVCMCBlockAug2013,HEVCMCResidueDec2013,DownhillHEVCCon_ICCE2017}. Let's consider the example of Figure~\ref{FIG5:MotionVectorExtrapolation}, where a missing frame ($f_0$) at time instance $t_0$ is reconstructed based the information present in the neighbouring frames, $f_{-1}$ and $f_{-2}$. One of the common approaches, i.e., motion-copy based algorithms reconstructs the missing frame through motion compensation directly using the co-located vectors in the closest neighbour frame ($f_{-1}$). The \acs{mv} for the motion compensation ($v_0$) are obtained by copying the \acs{mv} $v_{-1}$ from the same position in $f_{-1}$, as shown by the example (1) in the figure. -\begin{figure}[b] - \centering - \input{\ConcealmentAwareDir/Figures/MotionVectorExtrapolation.tikz} - \caption{Representation of the video frame with associated original and extrapolated motion vectors represented at full and dashed arrows, respectively.} - \label{FIG5:MotionVectorExtrapolation} -\end{figure} - An alternative approach reconstructs the missing frame by using motion compensation through the correctly received \acs{mv}, of frame $f_{-1}$ at time instant $t_{-1}$, according to the following procedure: -The \acs{mv} ($v_{-1}$) of the neighbouring frame ($f_{-1}$) are extrapolated to compute the set of \acs{mv} ($v_{0}$) for the missing frame as follows: +\begin{enumerate} +\item +the \acs{mv} ($v_{-1}$) of the neighbouring frame ($f_{-1}$) are extrapolated to compute the set of \acs{mv} ($v_{0}$) for the missing frame as follows: \begin{equation} % v^\zeta_0 = \frac{ t_0 - t_{C} }{ t_{-1} - t_{R} } \times v^\zeta_{-1},\ \zeta=s,r v_0 = \frac{ t_0 - t_{-1} }{ t_{-1} - t_{R} } \times v_{-1}, \end{equation} -where $t_{R}$ is the time instant of the reference frame pointed by the original \acs{mv} $v_{-1}$. Then, the \ac{mv} associated to the block $b_{-1}(x,y)$ at spatial position $(x,y)$ in $f_{-1}$ may be used to recover the block $b^{'}_{{0}}(x^{'},y^{'})$ in $f_0$, at position $(x^{'},y^{'})$ obtained from $v_0$ components as follows: +where $t_{R}$ is the time instant of the reference frame pointed by the original \acs{mv} $v_{-1}$. +\item +the \ac{mv} associated to the block $b_{-1}(x,y)$ at spatial position $(x,y)$ in $f_{-1}$ may be used to recover the block $b^{'}_{{0}}(x^{'},y^{'})$ in $f_0$, at position $(x^{'},y^{'})$ obtained from $v_0$ components as follows: \begin{align} -x^{'} &= x - v_{0x} \\ -y^{'} &= y - v_{0y} +x^{'} &= x - v_{0x}, \\ +y^{'} &= y - v_{0y}. \end{align} +\end{enumerate} This is illustrated in Figure~\ref{FIG5:MotionVectorExtrapolation} by the example (2). This method is referred to as \glsfirst{mve}. -Finally, as a base for comparison the default \ac{ec} implemented in the reference \ac{hevc} implementation the \ac{fc} algorithm is also evaluated. This method consists in replacing the lost frame with a copy of the previous decoded one, which can also be described as a motion compensated reconstruction using only zero \acs{mv}. +\begin{figure}[tb] + \centering + \input{\ConcealmentAwareDir/Figures/MotionVectorExtrapolation.tikz} + \caption{Representation of the video frame with associated original and extrapolated motion vectors represented using full and dashed arrows, respectively.} + \label{FIG5:MotionVectorExtrapolation} +\end{figure} + +Finally, as a base for comparison the default \ac{ec} in the reference \ac{hevc} implementation the \ac{fc} algorithm is also evaluated. This method consists in replacing the lost frame with a copy of the previous decoded one, which can also be described as a motion compensated reconstruction using only zero \acs{mv}. \subsection{Algorithms based on motion estimation} -In this sub-section describe different method that can be used to estimate a motion-field, which can be used to reconstruct the missing information. The obtained motion-field is used in combination with the \ac{mve} method to recover the lost frame. +In this sub-section different method that can be used to estimate a motion-field are described, which can be used to reconstruct the missing motion information. +The obtained motion-field is used in combination with the \ac{mve} algorithm to recover the lost frame. -Optical flow estimation algorithms are used to estimate a 2-D \ac{mv}, $v=(v_x, v_y)$ for each pixel, such as, the following energy is minimised: +Typically, optical flow estimation algorithms are used to estimate a 2-D \ac{mv} field, $v=(v_x, v_y)$, for each pixel, such as the following energy function is minimised: \begin{equation} -E(x,y) = \sum_{x} \sum_{y} \bigg| f_{0}\big(x,y\big) - f_{1}\big( x + v_x(x,y), y+v_y(x,y) \big) \bigg|^2, +E(x,y) = \sum_{x} \sum_{y} \bigg| f_{0}\big(x,y\big) - f_{1}\big( x + v_x(x,y), y+v_y(x,y) \big) \bigg|^2. \end{equation} -resulting an unique motion field given by $v$. -Besides using a full search algorithm where all block-based approach is used to search for the best \acs{mv} based on the sum of absolute errors, in this work three different approaches were tested to evaluate they effectiveness to be used in \ac{ec} algorithms, namely: +Besides using a full search algorithm where a block-based approach is used to search for the best \acs{mv} based on the sum of absolute errors, in this work three different approaches were tested to evaluate their effectiveness to be used in \ac{ec} algorithms (described below), namely: \begin{enumerate} \item a method based on the total variation based on the minimization of the \mbox{L-1} norm~\cite{DualFlow2016}; \item a method which approximates the neighbouring information of a given pixel by quadratic polynomials on both frames~\cite{PolyFlow2003}; \item a method based on a combination of descriptor matching and large displacement estimation~\cite{DeepFlow2013}. \end{enumerate} - \subsubsection{Motion estimation based on total variation and regularisation (\textit{DualFlow})} -In this method the motion field is estimated based on the minimization of the total variation obtained using the L-1 norm \cite{DualFlow2007,DualFlow2016} and taking into account the Horn and Schunck smoothness condition~\cite{HornSchunckOpticalFlow1981}. This condition forces the estimated field to be regular across neighbouring pixels by penalising deviations in a quadratic way. +In this method the motion field is estimated based on the minimization of the total variation obtained using the L-1 norm \cite{DualFlow2007,DualFlow2016}, taking into account the Horn and Schunck smoothness condition~\cite{HornSchunckOpticalFlow1981}. This condition forces the estimated field to be regular across neighbouring pixels by penalising deviations in a quadratic way. Using this method, for each pixel $\mathbf{p}$, the motion field $v(\mathbf{p})$ is obtained by minimising the following energy function, \begin{equation}\label{EQ5:DualFlow} E(v) = \sum_{\mathbf{p} \in \Omega} \Big( \big| f_{-1}(\mathbf{p}) - f_{-2}( \mathbf{p} + v(\mathbf{p}))\big| + \big|\nabla v(\mathbf{p})\big| \Big)%d\mathbf{p},\ \mathbf{p} \in \Omega \end{equation} where $f_{-1}$ and $f_{-2}$ are the two previous frames at time instances $t_{-1}$ and $t_{-2}$, as represented in Figure~\ref{FIG5:MotionVectorExtrapolation}. In the equation, $\Omega$ defines the sets of pixels of those frames. -$|\nabla v(\mathbf{p})|$ is a weighting factor that penalises high variation of the optical flow which effectively disallow discontinuities. This is based on the assumption that neighbouring regions belong to the same object, thus such regions should have similar motion. +$|\nabla v(\mathbf{p})|$ is a weighting factor that penalises high variations of the optical flow which effectively disallow discontinuities. This is based on the assumption that neighbouring regions belong to the same object, thus such regions should have similar motion. \subsubsection{Motion estimation based on polynomial expansion (\textit{PolyFlow})} In this method the motion field is estimated based on a polynomial expansion a neighbourhood of a pixel~\cite{PolyFlow2003}. -In this method only quadratic polynomials are considered, which gives the local signal model, expressed in a local coordinate system as +In this method only quadratic polynomials are considered, expressed as: \begin{equation}\label{EQ5:PolyFlow} -f(\mathbf{x}) \sim \mathbf{x}^TA_1\mathbf{x}+\mathbf{b}_1^T\mathbf{x}+C_1 +f(\mathbf{p}) \sim \mathbf{p}^TA_1\mathbf{p}+\mathbf{b}_1^T\mathbf{p}+C_1 \end{equation} -where $\mathbf{A}$ is a symmetric matrix, $\mathbf{B}$ a vector and $C$ a scalar. The coefficients are +where $\mathbf{p} = (x,y)^T$, $\mathbf{A_1}$ is a symmetric matrix, $\mathbf{b_1}$ a vector and $C_1$ a scalar. The coefficients are estimated from a weighted least squares fit to the signal values in the neighbourhood. -Since the result of polynomial expansion is that each neighbourhood is approximated by a polynomial, we start by analysing what happens if a polynomial undergoes an ideal translation. Let's consider the signal $f_1(\mathbf{x})$ represented by Equation (\ref{EQ5:PolyFlow}) and a signal $f_2$ which corresponds to a displacement of $f_1$ given by $\mathbf{d}$. This can be expressed by the following: +Since the result of polynomial expansion is that each neighbourhood is approximated by a polynomial, we start by analysing what happens if a polynomial undergoes an ideal translation. Let's consider the signal $f_1(\mathbf{p})$ represented by Equation (\ref{EQ5:PolyFlow}) and a signal $f_2$ which corresponds to a displacement of $f_1$ given by $\mathbf{d}=(v_x,v_y)^T$. This can be expressed by the following: \begin{align} -f_2(\mathbf{x}) -&= f_1(\mathbf{x}+\mathbf{d}) \nonumber \\ -&= (\mathbf{x}+\mathbf{d})^TA_1(\mathbf{x}+\mathbf{d})+\mathbf{b}_1^T(\mathbf{x}+\mathbf{d})+C_1 \\ -&= \mathbf{x}^TA_2\mathbf{x}+\mathbf{b}_2^T\mathbf{x}+C_2, \nonumber +f_2(\mathbf{p}) +&= f_1(\mathbf{p}+\mathbf{d}) \nonumber \\ +&= (\mathbf{p}+\mathbf{d})^TA_1(\mathbf{p}+\mathbf{d})+\mathbf{b}_1^T(\mathbf{p}+\mathbf{d})+C_1 \\ +&= \mathbf{p}^TA_2\mathbf{p}+\mathbf{b}_2^T\mathbf{p}+C_2, \nonumber \end{align} which results in the following relations, \begin{align} -\mathbf{A}_2 &= A_1 \nonumber \\ -\mathbf{b}_2 &= \mathbf{b} + 2 \mathbf{A}_1\mathbf{d}, \\ +\mathbf{A}_2 &= \mathbf{A}_1 \nonumber \\ +\mathbf{b}_2 &= \mathbf{b}_1 + 2 \mathbf{A}_1\mathbf{d}, \\ C_2 &= \mathbf{d}^T\mathbf{A}_1\mathbf{d}+\mathbf{b}_1\mathbf{d}+C_1. \nonumber \end{align} -This allows us to find the displacement $\mathbf{d}$ for any signal dimensions by solving the above equations. Detailed implementations of the polynomial expansion and solving can be found in~\cite{NormalizedDiffConvolution1993,farneback2002polynomial}. +This allows to find the displacement $\mathbf{d}$ for any signal dimensions by solving the above equations. Detailed implementations of the polynomial expansion and solving can be found in~\cite{NormalizedDiffConvolution1993,farneback2002polynomial}. \subsubsection{Large displacement optical flow with deep matching (\textit{DeepFlow})} -In this method the motion field is estimated based on the large displacement optical flow presented in \cite{LargeDisplacementOptFlow_TPAMI2011}, which extends the total variation methods, as the one expressed by Equation (\ref{EQ5:DualFlow}), including descriptor matching. The correspondences between descriptions are used to apply a coarse-to-fine wrapping, thus avoiding local minimum values. -The matching algorithm is built upon a multi-stage architecture with six layers with different patches sizes, interleaving convolutions and max-pooling \cite{DeepFlow2013}. The combination of both approaches leads towards a better matching. +In this method the motion field is estimated based on the large displacement optical flow presented in \cite{LargeDisplacementOptFlow_TPAMI2011}, which extends the total variation methods, e.g. the one expressed by Equation (\ref{EQ5:DualFlow}), by including descriptor matching. +The correspondences between descriptions are used to apply a coarse-to-fine wrapping, thus avoiding local minimum values. The matching algorithm is built upon a multi-stage architecture with six layers with different patches sizes, interleaving convolutions and max-pooling \cite{DeepFlow2013}. The combination of both approaches increases the matching accuracy. -In \cite{DeepFlow2013} to improve the estimated motion field accuracy, the following extension to the method proposed in~\cite{LargeDisplacementOptFlow_TPAMI2011} were introduced: (i) description matching was used in the minimisation problem; (ii) a normalisation parameter was introduced to down-height the impact of regions with high spatial changes; (iii) different weights are used for each layers of optimisation. Figure~\ref{FIG5:DeepFlowDiagram} shows the blocks that are included in the estimation process. As shown in the figure a multi-size optimisation is applied by using different patches sizes. This is used to estimate an initial motion field, referred to as $v'$ . +In \cite{DeepFlow2013} to improve the estimated motion field accuracy, the following extension to the method proposed in~\cite{LargeDisplacementOptFlow_TPAMI2011} were introduced: (i) use of description matching in the minimisation problem; (ii) introduction of a normalisation parameter to decrease the impact of regions with high spatial changes; (iii) use of different weights for each layers of optimisation. Figure~\ref{FIG5:DeepFlowDiagram} shows the blocks that are included in the estimation process. As shown in the figure a multi-size optimisation is applied by using different patches sizes. This is used to estimate an initial motion field, referred to as $v'$ . -\begin{figure}[t] +\begin{figure}[b] \centering \includegraphics[width=.95\columnwidth]{\ConcealmentAwareDir/Figures/DeepFlowBlockDiagram} \caption{Block diagram of the deep matching algorithm \cite{DeepFlow2013}.} @@ -155,7 +162,7 @@ In \cite{DeepFlow2013} to improve the estimated motion field accuracy, the follo \FIGSVSPACE \end{figure} -Subsequently, the optical flow is obtained by minimising an energy function, which can be described by the following: +Subsequently, the final optical flow is obtained by minimising an energy function, which can be described by the following: \begin{equation} E(v) = \sum_{\mathbf{p} \in \Omega} \Big( E_D(\mathbf{p}) + \alpha E_S(\mathbf{p}) + \beta E_M(\mathbf{p}) \Big), @@ -167,10 +174,10 @@ The smoothness term is a robust penalisation of the gradient of the flow as used \subsection{Experimental evaluation} -In this section a performance evaluation of the different \ac{ec} schemes previously described is carried out. This evaluation aims at finding the suitable methods to be used for efficiently reconstruct the missing frames in case of data loss. In this evaluation the default \ac{ec} method of the reference \ac{hevc} implementation is used as a reference for comparison. Then, two method based on the correctly received \acs{mv} are tested, i.e., \ac{mc} and \ac{mve}. Moreover, the four different approaches based on a estimated motion field are compared: (i) full search based on the minimisation of the sum of absolute errors (\FULLSEARCH), (ii) optical flow based a duality between total variation and smoothness term (\DUALFLOW), (iii) optical flow based on polynomial approximations (\POLYFLOW) and (iv) optical flow based on deep matching (\DEEPFLOW). +In this section a performance evaluation of the different \ac{ec} schemes previously described is carried out. This evaluation aims at finding the suitable methods to be used for efficiently reconstruct the missing frames in case of data loss. In this evaluation the \ac{fc} method is used as reference for comparison. Then, two methods based on the correctly received \acs{mv} are tested, i.e., \ac{mc} and \ac{mve}. Moreover, the four different approaches based on a estimated motion field are compared: (i) full search based on the minimisation of the sum of absolute errors (\FULLSEARCH), (ii) optical flow based a duality between total variation and smoothness term (\DUALFLOW), (iii) optical flow based on polynomial approximations (\POLYFLOW) and (iv) optical flow based on deep matching (\DEEPFLOW). -Table~\ref{TAB5:ECPerformaceComparison} shows the average quality results obtained using the \ac{psnr} metric for different methods. The absolute value is shown for the frame-copy method (\FC), and differential values are shown for the remaining methods. -Results reveal that the methods \MC and \MVE are able to overcome \FC which does not use any \acs{mv}, achieving average quality gains of up to 1.41 dB and 1.46 dB, respectively. Moreover, by extrapolating the \acs{mv} from the correctly receiving frame to the lost time instance (\MVE) is able to outperform simple motion-copy (\MC). +Table~\ref{TAB5:ECPerformaceComparison} shows the average quality results obtained using the \ac{psnr} metric for different methods. The absolute value is shown for the \FC method, and differential values are shown for the remaining methods. +Results reveal that the methods \MC and \MVE are able to overcome \FC which does not use any \acs{mv}, achieving average quality gains of up to 1.41 dB and 1.46 dB, respectively. Moreover, by extrapolating the \acs{mv} from the correctly receiving frame to the lost time instance (\MVE) is able to outperform straightforward motion-copy (\MC). \begin{table}[tb] \centering @@ -180,12 +187,15 @@ Results reveal that the methods \MC and \MVE are able to overcome \FC which does \input{\ConcealmentAwareDir/Results/PerformanceConcealmentMethods.tex} \end{table} -Results for \ac{ec} methods based motion estimation (see columns 5 to 8 of Table~\ref{TAB5:ECPerformaceComparison}) reveal a overall superior performance when comparing with methods which rely of correctly received \acs{mv}. -Results for \FULLSEARCH method reveals that only minimising the sum of absolute errors between two consecutive frames might not always be directly related with objects' motions. Thus, this may results in a inaccurate motion estimation to be used for missing frames reconstruction. Finally, results from Table~\ref{TAB5:ECPerformaceComparison} reveal that the \DEEPFLOW algorithm leads to the most accurate motion field to be used for \ac{ec}, in comparison with the other methods. It is able to achieve an average quality gain of 1.79 dB, and up to 3.39 dB for Book Arrival sequence, where \POLYFLOW only achieves 3.05 dB. +Results for \ac{ec} methods based on motion estimation (see columns 5 to 8 of Table~\ref{TAB5:ECPerformaceComparison}) reveal an overall superior performance when comparing with methods which rely of correctly received \acs{mv}. +Results for \FULLSEARCH method reveals that only minimising the sum of absolute errors between two consecutive frames might not always be directly related with objects' motions. Thus, this results in an inaccurate motion estimation to be used for the reconstruction of lost frames. Finally, results from Table~\ref{TAB5:ECPerformaceComparison} reveal that the \DEEPFLOW algorithm leads to the most accurate motion field to be used for \ac{ec}, in comparison with the other methods. It is able to achieve an average quality gain of 1.79 dB, and up to 3.39 dB for Book Arrival sequence, where \POLYFLOW only achieves 3.05 dB. -\subsection{Discussion and conclusions} +\subsection{Conclusions} -Summarising, the analysis of the previous results indicates that all methods cope with lost frames and manage to recover the missing data with acceptable quality. Nevertheless, it is noticeable that the recovering lost frames with an estimated motion field leads to higher quality, especially using the \DEEPFLOW method. However, as the other methods tested are also able to achieve acceptable video quality they shall not be neglected. Thus, in order to achieve higher reconstruction quality different approaches shall be considered. +Summarising, the analysis of the previous results indicates that all methods cope with lost frames and manage to recover the missing data with acceptable quality. Nevertheless, it is noticeable that the recovering lost frames with an estimated motion field leads to higher quality, especially using the \DEEPFLOW method. However, as the other methods tested are also able to achieve acceptable video quality they shall not be neglected, as they provide alternative approaches for lost frame recovery with lower computational complexity (i.e., they not require motion estimation). +Thus, in order to achieve higher reconstruction quality different approaches shall be considered, aiming at balancing the overall complexity with the recovery quality. + +%\HERE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% SECTION %% @@ -216,7 +226,7 @@ For the \ac{ec} mode decision optimization the missing slices are reconstructed, In this process, each \ac{ctu} is partitioned to form a quadtree structure of \ac{ecu} that are used to test the different \ac{ec} candidate modes. Then, the best trade-off between \ac{ecu} partition and signalling is found through \ac{rd} optimisation. In order to achieve an efficient use of the signalling overhead a saliency-weighted procedure is embedded in the \ac{rd} optimisation based on a spatio-temporal saliency, where more signalling bits are allocated to regions with higher saliency values. -Finally, the signalling information is transmitted to the decoder by using the \ac{sei} \ac{nalu} type~\cite{HEVCHighLevelReferenceDez2012}. +Finally, the signalling information is transmitted to the decoder by using the \ac{sei} \acs{nalu} type~\cite{HEVCHighLevelReferenceDez2012}. Since in general, the optimal \ac{ec} mode is still not be able to correctly reconstruct all the missing regions, extra residual information is multiplexed in the stream as a scalable \ac{el}. This residual information contains the difference between the compressed ($\hat f_t$) and the \ac{ec} frames ($\tilde f$). @@ -255,7 +265,7 @@ A set of four \ac{ec} candidate modes (M1...M4) is used in the optimisation pro \FIGSVSPACE \end{figure} -The first two methods M1, M2 rely on an estimated motion field, using the method \DEEPFLOW \cite{DeepFlow2013}, to recover the lost frame. Then, it is extrapolated at the pixel level, i.e., one \ac{mv} is assigned to each pixel, and \ac{cu} level, i.e., one \ac{mv} is assigned to the entire block, at the missing frame instant. This results in two different reconstructions of the missing frame, where the former may increase the accuracy of the pixel extrapolation, but the latter has the advantage of keeping the block structure and generate a smoother reconstruction. +The first two methods M1, M2 rely on an estimated motion field, using the method \DEEPFLOW \cite{DeepFlow2013}, to recover the lost frame. Then, it is extrapolated at the pixel level, i.e., one \ac{mv} is assigned to each pixel, and \ac{pu} level, i.e., one \ac{mv} is assigned to the entire block, at the missing frame instant. This results in two different reconstructions of the missing frame, where the former may increase the accuracy of the pixel extrapolation, but the latter has the advantage of keeping the block structure and generate a smoother reconstruction. The method M3 is based on a traditional \glsfirst{mve}, and finally M4 reconstructs the missing frames using a \glsfirst{mc} algorithm. @@ -263,7 +273,7 @@ The method M3 is based on a traditional \glsfirst{mve}, and finally M4 reconstru \subsection{Selection optimization} As described above, in the sub-section~\ref{Section5:ECCandidates}, the proposed method includes four \ac{ec} candidates, which result in different recovered frames for each lost frame (simulated). -The lost frame is partitioned into quadtree structures of \ac{ecu}, each one forming a set of variable size \acs{ecu}. +The lost frame is partitioned into quadtree structures, each one forming a set of variable size \acs{ecu}. Then, finding the optimal \ac{ec} method for each \ac{ecu} is formulated as a rate-distortion cost minimisation. To solve the aforementioned problem, a Lagrangian optimisation is used~\cite{LagragianMultiplier1982} to achieve the best trade-off between reconstruction quality and signalling overhead. Furthermore, image saliency driven by visual attention modelling is used in the optimisation process to weight the cost of the overhead information of each \ac{ecu}, according to the visual relevance of its content. @@ -387,11 +397,16 @@ Note that the generated bitstream is compliant with the standard, as the error c \section{Error concealment signalling evaluation} \label{Section5:ECSignallingPerformance} +This section presents the performance of the proposed \ac{ec}-aware optimisation scheme using the \ac{hevc} standard as the basis of the encoding framework. +Two different evaluations are presented. In the former, only robust \ac{ec} of intra-frames is evaluated, while in the latter the proposed \ac{ec}-aware optimisation is applied to all frames corresponding to a generic robust video transmission using optimal \ac{ec}. + + \subsection{Intra-frame EC optimisation} \label{SEC4:IntraPerformance} -The evaluation of the proposed method is performed only for intra frames to study their impact on error propagation. Moreover, as intra coding units result in higher amount of bits, they also need a higher number of packets. -Results using this setup indicate that for an intra-period of 16 frames, approximately 42\% of the packets corresponds to intra coded slices. Also, by limiting the proposed method to intra frames, the amount of required overhead is reduced. +As mention before, in this section the evaluation of the proposed method is performed only for intra frames to study their impact on error propagation. As intra coding units result in higher amount of bits, they also need a higher number of packets, making them more prone to transmission errors and losses. +Results indicate that for an intra-period of 16 frames, approximately 42\% of the packets corresponds to intra coded slices. +%Also, by limiting the proposed method to intra frames, the amount of required overhead is reduced. % \begin{table}[tb] % \newcommand{\somespaces}{} @@ -528,7 +543,7 @@ The results confirm the superiority of the proposed method, outperforming the re It is also worthwhile to notice that the \ac{psnr} variance obtained with the \PROP method is lower, which indicates lower quality variations in the video segments affected by errors. %The quality gains achieved by the proposed method are similar to those achieved by previous works~\cite{ConcealmentIntraDataHidng2009,ConcealmentSignalling2008} for the same \acs{plr}. However, these require a higher amount of overhead (approximately $3\%$), thus the proposed method achieves a better trade-off between quality and overhead. -In summary, the proposed technique is able to enhance the performance of the standard decoder by finding the best error concealment method at the encoder and sending such information with a small amount of signalling overhead. +In summary, the proposed technique is able to enhance the performance of the standard decoding of intra coded frames by finding the best error concealment method at the encoder and sending such information with a small amount of signalling overhead. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -538,7 +553,7 @@ In summary, the proposed technique is able to enhance the performance of the sta % \subsection{Overall performance evaluation} \label{SEC4:OverallPerformance} -The performance of the proposed \ac{ec}-aware optimisation scheme is evaluated using the \ac{hevc} standard as the basis of the encoding framework. This section is organised in the following subsections: +In this section the proposed \ac{ec}-aware optimisation scheme is evaluated for a generalised robust video transmission of intra and inter coded frames. This section is organised in the following subsections: \begin{itemize} \item evaluation of the usage distribution of each \ac{ec} mode; \item performance evaluation of the \ac{ec} optimal mode decision (without using the enhancement layer); @@ -584,12 +599,12 @@ The results in Table \ref{tab:useratio} show that all \ac{ec} modes are effectiv The \ac{ec} candidate methods based on the estimated motion field (i.e., M1, M2) are selected more often because they provide more accurate representation of the scene's motion than the others (i.e., M3, M4). -\subsubsection{Performance evaluation of optimal \ac{ec} mode decision} +\subsubsection{Evaluation of optimal \ac{ec} mode decision} \label{sec:ECModeSelectionPerformance} \input{\ConcealmentAwareDir/Results/TableSignallingPerformance.tex} -The performance of the proposed saliency-weighted \ac{ec} mode decision (\DYNLAMBDA) was evaluated under loss events and compared with the reference methods. The video quality was evaluated by using two quality metrics: \ac{psnr} and a \ac{fsim}~\cite{FSIM_TIP2011} in order to validate the performance of proposed method in a consolidated manner. +The evaluation of the proposed saliency-weighted \ac{ec} mode decision (\DYNLAMBDA) was carried out under loss events and compared with the reference methods. The video quality was evaluated by using two quality metrics: \ac{psnr} and a \ac{fsim}~\cite{FSIM_TIP2011} in order to validate the performance of proposed method in a consolidated manner. Realistic conditions were used for transmission, by allowing independent losses for any of type of \acs{nal}, hence there is no guarantee that the decoder conditions are always equal to those at the encoder, which means that a signalling mismatch may occur. The results obtained without saliency weighting are also shown for comparison (\FIXEDLAMBDA). In this case a constant $\lambda_0=10$ is used. @@ -606,7 +621,7 @@ As shown in the Table, the saliency-weighted optimisation reduces the amount of These results show that using an adaptive value of $\lambda$ based on the saliency values leads to an average overhead reduction of 28\% in comparison with the case where no saliency is used, i.e., constant $\lambda$. It is worth to note that using the saliency-weighted optimisation to reduce the overhead does not compromise the video quality, as can be seen in the results shown in Tables~\ref{TAB4:SignallingPSNR}~and~\ref{TAB4:SignallingFSIM}. The \ac{psnr} values for \FIXEDLAMBDA and \DYNLAMBDA are very close, but in overhead savings are significant for most sequences. -The achieved WPSNR and \ac{fsim} results further demonstrate the effectiveness of the saliency-based optimisation, because the lower overhead does not affect the most relevant image regions, i.e., those with higher saliency values. Thus, the proposed method using a adaptive $\lambda$ (i.e., using saliency) is able to not only achieve higher \ac{ec} quality than the reference methods, but also higher quality gains than using a constant $\lambda$ (i.e., without saliency). +The achieved \ac{wpsnr} and \ac{fsim} results further demonstrate the effectiveness of the saliency-based optimisation, because the lower overhead does not affect the most relevant image regions, i.e., those with higher saliency values. Thus, the proposed method using a adaptive $\lambda$ (i.e., using saliency) is able to not only achieve higher \ac{ec} quality than the reference methods, but also higher quality gains than using a constant $\lambda$ (i.e., without saliency). This confirms the two-fold superiority of adaptive $\lambda$, i.e. not only the total overhead is reduced but also higher quality gains are achieved. @@ -653,6 +668,7 @@ As in the previous simulations, the packets were randomly discarded to simulate The \ac{psnr} obtained with the proposed method is compared with the default method used by reference \ac{hevc} , i.e., frame-copy (\REF), motion-copy (\MC)~\cite{HEVCMCResidueDec2013}, and the method proposed in \cite{ROPERefGenJan2010}, which implements a robust scheme to minimise error propagation. The following results were obtained using the same constant bitrate for each test condition. +\subsection{Quality evaluation} \input{\ConcealmentAwareDir/Results/TableOveralPerformance.tex} diff --git a/042_ConcealmentAwareEncoding/Figures/BlockDiagram.tikz b/042_ConcealmentAwareEncoding/Figures/BlockDiagram.tikz index 2f61cc1..b81a363 100644 --- a/042_ConcealmentAwareEncoding/Figures/BlockDiagram.tikz +++ b/042_ConcealmentAwareEncoding/Figures/BlockDiagram.tikz @@ -27,10 +27,10 @@ % Define extra block styles \tikzstyle{sumBlock} = [template, draw, circle, inner sep=0cm, minimum size=0.3cm] -\tikzstyle{propBlock} = [block, draw, fill=blue!15] -\tikzstyle{refBlock} = [block, draw, fill=gray!10] -\tikzstyle{propBlockNoDraw} = [block, fill=\TikZColorFillProp] -\tikzstyle{refBlockNoDraw} = [block, fill=\TikZColorFill] +\tikzstyle{propBlock} = [block, draw, fill=TikZColorFillProp] +\tikzstyle{refBlock} = [block, draw, fill=TikZColorFill] +\tikzstyle{propBlockNoDraw} = [block, fill=TikZColorFillProp] +\tikzstyle{refBlockNoDraw} = [block, fill=TikZColorFill] \newcommand{\DrawEdgesTwoNodes}[2]{\path[arrow,-] (#1.south west) |- (#2.north east) |- (#1.south west);} diff --git a/042_ConcealmentAwareEncoding/Figures/ConcealmentCandidates.tikz b/042_ConcealmentAwareEncoding/Figures/ConcealmentCandidates.tikz index 00b72cf..5d8aa64 100755 --- a/042_ConcealmentAwareEncoding/Figures/ConcealmentCandidates.tikz +++ b/042_ConcealmentAwareEncoding/Figures/ConcealmentCandidates.tikz @@ -29,7 +29,7 @@ matrix,shapes.symbols,plotmarks,decorations.markings,shadows,backgrounds} auto, every node/.style={scale=\scale}, template/.style={thick, text centered}, - block/.style={template, draw,fill=\TikZColorFill, rectangle, text width=2.2cm, text centered, minimum height=.9cm, node distance=1cm}, + block/.style={template, draw,fill=TikZColorFill, rectangle, text width=2.2cm, text centered, minimum height=.9cm, node distance=1cm}, labels/.style={template, scale=1.2}, line/.style={template, draw, -latex', thick}, point/.style={template, draw, fill=black, circle,inner sep=0, minimum size=3} diff --git a/042_ConcealmentAwareEncoding/Figures/MotionVectorExtrapolation.tikz b/042_ConcealmentAwareEncoding/Figures/MotionVectorExtrapolation.tikz index 4cf2381..44274db 100755 --- a/042_ConcealmentAwareEncoding/Figures/MotionVectorExtrapolation.tikz +++ b/042_ConcealmentAwareEncoding/Figures/MotionVectorExtrapolation.tikz @@ -32,8 +32,8 @@ \tikzstyle{projectedblock}=[rectangle,draw=black, thick,dashed] \tikzstyle{refmv_linestyle}=[-, thick] -\tikzstyle{refmv}=[black!60!green, refmv_linestyle,decoration={markings,mark=at position 1 with {\arrow[ultra thick,scale=1]{latex}}},postaction={decorate}] -\tikzstyle{extrapolated_mv}=[refmv_linestyle,dashed, blue, decoration={markings,mark=at position 1 with {\arrow[ultra thick,scale=1]{latex}}},postaction={decorate}] +\tikzstyle{refmv}=[draw=black, refmv_linestyle,decoration={markings,mark=at position 1 with {\arrow[ultra thick,scale=1]{latex}}},postaction={decorate}] +\tikzstyle{extrapolated_mv}=[refmv_linestyle,dashed, draw=blue, decoration={markings,mark=at position 1 with {\arrow[ultra thick,scale=1]{latex}}},postaction={decorate}] \tikzstyle{arrow}=[draw, ->,>=stealth',thick,,decoration={markings,mark=at position 1 with {\arrow[ultra thick,scale=0.5]{stealth}}},postaction={decorate}] diff --git a/043_EndToEndRobustSystem/Figures/BlockDiagram.tikz b/043_EndToEndRobustSystem/Figures/BlockDiagram.tikz index 2f61cc1..69e58f4 100644 --- a/043_EndToEndRobustSystem/Figures/BlockDiagram.tikz +++ b/043_EndToEndRobustSystem/Figures/BlockDiagram.tikz @@ -29,8 +29,8 @@ \tikzstyle{sumBlock} = [template, draw, circle, inner sep=0cm, minimum size=0.3cm] \tikzstyle{propBlock} = [block, draw, fill=blue!15] \tikzstyle{refBlock} = [block, draw, fill=gray!10] -\tikzstyle{propBlockNoDraw} = [block, fill=\TikZColorFillProp] -\tikzstyle{refBlockNoDraw} = [block, fill=\TikZColorFill] +\tikzstyle{propBlockNoDraw} = [block, fill=TikZColorFillProp] +\tikzstyle{refBlockNoDraw} = [block, fill=TikZColorFill] \newcommand{\DrawEdgesTwoNodes}[2]{\path[arrow,-] (#1.south west) |- (#2.north east) |- (#1.south west);} diff --git a/043_EndToEndRobustSystem/Figures/JointlyRobustnessDiagram.tikz b/043_EndToEndRobustSystem/Figures/JointlyRobustnessDiagram.tikz index 8a24272..d570540 100644 --- a/043_EndToEndRobustSystem/Figures/JointlyRobustnessDiagram.tikz +++ b/043_EndToEndRobustSystem/Figures/JointlyRobustnessDiagram.tikz @@ -27,9 +27,9 @@ % Define extra block styles \tikzstyle{sumBlock} = [template, draw, circle, inner sep=0cm, minimum size=0.3cm] -\tikzstyle{refBlockNoDraw} = [block, fill=\TikZColorFill] +\tikzstyle{refBlockNoDraw} = [block, fill=TikZColorFill] \tikzstyle{refBlock} = [refBlockNoDraw, draw] -\tikzstyle{propBlockNoDraw} = [block, fill=\TikZColorFillProp] +\tikzstyle{propBlockNoDraw} = [block, fill=TikZColorFillProp] \tikzstyle{propBlock} = [propBlockNoDraw,draw] @@ -97,7 +97,7 @@ % \def\spacing{.2} % \coordinate(Input) at (0.5,0.3); % \foreach \i in {0,...,3} -% \draw[thick,fill=\TikZColorFill] (\spacing*\i,-.15*\i) rectangle ++(1,1); +% \draw[thick,fill=TikZColorFill] (\spacing*\i,-.15*\i) rectangle ++(1,1); % % \node[text width=.7cm, text centered] at (1.6,1.1) {Video Stream}; % \node[text width=.7cm, text centered] at (1.1,.1) {Input video}; % \end{scope} diff --git a/043_EndToEndRobustSystem/Figures/NeuralNetwork.tikz b/043_EndToEndRobustSystem/Figures/NeuralNetwork.tikz index efa6ca0..83d2524 100644 --- a/043_EndToEndRobustSystem/Figures/NeuralNetwork.tikz +++ b/043_EndToEndRobustSystem/Figures/NeuralNetwork.tikz @@ -1,9 +1,9 @@ \def\layersep{3cm} \begin{tikzpicture}[shorten >=1pt,->, node distance=\layersep,font=\small] \tikzstyle{neuron}=[circle,fill=black!25,minimum size=17pt,inner sep=0pt] - \tikzstyle{input neuron}=[neuron, fill=\TikZColorFillDark]; - \tikzstyle{hidden neuron}=[neuron, fill=\TikZColorFill]; - \tikzstyle{output neuron}=[neuron, fill=\TikZColorFillProp ]; + \tikzstyle{input neuron}=[neuron, fill=TikZColorFillDark]; + \tikzstyle{hidden neuron}=[neuron, fill=TikZColorFill]; + \tikzstyle{output neuron}=[neuron, fill=TikZColorFillProp ]; \tikzstyle{annot} = [text width=4em, text centered] % Draw the hidden layer nodes diff --git a/TikzThesisTemplate.pgs b/TikzThesisTemplate.pgs index d305c0f..3d4be51 100644 --- a/TikzThesisTemplate.pgs +++ b/TikzThesisTemplate.pgs @@ -4,8 +4,8 @@ \usepackage{showframe} \usepackage{balance} -% \usepackage[active,tightpage]{preview} -% \PreviewEnvironment{tikzpicture} +\usepackage[active,tightpage]{preview} +\PreviewEnvironment{tikzpicture} \begin{document} diff --git a/carreira_phd_thesis.sty b/carreira_phd_thesis.sty index 11af4a6..1f1b1ac 100644 --- a/carreira_phd_thesis.sty +++ b/carreira_phd_thesis.sty @@ -28,7 +28,7 @@ \usepackage{epstopdf} \usepackage{dblfloatfix} -\usepackage[tight,footnotesize]{subfigure} +\usepackage{subfig} \usepackage{pgfgantt} \usepackage{etex} @@ -67,14 +67,20 @@ \usetikzlibrary{trees} \usetikzlibrary{intersections} \usetikzlibrary{matrix} +\usetikzlibrary{hobby} \newcommand{\yslant}{-0.26} \newcommand{\yfshift}{0.05cm} -\def\TikZColorFill{gray!30} -\def\TikZColorFillDark{gray!80} -\def\TikZColorFillProp{blue!15} +\definecolor{TikZColorFill}{RGB}{200,200,200} +\definecolor{TikZColorFillDark}{RGB}{95,95,95} +\definecolor{TikZColorFillProp}{RGB}{159, 161, 249} +\definecolor{colorBackground}{RGB}{194,215,249} +\definecolor{colorBackgroundSecondary}{RGB}{158,195,255} +\definecolor{colorErrors}{rgb}{.16,.40,.40} +\definecolor{colorErrorProp}{rgb}{.209,.705,.740} \def\TikZyslant{-0.2} \def\TikZxscale{0.75} \def\TikZyfshift{0.05cm} + \newcounter{maincounter} % We need layers to draw the block diagram \pgfdeclarelayer{background} diff --git a/carreira_phd_thesis.tex b/carreira_phd_thesis.tex index 0edd4c1..4118793 100644 --- a/carreira_phd_thesis.tex +++ b/carreira_phd_thesis.tex @@ -19,7 +19,7 @@ %\includeonly{010_Introduction/Introduction} % \includeonly{021_VideoCoding/VideoCodingReview} -\includeonly{022_ErrorResilience/RobustTransmissionReview} +%\includeonly{022_ErrorResilience/RobustTransmissionReview} %\includeonly{031_ErrorResilienceEvaluation/ErrorResilienceEvaluation} %\includeonly{041_ImprovedErrorResilience/ImprovedErrorResilience} %\includeonly{042_ConcealmentAwareEncoding/ConcealmentAwareEncoding} diff --git a/carreira_phd_thesis_abr.sty b/carreira_phd_thesis_abr.sty index c9fb27b..c7ef047 100644 --- a/carreira_phd_thesis_abr.sty +++ b/carreira_phd_thesis_abr.sty @@ -103,8 +103,6 @@ \customnewacronym{uep}{UEP}{Unequal Error protection} \customnewacronym{mdc}{MDC}{Multiple Description Coding} - -\customnewacronym{rope}{ROPE}{Recursive Optimal Per-pixel Estimation} \customnewacronym{fc}{FC}{Frame-Copy} \customnewacronym{mc}{MC}{Motion-Copy} \customnewacronym{bma}{BMA}{Boundary Match Algorithms} diff --git a/estgleiria.cls b/estgleiria.cls index 576a417..ea577d4 100644 --- a/estgleiria.cls +++ b/estgleiria.cls @@ -263,7 +263,7 @@ T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX\spacefactor1000} % {\sc\chaptertitlename\ \thechapter}{15pt} % {\Huge \thispagestyle{empty}} % [\vspace{1cm}\titlerule\minitoc\glsresetall] - \titleformat{\chapter}[display]{\normalfont\Huge\bfseries}{\sc \chaptertitlename\ \thechapter}{20pt}{\Huge \thispagestyle{empty}}[\vspace{5mm}] + \titleformat{\chapter}[display]{\normalfont\Huge\bfseries}{\sc \chaptertitlename\ \thechapter}{20pt}{\Huge \thispagestyle{empty}}[\vspace{5mm}\glsresetall] \properpagestyle \pagenumbering{arabic}}