mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-27 10:40:34 +00:00
volume: skip controlled processing if we have no timestamp
This commit is contained in:
parent
9c94a1812f
commit
fa9c0cdf6e
1 changed files with 54 additions and 51 deletions
|
@ -718,7 +718,7 @@ volume_transform_ip (GstBaseTransform * base, GstBuffer * outbuf)
|
|||
GstAudioFilter *filter = GST_AUDIO_FILTER_CAST (base);
|
||||
GstVolume *self = GST_VOLUME (base);
|
||||
GstMapInfo map;
|
||||
GstControlBinding *mute_cb, *volume_cb;
|
||||
GstClockTime ts;
|
||||
|
||||
if (G_UNLIKELY (!self->negotiated))
|
||||
goto not_negotiated;
|
||||
|
@ -728,61 +728,64 @@ volume_transform_ip (GstBaseTransform * base, GstBuffer * outbuf)
|
|||
return GST_FLOW_OK;
|
||||
|
||||
gst_buffer_map (outbuf, &map, GST_MAP_READWRITE);
|
||||
ts = GST_BUFFER_TIMESTAMP (outbuf);
|
||||
ts = gst_segment_to_stream_time (&base->segment, GST_FORMAT_TIME, ts);
|
||||
|
||||
mute_cb = gst_object_get_control_binding (GST_OBJECT (self), "mute");
|
||||
volume_cb = gst_object_get_control_binding (GST_OBJECT (self), "volume");
|
||||
if (GST_CLOCK_TIME_IS_VALID (ts)) {
|
||||
GstControlBinding *mute_cb, *volume_cb;
|
||||
|
||||
if (mute_cb || (volume_cb && !self->current_mute)) {
|
||||
gint rate = GST_AUDIO_INFO_RATE (&filter->info);
|
||||
gint width = GST_AUDIO_FORMAT_INFO_WIDTH (filter->info.finfo) / 8;
|
||||
gint channels = GST_AUDIO_INFO_CHANNELS (&filter->info);
|
||||
guint nsamples = map.size / (width * channels);
|
||||
GstClockTime interval = gst_util_uint64_scale_int (1, GST_SECOND, rate);
|
||||
GstClockTime ts = GST_BUFFER_TIMESTAMP (outbuf);
|
||||
gboolean have_mutes = FALSE;
|
||||
gboolean have_volumes = FALSE;
|
||||
mute_cb = gst_object_get_control_binding (GST_OBJECT (self), "mute");
|
||||
volume_cb = gst_object_get_control_binding (GST_OBJECT (self), "volume");
|
||||
|
||||
ts = gst_segment_to_stream_time (&base->segment, GST_FORMAT_TIME, ts);
|
||||
if (mute_cb || (volume_cb && !self->current_mute)) {
|
||||
gint rate = GST_AUDIO_INFO_RATE (&filter->info);
|
||||
gint width = GST_AUDIO_FORMAT_INFO_WIDTH (filter->info.finfo) / 8;
|
||||
gint channels = GST_AUDIO_INFO_CHANNELS (&filter->info);
|
||||
guint nsamples = map.size / (width * channels);
|
||||
GstClockTime interval = gst_util_uint64_scale_int (1, GST_SECOND, rate);
|
||||
gboolean have_mutes = FALSE;
|
||||
gboolean have_volumes = FALSE;
|
||||
|
||||
if (self->mutes_count < nsamples && mute_cb) {
|
||||
self->mutes = g_realloc (self->mutes, sizeof (gboolean) * nsamples);
|
||||
self->mutes_count = nsamples;
|
||||
if (self->mutes_count < nsamples && mute_cb) {
|
||||
self->mutes = g_realloc (self->mutes, sizeof (gboolean) * nsamples);
|
||||
self->mutes_count = nsamples;
|
||||
}
|
||||
|
||||
if (self->volumes_count < nsamples) {
|
||||
self->volumes = g_realloc (self->volumes, sizeof (gdouble) * nsamples);
|
||||
self->volumes_count = nsamples;
|
||||
}
|
||||
|
||||
if (volume_cb) {
|
||||
have_volumes =
|
||||
gst_control_binding_get_value_array (volume_cb, ts, interval,
|
||||
nsamples, (gpointer) self->volumes);
|
||||
gst_object_replace ((GstObject **) & volume_cb, NULL);
|
||||
}
|
||||
if (!have_volumes) {
|
||||
volume_orc_memset_f64 (self->volumes, self->current_volume, nsamples);
|
||||
}
|
||||
|
||||
if (mute_cb) {
|
||||
have_mutes = gst_control_binding_get_value_array (mute_cb, ts, interval,
|
||||
nsamples, (gpointer) self->mutes);
|
||||
gst_object_replace ((GstObject **) & mute_cb, NULL);
|
||||
}
|
||||
if (have_mutes) {
|
||||
volume_orc_prepare_volumes (self->volumes, self->mutes, nsamples);
|
||||
} else {
|
||||
g_free (self->mutes);
|
||||
self->mutes = NULL;
|
||||
self->mutes_count = 0;
|
||||
}
|
||||
|
||||
self->process_controlled (self, map.data, self->volumes, channels,
|
||||
map.size);
|
||||
|
||||
goto done;
|
||||
} else if (volume_cb) {
|
||||
gst_object_unref (volume_cb);
|
||||
}
|
||||
|
||||
if (self->volumes_count < nsamples) {
|
||||
self->volumes = g_realloc (self->volumes, sizeof (gdouble) * nsamples);
|
||||
self->volumes_count = nsamples;
|
||||
}
|
||||
|
||||
if (volume_cb) {
|
||||
have_volumes =
|
||||
gst_control_binding_get_value_array (volume_cb, ts, interval,
|
||||
nsamples, (gpointer) self->volumes);
|
||||
gst_object_replace ((GstObject **) & volume_cb, NULL);
|
||||
}
|
||||
if (!have_volumes) {
|
||||
volume_orc_memset_f64 (self->volumes, self->current_volume, nsamples);
|
||||
}
|
||||
|
||||
if (mute_cb) {
|
||||
have_mutes = gst_control_binding_get_value_array (mute_cb, ts, interval,
|
||||
nsamples, (gpointer) self->mutes);
|
||||
gst_object_replace ((GstObject **) & mute_cb, NULL);
|
||||
}
|
||||
if (have_mutes) {
|
||||
volume_orc_prepare_volumes (self->volumes, self->mutes, nsamples);
|
||||
} else {
|
||||
g_free (self->mutes);
|
||||
self->mutes = NULL;
|
||||
self->mutes_count = 0;
|
||||
}
|
||||
|
||||
self->process_controlled (self, map.data, self->volumes, channels,
|
||||
map.size);
|
||||
|
||||
goto done;
|
||||
} else if (volume_cb) {
|
||||
gst_object_unref (volume_cb);
|
||||
}
|
||||
|
||||
if (self->current_volume == 0.0 || self->current_mute) {
|
||||
|
|
Loading…
Reference in a new issue