From 6e4483c5fd0b03794d8cf27b25005381459faeb2 Mon Sep 17 00:00:00 2001
From: Thulinma <jaron@vietors.com>
Date: Fri, 31 Aug 2012 16:56:14 +0200
Subject: [PATCH] RTMP lib upgrades to return strings by reference - note:
 initial testing indicates raptors. Needs to be looked at ASAP!

---
 lib/rtmpchunks.cpp | 36 ++++++++++++++++++------------------
 lib/rtmpchunks.h   | 16 ++++++++--------
 2 files changed, 26 insertions(+), 26 deletions(-)

diff --git a/lib/rtmpchunks.cpp b/lib/rtmpchunks.cpp
index 51a2e9dd..961176db 100644
--- a/lib/rtmpchunks.cpp
+++ b/lib/rtmpchunks.cpp
@@ -36,8 +36,8 @@ std::map<unsigned int, RTMPStream::Chunk> RTMPStream::Chunk::lastrecv;
 /// Packs up the chunk for sending over the network.
 /// \warning Do not call if you are not actually sending the resulting data!
 /// \returns A std::string ready to be sent.
-std::string RTMPStream::Chunk::Pack(){
-  std::string output = "";
+std::string & RTMPStream::Chunk::Pack(){
+  static std::string output = "";
   RTMPStream::Chunk prev = lastsend[cs_id];
   unsigned int tmpi;
   unsigned char chtype = 0x00;
@@ -143,8 +143,8 @@ RTMPStream::Chunk::Chunk(){
 }//constructor
 
 /// Packs up a chunk with the given arguments as properties.
-std::string RTMPStream::SendChunk(unsigned int cs_id, unsigned char msg_type_id, unsigned int msg_stream_id, std::string data){
-  RTMPStream::Chunk ch;
+std::string & RTMPStream::SendChunk(unsigned int cs_id, unsigned char msg_type_id, unsigned int msg_stream_id, std::string data){
+  static RTMPStream::Chunk ch;
   ch.cs_id = cs_id;
   ch.timestamp = RTMPStream::getNowMS();
   ch.len = data.size();
@@ -161,8 +161,8 @@ std::string RTMPStream::SendChunk(unsigned int cs_id, unsigned char msg_type_id,
 /// \param data Contents of the media data.
 /// \param len Length of the media data, in bytes.
 /// \param ts Timestamp of the media data, relative to current system time.
-std::string RTMPStream::SendMedia(unsigned char msg_type_id, unsigned char * data, int len, unsigned int ts){
-  RTMPStream::Chunk ch;
+std::string & RTMPStream::SendMedia(unsigned char msg_type_id, unsigned char * data, int len, unsigned int ts){
+  static RTMPStream::Chunk ch;
   ch.cs_id = msg_type_id+42;
   ch.timestamp = ts;
   ch.len = len;
@@ -170,14 +170,14 @@ std::string RTMPStream::SendMedia(unsigned char msg_type_id, unsigned char * dat
   ch.len_left = 0;
   ch.msg_type_id = msg_type_id;
   ch.msg_stream_id = 1;
-  ch.data.append((char*)data, (size_t)len);
+  ch.data = std::string((char*)data, (size_t)len);
   return ch.Pack();
 }//SendMedia
 
 /// Packs up a chunk with media contents.
 /// \param tag FLV::Tag with media to send.
-std::string RTMPStream::SendMedia(FLV::Tag & tag){
-  RTMPStream::Chunk ch;
+std::string & RTMPStream::SendMedia(FLV::Tag & tag){
+  static RTMPStream::Chunk ch;
   ch.cs_id = ((unsigned char)tag.data[0]);
   ch.timestamp = tag.tagTime();
   ch.len = tag.len-15;
@@ -185,13 +185,13 @@ std::string RTMPStream::SendMedia(FLV::Tag & tag){
   ch.len_left = 0;
   ch.msg_type_id = (unsigned char)tag.data[0];
   ch.msg_stream_id = 1;
-  ch.data.append(tag.data+11, (size_t)(tag.len-15));
+  ch.data = std::string(tag.data+11, (size_t)(tag.len-15));
   return ch.Pack();
 }//SendMedia
 
 /// Packs up a chunk for a control message with 1 argument.
-std::string RTMPStream::SendCTL(unsigned char type, unsigned int data){
-  RTMPStream::Chunk ch;
+std::string & RTMPStream::SendCTL(unsigned char type, unsigned int data){
+  static RTMPStream::Chunk ch;
   ch.cs_id = 2;
   ch.timestamp = RTMPStream::getNowMS();
   ch.len = 4;
@@ -205,8 +205,8 @@ std::string RTMPStream::SendCTL(unsigned char type, unsigned int data){
 }//SendCTL
 
 /// Packs up a chunk for a control message with 2 arguments.
-std::string RTMPStream::SendCTL(unsigned char type, unsigned int data, unsigned char data2){
-  RTMPStream::Chunk ch;
+std::string & RTMPStream::SendCTL(unsigned char type, unsigned int data, unsigned char data2){
+  static RTMPStream::Chunk ch;
   ch.cs_id = 2;
   ch.timestamp = RTMPStream::getNowMS();
   ch.len = 5;
@@ -221,8 +221,8 @@ std::string RTMPStream::SendCTL(unsigned char type, unsigned int data, unsigned
 }//SendCTL
 
 /// Packs up a chunk for a user control message with 1 argument.
-std::string RTMPStream::SendUSR(unsigned char type, unsigned int data){
-  RTMPStream::Chunk ch;
+std::string & RTMPStream::SendUSR(unsigned char type, unsigned int data){
+  static RTMPStream::Chunk ch;
   ch.cs_id = 2;
   ch.timestamp = RTMPStream::getNowMS();
   ch.len = 6;
@@ -238,8 +238,8 @@ std::string RTMPStream::SendUSR(unsigned char type, unsigned int data){
 }//SendUSR
 
 /// Packs up a chunk for a user control message with 2 arguments.
-std::string RTMPStream::SendUSR(unsigned char type, unsigned int data, unsigned int data2){
-  RTMPStream::Chunk ch;
+std::string & RTMPStream::SendUSR(unsigned char type, unsigned int data, unsigned int data2){
+  static RTMPStream::Chunk ch;
   ch.cs_id = 2;
   ch.timestamp = RTMPStream::getNowMS();
   ch.len = 10;
diff --git a/lib/rtmpchunks.h b/lib/rtmpchunks.h
index 009cfd29..e153f4ca 100644
--- a/lib/rtmpchunks.h
+++ b/lib/rtmpchunks.h
@@ -46,20 +46,20 @@ namespace RTMPStream{
 
       Chunk();
       bool Parse(std::string & data);
-      std::string Pack();
+      std::string & Pack();
 
     private:
       static std::map<unsigned int, Chunk> lastsend;
       static std::map<unsigned int, Chunk> lastrecv;
   };//RTMPStream::Chunk
 
-  std::string SendChunk(unsigned int cs_id, unsigned char msg_type_id, unsigned int msg_stream_id, std::string data);
-  std::string SendMedia(unsigned char msg_type_id, unsigned char * data, int len, unsigned int ts);
-  std::string SendMedia(FLV::Tag & tag);
-  std::string SendCTL(unsigned char type, unsigned int data);
-  std::string SendCTL(unsigned char type, unsigned int data, unsigned char data2);
-  std::string SendUSR(unsigned char type, unsigned int data);
-  std::string SendUSR(unsigned char type, unsigned int data, unsigned int data2);
+  std::string & SendChunk(unsigned int cs_id, unsigned char msg_type_id, unsigned int msg_stream_id, std::string data);
+  std::string & SendMedia(unsigned char msg_type_id, unsigned char * data, int len, unsigned int ts);
+  std::string & SendMedia(FLV::Tag & tag);
+  std::string & SendCTL(unsigned char type, unsigned int data);
+  std::string & SendCTL(unsigned char type, unsigned int data, unsigned char data2);
+  std::string & SendUSR(unsigned char type, unsigned int data);
+  std::string & SendUSR(unsigned char type, unsigned int data, unsigned int data2);
 
   /// This value should be set to the first 1537 bytes received.
   extern std::string handshake_in;