diff --git a/EyeRecToo/src/post-processing/PostProcessingWidget.cpp b/EyeRecToo/src/post-processing/PostProcessingWidget.cpp index c918d5962b2476ce5f671c130b2a12dbab97ea40..8b21e26ac31c358d4fe1ee142de02edba645792e 100644 --- a/EyeRecToo/src/post-processing/PostProcessingWidget.cpp +++ b/EyeRecToo/src/post-processing/PostProcessingWidget.cpp @@ -587,8 +587,11 @@ void PostProcessingWidget::present(const VideoFrame& videoFrame) updatePresentIdx(videoFrame.idx); ui->playbackSlider->setValue(presentIdx); - auto getTimestamp = [](const DataTuple& d) { return d.timestamp; }; - size_t idx = ts2idx(playbackTuples, videoFrame.t, getTimestamp) + 1; + // Note that given a field frame, there might be more than one data tuple that contains it + // we simply pick one of them + auto getTimestamp = [](const DataTuple& d) { return d.field.timestamp; }; + auto idx = findClosestIdx(playbackTuples, videoFrame.t, getTimestamp); + DataTuple tuple; if (idx < playbackTuples.size()) tuple = playbackTuples[idx]; diff --git a/EyeRecToo/src/post-processing/PostProcessingWidget.h b/EyeRecToo/src/post-processing/PostProcessingWidget.h index d5f4218cd8b525725064f8d64718ac6609a285a5..01610dd65e35c083d31820366e4883afd4c01c85 100644 --- a/EyeRecToo/src/post-processing/PostProcessingWidget.h +++ b/EyeRecToo/src/post-processing/PostProcessingWidget.h @@ -156,25 +156,6 @@ private: void updatePresentIdx(const int idx); void keyPressEvent(QKeyEvent* event) override; - template - size_t ts2idx(const std::vector& v, const double& t, Functor& functor) const - { - size_t s = 0; - size_t e = v.size(); - - while (true) { - size_t mid = round((e + s) / 2); - if (mid == s || mid == e) - return mid; - if (t < functor(v[mid])) - e = mid; - else - s = mid; - } - - return -1; - } - QStateMachine batchStateMachine; }; diff --git a/EyeRecToo/src/post-processing/VideoSource.h b/EyeRecToo/src/post-processing/VideoSource.h index e406b3bd5c1b13230b5916f154d32d046ee4a1a8..49b8d9fbcf03f30b2b823fb1a9d6d7aa65e3d16a 100644 --- a/EyeRecToo/src/post-processing/VideoSource.h +++ b/EyeRecToo/src/post-processing/VideoSource.h @@ -80,20 +80,7 @@ private: size_t ts2idx(const Timestamp& t) const { - size_t s = 0; - size_t e = timestamps.size(); - - while (true) { - size_t mid = round((e + s) / 2); - if (mid == s || mid == e) - return mid; - if (t < timestamps[mid]) - e = mid; - else - s = mid; - } - - return -1; + return findClosestIdx(timestamps, t, [](const Timestamp& t) { return t; }); } private slots: diff --git a/EyeRecToo/src/utils.h b/EyeRecToo/src/utils.h index dc394a73484f4448307da9ebeff9f4ceea97de17..744f545b41d09fc56a336b9b657d048371b2b18a 100644 --- a/EyeRecToo/src/utils.h +++ b/EyeRecToo/src/utils.h @@ -130,7 +130,7 @@ public: { total = 0; } - double average() const { return mean(values); } + double average() const { return total / values.size(); } void update(const T t) { values.emplace_back(t); @@ -148,4 +148,16 @@ private: double total; }; +template +size_t findClosestIdx(const Vec& vec, const Val& val, const Functor& f, size_t start = 0, size_t end = 0) +{ + if (start == 0 && end == 0) + return findClosestIdx(vec, val, f, 0, vec.size() - 1); + + if (end - start <= 1) + return abs(f(vec[start]) - val) < abs(f(vec[end]) - val) ? start : end; + auto mid = (end + start) / 2; + return f(vec[mid]) > val ? findClosestIdx(vec, val, f, start, mid) : findClosestIdx(vec, val, f, mid, end); +} + #endif // UTILS_H