Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 428aba1d authored by Andy Hung's avatar Andy Hung Committed by Automerger Merge Worker
Browse files

Merge "Spatializer: Tuning for least squares prediction" into tm-qpr-dev am:...

Merge "Spatializer: Tuning for least squares prediction" into tm-qpr-dev am: b404bc9e am: 71f310f1 am: 0d687080

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/av/+/22216373



Change-Id: I6d37bb16faac68259eeae237268fd8b26ca367e8
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents cf89c2e2 0d687080
Loading
Loading
Loading
Loading
+15 −7
Original line number Diff line number Diff line
@@ -91,20 +91,23 @@ std::string LeastSquaresPredictor::toString(size_t index) const {

// Formatting
static inline std::vector<size_t> createDelimiterIdx(size_t predictors, size_t lookaheads) {
    if (predictors == 0) return {};
    --predictors;
    std::vector<size_t> delimiterIdx(predictors);
    for (size_t i = 0; i < predictors; ++i) {
        delimiterIdx[i] = (i + 1) * lookaheads;
    if (lookaheads == 0) return {};
    --lookaheads;
    std::vector<size_t> delimiterIdx(lookaheads);
    for (size_t i = 0; i < lookaheads; ++i) {
        delimiterIdx[i] = (i + 1) * predictors;
    }
    return delimiterIdx;
}

PosePredictor::PosePredictor()
    : mPredictors{  // must match switch in getCurrentPredictor()
    : mPredictors{
            // First predictors must match switch in getCurrentPredictor()
            std::make_shared<LastPredictor>(),
            std::make_shared<TwistPredictor>(),
            std::make_shared<LeastSquaresPredictor>(),
            // After this, can place additional predictors here for comparison such as
            // std::make_shared<LeastSquaresPredictor>(0.25),
        }
    , mLookaheadMs(kLookAheadMs.begin(), kLookAheadMs.end())
    , mVerifiers(std::size(mLookaheadMs) * std::size(mPredictors))
@@ -195,7 +198,12 @@ std::string PosePredictor::toString(size_t index) const {
    if constexpr (kEnableVerification) {
        // dump verification
        ss.append(prefixSpace)
            .append(" Prediction abs error (L1) degrees [ type (last twist least-squares) x ( ");
            .append(" Prediction abs error (L1) degrees [ type (");
        for (size_t i = 0; i < mPredictors.size(); ++i) {
            if (i > 0) ss.append(" , ");
            ss.append(mPredictors[i]->name());
        }
        ss.append(" ) x ( ");
        for (size_t i = 0; i < mLookaheadMs.size(); ++i) {
            if (i > 0) ss.append(" : ");
            ss.append(std::to_string(mLookaheadMs[i]));
+13 −1
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ public:
    virtual void add(int64_t atNs, const Pose3f& pose, const Twist3f& twist) = 0;
    virtual Pose3f predict(int64_t atNs) const = 0;
    virtual void reset() = 0;
    virtual std::string name() const = 0;
    virtual std::string toString(size_t index) const = 0;
};

@@ -57,6 +58,10 @@ public:
        mLastPose = {};
    }

    std::string name() const override {
        return "LAST";
    }

    std::string toString(size_t index) const override {
        std::string s(index, ' ');
        s.append("LastPredictor using last pose: ")
@@ -92,6 +97,10 @@ public:
        mLastTwist = {};
    }

    std::string name() const override {
        return "TWIST";
    }

    std::string toString(size_t index) const override {
        std::string s(index, ' ');
        s.append("TwistPredictor using last pose: ")
@@ -130,13 +139,16 @@ public:
    void add(int64_t atNs, const Pose3f& pose, const Twist3f& twist) override;
    Pose3f predict(int64_t atNs) const override;
    void reset() override;
    std::string name() const override {
        return "LEAST_SQUARES(" + std::to_string(mAlpha) + ")";
    }
    std::string toString(size_t index) const override;

private:
    const double mAlpha;
    int64_t mLastAtNs{};
    Pose3f mLastPose;
    static constexpr double kDefaultAlphaEstimator = 0.5;
    static constexpr double kDefaultAlphaEstimator = 0.2;
    static constexpr size_t kMinimumSamplesForPrediction = 4;
    audio_utils::LinearLeastSquaresFit<double> mRw;
    audio_utils::LinearLeastSquaresFit<double> mRx;
+2 −2
Original line number Diff line number Diff line
@@ -108,8 +108,8 @@ SpatializerPoseController::SpatializerPoseController(Listener* listener,
              .freshnessTimeout = Ticks(kFreshnessTimeout).count(),
              .predictionDuration = []() -> float {
                  const int duration_ms =
                          property_get_int32("audio.spatializer.prediction_duration_ms", 0);
                  if (duration_ms > 0) {
                          property_get_int32("audio.spatializer.prediction_duration_ms", -1);
                  if (duration_ms >= 0) {
                      return duration_ms * 1'000'000LL;
                  } else {
                      return Ticks(kPredictionDuration).count();