|
@@ -35,6 +35,8 @@ typedef struct PulseData {
|
|
|
const char *device;
|
|
|
pa_simple *pa;
|
|
|
int64_t timestamp;
|
|
|
+ int buffer_size;
|
|
|
+ int 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_size, av_clip64(bytes, 0, UINT32_MAX - 1));
|
|
|
+ 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_size)
|
|
|
+ attr.tlength = s->buffer_size;
|
|
|
+
|
|
|
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_size", "set buffer size in bytes", OFFSET(buffer_size), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, E },
|
|
|
+ { "buffer_duration", "set buffer duration in millisecs", OFFSET(buffer_duration), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, E },
|
|
|
{ NULL }
|
|
|
};
|
|
|
|