[ogg-dev] Problems seeking with liboggz

Conrad Parker conrad at metadecks.org
Mon May 21 16:10:36 PDT 2012


Hi,

can you send me a copy of the Ogg Speex file?

Conrad.

On 22 May 2012 04:48, Julio Cesar Esteves Cabezas
<jcabezas at inovax.com.br> wrote:
> Hi,
>
>                 The Ogg-Speex test file I used is CBR.  I am sure of that by
> running oggz-dump on the file and confirming that all audio packets have 38
> bytes; that means (for narrowband) a constant 15 Kbps.
>
>                 I wrote a very basic test program in Visual Studio 2010 that
> demonstrates the strange behaviour I mentioned.
>
> The output shows that the audio file has 8 pages, 6 of them have audio
> packets;  the output show the page sequential number, time offset and byte
> offset of each page.
>
>
>
>                 Then after reading all of the file, for three times I
> request a time seek. It can be seen in the output that the result of the
> seek is never what was requested and is always the time offset of the end of
> some near page but never the page that contains the time point requested in
> seek.
>
>                 What could be going wrong ???
>
>
>
> Thanks in advance,
>
> Julio.
>
>
>
> PROGRAM:
>
> // TestaOgg.cpp : Defines the entry point for the console application.
>
> #include "stdafx.h"
>
> #include <exception>
>
> #include <oggz/oggz.h>
>
>
>
> int myReadPacketCallback (OGGZ* oggz, oggz_packet* packet, long serialno,
> void* user_data);
>
> int myReadPageCallback (OGGZ* oggz, const ogg_page* og, long serialno, void*
> user_data);
>
>
>
> int _tmain(int argc, _TCHAR* argv[])
>
> {
>
>   OGGZ* pOGGZ;
>
>   int ret;
>
>   oggz_off_t ofs;
>
>
>
>   pOGGZ = oggz_open("MyAudio.spx", OGGZ_READ | OGGZ_AUTO);
>
>   ret   = oggz_set_read_callback (pOGGZ, -1, myReadPacketCallback,
> (void*)0);
>
>   ret   = oggz_set_read_page     (pOGGZ, -1, myReadPageCallback, (void*)0);
>
>
>
>   ofs   = oggz_seek(pOGGZ, 0, SEEK_END);
>
>   printf("\n Audio file size in bytes = %8lld", ofs);
>
>   ofs   = oggz_seek(pOGGZ, 0, SEEK_SET);
>
>   ret   = oggz_read(pOGGZ, 28779);
>
>
>
>   for(int i=0; i<3; i++)
>
>   {
>
>     ogg_int64_t seektime  = (i==0 ? 5000  :  i==1 ? 10000  :  13000);
>
>     ogg_int64_t rseek     = oggz_seek_units(pOGGZ, seektime, SEEK_SET);
>
>     ogg_int64_t tellseek  = oggz_tell_units(pOGGZ);
>
>     printf("\n Requested seek time = %8lld,  return of time seek function =
> %8lld,  return of time tell function = %8lld", seektime, rseek, tellseek);
>
>   }
>
>
>
>   oggz_close(pOGGZ);
>
>   return 0;
>
> }
>
> //-----------------------------------------------------------------------------
>
> int myReadPageCallback (OGGZ* oggz, const ogg_page* og, long serialno, void*
> user_data)
>
> {
>
>   ogg_int64_t bitstSerialNumber = og->header[14] + 256 * (og->header[15] +
> 256 * (og->header[16] + 256 * og->header[17]));
>
>   ogg_int64_t pageSeqNumber     = og->header[18] + 256 * (og->header[19] +
> 256 * (og->header[20] + 256 * og->header[21]));
>
>   ogg_int64_t headerGranulePos  = og->header[6]  + 256 * (og->header[7]  +
> 256 * (og->header[8]  + 256 * (og->header[9] +
>
>                                   256 * (og->header[10]  + 256 *
> (og->header[11]  + 256 * (og->header[12] ))))));
>
>   ogg_int64_t currTimeOffset  = oggz_tell_units(oggz);
>
>   ogg_int64_t currByteOffset  = oggz_tell(oggz);
>
>
>
>   printf("\n Page seq.number = %8lld,  Time offset = %8lld,  Byte offset =
> %8lld,  Bitstream serial no. = %8lld,  GranulePos  = %8lld",
>
>           pageSeqNumber, currTimeOffset, currByteOffset, bitstSerialNumber,
> headerGranulePos);
>
>   return 0;
>
> }
>
> //-----------------------------------------------------------------------------
>
> int myReadPacketCallback (OGGZ* oggz, oggz_packet* packet, long serialno,
> void* user_data)
>
> {
>
>   //nothing useful done here
>
>   return 0;
>
> }
>
>
>
>
>
> OUTPUT:
>
> Audio file size in bytes =    27393
>
> Page seq.number =        0,  Time offset =        0,  Byte offset =
> 0,  Bitstream serial no. =    16850,  GranulePos  =        0
>
> Page seq.number =        1,  Time offset =        0,  Byte offset =
> 108,  Bitstream serial no. =    16850,  GranulePos  =        0
>
> Page seq.number =        2,  Time offset =     2155,  Byte offset =
> 177,  Bitstream serial no. =    16850,  GranulePos  =    17240
>
> Page seq.number =        3,  Time offset =     4315,  Byte offset =
> 4416,  Bitstream serial no. =    16850,  GranulePos  =    34520
>
> Page seq.number =        4,  Time offset =     6475,  Byte offset =
> 8655,  Bitstream serial no. =    16850,  GranulePos  =    51800
>
> Page seq.number =        5,  Time offset =     8635,  Byte offset =
> 12894,  Bitstream serial no. =    16850,  GranulePos  =    69080
>
> Page seq.number =        6,  Time offset =    10795,  Byte offset =
> 17133,  Bitstream serial no. =    16850,  GranulePos  =    86360
>
> Page seq.number =        7,  Time offset =    12955,  Byte offset =
> 21372,  Bitstream serial no. =    16850,  GranulePos  =   103640
>
> Page seq.number =        8,  Time offset =    13840,  Byte offset =
> 25611,  Bitstream serial no. =    16850,  GranulePos  =   110720
>
> Requested seek time =     5000,  return of time seek function =     2155,
> return of time tell function =     2155
>
> Requested seek time =    10000,  return of time seek function =     6475,
> return of time tell function =     6475
>
> Requested seek time =    13000,  return of time seek function =       -1,
> return of time tell function =    10795
>
>
>
>
>
>
>
> From: Milutin Jovanović [mailto:jovanovic.milutin at gmail.com]
> Sent: quinta-feira, 17 de maio de 2012 11:04
> To: jcabezas at inovax.com.br
> Cc: ogg-dev at xiph.org
> Subject: Re: [ogg-dev] Problems seeking with liboggz
>
>
>
>
> I'm no expert, but it sounds to me like normal variable bitrate stream
> behaviour. With variable bit rate, you cannot calculate exact byte address
> from time reference. So, in general you estimate and get close to time
> reference requested. Whenever you need precise pocision, you should use
> constant bit rate or a byte offset (instead of time/milliseconds).
>
> FYI, in my apps, I use time to show progres to the user, but when I save a
> bookmark or pause, I record exact sample offset, and restart from there. So,
> time for UI, samples/bytes for hidden/underlying code.
>
> Miki.
>
>
> On 16 May 2012 18:52, Julio Cesar Esteves Cabezas <jcabezas at inovax.com.br>
> wrote:
>
> Hi,
>
>
>
>   I intend to use Ogg+Speex for voice recording/playback in a VoIP app.
>
>   I am experimenting with liboggz to get acquainted with its API.
>
>   As test files I am using some Ogg-Speex files converted from WAV files
> with speexenc.exe.
>
>
>
>   I wrote a little testing app in Visual Studio 2010 under Windows 7.
>
>   I defined OggzReadPage and OggzReadPacket callbacks with
> oggz_set_read_page() and oggz_set_read_callback().
>
>
>
>   For the moment I am mainly having troubles with seeking. Maybe I am not
> using correctly liboggz API.
>
>   What happens:
>
>   - I open a Ogg Speex-encoded audio file with oggz_open("MyFile.spx",
> OGGZ_READ | OGGZ_AUTO);
>
>   - I have a loop of invocations of oggz_read() that triggers in the due
> time the page and packet callbacks defined by me.
>
>   - But when I randomly do seeking by means of
>
>       ogg_int64_t rseek = oggz_seek_units(pOGGZ, posMsecs, SEEK_SET);
>
>     I get erratic results:
>
>       Many times rseek does not match posMsecs.
>
>       The first page callback after the seek invocation refers to a page
> that is sometimes previous and sometimes after the page that contains
> posMsecs.
>
>
>
>
>
>   What rules are to be followed for seeking with liboggz and what exact
> results can be expected from it ?
>
>
>
>
>
> Thanks in advance
>
> Julio Cabezas
>
>
>
>
>
>
> _______________________________________________
> ogg-dev mailing list
> ogg-dev at xiph.org
> http://lists.xiph.org/mailman/listinfo/ogg-dev
>
>
>
>
> _______________________________________________
> ogg-dev mailing list
> ogg-dev at xiph.org
> http://lists.xiph.org/mailman/listinfo/ogg-dev
>


More information about the ogg-dev mailing list