[Speex-dev] Decoded output buffer size

Conrad Parker
Wed, 14 Apr 2010 23:30:55 -0000

On 14 April 2010 23:50, Daniele Barzotti
<daniele.barzotti at eurocomtel.com> wrote:
> Il 14/04/2010 14:37, Randy Yates wrote:
>>
>> Usually a buffer is one frame of data, and a frame is 20 milliseconds.
>> Since the sample rate is typically 8 kHz in narrowband mode, this
>> corresponds to a buffer size of 160 samples.
>
> Hi Randy, thanks for the reply.
> So, suppose I encode an audio buffer (8000 kHz, MONO, float) of 640 PCM
> frames.
> In output I have 4 speex frame of 20 byte each that I put in a RPT
> payload of 80 bytes:
>
> UINT CSpeexCodec::Encode( float *inBuff,
> ? ? ? ? ? ? ? ? ? ? ? ? ?const char**outBuff,
> ? ? ? ? ? ? ? ? ? ? ? ? ?UINT BufferFrames )
> {
> ?speex_encoder_ctl(spx_state_,
> ? ? ? ? ? ? ? ? ? ?SPEEX_GET_FRAME_SIZE,
> ? ? ? ? ? ? ? ? ? ?&spx_frame_size_);
>
> ?while (BufferFrames>0)
> ?{
> ? ?speex_bits_reset(&spx_bits_);
> ? ?speex_encode(spx_state_, inBuff, &spx_bits_);
> ? ?nbBytes += speex_bits_write(&spx_bits_,
> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?spx_enc_frame_,
> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?spx_frame_size_);
> ? ?inBuff+= spx_frame_size_;
> ? ?BufferFrames -= spx_frame_size_;
> ?}
>
> ?..nbBytes is 80 bytes..
> }
>
>
> Now I send this packet over the network and, into the receiving side, I
> need to recreate the original PCM buffer (640 frames).
> But how can I know the size of each speex frame into a multiframe payload?

use speex_bit_read_from() just once on the packet, then call
speex_decode() once for each frame.

Conrad.