sub: don't check for duplicates on sub conversion

This mirrors commit "sub: remove check_duplicate_plaintext_event()".
That code was basically duplicated. In general, this code is still
needed when doing conversion during demuxing (mostly because you can
seek during demuxing, which will cause duplicate events by replaying).
This commit is contained in:
wm4 2013-06-02 22:35:00 +02:00
parent 5e2c211a4e
commit 3913e3e383
3 changed files with 17 additions and 6 deletions

View File

@ -121,6 +121,10 @@ static void read_sub_data(struct dec_sub *sub, struct sub_data *subdata)
assert(sub_accept_packets_in_advance(sub));
char *temp = NULL;
struct sd *sd = sub_get_last_sd(sub);
sd->no_remove_duplicates = true;
for (int i = 0; i < subdata->sub_num; i++) {
subtitle *st = &subdata->subtitles[i];
// subdata is in 10 ms ticks, pts is in seconds
@ -161,7 +165,6 @@ static void read_sub_data(struct dec_sub *sub, struct sub_data *subdata)
sub_decode(sub, &pkt);
}
struct sd *sd = sub_get_last_sd(sub);
// Hack for broken FFmpeg packet format: make sd_ass keep the subtitle
// events on reset(), even though broken FFmpeg ASS packets were received
// (from sd_lavc_conv.c). Normally, these events are removed on seek/reset,
@ -169,6 +172,8 @@ static void read_sub_data(struct dec_sub *sub, struct sub_data *subdata)
if (sd && sd->driver->fix_events)
sd->driver->fix_events(sd);
sd->no_remove_duplicates = false;
talloc_free(temp);
}

View File

@ -27,6 +27,10 @@ struct sd {
struct ass_library *ass_library;
struct ass_renderer *ass_renderer;
// If false, try to remove multiple subtitles.
// (Only for decoders which have accept_packets_in_advance set.)
bool no_remove_duplicates;
// Set by sub converter
const char *output_codec;
char *output_extradata;

View File

@ -132,11 +132,13 @@ static void decode(struct sd *sd, struct demux_packet *packet)
return;
}
not_all_whitespace:;
for (int i = 0; i < track->n_events; i++)
if (track->events[i].Start == ipts
&& (duration <= 0 || track->events[i].Duration == iduration)
&& strcmp(track->events[i].Text, text) == 0)
return; // We've already added this subtitle
if (!sd->no_remove_duplicates) {
for (int i = 0; i < track->n_events; i++)
if (track->events[i].Start == ipts
&& (duration <= 0 || track->events[i].Duration == iduration)
&& strcmp(track->events[i].Text, text) == 0)
return; // We've already added this subtitle
}
if (duration <= 0) {
iduration = 10000;
ctx->incomplete_event = true;