static void reinit_subdec(struct MPContext *mpctx, struct track *track, struct dec_sub *dec_sub) { struct MPOpts *opts = mpctx->opts; if (sub_is_initialized(dec_sub)) return; struct sh_video *sh_video = mpctx->d_video ? mpctx->d_video->header->video : NULL; int w = sh_video ? sh_video->disp_w : 0; int h = sh_video ? sh_video->disp_h : 0; float fps = sh_video ? sh_video->fps : 25; init_sub_renderer(mpctx); sub_set_video_res(dec_sub, w, h); sub_set_video_fps(dec_sub, fps); sub_set_ass_renderer(dec_sub, mpctx->ass_library, mpctx->ass_renderer, &mpctx->ass_lock); sub_init_from_sh(dec_sub, track->stream); // Don't do this if the file has video/audio streams. Don't do it even // if it has only sub streams, because reading packets will change the // demuxer position. if (!track->preloaded && track->is_external && !opts->sub_clear_on_seek) { demux_seek(track->demuxer, 0, SEEK_ABSOLUTE); track->preloaded = sub_read_all_packets(dec_sub, track->stream); if (track->preloaded) demux_stop_thread(track->demuxer); } }
void reinit_subs(struct MPContext *mpctx) { struct MPOpts *opts = mpctx->opts; struct track *track = mpctx->current_track[STREAM_SUB]; assert(!(mpctx->initialized_flags & INITIALIZED_SUB)); init_demux_stream(mpctx, STREAM_SUB); struct sh_stream *sh = mpctx->sh[STREAM_SUB]; // No track selected, or lazily added DVD track (will actually be created // on first sub packet) if (!sh) return; if (!sh->sub->dec_sub) { assert(!mpctx->d_sub); sh->sub->dec_sub = sub_create(mpctx->global); } assert(!mpctx->d_sub || sh->sub->dec_sub == mpctx->d_sub); // The decoder is kept in the stream header in order to make ordered // chapters work well. mpctx->d_sub = sh->sub->dec_sub; mpctx->initialized_flags |= INITIALIZED_SUB; struct dec_sub *dec_sub = mpctx->d_sub; assert(dec_sub); if (!sub_is_initialized(dec_sub)) { struct sh_video *sh_video = mpctx->d_video ? mpctx->d_video->header->video : NULL; int w = sh_video ? sh_video->disp_w : 0; int h = sh_video ? sh_video->disp_h : 0; float fps = sh_video ? sh_video->fps : 25; set_dvdsub_fake_extradata(dec_sub, track->demuxer->stream, w, h); sub_set_video_res(dec_sub, w, h); sub_set_video_fps(dec_sub, fps); sub_set_ass_renderer(dec_sub, mpctx->ass_library, mpctx->ass_renderer); sub_init_from_sh(dec_sub, sh); // Don't do this if the file has video/audio streams. Don't do it even // if it has only sub streams, because reading packets will change the // demuxer position. if (!track->preloaded && track->is_external) { demux_seek(track->demuxer, 0, SEEK_ABSOLUTE); track->preloaded = sub_read_all_packets(dec_sub, sh); } } mpctx->osd->dec_sub = dec_sub; // Decides whether to use OSD path or normal subtitle rendering path. mpctx->osd->render_bitmap_subs = opts->ass_enabled || !sub_has_get_text(dec_sub); reset_subtitles(mpctx); }