[FFmpeg-devel] [PATCH 3/3] lavd/openal: return EAGAIN if no samples are available

Marton Balint cus at passwd.hu
Fri Sep 30 21:27:16 EEST 2016


On Fri, 30 Sep 2016, Nicolas George wrote:

> Le nonidi 9 vendémiaire, an CCXXV, Marton Balint a écrit :
>> Signed-off-by: Marton Balint <cus at passwd.hu>
>> ---
>>  libavdevice/openal-dec.c | 3 +++
>>  1 file changed, 3 insertions(+)
>> 
>> diff --git a/libavdevice/openal-dec.c b/libavdevice/openal-dec.c
>> index 0647952..8773944 100644
>> --- a/libavdevice/openal-dec.c
>> +++ b/libavdevice/openal-dec.c
>> @@ -191,6 +191,9 @@ static int read_packet(AVFormatContext* ctx, AVPacket *pkt)
>>      alcGetIntegerv(ad->device, ALC_CAPTURE_SAMPLES, (ALCsizei) sizeof(ALCint), &nb_samples);
>>      if (error = al_get_error(ad->device, &error_msg)) goto fail;
>> 
>> +    if (nb_samples == 0)
>> +        return AVERROR(EAGAIN);
>> +
>
> EAGAIN is only acceptable in non-blocking mode. You may be able to use REDO
> (I do not remember the exact name), but beware you are not creating a
> busy-wait loop.
>

Alsa dev and v4l2 seem to work this way regardless if non blocking mode is 
set or not, and ffmpeg.c also waits if it encounters AVERROR(EAGAIN) in 
av_read_frame. So AVERROR(EAGAIN) return value seems to be consistent with 
existing code, which assumes that if EAGAIN is returned from 
av_read_frame, wait a bit.

If what you wrote is the way to move forward, then at least send a 
documentation patch, to establish this av_read_frame return 
value behaviour.

Regards,
Marton


More information about the ffmpeg-devel mailing list