+ ff_rtmp_packet_destroy(&pkt);
+}
+
+/**
+ * Generate 'releaseStream' call and send it to the server. It should make
+ * the server release some channel for media streams.
+ */
+static void gen_release_stream(URLContext *s, RTMPContext *rt)
+{
+ RTMPPacket pkt;
+ uint8_t *p;
+
+ ff_rtmp_packet_create(&pkt, RTMP_SYSTEM_CHANNEL, RTMP_PT_INVOKE, 0,
+ 29 + strlen(rt->playpath));
+
+ av_log(s, AV_LOG_DEBUG, "Releasing stream...\n");
+ p = pkt.data;
+ ff_amf_write_string(&p, "releaseStream");
+ ff_amf_write_number(&p, 2.0);
+ ff_amf_write_null(&p);
+ ff_amf_write_string(&p, rt->playpath);
+
+ ff_rtmp_packet_write(rt->stream, &pkt, rt->chunk_size, rt->prev_pkt[1]);
+ ff_rtmp_packet_destroy(&pkt);
+}
+
+/**
+ * Generate 'FCPublish' call and send it to the server. It should make
+ * the server preapare for receiving media streams.
+ */
+static void gen_fcpublish_stream(URLContext *s, RTMPContext *rt)
+{
+ RTMPPacket pkt;
+ uint8_t *p;
+
+ ff_rtmp_packet_create(&pkt, RTMP_SYSTEM_CHANNEL, RTMP_PT_INVOKE, 0,
+ 25 + strlen(rt->playpath));
+
+ av_log(s, AV_LOG_DEBUG, "FCPublish stream...\n");
+ p = pkt.data;
+ ff_amf_write_string(&p, "FCPublish");
+ ff_amf_write_number(&p, 3.0);
+ ff_amf_write_null(&p);
+ ff_amf_write_string(&p, rt->playpath);
+
+ ff_rtmp_packet_write(rt->stream, &pkt, rt->chunk_size, rt->prev_pkt[1]);
+ ff_rtmp_packet_destroy(&pkt);
+}
+
+/**
+ * Generate 'FCUnpublish' call and send it to the server. It should make
+ * the server destroy stream.
+ */
+static void gen_fcunpublish_stream(URLContext *s, RTMPContext *rt)
+{
+ RTMPPacket pkt;
+ uint8_t *p;
+
+ ff_rtmp_packet_create(&pkt, RTMP_SYSTEM_CHANNEL, RTMP_PT_INVOKE, 0,
+ 27 + strlen(rt->playpath));
+
+ av_log(s, AV_LOG_DEBUG, "UnPublishing stream...\n");
+ p = pkt.data;
+ ff_amf_write_string(&p, "FCUnpublish");
+ ff_amf_write_number(&p, 5.0);
+ ff_amf_write_null(&p);
+ ff_amf_write_string(&p, rt->playpath);
+
+ ff_rtmp_packet_write(rt->stream, &pkt, rt->chunk_size, rt->prev_pkt[1]);
+ ff_rtmp_packet_destroy(&pkt);