summaryrefslogtreecommitdiffstats
path: root/subreader.c
diff options
context:
space:
mode:
authorarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-10-30 19:26:05 +0000
committerarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2002-10-30 19:26:05 +0000
commitd200725e8801ae1afb64f8a5c09f271fcc4d9653 (patch)
tree95dacbee15a813e6618a063dd35eb500e4b7a005 /subreader.c
parentb364822847622a1678b88fa0e5aa6d928d32fc10 (diff)
downloadmpv-d200725e8801ae1afb64f8a5c09f271fcc4d9653.tar.bz2
mpv-d200725e8801ae1afb64f8a5c09f271fcc4d9653.tar.xz
This patch is to add support for overlapping subtitles, that is
subtitles whose start or end happens during another subtitle. After reading the subtitles from the file in sub_read_file(), this patch looks for overlapping subtitles and split them into more non-overlapping subtitles. Salvatore Falco <sfalco@studenti.ing.uniroma1.it> git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@7984 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'subreader.c')
-rw-r--r--subreader.c108
1 files changed, 103 insertions, 5 deletions
diff --git a/subreader.c b/subreader.c
index a85401425c..c3c2a912eb 100644
--- a/subreader.c
+++ b/subreader.c
@@ -920,7 +920,7 @@ subtitle* subcp_recode (subtitle *sub)
#endif
-static void adjust_subs_time(subtitle* sub, float subtime, float fps){
+static void adjust_subs_time(subtitle* sub, float subtime, float fps, int block){
int n,m;
subtitle* nextsub;
int i = sub_num;
@@ -928,6 +928,7 @@ static void adjust_subs_time(subtitle* sub, float subtime, float fps){
n=m=0;
if (i) for (;;){
+ if (!block)
if (sub->end <= sub->start){
sub->end = sub->start + subfms;
m++;
@@ -935,6 +936,7 @@ static void adjust_subs_time(subtitle* sub, float subtime, float fps){
}
if (!--i) break;
nextsub = sub + 1;
+ if (block){
if (sub->end >= nextsub->start){
sub->end = nextsub->start - 1;
if (sub->end - sub->start > subfms)
@@ -957,6 +959,7 @@ static void adjust_subs_time(subtitle* sub, float subtime, float fps){
sub->start *= sub_fps/fps;
sub->end *= sub_fps/fps;
}
+ }
sub = nextsub;
m = 0;
@@ -966,8 +969,8 @@ static void adjust_subs_time(subtitle* sub, float subtime, float fps){
subtitle* sub_read_file (char *filename, float fps) {
FILE *fd;
- int n_max;
- subtitle *first;
+ int n_max, n_first, i, j, sub_first, sub_orig;
+ subtitle *first, *second;
char *fmtname[] = { "microdvd", "subrip", "subviewer", "sami", "vplayer",
"rt", "ssa", "dunnowhat", "mpsub", "aqt", "subviewer 2.0", "subrip 0.9", "jacosub" };
subtitle * (*func[])(FILE *fd,subtitle *dest)=
@@ -1036,8 +1039,103 @@ subtitle* sub_read_file (char *filename, float fps) {
return NULL;
}
- adjust_subs_time(first, 6.0, fps); /* ~6 secs AST */
- return first;
+ adjust_subs_time(first, 6.0, fps, 0); /* ~6 secs AST */
+
+// here we manage overlapping subtitles
+ sub_orig = sub_num;
+ n_first = sub_num;
+ n_max = 0;
+ sub_num = 0;
+ second = NULL;
+// for each subtitle in first[]
+ for (sub_first = 0; sub_first < n_first; ++sub_first) {
+ while (first[sub_first].start <= first[sub_first].end) {
+ unsigned long end_time = first[sub_first].end;
+ int lines_to_add = 0, sub_to_add, event, ls, lf;
+
+// there is a new subtitle, so let's make second[] bigger
+ n_max += 1;
+ second = realloc(second, n_max * sizeof(subtitle));
+ memset(&second[n_max - 1], '\0', sizeof(subtitle));
+
+// find the number of lines and subtitles that overlap the current subtitle
+ for (sub_to_add = 0;
+ (end_time > first[sub_first + sub_to_add + 1].start)
+ && (sub_first + sub_to_add + 1 < n_first); ++sub_to_add) {
+ lines_to_add += first[sub_first + sub_to_add + 1].lines;
+ }
+ if ((lines_to_add > 0)
+ && (first[sub_first].lines + lines_to_add <
+ SUB_MAX_TEXT)) {
+ unsigned long next;
+
+// find next beginning-of-a-subtitle time
+ next = first[sub_first].end + 1;
+ event = sub_first;
+ for (j = 0; j < lines_to_add; j++) {
+ if ((first[sub_first + j + 1].end + 1 < next)
+ && (first[sub_first + j + 1].end >=
+ first[sub_first].start)) {
+ event = sub_first + j + 1;
+ next = first[event].end + 1;
+ }
+ if ((first[sub_first + j + 1].start < next)
+ && (first[sub_first + j + 1].start >
+ first[sub_first].start)) {
+ event = sub_first + j + 1;
+ next = first[event].start;
+ }
+ }
+ second[sub_num].start = first[sub_first].start;
+ second[sub_num].end = next - 1;
+ second[sub_num].lines = first[sub_first].lines;
+ for (ls = 0, lf = 0; ls < second[sub_num].lines; ls++, lf++) {
+ second[sub_num].text[ls] =
+ strdup(first[sub_first].text[lf]);
+ }
+ for (j = 0; j < sub_to_add; j++) {
+ if ((first[sub_first + j + 1].start <=
+ second[sub_num].start)
+ && (first[sub_first + j + 1].end >=
+ second[sub_num].end)
+ && (second[sub_num].lines +
+ first[sub_first + j + 1].lines <=
+ SUB_MAX_TEXT)) {
+ for (lf = 0; lf < first[sub_first + j + 1].lines;
+ lf++, ls++)
+ second[sub_num].text[ls] =
+ strdup(first[sub_first + j + 1].text[lf]);
+ first[sub_first + j + 1].start = next;
+ } else
+ for (lf = 0; lf < first[sub_first + j + 1].lines;
+ lf++, ls++)
+ second[sub_num].text[ls] = strdup(" ");
+ second[sub_num].lines +=
+ first[sub_first + j + 1].lines;
+ }
+ first[sub_first].start = next;
+ } else {
+ second[sub_num].start = first[sub_first].start;
+ second[sub_num].end = first[sub_first].end;
+ second[sub_num].lines = first[sub_first].lines;
+ for (ls = 0; ls < second[sub_num].lines; ls++)
+ second[sub_num].text[ls] =
+ strdup(first[sub_first].text[ls]);
+ first[sub_first].start = first[sub_first].end + 1;
+ }
+ ++sub_num;
+ } // while
+ }
+ adjust_subs_time(second, 6.0, fps, 1); /* ~6 secs AST */
+
+ for (j = sub_orig - 1; j <= 0; --j) {
+ for (i = first[j].lines - 1; i <= 0; --i) {
+ free(first[j].text[i]);
+ }
+ free(&first[j]);
+ }
+
+ return second;
}
#if 0