diff options
author | Jean-Marc Valin <jmvalin@jmvalin.ca> | 2016-07-07 18:54:10 +0300 |
---|---|---|
committer | Jean-Marc Valin <jmvalin@jmvalin.ca> | 2016-07-07 18:54:10 +0300 |
commit | bcea233f7541d85253d42bc98ee2e1f842c11461 (patch) | |
tree | 1ea70e1427145a4f4e463c7aa67ab0250d949712 | |
parent | eff72e47eb08e646bf5d45f2aa739058723d39fd (diff) |
Makes CBR calculations more accurate for 60-ms frames
-rw-r--r-- | src/opus_encoder.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/src/opus_encoder.c b/src/opus_encoder.c index c7b349c8..9a516a88 100644 --- a/src/opus_encoder.c +++ b/src/opus_encoder.c @@ -1052,8 +1052,11 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_ if (!st->use_vbr) { int cbrBytes; - cbrBytes = IMIN( (st->bitrate_bps + 4*frame_rate)/(8*frame_rate) , max_data_bytes); - st->bitrate_bps = cbrBytes * (8*frame_rate); + /* Multiply by 3 to make sure the division is exact. */ + int frame_rate3 = 3*st->Fs/frame_size; + /* We need to make sure that "int" values always fit in 16 bits. */ + cbrBytes = IMIN( (3*st->bitrate_bps/8 + frame_rate3/2)/frame_rate3, max_data_bytes); + st->bitrate_bps = cbrBytes*(opus_int32)frame_rate3*8/3; max_data_bytes = cbrBytes; } if (max_data_bytes<3 || st->bitrate_bps < 3*frame_rate*8 |