@ -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 ;