X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavdevice%2Falsa_dec.c;h=e93f31b1464468d430f9868005db8c0291863ba0;hb=f183d6555e714e00b41aec728feb8a731826cbdc;hp=c50ce715064ad20f21c7d3c41d1e3003c69fef3f;hpb=bec3b2041dcc20ab4b06a6b31d09130e1a7166c3;p=ffmpeg diff --git a/libavdevice/alsa_dec.c b/libavdevice/alsa_dec.c index c50ce715064..e93f31b1464 100644 --- a/libavdevice/alsa_dec.c +++ b/libavdevice/alsa_dec.c @@ -105,34 +105,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; } @@ -148,14 +150,14 @@ static const AVOption options[] = { }; static const AVClass alsa_demuxer_class = { - .class_name = "ALSA demuxer", + .class_name = "ALSA indev", .item_name = av_default_item_name, .option = options, .version = LIBAVUTIL_VERSION_INT, .category = AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT, }; -AVInputFormat ff_alsa_demuxer = { +const AVInputFormat ff_alsa_demuxer = { .name = "alsa", .long_name = NULL_IF_CONFIG_SMALL("ALSA audio input"), .priv_data_size = sizeof(AlsaData),