Blob Blame History Raw
<!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"/>
<title>liboggz: Oggz Write API</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.6.3 -->
<div class="navigation" id="top">
  <div class="tabs">
    <ul>
      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
      <li><a href="modules.html"><span>Modules</span></a></li>
      <li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
      <li><a href="files.html"><span>Files</span></a></li>
    </ul>
  </div>
</div>
<div class="contents">
<h1>Oggz Write API</h1>
<p>Oggz maintains a packet queue, such that you can independently add packets to the queue and write an Ogg bitstream.  
<a href="#_details">More...</a></p>
<table border="0" cellpadding="0" cellspacing="0">
<tr><td colspan="2"><h2>Typedefs</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">typedef int(*&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__write__api.html#ga27ef9f56078d3c015431b1a67b2c1812">OggzWriteHungry</a> )(<a class="el" href="oggz_8h.html#a672d218df13da45a4b41d5366211bfee">OGGZ</a> *oggz, int empty, void *user_data)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">This is the signature of a callback which Oggz will call when <em>oggz</em> is <a class="el" href="group__hungry.html">hungry </a>.  <a href="#ga27ef9f56078d3c015431b1a67b2c1812"></a><br/></td></tr>
<tr><td colspan="2"><h2>Functions</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__write__api.html#gaf362c030bc7a7f57cb23f2b863a59389">oggz_write_set_hungry_callback</a> (<a class="el" href="oggz_8h.html#a672d218df13da45a4b41d5366211bfee">OGGZ</a> *oggz, <a class="el" href="group__write__api.html#ga27ef9f56078d3c015431b1a67b2c1812">OggzWriteHungry</a> hungry, int only_when_empty, void *user_data)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Set a callback for Oggz to call when <em>oggz</em> is <a class="el" href="group__hungry.html">hungry </a>.  <a href="#gaf362c030bc7a7f57cb23f2b863a59389"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__write__api.html#ga6ccaceb107db1fd2eae047dbdbaa5889">oggz_write_feed</a> (<a class="el" href="oggz_8h.html#a672d218df13da45a4b41d5366211bfee">OGGZ</a> *oggz, ogg_packet *op, long serialno, int flush, int *guard)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Add a packet to <em>oggz's</em> packet queue.  <a href="#ga6ccaceb107db1fd2eae047dbdbaa5889"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">long&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__write__api.html#ga5606dff01964caec4582eb172fde0c1c">oggz_write_output</a> (<a class="el" href="oggz_8h.html#a672d218df13da45a4b41d5366211bfee">OGGZ</a> *oggz, unsigned char *buf, long n)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Output data from an OGGZ handle.  <a href="#ga5606dff01964caec4582eb172fde0c1c"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">long&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__write__api.html#ga3c97d94ea425d64546adf9c368b71904">oggz_write</a> (<a class="el" href="oggz_8h.html#a672d218df13da45a4b41d5366211bfee">OGGZ</a> *oggz, long n)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Write n bytes from an OGGZ handle.  <a href="#ga3c97d94ea425d64546adf9c368b71904"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">long&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__write__api.html#gab25da7d2cbf39585357f2a426d3dba2f">oggz_write_get_next_page_size</a> (<a class="el" href="oggz_8h.html#a672d218df13da45a4b41d5366211bfee">OGGZ</a> *oggz)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Query the number of bytes in the next page to be written.  <a href="#gab25da7d2cbf39585357f2a426d3dba2f"></a><br/></td></tr>
</table>
<hr/><a name="_details"></a><h2>Detailed Description</h2>
<p>Oggz maintains a packet queue, such that you can independently add packets to the queue and write an Ogg bitstream. </p>
<p>There are two complementary methods for adding packets to the packet queue.</p>
<ul>
<li>by <a class="el" href="group__force__feed.html">force feeding Oggz </a></li>
<li>by using <a class="el" href="group__hungry.html">OggzHungry </a> callbacks</li>
</ul>
<p>As each packet is enqueued, its validity is checked against the framing constraints outlined in the <a class="el" href="group__basics.html">Ogg basics </a> section. If it does not pass these constraints, <a class="el" href="group__write__api.html#ga6ccaceb107db1fd2eae047dbdbaa5889" title="Add a packet to oggz&#39;s packet queue.">oggz_write_feed()</a> will fail with an appropriate error code.</p>
<dl class="note"><dt><b>Note:</b></dt><dd><ul>
<li>When writing, you can ensure that a packet starts on a new page by setting the <em>flush</em> parameter of <a class="el" href="group__write__api.html#ga6ccaceb107db1fd2eae047dbdbaa5889" title="Add a packet to oggz&#39;s packet queue.">oggz_write_feed()</a> to <em>OGGZ_FLUSH_BEFORE</em> when enqueuing it. Similarly you can ensure that the last page a packet is written into won't contain any following packets by setting the <em>flush</em> parameter of <a class="el" href="group__write__api.html#ga6ccaceb107db1fd2eae047dbdbaa5889" title="Add a packet to oggz&#39;s packet queue.">oggz_write_feed()</a> to <em>OGGZ_FLUSH_AFTER</em>.</li>
<li>The <em>OGGZ_FLUSH_BEFORE</em> and <em>OGGZ_FLUSH_AFTER</em> flags can be bitwise OR'd together to ensure that the packet will not share any pages with any other packets, either before or after. </li>
</ul>
</dd></dl>
<hr/><h2>Typedef Documentation</h2>
<a class="anchor" id="ga27ef9f56078d3c015431b1a67b2c1812"></a><!-- doxytag: member="oggz_write.h::OggzWriteHungry" ref="ga27ef9f56078d3c015431b1a67b2c1812" args=")(OGGZ *oggz, int empty, void *user_data)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">typedef int(* <a class="el" href="group__write__api.html#ga27ef9f56078d3c015431b1a67b2c1812">OggzWriteHungry</a>)(<a class="el" href="oggz_8h.html#a672d218df13da45a4b41d5366211bfee">OGGZ</a> *oggz, int empty, void *user_data)</td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>This is the signature of a callback which Oggz will call when <em>oggz</em> is <a class="el" href="group__hungry.html">hungry </a>. </p>
<dl><dt><b>Parameters:</b></dt><dd>
  <table border="0" cellspacing="2" cellpadding="0">
    <tr><td valign="top"></td><td valign="top"><em>oggz</em>&nbsp;</td><td>The OGGZ handle </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>empty</em>&nbsp;</td><td>A value of 1 indicates that the packet queue is currently empty. A value of 0 indicates that the packet queue is not empty. </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>user_data</em>&nbsp;</td><td>A generic pointer you have provided earlier </td></tr>
  </table>
  </dd>
</dl>
<dl><dt><b>Return values:</b></dt><dd>
  <table border="0" cellspacing="2" cellpadding="0">
    <tr><td valign="top"></td><td valign="top"><em>0</em>&nbsp;</td><td>Continue </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>non-zero</em>&nbsp;</td><td>Instruct Oggz to stop. </td></tr>
  </table>
  </dd>
</dl>

</div>
</div>
<hr/><h2>Function Documentation</h2>
<a class="anchor" id="ga3c97d94ea425d64546adf9c368b71904"></a><!-- doxytag: member="oggz_write.h::oggz_write" ref="ga3c97d94ea425d64546adf9c368b71904" args="(OGGZ *oggz, long n)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">long oggz_write </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="oggz_8h.html#a672d218df13da45a4b41d5366211bfee">OGGZ</a> *&nbsp;</td>
          <td class="paramname"> <em>oggz</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">long&nbsp;</td>
          <td class="paramname"> <em>n</em></td><td>&nbsp;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td><td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Write n bytes from an OGGZ handle. </p>
<p>Oggz will call your write callback as needed.</p>
<dl><dt><b>Parameters:</b></dt><dd>
  <table border="0" cellspacing="2" cellpadding="0">
    <tr><td valign="top"></td><td valign="top"><em>oggz</em>&nbsp;</td><td>An OGGZ handle previously opened for writing </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>n</em>&nbsp;</td><td>A count of bytes to be written </td></tr>
  </table>
  </dd>
</dl>
<dl><dt><b>Return values:</b></dt><dd>
  <table border="0" cellspacing="2" cellpadding="0">
    <tr><td valign="top"></td><td valign="top"><em>&gt; 0</em>&nbsp;</td><td>The number of bytes successfully output </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>0</em>&nbsp;</td><td>End of stream </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>OGGZ_ERR_RECURSIVE_WRITE</em>&nbsp;</td><td>Attempt to initiate writing from within an OggzHungry callback </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>OGGZ_ERR_BAD_OGGZ</em>&nbsp;</td><td><em>oggz</em> does not refer to an existing OGGZ </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>OGGZ_ERR_INVALID</em>&nbsp;</td><td>Operation not suitable for this OGGZ </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>OGGZ_ERR_STOP_OK</em>&nbsp;</td><td>Writing was stopped by an OggzHungry callback returning OGGZ_STOP_OK </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>OGGZ_ERR_STOP_ERR</em>&nbsp;</td><td>Reading was stopped by an OggzHungry callback returning OGGZ_STOP_ERR </td></tr>
  </table>
  </dd>
</dl>

</div>
</div>
<a class="anchor" id="ga6ccaceb107db1fd2eae047dbdbaa5889"></a><!-- doxytag: member="oggz_write.h::oggz_write_feed" ref="ga6ccaceb107db1fd2eae047dbdbaa5889" args="(OGGZ *oggz, ogg_packet *op, long serialno, int flush, int *guard)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">int oggz_write_feed </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="oggz_8h.html#a672d218df13da45a4b41d5366211bfee">OGGZ</a> *&nbsp;</td>
          <td class="paramname"> <em>oggz</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">ogg_packet *&nbsp;</td>
          <td class="paramname"> <em>op</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">long&nbsp;</td>
          <td class="paramname"> <em>serialno</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&nbsp;</td>
          <td class="paramname"> <em>flush</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int *&nbsp;</td>
          <td class="paramname"> <em>guard</em></td><td>&nbsp;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td><td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Add a packet to <em>oggz's</em> packet queue. </p>
<dl><dt><b>Parameters:</b></dt><dd>
  <table border="0" cellspacing="2" cellpadding="0">
    <tr><td valign="top"></td><td valign="top"><em>oggz</em>&nbsp;</td><td>An OGGZ handle previously opened for writing </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>op</em>&nbsp;</td><td>An ogg_packet with all fields filled in </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>serialno</em>&nbsp;</td><td>Identify the logical bitstream in <em>oggz</em> to add the packet to </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>flush</em>&nbsp;</td><td>Bitmask of OGGZ_FLUSH_BEFORE, OGGZ_FLUSH_AFTER </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>guard</em>&nbsp;</td><td>A guard for nocopy, NULL otherwise </td></tr>
  </table>
  </dd>
</dl>
<dl><dt><b>Return values:</b></dt><dd>
  <table border="0" cellspacing="2" cellpadding="0">
    <tr><td valign="top"></td><td valign="top"><em>0</em>&nbsp;</td><td>Success </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>OGGZ_ERR_BAD_GUARD</em>&nbsp;</td><td><em>guard</em> specified has non-zero initialization </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>OGGZ_ERR_BOS</em>&nbsp;</td><td>Packet would be bos packet of a new logical bitstream, but oggz has already written one or more non-bos packets in other logical bitstreams, and <em>oggz</em> is not flagged OGGZ_NONSTRICT </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>OGGZ_ERR_EOS</em>&nbsp;</td><td>The logical bitstream identified by <em>serialno</em> is already at eos, and <em>oggz</em> is not flagged OGGZ_NONSTRICT </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>OGGZ_ERR_BAD_BYTES</em>&nbsp;</td><td><em>op-&gt;bytes</em> is invalid, and <em>oggz</em> is not flagged OGGZ_NONSTRICT </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>OGGZ_ERR_BAD_B_O_S</em>&nbsp;</td><td><em>op-&gt;b_o_s</em> is invalid, and <em>oggz</em> is not flagged OGGZ_NONSTRICT </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>OGGZ_ERR_BAD_GRANULEPOS</em>&nbsp;</td><td><em>op-&gt;granulepos</em> is less than that of an earlier packet within this logical bitstream, and <em>oggz</em> is not flagged OGGZ_NONSTRICT </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>OGGZ_ERR_BAD_PACKETNO</em>&nbsp;</td><td><em>op-&gt;packetno</em> is less than that of an earlier packet within this logical bitstream, and <em>oggz</em> is not flagged OGGZ_NONSTRICT </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>OGGZ_ERR_BAD_SERIALNO</em>&nbsp;</td><td><em>serialno</em> does not identify an existing logical bitstream in <em>oggz</em>, and <em>oggz</em> is not flagged OGGZ_NONSTRICT or <em>serialno</em> is equal to -1, or <em>serialno</em> does not fit in 32 bits, ie. within the range (-(2^31), (2^31)-1) </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>OGGZ_ERR_BAD_OGGZ</em>&nbsp;</td><td><em>oggz</em> does not refer to an existing OGGZ </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>OGGZ_ERR_INVALID</em>&nbsp;</td><td>Operation not suitable for this OGGZ </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>OGGZ_ERR_OUT_OF_MEMORY</em>&nbsp;</td><td>Unable to allocate memory to queue packet</td></tr>
  </table>
  </dd>
</dl>
<dl class="note"><dt><b>Note:</b></dt><dd>If <em>op-&gt;b_o_s</em> is initialized to <em>-1</em> before calling <a class="el" href="group__write__api.html#ga6ccaceb107db1fd2eae047dbdbaa5889" title="Add a packet to oggz&#39;s packet queue.">oggz_write_feed()</a>, Oggz will fill it in with the appropriate value; ie. 1 for the first packet of a new stream, and 0 otherwise. </dd></dl>

</div>
</div>
<a class="anchor" id="gab25da7d2cbf39585357f2a426d3dba2f"></a><!-- doxytag: member="oggz_write.h::oggz_write_get_next_page_size" ref="gab25da7d2cbf39585357f2a426d3dba2f" args="(OGGZ *oggz)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">long oggz_write_get_next_page_size </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="oggz_8h.html#a672d218df13da45a4b41d5366211bfee">OGGZ</a> *&nbsp;</td>
          <td class="paramname"> <em>oggz</em></td>
          <td>&nbsp;)&nbsp;</td>
          <td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Query the number of bytes in the next page to be written. </p>
<dl><dt><b>Parameters:</b></dt><dd>
  <table border="0" cellspacing="2" cellpadding="0">
    <tr><td valign="top"></td><td valign="top"><em>oggz</em>&nbsp;</td><td>An OGGZ handle previously opened for writing </td></tr>
  </table>
  </dd>
</dl>
<dl><dt><b>Return values:</b></dt><dd>
  <table border="0" cellspacing="2" cellpadding="0">
    <tr><td valign="top"></td><td valign="top"><em>&gt;= 0</em>&nbsp;</td><td>The number of bytes in the next page </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>OGGZ_ERR_BAD_OGGZ</em>&nbsp;</td><td><em>oggz</em> does not refer to an existing OGGZ </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>OGGZ_ERR_INVALID</em>&nbsp;</td><td>Operation not suitable for this OGGZ </td></tr>
  </table>
  </dd>
</dl>

</div>
</div>
<a class="anchor" id="ga5606dff01964caec4582eb172fde0c1c"></a><!-- doxytag: member="oggz_write.h::oggz_write_output" ref="ga5606dff01964caec4582eb172fde0c1c" args="(OGGZ *oggz, unsigned char *buf, long n)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">long oggz_write_output </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="oggz_8h.html#a672d218df13da45a4b41d5366211bfee">OGGZ</a> *&nbsp;</td>
          <td class="paramname"> <em>oggz</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">unsigned char *&nbsp;</td>
          <td class="paramname"> <em>buf</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">long&nbsp;</td>
          <td class="paramname"> <em>n</em></td><td>&nbsp;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td><td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Output data from an OGGZ handle. </p>
<p>Oggz will call your write callback as needed.</p>
<dl><dt><b>Parameters:</b></dt><dd>
  <table border="0" cellspacing="2" cellpadding="0">
    <tr><td valign="top"></td><td valign="top"><em>oggz</em>&nbsp;</td><td>An OGGZ handle previously opened for writing </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>buf</em>&nbsp;</td><td>A memory buffer </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>n</em>&nbsp;</td><td>A count of bytes to output </td></tr>
  </table>
  </dd>
</dl>
<dl><dt><b>Return values:</b></dt><dd>
  <table border="0" cellspacing="2" cellpadding="0">
    <tr><td valign="top"></td><td valign="top"><em>&gt; 0</em>&nbsp;</td><td>The number of bytes successfully output </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>0</em>&nbsp;</td><td>End of stream </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>OGGZ_ERR_RECURSIVE_WRITE</em>&nbsp;</td><td>Attempt to initiate writing from within an OggzHungry callback </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>OGGZ_ERR_BAD_OGGZ</em>&nbsp;</td><td><em>oggz</em> does not refer to an existing OGGZ </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>OGGZ_ERR_INVALID</em>&nbsp;</td><td>Operation not suitable for this OGGZ </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>OGGZ_ERR_STOP_OK</em>&nbsp;</td><td>Writing was stopped by an OggzHungry callback returning OGGZ_STOP_OK </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>OGGZ_ERR_STOP_ERR</em>&nbsp;</td><td>Reading was stopped by an OggzHungry callback returning OGGZ_STOP_ERR </td></tr>
  </table>
  </dd>
</dl>

</div>
</div>
<a class="anchor" id="gaf362c030bc7a7f57cb23f2b863a59389"></a><!-- doxytag: member="oggz_write.h::oggz_write_set_hungry_callback" ref="gaf362c030bc7a7f57cb23f2b863a59389" args="(OGGZ *oggz, OggzWriteHungry hungry, int only_when_empty, void *user_data)" -->
<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">int oggz_write_set_hungry_callback </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="oggz_8h.html#a672d218df13da45a4b41d5366211bfee">OGGZ</a> *&nbsp;</td>
          <td class="paramname"> <em>oggz</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="group__write__api.html#ga27ef9f56078d3c015431b1a67b2c1812">OggzWriteHungry</a>&nbsp;</td>
          <td class="paramname"> <em>hungry</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&nbsp;</td>
          <td class="paramname"> <em>only_when_empty</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">void *&nbsp;</td>
          <td class="paramname"> <em>user_data</em></td><td>&nbsp;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td><td></td>
        </tr>
      </table>
</div>
<div class="memdoc">

<p>Set a callback for Oggz to call when <em>oggz</em> is <a class="el" href="group__hungry.html">hungry </a>. </p>
<dl><dt><b>Parameters:</b></dt><dd>
  <table border="0" cellspacing="2" cellpadding="0">
    <tr><td valign="top"></td><td valign="top"><em>oggz</em>&nbsp;</td><td>An OGGZ handle previously opened for writing </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>hungry</em>&nbsp;</td><td>Your callback function </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>only_when_empty</em>&nbsp;</td><td>When to call: a value of 0 indicates that Oggz should call <em>hungry()</em> after each and every packet is written; a value of 1 indicates that Oggz should call <em>hungry()</em> only when its packet queue is empty </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>user_data</em>&nbsp;</td><td>Arbitrary data you wish to pass to your callback </td></tr>
  </table>
  </dd>
</dl>
<dl><dt><b>Return values:</b></dt><dd>
  <table border="0" cellspacing="2" cellpadding="0">
    <tr><td valign="top"></td><td valign="top"><em>0</em>&nbsp;</td><td>Success </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>OGGZ_ERR_BAD_OGGZ</em>&nbsp;</td><td><em>oggz</em> does not refer to an existing OGGZ </td></tr>
    <tr><td valign="top"></td><td valign="top"><em>OGGZ_ERR_INVALID</em>&nbsp;</td><td>Operation not suitable for this OGGZ </td></tr>
  </table>
  </dd>
</dl>
<dl class="note"><dt><b>Note:</b></dt><dd>Passing a value of 0 for <em>only_when_empty</em> allows you to feed new packets into <em>oggz's</em> packet queue on the fly. </dd></dl>

</div>
</div>
</div>
<hr class="footer"/><address style="text-align: right;"><small>Generated on Sat Apr 24 09:13:55 2010 for liboggz by&nbsp;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.6.3 </small></address>
</body>
</html>