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