mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
opus_rc: fix encoder desyncs on very low bitrates
Signed-off-by: Rostislav Pehlivanov <atomnuker@gmail.com>
This commit is contained in:
parent
8041b2420f
commit
e7d977b446
@ -381,18 +381,21 @@ void ff_opus_rc_enc_end(OpusRangeCoder *rc, uint8_t *dst, int size)
|
|||||||
opus_rc_enc_carryout(rc, 0);
|
opus_rc_enc_carryout(rc, 0);
|
||||||
|
|
||||||
rng_bytes = rc->rng_cur - rc->buf;
|
rng_bytes = rc->rng_cur - rc->buf;
|
||||||
rc->waste = (size - (rc->rb.bytes + rng_bytes)) << 3;
|
|
||||||
memcpy(dst, rc->buf, rng_bytes);
|
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 */
|
/* Put the rawbits part, if any */
|
||||||
if (rc->rb.bytes || rc->rb.cachelen) {
|
if (rc->rb.bytes || rc->rb.cachelen) {
|
||||||
int rawbytes = FFALIGN(rc->rb.bytes*8 + rc->rb.cachelen, 8) >> 3;
|
int i, lap;
|
||||||
int dst_loc = FFMAX(size - rawbytes, 0);
|
uint8_t *rb_src, *rb_dst;
|
||||||
uint8_t *src = rc->buf + OPUS_MAX_PACKET_SIZE + 12 - rawbytes;
|
|
||||||
ff_opus_rc_put_raw(rc, 0, 32 - rc->rb.cachelen);
|
ff_opus_rc_put_raw(rc, 0, 32 - rc->rb.cachelen);
|
||||||
dst[dst_loc] |= *src++;
|
rb_src = rc->buf + OPUS_MAX_PACKET_SIZE + 12 - rc->rb.bytes;
|
||||||
memcpy(&dst[dst_loc + 1], src, rawbytes - 1);
|
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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user