blob: a040229e132d99884af59f3ed86064ad9c9a42ed [file] [edit]
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef UI_BASE_PREDICTION_ONE_EURO_FILTER_H_
#define UI_BASE_PREDICTION_ONE_EURO_FILTER_H_
#include "base/component_export.h"
#include "third_party/one_euro_filter/src/OneEuroFilter.h"
#include "ui/base/prediction/input_filter.h"
namespace ui {
// This class uses the 1€ filter from third party.
// See this page : http://cristal.univ-lille.fr/~casiez/1euro/
// to know how the filter works and how to tune it
class COMPONENT_EXPORT(UI_BASE_PREDICTION) OneEuroFilter : public InputFilter {
public:
OneEuroFilter(double mincutoff = kDefaultMincutoff,
double beta = kDefaultBeta);
OneEuroFilter(const OneEuroFilter&) = delete;
OneEuroFilter& operator=(const OneEuroFilter&) = delete;
~OneEuroFilter() override;
bool Filter(const base::TimeTicks& timestamp,
gfx::PointF* position) const override;
const char* GetName() const override;
// Default parameters values for the filter
static constexpr double kDefaultFrequency = 60;
static constexpr double kDefaultDcutoff = 1.0;
// kDefaultMincutoff & kDefaultBeta were chosen with experiment in
// March/May 2023, metrics you should consider tuning this is
// Event.Jank.PredictorJankyFramePercentage and related metrics.
static constexpr double kDefaultMincutoff = 4.7;
static constexpr double kDefaultBeta = 0.01;
// Names of the fieldtrials used to tune the filter
static constexpr char kParamBeta[] = "beta";
static constexpr char kParamMincutoff[] = "mincutoff";
private:
std::unique_ptr<::OneEuroFilter> x_filter_;
std::unique_ptr<::OneEuroFilter> y_filter_;
};
} // namespace ui
#endif // UI_BASE_PREDICTION_ONE_EURO_FILTER_H_