summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libmpdemux/demux_mkv.c26
1 files changed, 20 insertions, 6 deletions
diff --git a/libmpdemux/demux_mkv.c b/libmpdemux/demux_mkv.c
index 4da94ac99d..9bb98f9f6f 100644
--- a/libmpdemux/demux_mkv.c
+++ b/libmpdemux/demux_mkv.c
@@ -2494,9 +2494,16 @@ static int demux_mkv_control(demuxer_t *demuxer, int cmd, void *arg)
int current_aid = demuxer->audio->id;
if (current_aid < 0)
current_aid = -1;
- if (new_aid == -1) // cycle to next
- new_aid = (current_aid + 2) % (mkv_d->num_audio_tracks + 1) - 1;
- if (new_aid < 0 || new_aid >= mkv_d->num_audio_tracks)
+ if (new_aid == -1) { // cycle to next
+ new_aid = current_aid;
+ while (1) {
+ new_aid = (new_aid + 2) % (mkv_d->num_audio_tracks + 1) - 1;
+ if (new_aid == -1 || demuxer->a_streams[new_aid])
+ break;
+ }
+ }
+ if (new_aid < 0 || new_aid >= mkv_d->num_audio_tracks ||
+ !demuxer->a_streams[new_aid])
new_aid = -2;
*(int *) arg = new_aid;
if (current_aid != new_aid)
@@ -2509,9 +2516,16 @@ static int demux_mkv_control(demuxer_t *demuxer, int cmd, void *arg)
int current_vid = demuxer->video->id;
if (current_vid < 0)
current_vid = -1;
- if (new_vid == -1) // cycle to next
- new_vid = (current_vid + 2) % (mkv_d->num_video_tracks + 1) - 1;
- if (new_vid < 0 || new_vid >= mkv_d->num_video_tracks)
+ if (new_vid == -1) { // cycle to next
+ new_vid = current_vid;
+ while (1) {
+ new_vid = (new_vid + 2) % (mkv_d->num_video_tracks + 1) - 1;
+ if (new_vid == -1 || demuxer->v_streams[new_vid])
+ break;
+ }
+ }
+ if (new_vid < 0 || new_vid >= mkv_d->num_video_tracks ||
+ !demuxer->v_streams[new_vid])
new_vid = -2;
*(int *) arg = new_vid;
if (current_vid != new_vid)