示例#1
0
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);
}
示例#2
0
/**
 * \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;
}
示例#3
0
static void free_last_event(ASS_Track *track)
{
    assert(track->n_events > 0);
    ass_free_event(track, track->n_events - 1);
    track->n_events--;
}