Mercurial > mplayer.hg
annotate libass/ass_mp.c @ 26110:69790f7caffa
configure: Set CONFIG_ENCODERS=yes in config.mak unconditionally
config.h already had "#define CONFIG_ENCODERS 1" unconditionally, but
the config.mak value depended on whether MEncoder was enabled.
Encoders need to be enabled as some encoder code is used by MPlayer
too. The inconsistent values broke compilation with --disable-mencoder
after libavcodec Makefile made compilation of i386/dsputilenc_mmx.o
depend on the config.mak value.
author | uau |
---|---|
date | Mon, 03 Mar 2008 03:02:36 +0000 |
parents | ba7bd4f7e322 |
children | 62ac4f8062ee |
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 /* |
fa122b7c71c6
Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents:
19654
diff
changeset
|
4 Copyright (C) 2006 Evgeniy Stepanov <eugeni.stepanov@gmail.com> |
fa122b7c71c6
Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents:
19654
diff
changeset
|
5 |
fa122b7c71c6
Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents:
19654
diff
changeset
|
6 This program is free software; you can redistribute it and/or modify |
fa122b7c71c6
Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents:
19654
diff
changeset
|
7 it under the terms of the GNU General Public License as published by |
fa122b7c71c6
Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents:
19654
diff
changeset
|
8 the Free Software Foundation; either version 2 of the License, or |
fa122b7c71c6
Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents:
19654
diff
changeset
|
9 (at your option) any later version. |
fa122b7c71c6
Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents:
19654
diff
changeset
|
10 |
fa122b7c71c6
Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents:
19654
diff
changeset
|
11 This program is distributed in the hope that it will be useful, |
fa122b7c71c6
Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents:
19654
diff
changeset
|
12 but WITHOUT ANY WARRANTY; without even the implied warranty of |
fa122b7c71c6
Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents:
19654
diff
changeset
|
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
fa122b7c71c6
Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents:
19654
diff
changeset
|
14 GNU General Public License for more details. |
fa122b7c71c6
Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents:
19654
diff
changeset
|
15 |
fa122b7c71c6
Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents:
19654
diff
changeset
|
16 You should have received a copy of the GNU General Public License |
fa122b7c71c6
Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents:
19654
diff
changeset
|
17 along with this program; if not, write to the Free Software |
fa122b7c71c6
Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents:
19654
diff
changeset
|
18 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
fa122b7c71c6
Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents:
19654
diff
changeset
|
19 */ |
fa122b7c71c6
Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents:
19654
diff
changeset
|
20 |
19405 | 21 #include <inttypes.h> |
19401
c0c3a2f8bb32
Add subdata to ass_track conversion for external subtitles.
eugeni
parents:
18937
diff
changeset
|
22 #include <string.h> |
19484
6eb79b2384f8
use of malloc without prototype.. very bad on 64bit archs
rfelker
parents:
19405
diff
changeset
|
23 #include <stdlib.h> |
19401
c0c3a2f8bb32
Add subdata to ass_track conversion for external subtitles.
eugeni
parents:
18937
diff
changeset
|
24 |
19643
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
25 #include "mp_msg.h" |
24242
76f5d8892c04
Clean up the way get_path is handled: Compile get_path.c to an object to link
diego
parents:
23328
diff
changeset
|
26 #include "get_path.h" |
19643
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
27 |
19401
c0c3a2f8bb32
Add subdata to ass_track conversion for external subtitles.
eugeni
parents:
18937
diff
changeset
|
28 #include "ass.h" |
19646 | 29 #include "ass_utils.h" |
18937 | 30 #include "ass_mp.h" |
20477 | 31 #include "ass_library.h" |
18937 | 32 |
21632
e3e6d6fbb561
Make -embeddedfonts enabled by default with FontConfig >= 2.4.2.
eugeni
parents:
20706
diff
changeset
|
33 #ifdef HAVE_FONTCONFIG |
e3e6d6fbb561
Make -embeddedfonts enabled by default with FontConfig >= 2.4.2.
eugeni
parents:
20706
diff
changeset
|
34 #include <fontconfig/fontconfig.h> |
e3e6d6fbb561
Make -embeddedfonts enabled by default with FontConfig >= 2.4.2.
eugeni
parents:
20706
diff
changeset
|
35 #endif |
e3e6d6fbb561
Make -embeddedfonts enabled by default with FontConfig >= 2.4.2.
eugeni
parents:
20706
diff
changeset
|
36 |
18937 | 37 // libass-related command line options |
20477 | 38 ass_library_t* ass_library; |
18937 | 39 int ass_enabled = 0; |
40 float ass_font_scale = 1.; | |
41 float ass_line_spacing = 0.; | |
42 int ass_top_margin = 0; | |
43 int ass_bottom_margin = 0; | |
21632
e3e6d6fbb561
Make -embeddedfonts enabled by default with FontConfig >= 2.4.2.
eugeni
parents:
20706
diff
changeset
|
44 #if defined(FC_VERSION) && (FC_VERSION >= 20402) |
e3e6d6fbb561
Make -embeddedfonts enabled by default with FontConfig >= 2.4.2.
eugeni
parents:
20706
diff
changeset
|
45 int extract_embedded_fonts = 1; |
e3e6d6fbb561
Make -embeddedfonts enabled by default with FontConfig >= 2.4.2.
eugeni
parents:
20706
diff
changeset
|
46 #else |
18937 | 47 int extract_embedded_fonts = 0; |
21632
e3e6d6fbb561
Make -embeddedfonts enabled by default with FontConfig >= 2.4.2.
eugeni
parents:
20706
diff
changeset
|
48 #endif |
19495 | 49 char **ass_force_style_list = NULL; |
19563 | 50 int ass_use_margins = 0; |
19646 | 51 char* ass_color = NULL; |
52 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
|
53 char* ass_styles_file = NULL; |
23134
1de2a46a0987
Add -ass-hinting option for setting font hinting method.
eugeni
parents:
22886
diff
changeset
|
54 int ass_hinting = ASS_HINTING_NATIVE + 4; // native hinting for unscaled osd |
18937 | 55 |
20469
54babf7ca302
If HAVE_FONTCONFIG is not defined, font_fontconfig might be declared both
reimar
parents:
20446
diff
changeset
|
56 #ifdef HAVE_FONTCONFIG |
19401
c0c3a2f8bb32
Add subdata to ass_track conversion for external subtitles.
eugeni
parents:
18937
diff
changeset
|
57 extern int font_fontconfig; |
20469
54babf7ca302
If HAVE_FONTCONFIG is not defined, font_fontconfig might be declared both
reimar
parents:
20446
diff
changeset
|
58 #else |
25351 | 59 static int font_fontconfig = -1; |
20469
54babf7ca302
If HAVE_FONTCONFIG is not defined, font_fontconfig might be declared both
reimar
parents:
20446
diff
changeset
|
60 #endif |
19401
c0c3a2f8bb32
Add subdata to ass_track conversion for external subtitles.
eugeni
parents:
18937
diff
changeset
|
61 extern char* font_name; |
25392 | 62 extern char* sub_font_name; |
19401
c0c3a2f8bb32
Add subdata to ass_track conversion for external subtitles.
eugeni
parents:
18937
diff
changeset
|
63 extern float text_font_scale_factor; |
c0c3a2f8bb32
Add subdata to ass_track conversion for external subtitles.
eugeni
parents:
18937
diff
changeset
|
64 extern int subtitle_autoscale; |
c0c3a2f8bb32
Add subdata to ass_track conversion for external subtitles.
eugeni
parents:
18937
diff
changeset
|
65 |
20477 | 66 #ifdef USE_ICONV |
67 extern char* sub_cp; | |
68 #else | |
69 static char* sub_cp = 0; | |
70 #endif | |
71 | |
19584
586e7d259d05
Apply -ass-force-style also to tracks generated from subdata.
eugeni
parents:
19563
diff
changeset
|
72 extern void process_force_style(ass_track_t* track); |
19401
c0c3a2f8bb32
Add subdata to ass_track conversion for external subtitles.
eugeni
parents:
18937
diff
changeset
|
73 |
20477 | 74 ass_track_t* ass_default_track(ass_library_t* library) { |
75 ass_track_t* track = ass_new_track(library); | |
19401
c0c3a2f8bb32
Add subdata to ass_track conversion for external subtitles.
eugeni
parents:
18937
diff
changeset
|
76 |
c0c3a2f8bb32
Add subdata to ass_track conversion for external subtitles.
eugeni
parents:
18937
diff
changeset
|
77 track->track_type = TRACK_TYPE_ASS; |
c0c3a2f8bb32
Add subdata to ass_track conversion for external subtitles.
eugeni
parents:
18937
diff
changeset
|
78 track->Timer = 100.; |
c0c3a2f8bb32
Add subdata to ass_track conversion for external subtitles.
eugeni
parents:
18937
diff
changeset
|
79 track->PlayResY = 288; |
c0c3a2f8bb32
Add subdata to ass_track conversion for external subtitles.
eugeni
parents:
18937
diff
changeset
|
80 track->WrapStyle = 0; |
c0c3a2f8bb32
Add subdata to ass_track conversion for external subtitles.
eugeni
parents:
18937
diff
changeset
|
81 |
19652
2c016957360a
Add -ass-styles option. It allows to load styles from a file and use them
eugeni
parents:
19646
diff
changeset
|
82 if (ass_styles_file) |
20477 | 83 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
|
84 |
2c016957360a
Add -ass-styles option. It allows to load styles from a file and use them
eugeni
parents:
19646
diff
changeset
|
85 if (track->n_styles == 0) { |
19653
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
86 ass_style_t* style; |
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
87 int sid; |
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
88 double fs; |
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
89 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
|
90 |
19653
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
91 sid = ass_alloc_style(track); |
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
92 style = track->styles + sid; |
c03c705573c1
Cosmetics: restore indentation after recent changes.
eugeni
parents:
19652
diff
changeset
|
93 style->Name = strdup("Default"); |
25392 | 94 style->FontName = (font_fontconfig >= 0 && sub_font_name) ? strdup(sub_font_name) : (font_fontconfig >= 0 && font_name) ? strdup(font_name) : strdup("Sans"); |
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 |
19654
ae983f0a1cac
Apply -ass-force-style also to matroska plaintext subs.
eugeni
parents:
19653
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); |
f48d49b400cf
Add support for rendering matroska plaintext subtitles with libass.
eugeni
parents:
19592
diff
changeset
|
191 |
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 |
23134
1de2a46a0987
Add -ass-hinting option for setting font hinting method.
eugeni
parents:
22886
diff
changeset
|
221 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
|
222 int hinting; |
20446
e8adc3778348
Split ass_configure() into several smaller functions.
eugeni
parents:
20138
diff
changeset
|
223 ass_set_frame_size(priv, w, h); |
e8adc3778348
Split ass_configure() into several smaller functions.
eugeni
parents:
20138
diff
changeset
|
224 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
|
225 ass_set_use_margins(priv, ass_use_margins); |
e8adc3778348
Split ass_configure() into several smaller functions.
eugeni
parents:
20138
diff
changeset
|
226 ass_set_font_scale(priv, ass_font_scale); |
23134
1de2a46a0987
Add -ass-hinting option for setting font hinting method.
eugeni
parents:
22886
diff
changeset
|
227 if (!unscaled && (ass_hinting & 4)) |
1de2a46a0987
Add -ass-hinting option for setting font hinting method.
eugeni
parents:
22886
diff
changeset
|
228 hinting = 0; |
1de2a46a0987
Add -ass-hinting option for setting font hinting method.
eugeni
parents:
22886
diff
changeset
|
229 else |
1de2a46a0987
Add -ass-hinting option for setting font hinting method.
eugeni
parents:
22886
diff
changeset
|
230 hinting = ass_hinting & 3; |
1de2a46a0987
Add -ass-hinting option for setting font hinting method.
eugeni
parents:
22886
diff
changeset
|
231 ass_set_hinting(priv, hinting); |
24554 | 232 ass_set_line_spacing(priv, ass_line_spacing); |
20706
6ae01628975f
Initialize fontconfig in VFCTRL_INIT_EOSD handler.
eugeni
parents:
20702
diff
changeset
|
233 } |
20446
e8adc3778348
Split ass_configure() into several smaller functions.
eugeni
parents:
20138
diff
changeset
|
234 |
20706
6ae01628975f
Initialize fontconfig in VFCTRL_INIT_EOSD handler.
eugeni
parents:
20702
diff
changeset
|
235 void ass_configure_fonts(ass_renderer_t* priv) { |
6ae01628975f
Initialize fontconfig in VFCTRL_INIT_EOSD handler.
eugeni
parents:
20702
diff
changeset
|
236 char *dir, *path, *family; |
20446
e8adc3778348
Split ass_configure() into several smaller functions.
eugeni
parents:
20138
diff
changeset
|
237 dir = get_path("fonts"); |
25392 | 238 if (font_fontconfig < 0 && sub_font_name) path = strdup(sub_font_name); |
239 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
|
240 else path = get_path("subfont.ttf"); |
25392 | 241 if (font_fontconfig >= 0 && sub_font_name) family = strdup(sub_font_name); |
242 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
|
243 else family = 0; |
e8adc3778348
Split ass_configure() into several smaller functions.
eugeni
parents:
20138
diff
changeset
|
244 |
20477 | 245 ass_set_fonts(priv, path, family); |
20446
e8adc3778348
Split ass_configure() into several smaller functions.
eugeni
parents:
20138
diff
changeset
|
246 |
e8adc3778348
Split ass_configure() into several smaller functions.
eugeni
parents:
20138
diff
changeset
|
247 free(dir); |
e8adc3778348
Split ass_configure() into several smaller functions.
eugeni
parents:
20138
diff
changeset
|
248 free(path); |
e8adc3778348
Split ass_configure() into several smaller functions.
eugeni
parents:
20138
diff
changeset
|
249 free(family); |
e8adc3778348
Split ass_configure() into several smaller functions.
eugeni
parents:
20138
diff
changeset
|
250 } |
20502 | 251 |
22886 | 252 ass_library_t* ass_init(void) { |
20702 | 253 ass_library_t* priv; |
254 char* path = get_path("fonts"); | |
255 priv = ass_library_init(); | |
256 ass_set_fonts_dir(priv, path); | |
257 ass_set_extract_fonts(priv, extract_embedded_fonts); | |
258 ass_set_style_overrides(priv, ass_force_style_list); | |
259 free(path); | |
260 return priv; | |
20502 | 261 } |
25813 | 262 |
263 int ass_force_reload = 0; // flag set if global ass-related settings were changed | |
264 | |
265 ass_image_t* ass_mp_render_frame(ass_renderer_t *priv, ass_track_t* track, long long now, int* detect_change) { | |
266 if (ass_force_reload) { | |
267 ass_set_margins(priv, ass_top_margin, ass_bottom_margin, 0, 0); | |
268 ass_set_use_margins(priv, ass_use_margins); | |
269 ass_set_font_scale(priv, ass_font_scale); | |
270 ass_force_reload = 0; | |
271 } | |
272 return ass_render_frame(priv, track, now, detect_change); | |
273 } |