|
|
|
@@ -75,6 +75,7 @@ typedef struct RTMPContext { |
|
|
|
uint8_t flv_header[11]; ///< partial incoming flv packet header |
|
|
|
int flv_header_bytes; ///< number of initialized bytes in flv_header |
|
|
|
int nb_invokes; ///< keeps track of invoke messages |
|
|
|
int create_stream_invoke; ///< invoke id for the create stream command |
|
|
|
} RTMPContext; |
|
|
|
|
|
|
|
#define PLAYER_KEY_OPEN_PART_LEN 30 ///< length of partial key used for first client digest signing |
|
|
|
@@ -115,7 +116,7 @@ static void gen_connect(URLContext *s, RTMPContext *rt, const char *proto, |
|
|
|
|
|
|
|
ff_url_join(tcurl, sizeof(tcurl), proto, NULL, host, port, "/%s", rt->app); |
|
|
|
ff_amf_write_string(&p, "connect"); |
|
|
|
ff_amf_write_number(&p, 1.0); |
|
|
|
ff_amf_write_number(&p, ++rt->nb_invokes); |
|
|
|
ff_amf_write_object_start(&p); |
|
|
|
ff_amf_write_field_name(&p, "app"); |
|
|
|
ff_amf_write_string(&p, rt->app); |
|
|
|
@@ -237,6 +238,7 @@ static void gen_create_stream(URLContext *s, RTMPContext *rt) |
|
|
|
ff_amf_write_string(&p, "createStream"); |
|
|
|
ff_amf_write_number(&p, ++rt->nb_invokes); |
|
|
|
ff_amf_write_null(&p); |
|
|
|
rt->create_stream_invoke = rt->nb_invokes; |
|
|
|
|
|
|
|
ff_rtmp_packet_write(rt->stream, &pkt, rt->chunk_size, rt->prev_pkt[1]); |
|
|
|
ff_rtmp_packet_destroy(&pkt); |
|
|
|
@@ -257,7 +259,7 @@ static void gen_delete_stream(URLContext *s, RTMPContext *rt) |
|
|
|
|
|
|
|
p = pkt.data; |
|
|
|
ff_amf_write_string(&p, "deleteStream"); |
|
|
|
ff_amf_write_number(&p, 0.0); |
|
|
|
ff_amf_write_number(&p, ++rt->nb_invokes); |
|
|
|
ff_amf_write_null(&p); |
|
|
|
ff_amf_write_number(&p, rt->main_channel_id); |
|
|
|
|
|
|
|
@@ -281,7 +283,7 @@ static void gen_play(URLContext *s, RTMPContext *rt) |
|
|
|
|
|
|
|
p = pkt.data; |
|
|
|
ff_amf_write_string(&p, "play"); |
|
|
|
ff_amf_write_number(&p, 0.0); |
|
|
|
ff_amf_write_number(&p, ++rt->nb_invokes); |
|
|
|
ff_amf_write_null(&p); |
|
|
|
ff_amf_write_string(&p, rt->playpath); |
|
|
|
|
|
|
|
@@ -315,7 +317,7 @@ static void gen_publish(URLContext *s, RTMPContext *rt) |
|
|
|
|
|
|
|
p = pkt.data; |
|
|
|
ff_amf_write_string(&p, "publish"); |
|
|
|
ff_amf_write_number(&p, 0.0); |
|
|
|
ff_amf_write_number(&p, ++rt->nb_invokes); |
|
|
|
ff_amf_write_null(&p); |
|
|
|
ff_amf_write_string(&p, rt->playpath); |
|
|
|
ff_amf_write_string(&p, "live"); |
|
|
|
@@ -614,7 +616,7 @@ static int rtmp_parse_result(URLContext *s, RTMPContext *rt, RTMPPacket *pkt) |
|
|
|
* releaseStream and FCPublish calls */ |
|
|
|
if (!pkt->data[10]) { |
|
|
|
int pkt_id = (int) av_int2dbl(AV_RB64(pkt->data + 11)); |
|
|
|
if (pkt_id == 4) |
|
|
|
if (pkt_id == rt->create_stream_invoke) |
|
|
|
rt->state = STATE_CONNECTING; |
|
|
|
} |
|
|
|
if (rt->state != STATE_CONNECTING) |
|
|
|
|