mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-10-04 01:32:42 +00:00
audiolatency: Handle audio buffers with invalid duration
pipewiresrc outputs audio buffers without a valid duration, so we need to calculate it manually in that case. Upstream issue: https://gitlab.freedesktop.org/pipewire/pipewire/-/issues/1438 Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2419>
This commit is contained in:
parent
99636cd101
commit
0bde6bf750
1 changed files with 18 additions and 9 deletions
|
@ -292,7 +292,7 @@ buffer_has_wave (GstBuffer * buffer, GstPad * pad)
|
||||||
GstMapInfo minfo;
|
GstMapInfo minfo;
|
||||||
guint64 duration;
|
guint64 duration;
|
||||||
gint64 offset;
|
gint64 offset;
|
||||||
gint ii, channels, fsize;
|
gint ii, channels, fsize, rate;
|
||||||
gfloat *fdata;
|
gfloat *fdata;
|
||||||
gboolean ret;
|
gboolean ret;
|
||||||
GstMemory *memory = NULL;
|
GstMemory *memory = NULL;
|
||||||
|
@ -317,18 +317,26 @@ buffer_has_wave (GstBuffer * buffer, GstPad * pad)
|
||||||
|
|
||||||
caps = gst_pad_get_current_caps (pad);
|
caps = gst_pad_get_current_caps (pad);
|
||||||
s = gst_caps_get_structure (caps, 0);
|
s = gst_caps_get_structure (caps, 0);
|
||||||
ret = gst_structure_get_int (s, "channels", &channels);
|
/* channels and rate are required in caps, so will always be present */
|
||||||
|
gst_structure_get_int (s, "channels", &channels);
|
||||||
|
gst_structure_get_int (s, "rate", &rate);
|
||||||
gst_caps_unref (caps);
|
gst_caps_unref (caps);
|
||||||
if (!ret) {
|
|
||||||
GST_WARNING_OBJECT (pad, "unknown number of channels, can't detect wave");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
fdata = (gfloat *) minfo.data;
|
fdata = (gfloat *) minfo.data;
|
||||||
fsize = minfo.size / sizeof (gfloat);
|
fsize = minfo.size / sizeof (gfloat);
|
||||||
|
|
||||||
offset = -1;
|
offset = -1;
|
||||||
|
if (GST_BUFFER_DURATION_IS_VALID (buffer)) {
|
||||||
duration = GST_BUFFER_DURATION (buffer);
|
duration = GST_BUFFER_DURATION (buffer);
|
||||||
|
} else {
|
||||||
|
/* Cannot do a rounding-accurate duration calculation here because in the
|
||||||
|
* case when the duration is invalid, the pts might also be invalid */
|
||||||
|
duration = gst_util_uint64_scale_int_round (GST_SECOND, fsize / channels,
|
||||||
|
rate);
|
||||||
|
GST_LOG_OBJECT (pad, "buffer duration is invalid, calculated likely "
|
||||||
|
"duration as %" G_GINT64_FORMAT "us", duration / GST_USECOND);
|
||||||
|
}
|
||||||
|
|
||||||
/* Read only one channel */
|
/* Read only one channel */
|
||||||
for (ii = 1; ii < fsize; ii += channels) {
|
for (ii = 1; ii < fsize; ii += channels) {
|
||||||
if (ABS (fdata[ii]) > 0.7) {
|
if (ABS (fdata[ii]) > 0.7) {
|
||||||
|
@ -420,8 +428,9 @@ gst_audiolatency_sink_chain (GstPad * pad, GstObject * parent,
|
||||||
latency = (self->recv_pts - self->send_pts);
|
latency = (self->recv_pts - self->send_pts);
|
||||||
gst_audiolatency_set_latency (self, latency);
|
gst_audiolatency_set_latency (self, latency);
|
||||||
|
|
||||||
GST_INFO ("recv pts: %" G_GINT64_FORMAT "us, latency: %" G_GINT64_FORMAT "ms",
|
GST_INFO ("recv pts: %" G_GINT64_FORMAT "us, latency: %" G_GINT64_FORMAT
|
||||||
self->recv_pts, latency / 1000);
|
"ms, offset: %" G_GINT64_FORMAT "ms", self->recv_pts, latency / 1000,
|
||||||
|
offset / 1000);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
gst_buffer_unref (buffer);
|
gst_buffer_unref (buffer);
|
||||||
|
|
Loading…
Reference in a new issue