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;