mirror of
https://github.com/mpv-player/mpv
synced 2024-12-28 01:52:19 +00:00
466fc6d4d1
With this commit, the player will still use spudec.c (the "old" DVD sub decoder), rather than ffmpeg. But it brings the changes needed to enable this down to a single line change: --- a/mplayer.c +++ b/mplayer.c @@ -1988,7 +1988,7 @@ static void reinit_subs(struct MPContext *mpctx) #endif vo_osd_changed(OSDTYPE_SUBTITLE); } else if (track->stream) { - if (mpctx->sh_sub->type == 'v') + if (mpctx->sh_sub->type == 'v' && false) init_vo_spudec(mpctx); else sub_init(mpctx->sh_sub, mpctx->osd); Also, copy the DVD resolution heuristics from spudec.c (from the spudec_new_scaled() function). I'm not sure if this is correct or even needed, but the sd_lavc codd explicitly reverted back to spudec with code carrying this comment: // Assume resolution heuristics only work for PGS and DVB so it seems likely that the required heuristics were missing, and that the spudec heuristics may make the DVD compatibility situation at least as good as with spudec. Note that it's unlikely that we enable sd_lavc for DVD subs by default, as there are other problems in combination with direct DVD playback.
109 lines
3.4 KiB
C
109 lines
3.4 KiB
C
/*
|
|
* 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 "sub/sd.h"
|
|
#include "sub/sub.h"
|
|
#include "sub/dec_sub.h"
|
|
#include "options.h"
|
|
|
|
extern const struct sd_functions sd_ass;
|
|
extern const struct sd_functions sd_lavc;
|
|
|
|
void sub_init(struct sh_sub *sh, struct osd_state *osd)
|
|
{
|
|
struct MPOpts *opts = sh->opts;
|
|
|
|
assert(!osd->sh_sub);
|
|
#ifdef CONFIG_ASS
|
|
if (opts->ass_enabled && is_text_sub(sh->type))
|
|
sh->sd_driver = &sd_ass;
|
|
#endif
|
|
if (strchr("bpxv", sh->type))
|
|
sh->sd_driver = &sd_lavc;
|
|
if (sh->sd_driver) {
|
|
if (sh->sd_driver->init(sh, osd) < 0)
|
|
return;
|
|
osd->sh_sub = sh;
|
|
osd->bitmap_id = ++osd->bitmap_pos_id;
|
|
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_get_bitmaps(struct osd_state *osd, struct sub_bitmaps *res)
|
|
{
|
|
struct MPOpts *opts = osd->opts;
|
|
|
|
*res = (struct sub_bitmaps){ .render_index = 0,
|
|
.format = SUBBITMAP_EMPTY,
|
|
.bitmap_id = osd->bitmap_id,
|
|
.bitmap_pos_id = osd->bitmap_pos_id };
|
|
if (!opts->sub_visibility || !osd->sh_sub || !osd->sh_sub->active) {
|
|
/* Change ID in case we just switched from visible subtitles
|
|
* to current state. Hopefully, unnecessarily claiming that
|
|
* things may have changed is harmless for empty contents.
|
|
* Increase osd-> values ahead so that _next_ returned id
|
|
* is also guaranteed to differ from this one.
|
|
*/
|
|
res->bitmap_id = ++res->bitmap_pos_id;
|
|
osd->bitmap_id = osd->bitmap_pos_id += 2;
|
|
return;
|
|
}
|
|
if (osd->sh_sub->sd_driver->get_bitmaps)
|
|
osd->sh_sub->sd_driver->get_bitmaps(osd->sh_sub, osd, res);
|
|
osd->bitmap_id = res->bitmap_id;
|
|
osd->bitmap_pos_id = res->bitmap_pos_id;
|
|
}
|
|
|
|
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) {
|
|
assert(osd->sh_sub == sh);
|
|
sh->sd_driver->switch_off(sh, osd);
|
|
osd->sh_sub = NULL;
|
|
}
|
|
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;
|
|
}
|