Commit 65e05327 authored by Martin Storsjö's avatar Martin Storsjö

rtpenc_vp8: Include the picture number in VP8 packets

This makes it easier for receivers to decide what to do if data
is lost.

Refactor calculating the max payload size, to avoid hardcoding the
header size in too many places, reducing the number of lines that
have to be touched if the header is adjusted further.
Signed-off-by: 's avatarMartin Storsjö <>
parent a421bbfe
......@@ -59,6 +59,8 @@ struct RTPMuxContext {
int nal_length_size;
int flags;
unsigned int frame_count;
typedef struct RTPMuxContext RTPMuxContext;
......@@ -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;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment