comparison libass/ass.c @ 29263:0f1b5b68af32

whitespace cosmetics: Remove all trailing whitespace.
author diego
date Wed, 13 May 2009 02:58:57 +0000
parents b2d3d9408a99
children ce53e67e8633
comparison
equal deleted inserted replaced
29262:7d545a6b8aff 29263:0f1b5b68af32
54 #define ASS_STYLES_ALLOC 20 54 #define ASS_STYLES_ALLOC 20
55 #define ASS_EVENTS_ALLOC 200 55 #define ASS_EVENTS_ALLOC 200
56 56
57 void ass_free_track(ass_track_t* track) { 57 void ass_free_track(ass_track_t* track) {
58 int i; 58 int i;
59 59
60 if (track->parser_priv) { 60 if (track->parser_priv) {
61 if (track->parser_priv->fontname) 61 if (track->parser_priv->fontname)
62 free(track->parser_priv->fontname); 62 free(track->parser_priv->fontname);
63 if (track->parser_priv->fontdata) 63 if (track->parser_priv->fontdata)
64 free(track->parser_priv->fontdata); 64 free(track->parser_priv->fontdata);
83 /// \brief Allocate a new style struct 83 /// \brief Allocate a new style struct
84 /// \param track track 84 /// \param track track
85 /// \return style id 85 /// \return style id
86 int ass_alloc_style(ass_track_t* track) { 86 int ass_alloc_style(ass_track_t* track) {
87 int sid; 87 int sid;
88 88
89 assert(track->n_styles <= track->max_styles); 89 assert(track->n_styles <= track->max_styles);
90 90
91 if (track->n_styles == track->max_styles) { 91 if (track->n_styles == track->max_styles) {
92 track->max_styles += ASS_STYLES_ALLOC; 92 track->max_styles += ASS_STYLES_ALLOC;
93 track->styles = (ass_style_t*)realloc(track->styles, sizeof(ass_style_t)*track->max_styles); 93 track->styles = (ass_style_t*)realloc(track->styles, sizeof(ass_style_t)*track->max_styles);
94 } 94 }
95 95
96 sid = track->n_styles++; 96 sid = track->n_styles++;
97 memset(track->styles + sid, 0, sizeof(ass_style_t)); 97 memset(track->styles + sid, 0, sizeof(ass_style_t));
98 return sid; 98 return sid;
99 } 99 }
100 100
101 /// \brief Allocate a new event struct 101 /// \brief Allocate a new event struct
102 /// \param track track 102 /// \param track track
103 /// \return event id 103 /// \return event id
104 int ass_alloc_event(ass_track_t* track) { 104 int ass_alloc_event(ass_track_t* track) {
105 int eid; 105 int eid;
106 106
107 assert(track->n_events <= track->max_events); 107 assert(track->n_events <= track->max_events);
108 108
109 if (track->n_events == track->max_events) { 109 if (track->n_events == track->max_events) {
110 track->max_events += ASS_EVENTS_ALLOC; 110 track->max_events += ASS_EVENTS_ALLOC;
111 track->events = (ass_event_t*)realloc(track->events, sizeof(ass_event_t)*track->max_events); 111 track->events = (ass_event_t*)realloc(track->events, sizeof(ass_event_t)*track->max_events);
112 } 112 }
113 113
114 eid = track->n_events++; 114 eid = track->n_events++;
115 memset(track->events + eid, 0, sizeof(ass_event_t)); 115 memset(track->events + eid, 0, sizeof(ass_event_t));
116 return eid; 116 return eid;
117 } 117 }
118 118
215 #define STRVAL(name) \ 215 #define STRVAL(name) \
216 } else if (strcasecmp(tname, #name) == 0) { \ 216 } else if (strcasecmp(tname, #name) == 0) { \
217 if (target->name != NULL) free(target->name); \ 217 if (target->name != NULL) free(target->name); \
218 target->name = strdup(token); \ 218 target->name = strdup(token); \
219 mp_msg(MSGT_ASS, MSGL_DBG2, "%s = %s\n", #name, token); 219 mp_msg(MSGT_ASS, MSGL_DBG2, "%s = %s\n", #name, token);
220 220
221 #define COLORVAL(name) ANYVAL(name,string2color) 221 #define COLORVAL(name) ANYVAL(name,string2color)
222 #define INTVAL(name) ANYVAL(name,atoi) 222 #define INTVAL(name) ANYVAL(name,atoi)
223 #define FPVAL(name) ANYVAL(name,atof) 223 #define FPVAL(name) ANYVAL(name,atof)
224 #define TIMEVAL(name) ANYVAL(name,string2timecode) 224 #define TIMEVAL(name) ANYVAL(name,string2timecode)
225 #define STYLEVAL(name) \ 225 #define STYLEVAL(name) \
259 * \brief Parse the tail of Dialogue line 259 * \brief Parse the tail of Dialogue line
260 * \param track track 260 * \param track track
261 * \param event parsed data goes here 261 * \param event parsed data goes here
262 * \param str string to parse, zero-terminated 262 * \param str string to parse, zero-terminated
263 * \param n_ignored number of format options to skip at the beginning 263 * \param n_ignored number of format options to skip at the beginning
264 */ 264 */
265 static int process_event_tail(ass_track_t* track, ass_event_t* event, char* str, int n_ignored) 265 static int process_event_tail(ass_track_t* track, ass_event_t* event, char* str, int n_ignored)
266 { 266 {
267 char* token; 267 char* token;
268 char* tname; 268 char* tname;
269 char* p = str; 269 char* p = str;
327 void process_force_style(ass_track_t* track) { 327 void process_force_style(ass_track_t* track) {
328 char **fs, *eq, *dt, *style, *tname, *token; 328 char **fs, *eq, *dt, *style, *tname, *token;
329 ass_style_t* target; 329 ass_style_t* target;
330 int sid; 330 int sid;
331 char** list = track->library->style_overrides; 331 char** list = track->library->style_overrides;
332 332
333 if (!list) return; 333 if (!list) return;
334 334
335 for (fs = list; *fs; ++fs) { 335 for (fs = list; *fs; ++fs) {
336 eq = strrchr(*fs, '='); 336 eq = strrchr(*fs, '=');
337 if (!eq) 337 if (!eq)
338 continue; 338 continue;
339 *eq = '\0'; 339 *eq = '\0';
396 /** 396 /**
397 * \brief Parse the Style line 397 * \brief Parse the Style line
398 * \param track track 398 * \param track track
399 * \param str string to parse, zero-terminated 399 * \param str string to parse, zero-terminated
400 * Allocates a new style struct. 400 * Allocates a new style struct.
401 */ 401 */
402 static int process_style(ass_track_t* track, char *str) 402 static int process_style(ass_track_t* track, char *str)
403 { 403 {
404 404
405 char* token; 405 char* token;
406 char* tname; 406 char* tname;
424 "ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow," 424 "ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow,"
425 "Alignment, MarginL, MarginR, MarginV, Encoding"); 425 "Alignment, MarginL, MarginR, MarginV, Encoding");
426 } 426 }
427 427
428 q = format = strdup(track->style_format); 428 q = format = strdup(track->style_format);
429 429
430 mp_msg(MSGT_ASS, MSGL_V, "[%p] Style: %s\n", track, str); 430 mp_msg(MSGT_ASS, MSGL_V, "[%p] Style: %s\n", track, str);
431 431
432 sid = ass_alloc_style(track); 432 sid = ass_alloc_style(track);
433 433
434 style = track->styles + sid; 434 style = track->styles + sid;
435 target = style; 435 target = style;
436 // fill style with some default values 436 // fill style with some default values
437 style->ScaleX = 100.; 437 style->ScaleX = 100.;
438 style->ScaleY = 100.; 438 style->ScaleY = 100.;
439 439
440 while (1) { 440 while (1) {
441 NEXT(q, tname); 441 NEXT(q, tname);
442 NEXT(p, token); 442 NEXT(p, token);
443 443
444 // ALIAS(TertiaryColour,OutlineColour) // ignore TertiaryColour; it appears only in SSA, and is overridden by BackColour 444 // ALIAS(TertiaryColour,OutlineColour) // ignore TertiaryColour; it appears only in SSA, and is overridden by BackColour
445 445
446 if (0) { // cool ;) 446 if (0) { // cool ;)
447 STRVAL(Name) 447 STRVAL(Name)
448 if ((strcmp(target->Name, "Default")==0) || (strcmp(target->Name, "*Default")==0)) 448 if ((strcmp(target->Name, "Default")==0) || (strcmp(target->Name, "*Default")==0))
449 track->default_style = sid; 449 track->default_style = sid;
450 STRVAL(FontName) 450 STRVAL(FontName)
492 style->FontName = strdup(p + 1); 492 style->FontName = strdup(p + 1);
493 free(p); 493 free(p);
494 } 494 }
495 free(format); 495 free(format);
496 return 0; 496 return 0;
497 497
498 } 498 }
499 499
500 static int process_styles_line(ass_track_t* track, char *str) 500 static int process_styles_line(ass_track_t* track, char *str)
501 { 501 {
502 if (!strncmp(str,"Format:", 7)) { 502 if (!strncmp(str,"Format:", 7)) {
539 // This should never be reached for embedded subtitles. 539 // This should never be reached for embedded subtitles.
540 // They have slightly different format and are parsed in ass_process_chunk, 540 // They have slightly different format and are parsed in ass_process_chunk,
541 // called directly from demuxer 541 // called directly from demuxer
542 int eid; 542 int eid;
543 ass_event_t* event; 543 ass_event_t* event;
544 544
545 str += 9; 545 str += 9;
546 skip_spaces(&str); 546 skip_spaces(&str);
547 547
548 eid = ass_alloc_event(track); 548 eid = ass_alloc_event(track);
549 event = track->events + eid; 549 event = track->events + eid;
598 } else if (size % 4 == 3) { 598 } else if (size % 4 == 3) {
599 q = decode_chars(p[0], p[1], p[2], 0, q, 2); 599 q = decode_chars(p[0], p[1], p[2], 0, q, 2);
600 } 600 }
601 dsize = q - buf; 601 dsize = q - buf;
602 assert(dsize <= size / 4 * 3 + 2); 602 assert(dsize <= size / 4 * 3 + 2);
603 603
604 if (track->library->extract_fonts) { 604 if (track->library->extract_fonts) {
605 ass_add_font(track->library, track->parser_priv->fontname, (char*)buf, dsize); 605 ass_add_font(track->library, track->parser_priv->fontname, (char*)buf, dsize);
606 buf = 0; 606 buf = 0;
607 } 607 }
608 608
629 } 629 }
630 track->parser_priv->fontname = strdup(p); 630 track->parser_priv->fontname = strdup(p);
631 mp_msg(MSGT_ASS, MSGL_V, "fontname: %s\n", track->parser_priv->fontname); 631 mp_msg(MSGT_ASS, MSGL_V, "fontname: %s\n", track->parser_priv->fontname);
632 return 0; 632 return 0;
633 } 633 }
634 634
635 if (!track->parser_priv->fontname) { 635 if (!track->parser_priv->fontname) {
636 mp_msg(MSGT_ASS, MSGL_V, "Not understood: %s \n", str); 636 mp_msg(MSGT_ASS, MSGL_V, "Not understood: %s \n", str);
637 return 0; 637 return 0;
638 } 638 }
639 639
646 track->parser_priv->fontdata_size += 100 * 1024; 646 track->parser_priv->fontdata_size += 100 * 1024;
647 track->parser_priv->fontdata = realloc(track->parser_priv->fontdata, track->parser_priv->fontdata_size); 647 track->parser_priv->fontdata = realloc(track->parser_priv->fontdata, track->parser_priv->fontdata_size);
648 } 648 }
649 memcpy(track->parser_priv->fontdata + track->parser_priv->fontdata_used, str, len); 649 memcpy(track->parser_priv->fontdata + track->parser_priv->fontdata_used, str, len);
650 track->parser_priv->fontdata_used += len; 650 track->parser_priv->fontdata_used += len;
651 651
652 return 0; 652 return 0;
653 } 653 }
654 654
655 /** 655 /**
656 * \brief Parse a header line 656 * \brief Parse a header line
657 * \param track track 657 * \param track track
658 * \param str string to parse, zero-terminated 658 * \param str string to parse, zero-terminated
659 */ 659 */
660 static int process_line(ass_track_t* track, char *str) 660 static int process_line(ass_track_t* track, char *str)
661 { 661 {
662 if (!strncasecmp(str, "[Script Info]", 13)) { 662 if (!strncasecmp(str, "[Script Info]", 13)) {
663 track->parser_priv->state = PST_INFO; 663 track->parser_priv->state = PST_INFO;
664 } else if (!strncasecmp(str, "[V4 Styles]", 11)) { 664 } else if (!strncasecmp(str, "[V4 Styles]", 11)) {
776 * \param track track 776 * \param track track
777 * \param data string to parse 777 * \param data string to parse
778 * \param size length of data 778 * \param size length of data
779 * \param timecode starting time of the event (milliseconds) 779 * \param timecode starting time of the event (milliseconds)
780 * \param duration duration of the event (milliseconds) 780 * \param duration duration of the event (milliseconds)
781 */ 781 */
782 void ass_process_chunk(ass_track_t* track, char *data, int size, long long timecode, long long duration) 782 void ass_process_chunk(ass_track_t* track, char *data, int size, long long timecode, long long duration)
783 { 783 {
784 char* str; 784 char* str;
785 int eid; 785 int eid;
786 char* p; 786 char* p;
789 789
790 if (!track->event_format) { 790 if (!track->event_format) {
791 mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_EventFormatHeaderMissing); 791 mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_EventFormatHeaderMissing);
792 return; 792 return;
793 } 793 }
794 794
795 str = malloc(size + 1); 795 str = malloc(size + 1);
796 memcpy(str, data, size); 796 memcpy(str, data, size);
797 str[size] = '\0'; 797 str[size] = '\0';
798 mp_msg(MSGT_ASS, MSGL_V, "event at %" PRId64 ", +%" PRId64 ": %s \n", (int64_t)timecode, (int64_t)duration, str); 798 mp_msg(MSGT_ASS, MSGL_V, "event at %" PRId64 ", +%" PRId64 ": %s \n", (int64_t)timecode, (int64_t)duration, str);
799 799
800 eid = ass_alloc_event(track); 800 eid = ass_alloc_event(track);
801 event = track->events + eid; 801 event = track->events + eid;
802 802
803 p = str; 803 p = str;
804 804
805 do { 805 do {
806 NEXT(p, token); 806 NEXT(p, token);
807 event->ReadOrder = atoi(token); 807 event->ReadOrder = atoi(token);
808 if (check_duplicate_event(track, event->ReadOrder)) 808 if (check_duplicate_event(track, event->ReadOrder))
809 break; 809 break;
810 810
813 813
814 process_event_tail(track, event, p, 3); 814 process_event_tail(track, event, p, 3);
815 815
816 event->Start = timecode; 816 event->Start = timecode;
817 event->Duration = duration; 817 event->Duration = duration;
818 818
819 free(str); 819 free(str);
820 return; 820 return;
821 // dump_events(tid); 821 // dump_events(tid);
822 } while (0); 822 } while (0);
823 // some error 823 // some error
861 size_t oleft = size - 1; 861 size_t oleft = size - 1;
862 char* ip; 862 char* ip;
863 char* op; 863 char* op;
864 size_t rc; 864 size_t rc;
865 int clear = 0; 865 int clear = 0;
866 866
867 outbuf = malloc(osize); 867 outbuf = malloc(osize);
868 ip = data; 868 ip = data;
869 op = outbuf; 869 op = outbuf;
870 870
871 while (1) { 871 while (1) {
872 if (ileft) 872 if (ileft)
873 rc = iconv(icdsc, &ip, &ileft, &op, &oleft); 873 rc = iconv(icdsc, &ip, &ileft, &op, &oleft);
874 else {// clear the conversion state and leave 874 else {// clear the conversion state and leave
875 clear = 1; 875 clear = 1;
896 if (icdsc != (iconv_t)(-1)) { 896 if (icdsc != (iconv_t)(-1)) {
897 (void)iconv_close(icdsc); 897 (void)iconv_close(icdsc);
898 icdsc = (iconv_t)(-1); 898 icdsc = (iconv_t)(-1);
899 mp_msg(MSGT_ASS,MSGL_V,"LIBSUB: closed iconv descriptor.\n"); 899 mp_msg(MSGT_ASS,MSGL_V,"LIBSUB: closed iconv descriptor.\n");
900 } 900 }
901 901
902 return outbuf; 902 return outbuf;
903 } 903 }
904 #endif // ICONV 904 #endif // ICONV
905 905
906 /** 906 /**
925 if (res == -1) { 925 if (res == -1) {
926 mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_FseekFailed, fname); 926 mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_FseekFailed, fname);
927 fclose(fp); 927 fclose(fp);
928 return 0; 928 return 0;
929 } 929 }
930 930
931 sz = ftell(fp); 931 sz = ftell(fp);
932 rewind(fp); 932 rewind(fp);
933 933
934 if (sz > 10*1024*1024) { 934 if (sz > 10*1024*1024) {
935 mp_msg(MSGT_ASS, MSGL_INFO, MSGTR_LIBASS_RefusingToLoadSubtitlesLargerThan10M, fname); 935 mp_msg(MSGT_ASS, MSGL_INFO, MSGTR_LIBASS_RefusingToLoadSubtitlesLargerThan10M, fname);
936 fclose(fp); 936 fclose(fp);
937 return 0; 937 return 0;
938 } 938 }
939 939
940 mp_msg(MSGT_ASS, MSGL_V, "file size: %ld\n", sz); 940 mp_msg(MSGT_ASS, MSGL_V, "file size: %ld\n", sz);
941 941
942 buf = malloc(sz + 1); 942 buf = malloc(sz + 1);
943 assert(buf); 943 assert(buf);
944 bytes_read = 0; 944 bytes_read = 0;
945 do { 945 do {
946 res = fread(buf + bytes_read, 1, sz - bytes_read, fp); 946 res = fread(buf + bytes_read, 1, sz - bytes_read, fp);
952 } 952 }
953 bytes_read += res; 953 bytes_read += res;
954 } while (sz - bytes_read > 0); 954 } while (sz - bytes_read > 0);
955 buf[sz] = '\0'; 955 buf[sz] = '\0';
956 fclose(fp); 956 fclose(fp);
957 957
958 if (bufsize) 958 if (bufsize)
959 *bufsize = sz; 959 *bufsize = sz;
960 return buf; 960 return buf;
961 } 961 }
962 962
965 */ 965 */
966 static ass_track_t* parse_memory(ass_library_t* library, char* buf) 966 static ass_track_t* parse_memory(ass_library_t* library, char* buf)
967 { 967 {
968 ass_track_t* track; 968 ass_track_t* track;
969 int i; 969 int i;
970 970
971 track = ass_new_track(library); 971 track = ass_new_track(library);
972 972
973 // process header 973 // process header
974 process_text(track, buf); 974 process_text(track, buf);
975 975
976 // external SSA/ASS subs does not have ReadOrder field 976 // external SSA/ASS subs does not have ReadOrder field
977 for (i = 0; i < track->n_events; ++i) 977 for (i = 0; i < track->n_events; ++i)
996 * \param library libass library object 996 * \param library libass library object
997 * \param buf pointer to subtitles text 997 * \param buf pointer to subtitles text
998 * \param bufsize size of buffer 998 * \param bufsize size of buffer
999 * \param codepage recode buffer contents from given codepage 999 * \param codepage recode buffer contents from given codepage
1000 * \return newly allocated track 1000 * \return newly allocated track
1001 */ 1001 */
1002 ass_track_t* ass_read_memory(ass_library_t* library, char* buf, size_t bufsize, char* codepage) 1002 ass_track_t* ass_read_memory(ass_library_t* library, char* buf, size_t bufsize, char* codepage)
1003 { 1003 {
1004 ass_track_t* track; 1004 ass_track_t* track;
1005 int need_free = 0; 1005 int need_free = 0;
1006 1006
1007 if (!buf) 1007 if (!buf)
1008 return 0; 1008 return 0;
1009 1009
1010 #ifdef CONFIG_ICONV 1010 #ifdef CONFIG_ICONV
1011 if (codepage) 1011 if (codepage)
1012 buf = sub_recode(buf, bufsize, codepage); 1012 buf = sub_recode(buf, bufsize, codepage);
1013 if (!buf) 1013 if (!buf)
1014 return 0; 1014 return 0;
1027 1027
1028 char* read_file_recode(char* fname, char* codepage, size_t* size) 1028 char* read_file_recode(char* fname, char* codepage, size_t* size)
1029 { 1029 {
1030 char* buf; 1030 char* buf;
1031 size_t bufsize; 1031 size_t bufsize;
1032 1032
1033 buf = read_file(fname, &bufsize); 1033 buf = read_file(fname, &bufsize);
1034 if (!buf) 1034 if (!buf)
1035 return 0; 1035 return 0;
1036 #ifdef CONFIG_ICONV 1036 #ifdef CONFIG_ICONV
1037 if (codepage) { 1037 if (codepage) {
1050 * \brief Read subtitles from file. 1050 * \brief Read subtitles from file.
1051 * \param library libass library object 1051 * \param library libass library object
1052 * \param fname file name 1052 * \param fname file name
1053 * \param codepage recode buffer contents from given codepage 1053 * \param codepage recode buffer contents from given codepage
1054 * \return newly allocated track 1054 * \return newly allocated track
1055 */ 1055 */
1056 ass_track_t* ass_read_file(ass_library_t* library, char* fname, char* codepage) 1056 ass_track_t* ass_read_file(ass_library_t* library, char* fname, char* codepage)
1057 { 1057 {
1058 char* buf; 1058 char* buf;
1059 ass_track_t* track; 1059 ass_track_t* track;
1060 size_t bufsize; 1060 size_t bufsize;
1064 return 0; 1064 return 0;
1065 track = parse_memory(library, buf); 1065 track = parse_memory(library, buf);
1066 free(buf); 1066 free(buf);
1067 if (!track) 1067 if (!track)
1068 return 0; 1068 return 0;
1069 1069
1070 track->name = strdup(fname); 1070 track->name = strdup(fname);
1071 1071
1072 mp_msg(MSGT_ASS, MSGL_INFO, MSGTR_LIBASS_AddedSubtitleFileFname, fname, track->n_styles, track->n_events); 1072 mp_msg(MSGT_ASS, MSGL_INFO, MSGTR_LIBASS_AddedSubtitleFileFname, fname, track->n_styles, track->n_events);
1073 1073
1074 // dump_events(forced_tid); 1074 // dump_events(forced_tid);
1075 return track; 1075 return track;
1076 } 1076 }
1077 1077
1078 /** 1078 /**
1109 long long ass_step_sub(ass_track_t* track, long long now, int movement) { 1109 long long ass_step_sub(ass_track_t* track, long long now, int movement) {
1110 int i; 1110 int i;
1111 1111
1112 if (movement == 0) return 0; 1112 if (movement == 0) return 0;
1113 if (track->n_events == 0) return 0; 1113 if (track->n_events == 0) return 0;
1114 1114
1115 if (movement < 0) 1115 if (movement < 0)
1116 for (i = 0; (i < track->n_events) && ((long long)(track->events[i].Start + track->events[i].Duration) <= now); ++i) {} 1116 for (i = 0; (i < track->n_events) && ((long long)(track->events[i].Start + track->events[i].Duration) <= now); ++i) {}
1117 else 1117 else
1118 for (i = track->n_events - 1; (i >= 0) && ((long long)(track->events[i].Start) > now); --i) {} 1118 for (i = track->n_events - 1; (i >= 0) && ((long long)(track->events[i].Start) > now); --i) {}
1119 1119
1120 // -1 and n_events are ok 1120 // -1 and n_events are ok
1121 assert(i >= -1); assert(i <= track->n_events); 1121 assert(i >= -1); assert(i <= track->n_events);
1122 i += movement; 1122 i += movement;
1123 if (i < 0) i = 0; 1123 if (i < 0) i = 0;
1124 if (i >= track->n_events) i = track->n_events - 1; 1124 if (i >= track->n_events) i = track->n_events - 1;