diff options
Diffstat (limited to 'vorbis/doc/helper.html')
-rw-r--r-- | vorbis/doc/helper.html | 239 |
1 files changed, 239 insertions, 0 deletions
diff --git a/vorbis/doc/helper.html b/vorbis/doc/helper.html new file mode 100644 index 0000000..a16df28 --- /dev/null +++ b/vorbis/doc/helper.html @@ -0,0 +1,239 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-15"/> +<title>Ogg Vorbis Documentation</title> + +<style type="text/css"> +body { + margin: 0 18px 0 18px; + padding-bottom: 30px; + font-family: Verdana, Arial, Helvetica, sans-serif; + color: #333333; + font-size: .8em; +} + +a { + color: #3366cc; +} + +img { + border: 0; +} + +#xiphlogo { + margin: 30px 0 16px 0; +} + +#content p { + line-height: 1.4; +} + +h1, h1 a, h2, h2 a, h3, h3 a { + font-weight: bold; + color: #ff9900; + margin: 1.3em 0 8px 0; +} + +h1 { + font-size: 1.3em; +} + +h2 { + font-size: 1.2em; +} + +h3 { + font-size: 1.1em; +} + +li { + line-height: 1.4; +} + +#copyright { + margin-top: 30px; + line-height: 1.5em; + text-align: center; + font-size: .8em; + color: #888888; + clear: both; +} +</style> + +</head> + +<body> + +<div id="xiphlogo"> + <a href="http://www.xiph.org/"><img src="fish_xiph_org.png" alt="Fish Logo and Xiph.Org"/></a> +</div> + +<h1>Ogg Vorbis I format specification: helper equations</h1> + +<h1>Overview</h1> + +<p>The equations below are used in multiple places by the Vorbis codec +specification. Rather than cluttering up the main specification +documents, they are defined here and linked in the main documents +where appropriate.</p> + +<h2><a name="log">ilog</a></h2> + +<p>The "ilog(x)" function returns the position number (1 through n) of the +highest set bit in the two's complement integer value +<tt>[x]</tt>. Values of <tt>[x]</tt> less than zero are defined to return zero.</p> + +<pre> + 1) [return_value] = 0; + 2) if ( [x] is greater than zero ){ + + 3) increment [return_value]; + 4) logical shift [x] one bit to the right, padding the MSb with zero + 5) repeat at step 2) + + } + + 6) done +</pre> + +<p>Examples:</p> + +<ul> +<li>ilog(0) = 0;</li> +<li>ilog(1) = 1;</li> +<li>ilog(2) = 2;</li> +<li>ilog(3) = 2;</li> +<li>ilog(4) = 3;</li> +<li>ilog(7) = 3;</li> +<li>ilog(negative number) = 0;</li> +</ul> + +<h2><a name="float32_unpack">float32_unpack</a></h2> + +<p>"float32_unpack(x)" is intended to translate the packed binary +representation of a Vorbis codebook float value into the +representation used by the decoder for floating point numbers. For +purposes of this example, we will unpack a Vorbis float32 into a +host-native floating point number.</p> + +<pre> + 1) [mantissa] = [x] bitwise AND 0x1fffff (unsigned result) + 2) [sign] = [x] bitwise AND 0x80000000 (unsigned result) + 3) [exponent] = ( [x] bitwise AND 0x7fe00000) shifted right 21 bits (unsigned result) + 4) if ( [sign] is nonzero ) then negate [mantissa] + 5) return [mantissa] * ( 2 ^ ( [exponent] - 788 ) ) +</pre> + +<h2><a name="lookup1_values">lookup1_values</a></h2> + +<p>"lookup1_values(codebook_entries,codebook_dimensions)" is used to +compute the correct length of the value index for a codebook VQ lookup +table of lookup type 1. The values on this list are permuted to +construct the VQ vector lookup table of size +<tt>[codebook_entries]</tt>.</p> + +<p>The return value for this function is defined to be 'the greatest +integer value for which <tt>[return_value] to the power of +[codebook_dimensions] is less than or equal to +[codebook_entries]</tt>'.</p> + +<h2><a name="low_neighbor">low_neighbor</a></h2> + +<p>"low_neighbor(v,x)" finds the position <i>n</i> in vector [v] of +the greatest value scalar element for which <i>n</i> is less than +<tt>[x]</tt> and <tt>vector [v] element <i>n</i> is less +than vector [v] element [x]</tt>.</p> + +<h2><a name="high_neighbor">high_neighbor</a></h2> + +<p>"high_neighbor(v,x)" finds the position <i>n</i> in vector [v] of +the lowest value scalar element for which <i>n</i> is less than +<tt>[x]</tt> and <tt>vector [v] element <i>n</i> is greater +than vector [v] element [x]</tt>.</p> + +<h2><a name="render_point">render_point</a></h2> + +<p>"render_point(x0,y0,x1,y1,X)" is used to find the Y value at point X +along the line specified by x0, x1, y0 and y1. This function uses an +integer algorithm to solve for the point directly without calculating +intervening values along the line.</p> + +<pre> + 1) [dy] = [y1] - [y0] + 2) [adx] = [x1] - [x0] + 3) [ady] = absolute value of [dy] + 4) [err] = [ady] * ([X] - [x0]) + 5) [off] = [err] / [adx] using integer division + 6) if ( [dy] is less than zero ) { + + 7) [Y] = [y0] - [off] + + } else { + + 8) [Y] = [y0] + [off] + + } + + 9) done +</pre> + +<h2><a name="render_line">render_line</a></h2> + +<p>Floor decode type one uses the integer line drawing algorithm of +"render_line(x0, y0, x1, y1, v)" to construct an integer floor +curve for contiguous piecewise line segments. Note that it has not +been relevant elsewhere, but here we must define integer division as +rounding division of both positive and negative numbers toward zero.</p> + +<pre> + 1) [dy] = [y1] - [y0] + 2) [adx] = [x1] - [x0] + 3) [ady] = absolute value of [dy] + 4) [base] = [dy] / [adx] using integer division + 5) [x] = [x0] + 6) [y] = [y0] + 7) [err] = 0 + + 8) if ( [dy] is less than 0 ) { + + 9) [sy] = [base] - 1 + + } else { + + 10) [sy] = [base] + 1 + + } + + 11) [ady] = [ady] - (absolute value of [base]) * [adx] + 12) vector [v] element [x] = [y] + + 13) iterate [x] over the range [x0]+1 ... [x1]-1 { + + 14) [err] = [err] + [ady]; + 15) if ( [err] >= [adx] ) { + + 15) [err] = [err] - [adx] + 16) [y] = [y] + [sy] + + } else { + + 17) [y] = [y] + [base] + + } + + 18) vector [v] element [x] = [y] + + } +</pre> + +<div id="copyright"> + The Xiph Fish Logo is a + trademark (™) of Xiph.Org.<br/> + + These pages © 1994 - 2005 Xiph.Org. All rights reserved. +</div> + +</body> +</html> |