[SCM] libav/experimental: Compress headers for output RTMP packets. Patch by Sergiy (piratfmGMAIL)

siretart at users.alioth.debian.org siretart at users.alioth.debian.org
Sun Jun 30 16:55:29 UTC 2013


The following commit has been merged in the experimental branch:
commit 84a29dc10a9b51a20ea628480df61b43c2b655f8
Author: Sergiy <piratfm at gmail.com>
Date:   Fri Dec 4 15:01:58 2009 +0000

    Compress headers for output RTMP packets.
    Patch by Sergiy (piratfmGMAIL)
    
    Originally committed as revision 20728 to svn://svn.ffmpeg.org/ffmpeg/trunk

diff --git a/libavformat/rtmppkt.c b/libavformat/rtmppkt.c
index 2eab1c1..4ee06bc 100644
--- a/libavformat/rtmppkt.c
+++ b/libavformat/rtmppkt.c
@@ -155,7 +155,19 @@ int ff_rtmp_packet_write(URLContext *h, RTMPPacket *pkt,
     int off = 0;
     pkt->ts_delta = pkt->timestamp - prev_pkt[pkt->channel_id].timestamp;
 
-    //TODO: header compression
+    //if channel_id = 0, this is first presentation of prev_pkt, send full hdr.
+    if (prev_pkt[pkt->channel_id].channel_id &&
+        pkt->extra == prev_pkt[pkt->channel_id].extra) {
+        if (pkt->type == prev_pkt[pkt->channel_id].type &&
+            pkt->data_size == prev_pkt[pkt->channel_id].data_size) {
+            mode = RTMP_PS_FOURBYTES;
+            if (pkt->ts_delta == prev_pkt[pkt->channel_id].ts_delta)
+                mode = RTMP_PS_ONEBYTE;
+        } else {
+            mode = RTMP_PS_EIGHTBYTES;
+        }
+    }
+
     if (pkt->channel_id < 64) {
         bytestream_put_byte(&p, pkt->channel_id | (mode << 6));
     } else if (pkt->channel_id < 64 + 256) {
@@ -179,6 +191,18 @@ int ff_rtmp_packet_write(URLContext *h, RTMPPacket *pkt,
         if (timestamp >= 0xFFFFFF)
             bytestream_put_be32(&p, timestamp);
     }
+    // save history
+    prev_pkt[pkt->channel_id].channel_id = pkt->channel_id;
+    prev_pkt[pkt->channel_id].type       = pkt->type;
+    prev_pkt[pkt->channel_id].data_size  = pkt->data_size;
+    prev_pkt[pkt->channel_id].timestamp  = pkt->timestamp;
+    if (mode != RTMP_PS_TWELVEBYTES) {
+        prev_pkt[pkt->channel_id].ts_delta   = pkt->ts_delta;
+    } else {
+        prev_pkt[pkt->channel_id].ts_delta   = pkt->timestamp;
+    }
+    prev_pkt[pkt->channel_id].extra      = pkt->extra;
+
     url_write(h, pkt_hdr, p-pkt_hdr);
     while (off < pkt->data_size) {
         int towrite = FFMIN(chunk_size, pkt->data_size - off);

-- 
Libav/FFmpeg packaging



More information about the pkg-multimedia-commits mailing list