mirror of
https://github.com/mpv-player/mpv
synced 2025-02-26 02:05:31 +00:00
core: use correct demuxer with -audiofile / -subfile
Various code referred to "mpctx->demuxer" where it should really have referred to the one used for audio/subtitles in case those differ. Fix by using "mpctx->d_audio->demuxer" etc instead. Disable the copying of streams in demux_demuxers; that was a partial workaround for things referring to the main demuxer (and it wasn't enough anyway). This fixes, among other things, switching audio tracks within the file specified by -audiofile.
This commit is contained in:
parent
82cd2f7aec
commit
a7b91626cf
36
command.c
36
command.c
@ -154,7 +154,7 @@ static void update_global_sub_size(MPContext *mpctx)
|
|||||||
|
|
||||||
// update number of demuxer sub streams
|
// update number of demuxer sub streams
|
||||||
for (i = 0; i < MAX_S_STREAMS; i++)
|
for (i = 0; i < MAX_S_STREAMS; i++)
|
||||||
if (mpctx->demuxer->s_streams[i])
|
if (mpctx->d_sub->demuxer->s_streams[i])
|
||||||
cnt++;
|
cnt++;
|
||||||
if (cnt > mpctx->sub_counts[SUB_SOURCE_DEMUX])
|
if (cnt > mpctx->sub_counts[SUB_SOURCE_DEMUX])
|
||||||
mpctx->sub_counts[SUB_SOURCE_DEMUX] = cnt;
|
mpctx->sub_counts[SUB_SOURCE_DEMUX] = cnt;
|
||||||
@ -912,7 +912,7 @@ static int mp_property_audio(m_option_t *prop, int action, void *arg,
|
|||||||
MPContext *mpctx)
|
MPContext *mpctx)
|
||||||
{
|
{
|
||||||
int current_id, tmp;
|
int current_id, tmp;
|
||||||
if (!mpctx->demuxer || !mpctx->demuxer->audio)
|
if (!mpctx->demuxer || !mpctx->d_audio)
|
||||||
return M_PROPERTY_UNAVAILABLE;
|
return M_PROPERTY_UNAVAILABLE;
|
||||||
current_id = mpctx->sh_audio ? mpctx->sh_audio->aid : -2;
|
current_id = mpctx->sh_audio ? mpctx->sh_audio->aid : -2;
|
||||||
|
|
||||||
@ -960,12 +960,12 @@ static int mp_property_audio(m_option_t *prop, int action, void *arg,
|
|||||||
tmp = *((int *) arg);
|
tmp = *((int *) arg);
|
||||||
else
|
else
|
||||||
tmp = -1;
|
tmp = -1;
|
||||||
int new_id = demuxer_switch_audio(mpctx->demuxer, tmp);
|
int new_id = demuxer_switch_audio(mpctx->d_audio->demuxer, tmp);
|
||||||
if (new_id != current_id)
|
if (new_id != current_id)
|
||||||
uninit_player(mpctx, INITIALIZED_AO | INITIALIZED_ACODEC);
|
uninit_player(mpctx, INITIALIZED_AO | INITIALIZED_ACODEC);
|
||||||
if (new_id != current_id && new_id >= 0) {
|
if (new_id != current_id && new_id >= 0) {
|
||||||
sh_audio_t *sh2;
|
sh_audio_t *sh2;
|
||||||
sh2 = mpctx->demuxer->a_streams[mpctx->demuxer->audio->id];
|
sh2 = mpctx->d_audio->demuxer->a_streams[mpctx->demuxer->audio->id];
|
||||||
sh2->ds = mpctx->demuxer->audio;
|
sh2->ds = mpctx->demuxer->audio;
|
||||||
mpctx->sh_audio = sh2;
|
mpctx->sh_audio = sh2;
|
||||||
reinit_audio_chain(mpctx);
|
reinit_audio_chain(mpctx);
|
||||||
@ -984,9 +984,9 @@ static int mp_property_video(m_option_t *prop, int action, void *arg,
|
|||||||
{
|
{
|
||||||
struct MPOpts *opts = &mpctx->opts;
|
struct MPOpts *opts = &mpctx->opts;
|
||||||
int current_id, tmp;
|
int current_id, tmp;
|
||||||
if (!mpctx->demuxer || !mpctx->demuxer->video)
|
if (!mpctx->demuxer || !mpctx->d_video)
|
||||||
return M_PROPERTY_UNAVAILABLE;
|
return M_PROPERTY_UNAVAILABLE;
|
||||||
current_id = mpctx->demuxer->video->id;
|
current_id = mpctx->d_video->id;
|
||||||
|
|
||||||
switch (action) {
|
switch (action) {
|
||||||
case M_PROPERTY_GET:
|
case M_PROPERTY_GET:
|
||||||
@ -1014,17 +1014,17 @@ static int mp_property_video(m_option_t *prop, int action, void *arg,
|
|||||||
tmp = *((int *) arg);
|
tmp = *((int *) arg);
|
||||||
else
|
else
|
||||||
tmp = -1;
|
tmp = -1;
|
||||||
opts->video_id = demuxer_switch_video(mpctx->demuxer, tmp);
|
opts->video_id = demuxer_switch_video(mpctx->d_video->demuxer, tmp);
|
||||||
if (opts->video_id == -2
|
if (opts->video_id == -2
|
||||||
|| (opts->video_id > -1 && mpctx->demuxer->video->id != current_id
|
|| (opts->video_id > -1 && mpctx->d_video->id != current_id
|
||||||
&& current_id != -2))
|
&& current_id != -2))
|
||||||
uninit_player(mpctx, INITIALIZED_VCODEC |
|
uninit_player(mpctx, INITIALIZED_VCODEC |
|
||||||
(mpctx->opts.fixed_vo && opts->video_id != -2 ? 0 : INITIALIZED_VO));
|
(mpctx->opts.fixed_vo && opts->video_id != -2 ? 0 : INITIALIZED_VO));
|
||||||
if (opts->video_id > -1 && mpctx->demuxer->video->id != current_id) {
|
if (opts->video_id > -1 && mpctx->d_video->id != current_id) {
|
||||||
sh_video_t *sh2;
|
sh_video_t *sh2;
|
||||||
sh2 = mpctx->demuxer->v_streams[mpctx->demuxer->video->id];
|
sh2 = mpctx->d_video->demuxer->v_streams[mpctx->d_video->id];
|
||||||
if (sh2) {
|
if (sh2) {
|
||||||
sh2->ds = mpctx->demuxer->video;
|
sh2->ds = mpctx->d_video;
|
||||||
mpctx->sh_video = sh2;
|
mpctx->sh_video = sh2;
|
||||||
reinit_video_chain(mpctx);
|
reinit_video_chain(mpctx);
|
||||||
}
|
}
|
||||||
@ -1546,11 +1546,11 @@ static int mp_property_sub(m_option_t *prop, int action, void *arg,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if ((mpctx->demuxer->type == DEMUXER_TYPE_MATROSKA
|
if ((d_sub->demuxer->type == DEMUXER_TYPE_MATROSKA
|
||||||
|| mpctx->demuxer->type == DEMUXER_TYPE_LAVF
|
|| d_sub->demuxer->type == DEMUXER_TYPE_LAVF
|
||||||
|| mpctx->demuxer->type == DEMUXER_TYPE_LAVF_PREFERRED
|
|| d_sub->demuxer->type == DEMUXER_TYPE_LAVF_PREFERRED
|
||||||
|| mpctx->demuxer->type == DEMUXER_TYPE_OGG)
|
|| d_sub->demuxer->type == DEMUXER_TYPE_OGG)
|
||||||
&& d_sub && d_sub->sh && opts->sub_id >= 0) {
|
&& d_sub->sh && opts->sub_id >= 0) {
|
||||||
const char* lang = ((sh_sub_t*)d_sub->sh)->lang;
|
const char* lang = ((sh_sub_t*)d_sub->sh)->lang;
|
||||||
if (!lang) lang = mp_gtext("unknown");
|
if (!lang) lang = mp_gtext("unknown");
|
||||||
snprintf(*(char **) arg, 63, "(%d) %s", opts->sub_id, lang);
|
snprintf(*(char **) arg, 63, "(%d) %s", opts->sub_id, lang);
|
||||||
@ -1653,10 +1653,10 @@ static int mp_property_sub(m_option_t *prop, int action, void *arg,
|
|||||||
int i = 0;
|
int i = 0;
|
||||||
// default: assume 1:1 mapping of sid and stream id
|
// default: assume 1:1 mapping of sid and stream id
|
||||||
d_sub->id = opts->sub_id;
|
d_sub->id = opts->sub_id;
|
||||||
d_sub->sh = mpctx->demuxer->s_streams[d_sub->id];
|
d_sub->sh = mpctx->d_sub->demuxer->s_streams[d_sub->id];
|
||||||
ds_free_packs(d_sub);
|
ds_free_packs(d_sub);
|
||||||
for (i = 0; i < MAX_S_STREAMS; i++) {
|
for (i = 0; i < MAX_S_STREAMS; i++) {
|
||||||
sh_sub_t *sh = mpctx->demuxer->s_streams[i];
|
sh_sub_t *sh = mpctx->d_sub->demuxer->s_streams[i];
|
||||||
if (sh && sh->sid == opts->sub_id) {
|
if (sh && sh->sid == opts->sub_id) {
|
||||||
d_sub->id = i;
|
d_sub->id = i;
|
||||||
d_sub->sh = sh;
|
d_sub->sh = sh;
|
||||||
|
@ -63,12 +63,12 @@ demuxer_t* new_demuxers_demuxer(demuxer_t* vd, demuxer_t* ad, demuxer_t* sd) {
|
|||||||
if (vd) vd->video->demuxer = ret;
|
if (vd) vd->video->demuxer = ret;
|
||||||
if (ad) ad->audio->demuxer = ret;
|
if (ad) ad->audio->demuxer = ret;
|
||||||
if (sd) sd->sub->demuxer = ret;
|
if (sd) sd->sub->demuxer = ret;
|
||||||
#endif
|
|
||||||
|
|
||||||
// HACK?, necessary for subtitle (and audio and video when implemented) switching
|
// HACK?, necessary for subtitle (and audio and video when implemented) switching
|
||||||
memcpy(ret->v_streams, vd->v_streams, sizeof(ret->v_streams));
|
memcpy(ret->v_streams, vd->v_streams, sizeof(ret->v_streams));
|
||||||
memcpy(ret->a_streams, ad->a_streams, sizeof(ret->a_streams));
|
memcpy(ret->a_streams, ad->a_streams, sizeof(ret->a_streams));
|
||||||
memcpy(ret->s_streams, sd->s_streams, sizeof(ret->s_streams));
|
memcpy(ret->s_streams, sd->s_streams, sizeof(ret->s_streams));
|
||||||
|
#endif
|
||||||
|
|
||||||
ret->desc = &demuxer_desc_demuxers;
|
ret->desc = &demuxer_desc_demuxers;
|
||||||
|
|
||||||
|
@ -1958,9 +1958,10 @@ static int select_subtitle(MPContext *mpctx)
|
|||||||
if (!found && opts->sub_id == -1) {
|
if (!found && opts->sub_id == -1) {
|
||||||
// finally select subs by language and container hints
|
// finally select subs by language and container hints
|
||||||
if (opts->sub_id == -1 && opts->sub_lang)
|
if (opts->sub_id == -1 && opts->sub_lang)
|
||||||
opts->sub_id = demuxer_sub_track_by_lang(mpctx->demuxer, opts->sub_lang);
|
opts->sub_id = demuxer_sub_track_by_lang(mpctx->d_sub->demuxer,
|
||||||
|
opts->sub_lang);
|
||||||
if (opts->sub_id == -1)
|
if (opts->sub_id == -1)
|
||||||
opts->sub_id = demuxer_default_sub_track(mpctx->demuxer);
|
opts->sub_id = demuxer_default_sub_track(mpctx->d_sub->demuxer);
|
||||||
if (opts->sub_id >= 0) {
|
if (opts->sub_id >= 0) {
|
||||||
id = opts->sub_id;
|
id = opts->sub_id;
|
||||||
found = mp_property_do("sub_demux", M_PROPERTY_SET, &id, mpctx) == M_PROPERTY_OK;
|
found = mp_property_do("sub_demux", M_PROPERTY_SET, &id, mpctx) == M_PROPERTY_OK;
|
||||||
@ -3880,7 +3881,7 @@ if (ts_prog) {
|
|||||||
select_audio(mpctx->sources[i].demuxer, opts->audio_id,
|
select_audio(mpctx->sources[i].demuxer, opts->audio_id,
|
||||||
opts->audio_lang);
|
opts->audio_lang);
|
||||||
else
|
else
|
||||||
select_audio(mpctx->demuxer, opts->audio_id, opts->audio_lang);
|
select_audio(mpctx->d_audio->demuxer, opts->audio_id, opts->audio_lang);
|
||||||
|
|
||||||
// DUMP STREAMS:
|
// DUMP STREAMS:
|
||||||
if((stream_dump_type)&&(stream_dump_type<4)){
|
if((stream_dump_type)&&(stream_dump_type<4)){
|
||||||
|
Loading…
Reference in New Issue
Block a user