<html>

<head>
<title>libogg - function - ogg_stream_destroy</title>
<link rel=stylesheet href="style.css" type="text/css">
</head>

<body bgcolor=white text=black link="#5555ff" alink="#5555ff" vlink="#5555ff">
<table border=0 width=100%>
<tr>
<td><p class=tiny>libogg documentation</p></td>
<td align=right><p class=tiny>libogg release 1.3.5 - 20210603</p></td>
</tr>
</table>

<h1>ogg_stream_destroy</h1>

<p><i>declared in "ogg/ogg.h";</i></p>

<p>This function frees the internal memory used by
the <a href="ogg_stream_state.html">ogg_stream_state</a> struct as
well as the structure itself.

<p>This should be called when you are done working with an ogg stream.
It can also be called to make sure that the struct does not exist.</p>

<p>It calls free() on its argument, so if the ogg_stream_state
is not malloc()'d or will otherwise be freed by your own code, use
<a href="ogg_stream_clear.html">ogg_stream_clear</a> instead.</p>

<br><br>
<table border=0 color=black cellspacing=0 cellpadding=7>
<tr bgcolor=#cccccc>
	<td>
<pre><b>
int ogg_stream_destroy(ogg_stream_state *os);
</b></pre>
	</td>
</tr>
</table>

<h3>Parameters</h3>
<dl>
<dt><i>os</i></dt>
<dd>Pointer to the ogg_stream_state struct to be destroyed.</dd>
</dl>


<h3>Return Values</h3>
<blockquote>
<li>
0 is always returned.</li>
</blockquote>
<p>

<br><br>
<hr noshade>
<table border=0 width=100%>
<tr valign=top>
<td><p class=tiny>copyright &copy; 2000-2021 Xiph.Org Foundation</p></td>
<td align=right><p class=tiny><a href="http://www.xiph.org/ogg/">Ogg Container Format</a></p></td>
</tr><tr>
<td><p class=tiny>libogg documentation</p></td>
<td align=right><p class=tiny>libogg release 1.3.5 - 20210603</p></td>
</tr>
</table>


</body>

</html>
