mirror of
https://github.com/mpv-player/mpv
synced 2024-12-24 07:42:17 +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:
parent
a7107686d7
commit
498644afaf
@ -64,8 +64,6 @@ static void reselect_demux_streams(struct MPContext *mpctx);
|
|||||||
|
|
||||||
static void uninit_sub(struct MPContext *mpctx, int order)
|
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.
|
mpctx->d_sub[order] = NULL; // Note: not free'd.
|
||||||
int obj = order ? OSDTYPE_SUB2 : OSDTYPE_SUB;
|
int obj = order ? OSDTYPE_SUB2 : OSDTYPE_SUB;
|
||||||
osd_set_sub(mpctx->osd, obj, NULL);
|
osd_set_sub(mpctx->osd, obj, NULL);
|
||||||
|
@ -237,7 +237,5 @@ void reinit_subs(struct MPContext *mpctx, int order)
|
|||||||
if (order == 1 && sub_has_get_text(dec_sub))
|
if (order == 1 && sub_has_get_text(dec_sub))
|
||||||
state.render_bitmap_subs = false;
|
state.render_bitmap_subs = false;
|
||||||
|
|
||||||
reset_subtitles(mpctx, order);
|
|
||||||
|
|
||||||
osd_set_sub(mpctx->osd, obj, &state);
|
osd_set_sub(mpctx->osd, obj, &state);
|
||||||
}
|
}
|
||||||
|
@ -51,7 +51,6 @@ struct sd_lavc_priv {
|
|||||||
struct sub_bitmap *outbitmaps;
|
struct sub_bitmap *outbitmaps;
|
||||||
int64_t displayed_id;
|
int64_t displayed_id;
|
||||||
int64_t new_id;
|
int64_t new_id;
|
||||||
bool unknown_pts; // at least one sub with MP_NOPTS_VALUE start
|
|
||||||
struct mp_image_params video_params;
|
struct mp_image_params video_params;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -199,10 +198,8 @@ static void decode(struct sd *sd, struct demux_packet *packet)
|
|||||||
if (duration == 0)
|
if (duration == 0)
|
||||||
duration = -1;
|
duration = -1;
|
||||||
|
|
||||||
if (pts == MP_NOPTS_VALUE) {
|
if (pts == MP_NOPTS_VALUE)
|
||||||
MP_WARN(sd, "Subtitle with unknown start time.\n");
|
MP_WARN(sd, "Subtitle with unknown start time.\n");
|
||||||
priv->unknown_pts = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
av_init_packet(&pkt);
|
av_init_packet(&pkt);
|
||||||
pkt.data = packet->buffer;
|
pkt.data = packet->buffer;
|
||||||
@ -317,11 +314,8 @@ static void reset(struct sd *sd)
|
|||||||
{
|
{
|
||||||
struct sd_lavc_priv *priv = sd->priv;
|
struct sd_lavc_priv *priv = sd->priv;
|
||||||
|
|
||||||
if (priv->unknown_pts) {
|
for (int n = 0; n < MAX_QUEUE; n++)
|
||||||
for (int n = 0; n < MAX_QUEUE; n++)
|
clear_sub(&priv->subs[n]);
|
||||||
clear_sub(&priv->subs[n]);
|
|
||||||
priv->unknown_pts = false;
|
|
||||||
}
|
|
||||||
// lavc might not do this right for all codecs; may need close+reopen
|
// lavc might not do this right for all codecs; may need close+reopen
|
||||||
avcodec_flush_buffers(priv->avctx);
|
avcodec_flush_buffers(priv->avctx);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user