@ -26,24 +26,30 @@
void ff_rtp_send_vp8 ( AVFormatContext * s1 , const uint8_t * buf , int size )
void ff_rtp_send_vp8 ( AVFormatContext * s1 , const uint8_t * buf , int size )
{
{
RTPMuxContext * s = s1 - > priv_data ;
RTPMuxContext * s = s1 - > priv_data ;
int len , max_packet_size ;
int len , max_packet_size , header_size ;
s - > buf_ptr = s - > buf ;
s - > buf_ptr = s - > buf ;
s - > timestamp = s - > cur_timestamp ;
s - > timestamp = s - > cur_timestamp ;
max_packet_size = s - > max_payload_size - 1 ; // minus one for header byte
// no extended control bits, reference frame, start of partition,
// extended control bit set , reference frame, start of partition,
// partition id 0
// partition id 0
* s - > buf_ptr + + = 0x10 ;
* s - > buf_ptr + + = 0x90 ;
* s - > buf_ptr + + = 0x80 ; // Picture id present
* s - > buf_ptr + + = s - > frame_count + + & 0x7f ;
// Calculate the number of remaining bytes
header_size = s - > buf_ptr - s - > buf ;
max_packet_size = s - > max_payload_size - header_size ;
while ( size > 0 ) {
while ( size > 0 ) {
len = FFMIN ( size , max_packet_size ) ;
len = FFMIN ( size , max_packet_size ) ;
memcpy ( s - > buf_ptr , buf , len ) ;
memcpy ( s - > buf_ptr , buf , len ) ;
ff_rtp_send_data ( s1 , s - > buf , len + 1 , size = = len ) ; // marker bit is last packet in frame
// marker bit is last packet in frame
ff_rtp_send_data ( s1 , s - > buf , len + header_size , size = = len ) ;
size - = len ;
size - = len ;
buf + = len ;
buf + = len ;
s - > buf_ptr = s - > buf ;
// Clear the partition start bit, keep the rest of the header untouched
* s - > buf_ptr + + = 0 ; // payload descriptor
s - > buf [ 0 ] & = ~ 0x10 ;
}
}
}
}