[ogg-dev] Problems seeking with liboggz
Julio Cesar Esteves Cabezas
jcabezas at inovax.com.br
Wed May 23 13:53:56 PDT 2012
Hi,
Any insights about the cause of failure of time seek in liboggz, as shown in previous posts ?
Thanks,
Julio.
-----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/20120523/fc23937a/attachment-0001.bin
More information about the ogg-dev
mailing list