Mercurial > mplayer.hg
comparison libass/ass.c @ 19495:31ac2e1a5695
New cmdline option: -ass-force-style.
Allows overriding any style parameter from command line.
Idea and original patch by Konstantin G. Khlebnikov { koct9i aT gmail doT com }.
author | eugeni |
---|---|
date | Tue, 22 Aug 2006 23:20:05 +0000 |
parents | c8daf3471201 |
children | 1a03b2c8ac28 |
comparison
equal
deleted
inserted
replaced
19494:cbf4b6aa9d2a | 19495:31ac2e1a5695 |
---|---|
17 #ifdef USE_ICONV | 17 #ifdef USE_ICONV |
18 #include <iconv.h> | 18 #include <iconv.h> |
19 extern char *sub_cp; | 19 extern char *sub_cp; |
20 #endif | 20 #endif |
21 extern int extract_embedded_fonts; | 21 extern int extract_embedded_fonts; |
22 extern char** ass_force_style_list; | |
22 | 23 |
23 #include "mp_msg.h" | 24 #include "mp_msg.h" |
24 #include "ass.h" | 25 #include "ass.h" |
25 #include "ass_utils.h" | 26 #include "ass_utils.h" |
26 #include "libvo/sub.h" // for utf8_get_char | 27 #include "libvo/sub.h" // for utf8_get_char |
207 | 208 |
208 #define ANYVAL(name,func) \ | 209 #define ANYVAL(name,func) \ |
209 } else if (strcasecmp(tname, #name) == 0) { \ | 210 } else if (strcasecmp(tname, #name) == 0) { \ |
210 target->name = func(token); \ | 211 target->name = func(token); \ |
211 mp_msg(MSGT_GLOBAL, MSGL_DBG2, "%s = %s\n", #name, token); | 212 mp_msg(MSGT_GLOBAL, MSGL_DBG2, "%s = %s\n", #name, token); |
212 #define STRVAL(name) ANYVAL(name,strdup) | 213 |
214 #define STRVAL(name) \ | |
215 } else if (strcasecmp(tname, #name) == 0) { \ | |
216 if (target->name != NULL) free(target->name); \ | |
217 target->name = strdup(token); \ | |
218 mp_msg(MSGT_GLOBAL, MSGL_DBG2, "%s = %s\n", #name, token); | |
219 | |
213 #define COLORVAL(name) ANYVAL(name,string2color) | 220 #define COLORVAL(name) ANYVAL(name,string2color) |
214 #define INTVAL(name) ANYVAL(name,atoi) | 221 #define INTVAL(name) ANYVAL(name,atoi) |
215 #define FPVAL(name) ANYVAL(name,atof) | 222 #define FPVAL(name) ANYVAL(name,atof) |
216 #define TIMEVAL(name) ANYVAL(name,string2timecode) | 223 #define TIMEVAL(name) ANYVAL(name,string2timecode) |
217 #define STYLEVAL(name) \ | 224 #define STYLEVAL(name) \ |
296 TIMEVAL(Duration) | 303 TIMEVAL(Duration) |
297 } | 304 } |
298 } | 305 } |
299 free(format); | 306 free(format); |
300 return 1; | 307 return 1; |
308 } | |
309 | |
310 /** | |
311 * \brief Parse command line style overrides (--ass-force-style option) | |
312 * \param track track to apply overrides to | |
313 * The format for overrides is [StyleName.]Field=Value | |
314 */ | |
315 static void process_force_style(ass_track_t* track) { | |
316 char **fs, *eq, *dt, *style, *tname, *token; | |
317 ass_style_t* target; | |
318 int sid; | |
319 | |
320 if (!ass_force_style_list) return; | |
321 | |
322 for (fs = ass_force_style_list; *fs; ++fs) { | |
323 eq = strchr(*fs, '='); | |
324 if (!eq) | |
325 continue; | |
326 *eq = '\0'; | |
327 token = eq + 1; | |
328 | |
329 dt = strchr(*fs, '.'); | |
330 if (dt) { | |
331 *dt = '\0'; | |
332 style = *fs; | |
333 tname = dt + 1; | |
334 } else { | |
335 style = NULL; | |
336 tname = *fs; | |
337 } | |
338 for (sid = 0; sid < track->n_styles; ++sid) { | |
339 if (style == NULL || strcasecmp(track->styles[sid].Name, style) == 0) { | |
340 target = track->styles + sid; | |
341 if (0) { | |
342 STRVAL(FontName) | |
343 COLORVAL(PrimaryColour) | |
344 COLORVAL(SecondaryColour) | |
345 COLORVAL(OutlineColour) | |
346 COLORVAL(BackColour) | |
347 INTVAL(FontSize) | |
348 INTVAL(Bold) | |
349 INTVAL(Italic) | |
350 INTVAL(Underline) | |
351 INTVAL(StrikeOut) | |
352 INTVAL(Spacing) | |
353 INTVAL(Angle) | |
354 INTVAL(BorderStyle) | |
355 INTVAL(Alignment) | |
356 INTVAL(MarginL) | |
357 INTVAL(MarginR) | |
358 INTVAL(MarginV) | |
359 INTVAL(Encoding) | |
360 FPVAL(ScaleX) | |
361 FPVAL(ScaleY) | |
362 FPVAL(Outline) | |
363 FPVAL(Shadow) | |
364 } | |
365 } | |
366 } | |
367 *eq = '='; | |
368 if (dt) *dt = '.'; | |
369 } | |
301 } | 370 } |
302 | 371 |
303 /** | 372 /** |
304 * \brief Parse the Style line | 373 * \brief Parse the Style line |
305 * \param track track | 374 * \param track track |
643 if (track->track_type == TRACK_TYPE_SSA) | 712 if (track->track_type == TRACK_TYPE_SSA) |
644 track->event_format = strdup("Format: Marked, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text"); | 713 track->event_format = strdup("Format: Marked, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text"); |
645 else | 714 else |
646 track->event_format = strdup("Format: Layer, Start, End, Style, Actor, MarginL, MarginR, MarginV, Effect, Text"); | 715 track->event_format = strdup("Format: Layer, Start, End, Style, Actor, MarginL, MarginR, MarginV, Effect, Text"); |
647 } | 716 } |
717 | |
718 process_force_style(track); | |
648 } | 719 } |
649 | 720 |
650 static int check_duplicate_event(ass_track_t* track, int ReadOrder) | 721 static int check_duplicate_event(ass_track_t* track, int ReadOrder) |
651 { | 722 { |
652 int i; | 723 int i; |
860 if (track->track_type == TRACK_TYPE_UNKNOWN) { | 931 if (track->track_type == TRACK_TYPE_UNKNOWN) { |
861 ass_free_track(track); | 932 ass_free_track(track); |
862 return 0; | 933 return 0; |
863 } | 934 } |
864 | 935 |
936 process_force_style(track); | |
937 | |
865 mp_msg(MSGT_GLOBAL, MSGL_INFO, "LIBASS: added subtitle file: %s (%d styles, %d events)\n", fname, track->n_styles, track->n_events); | 938 mp_msg(MSGT_GLOBAL, MSGL_INFO, "LIBASS: added subtitle file: %s (%d styles, %d events)\n", fname, track->n_styles, track->n_events); |
866 | 939 |
867 sort_events(track); | 940 sort_events(track); |
868 | 941 |
869 // dump_events(forced_tid); | 942 // dump_events(forced_tid); |