[FFmpeg-devel] [PATCH v4] avformat/pcm: decrease delay when reading PCM streams.

Tomas Härdin tjoppen at acc.umu.se
Fri Mar 9 12:18:38 EET 2018


On 2018-03-09 01:40, Michael Niedermayer wrote:
> On Wed, Mar 07, 2018 at 03:30:37PM +0100, Philipp M. Scholl wrote:
>>   Here is the fourth version of the PCM patch with updated testcases.
>>
>>   The blocksize of the PCM decoder is hard-coded. This creates
>> unnecessary delay when reading low-rate (<100Hz) streams. This creates
>> issues when multiplexing multiple streams, since other inputs are only
>> opened/read after a low-rate input block was completely read.
>>
>>   This patch decreases the blocksize for low-rate inputs, so
>> approximately a block is read every 40ms. This decreases the startup
>> delay when multiplexing inputs with different rates.
>>
>> Signed-off-by: Philipp M. Scholl <pscholl at bawue.de>
>> ---
>>   libavformat/pcm.c         | 16 ++++++++++++----
>>   tests/ref/seek/lavf-alaw  | 42 +++++++++++++++++++++---------------------
>>   tests/ref/seek/lavf-mulaw | 42 +++++++++++++++++++++---------------------
>>   3 files changed, 54 insertions(+), 46 deletions(-)
>>
>> diff --git a/libavformat/pcm.c b/libavformat/pcm.c
>> index 806f91b6b..1ea15a9e8 100644
>> --- a/libavformat/pcm.c
>> +++ b/libavformat/pcm.c
>> @@ -28,13 +28,21 @@
>>   
>>   int ff_pcm_read_packet(AVFormatContext *s, AVPacket *pkt)
>>   {
>> -    int ret, size;
>> +    int ret, size = INT_MAX;
>> +    AVCodecParameters *par = s->streams[0]->codecpar;
>>   
>> -    size= RAW_SAMPLES*s->streams[0]->codecpar->block_align;
>> -    if (size <= 0)
>> +    if (par->block_align <= 0)
>>           return AVERROR(EINVAL);
>>   
>> -    ret= av_get_packet(s->pb, pkt, size);
>> +    /*
>> +     * Compute read size to complete a read every 40ms.  Clamp to RAW_SAMPLES if
>> +     * larger. Use power of two as readsize for I/O efficiency.
>> +     */
>> +    size = FFMAX(par->sample_rate/25, 1);
> division is a bit slowish, and this is done per (small) packet.
> Maybe a >>4 or >>5 could be used ? (this is a minor issue)

It's not the 80's any more

>> +    size = FFMIN(size, RAW_SAMPLES) * par->block_align;
>> +    size = 1 << ff_log2(size);
>> +
>> +    ret = av_get_packet(s->pb, pkt, size);
> what if block_align is not a power of 2?
>
> for example with 6 channels there could be a reasonable block size
> that is not a multiple of 2.
> or am i missing something ?

Good catch. Yes, this is a problem. Should probably round down before 
multiplying by block_align

/Tomas


More information about the ffmpeg-devel mailing list