[Speex-dev] Decoded output buffer size

Randy Yates
Wed, 14 Apr 2010 17:09:21 -0000

Daniele Barzotti <daniele.barzotti at eurocomtel.com> writes:

> 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?

Apparently this information is carried by the ogg container format.
See the speexdec() function that's provided as a reference example.

  ogg_stream_pagein(&os, &og);
     .
     .
     .
  ogg_stream_packetout(&os, &op);
     .
     .
     .
  speex_bits_read_from(&bits, (char*)op.packet, op.bytes);

--
Randy Yates                      % "Maybe one day I'll feel her cold
embrace,
Digital Signal Labs              %                    and kiss her interface,
mailto://yates at ieee.org          %            til then, I'll leave her
alone."
http://www.digitalsignallabs.com %        'Yours Truly, 2095', *Time*,
ELO