annotate libass/ass.c @ 19382:7c6c205b88b6

trying to fix the reverting paragraph if you dissagree, dont hesitate to revert this commit or flame, but at least we should not claim that svn cannot revert commits except by recommiting the old version
author michael
date Sun, 13 Aug 2006 22:14:32 +0000
parents d9d58ba1b833
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