Commit eeca5682 authored by Jean-Marc Valin's avatar Jean-Marc Valin
Browse files

More stereo work

parent 3ce277ca
......@@ -53,11 +53,12 @@ OpusDecoder *opus_decoder_create(int Fs, int channels)
if( ret ) {
/* Handle error */
}
celtDecSizeBytes = celt_decoder_get_size(1);
celtDecSizeBytes = celt_decoder_get_size(channels);
raw_state = calloc(sizeof(OpusDecoder)+silkDecSizeBytes+celtDecSizeBytes, 1);
st = (OpusDecoder*)raw_state;
st->silk_dec = (void*)(raw_state+sizeof(OpusDecoder));
st->celt_dec = (CELTDecoder*)(raw_state+sizeof(OpusDecoder)+silkDecSizeBytes);
st->channels = channels;
st->Fs = Fs;
......@@ -81,7 +82,7 @@ int opus_decode(OpusDecoder *st, const unsigned char *data,
ec_byte_buffer buf;
SKP_SILK_SDK_DecControlStruct DecControl;
SKP_int32 silk_frame_size;
short pcm_celt[960];
short pcm_celt[960*2];
int audiosize;
if (data != NULL)
......@@ -147,7 +148,7 @@ int opus_decode(OpusDecoder *st, const unsigned char *data,
/* Handle error */
}
} else {
for (i=0;i<frame_size;i++)
for (i=0;i<frame_size*st->channels;i++)
pcm[i] = 0;
}
......@@ -182,7 +183,7 @@ int opus_decode(OpusDecoder *st, const unsigned char *data,
/* Encode high band with CELT */
celt_ret = celt_decode_with_ec(st->celt_dec, data, len, pcm_celt, frame_size, &dec);
for (i=0;i<frame_size;i++)
for (i=0;i<frame_size*st->channels;i++)
pcm[i] += pcm_celt[i];
}
return celt_ret;
......
......@@ -38,6 +38,7 @@
struct OpusDecoder {
CELTDecoder *celt_dec;
void *silk_dec;
int channels;
int mode;
int bandwidth;
......
......@@ -53,11 +53,12 @@ OpusEncoder *opus_encoder_create(int Fs, int channels)
if( ret ) {
/* Handle error */
}
celtEncSizeBytes = celt_encoder_get_size(1);
celtEncSizeBytes = celt_encoder_get_size(channels);
raw_state = calloc(sizeof(OpusEncoder)+silkEncSizeBytes+celtEncSizeBytes, 1);
st = (OpusEncoder*)raw_state;
st->silk_enc = (void*)(raw_state+sizeof(OpusEncoder));
st->celt_enc = (CELTEncoder*)(raw_state+sizeof(OpusEncoder)+silkEncSizeBytes);
st->channels = channels;
st->Fs = Fs;
......@@ -149,7 +150,7 @@ int opus_encode(OpusEncoder *st, const short *pcm, int frame_size,
if (st->mode != MODE_SILK_ONLY && st->bandwidth > BANDWIDTH_WIDEBAND)
{
int endband;
short pcm_buf[960];
short pcm_buf[960*2];
switch(st->bandwidth)
{
......@@ -168,10 +169,10 @@ int opus_encode(OpusEncoder *st, const short *pcm, int frame_size,
}
celt_encoder_ctl(st->celt_enc, CELT_SET_END_BAND(endband));
for (i=0;i<ENCODER_DELAY_COMPENSATION;i++)
for (i=0;i<ENCODER_DELAY_COMPENSATION*st->channels;i++)
pcm_buf[i] = st->delay_buffer[i];
for (;i<frame_size;i++)
pcm_buf[i] = pcm[i-ENCODER_DELAY_COMPENSATION];
for (;i<frame_size*st->channels;i++)
pcm_buf[i] = pcm[i-ENCODER_DELAY_COMPENSATION*st->channels];
celt_encoder_ctl(st->celt_enc, CELT_SET_PREDICTION(1));
......@@ -185,8 +186,8 @@ int opus_encode(OpusEncoder *st, const short *pcm, int frame_size,
}
/* Encode high band with CELT */
ret = celt_encode_with_ec(st->celt_enc, pcm_buf, frame_size, NULL, bytes_per_packet, &enc);
for (i=0;i<ENCODER_DELAY_COMPENSATION;i++)
st->delay_buffer[i] = pcm[frame_size-ENCODER_DELAY_COMPENSATION+i];
for (i=0;i<ENCODER_DELAY_COMPENSATION*st->channels;i++)
st->delay_buffer[i] = pcm[frame_size*st->channels-ENCODER_DELAY_COMPENSATION*st->channels+i];
} else {
ec_enc_done(&enc);
}
......
......@@ -42,6 +42,7 @@
struct OpusEncoder {
CELTEncoder *celt_enc;
void *silk_enc;
int channels;
int mode;
int bandwidth;
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment