Fixes code that was doing arithmetic on a void pointer.

Thanks to Kevin O'Connor for reporting this.
This commit is contained in:
Jean-Marc Valin 2013-12-10 16:41:44 -05:00
parent 122971b8cc
commit 32ada84b5b
2 changed files with 5 additions and 8 deletions

View file

@ -649,7 +649,7 @@ static int transient_viterbi(const float *E, const float *E_1, int N, int frame_
return best_state; return best_state;
} }
int optimize_framesize(const opus_val16 *x, int len, int C, opus_int32 Fs, static int optimize_framesize(const void *x, int len, int C, opus_int32 Fs,
int bitrate, opus_val16 tonality, float *mem, int buffering, int bitrate, opus_val16 tonality, float *mem, int buffering,
downmix_func downmix) downmix_func downmix)
{ {
@ -661,6 +661,7 @@ int optimize_framesize(const opus_val16 *x, int len, int C, opus_int32 Fs,
int bestLM=0; int bestLM=0;
int subframe; int subframe;
int pos; int pos;
int offset;
VARDECL(opus_val32, sub); VARDECL(opus_val32, sub);
subframe = Fs/400; subframe = Fs/400;
@ -671,9 +672,8 @@ int optimize_framesize(const opus_val16 *x, int len, int C, opus_int32 Fs,
{ {
/* Consider the CELT delay when not in restricted-lowdelay */ /* Consider the CELT delay when not in restricted-lowdelay */
/* We assume the buffering is between 2.5 and 5 ms */ /* We assume the buffering is between 2.5 and 5 ms */
int offset = 2*subframe - buffering; offset = 2*subframe - buffering;
celt_assert(offset>=0 && offset <= subframe); celt_assert(offset>=0 && offset <= subframe);
x += C*offset;
len -= offset; len -= offset;
e[1]=mem[1]; e[1]=mem[1];
e_1[1]=1.f/(EPSILON+mem[1]); e_1[1]=1.f/(EPSILON+mem[1]);
@ -682,6 +682,7 @@ int optimize_framesize(const opus_val16 *x, int len, int C, opus_int32 Fs,
pos = 3; pos = 3;
} else { } else {
pos=1; pos=1;
offset=0;
} }
N=IMIN(len/subframe, MAX_DYNAMIC_FRAMESIZE); N=IMIN(len/subframe, MAX_DYNAMIC_FRAMESIZE);
/* Just silencing a warning, it's really initialized later */ /* Just silencing a warning, it's really initialized later */
@ -693,7 +694,7 @@ int optimize_framesize(const opus_val16 *x, int len, int C, opus_int32 Fs,
int j; int j;
tmp=EPSILON; tmp=EPSILON;
downmix(x, sub, subframe, i*subframe, 0, -2, C); downmix(x, sub, subframe, i*subframe+offset, 0, -2, C);
if (i==0) if (i==0)
memx = sub[0]; memx = sub[0];
for (j=0;j<subframe;j++) for (j=0;j<subframe;j++)

View file

@ -86,10 +86,6 @@ typedef void (*downmix_func)(const void *, opus_val32 *, int, int, int, int, int
void downmix_float(const void *_x, opus_val32 *sub, int subframe, int offset, int c1, int c2, int C); void downmix_float(const void *_x, opus_val32 *sub, int subframe, int offset, int c1, int c2, int C);
void downmix_int(const void *_x, opus_val32 *sub, int subframe, int offset, int c1, int c2, int C); void downmix_int(const void *_x, opus_val32 *sub, int subframe, int offset, int c1, int c2, int C);
int optimize_framesize(const opus_val16 *x, int len, int C, opus_int32 Fs,
int bitrate, opus_val16 tonality, float *mem, int buffering,
downmix_func downmix);
int encode_size(int size, unsigned char *data); int encode_size(int size, unsigned char *data);
opus_int32 frame_size_select(opus_int32 frame_size, int variable_duration, opus_int32 Fs); opus_int32 frame_size_select(opus_int32 frame_size, int variable_duration, opus_int32 Fs);