18e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels% -*- mode: latex; TeX-master: "Vorbis_I_spec"; -*-
28e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels%!TEX root = Vorbis_I_spec.tex
38e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels% $Id$
48e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\section{Residue setup and decode} \label{vorbis:spec:residue}
58e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
68e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\subsection{Overview}
78e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
88e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsA residue vector represents the fine detail of the audio spectrum of
98e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsone channel in an audio frame after the encoder subtracts the floor
108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelscurve and performs any channel coupling.  A residue vector may
118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsrepresent spectral lines, spectral magnitude, spectral phase or
128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelshybrids as mixed by channel coupling.  The exact semantic content of
138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsthe vector does not matter to the residue abstraction.
148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsWhatever the exact qualities, the Vorbis residue abstraction codes the
168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsresidue vectors into the bitstream packet, and then reconstructs the
178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsvectors during decode.  Vorbis makes use of three different encoding
188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsvariants (numbered 0, 1 and 2) of the same basic vector encoding
198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsabstraction.
208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\subsection{Residue format}
248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsResidue format partitions each vector in the vector bundle into chunks,
268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsclassifies each chunk, encodes the chunk classifications and finally
278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsencodes the chunks themselves using the the specific VQ arrangement
288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsdefined for each selected classification.
298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsThe exact interleaving and partitioning vary by residue encoding number,
308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelshowever the high-level process used to classify and encode the residue
318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsvector is the same in all three variants.
328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsA set of coded residue vectors are all of the same length.  High level
348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelscoding structure, ignoring for the moment exactly how a partition is
358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsencoded and simply trusting that it is, is as follows:
368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\begin{itemize}
388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\item Each vector is partitioned into multiple equal sized chunks
398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsaccording to configuration specified.  If we have a vector size of
408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\emph{n}, a partition size \emph{residue_partition_size}, and a total
418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsof \emph{ch} residue vectors, the total number of partitioned chunks
428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelscoded is \emph{n}/\emph{residue_partition_size}*\emph{ch}.  It is
438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsimportant to note that the integer division truncates.  In the below
448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsexample, we assume an example \emph{residue_partition_size} of 8.
458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\item Each partition in each vector has a classification number that
478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsspecifies which of multiple configured VQ codebook setups are used to
488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsdecode that partition.  The classification numbers of each partition
498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelscan be thought of as forming a vector in their own right, as in the
508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsillustration below.  Just as the residue vectors are coded in grouped
518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelspartitions to increase encoding efficiency, the classification vector
528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsis also partitioned into chunks.  The integer elements of each scalar
538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsin a classification chunk are built into a single scalar that
548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsrepresents the classification numbers in that chunk.  In the below
558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsexample, the classification codeword encodes two classification
568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsnumbers.
578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\item The values in a residue vector may be encoded monolithically in a
598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelssingle pass through the residue vector, but more often efficient
608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelscodebook design dictates that each vector is encoded as the additive
618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelssum of several passes through the residue vector using more than one
628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsVQ codebook.  Thus, each residue value potentially accumulates values
638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsfrom multiple decode passes.  The classification value associated with
648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsa partition is the same in each pass, thus the classification codeword
658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsis coded only in the first pass.
668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\end{itemize}
688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\begin{center}
718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\includegraphics[width=\textwidth]{residue-pack}
728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\captionof{figure}{illustration of residue vector format}
738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\end{center}
748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\subsection{residue 0}
788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsResidue 0 and 1 differ only in the way the values within a residue
808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelspartition are interleaved during partition encoding (visually treated
818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsas a black box--or cyan box or brown box--in the above figure).
828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsResidue encoding 0 interleaves VQ encoding according to the
848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsdimension of the codebook used to encode a partition in a specific
858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelspass.  The dimension of the codebook need not be the same in multiple
868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelspasses, however the partition size must be an even multiple of the
878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelscodebook dimension.
888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsAs an example, assume a partition vector of size eight, to be encoded
908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsby residue 0 using codebook sizes of 8, 4, 2 and 1:
918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\begin{programlisting}
938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels            original residue vector: [ 0 1 2 3 4 5 6 7 ]
958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelscodebook dimensions = 8  encoded as: [ 0 1 2 3 4 5 6 7 ]
978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelscodebook dimensions = 4  encoded as: [ 0 2 4 6 ], [ 1 3 5 7 ]
998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelscodebook dimensions = 2  encoded as: [ 0 4 ], [ 1 5 ], [ 2 6 ], [ 3 7 ]
1018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelscodebook dimensions = 1  encoded as: [ 0 ], [ 1 ], [ 2 ], [ 3 ], [ 4 ], [ 5 ], [ 6 ], [ 7 ]
1038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\end{programlisting}
1058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsIt is worth mentioning at this point that no configurable value in the
1078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsresidue coding setup is restricted to a power of two.
1088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\subsection{residue 1}
1128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsResidue 1 does not interleave VQ encoding.  It represents partition
1148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsvector scalars in order.  As with residue 0, however, partition length
1158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsmust be an integer multiple of the codebook dimension, although
1168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsdimension may vary from pass to pass.
1178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsAs an example, assume a partition vector of size eight, to be encoded
1198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsby residue 0 using codebook sizes of 8, 4, 2 and 1:
1208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\begin{programlisting}
1228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels            original residue vector: [ 0 1 2 3 4 5 6 7 ]
1248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelscodebook dimensions = 8  encoded as: [ 0 1 2 3 4 5 6 7 ]
1268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelscodebook dimensions = 4  encoded as: [ 0 1 2 3 ], [ 4 5 6 7 ]
1288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelscodebook dimensions = 2  encoded as: [ 0 1 ], [ 2 3 ], [ 4 5 ], [ 6 7 ]
1308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelscodebook dimensions = 1  encoded as: [ 0 ], [ 1 ], [ 2 ], [ 3 ], [ 4 ], [ 5 ], [ 6 ], [ 7 ]
1328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\end{programlisting}
1348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\subsection{residue 2}
1388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsResidue type two can be thought of as a variant of residue type 1.
1408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsRather than encoding multiple passed-in vectors as in residue type 1,
1418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsthe \emph{ch} passed in vectors of length \emph{n} are first
1428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsinterleaved and flattened into a single vector of length
1438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\emph{ch}*\emph{n}.  Encoding then proceeds as in type 1. Decoding is
1448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsas in type 1 with decode interleave reversed. If operating on a single
1458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsvector to begin with, residue type 1 and type 2 are equivalent.
1468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\begin{center}
1488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\includegraphics[width=\textwidth]{residue2}
1498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\captionof{figure}{illustration of residue type 2}
1508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\end{center}
1518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\subsection{Residue decode}
1548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\subsubsection{header decode}
1568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsHeader decode for all three residue types is identical.
1588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\begin{programlisting}
1598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  1) [residue_begin] = read 24 bits as unsigned integer
1608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  2) [residue_end] = read 24 bits as unsigned integer
1618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  3) [residue_partition_size] = read 24 bits as unsigned integer and add one
1628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  4) [residue_classifications] = read 6 bits as unsigned integer and add one
1638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  5) [residue_classbook] = read 8 bits as unsigned integer
1648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\end{programlisting}
1658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\varname{[residue_begin]} and
1678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\varname{[residue_end]} select the specific sub-portion of
1688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelseach vector that is actually coded; it implements akin to a bandpass
1698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelswhere, for coding purposes, the vector effectively begins at element
1708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\varname{[residue_begin]} and ends at
1718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\varname{[residue_end]}.  Preceding and following values in
1728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsthe unpacked vectors are zeroed.  Note that for residue type 2, these
1738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsvalues as well as \varname{[residue_partition_size]}apply to
1748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsthe interleaved vector, not the individual vectors before interleave.
1758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\varname{[residue_partition_size]} is as explained above,
1768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\varname{[residue_classifications]} is the number of possible
1778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsclassification to which a partition can belong and
1788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\varname{[residue_classbook]} is the codebook number used to
1798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelscode classification codewords.  The number of dimensions in book
1808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\varname{[residue_classbook]} determines how many
1818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsclassification values are grouped into a single classification
1828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelscodeword.  Note that the number of entries and dimensions in book
1838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\varname{[residue_classbook]}, along with
1848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\varname{[residue_classifications]}, overdetermines to
1858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelspossible number of classification codewords.  
1868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsIf \varname{[residue_classifications]}\^{}\varname{[residue_classbook]}.dimensions
1878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsexceeds \varname{[residue_classbook]}.entries, the
1888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsbitstream should be regarded to be undecodable.
1898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsNext we read a bitmap pattern that specifies which partition classes
1918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelscode values in which passes.
1928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\begin{programlisting}
1948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  1) iterate [i] over the range 0 ... [residue_classifications]-1 {
1958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
1968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels       2) [high_bits] = 0
1978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels       3) [low_bits] = read 3 bits as unsigned integer
1988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels       4) [bitflag] = read one bit as boolean
1998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels       5) if ( [bitflag] is set ) then [high_bits] = read five bits as unsigned integer
2008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels       6) vector [residue_cascade] element [i] = [high_bits] * 8 + [low_bits]
2018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels     }
2028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  7) done
2038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\end{programlisting}
2048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsFinally, we read in a list of book numbers, each corresponding to
2068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsspecific bit set in the cascade bitmap.  We loop over the possible
2078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelscodebook classifications and the maximum possible number of encoding
2088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsstages (8 in Vorbis I, as constrained by the elements of the cascade
2098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsbitmap being eight bits):
2108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\begin{programlisting}
2128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  1) iterate [i] over the range 0 ... [residue_classifications]-1 {
2138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels       2) iterate [j] over the range 0 ... 7 {
2158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels            3) if ( vector [residue_cascade] element [i] bit [j] is set ) {
2178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                 4) array [residue_books] element [i][j] = read 8 bits as unsigned integer
2198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels               } else {
2218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                 5) array [residue_books] element [i][j] = unused
2238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels               }
2258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          }
2268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      }
2278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  6) done
2298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\end{programlisting}
2308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsAn end-of-packet condition at any point in header decode renders the
2328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsstream undecodable.  In addition, any codebook number greater than the
2338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsmaximum numbered codebook set up in this stream also renders the
2348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsstream undecodable. All codebooks in array [residue_books] are
2358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsrequired to have a value mapping.  The presence of codebook in array
2368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels[residue_books] without a value mapping (maptype equals zero) renders
2378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsthe stream undecodable.
2388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\subsubsection{packet decode}
2428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsFormat 0 and 1 packet decode is identical except for specific
2448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelspartition interleave.  Format 2 packet decode can be built out of the
2458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsformat 1 decode process.  Thus we describe first the decode
2468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsinfrastructure identical to all three formats.
2478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsIn addition to configuration information, the residue decode process
2498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsis passed the number of vectors in the submap bundle and a vector of
2508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsflags indicating if any of the vectors are not to be decoded.  If the
2518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelspassed in number of vectors is 3 and vector number 1 is marked 'do not
2528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsdecode', decode skips vector 1 during the decode loop.  However, even
2538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels'do not decode' vectors are allocated and zeroed.
2548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsDepending on the values of \varname{[residue_begin]} and
2568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\varname{[residue_end]}, it is obvious that the encoded
2578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsportion of a residue vector may be the entire possible residue vector
2588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsor some other strict subset of the actual residue vector size with
2598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelszero padding at either uncoded end.  However, it is also possible to
2608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsset \varname{[residue_begin]} and
2618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\varname{[residue_end]} to specify a range partially or
2628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelswholly beyond the maximum vector size.  Before beginning residue
2638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsdecode, limit \varname{[residue_begin]} and
2648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\varname{[residue_end]} to the maximum possible vector size
2658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsas follows.  We assume that the number of vectors being encoded,
2668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\varname{[ch]} is provided by the higher level decoding
2678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsprocess.
2688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\begin{programlisting}
2708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  1) [actual_size] = current blocksize/2;
2718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  2) if residue encoding is format 2
2728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels       3) [actual_size] = [actual_size] * [ch];
2738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  4) [limit_residue_begin] = maximum of ([residue_begin],[actual_size]);
2748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  5) [limit_residue_end] = maximum of ([residue_end],[actual_size]);
2758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\end{programlisting}
2768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsThe following convenience values are conceptually useful to clarifying
2788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsthe decode process:
2798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\begin{programlisting}
2818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  1) [classwords_per_codeword] = [codebook_dimensions] value of codebook [residue_classbook]
2828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  2) [n_to_read] = [limit_residue_end] - [limit_residue_begin]
2838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  3) [partitions_to_read] = [n_to_read] / [residue_partition_size]
2848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\end{programlisting}
2858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsPacket decode proceeds as follows, matching the description offered earlier in the document.
2878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\begin{programlisting}
2888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  1) allocate and zero all vectors that will be returned.
2898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  2) if ([n_to_read] is zero), stop; there is no residue to decode.
2908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  3) iterate [pass] over the range 0 ... 7 {
2918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels       4) [partition_count] = 0
2938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels       5) while [partition_count] is less than [partitions_to_read]
2958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels            6) if ([pass] is zero) {
2978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
2988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                 7) iterate [j] over the range 0 .. [ch]-1 {
2998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                      8) if vector [j] is not marked 'do not decode' {
3018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                           9) [temp] = read from packet using codebook [residue_classbook] in scalar context
3038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                          10) iterate [i] descending over the range [classwords_per_codeword]-1 ... 0 {
3048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                               11) array [classifications] element [j],([i]+[partition_count]) =
3068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                   [temp] integer modulo [residue_classifications]
3078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                               12) [temp] = [temp] / [residue_classifications] using integer division
3088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                              }
3108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                         }
3128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                    }
3148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels               }
3168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels           13) iterate [i] over the range 0 .. ([classwords_per_codeword] - 1) while [partition_count]
3188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels               is also less than [partitions_to_read] {
3198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                 14) iterate [j] over the range 0 .. [ch]-1 {
3218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                      15) if vector [j] is not marked 'do not decode' {
3238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                           16) [vqclass] = array [classifications] element [j],[partition_count]
3258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                           17) [vqbook] = array [residue_books] element [vqclass],[pass]
3268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                           18) if ([vqbook] is not 'unused') {
3278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                19) decode partition into output vector number [j], starting at scalar
3298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                    offset [limit_residue_begin]+[partition_count]*[residue_partition_size] using
3308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                                    codebook number [vqbook] in VQ context
3318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                          }
3328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                     }
3338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                 20) increment [partition_count] by one
3358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels               }
3378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          }
3388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels     }
3398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 21) done
3418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\end{programlisting}
3438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsAn end-of-packet condition during packet decode is to be considered a
3458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsnominal occurrence.  Decode returns the result of vector decode up to
3468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsthat point.
3478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\subsubsection{format 0 specifics}
3518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsFormat zero decodes partitions exactly as described earlier in the
3538e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels'Residue Format: residue 0' section.  The following pseudocode
3548e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelspresents the same algorithm. Assume:
3558e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3568e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\begin{itemize}
3578e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\item  \varname{[n]} is the value in \varname{[residue_partition_size]}
3588e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\item \varname{[v]} is the residue vector
3598e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\item \varname{[offset]} is the beginning read offset in [v]
3608e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\end{itemize}
3618e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3628e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3638e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\begin{programlisting}
3648e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1) [step] = [n] / [codebook_dimensions]
3658e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2) iterate [i] over the range 0 ... [step]-1 {
3668e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3678e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      3) vector [entry_temp] = read vector from packet using current codebook in VQ context
3688e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      4) iterate [j] over the range 0 ... [codebook_dimensions]-1 {
3698e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3708e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels           5) vector [v] element ([offset]+[i]+[j]*[step]) =
3718e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	        vector [v] element ([offset]+[i]+[j]*[step]) +
3728e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels                vector [entry_temp] element [j]
3738e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3748e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels         }
3758e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3768e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    }
3778e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3788e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  6) done
3798e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3808e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\end{programlisting}
3818e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3828e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3838e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3848e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\subsubsection{format 1 specifics}
3858e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3868e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsFormat 1 decodes partitions exactly as described earlier in the
3878e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels'Residue Format: residue 1' section.  The following pseudocode
3888e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelspresents the same algorithm. Assume:
3898e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3908e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\begin{itemize}
3918e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\item  \varname{[n]} is the value in
3928e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\varname{[residue_partition_size]}
3938e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\item \varname{[v]} is the residue vector
3948e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\item \varname{[offset]} is the beginning read offset in [v]
3958e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\end{itemize}
3968e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3978e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
3988e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\begin{programlisting}
3998e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 1) [i] = 0
4008e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 2) vector [entry_temp] = read vector from packet using current codebook in VQ context
4018e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels 3) iterate [j] over the range 0 ... [codebook_dimensions]-1 {
4028e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
4038e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      4) vector [v] element ([offset]+[i]) =
4048e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels	  vector [v] element ([offset]+[i]) +
4058e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          vector [entry_temp] element [j]
4068e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels      5) increment [i]
4078e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
4088e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels    }
4098e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
4108e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  6) if ( [i] is less than [n] ) continue at step 2
4118e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  7) done
4128e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\end{programlisting}
4138e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
4148e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
4158e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
4168e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\subsubsection{format 2 specifics}
4178e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
4188e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsFormat 2 is reducible to format 1.  It may be implemented as an additional step prior to and an additional post-decode step after a normal format 1 decode.
4198e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
4208e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
4218e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsFormat 2 handles 'do not decode' vectors differently than residue 0 or
4228e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels1; if all vectors are marked 'do not decode', no decode occurrs.
4238e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas EckelsHowever, if at least one vector is to be decoded, all the vectors are
4248e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsdecoded.  We then request normal format 1 to decode a single vector
4258e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelsrepresenting all output channels, rather than a vector for each
4268e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckelschannel.  After decode, deinterleave the vector into independent vectors, one for each output channel.  That is:
4278e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
4288e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\begin{enumerate}
4298e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \item If all vectors 0 through \emph{ch}-1 are marked 'do not decode', allocate and clear a single vector \varname{[v]}of length \emph{ch*n} and skip step 2 below; proceed directly to the post-decode step.
4308e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \item Rather than performing format 1 decode to produce \emph{ch} vectors of length \emph{n} each, call format 1 decode to produce a single vector \varname{[v]} of length \emph{ch*n}.
4318e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels \item Post decode: Deinterleave the single vector \varname{[v]} returned by format 1 decode as described above into \emph{ch} independent vectors, one for each outputchannel, according to:
4328e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  \begin{programlisting}
4338e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  1) iterate [i] over the range 0 ... [n]-1 {
4348e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
4358e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels       2) iterate [j] over the range 0 ... [ch]-1 {
4368e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
4378e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels            3) output vector number [j] element [i] = vector [v] element ([i] * [ch] + [j])
4388e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
4398e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels          }
4408e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels     }
4418e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
4428e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  4) done
4438e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels  \end{programlisting}
4448e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
4458e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels\end{enumerate}
4468e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
4478e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
4488e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
4498e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
4508e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
4518e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
4528e01cdce135d5d816f92d7bb83f9a930aa1b45aeLucas Eckels
453