EVOLUTION-MANAGER
Edit File: group__metric.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/> <meta http-equiv="X-UA-Compatible" content="IE=9"/> <meta name="generator" content="Doxygen 1.8.5"/> <title>liboggz: Using OggzMetric</title> <link href="tabs.css" rel="stylesheet" type="text/css"/> <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript" src="dynsections.js"></script> <link href="doxygen.css" rel="stylesheet" type="text/css" /> </head> <body> <div id="top"><!-- do not remove this div, it is closed by doxygen! --> <div id="titlearea"> <table cellspacing="0" cellpadding="0"> <tbody> <tr style="height: 56px;"> <td style="padding-left: 0.5em;"> <div id="projectname">liboggz  <span id="projectnumber">1.1.1</span> </div> </td> </tr> </tbody> </table> </div> <!-- end header part --> <!-- Generated by Doxygen 1.8.5 --> <div id="navrow1" class="tabs"> <ul class="tablist"> <li><a href="index.html"><span>Main Page</span></a></li> <li><a href="modules.html"><span>Modules</span></a></li> <li><a href="annotated.html"><span>Data Structures</span></a></li> <li><a href="files.html"><span>Files</span></a></li> </ul> </div> </div><!-- top --> <div class="header"> <div class="summary"> <a href="#typedef-members">Typedefs</a> | <a href="#func-members">Functions</a> </div> <div class="headertitle"> <div class="title">Using OggzMetric</div> </div> </div><!--header--> <div class="contents"> <table class="memberdecls"> <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a> Typedefs</h2></td></tr> <tr class="memitem:ga8803bb406015a32f5172902e3e4e76e8"><td class="memItemLeft" align="right" valign="top">typedef ogg_int64_t(* </td><td class="memItemRight" valign="bottom"><a class="el" href="group__metric.html#ga8803bb406015a32f5172902e3e4e76e8">OggzMetric</a> )(<a class="el" href="oggz_8h.html#a672d218df13da45a4b41d5366211bfee">OGGZ</a> *oggz, long serialno, ogg_int64_t granulepos, void *user_data)</td></tr> <tr class="memdesc:ga8803bb406015a32f5172902e3e4e76e8"><td class="mdescLeft"> </td><td class="mdescRight">This is the signature of a function to correlate Ogg streams. <a href="#ga8803bb406015a32f5172902e3e4e76e8">More...</a><br/></td></tr> <tr class="separator:ga8803bb406015a32f5172902e3e4e76e8"><td class="memSeparator" colspan="2"> </td></tr> </table><table class="memberdecls"> <tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a> Functions</h2></td></tr> <tr class="memitem:gab411ab113d5f0f67bf77506724c25633"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__metric.html#gab411ab113d5f0f67bf77506724c25633">oggz_get_preroll</a> (<a class="el" href="oggz_8h.html#a672d218df13da45a4b41d5366211bfee">OGGZ</a> *oggz, long serialno)</td></tr> <tr class="memdesc:gab411ab113d5f0f67bf77506724c25633"><td class="mdescLeft"> </td><td class="mdescRight">Retrieve the preroll of a logical bitstream. <a href="#gab411ab113d5f0f67bf77506724c25633">More...</a><br/></td></tr> <tr class="separator:gab411ab113d5f0f67bf77506724c25633"><td class="memSeparator" colspan="2"> </td></tr> <tr class="memitem:gaa2b4ab5be298a11b5b91147b76996c83"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__metric.html#gaa2b4ab5be298a11b5b91147b76996c83">oggz_set_preroll</a> (<a class="el" href="oggz_8h.html#a672d218df13da45a4b41d5366211bfee">OGGZ</a> *oggz, long serialno, int preroll)</td></tr> <tr class="memdesc:gaa2b4ab5be298a11b5b91147b76996c83"><td class="mdescLeft"> </td><td class="mdescRight">Specify the preroll of a logical bitstream. <a href="#gaa2b4ab5be298a11b5b91147b76996c83">More...</a><br/></td></tr> <tr class="separator:gaa2b4ab5be298a11b5b91147b76996c83"><td class="memSeparator" colspan="2"> </td></tr> <tr class="memitem:gad9b55e525a6e0b994a133314fd78e2c0"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__metric.html#gad9b55e525a6e0b994a133314fd78e2c0">oggz_get_granuleshift</a> (<a class="el" href="oggz_8h.html#a672d218df13da45a4b41d5366211bfee">OGGZ</a> *oggz, long serialno)</td></tr> <tr class="memdesc:gad9b55e525a6e0b994a133314fd78e2c0"><td class="mdescLeft"> </td><td class="mdescRight">Retrieve the granuleshift of a logical bitstream. <a href="#gad9b55e525a6e0b994a133314fd78e2c0">More...</a><br/></td></tr> <tr class="separator:gad9b55e525a6e0b994a133314fd78e2c0"><td class="memSeparator" colspan="2"> </td></tr> <tr class="memitem:ga7ca67e0344580bf1541b9fbde39d481b"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__metric.html#ga7ca67e0344580bf1541b9fbde39d481b">oggz_set_granuleshift</a> (<a class="el" href="oggz_8h.html#a672d218df13da45a4b41d5366211bfee">OGGZ</a> *oggz, long serialno, int granuleshift)</td></tr> <tr class="memdesc:ga7ca67e0344580bf1541b9fbde39d481b"><td class="mdescLeft"> </td><td class="mdescRight">Specify the granuleshift of a logical bitstream. <a href="#ga7ca67e0344580bf1541b9fbde39d481b">More...</a><br/></td></tr> <tr class="separator:ga7ca67e0344580bf1541b9fbde39d481b"><td class="memSeparator" colspan="2"> </td></tr> <tr class="memitem:ga72a9a24e6f8483986859d7697fa611b6"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__metric.html#ga72a9a24e6f8483986859d7697fa611b6">oggz_get_granulerate</a> (<a class="el" href="oggz_8h.html#a672d218df13da45a4b41d5366211bfee">OGGZ</a> *oggz, long serialno, ogg_int64_t *granulerate_n, ogg_int64_t *granulerate_d)</td></tr> <tr class="memdesc:ga72a9a24e6f8483986859d7697fa611b6"><td class="mdescLeft"> </td><td class="mdescRight">Retrieve the granulerate of a logical bitstream. <a href="#ga72a9a24e6f8483986859d7697fa611b6">More...</a><br/></td></tr> <tr class="separator:ga72a9a24e6f8483986859d7697fa611b6"><td class="memSeparator" colspan="2"> </td></tr> <tr class="memitem:gaa2a86ec590161bc2295a2c8e91cefa49"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__metric.html#gaa2a86ec590161bc2295a2c8e91cefa49">oggz_set_granulerate</a> (<a class="el" href="oggz_8h.html#a672d218df13da45a4b41d5366211bfee">OGGZ</a> *oggz, long serialno, ogg_int64_t granule_rate_numerator, ogg_int64_t granule_rate_denominator)</td></tr> <tr class="memdesc:gaa2a86ec590161bc2295a2c8e91cefa49"><td class="mdescLeft"> </td><td class="mdescRight">Specify the granulerate of a logical bitstream. <a href="#gaa2a86ec590161bc2295a2c8e91cefa49">More...</a><br/></td></tr> <tr class="separator:gaa2a86ec590161bc2295a2c8e91cefa49"><td class="memSeparator" colspan="2"> </td></tr> <tr class="memitem:ga5a630e8dcd04e1dd6601d8f56f0af3f6"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__metric.html#ga5a630e8dcd04e1dd6601d8f56f0af3f6">oggz_set_metric</a> (<a class="el" href="oggz_8h.html#a672d218df13da45a4b41d5366211bfee">OGGZ</a> *oggz, long serialno, <a class="el" href="group__metric.html#ga8803bb406015a32f5172902e3e4e76e8">OggzMetric</a> metric, void *user_data)</td></tr> <tr class="memdesc:ga5a630e8dcd04e1dd6601d8f56f0af3f6"><td class="mdescLeft"> </td><td class="mdescRight">Set the OggzMetric to use for an OGGZ handle. <a href="#ga5a630e8dcd04e1dd6601d8f56f0af3f6">More...</a><br/></td></tr> <tr class="separator:ga5a630e8dcd04e1dd6601d8f56f0af3f6"><td class="memSeparator" colspan="2"> </td></tr> <tr class="memitem:gaaec9a54e9b231797d245042ce23b619a"><td class="memItemLeft" align="right" valign="top">int </td><td class="memItemRight" valign="bottom"><a class="el" href="group__metric.html#gaaec9a54e9b231797d245042ce23b619a">oggz_set_data_start</a> (<a class="el" href="oggz_8h.html#a672d218df13da45a4b41d5366211bfee">OGGZ</a> *oggz, <a class="el" href="oggz__off__t__generated_8h.html#ae4d9c2528ce26af562d8ad958d738050">oggz_off_t</a> offset)</td></tr> <tr class="memdesc:gaaec9a54e9b231797d245042ce23b619a"><td class="mdescLeft"> </td><td class="mdescRight">Tell Oggz to remember the given offset as the start of data. <a href="#gaaec9a54e9b231797d245042ce23b619a">More...</a><br/></td></tr> <tr class="separator:gaaec9a54e9b231797d245042ce23b619a"><td class="memSeparator" colspan="2"> </td></tr> </table> <a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2> <h1><a class="anchor" id="metric_intro"></a> Introduction</h1> <p>An OggzMetric is a helper function for Oggz's seeking mechanism.</p> <p>If every position in an Ogg stream can be described by a metric such as time, then it is possible to define a function that, given a serialno and granulepos, returns a measurement in units such as milliseconds. Oggz will use this function repeatedly while seeking in order to navigate through the Ogg stream.</p> <p>The meaning of the units is arbitrary, but must be consistent across all logical bitstreams. This allows Oggz to seek accurately through Ogg bitstreams containing multiple logical bitstreams such as tracks of media.</p> <h1><a class="anchor" id="setting"></a> How to set metrics</h1> <p>You don't need to set metrics for Speex, Vorbis, FLAC, Theora, CMML or Annodex. These can be handled <a class="el" href="group__seek__api.html">automatically </a> by Oggz.</p> <p>For most others it is simply a matter of providing a "granulerate": a frame or sampling rate, if each packet's granulepos represents a sample number.</p> <ul> <li>Set the <em>granule_rate_numerator</em> and <em>granule_rate_denominator</em> appropriately using <a class="el" href="group__metric.html#gaa2a86ec590161bc2295a2c8e91cefa49" title="Specify the granulerate of a logical bitstream. ">oggz_set_granulerate()</a></li> </ul> <p>Some codecs use a "granuleshift" to divide a granulepos into two halves; the first describing a dependency on a previous packet, the second giving the offset since that packet. This is used to mark keyframes and intermediate frames.</p> <ul> <li>Set the <em>granuleshift</em> appropriately using <a class="el" href="group__metric.html#ga7ca67e0344580bf1541b9fbde39d481b" title="Specify the granuleshift of a logical bitstream. ">oggz_set_granuleshift()</a></li> </ul> <h2><a class="anchor" id="custom"></a> Custom Metrics</h2> <p>For streams with non-linear granulepos, you need to set a custom metric:</p> <ul> <li>Implement an OggzMetric callback</li> <li>Set the OggzMetric callback using <a class="el" href="group__metric.html#ga5a630e8dcd04e1dd6601d8f56f0af3f6" title="Set the OggzMetric to use for an OGGZ handle. ">oggz_set_metric()</a></li> </ul> <h1><a class="anchor" id="using"></a> Seeking with OggzMetrics</h1> <p>To seek, use <a class="el" href="group__seek__api.html#ga60bac88ef3695629efacec43a21927e5" title="Seek to an offset in milliseconds, or custom units as specified by a Metric function you have provide...">oggz_seek_units()</a>. Oggz will perform a ratio search through the Ogg bitstream, using the OggzMetric callback to determine its position relative to the desired unit.</p> <dl class="section note"><dt>Note</dt><dd></dd></dl> <p>Many data streams begin with headers describing such things as codec setup parameters. One of the assumptions Monty makes is:</p> <ul> <li>Given pre-cached decode headers, a player may seek into a stream at any point and begin decode.</li> </ul> <p>Thus, the first action taken by applications dealing with such data is to read in and cache the decode headers; thereafter the application can safely seek to arbitrary points in the data.</p> <p>This impacts seeking because the portion of the bitstream containing decode headers should not be considered part of the metric space. To inform Oggz not to seek earlier than the end of the decode headers, use <a class="el" href="group__metric.html#gaaec9a54e9b231797d245042ce23b619a" title="Tell Oggz to remember the given offset as the start of data. ">oggz_set_data_start()</a>. </p> <h2 class="groupheader">Typedef Documentation</h2> <a class="anchor" id="ga8803bb406015a32f5172902e3e4e76e8"></a> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">typedef ogg_int64_t(* OggzMetric)(<a class="el" href="oggz_8h.html#a672d218df13da45a4b41d5366211bfee">OGGZ</a> *oggz, long serialno, ogg_int64_t granulepos, void *user_data)</td> </tr> </table> </div><div class="memdoc"> <p>This is the signature of a function to correlate Ogg streams. </p> <p>If every position in an Ogg stream can be described by a metric (eg. time) then define this function that returns some arbitrary unit value. This is the normal use of Oggz for media streams. The meaning of units is arbitrary, but must be consistent across all logical bitstreams; for example a conversion of the time offset of a given packet into nanoseconds or a similar stream-specific subdivision may be appropriate.</p> <dl class="params"><dt>Parameters</dt><dd> <table class="params"> <tr><td class="paramname">oggz</td><td>An OGGZ handle </td></tr> <tr><td class="paramname">serialno</td><td>Identifies a logical bitstream within <em>oggz</em> </td></tr> <tr><td class="paramname">granulepos</td><td>A granulepos within the logical bitstream identified by <em>serialno</em> </td></tr> <tr><td class="paramname">user_data</td><td>Arbitrary data you wish to pass to your callback </td></tr> </table> </dd> </dl> <dl class="section return"><dt>Returns</dt><dd>A conversion of the (serialno, granulepos) pair into a measure in units which is consistent across all logical bitstreams within <em>oggz</em> </dd></dl> </div> </div> <h2 class="groupheader">Function Documentation</h2> <a class="anchor" id="ga72a9a24e6f8483986859d7697fa611b6"></a> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">int oggz_get_granulerate </td> <td>(</td> <td class="paramtype"><a class="el" href="oggz_8h.html#a672d218df13da45a4b41d5366211bfee">OGGZ</a> * </td> <td class="paramname"><em>oggz</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">long </td> <td class="paramname"><em>serialno</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">ogg_int64_t * </td> <td class="paramname"><em>granulerate_n</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">ogg_int64_t * </td> <td class="paramname"><em>granulerate_d</em> </td> </tr> <tr> <td></td> <td>)</td> <td></td><td></td> </tr> </table> </div><div class="memdoc"> <p>Retrieve the granulerate of a logical bitstream. </p> <dl class="params"><dt>Parameters</dt><dd> <table class="params"> <tr><td class="paramname">oggz</td><td>An OGGZ handle </td></tr> <tr><td class="paramname">serialno</td><td>Identify the logical bitstream in <em>oggz</em> </td></tr> <tr><td class="paramname">granulerate_n</td><td>Return location for the granulerate numerator </td></tr> <tr><td class="paramname">granulerate_d</td><td>Return location for the granulerate denominator </td></tr> </table> </dd> </dl> <dl class="section return"><dt>Returns</dt><dd>0 Success </dd></dl> <dl class="retval"><dt>Return values</dt><dd> <table class="retval"> <tr><td class="paramname">OGGZ_ERR_BAD_SERIALNO</td><td><em>serialno</em> does not identify an existing logical bitstream in <em>oggz</em>. </td></tr> <tr><td class="paramname">OGGZ_ERR_BAD_OGGZ</td><td><em>oggz</em> does not refer to an existing OGGZ </td></tr> </table> </dd> </dl> </div> </div> <a class="anchor" id="gad9b55e525a6e0b994a133314fd78e2c0"></a> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">int oggz_get_granuleshift </td> <td>(</td> <td class="paramtype"><a class="el" href="oggz_8h.html#a672d218df13da45a4b41d5366211bfee">OGGZ</a> * </td> <td class="paramname"><em>oggz</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">long </td> <td class="paramname"><em>serialno</em> </td> </tr> <tr> <td></td> <td>)</td> <td></td><td></td> </tr> </table> </div><div class="memdoc"> <p>Retrieve the granuleshift of a logical bitstream. </p> <dl class="params"><dt>Parameters</dt><dd> <table class="params"> <tr><td class="paramname">oggz</td><td>An OGGZ handle </td></tr> <tr><td class="paramname">serialno</td><td>Identify the logical bitstream in <em>oggz</em> </td></tr> </table> </dd> </dl> <dl class="section return"><dt>Returns</dt><dd>The granuleshift of the specified logical bitstream. </dd></dl> <dl class="retval"><dt>Return values</dt><dd> <table class="retval"> <tr><td class="paramname">OGGZ_ERR_BAD_SERIALNO</td><td><em>serialno</em> does not identify an existing logical bitstream in <em>oggz</em>. </td></tr> <tr><td class="paramname">OGGZ_ERR_BAD_OGGZ</td><td><em>oggz</em> does not refer to an existing OGGZ </td></tr> </table> </dd> </dl> </div> </div> <a class="anchor" id="gab411ab113d5f0f67bf77506724c25633"></a> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">int oggz_get_preroll </td> <td>(</td> <td class="paramtype"><a class="el" href="oggz_8h.html#a672d218df13da45a4b41d5366211bfee">OGGZ</a> * </td> <td class="paramname"><em>oggz</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">long </td> <td class="paramname"><em>serialno</em> </td> </tr> <tr> <td></td> <td>)</td> <td></td><td></td> </tr> </table> </div><div class="memdoc"> <p>Retrieve the preroll of a logical bitstream. </p> <dl class="params"><dt>Parameters</dt><dd> <table class="params"> <tr><td class="paramname">oggz</td><td>An OGGZ handle </td></tr> <tr><td class="paramname">serialno</td><td>Identify the logical bitstream in <em>oggz</em> </td></tr> </table> </dd> </dl> <dl class="section return"><dt>Returns</dt><dd>The preroll of the specified logical bitstream. </dd></dl> <dl class="retval"><dt>Return values</dt><dd> <table class="retval"> <tr><td class="paramname">OGGZ_ERR_BAD_SERIALNO</td><td><em>serialno</em> does not identify an existing logical bitstream in <em>oggz</em>. </td></tr> <tr><td class="paramname">OGGZ_ERR_BAD_OGGZ</td><td><em>oggz</em> does not refer to an existing OGGZ </td></tr> </table> </dd> </dl> </div> </div> <a class="anchor" id="gaaec9a54e9b231797d245042ce23b619a"></a> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">int oggz_set_data_start </td> <td>(</td> <td class="paramtype"><a class="el" href="oggz_8h.html#a672d218df13da45a4b41d5366211bfee">OGGZ</a> * </td> <td class="paramname"><em>oggz</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype"><a class="el" href="oggz__off__t__generated_8h.html#ae4d9c2528ce26af562d8ad958d738050">oggz_off_t</a> </td> <td class="paramname"><em>offset</em> </td> </tr> <tr> <td></td> <td>)</td> <td></td><td></td> </tr> </table> </div><div class="memdoc"> <p>Tell Oggz to remember the given offset as the start of data. </p> <p>This informs the seeking mechanism that when seeking back to unit 0, go to the given offset, not to the start of the file, which is usually codec headers. The usual usage is: </p> <pre> oggz_set_data_start (oggz, oggz_tell (oggz)); </pre> <dl class="params"><dt>Parameters</dt><dd> <table class="params"> <tr><td class="paramname">oggz</td><td>An OGGZ handle previously opened for reading </td></tr> <tr><td class="paramname">offset</td><td>The offset of the start of data </td></tr> </table> </dd> </dl> <dl class="section return"><dt>Returns</dt><dd>0 on success, -1 on failure. </dd></dl> </div> </div> <a class="anchor" id="gaa2a86ec590161bc2295a2c8e91cefa49"></a> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">int oggz_set_granulerate </td> <td>(</td> <td class="paramtype"><a class="el" href="oggz_8h.html#a672d218df13da45a4b41d5366211bfee">OGGZ</a> * </td> <td class="paramname"><em>oggz</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">long </td> <td class="paramname"><em>serialno</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">ogg_int64_t </td> <td class="paramname"><em>granule_rate_numerator</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">ogg_int64_t </td> <td class="paramname"><em>granule_rate_denominator</em> </td> </tr> <tr> <td></td> <td>)</td> <td></td><td></td> </tr> </table> </div><div class="memdoc"> <p>Specify the granulerate of a logical bitstream. </p> <dl class="params"><dt>Parameters</dt><dd> <table class="params"> <tr><td class="paramname">oggz</td><td>An OGGZ handle </td></tr> <tr><td class="paramname">serialno</td><td>Identify the logical bitstream in <em>oggz</em> to attach this linear metric to. A value of -1 indicates that the metric should be attached to all unattached logical bitstreams in <em>oggz</em>. </td></tr> <tr><td class="paramname">granule_rate_numerator</td><td>The numerator of the granule rate </td></tr> <tr><td class="paramname">granule_rate_denominator</td><td>The denominator of the granule rate </td></tr> </table> </dd> </dl> <dl class="section return"><dt>Returns</dt><dd>0 Success </dd></dl> <dl class="retval"><dt>Return values</dt><dd> <table class="retval"> <tr><td class="paramname">OGGZ_ERR_BAD_SERIALNO</td><td><em>serialno</em> does not identify an existing logical bitstream in <em>oggz</em>. </td></tr> <tr><td class="paramname">OGGZ_ERR_BAD_OGGZ</td><td><em>oggz</em> does not refer to an existing OGGZ </td></tr> </table> </dd> </dl> </div> </div> <a class="anchor" id="ga7ca67e0344580bf1541b9fbde39d481b"></a> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">int oggz_set_granuleshift </td> <td>(</td> <td class="paramtype"><a class="el" href="oggz_8h.html#a672d218df13da45a4b41d5366211bfee">OGGZ</a> * </td> <td class="paramname"><em>oggz</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">long </td> <td class="paramname"><em>serialno</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">int </td> <td class="paramname"><em>granuleshift</em> </td> </tr> <tr> <td></td> <td>)</td> <td></td><td></td> </tr> </table> </div><div class="memdoc"> <p>Specify the granuleshift of a logical bitstream. </p> <dl class="params"><dt>Parameters</dt><dd> <table class="params"> <tr><td class="paramname">oggz</td><td>An OGGZ handle </td></tr> <tr><td class="paramname">serialno</td><td>Identify the logical bitstream in <em>oggz</em> to attach this granuleshift metric to. A value of -1 indicates that the metric should be attached to all unattached logical bitstreams in <em>oggz</em>. </td></tr> <tr><td class="paramname">granuleshift</td><td>The granuleshift </td></tr> </table> </dd> </dl> <dl class="section return"><dt>Returns</dt><dd>0 Success </dd></dl> <dl class="retval"><dt>Return values</dt><dd> <table class="retval"> <tr><td class="paramname">OGGZ_ERR_BAD_SERIALNO</td><td><em>serialno</em> does not identify an existing logical bitstream in <em>oggz</em>. </td></tr> <tr><td class="paramname">OGGZ_ERR_BAD_OGGZ</td><td><em>oggz</em> does not refer to an existing OGGZ </td></tr> </table> </dd> </dl> </div> </div> <a class="anchor" id="ga5a630e8dcd04e1dd6601d8f56f0af3f6"></a> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">int oggz_set_metric </td> <td>(</td> <td class="paramtype"><a class="el" href="oggz_8h.html#a672d218df13da45a4b41d5366211bfee">OGGZ</a> * </td> <td class="paramname"><em>oggz</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">long </td> <td class="paramname"><em>serialno</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype"><a class="el" href="group__metric.html#ga8803bb406015a32f5172902e3e4e76e8">OggzMetric</a> </td> <td class="paramname"><em>metric</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">void * </td> <td class="paramname"><em>user_data</em> </td> </tr> <tr> <td></td> <td>)</td> <td></td><td></td> </tr> </table> </div><div class="memdoc"> <p>Set the OggzMetric to use for an OGGZ handle. </p> <dl class="params"><dt>Parameters</dt><dd> <table class="params"> <tr><td class="paramname">oggz</td><td>An OGGZ handle </td></tr> <tr><td class="paramname">serialno</td><td>Identify the logical bitstream in <em>oggz</em> to attach this metric to. A value of -1 indicates that this metric should be attached to all unattached logical bitstreams in <em>oggz</em>. </td></tr> <tr><td class="paramname">metric</td><td>An OggzMetric callback </td></tr> <tr><td class="paramname">user_data</td><td>arbitrary data to pass to the metric callback</td></tr> </table> </dd> </dl> <dl class="section return"><dt>Returns</dt><dd>0 Success </dd></dl> <dl class="retval"><dt>Return values</dt><dd> <table class="retval"> <tr><td class="paramname">OGGZ_ERR_BAD_SERIALNO</td><td><em>serialno</em> does not identify an existing logical bitstream in <em>oggz</em>, and is not -1 </td></tr> <tr><td class="paramname">OGGZ_ERR_BAD_OGGZ</td><td><em>oggz</em> does not refer to an existing OGGZ</td></tr> </table> </dd> </dl> <dl class="section note"><dt>Note</dt><dd>Specifying values of <em>serialno</em> other than -1 allows you to pass logical bitstream specific user_data to the same metric. </dd> <dd> Alternatively, you may use a different <em>metric</em> for each <em>serialno</em>, but all metrics used must return mutually consistent unit measurements. </dd></dl> </div> </div> <a class="anchor" id="gaa2b4ab5be298a11b5b91147b76996c83"></a> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">int oggz_set_preroll </td> <td>(</td> <td class="paramtype"><a class="el" href="oggz_8h.html#a672d218df13da45a4b41d5366211bfee">OGGZ</a> * </td> <td class="paramname"><em>oggz</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">long </td> <td class="paramname"><em>serialno</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">int </td> <td class="paramname"><em>preroll</em> </td> </tr> <tr> <td></td> <td>)</td> <td></td><td></td> </tr> </table> </div><div class="memdoc"> <p>Specify the preroll of a logical bitstream. </p> <dl class="params"><dt>Parameters</dt><dd> <table class="params"> <tr><td class="paramname">oggz</td><td>An OGGZ handle </td></tr> <tr><td class="paramname">serialno</td><td>Identify the logical bitstream in <em>oggz</em> to attach this preroll to. </td></tr> <tr><td class="paramname">preroll</td><td>The preroll </td></tr> </table> </dd> </dl> <dl class="section return"><dt>Returns</dt><dd>0 Success </dd></dl> <dl class="retval"><dt>Return values</dt><dd> <table class="retval"> <tr><td class="paramname">OGGZ_ERR_BAD_SERIALNO</td><td><em>serialno</em> does not identify an existing logical bitstream in <em>oggz</em>. </td></tr> <tr><td class="paramname">OGGZ_ERR_BAD_OGGZ</td><td><em>oggz</em> does not refer to an existing OGGZ </td></tr> </table> </dd> </dl> </div> </div> </div><!-- contents --> <!-- start footer part --> <hr class="footer"/><address class="footer"><small> Generated by  <a href="http://www.doxygen.org/index.html"> <img class="footer" src="doxygen.png" alt="doxygen"/> </a> 1.8.5 </small></address> </body> </html>