diff options
Diffstat (limited to 'sub/sd_ass.c')
-rw-r--r-- | sub/sd_ass.c | 75 |
1 files changed, 48 insertions, 27 deletions
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: |