tis 2018-02-13 klockan 15:11 +0100 skrev Philipp M. Scholl: > 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 10ms. This decreases the startup > delay when multiplexing inputs with different rates. > > > Signed-off-by: Philipp M. Scholl <psch...@bawue.de> > --- > diff --git a/libavformat/pcm.c b/libavformat/pcm.c > index 806f91b6b1..f0ea029633 100644 > --- a/libavformat/pcm.c > +++ b/libavformat/pcm.c > @@ -24,17 +24,48 @@ > #include "internal.h" > #include "pcm.h" > > -#define RAW_SAMPLES 1024 > +#define RAW_SAMPLES 1024
Please avoid mixing cosmetic and functional changes > + > +/* > + * copied from > https://stackoverflow.com/questions/2679815/previous-power-of-2 > + * computes the previous power of two. > + */ Got any idea what kind of license Hacker's Delight uses? > +static uint32_t flp2 (uint32_t x) > +{ > + x = x | (x >> 1); > + x = x | (x >> 2); > + x = x | (x >> 4); > + x = x | (x >> 8); > + x = x | (x >> 16); > + x = x - (x >> 1); > + return x + (x == 0); /* if x is zero, return 1 */ > +} What's wrong with 1<<ff_log2(x)? > > int ff_pcm_read_packet(AVFormatContext *s, AVPacket *pkt) > { > - int ret, size; > + int i, ret, strmsize, readsize = INT_MAX; > + AVCodecParameters *codec; > + > + /* > + * recompute read size based on sample rate of the inputs, make sure > + * to complete a read every 10ms by selecting the smallest sample rate > + */ > + for (i=0; i < s->nb_streams; i++) { > + codec = s->streams[i]->codecpar; > + strmsize = codec->sample_rate / 100 * codec->block_align; What if sample_rate < 100 Hz? > + readsize = FFMIN(readsize, strmsize); > + } > + > + /* > + * clamp to RAW_SAMPLES if larger, and to previous power of two. > + */ > + readsize = flp2(FFMIN(readsize, > + RAW_SAMPLES * s->streams[0]->codecpar->block_align)); Any particular reason for previous power of two? > > - size= RAW_SAMPLES*s->streams[0]->codecpar->block_align; > - if (size <= 0) > + if (readsize <= 0) > return AVERROR(EINVAL); Might want to separate this into a check for block_align>0, then FFMAX(readsize, block_align) so we always get something. That would take care of the < 100 Hz issue > > - ret= av_get_packet(s->pb, pkt, size); > + ret = av_get_packet(s->pb, pkt, readsize); Keeping the name as "size" removes the need for this hunk :) /Tomas
signature.asc
Description: This is a digitally signed message part
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel