diff --git a/EyeRecToo/deps/runtime/x64/Debug/plugins/mediaservice/uvcengine.dll b/EyeRecToo/deps/runtime/x64/Debug/plugins/mediaservice/uvcengine.dll index fc85e11654ed2f2c65ffd83ff55ee3c0ac89831b..52e4c5cdc85dac5d976b9be9bd0fac8478286b9c 100644 Binary files a/EyeRecToo/deps/runtime/x64/Debug/plugins/mediaservice/uvcengine.dll and b/EyeRecToo/deps/runtime/x64/Debug/plugins/mediaservice/uvcengine.dll differ diff --git a/EyeRecToo/deps/runtime/x64/Debug/plugins/mediaservice/uvcengined.dll b/EyeRecToo/deps/runtime/x64/Debug/plugins/mediaservice/uvcengined.dll index fc0537a4aa082a3c82401143b436fd43b8c40884..5416d62eef9ac3003fb4234484564c003cc9dbb9 100644 Binary files a/EyeRecToo/deps/runtime/x64/Debug/plugins/mediaservice/uvcengined.dll and b/EyeRecToo/deps/runtime/x64/Debug/plugins/mediaservice/uvcengined.dll differ diff --git a/EyeRecToo/deps/runtime/x64/Debug/plugins/mediaservice/uvcengined.pdb b/EyeRecToo/deps/runtime/x64/Debug/plugins/mediaservice/uvcengined.pdb index 4c38d90f94bde09aaa84bc4ab649792ecc8800d5..0a88d345078898342f5da2847a996f15eafe9a66 100644 Binary files a/EyeRecToo/deps/runtime/x64/Debug/plugins/mediaservice/uvcengined.pdb and b/EyeRecToo/deps/runtime/x64/Debug/plugins/mediaservice/uvcengined.pdb differ diff --git a/EyeRecToo/deps/runtime/x64/Debug/uvc.dll b/EyeRecToo/deps/runtime/x64/Debug/uvc.dll index 9585d6242a496b7154c80036d6c3e0899c561a1e..839a4bb007bc4831bda75bd2bf651ac90c2e14c0 100644 Binary files a/EyeRecToo/deps/runtime/x64/Debug/uvc.dll and b/EyeRecToo/deps/runtime/x64/Debug/uvc.dll differ diff --git a/EyeRecToo/deps/runtime/x64/Release/plugins/mediaservice/uvcengine.dll b/EyeRecToo/deps/runtime/x64/Release/plugins/mediaservice/uvcengine.dll index fc85e11654ed2f2c65ffd83ff55ee3c0ac89831b..52e4c5cdc85dac5d976b9be9bd0fac8478286b9c 100644 Binary files a/EyeRecToo/deps/runtime/x64/Release/plugins/mediaservice/uvcengine.dll and b/EyeRecToo/deps/runtime/x64/Release/plugins/mediaservice/uvcengine.dll differ diff --git a/EyeRecToo/deps/runtime/x64/Release/plugins/mediaservice/uvcengined.dll b/EyeRecToo/deps/runtime/x64/Release/plugins/mediaservice/uvcengined.dll index fc0537a4aa082a3c82401143b436fd43b8c40884..5416d62eef9ac3003fb4234484564c003cc9dbb9 100644 Binary files a/EyeRecToo/deps/runtime/x64/Release/plugins/mediaservice/uvcengined.dll and b/EyeRecToo/deps/runtime/x64/Release/plugins/mediaservice/uvcengined.dll differ diff --git a/EyeRecToo/deps/runtime/x64/Release/plugins/mediaservice/uvcengined.pdb b/EyeRecToo/deps/runtime/x64/Release/plugins/mediaservice/uvcengined.pdb index 4c38d90f94bde09aaa84bc4ab649792ecc8800d5..0a88d345078898342f5da2847a996f15eafe9a66 100644 Binary files a/EyeRecToo/deps/runtime/x64/Release/plugins/mediaservice/uvcengined.pdb and b/EyeRecToo/deps/runtime/x64/Release/plugins/mediaservice/uvcengined.pdb differ diff --git a/EyeRecToo/deps/runtime/x64/Release/uvc.dll b/EyeRecToo/deps/runtime/x64/Release/uvc.dll index 9585d6242a496b7154c80036d6c3e0899c561a1e..85a47b48ee1cc18ba4676c6c549530725cff525b 100644 Binary files a/EyeRecToo/deps/runtime/x64/Release/uvc.dll and b/EyeRecToo/deps/runtime/x64/Release/uvc.dll differ diff --git a/EyeRecToo/src/FrameGrabber.cpp b/EyeRecToo/src/FrameGrabber.cpp index a2bb9ec09bdd74a0261d072f73ad34f838ba99de..aaeb9c39bae7bb7de6639e8a69e4b529c775b712 100644 --- a/EyeRecToo/src/FrameGrabber.cpp +++ b/EyeRecToo/src/FrameGrabber.cpp @@ -9,8 +9,8 @@ FrameGrabber::FrameGrabber(QString id, int code, QObject *parent) : code(code), yuvBuffer(NULL), yuvBufferSize(0), - timestampOffset(INT_MAX), - timeoutMs(2e3) + timestampOffset(0), + timeoutMs(2e3) { #ifdef TURBOJPEG tjh = tjInitDecompress(); @@ -21,7 +21,7 @@ FrameGrabber::FrameGrabber(QString id, int code, QObject *parent) : // for the first frame, we give a bit of extra leeway becase gstreamer is slow... //watchdog->start(timeoutMs); - watchdog->start(15e3); + watchdog->start(15e3); pmIdx = gPerformanceMonitor.enrol(id, "Frame Grabber"); } @@ -86,11 +86,15 @@ bool FrameGrabber::present(const QVideoFrame &frame) Timestamp t = gTimer.elapsed(); QVariant ft = frame.metaData("timestamp"); - if (ft.isValid() ) { - if (timestampOffset == INT_MAX) // offset between gTimer and frame timer - timestampOffset = t - ft.toInt(); - t = ft.toInt() + timestampOffset; - } + if (ft.isValid() ) { + if ( timestampOffsetEstimators.size() < 30) { + // Use median of first N frames to estimate the offset + timestampOffsetEstimators.emplace_back( t - ft.toInt() ); + std::sort(timestampOffsetEstimators.begin(), timestampOffsetEstimators.end()); + timestampOffset = timestampOffsetEstimators[ 0.5*(timestampOffsetEstimators.size()-1) ]; + } + t = ft.toInt() + timestampOffset; + } if (!frame.isValid()) return false; @@ -117,8 +121,8 @@ bool FrameGrabber::present(const QVideoFrame &frame) copy.unmap(); if (success && !cvFrame.empty()) { - watchdog->start(timeoutMs); - emit newFrame(t, cvFrame); + watchdog->start(timeoutMs); + emit newFrame(t, cvFrame); } else gPerformanceMonitor.account(pmIdx); diff --git a/EyeRecToo/src/FrameGrabber.h b/EyeRecToo/src/FrameGrabber.h index a2dd7afef089ad709bb8d7317e21a87ef425a4d1..0caa9fec2b0761c1e6f55f431535fa563af266c5 100644 --- a/EyeRecToo/src/FrameGrabber.h +++ b/EyeRecToo/src/FrameGrabber.h @@ -35,7 +35,8 @@ public slots: private: QTimer *watchdog; int timeoutMs; - int timestampOffset; + Timestamp timestampOffset; + std::vector timestampOffsetEstimators; #ifdef TURBOJPEG tjhandle tjh; #endif diff --git a/EyeRecToo/src/PerformanceMonitor.cpp b/EyeRecToo/src/PerformanceMonitor.cpp index 5be3d7aa4053b3417187d750083f40c0908f7d6c..5efeadf1acc78248096c5edd8b78caaab07b539b 100644 --- a/EyeRecToo/src/PerformanceMonitor.cpp +++ b/EyeRecToo/src/PerformanceMonitor.cpp @@ -41,9 +41,9 @@ unsigned int PerformanceMonitor::enrol(const QString &id, const QString &stage) return idx; } -bool PerformanceMonitor::shouldDrop(const unsigned int &idx, const unsigned int &delay, const unsigned int &maxDelay) +bool PerformanceMonitor::shouldDrop(const unsigned int &idx, const int &delay, const int &maxDelay) { - if (delay > maxDelay) { + if (delay > maxDelay) { droppedFrameCount[idx]++; return frameDropEnabled; } diff --git a/EyeRecToo/src/PerformanceMonitor.h b/EyeRecToo/src/PerformanceMonitor.h index 6d9d56bdb64d91e4e7d8fe5f21da626d36c46ad2..b473648b3b368359d4319c62be5f7aa4505a7864 100644 --- a/EyeRecToo/src/PerformanceMonitor.h +++ b/EyeRecToo/src/PerformanceMonitor.h @@ -12,7 +12,7 @@ public: std::vector droppedFrameCount; unsigned int enrol(const QString &id, const QString &stage); - bool shouldDrop(const unsigned int &idx, const unsigned int &delay, const unsigned int &maxDelay=50); + bool shouldDrop(const unsigned int &idx, const int &delay, const int &maxDelay=50); void account(const unsigned int &idx); QString getEnrolled(const unsigned int &idx) { return idx < enrolled.size() ? enrolled[idx] : QString(); } unsigned int enrolledCount() { return (unsigned int) enrolled.size(); }