@ -1351,14 +1351,30 @@ int av_read_frame(AVFormatContext *s, AVPacket *pkt)
if ( next_pkt - > dts ! = AV_NOPTS_VALUE ) {
if ( next_pkt - > dts ! = AV_NOPTS_VALUE ) {
int wrap_bits = s - > streams [ next_pkt - > stream_index ] - > pts_wrap_bits ;
int wrap_bits = s - > streams [ next_pkt - > stream_index ] - > pts_wrap_bits ;
// last dts seen for this stream. if any of packets following
// current one had no dts, we will set this to AV_NOPTS_VALUE.
int64_t last_dts = next_pkt - > dts ;
while ( pktl & & next_pkt - > pts = = AV_NOPTS_VALUE ) {
while ( pktl & & next_pkt - > pts = = AV_NOPTS_VALUE ) {
if ( pktl - > pkt . stream_index = = next_pkt - > stream_index & &
if ( pktl - > pkt . stream_index = = next_pkt - > stream_index & &
( av_compare_mod ( next_pkt - > dts , pktl - > pkt . dts , 2LL < < ( wrap_bits - 1 ) ) < 0 ) & &
( av_compare_mod ( next_pkt - > dts , pktl - > pkt . dts , 2LL < < ( wrap_bits - 1 ) ) < 0 ) ) {
av_compare_mod ( pktl - > pkt . pts , pktl - > pkt . dts , 2LL < < ( wrap_bits - 1 ) ) ) { //not b frame
if ( av_compare_mod ( pktl - > pkt . pts , pktl - > pkt . dts , 2LL < < ( wrap_bits - 1 ) ) ) { //not b frame
next_pkt - > pts = pktl - > pkt . dts ;
next_pkt - > pts = pktl - > pkt . dts ;
}
}
if ( last_dts ! = AV_NOPTS_VALUE ) {
// Once last dts was set to AV_NOPTS_VALUE, we don't change it.
last_dts = pktl - > pkt . dts ;
}
}
pktl = pktl - > next ;
pktl = pktl - > next ;
}
}
if ( eof & & next_pkt - > pts = = AV_NOPTS_VALUE & & last_dts ! = AV_NOPTS_VALUE ) {
// Fixing the last reference frame had none pts issue (For MXF etc).
// We only do this when
// 1. eof.
// 2. we are not able to resolve a pts value for current packet.
// 3. the packets for this stream at the end of the files had valid dts.
next_pkt - > pts = last_dts + next_pkt - > duration ;
}
pktl = s - > packet_buffer ;
pktl = s - > packet_buffer ;
}
}