X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=video_widget.cpp;h=b50ea1c404a0494b8297180e8fc0f7c671c4bad6;hb=b6eaf3bbd5005eda6d9853897b2b5667c5fd63a7;hp=126e874aa53b1591e6b53d984a26cfd63a25ad1e;hpb=1499d6f5c9c563843c5bba582d44a72c7cae27b2;p=pkanalytics diff --git a/video_widget.cpp b/video_widget.cpp index 126e874..b50ea1c 100644 --- a/video_widget.cpp +++ b/video_widget.cpp @@ -194,7 +194,10 @@ bool VideoWidget::process_queued_commands(AVFormatContext *format_ctx, AVCodecCo queue.pop_front(); queued_frames = std::move(queue); } - current_frame.reset(new Frame(make_video_frame(frame.get()))); + { + lock_guard lock(current_frame_mu); + current_frame.reset(new Frame(make_video_frame(frame.get()))); + } update(); store_pts(frame->pts); break; @@ -225,7 +228,10 @@ bool VideoWidget::process_queued_commands(AVFormatContext *format_ctx, AVCodecCo if (frame == nullptr || error) { return true; } - current_frame.reset(new Frame(make_video_frame(frame.get()))); + { + lock_guard lock(current_frame_mu); + current_frame.reset(new Frame(make_video_frame(frame.get()))); + } update(); store_pts(frame->pts); } @@ -375,7 +381,11 @@ int num_levels(GLuint width, GLuint height) void VideoWidget::paintGL() { - std::shared_ptr frame = current_frame; + std::shared_ptr frame; + { + lock_guard lock(current_frame_mu); + frame = current_frame; + } if (frame == nullptr) { glClear(GL_COLOR_BUFFER_BIT); return; @@ -913,7 +923,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) { - current_frame.reset(new Frame(make_video_frame(frame.get()))); + { + lock_guard lock(current_frame_mu); + current_frame.reset(new Frame(make_video_frame(frame.get()))); + } last_frame = steady_clock::now(); update(); break; @@ -927,7 +940,10 @@ bool VideoWidget::play_video(const string &pathname) if (paused) { // Just paused, so present the frame immediately and then go into deep sleep. - current_frame.reset(new Frame(make_video_frame(frame.get()))); + { + lock_guard lock(current_frame_mu); + current_frame.reset(new Frame(make_video_frame(frame.get()))); + } last_frame = steady_clock::now(); update(); break;