mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-17 03:35:21 +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);
|
||||
|
||||
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))) {
|
||||
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);
|
||||
|
||||
GST_LOG_OBJECT (filter,
|
||||
"message: ts %" GST_TIME_FORMAT ", num_frames %d",
|
||||
GST_TIME_ARGS (filter->message_ts), filter->num_frames);
|
||||
"message: ts %" GST_TIME_FORMAT ", duration %" GST_TIME_FORMAT
|
||||
", num_frames %d", GST_TIME_ARGS (filter->message_ts),
|
||||
GST_TIME_ARGS (duration), filter->num_frames);
|
||||
|
||||
for (i = 0; i < channels; ++i) {
|
||||
gdouble RMS;
|
||||
gdouble RMSdB, lastdB, decaydB;
|
||||
gdouble RMSdB, peakdB, decaydB;
|
||||
|
||||
RMS = sqrt (filter->CS[i] / filter->num_frames);
|
||||
GST_LOG_OBJECT (filter,
|
||||
|
@ -728,7 +733,7 @@ gst_level_post_message (GstLevel * filter)
|
|||
/* RMS values are calculated in amplitude, so 20 * log 10 */
|
||||
RMSdB = 20 * log10 (RMS + EPSILON);
|
||||
/* 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);
|
||||
|
||||
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 */
|
||||
GST_DEBUG_OBJECT (filter,
|
||||
"message: decay peak dB %f smaller than last peak dB %f, copying",
|
||||
decaydB, lastdB);
|
||||
decaydB, peakdB);
|
||||
filter->decay_peak[i] = filter->last_peak[i];
|
||||
}
|
||||
GST_LOG_OBJECT (filter,
|
||||
"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 */
|
||||
filter->CS[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;
|
||||
}
|
||||
|
|
|
@ -56,13 +56,13 @@ typedef struct _GstLevelClass GstLevelClass;
|
|||
struct _GstLevel {
|
||||
GstBaseTransform element;
|
||||
|
||||
/* properties */
|
||||
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;
|
||||
|
||||
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)
|
||||
* since last emit */
|
||||
gint interval_frames; /* after how many frame to sent a message */
|
||||
|
|
Loading…
Reference in a new issue