[FFmpeg-cvslog] opus_rc: fix encoder desyncs on very low bitrates

Rostislav Pehlivanov git at videolan.org
Tue Jul 11 01:52:27 EEST 2017


ffmpeg | branch: master | Rostislav Pehlivanov <atomnuker at gmail.com> | Mon Jul 10 23:40:35 2017 +0100| [e7d977b446194649aa30f2aacc6c17bce7aeb90b] | committer: Rostislav Pehlivanov

opus_rc: fix encoder desyncs on very low bitrates

Signed-off-by: Rostislav Pehlivanov <atomnuker at gmail.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=e7d977b446194649aa30f2aacc6c17bce7aeb90b
---

 libavcodec/opus_rc.c | 17 ++++++++++-------
 1 file 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));
     }
 }
 



More information about the ffmpeg-cvslog mailing list