Mercurial > mplayer.hg
diff mplayer.c @ 31612:7fc1f051a19f
Change global subtitle numbering scheme so that demuxers can "asynchronously"
add subtitles during playback.
author | reimar |
---|---|
date | Sat, 10 Jul 2010 20:48:50 +0000 |
parents | c593c72884bb |
children | 05a6d70df204 |
line wrap: on
line diff
--- a/mplayer.c Sat Jul 10 18:53:08 2010 +0000 +++ b/mplayer.c Sat Jul 10 20:48:50 2010 +0000 @@ -1875,32 +1875,42 @@ return time_frame; } -static void select_subtitle(MPContext *mpctx) +static int select_subtitle(MPContext *mpctx) { // find the best sub to use - int vobsub_index_id = vobsub_get_index_by_id(vo_vobsub, vobsub_id); + int id; + int found = 0; mpctx->global_sub_pos = -1; // no subs by default - if (vobsub_index_id >= 0) { + if (vobsub_id >= 0) { // if user asks for a vobsub id, use that first. - mpctx->global_sub_pos = mpctx->global_sub_indices[SUB_SOURCE_VOBSUB] + vobsub_index_id; - } else if (dvdsub_id >= 0 && mpctx->global_sub_indices[SUB_SOURCE_DEMUX] >= 0) { + id = vobsub_id; + found = mp_property_do("sub_vob", M_PROPERTY_SET, &id, mpctx) == M_PROPERTY_OK; + } + + if (!found && dvdsub_id >= 0) { // if user asks for a dvd sub id, use that next. - mpctx->global_sub_pos = mpctx->global_sub_indices[SUB_SOURCE_DEMUX] + dvdsub_id; - } else if (mpctx->global_sub_indices[SUB_SOURCE_SUBS] >= 0) { + id = dvdsub_id; + found = mp_property_do("sub_demux", M_PROPERTY_SET, &id, mpctx) == M_PROPERTY_OK; + } + + if (!found) { // if there are text subs to use, use those. (autosubs come last here) - mpctx->global_sub_pos = mpctx->global_sub_indices[SUB_SOURCE_SUBS]; - } else if (dvdsub_id == -1 && mpctx->global_sub_indices[SUB_SOURCE_DEMUX] >= 0) { + id = 0; + found = mp_property_do("sub_file", M_PROPERTY_SET, &id, mpctx) == M_PROPERTY_OK; + } + + if (!found && dvdsub_id == -1) { // finally select subs by language and container hints if (dvdsub_id == -1 && dvdsub_lang) dvdsub_id = demuxer_sub_track_by_lang(mpctx->demuxer, dvdsub_lang); if (dvdsub_id == -1) dvdsub_id = demuxer_default_sub_track(mpctx->demuxer); - if (dvdsub_id >= 0) - mpctx->global_sub_pos = mpctx->global_sub_indices[SUB_SOURCE_DEMUX] + dvdsub_id; + if (dvdsub_id >= 0) { + id = dvdsub_id; + found = mp_property_do("sub_demux", M_PROPERTY_SET, &id, mpctx) == M_PROPERTY_OK; + } } - // rather than duplicate code, use the SUB_SELECT handler to init the right one. - mpctx->global_sub_pos--; - mp_property_do("sub",M_PROPERTY_STEP_UP,NULL, mpctx); + return found; } #ifdef CONFIG_DVDNAV @@ -1959,7 +1969,7 @@ } audio_delay = 0.0f; - mpctx->global_sub_size = mpctx->global_sub_indices[SUB_SOURCE_DEMUX] + mp_dvdnav_number_of_subs(mpctx->stream); + mpctx->sub_counts[SUB_SOURCE_DEMUX] = mp_dvdnav_number_of_subs(mpctx->stream); if (dvdsub_lang && dvdsub_id == dvdsub_lang_id) { dvdsub_lang_id = mp_dvdnav_sid_from_lang(ctx->stream, dvdsub_lang); if (dvdsub_lang_id != dvdsub_id) { @@ -3050,7 +3060,7 @@ // init global sub numbers mpctx->global_sub_size = 0; - { int i; for (i = 0; i < SUB_SOURCES; i++) mpctx->global_sub_indices[i] = -1; } + memset(mpctx->sub_counts, 0, sizeof(mpctx->sub_counts)); if (filename) { load_per_protocol_config (mconfig, filename); @@ -3237,8 +3247,7 @@ mp_property_do("sub_forced_only", M_PROPERTY_SET, &forced_subs_only, mpctx); // setup global sub numbering - mpctx->global_sub_indices[SUB_SOURCE_VOBSUB] = mpctx->global_sub_size; // the global # of the first vobsub. - mpctx->global_sub_size += vobsub_get_indexes_count(vo_vobsub); + mpctx->sub_counts[SUB_SOURCE_VOBSUB] = vobsub_get_indexes_count(vo_vobsub); } //============ Open & Sync STREAM --- fork cache2 ==================== @@ -3325,8 +3334,7 @@ if(audio_id==-1) audio_id=dvd_aid_from_lang(mpctx->stream,audio_lang); if(dvdsub_lang && dvdsub_id==-1) dvdsub_id=dvd_sid_from_lang(mpctx->stream,dvdsub_lang); // setup global sub numbering - mpctx->global_sub_indices[SUB_SOURCE_DEMUX] = mpctx->global_sub_size; // the global # of the first demux-specific sub. - mpctx->global_sub_size += dvd_number_of_subs(mpctx->stream); + mpctx->sub_counts[SUB_SOURCE_DEMUX] = dvd_number_of_subs(mpctx->stream); current_module=NULL; } #endif @@ -3339,8 +3347,7 @@ if(dvdsub_lang && dvdsub_id==-1) dvdsub_lang_id=dvdsub_id=mp_dvdnav_sid_from_lang(mpctx->stream,dvdsub_lang); // setup global sub numbering - mpctx->global_sub_indices[SUB_SOURCE_DEMUX] = mpctx->global_sub_size; // the global # of the first demux-specific sub. - mpctx->global_sub_size += mp_dvdnav_number_of_subs(mpctx->stream); + mpctx->sub_counts[SUB_SOURCE_DEMUX] = mp_dvdnav_number_of_subs(mpctx->stream); current_module=NULL; } #endif @@ -3433,20 +3440,6 @@ initialized_flags|=INITIALIZED_DEMUXER; -if (mpctx->stream->type != STREAMTYPE_DVD && mpctx->stream->type != STREAMTYPE_DVDNAV) { - int i; - int maxid = -1; - // setup global sub numbering - mpctx->global_sub_indices[SUB_SOURCE_DEMUX] = mpctx->global_sub_size; // the global # of the first demux-specific sub. - for (i = 0; i < MAX_S_STREAMS; i++) - if (mpctx->demuxer->s_streams[i]) - maxid = FFMAX(maxid, ((sh_sub_t *)mpctx->demuxer->s_streams[i])->sid); - mpctx->global_sub_size += maxid + 1; -} -// Make dvdsub_id always selectable if set. -if (mpctx->global_sub_size <= mpctx->global_sub_indices[SUB_SOURCE_DEMUX] + dvdsub_id) - mpctx->global_sub_size = mpctx->global_sub_indices[SUB_SOURCE_DEMUX] + dvdsub_id + 1; - #ifdef CONFIG_ASS if (ass_enabled && ass_library) { for (i = 0; i < mpctx->demuxer->num_attachments; ++i) { @@ -3596,15 +3589,11 @@ } free(tmp); } - if (mpctx->set_of_sub_size > 0) { - // setup global sub numbering - mpctx->global_sub_indices[SUB_SOURCE_SUBS] = mpctx->global_sub_size; // the global # of the first sub. - mpctx->global_sub_size += mpctx->set_of_sub_size; - } + if (mpctx->set_of_sub_size > 0) + mpctx->sub_counts[SUB_SOURCE_SUBS] = mpctx->set_of_sub_size; } -if (mpctx->global_sub_size) { - select_subtitle(mpctx); +if (select_subtitle(mpctx)) { if(subdata) switch (stream_dump_type) { case 3: list_sub_file(subdata); break;