[CELT-dev] A (minor) bug and a request

Jean-Marc Valin jean-marc.valin at usherbrooke.ca
Thu May 21 19:55:50 PDT 2009


Hi John,

Thanks a lot. I just applied both patches.

Cheers,

	Jean-Marc

John Ridges a écrit :
> Hi JM,
> 
> I use #define SCALEIN(a) (a) and #define SCALEOUT(a) (a) so that I get
> the Speex floating point range. In my application I use Speex for the
> very lowest bitrates and switch to CELT for the higher bitrates, and it
> was easier to change CELT than everything else.
> 
> I'd be happy to submit the following patch (I'm using an MSVC
> environment, and don't have a proper diff, so forgive me that I'm not
> giving you line numbers):
> In celt.h add the following lines:
> 
> /** Reset the encoder/decoder memories to zero*/
> #define CELT_RESET_STATE        4
> 
> /** Query and set decoder parameters
> @param st Decoder state
> @param request Parameter to change or query
> @param value Pointer to a 32-bit int value
> @return Error code
> */
> EXPORT int celt_decoder_ctl(CELTDecoder * st, int request, ...);
> 
> In celt.c add the following code to the celt_encoder_ctl function:
> 
>      case CELT_RESET_STATE:
>      {
>         const CELTMode *mode = st->mode;
>         int C = mode->nbChannels;
> 
>         if (st->pitch_available > 0) st->pitch_available = 1;
> 
>         CELT_MEMSET(st->in_mem, 0, st->overlap*C);
>         CELT_MEMSET(st->out_mem, 0, (MAX_PERIOD+st->overlap)*C);
> 
>         CELT_MEMSET(st->oldBandE, 0, C*mode->nbEBands);
> 
>         CELT_MEMSET(st->preemph_memE, 0, C);
>         CELT_MEMSET(st->preemph_memD, 0, C);
>         st->delayedIntra = 1;
>      }
>      break;
> 
> and add the following code to the end of celt.c:
> 
> int celt_decoder_ctl(CELTDecoder * restrict st, int request, ...)
> {
>   va_list ap;
>   va_start(ap, request);
>   switch (request)
>   {
>      case CELT_RESET_STATE:
>      {
>         const CELTMode *mode = st->mode;
>         int C = mode->nbChannels;
> 
>         CELT_MEMSET(st->decode_mem, 0, (DECODE_BUFFER_SIZE+st->overlap)*C);
>                  CELT_MEMSET(st->oldBandE, 0, C*mode->nbEBands);
> 
>         CELT_MEMSET(st->preemph_memD, 0, C);
> 
>         st->last_pitch_index = 0;
>      }
>      break;
>      default:
>         goto bad_request;
>   }
>   va_end(ap);
>   return CELT_OK;
> #if 0    /* Put this back in if you ever need "bad_arg" */
> bad_arg:
>   va_end(ap);
>   return CELT_BAD_ARG;
> #endif
> bad_request:
>   va_end(ap);
>   return CELT_UNIMPLEMENTED;
> }
> 
> This code does a very naive reset of the state. It is possible (even
> likely) that I'm resetting more than is necessary, but I would have to
> know a lot more about how CELT works to determine that.
> 
> Regards,
> 
> John Ridges
> 
> 
> Jean-Marc Valin wrote:
>> Hi John,
>>
>> John Ridges a écrit :
>>  
>>> I believe that the first line in the function FLOAT2INT16 in celt.c
>>> which is now:
>>> x = x*32768.;
>>> should be:
>>> x = SCALEIN(x);
>>> This only makes a difference if you change the SCALEIN and SCALEOUT
>>> macros (which I do).
>>>     
>>
>> OK, will make sure it's the right thing (appears to be) and fix that.
>> Just curious, what value do you use and why?
>>
>>  
>>> The new feature I would like to request is the addition of a
>>> CELT_RESET_STATE control for both the encoder and decoder. I cache
>>> encoder and decoder instances and would like to be able to reset them
>>> to a newly minted state when I change streams.
>>>     
>>
>> Yes, this has been on the TODO list for a while (unfortunately not on
>> top). You (or anyone else) can speed that up by sending a patch.
>>
>> Cheers,
>>
>>     Jean-Marc
>>
>>
>>   
> 
> 
> 



More information about the celt-dev mailing list