<br><br><div class="gmail_quote">On Thu, Nov 13, 2008 at 8:53 AM, salsaman <span dir="ltr">&lt;<a href="mailto:salsaman@gmail.com">salsaman@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<br><br><div class="gmail_quote"><div class="Ih2E3d">On Thu, Nov 13, 2008 at 7:37 AM, Conrad Parker <span dir="ltr">&lt;<a href="mailto:conrad@metadecks.org" target="_blank">conrad@metadecks.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">

<div>2008/11/13 salsaman &lt;<a href="mailto:salsaman@gmail.com" target="_blank">salsaman@gmail.com</a>&gt;:<br>
&gt;<br>
</div><div>&gt; Actually I have now realised it`s not that complicated, as you say, just<br>
&gt; counting frames and not caring about keyframes at all is the way to go.<br>
&gt;<br>
&gt; My search runs in 2 passes:<br>
&gt;<br>
&gt; pass 1, find largest gpos &lt;= target - this gives us keyframe for target<br>
&gt; (note that a granulepos with k&lt;= target, f&gt;=target is also acceptable)<br>
&gt;<br>
&gt; pass 2, calculate gpos from kframe, search for largest gpos &lt; this<br>
&gt;<br>
&gt; then starting from that page:<br>
&gt; &nbsp;- ignore any packets on that page<br>
&gt; &nbsp;- count frames starting from the following page<br>
<br>
</div>To clarify what you mean by &quot;ignore&quot; and &quot;frames starting from the<br>
following page&quot;:<br>
</blockquote></div><div><br>Yes, sorry, I meant ignore any *complete* packets on that page.<br><br>&nbsp;</div><div class="Ih2E3d"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">

<br>
If you are always feeding these pages into ogg_stream_pagein(), and<br>
always running ogg_stream_packetout() on them, then this should be<br>
correct. In this case, &quot;ignoring any packets on that page&quot; means that<br>
you retrieve all of the completed packets from that page with<br>
ogg_stream_packetout(), but discard them. You then load the next page<br>
with ogg_stream_pagein(). &quot;Count frames starting from the following<br>
page&quot; means that you start counting from the next packet that is<br>
returned by ogg_stream_packetout().<br>
<div></div></blockquote></div><div><br>Right.<br><br>&nbsp;</div><div class="Ih2E3d"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div><br>

&gt; &nbsp;- when we reach a page which produces (target -1), we know that is where<br>
&gt; kframe starts, so store that page offset (this is useful for playing<br>
&gt; backwards...)<br>
<br>
</div>probably, but not guaranteed. </blockquote></div><div><br>My error here, I meant to say, &quot;when we reach a page which produces kframe -1&quot;. Then we know that kframe`s packet begins on this page (or possibly the following page, if it is not a continuation).<br>

<br><br>&nbsp;</div><div class="Ih2E3d"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">As you&#39;re pulling packets out of the<br>
stream anyway then you might as well just call<br>
theora_packet_iskeyframe() which is cheap and will definitely give you<br>
the correct info.<br>
<div></div></blockquote></div><div><br>Shouldn`t be needed, since we are counting frames and we know which frame is the target`s keyframe already. Could be useful as a double check though.<br><br>&nbsp;</div><div class="Ih2E3d">
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div><br>
&gt; - decode the next packet : this is our target frame<br>
&gt;<br>
&gt;<br>
&gt; Does that look correct ?<br>
<br>
</div>Yes, as long as you are pushing all those pages into ogg_stream_pagein().<br>
<font color="#888888"></font></blockquote></div><div><br>Right. ogg_stream_pagein() and ogg_stream_packetout().<br><br>Gabriel.<br><br></div></div>
</blockquote></div><br><br><br><br>I am finding something very strange in my test ogg files.<br><br>For example: I have a shift of 64, and I get a granulepos of 5130.<br>
<br>5130 == 80*64 + 10<br><br>which suggests that frame 80 is a keyframe.<br><br>However, if I start decoding from the beginning, the 81st frame is a keyframe.<br><br>This suggests that the first frame should be 0. But if I try to search for frame 0, it fails.<br>

<br>Everything is fine from frame 64 up, but the start is messed up.<br><br>I have found 2 partial workarounds for this:<br><br>a) add 1 to all frames - this works fine for continuous playback: 1, 2, 3, 4, etc.&nbsp;&nbsp; but frames &gt; 64 are 1 out when seeking<br>

<br>b) add 1 to all frames &lt; 64 - this works fine for seeking, but messes up continuous playback when frame 64 is reached<br><br>Any suggestions ?<br><br><br><br>Gabriel.<br><a href="http://lives.sourceforge.net/" target="_blank">http://lives.sourceforge.net</a><br>

<br><br><br>