Skip to content
Snippets Groups Projects
Commit c8a20b78 authored by Jean-Marc Valin's avatar Jean-Marc Valin
Browse files

Early VBR support

parent eb9454c8
No related branches found
No related tags found
No related merge requests found
...@@ -103,9 +103,13 @@ int hybrid_encode(HybridEncoder *st, const short *pcm, int frame_size, ...@@ -103,9 +103,13 @@ int hybrid_encode(HybridEncoder *st, const short *pcm, int frame_size,
encControl.useDTX = 0; encControl.useDTX = 0;
encControl.complexity = 2; encControl.complexity = 2;
encControl.bitRate = (bytes_per_packet*50*8+6000)/2; if (st->vbr_rate != 0)
if (st->Fs / frame_size == 100) encControl.bitRate = (st->vbr_rate+6000)/2;
encControl.bitRate += 5000; else {
encControl.bitRate = (bytes_per_packet*8*(celt_int32)st->Fs/frame_size+6000)/2;
if (st->Fs == 100 * frame_size)
encControl.bitRate -= 5000;
}
encControl.packetSize = frame_size; encControl.packetSize = frame_size;
if (st->bandwidth == BANDWIDTH_NARROWBAND) if (st->bandwidth == BANDWIDTH_NARROWBAND)
...@@ -135,7 +139,7 @@ int hybrid_encode(HybridEncoder *st, const short *pcm, int frame_size, ...@@ -135,7 +139,7 @@ int hybrid_encode(HybridEncoder *st, const short *pcm, int frame_size,
if (st->mode != MODE_SILK_ONLY && st->bandwidth > BANDWIDTH_WIDEBAND) if (st->mode != MODE_SILK_ONLY && st->bandwidth > BANDWIDTH_WIDEBAND)
{ {
short buf[960]; short pcm_buf[960];
if (st->bandwidth == BANDWIDTH_SUPERWIDEBAND) if (st->bandwidth == BANDWIDTH_SUPERWIDEBAND)
celt_encoder_ctl(st->celt_enc, CELT_SET_END_BAND(20)); celt_encoder_ctl(st->celt_enc, CELT_SET_END_BAND(20));
...@@ -143,13 +147,22 @@ int hybrid_encode(HybridEncoder *st, const short *pcm, int frame_size, ...@@ -143,13 +147,22 @@ int hybrid_encode(HybridEncoder *st, const short *pcm, int frame_size,
celt_encoder_ctl(st->celt_enc, CELT_SET_END_BAND(21)); celt_encoder_ctl(st->celt_enc, CELT_SET_END_BAND(21));
for (i=0;i<ENCODER_DELAY_COMPENSATION;i++) for (i=0;i<ENCODER_DELAY_COMPENSATION;i++)
buf[i] = st->delay_buffer[i]; pcm_buf[i] = st->delay_buffer[i];
for (;i<frame_size;i++) for (;i<frame_size;i++)
buf[i] = pcm[i-ENCODER_DELAY_COMPENSATION]; pcm_buf[i] = pcm[i-ENCODER_DELAY_COMPENSATION];
celt_encoder_ctl(st->celt_enc, CELT_SET_PREDICTION(1)); celt_encoder_ctl(st->celt_enc, CELT_SET_PREDICTION(1));
if (st->vbr_rate != 0)
{
int tmp = (st->vbr_rate-6000)/2;
tmp = ((ec_enc_tell(&enc, 0)+4)>>3) + tmp * frame_size/(8*st->Fs);
if (tmp <= bytes_per_packet)
bytes_per_packet = tmp;
ec_byte_shrink(&buf, bytes_per_packet);
}
/* Encode high band with CELT */ /* Encode high band with CELT */
ret = celt_encode_with_ec(st->celt_enc, buf, NULL, frame_size, data, bytes_per_packet, &enc); ret = celt_encode_with_ec(st->celt_enc, pcm_buf, NULL, frame_size, data, bytes_per_packet, &enc);
for (i=0;i<ENCODER_DELAY_COMPENSATION;i++) for (i=0;i<ENCODER_DELAY_COMPENSATION;i++)
st->delay_buffer[i] = pcm[frame_size-ENCODER_DELAY_COMPENSATION+i]; st->delay_buffer[i] = pcm[frame_size-ENCODER_DELAY_COMPENSATION+i];
} else { } else {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment