-#endif
-
- return p_block;
-
-
-trash:
- msg_Warn( p_access, "received a too short packet for RTP" );
- block_Release( p_block );
- return NULL;
-}
-
-static block_t *BlockPrebufferRTP( access_t *p_access, block_t *p_block )
-{
- access_sys_t *p_sys = p_access->p_sys;
- mtime_t i_first = mdate();
- int i_count = 0;
- block_t *p = p_block;
-
- for( ;; )
- {
- mtime_t i_date = mdate();
-
- if( p && rtp_ChainInsert( p_access, p ))
- i_count++;
-
- /* Require at least 2 packets in the buffer */
- if( i_count > 2 && (i_date - i_first) > p_sys->i_rtp_late )
- break;
-
- p = BlockParseRTP( p_access, BlockUDP( p_access ));
- if( !p && (i_date - i_first) > p_sys->i_rtp_late )
- {
- msg_Err( p_access, "Error in RTP prebuffering!" );
- break;
- }
- }
-
- msg_Dbg( p_access, "RTP: prebuffered %d packets", i_count - 1 );
- p_access->info.b_prebuffered = VLC_TRUE;
- p = p_sys->p_list;
- p_sys->p_list = p_sys->p_list->p_next;
- p_sys->i_last_seqno = (uint16_t) p->i_dts;
- p->p_next = NULL;
- return p;
-}
-
-static block_t *BlockRTP( access_t *p_access )
-{
- access_sys_t *p_sys = p_access->p_sys;
- block_t *p;
-
- while ( !p_sys->p_list ||
- ( mdate() - p_sys->p_list->i_pts ) < p_sys->i_rtp_late )
- {
- p = BlockParseRTP( p_access, BlockUDP( p_access ));
-
- if ( !p )
- return NULL;
-
- if ( !p_access->info.b_prebuffered )
- return BlockPrebufferRTP( p_access, p );
-
- rtp_ChainInsert( p_access, p );
- }
-
- p = p_sys->p_list;
- p_sys->p_list = p_sys->p_list->p_next;
- p_sys->i_last_seqno++;
- if( p_sys->i_last_seqno != (uint16_t) p->i_dts )
- {
- msg_Dbg( p_access, "RTP: packet(s) lost, expected %d, got %d",
- p_sys->i_last_seqno, (uint16_t) p->i_dts );
- p_sys->i_last_seqno = (uint16_t) p->i_dts;
- }
- p->p_next = NULL;
- return p;
-}
-
-/*****************************************************************************
- * BlockChoose: decide between RTP and UDP
- *****************************************************************************/
-static block_t *BlockChoose( access_t *p_access )
-{
- block_t *p_block;
- int i_rtp_version;
- int i_CSRC_count;
- int i_payload_type;
-
- if( ( p_block = BlockUDP( p_access ) ) == NULL )
- return NULL;
-
- if( p_block->p_buffer[0] == 0x47 )
- {
- msg_Dbg( p_access, "detected TS over raw UDP" );
- p_access->pf_block = BlockUDP;
- return p_block;
- }
-
- if( p_block->i_buffer < RTP_HEADER_LEN )
- return p_block;
-
- /* Parse the header and make some verifications.
- * See RFC 3550. */
-
- i_rtp_version = ( p_block->p_buffer[0] & 0xC0 ) >> 6;
- i_CSRC_count = ( p_block->p_buffer[0] & 0x0F );
- i_payload_type = ( p_block->p_buffer[1] & 0x7F );
-
- if( i_rtp_version != 2 )
- {
- msg_Dbg( p_access, "no supported RTP header detected" );
- p_access->pf_block = BlockUDP;
- return p_block;
- }
-
- switch( i_payload_type )
- {
- case 33:
- msg_Dbg( p_access, "detected TS over RTP" );
- p_access->psz_demux = strdup( "ts" );
- break;
-
- case 14:
- msg_Dbg( p_access, "detected MPEG audio over RTP" );
- p_access->psz_demux = strdup( "mpga" );
- break;
-
- case 32:
- msg_Dbg( p_access, "detected MPEG video over RTP" );
- p_access->psz_demux = strdup( "mpgv" );
- break;
-
- default:
- msg_Dbg( p_access, "no RTP header detected" );
- p_access->pf_block = BlockUDP;
- return p_block;
- }
-
- if( !BlockParseRTP( p_access, p_block )) return NULL;
-
- p_access->pf_block = BlockRTP;