summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--command.c26
-rw-r--r--libmpdemux/demuxer.c14
2 files changed, 20 insertions, 20 deletions
diff --git a/command.c b/command.c
index bc6aa3c818..48f6108a2c 100644
--- a/command.c
+++ b/command.c
@@ -991,8 +991,8 @@ static int mp_property_audio(m_option_t *prop, int action, void *arg,
uninit_player(mpctx, INITIALIZED_AO | INITIALIZED_ACODEC);
if (new_id != current_id && new_id >= 0) {
sh_audio_t *sh2;
- sh2 = mpctx->d_audio->demuxer->a_streams[mpctx->demuxer->audio->id];
- sh2->ds = mpctx->demuxer->audio;
+ sh2 = mpctx->d_audio->demuxer->a_streams[mpctx->d_audio->id];
+ sh2->ds = mpctx->d_audio;
mpctx->sh_audio = sh2;
reinit_audio_chain(mpctx);
}
@@ -1012,7 +1012,7 @@ static int mp_property_video(m_option_t *prop, int action, void *arg,
int current_id, tmp;
if (!mpctx->demuxer || !mpctx->d_video)
return M_PROPERTY_UNAVAILABLE;
- current_id = mpctx->d_video->id;
+ current_id = mpctx->sh_video ? mpctx->sh_video->vid : -2;
switch (action) {
case M_PROPERTY_GET:
@@ -1040,22 +1040,18 @@ static int mp_property_video(m_option_t *prop, int action, void *arg,
tmp = *((int *) arg);
else
tmp = -1;
- opts->video_id = demuxer_switch_video(mpctx->d_video->demuxer, tmp);
- if (opts->video_id == -2
- || (opts->video_id > -1 && mpctx->d_video->id != current_id
- && current_id != -2))
+ int new_id = demuxer_switch_video(mpctx->d_video->demuxer, tmp);
+ if (new_id != current_id)
uninit_player(mpctx, INITIALIZED_VCODEC |
- (mpctx->opts.fixed_vo && opts->video_id != -2 ? 0 : INITIALIZED_VO));
- if (opts->video_id > -1 && mpctx->d_video->id != current_id) {
+ (opts->fixed_vo && new_id >= 0 ? 0 : INITIALIZED_VO));
+ if (new_id != current_id && new_id >= 0) {
sh_video_t *sh2;
sh2 = mpctx->d_video->demuxer->v_streams[mpctx->d_video->id];
- if (sh2) {
- sh2->ds = mpctx->d_video;
- mpctx->sh_video = sh2;
- reinit_video_chain(mpctx);
- }
+ sh2->ds = mpctx->d_video;
+ mpctx->sh_video = sh2;
+ reinit_video_chain(mpctx);
}
- mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VIDEO_TRACK=%d\n", opts->video_id);
+ mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VIDEO_TRACK=%d\n", new_id);
return M_PROPERTY_OK;
default:
diff --git a/libmpdemux/demuxer.c b/libmpdemux/demuxer.c
index 6607f2399f..9b38af9452 100644
--- a/libmpdemux/demuxer.c
+++ b/libmpdemux/demuxer.c
@@ -1351,11 +1351,15 @@ int demuxer_switch_audio(demuxer_t *demuxer, int index)
int demuxer_switch_video(demuxer_t *demuxer, int index)
{
int res = demux_control(demuxer, DEMUXER_CTRL_SWITCH_VIDEO, &index);
- if (res == DEMUXER_CTRL_NOTIMPL)
- index = demuxer->video->id;
- if (demuxer->video->id >= 0)
- demuxer->video->sh = demuxer->v_streams[demuxer->video->id];
- else
+ if (res == DEMUXER_CTRL_NOTIMPL) {
+ struct sh_video *sh_video = demuxer->video->sh;
+ return sh_video ? sh_video->vid : -2;
+ }
+ if (demuxer->video->id >= 0) {
+ struct sh_video *sh_video = demuxer->v_streams[demuxer->video->id];
+ demuxer->video->sh = sh_video;
+ index = sh_video->vid; // internal MPEG demuxers don't set it right
+ } else
demuxer->video->sh = NULL;
return index;
}