On Wed, 1 Aug 2012, Samuel Pitoiset wrote:

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.
---
libavformat/rtmpproto.c | 28 ++++++++++++++++++++++++++++
1 file changed, 28 insertions(+)

diff --git a/libavformat/rtmpproto.c b/libavformat/rtmpproto.c
index 4a35319..c6d327f 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,11 @@ static int handle_invoke(URLContext *s, RTMPPacket *pkt)
                }
                if ((ret = gen_create_stream(s, rt)) < 0)
                    return ret;
+
+                if (rt->is_input) {
+                    if ((ret = gen_fcsubscribe_stream(s, rt)) < 0)
+                        return ret;
+                }
                break;
            case STATE_FCPUBLISH:
                rt->state = STATE_CONNECTING;
--
1.7.11.1

In general this looks good.

librtmp only sends this if the live flag is set. Is there any potential problem in always doing it like here? Our mode flag is set to "any" by default, so it should be sent then as well, but I'm not sure if it would make sense to not send it if explicitly requesting recorded.

// Martin
_______________________________________________
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to