diff --git a/libavformat/rtpenc.h b/libavformat/rtpenc.h index 369b413e9d..5fd0b9ca64 100644 --- a/libavformat/rtpenc.h +++ b/libavformat/rtpenc.h @@ -59,6 +59,8 @@ struct RTPMuxContext { int nal_length_size; int flags; + + unsigned int frame_count; }; typedef struct RTPMuxContext RTPMuxContext; diff --git a/libavformat/rtpenc_vp8.c b/libavformat/rtpenc_vp8.c index 1730379874..d24c8bc40d 100644 --- a/libavformat/rtpenc_vp8.c +++ b/libavformat/rtpenc_vp8.c @@ -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; } }