Otherwise we might return 1-2 samples per packet if av_read_frame() call rate is only sligthly less than the stream sample rate.
Signed-off-by: Marton Balint <c...@passwd.hu> --- libavdevice/alsa_dec.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/libavdevice/alsa_dec.c b/libavdevice/alsa_dec.c index 6d568737b3..8e5c53f56b 100644 --- a/libavdevice/alsa_dec.c +++ b/libavdevice/alsa_dec.c @@ -78,6 +78,12 @@ static av_cold int audio_read_header(AVFormatContext *s1) return AVERROR(EIO); } + ret = snd_pcm_start(s->h); + if (ret < 0) { + av_log(s1, AV_LOG_ERROR, "cannot start pcm (%s)\n", snd_strerror(ret)); + goto fail; + } + /* take real parameters */ st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO; st->codecpar->codec_id = codec_id; @@ -104,6 +110,13 @@ static int audio_read_packet(AVFormatContext *s1, AVPacket *pkt) int64_t dts; snd_pcm_sframes_t delay = 0; + // Avoid returning 1-2 samples if call rate is slightly less than sample rate + if (s1->flags & AVFMT_FLAG_NONBLOCK) { + res = snd_pcm_avail(s->h); + if (res >= 0 && res < s->period_size) + return AVERROR(EAGAIN); + } + if (av_new_packet(pkt, s->period_size * s->frame_size) < 0) { return AVERROR(EIO); } @@ -121,6 +134,11 @@ static int audio_read_packet(AVFormatContext *s1, AVPacket *pkt) return AVERROR(EIO); } + res = snd_pcm_start(s->h); + if (res < 0) { + av_log(s1, AV_LOG_ERROR, "cannot start pcm after recovery (%s)\n", snd_strerror(res)); + return AVERROR(EIO); + } ff_timefilter_reset(s->timefilter); } -- 2.26.2 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".