summaryrefslogtreecommitdiffstats
path: root/sub/dec_sub.c
diff options
context:
space:
mode:
authorDudemanguy <random342@airmail.cc>2023-12-13 15:36:58 -0600
committerDudemanguy <random342@airmail.cc>2023-12-16 15:25:32 +0000
commitb0f31a76376cae73506e3969dff805de8a18b198 (patch)
treee3771b0debf9d881539ca6889262ddb982ad4921 /sub/dec_sub.c
parentace2d6506f20dfc6a30d0bbb6cfb959f2144bfc9 (diff)
downloadmpv-b0f31a76376cae73506e3969dff805de8a18b198.tar.bz2
mpv-b0f31a76376cae73506e3969dff805de8a18b198.tar.xz
player: refactor secondary subtitle options and properties
Over the years, we've accumulated several secondary subtitle related options and properties, but the implementation was not really consistent and it wasn't clear what the right process for adding more should be. So to make things nicer, let's refactor all of the subtitle options with secondary variants (sub-delay, sub-pos, and sub-visibility) and split them off to a new, separate struct. All of the underlying values are stored in an array instead for simplicity. Additionally, the implementation of some secondary-sub-* properties were slightly changed so there would be less redundancy.
Diffstat (limited to 'sub/dec_sub.c')
-rw-r--r--sub/dec_sub.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/sub/dec_sub.c b/sub/dec_sub.c
index 4cb2d9bb67..6ad26cba6a 100644
--- a/sub/dec_sub.c
+++ b/sub/dec_sub.c
@@ -47,7 +47,9 @@ struct dec_sub {
struct mp_log *log;
struct mpv_global *global;
struct mp_subtitle_opts *opts;
+ struct mp_subtitle_shared_opts *shared_opts;
struct m_config_cache *opts_cache;
+ struct m_config_cache *shared_opts_cache;
struct mp_recorder_sink *recorder_sink;
@@ -91,7 +93,7 @@ static void update_subtitle_speed(struct dec_sub *sub)
// Return the subtitle PTS used for a given video PTS.
static double pts_to_subtitle(struct dec_sub *sub, double pts)
{
- struct mp_subtitle_opts *opts = sub->opts;
+ struct mp_subtitle_shared_opts *opts = sub->shared_opts;
float delay = sub->order < 0 ? 0.0f : opts->sub_delay[sub->order];
if (pts != MP_NOPTS_VALUE)
@@ -102,7 +104,7 @@ static double pts_to_subtitle(struct dec_sub *sub, double pts)
static double pts_from_subtitle(struct dec_sub *sub, double pts)
{
- struct mp_subtitle_opts *opts = sub->opts;
+ struct mp_subtitle_shared_opts *opts = sub->shared_opts;
float delay = sub->order < 0 ? 0.0f : opts->sub_delay[sub->order];
if (pts != MP_NOPTS_VALUE)
@@ -140,6 +142,7 @@ static struct sd *init_decoder(struct dec_sub *sub)
.global = sub->global,
.log = mp_log_new(sd, sub->log, driver->name),
.opts = sub->opts,
+ .shared_opts = sub->shared_opts,
.driver = driver,
.attachments = sub->attachments,
.codec = sub->codec,
@@ -172,6 +175,7 @@ struct dec_sub *sub_create(struct mpv_global *global, struct track *track,
.log = mp_log_new(sub, global->log, "sub"),
.global = global,
.opts_cache = m_config_cache_alloc(sub, global, &mp_subtitle_sub_opts),
+ .shared_opts_cache = m_config_cache_alloc(sub, global, &mp_subtitle_shared_sub_opts),
.sh = track->stream,
.codec = track->stream->codec,
.attachments = talloc_steal(sub, attachments),
@@ -183,6 +187,7 @@ struct dec_sub *sub_create(struct mpv_global *global, struct track *track,
.end = MP_NOPTS_VALUE,
};
sub->opts = sub->opts_cache->opts;
+ sub->shared_opts = sub->shared_opts_cache->opts;
mp_mutex_init_type(&sub->lock, MP_MUTEX_RECURSIVE);
sub->sd = init_decoder(sub);
@@ -292,7 +297,7 @@ bool sub_read_packets(struct dec_sub *sub, double video_pts, bool force)
break;
// (Use this mechanism only if sub_delay matters to avoid corner cases.)
- float delay = sub->order < 0 ? 0.0f : sub->opts->sub_delay[sub->order];
+ float delay = sub->order < 0 ? 0.0f : sub->shared_opts->sub_delay[sub->order];
double min_pts = delay < 0 || force ? video_pts : MP_NOPTS_VALUE;
struct demux_packet *pkt;
@@ -457,6 +462,7 @@ int sub_control(struct dec_sub *sub, enum sd_ctrl cmd, void *arg)
int flags = (uintptr_t)arg;
if (m_config_cache_update(sub->opts_cache))
update_subtitle_speed(sub);
+ m_config_cache_update(sub->shared_opts_cache);
propagate = true;
if (flags & UPDATE_SUB_HARD) {
// forget about the previous preload because
@@ -491,10 +497,10 @@ void sub_set_play_dir(struct dec_sub *sub, int dir)
bool sub_is_primary_visible(struct dec_sub *sub)
{
- return !!sub->opts->sub_visibility;
+ return sub->shared_opts->sub_visibility[0];
}
bool sub_is_secondary_visible(struct dec_sub *sub)
{
- return !!sub->opts->sec_sub_visibility;
+ return sub->shared_opts->sub_visibility[1];
}