[Speex-dev] Shoehorning speex is confusing a newbie

Jean-Marc Valin jean-marc.valin at usherbrooke.ca
Mon Jul 23 14:58:40 PDT 2007


Hi Michael,

> The main assumption was about the exc tables.  In looking through
> modes.c it appeared that only one table was required for 8kbs 

The assumption is correct.

> so I
> commented out the portions of the code that referenced the other tables
> and modified "static const SpeexNBMode nb_mode" structure so that the
> pointers to the other structures that referenced the tables were NULL. 
> We did not have enough data memory to store all the tables.  I thought
> this would work with my initialization but when I stepped through the
> code in nb_celp for encode it would put it in mode 6 (instead of mode
> 3), which I believe is 18.2kbs (table 8.2). My set up code is:
>  
>   st = speex_encoder_init(&speex_nb_mode);
>   speex_bits_set_bit_buffer(&bits, &G729_tx, COMPRESS_LENGTH);
>   tmp=TESTENC_QUALITY;  //=4
>   speex_encoder_ctl(st, SPEEX_SET_QUALITY, &tmp);
>   speex_encode_int(st, (spx_int16_t *)samples_in, &bits);

That appears correct -- assuming tmp is a 32-bit int (spx_int32_t) and
its value is really 4. In general, make sure that you use 32-bit
integers since it's a common cause of errors on the TI 5xxx. Also make
sure you're using 1.2beta2 (or current git/svn).

> which I thought would put it in 8kbs narrowband.  I tried to use
> SPEEX_SET_MODE in there too but it just got overwritten by the set mode
> in the encode function.  So I thought I'd try to force it into mode 3
> and see what happens, and I got A result, but when I try to decode it my
> decode stage gets stuck in an infinite loop:
> 
> while (st->voc_offset<st->subframeSize)
>             {
>                if (st->voc_offset>=0)
>                   exc[st->voc_offset]=sqrt(1.0*ol_pitch);
>                st->voc_offset+=ol_pitch;
>             }

Things should never go there at all. This code is only for mode 1.

> because both voc_offset and ol_pitch is = 0 because this code is never
> entered:
>  
> if (SUBMODE(lbr_pitch)!=-1)
>    {
>       ol_pitch = st->min_pitch+speex_bits_unpack_unsigned(bits, 7);
>    } 
>  
> This is how I set up the decoder:
>  
>   dec = speex_decoder_init(&speex_nb_mode);
>    speex_bits_set_bit_buffer(&bits, &Speex_enc_buffer[0 +
> COMPRESS_LENGTH*Speex_player_frame], COMPRESS_LENGTH);

doesn't this read all the bits that are *after* the ones you want?

>    tmp=0;
>    speex_decoder_ctl(dec, SPEEX_SET_ENH, &tmp);
>    speex_decode_int(dec, &bits, (spx_int16_t *)samples_out); 
>  
> There are some things I am sure will be asked.  Yes I set flags for the
> TI_54X part, disable wideband, manual allocation, 

You sure you don't allocate the same memory for the encoder and the
decoder or something like that?

> and fixed point in a
> config file and defined the #define value needed to include that config
> file.  I do have a heap for the setup of the state structure for encode
> and decode and yes I made sure it was big enough to allocate enough to
> both.  Yes I destroy the structures after I am done en/decoding them. 
> If there is anything you need to help you help me then I am defiantly
> willing to share.  I am thoroughly confused and could use some help.

Not clear what the problem is, but I suspect it's some kind of memory
management and/or 16-bit vs. 32-bit problem. Can you try and work
directly with testenc and sampleenc first to see if things work. That's
an easier way to start.

	Jean-Marc


More information about the Speex-dev mailing list