Loading media/libheadtracking/PosePredictor.cpp +15 −7 Original line number Diff line number Diff line Loading @@ -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)) Loading Loading @@ -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])); Loading media/libheadtracking/PosePredictor.h +13 −1 Original line number Diff line number Diff line Loading @@ -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; }; Loading @@ -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: ") Loading Loading @@ -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: ") Loading Loading @@ -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; Loading services/audiopolicy/service/SpatializerPoseController.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -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(); Loading Loading
media/libheadtracking/PosePredictor.cpp +15 −7 Original line number Diff line number Diff line Loading @@ -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)) Loading Loading @@ -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])); Loading
media/libheadtracking/PosePredictor.h +13 −1 Original line number Diff line number Diff line Loading @@ -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; }; Loading @@ -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: ") Loading Loading @@ -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: ") Loading Loading @@ -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; Loading
services/audiopolicy/service/SpatializerPoseController.cpp +2 −2 Original line number Diff line number Diff line Loading @@ -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(); Loading