From jcabezas at inovax.com.br Wed May 16 15:52:15 2012 From: jcabezas at inovax.com.br (Julio Cesar Esteves Cabezas) Date: Wed, 16 May 2012 19:52:15 -0300 Subject: [ogg-dev] Problems seeking with liboggz Message-ID: <004701cd33b6$8d4bec40$a7e3c4c0$@inovax.com.br> 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 -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.xiph.org/pipermail/ogg-dev/attachments/20120516/f4f63f20/attachment.htm From jovanovic.milutin at gmail.com Thu May 17 07:04:29 2012 From: jovanovic.milutin at gmail.com (=?UTF-8?Q?Milutin_Jovanovi=C4=87?=) Date: Thu, 17 May 2012 10:04:29 -0400 Subject: [ogg-dev] Problems seeking with liboggz In-Reply-To: <004701cd33b6$8d4bec40$a7e3c4c0$@inovax.com.br> References: <004701cd33b6$8d4bec40$a7e3c4c0$@inovax.com.br> Message-ID: 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 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 > > -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.xiph.org/pipermail/ogg-dev/attachments/20120517/72f00dcc/attachment.htm From jcabezas at inovax.com.br Mon May 21 13:48:45 2012 From: jcabezas at inovax.com.br (Julio Cesar Esteves Cabezas) Date: Mon, 21 May 2012 17:48:45 -0300 Subject: [ogg-dev] Problems seeking with liboggz In-Reply-To: References: <004701cd33b6$8d4bec40$a7e3c4c0$@inovax.com.br> Message-ID: <001501cd3793$1d772480$58656d80$@inovax.com.br> 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 #include 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 -------------- next part -------------- An HTML attachment was scrubbed... URL: http://lists.xiph.org/pipermail/ogg-dev/attachments/20120521/72f84fe3/attachment-0001.htm From conrad at metadecks.org Mon May 21 16:10:36 2012 From: conrad at metadecks.org (Conrad Parker) Date: Tue, 22 May 2012 07:10:36 +0800 Subject: [ogg-dev] Problems seeking with liboggz In-Reply-To: <001501cd3793$1d772480$58656d80$@inovax.com.br> References: <004701cd33b6$8d4bec40$a7e3c4c0$@inovax.com.br> <001501cd3793$1d772480$58656d80$@inovax.com.br> Message-ID: Hi, can you send me a copy of the Ogg Speex file? Conrad. On 22 May 2012 04:48, Julio Cesar Esteves Cabezas 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 > > #include > > > > 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 > 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 > From jcabezas at inovax.com.br Mon May 21 16:30:37 2012 From: jcabezas at inovax.com.br (Julio Cesar Esteves Cabezas) Date: Mon, 21 May 2012 20:30:37 -0300 Subject: [ogg-dev] Problems seeking with liboggz Message-ID: <002d01cd37a9$ba450aa0$2ecf1fe0$@inovax.com.br> -----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 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 > > #include > > > > 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 > > 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 From jcabezas at inovax.com.br Wed May 23 13:53:56 2012 From: jcabezas at inovax.com.br (Julio Cesar Esteves Cabezas) Date: Wed, 23 May 2012 17:53:56 -0300 Subject: [ogg-dev] Problems seeking with liboggz Message-ID: <010b01cd3926$2bb38c20$831aa460$@inovax.com.br> 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 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 > > #include > > > > 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 > > 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