Loading apex/manifest.json +1 −1 Original line number Diff line number Diff line { "name": "com.android.media", "version": 339990000, "version": 330400000, "requireNativeLibs": [ "libandroid.so", "libbinder_ndk.so", Loading apex/manifest_codec.json +1 −1 Original line number Diff line number Diff line { "name": "com.android.media.swcodec", "version": 339990000, "version": 330400000, "requireNativeLibs": [ ":sphal" ] Loading media/libheadtracking/Android.bp +5 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,10 @@ cc_library { "StillnessDetector.cpp", "Twist.cpp", ], shared_libs: [ "libaudioutils", "libbase", ], export_include_dirs: [ "include", ], Loading @@ -39,6 +43,7 @@ cc_library { "SensorPoseProvider.cpp", ], shared_libs: [ "libbase", "libheadtracking", "liblog", "libsensor", Loading media/libheadtracking/HeadTrackingProcessor.cpp +37 −0 Original line number Diff line number Diff line Loading @@ -13,7 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ #include <inttypes.h> #include <android-base/stringprintf.h> #include <audio_utils/SimpleLog.h> #include "media/HeadTrackingProcessor.h" #include "ModeSelector.h" Loading @@ -26,6 +29,7 @@ namespace android { namespace media { namespace { using android::base::StringAppendF; using Eigen::Quaternionf; using Eigen::Vector3f; Loading Loading @@ -136,10 +140,12 @@ class HeadTrackingProcessorImpl : public HeadTrackingProcessor { if (recenterHead) { mHeadPoseBias.recenter(); mHeadStillnessDetector.reset(); mLocalLog.log("recenter Head"); } if (recenterScreen) { mScreenPoseBias.recenter(); mScreenStillnessDetector.reset(); mLocalLog.log("recenter Screen"); } // If a sensor being recentered is included in the current mode, apply rate limiting to Loading @@ -152,6 +158,35 @@ class HeadTrackingProcessorImpl : public HeadTrackingProcessor { } } std::string toString_l(unsigned level) const override { std::string prefixSpace(level, ' '); std::string ss = prefixSpace + "HeadTrackingProcessor:\n"; StringAppendF(&ss, "%smaxTranslationalVelocity: %f\n", prefixSpace.c_str(), mOptions.maxTranslationalVelocity); StringAppendF(&ss, "%smaxRotationalVelocity: %f\n", prefixSpace.c_str(), mOptions.maxRotationalVelocity); StringAppendF(&ss, "%sfreshnessTimeout: %" PRId64 "\n", prefixSpace.c_str(), mOptions.freshnessTimeout); StringAppendF(&ss, "%spredictionDuration: %f\n", prefixSpace.c_str(), mOptions.predictionDuration); StringAppendF(&ss, "%sautoRecenterWindowDuration: %" PRId64 "\n", prefixSpace.c_str(), mOptions.autoRecenterWindowDuration); StringAppendF(&ss, "%sautoRecenterTranslationalThreshold: %f\n", prefixSpace.c_str(), mOptions.autoRecenterTranslationalThreshold); StringAppendF(&ss, "%sautoRecenterRotationalThreshold: %f\n", prefixSpace.c_str(), mOptions.autoRecenterRotationalThreshold); StringAppendF(&ss, "%sscreenStillnessWindowDuration: %" PRId64 "\n", prefixSpace.c_str(), mOptions.screenStillnessWindowDuration); StringAppendF(&ss, "%sscreenStillnessTranslationalThreshold: %f\n", prefixSpace.c_str(), mOptions.screenStillnessTranslationalThreshold); StringAppendF(&ss, "%sscreenStillnessRotationalThreshold: %f\n", prefixSpace.c_str(), mOptions.screenStillnessRotationalThreshold); ss.append(prefixSpace + "ReCenterHistory:\n"); ss += mLocalLog.dumpToString((prefixSpace + " ").c_str(), mMaxLocalLogLine); // TODO: 233092747 add string from PoseRateLimiter/PoseRateLimiter etc... return ss; } private: const Options mOptions; float mPhysicalToLogicalAngle = 0; Loading @@ -168,6 +203,8 @@ class HeadTrackingProcessorImpl : public HeadTrackingProcessor { ScreenHeadFusion mScreenHeadFusion; ModeSelector mModeSelector; PoseRateLimiter mRateLimiter; static constexpr std::size_t mMaxLocalLogLine = 10; SimpleLog mLocalLog{mMaxLocalLogLine}; }; } // namespace Loading media/libheadtracking/SensorPoseProvider.cpp +53 −5 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ #include <map> #include <thread> #include <android-base/stringprintf.h> #include <android-base/thread_annotations.h> #include <log/log_main.h> #include <sensor/SensorEventQueue.h> Loading @@ -36,6 +37,8 @@ namespace android { namespace media { namespace { using android::base::StringAppendF; // Identifier to use for our event queue on the loop. // The number 19 is arbitrary, only useful if using multiple objects on the same looper. constexpr int kIdent = 19; Loading Loading @@ -153,6 +156,38 @@ class SensorPoseProviderImpl : public SensorPoseProvider { mEnabledSensorsExtra.erase(handle); } std::string toString(unsigned level) override { std::string prefixSpace(level, ' '); std::string ss = prefixSpace + "SensorPoseProvider:\n"; bool needUnlock = false; prefixSpace += " "; auto now = std::chrono::steady_clock::now(); if (!mMutex.try_lock_until(now + media::kSpatializerDumpSysTimeOutInSecond)) { ss.append(prefixSpace).append("try_lock failed, dumpsys below maybe INACCURATE!\n"); } else { needUnlock = true; } // Enabled sensor information StringAppendF(&ss, "%sSensors total number %zu:\n", prefixSpace.c_str(), mEnabledSensorsExtra.size()); for (auto sensor : mEnabledSensorsExtra) { StringAppendF(&ss, "%s[Handle: 0x%08x, Format %s", prefixSpace.c_str(), sensor.first, toString(sensor.second.format).c_str()); if (sensor.second.discontinuityCount.has_value()) { StringAppendF(&ss, ", DiscontinuityCount: %d", sensor.second.discontinuityCount.value()); } ss += "]\n"; } if (needUnlock) { mMutex.unlock(); } return ss; } private: enum DataFormat { kUnknown, Loading @@ -174,8 +209,7 @@ class SensorPoseProviderImpl : public SensorPoseProvider { sp<Looper> mLooper; Listener* const mListener; SensorManager* const mSensorManager; std::thread mThread; std::mutex mMutex; std::timed_mutex mMutex; std::map<int32_t, SensorEnableGuard> mEnabledSensors; std::map<int32_t, SensorExtra> mEnabledSensorsExtra GUARDED_BY(mMutex); sp<SensorEventQueue> mQueue; Loading @@ -187,12 +221,13 @@ class SensorPoseProviderImpl : public SensorPoseProvider { // the worker thread and that thread would notify, via the promise below whenever initialization // is finished, and whether it was successful. std::promise<bool> mInitPromise; std::thread mThread; SensorPoseProviderImpl(const char* packageName, Listener* listener) : mListener(listener), mSensorManager(&SensorManager::getInstanceForPackage(String16(packageName))), mThread([this] { threadFunc(); }) {} mSensorManager(&SensorManager::getInstanceForPackage(String16(packageName))) { mThread = std::thread([this] { threadFunc(); }); } void initFinished(bool success) { mInitPromise.set_value(success); } bool waitInitFinished() { return mInitPromise.get_future().get(); } Loading Loading @@ -345,6 +380,19 @@ class SensorPoseProviderImpl : public SensorPoseProvider { LOG_ALWAYS_FATAL("Unexpected sensor type: %d", static_cast<int>(format)); } } const std::string toString(DataFormat format) { switch (format) { case DataFormat::kUnknown: return "kUnknown"; case DataFormat::kQuaternion: return "kQuaternion"; case DataFormat::kRotationVectorsAndDiscontinuityCount: return "kRotationVectorsAndDiscontinuityCount"; default: return "NotImplemented"; } } }; } // namespace Loading Loading
apex/manifest.json +1 −1 Original line number Diff line number Diff line { "name": "com.android.media", "version": 339990000, "version": 330400000, "requireNativeLibs": [ "libandroid.so", "libbinder_ndk.so", Loading
apex/manifest_codec.json +1 −1 Original line number Diff line number Diff line { "name": "com.android.media.swcodec", "version": 339990000, "version": 330400000, "requireNativeLibs": [ ":sphal" ] Loading
media/libheadtracking/Android.bp +5 −0 Original line number Diff line number Diff line Loading @@ -22,6 +22,10 @@ cc_library { "StillnessDetector.cpp", "Twist.cpp", ], shared_libs: [ "libaudioutils", "libbase", ], export_include_dirs: [ "include", ], Loading @@ -39,6 +43,7 @@ cc_library { "SensorPoseProvider.cpp", ], shared_libs: [ "libbase", "libheadtracking", "liblog", "libsensor", Loading
media/libheadtracking/HeadTrackingProcessor.cpp +37 −0 Original line number Diff line number Diff line Loading @@ -13,7 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ #include <inttypes.h> #include <android-base/stringprintf.h> #include <audio_utils/SimpleLog.h> #include "media/HeadTrackingProcessor.h" #include "ModeSelector.h" Loading @@ -26,6 +29,7 @@ namespace android { namespace media { namespace { using android::base::StringAppendF; using Eigen::Quaternionf; using Eigen::Vector3f; Loading Loading @@ -136,10 +140,12 @@ class HeadTrackingProcessorImpl : public HeadTrackingProcessor { if (recenterHead) { mHeadPoseBias.recenter(); mHeadStillnessDetector.reset(); mLocalLog.log("recenter Head"); } if (recenterScreen) { mScreenPoseBias.recenter(); mScreenStillnessDetector.reset(); mLocalLog.log("recenter Screen"); } // If a sensor being recentered is included in the current mode, apply rate limiting to Loading @@ -152,6 +158,35 @@ class HeadTrackingProcessorImpl : public HeadTrackingProcessor { } } std::string toString_l(unsigned level) const override { std::string prefixSpace(level, ' '); std::string ss = prefixSpace + "HeadTrackingProcessor:\n"; StringAppendF(&ss, "%smaxTranslationalVelocity: %f\n", prefixSpace.c_str(), mOptions.maxTranslationalVelocity); StringAppendF(&ss, "%smaxRotationalVelocity: %f\n", prefixSpace.c_str(), mOptions.maxRotationalVelocity); StringAppendF(&ss, "%sfreshnessTimeout: %" PRId64 "\n", prefixSpace.c_str(), mOptions.freshnessTimeout); StringAppendF(&ss, "%spredictionDuration: %f\n", prefixSpace.c_str(), mOptions.predictionDuration); StringAppendF(&ss, "%sautoRecenterWindowDuration: %" PRId64 "\n", prefixSpace.c_str(), mOptions.autoRecenterWindowDuration); StringAppendF(&ss, "%sautoRecenterTranslationalThreshold: %f\n", prefixSpace.c_str(), mOptions.autoRecenterTranslationalThreshold); StringAppendF(&ss, "%sautoRecenterRotationalThreshold: %f\n", prefixSpace.c_str(), mOptions.autoRecenterRotationalThreshold); StringAppendF(&ss, "%sscreenStillnessWindowDuration: %" PRId64 "\n", prefixSpace.c_str(), mOptions.screenStillnessWindowDuration); StringAppendF(&ss, "%sscreenStillnessTranslationalThreshold: %f\n", prefixSpace.c_str(), mOptions.screenStillnessTranslationalThreshold); StringAppendF(&ss, "%sscreenStillnessRotationalThreshold: %f\n", prefixSpace.c_str(), mOptions.screenStillnessRotationalThreshold); ss.append(prefixSpace + "ReCenterHistory:\n"); ss += mLocalLog.dumpToString((prefixSpace + " ").c_str(), mMaxLocalLogLine); // TODO: 233092747 add string from PoseRateLimiter/PoseRateLimiter etc... return ss; } private: const Options mOptions; float mPhysicalToLogicalAngle = 0; Loading @@ -168,6 +203,8 @@ class HeadTrackingProcessorImpl : public HeadTrackingProcessor { ScreenHeadFusion mScreenHeadFusion; ModeSelector mModeSelector; PoseRateLimiter mRateLimiter; static constexpr std::size_t mMaxLocalLogLine = 10; SimpleLog mLocalLog{mMaxLocalLogLine}; }; } // namespace Loading
media/libheadtracking/SensorPoseProvider.cpp +53 −5 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ #include <map> #include <thread> #include <android-base/stringprintf.h> #include <android-base/thread_annotations.h> #include <log/log_main.h> #include <sensor/SensorEventQueue.h> Loading @@ -36,6 +37,8 @@ namespace android { namespace media { namespace { using android::base::StringAppendF; // Identifier to use for our event queue on the loop. // The number 19 is arbitrary, only useful if using multiple objects on the same looper. constexpr int kIdent = 19; Loading Loading @@ -153,6 +156,38 @@ class SensorPoseProviderImpl : public SensorPoseProvider { mEnabledSensorsExtra.erase(handle); } std::string toString(unsigned level) override { std::string prefixSpace(level, ' '); std::string ss = prefixSpace + "SensorPoseProvider:\n"; bool needUnlock = false; prefixSpace += " "; auto now = std::chrono::steady_clock::now(); if (!mMutex.try_lock_until(now + media::kSpatializerDumpSysTimeOutInSecond)) { ss.append(prefixSpace).append("try_lock failed, dumpsys below maybe INACCURATE!\n"); } else { needUnlock = true; } // Enabled sensor information StringAppendF(&ss, "%sSensors total number %zu:\n", prefixSpace.c_str(), mEnabledSensorsExtra.size()); for (auto sensor : mEnabledSensorsExtra) { StringAppendF(&ss, "%s[Handle: 0x%08x, Format %s", prefixSpace.c_str(), sensor.first, toString(sensor.second.format).c_str()); if (sensor.second.discontinuityCount.has_value()) { StringAppendF(&ss, ", DiscontinuityCount: %d", sensor.second.discontinuityCount.value()); } ss += "]\n"; } if (needUnlock) { mMutex.unlock(); } return ss; } private: enum DataFormat { kUnknown, Loading @@ -174,8 +209,7 @@ class SensorPoseProviderImpl : public SensorPoseProvider { sp<Looper> mLooper; Listener* const mListener; SensorManager* const mSensorManager; std::thread mThread; std::mutex mMutex; std::timed_mutex mMutex; std::map<int32_t, SensorEnableGuard> mEnabledSensors; std::map<int32_t, SensorExtra> mEnabledSensorsExtra GUARDED_BY(mMutex); sp<SensorEventQueue> mQueue; Loading @@ -187,12 +221,13 @@ class SensorPoseProviderImpl : public SensorPoseProvider { // the worker thread and that thread would notify, via the promise below whenever initialization // is finished, and whether it was successful. std::promise<bool> mInitPromise; std::thread mThread; SensorPoseProviderImpl(const char* packageName, Listener* listener) : mListener(listener), mSensorManager(&SensorManager::getInstanceForPackage(String16(packageName))), mThread([this] { threadFunc(); }) {} mSensorManager(&SensorManager::getInstanceForPackage(String16(packageName))) { mThread = std::thread([this] { threadFunc(); }); } void initFinished(bool success) { mInitPromise.set_value(success); } bool waitInitFinished() { return mInitPromise.get_future().get(); } Loading Loading @@ -345,6 +380,19 @@ class SensorPoseProviderImpl : public SensorPoseProvider { LOG_ALWAYS_FATAL("Unexpected sensor type: %d", static_cast<int>(format)); } } const std::string toString(DataFormat format) { switch (format) { case DataFormat::kUnknown: return "kUnknown"; case DataFormat::kQuaternion: return "kQuaternion"; case DataFormat::kRotationVectorsAndDiscontinuityCount: return "kRotationVectorsAndDiscontinuityCount"; default: return "NotImplemented"; } } }; } // namespace Loading