From eeca56821167303c2a050a548ca43029c4a402df Mon Sep 17 00:00:00 2001 From: Jean-Marc Valin <jean-marc.valin@octasic.com> Date: Mon, 31 Jan 2011 11:53:28 -0500 Subject: [PATCH] More stereo work --- src/opus_decoder.c | 9 +++++---- src/opus_decoder.h | 1 + src/opus_encoder.c | 15 ++++++++------- src/opus_encoder.h | 1 + 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/opus_decoder.c b/src/opus_decoder.c index 52d044af7..242fed0e1 100644 --- a/src/opus_decoder.c +++ b/src/opus_decoder.c @@ -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; diff --git a/src/opus_decoder.h b/src/opus_decoder.h index c7a3be6b6..f4f012a33 100644 --- a/src/opus_decoder.h +++ b/src/opus_decoder.h @@ -38,6 +38,7 @@ struct OpusDecoder { CELTDecoder *celt_dec; void *silk_dec; + int channels; int mode; int bandwidth; diff --git a/src/opus_encoder.c b/src/opus_encoder.c index 54a5c3dd0..fa507d0ee 100644 --- a/src/opus_encoder.c +++ b/src/opus_encoder.c @@ -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); } diff --git a/src/opus_encoder.h b/src/opus_encoder.h index 37d43700b..1f061dbe7 100644 --- a/src/opus_encoder.h +++ b/src/opus_encoder.h @@ -42,6 +42,7 @@ struct OpusEncoder { CELTEncoder *celt_enc; void *silk_enc; + int channels; int mode; int bandwidth; -- GitLab