forked from LosaDev/ls-2019-source
186 lines
7.7 KiB
HTML
186 lines
7.7 KiB
HTML
<HTML><HEAD><TITLE>xiph.org: Ogg Vorbis documentation</TITLE>
|
|
<BODY bgcolor="#ffffff" text="#202020" link="#006666" vlink="#000000">
|
|
<nobr><img src="white-ogg.png"><img src="vorbisword2.png"></nobr><p>
|
|
|
|
<h1><font color=#000070>
|
|
Ogg Vorbis I format specification: floor type 0 setup and decode
|
|
</font></h1>
|
|
|
|
<em>Last update to this document: July 19, 2002</em><br>
|
|
|
|
<h1>Overview</h1>
|
|
|
|
Vorbis floor type zero uses Line Spectral Pair [LSP, also alternately
|
|
known as Line Spectral Frequency or LSF] representation to encode a
|
|
smooth spectral envelope curve as the frequency response of the LSP
|
|
filter. This representation is equivalent to a traditional all-pole
|
|
infinite impulse response filter as would be used in linear predictive
|
|
coding; LSP representation may be converted to LPC representation and
|
|
vice-versa.<p>
|
|
|
|
<h1>Floor 0 format</h1>
|
|
|
|
Floor zero configuration consists of six integer fields and a list of
|
|
VQ codebooks for use in coding/decoding the LSP filter coefficient
|
|
values used by each frame. <p>
|
|
|
|
<h2>header decode</h2>
|
|
|
|
Configuration information for instances of floor zero decodes from the
|
|
codec setup header (third packet). configuration decode proceeds as
|
|
follows:<p>
|
|
|
|
<pre>
|
|
1) [floor0_order] = read an unsigned integer of 8 bits
|
|
2) [floor0_rate] = read an unsigned integer of 16 bits
|
|
3) [floor0_bark_map_size] = read an unsigned integer of 16 bits
|
|
4) [floor0_amplitude_bits] = read an unsigned integer of six bits
|
|
5) [floor0_amplitude_offset] = read an unsigned integer of eight bits
|
|
6) [floor0_number_of_books] = read an unsigned integer of four bits and add 1
|
|
7) if any of [floor0_order], [floor0_rate], [floor0_bark_map_size], [floor0_amplitude_bits],
|
|
[floor0_amplitude_offset] or [floor0_number_of_books] are less than zero, the stream is not decodable
|
|
8) array [floor0_book_list] = read a list of [floor0_number_of_books] unsigned integers of eight bits each;
|
|
</pre>
|
|
|
|
An end-of-packet condition during any of these bitstream reads renders
|
|
this stream undecodable. In addition, any element of the array
|
|
<tt>[floor0_book_list]</tt> that is greater than the maximum codebook
|
|
number for this bitstream is an error condition that also renders the
|
|
stream undecodable.
|
|
|
|
<a name=decode>
|
|
<h2>packet decode</h2></a>
|
|
|
|
Extracting a floor0 curve from an audio packet consists of first
|
|
decoding the curve amplitude and <tt>[floor0_order]</tt> LSP
|
|
coefficient values from the bitstream, and then computing the floor
|
|
curve, which is defined as the frequency response of the decoded LSP
|
|
filter.<p>
|
|
|
|
Packet decode proceeds as follows:<p>
|
|
<pre>
|
|
1) [amplitude] = read an unsigned integer of [floor0_amplitude_bits] bits
|
|
2) if ( [amplitude] is greater than zero ) {
|
|
3) [coefficients] is an empty, zero length vector
|
|
|
|
4) [booknumber] = read an unsigned integer of <a href="helper.html#ilog">ilog</a>( [floor0_number_of_books] ) bits
|
|
5) if ( [booknumber] is greater than the highest number decode codebook ) then packet is undecodable
|
|
6) [lastval] = zero;
|
|
7) vector [temp_vector] = read vector from bitstream using codebook number [booknumber] in VQ context.
|
|
8) add the scalar value [last] to each scalar in vector [temp_vector]
|
|
9) [last] = the value of the last scalar in vector [temp_vector]
|
|
10) concatenate [temp_vector] onto the end of the [coefficients] vector
|
|
11) if (length of vector [coefficients] is less than [floor0_order], continue at step 6
|
|
|
|
}
|
|
|
|
12) done.
|
|
|
|
</pre>
|
|
|
|
Take note of the following properties of decode:
|
|
<ul>
|
|
<li>An <tt>[amplitude]</tt> value of zero must result in a return code that indicates this channel is unused in this frame (the output of the channel will be all-zeroes in synthesis). Several later stages of decode don't occur for an unused channel.<p>
|
|
<li>An end-of-packet condition during decode should be considered a
|
|
nominal occruence; if end-of-packet is reached during any read
|
|
operation above, floor decode is to return 'unused' status as if the
|
|
<tt>[amplitude]</tt> value had read zero at the beginning of decode.
|
|
|
|
<li>The book number used for decode
|
|
can, in fact, be stored in the bitstream in <a
|
|
href="helper.html#ilog">ilog</a>( <tt>[floor0_number_of_books]</tt> -
|
|
1 ) bits. Nevertheless, the above specification is correct and values
|
|
greater than the maximum possible book value are reserved. <p>
|
|
|
|
<li>The number of scalars read into the vector <tt>[coefficients]</tt>
|
|
may be greater than <tt>[floor0_order]</tt>, the number actually
|
|
required for curve computation. For example, if the VQ codebook used
|
|
for the floor currently being decoded has a
|
|
<tt>[codebook_dimensions]</tt> value of three and
|
|
<tt>[floor0_order]</tt> is ten, the only way to fill all the needed
|
|
scalars in <tt>[coefficients]</tt> is to to read a total of twelve
|
|
scalars as four vectors of three scalars each. This is not an error
|
|
condition, and care must be taken not to allow a buffer overflow in
|
|
decode. The extra values are not used and may be ignored or discarded.
|
|
</ul>
|
|
|
|
<a name=synth>
|
|
<h2>curve computation</h2></a>
|
|
|
|
Given an <tt>[amplitude]</tt> integer and <tt>[coefficients]</tt>
|
|
vector from packet decode as well as the [floor0_order],
|
|
[floor0_rate], [floor0_bark_map_size], [floor0_amplitude_bits] and
|
|
[floor0_amplitude_offset] values from floor setup, and an output
|
|
vector size <tt>[n]</tt> specified by the decode process, we compute a
|
|
floor output vector.<p>
|
|
|
|
If the value <tt>[amplitude]</tt> is zero, the return value is a
|
|
length <tt>[n]</tt> vector with all-zero scalars. Otherwise, begin by
|
|
assuming the following definitions for the given vector to be
|
|
synthesized:<p>
|
|
|
|
<img src="lspmap.png"><p>
|
|
|
|
The above is used to synthesize the LSP curve on a Bark-scale frequency
|
|
axis, then map the result to a linear-scale frequency axis.
|
|
Similarly, the below calculation synthesizes the output LSP curve [output] on a log
|
|
(dB) amplitude scale, mapping it to linear amplitude in the last step:<p>
|
|
|
|
<pre>
|
|
1) [i] = 0
|
|
2) if ( [floor0_order] is odd ) {
|
|
|
|
3) calculate [p] and [q] according to: <br>
|
|
<img src="oddlsp.png">
|
|
|
|
} else [floor0_order] is even {
|
|
|
|
4) calculate [p] and [q] according to: <br>
|
|
<img src="evenlsp.png">
|
|
|
|
}
|
|
|
|
5) calculate [linear_floor_value] according to:<br>
|
|
<img src="floorval.png">
|
|
|
|
6) [iteration_condition] = map element [i]
|
|
7) [output] element [i] = [linear_floor_value]
|
|
8) increment [i]
|
|
9) if ( map element [i] is equal to [iteration_condition] ) continue at step 7
|
|
10) if ( [i] is less than [n] ) continue at step 2
|
|
11) done
|
|
|
|
</pre>
|
|
|
|
<hr>
|
|
<a href="http://www.xiph.org/">
|
|
<img src="white-xifish.png" align=left border=0>
|
|
</a>
|
|
<font size=-2 color=#505050>
|
|
|
|
Ogg is a <a href="http://www.xiph.org">Xiph.org Foundation</a> effort
|
|
to protect essential tenets of Internet multimedia from corporate
|
|
hostage-taking; Open Source is the net's greatest tool to keep
|
|
everyone honest. See <a href="http://www.xiph.org/about.html">About
|
|
the Xiph.org Foundation</a> for details.
|
|
<p>
|
|
|
|
Ogg Vorbis is the first Ogg audio CODEC. Anyone may freely use and
|
|
distribute the Ogg and Vorbis specification, whether in a private,
|
|
public or corporate capacity. However, the Xiph.org Foundation and
|
|
the Ogg project (xiph.org) reserve the right to set the Ogg Vorbis
|
|
specification and certify specification compliance.<p>
|
|
|
|
Xiph.org's Vorbis software CODEC implementation is distributed under a
|
|
BSD-like license. This does not restrict third parties from
|
|
distributing independent implementations of Vorbis software under
|
|
other licenses.<p>
|
|
|
|
Ogg, Vorbis, Xiph.org Foundation and their logos are trademarks (tm)
|
|
of the <a href="http://www.xiph.org/">Xiph.org Foundation</a>. These
|
|
pages are copyright (C) 1994-2002 Xiph.org Foundation. All rights
|
|
reserved.<p>
|
|
|
|
</body>
|
|
|