[Speex-dev] using unsigned short instead of short for input frame

Steve Checkoway s at pahtak.org
Sat Mar 10 12:06:13 PST 2012

On Mar 9, 2012, at 8:36 AM, Mashal al-shboul wrote:

> i found casting from unsigned short to short gives different value: unsigned short FFFF=65535 where short FFFF= -1.


> however, can i configure speex codec (specifically speex_encode_int function) to take input of type unsigned short instead of short so that i avoid casting errors ?

I don't know about that, but it should be easy to convert your samples. You want to convert from the range [0, 2^16 - 1] to [-2^15, 2^15 - 1]. Thus, all you have to do is subtract 2^15 = 0x8000 from each of them:

steve$ cat a.c
#include <stdio.h>
#include <inttypes.h>

#define convert(x) (int16_t)((x) - 0x8000)

int main()
        uint16_t max = 0xffff;
        uint16_t mid = 0x8000;
        uint16_t min = 0x0000;

        printf("%hx -> %hd\n", max, convert(max));
        printf("%hx -> %hd\n", mid, convert(mid));
        printf("%hx -> %hd\n", min, convert(min));
        return 0;
steve$ gcc -Wall a.c
steve$ ./a.out
ffff -> 32767
8000 -> 0
0 -> -32768

As you can see, the maximum value 0xffff is indeed converted to 2^15 - 1, the mid point 0x8000 is converted to 0, and the minimum value 0 is converted to -2^15.

Stephen Checkoway

More information about the Speex-dev mailing list