Commit d0a31431 authored by Rostislav Pehlivanov's avatar Rostislav Pehlivanov

opusenc: switch between intra/inter mode for coarse energy

Saves around 5kbps.
Signed-off-by: 's avatarRostislav Pehlivanov <atomnuker@gmail.com>
parent c39fba70
...@@ -100,7 +100,6 @@ struct CeltFrame { ...@@ -100,7 +100,6 @@ struct CeltFrame {
int end_band; int end_band;
int coded_bands; int coded_bands;
int transient; int transient;
int intra;
int pfilter; int pfilter;
int skip_band_floor; int skip_band_floor;
int tf_select; int tf_select;
......
...@@ -630,19 +630,20 @@ static void ff_celt_enc_bitalloc(OpusRangeCoder *rc, CeltFrame *f) ...@@ -630,19 +630,20 @@ static void ff_celt_enc_bitalloc(OpusRangeCoder *rc, CeltFrame *f)
} }
} }
static void celt_quant_coarse(OpusEncContext *s, OpusRangeCoder *rc, CeltFrame *f) static void exp_quant_coarse(OpusRangeCoder *rc, CeltFrame *f,
float last_energy[][CELT_MAX_BANDS], int intra)
{ {
int i, ch; int i, ch;
float alpha, beta, prev[2] = { 0, 0 }; float alpha, beta, prev[2] = { 0, 0 };
const uint8_t *pmod = ff_celt_coarse_energy_dist[f->size][f->intra]; const uint8_t *pmod = ff_celt_coarse_energy_dist[f->size][intra];
/* Inter is really just differential coding */ /* Inter is really just differential coding */
if (opus_rc_tell(rc) + 3 <= f->framebits) if (opus_rc_tell(rc) + 3 <= f->framebits)
ff_opus_rc_enc_log(rc, f->intra, 3); ff_opus_rc_enc_log(rc, intra, 3);
else else
f->intra = 0; intra = 0;
if (f->intra) { if (intra) {
alpha = 0.0f; alpha = 0.0f;
beta = 1.0f - 4915.0f/32768.0f; beta = 1.0f - 4915.0f/32768.0f;
} else { } else {
...@@ -654,7 +655,7 @@ static void celt_quant_coarse(OpusEncContext *s, OpusRangeCoder *rc, CeltFrame * ...@@ -654,7 +655,7 @@ static void celt_quant_coarse(OpusEncContext *s, OpusRangeCoder *rc, CeltFrame *
for (ch = 0; ch < f->channels; ch++) { for (ch = 0; ch < f->channels; ch++) {
CeltBlock *block = &f->block[ch]; CeltBlock *block = &f->block[ch];
const int left = f->framebits - opus_rc_tell(rc); const int left = f->framebits - opus_rc_tell(rc);
const float last = FFMAX(-9.0f, s->last_quantized_energy[ch][i]); const float last = FFMAX(-9.0f, last_energy[ch][i]);
float diff = block->energy[i] - prev[ch] - last*alpha; float diff = block->energy[i] - prev[ch] - last*alpha;
int q_en = lrintf(diff); int q_en = lrintf(diff);
if (left >= 15) { if (left >= 15) {
...@@ -673,6 +674,26 @@ static void celt_quant_coarse(OpusEncContext *s, OpusRangeCoder *rc, CeltFrame * ...@@ -673,6 +674,26 @@ static void celt_quant_coarse(OpusEncContext *s, OpusRangeCoder *rc, CeltFrame *
} }
} }
static void celt_quant_coarse(OpusRangeCoder *rc, CeltFrame *f,
float last_energy[][CELT_MAX_BANDS])
{
uint32_t inter, intra;
OPUS_RC_CHECKPOINT_SPAWN(rc);
exp_quant_coarse(rc, f, last_energy, 1);
intra = OPUS_RC_CHECKPOINT_BITS(rc);
OPUS_RC_CHECKPOINT_ROLLBACK(rc);
exp_quant_coarse(rc, f, last_energy, 0);
inter = OPUS_RC_CHECKPOINT_BITS(rc);
if (inter > intra) { /* Unlikely */
OPUS_RC_CHECKPOINT_ROLLBACK(rc);
exp_quant_coarse(rc, f, last_energy, 1);
}
}
static void celt_quant_fine(OpusRangeCoder *rc, CeltFrame *f) static void celt_quant_fine(OpusRangeCoder *rc, CeltFrame *f)
{ {
int i, ch; int i, ch;
...@@ -823,7 +844,7 @@ static void celt_encode_frame(OpusEncContext *s, OpusRangeCoder *rc, CeltFrame * ...@@ -823,7 +844,7 @@ static void celt_encode_frame(OpusEncContext *s, OpusRangeCoder *rc, CeltFrame *
if (f->size && opus_rc_tell(rc) + 3 <= f->framebits) if (f->size && opus_rc_tell(rc) + 3 <= f->framebits)
ff_opus_rc_enc_log(rc, f->transient, 3); ff_opus_rc_enc_log(rc, f->transient, 3);
celt_quant_coarse (s, rc, f); celt_quant_coarse(rc, f, s->last_quantized_energy);
celt_enc_tf (rc, f); celt_enc_tf (rc, f);
ff_celt_enc_bitalloc(rc, f); ff_celt_enc_bitalloc(rc, f);
celt_quant_fine (rc, f); celt_quant_fine (rc, f);
...@@ -871,7 +892,6 @@ static void ff_opus_psy_celt_frame_setup(OpusEncContext *s, CeltFrame *f, int in ...@@ -871,7 +892,6 @@ static void ff_opus_psy_celt_frame_setup(OpusEncContext *s, CeltFrame *f, int in
f->silence = 0; f->silence = 0;
f->pfilter = 0; f->pfilter = 0;
f->transient = 0; f->transient = 0;
f->intra = 1;
f->tf_select = 0; f->tf_select = 0;
f->anticollapse = 0; f->anticollapse = 0;
f->alloc_trim = 5; f->alloc_trim = 5;
......
Markdown is supported
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