[Mplayer-cvslog] CVS: main subreader.c,1.74,1.75
Arpi of Ize
arpi at mplayerhq.hu
Wed Oct 30 20:26:08 CET 2002
- Previous message: [Mplayer-cvslog] CVS: main subreader.c,1.73,1.74 subreader.h,1.18,1.19
- Next message: [Mplayer-cvslog] CVS: main/postproc postprocess.c,1.66,1.67 postprocess_template.c,1.65,1.66 postprocess.h,1.27,1.28
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
Update of /cvsroot/mplayer/main
In directory mail:/var/tmp.root/cvs-serv14750
Modified Files:
subreader.c
Log Message:
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 at studenti.ing.uniroma1.it>
Index: subreader.c
===================================================================
RCS file: /cvsroot/mplayer/main/subreader.c,v
retrieving revision 1.74
retrieving revision 1.75
diff -u -r1.74 -r1.75
--- subreader.c 30 Oct 2002 19:16:58 -0000 1.74
+++ subreader.c 30 Oct 2002 19:26:05 -0000 1.75
@@ -920,7 +920,7 @@
#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 @@
n=m=0;
if (i) for (;;){
+ if (!block)
if (sub->end <= sub->start){
sub->end = sub->start + subfms;
m++;
@@ -935,6 +936,7 @@
}
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 @@
sub->start *= sub_fps/fps;
sub->end *= sub_fps/fps;
}
+ }
sub = nextsub;
m = 0;
@@ -966,8 +969,8 @@
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 @@
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
- Previous message: [Mplayer-cvslog] CVS: main subreader.c,1.73,1.74 subreader.h,1.18,1.19
- Next message: [Mplayer-cvslog] CVS: main/postproc postprocess.c,1.66,1.67 postprocess_template.c,1.65,1.66 postprocess.h,1.27,1.28
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
More information about the MPlayer-cvslog
mailing list