1
0
mirror of https://github.com/mpv-player/mpv synced 2024-12-19 21:31:52 +00:00

sub: call sub_reset() on seeks only

sub_reset() was called on cycling subtitle tracks and on seeking. Since
we don't want that subtitles disppear on cycling, sd_lavc.c didn't clear
its internal subtitle queue on reset, which meant that seeking with PGS
subtitles could leave the subtitle on screen (PGS subtitles usually
don't have a duration set).

Call it only on seeking, so we can also strictly clear the subtitle
queue in sd_lavc.

(This still can go very wrong if you disable a subtitle, seek, and
enable it again - for example, if used with libavformat that uses "SSA"
style demuxed ASS subtitle packets. That shouldn't happen with newer
libavformat versions, and the user can "correct" it anyway by executing
a seek while the subtitle is selected.)
This commit is contained in:
wm4 2014-08-14 23:45:58 +02:00
parent a7107686d7
commit 498644afaf
3 changed files with 3 additions and 13 deletions

View File

@ -64,8 +64,6 @@ static void reselect_demux_streams(struct MPContext *mpctx);
static void uninit_sub(struct MPContext *mpctx, int order)
{
if (mpctx->d_sub[order])
sub_reset(mpctx->d_sub[order]);
mpctx->d_sub[order] = NULL; // Note: not free'd.
int obj = order ? OSDTYPE_SUB2 : OSDTYPE_SUB;
osd_set_sub(mpctx->osd, obj, NULL);

View File

@ -237,7 +237,5 @@ void reinit_subs(struct MPContext *mpctx, int order)
if (order == 1 && sub_has_get_text(dec_sub))
state.render_bitmap_subs = false;
reset_subtitles(mpctx, order);
osd_set_sub(mpctx->osd, obj, &state);
}

View File

@ -51,7 +51,6 @@ struct sd_lavc_priv {
struct sub_bitmap *outbitmaps;
int64_t displayed_id;
int64_t new_id;
bool unknown_pts; // at least one sub with MP_NOPTS_VALUE start
struct mp_image_params video_params;
};
@ -199,10 +198,8 @@ static void decode(struct sd *sd, struct demux_packet *packet)
if (duration == 0)
duration = -1;
if (pts == MP_NOPTS_VALUE) {
if (pts == MP_NOPTS_VALUE)
MP_WARN(sd, "Subtitle with unknown start time.\n");
priv->unknown_pts = true;
}
av_init_packet(&pkt);
pkt.data = packet->buffer;
@ -317,11 +314,8 @@ static void reset(struct sd *sd)
{
struct sd_lavc_priv *priv = sd->priv;
if (priv->unknown_pts) {
for (int n = 0; n < MAX_QUEUE; n++)
clear_sub(&priv->subs[n]);
priv->unknown_pts = false;
}
for (int n = 0; n < MAX_QUEUE; n++)
clear_sub(&priv->subs[n]);
// lavc might not do this right for all codecs; may need close+reopen
avcodec_flush_buffers(priv->avctx);
}