[FFmpeg-cvslog] rtmp: Add support for subscribing live streams

Samuel Pitoiset git at videolan.org
Thu Aug 9 01:02:19 CEST 2012


ffmpeg | branch: master | Samuel Pitoiset <samuel.pitoiset at gmail.com> | Tue Aug  7 21:51:46 2012 +0200| [f9e77c1762c6904828550326dbbb2b36905eca1a] | committer: Martin Storsjö

rtmp: Add support for subscribing live streams

When streaming live streams using the Akamai, Edgecast or Limelight CDN,
players cannot simply connect to the live stream. Instead, they have to
subscribe to it, by sending an FC Subscribe call to the server.

Signed-off-by: Martin Storsjö <martin at martin.st>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=f9e77c1762c6904828550326dbbb2b36905eca1a
---

 libavformat/rtmpproto.c |   31 +++++++++++++++++++++++++++++++
 1 file changed, 31 insertions(+)

diff --git a/libavformat/rtmpproto.c b/libavformat/rtmpproto.c
index 1a6b5c1..d21ffea 100644
--- a/libavformat/rtmpproto.c
+++ b/libavformat/rtmpproto.c
@@ -604,6 +604,29 @@ static int gen_bytes_read(URLContext *s, RTMPContext *rt, uint32_t ts)
     return ret;
 }
 
+static int gen_fcsubscribe_stream(URLContext *s, RTMPContext *rt)
+{
+    RTMPPacket pkt;
+    uint8_t *p;
+    int ret;
+
+    if ((ret = ff_rtmp_packet_create(&pkt, RTMP_SYSTEM_CHANNEL, RTMP_PT_INVOKE,
+                                     0, 27 + strlen(rt->playpath))) < 0)
+        return ret;
+
+    p = pkt.data;
+    ff_amf_write_string(&p, "FCSubscribe");
+    ff_amf_write_number(&p, ++rt->nb_invokes);
+    ff_amf_write_null(&p);
+    ff_amf_write_string(&p, rt->playpath);
+
+    ret = ff_rtmp_packet_write(rt->stream, &pkt, rt->chunk_size,
+                               rt->prev_pkt[1]);
+    ff_rtmp_packet_destroy(&pkt);
+
+    return ret;
+}
+
 int ff_rtmp_calc_digest(const uint8_t *src, int len, int gap,
                         const uint8_t *key, int keylen, uint8_t *dst)
 {
@@ -1011,6 +1034,14 @@ static int handle_invoke(URLContext *s, RTMPPacket *pkt)
                 }
                 if ((ret = gen_create_stream(s, rt)) < 0)
                     return ret;
+
+                if (rt->is_input) {
+                    /* Send the FCSubscribe command if live stream. */
+                    if (rt->live == -1) {
+                        if ((ret = gen_fcsubscribe_stream(s, rt)) < 0)
+                            return ret;
+                    }
+                }
                 break;
             case STATE_FCPUBLISH:
                 rt->state = STATE_CONNECTING;



More information about the ffmpeg-cvslog mailing list