<div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><font face="monospace, monospace" color="#000000" style="background-color:rgb(255,255,255)">Hi Yury<br><br></font><div class="gmail_quote"><div dir="ltr"><font face="monospace, monospace" color="#000000" style="background-color:rgb(255,255,255)">On Thu, Oct 25, 2018 at 11:18 AM Yurii Monakov <<a href="mailto:monakov.y@gmail.com">monakov.y@gmail.com</a>> wrote:<br></font></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><font face="monospace, monospace" color="#000000" style="background-color:rgb(255,255,255)">Resampling can introduce additional samples in the output (because out_samples is rounded).</font></div><div><font face="monospace, monospace" color="#000000" style="background-color:rgb(255,255,255)">You should keep track of input time and output time to calculate number of output samples.<br></font></div><div><font face="monospace, monospace" color="#000000" style="background-color:rgb(255,255,255)"><br></font></div><div><font face="monospace, monospace" color="#000000" style="background-color:rgb(255,255,255)">Yurii</font></div></div></blockquote><div><font face="monospace, monospace" color="#000000" style="background-color:rgb(255,255,255)"><br></font></div><div><font face="monospace, monospace" color="#000000" style="background-color:rgb(255,255,255)">I am not sure if that is true or not.</font></div><div><font face="monospace, monospace" color="#000000" style="background-color:rgb(255,255,255)"><br></font></div><div><font face="monospace, monospace" color="#000000" style="background-color:rgb(255,255,255)">In his sample code he is rounding up when allocating memory:</font></div><div><font face="monospace, monospace" color="#000000" style="background-color:rgb(255,255,255)"><br></font></div><div><div><font face="monospace, monospace">int out_samples = (int) av_rescale_rnd(</font></div><div><font face="monospace, monospace"><span style="white-space:pre">    </span>swr_get_delay(swrContext, codecContext->sample_rate) + frame->nb_samples,</font></div><div><font face="monospace, monospace"><span style="white-space:pre">        </span>out_sample_rate,</font></div><div><font face="monospace, monospace"><span style="white-space:pre">       </span>codecContext->sample_rate,</font></div><div><font face="monospace, monospace"><span style="white-space:pre">  </span>AV_ROUND_UP);</font></div><font face="monospace, monospace">av_samples_alloc(&localBuffer, NULL, 2, out_samples, AV_SAMPLE_FMT_FLT, 0);</font><br></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Lets say out_samples is 1000.6 without rounding and 1001 rounded. Memory for 1001 samples is allocated.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Then he calls swr_convert which returns the number of converted samples:</font></div><div><font face="monospace, monospace"><div><br></div><div>int numberSampleOutputPerChannel = swr_convert(swrContext,</div><div><span style="white-space:pre">      </span>&localBuffer, out_samples,</div><div><span style="white-space:pre">        </span>(const uint8_t **) frame->extended_data, frame->nb_samples);</div><div><br></div><div>To my understanding the first call of swr_convert will return 1000 samples(numberSampleOutputPerChannel is 1000). </div><div><br></div><div>The following is not technically correct but helps me illustrate my point:</div><div>*The 0.6 extra samples will be buffered and returned in the next call to swr_convert. The second call will be fed 1000.6 + 0.6 samples and return 1001 samples and buffer 0.2.*</div><div><br></div><div>I am not 100% sure that the previous is true, can someone confirm it?</div><div>I will test it later.</div><div><br></div><div>Thanks.</div></font></div></div></div></div></div></div>