[FFmpeg-devel] [PATCH v4] avformat/pcm: decrease delay when reading PCM streams.
Michael Niedermayer
michael at niedermayer.cc
Fri Mar 9 02:40:45 EET 2018
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)
> + 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 ?
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
Complexity theory is the science of finding the exact solution to an
approximation. Benchmarking OTOH is finding an approximation of the exact
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20180309/05014c82/attachment.sig>
More information about the ffmpeg-devel
mailing list