[FFmpeg-devel] [PATCH v2 2/5] avdevice/alsa_dec: make sure we have enough data in non-blocking mode
Marton Balint
cus at passwd.hu
Sat Mar 13 01:15:27 EET 2021
On Wed, 10 Mar 2021, Marton Balint wrote:
>
>
> On Sat, 6 Mar 2021, Marton Balint wrote:
>
>>
>>
>> On Mon, 1 Mar 2021, Marton Balint wrote:
>>
>>> Otherwise we might return 1-2 samples per packet if av_read_frame() call
>> rate is
>>> only sligthly less than the stream sample rate.
>>
>> Ping for this and the rest of the series. Note that the approach in
>> this patch makes 1/5 unneeded because constant frame size is now indeed
>> guaranteed.
>
> Will apply the series soon.
Applied.
Regards,
Marton
>
> Regards,
> Marton
>
>>>
>>> Signed-off-by: Marton Balint <cus at passwd.hu>
>>> ---
>>> libavdevice/alsa.c | 5 +++++
>>> libavdevice/alsa.h | 1 +
>>> libavdevice/alsa_dec.c | 22 ++++++++++++----------
>>> 3 files changed, 18 insertions(+), 10 deletions(-)
>>>
>>> diff --git a/libavdevice/alsa.c b/libavdevice/alsa.c
>>> index 117b2ea144..ee282fac16 100644
>>> --- a/libavdevice/alsa.c
>>> +++ b/libavdevice/alsa.c
>>> @@ -286,6 +286,10 @@ av_cold int ff_alsa_open(AVFormatContext *ctx,
>> snd_pcm_stream_t mode,
>>> }
>>> }
>>>
>>> + s->pkt = av_packet_alloc();
>>> + if (!s->pkt)
>>> + goto fail1;
>>> +
>>> s->h = h;
>>> return 0;
>>>
>>> @@ -308,6 +312,7 @@ av_cold int ff_alsa_close(AVFormatContext *s1)
>>> if (CONFIG_ALSA_INDEV)
>>> ff_timefilter_destroy(s->timefilter);
>>> snd_pcm_close(s->h);
>>> + av_packet_free(&s->pkt);
>>> return 0;
>>> }
>>>
>>> diff --git a/libavdevice/alsa.h b/libavdevice/alsa.h
>>> index 1ed8c82199..07783c983a 100644
>>> --- a/libavdevice/alsa.h
>>> +++ b/libavdevice/alsa.h
>>> @@ -58,6 +58,7 @@ typedef struct AlsaData {
>>> void *reorder_buf;
>>> int reorder_buf_size; ///< in frames
>>> int64_t timestamp; ///< current timestamp, without latency applied.
>>> + AVPacket *pkt;
>>> } AlsaData;
>>>
>>> /**
>>> diff --git a/libavdevice/alsa_dec.c b/libavdevice/alsa_dec.c
>>> index 6d568737b3..88bf32d25f 100644
>>> --- a/libavdevice/alsa_dec.c
>>> +++ b/libavdevice/alsa_dec.c
>>> @@ -104,34 +104,36 @@ static int audio_read_packet(AVFormatContext *s1,
>> AVPacket *pkt)
>>> int64_t dts;
>>> snd_pcm_sframes_t delay = 0;
>>>
>>> - if (av_new_packet(pkt, s->period_size * s->frame_size) < 0) {
>>> - return AVERROR(EIO);
>>> + if (!s->pkt->data) {
>>> + int ret = av_new_packet(s->pkt, s->period_size * s->frame_size);
>>> + if (ret < 0)
>>> + return ret;
>>> + s->pkt->size = 0;
>>> }
>>>
>>> - while ((res = snd_pcm_readi(s->h, pkt->data, s->period_size)) < 0) {
>>> + do {
>>> + while ((res = snd_pcm_readi(s->h, s->pkt->data + s->pkt->size,
>> s->period_size - s->pkt->size / s->frame_size)) < 0) {
>>> if (res == -EAGAIN) {
>>> - av_packet_unref(pkt);
>>> -
>>> return AVERROR(EAGAIN);
>>> }
>>> + s->pkt->size = 0;
>>> if (ff_alsa_xrun_recover(s1, res) < 0) {
>>> av_log(s1, AV_LOG_ERROR, "ALSA read error: %s\n",
>>> snd_strerror(res));
>>> - av_packet_unref(pkt);
>>> -
>>> return AVERROR(EIO);
>>> }
>>> ff_timefilter_reset(s->timefilter);
>>> - }
>>> + }
>>> + s->pkt->size += res * s->frame_size;
>>> + } while (s->pkt->size < s->period_size * s->frame_size);
>>>
>>> + av_packet_move_ref(pkt, s->pkt);
>>> dts = av_gettime();
>>> snd_pcm_delay(s->h, &delay);
>>> dts -= av_rescale(delay + res, 1000000, s->sample_rate);
>>> pkt->pts = ff_timefilter_update(s->timefilter, dts, s->last_period);
>>> s->last_period = res;
>>>
>>> - pkt->size = res * s->frame_size;
>>> -
>>> return 0;
>>> }
>>>
>>> --
>>> 2.26.2
>>>
>>> _______________________________________________
>>> ffmpeg-devel mailing list
>>> ffmpeg-devel at ffmpeg.org
>>> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>>>
>>> To unsubscribe, visit link above, or email
>>> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
>> _______________________________________________
>> ffmpeg-devel mailing list
>> ffmpeg-devel at ffmpeg.org
>> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>>
>> To unsubscribe, visit link above, or email
>> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
More information about the ffmpeg-devel
mailing list