<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">From 205552370e058d99452fd34983942e10f2db6dff Mon Sep 17 00:00:00 2001
From: Mark Harris &lt;mark.hsj@gmail.com&gt;
Date: Mon, 28 Dec 2020 12:58:17 -0800
Subject: [PATCH] Fix ope_encoder_drain() assertion failure

If the stream is drained without writing any audio and the frame size is
smaller than the encoder latency, the assertion (enc-&gt;streams == NULL)
would fail because pad_samples was computed using an incorrect value of
enc-&gt;global_granule_offset before it was set in init_stream(), causing
the padding to be insufficient to drain the stream.
---
 src/opusenc.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

--- a/src/opusenc.c
+++ b/src/opusenc.c
@@ -808,9 +808,9 @@ int ope_encoder_drain(OggOpusEnc *enc) {
   if (enc-&gt;unrecoverable) return enc-&gt;unrecoverable;
   /* Check if it's already been drained. */
   if (enc-&gt;streams == NULL) return OPE_TOO_LATE;
+  if (!enc-&gt;streams-&gt;stream_is_init) init_stream(enc);
   if (enc-&gt;re) resampler_drain = speex_resampler_get_output_latency(enc-&gt;re);
   pad_samples = MAX(LPC_PADDING, enc-&gt;global_granule_offset + enc-&gt;frame_size + resampler_drain + 1);
-  if (!enc-&gt;streams-&gt;stream_is_init) init_stream(enc);
   shift_buffer(enc);
   assert(enc-&gt;buffer_end + pad_samples &lt;= BUFFER_SAMPLES);
   memset(&amp;enc-&gt;buffer[enc-&gt;channels*enc-&gt;buffer_end], 0, pad_samples*enc-&gt;channels*sizeof(enc-&gt;buffer[0]));
</pre></body></html>