[FFmpeg-devel] [PATCH] lavd/pulse_audio_enc: add buffer length control options
Lukasz M
lukasz.m.luki at gmail.com
Tue Nov 26 23:06:49 CET 2013
On 24 November 2013 21:31, Stefano Sabatini <stefasab at gmail.com> wrote:
> On date Sunday 2013-11-24 02:35:33 +0100, Lukasz Marek encoded:
> > Add options to control the length of the PulseAudio buffer.
> >
> > Signed-off-by: Lukasz Marek <lukasz.m.luki at gmail.com>
> > ---
> > doc/outdevs.texi | 9 +++++++++
> > libavdevice/pulse_audio_enc.c | 17 +++++++++++++++++
> > libavdevice/version.h | 2 +-
> > 3 files changed, 27 insertions(+), 1 deletion(-)
> >
> > diff --git a/doc/outdevs.texi b/doc/outdevs.texi
> > index c737225..1255d30 100644
> > --- a/doc/outdevs.texi
> > +++ b/doc/outdevs.texi
> > @@ -164,6 +164,15 @@ by default it is set to the specified output name.
> > Specify the device to use. Default device is used when not provided.
> > List of output devices can be obtained with command @command{pactl list
> sinks}.
> >
> > + at item buffer_length
> > + at item buffer_duration
> > +Control the length and duration of the PulseAudio buffer. A small buffer
> > +gives more control, but requires more frequent updates.
>
> > +buffer_length specifies length in bytes while buffer_duration specifies
> length in milliseconds.
>
> @option{buffer_length} ... @option{buffer_duration} ...
>
> > +When both options are provided then the highest value is used (duration
> is recalculated to bytes using stream parameters).
> > +If they are set to 0 (which is default), the device will use the
> default PulseAudio duration value.
> > +By default PulseAudio set buffer duration to around 2 seconds.
> > +
> > @end table
> >
> > @subsection Examples
> > diff --git a/libavdevice/pulse_audio_enc.c
> b/libavdevice/pulse_audio_enc.c
> > index a2abc4a..192a046 100644
> > --- a/libavdevice/pulse_audio_enc.c
> > +++ b/libavdevice/pulse_audio_enc.c
> > @@ -35,6 +35,8 @@ typedef struct PulseData {
> > const char *device;
> > pa_simple *pa;
> > int64_t timestamp;
> > + unsigned buffer_length;
> > + unsigned buffer_duration;
> > } PulseData;
> >
> > static av_cold int pulse_write_header(AVFormatContext *h)
> > @@ -59,6 +61,19 @@ static av_cold int pulse_write_header(AVFormatContext
> *h)
> > stream_name = "Playback";
> > }
> >
> > + if (s->buffer_duration) {
> > + int64_t bytes = s->buffer_duration;
> > + bytes *= st->codec->channels * st->codec->sample_rate *
> > + av_get_bytes_per_sample(st->codec->sample_fmt);
> > + bytes /= 1000;
> > + attr.tlength = FFMAX(s->buffer_length, av_clip64(bytes, 0,
> 0xFFFFFFFE));
>
> 0xFFFFFFFE -> UINT32_MAX-1 ?
>
changed
> why -1?
>
PulseAudio will use its defaults when UINT32_MAX is passed.
>
> > + av_log(s, AV_LOG_DEBUG,
> > + "Buffer duration: %ums recalculated into %"PRId64" bytes
> buffer.\n",
> > + s->buffer_duration, bytes);
> > + av_log(s, AV_LOG_DEBUG, "Real buffer length is %u bytes\n",
> attr.tlength);
> > + } else if (s->buffer_length)
> > + attr.tlength = s->buffer_length;
> > +
> > ss.format = ff_codec_id_to_pulse_format(st->codec->codec_id);
> > ss.rate = st->codec->sample_rate;
> > ss.channels = st->codec->channels;
> > @@ -142,6 +157,8 @@ static const AVOption options[] = {
> > { "name", "set application name", OFFSET(name),
> AV_OPT_TYPE_STRING, {.str = LIBAVFORMAT_IDENT}, 0, 0, E },
> > { "stream_name", "set stream description", OFFSET(stream_name),
> AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, E },
> > { "device", "set device name", OFFSET(device),
> AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, E },
>
> > + { "buffer_length", "set buffer length in bytes",
> OFFSET(buffer_length), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 0xFFFFFFFE, E },
>
> nit++: buffer_size if probably more clear, since "length" is usually
> associated to a string length.
>
changed.
>
> Also 0xFFFFFFFE should be replaced by a symbolic constants for better
> readability. Also probably if you want to store an uint32_t you should
> probably use TYPE_INT64.
>
> > + { "buffer_duration", "set buffer length in msecs",
> OFFSET(buffer_duration), AV_OPT_TYPE_INT, {.i64 = 0}, 0, UINT_MAX, E },
>
> could overflow in case value > INT_MAX (in general with TYPE_INT you
> should use max <= INT_MAX).
>
I changed both max limits set to INT_MAX. It is more than enough for audio
buffer.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-lavd-pulse_audio_enc-add-buffer-size-control-options.patch
Type: text/x-patch
Size: 3975 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20131126/311eb0c1/attachment.bin>
More information about the ffmpeg-devel
mailing list