Changing the encoder API to add the frame size
This commit is contained in:
parent
fbd82eb8f4
commit
017fa85775
8 changed files with 110 additions and 72 deletions
|
@ -448,15 +448,17 @@ int folding_decision(const CELTMode *m, celt_norm *X, celt_word16 *average, int
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Quantisation of the residual */
|
/* Quantisation of the residual */
|
||||||
void quant_bands(const CELTMode *m, int start, celt_norm * restrict X, const celt_ener *bandE, int *pulses, int shortBlocks, int fold, int resynth, int total_bits, int encode, void *enc_dec, int M)
|
void quant_bands(const CELTMode *m, int start, celt_norm * restrict X, const celt_ener *bandE, int *pulses, int shortBlocks, int fold, int resynth, int total_bits, int encode, void *enc_dec, int LM)
|
||||||
{
|
{
|
||||||
int i, j, remaining_bits, balance;
|
int i, j, remaining_bits, balance;
|
||||||
const celt_int16 * restrict eBands = m->eBands;
|
const celt_int16 * restrict eBands = m->eBands;
|
||||||
celt_norm * restrict norm;
|
celt_norm * restrict norm;
|
||||||
VARDECL(celt_norm, _norm);
|
VARDECL(celt_norm, _norm);
|
||||||
int B;
|
int B;
|
||||||
|
int M;
|
||||||
SAVE_STACK;
|
SAVE_STACK;
|
||||||
|
|
||||||
|
M = 1<<LM;
|
||||||
B = shortBlocks ? M : 1;
|
B = shortBlocks ? M : 1;
|
||||||
ALLOC(_norm, M*eBands[m->nbEBands+1], celt_norm);
|
ALLOC(_norm, M*eBands[m->nbEBands+1], celt_norm);
|
||||||
norm = _norm;
|
norm = _norm;
|
||||||
|
@ -472,7 +474,7 @@ void quant_bands(const CELTMode *m, int start, celt_norm * restrict X, const cel
|
||||||
int curr_balance, curr_bits;
|
int curr_balance, curr_bits;
|
||||||
|
|
||||||
N = M*eBands[i+1]-M*eBands[i];
|
N = M*eBands[i+1]-M*eBands[i];
|
||||||
BPbits = m->bits[FULL_FRAME(m)];
|
BPbits = m->bits[LM];
|
||||||
|
|
||||||
if (encode)
|
if (encode)
|
||||||
tell = ec_enc_tell(enc_dec, BITRES);
|
tell = ec_enc_tell(enc_dec, BITRES);
|
||||||
|
@ -522,7 +524,7 @@ void quant_bands(const CELTMode *m, int start, celt_norm * restrict X, const cel
|
||||||
|
|
||||||
#ifndef DISABLE_STEREO
|
#ifndef DISABLE_STEREO
|
||||||
|
|
||||||
void quant_bands_stereo(const CELTMode *m, int start, celt_norm *_X, const celt_ener *bandE, int *pulses, int shortBlocks, int fold, int resynth, int total_bits, ec_enc *enc, int M)
|
void quant_bands_stereo(const CELTMode *m, int start, celt_norm *_X, const celt_ener *bandE, int *pulses, int shortBlocks, int fold, int resynth, int total_bits, ec_enc *enc, int LM)
|
||||||
{
|
{
|
||||||
int i, j, remaining_bits, balance;
|
int i, j, remaining_bits, balance;
|
||||||
const celt_int16 * restrict eBands = m->eBands;
|
const celt_int16 * restrict eBands = m->eBands;
|
||||||
|
@ -530,8 +532,10 @@ void quant_bands_stereo(const CELTMode *m, int start, celt_norm *_X, const celt_
|
||||||
VARDECL(celt_norm, _norm);
|
VARDECL(celt_norm, _norm);
|
||||||
int B;
|
int B;
|
||||||
celt_word16 mid, side;
|
celt_word16 mid, side;
|
||||||
|
int M;
|
||||||
SAVE_STACK;
|
SAVE_STACK;
|
||||||
|
|
||||||
|
M = 1<<LM;
|
||||||
B = shortBlocks ? M : 1;
|
B = shortBlocks ? M : 1;
|
||||||
ALLOC(_norm, M*eBands[m->nbEBands+1], celt_norm);
|
ALLOC(_norm, M*eBands[m->nbEBands+1], celt_norm);
|
||||||
norm = _norm;
|
norm = _norm;
|
||||||
|
@ -552,7 +556,7 @@ void quant_bands_stereo(const CELTMode *m, int start, celt_norm *_X, const celt_
|
||||||
|
|
||||||
X = _X+M*eBands[i];
|
X = _X+M*eBands[i];
|
||||||
Y = X+M*eBands[m->nbEBands+1];
|
Y = X+M*eBands[m->nbEBands+1];
|
||||||
BPbits = m->bits[FULL_FRAME(m)];
|
BPbits = m->bits[LM];
|
||||||
|
|
||||||
N = M*eBands[i+1]-M*eBands[i];
|
N = M*eBands[i+1]-M*eBands[i];
|
||||||
tell = ec_enc_tell(enc, BITRES);
|
tell = ec_enc_tell(enc, BITRES);
|
||||||
|
@ -758,7 +762,7 @@ void quant_bands_stereo(const CELTMode *m, int start, celt_norm *_X, const celt_
|
||||||
|
|
||||||
#ifndef DISABLE_STEREO
|
#ifndef DISABLE_STEREO
|
||||||
|
|
||||||
void unquant_bands_stereo(const CELTMode *m, int start, celt_norm *_X, const celt_ener *bandE, int *pulses, int shortBlocks, int fold, int total_bits, ec_dec *dec, int M)
|
void unquant_bands_stereo(const CELTMode *m, int start, celt_norm *_X, const celt_ener *bandE, int *pulses, int shortBlocks, int fold, int total_bits, ec_dec *dec, int LM)
|
||||||
{
|
{
|
||||||
int i, j, remaining_bits, balance;
|
int i, j, remaining_bits, balance;
|
||||||
const celt_int16 * restrict eBands = m->eBands;
|
const celt_int16 * restrict eBands = m->eBands;
|
||||||
|
@ -766,8 +770,10 @@ void unquant_bands_stereo(const CELTMode *m, int start, celt_norm *_X, const cel
|
||||||
VARDECL(celt_norm, _norm);
|
VARDECL(celt_norm, _norm);
|
||||||
int B;
|
int B;
|
||||||
celt_word16 mid, side;
|
celt_word16 mid, side;
|
||||||
|
int M;
|
||||||
SAVE_STACK;
|
SAVE_STACK;
|
||||||
|
|
||||||
|
M = 1<<LM;
|
||||||
B = shortBlocks ? M : 1;
|
B = shortBlocks ? M : 1;
|
||||||
ALLOC(_norm, M*eBands[m->nbEBands+1], celt_norm);
|
ALLOC(_norm, M*eBands[m->nbEBands+1], celt_norm);
|
||||||
norm = _norm;
|
norm = _norm;
|
||||||
|
@ -789,7 +795,7 @@ void unquant_bands_stereo(const CELTMode *m, int start, celt_norm *_X, const cel
|
||||||
|
|
||||||
X = _X+M*eBands[i];
|
X = _X+M*eBands[i];
|
||||||
Y = X+M*eBands[m->nbEBands+1];
|
Y = X+M*eBands[m->nbEBands+1];
|
||||||
BPbits = m->bits[FULL_FRAME(m)];
|
BPbits = m->bits[LM];
|
||||||
|
|
||||||
N = M*eBands[i+1]-M*eBands[i];
|
N = M*eBands[i+1]-M*eBands[i];
|
||||||
tell = ec_dec_tell(dec, BITRES);
|
tell = ec_dec_tell(dec, BITRES);
|
||||||
|
|
126
libcelt/celt.c
126
libcelt/celt.c
|
@ -323,16 +323,16 @@ static int transient_analysis(const celt_word32 * restrict in, int len, int C,
|
||||||
|
|
||||||
/** Apply window and compute the MDCT for all sub-frames and
|
/** Apply window and compute the MDCT for all sub-frames and
|
||||||
all channels in a frame */
|
all channels in a frame */
|
||||||
static void compute_mdcts(const CELTMode *mode, int shortBlocks, celt_sig * restrict in, celt_sig * restrict out, int _C)
|
static void compute_mdcts(const CELTMode *mode, int shortBlocks, celt_sig * restrict in, celt_sig * restrict out, int _C, int LM)
|
||||||
{
|
{
|
||||||
const int C = CHANNELS(_C);
|
const int C = CHANNELS(_C);
|
||||||
if (C==1 && !shortBlocks)
|
if (C==1 && !shortBlocks)
|
||||||
{
|
{
|
||||||
const mdct_lookup *lookup = &mode->mdct[FULL_FRAME(mode)];
|
const mdct_lookup *lookup = &mode->mdct[LM];
|
||||||
const int overlap = OVERLAP(mode);
|
const int overlap = OVERLAP(mode);
|
||||||
clt_mdct_forward(lookup, in, out, mode->window, overlap);
|
clt_mdct_forward(lookup, in, out, mode->window, overlap);
|
||||||
} else {
|
} else {
|
||||||
const mdct_lookup *lookup = &mode->mdct[FULL_FRAME(mode)];
|
const mdct_lookup *lookup = &mode->mdct[LM];
|
||||||
const int overlap = OVERLAP(mode);
|
const int overlap = OVERLAP(mode);
|
||||||
int N = FRAMESIZE(mode);
|
int N = FRAMESIZE(mode);
|
||||||
int B = 1;
|
int B = 1;
|
||||||
|
@ -367,7 +367,7 @@ static void compute_mdcts(const CELTMode *mode, int shortBlocks, celt_sig * rest
|
||||||
|
|
||||||
/** Compute the IMDCT and apply window for all sub-frames and
|
/** Compute the IMDCT and apply window for all sub-frames and
|
||||||
all channels in a frame */
|
all channels in a frame */
|
||||||
static void compute_inv_mdcts(const CELTMode *mode, int shortBlocks, celt_sig *X, int transient_time, int transient_shift, celt_sig * restrict out_mem, int _C)
|
static void compute_inv_mdcts(const CELTMode *mode, int shortBlocks, celt_sig *X, int transient_time, int transient_shift, celt_sig * restrict out_mem, int _C, int LM)
|
||||||
{
|
{
|
||||||
int c, N4;
|
int c, N4;
|
||||||
const int C = CHANNELS(_C);
|
const int C = CHANNELS(_C);
|
||||||
|
@ -378,7 +378,7 @@ static void compute_inv_mdcts(const CELTMode *mode, int shortBlocks, celt_sig *X
|
||||||
{
|
{
|
||||||
int j;
|
int j;
|
||||||
if (transient_shift==0 && C==1 && !shortBlocks) {
|
if (transient_shift==0 && C==1 && !shortBlocks) {
|
||||||
const mdct_lookup *lookup = &mode->mdct[FULL_FRAME(mode)];
|
const mdct_lookup *lookup = &mode->mdct[LM];
|
||||||
clt_mdct_backward(lookup, X, out_mem+C*(MAX_PERIOD-N-N4), mode->window, overlap);
|
clt_mdct_backward(lookup, X, out_mem+C*(MAX_PERIOD-N-N4), mode->window, overlap);
|
||||||
} else {
|
} else {
|
||||||
VARDECL(celt_word32, x);
|
VARDECL(celt_word32, x);
|
||||||
|
@ -387,7 +387,7 @@ static void compute_inv_mdcts(const CELTMode *mode, int shortBlocks, celt_sig *X
|
||||||
int N2 = N;
|
int N2 = N;
|
||||||
int B = 1;
|
int B = 1;
|
||||||
int n4offset=0;
|
int n4offset=0;
|
||||||
const mdct_lookup *lookup = &mode->mdct[FULL_FRAME(mode)];
|
const mdct_lookup *lookup = &mode->mdct[LM];
|
||||||
SAVE_STACK;
|
SAVE_STACK;
|
||||||
|
|
||||||
ALLOC(x, 2*N, celt_word32);
|
ALLOC(x, 2*N, celt_word32);
|
||||||
|
@ -544,10 +544,10 @@ static void mdct_shape(const CELTMode *mode, celt_norm *X, int start,
|
||||||
|
|
||||||
|
|
||||||
#ifdef FIXED_POINT
|
#ifdef FIXED_POINT
|
||||||
int celt_encode(CELTEncoder * restrict st, const celt_int16 * pcm, celt_int16 * optional_synthesis, unsigned char *compressed, int nbCompressedBytes)
|
int celt_encode(CELTEncoder * restrict st, const celt_int16 * pcm, celt_int16 * optional_synthesis, int frame_size, unsigned char *compressed, int nbCompressedBytes)
|
||||||
{
|
{
|
||||||
#else
|
#else
|
||||||
int celt_encode_float(CELTEncoder * restrict st, const celt_sig * pcm, celt_sig * optional_synthesis, unsigned char *compressed, int nbCompressedBytes)
|
int celt_encode_float(CELTEncoder * restrict st, const celt_sig * pcm, celt_sig * optional_synthesis, int frame_size, unsigned char *compressed, int nbCompressedBytes)
|
||||||
{
|
{
|
||||||
#endif
|
#endif
|
||||||
int i, c, N, NN, N4;
|
int i, c, N, NN, N4;
|
||||||
|
@ -581,7 +581,7 @@ int celt_encode_float(CELTEncoder * restrict st, const celt_sig * pcm, celt_sig
|
||||||
int gain_id=0;
|
int gain_id=0;
|
||||||
int norm_rate;
|
int norm_rate;
|
||||||
int start=0;
|
int start=0;
|
||||||
const int M=st->mode->nbShortMdcts;
|
int LM, M;
|
||||||
SAVE_STACK;
|
SAVE_STACK;
|
||||||
|
|
||||||
if (check_encoder(st) != CELT_OK)
|
if (check_encoder(st) != CELT_OK)
|
||||||
|
@ -593,6 +593,12 @@ int celt_encode_float(CELTEncoder * restrict st, const celt_sig * pcm, celt_sig
|
||||||
if (nbCompressedBytes<0 || pcm==NULL)
|
if (nbCompressedBytes<0 || pcm==NULL)
|
||||||
return CELT_BAD_ARG;
|
return CELT_BAD_ARG;
|
||||||
|
|
||||||
|
for (LM=0;LM<4;LM++)
|
||||||
|
if (st->mode->shortMdctSize<<LM==frame_size)
|
||||||
|
break;
|
||||||
|
if (LM>=MAX_CONFIG_SIZES)
|
||||||
|
return CELT_BAD_ARG;
|
||||||
|
M=1<<LM;
|
||||||
/* The memset is important for now in case the encoder doesn't
|
/* The memset is important for now in case the encoder doesn't
|
||||||
fill up all the bytes */
|
fill up all the bytes */
|
||||||
CELT_MEMSET(compressed, 0, nbCompressedBytes);
|
CELT_MEMSET(compressed, 0, nbCompressedBytes);
|
||||||
|
@ -665,7 +671,7 @@ int celt_encode_float(CELTEncoder * restrict st, const celt_sig * pcm, celt_sig
|
||||||
ALLOC(bandE,st->mode->nbEBands*C, celt_ener);
|
ALLOC(bandE,st->mode->nbEBands*C, celt_ener);
|
||||||
ALLOC(bandLogE,st->mode->nbEBands*C, celt_word16);
|
ALLOC(bandLogE,st->mode->nbEBands*C, celt_word16);
|
||||||
/* Compute MDCTs */
|
/* Compute MDCTs */
|
||||||
compute_mdcts(st->mode, shortBlocks, in, freq, C);
|
compute_mdcts(st->mode, shortBlocks, in, freq, C, LM);
|
||||||
|
|
||||||
|
|
||||||
norm_rate = (nbCompressedBytes-5)*8*(celt_uint32)st->mode->Fs/(C*N)>>10;
|
norm_rate = (nbCompressedBytes-5)*8*(celt_uint32)st->mode->Fs/(C*N)>>10;
|
||||||
|
@ -692,7 +698,7 @@ int celt_encode_float(CELTEncoder * restrict st, const celt_sig * pcm, celt_sig
|
||||||
ALLOC(pitch_freq, C*N, celt_sig); /**< Interleaved signal MDCTs */
|
ALLOC(pitch_freq, C*N, celt_sig); /**< Interleaved signal MDCTs */
|
||||||
if (has_pitch)
|
if (has_pitch)
|
||||||
{
|
{
|
||||||
compute_mdcts(st->mode, 0, st->out_mem+pitch_index*C, pitch_freq, C);
|
compute_mdcts(st->mode, 0, st->out_mem+pitch_index*C, pitch_freq, C, LM);
|
||||||
has_pitch = compute_pitch_gain(st->mode, freq, pitch_freq, norm_rate, &gain_id, C, &st->gain_prod);
|
has_pitch = compute_pitch_gain(st->mode, freq, pitch_freq, norm_rate, &gain_id, C, &st->gain_prod);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -873,10 +879,10 @@ int celt_encode_float(CELTEncoder * restrict st, const celt_sig * pcm, celt_sig
|
||||||
|
|
||||||
/* Residual quantisation */
|
/* Residual quantisation */
|
||||||
if (C==1)
|
if (C==1)
|
||||||
quant_bands(st->mode, start, X, bandE, pulses, shortBlocks, has_fold, resynth, nbCompressedBytes*8, 1, &enc, M);
|
quant_bands(st->mode, start, X, bandE, pulses, shortBlocks, has_fold, resynth, nbCompressedBytes*8, 1, &enc, LM);
|
||||||
#ifndef DISABLE_STEREO
|
#ifndef DISABLE_STEREO
|
||||||
else
|
else
|
||||||
quant_bands_stereo(st->mode, start, X, bandE, pulses, shortBlocks, has_fold, resynth, nbCompressedBytes*8, &enc, M);
|
quant_bands_stereo(st->mode, start, X, bandE, pulses, shortBlocks, has_fold, resynth, nbCompressedBytes*8, &enc, LM);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
quant_energy_finalise(st->mode, start, bandE, st->oldBandE, error, fine_quant, fine_priority, nbCompressedBytes*8-ec_enc_tell(&enc, 0), &enc, C);
|
quant_energy_finalise(st->mode, start, bandE, st->oldBandE, error, fine_quant, fine_priority, nbCompressedBytes*8-ec_enc_tell(&enc, 0), &enc, C);
|
||||||
|
@ -900,7 +906,7 @@ int celt_encode_float(CELTEncoder * restrict st, const celt_sig * pcm, celt_sig
|
||||||
if (has_pitch)
|
if (has_pitch)
|
||||||
apply_pitch(st->mode, freq, pitch_freq, gain_id, 0, C);
|
apply_pitch(st->mode, freq, pitch_freq, gain_id, 0, C);
|
||||||
|
|
||||||
compute_inv_mdcts(st->mode, shortBlocks, freq, transient_time, transient_shift, st->out_mem, C);
|
compute_inv_mdcts(st->mode, shortBlocks, freq, transient_time, transient_shift, st->out_mem, C, LM);
|
||||||
|
|
||||||
/* De-emphasis and put everything back at the right place
|
/* De-emphasis and put everything back at the right place
|
||||||
in the synthesis history */
|
in the synthesis history */
|
||||||
|
@ -918,9 +924,9 @@ int celt_encode_float(CELTEncoder * restrict st, const celt_sig * pcm, celt_sig
|
||||||
|
|
||||||
#ifdef FIXED_POINT
|
#ifdef FIXED_POINT
|
||||||
#ifndef DISABLE_FLOAT_API
|
#ifndef DISABLE_FLOAT_API
|
||||||
int celt_encode_float(CELTEncoder * restrict st, const float * pcm, float * optional_synthesis, unsigned char *compressed, int nbCompressedBytes)
|
int celt_encode_float(CELTEncoder * restrict st, const float * pcm, float * optional_synthesis, int frame_size, unsigned char *compressed, int nbCompressedBytes)
|
||||||
{
|
{
|
||||||
int j, ret, C, N;
|
int j, ret, C, N, LM, M;
|
||||||
VARDECL(celt_int16, in);
|
VARDECL(celt_int16, in);
|
||||||
SAVE_STACK;
|
SAVE_STACK;
|
||||||
|
|
||||||
|
@ -933,19 +939,26 @@ int celt_encode_float(CELTEncoder * restrict st, const float * pcm, float * opti
|
||||||
if (pcm==NULL)
|
if (pcm==NULL)
|
||||||
return CELT_BAD_ARG;
|
return CELT_BAD_ARG;
|
||||||
|
|
||||||
|
for (LM=0;LM<4;LM++)
|
||||||
|
if (st->mode->shortMdctSize<<LM==frame_size)
|
||||||
|
break;
|
||||||
|
if (LM>=MAX_CONFIG_SIZES)
|
||||||
|
return CELT_BAD_ARG;
|
||||||
|
M=1<<LM;
|
||||||
|
|
||||||
C = CHANNELS(st->channels);
|
C = CHANNELS(st->channels);
|
||||||
N = st->mode->nbShortMdcts*st->mode->shortMdctSize;
|
N = M*st->mode->shortMdctSize;
|
||||||
ALLOC(in, C*N, celt_int16);
|
ALLOC(in, C*N, celt_int16);
|
||||||
|
|
||||||
for (j=0;j<C*N;j++)
|
for (j=0;j<C*N;j++)
|
||||||
in[j] = FLOAT2INT16(pcm[j]);
|
in[j] = FLOAT2INT16(pcm[j]);
|
||||||
|
|
||||||
if (optional_synthesis != NULL) {
|
if (optional_synthesis != NULL) {
|
||||||
ret=celt_encode(st,in,in,compressed,nbCompressedBytes);
|
ret=celt_encode(st,in,in,frame_size,compressed,nbCompressedBytes);
|
||||||
for (j=0;j<C*N;j++)
|
for (j=0;j<C*N;j++)
|
||||||
optional_synthesis[j]=in[j]*(1/32768.);
|
optional_synthesis[j]=in[j]*(1/32768.);
|
||||||
} else {
|
} else {
|
||||||
ret=celt_encode(st,in,NULL,compressed,nbCompressedBytes);
|
ret=celt_encode(st,in,NULL,frame_size,compressed,nbCompressedBytes);
|
||||||
}
|
}
|
||||||
RESTORE_STACK;
|
RESTORE_STACK;
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -953,11 +966,10 @@ int celt_encode_float(CELTEncoder * restrict st, const float * pcm, float * opti
|
||||||
}
|
}
|
||||||
#endif /*DISABLE_FLOAT_API*/
|
#endif /*DISABLE_FLOAT_API*/
|
||||||
#else
|
#else
|
||||||
int celt_encode(CELTEncoder * restrict st, const celt_int16 * pcm, celt_int16 * optional_synthesis, unsigned char *compressed, int nbCompressedBytes)
|
int celt_encode(CELTEncoder * restrict st, const celt_int16 * pcm, celt_int16 * optional_synthesis, int frame_size, unsigned char *compressed, int nbCompressedBytes)
|
||||||
{
|
{
|
||||||
int j, ret, C, N;
|
int j, ret, C, N, LM, M;
|
||||||
VARDECL(celt_sig, in);
|
VARDECL(celt_sig, in);
|
||||||
const int M=st->mode->nbShortMdcts;
|
|
||||||
SAVE_STACK;
|
SAVE_STACK;
|
||||||
|
|
||||||
if (check_encoder(st) != CELT_OK)
|
if (check_encoder(st) != CELT_OK)
|
||||||
|
@ -969,6 +981,13 @@ int celt_encode(CELTEncoder * restrict st, const celt_int16 * pcm, celt_int16 *
|
||||||
if (pcm==NULL)
|
if (pcm==NULL)
|
||||||
return CELT_BAD_ARG;
|
return CELT_BAD_ARG;
|
||||||
|
|
||||||
|
for (LM=0;LM<4;LM++)
|
||||||
|
if (st->mode->shortMdctSize<<LM==frame_size)
|
||||||
|
break;
|
||||||
|
if (LM>=MAX_CONFIG_SIZES)
|
||||||
|
return CELT_BAD_ARG;
|
||||||
|
M=1<<LM;
|
||||||
|
|
||||||
C=CHANNELS(st->channels);
|
C=CHANNELS(st->channels);
|
||||||
N=M*st->mode->shortMdctSize;
|
N=M*st->mode->shortMdctSize;
|
||||||
ALLOC(in, C*N, celt_sig);
|
ALLOC(in, C*N, celt_sig);
|
||||||
|
@ -977,11 +996,11 @@ int celt_encode(CELTEncoder * restrict st, const celt_int16 * pcm, celt_int16 *
|
||||||
}
|
}
|
||||||
|
|
||||||
if (optional_synthesis != NULL) {
|
if (optional_synthesis != NULL) {
|
||||||
ret = celt_encode_float(st,in,in,compressed,nbCompressedBytes);
|
ret = celt_encode_float(st,in,in,frame_size,compressed,nbCompressedBytes);
|
||||||
for (j=0;j<C*N;j++)
|
for (j=0;j<C*N;j++)
|
||||||
optional_synthesis[j] = FLOAT2INT16(in[j]);
|
optional_synthesis[j] = FLOAT2INT16(in[j]);
|
||||||
} else {
|
} else {
|
||||||
ret = celt_encode_float(st,in,NULL,compressed,nbCompressedBytes);
|
ret = celt_encode_float(st,in,NULL,frame_size,compressed,nbCompressedBytes);
|
||||||
}
|
}
|
||||||
RESTORE_STACK;
|
RESTORE_STACK;
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -1269,7 +1288,7 @@ void celt_decoder_destroy(CELTDecoder *st)
|
||||||
celt_free(st);
|
celt_free(st);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void celt_decode_lost(CELTDecoder * restrict st, celt_word16 * restrict pcm, int N)
|
static void celt_decode_lost(CELTDecoder * restrict st, celt_word16 * restrict pcm, int N, int LM)
|
||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
int pitch_index;
|
int pitch_index;
|
||||||
|
@ -1308,13 +1327,13 @@ static void celt_decode_lost(CELTDecoder * restrict st, celt_word16 * restrict p
|
||||||
ALLOC(freq,C*N, celt_sig); /**< Interleaved signal MDCTs */
|
ALLOC(freq,C*N, celt_sig); /**< Interleaved signal MDCTs */
|
||||||
while (offset+len >= MAX_PERIOD)
|
while (offset+len >= MAX_PERIOD)
|
||||||
offset -= pitch_index;
|
offset -= pitch_index;
|
||||||
compute_mdcts(st->mode, 0, st->out_mem+offset*C, freq, C);
|
compute_mdcts(st->mode, 0, st->out_mem+offset*C, freq, C, LM);
|
||||||
for (i=0;i<C*N;i++)
|
for (i=0;i<C*N;i++)
|
||||||
freq[i] = ADD32(VERY_SMALL, MULT16_32_Q15(fade,freq[i]));
|
freq[i] = ADD32(VERY_SMALL, MULT16_32_Q15(fade,freq[i]));
|
||||||
|
|
||||||
CELT_MOVE(st->out_mem, st->out_mem+C*N, C*(MAX_PERIOD+st->mode->overlap-N));
|
CELT_MOVE(st->out_mem, st->out_mem+C*N, C*(MAX_PERIOD+st->mode->overlap-N));
|
||||||
/* Compute inverse MDCTs */
|
/* Compute inverse MDCTs */
|
||||||
compute_inv_mdcts(st->mode, 0, freq, -1, 0, st->out_mem, C);
|
compute_inv_mdcts(st->mode, 0, freq, -1, 0, st->out_mem, C, LM);
|
||||||
#else
|
#else
|
||||||
for (c=0;c<C;c++)
|
for (c=0;c<C;c++)
|
||||||
{
|
{
|
||||||
|
@ -1428,10 +1447,10 @@ static void celt_decode_lost(CELTDecoder * restrict st, celt_word16 * restrict p
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef FIXED_POINT
|
#ifdef FIXED_POINT
|
||||||
int celt_decode(CELTDecoder * restrict st, const unsigned char *data, int len, celt_int16 * restrict pcm)
|
int celt_decode(CELTDecoder * restrict st, const unsigned char *data, int len, celt_int16 * restrict pcm, int frame_size)
|
||||||
{
|
{
|
||||||
#else
|
#else
|
||||||
int celt_decode_float(CELTDecoder * restrict st, const unsigned char *data, int len, celt_sig * restrict pcm)
|
int celt_decode_float(CELTDecoder * restrict st, const unsigned char *data, int len, celt_sig * restrict pcm, int frame_size)
|
||||||
{
|
{
|
||||||
#endif
|
#endif
|
||||||
int i, N, N4;
|
int i, N, N4;
|
||||||
|
@ -1459,7 +1478,7 @@ int celt_decode_float(CELTDecoder * restrict st, const unsigned char *data, int
|
||||||
int mdct_weight_pos=0;
|
int mdct_weight_pos=0;
|
||||||
int gain_id=0;
|
int gain_id=0;
|
||||||
int start=0;
|
int start=0;
|
||||||
const int M=st->mode->nbShortMdcts;
|
int LM, M;
|
||||||
SAVE_STACK;
|
SAVE_STACK;
|
||||||
|
|
||||||
if (check_decoder(st) != CELT_OK)
|
if (check_decoder(st) != CELT_OK)
|
||||||
|
@ -1471,6 +1490,13 @@ int celt_decode_float(CELTDecoder * restrict st, const unsigned char *data, int
|
||||||
if (pcm==NULL)
|
if (pcm==NULL)
|
||||||
return CELT_BAD_ARG;
|
return CELT_BAD_ARG;
|
||||||
|
|
||||||
|
for (LM=0;LM<4;LM++)
|
||||||
|
if (st->mode->shortMdctSize<<LM==frame_size)
|
||||||
|
break;
|
||||||
|
if (LM>=MAX_CONFIG_SIZES)
|
||||||
|
return CELT_BAD_ARG;
|
||||||
|
M=1<<LM;
|
||||||
|
|
||||||
N = M*st->mode->shortMdctSize;
|
N = M*st->mode->shortMdctSize;
|
||||||
N4 = (N-st->overlap)>>1;
|
N4 = (N-st->overlap)>>1;
|
||||||
|
|
||||||
|
@ -1480,7 +1506,7 @@ int celt_decode_float(CELTDecoder * restrict st, const unsigned char *data, int
|
||||||
|
|
||||||
if (data == NULL)
|
if (data == NULL)
|
||||||
{
|
{
|
||||||
celt_decode_lost(st, pcm, N);
|
celt_decode_lost(st, pcm, N, LM);
|
||||||
RESTORE_STACK;
|
RESTORE_STACK;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1546,15 +1572,15 @@ int celt_decode_float(CELTDecoder * restrict st, const unsigned char *data, int
|
||||||
if (has_pitch)
|
if (has_pitch)
|
||||||
{
|
{
|
||||||
/* Pitch MDCT */
|
/* Pitch MDCT */
|
||||||
compute_mdcts(st->mode, 0, st->out_mem+pitch_index*C, pitch_freq, C);
|
compute_mdcts(st->mode, 0, st->out_mem+pitch_index*C, pitch_freq, C, LM);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Decode fixed codebook and merge with pitch */
|
/* Decode fixed codebook and merge with pitch */
|
||||||
if (C==1)
|
if (C==1)
|
||||||
quant_bands(st->mode, start, X, bandE, pulses, isTransient, has_fold, 1, len*8, 0, &dec, M);
|
quant_bands(st->mode, start, X, bandE, pulses, isTransient, has_fold, 1, len*8, 0, &dec, LM);
|
||||||
#ifndef DISABLE_STEREO
|
#ifndef DISABLE_STEREO
|
||||||
else
|
else
|
||||||
unquant_bands_stereo(st->mode, start, X, bandE, pulses, isTransient, has_fold, len*8, &dec, M);
|
unquant_bands_stereo(st->mode, start, X, bandE, pulses, isTransient, has_fold, len*8, &dec, LM);
|
||||||
#endif
|
#endif
|
||||||
unquant_energy_finalise(st->mode, start, bandE, st->oldBandE, fine_quant, fine_priority, len*8-ec_dec_tell(&dec, 0), &dec, C);
|
unquant_energy_finalise(st->mode, start, bandE, st->oldBandE, fine_quant, fine_priority, len*8-ec_dec_tell(&dec, 0), &dec, C);
|
||||||
|
|
||||||
|
@ -1576,7 +1602,7 @@ int celt_decode_float(CELTDecoder * restrict st, const unsigned char *data, int
|
||||||
freq[i] = 0;
|
freq[i] = 0;
|
||||||
|
|
||||||
/* Compute inverse MDCTs */
|
/* Compute inverse MDCTs */
|
||||||
compute_inv_mdcts(st->mode, shortBlocks, freq, transient_time, transient_shift, st->out_mem, C);
|
compute_inv_mdcts(st->mode, shortBlocks, freq, transient_time, transient_shift, st->out_mem, C, LM);
|
||||||
|
|
||||||
deemphasis(st->out_mem, pcm, N, C, preemph, st->preemph_memD);
|
deemphasis(st->out_mem, pcm, N, C, preemph, st->preemph_memD);
|
||||||
st->loss_count = 0;
|
st->loss_count = 0;
|
||||||
|
@ -1586,9 +1612,9 @@ int celt_decode_float(CELTDecoder * restrict st, const unsigned char *data, int
|
||||||
|
|
||||||
#ifdef FIXED_POINT
|
#ifdef FIXED_POINT
|
||||||
#ifndef DISABLE_FLOAT_API
|
#ifndef DISABLE_FLOAT_API
|
||||||
int celt_decode_float(CELTDecoder * restrict st, const unsigned char *data, int len, float * restrict pcm)
|
int celt_decode_float(CELTDecoder * restrict st, const unsigned char *data, int len, float * restrict pcm, int frame_size)
|
||||||
{
|
{
|
||||||
int j, ret, C, N;
|
int j, ret, C, N, LM, M;
|
||||||
VARDECL(celt_int16, out);
|
VARDECL(celt_int16, out);
|
||||||
SAVE_STACK;
|
SAVE_STACK;
|
||||||
|
|
||||||
|
@ -1601,11 +1627,18 @@ int celt_decode_float(CELTDecoder * restrict st, const unsigned char *data, int
|
||||||
if (pcm==NULL)
|
if (pcm==NULL)
|
||||||
return CELT_BAD_ARG;
|
return CELT_BAD_ARG;
|
||||||
|
|
||||||
|
for (LM=0;LM<4;LM++)
|
||||||
|
if (st->mode->shortMdctSize<<LM==frame_size)
|
||||||
|
break;
|
||||||
|
if (LM>=MAX_CONFIG_SIZES)
|
||||||
|
return CELT_BAD_ARG;
|
||||||
|
M=1<<LM;
|
||||||
|
|
||||||
C = CHANNELS(st->channels);
|
C = CHANNELS(st->channels);
|
||||||
N = st->mode->nbShortMdcts*st->mode->shortMdctSize;
|
N = M*st->mode->shortMdctSize;
|
||||||
|
|
||||||
ALLOC(out, C*N, celt_int16);
|
ALLOC(out, C*N, celt_int16);
|
||||||
ret=celt_decode(st, data, len, out);
|
ret=celt_decode(st, data, len, out, frame_size);
|
||||||
for (j=0;j<C*N;j++)
|
for (j=0;j<C*N;j++)
|
||||||
pcm[j]=out[j]*(1/32768.);
|
pcm[j]=out[j]*(1/32768.);
|
||||||
|
|
||||||
|
@ -1614,9 +1647,9 @@ int celt_decode_float(CELTDecoder * restrict st, const unsigned char *data, int
|
||||||
}
|
}
|
||||||
#endif /*DISABLE_FLOAT_API*/
|
#endif /*DISABLE_FLOAT_API*/
|
||||||
#else
|
#else
|
||||||
int celt_decode(CELTDecoder * restrict st, const unsigned char *data, int len, celt_int16 * restrict pcm)
|
int celt_decode(CELTDecoder * restrict st, const unsigned char *data, int len, celt_int16 * restrict pcm, int frame_size)
|
||||||
{
|
{
|
||||||
int j, ret, C, N;
|
int j, ret, C, N, LM, M;
|
||||||
VARDECL(celt_sig, out);
|
VARDECL(celt_sig, out);
|
||||||
SAVE_STACK;
|
SAVE_STACK;
|
||||||
|
|
||||||
|
@ -1629,11 +1662,18 @@ int celt_decode(CELTDecoder * restrict st, const unsigned char *data, int len, c
|
||||||
if (pcm==NULL)
|
if (pcm==NULL)
|
||||||
return CELT_BAD_ARG;
|
return CELT_BAD_ARG;
|
||||||
|
|
||||||
|
for (LM=0;LM<4;LM++)
|
||||||
|
if (st->mode->shortMdctSize<<LM==frame_size)
|
||||||
|
break;
|
||||||
|
if (LM>=MAX_CONFIG_SIZES)
|
||||||
|
return CELT_BAD_ARG;
|
||||||
|
M=1<<LM;
|
||||||
|
|
||||||
C = CHANNELS(st->channels);
|
C = CHANNELS(st->channels);
|
||||||
N = st->mode->nbShortMdcts*st->mode->shortMdctSize;
|
N = M*st->mode->shortMdctSize;
|
||||||
ALLOC(out, C*N, celt_sig);
|
ALLOC(out, C*N, celt_sig);
|
||||||
|
|
||||||
ret=celt_decode_float(st, data, len, out);
|
ret=celt_decode_float(st, data, len, out, frame_size);
|
||||||
|
|
||||||
for (j=0;j<C*N;j++)
|
for (j=0;j<C*N;j++)
|
||||||
pcm[j] = FLOAT2INT16 (out[j]);
|
pcm[j] = FLOAT2INT16 (out[j]);
|
||||||
|
|
|
@ -191,7 +191,7 @@ EXPORT void celt_encoder_destroy(CELTEncoder *st);
|
||||||
* the length returned be somehow transmitted to the decoder. Otherwise, no
|
* the length returned be somehow transmitted to the decoder. Otherwise, no
|
||||||
* decoding is possible.
|
* decoding is possible.
|
||||||
*/
|
*/
|
||||||
EXPORT int celt_encode_float(CELTEncoder *st, const float *pcm, float *optional_synthesis, unsigned char *compressed, int nbCompressedBytes);
|
EXPORT int celt_encode_float(CELTEncoder *st, const float *pcm, float *optional_synthesis, int frame_size, unsigned char *compressed, int nbCompressedBytes);
|
||||||
|
|
||||||
/** Encodes a frame of audio.
|
/** Encodes a frame of audio.
|
||||||
@param st Encoder state
|
@param st Encoder state
|
||||||
|
@ -211,7 +211,7 @@ EXPORT int celt_encode_float(CELTEncoder *st, const float *pcm, float *optional_
|
||||||
* the length returned be somehow transmitted to the decoder. Otherwise, no
|
* the length returned be somehow transmitted to the decoder. Otherwise, no
|
||||||
* decoding is possible.
|
* decoding is possible.
|
||||||
*/
|
*/
|
||||||
EXPORT int celt_encode(CELTEncoder *st, const celt_int16 *pcm, celt_int16 *optional_synthesis, unsigned char *compressed, int nbCompressedBytes);
|
EXPORT int celt_encode(CELTEncoder *st, const celt_int16 *pcm, celt_int16 *optional_synthesis, int frame_size, unsigned char *compressed, int nbCompressedBytes);
|
||||||
|
|
||||||
/** Query and set encoder parameters
|
/** Query and set encoder parameters
|
||||||
@param st Encoder state
|
@param st Encoder state
|
||||||
|
@ -248,7 +248,7 @@ EXPORT void celt_decoder_destroy(CELTDecoder *st);
|
||||||
returned here in float format.
|
returned here in float format.
|
||||||
@return Error code.
|
@return Error code.
|
||||||
*/
|
*/
|
||||||
EXPORT int celt_decode_float(CELTDecoder *st, const unsigned char *data, int len, float *pcm);
|
EXPORT int celt_decode_float(CELTDecoder *st, const unsigned char *data, int len, float *pcm, int frame_size);
|
||||||
|
|
||||||
/** Decodes a frame of audio.
|
/** Decodes a frame of audio.
|
||||||
@param st Decoder state
|
@param st Decoder state
|
||||||
|
@ -259,7 +259,7 @@ EXPORT int celt_decode_float(CELTDecoder *st, const unsigned char *data, int len
|
||||||
returned here in 16-bit PCM format (native endian).
|
returned here in 16-bit PCM format (native endian).
|
||||||
@return Error code.
|
@return Error code.
|
||||||
*/
|
*/
|
||||||
EXPORT int celt_decode(CELTDecoder *st, const unsigned char *data, int len, celt_int16 *pcm);
|
EXPORT int celt_decode(CELTDecoder *st, const unsigned char *data, int len, celt_int16 *pcm, int frame_size);
|
||||||
|
|
||||||
/** Query and set decoder parameters
|
/** Query and set decoder parameters
|
||||||
@param st Decoder state
|
@param st Decoder state
|
||||||
|
|
|
@ -108,14 +108,6 @@ struct CELTMode {
|
||||||
celt_uint32 marker_end;
|
celt_uint32 marker_end;
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline int FULL_FRAME(const CELTMode *m)
|
|
||||||
{
|
|
||||||
int i=0;
|
|
||||||
while (1<<i < m->nbShortMdcts)
|
|
||||||
i++;
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
int check_mode(const CELTMode *mode);
|
int check_mode(const CELTMode *mode);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -134,7 +134,7 @@ int main(int argc, char *argv[])
|
||||||
err = fread(in, sizeof(short), frame_size*channels, fin);
|
err = fread(in, sizeof(short), frame_size*channels, fin);
|
||||||
if (feof(fin))
|
if (feof(fin))
|
||||||
break;
|
break;
|
||||||
len = celt_encode(enc, in, in, data, bytes_per_packet);
|
len = celt_encode(enc, in, in, frame_size, data, bytes_per_packet);
|
||||||
if (len <= 0)
|
if (len <= 0)
|
||||||
{
|
{
|
||||||
fprintf (stderr, "celt_encode() returned %d\n", len);
|
fprintf (stderr, "celt_encode() returned %d\n", len);
|
||||||
|
@ -166,9 +166,9 @@ int main(int argc, char *argv[])
|
||||||
/* This is to simulate packet loss */
|
/* This is to simulate packet loss */
|
||||||
if (argc==9 && rand()%1000<atoi(argv[argc-3]))
|
if (argc==9 && rand()%1000<atoi(argv[argc-3]))
|
||||||
/*if (errors && (errors%2==0))*/
|
/*if (errors && (errors%2==0))*/
|
||||||
celt_decode(dec, NULL, len, out);
|
celt_decode(dec, NULL, len, out, frame_size);
|
||||||
else
|
else
|
||||||
celt_decode(dec, data, len, out);
|
celt_decode(dec, data, len, out, frame_size);
|
||||||
#else
|
#else
|
||||||
for (i=0;i<frame_size*channels;i++)
|
for (i=0;i<frame_size*channels;i++)
|
||||||
out[i] = in[i];
|
out[i] = in[i];
|
||||||
|
|
|
@ -99,13 +99,13 @@ int async_tandem(int rate, int frame_size, int channels, int bitrate_min,
|
||||||
for (j = channels; j < frame_size * channels - 1; j++)
|
for (j = channels; j < frame_size * channels - 1; j++)
|
||||||
pcm[j] = ((rand() % 4096) - 2048) + .9 * pcm[j - channels];
|
pcm[j] = ((rand() % 4096) - 2048) + .9 * pcm[j - channels];
|
||||||
|
|
||||||
ret = celt_encode(enc, pcm, NULL, data, bytes_per_frame);
|
ret = celt_encode(enc, pcm, NULL, frame_size, data, bytes_per_frame);
|
||||||
if (ret != bytes_per_frame) {
|
if (ret != bytes_per_frame) {
|
||||||
fprintf(stderr, "Error: during init celt_encode returned %d\n", ret);
|
fprintf(stderr, "Error: during init celt_encode returned %d\n", ret);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = celt_decode(dec, data, ret, pcm);
|
ret = celt_decode(dec, data, ret, pcm, frame_size);
|
||||||
if (ret != CELT_OK) {
|
if (ret != CELT_OK) {
|
||||||
fprintf(stderr, "Error: during init celt_decode returned %d\n", ret);
|
fprintf(stderr, "Error: during init celt_decode returned %d\n", ret);
|
||||||
}
|
}
|
||||||
|
@ -123,14 +123,14 @@ int async_tandem(int rate, int frame_size, int channels, int bitrate_min,
|
||||||
for (j = 0; j < channels; j++)
|
for (j = 0; j < channels; j++)
|
||||||
pcm[j] = carry[j];
|
pcm[j] = carry[j];
|
||||||
|
|
||||||
ret = celt_encode(enc, pcm, NULL, data, bytes_per_frame);
|
ret = celt_encode(enc, pcm, NULL, frame_size, data, bytes_per_frame);
|
||||||
if (ret != bytes_per_frame) {
|
if (ret != bytes_per_frame) {
|
||||||
fprintf(stderr, "Error: at %d bytes_per_frame celt_encode returned %d\n",
|
fprintf(stderr, "Error: at %d bytes_per_frame celt_encode returned %d\n",
|
||||||
bytes_per_frame, ret);
|
bytes_per_frame, ret);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = celt_decode(dec, data, ret, pcm);
|
ret = celt_decode(dec, data, ret, pcm, frame_size);
|
||||||
if (ret != CELT_OK) {
|
if (ret != CELT_OK) {
|
||||||
fprintf(stderr, "Error: at %d bytes_per_frame celt_decode returned %d\n",
|
fprintf(stderr, "Error: at %d bytes_per_frame celt_decode returned %d\n",
|
||||||
bytes_per_frame, ret);
|
bytes_per_frame, ret);
|
||||||
|
|
|
@ -569,9 +569,9 @@ int main(int argc, char **argv)
|
||||||
int ret;
|
int ret;
|
||||||
/*Decode frame*/
|
/*Decode frame*/
|
||||||
if (!lost)
|
if (!lost)
|
||||||
ret = celt_decode(st, (unsigned char*)op.packet, op.bytes, output);
|
ret = celt_decode(st, (unsigned char*)op.packet, op.bytes, output, frame_size);
|
||||||
else
|
else
|
||||||
ret = celt_decode(st, NULL, 0, output);
|
ret = celt_decode(st, NULL, 0, output, frame_size);
|
||||||
|
|
||||||
/*for (i=0;i<frame_size*channels;i++)
|
/*for (i=0;i<frame_size*channels;i++)
|
||||||
printf ("%d\n", (int)output[i]);*/
|
printf ("%d\n", (int)output[i]);*/
|
||||||
|
|
|
@ -664,7 +664,7 @@ int main(int argc, char **argv)
|
||||||
id++;
|
id++;
|
||||||
/*Encode current frame*/
|
/*Encode current frame*/
|
||||||
|
|
||||||
nbBytes = celt_encode(st, input, NULL, bits, bytes_per_packet);
|
nbBytes = celt_encode(st, input, NULL, frame_size, bits, bytes_per_packet);
|
||||||
if (nbBytes<0)
|
if (nbBytes<0)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Got error %d while encoding. Aborting.\n", nbBytes);
|
fprintf(stderr, "Got error %d while encoding. Aborting.\n", nbBytes);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue