[Vorbis] Using decoding vorebis from a Vorbis / Theora Video
Ralph Giles
giles at xiph.org
Mon Feb 19 15:40:05 PST 2007
On Mon, Feb 19, 2007 at 11:05:59PM +0000, Charles Mason wrote:
> Thanks for the info Ralph. I have managed to implement what I think is
> the correct Vorbis decoding routine. I am now getting the pointer back
> from pcm out.
yay!
> I was wondering if someone could clarify what format and size the PCM
> data is in. It appears to be a pointer to a 2 dimensional float array.
> I assume one dimension is the channel number and the is the time
> offset of the sample.
Yes, it's non-interleaved float data, in the range [-1,1], at least
according to the comments in decoder_example.c.
The first index is the channel number, and the second index is the
sample number. vorbis_synthesis_pcmout() returns the number of samples
available per channel in the returned data.
I don't know how multidimensional arrays work in C#, but in C the
returned (float **)pcm is an array of vi.channels elements, each of
which is a pointer to a float array of samples. If the array indexing is
the same you should be able to convert to interleaved signed short
without explicit pointer arithmetic like so:
/* NB: untested pseudocode */
int samples = vorbis_synthesis_pcmout(vd,pcm);
int16_t buffer[vi.channels*samples]
for (int sample = 0; sample < samples; sample++) {
for (int channel = 0; channel < channels; channel++) {
buffer[sample*channels + channel] = pcm[channel][sample]*32767.0;
}
}
Note that you also have to call vorbis_synthesis_read() when you're done
to tell it how much data you've consumed out of the pcm buffer.
> How long is the data. I get the sample number returned from the pcmout
> function. Is that per channel. So if its stereo and I get 576 returned
> I need to read in 576 * 2 floats.
That's right.
Hope that helps,
-r
More information about the Vorbis
mailing list