summaryrefslogtreecommitdiffstats
path: root/sub/sd_ass.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2013-06-01 19:54:18 +0200
committerwm4 <wm4@nowhere>2013-06-03 22:40:02 +0200
commite19ffa02aa370cbc3b559f85b286ea09b06ab29b (patch)
tree3335cdcc8664d9e3b98631fe8128b138c095069a /sub/sd_ass.c
parent14dd95154820d4ec9afb5200335177b011233049 (diff)
downloadmpv-e19ffa02aa370cbc3b559f85b286ea09b06ab29b.tar.bz2
mpv-e19ffa02aa370cbc3b559f85b286ea09b06ab29b.tar.xz
sub: turn subassconvert_ functions into sub converters
This means subassconvert.c is split in sd_srt.c and sd_microdvd.c. Now this code is involved in the sub conversion chain like sd_movtext is. The invocation of the converter in sd_ass.c is removed. This requires some other changes to make the new sub converter code work with loading external subtitles. Until now, subtitles loaded via subreader.c was assumed to be in plaintext, or for some formats, in ASS (except in -no-ass mode). Then these were added to an ASS_Track. Change this so that subtitles are always in their original format (as far as decoders/converters for them are available), and turn every sub event read by subreader.c as packet to the dec_sub.c subtitle chain. This removes differences between external/demuxed and -ass/-no-ass code paths further.
Diffstat (limited to 'sub/sd_ass.c')
-rw-r--r--sub/sd_ass.c38
1 files changed, 15 insertions, 23 deletions
diff --git a/sub/sd_ass.c b/sub/sd_ass.c
index 78adbf4863..405cef323a 100644
--- a/sub/sd_ass.c
+++ b/sub/sd_ass.c
@@ -27,12 +27,10 @@
#include "core/options.h"
#include "core/mp_common.h"
#include "core/mp_msg.h"
-#include "demux/stheader.h"
#include "sub.h"
#include "dec_sub.h"
#include "ass_mp.h"
#include "sd.h"
-#include "subassconvert.h"
struct sd_ass_priv {
struct ass_track *ass_track;
@@ -43,22 +41,17 @@ struct sd_ass_priv {
char last_text[500];
};
-static bool is_ass_sub(const char *t)
+static bool is_native_ass(const char *t)
{
- return t && (strcmp(t, "ass") == 0 ||
- strcmp(t, "ssa") == 0);
-}
-
-static bool is_text_sub(const char *t)
-{
- return t && (is_ass_sub(t) ||
- strcmp(t, "text") == 0 ||
- strcmp(t, "subrip") == 0);
+ return strcmp(t, "ass") == 0 || strcmp(t, "ssa") == 0;
}
static bool supports_format(const char *format)
{
- return is_text_sub(format);
+ // ass-text is produced by converters and the subreader.c ssa parser; this
+ // format has ASS tags, but doesn't start with any prelude, nor does it
+ // have extradata.
+ return format && (is_native_ass(format) || strcmp(format, "ass-text") == 0);
}
static void free_last_event(ASS_Track *track)
@@ -73,19 +66,21 @@ static int init(struct sd *sd)
if (!sd->ass_library || !sd->ass_renderer)
return -1;
- bool ass = is_ass_sub(sd->codec);
+ bool ass = is_native_ass(sd->codec);
struct sd_ass_priv *ctx = talloc_zero(NULL, struct sd_ass_priv);
sd->priv = ctx;
if (sd->ass_track) {
ctx->ass_track = sd->ass_track;
} else if (ass) {
ctx->ass_track = ass_new_track(sd->ass_library);
- if (sd->extradata)
- ass_process_codec_private(ctx->ass_track, sd->extradata,
- sd->extradata_len);
} else
ctx->ass_track = mp_ass_default_track(sd->ass_library, sd->opts);
+ if (sd->extradata) {
+ ass_process_codec_private(ctx->ass_track, sd->extradata,
+ sd->extradata_len);
+ }
+
ctx->vsfilter_aspect = ass;
return 0;
}
@@ -99,8 +94,7 @@ static void decode(struct sd *sd, struct demux_packet *packet)
unsigned char *text = data;
struct sd_ass_priv *ctx = sd->priv;
ASS_Track *track = ctx->ass_track;
-
- if (is_ass_sub(sd->codec)) {
+ if (is_native_ass(sd->codec)) {
if (bstr_startswith0((bstr){data, data_len}, "Dialogue: ")) {
// broken ffmpeg ASS packet format
ctx->flush_on_seek = true;
@@ -138,12 +132,10 @@ static void decode(struct sd *sd, struct demux_packet *packet)
return;
}
not_all_whitespace:;
- char buf[500];
- subassconvert_subrip(text, buf, sizeof(buf));
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, buf) == 0)
+ && strcmp(track->events[i].Text, text) == 0)
return; // We've already added this subtitle
if (duration <= 0) {
iduration = 10000;
@@ -154,7 +146,7 @@ static void decode(struct sd *sd, struct demux_packet *packet)
event->Start = ipts;
event->Duration = iduration;
event->Style = track->default_style;
- event->Text = strdup(buf);
+ event->Text = strdup(text);
}
static void get_bitmaps(struct sd *sd, struct mp_osd_res dim, double pts,