mirror of
https://github.com/mpv-player/mpv
synced 2024-12-29 10:32:15 +00:00
mplayer: move things out of main()
The main() function used to be way too big, to the point that it was unreadable (> 1000 lines). Move random parts out of the main into new functions.
This commit is contained in:
parent
a78bb28ed6
commit
6f564fe82b
451
mplayer.c
451
mplayer.c
@ -3388,6 +3388,170 @@ static int select_audio(demuxer_t *demuxer, int audio_id, char **audio_lang)
|
||||
return demuxer->audio->id;
|
||||
}
|
||||
|
||||
static void init_input(struct MPContext *mpctx)
|
||||
{
|
||||
mpctx->input = mp_input_init(&mpctx->opts.input);
|
||||
mpctx->key_fifo = mp_fifo_create(mpctx->input, &mpctx->opts);
|
||||
if (slave_mode)
|
||||
mp_input_add_cmd_fd(mpctx->input, 0, USE_FD0_CMD_SELECT, MP_INPUT_SLAVE_CMD_FUNC, NULL);
|
||||
else if (mpctx->opts.consolecontrols)
|
||||
mp_input_add_key_fd(mpctx->input, 0, 1, read_keys, NULL, mpctx->key_fifo);
|
||||
// Set the libstream interrupt callback
|
||||
stream_set_interrupt_callback(mp_input_check_interrupt, mpctx->input);
|
||||
}
|
||||
|
||||
static void open_vobsubs_from_options(struct MPContext *mpctx)
|
||||
{
|
||||
if (mpctx->opts.vobsub_name) {
|
||||
vo_vobsub = vobsub_open(mpctx->opts.vobsub_name, spudec_ifo, 1, &vo_spudec);
|
||||
if (vo_vobsub == NULL)
|
||||
mp_tmsg(MSGT_CPLAYER, MSGL_ERR, "Cannot load subtitles: %s\n",
|
||||
mpctx->opts.vobsub_name);
|
||||
} else if (mpctx->opts.sub_auto) {
|
||||
char **vob = find_vob_subtitles(&mpctx->opts, mpctx->filename);
|
||||
for (int i = 0; i < MP_TALLOC_ELEMS(vob); i++) {
|
||||
vo_vobsub = vobsub_open(vob[i], spudec_ifo, 0, &vo_spudec);
|
||||
if (vo_vobsub)
|
||||
break;
|
||||
}
|
||||
talloc_free(vob);
|
||||
}
|
||||
if (vo_vobsub) {
|
||||
mpctx->initialized_flags |= INITIALIZED_VOBSUB;
|
||||
vobsub_set_from_lang(vo_vobsub, mpctx->opts.sub_lang);
|
||||
mp_property_do("sub_forced_only", M_PROPERTY_SET, &forced_subs_only,
|
||||
mpctx);
|
||||
|
||||
// setup global sub numbering
|
||||
mpctx->sub_counts[SUB_SOURCE_VOBSUB] =
|
||||
vobsub_get_indexes_count(vo_vobsub);
|
||||
}
|
||||
}
|
||||
|
||||
static void open_subtitles_from_options(struct MPContext *mpctx)
|
||||
{
|
||||
// after reading video params we should load subtitles because
|
||||
// we know fps so now we can adjust subtitle time to ~6 seconds AST
|
||||
// check .sub
|
||||
double sub_fps = mpctx->sh_video ? mpctx->sh_video->fps : 25;
|
||||
if (mpctx->opts.sub_name) {
|
||||
for (int i = 0; mpctx->opts.sub_name[i] != NULL; ++i)
|
||||
add_subtitles(mpctx, mpctx->opts.sub_name[i], sub_fps, 0);
|
||||
}
|
||||
if (mpctx->opts.sub_auto) { // auto load sub file ...
|
||||
char **tmp = find_text_subtitles(&mpctx->opts, mpctx->filename);
|
||||
int nsub = MP_TALLOC_ELEMS(tmp);
|
||||
for (int i = 0; i < nsub; i++)
|
||||
add_subtitles(mpctx, tmp[i], sub_fps, 1);
|
||||
talloc_free(tmp);
|
||||
}
|
||||
if (mpctx->set_of_sub_size > 0)
|
||||
mpctx->sub_counts[SUB_SOURCE_SUBS] = mpctx->set_of_sub_size;
|
||||
}
|
||||
|
||||
static void print_timeline(struct MPContext *mpctx)
|
||||
{
|
||||
if (mpctx->timeline) {
|
||||
mpctx->timeline_part = 0;
|
||||
mpctx->demuxer = mpctx->timeline[0].source->demuxer;
|
||||
|
||||
int part_count = mpctx->num_timeline_parts;
|
||||
mp_msg(MSGT_CPLAYER, MSGL_V, "Timeline contains %d parts from %d "
|
||||
"sources. Total length %.3f seconds.\n", part_count,
|
||||
mpctx->num_sources, mpctx->timeline[part_count].start);
|
||||
mp_msg(MSGT_CPLAYER, MSGL_V, "Source files:\n");
|
||||
for (int i = 0; i < mpctx->num_sources; i++)
|
||||
mp_msg(MSGT_CPLAYER, MSGL_V, "%d: %s\n", i,
|
||||
mpctx->sources[i].demuxer->filename);
|
||||
mp_msg(MSGT_CPLAYER, MSGL_V, "Timeline parts: (number, start, "
|
||||
"source_start, source):\n");
|
||||
for (int i = 0; i < part_count; i++) {
|
||||
struct timeline_part *p = mpctx->timeline + i;
|
||||
mp_msg(MSGT_CPLAYER, MSGL_V, "%3d %9.3f %9.3f %3td\n", i, p->start,
|
||||
p->source_start, p->source - mpctx->sources);
|
||||
}
|
||||
mp_msg(MSGT_CPLAYER, MSGL_V, "END %9.3f\n",
|
||||
mpctx->timeline[part_count].start);
|
||||
}
|
||||
}
|
||||
|
||||
static void add_subtitle_fonts_from_sources(struct MPContext *mpctx)
|
||||
{
|
||||
#ifdef CONFIG_ASS
|
||||
if (mpctx->opts.ass_enabled && mpctx->ass_library) {
|
||||
for (int j = 0; j < mpctx->num_sources; j++) {
|
||||
struct demuxer *d = mpctx->sources[j].demuxer;
|
||||
for (int i = 0; i < d->num_attachments; i++) {
|
||||
struct demux_attachment *att = d->attachments + i;
|
||||
if (mpctx->opts.use_embedded_fonts && attachment_is_font(att))
|
||||
ass_add_font(mpctx->ass_library, att->name, att->data,
|
||||
att->data_size);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
// Read data from a playlist, and add the entries to the mplayer playlist.
|
||||
// Return true if playlist entries were added.
|
||||
static bool process_playlist_demuxer(struct MPContext *mpctx)
|
||||
{
|
||||
// HACK to get MOV Reference Files working
|
||||
if (mpctx->demuxer && mpctx->demuxer->type == DEMUXER_TYPE_PLAYLIST) {
|
||||
unsigned char *playlist_entry;
|
||||
int entries_added = 0;
|
||||
|
||||
while (ds_get_packet(mpctx->demuxer->video, &playlist_entry) > 0) {
|
||||
char *temp;
|
||||
const char *bname;
|
||||
|
||||
mp_msg(MSGT_CPLAYER, MSGL_V, "Adding file %s to element entry.\n",
|
||||
playlist_entry);
|
||||
|
||||
bname = mp_basename(playlist_entry);
|
||||
if ((strlen(bname) > 10) && !strncmp(bname, "qt", 2) &&
|
||||
!strncmp(bname + 3, "gateQT", 6))
|
||||
continue;
|
||||
|
||||
if (!strcmp(playlist_entry, mpctx->filename)) // self-reference
|
||||
continue;
|
||||
|
||||
if (mpctx->filename && !strcmp(mp_basename(playlist_entry),
|
||||
playlist_entry)) { // add reference path of current file
|
||||
temp = malloc((strlen(mpctx->filename) - strlen(mp_basename(
|
||||
mpctx->filename)) + strlen(playlist_entry) + 1));
|
||||
if (temp) {
|
||||
strncpy(temp, mpctx->filename, strlen(mpctx->filename) -
|
||||
strlen(mp_basename(mpctx->filename)));
|
||||
temp[strlen(mpctx->filename) - strlen(mp_basename(
|
||||
mpctx->filename))] = '\0';
|
||||
strcat(temp, playlist_entry);
|
||||
if (!strcmp(temp, mpctx->filename)) {
|
||||
free(temp);
|
||||
continue;
|
||||
}
|
||||
playlist_add_file(mpctx->playlist, temp);
|
||||
entries_added++;
|
||||
mp_msg(MSGT_CPLAYER, MSGL_V,
|
||||
"Resolving reference to %s.\n", temp);
|
||||
free(temp);
|
||||
}
|
||||
} else {
|
||||
playlist_add_file(mpctx->playlist, playlist_entry);
|
||||
entries_added++;
|
||||
}
|
||||
}
|
||||
free_demuxer(mpctx->demuxer);
|
||||
mpctx->demuxer = NULL;
|
||||
|
||||
if (entries_added) {
|
||||
mpctx->stop_play = PT_NEXT_ENTRY;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// Waiting for the slave master to send us a new file to play.
|
||||
static void idle_loop(struct MPContext *mpctx)
|
||||
{
|
||||
@ -3408,6 +3572,70 @@ static void print_version(int always)
|
||||
"%s (C) 2000-2012\n", mplayer_version);
|
||||
}
|
||||
|
||||
static bool handle_help_options(struct MPContext *mpctx)
|
||||
{
|
||||
struct MPOpts *opts = &mpctx->opts;
|
||||
int opt_exit = 0;
|
||||
if (opts->video_driver_list &&
|
||||
strcmp(opts->video_driver_list[0], "help") == 0) {
|
||||
list_video_out();
|
||||
opt_exit = 1;
|
||||
}
|
||||
if (opts->audio_driver_list &&
|
||||
strcmp(opts->audio_driver_list[0], "help") == 0) {
|
||||
list_audio_out();
|
||||
opt_exit = 1;
|
||||
}
|
||||
if (audio_codec_list && strcmp(audio_codec_list[0], "help") == 0) {
|
||||
mp_tmsg(MSGT_CPLAYER, MSGL_INFO, "Available audio codecs:\n");
|
||||
mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AUDIO_CODECS\n");
|
||||
list_codecs(1);
|
||||
mp_msg(MSGT_FIXME, MSGL_FIXME, "\n");
|
||||
opt_exit = 1;
|
||||
}
|
||||
if (video_codec_list && strcmp(video_codec_list[0], "help") == 0) {
|
||||
mp_tmsg(MSGT_CPLAYER, MSGL_INFO, "Available video codecs:\n");
|
||||
mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VIDEO_CODECS\n");
|
||||
list_codecs(0);
|
||||
mp_msg(MSGT_FIXME, MSGL_FIXME, "\n");
|
||||
opt_exit = 1;
|
||||
}
|
||||
if (video_fm_list && strcmp(video_fm_list[0], "help") == 0) {
|
||||
vfm_help();
|
||||
mp_msg(MSGT_FIXME, MSGL_FIXME, "\n");
|
||||
opt_exit = 1;
|
||||
}
|
||||
if (audio_fm_list && strcmp(audio_fm_list[0], "help") == 0) {
|
||||
afm_help();
|
||||
mp_msg(MSGT_FIXME, MSGL_FIXME, "\n");
|
||||
opt_exit = 1;
|
||||
}
|
||||
if (af_cfg.list && strcmp(af_cfg.list[0], "help") == 0) {
|
||||
af_help();
|
||||
printf("\n");
|
||||
opt_exit = 1;
|
||||
}
|
||||
#ifdef CONFIG_X11
|
||||
if (vo_fstype_list && strcmp(vo_fstype_list[0], "help") == 0) {
|
||||
fstype_help();
|
||||
mp_msg(MSGT_FIXME, MSGL_FIXME, "\n");
|
||||
opt_exit = 1;
|
||||
}
|
||||
#endif
|
||||
if ((opts->demuxer_name && strcmp(opts->demuxer_name, "help") == 0) ||
|
||||
(opts->audio_demuxer_name && strcmp(opts->audio_demuxer_name, "help") == 0) ||
|
||||
(opts->sub_demuxer_name && strcmp(opts->sub_demuxer_name, "help") == 0)) {
|
||||
demuxer_help();
|
||||
mp_msg(MSGT_CPLAYER, MSGL_INFO, "\n");
|
||||
opt_exit = 1;
|
||||
}
|
||||
if (opts->list_properties) {
|
||||
property_print_help();
|
||||
opt_exit = 1;
|
||||
}
|
||||
return opt_exit;
|
||||
}
|
||||
|
||||
#ifdef PTW32_STATIC_LIB
|
||||
static void detach_ptw32(void)
|
||||
{
|
||||
@ -3473,10 +3701,6 @@ int main(int argc, char *argv[])
|
||||
|| !strcmp(argv[1], "--leak-report")))
|
||||
talloc_enable_leak_report();
|
||||
|
||||
/* Flag indicating whether MPlayer should exit without playing anything. */
|
||||
int opt_exit = 0;
|
||||
int i;
|
||||
|
||||
struct MPContext *mpctx = talloc(NULL, MPContext);
|
||||
*mpctx = (struct MPContext){
|
||||
.osd_function = OSD_PLAY,
|
||||
@ -3514,25 +3738,13 @@ int main(int argc, char *argv[])
|
||||
{
|
||||
mpctx->playlist->current = mpctx->playlist->first;
|
||||
} else {
|
||||
opt_exit = 1;
|
||||
exit_player(mpctx, EXIT_ERROR);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PRIORITY
|
||||
set_priority();
|
||||
#endif
|
||||
|
||||
if (opts->video_driver_list &&
|
||||
strcmp(opts->video_driver_list[0], "help") == 0) {
|
||||
list_video_out();
|
||||
opt_exit = 1;
|
||||
}
|
||||
|
||||
if (opts->audio_driver_list &&
|
||||
strcmp(opts->audio_driver_list[0], "help") == 0) {
|
||||
list_audio_out();
|
||||
opt_exit = 1;
|
||||
}
|
||||
|
||||
/* Check codecs.conf. */
|
||||
if (!codecs_file || !parse_codec_cfg(codecs_file)) {
|
||||
char *mem_ptr;
|
||||
@ -3547,55 +3759,7 @@ int main(int argc, char *argv[])
|
||||
free(mem_ptr); // release the buffer created by get_path()
|
||||
}
|
||||
|
||||
if (audio_codec_list && strcmp(audio_codec_list[0], "help") == 0) {
|
||||
mp_tmsg(MSGT_CPLAYER, MSGL_INFO, "Available audio codecs:\n");
|
||||
mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AUDIO_CODECS\n");
|
||||
list_codecs(1);
|
||||
mp_msg(MSGT_FIXME, MSGL_FIXME, "\n");
|
||||
opt_exit = 1;
|
||||
}
|
||||
if (video_codec_list && strcmp(video_codec_list[0], "help") == 0) {
|
||||
mp_tmsg(MSGT_CPLAYER, MSGL_INFO, "Available video codecs:\n");
|
||||
mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VIDEO_CODECS\n");
|
||||
list_codecs(0);
|
||||
mp_msg(MSGT_FIXME, MSGL_FIXME, "\n");
|
||||
opt_exit = 1;
|
||||
}
|
||||
if (video_fm_list && strcmp(video_fm_list[0], "help") == 0) {
|
||||
vfm_help();
|
||||
mp_msg(MSGT_FIXME, MSGL_FIXME, "\n");
|
||||
opt_exit = 1;
|
||||
}
|
||||
if (audio_fm_list && strcmp(audio_fm_list[0], "help") == 0) {
|
||||
afm_help();
|
||||
mp_msg(MSGT_FIXME, MSGL_FIXME, "\n");
|
||||
opt_exit = 1;
|
||||
}
|
||||
if (af_cfg.list && strcmp(af_cfg.list[0], "help") == 0) {
|
||||
af_help();
|
||||
printf("\n");
|
||||
opt_exit = 1;
|
||||
}
|
||||
#ifdef CONFIG_X11
|
||||
if (vo_fstype_list && strcmp(vo_fstype_list[0], "help") == 0) {
|
||||
fstype_help();
|
||||
mp_msg(MSGT_FIXME, MSGL_FIXME, "\n");
|
||||
opt_exit = 1;
|
||||
}
|
||||
#endif
|
||||
if ((opts->demuxer_name && strcmp(opts->demuxer_name, "help") == 0) ||
|
||||
(opts->audio_demuxer_name && strcmp(opts->audio_demuxer_name, "help") == 0) ||
|
||||
(opts->sub_demuxer_name && strcmp(opts->sub_demuxer_name, "help") == 0)) {
|
||||
demuxer_help();
|
||||
mp_msg(MSGT_CPLAYER, MSGL_INFO, "\n");
|
||||
opt_exit = 1;
|
||||
}
|
||||
if (opts->list_properties) {
|
||||
property_print_help();
|
||||
opt_exit = 1;
|
||||
}
|
||||
|
||||
if (opt_exit)
|
||||
if (handle_help_options(mpctx))
|
||||
exit_player(mpctx, EXIT_NONE);
|
||||
|
||||
if (!mpctx->playlist->first && !opts->player_idle_mode) {
|
||||
@ -3611,7 +3775,7 @@ int main(int argc, char *argv[])
|
||||
// Many users forget to include command line in bugreports...
|
||||
if (mp_msg_test(MSGT_CPLAYER, MSGL_V)) {
|
||||
mp_tmsg(MSGT_CPLAYER, MSGL_INFO, "CommandLine:");
|
||||
for (i = 1; i < argc; i++)
|
||||
for (int i = 1; i < argc; i++)
|
||||
mp_msg(MSGT_CPLAYER, MSGL_INFO, " '%s'", argv[i]);
|
||||
mp_msg(MSGT_CPLAYER, MSGL_INFO, "\n");
|
||||
}
|
||||
@ -3624,17 +3788,7 @@ int main(int argc, char *argv[])
|
||||
|
||||
mpctx->osd = osd_create(opts, mpctx->ass_library);
|
||||
|
||||
// ========== Init keyboard FIFO (connection to libvo) ============
|
||||
|
||||
// Init input system
|
||||
mpctx->input = mp_input_init(&opts->input);
|
||||
mpctx->key_fifo = mp_fifo_create(mpctx->input, opts);
|
||||
if (slave_mode)
|
||||
mp_input_add_cmd_fd(mpctx->input, 0, USE_FD0_CMD_SELECT, MP_INPUT_SLAVE_CMD_FUNC, NULL);
|
||||
else if (opts->consolecontrols)
|
||||
mp_input_add_key_fd(mpctx->input, 0, 1, read_keys, NULL, mpctx->key_fifo);
|
||||
// Set the libstream interrupt callback
|
||||
stream_set_interrupt_callback(mp_input_check_interrupt, mpctx->input);
|
||||
init_input(mpctx);
|
||||
|
||||
// ***************** Now, let's see the per-file stuff ******************
|
||||
|
||||
@ -3702,32 +3856,7 @@ play_next_file:
|
||||
}
|
||||
}
|
||||
|
||||
//==================== Open VOB-Sub ============================
|
||||
|
||||
if (opts->vobsub_name) {
|
||||
vo_vobsub = vobsub_open(opts->vobsub_name, spudec_ifo, 1, &vo_spudec);
|
||||
if (vo_vobsub == NULL)
|
||||
mp_tmsg(MSGT_CPLAYER, MSGL_ERR, "Cannot load subtitles: %s\n",
|
||||
opts->vobsub_name);
|
||||
} else if (opts->sub_auto) {
|
||||
char **vob = find_vob_subtitles(opts, mpctx->filename);
|
||||
for (int i = 0; i < MP_TALLOC_ELEMS(vob); i++) {
|
||||
vo_vobsub = vobsub_open(vob[i], spudec_ifo, 0, &vo_spudec);
|
||||
if (vo_vobsub)
|
||||
break;
|
||||
}
|
||||
talloc_free(vob);
|
||||
}
|
||||
if (vo_vobsub) {
|
||||
mpctx->initialized_flags |= INITIALIZED_VOBSUB;
|
||||
vobsub_set_from_lang(vo_vobsub, opts->sub_lang);
|
||||
mp_property_do("sub_forced_only", M_PROPERTY_SET, &forced_subs_only,
|
||||
mpctx);
|
||||
|
||||
// setup global sub numbering
|
||||
mpctx->sub_counts[SUB_SOURCE_VOBSUB] =
|
||||
vobsub_get_indexes_count(vo_vobsub);
|
||||
}
|
||||
open_vobsubs_from_options(mpctx);
|
||||
|
||||
//============ Open & Sync STREAM --- fork cache2 ====================
|
||||
|
||||
@ -3816,60 +3945,8 @@ goto_enable_cache:
|
||||
opts->audio_id, opts->video_id, opts->sub_id,
|
||||
mpctx->filename);
|
||||
|
||||
// HACK to get MOV Reference Files working
|
||||
|
||||
if (mpctx->demuxer && mpctx->demuxer->type == DEMUXER_TYPE_PLAYLIST) {
|
||||
unsigned char *playlist_entry;
|
||||
int entries_added = 0;
|
||||
|
||||
while (ds_get_packet(mpctx->demuxer->video, &playlist_entry) > 0) {
|
||||
char *temp;
|
||||
const char *bname;
|
||||
|
||||
mp_msg(MSGT_CPLAYER, MSGL_V, "Adding file %s to element entry.\n",
|
||||
playlist_entry);
|
||||
|
||||
bname = mp_basename(playlist_entry);
|
||||
if ((strlen(bname) > 10) && !strncmp(bname, "qt", 2) &&
|
||||
!strncmp(bname + 3, "gateQT", 6))
|
||||
continue;
|
||||
|
||||
if (!strcmp(playlist_entry, mpctx->filename)) // self-reference
|
||||
continue;
|
||||
|
||||
if (mpctx->filename && !strcmp(mp_basename(playlist_entry),
|
||||
playlist_entry)) { // add reference path of current file
|
||||
temp = malloc((strlen(mpctx->filename) - strlen(mp_basename(
|
||||
mpctx->filename)) + strlen(playlist_entry) + 1));
|
||||
if (temp) {
|
||||
strncpy(temp, mpctx->filename, strlen(mpctx->filename) -
|
||||
strlen(mp_basename(mpctx->filename)));
|
||||
temp[strlen(mpctx->filename) - strlen(mp_basename(
|
||||
mpctx->filename))] = '\0';
|
||||
strcat(temp, playlist_entry);
|
||||
if (!strcmp(temp, mpctx->filename)) {
|
||||
free(temp);
|
||||
continue;
|
||||
}
|
||||
playlist_add_file(mpctx->playlist, temp);
|
||||
entries_added++;
|
||||
mp_msg(MSGT_CPLAYER, MSGL_V,
|
||||
"Resolving reference to %s.\n", temp);
|
||||
free(temp);
|
||||
}
|
||||
} else {
|
||||
playlist_add_file(mpctx->playlist, playlist_entry);
|
||||
entries_added++;
|
||||
}
|
||||
}
|
||||
free_demuxer(mpctx->demuxer);
|
||||
mpctx->demuxer = NULL;
|
||||
|
||||
if (entries_added) {
|
||||
mpctx->stop_play = PT_NEXT_ENTRY;
|
||||
if (process_playlist_demuxer(mpctx))
|
||||
goto goto_next_file;
|
||||
}
|
||||
}
|
||||
|
||||
if (!mpctx->demuxer) {
|
||||
mp_tmsg(MSGT_CPLAYER, MSGL_ERR, "Failed to recognize file format.\n");
|
||||
@ -3885,28 +3962,7 @@ goto_enable_cache:
|
||||
if (mpctx->demuxer->type == DEMUXER_TYPE_CUE)
|
||||
build_cue_timeline(mpctx);
|
||||
|
||||
if (mpctx->timeline) {
|
||||
mpctx->timeline_part = 0;
|
||||
mpctx->demuxer = mpctx->timeline[0].source->demuxer;
|
||||
|
||||
int part_count = mpctx->num_timeline_parts;
|
||||
mp_msg(MSGT_CPLAYER, MSGL_V, "Timeline contains %d parts from %d "
|
||||
"sources. Total length %.3f seconds.\n", part_count,
|
||||
mpctx->num_sources, mpctx->timeline[part_count].start);
|
||||
mp_msg(MSGT_CPLAYER, MSGL_V, "Source files:\n");
|
||||
for (int i = 0; i < mpctx->num_sources; i++)
|
||||
mp_msg(MSGT_CPLAYER, MSGL_V, "%d: %s\n", i,
|
||||
mpctx->sources[i].demuxer->filename);
|
||||
mp_msg(MSGT_CPLAYER, MSGL_V, "Timeline parts: (number, start, "
|
||||
"source_start, source):\n");
|
||||
for (int i = 0; i < part_count; i++) {
|
||||
struct timeline_part *p = mpctx->timeline + i;
|
||||
mp_msg(MSGT_CPLAYER, MSGL_V, "%3d %9.3f %9.3f %3td\n", i, p->start,
|
||||
p->source_start, p->source - mpctx->sources);
|
||||
}
|
||||
mp_msg(MSGT_CPLAYER, MSGL_V, "END %9.3f\n",
|
||||
mpctx->timeline[part_count].start);
|
||||
}
|
||||
print_timeline(mpctx);
|
||||
|
||||
if (!mpctx->sources) {
|
||||
mpctx->sources = talloc_ptrtype(NULL, mpctx->sources);
|
||||
@ -3919,19 +3975,7 @@ goto_enable_cache:
|
||||
|
||||
mpctx->initialized_flags |= INITIALIZED_DEMUXER;
|
||||
|
||||
#ifdef CONFIG_ASS
|
||||
if (opts->ass_enabled && mpctx->ass_library) {
|
||||
for (int j = 0; j < mpctx->num_sources; j++) {
|
||||
struct demuxer *d = mpctx->sources[j].demuxer;
|
||||
for (int i = 0; i < d->num_attachments; i++) {
|
||||
struct demux_attachment *att = d->attachments + i;
|
||||
if (opts->use_embedded_fonts && attachment_is_font(att))
|
||||
ass_add_font(mpctx->ass_library, att->name, att->data,
|
||||
att->data_size);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
add_subtitle_fonts_from_sources(mpctx);
|
||||
|
||||
mpctx->d_audio = mpctx->demuxer->audio;
|
||||
mpctx->d_video = mpctx->demuxer->video;
|
||||
@ -3997,23 +4041,7 @@ goto_enable_cache:
|
||||
|| mpctx->stream->type == STREAMTYPE_DVDNAV))
|
||||
init_vo_spudec(mpctx);
|
||||
|
||||
// after reading video params we should load subtitles because
|
||||
// we know fps so now we can adjust subtitle time to ~6 seconds AST
|
||||
// check .sub
|
||||
double sub_fps = mpctx->sh_video ? mpctx->sh_video->fps : 25;
|
||||
if (opts->sub_name) {
|
||||
for (i = 0; opts->sub_name[i] != NULL; ++i)
|
||||
add_subtitles(mpctx, opts->sub_name[i], sub_fps, 0);
|
||||
}
|
||||
if (opts->sub_auto) { // auto load sub file ...
|
||||
char **tmp = find_text_subtitles(opts, mpctx->filename);
|
||||
int nsub = MP_TALLOC_ELEMS(tmp);
|
||||
for (int i = 0; i < nsub; i++)
|
||||
add_subtitles(mpctx, tmp[i], sub_fps, 1);
|
||||
talloc_free(tmp);
|
||||
}
|
||||
if (mpctx->set_of_sub_size > 0)
|
||||
mpctx->sub_counts[SUB_SOURCE_SUBS] = mpctx->set_of_sub_size;
|
||||
open_subtitles_from_options(mpctx);
|
||||
|
||||
select_subtitle(mpctx);
|
||||
|
||||
@ -4033,7 +4061,6 @@ goto_enable_cache:
|
||||
free(msg);
|
||||
}
|
||||
|
||||
|
||||
// Disable the term OSD in verbose mode
|
||||
if (verbose)
|
||||
opts->term_osd = 0;
|
||||
@ -4041,7 +4068,7 @@ goto_enable_cache:
|
||||
// Make sure old OSD does not stay around
|
||||
clear_osd_msgs();
|
||||
|
||||
//================ SETUP AUDIO ==========================
|
||||
//================ SETUP STREAMS ==========================
|
||||
|
||||
if (mpctx->sh_audio) {
|
||||
reinit_audio_chain(mpctx);
|
||||
@ -4194,7 +4221,7 @@ goto_next_file: // don't jump here after ao/vo/getch initialization!
|
||||
mpctx->filename = NULL;
|
||||
|
||||
if (mpctx->set_of_sub_size > 0) {
|
||||
for (i = 0; i < mpctx->set_of_sub_size; ++i) {
|
||||
for (int i = 0; i < mpctx->set_of_sub_size; ++i) {
|
||||
sub_free(mpctx->set_of_subtitles[i]);
|
||||
#ifdef CONFIG_ASS
|
||||
if (mpctx->set_of_ass_tracks[i])
|
||||
|
Loading…
Reference in New Issue
Block a user