- if( (i_sequence_expected - i_sequence_number) != 0 )
- {
- /* Handle out of order packets */
- if( p_sys->i_rtp_late > 0 )
- {
- if( (i_sequence_number - i_sequence_expected) > 0 )
- {
- msg_Warn( p_access,
- "RTP packet out of order (too early) expected %u, current %u",
- i_sequence_expected, i_sequence_number );
- if( (i_pcr - p_sys->i_last_pcr) >= (p_sys->i_rtp_late*90) )
- {
- block_t *p_start = p_sys->p_list;
- uint16_t i_start = (!p_start) ? p_sys->i_sequence_number :
- (p_start->p_buffer[2] << 8) +
- p_start->p_buffer[3];
- /* Gap too big, we have been holding this data for too long,
- * send what we have.
- */
- msg_Warn( p_access,
- "Gap too big resyncing: delta %u, held for %d ms",
- (i_pcr - p_sys->i_last_pcr), p_sys->i_rtp_late );
- rtp_ChainInsert( p_access, p_block );
- return rtp_ChainSend( p_access, &p_sys->p_list, i_start );
- }
- /* hold packets that arrive too early. */
- rtp_ChainInsert( p_access, p_block );
- return rtp_ChainSend( p_access, &p_sys->p_list, i_sequence_expected );
- }
- else if( /* ((i_sequence_expected - i_sequence_number ) > 0) && */
- (p_sys->i_last_pcr - i_pcr) >= 0 )
- {
- msg_Warn( p_access,
- "RTP packet out of order (duplicate or too late) expected %u, current %u .. trashing it",
- i_sequence_expected, i_sequence_number );
- block_Release( p_block );
- p_sys->i_sequence_number = i_sequence_number;
- p_sys->i_last_pcr = i_pcr;
- return NULL;
- }