Skip to content

Commit e9cd76b

Browse files
committed
Attempt to fix screenshots being too old.
1 parent dd1867f commit e9cd76b

File tree

11 files changed

+39
-20
lines changed

11 files changed

+39
-20
lines changed

SerialPrograms/Source/CommonFramework/VideoPipeline/Backends/CameraWidgetQt6.5.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,8 @@ class CameraVideoSource : public QObject, public VideoSource{
110110
virtual VideoSnapshot snapshot_latest_blocking() override{
111111
return m_snapshot_manager.snapshot_latest_blocking();
112112
}
113-
virtual VideoSnapshot snapshot_recent_nonblocking() override{
114-
return m_snapshot_manager.snapshot_recent_nonblocking();
113+
virtual VideoSnapshot snapshot_recent_nonblocking(WallClock min_time) override{
114+
return m_snapshot_manager.snapshot_recent_nonblocking(min_time);
115115
}
116116

117117
virtual QWidget* make_display_QtWidget(QWidget* parent) override;

SerialPrograms/Source/CommonFramework/VideoPipeline/Backends/CameraWidgetQt6.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,8 @@ class CameraVideoSource : public QObject, public VideoSource{
6767
virtual VideoSnapshot snapshot_latest_blocking() override{
6868
return m_snapshot_manager.snapshot_latest_blocking();
6969
}
70-
virtual VideoSnapshot snapshot_recent_nonblocking() override{
71-
return m_snapshot_manager.snapshot_recent_nonblocking();
70+
virtual VideoSnapshot snapshot_recent_nonblocking(WallClock min_time) override{
71+
return m_snapshot_manager.snapshot_recent_nonblocking(min_time);
7272
}
7373

7474
virtual QWidget* make_display_QtWidget(QWidget* parent) override;

SerialPrograms/Source/CommonFramework/VideoPipeline/Backends/SnapshotManager.cpp

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ VideoSnapshot SnapshotManager::snapshot_latest_blocking(){
197197
return m_converted_snapshot;
198198
}
199199

200-
VideoSnapshot SnapshotManager::snapshot_recent_nonblocking(){
200+
VideoSnapshot SnapshotManager::snapshot_recent_nonblocking(WallClock min_time){
201201
WallClock now = current_time();
202202

203203
std::lock_guard<std::mutex> lg(m_lock);
@@ -223,7 +223,16 @@ VideoSnapshot SnapshotManager::snapshot_recent_nonblocking(){
223223

224224
// Cached snapshot isn't too old. Return it.
225225

226-
std::chrono::milliseconds window(m_stats_conversion.max());
226+
if (min_time <= m_converted_snapshot.timestamp){
227+
// cout << "snapshot_recent_nonblocking(): Good..." << endl;
228+
return m_converted_snapshot;
229+
}else{
230+
// cout << "snapshot_recent_nonblocking(): Too old..." << endl;
231+
return VideoSnapshot();
232+
}
233+
234+
#if 0
235+
std::chrono::microseconds window(m_stats_conversion.max());
227236
// cout << "window = " << window.count() << endl;
228237

229238
WallClock oldest_allowed = now - 2 * window;
@@ -236,6 +245,7 @@ VideoSnapshot SnapshotManager::snapshot_recent_nonblocking(){
236245

237246
// cout << "snapshot_recent_nonblocking(): Too old..." << endl;
238247
return VideoSnapshot();
248+
#endif
239249
}
240250

241251

SerialPrograms/Source/CommonFramework/VideoPipeline/Backends/SnapshotManager.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class SnapshotManager{
2525

2626
public:
2727
VideoSnapshot snapshot_latest_blocking();
28-
VideoSnapshot snapshot_recent_nonblocking();
28+
VideoSnapshot snapshot_recent_nonblocking(WallClock min_time);
2929

3030
private:
3131
static QImage frame_to_image(const QVideoFrame& frame);

SerialPrograms/Source/CommonFramework/VideoPipeline/VideoFeed.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,14 +77,17 @@ class VideoFeed{
7777
// Implementations must be able to handle calls to this at high rate from
7878
// many different threads simultaneously. So it should perform caching.
7979
//
80-
virtual VideoSnapshot snapshot() = 0;
80+
VideoSnapshot snapshot(){
81+
return snapshot_latest_blocking();
82+
}
83+
virtual VideoSnapshot snapshot_latest_blocking() = 0;
8184

8285
//
8386
// This is a non-blocking snapshot function. It will never block, but it
8487
// is not guaranteed to return the absolute latest snapshot.
8588
//
8689
// If this returns a null snapshot, it can mean either that the video
87-
// isn't available or that no snapshot is ready to be given right now.
90+
// isn't available or that no snapshot (>= min_time) is ready.
8891
//
8992
// Implementations must be able to handle calls to this at high rate from
9093
// many different threads simultaneously. So it should perform caching.
@@ -94,7 +97,7 @@ class VideoFeed{
9497
// function will begin prefetch conversions of frames so they are ready
9598
// on future calls.
9699
//
97-
virtual VideoSnapshot snapshot_recent_nonblocking() = 0;
100+
virtual VideoSnapshot snapshot_recent_nonblocking(WallClock min_time) = 0;
98101

99102

100103
public:

SerialPrograms/Source/CommonFramework/VideoPipeline/VideoSession.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -191,18 +191,18 @@ void VideoSession::set_resolution(Resolution resolution){
191191
}
192192

193193

194-
VideoSnapshot VideoSession::snapshot(){
194+
VideoSnapshot VideoSession::snapshot_latest_blocking(){
195195
ReadSpinLock lg(m_state_lock);
196196
if (m_video_source){
197197
return m_video_source->snapshot_latest_blocking();
198198
}else{
199199
return VideoSnapshot();
200200
}
201201
}
202-
VideoSnapshot VideoSession::snapshot_recent_nonblocking(){
202+
VideoSnapshot VideoSession::snapshot_recent_nonblocking(WallClock min_time){
203203
ReadSpinLock lg(m_state_lock);
204204
if (m_video_source){
205-
return m_video_source->snapshot_recent_nonblocking();
205+
return m_video_source->snapshot_recent_nonblocking(min_time);
206206
}else{
207207
return VideoSnapshot();
208208
}

SerialPrograms/Source/CommonFramework/VideoPipeline/VideoSession.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,8 @@ class VideoSession
6262
Resolution current_resolution();
6363
std::vector<Resolution> supported_resolutions() const;
6464

65-
virtual VideoSnapshot snapshot() override;
66-
virtual VideoSnapshot snapshot_recent_nonblocking() override;
65+
virtual VideoSnapshot snapshot_latest_blocking() override;
66+
virtual VideoSnapshot snapshot_recent_nonblocking(WallClock min_time) override;
6767

6868
virtual double fps_source() const override;
6969
virtual double fps_display() const override;

SerialPrograms/Source/CommonFramework/VideoPipeline/VideoSource.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ class VideoSource{
6161
virtual const std::vector<Resolution>& supported_resolutions() const = 0;
6262

6363
virtual VideoSnapshot snapshot_latest_blocking() = 0;
64-
virtual VideoSnapshot snapshot_recent_nonblocking() = 0;
64+
virtual VideoSnapshot snapshot_recent_nonblocking(WallClock min_time) = 0;
6565

6666

6767
protected:

SerialPrograms/Source/CommonFramework/VideoPipeline/VideoSources/VideoSource_StillImage.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ class VideoSource_StillImage : public VideoSource{
7676
virtual VideoSnapshot snapshot_latest_blocking() override{
7777
return m_snapshot;
7878
}
79-
virtual VideoSnapshot snapshot_recent_nonblocking() override{
79+
virtual VideoSnapshot snapshot_recent_nonblocking(WallClock min_time) override{
8080
return m_snapshot;
8181
}
8282

SerialPrograms/Source/CommonTools/InferencePivots/VisualInferencePivot.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,13 @@ void VisualInferencePivot::run(void* event, bool is_back_to_back) noexcept{
9191
if (!is_back_to_back || callback.last_timestamp == m_last.timestamp){
9292
// cout << "back-to-back" << endl;
9393
// m_last = m_feed.snapshot();
94-
m_last = m_feed.snapshot_recent_nonblocking();
94+
95+
WallClock min_time = callback.last_timestamp;
96+
if (min_time == WallClock::min()){
97+
min_time = current_time() - 2 * callback.period;
98+
}
99+
100+
m_last = m_feed.snapshot_recent_nonblocking(min_time);
95101
}
96102

97103
if (!m_last){

0 commit comments

Comments
 (0)