From da70a59f7ed8e678117a463c28e6bea06e05431f Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Thu, 20 Jul 2023 15:52:33 +0200 Subject: [PATCH] Fix a contention issue. --- video_widget.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/video_widget.cpp b/video_widget.cpp index b50ea1c..7bafa64 100644 --- a/video_widget.cpp +++ b/video_widget.cpp @@ -194,9 +194,10 @@ bool VideoWidget::process_queued_commands(AVFormatContext *format_ctx, AVCodecCo queue.pop_front(); queued_frames = std::move(queue); } + Frame *new_frame = new Frame(make_video_frame(frame.get())); { lock_guard lock(current_frame_mu); - current_frame.reset(new Frame(make_video_frame(frame.get()))); + current_frame.reset(new_frame); } update(); store_pts(frame->pts); @@ -228,9 +229,10 @@ bool VideoWidget::process_queued_commands(AVFormatContext *format_ctx, AVCodecCo if (frame == nullptr || error) { return true; } + Frame *new_frame = new Frame(make_video_frame(frame.get())); { lock_guard lock(current_frame_mu); - current_frame.reset(new Frame(make_video_frame(frame.get()))); + current_frame.reset(new_frame); } update(); store_pts(frame->pts); @@ -923,9 +925,10 @@ bool VideoWidget::play_video(const string &pathname) bool finished_wakeup; finished_wakeup = producer_thread_should_quit.sleep_until(next_frame_start); if (finished_wakeup) { + Frame *new_frame = new Frame(make_video_frame(frame.get())); { lock_guard lock(current_frame_mu); - current_frame.reset(new Frame(make_video_frame(frame.get()))); + current_frame.reset(new_frame); } last_frame = steady_clock::now(); update(); @@ -940,9 +943,10 @@ bool VideoWidget::play_video(const string &pathname) if (paused) { // Just paused, so present the frame immediately and then go into deep sleep. + Frame *new_frame = new Frame(make_video_frame(frame.get())); { lock_guard lock(current_frame_mu); - current_frame.reset(new Frame(make_video_frame(frame.get()))); + current_frame.reset(new_frame); } last_frame = steady_clock::now(); update(); -- 2.39.2