| <!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>Programming with Xiph.org <tt>libvorbis</tt></h1> |
| |
| <h2>Description</h2> |
| |
| <p>Libvorbis is the Xiph.org Foundation's portable Ogg Vorbis CODEC |
| implemented as a programmatic library. Libvorbis provides primitives |
| to handle framing and manipulation of Ogg bitstreams (used by the |
| Vorbis for streaming), a full analysis (encoding) interface as well as |
| packet decoding and synthesis for playback.</p> |
| |
| <p>The libvorbis library does not provide any system interface; a |
| full-featured demonstration player included with the library |
| distribtion provides example code for a variety of system interfaces |
| as well as a working example of using libvorbis in production code.</p> |
| |
| <h2>Encoding Overview</h2> |
| |
| <h2>Decoding Overview</h2> |
| |
| <p>Decoding a bitstream with libvorbis follows roughly the following |
| steps:</p> |
| |
| <ol> |
| <li>Frame the incoming bitstream into pages</li> |
| <li>Sort the pages by logical bitstream and buffer then into logical streams</li> |
| <li>Decompose the logical streams into raw packets</li> |
| <li>Reconstruct segments of the original data from each packet</li> |
| <li>Glue the reconstructed segments back into a decoded stream</li> |
| </ol> |
| |
| <h3>Framing</h3> |
| |
| <p>An Ogg bitstream is logically arranged into pages, but to decode |
| the pages, we have to find them first. The raw bitstream is first fed |
| into an <tt>ogg_sync_state</tt> buffer using <tt>ogg_sync_buffer()</tt> |
| and <tt>ogg_sync_wrote()</tt>. After each block we submit to the sync |
| buffer, we should check to see if we can frame and extract a complete |
| page or pages using <tt>ogg_sync_pageout()</tt>. Extra pages are |
| buffered; allowing them to build up in the <tt>ogg_sync_state</tt> |
| buffer will eventually exhaust memory.</p> |
| |
| <p>The Ogg pages returned from <tt>ogg_sync_pageout</tt> need not be |
| decoded further to be used as landmarks in seeking; seeking can be |
| either a rough process of simply jumping to approximately intuited |
| portions of the bitstream, or it can be a precise bisection process |
| that captures pages and inspects data position. When seeking, |
| however, sequential multiplexing (chaining) must be accounted for; |
| beginning play in a new logical bitstream requires initializing a |
| synthesis engine with the headers from that bitstream. Vorbis |
| bitstreams do not make use of concurent multiplexing (grouping).</p> |
| |
| <h3>Sorting</h3> |
| |
| <p>The pages produced by <tt>ogg_sync_pageout</tt> are then sorted by |
| serial number to seperate logical bitstreams. Initialize logical |
| bitstream buffers (<tt>og_stream_state</tt>) using |
| <tt>ogg_stream_init()</tt>. Pages are submitted to the matching |
| logical bitstream buffer using <tt>ogg_stream_pagein</tt>; the serial |
| number of the page and the stream buffer must match, or the page will |
| be rejected. A page submitted out of sequence will simply be noted, |
| and in the course of outputting packets, the hole will be flagged |
| (<tt>ogg_sync_pageout</tt> and <tt>ogg_stream_packetout</tt> will |
| return a negative value at positions where they had to recapture the |
| stream).</p> |
| |
| <h3>Extracting packets</h3> |
| |
| <p>After submitting page[s] to a logical stream, read available packets |
| using <tt>ogg_stream_packetout</tt>.</p> |
| |
| <h3>Decoding packets</h3> |
| |
| <h3>Reassembling data segments</h3> |
| |
| <h2>Ogg Bitstream Manipulation Structures</h2> |
| |
| <p>Two of the Ogg bitstream data structures are intended to be |
| transparent to the developer; the fields should be used directly.</p> |
| |
| <h3>ogg_packet</h3> |
| |
| <pre> |
| typedef struct { |
| unsigned char *packet; |
| long bytes; |
| long b_o_s; |
| long e_o_s; |
| |
| size64 granulepos; |
| |
| } ogg_packet; |
| </pre> |
| |
| <dl> |
| <dt>packet:</dt> |
| <dd>a pointer to the byte data of the raw packet</dd> |
| <dt>bytes:</dt> |
| <dd>the size of the packet' raw data</dd> |
| <dt>b_o_s:</dt> |
| <dd>beginning of stream; nonzero if this is the first packet of |
| the logical bitstream</dd> |
| <dt>e_o_s:</dt> |
| <dd>end of stream; nonzero if this is the last packet of the |
| logical bitstream</dd> |
| <dt>granulepos:</dt> |
| <dd>the absolute position of this packet in the original |
| uncompressed data stream.</dd> |
| </dl> |
| |
| <h4>encoding notes</h4> |
| |
| <p>The encoder is responsible for setting all of |
| the fields of the packet to appropriate values before submission to |
| <tt>ogg_stream_packetin()</tt>; however, it is noted that the value in |
| <tt>b_o_s</tt> is ignored; the first page produced from a given |
| <tt>ogg_stream_state</tt> structure will be stamped as the initial |
| page. <tt>e_o_s</tt>, however, must be set; this is the means by |
| which the stream encoding primitives handle end of stream and cleanup.</p> |
| |
| <h4>decoding notes</h4> |
| |
| <p><tt>ogg_stream_packetout()</tt> sets the fields |
| to appropriate values. Note that granulepos will be >= 0 only in the |
| case that the given packet actually represents that position (ie, only |
| the last packet completed on any page will have a meaningful |
| <tt>granulepos</tt>). Intervening frames will see <tt>granulepos</tt> set |
| to -1.</p> |
| |
| <h3>ogg_page</h3> |
| |
| <pre> |
| typedef struct { |
| unsigned char *header; |
| long header_len; |
| unsigned char *body; |
| long body_len; |
| } ogg_page; |
| </pre> |
| |
| <dl> |
| <dt>header:</dt> |
| <dd>pointer to the page header data</dd> |
| <dt>header_len:</dt> |
| <dd>length of the page header in bytes</dd> |
| <dt>body:</dt> |
| <dd>pointer to the page body</dd> |
| <dt>body_len:</dt> |
| <dd>length of the page body</dd> |
| </dl> |
| |
| <p>Note that although the <tt>header</tt> and <tt>body</tt> pointers do |
| not necessarily point into a single contiguous page vector, the page |
| body must immediately follow the header in the bitstream.</p> |
| |
| <h2>Ogg Bitstream Manipulation Functions</h2> |
| |
| <h3> |
| int ogg_page_bos(ogg_page *og); |
| </h3> |
| |
| <p>Returns the 'beginning of stream' flag for the given Ogg page. The |
| beginning of stream flag is set on the initial page of a logical |
| bitstream.</p> |
| |
| <p>Zero indicates the flag is cleared (this is not the initial page of a |
| logical bitstream). Nonzero indicates the flag is set (this is the |
| initial page of a logical bitstream).</p> |
| |
| <h3> |
| int ogg_page_continued(ogg_page *og); |
| </h3> |
| |
| <p>Returns the 'packet continued' flag for the given Ogg page. The packet |
| continued flag indicates whether or not the body data of this page |
| begins with packet continued from a preceeding page.</p> |
| |
| <p>Zero (unset) indicates that the body data begins with a new packet. |
| Nonzero (set) indicates that the first packet data on the page is a |
| continuation from the preceeding page.</p> |
| |
| <h3> |
| int ogg_page_eos(ogg_page *og); |
| </h3> |
| |
| <p>Returns the 'end of stream' flag for a give Ogg page. The end of page |
| flag is set on the last (terminal) page of a logical bitstream.</p> |
| |
| <p>Zero (unset) indicates that this is not the last page of a logical |
| bitstream. Nonzero (set) indicates that this is the last page of a |
| logical bitstream and that no addiitonal pages belonging to this |
| bitstream may follow.</p> |
| |
| <h3> |
| size64 ogg_page_granulepos(ogg_page *og); |
| </h3> |
| |
| <p>Returns the position of this page as an absolute position within the |
| original uncompressed data. The position, as returned, is 'frames |
| encoded to date up to and including the last whole packet on this |
| page'. Partial packets begun on this page but continued to the |
| following page are not included. If no packet ends on this page, the |
| frame position value will be equal to the frame position value of the |
| preceeding page. If none of the original uncompressed data is yet |
| represented in the logical bitstream (for example, the first page of a |
| bitstream consists only of a header packet; this packet encodes only |
| metadata), the value shall be zero.</p> |
| |
| <p>The units of the framenumber are determined by media mapping. A |
| vorbis audio bitstream, for example, defines one frame to be the |
| channel values from a single sampling period (eg, a 16 bit stereo |
| bitstream consists of two samples of two bytes for a total of four |
| bytes, thus a frame would be four bytes). A video stream defines one |
| frame to be a single frame of video.</p> |
| |
| <h3> |
| int ogg_page_pageno(ogg_page *og); |
| </h3> |
| |
| <p>Returns the sequential page number of the given Ogg page. The first |
| page in a logical bitstream is numbered zero; following pages are |
| numbered in increasing monotonic order.</p> |
| |
| <h3> |
| int ogg_page_serialno(ogg_page *og); |
| </h3> |
| |
| <p>Returns the serial number of the given Ogg page. The serial number is |
| used as a handle to distinguish various logical bitstreams in a |
| physical Ogg bitstresm. Every logical bitstream within a |
| physical bitstream must use a unique (within the scope of the physical |
| bitstream) serial number, which is stamped on all bitstream pages.</p> |
| |
| <h3> |
| int ogg_page_version(ogg_page *og); |
| </h3> |
| |
| <p>Returns the revision of the Ogg bitstream structure of the given page. |
| Currently, the only permitted number is zero. Later revisions of the |
| bitstream spec will increment this version should any changes be |
| incompatable.</p> |
| |
| <h3> |
| int ogg_stream_clear(ogg_stream_state *os); |
| </h3> |
| |
| <p>Clears and deallocates the internal storage of the given Ogg stream. |
| After clearing, the stream structure is not initialized for use; |
| <tt>ogg_stream_init</tt> must be called to reinitialize for use. |
| Use <tt>ogg_stream_reset</tt> to reset the stream state |
| to a fresh, intiialized state.</p> |
| |
| <p><tt>ogg_stream_clear</tt> does not call <tt>free()</tt> on the pointer |
| <tt>os</tt>, allowing use of this call on stream structures in static |
| or automatic storage. <tt>ogg_stream_destroy</tt>is a complimentary |
| function that frees the pointer as well.</p> |
| |
| <p>Returns zero on success and non-zero on failure. This function always |
| succeeds.</p> |
| |
| <h3> |
| int ogg_stream_destroy(ogg_stream_state *os); |
| </h3> |
| |
| <p>Clears and deallocates the internal storage of the given Ogg stream, |
| then frees the storage associated with the pointer <tt>os</tt>.</p> |
| |
| <p><tt>ogg_stream_clear</tt> does not call <tt>free()</tt> on the pointer |
| <tt>os</tt>, allowing use of that call on stream structures in static |
| or automatic storage.</p> |
| |
| <p>Returns zero on success and non-zero on failure. This function always |
| succeeds.</p> |
| |
| <h3> |
| int ogg_stream_init(ogg_stream_state *os,int serialno); |
| </h3> |
| |
| <p>Initialize the storage associated with <tt>os</tt> for use as an Ogg |
| stream. This call is used to initialize a stream for both encode and |
| decode. The given serial number is the serial number that will be |
| stamped on pages of the produced bitstream (during encode), or used as |
| a check that pages match (during decode).</p> |
| |
| <p>Returns zero on success, nonzero on failure.</p> |
| |
| <h3> |
| int ogg_stream_packetin(ogg_stream_state *os, ogg_packet *op); |
| </h3> |
| |
| <p>Used during encoding to add the given raw packet to the given Ogg |
| bitstream. The contents of <tt>op</tt> are copied; |
| <tt>ogg_stream_packetin</tt> does not retain any pointers into |
| <tt>op</tt>'s storage. The encoding proccess buffers incoming packets |
| until enough packets have been assembled to form an entire page; |
| <tt>ogg_stream_pageout</tt> is used to read complete pages.</p> |
| |
| <p>Returns zero on success, nonzero on failure.</p> |
| |
| <h3> |
| int ogg_stream_packetout(ogg_stream_state *os,ogg_packet *op); |
| </h3> |
| |
| <p>Used during decoding to read raw packets from the given logical |
| bitstream. <tt>ogg_stream_packetout</tt> will only return complete |
| packets for which checksumming indicates no corruption. The size and |
| contents of the packet exactly match those given in the encoding |
| process. </p> |
| |
| <p>Returns zero if the next packet is not ready to be read (not buffered |
| or incomplete), positive if it returned a complete packet in |
| <tt>op</tt> and negative if there is a gap, extra bytes or corruption |
| at this position in the bitstream (essentially that the bitstream had |
| to be recaptured). A negative value is not necessarily an error. It |
| would be a common occurence when seeking, for example, which requires |
| recapture of the bitstream at the position decoding continued.</p> |
| |
| <p>If the return value is positive, <tt>ogg_stream_packetout</tt> placed |
| a packet in <tt>op</tt>. The data in <tt>op</tt> points to static |
| storage that is valid until the next call to |
| <tt>ogg_stream_pagein</tt>, <tt>ogg_stream_clear</tt>, |
| <tt>ogg_stream_reset</tt>, or <tt>ogg_stream_destroy</tt>. The |
| pointers are not invalidated by more calls to |
| <tt>ogg_stream_packetout</tt>.</p> |
| |
| <h3> |
| int ogg_stream_pagein(ogg_stream_state *os, ogg_page *og); |
| </h3> |
| |
| <p>Used during decoding to buffer the given complete, pre-verified page |
| for decoding into raw Ogg packets. The given page must be framed, |
| normally produced by <tt>ogg_sync_pageout</tt>, and from the logical |
| bitstream associated with <tt>os</tt> (the serial numbers must match). |
| The contents of the given page are copied; <tt>ogg_stream_pagein</tt> |
| retains no pointers into <tt>og</tt> storage.</p> |
| |
| <p>Returns zero on success and non-zero on failure.</p> |
| |
| <h3> |
| int ogg_stream_pageout(ogg_stream_state *os, ogg_page *og); |
| </h3> |
| |
| <p>Used during encode to read complete pages from the stream buffer. The |
| returned page is ready for sending out to the real world.</p> |
| |
| <p>Returns zero if there is no complete page ready for reading. Returns |
| nonzero when it has placed data for a complete page into |
| <tt>og</tt>. Note that the storage returned in og points into internal |
| storage; the pointers in <tt>og</tt> are valid until the next call to |
| <tt>ogg_stream_pageout</tt>, <tt>ogg_stream_packetin</tt>, |
| <tt>ogg_stream_reset</tt>, <tt>ogg_stream_clear</tt> or |
| <tt>ogg_stream_destroy</tt>.</p> |
| |
| <h3> |
| int ogg_stream_reset(ogg_stream_state *os); |
| </h3> |
| |
| <p>Resets the given stream's state to that of a blank, unused stream; |
| this may be used during encode or decode.</p> |
| |
| <p>Note that if used during encode, it does not alter the stream's serial |
| number. In addition, the next page produced during encoding will be |
| marked as the 'initial' page of the logical bitstream.</p> |
| |
| <p>When used during decode, this simply clears the data buffer of any |
| pending pages. Beginning and end of stream cues are read from the |
| bitstream and are unaffected by reset.</p> |
| |
| <p>Returns zero on success and non-zero on failure. This function always |
| succeeds.</p> |
| |
| <h3> |
| char *ogg_sync_buffer(ogg_sync_state *oy, long size); |
| </h3> |
| |
| <p>This call is used to buffer a raw bitstream for framing and |
| verification. <tt>ogg_sync_buffer</tt> handles stream capture and |
| recapture, checksumming, and division into Ogg pages (as required by |
| <tt>ogg_stream_pagein</tt>).</p> |
| |
| <p><tt>ogg_sync_buffer</tt> exposes a buffer area into which the decoder |
| copies the next (up to) <tt>size</tt> bytes. We expose the buffer |
| (rather than taking a buffer) in order to avoid an extra copy many |
| uses; this way, for example, <tt>read()</tt> can transfer data |
| directly into the stream buffer without first needing to place it in |
| temporary storage.</p> |
| |
| <p>Returns a pointer into <tt>oy</tt>'s internal bitstream sync buffer; |
| the remaining space in the sync buffer is at least <tt>size</tt> |
| bytes. The decoder need not write all of <tt>size</tt> bytes; |
| <tt>ogg_sync_wrote</tt> is used to inform the engine how many bytes |
| were actually written. Use of <tt>ogg_sync_wrote</tt> after writing |
| into the exposed buffer is mandantory.</p> |
| |
| <h3> |
| int ogg_sync_clear(ogg_sync_state *oy); |
| </h3> |
| |
| <p><tt>ogg_sync_clear</tt> |
| clears and deallocates the internal storage of the given Ogg sync |
| buffer. After clearing, the sync structure is not initialized for |
| use; <tt>ogg_sync_init</tt> must be called to reinitialize for use. |
| Use <tt>ogg_sync_reset</tt> to reset the sync state and buffer to a |
| fresh, intiialized state.</p> |
| |
| <p><tt>ogg_sync_clear</tt> does not call <tt>free()</tt> on the pointer |
| <tt>oy</tt>, allowing use of this call on sync structures in static |
| or automatic storage. <tt>ogg_sync_destroy</tt>is a complimentary |
| function that frees the pointer as well.</p> |
| |
| <p>Returns zero on success and non-zero on failure. This function always |
| succeeds.</p> |
| |
| <h3> |
| int ogg_sync_destroy(ogg_sync_state *oy); |
| </h3> |
| |
| <p>Clears and deallocates the internal storage of the given Ogg sync |
| buffer, then frees the storage associated with the pointer |
| <tt>oy</tt>.</p> |
| |
| <p>An alternative function,<tt>ogg_sync_clear</tt>, does not call |
| <tt>free()</tt> on the pointer <tt>oy</tt>, allowing use of that call on |
| stream structures in static or automatic storage.</p> |
| |
| <p>Returns zero on success and non-zero on failure. This function always |
| succeeds.</p> |
| |
| <h3> |
| int ogg_sync_init(ogg_sync_state *oy); |
| </h3> |
| |
| <p>Initializes the sync buffer <tt>oy</tt> for use.</p> |
| |
| <p>Returns zero on success and non-zero on failure. This function always |
| succeeds.</p> |
| |
| <h3> |
| int ogg_sync_pageout(ogg_sync_state *oy, ogg_page *og); |
| </h3> |
| |
| <p>Reads complete, framed, verified Ogg pages from the sync buffer, |
| placing the page data in <tt>og</tt>.</p> |
| |
| <p>Returns zero when there's no complete pages buffered for |
| retrieval. Returns negative when a loss of sync or recapture occurred |
| (this is not necessarily an error; recapture would be required after |
| seeking, for example). Returns positive when a page is returned in |
| <tt>og</tt>. Note that the data in <tt>og</tt> points into the sync |
| buffer storage; the pointers are valid until the next call to |
| <tt>ogg_sync_buffer</tt>, <tt>ogg_sync_clear</tt>, |
| <tt>ogg_sync_destroy</tt> or <tt>ogg_sync_reset</tt>.</p> |
| |
| <h3> |
| int ogg_sync_reset(ogg_sync_state *oy); |
| </h3> |
| |
| <p><tt>ogg_sync_reset</tt> resets the sync state in <tt>oy</tt> to a |
| clean, empty state. This is useful, for example, when seeking to a |
| new location in a bitstream.</p> |
| |
| <p>Returns zero on success, nonzero on failure.</p> |
| |
| <h3> |
| int ogg_sync_wrote(ogg_sync_state *oy, long bytes); |
| </h3> |
| |
| <p>Used to inform the sync state as to how many bytes were actually |
| written into the exposed sync buffer. It must be equal to or less |
| than the size of the buffer requested.</p> |
| |
| <p>Returns zero on success and non-zero on failure; failure occurs only |
| when the number of bytes written were larger than the buffer.</p> |
| |
| <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> |