static int init(struct sd *sd) { struct MPOpts *opts = sd->opts; if (!sd->ass_library || !sd->ass_renderer || !sd->ass_lock || !sd->codec) return -1; struct sd_ass_priv *ctx = talloc_zero(NULL, struct sd_ass_priv); sd->priv = ctx; ctx->extend_event = -1; ctx->is_converted = sd->converted_from != NULL; pthread_mutex_lock(sd->ass_lock); ctx->ass_track = ass_new_track(sd->ass_library); if (!ctx->is_converted) ctx->ass_track->track_type = TRACK_TYPE_ASS; ctx->shadow_track = ass_new_track(sd->ass_library); ctx->shadow_track->PlayResX = 384; ctx->shadow_track->PlayResY = 288; mp_ass_add_default_styles(ctx->shadow_track, opts); if (sd->extradata) { ass_process_codec_private(ctx->ass_track, sd->extradata, sd->extradata_len); } mp_ass_add_default_styles(ctx->ass_track, opts); pthread_mutex_unlock(sd->ass_lock); return 0; }
static int init(struct sd *sd) { struct MPOpts *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; if (strcmp(sd->codec->codec, "ass") != 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); add_subtitle_fonts(sd); if (opts->ass_style_override) ass_set_style_overrides(ctx->ass_library, opts->ass_force_style_list); ctx->ass_track = ass_new_track(ctx->ass_library); if (!ctx->is_converted) ctx->ass_track->track_type = TRACK_TYPE_ASS; ctx->shadow_track = ass_new_track(ctx->ass_library); ctx->shadow_track->PlayResX = 384; ctx->shadow_track->PlayResY = 288; mp_ass_add_default_styles(ctx->shadow_track, opts); if (extradata) ass_process_codec_private(ctx->ass_track, extradata, extradata_size); mp_ass_add_default_styles(ctx->ass_track, opts); #if LIBASS_VERSION >= 0x01302000 ass_set_check_readorder(ctx->ass_track, sd->opts->sub_clear_on_seek ? 0 : 1); #endif ctx->frame_fps = sd->codec->frame_based; update_subtitle_speed(sd); enable_output(sd, true); ctx->packer = mp_ass_packer_alloc(ctx); return 0; }
static int init(struct sd *sd) { struct MPOpts *opts = sd->opts; if (!sd->ass_library || !sd->ass_renderer || !sd->codec) return -1; struct sd_ass_priv *ctx = talloc_zero(NULL, struct sd_ass_priv); sd->priv = ctx; ctx->is_converted = sd->converted_from != NULL; if (sd->ass_track) { ctx->ass_track = sd->ass_track; } else { ctx->ass_track = ass_new_track(sd->ass_library); if (!ctx->is_converted) ctx->ass_track->track_type = TRACK_TYPE_ASS; } if (sd->extradata) { ass_process_codec_private(ctx->ass_track, sd->extradata, sd->extradata_len); } mp_ass_add_default_styles(ctx->ass_track, opts); return 0; }
ASS_Track *mp_ass_default_track(ASS_Library *library, struct MPOpts *opts) { ASS_Track *track = ass_new_track(library); track->track_type = TRACK_TYPE_ASS; track->Timer = 100.; mp_ass_add_default_styles(track, opts); return track; }