summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2019-06-03 02:05:52 +0200
committerwm4 <wm4@nowhere>2019-09-19 20:37:05 +0200
commit60a0db39aa649fd3f76f6cb7ce53f0f9c3ab6eb4 (patch)
tree72608364b951ec69e822b7fd39a0e60a5eebc503
parent911718c413a80ee5e3bc30a9510b6aaaba35d2ad (diff)
downloadmpv-60a0db39aa649fd3f76f6cb7ce53f0f9c3ab6eb4.tar.bz2
mpv-60a0db39aa649fd3f76f6cb7ce53f0f9c3ab6eb4.tar.xz
player: ensure backward playback state is propagated on track switching
Track switching doesn't run reset_playback_state(), so a track enabled at runtime during backward playback would lead to a messed up state. This commit just does a bad code monkey fix to this. It feels like there needs to be a much better way to propagate this state.
-rw-r--r--player/audio.c6
-rw-r--r--player/playloop.c3
-rw-r--r--player/sub.c4
-rw-r--r--player/video.c6
4 files changed, 14 insertions, 5 deletions
diff --git a/player/audio.c b/player/audio.c
index d56b97c5ba..881d74a904 100644
--- a/player/audio.c
+++ b/player/audio.c
@@ -187,8 +187,12 @@ static void ao_chain_reset_state(struct ao_chain *ao_c)
void reset_audio_state(struct MPContext *mpctx)
{
- if (mpctx->ao_chain)
+ if (mpctx->ao_chain) {
ao_chain_reset_state(mpctx->ao_chain);
+ struct track *t = mpctx->ao_chain->track;
+ if (t && t->dec)
+ t->dec->play_dir = mpctx->play_dir;
+ }
mpctx->audio_status = mpctx->ao_chain ? STATUS_SYNCING : STATUS_EOF;
mpctx->delay = 0;
mpctx->audio_drop_throttle = 0;
diff --git a/player/playloop.c b/player/playloop.c
index c415e5a90d..7ff82347bd 100644
--- a/player/playloop.c
+++ b/player/playloop.c
@@ -226,10 +226,9 @@ void reset_playback_state(struct MPContext *mpctx)
for (int n = 0; n < mpctx->num_tracks; n++) {
struct track *t = mpctx->tracks[n];
+ // (Often, but not always, this is redundant and also done elsewhere.)
if (t->dec)
t->dec->play_dir = mpctx->play_dir;
- if (t->d_sub)
- sub_set_play_dir(t->d_sub, mpctx->play_dir);
}
mpctx->hrseek_active = false;
diff --git a/player/sub.c b/player/sub.c
index 40e7aba30f..12a9696227 100644
--- a/player/sub.c
+++ b/player/sub.c
@@ -48,8 +48,10 @@ static int get_order(struct MPContext *mpctx, struct track *track)
static void reset_subtitles(struct MPContext *mpctx, struct track *track)
{
- if (track->d_sub)
+ if (track->d_sub) {
sub_reset(track->d_sub);
+ sub_set_play_dir(track->d_sub, mpctx->play_dir);
+ }
term_osd_set_subs(mpctx, NULL);
}
diff --git a/player/video.c b/player/video.c
index dd48e0a529..58115081d1 100644
--- a/player/video.c
+++ b/player/video.c
@@ -95,8 +95,12 @@ static void vo_chain_reset_state(struct vo_chain *vo_c)
void reset_video_state(struct MPContext *mpctx)
{
- if (mpctx->vo_chain)
+ if (mpctx->vo_chain) {
vo_chain_reset_state(mpctx->vo_chain);
+ struct track *t = mpctx->vo_chain->track;
+ if (t && t->dec)
+ t->dec->play_dir = mpctx->play_dir;
+ }
for (int n = 0; n < mpctx->num_next_frames; n++)
mp_image_unrefp(&mpctx->next_frames[n]);