Mercurial > mplayer.hg
annotate subreader.c @ 24678:9aab9d7b51f0
Fix missing subtitles after seeking back
Subtitle packets that had been demuxed but whose start time had not
yet been reached were left in the demuxer stream after seeking.
When using the default (non-libass) subtitle rendering this could
block subtitles from appearing as long as the playback position stayed
below the original one before seek. External subtitle files were not
affected.
Fixed by making seek code free all packets from the subtitle stream.
author | uau |
---|---|
date | Thu, 04 Oct 2007 02:35:34 +0000 |
parents | 402b68e1a3bb |
children | e36efda34616 |
rev | line source |
---|---|
258 | 1 /* |
2 * Subtitle reader with format autodetection | |
3 * | |
4 * Written by laaz | |
5 * Some code cleanup & realloc() by A'rpi/ESP-team | |
11873 | 6 * |
258 | 7 */ |
8 | |
9 | |
10 #include <stdio.h> | |
11 #include <stdlib.h> | |
12 #include <string.h> | |
706
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
13 #include <ctype.h> |
258 | 14 |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
15 #include <sys/types.h> |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
16 #include <dirent.h> |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
17 |
2151
a9d91476085a
modifications to use iconv(3) function to recode text of subs (autodetect)
atlka
parents:
2141
diff
changeset
|
18 #include "config.h" |
6296 | 19 #include "mp_msg.h" |
258 | 20 #include "subreader.h" |
19271
64d82a45a05d
introduce new 'stream' directory for all stream layer related components and split them from libmpdemux
ben
parents:
19198
diff
changeset
|
21 #include "stream/stream.h" |
258 | 22 |
12443 | 23 #ifdef HAVE_ENCA |
24 #include <enca.h> | |
25 #endif | |
26 | |
3701 | 27 #define ERR ((void *) -1) |
258 | 28 |
2151
a9d91476085a
modifications to use iconv(3) function to recode text of subs (autodetect)
atlka
parents:
2141
diff
changeset
|
29 #ifdef USE_ICONV |
a9d91476085a
modifications to use iconv(3) function to recode text of subs (autodetect)
atlka
parents:
2141
diff
changeset
|
30 #include <iconv.h> |
a9d91476085a
modifications to use iconv(3) function to recode text of subs (autodetect)
atlka
parents:
2141
diff
changeset
|
31 char *sub_cp=NULL; |
a9d91476085a
modifications to use iconv(3) function to recode text of subs (autodetect)
atlka
parents:
2141
diff
changeset
|
32 #endif |
9635
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
33 #ifdef USE_FRIBIDI |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
34 #include <fribidi/fribidi.h> |
13680 | 35 char *fribidi_charset = NULL; ///character set that will be passed to FriBiDi |
36 int flip_hebrew = 1; ///flip subtitles using fribidi | |
37 int fribidi_flip_commas = 0; ///flip comma when fribidi is used | |
9635
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
38 #endif |
258 | 39 |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
40 extern char* dvdsub_lang; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
41 |
2912 | 42 /* Maximal length of line of a subtitle */ |
43 #define LINE_LEN 1000 | |
2178 | 44 static float mpsub_position=0; |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
45 static float mpsub_multiplier=1.; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
46 static int sub_slacktime = 20000; //20 sec |
2177 | 47 |
9126
7a06258271d6
Add a command line option (-sub-no-text-pp) to disable subtitles
arpi
parents:
9056
diff
changeset
|
48 int sub_no_text_pp=0; // 1 => do not apply text post-processing |
7a06258271d6
Add a command line option (-sub-no-text-pp) to disable subtitles
arpi
parents:
9056
diff
changeset
|
49 // like {\...} elimination in SSA format. |
2912 | 50 |
9893 | 51 int sub_match_fuzziness=0; // level of sub name matching fuzziness |
9884
d7b86f7d1406
turn most of the subtitle matching fuzziness off by default
henry
parents:
9872
diff
changeset
|
52 |
2912 | 53 /* Use the SUB_* constant defined in the header file */ |
54 int sub_format=SUB_INVALID; | |
8362
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
55 #ifdef USE_SORTSUB |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
56 /* |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
57 Some subtitling formats, namely AQT and Subrip09, define the end of a |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
58 subtitle as the beginning of the following. Since currently we read one |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
59 subtitle at time, for these format we keep two global *subtitle, |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
60 previous_aqt_sub and previous_subrip09_sub, pointing to previous subtitle, |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
61 so we can change its end when we read current subtitle starting time. |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
62 When USE_SORTSUB is defined, we use a single global unsigned long, |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
63 previous_sub_end, for both (and even future) formats, to store the end of |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
64 the previous sub: it is initialized to 0 in sub_read_file and eventually |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
65 modified by sub_read_aqt_line or sub_read_subrip09_line. |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
66 */ |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
67 unsigned long previous_sub_end; |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
68 #endif |
624 | 69 |
18870
391faf2c1474
this unrelated and erroneus change was applied on my previous commit, reverted
reynaldo
parents:
18869
diff
changeset
|
70 static int eol(char p) { |
391faf2c1474
this unrelated and erroneus change was applied on my previous commit, reverted
reynaldo
parents:
18869
diff
changeset
|
71 return (p=='\r' || p=='\n' || p=='\0'); |
391faf2c1474
this unrelated and erroneus change was applied on my previous commit, reverted
reynaldo
parents:
18869
diff
changeset
|
72 } |
391faf2c1474
this unrelated and erroneus change was applied on my previous commit, reverted
reynaldo
parents:
18869
diff
changeset
|
73 |
3701 | 74 /* Remove leading and trailing space */ |
75 static void trail_space(char *s) { | |
76 int i = 0; | |
3924
9f18722fafe9
tail_space infinite loop fix by jeon_goon@lycos.co.kr
arpi
parents:
3735
diff
changeset
|
77 while (isspace(s[i])) ++i; |
3701 | 78 if (i) strcpy(s, s + i); |
706
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
79 i = strlen(s) - 1; |
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
80 while (i > 0 && isspace(s[i])) s[i--] = '\0'; |
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
81 } |
624 | 82 |
10692
7cb48ef05b02
Support for case insensitive string matching in SAMI subtitle files. Patch by Bruno Lecointre.
mosu
parents:
10649
diff
changeset
|
83 static char *stristr(const char *haystack, const char *needle) { |
7cb48ef05b02
Support for case insensitive string matching in SAMI subtitle files. Patch by Bruno Lecointre.
mosu
parents:
10649
diff
changeset
|
84 int len = 0; |
7cb48ef05b02
Support for case insensitive string matching in SAMI subtitle files. Patch by Bruno Lecointre.
mosu
parents:
10649
diff
changeset
|
85 const char *p = haystack; |
7cb48ef05b02
Support for case insensitive string matching in SAMI subtitle files. Patch by Bruno Lecointre.
mosu
parents:
10649
diff
changeset
|
86 |
7cb48ef05b02
Support for case insensitive string matching in SAMI subtitle files. Patch by Bruno Lecointre.
mosu
parents:
10649
diff
changeset
|
87 if (!(haystack && needle)) return NULL; |
7cb48ef05b02
Support for case insensitive string matching in SAMI subtitle files. Patch by Bruno Lecointre.
mosu
parents:
10649
diff
changeset
|
88 |
7cb48ef05b02
Support for case insensitive string matching in SAMI subtitle files. Patch by Bruno Lecointre.
mosu
parents:
10649
diff
changeset
|
89 len=strlen(needle); |
7cb48ef05b02
Support for case insensitive string matching in SAMI subtitle files. Patch by Bruno Lecointre.
mosu
parents:
10649
diff
changeset
|
90 while (*p != '\0') { |
7cb48ef05b02
Support for case insensitive string matching in SAMI subtitle files. Patch by Bruno Lecointre.
mosu
parents:
10649
diff
changeset
|
91 if (strncasecmp(p, needle, len) == 0) return (char*)p; |
7cb48ef05b02
Support for case insensitive string matching in SAMI subtitle files. Patch by Bruno Lecointre.
mosu
parents:
10649
diff
changeset
|
92 p++; |
7cb48ef05b02
Support for case insensitive string matching in SAMI subtitle files. Patch by Bruno Lecointre.
mosu
parents:
10649
diff
changeset
|
93 } |
7cb48ef05b02
Support for case insensitive string matching in SAMI subtitle files. Patch by Bruno Lecointre.
mosu
parents:
10649
diff
changeset
|
94 |
7cb48ef05b02
Support for case insensitive string matching in SAMI subtitle files. Patch by Bruno Lecointre.
mosu
parents:
10649
diff
changeset
|
95 return NULL; |
7cb48ef05b02
Support for case insensitive string matching in SAMI subtitle files. Patch by Bruno Lecointre.
mosu
parents:
10649
diff
changeset
|
96 } |
2343 | 97 |
19066
26a30496ec96
marks several function without a prototype which arent used outside its sourcefile as static, Patch by Stefan Huehner - stefan AT huehner-org
reynaldo
parents:
18980
diff
changeset
|
98 static subtitle *sub_read_line_sami(stream_t* st, subtitle *current) { |
2912 | 99 static char line[LINE_LEN+1]; |
3235
0cf593b6bab0
patch fixes the showing last line of subtitles and support of SAMI Slacktime option by Evgeny Chukreev <codedj@echo.ru>
arpi
parents:
2915
diff
changeset
|
100 static char *s = NULL, *slacktime_s; |
7472
c4434bdf6e51
tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents:
7460
diff
changeset
|
101 char text[LINE_LEN+1], *p=NULL, *q; |
706
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
102 int state; |
624 | 103 |
706
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
104 current->lines = current->start = current->end = 0; |
13343
1a4b6e575484
This time is a patch to improve subtitle alignment management. It
faust3
parents:
13229
diff
changeset
|
105 current->alignment = SUB_ALIGNMENT_BOTTOMCENTER; |
706
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
106 state = 0; |
624 | 107 |
706
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
108 /* read the first line */ |
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
109 if (!s) |
17879 | 110 if (!(s = stream_read_line(st, line, LINE_LEN))) return 0; |
706
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
111 |
624 | 112 do { |
706
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
113 switch (state) { |
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
114 |
3235
0cf593b6bab0
patch fixes the showing last line of subtitles and support of SAMI Slacktime option by Evgeny Chukreev <codedj@echo.ru>
arpi
parents:
2915
diff
changeset
|
115 case 0: /* find "START=" or "Slacktime:" */ |
10692
7cb48ef05b02
Support for case insensitive string matching in SAMI subtitle files. Patch by Bruno Lecointre.
mosu
parents:
10649
diff
changeset
|
116 slacktime_s = stristr (s, "Slacktime:"); |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
117 if (slacktime_s) |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
118 sub_slacktime = strtol (slacktime_s+10, NULL, 0) / 10; |
3235
0cf593b6bab0
patch fixes the showing last line of subtitles and support of SAMI Slacktime option by Evgeny Chukreev <codedj@echo.ru>
arpi
parents:
2915
diff
changeset
|
119 |
10692
7cb48ef05b02
Support for case insensitive string matching in SAMI subtitle files. Patch by Bruno Lecointre.
mosu
parents:
10649
diff
changeset
|
120 s = stristr (s, "Start="); |
706
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
121 if (s) { |
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
122 current->start = strtol (s + 6, &s, 0) / 10; |
11838
b4f1df0c1e3a
prevent subreader from segfaulting when sami subs dont have
attila
parents:
11496
diff
changeset
|
123 /* eat '>' */ |
b4f1df0c1e3a
prevent subreader from segfaulting when sami subs dont have
attila
parents:
11496
diff
changeset
|
124 for (; *s != '>' && *s != '\0'; s++); |
b4f1df0c1e3a
prevent subreader from segfaulting when sami subs dont have
attila
parents:
11496
diff
changeset
|
125 s++; |
706
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
126 state = 1; continue; |
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
127 } |
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
128 break; |
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
129 |
11838
b4f1df0c1e3a
prevent subreader from segfaulting when sami subs dont have
attila
parents:
11496
diff
changeset
|
130 case 1: /* find (optionnal) "<P", skip other TAGs */ |
b4f1df0c1e3a
prevent subreader from segfaulting when sami subs dont have
attila
parents:
11496
diff
changeset
|
131 for (; *s == ' ' || *s == '\t'; s++); /* strip blanks, if any */ |
b4f1df0c1e3a
prevent subreader from segfaulting when sami subs dont have
attila
parents:
11496
diff
changeset
|
132 if (*s == '\0') break; |
b4f1df0c1e3a
prevent subreader from segfaulting when sami subs dont have
attila
parents:
11496
diff
changeset
|
133 if (*s != '<') { state = 3; p = text; continue; } /* not a TAG */ |
b4f1df0c1e3a
prevent subreader from segfaulting when sami subs dont have
attila
parents:
11496
diff
changeset
|
134 s++; |
b4f1df0c1e3a
prevent subreader from segfaulting when sami subs dont have
attila
parents:
11496
diff
changeset
|
135 if (*s == 'P' || *s == 'p') { s++; state = 2; continue; } /* found '<P' */ |
b4f1df0c1e3a
prevent subreader from segfaulting when sami subs dont have
attila
parents:
11496
diff
changeset
|
136 for (; *s != '>' && *s != '\0'; s++); /* skip remains of non-<P> TAG */ |
b4f1df0c1e3a
prevent subreader from segfaulting when sami subs dont have
attila
parents:
11496
diff
changeset
|
137 if (s == '\0') |
b4f1df0c1e3a
prevent subreader from segfaulting when sami subs dont have
attila
parents:
11496
diff
changeset
|
138 break; |
b4f1df0c1e3a
prevent subreader from segfaulting when sami subs dont have
attila
parents:
11496
diff
changeset
|
139 s++; |
b4f1df0c1e3a
prevent subreader from segfaulting when sami subs dont have
attila
parents:
11496
diff
changeset
|
140 continue; |
706
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
141 |
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
142 case 2: /* find ">" */ |
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
143 if ((s = strchr (s, '>'))) { s++; state = 3; p = text; continue; } |
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
144 break; |
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
145 |
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
146 case 3: /* get all text until '<' appears */ |
3235
0cf593b6bab0
patch fixes the showing last line of subtitles and support of SAMI Slacktime option by Evgeny Chukreev <codedj@echo.ru>
arpi
parents:
2915
diff
changeset
|
147 if (*s == '\0') break; |
2836
ec672ea5ac2c
Applied SAMI patch by Evgeny Chukreev <codedj at echo dot ru>
atmos4
parents:
2495
diff
changeset
|
148 else if (!strncasecmp (s, "<br>", 4)) { |
706
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
149 *p = '\0'; p = text; trail_space (text); |
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
150 if (text[0] != '\0') |
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
151 current->text[current->lines++] = strdup (text); |
2836
ec672ea5ac2c
Applied SAMI patch by Evgeny Chukreev <codedj at echo dot ru>
atmos4
parents:
2495
diff
changeset
|
152 s += 4; |
706
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
153 } |
12136
8f2e47faee88
skip {...} parts in SAME subs, patch by Salvatore Falco
alex
parents:
11873
diff
changeset
|
154 else if ((*s == '{') && !sub_no_text_pp) { state = 5; ++s; continue; } |
2836
ec672ea5ac2c
Applied SAMI patch by Evgeny Chukreev <codedj at echo dot ru>
atmos4
parents:
2495
diff
changeset
|
155 else if (*s == '<') { state = 4; } |
ec672ea5ac2c
Applied SAMI patch by Evgeny Chukreev <codedj at echo dot ru>
atmos4
parents:
2495
diff
changeset
|
156 else if (!strncasecmp (s, " ", 6)) { *p++ = ' '; s += 6; } |
ec672ea5ac2c
Applied SAMI patch by Evgeny Chukreev <codedj at echo dot ru>
atmos4
parents:
2495
diff
changeset
|
157 else if (*s == '\t') { *p++ = ' '; s++; } |
ec672ea5ac2c
Applied SAMI patch by Evgeny Chukreev <codedj at echo dot ru>
atmos4
parents:
2495
diff
changeset
|
158 else if (*s == '\r' || *s == '\n') { s++; } |
706
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
159 else *p++ = *s++; |
2836
ec672ea5ac2c
Applied SAMI patch by Evgeny Chukreev <codedj at echo dot ru>
atmos4
parents:
2495
diff
changeset
|
160 |
ec672ea5ac2c
Applied SAMI patch by Evgeny Chukreev <codedj at echo dot ru>
atmos4
parents:
2495
diff
changeset
|
161 /* skip duplicated space */ |
ec672ea5ac2c
Applied SAMI patch by Evgeny Chukreev <codedj at echo dot ru>
atmos4
parents:
2495
diff
changeset
|
162 if (p > text + 2) if (*(p-1) == ' ' && *(p-2) == ' ') p--; |
ec672ea5ac2c
Applied SAMI patch by Evgeny Chukreev <codedj at echo dot ru>
atmos4
parents:
2495
diff
changeset
|
163 |
624 | 164 continue; |
706
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
165 |
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
166 case 4: /* get current->end or skip <TAG> */ |
10692
7cb48ef05b02
Support for case insensitive string matching in SAMI subtitle files. Patch by Bruno Lecointre.
mosu
parents:
10649
diff
changeset
|
167 q = stristr (s, "Start="); |
706
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
168 if (q) { |
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
169 current->end = strtol (q + 6, &q, 0) / 10 - 1; |
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
170 *p = '\0'; trail_space (text); |
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
171 if (text[0] != '\0') |
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
172 current->text[current->lines++] = strdup (text); |
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
173 if (current->lines > 0) { state = 99; break; } |
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
174 state = 0; continue; |
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
175 } |
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
176 s = strchr (s, '>'); |
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
177 if (s) { s++; state = 3; continue; } |
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
178 break; |
13343
1a4b6e575484
This time is a patch to improve subtitle alignment management. It
faust3
parents:
13229
diff
changeset
|
179 case 5: /* get rid of {...} text, but read the alignment code */ |
1a4b6e575484
This time is a patch to improve subtitle alignment management. It
faust3
parents:
13229
diff
changeset
|
180 if ((*s == '\\') && (*(s + 1) == 'a') && !sub_no_text_pp) { |
1a4b6e575484
This time is a patch to improve subtitle alignment management. It
faust3
parents:
13229
diff
changeset
|
181 if (stristr(s, "\\a1") != NULL) { |
1a4b6e575484
This time is a patch to improve subtitle alignment management. It
faust3
parents:
13229
diff
changeset
|
182 current->alignment = SUB_ALIGNMENT_BOTTOMLEFT; |
1a4b6e575484
This time is a patch to improve subtitle alignment management. It
faust3
parents:
13229
diff
changeset
|
183 s = s + 3; |
1a4b6e575484
This time is a patch to improve subtitle alignment management. It
faust3
parents:
13229
diff
changeset
|
184 } |
1a4b6e575484
This time is a patch to improve subtitle alignment management. It
faust3
parents:
13229
diff
changeset
|
185 if (stristr(s, "\\a2") != NULL) { |
1a4b6e575484
This time is a patch to improve subtitle alignment management. It
faust3
parents:
13229
diff
changeset
|
186 current->alignment = SUB_ALIGNMENT_BOTTOMCENTER; |
1a4b6e575484
This time is a patch to improve subtitle alignment management. It
faust3
parents:
13229
diff
changeset
|
187 s = s + 3; |
1a4b6e575484
This time is a patch to improve subtitle alignment management. It
faust3
parents:
13229
diff
changeset
|
188 } else if (stristr(s, "\\a3") != NULL) { |
1a4b6e575484
This time is a patch to improve subtitle alignment management. It
faust3
parents:
13229
diff
changeset
|
189 current->alignment = SUB_ALIGNMENT_BOTTOMRIGHT; |
1a4b6e575484
This time is a patch to improve subtitle alignment management. It
faust3
parents:
13229
diff
changeset
|
190 s = s + 3; |
1a4b6e575484
This time is a patch to improve subtitle alignment management. It
faust3
parents:
13229
diff
changeset
|
191 } else if ((stristr(s, "\\a4") != NULL) || (stristr(s, "\\a5") != NULL) || (stristr(s, "\\a8") != NULL)) { |
1a4b6e575484
This time is a patch to improve subtitle alignment management. It
faust3
parents:
13229
diff
changeset
|
192 current->alignment = SUB_ALIGNMENT_TOPLEFT; |
1a4b6e575484
This time is a patch to improve subtitle alignment management. It
faust3
parents:
13229
diff
changeset
|
193 s = s + 3; |
1a4b6e575484
This time is a patch to improve subtitle alignment management. It
faust3
parents:
13229
diff
changeset
|
194 } else if (stristr(s, "\\a6") != NULL) { |
1a4b6e575484
This time is a patch to improve subtitle alignment management. It
faust3
parents:
13229
diff
changeset
|
195 current->alignment = SUB_ALIGNMENT_TOPCENTER; |
1a4b6e575484
This time is a patch to improve subtitle alignment management. It
faust3
parents:
13229
diff
changeset
|
196 s = s + 3; |
1a4b6e575484
This time is a patch to improve subtitle alignment management. It
faust3
parents:
13229
diff
changeset
|
197 } else if (stristr(s, "\\a7") != NULL) { |
1a4b6e575484
This time is a patch to improve subtitle alignment management. It
faust3
parents:
13229
diff
changeset
|
198 current->alignment = SUB_ALIGNMENT_TOPRIGHT; |
1a4b6e575484
This time is a patch to improve subtitle alignment management. It
faust3
parents:
13229
diff
changeset
|
199 s = s + 3; |
1a4b6e575484
This time is a patch to improve subtitle alignment management. It
faust3
parents:
13229
diff
changeset
|
200 } else if (stristr(s, "\\a9") != NULL) { |
1a4b6e575484
This time is a patch to improve subtitle alignment management. It
faust3
parents:
13229
diff
changeset
|
201 current->alignment = SUB_ALIGNMENT_MIDDLELEFT; |
1a4b6e575484
This time is a patch to improve subtitle alignment management. It
faust3
parents:
13229
diff
changeset
|
202 s = s + 3; |
1a4b6e575484
This time is a patch to improve subtitle alignment management. It
faust3
parents:
13229
diff
changeset
|
203 } else if (stristr(s, "\\a10") != NULL) { |
1a4b6e575484
This time is a patch to improve subtitle alignment management. It
faust3
parents:
13229
diff
changeset
|
204 current->alignment = SUB_ALIGNMENT_MIDDLECENTER; |
1a4b6e575484
This time is a patch to improve subtitle alignment management. It
faust3
parents:
13229
diff
changeset
|
205 s = s + 4; |
1a4b6e575484
This time is a patch to improve subtitle alignment management. It
faust3
parents:
13229
diff
changeset
|
206 } else if (stristr(s, "\\a11") != NULL) { |
1a4b6e575484
This time is a patch to improve subtitle alignment management. It
faust3
parents:
13229
diff
changeset
|
207 current->alignment = SUB_ALIGNMENT_MIDDLERIGHT; |
1a4b6e575484
This time is a patch to improve subtitle alignment management. It
faust3
parents:
13229
diff
changeset
|
208 s = s + 4; |
1a4b6e575484
This time is a patch to improve subtitle alignment management. It
faust3
parents:
13229
diff
changeset
|
209 } |
1a4b6e575484
This time is a patch to improve subtitle alignment management. It
faust3
parents:
13229
diff
changeset
|
210 } |
12136
8f2e47faee88
skip {...} parts in SAME subs, patch by Salvatore Falco
alex
parents:
11873
diff
changeset
|
211 if (*s == '}') state = 3; |
8f2e47faee88
skip {...} parts in SAME subs, patch by Salvatore Falco
alex
parents:
11873
diff
changeset
|
212 ++s; |
8f2e47faee88
skip {...} parts in SAME subs, patch by Salvatore Falco
alex
parents:
11873
diff
changeset
|
213 continue; |
624 | 214 } |
215 | |
706
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
216 /* read next line */ |
17879 | 217 if (state != 99 && !(s = stream_read_line (st, line, LINE_LEN))) { |
3735 | 218 if (current->start > 0) { |
219 break; // if it is the last subtitle | |
220 } else { | |
221 return 0; | |
222 } | |
223 } | |
3235
0cf593b6bab0
patch fixes the showing last line of subtitles and support of SAMI Slacktime option by Evgeny Chukreev <codedj@echo.ru>
arpi
parents:
2915
diff
changeset
|
224 |
706
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
225 } while (state != 99); |
624 | 226 |
3235
0cf593b6bab0
patch fixes the showing last line of subtitles and support of SAMI Slacktime option by Evgeny Chukreev <codedj@echo.ru>
arpi
parents:
2915
diff
changeset
|
227 // For the last subtitle |
0cf593b6bab0
patch fixes the showing last line of subtitles and support of SAMI Slacktime option by Evgeny Chukreev <codedj@echo.ru>
arpi
parents:
2915
diff
changeset
|
228 if (current->end <= 0) { |
0cf593b6bab0
patch fixes the showing last line of subtitles and support of SAMI Slacktime option by Evgeny Chukreev <codedj@echo.ru>
arpi
parents:
2915
diff
changeset
|
229 current->end = current->start + sub_slacktime; |
0cf593b6bab0
patch fixes the showing last line of subtitles and support of SAMI Slacktime option by Evgeny Chukreev <codedj@echo.ru>
arpi
parents:
2915
diff
changeset
|
230 *p = '\0'; trail_space (text); |
0cf593b6bab0
patch fixes the showing last line of subtitles and support of SAMI Slacktime option by Evgeny Chukreev <codedj@echo.ru>
arpi
parents:
2915
diff
changeset
|
231 if (text[0] != '\0') |
0cf593b6bab0
patch fixes the showing last line of subtitles and support of SAMI Slacktime option by Evgeny Chukreev <codedj@echo.ru>
arpi
parents:
2915
diff
changeset
|
232 current->text[current->lines++] = strdup (text); |
0cf593b6bab0
patch fixes the showing last line of subtitles and support of SAMI Slacktime option by Evgeny Chukreev <codedj@echo.ru>
arpi
parents:
2915
diff
changeset
|
233 } |
0cf593b6bab0
patch fixes the showing last line of subtitles and support of SAMI Slacktime option by Evgeny Chukreev <codedj@echo.ru>
arpi
parents:
2915
diff
changeset
|
234 |
624 | 235 return current; |
236 } | |
258 | 237 |
238 | |
19066
26a30496ec96
marks several function without a prototype which arent used outside its sourcefile as static, Patch by Stefan Huehner - stefan AT huehner-org
reynaldo
parents:
18980
diff
changeset
|
239 static char *sub_readtext(char *source, char **dest) { |
258 | 240 int len=0; |
932 | 241 char *p=source; |
258 | 242 |
6242
9c8c3b5e6658
possible sig11 fixed in .rt parser (weisskreuzova.zip)
arpi
parents:
6208
diff
changeset
|
243 // printf("src=%p dest=%p \n",source,dest); |
9c8c3b5e6658
possible sig11 fixed in .rt parser (weisskreuzova.zip)
arpi
parents:
6208
diff
changeset
|
244 |
932 | 245 while ( !eol(*p) && *p!= '|' ) { |
246 p++,len++; | |
247 } | |
258 | 248 |
18869 | 249 *dest= malloc (len+1); |
258 | 250 if (!dest) {return ERR;} |
251 | |
252 strncpy(*dest, source, len); | |
253 (*dest)[len]=0; | |
254 | |
255 while (*p=='\r' || *p=='\n' || *p=='|') p++; | |
256 | |
257 if (*p) return p; // not-last text field | |
258 else return NULL; // last text field | |
259 } | |
260 | |
19066
26a30496ec96
marks several function without a prototype which arent used outside its sourcefile as static, Patch by Stefan Huehner - stefan AT huehner-org
reynaldo
parents:
18980
diff
changeset
|
261 static subtitle *sub_read_line_microdvd(stream_t *st,subtitle *current) { |
2912 | 262 char line[LINE_LEN+1]; |
263 char line2[LINE_LEN+1]; | |
258 | 264 char *p, *next; |
265 int i; | |
266 | |
267 do { | |
17879 | 268 if (!stream_read_line (st, line, LINE_LEN)) return NULL; |
4048
654419a9a228
changed subreader.c to read microdvd lines in form "{%ld}{}[^\r\n]" too
atlka
parents:
3924
diff
changeset
|
269 } while ((sscanf (line, |
654419a9a228
changed subreader.c to read microdvd lines in form "{%ld}{}[^\r\n]" too
atlka
parents:
3924
diff
changeset
|
270 "{%ld}{}%[^\r\n]", |
654419a9a228
changed subreader.c to read microdvd lines in form "{%ld}{}[^\r\n]" too
atlka
parents:
3924
diff
changeset
|
271 &(current->start), line2) < 2) && |
654419a9a228
changed subreader.c to read microdvd lines in form "{%ld}{}[^\r\n]" too
atlka
parents:
3924
diff
changeset
|
272 (sscanf (line, |
654419a9a228
changed subreader.c to read microdvd lines in form "{%ld}{}[^\r\n]" too
atlka
parents:
3924
diff
changeset
|
273 "{%ld}{%ld}%[^\r\n]", |
654419a9a228
changed subreader.c to read microdvd lines in form "{%ld}{}[^\r\n]" too
atlka
parents:
3924
diff
changeset
|
274 &(current->start), &(current->end), line2) < 3)); |
654419a9a228
changed subreader.c to read microdvd lines in form "{%ld}{}[^\r\n]" too
atlka
parents:
3924
diff
changeset
|
275 |
932 | 276 p=line2; |
258 | 277 |
278 next=p, i=0; | |
1081 | 279 while ((next =sub_readtext (next, &(current->text[i])))) { |
270 | 280 if (current->text[i]==ERR) {return ERR;} |
258 | 281 i++; |
6296 | 282 if (i>=SUB_MAX_TEXT) { mp_msg(MSGT_SUBREADER,MSGL_WARN,"Too many lines in a subtitle\n");current->lines=i;return current;} |
258 | 283 } |
932 | 284 current->lines= ++i; |
258 | 285 |
286 return current; | |
287 } | |
288 | |
19066
26a30496ec96
marks several function without a prototype which arent used outside its sourcefile as static, Patch by Stefan Huehner - stefan AT huehner-org
reynaldo
parents:
18980
diff
changeset
|
289 static subtitle *sub_read_line_mpl2(stream_t *st,subtitle *current) { |
12138
eb3ad04675e1
MPL2 subreader, patch by Cezary Jackiewicz (cjackiewicz@poczta.onet.pl)
alex
parents:
12136
diff
changeset
|
290 char line[LINE_LEN+1]; |
eb3ad04675e1
MPL2 subreader, patch by Cezary Jackiewicz (cjackiewicz@poczta.onet.pl)
alex
parents:
12136
diff
changeset
|
291 char line2[LINE_LEN+1]; |
eb3ad04675e1
MPL2 subreader, patch by Cezary Jackiewicz (cjackiewicz@poczta.onet.pl)
alex
parents:
12136
diff
changeset
|
292 char *p, *next; |
eb3ad04675e1
MPL2 subreader, patch by Cezary Jackiewicz (cjackiewicz@poczta.onet.pl)
alex
parents:
12136
diff
changeset
|
293 int i; |
eb3ad04675e1
MPL2 subreader, patch by Cezary Jackiewicz (cjackiewicz@poczta.onet.pl)
alex
parents:
12136
diff
changeset
|
294 |
eb3ad04675e1
MPL2 subreader, patch by Cezary Jackiewicz (cjackiewicz@poczta.onet.pl)
alex
parents:
12136
diff
changeset
|
295 do { |
17879 | 296 if (!stream_read_line (st, line, LINE_LEN)) return NULL; |
12138
eb3ad04675e1
MPL2 subreader, patch by Cezary Jackiewicz (cjackiewicz@poczta.onet.pl)
alex
parents:
12136
diff
changeset
|
297 } while ((sscanf (line, |
eb3ad04675e1
MPL2 subreader, patch by Cezary Jackiewicz (cjackiewicz@poczta.onet.pl)
alex
parents:
12136
diff
changeset
|
298 "[%ld][%ld]%[^\r\n]", |
eb3ad04675e1
MPL2 subreader, patch by Cezary Jackiewicz (cjackiewicz@poczta.onet.pl)
alex
parents:
12136
diff
changeset
|
299 &(current->start), &(current->end), line2) < 3)); |
eb3ad04675e1
MPL2 subreader, patch by Cezary Jackiewicz (cjackiewicz@poczta.onet.pl)
alex
parents:
12136
diff
changeset
|
300 current->start *= 10; |
eb3ad04675e1
MPL2 subreader, patch by Cezary Jackiewicz (cjackiewicz@poczta.onet.pl)
alex
parents:
12136
diff
changeset
|
301 current->end *= 10; |
eb3ad04675e1
MPL2 subreader, patch by Cezary Jackiewicz (cjackiewicz@poczta.onet.pl)
alex
parents:
12136
diff
changeset
|
302 p=line2; |
eb3ad04675e1
MPL2 subreader, patch by Cezary Jackiewicz (cjackiewicz@poczta.onet.pl)
alex
parents:
12136
diff
changeset
|
303 |
eb3ad04675e1
MPL2 subreader, patch by Cezary Jackiewicz (cjackiewicz@poczta.onet.pl)
alex
parents:
12136
diff
changeset
|
304 next=p, i=0; |
eb3ad04675e1
MPL2 subreader, patch by Cezary Jackiewicz (cjackiewicz@poczta.onet.pl)
alex
parents:
12136
diff
changeset
|
305 while ((next =sub_readtext (next, &(current->text[i])))) { |
eb3ad04675e1
MPL2 subreader, patch by Cezary Jackiewicz (cjackiewicz@poczta.onet.pl)
alex
parents:
12136
diff
changeset
|
306 if (current->text[i]==ERR) {return ERR;} |
eb3ad04675e1
MPL2 subreader, patch by Cezary Jackiewicz (cjackiewicz@poczta.onet.pl)
alex
parents:
12136
diff
changeset
|
307 i++; |
eb3ad04675e1
MPL2 subreader, patch by Cezary Jackiewicz (cjackiewicz@poczta.onet.pl)
alex
parents:
12136
diff
changeset
|
308 if (i>=SUB_MAX_TEXT) { mp_msg(MSGT_SUBREADER,MSGL_WARN,"Too many lines in a subtitle\n");current->lines=i;return current;} |
eb3ad04675e1
MPL2 subreader, patch by Cezary Jackiewicz (cjackiewicz@poczta.onet.pl)
alex
parents:
12136
diff
changeset
|
309 } |
eb3ad04675e1
MPL2 subreader, patch by Cezary Jackiewicz (cjackiewicz@poczta.onet.pl)
alex
parents:
12136
diff
changeset
|
310 current->lines= ++i; |
eb3ad04675e1
MPL2 subreader, patch by Cezary Jackiewicz (cjackiewicz@poczta.onet.pl)
alex
parents:
12136
diff
changeset
|
311 |
eb3ad04675e1
MPL2 subreader, patch by Cezary Jackiewicz (cjackiewicz@poczta.onet.pl)
alex
parents:
12136
diff
changeset
|
312 return current; |
eb3ad04675e1
MPL2 subreader, patch by Cezary Jackiewicz (cjackiewicz@poczta.onet.pl)
alex
parents:
12136
diff
changeset
|
313 } |
eb3ad04675e1
MPL2 subreader, patch by Cezary Jackiewicz (cjackiewicz@poczta.onet.pl)
alex
parents:
12136
diff
changeset
|
314 |
19066
26a30496ec96
marks several function without a prototype which arent used outside its sourcefile as static, Patch by Stefan Huehner - stefan AT huehner-org
reynaldo
parents:
18980
diff
changeset
|
315 static subtitle *sub_read_line_subrip(stream_t* st, subtitle *current) { |
2912 | 316 char line[LINE_LEN+1]; |
258 | 317 int a1,a2,a3,a4,b1,b2,b3,b4; |
318 char *p=NULL, *q=NULL; | |
319 int len; | |
320 | |
1764 | 321 while (1) { |
17879 | 322 if (!stream_read_line (st, line, LINE_LEN)) return NULL; |
269 | 323 if (sscanf (line, "%d:%d:%d.%d,%d:%d:%d.%d",&a1,&a2,&a3,&a4,&b1,&b2,&b3,&b4) < 8) continue; |
258 | 324 current->start = a1*360000+a2*6000+a3*100+a4; |
325 current->end = b1*360000+b2*6000+b3*100+b4; | |
326 | |
17879 | 327 if (!stream_read_line (st, line, LINE_LEN)) return NULL; |
258 | 328 |
329 p=q=line; | |
330 for (current->lines=1; current->lines < SUB_MAX_TEXT; current->lines++) { | |
6657
766b6fb28ebf
subrip sometimes uses pipe as newline separator - patch by MOLNAR Andor <dolphy@inf.elte.hu>
arpi
parents:
6597
diff
changeset
|
331 for (q=p,len=0; *p && *p!='\r' && *p!='\n' && *p!='|' && strncmp(p,"[br]",4); p++,len++); |
18869 | 332 current->text[current->lines-1]=malloc (len+1); |
258 | 333 if (!current->text[current->lines-1]) return ERR; |
334 strncpy (current->text[current->lines-1], q, len); | |
270 | 335 current->text[current->lines-1][len]='\0'; |
258 | 336 if (!*p || *p=='\r' || *p=='\n') break; |
6657
766b6fb28ebf
subrip sometimes uses pipe as newline separator - patch by MOLNAR Andor <dolphy@inf.elte.hu>
arpi
parents:
6597
diff
changeset
|
337 if (*p=='|') p++; |
766b6fb28ebf
subrip sometimes uses pipe as newline separator - patch by MOLNAR Andor <dolphy@inf.elte.hu>
arpi
parents:
6597
diff
changeset
|
338 else while (*p++!=']'); |
258 | 339 } |
1764 | 340 break; |
258 | 341 } |
342 return current; | |
343 } | |
344 | |
19066
26a30496ec96
marks several function without a prototype which arent used outside its sourcefile as static, Patch by Stefan Huehner - stefan AT huehner-org
reynaldo
parents:
18980
diff
changeset
|
345 static subtitle *sub_read_line_subviewer(stream_t *st,subtitle *current) { |
2912 | 346 char line[LINE_LEN+1]; |
258 | 347 int a1,a2,a3,a4,b1,b2,b3,b4; |
348 char *p=NULL; | |
349 int i,len; | |
350 | |
351 while (!current->text[0]) { | |
17879 | 352 if (!stream_read_line (st, line, LINE_LEN)) return NULL; |
9217
420e2b2f8e5a
compiler warning fixes patch by Dominik Mierzejewski <dominik@rangers.eu.org>
arpi
parents:
9145
diff
changeset
|
353 if ((len=sscanf (line, "%d:%d:%d%[,.:]%d --> %d:%d:%d%[,.:]%d",&a1,&a2,&a3,(char *)&i,&a4,&b1,&b2,&b3,(char *)&i,&b4)) < 10) |
258 | 354 continue; |
355 current->start = a1*360000+a2*6000+a3*100+a4/10; | |
356 current->end = b1*360000+b2*6000+b3*100+b4/10; | |
357 for (i=0; i<SUB_MAX_TEXT;) { | |
21939
2992c0eda0ec
In .srt, any line containing only spaces and tabs marks the end of the
eugeni
parents:
21833
diff
changeset
|
358 int blank = 1; |
17879 | 359 if (!stream_read_line (st, line, LINE_LEN)) break; |
258 | 360 len=0; |
21939
2992c0eda0ec
In .srt, any line containing only spaces and tabs marks the end of the
eugeni
parents:
21833
diff
changeset
|
361 for (p=line; *p!='\n' && *p!='\r' && *p; p++,len++) |
2992c0eda0ec
In .srt, any line containing only spaces and tabs marks the end of the
eugeni
parents:
21833
diff
changeset
|
362 if (*p != ' ' && *p != '\t') |
2992c0eda0ec
In .srt, any line containing only spaces and tabs marks the end of the
eugeni
parents:
21833
diff
changeset
|
363 blank = 0; |
2992c0eda0ec
In .srt, any line containing only spaces and tabs marks the end of the
eugeni
parents:
21833
diff
changeset
|
364 if (len && !blank) { |
7608
e1962f1bb326
Skip html tags (like <i>) inside subviewer subtitles.
atmos4
parents:
7472
diff
changeset
|
365 int j=0,skip=0; |
18869 | 366 char *curptr=current->text[i]=malloc (len+1); |
258 | 367 if (!current->text[i]) return ERR; |
7608
e1962f1bb326
Skip html tags (like <i>) inside subviewer subtitles.
atmos4
parents:
7472
diff
changeset
|
368 //strncpy (current->text[i], line, len); current->text[i][len]='\0'; |
8123
9fc45fe0d444
*HUGE* set of compiler warning fixes, unused variables removal
arpi
parents:
7983
diff
changeset
|
369 for(; j<len; j++) { |
7608
e1962f1bb326
Skip html tags (like <i>) inside subviewer subtitles.
atmos4
parents:
7472
diff
changeset
|
370 /* let's filter html tags ::atmos */ |
e1962f1bb326
Skip html tags (like <i>) inside subviewer subtitles.
atmos4
parents:
7472
diff
changeset
|
371 if(line[j]=='>') { |
e1962f1bb326
Skip html tags (like <i>) inside subviewer subtitles.
atmos4
parents:
7472
diff
changeset
|
372 skip=0; |
e1962f1bb326
Skip html tags (like <i>) inside subviewer subtitles.
atmos4
parents:
7472
diff
changeset
|
373 continue; |
e1962f1bb326
Skip html tags (like <i>) inside subviewer subtitles.
atmos4
parents:
7472
diff
changeset
|
374 } |
e1962f1bb326
Skip html tags (like <i>) inside subviewer subtitles.
atmos4
parents:
7472
diff
changeset
|
375 if(line[j]=='<') { |
e1962f1bb326
Skip html tags (like <i>) inside subviewer subtitles.
atmos4
parents:
7472
diff
changeset
|
376 skip=1; |
e1962f1bb326
Skip html tags (like <i>) inside subviewer subtitles.
atmos4
parents:
7472
diff
changeset
|
377 continue; |
e1962f1bb326
Skip html tags (like <i>) inside subviewer subtitles.
atmos4
parents:
7472
diff
changeset
|
378 } |
e1962f1bb326
Skip html tags (like <i>) inside subviewer subtitles.
atmos4
parents:
7472
diff
changeset
|
379 if(skip) { |
e1962f1bb326
Skip html tags (like <i>) inside subviewer subtitles.
atmos4
parents:
7472
diff
changeset
|
380 continue; |
e1962f1bb326
Skip html tags (like <i>) inside subviewer subtitles.
atmos4
parents:
7472
diff
changeset
|
381 } |
e1962f1bb326
Skip html tags (like <i>) inside subviewer subtitles.
atmos4
parents:
7472
diff
changeset
|
382 *curptr=line[j]; |
e1962f1bb326
Skip html tags (like <i>) inside subviewer subtitles.
atmos4
parents:
7472
diff
changeset
|
383 curptr++; |
e1962f1bb326
Skip html tags (like <i>) inside subviewer subtitles.
atmos4
parents:
7472
diff
changeset
|
384 } |
e1962f1bb326
Skip html tags (like <i>) inside subviewer subtitles.
atmos4
parents:
7472
diff
changeset
|
385 *curptr='\0'; |
e1962f1bb326
Skip html tags (like <i>) inside subviewer subtitles.
atmos4
parents:
7472
diff
changeset
|
386 |
258 | 387 i++; |
388 } else { | |
389 break; | |
390 } | |
391 } | |
392 current->lines=i; | |
393 } | |
394 return current; | |
395 } | |
396 | |
19066
26a30496ec96
marks several function without a prototype which arent used outside its sourcefile as static, Patch by Stefan Huehner - stefan AT huehner-org
reynaldo
parents:
18980
diff
changeset
|
397 static subtitle *sub_read_line_subviewer2(stream_t *st,subtitle *current) { |
6012 | 398 char line[LINE_LEN+1]; |
399 int a1,a2,a3,a4; | |
400 char *p=NULL; | |
401 int i,len; | |
402 | |
403 while (!current->text[0]) { | |
17879 | 404 if (!stream_read_line (st, line, LINE_LEN)) return NULL; |
6012 | 405 if (line[0]!='{') |
406 continue; | |
407 if ((len=sscanf (line, "{T %d:%d:%d:%d",&a1,&a2,&a3,&a4)) < 4) | |
408 continue; | |
409 current->start = a1*360000+a2*6000+a3*100+a4/10; | |
410 for (i=0; i<SUB_MAX_TEXT;) { | |
17879 | 411 if (!stream_read_line (st, line, LINE_LEN)) break; |
6012 | 412 if (line[0]=='}') break; |
413 len=0; | |
414 for (p=line; *p!='\n' && *p!='\r' && *p; ++p,++len); | |
415 if (len) { | |
18869 | 416 current->text[i]=malloc (len+1); |
6012 | 417 if (!current->text[i]) return ERR; |
418 strncpy (current->text[i], line, len); current->text[i][len]='\0'; | |
419 ++i; | |
420 } else { | |
421 break; | |
422 } | |
423 } | |
424 current->lines=i; | |
425 } | |
426 return current; | |
427 } | |
428 | |
429 | |
19066
26a30496ec96
marks several function without a prototype which arent used outside its sourcefile as static, Patch by Stefan Huehner - stefan AT huehner-org
reynaldo
parents:
18980
diff
changeset
|
430 static subtitle *sub_read_line_vplayer(stream_t *st,subtitle *current) { |
2912 | 431 char line[LINE_LEN+1]; |
4064
3c747168eb6e
1. subs know are readed after reading AVI header so we already know fps
atlka
parents:
4052
diff
changeset
|
432 int a1,a2,a3; |
3735 | 433 char *p=NULL, *next,separator; |
4064
3c747168eb6e
1. subs know are readed after reading AVI header so we already know fps
atlka
parents:
4052
diff
changeset
|
434 int i,len,plen; |
818 | 435 |
436 while (!current->text[0]) { | |
17879 | 437 if (!stream_read_line (st, line, LINE_LEN)) return NULL; |
3724
a2325883c46c
vplayer format - no longer crashes on slightly broken subs.
eyck
parents:
3701
diff
changeset
|
438 if ((len=sscanf (line, "%d:%d:%d%c%n",&a1,&a2,&a3,&separator,&plen)) < 4) |
818 | 439 continue; |
4064
3c747168eb6e
1. subs know are readed after reading AVI header so we already know fps
atlka
parents:
4052
diff
changeset
|
440 |
3c747168eb6e
1. subs know are readed after reading AVI header so we already know fps
atlka
parents:
4052
diff
changeset
|
441 if (!(current->start = a1*360000+a2*6000+a3*100)) |
818 | 442 continue; |
5363
1f068f4bb6e7
vplayer sub fix by Arkadiusz Podgorski <wodzu@softomat.com.pl>
arpi
parents:
4886
diff
changeset
|
443 /* removed by wodzu |
4064
3c747168eb6e
1. subs know are readed after reading AVI header so we already know fps
atlka
parents:
4052
diff
changeset
|
444 p=line; |
1640
cbedcfab877b
Fixup to vplayer subtitle submitted to sourceforge by Igor Wojnicki
eyck
parents:
1501
diff
changeset
|
445 // finds the body of the subtitle |
cbedcfab877b
Fixup to vplayer subtitle submitted to sourceforge by Igor Wojnicki
eyck
parents:
1501
diff
changeset
|
446 for (i=0; i<3; i++){ |
3433 | 447 p=strchr(p,':'); |
448 if (p==NULL) break; | |
449 ++p; | |
450 } | |
451 if (p==NULL) { | |
452 printf("SUB: Skipping incorrect subtitle line!\n"); | |
453 continue; | |
454 } | |
5363
1f068f4bb6e7
vplayer sub fix by Arkadiusz Podgorski <wodzu@softomat.com.pl>
arpi
parents:
4886
diff
changeset
|
455 */ |
1f068f4bb6e7
vplayer sub fix by Arkadiusz Podgorski <wodzu@softomat.com.pl>
arpi
parents:
4886
diff
changeset
|
456 // by wodzu: hey! this time we know what length it has! what is |
1f068f4bb6e7
vplayer sub fix by Arkadiusz Podgorski <wodzu@softomat.com.pl>
arpi
parents:
4886
diff
changeset
|
457 // that magic for? it can't deal with space instead of third |
1f068f4bb6e7
vplayer sub fix by Arkadiusz Podgorski <wodzu@softomat.com.pl>
arpi
parents:
4886
diff
changeset
|
458 // colon! look, what simple it can be: |
1f068f4bb6e7
vplayer sub fix by Arkadiusz Podgorski <wodzu@softomat.com.pl>
arpi
parents:
4886
diff
changeset
|
459 p = &line[ plen ]; |
4064
3c747168eb6e
1. subs know are readed after reading AVI header so we already know fps
atlka
parents:
4052
diff
changeset
|
460 |
1640
cbedcfab877b
Fixup to vplayer subtitle submitted to sourceforge by Igor Wojnicki
eyck
parents:
1501
diff
changeset
|
461 i=0; |
818 | 462 if (*p!='|') { |
463 // | |
464 next = p,i=0; | |
465 while ((next =sub_readtext (next, &(current->text[i])))) { | |
466 if (current->text[i]==ERR) {return ERR;} | |
467 i++; | |
6296 | 468 if (i>=SUB_MAX_TEXT) { mp_msg(MSGT_SUBREADER,MSGL_WARN,"Too many lines in a subtitle\n");current->lines=i;return current;} |
818 | 469 } |
470 current->lines=i+1; | |
471 } | |
472 } | |
473 return current; | |
474 } | |
475 | |
19066
26a30496ec96
marks several function without a prototype which arent used outside its sourcefile as static, Patch by Stefan Huehner - stefan AT huehner-org
reynaldo
parents:
18980
diff
changeset
|
476 static subtitle *sub_read_line_rt(stream_t *st,subtitle *current) { |
850 | 477 //TODO: This format uses quite rich (sub/super)set of xhtml |
478 // I couldn't check it since DTD is not included. | |
479 // WARNING: full XML parses can be required for proper parsing | |
2912 | 480 char line[LINE_LEN+1]; |
850 | 481 int a1,a2,a3,a4,b1,b2,b3,b4; |
482 char *p=NULL,*next=NULL; | |
483 int i,len,plen; | |
484 | |
485 while (!current->text[0]) { | |
17879 | 486 if (!stream_read_line (st, line, LINE_LEN)) return NULL; |
850 | 487 //TODO: it seems that format of time is not easily determined, it may be 1:12, 1:12.0 or 0:1:12.0 |
488 //to describe the same moment in time. Maybe there are even more formats in use. | |
489 //if ((len=sscanf (line, "<Time Begin=\"%d:%d:%d.%d\" End=\"%d:%d:%d.%d\"",&a1,&a2,&a3,&a4,&b1,&b2,&b3,&b4)) < 8) | |
490 plen=a1=a2=a3=a4=b1=b2=b3=b4=0; | |
491 if ( | |
9322 | 492 ((len=sscanf (line, "<%*[tT]ime %*[bB]egin=\"%d.%d\" %*[Ee]nd=\"%d.%d\"%*[^<]<clear/>%n",&a3,&a4,&b3,&b4,&plen)) < 4) && |
493 ((len=sscanf (line, "<%*[tT]ime %*[bB]egin=\"%d.%d\" %*[Ee]nd=\"%d:%d.%d\"%*[^<]<clear/>%n",&a3,&a4,&b2,&b3,&b4,&plen)) < 5) && | |
850 | 494 ((len=sscanf (line, "<%*[tT]ime %*[bB]egin=\"%d:%d\" %*[Ee]nd=\"%d:%d\"%*[^<]<clear/>%n",&a2,&a3,&b2,&b3,&plen)) < 4) && |
495 ((len=sscanf (line, "<%*[tT]ime %*[bB]egin=\"%d:%d\" %*[Ee]nd=\"%d:%d.%d\"%*[^<]<clear/>%n",&a2,&a3,&b2,&b3,&b4,&plen)) < 5) && | |
496 // ((len=sscanf (line, "<%*[tT]ime %*[bB]egin=\"%d:%d.%d\" %*[Ee]nd=\"%d:%d\"%*[^<]<clear/>%n",&a2,&a3,&a4,&b2,&b3,&plen)) < 5) && | |
497 ((len=sscanf (line, "<%*[tT]ime %*[bB]egin=\"%d:%d.%d\" %*[Ee]nd=\"%d:%d.%d\"%*[^<]<clear/>%n",&a2,&a3,&a4,&b2,&b3,&b4,&plen)) < 6) && | |
9322 | 498 ((len=sscanf (line, "<%*[tT]ime %*[bB]egin=\"%d:%d:%d.%d\" %*[Ee]nd=\"%d:%d:%d.%d\"%*[^<]<clear/>%n",&a1,&a2,&a3,&a4,&b1,&b2,&b3,&b4,&plen)) < 8) && |
499 //now try it without end time | |
500 ((len=sscanf (line, "<%*[tT]ime %*[bB]egin=\"%d.%d\"%*[^<]<clear/>%n",&a3,&a4,&plen)) < 2) && | |
501 ((len=sscanf (line, "<%*[tT]ime %*[bB]egin=\"%d:%d\"%*[^<]<clear/>%n",&a2,&a3,&plen)) < 2) && | |
502 ((len=sscanf (line, "<%*[tT]ime %*[bB]egin=\"%d:%d.%d\"%*[^<]<clear/>%n",&a2,&a3,&a4,&plen)) < 3) && | |
503 ((len=sscanf (line, "<%*[tT]ime %*[bB]egin=\"%d:%d:%d.%d\"%*[^<]<clear/>%n",&a1,&a2,&a3,&a4,&plen)) < 4) | |
850 | 504 ) |
505 continue; | |
506 current->start = a1*360000+a2*6000+a3*100+a4/10; | |
507 current->end = b1*360000+b2*6000+b3*100+b4/10; | |
9322 | 508 if (b1 == 0 && b2 == 0 && b3 == 0 && b4 == 0) |
509 current->end = current->start+200; | |
850 | 510 p=line; p+=plen;i=0; |
511 // TODO: I don't know what kind of convention is here for marking multiline subs, maybe <br/> like in xml? | |
6242
9c8c3b5e6658
possible sig11 fixed in .rt parser (weisskreuzova.zip)
arpi
parents:
6208
diff
changeset
|
512 next = strstr(line,"<clear/>"); |
9c8c3b5e6658
possible sig11 fixed in .rt parser (weisskreuzova.zip)
arpi
parents:
6208
diff
changeset
|
513 if(next && strlen(next)>8){ |
9c8c3b5e6658
possible sig11 fixed in .rt parser (weisskreuzova.zip)
arpi
parents:
6208
diff
changeset
|
514 next+=8;i=0; |
9c8c3b5e6658
possible sig11 fixed in .rt parser (weisskreuzova.zip)
arpi
parents:
6208
diff
changeset
|
515 while ((next =sub_readtext (next, &(current->text[i])))) { |
850 | 516 if (current->text[i]==ERR) {return ERR;} |
517 i++; | |
6296 | 518 if (i>=SUB_MAX_TEXT) { mp_msg(MSGT_SUBREADER,MSGL_WARN,"Too many lines in a subtitle\n");current->lines=i;return current;} |
6242
9c8c3b5e6658
possible sig11 fixed in .rt parser (weisskreuzova.zip)
arpi
parents:
6208
diff
changeset
|
519 } |
850 | 520 } |
521 current->lines=i+1; | |
522 } | |
523 return current; | |
524 } | |
525 | |
19066
26a30496ec96
marks several function without a prototype which arent used outside its sourcefile as static, Patch by Stefan Huehner - stefan AT huehner-org
reynaldo
parents:
18980
diff
changeset
|
526 static subtitle *sub_read_line_ssa(stream_t *st,subtitle *current) { |
6597 | 527 /* |
528 * Sub Station Alpha v4 (and v2?) scripts have 9 commas before subtitle | |
529 * other Sub Station Alpha scripts have only 8 commas before subtitle | |
530 * Reading the "ScriptType:" field is not reliable since many scripts appear | |
531 * w/o it | |
532 * | |
533 * http://www.scriptclub.org is a good place to find more examples | |
534 * http://www.eswat.demon.co.uk is where the SSA specs can be found | |
535 */ | |
536 int comma; | |
537 static int max_comma = 32; /* let's use 32 for the case that the */ | |
538 /* amount of commas increase with newer SSA versions */ | |
539 | |
921 | 540 int hour1, min1, sec1, hunsec1, |
541 hour2, min2, sec2, hunsec2, nothing; | |
2141 | 542 int num; |
921 | 543 |
2912 | 544 char line[LINE_LEN+1], |
545 line3[LINE_LEN+1], | |
9009
f2d4324561b2
1) Removed the code to remove {} from sub_read_line_ssa
arpi
parents:
8940
diff
changeset
|
546 *line2; |
2141 | 547 char *tmp; |
548 | |
921 | 549 do { |
17879 | 550 if (!stream_read_line (st, line, LINE_LEN)) return NULL; |
921 | 551 } while (sscanf (line, "Dialogue: Marked=%d,%d:%d:%d.%d,%d:%d:%d.%d," |
2140 | 552 "%[^\n\r]", ¬hing, |
553 &hour1, &min1, &sec1, &hunsec1, | |
554 &hour2, &min2, &sec2, &hunsec2, | |
10450 | 555 line3) < 9 |
556 && | |
557 sscanf (line, "Dialogue: %d,%d:%d:%d.%d,%d:%d:%d.%d," | |
558 "%[^\n\r]", ¬hing, | |
559 &hour1, &min1, &sec1, &hunsec1, | |
560 &hour2, &min2, &sec2, &hunsec2, | |
561 line3) < 9 ); | |
6597 | 562 |
563 line2=strchr(line3, ','); | |
564 | |
565 for (comma = 4; comma < max_comma; comma ++) | |
566 { | |
567 tmp = line2; | |
568 if(!(tmp=strchr(++tmp, ','))) break; | |
569 if(*(++tmp) == ' ') break; | |
570 /* a space after a comma means we're already in a sentence */ | |
571 line2 = tmp; | |
572 } | |
573 | |
574 if(comma < max_comma)max_comma = comma; | |
8602
36d5c7137876
Attached is a small patch to fix a couple of problems I found when using
arpi
parents:
8363
diff
changeset
|
575 /* eliminate the trailing comma */ |
36d5c7137876
Attached is a small patch to fix a couple of problems I found when using
arpi
parents:
8363
diff
changeset
|
576 if(*line2 == ',') line2++; |
2140 | 577 |
6247
0b8660d79efe
sub_read_line_ssa sig11 fix by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
arpi
parents:
6242
diff
changeset
|
578 current->lines=0;num=0; |
921 | 579 current->start = 360000*hour1 + 6000*min1 + 100*sec1 + hunsec1; |
580 current->end = 360000*hour2 + 6000*min2 + 100*sec2 + hunsec2; | |
2141 | 581 |
5990
e5b3385775b3
accept \N too, patch by Reinder <r.cuperus@student.utwente.nl>
arpi
parents:
5828
diff
changeset
|
582 while (((tmp=strstr(line2, "\\n")) != NULL) || ((tmp=strstr(line2, "\\N")) != NULL) ){ |
18869 | 583 current->text[num]=malloc(tmp-line2+1); |
2141 | 584 strncpy (current->text[num], line2, tmp-line2); |
585 current->text[num][tmp-line2]='\0'; | |
586 line2=tmp+2; | |
587 num++; | |
588 current->lines++; | |
589 if (current->lines >= SUB_MAX_TEXT) return current; | |
590 } | |
591 | |
3701 | 592 current->text[num]=strdup(line2); |
6247
0b8660d79efe
sub_read_line_ssa sig11 fix by Jindrich Makovicka <makovick@kmlinux.fjfi.cvut.cz>
arpi
parents:
6242
diff
changeset
|
593 current->lines++; |
818 | 594 |
921 | 595 return current; |
596 } | |
258 | 597 |
19066
26a30496ec96
marks several function without a prototype which arent used outside its sourcefile as static, Patch by Stefan Huehner - stefan AT huehner-org
reynaldo
parents:
18980
diff
changeset
|
598 static void sub_pp_ssa(subtitle *sub) { |
9009
f2d4324561b2
1) Removed the code to remove {} from sub_read_line_ssa
arpi
parents:
8940
diff
changeset
|
599 int l=sub->lines; |
f2d4324561b2
1) Removed the code to remove {} from sub_read_line_ssa
arpi
parents:
8940
diff
changeset
|
600 char *so,*de,*start; |
f2d4324561b2
1) Removed the code to remove {} from sub_read_line_ssa
arpi
parents:
8940
diff
changeset
|
601 |
f2d4324561b2
1) Removed the code to remove {} from sub_read_line_ssa
arpi
parents:
8940
diff
changeset
|
602 while (l){ |
f2d4324561b2
1) Removed the code to remove {} from sub_read_line_ssa
arpi
parents:
8940
diff
changeset
|
603 /* eliminate any text enclosed with {}, they are font and color settings */ |
f2d4324561b2
1) Removed the code to remove {} from sub_read_line_ssa
arpi
parents:
8940
diff
changeset
|
604 so=de=sub->text[--l]; |
f2d4324561b2
1) Removed the code to remove {} from sub_read_line_ssa
arpi
parents:
8940
diff
changeset
|
605 while (*so) { |
f2d4324561b2
1) Removed the code to remove {} from sub_read_line_ssa
arpi
parents:
8940
diff
changeset
|
606 if(*so == '{' && so[1]=='\\') { |
f2d4324561b2
1) Removed the code to remove {} from sub_read_line_ssa
arpi
parents:
8940
diff
changeset
|
607 for (start=so; *so && *so!='}'; so++); |
f2d4324561b2
1) Removed the code to remove {} from sub_read_line_ssa
arpi
parents:
8940
diff
changeset
|
608 if(*so) so++; else so=start; |
f2d4324561b2
1) Removed the code to remove {} from sub_read_line_ssa
arpi
parents:
8940
diff
changeset
|
609 } |
f2d4324561b2
1) Removed the code to remove {} from sub_read_line_ssa
arpi
parents:
8940
diff
changeset
|
610 if(*so) { |
f2d4324561b2
1) Removed the code to remove {} from sub_read_line_ssa
arpi
parents:
8940
diff
changeset
|
611 *de=*so; |
f2d4324561b2
1) Removed the code to remove {} from sub_read_line_ssa
arpi
parents:
8940
diff
changeset
|
612 so++; de++; |
f2d4324561b2
1) Removed the code to remove {} from sub_read_line_ssa
arpi
parents:
8940
diff
changeset
|
613 } |
f2d4324561b2
1) Removed the code to remove {} from sub_read_line_ssa
arpi
parents:
8940
diff
changeset
|
614 } |
f2d4324561b2
1) Removed the code to remove {} from sub_read_line_ssa
arpi
parents:
8940
diff
changeset
|
615 *de=*so; |
f2d4324561b2
1) Removed the code to remove {} from sub_read_line_ssa
arpi
parents:
8940
diff
changeset
|
616 } |
f2d4324561b2
1) Removed the code to remove {} from sub_read_line_ssa
arpi
parents:
8940
diff
changeset
|
617 } |
f2d4324561b2
1) Removed the code to remove {} from sub_read_line_ssa
arpi
parents:
8940
diff
changeset
|
618 |
11873 | 619 /* |
620 * PJS subtitles reader. | |
621 * That's the "Phoenix Japanimation Society" format. | |
622 * I found some of them in http://www.scriptsclub.org/ (used for anime). | |
623 * The time is in tenths of second. | |
624 * | |
625 * by set, based on code by szabi (dunnowhat sub format ;-) | |
626 */ | |
19066
26a30496ec96
marks several function without a prototype which arent used outside its sourcefile as static, Patch by Stefan Huehner - stefan AT huehner-org
reynaldo
parents:
18980
diff
changeset
|
627 static subtitle *sub_read_line_pjs(stream_t *st,subtitle *current) { |
2912 | 628 char line[LINE_LEN+1]; |
11873 | 629 char text[LINE_LEN+1], *s, *d; |
1081 | 630 |
17879 | 631 if (!stream_read_line (st, line, LINE_LEN)) |
1081 | 632 return NULL; |
11873 | 633 /* skip spaces */ |
634 for (s=line; *s && isspace(*s); s++); | |
635 /* allow empty lines at the end of the file */ | |
636 if (*s==0) | |
637 return NULL; | |
638 /* get the time */ | |
639 if (sscanf (s, "%ld,%ld,", &(current->start), | |
640 &(current->end)) <2) { | |
1081 | 641 return ERR; |
11873 | 642 } |
643 /* the files I have are in tenths of second */ | |
644 current->start *= 10; | |
645 current->end *= 10; | |
646 /* walk to the beggining of the string */ | |
647 for (; *s; s++) if (*s==',') break; | |
648 if (*s) { | |
649 for (s++; *s; s++) if (*s==',') break; | |
650 if (*s) s++; | |
651 } | |
652 if (*s!='"') { | |
653 return ERR; | |
654 } | |
655 /* copy the string to the text buffer */ | |
656 for (s++, d=text; *s && *s!='"'; s++, d++) | |
657 *d=*s; | |
658 *d=0; | |
1081 | 659 current->text[0] = strdup(text); |
660 current->lines = 1; | |
661 | |
662 return current; | |
663 } | |
664 | |
19066
26a30496ec96
marks several function without a prototype which arent used outside its sourcefile as static, Patch by Stefan Huehner - stefan AT huehner-org
reynaldo
parents:
18980
diff
changeset
|
665 static subtitle *sub_read_line_mpsub(stream_t *st, subtitle *current) { |
2912 | 666 char line[LINE_LEN+1]; |
2178 | 667 float a,b; |
668 int num=0; | |
2177 | 669 char *p, *q; |
670 | |
671 do | |
672 { | |
17879 | 673 if (!stream_read_line(st, line, LINE_LEN)) return NULL; |
2178 | 674 } while (sscanf (line, "%f %f", &a, &b) !=2); |
2177 | 675 |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
676 mpsub_position += a*mpsub_multiplier; |
2178 | 677 current->start=(int) mpsub_position; |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
678 mpsub_position += b*mpsub_multiplier; |
2178 | 679 current->end=(int) mpsub_position; |
2177 | 680 |
681 while (num < SUB_MAX_TEXT) { | |
17879 | 682 if (!stream_read_line (st, line, LINE_LEN)) { |
4098 | 683 if (num == 0) return NULL; |
684 else return current; | |
685 } | |
2177 | 686 p=line; |
687 while (isspace(*p)) p++; | |
688 if (eol(*p) && num > 0) return current; | |
689 if (eol(*p)) return NULL; | |
690 | |
691 for (q=p; !eol(*q); q++); | |
692 *q='\0'; | |
693 if (strlen(p)) { | |
694 current->text[num]=strdup(p); | |
4098 | 695 // printf (">%s<\n",p); |
2177 | 696 current->lines = ++num; |
697 } else { | |
698 if (num) return current; | |
699 else return NULL; | |
700 } | |
701 } | |
3735 | 702 return NULL; // we should have returned before if it's OK |
2177 | 703 } |
704 | |
8362
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
705 #ifndef USE_SORTSUB |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
706 //we don't need this if we use previous_sub_end |
2343 | 707 subtitle *previous_aqt_sub = NULL; |
8362
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
708 #endif |
2343 | 709 |
19066
26a30496ec96
marks several function without a prototype which arent used outside its sourcefile as static, Patch by Stefan Huehner - stefan AT huehner-org
reynaldo
parents:
18980
diff
changeset
|
710 static subtitle *sub_read_line_aqt(stream_t *st,subtitle *current) { |
2912 | 711 char line[LINE_LEN+1]; |
6076
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
712 char *next; |
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
713 int i; |
2343 | 714 |
715 while (1) { | |
716 // try to locate next subtitle | |
17879 | 717 if (!stream_read_line (st, line, LINE_LEN)) |
2343 | 718 return NULL; |
719 if (!(sscanf (line, "-->> %ld", &(current->start)) <1)) | |
720 break; | |
721 } | |
722 | |
8362
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
723 #ifdef USE_SORTSUB |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
724 previous_sub_end = (current->start) ? current->start - 1 : 0; |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
725 #else |
2343 | 726 if (previous_aqt_sub != NULL) |
727 previous_aqt_sub->end = current->start-1; | |
728 | |
729 previous_aqt_sub = current; | |
8362
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
730 #endif |
2343 | 731 |
17879 | 732 if (!stream_read_line (st, line, LINE_LEN)) |
2343 | 733 return NULL; |
734 | |
2468 | 735 sub_readtext((char *) &line,¤t->text[0]); |
2343 | 736 current->lines = 1; |
737 current->end = current->start; // will be corrected by next subtitle | |
738 | |
17879 | 739 if (!stream_read_line (st, line, LINE_LEN)) |
8862
356534b9e7d4
Since version 2.7 the file extension for JACOsub changed from
arpi
parents:
8789
diff
changeset
|
740 return current; |
2343 | 741 |
6076
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
742 next = line,i=1; |
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
743 while ((next =sub_readtext (next, &(current->text[i])))) { |
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
744 if (current->text[i]==ERR) {return ERR;} |
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
745 i++; |
6296 | 746 if (i>=SUB_MAX_TEXT) { mp_msg(MSGT_SUBREADER,MSGL_WARN,"Too many lines in a subtitle\n");current->lines=i;return current;} |
6076
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
747 } |
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
748 current->lines=i+1; |
2343 | 749 |
22256
3a30fc845a9c
10l: comparison of char* ptrs with string literals
faust3
parents:
22141
diff
changeset
|
750 if (!strlen(current->text[0]) && !strlen(current->text[1])) { |
8362
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
751 #ifdef USE_SORTSUB |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
752 previous_sub_end = 0; |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
753 #else |
2343 | 754 // void subtitle -> end of previous marked and exit |
755 previous_aqt_sub = NULL; | |
8362
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
756 #endif |
2343 | 757 return NULL; |
758 } | |
759 | |
760 return current; | |
761 } | |
2177 | 762 |
8362
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
763 #ifndef USE_SORTSUB |
6076
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
764 subtitle *previous_subrip09_sub = NULL; |
8362
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
765 #endif |
6076
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
766 |
19066
26a30496ec96
marks several function without a prototype which arent used outside its sourcefile as static, Patch by Stefan Huehner - stefan AT huehner-org
reynaldo
parents:
18980
diff
changeset
|
767 static subtitle *sub_read_line_subrip09(stream_t *st,subtitle *current) { |
6076
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
768 char line[LINE_LEN+1]; |
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
769 int a1,a2,a3; |
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
770 char * next=NULL; |
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
771 int i,len; |
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
772 |
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
773 while (1) { |
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
774 // try to locate next subtitle |
17879 | 775 if (!stream_read_line (st, line, LINE_LEN)) |
6076
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
776 return NULL; |
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
777 if (!((len=sscanf (line, "[%d:%d:%d]",&a1,&a2,&a3)) < 3)) |
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
778 break; |
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
779 } |
8362
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
780 |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
781 current->start = a1*360000+a2*6000+a3*100; |
6076
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
782 |
8362
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
783 #ifdef USE_SORTSUB |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
784 previous_sub_end = (current->start) ? current->start - 1 : 0; |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
785 #else |
6076
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
786 if (previous_subrip09_sub != NULL) |
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
787 previous_subrip09_sub->end = current->start-1; |
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
788 |
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
789 previous_subrip09_sub = current; |
8362
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
790 #endif |
6076
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
791 |
17879 | 792 if (!stream_read_line (st, line, LINE_LEN)) |
6076
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
793 return NULL; |
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
794 |
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
795 next = line,i=0; |
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
796 |
7472
c4434bdf6e51
tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents:
7460
diff
changeset
|
797 current->text[0]=""; // just to be sure that string is clear |
6076
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
798 |
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
799 while ((next =sub_readtext (next, &(current->text[i])))) { |
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
800 if (current->text[i]==ERR) {return ERR;} |
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
801 i++; |
6296 | 802 if (i>=SUB_MAX_TEXT) { mp_msg(MSGT_SUBREADER,MSGL_WARN,"Too many lines in a subtitle\n");current->lines=i;return current;} |
6076
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
803 } |
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
804 current->lines=i+1; |
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
805 |
22256
3a30fc845a9c
10l: comparison of char* ptrs with string literals
faust3
parents:
22141
diff
changeset
|
806 if (!strlen(current->text[0]) && (i==0)) { |
8362
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
807 #ifdef USE_SORTSUB |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
808 previous_sub_end = 0; |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
809 #else |
6076
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
810 // void subtitle -> end of previous marked and exit |
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
811 previous_subrip09_sub = NULL; |
8362
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
812 #endif |
6076
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
813 return NULL; |
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
814 } |
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
815 |
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
816 return current; |
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
817 } |
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
818 |
19066
26a30496ec96
marks several function without a prototype which arent used outside its sourcefile as static, Patch by Stefan Huehner - stefan AT huehner-org
reynaldo
parents:
18980
diff
changeset
|
819 static subtitle *sub_read_line_jacosub(stream_t* st, subtitle * current) |
7982
eac680483e6c
JACOSub is another subtitling format, whose specifications are at:
arpi
parents:
7775
diff
changeset
|
820 { |
8207
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
821 char line1[LINE_LEN], line2[LINE_LEN], directive[LINE_LEN], *p, *q; |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
822 unsigned a1, a2, a3, a4, b1, b2, b3, b4, comment = 0; |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
823 static unsigned jacoTimeres = 30; |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
824 static int jacoShift = 0; |
7982
eac680483e6c
JACOSub is another subtitling format, whose specifications are at:
arpi
parents:
7775
diff
changeset
|
825 |
14642
38572280e8e7
bzero is deprecated patch by Gianluigi Tiesi <mplayer at netfarm.it>
faust3
parents:
13680
diff
changeset
|
826 memset(current, 0, sizeof(subtitle)); |
38572280e8e7
bzero is deprecated patch by Gianluigi Tiesi <mplayer at netfarm.it>
faust3
parents:
13680
diff
changeset
|
827 memset(line1, 0, LINE_LEN); |
38572280e8e7
bzero is deprecated patch by Gianluigi Tiesi <mplayer at netfarm.it>
faust3
parents:
13680
diff
changeset
|
828 memset(line2, 0, LINE_LEN); |
38572280e8e7
bzero is deprecated patch by Gianluigi Tiesi <mplayer at netfarm.it>
faust3
parents:
13680
diff
changeset
|
829 memset(directive, 0, LINE_LEN); |
7982
eac680483e6c
JACOSub is another subtitling format, whose specifications are at:
arpi
parents:
7775
diff
changeset
|
830 while (!current->text[0]) { |
17879 | 831 if (!stream_read_line(st, line1, LINE_LEN)) { |
7982
eac680483e6c
JACOSub is another subtitling format, whose specifications are at:
arpi
parents:
7775
diff
changeset
|
832 return NULL; |
8207
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
833 } |
7982
eac680483e6c
JACOSub is another subtitling format, whose specifications are at:
arpi
parents:
7775
diff
changeset
|
834 if (sscanf |
8207
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
835 (line1, "%u:%u:%u.%u %u:%u:%u.%u %[^\n\r]", &a1, &a2, &a3, &a4, |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
836 &b1, &b2, &b3, &b4, line2) < 9) { |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
837 if (sscanf(line1, "@%u @%u %[^\n\r]", &a4, &b4, line2) < 3) { |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
838 if (line1[0] == '#') { |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
839 int hours = 0, minutes = 0, seconds, delta, inverter = |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
840 1; |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
841 unsigned units = jacoShift; |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
842 switch (toupper(line1[1])) { |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
843 case 'S': |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
844 if (isalpha(line1[2])) { |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
845 delta = 6; |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
846 } else { |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
847 delta = 2; |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
848 } |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
849 if (sscanf(&line1[delta], "%d", &hours)) { |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
850 if (hours < 0) { |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
851 hours *= -1; |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
852 inverter = -1; |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
853 } |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
854 if (sscanf(&line1[delta], "%*d:%d", &minutes)) { |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
855 if (sscanf |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
856 (&line1[delta], "%*d:%*d:%d", |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
857 &seconds)) { |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
858 sscanf(&line1[delta], "%*d:%*d:%*d.%d", |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
859 &units); |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
860 } else { |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
861 hours = 0; |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
862 sscanf(&line1[delta], "%d:%d.%d", |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
863 &minutes, &seconds, &units); |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
864 minutes *= inverter; |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
865 } |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
866 } else { |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
867 hours = minutes = 0; |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
868 sscanf(&line1[delta], "%d.%d", &seconds, |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
869 &units); |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
870 seconds *= inverter; |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
871 } |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
872 jacoShift = |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
873 ((hours * 3600 + minutes * 60 + |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
874 seconds) * jacoTimeres + |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
875 units) * inverter; |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
876 } |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
877 break; |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
878 case 'T': |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
879 if (isalpha(line1[2])) { |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
880 delta = 8; |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
881 } else { |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
882 delta = 2; |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
883 } |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
884 sscanf(&line1[delta], "%u", &jacoTimeres); |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
885 break; |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
886 } |
7982
eac680483e6c
JACOSub is another subtitling format, whose specifications are at:
arpi
parents:
7775
diff
changeset
|
887 } |
8207
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
888 continue; |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
889 } else { |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
890 current->start = |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
891 (unsigned long) ((a4 + jacoShift) * 100.0 / |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
892 jacoTimeres); |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
893 current->end = |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
894 (unsigned long) ((b4 + jacoShift) * 100.0 / |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
895 jacoTimeres); |
7982
eac680483e6c
JACOSub is another subtitling format, whose specifications are at:
arpi
parents:
7775
diff
changeset
|
896 } |
8207
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
897 } else { |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
898 current->start = |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
899 (unsigned |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
900 long) (((a1 * 3600 + a2 * 60 + a3) * jacoTimeres + a4 + |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
901 jacoShift) * 100.0 / jacoTimeres); |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
902 current->end = |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
903 (unsigned |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
904 long) (((b1 * 3600 + b2 * 60 + b3) * jacoTimeres + b4 + |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
905 jacoShift) * 100.0 / jacoTimeres); |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
906 } |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
907 current->lines = 0; |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
908 p = line2; |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
909 while ((*p == ' ') || (*p == '\t')) { |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
910 ++p; |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
911 } |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
912 if (isalpha(*p)||*p == '[') { |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
913 int cont, jLength; |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
914 |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
915 if (sscanf(p, "%s %[^\n\r]", directive, line1) < 2) |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
916 return (subtitle *) ERR; |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
917 jLength = strlen(directive); |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
918 for (cont = 0; cont < jLength; ++cont) { |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
919 if (isalpha(*(directive + cont))) |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
920 *(directive + cont) = toupper(*(directive + cont)); |
7982
eac680483e6c
JACOSub is another subtitling format, whose specifications are at:
arpi
parents:
7775
diff
changeset
|
921 } |
8207
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
922 if ((strstr(directive, "RDB") != NULL) |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
923 || (strstr(directive, "RDC") != NULL) |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
924 || (strstr(directive, "RLB") != NULL) |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
925 || (strstr(directive, "RLG") != NULL)) { |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
926 continue; |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
927 } |
10916
c36db88bfbc4
Subtitle alignment & smart splitting by Salvatore Falco
henry
parents:
10801
diff
changeset
|
928 if (strstr(directive, "JL") != NULL) { |
13343
1a4b6e575484
This time is a patch to improve subtitle alignment management. It
faust3
parents:
13229
diff
changeset
|
929 current->alignment = SUB_ALIGNMENT_BOTTOMLEFT; |
10916
c36db88bfbc4
Subtitle alignment & smart splitting by Salvatore Falco
henry
parents:
10801
diff
changeset
|
930 } else if (strstr(directive, "JR") != NULL) { |
13343
1a4b6e575484
This time is a patch to improve subtitle alignment management. It
faust3
parents:
13229
diff
changeset
|
931 current->alignment = SUB_ALIGNMENT_BOTTOMRIGHT; |
10916
c36db88bfbc4
Subtitle alignment & smart splitting by Salvatore Falco
henry
parents:
10801
diff
changeset
|
932 } else { |
13343
1a4b6e575484
This time is a patch to improve subtitle alignment management. It
faust3
parents:
13229
diff
changeset
|
933 current->alignment = SUB_ALIGNMENT_BOTTOMCENTER; |
10916
c36db88bfbc4
Subtitle alignment & smart splitting by Salvatore Falco
henry
parents:
10801
diff
changeset
|
934 } |
8207
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
935 strcpy(line2, line1); |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
936 p = line2; |
7982
eac680483e6c
JACOSub is another subtitling format, whose specifications are at:
arpi
parents:
7775
diff
changeset
|
937 } |
10916
c36db88bfbc4
Subtitle alignment & smart splitting by Salvatore Falco
henry
parents:
10801
diff
changeset
|
938 for (q = line1; (!eol(*p)) && (current->lines < SUB_MAX_TEXT); ++p) { |
7982
eac680483e6c
JACOSub is another subtitling format, whose specifications are at:
arpi
parents:
7775
diff
changeset
|
939 switch (*p) { |
eac680483e6c
JACOSub is another subtitling format, whose specifications are at:
arpi
parents:
7775
diff
changeset
|
940 case '{': |
eac680483e6c
JACOSub is another subtitling format, whose specifications are at:
arpi
parents:
7775
diff
changeset
|
941 comment++; |
eac680483e6c
JACOSub is another subtitling format, whose specifications are at:
arpi
parents:
7775
diff
changeset
|
942 break; |
eac680483e6c
JACOSub is another subtitling format, whose specifications are at:
arpi
parents:
7775
diff
changeset
|
943 case '}': |
8207
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
944 if (comment) { |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
945 --comment; |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
946 //the next line to get rid of a blank after the comment |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
947 if ((*(p + 1)) == ' ') |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
948 p++; |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
949 } |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
950 break; |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
951 case '~': |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
952 if (!comment) { |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
953 *q = ' '; |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
954 ++q; |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
955 } |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
956 break; |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
957 case ' ': |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
958 case '\t': |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
959 if ((*(p + 1) == ' ') || (*(p + 1) == '\t')) |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
960 break; |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
961 if (!comment) { |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
962 *q = ' '; |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
963 ++q; |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
964 } |
7982
eac680483e6c
JACOSub is another subtitling format, whose specifications are at:
arpi
parents:
7775
diff
changeset
|
965 break; |
eac680483e6c
JACOSub is another subtitling format, whose specifications are at:
arpi
parents:
7775
diff
changeset
|
966 case '\\': |
eac680483e6c
JACOSub is another subtitling format, whose specifications are at:
arpi
parents:
7775
diff
changeset
|
967 if (*(p + 1) == 'n') { |
eac680483e6c
JACOSub is another subtitling format, whose specifications are at:
arpi
parents:
7775
diff
changeset
|
968 *q = '\0'; |
8207
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
969 q = line1; |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
970 current->text[current->lines++] = strdup(line1); |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
971 ++p; |
7982
eac680483e6c
JACOSub is another subtitling format, whose specifications are at:
arpi
parents:
7775
diff
changeset
|
972 break; |
8207
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
973 } |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
974 if ((toupper(*(p + 1)) == 'C') |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
975 || (toupper(*(p + 1)) == 'F')) { |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
976 ++p,++p; |
7982
eac680483e6c
JACOSub is another subtitling format, whose specifications are at:
arpi
parents:
7775
diff
changeset
|
977 break; |
8207
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
978 } |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
979 if ((*(p + 1) == 'B') || (*(p + 1) == 'b') || (*(p + 1) == 'D') || //actually this means "insert current date here" |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
980 (*(p + 1) == 'I') || (*(p + 1) == 'i') || (*(p + 1) == 'N') || (*(p + 1) == 'T') || //actually this means "insert current time here" |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
981 (*(p + 1) == 'U') || (*(p + 1) == 'u')) { |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
982 ++p; |
7982
eac680483e6c
JACOSub is another subtitling format, whose specifications are at:
arpi
parents:
7775
diff
changeset
|
983 break; |
8207
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
984 } |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
985 if ((*(p + 1) == '\\') || |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
986 (*(p + 1) == '~') || (*(p + 1) == '{')) { |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
987 ++p; |
7982
eac680483e6c
JACOSub is another subtitling format, whose specifications are at:
arpi
parents:
7775
diff
changeset
|
988 } else if (eol(*(p + 1))) { |
17879 | 989 if (!stream_read_line(st, directive, LINE_LEN)) |
7982
eac680483e6c
JACOSub is another subtitling format, whose specifications are at:
arpi
parents:
7775
diff
changeset
|
990 return NULL; |
8207
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
991 trail_space(directive); |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
992 strncat(line2, directive, |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
993 (LINE_LEN > 511) ? LINE_LEN : 511); |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
994 break; |
7982
eac680483e6c
JACOSub is another subtitling format, whose specifications are at:
arpi
parents:
7775
diff
changeset
|
995 } |
eac680483e6c
JACOSub is another subtitling format, whose specifications are at:
arpi
parents:
7775
diff
changeset
|
996 default: |
eac680483e6c
JACOSub is another subtitling format, whose specifications are at:
arpi
parents:
7775
diff
changeset
|
997 if (!comment) { |
eac680483e6c
JACOSub is another subtitling format, whose specifications are at:
arpi
parents:
7775
diff
changeset
|
998 *q = *p; |
8207
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
999 ++q; |
7982
eac680483e6c
JACOSub is another subtitling format, whose specifications are at:
arpi
parents:
7775
diff
changeset
|
1000 } |
8207
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
1001 } //-- switch |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
1002 } //-- for |
7982
eac680483e6c
JACOSub is another subtitling format, whose specifications are at:
arpi
parents:
7775
diff
changeset
|
1003 *q = '\0'; |
8207
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
1004 current->text[current->lines] = strdup(line1); |
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
1005 } //-- while |
7982
eac680483e6c
JACOSub is another subtitling format, whose specifications are at:
arpi
parents:
7775
diff
changeset
|
1006 current->lines++; |
eac680483e6c
JACOSub is another subtitling format, whose specifications are at:
arpi
parents:
7775
diff
changeset
|
1007 return current; |
eac680483e6c
JACOSub is another subtitling format, whose specifications are at:
arpi
parents:
7775
diff
changeset
|
1008 } |
6076
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
1009 |
19066
26a30496ec96
marks several function without a prototype which arent used outside its sourcefile as static, Patch by Stefan Huehner - stefan AT huehner-org
reynaldo
parents:
18980
diff
changeset
|
1010 static int sub_autodetect (stream_t* st, int *uses_time) { |
2912 | 1011 char line[LINE_LEN+1]; |
258 | 1012 int i,j=0; |
2177 | 1013 char p; |
258 | 1014 |
624 | 1015 while (j < 100) { |
258 | 1016 j++; |
17879 | 1017 if (!stream_read_line (st, line, LINE_LEN)) |
2912 | 1018 return SUB_INVALID; |
258 | 1019 |
624 | 1020 if (sscanf (line, "{%d}{%d}", &i, &i)==2) |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1021 {*uses_time=0;return SUB_MICRODVD;} |
4519 | 1022 if (sscanf (line, "{%d}{}", &i)==1) |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1023 {*uses_time=0;return SUB_MICRODVD;} |
12138
eb3ad04675e1
MPL2 subreader, patch by Cezary Jackiewicz (cjackiewicz@poczta.onet.pl)
alex
parents:
12136
diff
changeset
|
1024 if (sscanf (line, "[%d][%d]", &i, &i)==2) |
eb3ad04675e1
MPL2 subreader, patch by Cezary Jackiewicz (cjackiewicz@poczta.onet.pl)
alex
parents:
12136
diff
changeset
|
1025 {*uses_time=1;return SUB_MPL2;} |
269 | 1026 if (sscanf (line, "%d:%d:%d.%d,%d:%d:%d.%d", &i, &i, &i, &i, &i, &i, &i, &i)==8) |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1027 {*uses_time=1;return SUB_SUBRIP;} |
9217
420e2b2f8e5a
compiler warning fixes patch by Dominik Mierzejewski <dominik@rangers.eu.org>
arpi
parents:
9145
diff
changeset
|
1028 if (sscanf (line, "%d:%d:%d%[,.:]%d --> %d:%d:%d%[,.:]%d", &i, &i, &i, (char *)&i, &i, &i, &i, &i, (char *)&i, &i)==10) |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1029 {*uses_time=1;return SUB_SUBVIEWER;} |
11496 | 1030 if (sscanf (line, "{T %d:%d:%d:%d",&i, &i, &i, &i)==4) |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1031 {*uses_time=1;return SUB_SUBVIEWER2;} |
624 | 1032 if (strstr (line, "<SAMI>")) |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1033 {*uses_time=1; return SUB_SAMI;} |
7982
eac680483e6c
JACOSub is another subtitling format, whose specifications are at:
arpi
parents:
7775
diff
changeset
|
1034 if (sscanf(line, "%d:%d:%d.%d %d:%d:%d.%d", &i, &i, &i, &i, &i, &i, &i, &i) == 8) |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1035 {*uses_time = 1; return SUB_JACOSUB;} |
8207
467ffae428b0
I recently sent a patch for a new subtitles format, JACOsub. Since then I
arpi
parents:
8206
diff
changeset
|
1036 if (sscanf(line, "@%d @%d", &i, &i) == 2) |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1037 {*uses_time = 1; return SUB_JACOSUB;} |
818 | 1038 if (sscanf (line, "%d:%d:%d:", &i, &i, &i )==3) |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1039 {*uses_time=1;return SUB_VPLAYER;} |
5363
1f068f4bb6e7
vplayer sub fix by Arkadiusz Podgorski <wodzu@softomat.com.pl>
arpi
parents:
4886
diff
changeset
|
1040 if (sscanf (line, "%d:%d:%d ", &i, &i, &i )==3) |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1041 {*uses_time=1;return SUB_VPLAYER;} |
850 | 1042 //TODO: just checking if first line of sub starts with "<" is WAY |
913
18c43d261c35
corrected strcmp() bug, now it works again with every subs (it was broken)
laaz
parents:
896
diff
changeset
|
1043 // too weak test for RT |
18c43d261c35
corrected strcmp() bug, now it works again with every subs (it was broken)
laaz
parents:
896
diff
changeset
|
1044 // Please someone who knows the format of RT... FIX IT!!! |
921 | 1045 // It may conflict with other sub formats in the future (actually it doesn't) |
913
18c43d261c35
corrected strcmp() bug, now it works again with every subs (it was broken)
laaz
parents:
896
diff
changeset
|
1046 if ( *line == '<' ) |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1047 {*uses_time=1;return SUB_RT;} |
921 | 1048 |
1049 if (!memcmp(line, "Dialogue: Marked", 16)) | |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1050 {*uses_time=1; return SUB_SSA;} |
10450 | 1051 if (!memcmp(line, "Dialogue: ", 10)) |
1052 {*uses_time=1; return SUB_SSA;} | |
1081 | 1053 if (sscanf (line, "%d,%d,\"%c", &i, &i, (char *) &i) == 3) |
11873 | 1054 {*uses_time=1;return SUB_PJS;} |
2177 | 1055 if (sscanf (line, "FORMAT=%d", &i) == 1) |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1056 {*uses_time=0; return SUB_MPSUB;} |
2177 | 1057 if (sscanf (line, "FORMAT=TIM%c", &p)==1 && p=='E') |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1058 {*uses_time=1; return SUB_MPSUB;} |
2343 | 1059 if (strstr (line, "-->>")) |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1060 {*uses_time=0; return SUB_AQTITLE;} |
6076
eff64fb1ffea
patch fixes broken detecniou of AQTitle subtiles and adds support for subtitles created by subrip 0.9 - by Jiri.Svoboda@seznam.cz
arpi
parents:
6012
diff
changeset
|
1061 if (sscanf (line, "[%d:%d:%d]", &i, &i, &i)==3) |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1062 {*uses_time=1;return SUB_SUBRIP09;} |
258 | 1063 } |
624 | 1064 |
2912 | 1065 return SUB_INVALID; // too many bad lines |
258 | 1066 } |
2449
7ef89d9b06ed
added DUMPSUBS recognition if we need compile only subreader.c alone
atlka
parents:
2358
diff
changeset
|
1067 |
7ef89d9b06ed
added DUMPSUBS recognition if we need compile only subreader.c alone
atlka
parents:
2358
diff
changeset
|
1068 #ifdef DUMPSUBS |
7ef89d9b06ed
added DUMPSUBS recognition if we need compile only subreader.c alone
atlka
parents:
2358
diff
changeset
|
1069 int sub_utf8=0; |
7ef89d9b06ed
added DUMPSUBS recognition if we need compile only subreader.c alone
atlka
parents:
2358
diff
changeset
|
1070 #else |
2151
a9d91476085a
modifications to use iconv(3) function to recode text of subs (autodetect)
atlka
parents:
2141
diff
changeset
|
1071 extern int sub_utf8; |
9056 | 1072 int sub_utf8_prev=0; |
2449
7ef89d9b06ed
added DUMPSUBS recognition if we need compile only subreader.c alone
atlka
parents:
2358
diff
changeset
|
1073 #endif |
258 | 1074 |
4886 | 1075 extern float sub_delay; |
1076 extern float sub_fps; | |
1077 | |
2151
a9d91476085a
modifications to use iconv(3) function to recode text of subs (autodetect)
atlka
parents:
2141
diff
changeset
|
1078 #ifdef USE_ICONV |
10354 | 1079 static iconv_t icdsc = (iconv_t)(-1); |
2151
a9d91476085a
modifications to use iconv(3) function to recode text of subs (autodetect)
atlka
parents:
2141
diff
changeset
|
1080 |
17879 | 1081 void subcp_open (stream_t *st) |
2151
a9d91476085a
modifications to use iconv(3) function to recode text of subs (autodetect)
atlka
parents:
2141
diff
changeset
|
1082 { |
a9d91476085a
modifications to use iconv(3) function to recode text of subs (autodetect)
atlka
parents:
2141
diff
changeset
|
1083 char *tocp = "UTF-8"; |
9056 | 1084 |
12909
dc8eba991005
fixes a crash and unchecked string-handling in ENCA code.
reimar
parents:
12646
diff
changeset
|
1085 if (sub_cp){ |
dc8eba991005
fixes a crash and unchecked string-handling in ENCA code.
reimar
parents:
12646
diff
changeset
|
1086 char *cp_tmp = sub_cp; |
dc8eba991005
fixes a crash and unchecked string-handling in ENCA code.
reimar
parents:
12646
diff
changeset
|
1087 #ifdef HAVE_ENCA |
dc8eba991005
fixes a crash and unchecked string-handling in ENCA code.
reimar
parents:
12646
diff
changeset
|
1088 char enca_lang[3], enca_fallback[100]; |
dc8eba991005
fixes a crash and unchecked string-handling in ENCA code.
reimar
parents:
12646
diff
changeset
|
1089 int free_cp_tmp = 0; |
dc8eba991005
fixes a crash and unchecked string-handling in ENCA code.
reimar
parents:
12646
diff
changeset
|
1090 if (sscanf(sub_cp, "enca:%2s:%99s", enca_lang, enca_fallback) == 2 |
dc8eba991005
fixes a crash and unchecked string-handling in ENCA code.
reimar
parents:
12646
diff
changeset
|
1091 || sscanf(sub_cp, "ENCA:%2s:%99s", enca_lang, enca_fallback) == 2) { |
17885
c04102e27eba
if stream is not seekable calling enca would prevent the real parsing of subtitles.
iive
parents:
17884
diff
changeset
|
1092 if (st && st->flags & STREAM_SEEK ) { |
17879 | 1093 cp_tmp = guess_cp(st, enca_lang, enca_fallback); |
12909
dc8eba991005
fixes a crash and unchecked string-handling in ENCA code.
reimar
parents:
12646
diff
changeset
|
1094 free_cp_tmp = 1; |
dc8eba991005
fixes a crash and unchecked string-handling in ENCA code.
reimar
parents:
12646
diff
changeset
|
1095 } else { |
dc8eba991005
fixes a crash and unchecked string-handling in ENCA code.
reimar
parents:
12646
diff
changeset
|
1096 cp_tmp = enca_fallback; |
19877
f16afec4c9c0
Fix missleading msg printed when subcp_open is given NULL as parameter (like as demux_ogg and demux_mkv do)
gpoirier
parents:
19271
diff
changeset
|
1097 if (st) |
f16afec4c9c0
Fix missleading msg printed when subcp_open is given NULL as parameter (like as demux_ogg and demux_mkv do)
gpoirier
parents:
19271
diff
changeset
|
1098 mp_msg(MSGT_SUBREADER,MSGL_WARN,"SUB: enca failed, stream must be seakable.\n"); |
12909
dc8eba991005
fixes a crash and unchecked string-handling in ENCA code.
reimar
parents:
12646
diff
changeset
|
1099 } |
dc8eba991005
fixes a crash and unchecked string-handling in ENCA code.
reimar
parents:
12646
diff
changeset
|
1100 } |
dc8eba991005
fixes a crash and unchecked string-handling in ENCA code.
reimar
parents:
12646
diff
changeset
|
1101 #endif |
dc8eba991005
fixes a crash and unchecked string-handling in ENCA code.
reimar
parents:
12646
diff
changeset
|
1102 if ((icdsc = iconv_open (tocp, cp_tmp)) != (iconv_t)(-1)){ |
6296 | 1103 mp_msg(MSGT_SUBREADER,MSGL_V,"SUB: opened iconv descriptor.\n"); |
2151
a9d91476085a
modifications to use iconv(3) function to recode text of subs (autodetect)
atlka
parents:
2141
diff
changeset
|
1104 sub_utf8 = 2; |
a9d91476085a
modifications to use iconv(3) function to recode text of subs (autodetect)
atlka
parents:
2141
diff
changeset
|
1105 } else |
6296 | 1106 mp_msg(MSGT_SUBREADER,MSGL_ERR,"SUB: error opening iconv descriptor.\n"); |
12909
dc8eba991005
fixes a crash and unchecked string-handling in ENCA code.
reimar
parents:
12646
diff
changeset
|
1107 #ifdef HAVE_ENCA |
dc8eba991005
fixes a crash and unchecked string-handling in ENCA code.
reimar
parents:
12646
diff
changeset
|
1108 if (free_cp_tmp && cp_tmp) free(cp_tmp); |
dc8eba991005
fixes a crash and unchecked string-handling in ENCA code.
reimar
parents:
12646
diff
changeset
|
1109 #endif |
2151
a9d91476085a
modifications to use iconv(3) function to recode text of subs (autodetect)
atlka
parents:
2141
diff
changeset
|
1110 } |
a9d91476085a
modifications to use iconv(3) function to recode text of subs (autodetect)
atlka
parents:
2141
diff
changeset
|
1111 } |
a9d91476085a
modifications to use iconv(3) function to recode text of subs (autodetect)
atlka
parents:
2141
diff
changeset
|
1112 |
a9d91476085a
modifications to use iconv(3) function to recode text of subs (autodetect)
atlka
parents:
2141
diff
changeset
|
1113 void subcp_close (void) |
a9d91476085a
modifications to use iconv(3) function to recode text of subs (autodetect)
atlka
parents:
2141
diff
changeset
|
1114 { |
a9d91476085a
modifications to use iconv(3) function to recode text of subs (autodetect)
atlka
parents:
2141
diff
changeset
|
1115 if (icdsc != (iconv_t)(-1)){ |
a9d91476085a
modifications to use iconv(3) function to recode text of subs (autodetect)
atlka
parents:
2141
diff
changeset
|
1116 (void) iconv_close (icdsc); |
9143 | 1117 icdsc = (iconv_t)(-1); |
6296 | 1118 mp_msg(MSGT_SUBREADER,MSGL_V,"SUB: closed iconv descriptor.\n"); |
2151
a9d91476085a
modifications to use iconv(3) function to recode text of subs (autodetect)
atlka
parents:
2141
diff
changeset
|
1119 } |
a9d91476085a
modifications to use iconv(3) function to recode text of subs (autodetect)
atlka
parents:
2141
diff
changeset
|
1120 } |
a9d91476085a
modifications to use iconv(3) function to recode text of subs (autodetect)
atlka
parents:
2141
diff
changeset
|
1121 |
20292
4f5c3fbbbba5
redone subcp_recode: get rid of static buffer, skip lines that failed to
reimar
parents:
19877
diff
changeset
|
1122 subtitle* subcp_recode (subtitle *sub) |
2151
a9d91476085a
modifications to use iconv(3) function to recode text of subs (autodetect)
atlka
parents:
2141
diff
changeset
|
1123 { |
a9d91476085a
modifications to use iconv(3) function to recode text of subs (autodetect)
atlka
parents:
2141
diff
changeset
|
1124 int l=sub->lines; |
7472
c4434bdf6e51
tons of warning fixes, also some 10l bugfixes, including Dominik's PVA bug
arpi
parents:
7460
diff
changeset
|
1125 size_t ileft, oleft; |
2151
a9d91476085a
modifications to use iconv(3) function to recode text of subs (autodetect)
atlka
parents:
2141
diff
changeset
|
1126 char *op, *ip, *ot; |
20292
4f5c3fbbbba5
redone subcp_recode: get rid of static buffer, skip lines that failed to
reimar
parents:
19877
diff
changeset
|
1127 if(icdsc == (iconv_t)(-1)) return sub; |
2151
a9d91476085a
modifications to use iconv(3) function to recode text of subs (autodetect)
atlka
parents:
2141
diff
changeset
|
1128 |
a9d91476085a
modifications to use iconv(3) function to recode text of subs (autodetect)
atlka
parents:
2141
diff
changeset
|
1129 while (l){ |
a9d91476085a
modifications to use iconv(3) function to recode text of subs (autodetect)
atlka
parents:
2141
diff
changeset
|
1130 ip = sub->text[--l]; |
a9d91476085a
modifications to use iconv(3) function to recode text of subs (autodetect)
atlka
parents:
2141
diff
changeset
|
1131 ileft = strlen(ip); |
20292
4f5c3fbbbba5
redone subcp_recode: get rid of static buffer, skip lines that failed to
reimar
parents:
19877
diff
changeset
|
1132 oleft = 4 * ileft; |
9056 | 1133 |
20292
4f5c3fbbbba5
redone subcp_recode: get rid of static buffer, skip lines that failed to
reimar
parents:
19877
diff
changeset
|
1134 if (!(ot = malloc(oleft + 1))){ |
4f5c3fbbbba5
redone subcp_recode: get rid of static buffer, skip lines that failed to
reimar
parents:
19877
diff
changeset
|
1135 mp_msg(MSGT_SUBREADER,MSGL_WARN,"SUB: error allocating mem.\n"); |
4f5c3fbbbba5
redone subcp_recode: get rid of static buffer, skip lines that failed to
reimar
parents:
19877
diff
changeset
|
1136 continue; |
4f5c3fbbbba5
redone subcp_recode: get rid of static buffer, skip lines that failed to
reimar
parents:
19877
diff
changeset
|
1137 } |
4f5c3fbbbba5
redone subcp_recode: get rid of static buffer, skip lines that failed to
reimar
parents:
19877
diff
changeset
|
1138 op = ot; |
6163
141a082e6da6
applied 64bit patch from Ulrich Hecht <uli at suse dot de>
alex
parents:
6076
diff
changeset
|
1139 if (iconv(icdsc, &ip, &ileft, |
2151
a9d91476085a
modifications to use iconv(3) function to recode text of subs (autodetect)
atlka
parents:
2141
diff
changeset
|
1140 &op, &oleft) == (size_t)(-1)) { |
20292
4f5c3fbbbba5
redone subcp_recode: get rid of static buffer, skip lines that failed to
reimar
parents:
19877
diff
changeset
|
1141 mp_msg(MSGT_SUBREADER,MSGL_WARN,"SUB: error recoding line.\n"); |
4f5c3fbbbba5
redone subcp_recode: get rid of static buffer, skip lines that failed to
reimar
parents:
19877
diff
changeset
|
1142 free(ot); |
4f5c3fbbbba5
redone subcp_recode: get rid of static buffer, skip lines that failed to
reimar
parents:
19877
diff
changeset
|
1143 continue; |
2151
a9d91476085a
modifications to use iconv(3) function to recode text of subs (autodetect)
atlka
parents:
2141
diff
changeset
|
1144 } |
a9d91476085a
modifications to use iconv(3) function to recode text of subs (autodetect)
atlka
parents:
2141
diff
changeset
|
1145 *op='\0' ; |
a9d91476085a
modifications to use iconv(3) function to recode text of subs (autodetect)
atlka
parents:
2141
diff
changeset
|
1146 free (sub->text[l]); |
a9d91476085a
modifications to use iconv(3) function to recode text of subs (autodetect)
atlka
parents:
2141
diff
changeset
|
1147 sub->text[l] = ot; |
a9d91476085a
modifications to use iconv(3) function to recode text of subs (autodetect)
atlka
parents:
2141
diff
changeset
|
1148 } |
a9d91476085a
modifications to use iconv(3) function to recode text of subs (autodetect)
atlka
parents:
2141
diff
changeset
|
1149 return sub; |
a9d91476085a
modifications to use iconv(3) function to recode text of subs (autodetect)
atlka
parents:
2141
diff
changeset
|
1150 } |
a9d91476085a
modifications to use iconv(3) function to recode text of subs (autodetect)
atlka
parents:
2141
diff
changeset
|
1151 #endif |
258 | 1152 |
9635
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1153 #ifdef USE_FRIBIDI |
10555 | 1154 #ifndef max |
9635
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1155 #define max(a,b) (((a)>(b))?(a):(b)) |
10555 | 1156 #endif |
9635
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1157 subtitle* sub_fribidi (subtitle *sub, int sub_utf8) |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1158 { |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1159 FriBidiChar logical[LINE_LEN+1], visual[LINE_LEN+1]; // Hopefully these two won't smash the stack |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1160 char *ip = NULL, *op = NULL; |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1161 FriBidiCharType base; |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1162 size_t len,orig_len; |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1163 int l=sub->lines; |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1164 int char_set_num; |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1165 fribidi_boolean log2vis; |
10649
857a34ff479d
Fixes FriBiDi support and extends it with configure options. Patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
10555
diff
changeset
|
1166 if(flip_hebrew) { // Please fix the indentation someday |
18550
1b8c3861dbd3
Use 0 and 1 instead of FRIBIDI_FALSE and FRIBIDI_TRUE which are no
uau
parents:
18514
diff
changeset
|
1167 fribidi_set_mirroring(1); |
1b8c3861dbd3
Use 0 and 1 instead of FRIBIDI_FALSE and FRIBIDI_TRUE which are no
uau
parents:
18514
diff
changeset
|
1168 fribidi_set_reorder_nsm(0); |
9635
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1169 |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1170 if( sub_utf8 == 0 ) { |
10649
857a34ff479d
Fixes FriBiDi support and extends it with configure options. Patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
10555
diff
changeset
|
1171 char_set_num = fribidi_parse_charset (fribidi_charset?fribidi_charset:"ISO8859-8"); |
9635
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1172 }else { |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1173 char_set_num = fribidi_parse_charset ("UTF-8"); |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1174 } |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1175 while (l) { |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1176 ip = sub->text[--l]; |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1177 orig_len = len = strlen( ip ); // We assume that we don't use full unicode, only UTF-8 or ISO8859-x |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1178 if(len > LINE_LEN) { |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1179 mp_msg(MSGT_SUBREADER,MSGL_WARN,"SUB: sub->text is longer than LINE_LEN.\n"); |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1180 l++; |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1181 break; |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1182 } |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1183 len = fribidi_charset_to_unicode (char_set_num, ip, len, logical); |
13679
59bb11213d11
correctly display the commas of most hebrew subtitles on the left side
faust3
parents:
13343
diff
changeset
|
1184 base = fribidi_flip_commas?FRIBIDI_TYPE_ON:FRIBIDI_TYPE_L; |
9635
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1185 log2vis = fribidi_log2vis (logical, len, &base, |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1186 /* output */ |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1187 visual, NULL, NULL, NULL); |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1188 if(log2vis) { |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1189 len = fribidi_remove_bidi_marks (visual, len, NULL, NULL, |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1190 NULL); |
18869 | 1191 if((op = malloc((max(2*orig_len,2*len) + 1))) == NULL) { |
9635
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1192 mp_msg(MSGT_SUBREADER,MSGL_WARN,"SUB: error allocating mem.\n"); |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1193 l++; |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1194 break; |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1195 } |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1196 fribidi_unicode_to_charset ( char_set_num, visual, len,op); |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1197 free (ip); |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1198 sub->text[l] = op; |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1199 } |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1200 } |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1201 if (l){ |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1202 for (l = sub->lines; l;) |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1203 free (sub->text[--l]); |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1204 return ERR; |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1205 } |
10649
857a34ff479d
Fixes FriBiDi support and extends it with configure options. Patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
10555
diff
changeset
|
1206 } |
9635
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1207 return sub; |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1208 } |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1209 |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1210 #endif |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1211 |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1212 static void adjust_subs_time(subtitle* sub, float subtime, float fps, int block, |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1213 int sub_num, int sub_uses_time) { |
4064
3c747168eb6e
1. subs know are readed after reading AVI header so we already know fps
atlka
parents:
4052
diff
changeset
|
1214 int n,m; |
4052
505f206d80d1
corrections to adjust_subs_time function which now uses fps if needed
atlka
parents:
4051
diff
changeset
|
1215 subtitle* nextsub; |
4051
0e7c382bc53a
added adjust_subs_time function which corrects bad sub->end time
atlka
parents:
4048
diff
changeset
|
1216 int i = sub_num; |
4052
505f206d80d1
corrections to adjust_subs_time function which now uses fps if needed
atlka
parents:
4051
diff
changeset
|
1217 unsigned long subfms = (sub_uses_time ? 100 : fps) * subtime; |
8206 | 1218 unsigned long overlap = (sub_uses_time ? 100 : fps) / 5; // 0.2s |
4064
3c747168eb6e
1. subs know are readed after reading AVI header so we already know fps
atlka
parents:
4052
diff
changeset
|
1219 |
3c747168eb6e
1. subs know are readed after reading AVI header so we already know fps
atlka
parents:
4052
diff
changeset
|
1220 n=m=0; |
7610 | 1221 if (i) for (;;){ |
4064
3c747168eb6e
1. subs know are readed after reading AVI header so we already know fps
atlka
parents:
4052
diff
changeset
|
1222 if (sub->end <= sub->start){ |
4052
505f206d80d1
corrections to adjust_subs_time function which now uses fps if needed
atlka
parents:
4051
diff
changeset
|
1223 sub->end = sub->start + subfms; |
4064
3c747168eb6e
1. subs know are readed after reading AVI header so we already know fps
atlka
parents:
4052
diff
changeset
|
1224 m++; |
3c747168eb6e
1. subs know are readed after reading AVI header so we already know fps
atlka
parents:
4052
diff
changeset
|
1225 n++; |
3c747168eb6e
1. subs know are readed after reading AVI header so we already know fps
atlka
parents:
4052
diff
changeset
|
1226 } |
3c747168eb6e
1. subs know are readed after reading AVI header so we already know fps
atlka
parents:
4052
diff
changeset
|
1227 if (!--i) break; |
4051
0e7c382bc53a
added adjust_subs_time function which corrects bad sub->end time
atlka
parents:
4048
diff
changeset
|
1228 nextsub = sub + 1; |
8882
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1229 if(block){ |
8206 | 1230 if ((sub->end > nextsub->start) && (sub->end <= nextsub->start + overlap)) { |
1231 // these subtitles overlap for less than 0.2 seconds | |
1232 // and would result in very short overlapping subtitle | |
1233 // so let's fix the problem here, before overlapping code | |
1234 // get its hands on them | |
1235 unsigned delta = sub->end - nextsub->start, half = delta / 2; | |
1236 sub->end -= half + 1; | |
1237 nextsub->start += delta - half; | |
1238 } | |
4051
0e7c382bc53a
added adjust_subs_time function which corrects bad sub->end time
atlka
parents:
4048
diff
changeset
|
1239 if (sub->end >= nextsub->start){ |
0e7c382bc53a
added adjust_subs_time function which corrects bad sub->end time
atlka
parents:
4048
diff
changeset
|
1240 sub->end = nextsub->start - 1; |
4052
505f206d80d1
corrections to adjust_subs_time function which now uses fps if needed
atlka
parents:
4051
diff
changeset
|
1241 if (sub->end - sub->start > subfms) |
505f206d80d1
corrections to adjust_subs_time function which now uses fps if needed
atlka
parents:
4051
diff
changeset
|
1242 sub->end = sub->start + subfms; |
4064
3c747168eb6e
1. subs know are readed after reading AVI header so we already know fps
atlka
parents:
4052
diff
changeset
|
1243 if (!m) |
3c747168eb6e
1. subs know are readed after reading AVI header so we already know fps
atlka
parents:
4052
diff
changeset
|
1244 n++; |
4051
0e7c382bc53a
added adjust_subs_time function which corrects bad sub->end time
atlka
parents:
4048
diff
changeset
|
1245 } |
8882
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1246 } |
7610 | 1247 |
1248 /* Theory: | |
1249 * Movies are often converted from FILM (24 fps) | |
1250 * to PAL (25) by simply speeding it up, so we | |
1251 * to multiply the original timestmaps by | |
1252 * (Movie's FPS / Subtitle's (guessed) FPS) | |
1253 * so eg. for 23.98 fps movie and PAL time based | |
1254 * subtitles we say -subfps 25 and we're fine! | |
1255 */ | |
1256 | |
1257 /* timed sub fps correction ::atmos */ | |
24571
402b68e1a3bb
Revert r24103, it was nonsense and add a comment that explains the code
reimar
parents:
24083
diff
changeset
|
1258 /* the frame-based case is handled in mpcommon.c |
402b68e1a3bb
Revert r24103, it was nonsense and add a comment that explains the code
reimar
parents:
24083
diff
changeset
|
1259 * where find_sub is called */ |
402b68e1a3bb
Revert r24103, it was nonsense and add a comment that explains the code
reimar
parents:
24083
diff
changeset
|
1260 if(sub_uses_time && sub_fps) { |
7610 | 1261 sub->start *= sub_fps/fps; |
1262 sub->end *= sub_fps/fps; | |
1263 } | |
1264 | |
4051
0e7c382bc53a
added adjust_subs_time function which corrects bad sub->end time
atlka
parents:
4048
diff
changeset
|
1265 sub = nextsub; |
4064
3c747168eb6e
1. subs know are readed after reading AVI header so we already know fps
atlka
parents:
4052
diff
changeset
|
1266 m = 0; |
4051
0e7c382bc53a
added adjust_subs_time function which corrects bad sub->end time
atlka
parents:
4048
diff
changeset
|
1267 } |
6296 | 1268 if (n) mp_msg(MSGT_SUBREADER,MSGL_INFO,"SUB: Adjusted %d subtitle(s).\n", n); |
4051
0e7c382bc53a
added adjust_subs_time function which corrects bad sub->end time
atlka
parents:
4048
diff
changeset
|
1269 } |
0e7c382bc53a
added adjust_subs_time function which corrects bad sub->end time
atlka
parents:
4048
diff
changeset
|
1270 |
9009
f2d4324561b2
1) Removed the code to remove {} from sub_read_line_ssa
arpi
parents:
8940
diff
changeset
|
1271 struct subreader { |
17879 | 1272 subtitle * (*read)(stream_t *st,subtitle *dest); |
9009
f2d4324561b2
1) Removed the code to remove {} from sub_read_line_ssa
arpi
parents:
8940
diff
changeset
|
1273 void (*post)(subtitle *dest); |
f2d4324561b2
1) Removed the code to remove {} from sub_read_line_ssa
arpi
parents:
8940
diff
changeset
|
1274 const char *name; |
f2d4324561b2
1) Removed the code to remove {} from sub_read_line_ssa
arpi
parents:
8940
diff
changeset
|
1275 }; |
f2d4324561b2
1) Removed the code to remove {} from sub_read_line_ssa
arpi
parents:
8940
diff
changeset
|
1276 |
12443 | 1277 #ifdef HAVE_ENCA |
18936 | 1278 void* guess_buffer_cp(unsigned char* buffer, int buflen, char *preferred_language, char *fallback) |
12443 | 1279 { |
1280 const char **languages; | |
18936 | 1281 size_t langcnt; |
12443 | 1282 EncaAnalyser analyser; |
1283 EncaEncoding encoding; | |
1284 char *detected_sub_cp = NULL; | |
1285 int i; | |
1286 | |
1287 languages = enca_get_languages(&langcnt); | |
1288 mp_msg(MSGT_SUBREADER, MSGL_V, "ENCA supported languages: "); | |
1289 for (i = 0; i < langcnt; i++) { | |
1290 mp_msg(MSGT_SUBREADER, MSGL_V, "%s ", languages[i]); | |
1291 } | |
1292 mp_msg(MSGT_SUBREADER, MSGL_V, "\n"); | |
1293 | |
1294 for (i = 0; i < langcnt; i++) { | |
18514 | 1295 const char *tmp; |
15382
ba07942279c5
strdup() of a NULL pointer, truckload of cola for me
henry
parents:
14642
diff
changeset
|
1296 |
12443 | 1297 if (strcasecmp(languages[i], preferred_language) != 0) continue; |
1298 analyser = enca_analyser_alloc(languages[i]); | |
1299 encoding = enca_analyse_const(analyser, buffer, buflen); | |
15382
ba07942279c5
strdup() of a NULL pointer, truckload of cola for me
henry
parents:
14642
diff
changeset
|
1300 tmp = enca_charset_name(encoding.charset, ENCA_NAME_STYLE_ICONV); |
15562 | 1301 if (tmp && encoding.charset != ENCA_CS_UNKNOWN) { |
15382
ba07942279c5
strdup() of a NULL pointer, truckload of cola for me
henry
parents:
14642
diff
changeset
|
1302 detected_sub_cp = strdup(tmp); |
ba07942279c5
strdup() of a NULL pointer, truckload of cola for me
henry
parents:
14642
diff
changeset
|
1303 mp_msg(MSGT_SUBREADER, MSGL_INFO, "ENCA detected charset: %s\n", tmp); |
ba07942279c5
strdup() of a NULL pointer, truckload of cola for me
henry
parents:
14642
diff
changeset
|
1304 } |
12443 | 1305 enca_analyser_free(analyser); |
1306 } | |
1307 | |
1308 free(languages); | |
1309 | |
15382
ba07942279c5
strdup() of a NULL pointer, truckload of cola for me
henry
parents:
14642
diff
changeset
|
1310 if (!detected_sub_cp) { |
ba07942279c5
strdup() of a NULL pointer, truckload of cola for me
henry
parents:
14642
diff
changeset
|
1311 detected_sub_cp = strdup(fallback); |
ba07942279c5
strdup() of a NULL pointer, truckload of cola for me
henry
parents:
14642
diff
changeset
|
1312 mp_msg(MSGT_SUBREADER, MSGL_INFO, "ENCA detection failed: fallback to %s\n", fallback); |
ba07942279c5
strdup() of a NULL pointer, truckload of cola for me
henry
parents:
14642
diff
changeset
|
1313 } |
12443 | 1314 |
1315 return detected_sub_cp; | |
1316 } | |
18936 | 1317 |
1318 #define MAX_GUESS_BUFFER_SIZE (256*1024) | |
1319 void* guess_cp(stream_t *st, char *preferred_language, char *fallback) | |
1320 { | |
1321 size_t buflen; | |
1322 unsigned char *buffer; | |
1323 char *detected_sub_cp = NULL; | |
1324 | |
1325 buffer = malloc(MAX_GUESS_BUFFER_SIZE); | |
1326 buflen = stream_read(st,buffer, MAX_GUESS_BUFFER_SIZE); | |
1327 | |
1328 detected_sub_cp = guess_buffer_cp(buffer, buflen, preferred_language, fallback); | |
1329 | |
1330 free(buffer); | |
1331 stream_reset(st); | |
1332 stream_seek(st,0); | |
1333 | |
1334 return detected_sub_cp; | |
1335 } | |
1336 #undef MAX_GUESS_BUFFER_SIZE | |
12443 | 1337 #endif |
1338 | |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1339 sub_data* sub_read_file (char *filename, float fps) { |
17879 | 1340 stream_t* fd; |
7983
8344414c59cf
This patch is to add support for overlapping subtitles, that is
arpi
parents:
7982
diff
changeset
|
1341 int n_max, n_first, i, j, sub_first, sub_orig; |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1342 subtitle *first, *second, *sub, *return_sub; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1343 sub_data *subt_data; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1344 int uses_time = 0, sub_num = 0, sub_errs = 0; |
9009
f2d4324561b2
1) Removed the code to remove {} from sub_read_line_ssa
arpi
parents:
8940
diff
changeset
|
1345 struct subreader sr[]= |
258 | 1346 { |
9009
f2d4324561b2
1) Removed the code to remove {} from sub_read_line_ssa
arpi
parents:
8940
diff
changeset
|
1347 { sub_read_line_microdvd, NULL, "microdvd" }, |
f2d4324561b2
1) Removed the code to remove {} from sub_read_line_ssa
arpi
parents:
8940
diff
changeset
|
1348 { sub_read_line_subrip, NULL, "subrip" }, |
f2d4324561b2
1) Removed the code to remove {} from sub_read_line_ssa
arpi
parents:
8940
diff
changeset
|
1349 { sub_read_line_subviewer, NULL, "subviewer" }, |
f2d4324561b2
1) Removed the code to remove {} from sub_read_line_ssa
arpi
parents:
8940
diff
changeset
|
1350 { sub_read_line_sami, NULL, "sami" }, |
f2d4324561b2
1) Removed the code to remove {} from sub_read_line_ssa
arpi
parents:
8940
diff
changeset
|
1351 { sub_read_line_vplayer, NULL, "vplayer" }, |
f2d4324561b2
1) Removed the code to remove {} from sub_read_line_ssa
arpi
parents:
8940
diff
changeset
|
1352 { sub_read_line_rt, NULL, "rt" }, |
f2d4324561b2
1) Removed the code to remove {} from sub_read_line_ssa
arpi
parents:
8940
diff
changeset
|
1353 { sub_read_line_ssa, sub_pp_ssa, "ssa" }, |
11873 | 1354 { sub_read_line_pjs, NULL, "pjs" }, |
9009
f2d4324561b2
1) Removed the code to remove {} from sub_read_line_ssa
arpi
parents:
8940
diff
changeset
|
1355 { sub_read_line_mpsub, NULL, "mpsub" }, |
f2d4324561b2
1) Removed the code to remove {} from sub_read_line_ssa
arpi
parents:
8940
diff
changeset
|
1356 { sub_read_line_aqt, NULL, "aqt" }, |
f2d4324561b2
1) Removed the code to remove {} from sub_read_line_ssa
arpi
parents:
8940
diff
changeset
|
1357 { sub_read_line_subviewer2, NULL, "subviewer 2.0" }, |
f2d4324561b2
1) Removed the code to remove {} from sub_read_line_ssa
arpi
parents:
8940
diff
changeset
|
1358 { sub_read_line_subrip09, NULL, "subrip 0.9" }, |
12138
eb3ad04675e1
MPL2 subreader, patch by Cezary Jackiewicz (cjackiewicz@poczta.onet.pl)
alex
parents:
12136
diff
changeset
|
1359 { sub_read_line_jacosub, NULL, "jacosub" }, |
eb3ad04675e1
MPL2 subreader, patch by Cezary Jackiewicz (cjackiewicz@poczta.onet.pl)
alex
parents:
12136
diff
changeset
|
1360 { sub_read_line_mpl2, NULL, "mpl2" } |
258 | 1361 }; |
9009
f2d4324561b2
1) Removed the code to remove {} from sub_read_line_ssa
arpi
parents:
8940
diff
changeset
|
1362 struct subreader *srp; |
f2d4324561b2
1) Removed the code to remove {} from sub_read_line_ssa
arpi
parents:
8940
diff
changeset
|
1363 |
2915 | 1364 if(filename==NULL) return NULL; //qnx segfault |
18703
c1ac0d17b6a2
fix uninitialized pointer value being passed to open_stream, where it is used in comparison.
gpoirier
parents:
18550
diff
changeset
|
1365 i = 0; |
23431
af3ae78477b3
Revert r23443, it breaks compilation without libass.
eugeni
parents:
23425
diff
changeset
|
1366 fd=open_stream (filename, NULL, &i); if (!fd) return NULL; |
10353
ee46cdf03028
small correction of sub_utf8 restoring between reading sub files
atlka
parents:
10340
diff
changeset
|
1367 |
ee46cdf03028
small correction of sub_utf8 restoring between reading sub files
atlka
parents:
10340
diff
changeset
|
1368 sub_format=sub_autodetect (fd, &uses_time); |
ee46cdf03028
small correction of sub_utf8 restoring between reading sub files
atlka
parents:
10340
diff
changeset
|
1369 mpsub_multiplier = (uses_time ? 100.0 : 1.0); |
ee46cdf03028
small correction of sub_utf8 restoring between reading sub files
atlka
parents:
10340
diff
changeset
|
1370 if (sub_format==SUB_INVALID) {mp_msg(MSGT_SUBREADER,MSGL_WARN,"SUB: Could not determine file format\n");return NULL;} |
ee46cdf03028
small correction of sub_utf8 restoring between reading sub files
atlka
parents:
10340
diff
changeset
|
1371 srp=sr+sub_format; |
ee46cdf03028
small correction of sub_utf8 restoring between reading sub files
atlka
parents:
10340
diff
changeset
|
1372 mp_msg(MSGT_SUBREADER,MSGL_INFO,"SUB: Detected subtitle file format: %s\n", srp->name); |
ee46cdf03028
small correction of sub_utf8 restoring between reading sub files
atlka
parents:
10340
diff
changeset
|
1373 |
17884 | 1374 stream_reset(fd); |
17879 | 1375 stream_seek(fd,0); |
10353
ee46cdf03028
small correction of sub_utf8 restoring between reading sub files
atlka
parents:
10340
diff
changeset
|
1376 |
23431
af3ae78477b3
Revert r23443, it breaks compilation without libass.
eugeni
parents:
23425
diff
changeset
|
1377 #ifdef USE_ICONV |
10353
ee46cdf03028
small correction of sub_utf8 restoring between reading sub files
atlka
parents:
10340
diff
changeset
|
1378 sub_utf8_prev=sub_utf8; |
23431
af3ae78477b3
Revert r23443, it breaks compilation without libass.
eugeni
parents:
23425
diff
changeset
|
1379 { |
af3ae78477b3
Revert r23443, it breaks compilation without libass.
eugeni
parents:
23425
diff
changeset
|
1380 int l,k; |
af3ae78477b3
Revert r23443, it breaks compilation without libass.
eugeni
parents:
23425
diff
changeset
|
1381 k = -1; |
af3ae78477b3
Revert r23443, it breaks compilation without libass.
eugeni
parents:
23425
diff
changeset
|
1382 if ((l=strlen(filename))>4){ |
af3ae78477b3
Revert r23443, it breaks compilation without libass.
eugeni
parents:
23425
diff
changeset
|
1383 char *exts[] = {".utf", ".utf8", ".utf-8" }; |
af3ae78477b3
Revert r23443, it breaks compilation without libass.
eugeni
parents:
23425
diff
changeset
|
1384 for (k=3;--k>=0;) |
af3ae78477b3
Revert r23443, it breaks compilation without libass.
eugeni
parents:
23425
diff
changeset
|
1385 if (l >= strlen(exts[k]) && !strcasecmp(filename+(l - strlen(exts[k])), exts[k])){ |
af3ae78477b3
Revert r23443, it breaks compilation without libass.
eugeni
parents:
23425
diff
changeset
|
1386 sub_utf8 = 1; |
af3ae78477b3
Revert r23443, it breaks compilation without libass.
eugeni
parents:
23425
diff
changeset
|
1387 break; |
af3ae78477b3
Revert r23443, it breaks compilation without libass.
eugeni
parents:
23425
diff
changeset
|
1388 } |
af3ae78477b3
Revert r23443, it breaks compilation without libass.
eugeni
parents:
23425
diff
changeset
|
1389 } |
af3ae78477b3
Revert r23443, it breaks compilation without libass.
eugeni
parents:
23425
diff
changeset
|
1390 if (k<0) subcp_open(fd); |
af3ae78477b3
Revert r23443, it breaks compilation without libass.
eugeni
parents:
23425
diff
changeset
|
1391 } |
af3ae78477b3
Revert r23443, it breaks compilation without libass.
eugeni
parents:
23425
diff
changeset
|
1392 #endif |
2151
a9d91476085a
modifications to use iconv(3) function to recode text of subs (autodetect)
atlka
parents:
2141
diff
changeset
|
1393 |
258 | 1394 sub_num=0;n_max=32; |
18869 | 1395 first=malloc(n_max*sizeof(subtitle)); |
10354 | 1396 if(!first){ |
23431
af3ae78477b3
Revert r23443, it breaks compilation without libass.
eugeni
parents:
23425
diff
changeset
|
1397 #ifdef USE_ICONV |
af3ae78477b3
Revert r23443, it breaks compilation without libass.
eugeni
parents:
23425
diff
changeset
|
1398 subcp_close(); |
af3ae78477b3
Revert r23443, it breaks compilation without libass.
eugeni
parents:
23425
diff
changeset
|
1399 sub_utf8=sub_utf8_prev; |
af3ae78477b3
Revert r23443, it breaks compilation without libass.
eugeni
parents:
23425
diff
changeset
|
1400 #endif |
10354 | 1401 return NULL; |
1402 } | |
258 | 1403 |
8362
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
1404 #ifdef USE_SORTSUB |
18869 | 1405 sub = malloc(sizeof(subtitle)); |
8362
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
1406 //This is to deal with those formats (AQT & Subrip) which define the end of a subtitle |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
1407 //as the beginning of the following |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
1408 previous_sub_end = 0; |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
1409 #endif |
258 | 1410 while(1){ |
1411 if(sub_num>=n_max){ | |
1412 n_max+=16; | |
1413 first=realloc(first,n_max*sizeof(subtitle)); | |
1414 } | |
8362
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
1415 #ifndef USE_SORTSUB |
4064
3c747168eb6e
1. subs know are readed after reading AVI header so we already know fps
atlka
parents:
4052
diff
changeset
|
1416 sub = &first[sub_num]; |
8362
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
1417 #endif |
4064
3c747168eb6e
1. subs know are readed after reading AVI header so we already know fps
atlka
parents:
4052
diff
changeset
|
1418 memset(sub, '\0', sizeof(subtitle)); |
9009
f2d4324561b2
1) Removed the code to remove {} from sub_read_line_ssa
arpi
parents:
8940
diff
changeset
|
1419 sub=srp->read(fd,sub); |
258 | 1420 if(!sub) break; // EOF |
23431
af3ae78477b3
Revert r23443, it breaks compilation without libass.
eugeni
parents:
23425
diff
changeset
|
1421 #ifdef USE_ICONV |
af3ae78477b3
Revert r23443, it breaks compilation without libass.
eugeni
parents:
23425
diff
changeset
|
1422 if ((sub!=ERR) && (sub_utf8 & 2)) sub=subcp_recode(sub); |
af3ae78477b3
Revert r23443, it breaks compilation without libass.
eugeni
parents:
23425
diff
changeset
|
1423 #endif |
9635
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1424 #ifdef USE_FRIBIDI |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1425 if (sub!=ERR) sub=sub_fribidi(sub,sub_utf8); |
cc20a6dc9bc3
hebrew support using fribidi libs, patch by Raindel Shachar <raindel@techunix.technion.ac.il>
alex
parents:
9322
diff
changeset
|
1426 #endif |
9056 | 1427 if ( sub == ERR ) |
1428 { | |
23431
af3ae78477b3
Revert r23443, it breaks compilation without libass.
eugeni
parents:
23425
diff
changeset
|
1429 #ifdef USE_ICONV |
af3ae78477b3
Revert r23443, it breaks compilation without libass.
eugeni
parents:
23425
diff
changeset
|
1430 subcp_close(); |
af3ae78477b3
Revert r23443, it breaks compilation without libass.
eugeni
parents:
23425
diff
changeset
|
1431 #endif |
9056 | 1432 if ( first ) free(first); |
1433 return NULL; | |
1434 } | |
9009
f2d4324561b2
1) Removed the code to remove {} from sub_read_line_ssa
arpi
parents:
8940
diff
changeset
|
1435 // Apply any post processing that needs recoding first |
9126
7a06258271d6
Add a command line option (-sub-no-text-pp) to disable subtitles
arpi
parents:
9056
diff
changeset
|
1436 if ((sub!=ERR) && !sub_no_text_pp && srp->post) srp->post(sub); |
8362
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
1437 #ifdef USE_SORTSUB |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
1438 if(!sub_num || (first[sub_num - 1].start <= sub->start)){ |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
1439 first[sub_num].start = sub->start; |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
1440 first[sub_num].end = sub->end; |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
1441 first[sub_num].lines = sub->lines; |
10916
c36db88bfbc4
Subtitle alignment & smart splitting by Salvatore Falco
henry
parents:
10801
diff
changeset
|
1442 first[sub_num].alignment = sub->alignment; |
8362
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
1443 for(i = 0; i < sub->lines; ++i){ |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
1444 first[sub_num].text[i] = sub->text[i]; |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
1445 } |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
1446 if (previous_sub_end){ |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
1447 first[sub_num - 1].end = previous_sub_end; |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
1448 previous_sub_end = 0; |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
1449 } |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
1450 } else { |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
1451 for(j = sub_num - 1; j >= 0; --j){ |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
1452 first[j + 1].start = first[j].start; |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
1453 first[j + 1].end = first[j].end; |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
1454 first[j + 1].lines = first[j].lines; |
10916
c36db88bfbc4
Subtitle alignment & smart splitting by Salvatore Falco
henry
parents:
10801
diff
changeset
|
1455 first[j + 1].alignment = first[j].alignment; |
8362
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
1456 for(i = 0; i < first[j].lines; ++i){ |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
1457 first[j + 1].text[i] = first[j].text[i]; |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
1458 } |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
1459 if(!j || (first[j - 1].start <= sub->start)){ |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
1460 first[j].start = sub->start; |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
1461 first[j].end = sub->end; |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
1462 first[j].lines = sub->lines; |
10916
c36db88bfbc4
Subtitle alignment & smart splitting by Salvatore Falco
henry
parents:
10801
diff
changeset
|
1463 first[j].alignment = sub->alignment; |
8362
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
1464 for(i = 0; i < SUB_MAX_TEXT; ++i){ |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
1465 first[j].text[i] = sub->text[i]; |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
1466 } |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
1467 if (previous_sub_end){ |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
1468 first[j].end = first[j - 1].end; |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
1469 first[j - 1].end = previous_sub_end; |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
1470 previous_sub_end = 0; |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
1471 } |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
1472 break; |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
1473 } |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
1474 } |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
1475 } |
b5478134c853
optional (compile-time switch) subtitles-sorting feature
arpi
parents:
8361
diff
changeset
|
1476 #endif |
258 | 1477 if(sub==ERR) ++sub_errs; else ++sub_num; // Error vs. Valid |
1478 } | |
1479 | |
17879 | 1480 free_stream(fd); |
23431
af3ae78477b3
Revert r23443, it breaks compilation without libass.
eugeni
parents:
23425
diff
changeset
|
1481 |
af3ae78477b3
Revert r23443, it breaks compilation without libass.
eugeni
parents:
23425
diff
changeset
|
1482 #ifdef USE_ICONV |
af3ae78477b3
Revert r23443, it breaks compilation without libass.
eugeni
parents:
23425
diff
changeset
|
1483 subcp_close(); |
af3ae78477b3
Revert r23443, it breaks compilation without libass.
eugeni
parents:
23425
diff
changeset
|
1484 #endif |
2151
a9d91476085a
modifications to use iconv(3) function to recode text of subs (autodetect)
atlka
parents:
2141
diff
changeset
|
1485 |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1486 // printf ("SUB: Subtitle format %s time.\n", uses_time?"uses":"doesn't use"); |
6296 | 1487 mp_msg(MSGT_SUBREADER,MSGL_INFO,"SUB: Read %i subtitles", sub_num); |
1488 if (sub_errs) mp_msg(MSGT_SUBREADER,MSGL_INFO,", %i bad line(s).\n", sub_errs); | |
1489 else mp_msg(MSGT_SUBREADER,MSGL_INFO,".\n"); | |
258 | 1490 |
2880 | 1491 if(sub_num<=0){ |
1492 free(first); | |
1493 return NULL; | |
1494 } | |
1495 | |
8882
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1496 // we do overlap if the user forced it (suboverlap_enable == 2) or |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1497 // the user didn't forced no-overlapsub and the format is Jacosub or Ssa. |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1498 // this is because usually overlapping subtitles are found in these formats, |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1499 // while in others they are probably result of bad timing |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1500 if ((suboverlap_enabled == 2) || |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1501 ((suboverlap_enabled) && ((sub_format == SUB_JACOSUB) || (sub_format == SUB_SSA)))) { |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1502 adjust_subs_time(first, 6.0, fps, 0, sub_num, uses_time);/*~6 secs AST*/ |
7983
8344414c59cf
This patch is to add support for overlapping subtitles, that is
arpi
parents:
7982
diff
changeset
|
1503 // here we manage overlapping subtitles |
8344414c59cf
This patch is to add support for overlapping subtitles, that is
arpi
parents:
7982
diff
changeset
|
1504 sub_orig = sub_num; |
8344414c59cf
This patch is to add support for overlapping subtitles, that is
arpi
parents:
7982
diff
changeset
|
1505 n_first = sub_num; |
8344414c59cf
This patch is to add support for overlapping subtitles, that is
arpi
parents:
7982
diff
changeset
|
1506 sub_num = 0; |
8344414c59cf
This patch is to add support for overlapping subtitles, that is
arpi
parents:
7982
diff
changeset
|
1507 second = NULL; |
8882
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1508 // for each subtitle in first[] we deal with its 'block' of |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1509 // bonded subtitles |
7983
8344414c59cf
This patch is to add support for overlapping subtitles, that is
arpi
parents:
7982
diff
changeset
|
1510 for (sub_first = 0; sub_first < n_first; ++sub_first) { |
8882
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1511 unsigned long global_start = first[sub_first].start, |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1512 global_end = first[sub_first].end, local_start, local_end; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1513 int lines_to_add = first[sub_first].lines, sub_to_add = 0, |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1514 **placeholder = NULL, higher_line = 0, counter, start_block_sub = sub_num; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1515 char real_block = 1; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1516 |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1517 // here we find the number of subtitles inside the 'block' |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1518 // and its span interval. this works well only with sorted |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1519 // subtitles |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1520 while ((sub_first + sub_to_add + 1 < n_first) && (first[sub_first + sub_to_add + 1].start < global_end)) { |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1521 ++sub_to_add; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1522 lines_to_add += first[sub_first + sub_to_add].lines; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1523 if (first[sub_first + sub_to_add].start < global_start) { |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1524 global_start = first[sub_first + sub_to_add].start; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1525 } |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1526 if (first[sub_first + sub_to_add].end > global_end) { |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1527 global_end = first[sub_first + sub_to_add].end; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1528 } |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1529 } |
7983
8344414c59cf
This patch is to add support for overlapping subtitles, that is
arpi
parents:
7982
diff
changeset
|
1530 |
8882
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1531 // we need a structure to keep trace of the screen lines |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1532 // used by the subs, a 'placeholder' |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1533 counter = 2 * sub_to_add + 1; // the maximum number of subs derived |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1534 // from a block of sub_to_add+1 subs |
18869 | 1535 placeholder = malloc(sizeof(int *) * counter); |
8882
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1536 for (i = 0; i < counter; ++i) { |
18869 | 1537 placeholder[i] = malloc(sizeof(int) * lines_to_add); |
8882
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1538 for (j = 0; j < lines_to_add; ++j) { |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1539 placeholder[i][j] = -1; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1540 } |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1541 } |
7983
8344414c59cf
This patch is to add support for overlapping subtitles, that is
arpi
parents:
7982
diff
changeset
|
1542 |
8882
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1543 counter = 0; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1544 local_end = global_start - 1; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1545 do { |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1546 int ls; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1547 |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1548 // here we find the beginning and the end of a new |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1549 // subtitle in the block |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1550 local_start = local_end + 1; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1551 local_end = global_end; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1552 for (j = 0; j <= sub_to_add; ++j) { |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1553 if ((first[sub_first + j].start - 1 > local_start) && (first[sub_first + j].start - 1 < local_end)) { |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1554 local_end = first[sub_first + j].start - 1; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1555 } else if ((first[sub_first + j].end > local_start) && (first[sub_first + j].end < local_end)) { |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1556 local_end = first[sub_first + j].end; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1557 } |
7983
8344414c59cf
This patch is to add support for overlapping subtitles, that is
arpi
parents:
7982
diff
changeset
|
1558 } |
8882
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1559 // here we allocate the screen lines to subs we must |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1560 // display in current local_start-local_end interval. |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1561 // if the subs were yet presents in the previous interval |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1562 // they keep the same lines, otherside they get unused lines |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1563 for (j = 0; j <= sub_to_add; ++j) { |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1564 if ((first[sub_first + j].start <= local_end) && (first[sub_first + j].end > local_start)) { |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1565 unsigned long sub_lines = first[sub_first + j].lines, fragment_length = lines_to_add + 1, |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1566 tmp = 0; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1567 char boolean = 0; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1568 int fragment_position = -1; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1569 |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1570 // if this is not the first new sub of the block |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1571 // we find if this sub was present in the previous |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1572 // new sub |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1573 if (counter) |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1574 for (i = 0; i < lines_to_add; ++i) { |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1575 if (placeholder[counter - 1][i] == sub_first + j) { |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1576 placeholder[counter][i] = sub_first + j; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1577 boolean = 1; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1578 } |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1579 } |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1580 if (boolean) |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1581 continue; |
7983
8344414c59cf
This patch is to add support for overlapping subtitles, that is
arpi
parents:
7982
diff
changeset
|
1582 |
8882
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1583 // we are looking for the shortest among all groups of |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1584 // sequential blank lines whose length is greater than or |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1585 // equal to sub_lines. we store in fragment_position the |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1586 // position of the shortest group, in fragment_length its |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1587 // length, and in tmp the length of the group currently |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1588 // examinated |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1589 for (i = 0; i < lines_to_add; ++i) { |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1590 if (placeholder[counter][i] == -1) { |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1591 // placeholder[counter][i] is part of the current group |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1592 // of blank lines |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1593 ++tmp; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1594 } else { |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1595 if (tmp == sub_lines) { |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1596 // current group's size fits exactly the one we |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1597 // need, so we stop looking |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1598 fragment_position = i - tmp; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1599 tmp = 0; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1600 break; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1601 } |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1602 if ((tmp) && (tmp > sub_lines) && (tmp < fragment_length)) { |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1603 // current group is the best we found till here, |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1604 // but is still bigger than the one we are looking |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1605 // for, so we keep on looking |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1606 fragment_length = tmp; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1607 fragment_position = i - tmp; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1608 tmp = 0; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1609 } else { |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1610 // current group doesn't fit at all, so we forget it |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1611 tmp = 0; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1612 } |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1613 } |
7983
8344414c59cf
This patch is to add support for overlapping subtitles, that is
arpi
parents:
7982
diff
changeset
|
1614 } |
8882
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1615 if (tmp) { |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1616 // last screen line is blank, a group ends with it |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1617 if ((tmp >= sub_lines) && (tmp < fragment_length)) { |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1618 fragment_position = i - tmp; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1619 } |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1620 } |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1621 if (fragment_position == -1) { |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1622 // it was not possible to find free screen line(s) for a subtitle, |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1623 // usually this means a bug in the code; however we do not overlap |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1624 mp_msg(MSGT_SUBREADER, MSGL_WARN, "SUB: we could not find a suitable position for an overlapping subtitle\n"); |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1625 higher_line = SUB_MAX_TEXT + 1; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1626 break; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1627 } else { |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1628 for (tmp = 0; tmp < sub_lines; ++tmp) { |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1629 placeholder[counter][fragment_position + tmp] = sub_first + j; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1630 } |
7983
8344414c59cf
This patch is to add support for overlapping subtitles, that is
arpi
parents:
7982
diff
changeset
|
1631 } |
8344414c59cf
This patch is to add support for overlapping subtitles, that is
arpi
parents:
7982
diff
changeset
|
1632 } |
8882
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1633 } |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1634 for (j = higher_line + 1; j < lines_to_add; ++j) { |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1635 if (placeholder[counter][j] != -1) |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1636 higher_line = j; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1637 else |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1638 break; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1639 } |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1640 if (higher_line >= SUB_MAX_TEXT) { |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1641 // the 'block' has too much lines, so we don't overlap the |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1642 // subtitles |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1643 second = (subtitle *) realloc(second, (sub_num + sub_to_add + 1) * sizeof(subtitle)); |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1644 for (j = 0; j <= sub_to_add; ++j) { |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1645 int ls; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1646 memset(&second[sub_num + j], '\0', sizeof(subtitle)); |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1647 second[sub_num + j].start = first[sub_first + j].start; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1648 second[sub_num + j].end = first[sub_first + j].end; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1649 second[sub_num + j].lines = first[sub_first + j].lines; |
10916
c36db88bfbc4
Subtitle alignment & smart splitting by Salvatore Falco
henry
parents:
10801
diff
changeset
|
1650 second[sub_num + j].alignment = first[sub_first + j].alignment; |
8882
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1651 for (ls = 0; ls < second[sub_num + j].lines; ls++) { |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1652 second[sub_num + j].text[ls] = strdup(first[sub_first + j].text[ls]); |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1653 } |
7983
8344414c59cf
This patch is to add support for overlapping subtitles, that is
arpi
parents:
7982
diff
changeset
|
1654 } |
8882
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1655 sub_num += sub_to_add + 1; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1656 sub_first += sub_to_add; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1657 real_block = 0; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1658 break; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1659 } |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1660 |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1661 // we read the placeholder structure and create the new |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1662 // subs. |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1663 second = (subtitle *) realloc(second, (sub_num + 1) * sizeof(subtitle)); |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1664 memset(&second[sub_num], '\0', sizeof(subtitle)); |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1665 second[sub_num].start = local_start; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1666 second[sub_num].end = local_end; |
13343
1a4b6e575484
This time is a patch to improve subtitle alignment management. It
faust3
parents:
13229
diff
changeset
|
1667 second[sub_num].alignment = first[sub_first].alignment; |
8882
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1668 n_max = (lines_to_add < SUB_MAX_TEXT) ? lines_to_add : SUB_MAX_TEXT; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1669 for (i = 0, j = 0; j < n_max; ++j) { |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1670 if (placeholder[counter][j] != -1) { |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1671 int lines = first[placeholder[counter][j]].lines; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1672 for (ls = 0; ls < lines; ++ls) { |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1673 second[sub_num].text[i++] = strdup(first[placeholder[counter][j]].text[ls]); |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1674 } |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1675 j += lines - 1; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1676 } else { |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1677 second[sub_num].text[i++] = strdup(" "); |
7983
8344414c59cf
This patch is to add support for overlapping subtitles, that is
arpi
parents:
7982
diff
changeset
|
1678 } |
8344414c59cf
This patch is to add support for overlapping subtitles, that is
arpi
parents:
7982
diff
changeset
|
1679 } |
8344414c59cf
This patch is to add support for overlapping subtitles, that is
arpi
parents:
7982
diff
changeset
|
1680 ++sub_num; |
8882
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1681 ++counter; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1682 } while (local_end < global_end); |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1683 if (real_block) |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1684 for (i = 0; i < counter; ++i) |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1685 second[start_block_sub + i].lines = higher_line + 1; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1686 |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1687 counter = 2 * sub_to_add + 1; |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1688 for (i = 0; i < counter; ++i) { |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1689 free(placeholder[i]); |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1690 } |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1691 free(placeholder); |
1c44c46ed57f
Overlapping subs are a feature mainly present in subtitling
arpi
parents:
8862
diff
changeset
|
1692 sub_first += sub_to_add; |
7983
8344414c59cf
This patch is to add support for overlapping subtitles, that is
arpi
parents:
7982
diff
changeset
|
1693 } |
8344414c59cf
This patch is to add support for overlapping subtitles, that is
arpi
parents:
7982
diff
changeset
|
1694 |
8734 | 1695 for (j = sub_orig - 1; j >= 0; --j) { |
1696 for (i = first[j].lines - 1; i >= 0; --i) { | |
7983
8344414c59cf
This patch is to add support for overlapping subtitles, that is
arpi
parents:
7982
diff
changeset
|
1697 free(first[j].text[i]); |
8344414c59cf
This patch is to add support for overlapping subtitles, that is
arpi
parents:
7982
diff
changeset
|
1698 } |
8344414c59cf
This patch is to add support for overlapping subtitles, that is
arpi
parents:
7982
diff
changeset
|
1699 } |
8785 | 1700 free(first); |
7983
8344414c59cf
This patch is to add support for overlapping subtitles, that is
arpi
parents:
7982
diff
changeset
|
1701 |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1702 return_sub = second; |
8361
2202c00001e3
overlapping subtitles support is now optional, can be disabled (-nooverlapsub)
arpi
parents:
8360
diff
changeset
|
1703 } else { //if(suboverlap_enabled) |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1704 adjust_subs_time(first, 6.0, fps, 1, sub_num, uses_time);/*~6 secs AST*/ |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1705 return_sub = first; |
8361
2202c00001e3
overlapping subtitles support is now optional, can be disabled (-nooverlapsub)
arpi
parents:
8360
diff
changeset
|
1706 } |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1707 if (return_sub == NULL) return NULL; |
18869 | 1708 subt_data = malloc(sizeof(sub_data)); |
15603
2d1ad16b6021
strdup subtitle filename at a more appropriate place, fixing memleaks and
reimar
parents:
15562
diff
changeset
|
1709 subt_data->filename = strdup(filename); |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1710 subt_data->sub_uses_time = uses_time; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1711 subt_data->sub_num = sub_num; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1712 subt_data->sub_errs = sub_errs; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1713 subt_data->subtitles = return_sub; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1714 return subt_data; |
258 | 1715 } |
1716 | |
892 | 1717 #if 0 |
509 | 1718 char * strreplace( char * in,char * what,char * whereof ) |
1719 { | |
1720 int i; | |
1721 char * tmp; | |
1722 | |
1723 if ( ( in == NULL )||( what == NULL )||( whereof == NULL )||( ( tmp=strstr( in,what ) ) == NULL ) ) return NULL; | |
1724 for( i=0;i<strlen( whereof );i++ ) tmp[i]=whereof[i]; | |
1725 if ( strlen( what ) > strlen( whereof ) ) tmp[i]=0; | |
1726 return in; | |
1727 } | |
892 | 1728 #endif |
509 | 1729 |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1730 |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1731 static void strcpy_trim(char *d, char *s) |
509 | 1732 { |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1733 // skip leading whitespace |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1734 while (*s && !isalnum(*s)) { |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1735 s++; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1736 } |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1737 for (;;) { |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1738 // copy word |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1739 while (*s && isalnum(*s)) { |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1740 *d = tolower(*s); |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1741 s++; d++; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1742 } |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1743 if (*s == 0) break; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1744 // trim excess whitespace |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1745 while (*s && !isalnum(*s)) { |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1746 s++; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1747 } |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1748 if (*s == 0) break; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1749 *d++ = ' '; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1750 } |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1751 *d = 0; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1752 } |
892 | 1753 |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1754 static void strcpy_strip_ext(char *d, char *s) |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1755 { |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1756 char *tmp = strrchr(s,'.'); |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1757 if (!tmp) { |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1758 strcpy(d, s); |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1759 return; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1760 } else { |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1761 strncpy(d, s, tmp-s); |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1762 d[tmp-s] = 0; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1763 } |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1764 while (*d) { |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1765 *d = tolower(*d); |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1766 d++; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1767 } |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1768 } |
892 | 1769 |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1770 static void strcpy_get_ext(char *d, char *s) |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1771 { |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1772 char *tmp = strrchr(s,'.'); |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1773 if (!tmp) { |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1774 strcpy(d, ""); |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1775 return; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1776 } else { |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1777 strcpy(d, tmp+1); |
892 | 1778 } |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1779 } |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1780 |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1781 static int whiteonly(char *s) |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1782 { |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1783 while (*s) { |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1784 if (isalnum(*s)) return 0; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1785 s++; |
509 | 1786 } |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1787 return 1; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1788 } |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1789 |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1790 typedef struct _subfn |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1791 { |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1792 int priority; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1793 char *fname; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1794 } subfn; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1795 |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1796 static int compare_sub_priority(const void *a, const void *b) |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1797 { |
19198
b137cea2650e
corrects some casts that previously discarded the const qualifier. Patch by Stefan Huehner, stefan AT Huehner-org
reynaldo
parents:
19066
diff
changeset
|
1798 if (((const subfn*)a)->priority > ((const subfn*)b)->priority) { |
9895 | 1799 return -1; |
19198
b137cea2650e
corrects some casts that previously discarded the const qualifier. Patch by Stefan Huehner, stefan AT Huehner-org
reynaldo
parents:
19066
diff
changeset
|
1800 } else if (((const subfn*)a)->priority < ((const subfn*)b)->priority) { |
9895 | 1801 return 1; |
1802 } else { | |
19198
b137cea2650e
corrects some casts that previously discarded the const qualifier. Patch by Stefan Huehner, stefan AT Huehner-org
reynaldo
parents:
19066
diff
changeset
|
1803 return strcoll(((const subfn*)a)->fname, ((const subfn*)b)->fname); |
9895 | 1804 } |
509 | 1805 } |
1806 | |
18980
ed69754aa58d
Marks several string parameters as const when they are not modified in the function, Patch by Stefan Huehner, stefan AT huehner-org
reynaldo
parents:
18936
diff
changeset
|
1807 char** sub_filenames(const char* path, char *fname) |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1808 { |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1809 char *f_dir, *f_fname, *f_fname_noext, *f_fname_trim, *tmp, *tmp_sub_id; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1810 char *tmp_fname_noext, *tmp_fname_trim, *tmp_fname_ext, *tmpresult; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1811 |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1812 int len, pos, found, i, j; |
10801
6c56b4aff706
Jacosub files can have the extension '.js' too. Patch by Vladimir Mosgalin <mosgalin@VM10124.spb.edu>
alex
parents:
10692
diff
changeset
|
1813 char * sub_exts[] = { "utf", "utf8", "utf-8", "sub", "srt", "smi", "rt", "txt", "ssa", "aqt", "jss", "js", "ass", NULL}; |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1814 subfn *result; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1815 char **result2; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1816 |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1817 int subcnt; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1818 |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1819 FILE *f; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1820 |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1821 DIR *d; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1822 struct dirent *de; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1823 |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1824 len = (strlen(fname) > 256 ? strlen(fname) : 256) |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1825 +(strlen(path) > 256 ? strlen(path) : 256)+2; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1826 |
18869 | 1827 f_dir = malloc(len); |
1828 f_fname = malloc(len); | |
1829 f_fname_noext = malloc(len); | |
1830 f_fname_trim = malloc(len); | |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1831 |
18869 | 1832 tmp_fname_noext = malloc(len); |
1833 tmp_fname_trim = malloc(len); | |
1834 tmp_fname_ext = malloc(len); | |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1835 |
18869 | 1836 tmpresult = malloc(len); |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1837 |
18869 | 1838 result = malloc(sizeof(subfn)*MAX_SUBTITLE_FILES); |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1839 memset(result, 0, sizeof(subfn)*MAX_SUBTITLE_FILES); |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1840 |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1841 subcnt = 0; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1842 |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1843 tmp = strrchr(fname,'/'); |
11062 | 1844 #ifdef WIN32 |
1845 if(!tmp)tmp = strrchr(fname,'\\'); | |
1846 #endif | |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1847 |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1848 // extract filename & dirname from fname |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1849 if (tmp) { |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1850 strcpy(f_fname, tmp+1); |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1851 pos = tmp - fname; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1852 strncpy(f_dir, fname, pos+1); |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1853 f_dir[pos+1] = 0; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1854 } else { |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1855 strcpy(f_fname, fname); |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1856 strcpy(f_dir, "./"); |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1857 } |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1858 |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1859 strcpy_strip_ext(f_fname_noext, f_fname); |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1860 strcpy_trim(f_fname_trim, f_fname_noext); |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1861 |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1862 tmp_sub_id = NULL; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1863 if (dvdsub_lang && !whiteonly(dvdsub_lang)) { |
18869 | 1864 tmp_sub_id = malloc(strlen(dvdsub_lang)+1); |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1865 strcpy_trim(tmp_sub_id, dvdsub_lang); |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1866 } |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1867 |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1868 // 0 = nothing |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1869 // 1 = any subtitle file |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1870 // 2 = any sub file containing movie name |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1871 // 3 = sub file containing movie name and the lang extension |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1872 for (j = 0; j <= 1; j++) { |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1873 d = opendir(j == 0 ? f_dir : path); |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1874 if (d) { |
10236 | 1875 while ((de = readdir(d))) { |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1876 // retrieve various parts of the filename |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1877 strcpy_strip_ext(tmp_fname_noext, de->d_name); |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1878 strcpy_get_ext(tmp_fname_ext, de->d_name); |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1879 strcpy_trim(tmp_fname_trim, tmp_fname_noext); |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1880 |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1881 // does it end with a subtitle extension? |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1882 found = 0; |
9872 | 1883 #ifdef USE_ICONV |
12443 | 1884 #ifdef HAVE_ENCA |
1885 for (i = ((sub_cp && strncasecmp(sub_cp, "enca", 4) != 0) ? 3 : 0); sub_exts[i]; i++) { | |
1886 #else | |
10340
2eaabacd1429
prefer UTF-8 encoding subs and automatically recognize them by suffix
atlka
parents:
10336
diff
changeset
|
1887 for (i = (sub_cp ? 3 : 0); sub_exts[i]; i++) { |
12443 | 1888 #endif |
9872 | 1889 #else |
1890 for (i = 0; sub_exts[i]; i++) { | |
1891 #endif | |
13229
b1e482fcd919
subtitle autodetection regardles of case (bug #65), patches Michal Svec <rebel at atrey.karlin.mff.cuni.cz> and Reynaldo H. Verdejo Pinochet <reynaldo at opendot.cl>
faust3
parents:
12909
diff
changeset
|
1892 if (strcasecmp(sub_exts[i], tmp_fname_ext) == 0) { |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1893 found = 1; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1894 break; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1895 } |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1896 } |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1897 |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1898 // we have a (likely) subtitle file |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1899 if (found) { |
9895 | 1900 int prio = 0; |
10551 | 1901 if (!prio && tmp_sub_id) |
10486
f3540688a9ec
fix against dummy solaris sprintf, bug reported by Gotz Waschk
alex
parents:
10450
diff
changeset
|
1902 { |
10551 | 1903 sprintf(tmpresult, "%s %s", f_fname_trim, tmp_sub_id); |
18212
996db4c000d7
Part 4 of otvos attila's oattila AT chello-hu mp_msg changes, no modifications this time
reynaldo
parents:
18045
diff
changeset
|
1904 mp_msg(MSGT_SUBREADER,MSGL_INFO,"dvdsublang...%s\n", tmpresult); |
10551 | 1905 if (strcmp(tmp_fname_trim, tmpresult) == 0 && sub_match_fuzziness >= 1) { |
1906 // matches the movie name + lang extension | |
1907 prio = 5; | |
1908 } | |
1909 } | |
1910 if (!prio && strcmp(tmp_fname_trim, f_fname_trim) == 0) { | |
9895 | 1911 // matches the movie name |
1912 prio = 4; | |
10551 | 1913 } |
1914 if (!prio && (tmp = strstr(tmp_fname_trim, f_fname_trim)) && (sub_match_fuzziness >= 1)) { | |
9895 | 1915 // contains the movie name |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1916 tmp += strlen(f_fname_trim); |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1917 if (tmp_sub_id && strstr(tmp, tmp_sub_id)) { |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1918 // with sub_id specified prefer localized subtitles |
9895 | 1919 prio = 3; |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1920 } else if ((tmp_sub_id == NULL) && whiteonly(tmp)) { |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1921 // without sub_id prefer "plain" name |
9895 | 1922 prio = 3; |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1923 } else { |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1924 // with no localized subs found, try any else instead |
9895 | 1925 prio = 2; |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1926 } |
10551 | 1927 } |
1928 if (!prio) { | |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1929 // doesn't contain the movie name |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1930 // don't try in the mplayer subtitle directory |
9893 | 1931 if ((j == 0) && (sub_match_fuzziness >= 2)) { |
9895 | 1932 prio = 1; |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1933 } |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1934 } |
9895 | 1935 |
1936 if (prio) { | |
10340
2eaabacd1429
prefer UTF-8 encoding subs and automatically recognize them by suffix
atlka
parents:
10336
diff
changeset
|
1937 prio += prio; |
10494
db0bc96da95f
1, micro-speedup 2, fixed 10l: only prefer utf8 if iconv is present
alex
parents:
10486
diff
changeset
|
1938 #ifdef USE_ICONV |
10932 | 1939 if (i<3){ // prefer UTF-8 coded |
10340
2eaabacd1429
prefer UTF-8 encoding subs and automatically recognize them by suffix
atlka
parents:
10336
diff
changeset
|
1940 prio++; |
10929 | 1941 } |
10494
db0bc96da95f
1, micro-speedup 2, fixed 10l: only prefer utf8 if iconv is present
alex
parents:
10486
diff
changeset
|
1942 #endif |
10336 | 1943 sprintf(tmpresult, "%s%s", j == 0 ? f_dir : path, de->d_name); |
9895 | 1944 // fprintf(stderr, "%s priority %d\n", tmpresult, prio); |
1945 if ((f = fopen(tmpresult, "rt"))) { | |
1946 fclose(f); | |
1947 result[subcnt].priority = prio; | |
1948 result[subcnt].fname = strdup(tmpresult); | |
1949 subcnt++; | |
1950 } | |
1951 } | |
1952 | |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1953 } |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1954 if (subcnt >= MAX_SUBTITLE_FILES) break; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1955 } |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1956 closedir(d); |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1957 } |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1958 |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1959 } |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1960 |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1961 if (tmp_sub_id) free(tmp_sub_id); |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1962 |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1963 free(f_dir); |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1964 free(f_fname); |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1965 free(f_fname_noext); |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1966 free(f_fname_trim); |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1967 |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1968 free(tmp_fname_noext); |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1969 free(tmp_fname_trim); |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1970 free(tmp_fname_ext); |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1971 |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1972 free(tmpresult); |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1973 |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1974 qsort(result, subcnt, sizeof(subfn), compare_sub_priority); |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1975 |
18869 | 1976 result2 = malloc(sizeof(char*)*(subcnt+1)); |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1977 memset(result2, 0, sizeof(char*)*(subcnt+1)); |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1978 |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1979 for (i = 0; i < subcnt; i++) { |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1980 result2[i] = result[i].fname; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1981 } |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1982 result2[subcnt] = NULL; |
10220 | 1983 |
1984 free(result); | |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1985 |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1986 return result2; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1987 } |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1988 |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1989 void list_sub_file(sub_data* subd){ |
1761 | 1990 int i,j; |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1991 subtitle *subs = subd->subtitles; |
1761 | 1992 |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
1993 for(j=0; j < subd->sub_num; j++){ |
1761 | 1994 subtitle* egysub=&subs[j]; |
18212
996db4c000d7
Part 4 of otvos attila's oattila AT chello-hu mp_msg changes, no modifications this time
reynaldo
parents:
18045
diff
changeset
|
1995 mp_msg(MSGT_SUBREADER,MSGL_INFO,"%i line%c (%li-%li)\n", |
1761 | 1996 egysub->lines, |
1997 (1==egysub->lines)?' ':'s', | |
1998 egysub->start, | |
1999 egysub->end); | |
2000 for (i=0; i<egysub->lines; i++) { | |
18212
996db4c000d7
Part 4 of otvos attila's oattila AT chello-hu mp_msg changes, no modifications this time
reynaldo
parents:
18045
diff
changeset
|
2001 mp_msg(MSGT_SUBREADER,MSGL_INFO,"\t\t%d: %s%s", i,egysub->text[i], i==egysub->lines-1?"":" \n "); |
1761 | 2002 } |
18212
996db4c000d7
Part 4 of otvos attila's oattila AT chello-hu mp_msg changes, no modifications this time
reynaldo
parents:
18045
diff
changeset
|
2003 mp_msg(MSGT_SUBREADER,MSGL_INFO,"\n"); |
1761 | 2004 } |
2005 | |
18212
996db4c000d7
Part 4 of otvos attila's oattila AT chello-hu mp_msg changes, no modifications this time
reynaldo
parents:
18045
diff
changeset
|
2006 mp_msg(MSGT_SUBREADER,MSGL_INFO,"Subtitle format %s time.\n", |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2007 subd->sub_uses_time ? "uses":"doesn't use"); |
18212
996db4c000d7
Part 4 of otvos attila's oattila AT chello-hu mp_msg changes, no modifications this time
reynaldo
parents:
18045
diff
changeset
|
2008 mp_msg(MSGT_SUBREADER,MSGL_INFO,"Read %i subtitles, %i errors.\n", subd->sub_num, subd->sub_errs); |
1761 | 2009 } |
6208 | 2010 |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2011 void dump_srt(sub_data* subd, float fps){ |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2012 int i,j; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2013 int h,m,s,ms; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2014 FILE * fd; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2015 subtitle * onesub; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2016 unsigned long temp; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2017 subtitle *subs = subd->subtitles; |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2018 |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2019 if (!subd->sub_uses_time && sub_fps == 0) |
6792 | 2020 sub_fps = fps; |
6208 | 2021 fd=fopen("dumpsub.srt","w"); |
2022 if(!fd) | |
2023 { | |
2024 perror("dump_srt: fopen"); | |
2025 return; | |
2026 } | |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2027 for(i=0; i < subd->sub_num; i++) |
6208 | 2028 { |
2029 onesub=subs+i; //=&subs[i]; | |
2030 fprintf(fd,"%d\n",i+1);//line number | |
2031 | |
2032 temp=onesub->start; | |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2033 if (!subd->sub_uses_time) |
6792 | 2034 temp = temp * 100 / sub_fps; |
2035 temp -= sub_delay * 100; | |
6208 | 2036 h=temp/360000;temp%=360000; //h =1*100*60*60 |
2037 m=temp/6000; temp%=6000; //m =1*100*60 | |
2038 s=temp/100; temp%=100; //s =1*100 | |
6792 | 2039 ms=temp*10; //ms=1*10 |
6208 | 2040 fprintf(fd,"%02d:%02d:%02d,%03d --> ",h,m,s,ms); |
2041 | |
2042 temp=onesub->end; | |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2043 if (!subd->sub_uses_time) |
6792 | 2044 temp = temp * 100 / sub_fps; |
2045 temp -= sub_delay * 100; | |
6208 | 2046 h=temp/360000;temp%=360000; |
2047 m=temp/6000; temp%=6000; | |
2048 s=temp/100; temp%=100; | |
6792 | 2049 ms=temp*10; |
6208 | 2050 fprintf(fd,"%02d:%02d:%02d,%03d\n",h,m,s,ms); |
2051 | |
2052 for(j=0;j<onesub->lines;j++) | |
2053 fprintf(fd,"%s\n",onesub->text[j]); | |
2054 | |
2055 fprintf(fd,"\n"); | |
2056 } | |
2057 fclose(fd); | |
6296 | 2058 mp_msg(MSGT_SUBREADER,MSGL_INFO,"SUB: Subtitles dumped in \'dumpsub.srt\'.\n"); |
6208 | 2059 } |
1761 | 2060 |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2061 void dump_mpsub(sub_data* subd, float fps){ |
2178 | 2062 int i,j; |
2063 FILE *fd; | |
2064 float a,b; | |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2065 subtitle *subs = subd->subtitles; |
2178 | 2066 |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2067 mpsub_position = subd->sub_uses_time? (sub_delay*100) : (sub_delay*fps); |
4886 | 2068 if (sub_fps==0) sub_fps=fps; |
2178 | 2069 |
2070 fd=fopen ("dump.mpsub", "w"); | |
2071 if (!fd) { | |
2072 perror ("dump_mpsub: fopen"); | |
2073 return; | |
2074 } | |
2075 | |
2076 | |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2077 if (subd->sub_uses_time) fprintf (fd,"FORMAT=TIME\n\n"); |
4064
3c747168eb6e
1. subs know are readed after reading AVI header so we already know fps
atlka
parents:
4052
diff
changeset
|
2078 else fprintf (fd, "FORMAT=%5.2f\n\n", fps); |
2178 | 2079 |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2080 for(j=0; j < subd->sub_num; j++){ |
2495 | 2081 subtitle* egysub=&subs[j]; |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2082 if (subd->sub_uses_time) { |
2495 | 2083 a=((egysub->start-mpsub_position)/100.0); |
2084 b=((egysub->end-egysub->start)/100.0); | |
2085 if ( (float)((int)a) == a) | |
2086 fprintf (fd, "%.0f",a); | |
2087 else | |
2088 fprintf (fd, "%.2f",a); | |
2089 | |
2090 if ( (float)((int)b) == b) | |
2091 fprintf (fd, " %.0f\n",b); | |
2092 else | |
2093 fprintf (fd, " %.2f\n",b); | |
2094 } else { | |
4886 | 2095 fprintf (fd, "%ld %ld\n", (long)((egysub->start*(fps/sub_fps))-((mpsub_position*(fps/sub_fps)))), |
2096 (long)(((egysub->end)-(egysub->start))*(fps/sub_fps))); | |
2495 | 2097 } |
2098 | |
2099 mpsub_position = egysub->end; | |
2100 for (i=0; i<egysub->lines; i++) { | |
2101 fprintf (fd, "%s\n",egysub->text[i]); | |
2102 } | |
2103 fprintf (fd, "\n"); | |
2178 | 2104 } |
2105 fclose (fd); | |
6296 | 2106 mp_msg(MSGT_SUBREADER,MSGL_INFO,"SUB: Subtitles dumped in \'dump.mpsub\'.\n"); |
2178 | 2107 } |
2108 | |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2109 void dump_microdvd(sub_data* subd, float fps) { |
7460 | 2110 int i, delay; |
2111 FILE *fd; | |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2112 subtitle *subs = subd->subtitles; |
7460 | 2113 if (sub_fps == 0) |
2114 sub_fps = fps; | |
18045
452996e2628c
Acording to manpage -dumpmicrodvdsub dumps to dumpsub.sub not dumpsub.txt
reynaldo
parents:
17885
diff
changeset
|
2115 fd = fopen("dumpsub.sub", "w"); |
7460 | 2116 if (!fd) { |
18045
452996e2628c
Acording to manpage -dumpmicrodvdsub dumps to dumpsub.sub not dumpsub.txt
reynaldo
parents:
17885
diff
changeset
|
2117 perror("dumpsub.sub: fopen"); |
7460 | 2118 return; |
2119 } | |
2120 delay = sub_delay * sub_fps; | |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2121 for (i = 0; i < subd->sub_num; ++i) { |
7460 | 2122 int j, start, end; |
2123 start = subs[i].start; | |
2124 end = subs[i].end; | |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2125 if (subd->sub_uses_time) { |
7460 | 2126 start = start * sub_fps / 100 ; |
2127 end = end * sub_fps / 100; | |
2128 } | |
2129 else { | |
2130 start = start * sub_fps / fps; | |
2131 end = end * sub_fps / fps; | |
2132 } | |
2133 start -= delay; | |
2134 end -= delay; | |
2135 fprintf(fd, "{%d}{%d}", start, end); | |
2136 for (j = 0; j < subs[i].lines; ++j) | |
2137 fprintf(fd, "%s%s", j ? "|" : "", subs[i].text[j]); | |
2138 fprintf(fd, "\n"); | |
2139 } | |
2140 fclose(fd); | |
18045
452996e2628c
Acording to manpage -dumpmicrodvdsub dumps to dumpsub.sub not dumpsub.txt
reynaldo
parents:
17885
diff
changeset
|
2141 mp_msg(MSGT_SUBREADER,MSGL_INFO,"SUB: Subtitles dumped in \'dumpsub.sub\'.\n"); |
7460 | 2142 } |
2143 | |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2144 void dump_jacosub(sub_data* subd, float fps) { |
8360 | 2145 int i,j; |
2146 int h,m,s,cs; | |
2147 FILE * fd; | |
2148 subtitle * onesub; | |
2149 unsigned long temp; | |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2150 subtitle *subs = subd->subtitles; |
8360 | 2151 |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2152 if (!subd->sub_uses_time && sub_fps == 0) |
8360 | 2153 sub_fps = fps; |
8862
356534b9e7d4
Since version 2.7 the file extension for JACOsub changed from
arpi
parents:
8789
diff
changeset
|
2154 fd=fopen("dumpsub.jss","w"); |
8360 | 2155 if(!fd) |
2156 { | |
2157 perror("dump_jacosub: fopen"); | |
2158 return; | |
2159 } | |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2160 fprintf(fd, "#TIMERES %d\n", (subd->sub_uses_time) ? 100 : (int)sub_fps); |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2161 for(i=0; i < subd->sub_num; i++) |
8360 | 2162 { |
2163 onesub=subs+i; //=&subs[i]; | |
2164 | |
2165 temp=onesub->start; | |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2166 if (!subd->sub_uses_time) |
8360 | 2167 temp = temp * 100 / sub_fps; |
2168 temp -= sub_delay * 100; | |
2169 h=temp/360000;temp%=360000; //h =1*100*60*60 | |
2170 m=temp/6000; temp%=6000; //m =1*100*60 | |
2171 s=temp/100; temp%=100; //s =1*100 | |
2172 cs=temp; //cs=1*10 | |
2173 fprintf(fd,"%02d:%02d:%02d.%02d ",h,m,s,cs); | |
2174 | |
2175 temp=onesub->end; | |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2176 if (!subd->sub_uses_time) |
8360 | 2177 temp = temp * 100 / sub_fps; |
2178 temp -= sub_delay * 100; | |
2179 h=temp/360000;temp%=360000; | |
2180 m=temp/6000; temp%=6000; | |
2181 s=temp/100; temp%=100; | |
2182 cs=temp; | |
2183 fprintf(fd,"%02d:%02d:%02d.%02d {~} ",h,m,s,cs); | |
2184 | |
2185 for(j=0;j<onesub->lines;j++) | |
2186 fprintf(fd,"%s%s",j ? "\\n" : "", onesub->text[j]); | |
2187 | |
2188 fprintf(fd,"\n"); | |
2189 } | |
2190 fclose(fd); | |
2191 mp_msg(MSGT_SUBREADER,MSGL_INFO,"SUB: Subtitles dumped in \'dumpsub.js\'.\n"); | |
2192 } | |
2193 | |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2194 void dump_sami(sub_data* subd, float fps) { |
8363 | 2195 int i,j; |
2196 FILE * fd; | |
2197 subtitle * onesub; | |
2198 unsigned long temp; | |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2199 subtitle *subs = subd->subtitles; |
8363 | 2200 |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2201 if (!subd->sub_uses_time && sub_fps == 0) |
8363 | 2202 sub_fps = fps; |
2203 fd=fopen("dumpsub.smi","w"); | |
2204 if(!fd) | |
2205 { | |
2206 perror("dump_jacosub: fopen"); | |
2207 return; | |
2208 } | |
2209 fprintf(fd, "<SAMI>\n" | |
2210 "<HEAD>\n" | |
2211 " <STYLE TYPE=\"Text/css\">\n" | |
2212 " <!--\n" | |
2213 " P {margin-left: 29pt; margin-right: 29pt; font-size: 24pt; text-align: center; font-family: Tahoma; font-weight: bold; color: #FCDD03; background-color: #000000;}\n" | |
2214 " .SUBTTL {Name: 'Subtitles'; Lang: en-US; SAMIType: CC;}\n" | |
2215 " -->\n" | |
2216 " </STYLE>\n" | |
2217 "</HEAD>\n" | |
2218 "<BODY>\n"); | |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2219 for(i=0; i < subd->sub_num; i++) |
8363 | 2220 { |
2221 onesub=subs+i; //=&subs[i]; | |
2222 | |
2223 temp=onesub->start; | |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2224 if (!subd->sub_uses_time) |
8363 | 2225 temp = temp * 100 / sub_fps; |
2226 temp -= sub_delay * 100; | |
2227 fprintf(fd,"\t<SYNC Start=%lu>\n" | |
2228 "\t <P>", temp * 10); | |
2229 | |
2230 for(j=0;j<onesub->lines;j++) | |
2231 fprintf(fd,"%s%s",j ? "<br>" : "", onesub->text[j]); | |
2232 | |
2233 fprintf(fd,"\n"); | |
2234 | |
2235 temp=onesub->end; | |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2236 if (!subd->sub_uses_time) |
8363 | 2237 temp = temp * 100 / sub_fps; |
2238 temp -= sub_delay * 100; | |
2239 fprintf(fd,"\t<SYNC Start=%lu>\n" | |
2240 "\t <P> \n", temp * 10); | |
2241 } | |
2242 fprintf(fd, "</BODY>\n" | |
2243 "</SAMI>\n"); | |
2244 fclose(fd); | |
2245 mp_msg(MSGT_SUBREADER,MSGL_INFO,"SUB: Subtitles dumped in \'dumpsub.smi\'.\n"); | |
2246 } | |
2247 | |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2248 void sub_free( sub_data * subd ) |
3543 | 2249 { |
2250 int i; | |
2251 | |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2252 if ( !subd ) return; |
3543 | 2253 |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2254 if (subd->subtitles) { |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2255 for (i=0; i < subd->subtitles->lines; i++) free( subd->subtitles->text[i] ); |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2256 free( subd->subtitles ); |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2257 } |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2258 if (subd->filename) free( subd->filename ); |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2259 free( subd ); |
3543 | 2260 } |
2178 | 2261 |
21827
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2262 #define MAX_SUBLINE 512 |
21833 | 2263 /** |
2264 * \brief parse text and append it to subtitle in sub | |
2265 * \param sub subtitle struct to add text to | |
2266 * \param txt text to parse | |
2267 * \param len length of text in txt | |
2268 * \param endpts pts at which this subtitle text should be removed again | |
2269 * | |
2270 * <> and {} are interpreted as comment delimiters, "\n", "\N", '\n', '\r' | |
2271 * and '\0' are interpreted as newlines, duplicate, leading and trailing | |
2272 * newlines are ignored. | |
2273 */ | |
21827
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2274 void sub_add_text(subtitle *sub, const char *txt, int len, double endpts) { |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2275 int comment = 0; |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2276 int double_newline = 1; // ignore newlines at the beginning |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2277 int i, pos; |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2278 char *buf; |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2279 if (sub->lines >= SUB_MAX_TEXT) return; |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2280 pos = 0; |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2281 buf = malloc(MAX_SUBLINE + 1); |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2282 sub->text[sub->lines] = buf; |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2283 sub->endpts[sub->lines] = endpts; |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2284 for (i = 0; i < len && pos < MAX_SUBLINE; i++) { |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2285 char c = txt[i]; |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2286 if (c == '<') comment |= 1; |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2287 if (c == '{') comment |= 2; |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2288 if (comment) { |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2289 if (c == '}') comment &= ~2; |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2290 if (c == '>') comment &= ~1; |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2291 continue; |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2292 } |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2293 if (pos == MAX_SUBLINE - 1) { |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2294 i--; |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2295 c = 0; |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2296 } |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2297 if (c == '\\' && i + 1 < len) { |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2298 c = txt[++i]; |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2299 if (c == 'n' || c == 'N') c = 0; |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2300 } |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2301 if (c == '\n' || c == '\r') c = 0; |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2302 if (c) { |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2303 double_newline = 0; |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2304 buf[pos++] = c; |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2305 } else if (!double_newline) { |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2306 if (sub->lines >= SUB_MAX_TEXT - 1) { |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2307 mp_msg(MSGT_VO, MSGL_WARN, "Too many subtitle lines\n"); |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2308 break; |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2309 } |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2310 double_newline = 1; |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2311 buf[pos] = 0; |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2312 sub->lines++; |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2313 pos = 0; |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2314 buf = malloc(MAX_SUBLINE + 1); |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2315 sub->text[sub->lines] = buf; |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2316 sub->endpts[sub->lines] = endpts; |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2317 } |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2318 } |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2319 buf[pos] = 0; |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2320 if (sub->lines < SUB_MAX_TEXT && |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2321 strlen(sub->text[sub->lines])) |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2322 sub->lines++; |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2323 } |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2324 |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2325 #define MP_NOPTS_VALUE (-1LL<<63) |
21833 | 2326 /** |
2327 * \brief remove outdated subtitle lines. | |
2328 * \param sub subtitle struct to modify | |
2329 * \param pts current pts. All lines with endpts <= this will be removed. | |
2330 * Use MP_NOPTS_VALUE to remove all lines | |
2331 * \return 1 if sub was modified, 0 otherwise. | |
2332 */ | |
21827
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2333 int sub_clear_text(subtitle *sub, double pts) { |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2334 int i = 0; |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2335 int changed = 0; |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2336 while (i < sub->lines) { |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2337 double endpts = sub->endpts[i]; |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2338 if (pts == MP_NOPTS_VALUE || (endpts != MP_NOPTS_VALUE && pts >= endpts)) { |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2339 int j; |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2340 free(sub->text[i]); |
22141
ed81b9614148
Fix code updating subtitle array which only moved the text, not endpts.
uau
parents:
21939
diff
changeset
|
2341 for (j = i + 1; j < sub->lines; j++) { |
21827
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2342 sub->text[j - 1] = sub->text[j]; |
22141
ed81b9614148
Fix code updating subtitle array which only moved the text, not endpts.
uau
parents:
21939
diff
changeset
|
2343 sub->endpts[j - 1] = sub->endpts[j]; |
ed81b9614148
Fix code updating subtitle array which only moved the text, not endpts.
uau
parents:
21939
diff
changeset
|
2344 } |
21827
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2345 sub->lines--; |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2346 changed = 1; |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2347 } else |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2348 i++; |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2349 } |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2350 return changed; |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2351 } |
b0bc0d81f91b
Subtitle handling cleanup: factor out code for parsing embedded subtitles
reimar
parents:
20292
diff
changeset
|
2352 |
2449
7ef89d9b06ed
added DUMPSUBS recognition if we need compile only subreader.c alone
atlka
parents:
2358
diff
changeset
|
2353 #ifdef DUMPSUBS |
258 | 2354 int main(int argc, char **argv) { // for testing |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2355 sub_data *subd; |
258 | 2356 |
2357 if(argc<2){ | |
2358 printf("\nUsage: subreader filename.sub\n\n"); | |
2359 exit(1); | |
2360 } | |
2449
7ef89d9b06ed
added DUMPSUBS recognition if we need compile only subreader.c alone
atlka
parents:
2358
diff
changeset
|
2361 sub_cp = argv[2]; |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2362 subd = sub_read_file(argv[1]); |
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2363 if(!subd){ |
4886 | 2364 printf("Couldn't load file.\n"); |
258 | 2365 exit(1); |
2366 } | |
1761 | 2367 |
9870
09d630a4f991
support for multiple subtitle files by Marcin Wojdyr <wojdyr@unipress.waw.pl>
henry
parents:
9635
diff
changeset
|
2368 list_sub_file(subd); |
258 | 2369 |
2370 return 0; | |
2371 } | |
706
8a7666a78f83
better .smi support and display two-byte characters- patch by Sunjin Yang
arpi_esp
parents:
678
diff
changeset
|
2372 #endif |