rtpenc_vp8: Include the picture number in VP8 packets
authorMartin Storsjö <martin@martin.st>
Sun, 9 Dec 2012 23:10:42 +0000 (01:10 +0200)
committerMartin Storsjö <martin@martin.st>
Sun, 16 Dec 2012 19:32:13 +0000 (21:32 +0200)
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>
libavformat/rtpenc.h
libavformat/rtpenc_vp8.c

index 369b413e9d105c0638a5356e8c073b1161377843..5fd0b9ca64714dcdc92d66fbaf6aebc8fa2209cc 100644 (file)
@@ -59,6 +59,8 @@ struct RTPMuxContext {
     int nal_length_size;
 
     int flags;
     int nal_length_size;
 
     int flags;
+
+    unsigned int frame_count;
 };
 
 typedef struct RTPMuxContext RTPMuxContext;
 };
 
 typedef struct RTPMuxContext RTPMuxContext;
index 1730379874dd26465e461a79283fe53b6b7a978c..d24c8bc40d33a5a4c5177fba92dbfea6da0f4f76 100644 (file)
 void ff_rtp_send_vp8(AVFormatContext *s1, const uint8_t *buf, int size)
 {
     RTPMuxContext *s = s1->priv_data;
 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;
 
     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
     // 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);
     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;
 
         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;
     }
 }
     }
 }