Mercurial > mplayer.hg
diff libass/ass_mp.c @ 19401:c0c3a2f8bb32
Add subdata to ass_track conversion for external subtitles.
author | eugeni |
---|---|
date | Tue, 15 Aug 2006 19:25:46 +0000 |
parents | 9e95ac641e77 |
children | 0797e1b4a4be |
line wrap: on
line diff
--- a/libass/ass_mp.c Tue Aug 15 14:50:24 2006 +0000 +++ b/libass/ass_mp.c Tue Aug 15 19:25:46 2006 +0000 @@ -1,3 +1,7 @@ +#include <stdint.h> +#include <string.h> + +#include "ass.h" #include "ass_mp.h" // libass-related command line options @@ -8,3 +12,98 @@ int ass_bottom_margin = 0; int extract_embedded_fonts = 0; +extern int font_fontconfig; +extern char* font_name; +extern float text_font_scale_factor; +extern int subtitle_autoscale; + +extern double ass_internal_font_size_coeff; + +/** + * \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_t* ass_read_subdata(sub_data* subdata, double fps) { + ass_track_t* track = ass_new_track(); + ass_style_t* style; + ass_event_t* event; + subtitle* sub; + int sid, eid; + int i; + double fs; + + track->track_type = TRACK_TYPE_ASS; + track->name = subdata->filename ? strdup(subdata->filename) : 0; + track->Timer = 100.; + track->PlayResX = 384; + track->PlayResY = 288; + track->WrapStyle = 0; + + sid = ass_alloc_style(track); + style = track->styles + sid; + style->Name = strdup("Default"); + style->FontName = font_fontconfig ? strdup(font_name) : strdup("Tahoma"); + + fs = track->PlayResY * text_font_scale_factor / 100. / ass_internal_font_size_coeff; + // approximate autoscale coefficients + if (subtitle_autoscale == 2) + fs *= 1.3; + else if (subtitle_autoscale == 3) + fs *= 1.4; + style->FontSize = fs; + + style->PrimaryColour = 0xC0E9FE00; + style->SecondaryColour = 0x1B429E00; + style->OutlineColour = 0x1B429E00; + style->BackColour = 0x00000000; + style->BorderStyle = 1; + style->Alignment = 2; + style->Outline = 2; + style->MarginL = 30; + style->MarginR = 30; + style->MarginV = 20; + style->ScaleX = 1.; + style->ScaleY = 1.; + + for (i = 0; i < subdata->sub_num; ++i) { + int len = 0, j; + char* p; + char* end; + sub = subdata->subtitles + i; + eid = ass_alloc_event(track); + event = track->events + eid; + + event->Start = sub->start * 10; + event->Duration = (sub->end - sub->start) * 10; + if (!subdata->sub_uses_time) { + event->Start *= 100. / fps; + event->Duration *= 100. / fps; + } + + event->Style = sid; + + 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 ", sub->text[j]); + + p--; // remove last ' ' + *p = 0; + } + return track; +} +