summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--options/m_option.h3
-rw-r--r--options/options.c10
-rw-r--r--player/command.c4
-rw-r--r--sub/osd.c2
-rw-r--r--sub/sd_ass.c75
5 files changed, 60 insertions, 34 deletions
diff --git a/options/m_option.h b/options/m_option.h
index 25dc212482..bfaaef8d07 100644
--- a/options/m_option.h
+++ b/options/m_option.h
@@ -420,7 +420,8 @@ char *format_file_size(int64_t size);
#define UPDATE_VO_RESIZE (1 << 19) // --android-surface-size
#define UPDATE_HWDEC (1 << 20) // --hwdec
#define UPDATE_DVB_PROG (1 << 21) // some --dvbin-...
-#define UPDATE_OPT_LAST (1 << 21)
+#define UPDATE_SUB_HARD (1 << 22) // subtitle opts. that need full reinit
+#define UPDATE_OPT_LAST (1 << 22)
// All bits between _FIRST and _LAST (inclusive)
#define UPDATE_OPTS_MASK \
diff --git a/options/options.c b/options/options.c
index 63c99053a8..efde6fad4b 100644
--- a/options/options.c
+++ b/options/options.c
@@ -235,7 +235,7 @@ const struct m_sub_options mp_subtitle_sub_opts = {
{"sub-pos", OPT_INT(sub_pos), M_RANGE(0, 100)},
{"sub-gauss", OPT_FLOAT(sub_gauss), M_RANGE(0.0, 3.0)},
{"sub-gray", OPT_FLAG(sub_gray)},
- {"sub-ass", OPT_FLAG(ass_enabled)},
+ {"sub-ass", OPT_FLAG(ass_enabled), .flags = UPDATE_SUB_HARD},
{"sub-scale", OPT_FLOAT(sub_scale), M_RANGE(0, 100)},
{"sub-ass-line-spacing", OPT_FLOAT(ass_line_spacing),
M_RANGE(-1000, 1000)},
@@ -245,9 +245,11 @@ const struct m_sub_options mp_subtitle_sub_opts = {
{"sub-ass-vsfilter-color-compat", OPT_CHOICE(ass_vsfilter_color_compat,
{"no", 0}, {"basic", 1}, {"full", 2}, {"force-601", 3})},
{"sub-ass-vsfilter-blur-compat", OPT_FLAG(ass_vsfilter_blur_compat)},
- {"embeddedfonts", OPT_FLAG(use_embedded_fonts)},
- {"sub-ass-force-style", OPT_STRINGLIST(ass_force_style_list)},
- {"sub-ass-styles", OPT_STRING(ass_styles_file), .flags = M_OPT_FILE},
+ {"embeddedfonts", OPT_FLAG(use_embedded_fonts), .flags = UPDATE_SUB_HARD},
+ {"sub-ass-force-style", OPT_STRINGLIST(ass_force_style_list),
+ .flags = UPDATE_SUB_HARD},
+ {"sub-ass-styles", OPT_STRING(ass_styles_file), .flags = M_OPT_FILE,
+ .flags = UPDATE_SUB_HARD},
{"sub-ass-hinting", OPT_CHOICE(ass_hinting,
{"none", 0}, {"light", 1}, {"normal", 2}, {"native", 3})},
{"sub-ass-shaper", OPT_CHOICE(ass_shaper,
diff --git a/player/command.c b/player/command.c
index aa57dfee8e..de33a14297 100644
--- a/player/command.c
+++ b/player/command.c
@@ -6362,7 +6362,7 @@ void mp_option_change_callback(void *ctx, struct m_config_option *co, int flags,
if (flags & UPDATE_TERM)
mp_update_logging(mpctx, false);
- if (flags & (UPDATE_OSD | UPDATE_SUB_FILT)) {
+ if (flags & (UPDATE_OSD | UPDATE_SUB_FILT | UPDATE_SUB_HARD)) {
for (int n = 0; n < num_ptracks[STREAM_SUB]; n++) {
struct track *track = mpctx->current_track[n][STREAM_SUB];
struct dec_sub *sub = track ? track->d_sub : NULL;
@@ -6372,6 +6372,8 @@ void mp_option_change_callback(void *ctx, struct m_config_option *co, int flags,
}
}
osd_changed(mpctx->osd);
+ if (flags & (UPDATE_SUB_FILT | UPDATE_SUB_HARD))
+ mp_force_video_refresh(mpctx);
mp_wakeup_core(mpctx);
}
diff --git a/sub/osd.c b/sub/osd.c
index c45668c3f4..de63befe7f 100644
--- a/sub/osd.c
+++ b/sub/osd.c
@@ -66,7 +66,7 @@ static const m_option_t style_opts[] = {
{"justify", OPT_CHOICE(justify,
{"auto", 0}, {"left", 1}, {"center", 2}, {"right", 3})},
{"font-provider", OPT_CHOICE(font_provider,
- {"auto", 0}, {"none", 1}, {"fontconfig", 2})},
+ {"auto", 0}, {"none", 1}, {"fontconfig", 2}), .flags = UPDATE_SUB_HARD},
{0}
};
diff --git a/sub/sd_ass.c b/sub/sd_ass.c
index 46f16908b0..64d8735a7d 100644
--- a/sub/sd_ass.c
+++ b/sub/sd_ass.c
@@ -197,31 +197,10 @@ static void enable_output(struct sd *sd, bool enable)
}
}
-static int init(struct sd *sd)
+static void assobjects_init(struct sd *sd)
{
+ struct sd_ass_priv *ctx = sd->priv;
struct mp_subtitle_opts *opts = sd->opts;
- struct sd_ass_priv *ctx = talloc_zero(sd, struct sd_ass_priv);
- sd->priv = ctx;
-
- char *extradata = sd->codec->extradata;
- int extradata_size = sd->codec->extradata_size;
-
- // Note: accept "null" as alias for "ass", so EDL delay_open subtitle
- // streams work.
- if (strcmp(sd->codec->codec, "ass") != 0 &&
- strcmp(sd->codec->codec, "null") != 0)
- {
- ctx->is_converted = true;
- ctx->converter = lavc_conv_create(sd->log, sd->codec->codec, extradata,
- extradata_size);
- if (!ctx->converter)
- return -1;
- extradata = lavc_conv_get_extradata(ctx->converter);
- extradata_size = extradata ? strlen(extradata) : 0;
-
- if (strcmp(sd->codec->codec, "eia_608") == 0)
- ctx->duration_unknown = 1;
- }
ctx->ass_library = mp_ass_init(sd->global, sd->log);
ass_set_extract_fonts(ctx->ass_library, opts->use_embedded_fonts);
@@ -239,6 +218,8 @@ static int init(struct sd *sd)
ctx->shadow_track->PlayResY = 288;
mp_ass_add_default_styles(ctx->shadow_track, opts);
+ char *extradata = sd->codec->extradata;
+ int extradata_size = sd->codec->extradata_size;
if (extradata)
ass_process_codec_private(ctx->ass_track, extradata, extradata_size);
@@ -249,6 +230,44 @@ static int init(struct sd *sd)
#endif
enable_output(sd, true);
+}
+
+static void assobjects_destroy(struct sd *sd)
+{
+ struct sd_ass_priv *ctx = sd->priv;
+
+ ass_free_track(ctx->ass_track);
+ ass_free_track(ctx->shadow_track);
+ enable_output(sd, false);
+ ass_library_done(ctx->ass_library);
+}
+
+static int init(struct sd *sd)
+{
+ struct sd_ass_priv *ctx = talloc_zero(sd, struct sd_ass_priv);
+ sd->priv = ctx;
+
+ // Note: accept "null" as alias for "ass", so EDL delay_open subtitle
+ // streams work.
+ if (strcmp(sd->codec->codec, "ass") != 0 &&
+ strcmp(sd->codec->codec, "null") != 0)
+ {
+ char *extradata = sd->codec->extradata;
+ int extradata_size = sd->codec->extradata_size;
+
+ ctx->is_converted = true;
+ ctx->converter = lavc_conv_create(sd->log, sd->codec->codec, extradata,
+ extradata_size);
+ if (!ctx->converter)
+ return -1;
+ extradata = lavc_conv_get_extradata(ctx->converter);
+ extradata_size = extradata ? strlen(extradata) : 0;
+
+ if (strcmp(sd->codec->codec, "eia_608") == 0)
+ ctx->duration_unknown = 1;
+ }
+
+ assobjects_init(sd);
filters_init(sd);
ctx->packer = mp_ass_packer_alloc(ctx);
@@ -760,10 +779,7 @@ static void uninit(struct sd *sd)
filters_destroy(sd);
if (ctx->converter)
lavc_conv_uninit(ctx->converter);
- ass_free_track(ctx->ass_track);
- ass_free_track(ctx->shadow_track);
- enable_output(sd, false);
- ass_library_done(ctx->ass_library);
+ assobjects_destroy(sd);
talloc_free(ctx->copy_cache);
}
@@ -793,6 +809,11 @@ static int control(struct sd *sd, enum sd_ctrl cmd, void *arg)
filters_init(sd);
ctx->clear_once = true; // allow reloading on seeks
}
+ if (flags & UPDATE_SUB_HARD) {
+ assobjects_destroy(sd);
+ assobjects_init(sd);
+ MP_WARN(sd, "reoinit\n");
+ }
return CONTROL_OK;
}
default: