annotate libass/ass.c @ 25661:293aeec83153

Replace the persistent CODECS_FLAG_SELECTED by a local "stringset" with an almost-trivial implementation. This allows making the builtin codec structs const, and it also makes clearer that this "selected" status is not used outside the init functions.
author reimar
date Sat, 12 Jan 2008 14:05:46 +0000
parents 6b1d7568ae3d
children 75a108423c11
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
20008
fa122b7c71c6 Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents: 19905
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: 19905
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: 19905
diff changeset
3 /*
fa122b7c71c6 Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents: 19905
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: 19905
diff changeset
5
fa122b7c71c6 Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents: 19905
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: 19905
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: 19905
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: 19905
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: 19905
diff changeset
10
fa122b7c71c6 Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents: 19905
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: 19905
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: 19905
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: 19905
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: 19905
diff changeset
15
fa122b7c71c6 Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents: 19905
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: 19905
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: 19905
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: 19905
diff changeset
19 */
fa122b7c71c6 Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents: 19905
diff changeset
20
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
21 #include "config.h"
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
22
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
23 #include <stdio.h>
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
24 #include <stdlib.h>
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
25 #include <string.h>
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
26 #include <assert.h>
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
27 #include <errno.h>
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
28 #include <sys/types.h>
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
29 #include <sys/stat.h>
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
30 #include <unistd.h>
19374
acb26d9717da MinGW treats %lld as %d. Replace it with PRId64.
eugeni
parents: 18937
diff changeset
31 #include <inttypes.h>
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
32
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
33 #ifdef USE_ICONV
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
34 #include <iconv.h>
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
35 #endif
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
36
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
37 #include "ass.h"
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
38 #include "ass_utils.h"
20477
de4a66d99f41 Libass interface reworked:
eugeni
parents: 20008
diff changeset
39 #include "ass_library.h"
21026
d138463e820b Collect all includes of mplayer headers in libass in a single file (mputils.h).
eugeni
parents: 20698
diff changeset
40 #include "mputils.h"
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
41
19652
2c016957360a Add -ass-styles option. It allows to load styles from a file and use them
eugeni
parents: 19639
diff changeset
42 typedef enum {PST_UNKNOWN = 0, PST_INFO, PST_STYLES, PST_EVENTS, PST_FONTS} parser_state_t;
2c016957360a Add -ass-styles option. It allows to load styles from a file and use them
eugeni
parents: 19639
diff changeset
43
19492
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
44 struct parser_priv_s {
19652
2c016957360a Add -ass-styles option. It allows to load styles from a file and use them
eugeni
parents: 19639
diff changeset
45 parser_state_t state;
19492
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
46 char* fontname;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
47 char* fontdata;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
48 int fontdata_size;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
49 int fontdata_used;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
50 };
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
51
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
52 #define ASS_STYLES_ALLOC 20
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
53 #define ASS_EVENTS_ALLOC 200
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
54
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
55 void ass_free_track(ass_track_t* track) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
56 int i;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
57
19492
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
58 if (track->parser_priv) {
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
59 if (track->parser_priv->fontname)
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
60 free(track->parser_priv->fontname);
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
61 if (track->parser_priv->fontdata)
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
62 free(track->parser_priv->fontdata);
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
63 free(track->parser_priv);
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
64 }
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
65 if (track->style_format)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
66 free(track->style_format);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
67 if (track->event_format)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
68 free(track->event_format);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
69 if (track->styles) {
19474
07209f48e527 Add public functions for removal of styles and events.
eugeni
parents: 19405
diff changeset
70 for (i = 0; i < track->n_styles; ++i)
07209f48e527 Add public functions for removal of styles and events.
eugeni
parents: 19405
diff changeset
71 ass_free_style(track, i);
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
72 free(track->styles);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
73 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
74 if (track->events) {
19474
07209f48e527 Add public functions for removal of styles and events.
eugeni
parents: 19405
diff changeset
75 for (i = 0; i < track->n_events; ++i)
07209f48e527 Add public functions for removal of styles and events.
eugeni
parents: 19405
diff changeset
76 ass_free_event(track, i);
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
77 free(track->events);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
78 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
79 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
80
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
81 /// \brief Allocate a new style struct
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
82 /// \param track track
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
83 /// \return style id
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
84 int ass_alloc_style(ass_track_t* track) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
85 int sid;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
86
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
87 assert(track->n_styles <= track->max_styles);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
88
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
89 if (track->n_styles == track->max_styles) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
90 track->max_styles += ASS_STYLES_ALLOC;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
91 track->styles = (ass_style_t*)realloc(track->styles, sizeof(ass_style_t)*track->max_styles);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
92 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
93
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
94 sid = track->n_styles++;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
95 memset(track->styles + sid, 0, sizeof(ass_style_t));
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
96 return sid;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
97 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
98
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
99 /// \brief Allocate a new event struct
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
100 /// \param track track
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
101 /// \return event id
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
102 int ass_alloc_event(ass_track_t* track) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
103 int eid;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
104
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
105 assert(track->n_events <= track->max_events);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
106
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
107 if (track->n_events == track->max_events) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
108 track->max_events += ASS_EVENTS_ALLOC;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
109 track->events = (ass_event_t*)realloc(track->events, sizeof(ass_event_t)*track->max_events);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
110 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
111
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
112 eid = track->n_events++;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
113 memset(track->events + eid, 0, sizeof(ass_event_t));
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
114 return eid;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
115 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
116
19474
07209f48e527 Add public functions for removal of styles and events.
eugeni
parents: 19405
diff changeset
117 void ass_free_event(ass_track_t* track, int eid) {
07209f48e527 Add public functions for removal of styles and events.
eugeni
parents: 19405
diff changeset
118 ass_event_t* event = track->events + eid;
07209f48e527 Add public functions for removal of styles and events.
eugeni
parents: 19405
diff changeset
119 if (event->Name)
07209f48e527 Add public functions for removal of styles and events.
eugeni
parents: 19405
diff changeset
120 free(event->Name);
07209f48e527 Add public functions for removal of styles and events.
eugeni
parents: 19405
diff changeset
121 if (event->Effect)
07209f48e527 Add public functions for removal of styles and events.
eugeni
parents: 19405
diff changeset
122 free(event->Effect);
07209f48e527 Add public functions for removal of styles and events.
eugeni
parents: 19405
diff changeset
123 if (event->Text)
07209f48e527 Add public functions for removal of styles and events.
eugeni
parents: 19405
diff changeset
124 free(event->Text);
19638
a3473d990fed Better collision detection algorithm. The idea is to keep a subtitle in place
eugeni
parents: 19635
diff changeset
125 if (event->render_priv)
a3473d990fed Better collision detection algorithm. The idea is to keep a subtitle in place
eugeni
parents: 19635
diff changeset
126 free(event->render_priv);
19474
07209f48e527 Add public functions for removal of styles and events.
eugeni
parents: 19405
diff changeset
127 }
07209f48e527 Add public functions for removal of styles and events.
eugeni
parents: 19405
diff changeset
128
07209f48e527 Add public functions for removal of styles and events.
eugeni
parents: 19405
diff changeset
129 void ass_free_style(ass_track_t* track, int sid) {
07209f48e527 Add public functions for removal of styles and events.
eugeni
parents: 19405
diff changeset
130 ass_style_t* style = track->styles + sid;
07209f48e527 Add public functions for removal of styles and events.
eugeni
parents: 19405
diff changeset
131 if (style->Name)
07209f48e527 Add public functions for removal of styles and events.
eugeni
parents: 19405
diff changeset
132 free(style->Name);
07209f48e527 Add public functions for removal of styles and events.
eugeni
parents: 19405
diff changeset
133 if (style->FontName)
07209f48e527 Add public functions for removal of styles and events.
eugeni
parents: 19405
diff changeset
134 free(style->FontName);
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
135 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
136
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
137 // ==============================================================================================
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
138
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
139 static void skip_spaces(char** str) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
140 char* p = *str;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
141 while ((*p==' ') || (*p=='\t'))
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
142 ++p;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
143 *str = p;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
144 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
145
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
146 static void rskip_spaces(char** str, char* limit) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
147 char* p = *str;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
148 while ((p >= limit) && ((*p==' ') || (*p=='\t')))
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
149 --p;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
150 *str = p;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
151 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
152
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
153 /**
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
154 * \brief find style by name
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
155 * \param track track
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
156 * \param name style name
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
157 * \return index in track->styles
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
158 * Returnes 0 if no styles found => expects at least 1 style.
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
159 * Parsing code always adds "Default" style in the end.
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
160 */
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
161 static int lookup_style(ass_track_t* track, char* name) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
162 int i;
19567
1a03b2c8ac28 Ignore '*' at the beginning of style name.
eugeni
parents: 19495
diff changeset
163 if (*name == '*') ++name; // FIXME: what does '*' really mean ?
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
164 for (i=0; i<track->n_styles; ++i) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
165 // FIXME: mb strcasecmp ?
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
166 if (strcmp(track->styles[i].Name, name) == 0)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
167 return i;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
168 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
169 i = track->default_style;
21066
6196ba31e97e MSGTRs for libass
kraymer
parents: 21026
diff changeset
170 mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_NoStyleNamedXFoundUsingY, track, name, track->styles[i].Name);
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
171 return i; // use the first style
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
172 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
173
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
174 static uint32_t string2color(char* p) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
175 uint32_t tmp;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
176 (void)strtocolor(&p, &tmp);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
177 return tmp;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
178 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
179
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
180 static long long string2timecode(char* p) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
181 unsigned h, m, s, ms;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
182 long long tm;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
183 int res = sscanf(p, "%1d:%2d:%2d.%2d", &h, &m, &s, &ms);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
184 if (res < 4) {
21066
6196ba31e97e MSGTRs for libass
kraymer
parents: 21026
diff changeset
185 mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_BadTimestamp);
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
186 return 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
187 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
188 tm = ((h * 60 + m) * 60 + s) * 1000 + ms * 10;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
189 return tm;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
190 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
191
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
192 /**
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
193 * \brief converts numpad-style align to align.
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
194 */
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
195 static int numpad2align(int val) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
196 int res, v;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
197 v = (val - 1) / 3; // 0, 1 or 2 for vertical alignment
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
198 if (v != 0) v = 3 - v;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
199 res = ((val - 1) % 3) + 1; // horizontal alignment
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
200 res += v*4;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
201 return res;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
202 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
203
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
204 #define NEXT(str,token) \
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
205 token = next_token(&str); \
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
206 if (!token) break;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
207
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
208 #define ANYVAL(name,func) \
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
209 } else if (strcasecmp(tname, #name) == 0) { \
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
210 target->name = func(token); \
20629
e8885ec63928 Introduce MSGT_ASS, use it for all libass messages.
eugeni
parents: 20603
diff changeset
211 mp_msg(MSGT_ASS, MSGL_DBG2, "%s = %s\n", #name, token);
19495
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
212
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
213 #define STRVAL(name) \
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
214 } else if (strcasecmp(tname, #name) == 0) { \
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
215 if (target->name != NULL) free(target->name); \
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
216 target->name = strdup(token); \
20629
e8885ec63928 Introduce MSGT_ASS, use it for all libass messages.
eugeni
parents: 20603
diff changeset
217 mp_msg(MSGT_ASS, MSGL_DBG2, "%s = %s\n", #name, token);
19495
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
218
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
219 #define COLORVAL(name) ANYVAL(name,string2color)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
220 #define INTVAL(name) ANYVAL(name,atoi)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
221 #define FPVAL(name) ANYVAL(name,atof)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
222 #define TIMEVAL(name) ANYVAL(name,string2timecode)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
223 #define STYLEVAL(name) \
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
224 } else if (strcasecmp(tname, #name) == 0) { \
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
225 target->name = lookup_style(track, token); \
20629
e8885ec63928 Introduce MSGT_ASS, use it for all libass messages.
eugeni
parents: 20603
diff changeset
226 mp_msg(MSGT_ASS, MSGL_DBG2, "%s = %s\n", #name, token);
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
227
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
228 #define ALIAS(alias,name) \
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
229 if (strcasecmp(tname, #alias) == 0) {tname = #name;}
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
230
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
231 static char* next_token(char** str) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
232 char* p = *str;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
233 char* start;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
234 skip_spaces(&p);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
235 if (*p == '\0') {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
236 *str = p;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
237 return 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
238 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
239 start = p; // start of the token
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
240 for (; (*p != '\0') && (*p != ','); ++p) {}
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
241 if (*p == '\0') {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
242 *str = p; // eos found, str will point to '\0' at exit
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
243 } else {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
244 *p = '\0';
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
245 *str = p + 1; // ',' found, str will point to the next char (beginning of the next token)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
246 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
247 --p; // end of current token
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
248 rskip_spaces(&p, start);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
249 if (p < start)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
250 p = start; // empty token
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
251 else
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
252 ++p; // the first space character, or '\0'
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
253 *p = '\0';
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
254 return start;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
255 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
256 /**
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
257 * \brief Parse the tail of Dialogue line
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
258 * \param track track
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
259 * \param event parsed data goes here
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
260 * \param str string to parse, zero-terminated
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
261 * \param n_ignored number of format options to skip at the beginning
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
262 */
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
263 static int process_event_tail(ass_track_t* track, ass_event_t* event, char* str, int n_ignored)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
264 {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
265 char* token;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
266 char* tname;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
267 char* p = str;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
268 int i;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
269 ass_event_t* target = event;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
270
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
271 char* format = strdup(track->event_format);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
272 char* q = format; // format scanning pointer
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
273
23539
790efaddf175 Make sure there is at least one style in ass_track when parsing events.
eugeni
parents: 23424
diff changeset
274 if (track->n_styles == 0) {
790efaddf175 Make sure there is at least one style in ass_track when parsing events.
eugeni
parents: 23424
diff changeset
275 // add "Default" style to the end
790efaddf175 Make sure there is at least one style in ass_track when parsing events.
eugeni
parents: 23424
diff changeset
276 // will be used if track does not contain a default style (or even does not contain styles at all)
790efaddf175 Make sure there is at least one style in ass_track when parsing events.
eugeni
parents: 23424
diff changeset
277 int sid = ass_alloc_style(track);
790efaddf175 Make sure there is at least one style in ass_track when parsing events.
eugeni
parents: 23424
diff changeset
278 track->styles[sid].Name = strdup("Default");
790efaddf175 Make sure there is at least one style in ass_track when parsing events.
eugeni
parents: 23424
diff changeset
279 track->styles[sid].FontName = strdup("Arial");
790efaddf175 Make sure there is at least one style in ass_track when parsing events.
eugeni
parents: 23424
diff changeset
280 }
790efaddf175 Make sure there is at least one style in ass_track when parsing events.
eugeni
parents: 23424
diff changeset
281
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
282 for (i = 0; i < n_ignored; ++i) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
283 NEXT(q, tname);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
284 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
285
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
286 while (1) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
287 NEXT(q, tname);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
288 if (strcasecmp(tname, "Text") == 0) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
289 char* last;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
290 event->Text = strdup(p);
19612
dcd0f218008f Bugfix: potential write of unallocated memory.
eugeni
parents: 19584
diff changeset
291 if (*event->Text != 0) {
dcd0f218008f Bugfix: potential write of unallocated memory.
eugeni
parents: 19584
diff changeset
292 last = event->Text + strlen(event->Text) - 1;
dcd0f218008f Bugfix: potential write of unallocated memory.
eugeni
parents: 19584
diff changeset
293 if (last >= event->Text && *last == '\r')
dcd0f218008f Bugfix: potential write of unallocated memory.
eugeni
parents: 19584
diff changeset
294 *last = 0;
dcd0f218008f Bugfix: potential write of unallocated memory.
eugeni
parents: 19584
diff changeset
295 }
20629
e8885ec63928 Introduce MSGT_ASS, use it for all libass messages.
eugeni
parents: 20603
diff changeset
296 mp_msg(MSGT_ASS, MSGL_DBG2, "Text = %s\n", event->Text);
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
297 event->Duration -= event->Start;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
298 free(format);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
299 return 0; // "Text" is always the last
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
300 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
301 NEXT(p, token);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
302
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
303 ALIAS(End,Duration) // temporarily store end timecode in event->Duration
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
304 if (0) { // cool ;)
19635
4a64fecfb425 Read layer info from external subs.
eugeni
parents: 19612
diff changeset
305 INTVAL(Layer)
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
306 STYLEVAL(Style)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
307 STRVAL(Name)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
308 STRVAL(Effect)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
309 INTVAL(MarginL)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
310 INTVAL(MarginR)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
311 INTVAL(MarginV)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
312 TIMEVAL(Start)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
313 TIMEVAL(Duration)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
314 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
315 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
316 free(format);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
317 return 1;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
318 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
319
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
320 /**
19495
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
321 * \brief Parse command line style overrides (--ass-force-style option)
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
322 * \param track track to apply overrides to
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
323 * The format for overrides is [StyleName.]Field=Value
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
324 */
19584
586e7d259d05 Apply -ass-force-style also to tracks generated from subdata.
eugeni
parents: 19567
diff changeset
325 void process_force_style(ass_track_t* track) {
19495
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
326 char **fs, *eq, *dt, *style, *tname, *token;
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
327 ass_style_t* target;
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
328 int sid;
20477
de4a66d99f41 Libass interface reworked:
eugeni
parents: 20008
diff changeset
329 char** list = track->library->style_overrides;
19495
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
330
20477
de4a66d99f41 Libass interface reworked:
eugeni
parents: 20008
diff changeset
331 if (!list) return;
19495
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
332
20477
de4a66d99f41 Libass interface reworked:
eugeni
parents: 20008
diff changeset
333 for (fs = list; *fs; ++fs) {
23540
d655edc9d107 When parsing ass-force-style arguments, search for '=' and '.' characters with
eugeni
parents: 23539
diff changeset
334 eq = strrchr(*fs, '=');
19495
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
335 if (!eq)
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
336 continue;
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
337 *eq = '\0';
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
338 token = eq + 1;
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
339
25582
6b1d7568ae3d Allow overriding [Script Info] parameters with -ass-force-style option.
eugeni
parents: 25515
diff changeset
340 if(!strcasecmp(*fs, "PlayResX"))
6b1d7568ae3d Allow overriding [Script Info] parameters with -ass-force-style option.
eugeni
parents: 25515
diff changeset
341 track->PlayResX = atoi(token);
6b1d7568ae3d Allow overriding [Script Info] parameters with -ass-force-style option.
eugeni
parents: 25515
diff changeset
342 else if(!strcasecmp(*fs, "PlayResY"))
6b1d7568ae3d Allow overriding [Script Info] parameters with -ass-force-style option.
eugeni
parents: 25515
diff changeset
343 track->PlayResY = atoi(token);
6b1d7568ae3d Allow overriding [Script Info] parameters with -ass-force-style option.
eugeni
parents: 25515
diff changeset
344 else if(!strcasecmp(*fs, "Timer"))
6b1d7568ae3d Allow overriding [Script Info] parameters with -ass-force-style option.
eugeni
parents: 25515
diff changeset
345 track->Timer = atof(token);
6b1d7568ae3d Allow overriding [Script Info] parameters with -ass-force-style option.
eugeni
parents: 25515
diff changeset
346 else if(!strcasecmp(*fs, "WrapStyle"))
6b1d7568ae3d Allow overriding [Script Info] parameters with -ass-force-style option.
eugeni
parents: 25515
diff changeset
347 track->WrapStyle = atoi(token);
6b1d7568ae3d Allow overriding [Script Info] parameters with -ass-force-style option.
eugeni
parents: 25515
diff changeset
348
23540
d655edc9d107 When parsing ass-force-style arguments, search for '=' and '.' characters with
eugeni
parents: 23539
diff changeset
349 dt = strrchr(*fs, '.');
19495
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
350 if (dt) {
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
351 *dt = '\0';
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
352 style = *fs;
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
353 tname = dt + 1;
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
354 } else {
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
355 style = NULL;
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
356 tname = *fs;
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
357 }
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
358 for (sid = 0; sid < track->n_styles; ++sid) {
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
359 if (style == NULL || strcasecmp(track->styles[sid].Name, style) == 0) {
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
360 target = track->styles + sid;
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
361 if (0) {
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
362 STRVAL(FontName)
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
363 COLORVAL(PrimaryColour)
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
364 COLORVAL(SecondaryColour)
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
365 COLORVAL(OutlineColour)
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
366 COLORVAL(BackColour)
23300
04dbd42b3962 Support fractional font sizes.
eugeni
parents: 23264
diff changeset
367 FPVAL(FontSize)
19495
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
368 INTVAL(Bold)
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
369 INTVAL(Italic)
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
370 INTVAL(Underline)
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
371 INTVAL(StrikeOut)
22259
cb409839a110 Correct implementation of text spacing.
eugeni
parents: 21458
diff changeset
372 FPVAL(Spacing)
19495
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
373 INTVAL(Angle)
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
374 INTVAL(BorderStyle)
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
375 INTVAL(Alignment)
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
376 INTVAL(MarginL)
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
377 INTVAL(MarginR)
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
378 INTVAL(MarginV)
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
379 INTVAL(Encoding)
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
380 FPVAL(ScaleX)
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
381 FPVAL(ScaleY)
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
382 FPVAL(Outline)
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
383 FPVAL(Shadow)
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
384 }
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
385 }
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
386 }
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
387 *eq = '=';
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
388 if (dt) *dt = '.';
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
389 }
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
390 }
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
391
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
392 /**
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
393 * \brief Parse the Style line
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
394 * \param track track
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
395 * \param str string to parse, zero-terminated
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
396 * Allocates a new style struct.
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
397 */
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
398 static int process_style(ass_track_t* track, char *str)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
399 {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
400
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
401 char* token;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
402 char* tname;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
403 char* p = str;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
404 char* format;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
405 char* q; // format scanning pointer
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
406 int sid;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
407 ass_style_t* style;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
408 ass_style_t* target;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
409
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
410 if (!track->style_format) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
411 // no style format header
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
412 // probably an ancient script version
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
413 if (track->track_type == TRACK_TYPE_SSA)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
414 track->style_format = strdup("Name, Fontname, Fontsize, PrimaryColour, SecondaryColour,"
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
415 "TertiaryColour, BackColour, Bold, Italic, BorderStyle, Outline,"
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
416 "Shadow, Alignment, MarginL, MarginR, MarginV, AlphaLevel, Encoding");
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
417 else
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
418 track->style_format = strdup("Name, Fontname, Fontsize, PrimaryColour, SecondaryColour,"
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
419 "OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut,"
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
420 "ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow,"
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
421 "Alignment, MarginL, MarginR, MarginV, Encoding");
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
422 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
423
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
424 q = format = strdup(track->style_format);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
425
20629
e8885ec63928 Introduce MSGT_ASS, use it for all libass messages.
eugeni
parents: 20603
diff changeset
426 mp_msg(MSGT_ASS, MSGL_V, "[%p] Style: %s\n", track, str);
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
427
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
428 sid = ass_alloc_style(track);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
429
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
430 style = track->styles + sid;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
431 target = style;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
432 // fill style with some default values
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
433 style->ScaleX = 100.;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
434 style->ScaleY = 100.;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
435
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
436 while (1) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
437 NEXT(q, tname);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
438 NEXT(p, token);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
439
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
440 // ALIAS(TertiaryColour,OutlineColour) // ignore TertiaryColour; it appears only in SSA, and is overridden by BackColour
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
441
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
442 if (0) { // cool ;)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
443 STRVAL(Name)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
444 if ((strcmp(target->Name, "Default")==0) || (strcmp(target->Name, "*Default")==0))
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
445 track->default_style = sid;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
446 STRVAL(FontName)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
447 COLORVAL(PrimaryColour)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
448 COLORVAL(SecondaryColour)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
449 COLORVAL(OutlineColour) // TertiaryColor
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
450 COLORVAL(BackColour)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
451 // SSA uses BackColour for both outline and shadow
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
452 // this will destroy SSA's TertiaryColour, but i'm not going to use it anyway
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
453 if (track->track_type == TRACK_TYPE_SSA)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
454 target->OutlineColour = target->BackColour;
23300
04dbd42b3962 Support fractional font sizes.
eugeni
parents: 23264
diff changeset
455 FPVAL(FontSize)
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
456 INTVAL(Bold)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
457 INTVAL(Italic)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
458 INTVAL(Underline)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
459 INTVAL(StrikeOut)
22259
cb409839a110 Correct implementation of text spacing.
eugeni
parents: 21458
diff changeset
460 FPVAL(Spacing)
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
461 INTVAL(Angle)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
462 INTVAL(BorderStyle)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
463 INTVAL(Alignment)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
464 if (track->track_type == TRACK_TYPE_ASS)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
465 target->Alignment = numpad2align(target->Alignment);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
466 INTVAL(MarginL)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
467 INTVAL(MarginR)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
468 INTVAL(MarginV)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
469 INTVAL(Encoding)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
470 FPVAL(ScaleX)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
471 FPVAL(ScaleY)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
472 FPVAL(Outline)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
473 FPVAL(Shadow)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
474 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
475 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
476 style->ScaleX /= 100.;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
477 style->ScaleY /= 100.;
22263
1bf17db53cc3 Both (-1) and 1 mean bold font in SSA/ASS styles.
eugeni
parents: 22259
diff changeset
478 style->Bold = !!style->Bold;
1bf17db53cc3 Both (-1) and 1 mean bold font in SSA/ASS styles.
eugeni
parents: 22259
diff changeset
479 style->Italic = !!style->Italic;
1bf17db53cc3 Both (-1) and 1 mean bold font in SSA/ASS styles.
eugeni
parents: 22259
diff changeset
480 style->Underline = !!style->Underline;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
481 if (!style->Name)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
482 style->Name = strdup("Default");
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
483 if (!style->FontName)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
484 style->FontName = strdup("Arial");
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
485 free(format);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
486 return 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
487
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
488 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
489
19492
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
490 static int process_styles_line(ass_track_t* track, char *str)
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
491 {
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
492 if (!strncmp(str,"Format:", 7)) {
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
493 char* p = str + 7;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
494 skip_spaces(&p);
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
495 track->style_format = strdup(p);
20629
e8885ec63928 Introduce MSGT_ASS, use it for all libass messages.
eugeni
parents: 20603
diff changeset
496 mp_msg(MSGT_ASS, MSGL_DBG2, "Style format: %s\n", track->style_format);
19492
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
497 } else if (!strncmp(str,"Style:", 6)) {
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
498 char* p = str + 6;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
499 skip_spaces(&p);
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
500 process_style(track, p);
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
501 }
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
502 return 0;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
503 }
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
504
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
505 static int process_info_line(ass_track_t* track, char *str)
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
506 {
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
507 if (!strncmp(str, "PlayResX:", 9)) {
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
508 track->PlayResX = atoi(str + 9);
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
509 } else if (!strncmp(str,"PlayResY:", 9)) {
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
510 track->PlayResY = atoi(str + 9);
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
511 } else if (!strncmp(str,"Timer:", 6)) {
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
512 track->Timer = atof(str + 6);
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
513 } else if (!strncmp(str,"WrapStyle:", 10)) {
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
514 track->WrapStyle = atoi(str + 10);
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
515 }
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
516 return 0;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
517 }
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
518
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
519 static int process_events_line(ass_track_t* track, char *str)
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
520 {
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
521 if (!strncmp(str, "Format:", 7)) {
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
522 char* p = str + 7;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
523 skip_spaces(&p);
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
524 track->event_format = strdup(p);
20629
e8885ec63928 Introduce MSGT_ASS, use it for all libass messages.
eugeni
parents: 20603
diff changeset
525 mp_msg(MSGT_ASS, MSGL_DBG2, "Event format: %s\n", track->event_format);
19492
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
526 } else if (!strncmp(str, "Dialogue:", 9)) {
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
527 // This should never be reached for embedded subtitles.
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
528 // They have slightly different format and are parsed in ass_process_chunk,
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
529 // called directly from demuxer
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
530 int eid;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
531 ass_event_t* event;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
532
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
533 str += 9;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
534 skip_spaces(&str);
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
535
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
536 eid = ass_alloc_event(track);
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
537 event = track->events + eid;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
538
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
539 process_event_tail(track, event, str, 0);
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
540 } else {
20629
e8885ec63928 Introduce MSGT_ASS, use it for all libass messages.
eugeni
parents: 20603
diff changeset
541 mp_msg(MSGT_ASS, MSGL_V, "Not understood: %s \n", str);
19492
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
542 }
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
543 return 0;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
544 }
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
545
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
546 // Copied from mkvtoolnix
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
547 static unsigned char* decode_chars(unsigned char c1, unsigned char c2,
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
548 unsigned char c3, unsigned char c4, unsigned char* dst, int cnt)
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
549 {
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
550 uint32_t value;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
551 unsigned char bytes[3];
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
552 int i;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
553
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
554 value = ((c1 - 33) << 18) + ((c2 - 33) << 12) + ((c3 - 33) << 6) + (c4 - 33);
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
555 bytes[2] = value & 0xff;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
556 bytes[1] = (value & 0xff00) >> 8;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
557 bytes[0] = (value & 0xff0000) >> 16;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
558
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
559 for (i = 0; i < cnt; ++i)
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
560 *dst++ = bytes[i];
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
561 return dst;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
562 }
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
563
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
564 static int decode_font(ass_track_t* track)
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
565 {
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
566 unsigned char* p;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
567 unsigned char* q;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
568 int i;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
569 int size; // original size
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
570 int dsize; // decoded size
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
571 unsigned char* buf = 0;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
572
20629
e8885ec63928 Introduce MSGT_ASS, use it for all libass messages.
eugeni
parents: 20603
diff changeset
573 mp_msg(MSGT_ASS, MSGL_V, "font: %d bytes encoded data \n", track->parser_priv->fontdata_used);
19492
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
574 size = track->parser_priv->fontdata_used;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
575 if (size % 4 == 1) {
21066
6196ba31e97e MSGTRs for libass
kraymer
parents: 21026
diff changeset
576 mp_msg(MSGT_ASS, MSGL_ERR, MSGTR_LIBASS_BadEncodedDataSize);
19492
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
577 goto error_decode_font;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
578 }
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
579 buf = malloc(size / 4 * 3 + 2);
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
580 q = buf;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
581 for (i = 0, p = (unsigned char*)track->parser_priv->fontdata; i < size / 4; i++, p+=4) {
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
582 q = decode_chars(p[0], p[1], p[2], p[3], q, 3);
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
583 }
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
584 if (size % 4 == 2) {
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
585 q = decode_chars(p[0], p[1], 0, 0, q, 1);
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
586 } else if (size % 4 == 3) {
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
587 q = decode_chars(p[0], p[1], p[2], 0, q, 2);
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
588 }
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
589 dsize = q - buf;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
590 assert(dsize <= size / 4 * 3 + 2);
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
591
23264
dc12bca7d4b5 Don't deallocate font data if it will be used later.
eugeni
parents: 22263
diff changeset
592 if (track->library->extract_fonts) {
21455
dd49d3712e6f Rename: ass_process_font -> ass_add_font.
eugeni
parents: 21453
diff changeset
593 ass_add_font(track->library, track->parser_priv->fontname, (char*)buf, dsize);
23264
dc12bca7d4b5 Don't deallocate font data if it will be used later.
eugeni
parents: 22263
diff changeset
594 buf = 0;
dc12bca7d4b5 Don't deallocate font data if it will be used later.
eugeni
parents: 22263
diff changeset
595 }
19492
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
596
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
597 error_decode_font:
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
598 if (buf) free(buf);
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
599 free(track->parser_priv->fontname);
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
600 free(track->parser_priv->fontdata);
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
601 track->parser_priv->fontname = 0;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
602 track->parser_priv->fontdata = 0;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
603 track->parser_priv->fontdata_size = 0;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
604 track->parser_priv->fontdata_used = 0;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
605 return 0;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
606 }
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
607
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
608 static int process_fonts_line(ass_track_t* track, char *str)
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
609 {
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
610 int len;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
611
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
612 if (!strncmp(str, "fontname:", 9)) {
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
613 char* p = str + 9;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
614 skip_spaces(&p);
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
615 if (track->parser_priv->fontname) {
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
616 decode_font(track);
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
617 }
21453
9dd976e14792 Avoid calling validate_fname() twice for one string.
eugeni
parents: 21066
diff changeset
618 track->parser_priv->fontname = strdup(p);
20629
e8885ec63928 Introduce MSGT_ASS, use it for all libass messages.
eugeni
parents: 20603
diff changeset
619 mp_msg(MSGT_ASS, MSGL_V, "fontname: %s\n", track->parser_priv->fontname);
19492
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
620 return 0;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
621 }
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
622
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
623 if (!track->parser_priv->fontname) {
20629
e8885ec63928 Introduce MSGT_ASS, use it for all libass messages.
eugeni
parents: 20603
diff changeset
624 mp_msg(MSGT_ASS, MSGL_V, "Not understood: %s \n", str);
19492
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
625 return 0;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
626 }
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
627
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
628 len = strlen(str);
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
629 if (len > 80) {
21066
6196ba31e97e MSGTRs for libass
kraymer
parents: 21026
diff changeset
630 mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_FontLineTooLong, len, str);
19492
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
631 return 0;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
632 }
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
633 if (track->parser_priv->fontdata_used + len > track->parser_priv->fontdata_size) {
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
634 track->parser_priv->fontdata_size += 100 * 1024;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
635 track->parser_priv->fontdata = realloc(track->parser_priv->fontdata, track->parser_priv->fontdata_size);
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
636 }
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
637 memcpy(track->parser_priv->fontdata + track->parser_priv->fontdata_used, str, len);
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
638 track->parser_priv->fontdata_used += len;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
639
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
640 return 0;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
641 }
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
642
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
643 /**
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
644 * \brief Parse a header line
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
645 * \param track track
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
646 * \param str string to parse, zero-terminated
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
647 */
19492
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
648 static int process_line(ass_track_t* track, char *str)
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
649 {
19492
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
650 if (strstr(str, "[Script Info]")) { // FIXME: strstr to skip possible BOM at the beginning of the script
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
651 track->parser_priv->state = PST_INFO;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
652 } else if (!strncmp(str, "[V4 Styles]", 11)) {
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
653 track->parser_priv->state = PST_STYLES;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
654 track->track_type = TRACK_TYPE_SSA;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
655 } else if (!strncmp(str, "[V4+ Styles]", 12)) {
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
656 track->parser_priv->state = PST_STYLES;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
657 track->track_type = TRACK_TYPE_ASS;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
658 } else if (!strncmp(str, "[Events]", 8)) {
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
659 track->parser_priv->state = PST_EVENTS;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
660 } else if (!strncmp(str, "[Fonts]", 7)) {
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
661 track->parser_priv->state = PST_FONTS;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
662 } else {
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
663 switch (track->parser_priv->state) {
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
664 case PST_INFO:
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
665 process_info_line(track, str);
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
666 break;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
667 case PST_STYLES:
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
668 process_styles_line(track, str);
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
669 break;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
670 case PST_EVENTS:
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
671 process_events_line(track, str);
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
672 break;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
673 case PST_FONTS:
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
674 process_fonts_line(track, str);
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
675 break;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
676 default:
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
677 break;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
678 }
19492
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
679 }
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
680
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
681 // there is no explicit end-of-font marker in ssa/ass
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
682 if ((track->parser_priv->state != PST_FONTS) && (track->parser_priv->fontname))
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
683 decode_font(track);
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
684
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
685 return 0;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
686 }
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
687
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
688 static int process_text(ass_track_t* track, char* str)
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
689 {
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
690 char* p = str;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
691 while(1) {
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
692 char* q;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
693 for (;((*p=='\r')||(*p=='\n'));++p) {}
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
694 for (q=p; ((*q!='\0')&&(*q!='\r')&&(*q!='\n')); ++q) {};
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
695 if (q==p)
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
696 break;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
697 if (*q != '\0')
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
698 *(q++) = '\0';
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
699 process_line(track, p);
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
700 if (*q == '\0')
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
701 break;
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
702 p = q;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
703 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
704 return 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
705 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
706
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
707 /**
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
708 * \brief Process CodecPrivate section of subtitle stream
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
709 * \param track track
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
710 * \param data string to parse
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
711 * \param size length of data
19492
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
712 CodecPrivate section contains [Stream Info] and [V4+ Styles] ([V4 Styles] for SSA) sections
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
713 */
19492
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
714 void ass_process_codec_private(ass_track_t* track, char *data, int size)
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
715 {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
716 char* str = malloc(size + 1);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
717
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
718 memcpy(str, data, size);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
719 str[size] = '\0';
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
720
19492
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
721 process_text(track, str);
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
722 free(str);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
723
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
724 if (!track->event_format) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
725 // probably an mkv produced by ancient mkvtoolnix
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
726 // such files don't have [Events] and Format: headers
19492
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
727 track->parser_priv->state = PST_EVENTS;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
728 if (track->track_type == TRACK_TYPE_SSA)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
729 track->event_format = strdup("Format: Marked, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text");
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
730 else
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
731 track->event_format = strdup("Format: Layer, Start, End, Style, Actor, MarginL, MarginR, MarginV, Effect, Text");
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
732 }
19495
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
733
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
734 process_force_style(track);
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
735 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
736
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
737 static int check_duplicate_event(ass_track_t* track, int ReadOrder)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
738 {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
739 int i;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
740 for (i = 0; i<track->n_events - 1; ++i) // ignoring last event, it is the one we are comparing with
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
741 if (track->events[i].ReadOrder == ReadOrder)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
742 return 1;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
743 return 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
744 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
745
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
746 /**
25515
diego
parents: 24851
diff changeset
747 * \brief Process a chunk of subtitle stream data. In Matroska, this contains exactly 1 event (or a commentary).
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
748 * \param track track
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
749 * \param data string to parse
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
750 * \param size length of data
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
751 * \param timecode starting time of the event (milliseconds)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
752 * \param duration duration of the event (milliseconds)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
753 */
19492
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
754 void ass_process_chunk(ass_track_t* track, char *data, int size, long long timecode, long long duration)
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
755 {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
756 char* str;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
757 int eid;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
758 char* p;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
759 char* token;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
760 ass_event_t* event;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
761
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
762 if (!track->event_format) {
21066
6196ba31e97e MSGTRs for libass
kraymer
parents: 21026
diff changeset
763 mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_EventFormatHeaderMissing);
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
764 return;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
765 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
766
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
767 str = malloc(size + 1);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
768 memcpy(str, data, size);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
769 str[size] = '\0';
20629
e8885ec63928 Introduce MSGT_ASS, use it for all libass messages.
eugeni
parents: 20603
diff changeset
770 mp_msg(MSGT_ASS, MSGL_V, "event at %" PRId64 ", +%" PRId64 ": %s \n", (int64_t)timecode, (int64_t)duration, str);
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
771
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
772 eid = ass_alloc_event(track);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
773 event = track->events + eid;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
774
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
775 p = str;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
776
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
777 do {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
778 NEXT(p, token);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
779 event->ReadOrder = atoi(token);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
780 if (check_duplicate_event(track, event->ReadOrder))
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
781 break;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
782
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
783 NEXT(p, token);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
784 event->Layer = atoi(token);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
785
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
786 process_event_tail(track, event, p, 3);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
787
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
788 event->Start = timecode;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
789 event->Duration = duration;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
790
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
791 free(str);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
792 return;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
793 // dump_events(tid);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
794 } while (0);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
795 // some error
19474
07209f48e527 Add public functions for removal of styles and events.
eugeni
parents: 19405
diff changeset
796 ass_free_event(track, eid);
07209f48e527 Add public functions for removal of styles and events.
eugeni
parents: 19405
diff changeset
797 track->n_events--;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
798 free(str);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
799 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
800
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
801 #ifdef USE_ICONV
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
802 /** \brief recode buffer to utf-8
20477
de4a66d99f41 Libass interface reworked:
eugeni
parents: 20008
diff changeset
803 * constraint: codepage != 0
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
804 * \param data pointer to text buffer
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
805 * \param size buffer size
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
806 * \return a pointer to recoded buffer, caller is responsible for freeing it
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
807 **/
20477
de4a66d99f41 Libass interface reworked:
eugeni
parents: 20008
diff changeset
808 static char* sub_recode(char* data, size_t size, char* codepage)
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
809 {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
810 static iconv_t icdsc = (iconv_t)(-1);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
811 char* tocp = "UTF-8";
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
812 char* outbuf;
20477
de4a66d99f41 Libass interface reworked:
eugeni
parents: 20008
diff changeset
813 assert(codepage);
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
814
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
815 {
24851
e36efda34616 Our enca code uses strdup() on the input encoding name, as we don't modify it we can use the original constant string.
iive
parents: 23540
diff changeset
816 const char* cp_tmp = codepage;
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
817 #ifdef HAVE_ENCA
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
818 char enca_lang[3], enca_fallback[100];
20477
de4a66d99f41 Libass interface reworked:
eugeni
parents: 20008
diff changeset
819 if (sscanf(codepage, "enca:%2s:%99s", enca_lang, enca_fallback) == 2
de4a66d99f41 Libass interface reworked:
eugeni
parents: 20008
diff changeset
820 || sscanf(codepage, "ENCA:%2s:%99s", enca_lang, enca_fallback) == 2) {
20503
5cbf1c33a668 Revert r20517.
eugeni
parents: 20501
diff changeset
821 cp_tmp = guess_buffer_cp((unsigned char*)data, size, enca_lang, enca_fallback);
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
822 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
823 #endif
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
824 if ((icdsc = iconv_open (tocp, cp_tmp)) != (iconv_t)(-1)){
20629
e8885ec63928 Introduce MSGT_ASS, use it for all libass messages.
eugeni
parents: 20603
diff changeset
825 mp_msg(MSGT_ASS,MSGL_V,"LIBSUB: opened iconv descriptor.\n");
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
826 } else
21066
6196ba31e97e MSGTRs for libass
kraymer
parents: 21026
diff changeset
827 mp_msg(MSGT_ASS,MSGL_ERR,MSGTR_LIBASS_ErrorOpeningIconvDescriptor);
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
828 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
829
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
830 {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
831 size_t osize = size;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
832 size_t ileft = size;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
833 size_t oleft = size - 1;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
834 char* ip;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
835 char* op;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
836 size_t rc;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
837
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
838 outbuf = malloc(size);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
839 ip = data;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
840 op = outbuf;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
841
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
842 while (ileft) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
843 rc = iconv(icdsc, &ip, &ileft, &op, &oleft);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
844 if (rc == (size_t)(-1)) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
845 if (errno == E2BIG) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
846 int offset = op - outbuf;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
847 outbuf = (char*)realloc(outbuf, osize + size);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
848 op = outbuf + offset;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
849 osize += size;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
850 oleft += size;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
851 } else {
21066
6196ba31e97e MSGTRs for libass
kraymer
parents: 21026
diff changeset
852 mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_ErrorRecodingFile);
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
853 return NULL;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
854 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
855 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
856 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
857 outbuf[osize - oleft - 1] = 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
858 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
859
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
860 if (icdsc != (iconv_t)(-1)) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
861 (void)iconv_close(icdsc);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
862 icdsc = (iconv_t)(-1);
20629
e8885ec63928 Introduce MSGT_ASS, use it for all libass messages.
eugeni
parents: 20603
diff changeset
863 mp_msg(MSGT_ASS,MSGL_V,"LIBSUB: closed iconv descriptor.\n");
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
864 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
865
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
866 return outbuf;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
867 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
868 #endif // ICONV
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
869
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
870 /**
20603
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
871 * \brief read file contents into newly allocated buffer
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
872 * \param fname file name
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
873 * \param bufsize out: file size
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
874 * \return pointer to file contents. Caller is responsible for its deallocation.
19652
2c016957360a Add -ass-styles option. It allows to load styles from a file and use them
eugeni
parents: 19639
diff changeset
875 */
20603
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
876 static char* read_file(char* fname, size_t *bufsize)
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
877 {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
878 int res;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
879 long sz;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
880 long bytes_read;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
881 char* buf;
19652
2c016957360a Add -ass-styles option. It allows to load styles from a file and use them
eugeni
parents: 19639
diff changeset
882
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
883 FILE* fp = fopen(fname, "rb");
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
884 if (!fp) {
21066
6196ba31e97e MSGTRs for libass
kraymer
parents: 21026
diff changeset
885 mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_FopenFailed, fname);
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
886 return 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
887 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
888 res = fseek(fp, 0, SEEK_END);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
889 if (res == -1) {
21066
6196ba31e97e MSGTRs for libass
kraymer
parents: 21026
diff changeset
890 mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_FseekFailed, fname);
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
891 fclose(fp);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
892 return 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
893 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
894
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
895 sz = ftell(fp);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
896 rewind(fp);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
897
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
898 if (sz > 10*1024*1024) {
21066
6196ba31e97e MSGTRs for libass
kraymer
parents: 21026
diff changeset
899 mp_msg(MSGT_ASS, MSGL_INFO, MSGTR_LIBASS_RefusingToLoadSubtitlesLargerThan10M, fname);
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
900 fclose(fp);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
901 return 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
902 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
903
20629
e8885ec63928 Introduce MSGT_ASS, use it for all libass messages.
eugeni
parents: 20603
diff changeset
904 mp_msg(MSGT_ASS, MSGL_V, "file size: %ld\n", sz);
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
905
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
906 buf = malloc(sz + 1);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
907 assert(buf);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
908 bytes_read = 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
909 do {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
910 res = fread(buf + bytes_read, 1, sz - bytes_read, fp);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
911 if (res <= 0) {
21066
6196ba31e97e MSGTRs for libass
kraymer
parents: 21026
diff changeset
912 mp_msg(MSGT_ASS, MSGL_INFO, MSGTR_LIBASS_ReadFailed, errno, strerror(errno));
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
913 fclose(fp);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
914 free(buf);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
915 return 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
916 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
917 bytes_read += res;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
918 } while (sz - bytes_read > 0);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
919 buf[sz] = '\0';
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
920 fclose(fp);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
921
20603
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
922 if (bufsize)
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
923 *bufsize = sz;
19652
2c016957360a Add -ass-styles option. It allows to load styles from a file and use them
eugeni
parents: 19639
diff changeset
924 return buf;
2c016957360a Add -ass-styles option. It allows to load styles from a file and use them
eugeni
parents: 19639
diff changeset
925 }
2c016957360a Add -ass-styles option. It allows to load styles from a file and use them
eugeni
parents: 19639
diff changeset
926
20603
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
927 /*
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
928 * \param buf pointer to subtitle text in utf-8
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
929 */
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
930 static ass_track_t* parse_memory(ass_library_t* library, char* buf)
19652
2c016957360a Add -ass-styles option. It allows to load styles from a file and use them
eugeni
parents: 19639
diff changeset
931 {
2c016957360a Add -ass-styles option. It allows to load styles from a file and use them
eugeni
parents: 19639
diff changeset
932 ass_track_t* track;
19905
5a24682d9dd5 Set ReadOrder values for external subtitles.
eugeni
parents: 19652
diff changeset
933 int i;
19652
2c016957360a Add -ass-styles option. It allows to load styles from a file and use them
eugeni
parents: 19639
diff changeset
934
20477
de4a66d99f41 Libass interface reworked:
eugeni
parents: 20008
diff changeset
935 track = ass_new_track(library);
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
936
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
937 // process header
19492
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
938 process_text(track, buf);
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
939
19905
5a24682d9dd5 Set ReadOrder values for external subtitles.
eugeni
parents: 19652
diff changeset
940 // external SSA/ASS subs does not have ReadOrder field
5a24682d9dd5 Set ReadOrder values for external subtitles.
eugeni
parents: 19652
diff changeset
941 for (i = 0; i < track->n_events; ++i)
5a24682d9dd5 Set ReadOrder values for external subtitles.
eugeni
parents: 19652
diff changeset
942 track->events[i].ReadOrder = i;
5a24682d9dd5 Set ReadOrder values for external subtitles.
eugeni
parents: 19652
diff changeset
943
19492
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
944 // there is no explicit end-of-font marker in ssa/ass
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
945 if (track->parser_priv->fontname)
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
946 decode_font(track);
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
947
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
948 if (track->track_type == TRACK_TYPE_UNKNOWN) {
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
949 ass_free_track(track);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
950 return 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
951 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
952
19495
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
953 process_force_style(track);
31ac2e1a5695 New cmdline option: -ass-force-style.
eugeni
parents: 19492
diff changeset
954
20603
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
955 return track;
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
956 }
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
957
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
958 /**
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
959 * \brief Read subtitles from memory.
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
960 * \param library libass library object
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
961 * \param buf pointer to subtitles text
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
962 * \param bufsize size of buffer
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
963 * \param codepage recode buffer contents from given codepage
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
964 * \return newly allocated track
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
965 */
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
966 ass_track_t* ass_read_memory(ass_library_t* library, char* buf, size_t bufsize, char* codepage)
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
967 {
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
968 ass_track_t* track;
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
969 int need_free = 0;
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
970
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
971 if (!buf)
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
972 return 0;
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
973
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
974 #ifdef USE_ICONV
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
975 if (codepage)
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
976 buf = sub_recode(buf, bufsize, codepage);
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
977 if (!buf)
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
978 return 0;
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
979 else
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
980 need_free = 1;
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
981 #endif
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
982 track = parse_memory(library, buf);
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
983 if (need_free)
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
984 free(buf);
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
985 if (!track)
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
986 return 0;
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
987
21066
6196ba31e97e MSGTRs for libass
kraymer
parents: 21026
diff changeset
988 mp_msg(MSGT_ASS, MSGL_INFO, MSGTR_LIBASS_AddedSubtitleFileMemory, track->n_styles, track->n_events);
20603
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
989 return track;
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
990 }
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
991
23424
7286d245bf33 Move code for reading a file and recoding it to utf-8 to a separate function.
eugeni
parents: 23300
diff changeset
992 char* read_file_recode(char* fname, char* codepage, int* size)
20603
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
993 {
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
994 char* buf;
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
995 size_t bufsize;
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
996
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
997 buf = read_file(fname, &bufsize);
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
998 if (!buf)
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
999 return 0;
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
1000 #ifdef USE_ICONV
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
1001 if (codepage) {
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
1002 char* tmpbuf = sub_recode(buf, bufsize, codepage);
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
1003 free(buf);
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
1004 buf = tmpbuf;
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
1005 }
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
1006 if (!buf)
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
1007 return 0;
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
1008 #endif
23424
7286d245bf33 Move code for reading a file and recoding it to utf-8 to a separate function.
eugeni
parents: 23300
diff changeset
1009 *size = bufsize;
7286d245bf33 Move code for reading a file and recoding it to utf-8 to a separate function.
eugeni
parents: 23300
diff changeset
1010 return buf;
7286d245bf33 Move code for reading a file and recoding it to utf-8 to a separate function.
eugeni
parents: 23300
diff changeset
1011 }
7286d245bf33 Move code for reading a file and recoding it to utf-8 to a separate function.
eugeni
parents: 23300
diff changeset
1012
7286d245bf33 Move code for reading a file and recoding it to utf-8 to a separate function.
eugeni
parents: 23300
diff changeset
1013 /**
7286d245bf33 Move code for reading a file and recoding it to utf-8 to a separate function.
eugeni
parents: 23300
diff changeset
1014 * \brief Read subtitles from file.
7286d245bf33 Move code for reading a file and recoding it to utf-8 to a separate function.
eugeni
parents: 23300
diff changeset
1015 * \param library libass library object
7286d245bf33 Move code for reading a file and recoding it to utf-8 to a separate function.
eugeni
parents: 23300
diff changeset
1016 * \param fname file name
7286d245bf33 Move code for reading a file and recoding it to utf-8 to a separate function.
eugeni
parents: 23300
diff changeset
1017 * \param codepage recode buffer contents from given codepage
7286d245bf33 Move code for reading a file and recoding it to utf-8 to a separate function.
eugeni
parents: 23300
diff changeset
1018 * \return newly allocated track
7286d245bf33 Move code for reading a file and recoding it to utf-8 to a separate function.
eugeni
parents: 23300
diff changeset
1019 */
7286d245bf33 Move code for reading a file and recoding it to utf-8 to a separate function.
eugeni
parents: 23300
diff changeset
1020 ass_track_t* ass_read_file(ass_library_t* library, char* fname, char* codepage)
7286d245bf33 Move code for reading a file and recoding it to utf-8 to a separate function.
eugeni
parents: 23300
diff changeset
1021 {
7286d245bf33 Move code for reading a file and recoding it to utf-8 to a separate function.
eugeni
parents: 23300
diff changeset
1022 char* buf;
7286d245bf33 Move code for reading a file and recoding it to utf-8 to a separate function.
eugeni
parents: 23300
diff changeset
1023 ass_track_t* track;
7286d245bf33 Move code for reading a file and recoding it to utf-8 to a separate function.
eugeni
parents: 23300
diff changeset
1024 size_t bufsize;
7286d245bf33 Move code for reading a file and recoding it to utf-8 to a separate function.
eugeni
parents: 23300
diff changeset
1025
7286d245bf33 Move code for reading a file and recoding it to utf-8 to a separate function.
eugeni
parents: 23300
diff changeset
1026 buf = read_file_recode(fname, codepage, &bufsize);
7286d245bf33 Move code for reading a file and recoding it to utf-8 to a separate function.
eugeni
parents: 23300
diff changeset
1027 if (!buf)
7286d245bf33 Move code for reading a file and recoding it to utf-8 to a separate function.
eugeni
parents: 23300
diff changeset
1028 return 0;
20603
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
1029 track = parse_memory(library, buf);
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
1030 free(buf);
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
1031 if (!track)
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
1032 return 0;
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
1033
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
1034 track->name = strdup(fname);
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
1035
21066
6196ba31e97e MSGTRs for libass
kraymer
parents: 21026
diff changeset
1036 mp_msg(MSGT_ASS, MSGL_INFO, MSGTR_LIBASS_AddedSubtitleFileFname, fname, track->n_styles, track->n_events);
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1037
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1038 // dump_events(forced_tid);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1039 return track;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1040 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1041
19652
2c016957360a Add -ass-styles option. It allows to load styles from a file and use them
eugeni
parents: 19639
diff changeset
1042 /**
2c016957360a Add -ass-styles option. It allows to load styles from a file and use them
eugeni
parents: 19639
diff changeset
1043 * \brief read styles from file into already initialized track
2c016957360a Add -ass-styles option. It allows to load styles from a file and use them
eugeni
parents: 19639
diff changeset
1044 */
20477
de4a66d99f41 Libass interface reworked:
eugeni
parents: 20008
diff changeset
1045 int ass_read_styles(ass_track_t* track, char* fname, char* codepage)
19652
2c016957360a Add -ass-styles option. It allows to load styles from a file and use them
eugeni
parents: 19639
diff changeset
1046 {
2c016957360a Add -ass-styles option. It allows to load styles from a file and use them
eugeni
parents: 19639
diff changeset
1047 char* buf;
2c016957360a Add -ass-styles option. It allows to load styles from a file and use them
eugeni
parents: 19639
diff changeset
1048 parser_state_t old_state;
20603
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
1049 size_t sz;
19652
2c016957360a Add -ass-styles option. It allows to load styles from a file and use them
eugeni
parents: 19639
diff changeset
1050
20603
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
1051 buf = read_file(fname, &sz);
19652
2c016957360a Add -ass-styles option. It allows to load styles from a file and use them
eugeni
parents: 19639
diff changeset
1052 if (!buf)
2c016957360a Add -ass-styles option. It allows to load styles from a file and use them
eugeni
parents: 19639
diff changeset
1053 return 1;
20603
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
1054 #ifdef USE_ICONV
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
1055 if (codepage) {
20698
7088929a2cb8 Fix the following compiler warnings:
eugeni
parents: 20629
diff changeset
1056 char* tmpbuf;
20603
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
1057 tmpbuf = sub_recode(buf, sz, codepage);
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
1058 free(buf);
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
1059 buf = tmpbuf;
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
1060 }
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
1061 if (!buf)
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
1062 return 0;
b0814eba65ec Implement loading subtitles from memory.
eugeni
parents: 20602
diff changeset
1063 #endif
19652
2c016957360a Add -ass-styles option. It allows to load styles from a file and use them
eugeni
parents: 19639
diff changeset
1064
2c016957360a Add -ass-styles option. It allows to load styles from a file and use them
eugeni
parents: 19639
diff changeset
1065 old_state = track->parser_priv->state;
2c016957360a Add -ass-styles option. It allows to load styles from a file and use them
eugeni
parents: 19639
diff changeset
1066 track->parser_priv->state = PST_STYLES;
2c016957360a Add -ass-styles option. It allows to load styles from a file and use them
eugeni
parents: 19639
diff changeset
1067 process_text(track, buf);
2c016957360a Add -ass-styles option. It allows to load styles from a file and use them
eugeni
parents: 19639
diff changeset
1068 track->parser_priv->state = old_state;
2c016957360a Add -ass-styles option. It allows to load styles from a file and use them
eugeni
parents: 19639
diff changeset
1069
2c016957360a Add -ass-styles option. It allows to load styles from a file and use them
eugeni
parents: 19639
diff changeset
1070 return 0;
2c016957360a Add -ass-styles option. It allows to load styles from a file and use them
eugeni
parents: 19639
diff changeset
1071 }
2c016957360a Add -ass-styles option. It allows to load styles from a file and use them
eugeni
parents: 19639
diff changeset
1072
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1073 long long ass_step_sub(ass_track_t* track, long long now, int movement) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1074 int i;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1075
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1076 if (movement == 0) return 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1077 if (track->n_events == 0) return 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1078
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1079 if (movement < 0)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1080 for (i = 0; (i < track->n_events) && ((long long)(track->events[i].Start + track->events[i].Duration) <= now); ++i) {}
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1081 else
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1082 for (i = track->n_events - 1; (i >= 0) && ((long long)(track->events[i].Start) > now); --i) {}
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1083
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1084 // -1 and n_events are ok
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1085 assert(i >= -1); assert(i <= track->n_events);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1086 i += movement;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1087 if (i < 0) i = 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1088 if (i >= track->n_events) i = track->n_events - 1;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1089 return ((long long)track->events[i].Start) - now;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1090 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1091
20477
de4a66d99f41 Libass interface reworked:
eugeni
parents: 20008
diff changeset
1092 ass_track_t* ass_new_track(ass_library_t* library) {
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1093 ass_track_t* track = calloc(1, sizeof(ass_track_t));
20477
de4a66d99f41 Libass interface reworked:
eugeni
parents: 20008
diff changeset
1094 track->library = library;
19492
c8daf3471201 SSA/ASS parser reworked, with 2 main results:
eugeni
parents: 19474
diff changeset
1095 track->parser_priv = calloc(1, sizeof(parser_priv_t));
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1096 return track;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1097 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1098