[Speex-dev] Audio glitches/Configuration problem !!?

oscar lima oscar.youx at gmail.com
Wed Nov 14 05:06:37 PST 2007


Hi all,

First of all, thanks to Speex developper for the all the job.

I am trying to implement my own Speex DirectShow fitlers for VoIP following
the documentation and sample code's.
I am facing audio glitches when encoding - decoding PCM data. The encoder
and decoder procedures are copied below.
What about the lookahead size ? how shouw we apply it in encoding stage ?

thanks in advance

bool SpeexEncoder::EncodeData(char * inBuffer, int inSize, char * outBuffer,
int outMAXSize, int* outSize)
{
    if(!m_Initialized) return false;

    // Copy data into the local buffer
    memcpy(m_pBuffer + m_BufferSize, inBuffer, inSize);
    m_BufferSize += inSize;

    // check if we have enougth data for the encoder,
    if(m_BufferSize < m_FrameSizeInBytes )
        return false;

    // start processing
    short* input = (short*)m_pBuffer;
    char*  output = outBuffer;
    *outSize = 0;
    int tmpBufferSize = m_BufferSize;

    while(tmpBufferSize >= m_FrameSizeInBytes + m_SpeexLookAheadInBytes)
    {
        speex_bits_reset(&m_SpeexBits);

        if(m_Channels == 2)
            speex_encode_stereo_int(input, m_FrameSizeInSamples,
&m_SpeexBits);

        if (m_SpeexPreprocessState != NULL)
            speex_preprocess(m_SpeexPreprocessState, input, NULL);

        speex_encode_int(m_SpeexState, input, &m_SpeexBits);
        int bytes = speex_bits_write(&m_SpeexBits, output, outMAXSize);

        input += m_FrameSizeInBytes;
        output += bytes;
        *outSize += bytes;

        tmpBufferSize -= m_FrameSizeInBytes;
    }

    // if we consumed data from the buffer, it needs to be rearanged in
order to keep only
    ....

    return true;
}


bool SpeexDecoder::DecodeData( char * inBuffer, int inSize, char **
outBuffer, int outMAXSize, int* outSize)
{
    if(!m_Initialized)
        return false;

    int remains = inSize;

    char  * input  = inBuffer;
    short * output = (short*) *outBuffer;
    int size = 0;

    while(remains > 0)
    {
        speex_bits_read_from(&m_SpeexBits, input, remains);

        int locRet = speex_decode_int(m_SpeexState, &m_SpeexBits, output);
        if (locRet == -1 || locRet == -2)
           return false;

        if ((remains = (speex_bits_remaining(&m_SpeexBits))/8) < 0)
            //Corrupted
            return false;

        if (m_Channels == 2)
            speex_decode_stereo_int((short *)output, m_FrameSizeInSamples,
&m_StereoState);

        size += m_FrameSizeInBytes;
        output += m_FrameSizeInBytes;
        input = inBuffer + inSize - remains;
    }

    *outSize = size;
    return true;
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.xiph.org/pipermail/speex-dev/attachments/20071114/19e18e94/attachment.htm


More information about the Speex-dev mailing list