From 1a4cd15a041588ca4ae3b2e255806f7185f6e8f1 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Thu, 28 Mar 2013 02:58:40 +0100 Subject: [PATCH 1/2] Attempt to fix RTMP compatibility with FCPublish-based media sources that expect replies to releaseStream and FCPublish commands. --- src/connectors/conn_rtmp.cpp | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/connectors/conn_rtmp.cpp b/src/connectors/conn_rtmp.cpp index 613496d6..bbc8b5e0 100644 --- a/src/connectors/conn_rtmp.cpp +++ b/src/connectors/conn_rtmp.cpp @@ -465,10 +465,32 @@ void Connector_RTMP::parseAMFCommand(AMF::Object & amfdata, int messagetype, int } return; } - if ((amfdata.getContentP(0)->StrValue() == "FCPublish") || (amfdata.getContentP(0)->StrValue() == "FCUnpublish") || (amfdata.getContentP(0)->StrValue() == "releaseStream")){ + if ((amfdata.getContentP(0)->StrValue() == "FCUnpublish") || (amfdata.getContentP(0)->StrValue() == "releaseStream")){ // ignored return; } + if ((amfdata.getContentP(0)->StrValue() == "FCPublish")){ + //send a FCPublic reply + amfreply = AMF::Object("container", AMF::AMF0_DDV_CONTAINER); + amfreply.addContent(AMF::Object("", "onFCPublish")); //status reply + amfreply.addContent(AMF::Object("", 0, AMF::AMF0_NUMBER)); //same transaction ID + amfreply.addContent(AMF::Object("", (double)0, AMF::AMF0_NULL)); //null - command info + amfreply.addContent(AMF::Object("")); //info + amfreply.getContentP(3)->addContent(AMF::Object("code", "NetStream.Publish.Start")); + amfreply.getContentP(3)->addContent(AMF::Object("description", "Please followup with publish command...")); + sendCommand(amfreply, messagetype, stream_id); + return; + } //FCPublish + if (amfdata.getContentP(0)->StrValue() == "releaseStream"){ + //send a _result reply + AMF::Object amfreply("container", AMF::AMF0_DDV_CONTAINER); + amfreply.addContent(AMF::Object("", "_result")); //result success + amfreply.addContent(amfdata.getContent(1)); //same transaction ID + amfreply.addContent(AMF::Object("", (double)0, AMF::AMF0_NULL)); //null - command info + amfreply.addContent(AMF::Object("", AMF0_UNDEFINED)); //stream ID? + sendCommand(amfreply, messagetype, stream_id); + return; + }//releaseStream if ((amfdata.getContentP(0)->StrValue() == "getStreamLength") || (amfdata.getContentP(0)->StrValue() == "getMovLen")){ //send a _result reply AMF::Object amfreply("container", AMF::AMF0_DDV_CONTAINER); @@ -516,7 +538,7 @@ void Connector_RTMP::parseAMFCommand(AMF::Object & amfdata, int messagetype, int amfreply.getContentP(3)->addContent(AMF::Object("clientid", (double)1337)); sendCommand(amfreply, messagetype, stream_id); return; - } //getStreamLength + } //publish if (amfdata.getContentP(0)->StrValue() == "checkBandwidth"){ //send a _result reply AMF::Object amfreply("container", AMF::AMF0_DDV_CONTAINER); From 6159149a49ffa89a08dcee536ce83d50026ee53a Mon Sep 17 00:00:00 2001 From: Thulinma Date: Fri, 29 Mar 2013 23:03:15 +0100 Subject: [PATCH 2/2] Fixed typos in previous edits. --- src/connectors/conn_rtmp.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/connectors/conn_rtmp.cpp b/src/connectors/conn_rtmp.cpp index bbc8b5e0..def1fc79 100644 --- a/src/connectors/conn_rtmp.cpp +++ b/src/connectors/conn_rtmp.cpp @@ -471,7 +471,7 @@ void Connector_RTMP::parseAMFCommand(AMF::Object & amfdata, int messagetype, int } if ((amfdata.getContentP(0)->StrValue() == "FCPublish")){ //send a FCPublic reply - amfreply = AMF::Object("container", AMF::AMF0_DDV_CONTAINER); + AMF::Object amfreply("container", AMF::AMF0_DDV_CONTAINER); amfreply.addContent(AMF::Object("", "onFCPublish")); //status reply amfreply.addContent(AMF::Object("", 0, AMF::AMF0_NUMBER)); //same transaction ID amfreply.addContent(AMF::Object("", (double)0, AMF::AMF0_NULL)); //null - command info @@ -487,7 +487,7 @@ void Connector_RTMP::parseAMFCommand(AMF::Object & amfdata, int messagetype, int amfreply.addContent(AMF::Object("", "_result")); //result success amfreply.addContent(amfdata.getContent(1)); //same transaction ID amfreply.addContent(AMF::Object("", (double)0, AMF::AMF0_NULL)); //null - command info - amfreply.addContent(AMF::Object("", AMF0_UNDEFINED)); //stream ID? + amfreply.addContent(AMF::Object("", AMF::AMF0_UNDEFINED)); //stream ID? sendCommand(amfreply, messagetype, stream_id); return; }//releaseStream