[ogg-dev] Problems seeking with liboggz

Julio Cesar Esteves Cabezas jcabezas at inovax.com.br
Mon May 21 16:30:37 PDT 2012



-----Original Message-----
From: Julio Cesar Esteves Cabezas [mailto:jcabezas at inovax.com.br] 
Sent: segunda-feira, 21 de maio de 2012 20:29
To: 'Conrad Parker'
Subject: RE: [ogg-dev] Problems seeking with liboggz

Hi,
   Attached goes MyAudio.spx.
Julio.

-----Original Message-----
From: conrad.parker at gmail.com [mailto:conrad.parker at gmail.com] On Behalf Of Conrad Parker
Sent: segunda-feira, 21 de maio de 2012 20:11
To: jcabezas at inovax.com.br
Cc: ogg-dev at xiph.org
Subject: Re: [ogg-dev] Problems seeking with liboggz

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
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: MyAudio.spx
Type: audio/ogg
Size: 27393 bytes
Desc: not available
Url : http://lists.xiph.org/pipermail/ogg-dev/attachments/20120521/c36be989/attachment-0001.bin 


More information about the ogg-dev mailing list