<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body bgcolor="#ffffff" text="#000000">
<div class="moz-text-flowed"
 style="font-family: -moz-fixed; font-size: 12px;" lang="x-western">Hi
Alls
<br>
Sorry for my newbe question
<br>
I want to decode a speex multi frame stream
<br>
I got 38 bytes packets and make 800 bytes buffer
<br>
this is my simple code
<br>
<br>
CSpeexCodec::CSpeexCodec(void)
<br>
<br>
{
<br>
<br>
&nbsp; //
<br>
&nbsp; speex_bits_init(&amp;m_speexBitsOut);
<br>
<br>
&nbsp; m_pSpeexEncStateOut = speex_encoder_init(&amp;speex_nb_mode);
<br>
<br>
<br>
<br>
&nbsp; int nEhc=1;
<br>
<br>
&nbsp; int nSamplePerSec = SAMPLES_PER_SEC;
<br>
<br>
&nbsp; static int nQuality = 8;
<br>
<br>
&nbsp; speex_encoder_ctl(m_pSpeexEncStateOut, SPEEX_SET_SAMPLING_RATE,
&amp;nSamplePerSec);
<br>
<br>
&nbsp; speex_encoder_ctl(m_pSpeexEncStateOut, SPEEX_SET_QUALITY,
&amp;nQuality);
<br>
<br>
<br>
<br>
&nbsp; //speex_encoder_ctl(m_pSpeexEncStateOut, SPEEX_SET_VBR, &amp;nEhc);
<br>
<br>
&nbsp; //speex_encoder_ctl(m_pSpeexEncStateOut, SPEEX_SET_VAD, &amp;nEhc);
<br>
<br>
&nbsp; //speex_encoder_ctl(m_pSpeexEncStateOut, SPEEX_SET_DTX, &amp;nEhc);
<br>
<br>
<br>
<br>
&nbsp; speex_encoder_ctl(m_pSpeexEncStateOut, SPEEX_GET_FRAME_SIZE,
&amp;m_nEncodeFrameSize);
<br>
<br>
<br>
<br>
&nbsp; //
<br>
&nbsp; speex_bits_init(&amp;m_speexBitsIn);
<br>
<br>
&nbsp; m_pSpeexDecStateIn= speex_decoder_init(&amp;speex_nb_mode);&nbsp; <br>
<br>
&nbsp; speex_decoder_ctl(m_pSpeexDecStateIn, SPEEX_GET_FRAME_SIZE,
&amp;m_nDecodeFrameSize);
<br>
<br>
<br>
<br>
}
<br>
<br>
int&nbsp; CSpeexCodec::Decode(const char* pcIndata, int nIndataSize,
CShortCollection&amp; dataOut)
<br>
<br>
{
<br>
<br>
&nbsp; //
<br>
<br>
&nbsp; speex_bits_read_from( &amp;m_speexBitsIn, (char*)pcIndata,
nIndataSize);
<br>
<br>
&nbsp; static std::vector&lt;float&gt; floatDataOut;
<br>
<br>
&nbsp; int nFrame = 0;
<br>
<br>
&nbsp; size_t nbBytes = speex_bits_remaining(&amp;m_speexBitsIn);
<br>
<br>
&nbsp; while(nbBytes &gt; 0 )
<br>
<br>
&nbsp; {
<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( (nFrame+1) * m_nDecodeFrameSize &gt; (int)floatDataOut.size(
) )
<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( !floatDataOut.size( ) )
<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; floatDataOut.resize(m_nDecodeFrameSize );
<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; floatDataOut.resize(floatDataOut.size( ) * 2 );
<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( speex_decode(m_pSpeexDecStateIn, &amp;m_speexBitsIn,
&amp;floatDataOut[ nFrame++ * m_nDecodeFrameSize ] ) != 0 )
<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;
<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nbBytes = speex_bits_remaining(&amp;m_speexBitsIn);
<br>
<br>
&nbsp; }
<br>
<br>
&nbsp; // float -&gt; short
<br>
<br>
&nbsp; dataOut.resize( nFrame * m_nDecodeFrameSize );
<br>
<br>
&nbsp; const float* pfSrc = &amp;floatDataOut[0];
<br>
<br>
&nbsp; short* phDst = &amp;dataOut[0];
<br>
<br>
&nbsp; size_t nOutSize = dataOut.size( );
<br>
<br>
&nbsp; while(nOutSize-- ) { *phDst++ = (short)*pfSrc++; }
<br>
<br>
<br>
<br>
&nbsp; return 0;
<br>
<br>
<br>
<br>
}
<br>
<br>
So speex_decode return -2 after 2-3 interation in my while loop
<br>
What is wrong ?
<br>
Thank for help
<br>
<br>
<br>
<br>
<br>
</div>
</body>
</html>