Mercurial > mplayer.hg
annotate libass/ass_mp.c @ 31597:1eb8dc8f96fa
Make subdelay handling work the same way for all subtitle types and also allow
changing subtitle delay to work better with vobsubs.
This probably breaks vobsub behaviour with timestamp wrapping though.
author | reimar |
---|---|
date | Sat, 10 Jul 2010 12:53:05 +0000 |
parents | 76a13038105e |
children | 2b6a652aefbe |
rev | line source |
---|---|
20008
fa122b7c71c6
Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents:
19654
diff
changeset
|
1 // -*- c-basic-offset: 8; indent-tabs-mode: t -*- |
fa122b7c71c6
Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents:
19654
diff
changeset
|
2 // vim:ts=8:sw=8:noet:ai: |
fa122b7c71c6
Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents:
19654
diff
changeset
|
3 /* |
26723 | 4 * Copyright (C) 2006 Evgeniy Stepanov <eugeni.stepanov@gmail.com> |
5 * | |
26738
588ce97b44f2
Speak of libass instead of MPlayer in the libass license headers.
diego
parents:
26723
diff
changeset
|
6 * This file is part of libass. |
26723 | 7 * |
26738
588ce97b44f2
Speak of libass instead of MPlayer in the libass license headers.
diego
parents:
26723
diff
changeset
|
8 * libass is free software; you can redistribute it and/or modify |
26723 | 9 * it under the terms of the GNU General Public License as published by |
10 * the Free Software Foundation; either version 2 of the License, or | |
11 * (at your option) any later version. | |
12 * | |
26738
588ce97b44f2
Speak of libass instead of MPlayer in the libass license headers.
diego
parents:
26723
diff
changeset
|
13 * libass is distributed in the hope that it will be useful, |
26723 | 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 * GNU General Public License for more details. | |
17 * | |
18 * You should have received a copy of the GNU General Public License along | |
26738
588ce97b44f2
Speak of libass instead of MPlayer in the libass license headers.
diego
parents:
26723
diff
changeset
|
19 * with libass; if not, write to the Free Software Foundation, Inc., |
26723 | 20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
21 */ | |
20008
fa122b7c71c6
Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents:
19654
diff
changeset
|
22 |
19405 | 23 #include <inttypes.h> |
19401
c0c3a2f8bb32
Add subdata to ass_track conversion for external subtitles.
eugeni
parents:
18937
diff
changeset
|
24 #include <string.h> |
19484
6eb79b2384f8
use of malloc without prototype.. very bad on 64bit archs
rfelker
parents:
19405
diff
changeset
|
25 #include <stdlib.h> |
19401
c0c3a2f8bb32
Add subdata to ass_track conversion for external subtitles.
eugeni
parents:
18937
diff
changeset
|
26 |
19643
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
27 #include "mp_msg.h" |
30901 | 28 #include "path.h" |
19643
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
29 |
18937 | 30 #include "ass_mp.h" |
30473
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
31 #include "help_mp.h" |
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
32 #include "stream/stream.h" |
18937 | 33 |
27393 | 34 #ifdef CONFIG_FONTCONFIG |
21632
e3e6d6fbb561
Make -embeddedfonts enabled by default with FontConfig >= 2.4.2.
eugeni
parents:
20706
diff
changeset
|
35 #include <fontconfig/fontconfig.h> |
e3e6d6fbb561
Make -embeddedfonts enabled by default with FontConfig >= 2.4.2.
eugeni
parents:
20706
diff
changeset
|
36 #endif |
e3e6d6fbb561
Make -embeddedfonts enabled by default with FontConfig >= 2.4.2.
eugeni
parents:
20706
diff
changeset
|
37 |
18937 | 38 // libass-related command line options |
20477 | 39 ass_library_t* ass_library; |
18937 | 40 int ass_enabled = 0; |
41 float ass_font_scale = 1.; | |
42 float ass_line_spacing = 0.; | |
43 int ass_top_margin = 0; | |
44 int ass_bottom_margin = 0; | |
21632
e3e6d6fbb561
Make -embeddedfonts enabled by default with FontConfig >= 2.4.2.
eugeni
parents:
20706
diff
changeset
|
45 #if defined(FC_VERSION) && (FC_VERSION >= 20402) |
e3e6d6fbb561
Make -embeddedfonts enabled by default with FontConfig >= 2.4.2.
eugeni
parents:
20706
diff
changeset
|
46 int extract_embedded_fonts = 1; |
e3e6d6fbb561
Make -embeddedfonts enabled by default with FontConfig >= 2.4.2.
eugeni
parents:
20706
diff
changeset
|
47 #else |
18937 | 48 int extract_embedded_fonts = 0; |
21632
e3e6d6fbb561
Make -embeddedfonts enabled by default with FontConfig >= 2.4.2.
eugeni
parents:
20706
diff
changeset
|
49 #endif |
19495 | 50 char **ass_force_style_list = NULL; |
19563 | 51 int ass_use_margins = 0; |
19646 | 52 char* ass_color = NULL; |
53 char* ass_border_color = NULL; | |
19652
2c016957360a
Add -ass-styles option. It allows to load styles from a file and use them
eugeni
parents:
19646
diff
changeset
|
54 char* ass_styles_file = NULL; |
23134
1de2a46a0987
Add -ass-hinting option for setting font hinting method.
eugeni
parents:
22886
diff
changeset
|
55 int ass_hinting = ASS_HINTING_NATIVE + 4; // native hinting for unscaled osd |
18937 | 56 |
27393 | 57 #ifdef CONFIG_FONTCONFIG |
19401
c0c3a2f8bb32
Add subdata to ass_track conversion for external subtitles.
eugeni
parents:
18937
diff
changeset
|
58 extern int font_fontconfig; |
20469
54babf7ca302
If HAVE_FONTCONFIG is not defined, font_fontconfig might be declared both
reimar
parents:
20446
diff
changeset
|
59 #else |
25351 | 60 static int font_fontconfig = -1; |
20469
54babf7ca302
If HAVE_FONTCONFIG is not defined, font_fontconfig might be declared both
reimar
parents:
20446
diff
changeset
|
61 #endif |
19401
c0c3a2f8bb32
Add subdata to ass_track conversion for external subtitles.
eugeni
parents:
18937
diff
changeset
|
62 extern char* font_name; |
25392 | 63 extern char* sub_font_name; |
19401
c0c3a2f8bb32
Add subdata to ass_track conversion for external subtitles.
eugeni
parents:
18937
diff
changeset
|
64 extern float text_font_scale_factor; |
c0c3a2f8bb32
Add subdata to ass_track conversion for external subtitles.
eugeni
parents:
18937
diff
changeset
|
65 extern int subtitle_autoscale; |
c0c3a2f8bb32
Add subdata to ass_track conversion for external subtitles.
eugeni
parents:
18937
diff
changeset
|
66 |
27393 | 67 #ifdef CONFIG_ICONV |
20477 | 68 extern char* sub_cp; |
69 #else | |
70 static char* sub_cp = 0; | |
71 #endif | |
72 | |
73 ass_track_t* ass_default_track(ass_library_t* library) { | |
74 ass_track_t* track = ass_new_track(library); | |
19401
c0c3a2f8bb32
Add subdata to ass_track conversion for external subtitles.
eugeni
parents:
18937
diff
changeset
|
75 |
c0c3a2f8bb32
Add subdata to ass_track conversion for external subtitles.
eugeni
parents:
18937
diff
changeset
|
76 track->track_type = TRACK_TYPE_ASS; |
c0c3a2f8bb32
Add subdata to ass_track conversion for external subtitles.
eugeni
parents:
18937
diff
changeset
|
77 track->Timer = 100.; |
c0c3a2f8bb32
Add subdata to ass_track conversion for external subtitles.
eugeni
parents:
18937
diff
changeset
|
78 track->PlayResY = 288; |
c0c3a2f8bb32
Add subdata to ass_track conversion for external subtitles.
eugeni
parents:
18937
diff
changeset
|
79 track->WrapStyle = 0; |
c0c3a2f8bb32
Add subdata to ass_track conversion for external subtitles.
eugeni
parents:
18937
diff
changeset
|
80 |
19652
2c016957360a
Add -ass-styles option. It allows to load styles from a file and use them
eugeni
parents:
19646
diff
changeset
|
81 if (ass_styles_file) |
20477 | 82 ass_read_styles(track, ass_styles_file, sub_cp); |
19652
2c016957360a
Add -ass-styles option. It allows to load styles from a file and use them
eugeni
parents:
19646
diff
changeset
|
83 |
2c016957360a
Add -ass-styles option. It allows to load styles from a file and use them
eugeni
parents:
19646
diff
changeset
|
84 if (track->n_styles == 0) { |
19653
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
85 ass_style_t* style; |
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
86 int sid; |
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
87 double fs; |
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
88 uint32_t c1, c2; |
19652
2c016957360a
Add -ass-styles option. It allows to load styles from a file and use them
eugeni
parents:
19646
diff
changeset
|
89 |
19653
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
90 sid = ass_alloc_style(track); |
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
91 style = track->styles + sid; |
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
92 style->Name = strdup("Default"); |
25392 | 93 style->FontName = (font_fontconfig >= 0 && sub_font_name) ? strdup(sub_font_name) : (font_fontconfig >= 0 && font_name) ? strdup(font_name) : strdup("Sans"); |
28860
7fcc0bf5b27a
Treat -font/-subfont as Fontconfig pattern in libass.
eugeni
parents:
28051
diff
changeset
|
94 style->treat_fontname_as_pattern = 1; |
19401
c0c3a2f8bb32
Add subdata to ass_track conversion for external subtitles.
eugeni
parents:
18937
diff
changeset
|
95 |
23328 | 96 fs = track->PlayResY * text_font_scale_factor / 100.; |
19653
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
97 // approximate autoscale coefficients |
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
98 if (subtitle_autoscale == 2) |
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
99 fs *= 1.3; |
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
100 else if (subtitle_autoscale == 3) |
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
101 fs *= 1.4; |
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
102 style->FontSize = fs; |
19401
c0c3a2f8bb32
Add subdata to ass_track conversion for external subtitles.
eugeni
parents:
18937
diff
changeset
|
103 |
19653
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
104 if (ass_color) c1 = strtoll(ass_color, NULL, 16); |
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
105 else c1 = 0xFFFF0000; |
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
106 if (ass_border_color) c2 = strtoll(ass_border_color, NULL, 16); |
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
107 else c2 = 0x00000000; |
19646 | 108 |
19653
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
109 style->PrimaryColour = c1; |
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
110 style->SecondaryColour = c1; |
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
111 style->OutlineColour = c2; |
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
112 style->BackColour = 0x00000000; |
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
113 style->BorderStyle = 1; |
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
114 style->Alignment = 2; |
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
115 style->Outline = 2; |
20138 | 116 style->MarginL = 10; |
117 style->MarginR = 10; | |
118 style->MarginV = 5; | |
19653
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
119 style->ScaleX = 1.; |
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
120 style->ScaleY = 1.; |
19652
2c016957360a
Add -ass-styles option. It allows to load styles from a file and use them
eugeni
parents:
19646
diff
changeset
|
121 } |
19401
c0c3a2f8bb32
Add subdata to ass_track conversion for external subtitles.
eugeni
parents:
18937
diff
changeset
|
122 |
30066
a2e4fd61dc4a
Revert renaming of process_force_style to restore compilation against
reimar
parents:
30065
diff
changeset
|
123 process_force_style(track); |
19643
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
124 return track; |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
125 } |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
126 |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
127 static int check_duplicate_plaintext_event(ass_track_t* track) |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
128 { |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
129 int i; |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
130 ass_event_t* evt = track->events + track->n_events - 1; |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
131 |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
132 for (i = 0; i<track->n_events - 1; ++i) // ignoring last event, it is the one we are comparing with |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
133 if (track->events[i].Start == evt->Start && |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
134 track->events[i].Duration == evt->Duration && |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
135 strcmp(track->events[i].Text, evt->Text) == 0) |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
136 return 1; |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
137 return 0; |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
138 } |
19401
c0c3a2f8bb32
Add subdata to ass_track conversion for external subtitles.
eugeni
parents:
18937
diff
changeset
|
139 |
19643
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
140 /** |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
141 * \brief Convert subtitle to ass_event_t for the given track |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
142 * \param ass_track_t track |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
143 * \param sub subtitle to convert |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
144 * \return event id |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
145 * note: assumes that subtitle is _not_ fps-based; caller must manually correct |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
146 * Start and Duration in other case. |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
147 **/ |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
148 int ass_process_subtitle(ass_track_t* track, subtitle* sub) |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
149 { |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
150 int eid; |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
151 ass_event_t* event; |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
152 int len = 0, j; |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
153 char* p; |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
154 char* end; |
19401
c0c3a2f8bb32
Add subdata to ass_track conversion for external subtitles.
eugeni
parents:
18937
diff
changeset
|
155 |
19643
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
156 eid = ass_alloc_event(track); |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
157 event = track->events + eid; |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
158 |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
159 event->Start = sub->start * 10; |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
160 event->Duration = (sub->end - sub->start) * 10; |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
161 event->Style = 0; |
19401
c0c3a2f8bb32
Add subdata to ass_track conversion for external subtitles.
eugeni
parents:
18937
diff
changeset
|
162 |
19653
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
163 for (j = 0; j < sub->lines; ++j) |
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
164 len += sub->text[j] ? strlen(sub->text[j]) : 0; |
19401
c0c3a2f8bb32
Add subdata to ass_track conversion for external subtitles.
eugeni
parents:
18937
diff
changeset
|
165 |
19653
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
166 len += 2 * sub->lines; // '\N', including the one after the last line |
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
167 len += 6; // {\anX} |
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
168 len += 1; // '\0' |
19401
c0c3a2f8bb32
Add subdata to ass_track conversion for external subtitles.
eugeni
parents:
18937
diff
changeset
|
169 |
19653
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
170 event->Text = malloc(len); |
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
171 end = event->Text + len; |
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
172 p = event->Text; |
19401
c0c3a2f8bb32
Add subdata to ass_track conversion for external subtitles.
eugeni
parents:
18937
diff
changeset
|
173 |
19653
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
174 if (sub->alignment) |
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
175 p += snprintf(p, end - p, "{\\an%d}", sub->alignment); |
19401
c0c3a2f8bb32
Add subdata to ass_track conversion for external subtitles.
eugeni
parents:
18937
diff
changeset
|
176 |
19653
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
177 for (j = 0; j < sub->lines; ++j) |
20495
27c1fa3a228e
Add \N at the end of each subtitle line when converting from subdata.
eugeni
parents:
20477
diff
changeset
|
178 p += snprintf(p, end - p, "%s\\N", sub->text[j]); |
19401
c0c3a2f8bb32
Add subdata to ass_track conversion for external subtitles.
eugeni
parents:
18937
diff
changeset
|
179 |
21835
5ee5281c78f8
Avoid invalid memory access in ass_process_subtitle for empty subtitles
reimar
parents:
21632
diff
changeset
|
180 if (sub->lines > 0) p-=2; // remove last "\N" |
19653
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
181 *p = 0; |
19643
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
182 |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
183 if (check_duplicate_plaintext_event(track)) { |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
184 ass_free_event(track, eid); |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
185 track->n_events--; |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
186 return -1; |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
187 } |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
188 |
20629
e8885ec63928
Introduce MSGT_ASS, use it for all libass messages.
eugeni
parents:
20502
diff
changeset
|
189 mp_msg(MSGT_ASS, MSGL_V, "plaintext event at %" PRId64 ", +%" PRId64 ": %s \n", |
19643
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
190 (int64_t)event->Start, (int64_t)event->Duration, event->Text); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28860
diff
changeset
|
191 |
19643
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
192 return eid; |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
193 } |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
194 |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
195 |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
196 /** |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
197 * \brief Convert subdata to ass_track |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
198 * \param subdata subtitles struct from subreader |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
199 * \param fps video framerate |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
200 * \return newly allocated ass_track, filled with subtitles from subdata |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
201 */ |
20477 | 202 ass_track_t* ass_read_subdata(ass_library_t* library, sub_data* subdata, double fps) { |
19643
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
203 ass_track_t* track; |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
204 int i; |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
205 |
20477 | 206 track = ass_default_track(library); |
19643
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
207 track->name = subdata->filename ? strdup(subdata->filename) : 0; |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
208 |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
209 for (i = 0; i < subdata->sub_num; ++i) { |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
210 int eid = ass_process_subtitle(track, subdata->subtitles + i); |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
211 if (eid < 0) |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
212 continue; |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
213 if (!subdata->sub_uses_time) { |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
214 track->events[eid].Start *= 100. / fps; |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
215 track->events[eid].Duration *= 100. / fps; |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
216 } |
19401
c0c3a2f8bb32
Add subdata to ass_track conversion for external subtitles.
eugeni
parents:
18937
diff
changeset
|
217 } |
c0c3a2f8bb32
Add subdata to ass_track conversion for external subtitles.
eugeni
parents:
18937
diff
changeset
|
218 return track; |
c0c3a2f8bb32
Add subdata to ass_track conversion for external subtitles.
eugeni
parents:
18937
diff
changeset
|
219 } |
c0c3a2f8bb32
Add subdata to ass_track conversion for external subtitles.
eugeni
parents:
18937
diff
changeset
|
220 |
30698
1f2ecb6a3f3d
Add const to ass_read_stream fname argument, the string is not modified.
reimar
parents:
30473
diff
changeset
|
221 ass_track_t* ass_read_stream(ass_library_t* library, const char *fname, char *charset) { |
30473
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
222 int i; |
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
223 char *buf = NULL; |
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
224 ass_track_t *track; |
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
225 size_t sz = 0; |
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
226 size_t buf_alloc = 0; |
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
227 stream_t *fd; |
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
228 |
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
229 fd = open_stream(fname, NULL, &i); |
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
230 if (!fd) { |
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
231 mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_FopenFailed, fname); |
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
232 return NULL; |
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
233 } |
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
234 if (fd->end_pos > STREAM_BUFFER_SIZE) |
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
235 /* read entire file if size is known */ |
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
236 buf_alloc = fd->end_pos; |
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
237 for (;;) { |
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
238 if (buf_alloc >= 100*1024*1024) { |
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
239 mp_msg(MSGT_ASS, MSGL_INFO, MSGTR_LIBASS_RefusingToLoadSubtitlesLargerThan100M, fname); |
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
240 sz = 0; |
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
241 break; |
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
242 } |
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
243 if (buf_alloc < sz + STREAM_BUFFER_SIZE) |
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
244 buf_alloc += STREAM_BUFFER_SIZE; |
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
245 buf = realloc(buf, buf_alloc + 1); |
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
246 i = stream_read(fd, buf + sz, buf_alloc - sz); |
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
247 if (i <= 0) break; |
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
248 sz += i; |
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
249 } |
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
250 free_stream(fd); |
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
251 if (!sz) { |
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
252 free(buf); |
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
253 return NULL; |
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
254 } |
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
255 buf[sz] = 0; |
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
256 buf = realloc(buf, sz + 1); |
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
257 track = ass_read_memory(library, buf, sz, charset); |
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
258 if (track) { |
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
259 free(track->name); |
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
260 track->name = strdup(fname); |
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
261 } |
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
262 free(buf); |
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
263 return track; |
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
264 } |
7446f58b6899
Add support for loading ASS subtitles through the stream layer and thus e.g.
reimar
parents:
30197
diff
changeset
|
265 |
23134
1de2a46a0987
Add -ass-hinting option for setting font hinting method.
eugeni
parents:
22886
diff
changeset
|
266 void ass_configure(ass_renderer_t* priv, int w, int h, int unscaled) { |
1de2a46a0987
Add -ass-hinting option for setting font hinting method.
eugeni
parents:
22886
diff
changeset
|
267 int hinting; |
20446
e8adc3778348
Split ass_configure() into several smaller functions.
eugeni
parents:
20138
diff
changeset
|
268 ass_set_frame_size(priv, w, h); |
e8adc3778348
Split ass_configure() into several smaller functions.
eugeni
parents:
20138
diff
changeset
|
269 ass_set_margins(priv, ass_top_margin, ass_bottom_margin, 0, 0); |
e8adc3778348
Split ass_configure() into several smaller functions.
eugeni
parents:
20138
diff
changeset
|
270 ass_set_use_margins(priv, ass_use_margins); |
e8adc3778348
Split ass_configure() into several smaller functions.
eugeni
parents:
20138
diff
changeset
|
271 ass_set_font_scale(priv, ass_font_scale); |
23134
1de2a46a0987
Add -ass-hinting option for setting font hinting method.
eugeni
parents:
22886
diff
changeset
|
272 if (!unscaled && (ass_hinting & 4)) |
1de2a46a0987
Add -ass-hinting option for setting font hinting method.
eugeni
parents:
22886
diff
changeset
|
273 hinting = 0; |
1de2a46a0987
Add -ass-hinting option for setting font hinting method.
eugeni
parents:
22886
diff
changeset
|
274 else |
1de2a46a0987
Add -ass-hinting option for setting font hinting method.
eugeni
parents:
22886
diff
changeset
|
275 hinting = ass_hinting & 3; |
1de2a46a0987
Add -ass-hinting option for setting font hinting method.
eugeni
parents:
22886
diff
changeset
|
276 ass_set_hinting(priv, hinting); |
24554 | 277 ass_set_line_spacing(priv, ass_line_spacing); |
20706
6ae01628975f
Initialize fontconfig in VFCTRL_INIT_EOSD handler.
eugeni
parents:
20702
diff
changeset
|
278 } |
20446
e8adc3778348
Split ass_configure() into several smaller functions.
eugeni
parents:
20138
diff
changeset
|
279 |
20706
6ae01628975f
Initialize fontconfig in VFCTRL_INIT_EOSD handler.
eugeni
parents:
20702
diff
changeset
|
280 void ass_configure_fonts(ass_renderer_t* priv) { |
6ae01628975f
Initialize fontconfig in VFCTRL_INIT_EOSD handler.
eugeni
parents:
20702
diff
changeset
|
281 char *dir, *path, *family; |
20446
e8adc3778348
Split ass_configure() into several smaller functions.
eugeni
parents:
20138
diff
changeset
|
282 dir = get_path("fonts"); |
25392 | 283 if (font_fontconfig < 0 && sub_font_name) path = strdup(sub_font_name); |
284 else if (font_fontconfig < 0 && font_name) path = strdup(font_name); | |
20446
e8adc3778348
Split ass_configure() into several smaller functions.
eugeni
parents:
20138
diff
changeset
|
285 else path = get_path("subfont.ttf"); |
25392 | 286 if (font_fontconfig >= 0 && sub_font_name) family = strdup(sub_font_name); |
287 else if (font_fontconfig >= 0 && font_name) family = strdup(font_name); | |
20446
e8adc3778348
Split ass_configure() into several smaller functions.
eugeni
parents:
20138
diff
changeset
|
288 else family = 0; |
e8adc3778348
Split ass_configure() into several smaller functions.
eugeni
parents:
20138
diff
changeset
|
289 |
30197 | 290 #if defined(LIBASS_VERSION) && LIBASS_VERSION >= 0x00907010 |
30065
d5d20b8256b7
Some ugly hacks to make compiling against a newer external version of libass work.
reimar
parents:
30064
diff
changeset
|
291 ass_set_fonts(priv, path, family, font_fontconfig, NULL, 1); |
d5d20b8256b7
Some ugly hacks to make compiling against a newer external version of libass work.
reimar
parents:
30064
diff
changeset
|
292 #else |
26582
62ac4f8062ee
Remove libass dependency on global font_fontconfig variable.
eugeni
parents:
25813
diff
changeset
|
293 if (font_fontconfig >= 0) |
62ac4f8062ee
Remove libass dependency on global font_fontconfig variable.
eugeni
parents:
25813
diff
changeset
|
294 ass_set_fonts(priv, path, family); |
62ac4f8062ee
Remove libass dependency on global font_fontconfig variable.
eugeni
parents:
25813
diff
changeset
|
295 else |
62ac4f8062ee
Remove libass dependency on global font_fontconfig variable.
eugeni
parents:
25813
diff
changeset
|
296 ass_set_fonts_nofc(priv, path, family); |
30065
d5d20b8256b7
Some ugly hacks to make compiling against a newer external version of libass work.
reimar
parents:
30064
diff
changeset
|
297 #endif |
20446
e8adc3778348
Split ass_configure() into several smaller functions.
eugeni
parents:
20138
diff
changeset
|
298 |
e8adc3778348
Split ass_configure() into several smaller functions.
eugeni
parents:
20138
diff
changeset
|
299 free(dir); |
e8adc3778348
Split ass_configure() into several smaller functions.
eugeni
parents:
20138
diff
changeset
|
300 free(path); |
e8adc3778348
Split ass_configure() into several smaller functions.
eugeni
parents:
20138
diff
changeset
|
301 free(family); |
e8adc3778348
Split ass_configure() into several smaller functions.
eugeni
parents:
20138
diff
changeset
|
302 } |
20502 | 303 |
22886 | 304 ass_library_t* ass_init(void) { |
20702 | 305 ass_library_t* priv; |
306 char* path = get_path("fonts"); | |
307 priv = ass_library_init(); | |
308 ass_set_fonts_dir(priv, path); | |
309 ass_set_extract_fonts(priv, extract_embedded_fonts); | |
310 ass_set_style_overrides(priv, ass_force_style_list); | |
311 free(path); | |
312 return priv; | |
20502 | 313 } |
25813 | 314 |
315 int ass_force_reload = 0; // flag set if global ass-related settings were changed | |
316 | |
317 ass_image_t* ass_mp_render_frame(ass_renderer_t *priv, ass_track_t* track, long long now, int* detect_change) { | |
318 if (ass_force_reload) { | |
319 ass_set_margins(priv, ass_top_margin, ass_bottom_margin, 0, 0); | |
320 ass_set_use_margins(priv, ass_use_margins); | |
321 ass_set_font_scale(priv, ass_font_scale); | |
322 ass_force_reload = 0; | |
323 } | |
324 return ass_render_frame(priv, track, now, detect_change); | |
325 } |