Hi everybody,<br>here are the results of my GSOC project to rewrite/improve ogg seeking. I am presenting this as a set of 9 patches.<br><br><br>1) Non seek related changes<br><br>This patch correctly gets the first keyframe number for theora (0 or 1) depending on the encoder version used.<br>

It also adds support for a non-standard dirac format which I discovered during testing.<br><br><br>2) This patch refactors ogg.c into ogg.c and ogg.h in preparation for the following patch<br><br><br>3) Adds the new files modules/demux/oggseek.c and modules/demux/oggseek.h with generic search functions<br>

<br><br>4) Adds frame accurate theora seek capabilities to oggseek.c, but does not enable it (see patch 8)<br><br><br>5) Adds frame accurate dirac seek capabilities to oggseek.c but does not enable it (see patch 9) *<br>
<br>
<br>6) Since one local variable is now replicated in a struct, we can use the struct version and eliminate a local variable in ogg.c<br><br><br>7) Replace OGG_PAGE_SIZE with OGGSEEK_BYTES_TO_READ in ogg.c (combines two #defines into one)<br>

<br><br>8) Enable theora support in ogg.c (activates code from patch 4)<br><br><br>9) Enable dirac seek in ogg.c (activates code from patch 5) *<br><br><br><br>* Note: there is a problem with dirac seeking, because the ogg container granulepos which should give the frame number is broken in some (maybe all) dirac files. To avoid this the demuxer needs to receive a timecode from the decoder. Also after seeking the demuxer needs to send  the target frame to the decoder so that the decoder can avoid decoding frames up to the target (this is not the same as pre-rolling which is also done).<br>

<br>The problem is that there is no channel for demuxer to communicate a timecode directly to the decoder or vice-versa.<br><br>In order to try to solve this problem, I create a dummy block and set this as block->next, then use pts and dts values of the dummy block to communicate. However there appears to be a bug with this in vlc, because even though I override the free() function of the dummy block with a function that should do nothing, the override is ignored in block_FifoEmpty() which leads to a segfault as soon as a dirac file is loaded.<br>

<br>Therefore I recommend NOT applying patch 9 until this issue has been resolved, or else some other way is devised for demuxer and decoder to exchange timecodes.<br> <br><br clear="all"><br><br>A further recommendation I would like to make is that you extend the set of flags in stream_Control(). <br>

You already have:<br>STREAM_CAN_SEEK and STREAM_CAN_FASTSEEK. <br>However if you are intending libvlc to be used for video editing, then I would suggest adding the following flag:<br>STREAM_CAN_ACCURATE_SEEK - meaning that the stream can seek to the exact frame given with no visible loss of quality.<br>

In my tests I found that for example the ffmpeg demuxer can only seek to an estimated position and frequently retruns partially decoded frames.<br><br><br><br>Since there is not much time left for the GSOC project, and I will be travelling from 10th august onwards, I would appreciate any requests to change anything in the patches ASAP.<br>

<br><br><br><br>Best regards,<br>Salsaman.<br><br><br><br><a href="http://lives.sourceforge.net">http://lives.sourceforge.net</a><br><a href="https://www.ohloh.net/accounts/salsaman">https://www.ohloh.net/accounts/salsaman</a><br>

<br>