From a8167fd684265bfe3b17b8741b7d7d522e2ce153 Mon Sep 17 00:00:00 2001 From: brunoherbelin Date: Mon, 23 Mar 2020 14:36:57 +0100 Subject: [PATCH] Fixed instantaneous framerate computation --- MediaPlayer.cpp | 43 ++++++++++++++++++++++++++++++------------- MediaPlayer.h | 2 +- 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/MediaPlayer.cpp b/MediaPlayer.cpp index 895362c..fdaba19 100644 --- a/MediaPlayer.cpp +++ b/MediaPlayer.cpp @@ -300,6 +300,10 @@ void MediaPlayer::Play(bool on) else Log::Info("MediaPlayer %s Stop", gst_element_get_name(pipeline)); #endif + + // reset time counter on stop + if (!on) + timecount.reset(); } bool MediaPlayer::isPlaying() const @@ -786,31 +790,44 @@ void MediaPlayer::callback_discoverer_finished(GstDiscoverer *discoverer, MediaP } TimeCounter::TimeCounter() { - current_time = gst_util_get_timestamp (); - last_time = gst_util_get_timestamp(); - nbFrames = 0; - fps = 1.f; + + reset(); } void TimeCounter::tic () { + // how long since last time current_time = gst_util_get_timestamp (); - nbFrames++ ; - if ((current_time - last_time) >= GST_SECOND) + gint64 dt = current_time - last_time; + + // one more frame since last time + nbFrames++; + + // calculate instantaneous framerate + // Exponential moving averate with previous framerate to filter jutter (50/50) + // The divition of frame/time is done on long integer GstClockTime, counting in microsecond + // NB: factor 100 to get 0.01 precision + fps = 0.5f * fps + 0.005f * static_cast( ( 100 * GST_SECOND * nbFrames ) / dt ); + + // reset counter every second + if ( dt >= GST_SECOND) { last_time = current_time; - fps = 0.1f * fps + 0.9f * static_cast(nbFrames); nbFrames = 0; } + +} + +void TimeCounter::reset () +{ + current_time = gst_util_get_timestamp (); + last_time = gst_util_get_timestamp(); + nbFrames = 0; + fps = 0.f; } float TimeCounter::framerate() const { - return fps; -} - -int TimeCounter::framecount() const -{ - return nbFrames; + return fps; } diff --git a/MediaPlayer.h b/MediaPlayer.h index c092c31..61fe1b7 100644 --- a/MediaPlayer.h +++ b/MediaPlayer.h @@ -25,8 +25,8 @@ struct TimeCounter { public: TimeCounter(); void tic(); + void reset(); float framerate() const; - int framecount() const; }; struct MediaSegment