Hi, I&#39;ve been debugging some seeking issues with my implementation of Ogg Vorbis and found something curious in how buffer handling seems to work.  Specifically what I found is that if I do seek with page granularity and end up on the first page, Ogg decides it needs to re-allocate a bunch of data buffers and references rather than get them from the pool.  Whether or not they are still available is a bit of a mystery to me (I find the Ogg code to be pretty confusing honestly).  This is a serious issue as I change Ogg Vorbis to use static rather than dynamic allocation and if we end up in a situation where someone tries to repeatedly seek to the beginning of the file, we&#39;ll have buffer overflows.  This should also be a concern for anyone running with dynamic allocation as well, as your heap will quickly disappear since Ogg doesn&#39;t seem to try very hard to reclaim memory.<br>
<br>Anyways, the culprit appears to be the following code inside ov_pcm_seek_page():<br><br>                result=ogg_stream_packetpeek(vf,vf-&gt;os,&amp;op);<br>                if(result==0)<br>                {<br>                    /* <br>
                     *  !!! the packet finishing this page originated on a<br>                     *  preceeding page. Keep fetching previous pages until we<br>                     *  get one with a granulepos or without the &#39;continued&#39; flag<br>
                     *  set.  Then just use raw_seek for simplicity.<br>                     */<br>      <br>                    _seek_helper(vf,best);<br>      <br>                    while(1)<br>                    {<br>
                        result=_get_prev_page(vf,&amp;og);<br>                        if(result&lt;0)<br>                        {<br>                            goto seek_error;<br>                        }<br>                        if(ogg_page_granulepos(&amp;og)&gt;-1 ||<br>
                           !ogg_page_continued(&amp;og))<br>                        {<br>                            return ov_raw_seek(vf,result);<br>                        }<br>                        vf-&gt;offset=result;<br>
                    }<br>                }<br><br>More specifically, it&#39;s the call to ov_raw_seek which then eventually calls _get_next_page() where a bunch of new buffers and references are created (if you watch oy-&gt;bufferpool-&gt;outstanding, it grows very quickly with this call).  I don&#39;t think I ever hit this control path if the seek doesn&#39;t land on the first page.  Anyways, my inelegant and ignorant solution is to just comment this part of the code out.  I ran some seeking tests and it doesn&#39;t appear to be necessary (100 random seeks to all sorts of locations and I&#39;m still bit-exact with the reference code), however I really don&#39;t understand the comment so I can&#39;t say if removing it will cause serious problems.<br>
<br>Anyone out there have some additional information on this?  Can I safely remove this code?  If I lose some seeking accuracy that&#39;s OK, if I&#39;m going to cause the algorithm to crash in a really subtle way that&#39;s definitely not OK.<br>
<br>Thanks!<br><br>Ethan<br>