diff --git a/libmpdemux/demux_lavf.c b/libmpdemux/demux_lavf.c index d80f87e57f..f3a13cb431 100644 --- a/libmpdemux/demux_lavf.c +++ b/libmpdemux/demux_lavf.c @@ -403,6 +403,8 @@ static void handle_stream(demuxer_t *demuxer, AVFormatContext *avfc, int i) { sh_video->i_bps=codec->bit_rate/8; if (title && title->value) mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VID_%d_NAME=%s\n", priv->video_streams, title->value); + if (st->disposition & AV_DISPOSITION_DEFAULT) + sh_video->default_track = 1; if (rot && rot->value) mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VID_%d_ROTATE=%s\n", priv->video_streams, rot->value); mp_msg(MSGT_DEMUX,MSGL_DBG2,"aspect= %d*%d/(%d*%d)\n", diff --git a/libmpdemux/demuxer.c b/libmpdemux/demuxer.c index 153cd451bc..5c575a0041 100644 --- a/libmpdemux/demuxer.c +++ b/libmpdemux/demuxer.c @@ -1916,6 +1916,22 @@ int demuxer_default_audio_track(demuxer_t *d) return -1; } +int demuxer_default_video_track(demuxer_t *d) +{ + int i; + for (i = 0; i < MAX_V_STREAMS; ++i) { + sh_video_t *sh = d->v_streams[i]; + if (sh && sh->default_track) + return sh->vid; + } + for (i = 0; i < MAX_V_STREAMS; ++i) { + sh_video_t *sh = d->v_streams[i]; + if (sh) + return sh->vid; + } + return -1; +} + int demuxer_default_sub_track(demuxer_t *d) { int i; diff --git a/libmpdemux/demuxer.h b/libmpdemux/demuxer.h index 2edfc05a0f..516e663b5c 100644 --- a/libmpdemux/demuxer.h +++ b/libmpdemux/demuxer.h @@ -486,6 +486,7 @@ int demuxer_sub_track_by_lang(demuxer_t* demuxer, char* lang); // for subtitles, it is the first track with default attribute // for audio, additionally, the first track is selected if no track has default attribute set int demuxer_default_audio_track(demuxer_t* d); +int demuxer_default_video_track(demuxer_t* d); int demuxer_default_sub_track(demuxer_t* d); #endif /* MPLAYER_DEMUXER_H */ diff --git a/mencoder.c b/mencoder.c index 3f2720393f..6599b9a2e4 100644 --- a/mencoder.c +++ b/mencoder.c @@ -709,10 +709,10 @@ if(stream->type==STREAMTYPE_DVDNAV){ demux_program_t prog = { .progid = ts_prog }; if (demux_control(demuxer, DEMUXER_CTRL_IDENTIFY_PROGRAM, &prog) != DEMUXER_CTRL_NOTIMPL) { audio_id = prog.aid; // switching is handled by select_audio below - video_id = prog.vid; - demuxer_switch_video(demuxer, video_id); + video_id = prog.vid; // switching is handled by select_video below } } + select_video(demuxer, video_id); select_audio(demuxer, audio_id, audio_lang); if (dvdsub_id == -1 && dvdsub_lang) diff --git a/mpcommon.c b/mpcommon.c index ae611bf7d2..e774115f5a 100644 --- a/mpcommon.c +++ b/mpcommon.c @@ -416,6 +416,16 @@ int select_audio(demuxer_t* demuxer, int audio_id, char* audio_lang) return demuxer->audio->id; } +int select_video(demuxer_t* demuxer, int video_id) +{ + if (video_id == -1) + video_id = demuxer_default_video_track(demuxer); + if (video_id != -1) // -1 (automatic) is the default behaviour of demuxers + demuxer_switch_video(demuxer, video_id); + + return demuxer->video->id; +} + /* Parse -noconfig common to both programs */ int disable_system_conf=0; int disable_user_conf=0; diff --git a/mpcommon.h b/mpcommon.h index 472125b95b..8a7a334fac 100644 --- a/mpcommon.h +++ b/mpcommon.h @@ -75,6 +75,7 @@ void init_vo_spudec(struct stream *stream, struct sh_video *sh_video, struct sh_ void update_subtitles(struct sh_video *sh_video, double refpts, demux_stream_t *d_dvdsub, int reset); void update_teletext(struct sh_video *sh_video, demuxer_t *demuxer, int reset); int select_audio(demuxer_t* demuxer, int audio_id, char* audio_lang); +int select_video(demuxer_t* demuxer, int video_id); void set_osd_subtitle(subtitle *subs); int cfg_inc_verbose(m_option_t *conf); diff --git a/mplayer.c b/mplayer.c index c9be72225d..d05e8b6410 100644 --- a/mplayer.c +++ b/mplayer.c @@ -3458,6 +3458,10 @@ int main(int argc, char *argv[]) int tmp = ts_prog; mp_property_do("switch_program", M_PROPERTY_SET, &tmp, mpctx); } + + // select video stream + select_video(mpctx->demuxer, video_id); + // select audio stream select_audio(mpctx->demuxer, audio_id, audio_lang);