summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--player/sub.c26
-rw-r--r--sub/dec_sub.c14
-rw-r--r--sub/dec_sub.h10
-rw-r--r--sub/sd.h2
-rw-r--r--sub/sd_ass.c6
5 files changed, 44 insertions, 14 deletions
diff --git a/player/sub.c b/player/sub.c
index 6892ac935b..426e31bc7a 100644
--- a/player/sub.c
+++ b/player/sub.c
@@ -129,6 +129,29 @@ bool update_subtitles(struct MPContext *mpctx, double video_pts)
return ok;
}
+static struct attachment_list *get_all_attachments(struct MPContext *mpctx)
+{
+ struct attachment_list *list = talloc_zero(NULL, struct attachment_list);
+ struct demuxer *prev_demuxer = NULL;
+ for (int n = 0; n < mpctx->num_tracks; n++) {
+ struct track *t = mpctx->tracks[n];
+ if (!t->demuxer || prev_demuxer == t->demuxer)
+ continue;
+ prev_demuxer = t->demuxer;
+ for (int i = 0; i < t->demuxer->num_attachments; i++) {
+ struct demux_attachment *att = &t->demuxer->attachments[i];
+ struct demux_attachment copy = {
+ .name = talloc_strdup(list, att->name),
+ .type = talloc_strdup(list, att->type),
+ .data = talloc_memdup(list, att->data, att->data_size),
+ .data_size = att->data_size,
+ };
+ MP_TARRAY_APPEND(list, list->entries, list->num_entries, copy);
+ }
+ }
+ return list;
+}
+
static bool init_subdec(struct MPContext *mpctx, struct track *track)
{
assert(!track->d_sub);
@@ -136,7 +159,8 @@ static bool init_subdec(struct MPContext *mpctx, struct track *track)
if (!track->demuxer || !track->stream)
return false;
- track->d_sub = sub_create(mpctx->global, track->demuxer, track->stream);
+ track->d_sub = sub_create(mpctx->global, track->stream,
+ get_all_attachments(mpctx));
if (!track->d_sub)
return false;
diff --git a/sub/dec_sub.c b/sub/dec_sub.c
index 75f5509c62..fbce829f5f 100644
--- a/sub/dec_sub.c
+++ b/sub/dec_sub.c
@@ -49,7 +49,7 @@ struct dec_sub {
struct mpv_global *global;
struct MPOpts *opts;
- struct demuxer *demuxer;
+ struct attachment_list *attachments;
struct sh_stream *sh;
double last_pkt_pts;
@@ -94,7 +94,7 @@ static struct sd *init_decoder(struct dec_sub *sub)
.log = mp_log_new(sd, sub->log, driver->name),
.opts = sub->opts,
.driver = driver,
- .demuxer = sub->demuxer,
+ .attachments = sub->attachments,
.codec = sub->codec,
};
@@ -112,10 +112,12 @@ static struct sd *init_decoder(struct dec_sub *sub)
// Thread-safety of the returned object: all functions are thread-safe,
// except sub_get_bitmaps() and sub_get_text(). Decoder backends (sd_*)
// do not need to acquire locks.
-struct dec_sub *sub_create(struct mpv_global *global, struct demuxer *demuxer,
- struct sh_stream *sh)
+// Ownership of attachments goes to the caller, and is released with
+// talloc_free() (even on failure).
+struct dec_sub *sub_create(struct mpv_global *global, struct sh_stream *sh,
+ struct attachment_list *attachments)
{
- assert(demuxer && sh && sh->type == STREAM_SUB);
+ assert(sh && sh->type == STREAM_SUB);
struct dec_sub *sub = talloc(NULL, struct dec_sub);
*sub = (struct dec_sub){
@@ -124,7 +126,7 @@ struct dec_sub *sub_create(struct mpv_global *global, struct demuxer *demuxer,
.opts = global->opts,
.sh = sh,
.codec = sh->codec,
- .demuxer = demuxer,
+ .attachments = talloc_steal(sub, attachments),
.last_pkt_pts = MP_NOPTS_VALUE,
.last_vo_pts = MP_NOPTS_VALUE,
.start = MP_NOPTS_VALUE,
diff --git a/sub/dec_sub.h b/sub/dec_sub.h
index b3f30520e3..cedb140e79 100644
--- a/sub/dec_sub.h
+++ b/sub/dec_sub.h
@@ -6,7 +6,6 @@
#include "osd.h"
-struct demuxer;
struct sh_stream;
struct mpv_global;
struct demux_packet;
@@ -22,8 +21,13 @@ enum sd_ctrl {
SD_CTRL_SET_VIDEO_DEF_FPS,
};
-struct dec_sub *sub_create(struct mpv_global *global, struct demuxer *demuxer,
- struct sh_stream *sh);
+struct attachment_list {
+ struct demux_attachment *entries;
+ int num_entries;
+};
+
+struct dec_sub *sub_create(struct mpv_global *global, struct sh_stream *sh,
+ struct attachment_list *attachments);
void sub_destroy(struct dec_sub *sub);
void sub_lock(struct dec_sub *sub);
void sub_unlock(struct dec_sub *sub);
diff --git a/sub/sd.h b/sub/sd.h
index b142654ed1..92bbf906fd 100644
--- a/sub/sd.h
+++ b/sub/sd.h
@@ -17,7 +17,7 @@ struct sd {
const struct sd_functions *driver;
void *priv;
- struct demuxer *demuxer;
+ struct attachment_list *attachments;
struct mp_codec_params *codec;
};
diff --git a/sub/sd_ass.c b/sub/sd_ass.c
index 5c56d3e0df..4426c2ebab 100644
--- a/sub/sd_ass.c
+++ b/sub/sd_ass.c
@@ -117,10 +117,10 @@ static void add_subtitle_fonts(struct sd *sd)
{
struct sd_ass_priv *ctx = sd->priv;
struct MPOpts *opts = sd->opts;
- if (!opts->ass_enabled || !sd->demuxer)
+ if (!opts->ass_enabled || !sd->attachments)
return;
- for (int i = 0; i < sd->demuxer->num_attachments; i++) {
- struct demux_attachment *f = &sd->demuxer->attachments[i];
+ for (int i = 0; i < sd->attachments->num_entries; i++) {
+ struct demux_attachment *f = &sd->attachments->entries[i];
if (opts->use_embedded_fonts && attachment_is_font(sd->log, f))
ass_add_font(ctx->ass_library, f->name, f->data, f->data_size);
}