examples/sfexamples/oggvorbiscodec/src/libvorbis/doc/xml/a1-encapsulation_ogg.xml

00001 <?xml version="1.0" standalone="no"?>
00002 <!DOCTYPE appendix PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
00003                 "http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
00004 
00005 ]>
00006 
00007 <appendix id="vorbis-over-ogg">
00008 <appendixinfo>
00009  <releaseinfo>
00010   $Id: a1-encapsulation_ogg.xml 7186 2004-07-20 07:19:25Z xiphmont $
00011  </releaseinfo>
00012 </appendixinfo>
00013 <title>Embedding Vorbis into an Ogg stream</title>
00014 
00015 <section>
00016 <title>Overview</title>
00017 
00018 <para>
00019 This document describes using Ogg logical and physical transport
00020 streams to encapsulate Vorbis compressed audio packet data into file
00021 form.</para>
00022 
00023 <para>
00024 The <xref linkend="vorbis-spec-intro"/> provides an overview of the construction
00025 of Vorbis audio packets.</para>
00026 
00027 <para>
00028 The <ulink url="oggstream.html">Ogg
00029 bitstream overview</ulink> and <ulink url="framing.html">Ogg logical
00030 bitstream and framing spec</ulink> provide detailed descriptions of Ogg
00031 transport streams. This specification document assumes a working
00032 knowledge of the concepts covered in these named backround
00033 documents.  Please read them first.</para>
00034 
00035 <section><title>Restrictions</title>
00036 
00037 <para>
00038 The Ogg/Vorbis I specification currently dictates that Ogg/Vorbis
00039 streams use Ogg transport streams in degenerate, unmultiplexed
00040 form only. That is:
00041 
00042 <itemizedlist>
00043  <listitem><simpara>
00044   A meta-headerless Ogg file encapsulates the Vorbis I packets
00045  </simpara></listitem>
00046  <listitem><simpara>
00047   The Ogg stream may be chained, i.e. contain multiple, contigous logical streams (links).
00048  </simpara></listitem>
00049  <listitem><simpara>
00050   The Ogg stream must be unmultiplexed (only one stream, a Vorbis audio stream, per link)
00051  </simpara></listitem>
00052 </itemizedlist>
00053 </para>
00054 
00055 <para>
00056 This is not to say that it is not currently possible to multiplex
00057 Vorbis with other media types into a multi-stream Ogg file.  At the
00058 time this document was written, Ogg was becoming a popular container
00059 for low-bitrate movies consisting of DiVX video and Vorbis audio.
00060 However, a 'Vorbis I audio file' is taken to imply Vorbis audio
00061 existing alone within a degenerate Ogg stream.  A compliant 'Vorbis
00062 audio player' is not required to implement Ogg support beyond the
00063 specific support of Vorbis within a degenrate ogg stream (naturally,
00064 application authors are encouraged to support full multiplexed Ogg
00065 handling).
00066 </para>
00067 
00068 </section>
00069 
00070 <section><title>MIME type</title>
00071 
00072 <para>
00073 The correct MIME type of any Ogg file is <literal>application/ogg</literal>.
00074 However, if a file is a Vorbis I audio file (which implies a
00075 degenerate Ogg stream including only unmultiplexed Vorbis audio), the
00076 mime type <literal>audio/x-vorbis</literal> is also allowed.</para>
00077 
00078 </section>
00079 
00080 </section>
00081 
00082 <section>
00083 <title>Encapsulation</title>
00084 
00085 <para>
00086 Ogg encapsulation of a Vorbis packet stream is straightforward.</para>
00087 
00088 <itemizedlist>
00089 
00090 <listitem><simpara>
00091   The first Vorbis packet (the identification header), which
00092   uniquely identifies a stream as Vorbis audio, is placed alone in the
00093   first page of the logical Ogg stream.  This results in a first Ogg
00094   page of exactly 58 bytes at the very beginning of the logical stream.
00095 </simpara></listitem>
00096 
00097 <listitem><simpara>
00098   This first page is marked 'beginning of stream' in the page flags.
00099 </simpara></listitem>
00100 
00101 <listitem><simpara>
00102   The second and third vorbis packets (comment and setup
00103   headers) may span one or more pages beginning on the second page of
00104   the logical stream.  However many pages they span, the third header
00105   packet finishes the page on which it ends.  The next (first audio) packet
00106   must begin on a fresh page.
00107 </simpara></listitem>
00108 
00109 <listitem><simpara>
00110   The granule position of these first pages containing only headers is zero.
00111 </simpara></listitem>
00112 
00113 <listitem><simpara>
00114   The first audio packet of the logical stream begins a fresh Ogg page.
00115 </simpara></listitem>
00116 
00117 <listitem><simpara>
00118   Packets are placed into ogg pages in order until the end of stream.
00119 </simpara></listitem>
00120 
00121 <listitem><simpara>
00122   The last page is marked 'end of stream' in the page flags.
00123 </simpara></listitem>
00124 
00125 <listitem><simpara>
00126   Vorbis packets may span page boundaries.
00127 </simpara></listitem>
00128 
00129 <listitem><simpara>
00130   The granule position of pages containing Vorbis audio is in units
00131   of PCM audio samples (per channel; a stereo stream's granule position
00132   does not increment at twice the speed of a mono stream).
00133 </simpara></listitem>
00134 
00135 <listitem><simpara>
00136   The granule position of a page represents the end PCM sample
00137   position of the last packet <emphasis>completed</emphasis> on that page.
00138   A page that is entirely spanned by a single packet (that completes on a
00139   subsequent page) has no granule position, and the granule position is
00140   set to '-1'.
00141 </simpara></listitem>
00142 
00143 <listitem>
00144   <simpara>
00145     The granule (PCM) position of the first page need not indicate
00146     that the stream started at position zero.  Although the granule
00147     position belongs to the last completed packet on the page and a 
00148     valid granule position must be positive, by
00149     inference it may indicate that the PCM position of the beginning
00150     of audio is positive or negative.
00151   </simpara>
00152     
00153   <itemizedlist>
00154     <listitem><simpara>
00155         A positive starting value simply indicates that this stream begins at
00156         some positive time offset, potentially within a larger
00157         program. This is a common case when connecting to the middle
00158         of broadcast stream.
00159     </simpara></listitem>
00160     <listitem><simpara>
00161         A negative value indicates that
00162         output samples preceeding time zero should be discarded during
00163         decoding; this technique is used to allow sample-granularity
00164         editing of the stream start time of already-encoded Vorbis
00165         streams.  The number of samples to be discarded must not exceed 
00166         the overlap-add span of the first two audio packets.
00167     </simpara></listitem>
00168   </itemizedlist>
00169   
00170   <simpara>
00171     In both of these cases in which the initial audio PCM starting
00172     offset is nonzero, the second finished audio packet must flush the
00173     page on which it appears and the third packet begin a fresh page.
00174     This allows the decoder to always be able to perform PCM position
00175     adjustments before needing to return any PCM data from synthesis, 
00176     resulting in correct positioning information without any aditional
00177     seeking logic.
00178   </simpara>
00179   
00180   <note><simpara>
00181     Failure to do so should, at worst, cause a
00182     decoder implementation to return incorrect positioning information
00183     for seeking operations at the very beginning of the stream.
00184   </simpara></note>
00185 </listitem>
00186   
00187 <listitem><simpara>
00188   A granule position on the final page in a stream that indicates
00189   less audio data than the final packet would normally return is used to
00190   end the stream on other than even frame boundaries.  The difference
00191   between the actual available data returned and the declared amount
00192   indicates how many trailing samples to discard from the decoding
00193   process.
00194  </simpara></listitem>
00195 </itemizedlist>
00196 
00197 </section>
00198 
00199 </appendix>
00200 
00201 <!-- end appendix on Vorbis encapsulation in Ogg -->

Generated by  doxygen 1.6.2