aboutsummaryrefslogtreecommitdiffstats
path: root/libavformat
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2012-12-10 01:10:42 +0200
committerMartin Storsjö <martin@martin.st>2012-12-16 21:32:13 +0200
commit65e053271a98f7acf3ef6b412998cfcb44a8eef8 (patch)
tree7015094870c8fa06cdacb328c783e7cc876cc677 /libavformat
parenta421bbfe83ad55eff335fc19bbacc1e9fecfc3cf (diff)
downloadffmpeg-65e053271a98f7acf3ef6b412998cfcb44a8eef8.tar.gz
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: Martin Storsjö <martin@martin.st>
Diffstat (limited to 'libavformat')
-rw-r--r--libavformat/rtpenc.h2
-rw-r--r--libavformat/rtpenc_vp8.c20
2 files changed, 15 insertions, 7 deletions
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;
}
}