mirror of
https://gitlab.com/mbunkus/mkvtoolnix.git
synced 2024-12-24 11:54:01 +00:00
Was not used anyway.
This commit is contained in:
parent
a8a6673418
commit
836d888534
@ -1,211 +0,0 @@
|
||||
/*
|
||||
ogmmerge -- utility for splicing together ogg bitstreams
|
||||
from component media subtypes
|
||||
|
||||
r_microdvd.cpp
|
||||
MicroDVD text subtitle reader module
|
||||
|
||||
Written by Moritz Bunkus <moritz@bunkus.org>
|
||||
Based on Xiph.org's 'oggmerge' found in their CVS repository
|
||||
See http://www.xiph.org
|
||||
|
||||
Distributed under the GPL
|
||||
see the file COPYING for details
|
||||
or visit http://www.gnu.org/copyleft/gpl.html
|
||||
*/
|
||||
|
||||
#include <ctype.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <ogg/ogg.h>
|
||||
|
||||
#include "ogmmerge.h"
|
||||
#include "ogmstreams.h"
|
||||
#include "r_microdvd.h"
|
||||
#include "subtitles.h"
|
||||
|
||||
int microdvd_reader_c::probe_file(mm_io_c *mm_io, int64_t size) {
|
||||
char chunk[2048];
|
||||
int i;
|
||||
|
||||
if (mm_io->setFilePointer(0, seek_beginning) != 0)
|
||||
return 0;
|
||||
if (fgets(chunk, 2047) == NULL)
|
||||
return 0;
|
||||
if ((chunk[0] != '{') || !isdigit(chunk[1]))
|
||||
return 0;
|
||||
i = 2;
|
||||
while (isdigit(chunk[i]))
|
||||
i++;
|
||||
if ((chunk[i] != '}') || (chunk[i + 1] != '{'))
|
||||
return 0;
|
||||
i += 2;
|
||||
while (isdigit(chunk[i]))
|
||||
i++;
|
||||
if ((chunk[i] != '}') || (chunk[i + 1] == 0) || (chunk[i + 1] == '\n') ||
|
||||
(chunk[i + 1] == '\r'))
|
||||
return 0;
|
||||
if (mm_io->setFilePointer(0, seek_beginning) != 0)
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
microdvd_reader_c::microdvd_reader_c(char *fname, audio_sync_t *nasync,
|
||||
char **ncomments) throw (error_c) {
|
||||
if ((file = fopen(fname, "r")) == NULL)
|
||||
throw error_c("microdvd_reader: Could not open source file.");
|
||||
if (!microdvd_reader_c::probe_file(0))
|
||||
throw error_c("microdvd_reader: Source is not a valid MicroDVD file.");
|
||||
textsubspacketizer = new textsubs_packetizer_c(nasync);
|
||||
if (verbose)
|
||||
mxprint(stdout, "Using MicroDVD subtitle reader for %s.\n+-> Using " \
|
||||
"text subtitle output module for subtitles.\n", fname);
|
||||
}
|
||||
|
||||
microdvd_reader_c::~microdvd_reader_c() {
|
||||
if (textsubspacketizer != NULL)
|
||||
delete textsubspacketizer;
|
||||
}
|
||||
|
||||
int microdvd_reader_c::read() {
|
||||
ogg_int64_t start, end;
|
||||
char *subtitles, *s, *s2;
|
||||
subtitles_c subs;
|
||||
int i, j, lineno;
|
||||
|
||||
if (video_fps < 0.0) {
|
||||
mxprint(stderr, "Error: microdvd_reader: You have to add a video source "
|
||||
"before a MicroDVD source. Otherwise the frame numbers cannot be "
|
||||
"converted to time stamps.");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
lineno = 0;
|
||||
while (1) {
|
||||
if (fgets(chunk, 2047) == NULL)
|
||||
break;
|
||||
|
||||
lineno++;
|
||||
|
||||
// {123}{4567}Some text|and even another line.
|
||||
|
||||
if ((chunk[0] == 0) || (strchr("\n\r", chunk[0]) != NULL))
|
||||
continue;
|
||||
if ((chunk[0] != '{') || !isdigit(chunk[1])) {
|
||||
mxprint(stdout, "microdvd_reader: Warning: Unrecognized line %d. "
|
||||
"Ignored.\n", lineno);
|
||||
continue;
|
||||
}
|
||||
i = 2;
|
||||
while (isdigit(chunk[i]))
|
||||
i++;
|
||||
if ((chunk[i] != '}') || (chunk[i + 1] != '{')) {
|
||||
mxprint(stdout, "microdvd_reader: Warning: Unrecognized line %d. "
|
||||
"Ignored.\n", lineno);
|
||||
continue;
|
||||
}
|
||||
chunk[i] = 0;
|
||||
start = strtol(&chunk[1], NULL, 10);
|
||||
if ((start < 0) || (errno != 0)) {
|
||||
mxprint(stdout, "microdvd_reader: Warning: Bad start frame '%s' on line "
|
||||
"%d. Ignored.\n", &chunk[1], lineno);
|
||||
continue;
|
||||
}
|
||||
i += 2;
|
||||
j = i;
|
||||
while (isdigit(chunk[i]))
|
||||
i++;
|
||||
if ((chunk[i] != '}') || (chunk[i + 1] == 0)) {
|
||||
mxprint(stdout, "microdvd_reader: Warning: Unrecognized line %d. "
|
||||
"Ignored.\n", lineno);
|
||||
continue;
|
||||
}
|
||||
if ((chunk[i + 1] == '\n') || (chunk[i + 1] == '\r'))
|
||||
continue;
|
||||
chunk[i] = 0;
|
||||
end = strtol(&chunk[j], NULL, 10);
|
||||
if ((end < 0) || (errno != 0)) {
|
||||
mxprint(stdout, "microdvd_reader: Warning: Bad end frame '%s' on line "
|
||||
"%d. Ignored.\n", &chunk[j], lineno);
|
||||
continue;
|
||||
}
|
||||
start = (ogg_int64_t)(start * 1000 / video_fps);
|
||||
end = (ogg_int64_t)(end * 1000 / video_fps);
|
||||
|
||||
subtitles = NULL;
|
||||
s = &chunk[i + 1];
|
||||
s2 = &s[strlen(s) - 1];
|
||||
while ((s2 != s) && ((*s2 == '\n') || (*s2 == '\r'))) {
|
||||
*s2 = 0;
|
||||
s2--;
|
||||
}
|
||||
if (*s == 0) {
|
||||
mxprint(stdout, "microdvd_reader: Warning: Unrecognized line %d. "
|
||||
"Ignored.\n", lineno);
|
||||
continue;
|
||||
}
|
||||
while (s != NULL) {
|
||||
s2 = strchr(s, '|');
|
||||
if (s2 != NULL)
|
||||
*s2 = 0;
|
||||
if (subtitles == NULL) {
|
||||
subtitles = safestrdup(s);
|
||||
} else {
|
||||
subtitles = (char *)saferealloc(subtitles, strlen(s) + 2 +
|
||||
strlen(subtitles));
|
||||
sprintf(&subtitles[strlen(subtitles)], "\n%s", s);
|
||||
}
|
||||
if (s2 != NULL)
|
||||
s = &s2[1];
|
||||
else
|
||||
s = NULL;
|
||||
}
|
||||
if (subtitles != NULL) {
|
||||
subs.add(start, end, subtitles);
|
||||
safefree(subtitles);
|
||||
subtitles = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if ((subs.check() != 0) && verbose)
|
||||
mxprint(stdout, "MicroDVD_reader: Warning: The subtitle file seems to be "
|
||||
"badly broken. The output file might not be playable "
|
||||
"correctly.\n");
|
||||
subs.process(textsubspacketizer);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int microdvd_reader_c::serial_in_use(int serial) {
|
||||
return textsubspacketizer->serial_in_use(serial);
|
||||
}
|
||||
|
||||
ogmmerge_page_t *microdvd_reader_c::get_header_page(int header_type) {
|
||||
return textsubspacketizer->get_header_page(header_type);
|
||||
}
|
||||
|
||||
ogmmerge_page_t *microdvd_reader_c::get_page() {
|
||||
return textsubspacketizer->get_page();
|
||||
}
|
||||
|
||||
int microdvd_reader_c::display_priority() {
|
||||
return DISPLAYPRIORITY_LOW;
|
||||
}
|
||||
|
||||
void microdvd_reader_c::reset() {
|
||||
if (textsubspacketizer != NULL)
|
||||
textsubspacketizer->reset();
|
||||
}
|
||||
|
||||
static char wchar[] = "-\\|/-\\|/-";
|
||||
|
||||
void microdvd_reader_c::display_progress() {
|
||||
mxprint(stdout, "working... %c\r", wchar[act_wchar]);
|
||||
act_wchar++;
|
||||
if (act_wchar == strlen(wchar))
|
||||
act_wchar = 0;
|
||||
fflush(stdout);
|
||||
}
|
Loading…
Reference in New Issue
Block a user