Close to getting CBR working
This commit is contained in:
parent
f51ca493fb
commit
4fbd18d1f4
5 changed files with 58 additions and 21 deletions
|
@ -229,21 +229,33 @@ void pitch_quant_bands(const CELTMode *m, float *X, float *P, float *gains)
|
||||||
|
|
||||||
|
|
||||||
/* Quantisation of the residual */
|
/* Quantisation of the residual */
|
||||||
void quant_bands(const CELTMode *m, float *X, float *P, float *W, ec_enc *enc)
|
void quant_bands(const CELTMode *m, float *X, float *P, float *W, struct alloc_data *alloc, int total_bits, ec_enc *enc)
|
||||||
{
|
{
|
||||||
int i, j, B;
|
int i, j, B, bits;
|
||||||
const int *eBands = m->eBands;
|
const int *eBands = m->eBands;
|
||||||
B = m->nbMdctBlocks*m->nbChannels;
|
B = m->nbMdctBlocks*m->nbChannels;
|
||||||
float norm[B*eBands[m->nbEBands+1]];
|
float norm[B*eBands[m->nbEBands+1]];
|
||||||
|
int pulses[m->nbEBands];
|
||||||
|
int offsets[m->nbEBands];
|
||||||
|
|
||||||
|
for (i=0;i<m->nbEBands;i++)
|
||||||
|
offsets[i] = 0;
|
||||||
|
bits = total_bits - ec_enc_tell(enc, 0) - 1;
|
||||||
|
compute_allocation(alloc, offsets, bits, pulses);
|
||||||
|
|
||||||
|
/*printf("bits left: %d\n", bits);
|
||||||
|
for (i=0;i<m->nbEBands;i++)
|
||||||
|
printf ("%d ", pulses[i]);
|
||||||
|
printf ("\n");*/
|
||||||
/*printf ("%d %d\n", ec_enc_tell(enc, 0), compute_allocation(m, m->nbPulses));*/
|
/*printf ("%d %d\n", ec_enc_tell(enc, 0), compute_allocation(m, m->nbPulses));*/
|
||||||
for (i=0;i<m->nbEBands;i++)
|
for (i=0;i<m->nbEBands;i++)
|
||||||
{
|
{
|
||||||
int q;
|
int q;
|
||||||
float theta, n;
|
float theta, n;
|
||||||
|
//q = pulses[i];
|
||||||
q = m->nbPulses[i];
|
q = m->nbPulses[i];
|
||||||
n = sqrt(B*(eBands[i+1]-eBands[i]));
|
n = sqrt(B*(eBands[i+1]-eBands[i]));
|
||||||
theta = .007*(B*(eBands[i+1]-eBands[i]))/(.1f+abs(m->nbPulses[i]));
|
theta = .007*(B*(eBands[i+1]-eBands[i]))/(.1f+abs(q));
|
||||||
|
|
||||||
if (q<=0) {
|
if (q<=0) {
|
||||||
q = -q;
|
q = -q;
|
||||||
|
@ -268,20 +280,28 @@ void quant_bands(const CELTMode *m, float *X, float *P, float *W, ec_enc *enc)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Decoding of the residual */
|
/* Decoding of the residual */
|
||||||
void unquant_bands(const CELTMode *m, float *X, float *P, ec_dec *dec)
|
void unquant_bands(const CELTMode *m, float *X, float *P, struct alloc_data *alloc, int total_bits, ec_dec *dec)
|
||||||
{
|
{
|
||||||
int i, j, B;
|
int i, j, B, bits;
|
||||||
const int *eBands = m->eBands;
|
const int *eBands = m->eBands;
|
||||||
B = m->nbMdctBlocks*m->nbChannels;
|
B = m->nbMdctBlocks*m->nbChannels;
|
||||||
float norm[B*eBands[m->nbEBands+1]];
|
float norm[B*eBands[m->nbEBands+1]];
|
||||||
|
int pulses[m->nbEBands];
|
||||||
|
int offsets[m->nbEBands];
|
||||||
|
|
||||||
|
for (i=0;i<m->nbEBands;i++)
|
||||||
|
offsets[i] = 0;
|
||||||
|
bits = total_bits - ec_dec_tell(dec, 0) - 1;
|
||||||
|
compute_allocation(alloc, offsets, bits, pulses);
|
||||||
|
|
||||||
for (i=0;i<m->nbEBands;i++)
|
for (i=0;i<m->nbEBands;i++)
|
||||||
{
|
{
|
||||||
int q;
|
int q;
|
||||||
float theta, n;
|
float theta, n;
|
||||||
|
//q = pulses[i];
|
||||||
q = m->nbPulses[i];
|
q = m->nbPulses[i];
|
||||||
n = sqrt(B*(eBands[i+1]-eBands[i]));
|
n = sqrt(B*(eBands[i+1]-eBands[i]));
|
||||||
theta = .007*(B*(eBands[i+1]-eBands[i]))/(.1f+abs(m->nbPulses[i]));
|
theta = .007*(B*(eBands[i+1]-eBands[i]))/(.1f+abs(q));
|
||||||
|
|
||||||
if (q<=0) {
|
if (q<=0) {
|
||||||
q = -q;
|
q = -q;
|
||||||
|
|
|
@ -36,6 +36,7 @@
|
||||||
#include "modes.h"
|
#include "modes.h"
|
||||||
#include "entenc.h"
|
#include "entenc.h"
|
||||||
#include "entdec.h"
|
#include "entdec.h"
|
||||||
|
#include "rate.h"
|
||||||
|
|
||||||
/** Compute the amplitude (sqrt energy) in each of the bands
|
/** Compute the amplitude (sqrt energy) in each of the bands
|
||||||
* @param m Mode data
|
* @param m Mode data
|
||||||
|
@ -79,7 +80,7 @@ void pitch_quant_bands(const CELTMode *m, float *X, float *P, float *gains);
|
||||||
* @param W Perceptual weighting
|
* @param W Perceptual weighting
|
||||||
* @param enc Entropy encoder
|
* @param enc Entropy encoder
|
||||||
*/
|
*/
|
||||||
void quant_bands(const CELTMode *m, float *X, float *P, float *W, ec_enc *enc);
|
void quant_bands(const CELTMode *m, float *X, float *P, float *W, struct alloc_data *alloc, int total_bits, ec_enc *enc);
|
||||||
|
|
||||||
/** Decoding of the residual spectrum
|
/** Decoding of the residual spectrum
|
||||||
* @param m Mode data
|
* @param m Mode data
|
||||||
|
@ -87,7 +88,7 @@ void quant_bands(const CELTMode *m, float *X, float *P, float *W, ec_enc *enc);
|
||||||
* @param P Pitch vector (normalised)
|
* @param P Pitch vector (normalised)
|
||||||
* @param dec Entropy decoder
|
* @param dec Entropy decoder
|
||||||
*/
|
*/
|
||||||
void unquant_bands(const CELTMode *m, float *X, float *P, ec_dec *dec);
|
void unquant_bands(const CELTMode *m, float *X, float *P, struct alloc_data *alloc, int total_bits, ec_dec *dec);
|
||||||
|
|
||||||
void stereo_mix(const CELTMode *m, float *X, float *bank, int dir);
|
void stereo_mix(const CELTMode *m, float *X, float *bank, int dir);
|
||||||
|
|
||||||
|
|
|
@ -41,6 +41,7 @@
|
||||||
#include "quant_pitch.h"
|
#include "quant_pitch.h"
|
||||||
#include "quant_bands.h"
|
#include "quant_bands.h"
|
||||||
#include "psy.h"
|
#include "psy.h"
|
||||||
|
#include "rate.h"
|
||||||
|
|
||||||
#define MAX_PERIOD 1024
|
#define MAX_PERIOD 1024
|
||||||
|
|
||||||
|
@ -70,6 +71,8 @@ struct CELTEncoder {
|
||||||
float *out_mem;
|
float *out_mem;
|
||||||
|
|
||||||
float *oldBandE;
|
float *oldBandE;
|
||||||
|
|
||||||
|
struct alloc_data alloc;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -113,6 +116,7 @@ CELTEncoder *celt_encoder_new(const CELTMode *mode)
|
||||||
st->preemph_memE = celt_alloc(C*sizeof(float));;
|
st->preemph_memE = celt_alloc(C*sizeof(float));;
|
||||||
st->preemph_memD = celt_alloc(C*sizeof(float));;
|
st->preemph_memD = celt_alloc(C*sizeof(float));;
|
||||||
|
|
||||||
|
alloc_init(&st->alloc, st->mode);
|
||||||
return st;
|
return st;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -134,6 +138,8 @@ void celt_encoder_destroy(CELTEncoder *st)
|
||||||
celt_free(st->out_mem);
|
celt_free(st->out_mem);
|
||||||
|
|
||||||
celt_free(st->oldBandE);
|
celt_free(st->oldBandE);
|
||||||
|
alloc_clear(&st->alloc);
|
||||||
|
|
||||||
celt_free(st);
|
celt_free(st);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -341,7 +347,7 @@ int celt_encode(CELTEncoder *st, short *pcm)
|
||||||
sum += X[i]*X[i];
|
sum += X[i]*X[i];
|
||||||
printf ("%f\n", sum);*/
|
printf ("%f\n", sum);*/
|
||||||
/* Residual quantisation */
|
/* Residual quantisation */
|
||||||
quant_bands(st->mode, X, P, mask, &st->enc);
|
quant_bands(st->mode, X, P, mask, &st->alloc, 770, &st->enc);
|
||||||
|
|
||||||
time_idct(X, N, B, C);
|
time_idct(X, N, B, C);
|
||||||
if (C==2)
|
if (C==2)
|
||||||
|
@ -421,6 +427,8 @@ struct CELTDecoder {
|
||||||
float *oldBandE;
|
float *oldBandE;
|
||||||
|
|
||||||
int last_pitch_index;
|
int last_pitch_index;
|
||||||
|
|
||||||
|
struct alloc_data alloc;
|
||||||
};
|
};
|
||||||
|
|
||||||
CELTDecoder *celt_decoder_new(const CELTMode *mode)
|
CELTDecoder *celt_decoder_new(const CELTMode *mode)
|
||||||
|
@ -459,6 +467,8 @@ CELTDecoder *celt_decoder_new(const CELTMode *mode)
|
||||||
st->preemph_memD = celt_alloc(C*sizeof(float));;
|
st->preemph_memD = celt_alloc(C*sizeof(float));;
|
||||||
|
|
||||||
st->last_pitch_index = 0;
|
st->last_pitch_index = 0;
|
||||||
|
alloc_init(&st->alloc, st->mode);
|
||||||
|
|
||||||
return st;
|
return st;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -477,6 +487,8 @@ void celt_decoder_destroy(CELTDecoder *st)
|
||||||
celt_free(st->out_mem);
|
celt_free(st->out_mem);
|
||||||
|
|
||||||
celt_free(st->oldBandE);
|
celt_free(st->oldBandE);
|
||||||
|
alloc_clear(&st->alloc);
|
||||||
|
|
||||||
celt_free(st);
|
celt_free(st);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -567,7 +579,7 @@ int celt_decode(CELTDecoder *st, char *data, int len, short *pcm)
|
||||||
pitch_quant_bands(st->mode, X, P, gains);
|
pitch_quant_bands(st->mode, X, P, gains);
|
||||||
|
|
||||||
/* Decode fixed codebook and merge with pitch */
|
/* Decode fixed codebook and merge with pitch */
|
||||||
unquant_bands(st->mode, X, P, &dec);
|
unquant_bands(st->mode, X, P, &st->alloc, 770, &dec);
|
||||||
|
|
||||||
time_idct(X, N, B, C);
|
time_idct(X, N, B, C);
|
||||||
if (C==2)
|
if (C==2)
|
||||||
|
|
|
@ -78,13 +78,18 @@ const int qpulses4s[NBANDS] ={38,31,25,21,18,16, 14, 12, 14, 12,14,15, 14, 15, 1
|
||||||
const int pbank1[PBANDS128+2] = {0, 2, 4, 6, 8, 12, 20, 28, PITCH_END128, 128};
|
const int pbank1[PBANDS128+2] = {0, 2, 4, 6, 8, 12, 20, 28, PITCH_END128, 128};
|
||||||
//const int pbank1[PBANDS128+2] = {0, 4, 8, 12, 20, PITCH_END128, 128};
|
//const int pbank1[PBANDS128+2] = {0, 4, 8, 12, 20, PITCH_END128, 128};
|
||||||
|
|
||||||
int bitalloc0[NBANDS*5] = { 5, 4, 4, 4, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0,
|
#define NALLOCS 7
|
||||||
8, 7, 7, 6, 6, 6, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
|
int bitalloc0[NBANDS*NALLOCS] =
|
||||||
11, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
|
{ 5, 4, 4, 4, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 0, 0, 0, 0,
|
||||||
16, 15, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
|
8, 7, 7, 6, 6, 6, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
|
||||||
26, 25, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
|
10, 9, 9, 8, 8, 8, 8, 8, 8, 8, 9, 10, 11, 12, 17, 15, 6, 7,
|
||||||
|
16, 15, 14, 14, 14, 13, 13, 13, 13, 13, 15, 16, 17, 18, 20, 18, 11, 12,
|
||||||
|
26, 25, 24, 22, 20, 18, 19, 19, 25, 22, 25, 30, 30, 35, 35, 35, 35, 25,
|
||||||
|
32, 30, 28, 27, 25, 24, 23, 21, 29, 27, 35, 40, 42, 50, 59, 54, 51, 36,
|
||||||
|
42, 40, 38, 37, 35, 34, 33, 31, 39, 37, 45, 50, 52, 60, 60, 60, 60, 46,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#define NBANDS256 15
|
#define NBANDS256 15
|
||||||
#define PBANDS256 8
|
#define PBANDS256 8
|
||||||
#define PITCH_END256 88
|
#define PITCH_END256 88
|
||||||
|
@ -110,7 +115,7 @@ const CELTMode mode0 = {
|
||||||
means18, /**< eMeans */
|
means18, /**< eMeans */
|
||||||
decay18, /**< eDecay */
|
decay18, /**< eDecay */
|
||||||
|
|
||||||
5, /**< nbAllocVectors */
|
7, /**< nbAllocVectors */
|
||||||
bitalloc0, /**< allocVectors */
|
bitalloc0, /**< allocVectors */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -134,7 +139,7 @@ const CELTMode mode1 = {
|
||||||
means, /**< eMeans */
|
means, /**< eMeans */
|
||||||
decay, /**< eDecay */
|
decay, /**< eDecay */
|
||||||
|
|
||||||
5, /**< nbAllocVectors */
|
7, /**< nbAllocVectors */
|
||||||
bitalloc0, /**< allocVectors */
|
bitalloc0, /**< allocVectors */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -157,7 +162,7 @@ const CELTMode mode2 = {
|
||||||
means18, /**< eMeans */
|
means18, /**< eMeans */
|
||||||
decay18, /**< eDecay */
|
decay18, /**< eDecay */
|
||||||
|
|
||||||
5, /**< nbAllocVectors */
|
7, /**< nbAllocVectors */
|
||||||
bitalloc0, /**< allocVectors */
|
bitalloc0, /**< allocVectors */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -179,7 +184,7 @@ const CELTMode mode3 = {
|
||||||
means, /**< eMeans */
|
means, /**< eMeans */
|
||||||
decay, /**< eDecay */
|
decay, /**< eDecay */
|
||||||
|
|
||||||
5, /**< nbAllocVectors */
|
7, /**< nbAllocVectors */
|
||||||
bitalloc0, /**< allocVectors */
|
bitalloc0, /**< allocVectors */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -202,7 +207,7 @@ const CELTMode mode4 = {
|
||||||
means18, /**< eMeans */
|
means18, /**< eMeans */
|
||||||
decay18, /**< eDecay */
|
decay18, /**< eDecay */
|
||||||
|
|
||||||
5, /**< nbAllocVectors */
|
7, /**< nbAllocVectors */
|
||||||
bitalloc0, /**< allocVectors */
|
bitalloc0, /**< allocVectors */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -185,7 +185,6 @@ int interp_bits2pulses(const struct alloc_data *alloc, int *bits1, int *bits2, i
|
||||||
int lo, hi, out;
|
int lo, hi, out;
|
||||||
int j;
|
int j;
|
||||||
int bits[len];
|
int bits[len];
|
||||||
int used_bits[len];
|
|
||||||
const int *bands = alloc->bands;
|
const int *bands = alloc->bands;
|
||||||
lo = 0;
|
lo = 0;
|
||||||
hi = 1<<BITRES;
|
hi = 1<<BITRES;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue