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