summaryrefslogtreecommitdiffstats
path: root/sub/sd_ass.c
diff options
context:
space:
mode:
Diffstat (limited to 'sub/sd_ass.c')
-rw-r--r--sub/sd_ass.c26
1 files changed, 21 insertions, 5 deletions
diff --git a/sub/sd_ass.c b/sub/sd_ass.c
index 2d16afd821..afe8fa6dd9 100644
--- a/sub/sd_ass.c
+++ b/sub/sd_ass.c
@@ -259,8 +259,15 @@ static void decode(struct sd *sd, struct demux_packet *packet)
packet->duration = UNKNOWN_DURATION;
}
char **r = lavc_conv_decode(ctx->converter, packet);
- for (int n = 0; r && r[n]; n++)
- ass_process_data(track, r[n], strlen(r[n]));
+ for (int n = 0; r && r[n]; n++) {
+ char *ass_line = r[n];
+ if (sd->opts->sub_filter_SDH)
+ ass_line = filter_SDH(sd, track->event_format, 0, ass_line, 0);
+ if (ass_line)
+ ass_process_data(track, ass_line, strlen(ass_line));
+ if (sd->opts->sub_filter_SDH)
+ talloc_free(ass_line);
+ }
if (ctx->duration_unknown) {
for (int n = 0; n < track->n_events - 1; n++) {
if (track->events[n].Duration == UNKNOWN_DURATION * 1000) {
@@ -272,9 +279,18 @@ static void decode(struct sd *sd, struct demux_packet *packet)
} else {
// Note that for this packet format, libass has an internal mechanism
// for discarding duplicate (already seen) packets.
- ass_process_chunk(track, packet->buffer, packet->len,
- llrint(packet->pts * 1000),
- llrint(packet->duration * 1000));
+ char *ass_line = packet->buffer;
+ int ass_len = packet->len;
+ if (sd->opts->sub_filter_SDH) {
+ ass_line = filter_SDH(sd, track->event_format, 1, ass_line, ass_len);
+ ass_len = strlen(ass_line);
+ }
+ if (ass_line)
+ ass_process_chunk(track, ass_line, ass_len,
+ llrint(packet->pts * 1000),
+ llrint(packet->duration * 1000));
+ if (sd->opts->sub_filter_SDH)
+ talloc_free(ass_line);
}
}