From 736691e3ec2e3c4715782fc5067bd3ca1ae342cc Mon Sep 17 00:00:00 2001 From: David Rowe Date: Sat, 25 Apr 2015 11:33:32 -0700 Subject: [PATCH] Refactor face tracking FPS calculation --- interface/src/devices/DdeFaceTracker.cpp | 43 +++++++----------------- interface/src/devices/DdeFaceTracker.h | 6 ---- interface/src/devices/FaceTracker.cpp | 37 +++++++++++++++++++- interface/src/devices/FaceTracker.h | 15 ++++++++- interface/src/devices/Faceshift.cpp | 32 ++++-------------- interface/src/devices/Faceshift.h | 5 --- 6 files changed, 69 insertions(+), 69 deletions(-) diff --git a/interface/src/devices/DdeFaceTracker.cpp b/interface/src/devices/DdeFaceTracker.cpp index 8f1b070c02..ef9ab6fdc6 100644 --- a/interface/src/devices/DdeFaceTracker.cpp +++ b/interface/src/devices/DdeFaceTracker.cpp @@ -136,9 +136,6 @@ struct Packet { const float STARTING_DDE_MESSAGE_TIME = 0.033f; -const int FPS_TIMER_DELAY = 2000; // ms -const int FPS_TIMER_DURATION = 2000; // ms - DdeFaceTracker::DdeFaceTracker() : DdeFaceTracker(QHostAddress::Any, DDE_SERVER_PORT, DDE_CONTROL_PORT) { @@ -171,9 +168,7 @@ DdeFaceTracker::DdeFaceTracker(const QHostAddress& host, quint16 serverPort, qui _lastLeftEyeBlink(0.0f), _filteredLeftEyeBlink(0.0f), _lastRightEyeBlink(0.0f), - _filteredRightEyeBlink(0.0f), - _isCalculatingFPS(false), - _frameCount(0) + _filteredRightEyeBlink(0.0f) { _coefficients.resize(NUM_FACESHIFT_BLENDSHAPES); @@ -228,19 +223,18 @@ void DdeFaceTracker::processFinished(int exitCode, QProcess::ExitStatus exitStat } void DdeFaceTracker::reset() { - _reset = true; + if (_udpSocket.state() == QAbstractSocket::BoundState) { + _reset = true; - qDebug() << "[Info] Reset DDE Tracking"; - const char* DDE_RESET_COMMAND = "reset"; - _udpSocket.writeDatagram(DDE_RESET_COMMAND, DDE_SERVER_ADDR, _controlPort); + qCDebug(interfaceapp) << "DDE Face Tracker: Reset"; - // Log camera FPS after a reset - if (!_isCalculatingFPS) { - QTimer::singleShot(FPS_TIMER_DELAY, this, SLOT(startFPSTimer())); - _isCalculatingFPS = true; + const char* DDE_RESET_COMMAND = "reset"; + _udpSocket.writeDatagram(DDE_RESET_COMMAND, DDE_SERVER_ADDR, _controlPort); + + FaceTracker::reset(); + + _reset = true; } - - _reset = true; } bool DdeFaceTracker::isActive() const { @@ -419,23 +413,10 @@ void DdeFaceTracker::decodePacket(const QByteArray& buffer) { } _lastMessageReceived = usecsNow; - // Count frames if timing - if (_isCalculatingFPS) { - _frameCount++; - } - + FaceTracker::countFrame(); + } else { qCDebug(interfaceapp) << "[Error] DDE Face Tracker Decode Error"; } _lastReceiveTimestamp = usecTimestampNow(); } - -void DdeFaceTracker::startFPSTimer() { - _frameCount = 0; - QTimer::singleShot(FPS_TIMER_DURATION, this, SLOT(finishFPSTimer())); -} - -void DdeFaceTracker::finishFPSTimer() { - qDebug() << "[Info] DDE FPS =" << (float)_frameCount / ((float)FPS_TIMER_DURATION / 1000.0f); - _isCalculatingFPS = false; -} diff --git a/interface/src/devices/DdeFaceTracker.h b/interface/src/devices/DdeFaceTracker.h index 7cca1e31be..302150773e 100644 --- a/interface/src/devices/DdeFaceTracker.h +++ b/interface/src/devices/DdeFaceTracker.h @@ -59,9 +59,6 @@ private slots: void readPendingDatagrams(); void socketStateChanged(QAbstractSocket::SocketState socketState); - void startFPSTimer(); - void finishFPSTimer(); - private: DdeFaceTracker(); DdeFaceTracker(const QHostAddress& host, quint16 serverPort, quint16 controlPort); @@ -111,9 +108,6 @@ private: float _filteredLeftEyeBlink; float _lastRightEyeBlink; float _filteredRightEyeBlink; - - bool _isCalculatingFPS; - int _frameCount; }; #endif // hifi_DdeFaceTracker_h \ No newline at end of file diff --git a/interface/src/devices/FaceTracker.cpp b/interface/src/devices/FaceTracker.cpp index 7c1c757ec1..0d40249c26 100644 --- a/interface/src/devices/FaceTracker.cpp +++ b/interface/src/devices/FaceTracker.cpp @@ -9,9 +9,21 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +#include + #include #include "FaceTracker.h" +#include "InterfaceLogging.h" + +const int FPS_TIMER_DELAY = 2000; // ms +const int FPS_TIMER_DURATION = 2000; // ms + +FaceTracker::FaceTracker() : + _isCalculatingFPS(false), + _frameCount(0) +{ +} inline float FaceTracker::getBlendshapeCoefficient(int index) const { return isValidBlendshapeIndex(index) ? glm::mix(0.0f, _blendshapeCoefficients[index], getFadeCoefficient()) @@ -65,4 +77,27 @@ void FaceTracker::update(float deltaTime) { _relaxationStatus = glm::clamp(_relaxationStatus - deltaTime / RELAXATION_TIME, 0.0f, 1.0f); _fadeCoefficient = std::exp(-(1.0f - _relaxationStatus) * INVERSE_AT_EPSILON); } -} \ No newline at end of file +} + +void FaceTracker::reset() { + if (isActive() && !_isCalculatingFPS) { + QTimer::singleShot(FPS_TIMER_DELAY, this, SLOT(startFPSTimer())); + _isCalculatingFPS = true; + } +} + +void FaceTracker::startFPSTimer() { + _frameCount = 0; + QTimer::singleShot(FPS_TIMER_DURATION, this, SLOT(finishFPSTimer())); +} + +void FaceTracker::countFrame() { + if (_isCalculatingFPS) { + _frameCount++; + } +} + +void FaceTracker::finishFPSTimer() { + qCDebug(interfaceapp) << "Face tracker FPS =" << (float)_frameCount / ((float)FPS_TIMER_DURATION / 1000.0f); + _isCalculatingFPS = false; +} diff --git a/interface/src/devices/FaceTracker.h b/interface/src/devices/FaceTracker.h index db6fdd74b9..a0a434ee9e 100644 --- a/interface/src/devices/FaceTracker.h +++ b/interface/src/devices/FaceTracker.h @@ -28,7 +28,7 @@ public: virtual void init() {} virtual void update(float deltaTime); - virtual void reset() {} + virtual void reset(); float getFadeCoefficient() const; @@ -44,6 +44,9 @@ public: float getBlendshapeCoefficient(int index) const; protected: + FaceTracker(); + virtual ~FaceTracker() {}; + glm::vec3 _headTranslation = glm::vec3(0.0f); glm::quat _headRotation = glm::quat(); float _estimatedEyePitch = 0.0f; @@ -52,6 +55,16 @@ protected: float _relaxationStatus = 0.0f; // Between 0.0f and 1.0f float _fadeCoefficient = 0.0f; // Between 0.0f and 1.0f + + void countFrame(); + +private slots: + void startFPSTimer(); + void finishFPSTimer(); + +private: + bool _isCalculatingFPS; + int _frameCount; }; #endif // hifi_FaceTracker_h diff --git a/interface/src/devices/Faceshift.cpp b/interface/src/devices/Faceshift.cpp index a2c1cd693a..a0af6c7e2f 100644 --- a/interface/src/devices/Faceshift.cpp +++ b/interface/src/devices/Faceshift.cpp @@ -30,14 +30,9 @@ const QString DEFAULT_FACESHIFT_HOSTNAME = "localhost"; const quint16 FACESHIFT_PORT = 33433; const float DEFAULT_FACESHIFT_EYE_DEFLECTION = 0.25f; -const int FPS_TIMER_DELAY = 2000; // ms -const int FPS_TIMER_DURATION = 2000; // ms - Faceshift::Faceshift() : _eyeDeflection("faceshiftEyeDeflection", DEFAULT_FACESHIFT_EYE_DEFLECTION), - _hostname("faceshiftHostname", DEFAULT_FACESHIFT_HOSTNAME), - _isCalculatingFPS(false), - _frameCount(0) + _hostname("faceshiftHostname", DEFAULT_FACESHIFT_HOSTNAME) { #ifdef HAVE_FACESHIFT connect(&_tcpSocket, SIGNAL(connected()), SLOT(noteConnected())); @@ -83,15 +78,13 @@ void Faceshift::update(float deltaTime) { void Faceshift::reset() { if (_tcpSocket.state() == QAbstractSocket::ConnectedState) { + qCDebug(interfaceapp, "Faceshift: Reset"); + + FaceTracker::reset(); + string message; fsBinaryStream::encode_message(message, fsMsgCalibrateNeutral()); send(message); - - // Log camera FPS after a reset - if (!_isCalculatingFPS) { - QTimer::singleShot(FPS_TIMER_DELAY, this, SLOT(startFPSTimer())); - _isCalculatingFPS = true; - } } _longTermAverageInitialized = false; } @@ -294,10 +287,8 @@ void Faceshift::receive(const QByteArray& buffer) { } } #endif - // Count frames if timing - if (_isCalculatingFPS) { - _frameCount++; - } + + FaceTracker::countFrame(); } void Faceshift::setEyeDeflection(float faceshiftEyeDeflection) { @@ -308,12 +299,3 @@ void Faceshift::setHostname(const QString& hostname) { _hostname.set(hostname); } -void Faceshift::startFPSTimer() { - _frameCount = 0; - QTimer::singleShot(FPS_TIMER_DURATION, this, SLOT(finishFPSTimer())); -} - -void Faceshift::finishFPSTimer() { - qCDebug(interfaceapp) << "Faceshift: FPS =" << (float)_frameCount / ((float)FPS_TIMER_DURATION / 1000.0f); - _isCalculatingFPS = false; -} diff --git a/interface/src/devices/Faceshift.h b/interface/src/devices/Faceshift.h index 18d88e6fe9..994a7586ae 100644 --- a/interface/src/devices/Faceshift.h +++ b/interface/src/devices/Faceshift.h @@ -95,8 +95,6 @@ private slots: void noteError(QAbstractSocket::SocketError error); void readPendingDatagrams(); void readFromSocket(); - void startFPSTimer(); - void finishFPSTimer(); private: Faceshift(); @@ -154,9 +152,6 @@ private: int _mouthSmileRightIndex = 29; int _jawOpenIndex = 21; - - bool _isCalculatingFPS; - int _frameCount; }; #endif // hifi_Faceshift_h