Re: More frames in one packet

Steve Checkoway <[email protected]>
Newsgroups gmane.comp.audio.compression.speex.devel
Message-ID <[email protected]>
On Tue, Jul 26, 2011 at 11:39:34PM +0200, Peter Soxberger wrote:
> 1) The documentation has a mistake: The bit terminator is NOT set
> automatically! (I'm using the latest speex version!) It has to be
> set manually using speex_bits_insert_terminator(&bits);

The documentation is old and incomplete. However, the implementation
of speex_bits_write() inserts the terminator, but does not update the
pointers or the number of bits:

/* Insert terminator, but save the data so we can put it back after */
bitPtr=bits->bitPtr;
charPtr=bits->charPtr;
nbBits=bits->nbBits;
speex_bits_insert_terminator(bits);
bits->bitPtr=bitPtr;
bits->charPtr=charPtr;
bits->nbBits=nbBits;

> 2) speex_decoder_int() has to be called as long, as it returns -1.
> After that, all frames should be decoded. This should be added to
> the docu!

There was code that was posted to the list that computed the number of
in a SpeexBits. It was never included into the main code for some
reason, but it's easy enough to modify it to work outside. Or you can
just call speex_decoder_int() _until_ it returns -1, not as long as it
returns -1.

> Bugreport: I tried using speex_bits_remaining() instead of checking
> the return value of speex_decoder_int() but this leads to an endless
> loop! Or can't this function be used in this case?

Were there fewer than 5 bits left? It looks like the terminator should
be 01111 and it should be removed by the two calls
speex_bits_unpack_unsigned(bits, 1) 
speex_bits_unpack_unsigned(bits, 4)
in speex_decode_int().

However, if there are fewer than 5 bits remaining, it will just return
-1.

-- 
Steve Checkoway
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.