diff options
author | Rostislav Pehlivanov <atomnuker@gmail.com> | 2017-07-10 23:40:35 +0100 |
---|---|---|
committer | Rostislav Pehlivanov <atomnuker@gmail.com> | 2017-07-10 23:49:44 +0100 |
commit | e7d977b446194649aa30f2aacc6c17bce7aeb90b (patch) | |
tree | d82e8ab7e80691142bf5978b60fd0dfc135a9672 /libavcodec/opus_rc.c | |
parent | 8041b2420f11758a4b2e573729cb31e2cf686ca1 (diff) | |
download | ffmpeg-e7d977b446194649aa30f2aacc6c17bce7aeb90b.tar.gz |
opus_rc: fix encoder desyncs on very low bitrates
Signed-off-by: Rostislav Pehlivanov <atomnuker@gmail.com>
Diffstat (limited to 'libavcodec/opus_rc.c')
-rw-r--r-- | libavcodec/opus_rc.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/libavcodec/opus_rc.c b/libavcodec/opus_rc.c index 85268bd284..c5cccd6cd2 100644 --- a/libavcodec/opus_rc.c +++ b/libavcodec/opus_rc.c @@ -381,18 +381,21 @@ void ff_opus_rc_enc_end(OpusRangeCoder *rc, uint8_t *dst, int size) opus_rc_enc_carryout(rc, 0); rng_bytes = rc->rng_cur - rc->buf; - rc->waste = (size - (rc->rb.bytes + rng_bytes)) << 3; memcpy(dst, rc->buf, rng_bytes); - memset(dst + rng_bytes, 0, FFMAX(rc->waste >> 3, 0) + 1); + + rc->waste = size*8 - (rc->rb.bytes*8 + rc->rb.cachelen) - rng_bytes*8; /* Put the rawbits part, if any */ if (rc->rb.bytes || rc->rb.cachelen) { - int rawbytes = FFALIGN(rc->rb.bytes*8 + rc->rb.cachelen, 8) >> 3; - int dst_loc = FFMAX(size - rawbytes, 0); - uint8_t *src = rc->buf + OPUS_MAX_PACKET_SIZE + 12 - rawbytes; + int i, lap; + uint8_t *rb_src, *rb_dst; ff_opus_rc_put_raw(rc, 0, 32 - rc->rb.cachelen); - dst[dst_loc] |= *src++; - memcpy(&dst[dst_loc + 1], src, rawbytes - 1); + rb_src = rc->buf + OPUS_MAX_PACKET_SIZE + 12 - rc->rb.bytes; + rb_dst = dst + FFMAX(size - rc->rb.bytes, 0); + lap = &dst[rng_bytes] - rb_dst; + for (i = 0; i < lap; i++) + rb_dst[i] |= rb_src[i]; + memcpy(&rb_dst[lap], &rb_src[lap], FFMAX(rc->rb.bytes - lap, 0)); } } |