/** * \brief Convert subdata to ASS_Track * \param subdata subtitles struct from subreader * \param fps video framerate * \return newly allocated ASS_Track, filled with subtitles from subdata */ ASS_Track *mp_ass_read_subdata(ASS_Library *library, sub_data *subdata, double fps) { ASS_Track *track; int i; track = mp_ass_default_track(library); track->name = subdata->filename ? strdup(subdata->filename) : 0; for (i = 0; i < subdata->sub_num; ++i) { int eid = ass_process_subtitle(track, subdata->subtitles + i); if (eid < 0) continue; if (!subdata->sub_uses_time) { track->events[eid].Start *= 100. / fps; track->events[eid].Duration *= 100. / fps; } } return track; }
static void init(struct sh_sub *sh, struct osd_state *osd) { struct sd_ass_priv *ctx; if (sh->initialized) { ctx = sh->context; } else { ctx = talloc_zero(NULL, struct sd_ass_priv); sh->context = ctx; if (sh->type == 'a') { ctx->ass_track = ass_new_track(osd->ass_library); if (sh->extradata) ass_process_codec_private(ctx->ass_track, sh->extradata, sh->extradata_len); } else ctx->ass_track = mp_ass_default_track(osd->ass_library, sh->opts); } assert(osd->ass_track == NULL); osd->ass_track = ctx->ass_track; osd->vsfilter_aspect = sh->type == 'a'; osd->ass_track_changed = true; }