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);