sd_lavc: always set decoder timebase

Like it's done for audio and video. Just to be uniform.

I'm sorry for deleting the anti-ffmpeg vitriol. It's still all true, but
since we decided to always set the timebase, the crappiness is isolated
to FFmpeg internals.
This commit is contained in:
wm4 2016-08-29 13:13:37 +02:00
parent edbb8f6286
commit 251ecf6e4b
1 changed files with 2 additions and 18 deletions

View File

@ -123,25 +123,9 @@ static int init(struct sd *sd)
if (!ctx)
goto error;
mp_lavc_set_extradata(ctx, sd->codec->extradata, sd->codec->extradata_size);
priv->pkt_timebase = mp_get_codec_timebase(sd->codec);
#if LIBAVCODEC_VERSION_MICRO >= 100
if (cid == AV_CODEC_ID_HDMV_PGS_SUBTITLE) {
// We don't always want to set this, because the ridiculously shitty
// libavcodec API will mess with certain fields (end_display_time)
// when setting it. On the other hand, PGS in particular needs PTS
// mangling. While the PGS decoder doesn't modify the timestamps (just
// reorder it), the ridiculously shitty libavcodec wants a timebase
// anyway and for no good reason. It always sets end_display_time to
// UINT32_MAX (which is a broken and undocumented way to say "unknown"),
// which coincidentally won't be overridden by the ridiculously shitty
// pkt_timebase code. also, Libav doesn't have the pkt_timebase field,
// because Libav tends to avoid _adding_ ridiculously shitty APIs.
priv->pkt_timebase = (AVRational){1, AV_TIME_BASE};
ctx->pkt_timebase = priv->pkt_timebase;
} else {
// But old ffmpeg releases have a buggy pkt_timebase check, because the
// shit above wasn't bad enough!
ctx->pkt_timebase = (AVRational){0, 0};
}
ctx->pkt_timebase = priv->pkt_timebase;
#endif
if (avcodec_open2(ctx, sub_codec, NULL) < 0)
goto error;