summaryrefslogtreecommitdiffstats
path: root/player
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2015-12-27 02:07:01 +0100
committerwm4 <wm4@nowhere>2015-12-27 02:13:06 +0100
commitd85753b79e4ce0fa7a5ddac5b2ed0cf65f7aecd8 (patch)
tree4c4844981e89c7ad056d0e52335b2d963e37d44b /player
parent50c379e2d8a2cee0fcdbadbcbf5d0a0617fdafec (diff)
downloadmpv-d85753b79e4ce0fa7a5ddac5b2ed0cf65f7aecd8.tar.bz2
mpv-d85753b79e4ce0fa7a5ddac5b2ed0cf65f7aecd8.tar.xz
sub: refactor initialization
Just simplify by removing parts not needed anymore. This includes merging dec_sub allocation and initialization (since things making initialization complicated were removed), or format support queries (it simply tries to create a decoder, and if that fails, tries the next one).
Diffstat (limited to 'player')
-rw-r--r--player/sub.c36
1 files changed, 20 insertions, 16 deletions
diff --git a/player/sub.c b/player/sub.c
index e1e411e2ec..42f602f754 100644
--- a/player/sub.c
+++ b/player/sub.c
@@ -143,49 +143,53 @@ void update_subtitles(struct MPContext *mpctx)
update_subtitle(mpctx, 1);
}
-static void reinit_subdec(struct MPContext *mpctx, struct track *track)
+static bool init_subdec(struct MPContext *mpctx, struct track *track)
{
struct MPOpts *opts = mpctx->opts;
- struct dec_sub *dec_sub = track->dec_sub;
+ assert(!track->dec_sub);
- if (sub_is_initialized(dec_sub))
- return;
+ if (!track->demuxer || !track->stream)
+ return false;
- sub_init(dec_sub, track->demuxer, track->stream);
+ track->dec_sub = sub_create(mpctx->global, track->demuxer, track->stream);
+ if (!track->dec_sub)
+ return false;
struct sh_video *sh_video =
mpctx->d_video ? mpctx->d_video->header->video : NULL;
double fps = sh_video ? sh_video->fps : 25;
- sub_control(dec_sub, SD_CTRL_SET_VIDEO_DEF_FPS, &fps);
+ sub_control(track->dec_sub, SD_CTRL_SET_VIDEO_DEF_FPS, &fps);
// Don't do this if the file has video/audio streams. Don't do it even
// if it has only sub streams, because reading packets will change the
// demuxer position.
- if (!track->preloaded && track->is_external && !opts->sub_clear_on_seek) {
+ if (track->is_external && !opts->sub_clear_on_seek) {
demux_seek(track->demuxer, 0, SEEK_ABSOLUTE);
- track->preloaded = sub_read_all_packets(dec_sub, track->stream);
+ track->preloaded = sub_read_all_packets(track->dec_sub);
if (track->preloaded)
demux_stop_thread(track->demuxer);
}
+
+ return true;
}
void reinit_subs(struct MPContext *mpctx, int order)
{
- struct track *track = mpctx->current_track[order][STREAM_SUB];
-
assert(!mpctx->d_sub[order]);
- struct sh_stream *sh = track ? track->stream : NULL;
- if (!sh)
+ struct track *track = mpctx->current_track[order][STREAM_SUB];
+ if (!track)
return;
- if (!track->dec_sub)
- track->dec_sub = sub_create(mpctx->global);
- mpctx->d_sub[order] = track->dec_sub;
+ if (!track->dec_sub && !init_subdec(mpctx, track)) {
+ error_on_track(mpctx, track);
+ return;
+ }
sub_select(track->dec_sub, true);
- reinit_subdec(mpctx, track);
osd_set_sub(mpctx->osd, OSDTYPE_SUB + order, track->dec_sub);
sub_control(track->dec_sub, SD_CTRL_SET_TOP, &(bool){!!order});
+
+ mpctx->d_sub[order] = track->dec_sub;
}