[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