summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2014-10-23 18:31:43 +0200
committerAlessandro Ghedini <alessandro@ghedini.me>2014-10-23 20:27:32 +0200
commit0a40fb00b4acd51adc831334c601a534927b51da (patch)
tree6c42bd7eb148e5fad5184e7b5abb528cf9f3e002
parent3c8aecb711bde4928e13a785527cea6c986a1b75 (diff)
downloadmpv-0a40fb00b4acd51adc831334c601a534927b51da.tar.bz2
mpv-0a40fb00b4acd51adc831334c601a534927b51da.tar.xz
player: fix exiting if both audio and video fail initializing
The player was supposed to exit playback if both video and audio failed to initialize (or if one of the streams was not selected when the other stream failed). This didn't work; for one this check was missing from one of the failure paths. And more importantly, both checked the current_track array incorrectly. Fix these issues, and move the failure handling code into a common function. CC: @mpv-player/stable Conflicts: player/audio.c player/video.c
-rw-r--r--player/audio.c3
-rw-r--r--player/core.h1
-rw-r--r--player/misc.c18
-rw-r--r--player/video.c6
4 files changed, 22 insertions, 6 deletions
diff --git a/player/audio.c b/player/audio.c
index 3b3a06bd69..0fd6f99226 100644
--- a/player/audio.c
+++ b/player/audio.c
@@ -214,9 +214,8 @@ void reinit_audio_chain(struct MPContext *mpctx)
init_error:
uninit_player(mpctx, INITIALIZED_ACODEC | INITIALIZED_AO);
no_audio:
- mp_deselect_track(mpctx, track);
if (track)
- MP_INFO(mpctx, "Audio: no audio\n");
+ error_on_track(mpctx, track);
}
// Return pts value corresponding to the end point of audio written to the
diff --git a/player/core.h b/player/core.h
index dfba2fd45f..1c67c85b2b 100644
--- a/player/core.h
+++ b/player/core.h
@@ -425,6 +425,7 @@ void merge_playlist_files(struct playlist *pl);
float mp_get_cache_percent(struct MPContext *mpctx);
bool mp_get_cache_idle(struct MPContext *mpctx);
void update_window_title(struct MPContext *mpctx, bool force);
+void error_on_track(struct MPContext *mpctx, struct track *track);
void stream_dump(struct MPContext *mpctx);
// osd.c
diff --git a/player/misc.c b/player/misc.c
index d5e27f9584..394a4ca0d1 100644
--- a/player/misc.c
+++ b/player/misc.c
@@ -175,6 +175,24 @@ void update_window_title(struct MPContext *mpctx, bool force)
}
}
+void error_on_track(struct MPContext *mpctx, struct track *track)
+{
+ if (!track)
+ return;
+ mp_deselect_track(mpctx, track);
+ if (track) {
+ if (track->type == STREAM_AUDIO)
+ MP_INFO(mpctx, "Audio: no audio\n");
+ if (track->type == STREAM_VIDEO)
+ MP_INFO(mpctx, "Video: no video\n");
+ if (!mpctx->current_track[0][STREAM_AUDIO] &&
+ !mpctx->current_track[0][STREAM_VIDEO])
+ mpctx->stop_play = PT_NEXT_ENTRY;
+ mpctx->error_playing = true;
+ mpctx->sleeptime = 0;
+ }
+}
+
void stream_dump(struct MPContext *mpctx)
{
struct MPOpts *opts = mpctx->opts;
diff --git a/player/video.c b/player/video.c
index 27655fc38a..679adb289c 100644
--- a/player/video.c
+++ b/player/video.c
@@ -310,7 +310,7 @@ err_out:
no_video:
uninit_player(mpctx, INITIALIZED_VCODEC | (opts->force_vo ? 0 : INITIALIZED_VO));
if (track)
- mp_deselect_track(mpctx, track);
+ error_on_track(mpctx, track);
handle_force_window(mpctx, true);
return 0;
}
@@ -822,9 +822,7 @@ error:
if (!opts->force_vo)
uninit |= INITIALIZED_VO;
uninit_player(mpctx, uninit);
- if (!mpctx->current_track[STREAM_AUDIO])
- mpctx->stop_play = PT_NEXT_ENTRY;
- mpctx->error_playing = true;
+ error_on_track(mpctx, mpctx->current_track[STREAM_VIDEO][0]);
handle_force_window(mpctx, true);
mpctx->sleeptime = 0;
}