Skip to content

Commit 654b15b

Browse files
committed
disp/omt: Handle PUTF_* flags
1 parent a6d2cd8 commit 654b15b

1 file changed

Lines changed: 19 additions & 0 deletions

File tree

src/video_display/omt.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@
5454
namespace{
5555
using frame_uniq = std::unique_ptr<video_frame, deleter_from_fcn<vf_free>>;
5656

57+
constexpr auto MAX_QUEUED_FRAMES = 1;
58+
5759
struct state_vdisp_omt{
5860
omt_send_uniq omt_send;
5961

@@ -169,6 +171,23 @@ bool display_omt_putf(void *state, video_frame *frame, long long timeout_ns){
169171
auto f = frame_uniq(frame);
170172

171173
std::unique_lock lock(s->mutex);
174+
175+
if(timeout_ns == PUTF_DISCARD){
176+
s->free_frames.push_back(std::move(f));
177+
return false;
178+
}
179+
180+
if(timeout_ns == PUTF_BLOCKING){
181+
s->free_frame_cv.wait(lock, [s]{return s->frame_queue.size() < MAX_QUEUED_FRAMES;});
182+
} else if(timeout_ns != PUTF_NONBLOCK){
183+
s->free_frame_cv.wait_for(lock, std::chrono::nanoseconds(timeout_ns), [s]{return s->frame_queue.size() < MAX_QUEUED_FRAMES;});
184+
}
185+
186+
if(s->frame_queue.size() >= MAX_QUEUED_FRAMES){
187+
s->free_frames.push_back(std::move(f));
188+
return false;
189+
}
190+
172191
s->frame_queue.push(std::move(f));
173192
lock.unlock();
174193
s->video_frame_cv.notify_one();

0 commit comments

Comments
 (0)