[FFmpeg-cvslog] avdevice/pulse_audio_dec: reduce default fragment size

Marton Balint git at videolan.org
Thu Jun 16 22:37:40 EEST 2022


ffmpeg | branch: master | Marton Balint <cus at passwd.hu> | Sat Jun 11 19:59:32 2022 +0200| [b67ca8a7a5f443de5eacac9ed4c5d94dfe685a5b] | committer: Marton Balint

avdevice/pulse_audio_dec: reduce default fragment size

Reduces default fragment size from the pulse audio default of 2 sec to 50 ms.
This also has an effect on the size of the returned frames, which will be
around 50 ms as well, making timestamps more accurate.

This should fix the regression in ticket #9776.

Pulseaudio timestamps for monitor sources are still pretty inaccurate for me,
but I don't see how else should we query latencies from the library.

Signed-off-by: Marton Balint <cus at passwd.hu>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=b67ca8a7a5f443de5eacac9ed4c5d94dfe685a5b
---

 doc/indevs.texi               | 4 ++--
 libavdevice/pulse_audio_dec.c | 7 ++++++-
 2 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/doc/indevs.texi b/doc/indevs.texi
index 9d8020311a..1141da26d1 100644
--- a/doc/indevs.texi
+++ b/doc/indevs.texi
@@ -1292,8 +1292,8 @@ Specify the channels in use, by default 2 (stereo) is set.
 Specify the number of bytes per frame, by default it is set to 1024.
 
 @item fragment_size
-Specify the minimal buffering fragment in PulseAudio, it will affect the
-audio latency. By default it is unset.
+Specify the size in bytes of the minimal buffering fragment in PulseAudio, it
+will affect the audio latency. By default it is set to 50 ms amount of data.
 
 @item wallclock
 Set the initial PTS using the current time. Default is 1.
diff --git a/libavdevice/pulse_audio_dec.c b/libavdevice/pulse_audio_dec.c
index ed094fd250..2355b91776 100644
--- a/libavdevice/pulse_audio_dec.c
+++ b/libavdevice/pulse_audio_dec.c
@@ -162,7 +162,12 @@ static av_cold int pulse_read_header(AVFormatContext *s)
         return AVERROR(ENOMEM);
     }
 
-    attr.fragsize = pd->fragment_size;
+    if (pd->fragment_size == -1) {
+        // 50 ms fragments/latency by default seem good enough
+        attr.fragsize = pa_frame_size(&ss) * (pd->sample_rate / 20);
+    } else {
+        attr.fragsize = pd->fragment_size;
+    }
 
     if (s->url[0] != '\0' && strcmp(s->url, "default"))
         device = s->url;



More information about the ffmpeg-cvslog mailing list