/*
 *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#ifndef WEBRTC_MODULES_VIDEO_CODING_EXP_FILTER_H_
#define WEBRTC_MODULES_VIDEO_CODING_EXP_FILTER_H_

namespace webrtc
{

/**********************/
/* ExpFilter class    */
/**********************/

class VCMExpFilter
{
public:
    VCMExpFilter(float alpha, float max = -1.0) : _alpha(alpha), _filtered(-1.0), _max(max) {}

    // Resets the filter to its initial state, and resets alpha to the given value
    //
    // Input:
    //          - alpha     : the new value of the filter factor base.
    void Reset(float alpha);

    // Applies the filter with the given exponent on the provided sample
    //
    // Input:
    //          - exp       : Exponent T in y(k) = alpha^T * y(k-1) + (1 - alpha^T) * x(k)
    //          - sample    : x(k) in the above filter equation
    float Apply(float exp, float sample);

    // Return current filtered value: y(k)
    //
    // Return value         : The current filter output
    float Value() const;

    // Change the filter factor base
    //
    // Input:
    //          - alpha     : The new filter factor base.
    void UpdateBase(float alpha);

private:
    float          _alpha;     // Filter factor base
    float          _filtered;  // Current filter output
    const float    _max;
}; // end of ExpFilter class

} // namespace webrtc

#endif // WEBRTC_MODULES_VIDEO_CODING_EXP_FILTER_H_
