level: resync on discont
authorStefan Sauer <ensonic@users.sf.net>
Thu, 4 Apr 2013 20:48:45 +0000 (22:48 +0200)
committerStefan Sauer <ensonic@users.sf.net>
Thu, 4 Apr 2013 20:49:49 +0000 (22:49 +0200)
Drop pending data on discont and start a new cycle with a new base timestamp.
Cleanup some variables.

gst/level/gstlevel.c
gst/level/gstlevel.h

index bb21a8b..07b2b2e 100644 (file)
@@ -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;
 }
index e34987d..85cb1c8 100644 (file)
@@ -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 */