[Speex-dev] Is Speex 1.0 and >=1.1 compatible?
Jean-Marc Valin
jean-marc.valin at usherbrooke.ca
Sat Apr 10 12:51:55 PDT 2010
All version after 1.0 are compatible with each other and with 1.0.
Jean-Marc
On 2010-04-10 15:44, Tobias wrote:
> Hi list,
>
> I'm trying to figure out how to do the most compatible implementation that will
> work with as many versions of Speex as possible. I am streaming multi frame
> Speex blocks over a TCP connection which works fine as long as the version of
> Speex is the same on both sides. When using a newer Speex (1.1.?) to encode
> and an older version to decode (1.0.5), it does not work.
>
> The encoder code look like this:
>
> int AudioEncoderSpeex::writeSamples(const float *samples, int count)
> {
> for (int i=0; i<count; ++i)
> {
> sample_buf[buf_len++] = samples[i] * 32767.0;
>
> if (buf_len == frame_size)
> {
> speex_encode(enc_state, sample_buf,&bits);
> buf_len = 0;
>
> if (++frame_cnt == 4) // Four frames per packet
> {
> speex_bits_insert_terminator(&bits);
> int nbytes = speex_bits_nbytes(&bits);
> char output_buf[nbytes];
> nbytes = speex_bits_write(&bits, output_buf, nbytes);
> writeEncodedSamples(output_buf, nbytes);
> speex_bits_reset(&bits);
> frame_cnt = 0;
> }
> }
> }
>
> return count;
>
> } /* AudioEncoderSpeex::writeSamples */
>
>
>
> The decoder have looked like this for quite a while:
>
> void AudioDecoderSpeex::writeEncodedSamples(void *buf, int size)
> {
> char *ptr = (char *)buf;
>
> speex_bits_read_from(&bits, ptr, size);
> float samples[frame_size];
> #if SPEEX_MAJOR> 1 || (SPEEX_MAJOR == 1&& SPEEX_MINOR>= 1)
> while (speex_decode(dec_state,&bits, samples) == 0)
> #else
> while ((speex_decode(dec_state,&bits, samples) == 0)&&
> (speex_bits_remaining(&bits)> 0))
> #endif
> {
> for (int i=0; i<frame_size; ++i)
> {
> samples[i] = samples [i] / 32767.0;
> }
> sinkWriteSamples(samples, frame_size);
> }
> } /* AudioDecoderSpeex::writeEncodedSamples */
>
>
> This have worked well when using the same version of Speex on both sides. When
> using 1.1 on the encoder and 1.0 on the decoder, the number of frames decoded
> varies between three and four even though four frames are always sent. The use
> of speex_bits_remaining is one I have found by Googling. I started to wonder
> if it's wrong now though. If I change the comparison to read
> "speex_bits_remaining(&bits)>= 0" I always get four frames decoded. However,
> it still does not sound correctly. The change from ">" to">=" makes sense
> though. It should be OK for speex_decode to consume all bits so zero bits
> remaining should be OK (or?).
>
> The original question was if versions 1.0 and>= 1.1 is compatible. Can I make
> the code work in all cases or am I on a "mission impossible"?
>
> Regards,
> Tobias
> _______________________________________________
> Speex-dev mailing list
> Speex-dev at xiph.org
> http://lists.xiph.org/mailman/listinfo/speex-dev
>
>
More information about the Speex-dev
mailing list