annotate libass/ass.c @ 19378:d9d58ba1b833

Replace %lld with PRId64, part 2.
author eugeni
date Sun, 13 Aug 2006 10:54:29 +0000
parents acb26d9717da
children 0797e1b4a4be
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
1 #include "config.h"
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
2
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
3 #include <stdio.h>
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
4 #include <stdlib.h>
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
5 #include <stdint.h>
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
6 #include <string.h>
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
7 #include <assert.h>
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
8 #include <errno.h>
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
9 #include <sys/types.h>
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
10 #include <sys/stat.h>
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
11 #include <unistd.h>
19374
acb26d9717da MinGW treats %lld as %d. Replace it with PRId64.
eugeni
parents: 18937
diff changeset
12 #include <inttypes.h>
18937
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
13
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
14 #ifdef HAVE_ENCA
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
15 #include "subreader.h" // for guess_buffer_cp
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
16 #endif
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
17
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
18 #ifdef USE_ICONV
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
19 #include <iconv.h>
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
20 extern char *sub_cp;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
21 #endif
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 "mp_msg.h"
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
24 #include "ass.h"
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
25 #include "ass_utils.h"
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
26 #include "libvo/sub.h" // for utf8_get_char
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
27
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
28 char *get_path(char *);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
29
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
30 #define ASS_STYLES_ALLOC 20
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
31 #define ASS_EVENTS_ALLOC 200
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
32
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
33 void ass_free_track(ass_track_t* track) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
34 int i;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
35
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
36 if (track->style_format)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
37 free(track->style_format);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
38 if (track->event_format)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
39 free(track->event_format);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
40 if (track->styles) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
41 for (i = 0; i < track->n_styles; ++i) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
42 ass_style_t* style = track->styles + i;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
43 if (style->Name)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
44 free(style->Name);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
45 if (style->FontName)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
46 free(style->FontName);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
47 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
48 free(track->styles);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
49 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
50 if (track->events) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
51 for (i = 0; i < track->n_events; ++i) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
52 ass_event_t* event = track->events + i;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
53 if (event->Name)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
54 free(event->Name);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
55 if (event->Effect)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
56 free(event->Effect);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
57 if (event->Text)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
58 free(event->Text);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
59 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
60 free(track->events);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
61 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
62 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
63
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
64 /// \brief Allocate a new style struct
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
65 /// \param track track
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
66 /// \return style id
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
67 int ass_alloc_style(ass_track_t* track) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
68 int sid;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
69
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
70 assert(track->n_styles <= track->max_styles);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
71
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
72 if (track->n_styles == track->max_styles) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
73 track->max_styles += ASS_STYLES_ALLOC;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
74 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
75 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
76
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
77 sid = track->n_styles++;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
78 memset(track->styles + sid, 0, sizeof(ass_style_t));
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
79 return sid;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
80 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
81
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
82 /// \brief Allocate a new event struct
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
83 /// \param track track
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
84 /// \return event id
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
85 int ass_alloc_event(ass_track_t* track) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
86 int eid;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
87
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
88 assert(track->n_events <= track->max_events);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
89
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
90 if (track->n_events == track->max_events) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
91 track->max_events += ASS_EVENTS_ALLOC;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
92 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
93 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
94
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
95 eid = track->n_events++;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
96 memset(track->events + eid, 0, sizeof(ass_event_t));
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
97 return eid;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
98 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
99
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
100 static void free_event(ass_track_t* track, int eid) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
101 if (track->n_events > eid + 1) // not last event
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
102 memcpy(track->events + eid, track->events + eid + 1, sizeof(ass_event_t) * (track->n_events - eid - 1));
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
103 track->n_events--;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
104 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
105
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
106 static int events_compare_f(const void* a_, const void* b_) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
107 ass_event_t* a = (ass_event_t*)a_;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
108 ass_event_t* b = (ass_event_t*)b_;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
109 if (a->Start < b->Start)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
110 return -1;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
111 else if (a->Start > b->Start)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
112 return 1;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
113 else
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
114 return 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
115 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
116
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
117 /// \brief Sort events by start time
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
118 /// \param tid track id
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
119 static void sort_events(ass_track_t* track) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
120 qsort(track->events, track->n_events, sizeof(ass_event_t), events_compare_f);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
121 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
122
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
123 // ==============================================================================================
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
124
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
125 static void skip_spaces(char** str) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
126 char* p = *str;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
127 while ((*p==' ') || (*p=='\t'))
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
128 ++p;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
129 *str = p;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
130 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
131
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
132 static void rskip_spaces(char** str, char* limit) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
133 char* p = *str;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
134 while ((p >= limit) && ((*p==' ') || (*p=='\t')))
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
135 --p;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
136 *str = p;
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 /**
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
140 * \brief find style by name
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
141 * \param track track
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
142 * \param name style name
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
143 * \return index in track->styles
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
144 * Returnes 0 if no styles found => expects at least 1 style.
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
145 * Parsing code always adds "Default" style in the end.
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
146 */
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
147 static int lookup_style(ass_track_t* track, char* name) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
148 int i;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
149 for (i=0; i<track->n_styles; ++i) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
150 // FIXME: mb strcasecmp ?
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
151 if (strcmp(track->styles[i].Name, name) == 0)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
152 return i;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
153 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
154 i = track->default_style;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
155 mp_msg(MSGT_GLOBAL, MSGL_WARN, "[%p] Warning: no style named '%s' found, using '%s'\n", track, name, track->styles[i].Name);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
156 return i; // use the first style
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
157 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
158
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
159 static uint32_t string2color(char* p) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
160 uint32_t tmp;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
161 (void)strtocolor(&p, &tmp);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
162 return tmp;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
163 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
164
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
165 static long long string2timecode(char* p) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
166 unsigned h, m, s, ms;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
167 long long tm;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
168 int res = sscanf(p, "%1d:%2d:%2d.%2d", &h, &m, &s, &ms);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
169 if (res < 4) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
170 mp_msg(MSGT_GLOBAL, MSGL_WARN, "bad timestamp\n");
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
171 return 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
172 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
173 tm = ((h * 60 + m) * 60 + s) * 1000 + ms * 10;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
174 return tm;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
175 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
176
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
177 /**
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
178 * \brief converts numpad-style align to align.
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 int numpad2align(int val) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
181 int res, v;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
182 v = (val - 1) / 3; // 0, 1 or 2 for vertical alignment
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
183 if (v != 0) v = 3 - v;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
184 res = ((val - 1) % 3) + 1; // horizontal alignment
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
185 res += v*4;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
186 return res;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
187 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
188
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
189 #define NEXT(str,token) \
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
190 token = next_token(&str); \
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
191 if (!token) break;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
192
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
193 #define ANYVAL(name,func) \
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
194 } else if (strcasecmp(tname, #name) == 0) { \
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
195 target->name = func(token); \
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
196 mp_msg(MSGT_GLOBAL, MSGL_DBG2, "%s = %s\n", #name, token);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
197 #define STRVAL(name) ANYVAL(name,strdup)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
198 #define COLORVAL(name) ANYVAL(name,string2color)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
199 #define INTVAL(name) ANYVAL(name,atoi)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
200 #define FPVAL(name) ANYVAL(name,atof)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
201 #define TIMEVAL(name) ANYVAL(name,string2timecode)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
202 #define STYLEVAL(name) \
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
203 } else if (strcasecmp(tname, #name) == 0) { \
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
204 target->name = lookup_style(track, token); \
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
205 mp_msg(MSGT_GLOBAL, MSGL_DBG2, "%s = %s\n", #name, token);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
206
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
207 #define ALIAS(alias,name) \
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
208 if (strcasecmp(tname, #alias) == 0) {tname = #name;}
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
209
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
210 static char* next_token(char** str) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
211 char* p = *str;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
212 char* start;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
213 skip_spaces(&p);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
214 if (*p == '\0') {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
215 *str = p;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
216 return 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
217 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
218 start = p; // start of the token
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
219 for (; (*p != '\0') && (*p != ','); ++p) {}
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
220 if (*p == '\0') {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
221 *str = p; // eos found, str will point to '\0' at exit
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
222 } else {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
223 *p = '\0';
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
224 *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
225 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
226 --p; // end of current token
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
227 rskip_spaces(&p, start);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
228 if (p < start)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
229 p = start; // empty token
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
230 else
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
231 ++p; // the first space character, or '\0'
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
232 *p = '\0';
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
233 return start;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
234 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
235 /**
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
236 * \brief Parse the tail of Dialogue line
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
237 * \param track track
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
238 * \param event parsed data goes here
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
239 * \param str string to parse, zero-terminated
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
240 * \param n_ignored number of format options to skip at the beginning
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
241 */
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
242 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
243 {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
244 char* token;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
245 char* tname;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
246 char* p = str;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
247 int i;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
248 ass_event_t* target = event;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
249
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
250 char* format = strdup(track->event_format);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
251 char* q = format; // format scanning pointer
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
252
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
253 for (i = 0; i < n_ignored; ++i) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
254 NEXT(q, tname);
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 while (1) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
258 NEXT(q, tname);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
259 if (strcasecmp(tname, "Text") == 0) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
260 char* last;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
261 event->Text = strdup(p);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
262 last = event->Text + strlen(event->Text) - 1;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
263 if (*last == '\r')
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
264 *last = 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
265 mp_msg(MSGT_GLOBAL, MSGL_DBG2, "Text = %s\n", event->Text);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
266 event->Duration -= event->Start;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
267 free(format);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
268 return 0; // "Text" is always the last
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
269 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
270 NEXT(p, token);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
271
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
272 ALIAS(End,Duration) // temporarily store end timecode in event->Duration
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
273 if (0) { // cool ;)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
274 STYLEVAL(Style)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
275 STRVAL(Name)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
276 STRVAL(Effect)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
277 INTVAL(MarginL)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
278 INTVAL(MarginR)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
279 INTVAL(MarginV)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
280 TIMEVAL(Start)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
281 TIMEVAL(Duration)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
282 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
283 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
284 free(format);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
285 return 1;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
286 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
287
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
288 /**
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
289 * \brief Parse the Style line
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
290 * \param track track
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
291 * \param str string to parse, zero-terminated
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
292 * Allocates a new style struct.
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
293 */
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
294 static int process_style(ass_track_t* track, char *str)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
295 {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
296
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
297 char* token;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
298 char* tname;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
299 char* p = str;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
300 char* format;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
301 char* q; // format scanning pointer
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
302 int sid;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
303 ass_style_t* style;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
304 ass_style_t* target;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
305
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
306 if (!track->style_format) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
307 // no style format header
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
308 // probably an ancient script version
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
309 if (track->track_type == TRACK_TYPE_SSA)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
310 track->style_format = strdup("Name, Fontname, Fontsize, PrimaryColour, SecondaryColour,"
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
311 "TertiaryColour, BackColour, Bold, Italic, BorderStyle, Outline,"
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
312 "Shadow, Alignment, MarginL, MarginR, MarginV, AlphaLevel, Encoding");
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
313 else
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
314 track->style_format = strdup("Name, Fontname, Fontsize, PrimaryColour, SecondaryColour,"
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
315 "OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut,"
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
316 "ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow,"
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
317 "Alignment, MarginL, MarginR, MarginV, Encoding");
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 q = format = strdup(track->style_format);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
321
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
322 mp_msg(MSGT_GLOBAL, MSGL_V, "[%p] Style: %s\n", track, str);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
323
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
324 sid = ass_alloc_style(track);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
325
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
326 style = track->styles + sid;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
327 target = style;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
328 // fill style with some default values
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
329 style->ScaleX = 100.;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
330 style->ScaleY = 100.;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
331
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
332 while (1) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
333 NEXT(q, tname);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
334 NEXT(p, token);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
335
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
336 // 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
337
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
338 if (0) { // cool ;)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
339 STRVAL(Name)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
340 if ((strcmp(target->Name, "Default")==0) || (strcmp(target->Name, "*Default")==0))
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
341 track->default_style = sid;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
342 STRVAL(FontName)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
343 COLORVAL(PrimaryColour)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
344 COLORVAL(SecondaryColour)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
345 COLORVAL(OutlineColour) // TertiaryColor
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
346 COLORVAL(BackColour)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
347 // SSA uses BackColour for both outline and shadow
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
348 // 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
349 if (track->track_type == TRACK_TYPE_SSA)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
350 target->OutlineColour = target->BackColour;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
351 INTVAL(FontSize)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
352 INTVAL(Bold)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
353 INTVAL(Italic)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
354 INTVAL(Underline)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
355 INTVAL(StrikeOut)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
356 INTVAL(Spacing)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
357 INTVAL(Angle)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
358 INTVAL(BorderStyle)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
359 INTVAL(Alignment)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
360 if (track->track_type == TRACK_TYPE_ASS)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
361 target->Alignment = numpad2align(target->Alignment);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
362 INTVAL(MarginL)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
363 INTVAL(MarginR)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
364 INTVAL(MarginV)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
365 INTVAL(Encoding)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
366 FPVAL(ScaleX)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
367 FPVAL(ScaleY)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
368 FPVAL(Outline)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
369 FPVAL(Shadow)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
370 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
371 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
372 style->ScaleX /= 100.;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
373 style->ScaleY /= 100.;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
374 if (!style->Name)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
375 style->Name = strdup("Default");
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
376 if (!style->FontName)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
377 style->FontName = strdup("Arial");
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
378 free(format);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
379 return 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
380
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
381 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
382
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
383 /**
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
384 * \brief Parse a header line
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
385 * \param track track
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
386 * \param str string to parse, zero-terminated
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
387 */
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
388 static int process_header_line(ass_track_t* track, char *str)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
389 {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
390 static int events_section_started = 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
391
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
392 mp_msg(MSGT_GLOBAL, MSGL_DBG2, "=== Header: %s\n", str);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
393 if (strncmp(str, "PlayResX:", 9)==0) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
394 track->PlayResX = atoi(str + 9);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
395 } else if (strncmp(str,"PlayResY:", 9)==0) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
396 track->PlayResY = atoi(str + 9);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
397 } else if (strncmp(str,"Timer:", 6)==0) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
398 track->Timer = atof(str + 6);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
399 } else if (strstr(str,"Styles]")) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
400 events_section_started = 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
401 if (strchr(str, '+'))
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
402 track->track_type = TRACK_TYPE_ASS;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
403 else
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
404 track->track_type = TRACK_TYPE_SSA;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
405 } else if (strncmp(str,"[Events]", 8)==0) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
406 events_section_started = 1;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
407 } else if (strncmp(str,"Format:", 7)==0) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
408 char* p = str + 7;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
409 skip_spaces(&p);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
410 if (events_section_started) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
411 track->event_format = strdup(p);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
412 mp_msg(MSGT_GLOBAL, MSGL_DBG2, "Event format: %s\n", track->event_format);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
413 } else {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
414 track->style_format = strdup(p);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
415 mp_msg(MSGT_GLOBAL, MSGL_DBG2, "Style format: %s\n", track->style_format);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
416 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
417 } else if (strncmp(str,"Style:", 6)==0) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
418 char* p = str + 6;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
419 skip_spaces(&p);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
420 process_style(track, p);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
421 } else if (strncmp(str,"WrapStyle:", 10)==0) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
422 track->WrapStyle = atoi(str + 10);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
423 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
424 return 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
425 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
426
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
427 /**
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
428 * \brief Process CodecPrivate section of subtitle stream
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
429 * \param track track
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
430 * \param data string to parse
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
431 * \param size length of data
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
432 CodecPrivate section contains [Stream Info] and [V4+ Styles] sections
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
433 */
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
434 void ass_process_chunk(ass_track_t* track, char *data, int size)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
435 {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
436 char* str = malloc(size + 1);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
437 char* p;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
438 int sid;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
439
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
440 memcpy(str, data, size);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
441 str[size] = '\0';
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
442
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
443 p = str;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
444 while(1) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
445 char* q;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
446 for (;((*p=='\r')||(*p=='\n'));++p) {}
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
447 for (q=p; ((*q!='\0')&&(*q!='\r')&&(*q!='\n')); ++q) {};
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
448 if (q==p)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
449 break;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
450 if (*q != '\0')
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
451 *(q++) = '\0';
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
452 process_header_line(track, p);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
453 if (*q == '\0')
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
454 break;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
455 p = q;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
456 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
457 free(str);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
458
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
459 // add "Default" style to the end
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
460 // will be used if track does not contain a default style (or even does not contain styles at all)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
461 sid = ass_alloc_style(track);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
462 track->styles[sid].Name = strdup("Default");
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
463 track->styles[sid].FontName = strdup("Arial");
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
464
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
465 if (!track->event_format) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
466 // probably an mkv produced by ancient mkvtoolnix
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
467 // such files don't have [Events] and Format: headers
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
468 if (track->track_type == TRACK_TYPE_SSA)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
469 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
470 else
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
471 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
472 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
473 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
474
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
475 static int check_duplicate_event(ass_track_t* track, int ReadOrder)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
476 {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
477 int i;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
478 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
479 if (track->events[i].ReadOrder == ReadOrder)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
480 return 1;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
481 return 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
482 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
483
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
484 /**
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
485 * \brief Process a chunk of subtitle stream data. In matroska, this containes exactly 1 event (or a commentary)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
486 * \param track track
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
487 * \param data string to parse
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
488 * \param size length of data
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
489 * \param timecode starting time of the event (milliseconds)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
490 * \param duration duration of the event (milliseconds)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
491 */
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
492 void ass_process_line(ass_track_t* track, char *data, int size, long long timecode, long long duration)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
493 {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
494 char* str;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
495 int eid;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
496 char* p;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
497 char* token;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
498 ass_event_t* event;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
499
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
500 if (!track->event_format) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
501 mp_msg(MSGT_GLOBAL, MSGL_WARN, "Event format header missing\n");
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
502 return;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
503 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
504
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
505 str = malloc(size + 1);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
506 memcpy(str, data, size);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
507 str[size] = '\0';
19378
d9d58ba1b833 Replace %lld with PRId64, part 2.
eugeni
parents: 19374
diff changeset
508 mp_msg(MSGT_GLOBAL, 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
509
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
510 eid = ass_alloc_event(track);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
511 event = track->events + eid;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
512
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
513 p = str;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
514
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
515 do {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
516 NEXT(p, token);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
517 event->ReadOrder = atoi(token);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
518 if (check_duplicate_event(track, event->ReadOrder))
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
519 break;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
520
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
521 NEXT(p, token);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
522 event->Layer = atoi(token);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
523
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
524 process_event_tail(track, event, p, 3);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
525
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
526 event->Start = timecode;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
527 event->Duration = duration;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
528
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
529 free(str);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
530 return;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
531 // dump_events(tid);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
532 } while (0);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
533 // some error
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
534 free_event(track, eid);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
535 free(str);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
536 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
537
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
538 /**
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
539 * \brief Process a line from external file.
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
540 * \param track track
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
541 * \param str string to parse
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
542 * \param size length of data
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
543 */
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
544 static void ass_process_external_line(ass_track_t* track, char *str, int size)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
545 {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
546 int eid;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
547 ass_event_t* event;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
548
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
549 eid = ass_alloc_event(track);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
550 event = track->events + eid;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
551
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
552 if (strncmp("Dialogue:", str, 9) != 0)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
553 return;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
554
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
555 str += 9;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
556 while (*str == ' ') {++str;}
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
557
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
558 process_event_tail(track, event, str, 0);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
559 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
560
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
561 #ifdef USE_ICONV
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
562 /** \brief recode buffer to utf-8
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
563 * constraint: sub_cp != 0
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
564 * \param data pointer to text buffer
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
565 * \param size buffer size
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
566 * \return a pointer to recoded buffer, caller is responsible for freeing it
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
567 **/
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
568 static char* sub_recode(char* data, size_t size)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
569 {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
570 static iconv_t icdsc = (iconv_t)(-1);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
571 char* tocp = "UTF-8";
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
572 char* outbuf;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
573 assert(sub_cp);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
574
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
575 {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
576 char* cp_tmp = sub_cp;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
577 #ifdef HAVE_ENCA
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
578 char enca_lang[3], enca_fallback[100];
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
579 if (sscanf(sub_cp, "enca:%2s:%99s", enca_lang, enca_fallback) == 2
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
580 || sscanf(sub_cp, "ENCA:%2s:%99s", enca_lang, enca_fallback) == 2) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
581 cp_tmp = guess_buffer_cp((unsigned char*)data, size, enca_lang, enca_fallback);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
582 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
583 #endif
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
584 if ((icdsc = iconv_open (tocp, cp_tmp)) != (iconv_t)(-1)){
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
585 mp_msg(MSGT_SUBREADER,MSGL_V,"LIBSUB: opened iconv descriptor.\n");
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
586 } else
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
587 mp_msg(MSGT_SUBREADER,MSGL_ERR,"LIBSUB: error opening iconv descriptor.\n");
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
588 #ifdef HAVE_ENCA
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
589 if (cp_tmp) free(cp_tmp);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
590 #endif
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
591 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
592
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
593 {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
594 size_t osize = size;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
595 size_t ileft = size;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
596 size_t oleft = size - 1;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
597 char* ip;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
598 char* op;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
599 size_t rc;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
600
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
601 outbuf = malloc(size);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
602 ip = data;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
603 op = outbuf;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
604
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
605 while (ileft) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
606 rc = iconv(icdsc, &ip, &ileft, &op, &oleft);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
607 if (rc == (size_t)(-1)) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
608 if (errno == E2BIG) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
609 int offset = op - outbuf;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
610 outbuf = (char*)realloc(outbuf, osize + size);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
611 op = outbuf + offset;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
612 osize += size;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
613 oleft += size;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
614 } else {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
615 mp_msg(MSGT_SUBREADER, MSGL_WARN, "LIBSUB: error recoding file.\n");
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
616 return NULL;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
617 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
618 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
619 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
620 outbuf[osize - oleft - 1] = 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
621 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
622
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
623 if (icdsc != (iconv_t)(-1)) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
624 (void)iconv_close(icdsc);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
625 icdsc = (iconv_t)(-1);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
626 mp_msg(MSGT_SUBREADER,MSGL_V,"LIBSUB: closed iconv descriptor.\n");
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
627 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
628
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
629 return outbuf;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
630 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
631 #endif // ICONV
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
632
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
633 /**
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
634 * \brief Read subtitles from file.
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
635 * \param fname file name
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
636 * \return newly allocated track
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
637 */
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
638 ass_track_t* ass_read_file(char* fname)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
639 {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
640 int res;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
641 long sz;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
642 long bytes_read;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
643 char* buf;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
644 char* p;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
645 int events_reached;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
646 ass_track_t* track;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
647
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
648 FILE* fp = fopen(fname, "rb");
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
649 if (!fp) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
650 mp_msg(MSGT_GLOBAL, MSGL_WARN, "ass_read_file(%s): fopen failed\n", fname);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
651 return 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
652 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
653 res = fseek(fp, 0, SEEK_END);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
654 if (res == -1) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
655 mp_msg(MSGT_GLOBAL, MSGL_WARN, "ass_read_file(%s): fseek failed\n", fname);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
656 fclose(fp);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
657 return 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
658 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
659
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
660 sz = ftell(fp);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
661 rewind(fp);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
662
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
663 if (sz > 10*1024*1024) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
664 mp_msg(MSGT_GLOBAL, MSGL_INFO, "ass_read_file(%s): Refusing to load subtitles larger than 10M\n", fname);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
665 fclose(fp);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
666 return 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
667 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
668
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
669 mp_msg(MSGT_GLOBAL, MSGL_V, "file size: %ld\n", sz);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
670
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
671 buf = malloc(sz + 1);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
672 assert(buf);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
673 bytes_read = 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
674 do {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
675 res = fread(buf + bytes_read, 1, sz - bytes_read, fp);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
676 if (res <= 0) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
677 mp_msg(MSGT_GLOBAL, MSGL_INFO, "Read failed, %d: %s\n", errno, strerror(errno));
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
678 fclose(fp);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
679 free(buf);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
680 return 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
681 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
682 bytes_read += res;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
683 } while (sz - bytes_read > 0);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
684 buf[sz] = '\0';
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
685 fclose(fp);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
686
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
687 #ifdef USE_ICONV
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
688 if (sub_cp) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
689 char* tmpbuf = sub_recode(buf, sz);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
690 free(buf);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
691 if (!tmpbuf)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
692 return 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
693 buf = tmpbuf;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
694 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
695 #endif
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
696
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
697 track = ass_new_track();
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
698 track->name = strdup(fname);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
699
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
700 // process header
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
701 events_reached = 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
702 p = buf;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
703 while (p && (*p)) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
704 while (*p == '\n') {++p;}
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
705 if (strncmp(p, "[Events]", 8) == 0) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
706 events_reached = 1;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
707 } else if ((strncmp(p, "Format:", 7) == 0) && (events_reached)) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
708 p = strchr(p, '\n');
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
709 if (p == 0) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
710 mp_msg(MSGT_GLOBAL, MSGL_WARN, "Incomplete subtitles\n");
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
711 free(buf);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
712 return 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
713 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
714 ass_process_chunk(track, buf, p - buf + 1);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
715 ++p;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
716 break;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
717 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
718 p = strchr(p, '\n');
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
719 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
720 // process events
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
721 while (p && (*p)) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
722 char* next;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
723 int len;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
724 while (*p == '\n') {++p;}
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
725 next = strchr(p, '\n');
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
726 len = 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
727 if (next) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
728 len = next - p;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
729 *next = 0;
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 len = strlen(p);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
732 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
733 ass_process_external_line(track, p, len);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
734 if (next) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
735 p = next + 1;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
736 continue;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
737 } else
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
738 break;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
739 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
740
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
741 free(buf);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
742
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
743 if (!events_reached) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
744 ass_free_track(track);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
745 return 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
746 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
747
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
748 mp_msg(MSGT_GLOBAL, MSGL_INFO, "LIBASS: added subtitle file: %s (%d styles, %d events)\n", fname, track->n_styles, track->n_events);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
749
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
750 sort_events(track);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
751
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
752 // dump_events(forced_tid);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
753 return track;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
754 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
755
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
756 static char* validate_fname(char* name)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
757 {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
758 char* fname;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
759 char* p;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
760 char* q;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
761 unsigned code;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
762 int sz = strlen(name);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
763
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
764 q = fname = malloc(sz + 1);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
765 p = name;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
766 while (*p) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
767 code = utf8_get_char(&p);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
768 if (code == 0)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
769 break;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
770 if ( (code > 0x7F) ||
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
771 (code == '\\') ||
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
772 (code == '/') ||
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
773 (code == ':') ||
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
774 (code == '*') ||
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
775 (code == '?') ||
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
776 (code == '<') ||
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
777 (code == '>') ||
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
778 (code == '|') ||
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
779 (code == 0))
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
780 {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
781 *q++ = '_';
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
782 } else {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
783 *q++ = code;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
784 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
785 if (p - name > sz)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
786 break;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
787 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
788 *q = 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
789 return fname;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
790 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
791
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
792 /**
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
793 * \brief Process embedded matroska font. Saves it to ~/.mplayer/fonts.
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
794 * \param name attachment name
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
795 * \param data binary font data
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
796 * \param data_size data size
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
797 */
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
798 void ass_process_font(const char* name, char* data, int data_size)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
799 {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
800 char buf[1000];
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
801 FILE* fp = 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
802 int rc;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
803 struct stat st;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
804 char* fname;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
805
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
806 char* fonts_dir = get_path("fonts");
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
807 rc = stat(fonts_dir, &st);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
808 if (rc) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
809 int res;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
810 #ifndef __MINGW32__
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
811 res = mkdir(fonts_dir, 0700);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
812 #else
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
813 res = mkdir(fonts_dir);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
814 #endif
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
815 if (res) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
816 mp_msg(MSGT_GLOBAL, MSGL_WARN, "Failed to create: %s\n", fonts_dir);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
817 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
818 } else if (!S_ISDIR(st.st_mode)) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
819 mp_msg(MSGT_GLOBAL, MSGL_WARN, "Not a directory: %s\n", fonts_dir);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
820 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
821
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
822 fname = validate_fname((char*)name);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
823
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
824 snprintf(buf, 1000, "%s/%s", fonts_dir, fname);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
825 free(fname);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
826 free(fonts_dir);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
827
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
828 fp = fopen(buf, "wb");
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
829 if (!fp) return;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
830
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
831 fwrite(data, data_size, 1, fp);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
832 fclose(fp);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
833 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
834
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
835 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
836 int i;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
837
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
838 if (movement == 0) return 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
839 if (track->n_events == 0) return 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
840
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
841 if (movement < 0)
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
842 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
843 else
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
844 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
845
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
846 // -1 and n_events are ok
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
847 assert(i >= -1); assert(i <= track->n_events);
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
848 i += movement;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
849 if (i < 0) i = 0;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
850 if (i >= track->n_events) i = track->n_events - 1;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
851 return ((long long)track->events[i].Start) - now;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
852 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
853
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
854 ass_track_t* ass_new_track(void) {
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
855 ass_track_t* track = calloc(1, sizeof(ass_track_t));
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
856 return track;
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
857 }
9e95ac641e77 Initial libass release (without mencoder support).
eugeni
parents:
diff changeset
858