summaryrefslogtreecommitdiffstats
path: root/player/playloop.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2014-07-18 15:10:28 +0200
committerwm4 <wm4@nowhere>2014-07-18 15:10:28 +0200
commit7083f88ca8b98aa74dbc9e34d5c5cf6e150cfe0b (patch)
tree8835b9e68ef6738203cfae798fb0df5122fdae08 /player/playloop.c
parent848546f2de52b54f78077cb4ca968e089e3e010a (diff)
downloadmpv-7083f88ca8b98aa74dbc9e34d5c5cf6e150cfe0b.tar.bz2
mpv-7083f88ca8b98aa74dbc9e34d5c5cf6e150cfe0b.tar.xz
video: don't block when reading video packets
Instead of blocking on the demuxer when reading a packet, let packets be read asynchronously. Basically, it polls whether a packet is available, and if not, the playloop goes to sleep until the demuxer thread wakes it up. Note that the player will still block for I/O, because audio is still read synchronously. It's much harder to do the same change for audio (because of the design of the audio decoding path and especially initialization), so audio will have to be done later.
Diffstat (limited to 'player/playloop.c')
-rw-r--r--player/playloop.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/player/playloop.c b/player/playloop.c
index 2392fd32a4..a3fcf133e3 100644
--- a/player/playloop.c
+++ b/player/playloop.c
@@ -985,6 +985,12 @@ void run_playloop(struct MPContext *mpctx)
video_left = r > 0;
+ if (r == 3)
+ break;
+
+ if (mpctx->restart_playback)
+ mpctx->sleeptime = 0;
+
if (r == 2)
MP_TRACE(mpctx, "frametime=%5.3f\n", frame_time);
@@ -1243,9 +1249,6 @@ void run_playloop(struct MPContext *mpctx)
if (mpctx->stop_play)
mpctx->sleeptime = 0;
- if (mpctx->restart_playback)
- mpctx->sleeptime = 0;
-
if (mpctx->sleeptime > 0 && handle_osd_redraw(mpctx))
mpctx->sleeptime = 0;