diff options
Diffstat (limited to 'sub')
-rw-r--r-- | sub/dec_sub.c | 72 | ||||
-rw-r--r-- | sub/dec_sub.h | 14 | ||||
-rw-r--r-- | sub/sd.h | 16 | ||||
-rw-r--r-- | sub/sd_ass.c | 98 |
4 files changed, 200 insertions, 0 deletions
diff --git a/sub/dec_sub.c b/sub/dec_sub.c new file mode 100644 index 0000000000..6a6d1d77e5 --- /dev/null +++ b/sub/dec_sub.c @@ -0,0 +1,72 @@ +/* + * This file is part of MPlayer. + * + * MPlayer is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * MPlayer is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with MPlayer; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include <stdlib.h> +#include <stdbool.h> +#include <assert.h> + +#include "config.h" +#include "libmpdemux/stheader.h" +#include "sd.h" +#include "dec_sub.h" +#include "options.h" + +extern const struct sd_functions sd_ass; + +void sub_init(struct sh_sub *sh, struct osd_state *osd) +{ + struct MPOpts *opts = sh->opts; + +#ifdef CONFIG_ASS + if (opts->ass_enabled && is_text_sub(sh->type)) + sh->sd_driver = &sd_ass; +#endif + if (sh->sd_driver) { + sh->sd_driver->init(sh, osd); + sh->initialized = true; + sh->active = true; + } +} + +void sub_decode(struct sh_sub *sh, struct osd_state *osd, void *data, + int data_len, double pts, double duration) +{ + if (sh->active && sh->sd_driver->decode) + sh->sd_driver->decode(sh, osd, data, data_len, pts, duration); +} + +void sub_reset(struct sh_sub *sh, struct osd_state *osd) +{ + if (sh->active && sh->sd_driver->reset) + sh->sd_driver->reset(sh, osd); +} + +void sub_switchoff(struct sh_sub *sh, struct osd_state *osd) +{ + if (sh->active && sh->sd_driver->switch_off) + sh->sd_driver->switch_off(sh, osd); + sh->active = false; +} + +void sub_uninit(struct sh_sub *sh) +{ + assert (!sh->active); + if (sh->initialized && sh->sd_driver->uninit) + sh->sd_driver->uninit(sh); + sh->initialized = false; +} diff --git a/sub/dec_sub.h b/sub/dec_sub.h new file mode 100644 index 0000000000..d6fbef25f0 --- /dev/null +++ b/sub/dec_sub.h @@ -0,0 +1,14 @@ +struct sh_sub; +struct osd_state; + +static inline bool is_text_sub(int type) +{ + return type == 't' || type == 'm' || type == 'a'; +} + +void sub_decode(struct sh_sub *sh, struct osd_state *osd, void *data, + int data_len, double pts, double duration); +void sub_init(struct sh_sub *sh, struct osd_state *osd); +void sub_reset(struct sh_sub *sh, struct osd_state *osd); +void sub_switchoff(struct sh_sub *sh, struct osd_state *osd); +void sub_uninit(struct sh_sub *sh); diff --git a/sub/sd.h b/sub/sd.h new file mode 100644 index 0000000000..d5aea5c1a6 --- /dev/null +++ b/sub/sd.h @@ -0,0 +1,16 @@ +#ifndef MPLAYER_SD_H +#define MPLAYER_SD_H + +struct osd_state; +struct sh_sub; + +struct sd_functions { + void (*init)(struct sh_sub *sh, struct osd_state *osd); + void (*decode)(struct sh_sub *sh, struct osd_state *osd, + void *data, int data_len, double pts, double duration); + void (*reset)(struct sh_sub *sh, struct osd_state *osd); + void (*switch_off)(struct sh_sub *sh, struct osd_state *osd); + void (*uninit)(struct sh_sub *sh); +}; + +#endif diff --git a/sub/sd_ass.c b/sub/sd_ass.c new file mode 100644 index 0000000000..a25d50a805 --- /dev/null +++ b/sub/sd_ass.c @@ -0,0 +1,98 @@ +/* + * This file is part of MPlayer. + * + * MPlayer is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * MPlayer is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with MPlayer; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include <stdlib.h> +#include <ass/ass.h> +#include <assert.h> + +#include "talloc.h" + +#include "mpcommon.h" +#include "libmpdemux/stheader.h" +#include "libvo/sub.h" +#include "ass_mp.h" +#include "sd.h" + +struct sd_ass_priv { + struct ass_track *ass_track; +}; + +static void init(struct sh_sub *sh, struct osd_state *osd) +{ + struct sd_ass_priv *ctx; + + if (sh->initialized) { + ctx = sh->context; + } else { + ctx = talloc_zero(NULL, struct sd_ass_priv); + sh->context = ctx; + if (sh->type == 'a') { + ctx->ass_track = ass_new_track(ass_library); + if (sh->extradata) + ass_process_codec_private(ctx->ass_track, sh->extradata, + sh->extradata_len); + } else + ctx->ass_track = ass_default_track(ass_library); + } + + assert(osd->ass_track == NULL); + osd->ass_track = ctx->ass_track; +} + +static void decode(struct sh_sub *sh, struct osd_state *osd, void *data, + int data_len, double pts, double duration) +{ + struct sd_ass_priv *ctx = sh->context; + + if (sh->type == 'a') { // ssa/ass subs + ass_process_chunk(ctx->ass_track, data, data_len, + (long long)(pts*1000 + 0.5), + (long long)(duration*1000 + 0.5)); + } else { // plaintext subs + if (pts != MP_NOPTS_VALUE) { + subtitle tmp_subs = {0}; + if (duration <= 0) + duration = 3; + sub_add_text(&tmp_subs, data, data_len, pts + duration); + tmp_subs.start = pts * 100; + tmp_subs.end = (pts + duration) * 100; + ass_process_subtitle(ctx->ass_track, &tmp_subs); + sub_clear_text(&tmp_subs, MP_NOPTS_VALUE); + } + } +} + +static void switch_off(struct sh_sub *sh, struct osd_state *osd) +{ + osd->ass_track = NULL; +} + +static void uninit(struct sh_sub *sh) +{ + struct sd_ass_priv *ctx = sh->context; + + ass_free_track(ctx->ass_track); + talloc_free(ctx); +} + +const struct sd_functions sd_ass = { + .init = init, + .decode = decode, + .switch_off = switch_off, + .uninit = uninit, +}; |