From a71c8384a27f1adedf721ebb25d60930f5e422e3 Mon Sep 17 00:00:00 2001 From: hyc Date: Tue, 16 Mar 2010 07:22:45 +0000 Subject: [PATCH] More for RTMP_Write, cleanup on Close git-svn-id: svn://svn.mplayerhq.hu/rtmpdump/trunk@361 400ebc74-4327-4243-bc38-086b20814532 --- librtmp/rtmp.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 54 insertions(+), 3 deletions(-) diff --git a/librtmp/rtmp.c b/librtmp/rtmp.c index b7a267e..4a63ef0 100644 --- a/librtmp/rtmp.c +++ b/librtmp/rtmp.c @@ -1267,8 +1267,38 @@ SendFCPublish(RTMP *r) return RTMP_SendPacket(r, &packet, true); } +SAVC(FCUnpublish); + +static bool +SendFCUnpublish(RTMP *r) +{ + RTMPPacket packet; + char pbuf[1024], *pend = pbuf + sizeof(pbuf); + + packet.m_nChannel = 0x03; // control channel (invoke) + packet.m_headerType = RTMP_PACKET_SIZE_MEDIUM; + packet.m_packetType = 0x14; // INVOKE + packet.m_nInfoField1 = 0; + packet.m_nInfoField2 = 0; + packet.m_hasAbsTimestamp = 0; + packet.m_body = pbuf + RTMP_MAX_HEADER_SIZE; + + char *enc = packet.m_body; + enc = AMF_EncodeString(enc, pend, &av_FCUnpublish); + enc = AMF_EncodeNumber(enc, pend, ++r->m_numInvokes); + *enc++ = AMF_NULL; + enc = AMF_EncodeString(enc, pend, &r->Link.playpath); + if (!enc) + return false; + + packet.m_nBodySize = enc - packet.m_body; + + return RTMP_SendPacket(r, &packet, true); +} + SAVC(publish); SAVC(live); +/* SAVC(record); */ static bool SendPublish(RTMP *r) @@ -1277,10 +1307,10 @@ SendPublish(RTMP *r) char pbuf[1024], *pend = pbuf + sizeof(pbuf); packet.m_nChannel = 0x04; // source channel (invoke) - packet.m_headerType = RTMP_PACKET_SIZE_MEDIUM; + packet.m_headerType = RTMP_PACKET_SIZE_LARGE; packet.m_packetType = 0x14; // INVOKE packet.m_nInfoField1 = 0; - packet.m_nInfoField2 = 0; + packet.m_nInfoField2 = r->m_stream_id; packet.m_hasAbsTimestamp = 0; packet.m_body = pbuf + RTMP_MAX_HEADER_SIZE; @@ -1292,7 +1322,7 @@ SendPublish(RTMP *r) if (!enc) return false; - enc = AMF_EncodeString(enc, pend, &av_live); + enc = AMF_EncodeString(enc, pend, &av_live); /* av_record */ if (!enc) return false; @@ -1701,6 +1731,7 @@ static const AVal av_NetStream_Seek_Notify = AVC("NetStream.Seek.Notify"); static const AVal av_NetStream_Pause_Notify = AVC("NetStream.Pause.Notify"); static const AVal av_NetStream_Play_UnpublishNotify = AVC("NetStream.Play.UnpublishNotify"); +static const AVal av_NetStream_Publish_Start = AVC("NetStream.Publish.Start"); // Returns 0 for OK/Failed/error, 1 for 'Stop or Complete' static int @@ -1858,6 +1889,20 @@ HandleInvoke(RTMP *r, const char *body, unsigned int nBodySize) } } + else if (AVMATCH(&code, &av_NetStream_Publish_Start)) + { + int i; + r->m_bPlaying = true; + for (i = 0; i < r->m_numCalls; i++) + { + if (AVMATCH(&r->m_methodCalls[i], &av_publish)) + { + AV_erase(r->m_methodCalls, &r->m_numCalls, i, true); + break; + } + } + } + // Return 1 if this is a Play.Complete or Play.Stop else if (AVMATCH(&code, &av_NetStream_Play_Complete) || AVMATCH(&code, &av_NetStream_Play_Stop) @@ -2684,6 +2729,12 @@ RTMP_Close(RTMP *r) if (RTMP_IsConnected(r)) { + if (r->m_stream_id > 0) + { + if ((r->Link.protocol & RTMP_FEATURE_WRITE)) + SendFCUnpublish(r); + SendDeleteStream(r, r->m_stream_id); + } if (r->m_clientID.av_val) { HTTP_Post(r, RTMPT_CLOSE, "", 1); -- 2.50.1