From 44e91eb595c199404ff50a647301958caaa882c9 Mon Sep 17 00:00:00 2001 From: Monty Date: Thu, 18 Jul 2002 21:52:36 +0000 Subject: [PATCH] Keep stuffing in-progress spec work into CVS svn path=/trunk/vorbis/; revision=3662 --- doc/residue-pack.png | Bin 0 -> 35958 bytes doc/vorbis-spec-res.html | 111 ++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 96 insertions(+), 15 deletions(-) create mode 100644 doc/residue-pack.png diff --git a/doc/residue-pack.png b/doc/residue-pack.png new file mode 100644 index 0000000000000000000000000000000000000000..588ec94496d46e781576540ced437a7d26ad4fe1 GIT binary patch literal 35958 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 literal 0 HcmV?d00001 diff --git a/doc/vorbis-spec-res.html b/doc/vorbis-spec-res.html index 4fbb83b..6fad84b 100644 --- a/doc/vorbis-spec-res.html +++ b/doc/vorbis-spec-res.html @@ -14,13 +14,14 @@ A residue vector represents the fine detail of the audio spectrum of one channel in an audio frame after the encoder subtracts the floor curve and performs any channel coupling. A residue vector may represent spectral lines, spectral magnitude, spectral phase or -hybrids as mixed by channel coupling.

+hybrids as mixed by channel coupling. The exact semantic content of +the vector does not matter to the residue abstraction.

-Whatever the exact qualities, the Vorbis residue abstraction codes -groups of residue vectors of the same length into the bitstream -packet, and then reconstructs the vectors into the same groups during -decode. Vorbis makes use of three different encoding variants -(numbered 0, 1 and 2) of the same basic vector encoding abstration.

+Whatever the exact qualities, the Vorbis residue abstraction codes the +residue vectors into the bitstream packet, and then reconstructs the +vectors during decode. Vorbis makes use of three different encoding +variants (numbered 0, 1 and 2) of the same basic vector encoding +abstration.

Residue format

@@ -28,27 +29,107 @@ Reside format takes the bundles of vectors, partitions the vectors into chunks, classifies each chunk, encodes the chunk classifications and finally encodes the chunks using the the specific VQ arrangement defined for each selected selected classification. The exact -interleaving and partitioning vary by residue encoding number.

+interleaving and partitioning vary by residue encoding number, however +the high-level process used to classify and encode the residue vector +is the same in all three variants.

-

residue 0

+A set of coded residue vectors are all of the same length. High level +coding structure, ignoring for the moment exactly how a partition is +encoded and simply trusting that it is, is as follows:

-Residue format zero partitions each channel vector seperately -according to the chunksize specified in setup. Each chunk for each -channel has a unique classification. Classification numbers are coded -by group to increase entropy coding efficiency. Coding of residue -values is both interleaved and cascaded.

+

    +
  • Each vector is partitioned into multiple equal sized chunks +according to configuration specified. If we have a vector size of +n, a partition size residue_partition_size, and a total +of ch residue vectors, the total number of paritioned chunks +coded is n/residue_partition_size*ch. It is +important to note that the integer division truncates. In the below +example, we assume an example residue_partition_size of 8.

    -Residue element interleave within each chunk +

  • Each partition in each vector has a classification number that +specifies which of multiple configured VQ codebook setups are used to +decode that partition. The classification numbers of each partition +can be thought of as forming a vector, as in the illustration below. +Just as the residue vectors are coded in grouped partitions to +increase encoding efficiency, the classification vector is also +partitioned into chunks. The integer elements of each scalar in a +classification chunk are built into a single scalar that represents +the classification numbers in that chunk. In the below example, the +classification codeword encodes two classification numbers.

    +

  • The values in a residue vector may be encoded monolithically in a +single pass through the residue vector, but more often efficient +codebook design dictates that each vector is encoded as the additive +sum of several passes through the residue vector using more than one +VQ codebook. Thus, each residue value potentially accumulates values +from multiple decode passes. The classification value associated with +a partition is the same in each pass, thus the classification codeword +is coded only in the first pass.

    +

-Coding order is rougly as follows +

+

residue 0

+ +Residue 0 and 1 differ only in the way the values within a residue +partition are interleaved during partition encoding (visually treated +as a black box- or cyan box or brown box- in the above figure).

+ +Residue encoding 0 interleaves VQ encoding according to the +dimension of the codebook used to encode a partition in a specific +pass. The dimension of the codebook need not be the same in multiple +passes, however the partition size must be an even multiple of the +codebook dimension.

+ +As an example, assume a partition vector of size eight, to be encoded +by residue 0 using codebook sizes of 8, 4, 2 and 1:

+ +

+
+            original residue vector: [ 0 1 2 3 4 5 6 7 ]
+
+codebook dimensions = 8  encoded as: [ 0 1 2 3 4 5 6 7 ]
+
+codebook dimensions = 4  encoded as: [ 0 2 4 6 ], [ 1 3 5 7 ]
+
+codebook dimensions = 2  encoded as: [ 0 4 ], [ 1 5 ], [ 2 6 ], [ 3 7 ]
+
+codebook dimensions = 1  encoded as: [ 0 ], [ 1 ], [ 2 ], [ 3 ], [ 4 ], [ 5 ], [ 6 ], [ 7 ]
+
+
+ +It is worth mentioning at this point that no configurable value in the +residue coding setup is restricted to a power of two.

residue 1

+Residue 1 does not interleave VQ encoding. It represents partition +vector scalars in order. As with residue 0, however, partition length +must be an integer multiple of the codebook dimension, although +dimension may vary from pass to pass. + +As an example, assume a partition vector of size eight, to be encoded +by residue 0 using codebook sizes of 8, 4, 2 and 1:

+ +

+
+            original residue vector: [ 0 1 2 3 4 5 6 7 ]
+
+codebook dimensions = 8  encoded as: [ 0 1 2 3 4 5 6 7 ]
+
+codebook dimensions = 4  encoded as: [ 0 1 2 3 ], [ 4 5 6 7 ]
+
+codebook dimensions = 2  encoded as: [ 0 1 ], [ 2 3 ], [ 4 5 ], [ 6 7 ]
+
+codebook dimensions = 1  encoded as: [ 0 ], [ 1 ], [ 2 ], [ 3 ], [ 4 ], [ 5 ], [ 6 ], [ 7 ]
+
+
+

residue 2

+ +

Residue decode

header decode

-- 2.7.4