|
|
@@ -26,24 +26,30 @@ |
|
|
|
void ff_rtp_send_vp8(AVFormatContext *s1, const uint8_t *buf, int size) |
|
|
|
{ |
|
|
|
RTPMuxContext *s = s1->priv_data; |
|
|
|
int len, max_packet_size; |
|
|
|
int len, max_packet_size, header_size; |
|
|
|
|
|
|
|
s->buf_ptr = s->buf; |
|
|
|
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 |
|
|
|
*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) { |
|
|
|
len = FFMIN(size, max_packet_size); |
|
|
|
|
|
|
|
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; |
|
|
|
buf += len; |
|
|
|
s->buf_ptr = s->buf; |
|
|
|
*s->buf_ptr++ = 0; // payload descriptor |
|
|
|
// Clear the partition start bit, keep the rest of the header untouched |
|
|
|
s->buf[0] &= ~0x10; |
|
|
|
} |
|
|
|
} |