void ass_free_track(ASS_Track *track) { int i; if (track->parser_priv) { if (track->parser_priv->fontname) free(track->parser_priv->fontname); if (track->parser_priv->fontdata) free(track->parser_priv->fontdata); free(track->parser_priv); } if (track->style_format) free(track->style_format); if (track->event_format) free(track->event_format); if (track->styles) { for (i = 0; i < track->n_styles; ++i) ass_free_style(track, i); free(track->styles); } if (track->events) { for (i = 0; i < track->n_events; ++i) ass_free_event(track, i); free(track->events); } free(track->name); free(track); }
/** * \brief Convert subtitle to ASS_Events for the given track * \param track track * \param sub subtitle to convert * \return event id * note: assumes that subtitle is _not_ fps-based; caller must manually correct * Start and Duration in other case. **/ static int ass_process_subtitle(ASS_Track *track, subtitle *sub) { int eid; ASS_Event *event; int len = 0, j; char *p; char *end; eid = ass_alloc_event(track); event = track->events + eid; event->Start = sub->start * 10; event->Duration = (sub->end - sub->start) * 10; event->Style = 0; for (j = 0; j < sub->lines; ++j) len += sub->text[j] ? strlen(sub->text[j]) : 0; len += 2 * sub->lines; // '\N', including the one after the last line len += 6; // {\anX} len += 1; // '\0' event->Text = malloc(len); end = event->Text + len; p = event->Text; if (sub->alignment) p += snprintf(p, end - p, "{\\an%d}", sub->alignment); for (j = 0; j < sub->lines; ++j) p += snprintf(p, end - p, "%s\\N", sub->text[j]); if (sub->lines > 0) p -= 2; // remove last "\N" *p = 0; if (check_duplicate_plaintext_event(track)) { ass_free_event(track, eid); track->n_events--; return -1; } mp_msg(MSGT_ASS, MSGL_V, "plaintext event at %" PRId64 ", +%" PRId64 ": %s \n", (int64_t) event->Start, (int64_t) event->Duration, event->Text); return eid; }
static void free_last_event(ASS_Track *track) { assert(track->n_events > 0); ass_free_event(track, track->n_events - 1); track->n_events--; }