[vorbis] Extracting sample count from a Vorbis packet
Aaron Colwell
acolwell at real.com
Wed Nov 5 19:51:06 PST 2003
Thanks for the detailed info. It looks like doing this will be a little
more involved then I originally thought, but it isn't too bad. I'll give
this a try.
I'll use vorbis-dev for further questions. From the description of the
list I figured my question wasn't appropriate there since I'm not
specifically working on the Xiph code.
Thanks,
Aaron
On Wed, 5 Nov 2003, Ralph Giles wrote:
> On Wed, Nov 05, 2003 at 12:31:30AM -0800, Aaron Colwell wrote:
>
> > I was wondering if there was a way to determine the number of samples in a
> > Vorbis packet without having to decode the whole thing? The reason I'm
> > asking this is because I'm thinking about implementing the current Vorbis
> > RTP draft for Helix.
>
> Oh yay!
>
> > The problem is that the Ogg pages only contain a
> > single timestamp. If I want to split up the Vorbis packets on different
> > boundries than the Ogg page boundries, I'll need to know the number of
> > samples associated with each packet so I can generate proper timestamps.
> > Can anyone help me with this?
>
> This isn't too bad. Each vorbis packet encodes either a short or long
> block of audio. The sizes of the two block types are stored in the info
> header (the first packet in the stream) as two 4-bit power-of-2
> exponents at byte offset 27. See section 4.2.1 and 4.2.2 of the spec
> for parsing details.
>
> You can then look at the header of each audio packet to determine which
> block type it is. See section 4.3.1 for details. Unfortunately, you also
> need the mode count from near the end of the the setup header (the third
> packet in the stream, sections 4.2.4.6 and 4.2.4) to get the bit offset
> of the blocktype field.
>
> While that gives you the length (in samples per channel) of each block
> type, that's not how far decoding advances with each packet because of
> the window overlaps (block lapping) with the next and previous packets.
> This is a little complicated to describe, so I'll just refer you to the
> picture at 1.3.2.3. Each packet advances you from the start of the
> overlap with the previous block to the start of the overlap with the
> next block. For convenience, the size of the next and previous blocks
> are also encoded in each audio packet header. (Again see section
> 4.3.1.) This means that in seeking you can 'work backwards' from the
> granulepos of the current page pretty easily without having to look at
> the previous page.
>
> Also note that the beginning and end of an ogg-encapsulated vorbis
> stream can be trimed by adjusting the sample numbers given in the page
> granulepos. You might want to take this into account as well. See
> appendix A.2 in the spec for some notes on this.
>
> Anyway, hope that's enough to get you started. The spec is available
> online as http://xiph.org/ogg/vorbis/doc/Vorbis_I_spec.html (or .pdf) if
> you don't have a local copy. And please feel free to ask if you have any
> further questions. We'd really like to see a vorbis rtp implementation.
>
> -r
>
> BTW, vorbis-dev might be more appropriate for technical questions of
> this sort.
> --- >8 ----
> List archives: http://www.xiph.org/archives/
> Ogg project homepage: http://www.xiph.org/ogg/
> To unsubscribe from this list, send a message to 'vorbis-request at xiph.org'
> containing only the word 'unsubscribe' in the body. No subject is needed.
> Unsubscribe messages sent to the list will be ignored/filtered.
>
--- >8 ----
List archives: http://www.xiph.org/archives/
Ogg project homepage: http://www.xiph.org/ogg/
To unsubscribe from this list, send a message to 'vorbis-request at xiph.org'
containing only the word 'unsubscribe' in the body. No subject is needed.
Unsubscribe messages sent to the list will be ignored/filtered.
More information about the Vorbis
mailing list