mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-19 20:46:22 +00:00
level: resync on discont
Drop pending data on discont and start a new cycle with a new base timestamp. Cleanup some variables.
This commit is contained in:
parent
3d335cb1ed
commit
b79f667ef4
2 changed files with 19 additions and 12 deletions
|
@ -607,6 +607,10 @@ gst_level_transform_ip (GstBaseTransform * trans, GstBuffer * in)
|
||||||
|
|
||||||
g_return_val_if_fail (num_int_samples % channels == 0, GST_FLOW_ERROR);
|
g_return_val_if_fail (num_int_samples % channels == 0, GST_FLOW_ERROR);
|
||||||
|
|
||||||
|
if (GST_BUFFER_FLAG_IS_SET (in, GST_BUFFER_FLAG_DISCONT)) {
|
||||||
|
filter->message_ts = GST_BUFFER_TIMESTAMP (in);
|
||||||
|
filter->num_frames = 0;
|
||||||
|
}
|
||||||
if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (filter->message_ts))) {
|
if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (filter->message_ts))) {
|
||||||
filter->message_ts = GST_BUFFER_TIMESTAMP (in);
|
filter->message_ts = GST_BUFFER_TIMESTAMP (in);
|
||||||
}
|
}
|
||||||
|
@ -711,12 +715,13 @@ gst_level_post_message (GstLevel * filter)
|
||||||
m = gst_level_message_new (filter, filter->message_ts, duration);
|
m = gst_level_message_new (filter, filter->message_ts, duration);
|
||||||
|
|
||||||
GST_LOG_OBJECT (filter,
|
GST_LOG_OBJECT (filter,
|
||||||
"message: ts %" GST_TIME_FORMAT ", num_frames %d",
|
"message: ts %" GST_TIME_FORMAT ", duration %" GST_TIME_FORMAT
|
||||||
GST_TIME_ARGS (filter->message_ts), filter->num_frames);
|
", num_frames %d", GST_TIME_ARGS (filter->message_ts),
|
||||||
|
GST_TIME_ARGS (duration), filter->num_frames);
|
||||||
|
|
||||||
for (i = 0; i < channels; ++i) {
|
for (i = 0; i < channels; ++i) {
|
||||||
gdouble RMS;
|
gdouble RMS;
|
||||||
gdouble RMSdB, lastdB, decaydB;
|
gdouble RMSdB, peakdB, decaydB;
|
||||||
|
|
||||||
RMS = sqrt (filter->CS[i] / filter->num_frames);
|
RMS = sqrt (filter->CS[i] / filter->num_frames);
|
||||||
GST_LOG_OBJECT (filter,
|
GST_LOG_OBJECT (filter,
|
||||||
|
@ -728,7 +733,7 @@ gst_level_post_message (GstLevel * filter)
|
||||||
/* RMS values are calculated in amplitude, so 20 * log 10 */
|
/* RMS values are calculated in amplitude, so 20 * log 10 */
|
||||||
RMSdB = 20 * log10 (RMS + EPSILON);
|
RMSdB = 20 * log10 (RMS + EPSILON);
|
||||||
/* peak values are square sums, ie. power, so 10 * log 10 */
|
/* peak values are square sums, ie. power, so 10 * log 10 */
|
||||||
lastdB = 10 * log10 (filter->last_peak[i] + EPSILON);
|
peakdB = 10 * log10 (filter->last_peak[i] + EPSILON);
|
||||||
decaydB = 10 * log10 (filter->decay_peak[i] + EPSILON);
|
decaydB = 10 * log10 (filter->decay_peak[i] + EPSILON);
|
||||||
|
|
||||||
if (filter->decay_peak[i] < filter->last_peak[i]) {
|
if (filter->decay_peak[i] < filter->last_peak[i]) {
|
||||||
|
@ -736,21 +741,23 @@ gst_level_post_message (GstLevel * filter)
|
||||||
* the last peak is between decay_peak and decay_peak_base */
|
* the last peak is between decay_peak and decay_peak_base */
|
||||||
GST_DEBUG_OBJECT (filter,
|
GST_DEBUG_OBJECT (filter,
|
||||||
"message: decay peak dB %f smaller than last peak dB %f, copying",
|
"message: decay peak dB %f smaller than last peak dB %f, copying",
|
||||||
decaydB, lastdB);
|
decaydB, peakdB);
|
||||||
filter->decay_peak[i] = filter->last_peak[i];
|
filter->decay_peak[i] = filter->last_peak[i];
|
||||||
}
|
}
|
||||||
GST_LOG_OBJECT (filter,
|
GST_LOG_OBJECT (filter,
|
||||||
"message: RMS %f dB, peak %f dB, decay %f dB",
|
"message: RMS %f dB, peak %f dB, decay %f dB",
|
||||||
RMSdB, lastdB, decaydB);
|
RMSdB, peakdB, decaydB);
|
||||||
|
|
||||||
gst_level_message_append_channel (m, RMSdB, lastdB, decaydB);
|
gst_level_message_append_channel (m, RMSdB, peakdB, decaydB);
|
||||||
|
|
||||||
/* reset cumulative and normal peak */
|
/* reset cumulative and normal peak */
|
||||||
filter->CS[i] = 0.0;
|
filter->CS[i] = 0.0;
|
||||||
filter->last_peak[i] = 0.0;
|
filter->last_peak[i] = 0.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
gst_element_post_message (GST_ELEMENT (filter), m);
|
if (filter->post_messages)
|
||||||
|
gst_element_post_message (GST_ELEMENT (filter), m);
|
||||||
|
|
||||||
}
|
}
|
||||||
filter->num_frames = 0;
|
filter->num_frames = 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,13 +56,13 @@ typedef struct _GstLevelClass GstLevelClass;
|
||||||
struct _GstLevel {
|
struct _GstLevel {
|
||||||
GstBaseTransform element;
|
GstBaseTransform element;
|
||||||
|
|
||||||
|
/* properties */
|
||||||
gboolean post_messages; /* whether or not to post messages */
|
gboolean post_messages; /* whether or not to post messages */
|
||||||
guint64 interval; /* how many seconds between emits */
|
guint64 interval; /* how many nanoseconds between emits */
|
||||||
|
gdouble decay_peak_ttl; /* time to live for peak in nanoseconds */
|
||||||
|
gdouble decay_peak_falloff; /* falloff in dB/sec */
|
||||||
|
|
||||||
GstAudioInfo info;
|
GstAudioInfo info;
|
||||||
|
|
||||||
gdouble decay_peak_ttl; /* time to live for peak in seconds */
|
|
||||||
gdouble decay_peak_falloff; /* falloff in dB/sec */
|
|
||||||
gint num_frames; /* frame count (1 sample per channel)
|
gint num_frames; /* frame count (1 sample per channel)
|
||||||
* since last emit */
|
* since last emit */
|
||||||
gint interval_frames; /* after how many frame to sent a message */
|
gint interval_frames; /* after how many frame to sent a message */
|
||||||
|
|
Loading…
Reference in a new issue