<div dir="ltr"><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Jul 31, 2020 at 9:55 AM u <<a href="mailto:ugurbd@gmail.com">ugurbd@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>Hello, <br></div><div><br></div><div>I've been trying to understand how to use opus codec for quite some time. There is a thing that doesn't make sense to me. I will try to explain what it is below,</div><div><br></div><div>In <b>opus_encode() </b>function, <b>opus_int16 pcm</b> is said to have a size of <b>frame_size * channels</b>, where <b>frame_size</b> is said to be one of<b> 20, 240, 480, 960, 1920, and 2880.</b></div><div>Let's say, frame_size is 960, then opus_int16 pcm's size in bytes would be <span id="gmail-m_-450381856575748336m_5372245715281859124gmail-cwos"><b>3840</b>. Documentation page says the recommended size for <b>output payload </b>should be around <b>4000.<br></b></span></div><div><span id="gmail-m_-450381856575748336m_5372245715281859124gmail-cwos">I check the return values returned by <b>opus_encode(), </b>and they are between 250 and 300, which is the length of the encoded packet.</span></div><div><span id="gmail-m_-450381856575748336m_5372245715281859124gmail-cwos"><br></span></div><div><span id="gmail-m_-450381856575748336m_5372245715281859124gmail-cwos">Now, we are supposed to send <b>ouput_payload</b> - which is 4000 bytes long - over the network. That means sending more bytes than sending opus_int16 pcm, which is length of <b>3840 </b>in bytes<b>.</b><br></span></div><div><span id="gmail-m_-450381856575748336m_5372245715281859124gmail-cwos">So what is the advantage of encoding the data if we are to send more bytes than initially held?<br></span></div><div><span id="gmail-m_-450381856575748336m_5372245715281859124gmail-cwos"><br></span></div><div><span id="gmail-m_-450381856575748336m_5372245715281859124gmail-cwos">I also tried setting <b>output payload's </b>size to be one of <b>512, 256, 128 </b>bytes<b> </b>and all seemed to work fine. I understand when <b>output payload</b> is shorter than <b>opus_int16  pcm</b> in size but don't understand when it is bigger.<br></span></div><div><span id="gmail-m_-450381856575748336m_5372245715281859124gmail-cwos"><br></span></div><div><span id="gmail-m_-450381856575748336m_5372245715281859124gmail-cwos">Best Regards,</span></div></div><br></blockquote><div><br></div><div>Also, if you give a too-small output buffer, opus_encode will return OPUS_BUFFER_TOO_SMALL or 
OPUS_INTERNAL_ERROR, so unless you're extremely memory-constrained, it's not worth shrinking it too much. It also won't zero anything out before using it, so garbage can accumulate if you touch anything past the returned length. I believe that the maximum packet size Opus can return for 20ms (960) is 640 bytes per channel, and by more firmly controlling the bitrate, you can reduce that further, if you are memory-constrained, but if not, a buffer the same size as the PCM buffer is a simple enough thing to use.<br></div><div><br></div><div>-Em<br></div></div></div>