/*
|
* Copyright (c) 2010-2019 Belledonne Communications SARL.
|
*
|
* This file is part of oRTP.
|
*
|
* This program is free software: you can redistribute it and/or modify
|
* it under the terms of the GNU General Public License as published by
|
* the Free Software Foundation, either version 3 of the License, or
|
* (at your option) any later version.
|
*
|
* This program is distributed in the hope that it will be useful,
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
* GNU General Public License for more details.
|
*
|
* You should have received a copy of the GNU General Public License
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
*/
|
|
#ifndef ORTP_UTILS_H
|
#define ORTP_UTILS_H
|
|
#include "ortp/port.h"
|
|
#ifdef __cplusplus
|
extern "C" {
|
#endif
|
|
/**
|
* Utility object to determine a maximum or minimum (but not both at the same
|
* time), of a signal during a sliding period of time.
|
*/
|
typedef struct _OrtpExtremum{
|
float current_extremum;
|
float last_stable;
|
uint64_t extremum_time;
|
int period;
|
}OrtpExtremum;
|
ORTP_PUBLIC void ortp_extremum_reset(OrtpExtremum *obj);
|
ORTP_PUBLIC void ortp_extremum_init(OrtpExtremum *obj, int period);
|
/**
|
* Record a new value for minimal.
|
* @return TRUE if extremum has changed or false otherwise.
|
*/
|
ORTP_PUBLIC bool_t ortp_extremum_record_min(OrtpExtremum *obj, uint64_t curtime, float value);
|
ORTP_PUBLIC bool_t ortp_extremum_record_max(OrtpExtremum *obj, uint64_t curtime, float value);
|
ORTP_PUBLIC float ortp_extremum_get_current(OrtpExtremum *obj);
|
/**
|
* Unlike ortp_extremum_get_current() which can be very fluctuating, ortp_extremum_get_previous() returns the extremum found for the previous period.
|
**/
|
ORTP_PUBLIC float ortp_extremum_get_previous(OrtpExtremum *obj);
|
|
/**
|
* Utility object to interpolate linear model based on captures with 0-mean noise.
|
* Based on the model (x, y) where y evolves depending on x with relation y = m*x+b,
|
* it will estimate unknown values b, m using given noisy measures xmes and ymes, eg real
|
* system is evolving with: y = m * x + b + noise.
|
* Note: If noise is NOT white, the residue will be absorbed by one of the estimators.
|
* It is an implementation of recursive least square algorithm, based on Kalman filter.
|
*/
|
typedef struct _OrtpKalmanRLS{
|
/* Unknown parameters to estimate */
|
double m, b;
|
/* Gain matrix, must not be modified */
|
double P[2][2];
|
/** Forgetting factor in [94, .999]. Used when unknown parameters vary in time. **/
|
double lambda;
|
}OrtpKalmanRLS;
|
|
ORTP_PUBLIC void ortp_kalman_rls_init(OrtpKalmanRLS *obj, double m0, double b0);
|
ORTP_PUBLIC void ortp_kalman_rls_record(OrtpKalmanRLS *obj, double xmes, double ymes);
|
|
|
typedef struct _OrtpBwEstimator{
|
float one_minus_alpha;
|
float inv_step;
|
float exp_constant;
|
struct timeval last_packet_recv;
|
float value;
|
}OrtpBwEstimator;
|
|
/**
|
* Utility object to compute a sliding exponential mean bitrate.
|
* @param obj the estimator structure to initialize
|
* @param alpha the weight of previous estimation (between 0 and 1)
|
* @param step a time constant in seconds representing the sampling period
|
**/
|
ORTP_PUBLIC void ortp_bw_estimator_init(OrtpBwEstimator *obj, float alpha, float step);
|
|
ORTP_PUBLIC void ortp_bw_estimator_packet_received (OrtpBwEstimator *obj, size_t bytes, const struct timeval *recv_time);
|
|
ORTP_PUBLIC float ortp_bw_estimator_get_value(OrtpBwEstimator *obj);
|
|
#ifdef __cplusplus
|
}
|
#endif
|
|
#endif
|