/* 
 | 
 * 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 
 |