mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-02-28 01:31:00 +00:00
avformat/mpegts: unset DTS/PTS for subtitle PES packets if PCR not available
Fixes issues when a subtitle packet is received before PCR for the program has been received, leading to wildly jumping timestamps on the lavf client side as well as in the re-ordering logic. This usually happens in case of multiplexes where the PCR of a program is not taken into account with subtitle tracks' DTS/PTS.
This commit is contained in:
parent
b97a4b6588
commit
a1b4f120c0
@ -1219,6 +1219,7 @@ skip:
|
|||||||
|| pes->st->codecpar->codec_id == AV_CODEC_ID_DVB_SUBTITLE)
|
|| pes->st->codecpar->codec_id == AV_CODEC_ID_DVB_SUBTITLE)
|
||||||
) {
|
) {
|
||||||
AVProgram *p = NULL;
|
AVProgram *p = NULL;
|
||||||
|
int pcr_found = 0;
|
||||||
while ((p = av_find_program_from_stream(pes->stream, p, pes->st->index))) {
|
while ((p = av_find_program_from_stream(pes->stream, p, pes->st->index))) {
|
||||||
if (p->pcr_pid != -1 && p->discard != AVDISCARD_ALL) {
|
if (p->pcr_pid != -1 && p->discard != AVDISCARD_ALL) {
|
||||||
MpegTSFilter *f = pes->ts->pids[p->pcr_pid];
|
MpegTSFilter *f = pes->ts->pids[p->pcr_pid];
|
||||||
@ -1242,6 +1243,7 @@ skip:
|
|||||||
// and the pcr error to this packet should be no more than 100 ms.
|
// and the pcr error to this packet should be no more than 100 ms.
|
||||||
// TODO: we should interpolate the PCR, not just use the last one
|
// TODO: we should interpolate the PCR, not just use the last one
|
||||||
int64_t pcr = f->last_pcr / 300;
|
int64_t pcr = f->last_pcr / 300;
|
||||||
|
pcr_found = 1;
|
||||||
pes->st->pts_wrap_reference = st->pts_wrap_reference;
|
pes->st->pts_wrap_reference = st->pts_wrap_reference;
|
||||||
pes->st->pts_wrap_behavior = st->pts_wrap_behavior;
|
pes->st->pts_wrap_behavior = st->pts_wrap_behavior;
|
||||||
if (pes->dts == AV_NOPTS_VALUE || pes->dts < pcr) {
|
if (pes->dts == AV_NOPTS_VALUE || pes->dts < pcr) {
|
||||||
@ -1258,6 +1260,15 @@ skip:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!pcr_found) {
|
||||||
|
av_log(pes->stream, AV_LOG_VERBOSE,
|
||||||
|
"Forcing DTS/PTS to be unset for a "
|
||||||
|
"non-trustworthy PES packet for PID %d as "
|
||||||
|
"PCR hasn't been received yet.\n",
|
||||||
|
pes->pid);
|
||||||
|
pes->dts = pes->pts = AV_NOPTS_VALUE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user