Home | History | Annotate | Download | only in server
      1 /* Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
      2  * Use of this source code is governed by a BSD-style license that can be
      3  * found in the LICENSE file.
      4  */
      5 
      6 #ifndef RATE_ESTIMATOR_H_
      7 #define RATE_ESTIMATOR_H_
      8 
      9 #include <time.h>
     10 
     11 
     12 /* Hold information to calculate linear least square from
     13  * several (x, y) samples.
     14  */
     15 struct least_square {
     16 	double sum_x;
     17 	double sum_y;
     18 	double sum_xy;
     19 	double sum_x2;
     20 	int num_samples;
     21 };
     22 
     23 /* An estimator holding the required information to determine the actual frame
     24  * rate of an audio device.
     25  * Members:
     26  *    last_level - Buffer level of the audio device at last check time.
     27  *    level_diff - Number of frames written to or read from audio device since
     28  *        the last check time. Rate estimator will use this change plus the
     29  *        difference of buffer level to derive the number of frames audio
     30  *        device has actually processed.
     31  *    window_start_ts - The start time of the current window.
     32  *    window_size - The size of the window.
     33  *    window_frames - The number of frames accumulated in current window.
     34  *    lsq - The helper used to estimate sample rate.
     35  */
     36 struct rate_estimator {
     37 	int last_level;
     38 	int level_diff;
     39 	struct timespec window_start_ts;
     40 	struct timespec window_size;
     41 	int window_frames;
     42 	struct least_square lsq;
     43 	double smooth_factor;
     44 	double estimated_rate;
     45 };
     46 
     47 /* Creates a rate estimator.
     48  * Args:
     49  *    rate - The initial value to estimate rate from.
     50  *    window_size - The window size of the rate estimator.
     51  *    smooth_factor - The coefficient used to calculate moving average
     52  *        from old estimated rate values.
     53  */
     54 struct rate_estimator *rate_estimator_create(unsigned int rate,
     55 					     const struct timespec *window_size,
     56 					     double smooth_factor);
     57 /* Destroy a rate estimator. */
     58 void rate_estimator_destroy(struct rate_estimator *re);
     59 
     60 /* Adds additional frames transmitted to/from audio device.
     61  * Args:
     62  *    re - The rate estimator.
     63  *    fr - The number of frames written to the device.  For input, this should
     64  *      be negative to indicate how many samples were read.
     65  */
     66 void rate_estimator_add_frames(struct rate_estimator *re, int fr);
     67 
     68 /* Checks the timestamp and buffer level difference since last check time,
     69  * and use them as a new sample to update the estimated rate.
     70  * Args:
     71  *    re - The rate estimator.
     72  *    level - The current buffer level of audio device.
     73  *    now - The time at which this function is called.
     74  * Returns:
     75  *    True if the estimated rate is updated and window is reset,
     76  *    otherwise false.
     77  */
     78 int rate_estimator_check(struct rate_estimator *re, int level,
     79 			 struct timespec *now);
     80 
     81 /* Gets the estimated rate. */
     82 double rate_estimator_get_rate(struct rate_estimator *re);
     83 
     84 /* Resets the estimated rate. */
     85 void rate_estimator_reset_rate(struct rate_estimator *re, unsigned int rate);
     86 
     87 #endif /* RATE_ESTIMATOR_H_ */
     88