Merged 2182

This commit is contained in:
Moritz Bunkus 2004-09-17 20:29:12 +00:00
parent 92727d3e1c
commit 213bf82b26
4 changed files with 45 additions and 143 deletions

View File

@ -1,5 +1,10 @@
2004-09-17 Moritz Bunkus <moritz@bunkus.org>
* mkvmerge: bug fix: mkvmerge will show a nice warning if the
entries in a SRT have non-continuous timestamps. It'll also sort
the entries by their start timestamp instead of throwing the
generic "timecode < previous timecode" warning.
* mmg: bug fix: The 'Matroska file analysis' window that occurs
when reading chapters from a Matroska file did not disappear if it
was minimized when the process finished.

View File

@ -105,15 +105,17 @@ srt_reader_c::create_packetizer(int64_t) {
int
srt_reader_c::read(generic_packetizer_c *,
bool) {
int64_t start, end;
int64_t start, end, previous_start;
char *chunk;
subtitles_c subs;
string s, subtitles;
int state, i, line_number;
bool non_number_found;
bool non_number_found, timecode_warning_printed;
start = 0;
end = 0;
previous_start = 0;
timecode_warning_printed = false;
state = STATE_INITIAL;
line_number = 0;
subtitles = "";
@ -137,8 +139,8 @@ srt_reader_c::read(generic_packetizer_c *,
non_number_found = false;
for (i = 0; i < s.length(); i++)
if (!isdigit(s[i])) {
mxwarn("srt_reader: Error in line %d: expected subtitle number "
"and found some text.\n", line_number);
mxwarn(FMT_FN "Error in line %d: expected subtitle number "
"and found some text.\n", ti->fname, line_number);
non_number_found = true;
break;
}
@ -148,9 +150,9 @@ srt_reader_c::read(generic_packetizer_c *,
} else if (state == STATE_TIME) {
if ((s.length() < 29) || !issrttimecode(s.c_str())) {
mxwarn("srt_reader: Error in line %d: expected a SRT timecode "
mxwarn(FMT_FN "Error in line %d: expected a SRT timecode "
"line but found something else. Aborting this file.\n",
line_number);
ti->fname, line_number);
break;
}
@ -179,6 +181,15 @@ srt_reader_c::read(generic_packetizer_c *,
atol(&chunk[23]) * 1000 + atol(&chunk[26]);
end *= 1000000;
if (!timecode_warning_printed && (start < previous_start)) {
mxwarn(FMT_FN "Warning in line %d: The start timecode is smaller "
"than that of the previous entry. All entries from this file "
"will be sorted by their start time.\n", ti->fname,
line_number);
timecode_warning_printed = true;
}
previous_start = start;
safefree(chunk);
subtitles = "";
@ -212,6 +223,7 @@ srt_reader_c::read(generic_packetizer_c *,
subs.add(start, end, subtitles.c_str());
}
subs.sort();
subs.process((textsubs_packetizer_c *)PTZR0);
PTZR0->flush();

View File

@ -22,138 +22,15 @@
#include "common.h"
#include "subtitles.h"
subtitles_c::subtitles_c() {
first = NULL;
last = NULL;
}
subtitles_c::~subtitles_c() {
sub_t *current = first;
while (current != NULL) {
if (current->subs != NULL)
safefree(current->subs);
last = current;
current = current->next;
safefree(last);
}
}
void
subtitles_c::add(int64_t nstart,
int64_t nend,
const char *nsubs) {
sub_t *s;
s = (sub_t *)safemalloc(sizeof(sub_t));
s->subs = safestrdup(nsubs);
s->start = nstart;
s->end = nend;
s->next = NULL;
if (last == NULL) {
first = s;
last = s;
} else {
last->next = s;
last = s;
}
}
int
subtitles_c::check() {
sub_t *current;
int error = 0;
char *c;
current = first;
while ((current != NULL) && (current->next != NULL)) {
if (current->end > current->next->start) {
if (verbose) {
char short_subs[21];
memset(short_subs, 0, 21);
strncpy(short_subs, current->subs, 20);
for (c = short_subs; *c != 0; c++)
if (*c == '\n')
*c = ' ';
mxwarn("subtitles: current entry ends after "
"the next one starts. This end: %02lld:%02lld:%02lld,%03lld"
" next start: %02lld:%02lld:%02lld,%03lld (\"%s\"...)\n",
current->end / (60 * 60 * 1000),
(current->end / (60 * 1000)) % 60,
(current->end / 1000) % 60,
current->end % 1000,
current->next->start / (60 * 60 * 1000),
(current->next->start / (60 * 1000)) % 60,
(current->next->start / 1000) % 60,
current->next->start % 1000,
short_subs);
}
current->end = current->next->start - 1;
}
current = current->next;
}
current = first;
while (current != NULL) {
if (current->start > current->end) {
error = 1;
if (verbose) {
char short_subs[21];
memset(short_subs, 0, 21);
strncpy(short_subs, current->subs, 20);
for (c = short_subs; *c != 0; c++)
if (*c == '\n')
*c = ' ';
mxwarn("subtitles: after fixing the time the "
"current entry begins after it ends. This start: "
"%02lld:%02lld:%02lld,%03lld this end: %02lld:%02lld:"
"%02lld,%03lld (\"%s\"...)\n",
current->start / (60 * 60 * 1000),
(current->start / (60 * 1000)) % 60,
(current->start / 1000) % 60,
current->start % 1000,
current->end / (60 * 60 * 1000),
(current->end / (60 * 1000)) % 60,
(current->end / 1000) % 60,
current->end % 1000,
short_subs);
}
}
current = current->next;
}
return error;
}
void
subtitles_c::process(textsubs_packetizer_c *p) {
sub_t *current;
deque<sub_t>::iterator current;
while ((current = get_next()) != NULL) {
memory_c mem((unsigned char *)current->subs, 0, true);
p->process(mem, current->start, current->end - current->start);
safefree(current);
foreach(current, entries) {
memory_c mem((unsigned char *)(*current).subs.c_str(), 0, false);
p->process(mem, (*current).start, (*current).end - (*current).start);
}
}
sub_t *
subtitles_c::get_next() {
sub_t *current;
if (first == NULL)
return NULL;
current = first;
if (first == last) {
first = NULL;
last = NULL;
} else
first = first->next;
return current;
entries.clear();
}
#undef PFX

View File

@ -22,21 +22,29 @@
typedef struct sub_t {
int64_t start, end;
char *subs;
sub_t *next;
string subs;
sub_t(int64_t _start, int64_t _end, const string &_subs):
start(_start), end(_end), subs(_subs) {
}
bool operator < (const sub_t &cmp) const {
return start < cmp.start;
}
} sub_t;
class subtitles_c {
private:
sub_t *first, *last;
public:
subtitles_c();
~subtitles_c();
deque<sub_t> entries;
void add(int64_t, int64_t, const char *);
int check();
public:
void add(int64_t start, int64_t end, const char *subs) {
entries.push_back(sub_t(start, end, subs));
}
void process(textsubs_packetizer_c *);
sub_t *get_next();
void sort() {
std::sort(entries.begin(), entries.end());
}
};
int64_t spu_extract_duration(unsigned char *data, int buf_size,