summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUoti Urpala <uau@mplayer2.org>2011-03-30 23:22:45 +0300
committerUoti Urpala <uau@mplayer2.org>2011-03-31 00:13:36 +0300
commitdf31b077b485da9084609806a92d5be2c37c1359 (patch)
treecd3ac8b8090b4368c7e11328b79a6642a53435ed
parent5c731e2ea669bbc732e51dc95c1ec68cc41050e6 (diff)
downloadmpv-df31b077b485da9084609806a92d5be2c37c1359.tar.bz2
mpv-df31b077b485da9084609806a92d5be2c37c1359.tar.xz
core, demux: fix video index handling in stream switching
Fix bugs in the handling of stream index values in video stream switching. This is similar to what commit 90bedd0b872b6eea02351aafb62e did for audio. Also clean up the corresponding audio code a little bit.
-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;
}