Mercurial > mplayer.hg
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; |