summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2014-07-06 19:02:58 +0200
committerwm4 <wm4@nowhere>2014-07-06 19:02:58 +0200
commitf3604fc3fb706662278ff2e80f4049651f2ea253 (patch)
tree15a5f828de870a1890f0b9c97b276c7b0b1af0c5
parente3a3b764c8a98fbdca2e0e3677fdcf233169d666 (diff)
downloadmpv-f3604fc3fb706662278ff2e80f4049651f2ea253.tar.bz2
mpv-f3604fc3fb706662278ff2e80f4049651f2ea253.tar.xz
demux: fix a corner case related to demux_disc
It can happen that demux_fill_buffer() adds more than 1 packet, and then the packets would add up. Affects demux_disc.c only (nothing else uses this function).
-rw-r--r--demux/demux.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/demux/demux.c b/demux/demux.c
index 047e77a486..7938cbdcec 100644
--- a/demux/demux.c
+++ b/demux/demux.c
@@ -327,11 +327,14 @@ bool demux_stream_eof(struct sh_stream *sh)
// Read and return any packet we find.
struct demux_packet *demux_read_any_packet(struct demuxer *demuxer)
{
- demux_fill_buffer(demuxer);
- for (int n = 0; n < demuxer->num_streams; n++) {
- struct sh_stream *sh = demuxer->streams[n];
- if (sh->ds->head)
- return demux_read_packet(sh);
+ for (int retry = 0; retry < 2; retry++) {
+ for (int n = 0; n < demuxer->num_streams; n++) {
+ struct sh_stream *sh = demuxer->streams[n];
+ if (sh->ds->head)
+ return demux_read_packet(sh);
+ }
+ // retry after calling this
+ demux_fill_buffer(demuxer);
}
return NULL;
}