winlin

refine rtmp protocol stack, refer to go.rtmp

@@ -455,7 +455,7 @@ int SrsDvrPlan::on_meta_data(SrsOnMetaDataPacket* metadata) @@ -455,7 +455,7 @@ int SrsDvrPlan::on_meta_data(SrsOnMetaDataPacket* metadata)
455 return ret; 455 return ret;
456 } 456 }
457 457
458 -int SrsDvrPlan::on_audio(SrsSharedPtrMessage* audio) 458 +int SrsDvrPlan::on_audio(__SrsSharedPtrMessage* audio)
459 { 459 {
460 int ret = ERROR_SUCCESS; 460 int ret = ERROR_SUCCESS;
461 461
@@ -481,7 +481,7 @@ int SrsDvrPlan::on_audio(SrsSharedPtrMessage* audio) @@ -481,7 +481,7 @@ int SrsDvrPlan::on_audio(SrsSharedPtrMessage* audio)
481 return ret; 481 return ret;
482 } 482 }
483 483
484 -int SrsDvrPlan::on_video(SrsSharedPtrMessage* video) 484 +int SrsDvrPlan::on_video(__SrsSharedPtrMessage* video)
485 { 485 {
486 int ret = ERROR_SUCCESS; 486 int ret = ERROR_SUCCESS;
487 487
@@ -573,7 +573,7 @@ int SrsDvrPlan::flv_close() @@ -573,7 +573,7 @@ int SrsDvrPlan::flv_close()
573 return ret; 573 return ret;
574 } 574 }
575 575
576 -int SrsDvrPlan::update_duration(SrsSharedPtrMessage* msg) 576 +int SrsDvrPlan::update_duration(__SrsSharedPtrMessage* msg)
577 { 577 {
578 int ret = ERROR_SUCCESS; 578 int ret = ERROR_SUCCESS;
579 579
@@ -720,7 +720,7 @@ void SrsDvrSegmentPlan::on_unpublish() @@ -720,7 +720,7 @@ void SrsDvrSegmentPlan::on_unpublish()
720 dvr_enabled = false; 720 dvr_enabled = false;
721 } 721 }
722 722
723 -int SrsDvrSegmentPlan::update_duration(SrsSharedPtrMessage* msg) 723 +int SrsDvrSegmentPlan::update_duration(__SrsSharedPtrMessage* msg)
724 { 724 {
725 int ret = ERROR_SUCCESS; 725 int ret = ERROR_SUCCESS;
726 726
@@ -903,7 +903,7 @@ int SrsDvrHssPlan::on_dvr_reap_flv_header(string path) @@ -903,7 +903,7 @@ int SrsDvrHssPlan::on_dvr_reap_flv_header(string path)
903 return ret; 903 return ret;
904 } 904 }
905 905
906 -int SrsDvrHssPlan::update_duration(SrsSharedPtrMessage* msg) 906 +int SrsDvrHssPlan::update_duration(__SrsSharedPtrMessage* msg)
907 { 907 {
908 int ret = ERROR_SUCCESS; 908 int ret = ERROR_SUCCESS;
909 909
@@ -998,11 +998,11 @@ int SrsDvr::on_meta_data(SrsOnMetaDataPacket* metadata) @@ -998,11 +998,11 @@ int SrsDvr::on_meta_data(SrsOnMetaDataPacket* metadata)
998 return ret; 998 return ret;
999 } 999 }
1000 1000
1001 -int SrsDvr::on_audio(SrsSharedPtrMessage* audio) 1001 +int SrsDvr::on_audio(__SrsSharedPtrMessage* audio)
1002 { 1002 {
1003 int ret = ERROR_SUCCESS; 1003 int ret = ERROR_SUCCESS;
1004 1004
1005 - SrsAutoFree(SrsSharedPtrMessage, audio, false); 1005 + SrsAutoFree(__SrsSharedPtrMessage, audio, false);
1006 1006
1007 if ((ret = plan->on_audio(audio)) != ERROR_SUCCESS) { 1007 if ((ret = plan->on_audio(audio)) != ERROR_SUCCESS) {
1008 return ret; 1008 return ret;
@@ -1011,11 +1011,11 @@ int SrsDvr::on_audio(SrsSharedPtrMessage* audio) @@ -1011,11 +1011,11 @@ int SrsDvr::on_audio(SrsSharedPtrMessage* audio)
1011 return ret; 1011 return ret;
1012 } 1012 }
1013 1013
1014 -int SrsDvr::on_video(SrsSharedPtrMessage* video) 1014 +int SrsDvr::on_video(__SrsSharedPtrMessage* video)
1015 { 1015 {
1016 int ret = ERROR_SUCCESS; 1016 int ret = ERROR_SUCCESS;
1017 1017
1018 - SrsAutoFree(SrsSharedPtrMessage, video, false); 1018 + SrsAutoFree(__SrsSharedPtrMessage, video, false);
1019 1019
1020 if ((ret = plan->on_video(video)) != ERROR_SUCCESS) { 1020 if ((ret = plan->on_video(video)) != ERROR_SUCCESS) {
1021 return ret; 1021 return ret;
@@ -36,7 +36,7 @@ class SrsRequest; @@ -36,7 +36,7 @@ class SrsRequest;
36 class SrsStream; 36 class SrsStream;
37 class SrsRtmpJitter; 37 class SrsRtmpJitter;
38 class SrsOnMetaDataPacket; 38 class SrsOnMetaDataPacket;
39 -class SrsSharedPtrMessage; 39 +class __SrsSharedPtrMessage;
40 40
41 /** 41 /**
42 * file stream to read/write file. 42 * file stream to read/write file.
@@ -185,13 +185,13 @@ public: @@ -185,13 +185,13 @@ public:
185 virtual int on_publish(); 185 virtual int on_publish();
186 virtual void on_unpublish() = 0; 186 virtual void on_unpublish() = 0;
187 virtual int on_meta_data(SrsOnMetaDataPacket* metadata); 187 virtual int on_meta_data(SrsOnMetaDataPacket* metadata);
188 - virtual int on_audio(SrsSharedPtrMessage* audio);  
189 - virtual int on_video(SrsSharedPtrMessage* video); 188 + virtual int on_audio(__SrsSharedPtrMessage* audio);
  189 + virtual int on_video(__SrsSharedPtrMessage* video);
190 protected: 190 protected:
191 virtual int flv_open(std::string stream, std::string path); 191 virtual int flv_open(std::string stream, std::string path);
192 virtual int flv_close(); 192 virtual int flv_close();
193 virtual int open_new_segment(); 193 virtual int open_new_segment();
194 - virtual int update_duration(SrsSharedPtrMessage* msg); 194 + virtual int update_duration(__SrsSharedPtrMessage* msg);
195 virtual int write_flv_header(); 195 virtual int write_flv_header();
196 virtual int on_dvr_request_sh(); 196 virtual int on_dvr_request_sh();
197 virtual int on_video_keyframe(); 197 virtual int on_video_keyframe();
@@ -233,7 +233,7 @@ public: @@ -233,7 +233,7 @@ public:
233 virtual int on_publish(); 233 virtual int on_publish();
234 virtual void on_unpublish(); 234 virtual void on_unpublish();
235 private: 235 private:
236 - virtual int update_duration(SrsSharedPtrMessage* msg); 236 + virtual int update_duration(__SrsSharedPtrMessage* msg);
237 }; 237 };
238 238
239 /** 239 /**
@@ -260,7 +260,7 @@ protected: @@ -260,7 +260,7 @@ protected:
260 virtual int64_t filter_timestamp(int64_t timestamp); 260 virtual int64_t filter_timestamp(int64_t timestamp);
261 private: 261 private:
262 virtual int on_dvr_reap_flv_header(std::string path); 262 virtual int on_dvr_reap_flv_header(std::string path);
263 - virtual int update_duration(SrsSharedPtrMessage* msg); 263 + virtual int update_duration(__SrsSharedPtrMessage* msg);
264 }; 264 };
265 265
266 /** 266 /**
@@ -300,11 +300,11 @@ public: @@ -300,11 +300,11 @@ public:
300 /** 300 /**
301 * mux the audio packets to dvr. 301 * mux the audio packets to dvr.
302 */ 302 */
303 - virtual int on_audio(SrsSharedPtrMessage* audio); 303 + virtual int on_audio(__SrsSharedPtrMessage* audio);
304 /** 304 /**
305 * mux the video packets to dvr. 305 * mux the video packets to dvr.
306 */ 306 */
307 - virtual int on_video(SrsSharedPtrMessage* video); 307 + virtual int on_video(__SrsSharedPtrMessage* video);
308 }; 308 };
309 309
310 #endif 310 #endif
@@ -175,15 +175,15 @@ int SrsEdgeIngester::ingest() @@ -175,15 +175,15 @@ int SrsEdgeIngester::ingest()
175 } 175 }
176 176
177 // read from client. 177 // read from client.
178 - SrsCommonMessage* msg = NULL;  
179 - if ((ret = client->recv_message(&msg)) != ERROR_SUCCESS) { 178 + __SrsMessage* msg = NULL;
  179 + if ((ret = client->__recv_message(&msg)) != ERROR_SUCCESS) {
180 srs_error("ingest recv origin server message failed. ret=%d", ret); 180 srs_error("ingest recv origin server message failed. ret=%d", ret);
181 return ret; 181 return ret;
182 } 182 }
183 srs_verbose("edge loop recv message. ret=%d", ret); 183 srs_verbose("edge loop recv message. ret=%d", ret);
184 184
185 srs_assert(msg); 185 srs_assert(msg);
186 - SrsAutoFree(SrsCommonMessage, msg, false); 186 + SrsAutoFree(__SrsMessage, msg, false);
187 187
188 if ((ret = process_publish_message(msg)) != ERROR_SUCCESS) { 188 if ((ret = process_publish_message(msg)) != ERROR_SUCCESS) {
189 return ret; 189 return ret;
@@ -193,7 +193,7 @@ int SrsEdgeIngester::ingest() @@ -193,7 +193,7 @@ int SrsEdgeIngester::ingest()
193 return ret; 193 return ret;
194 } 194 }
195 195
196 -int SrsEdgeIngester::process_publish_message(SrsCommonMessage* msg) 196 +int SrsEdgeIngester::process_publish_message(__SrsMessage* msg)
197 { 197 {
198 int ret = ERROR_SUCCESS; 198 int ret = ERROR_SUCCESS;
199 199
@@ -217,12 +217,13 @@ int SrsEdgeIngester::process_publish_message(SrsCommonMessage* msg) @@ -217,12 +217,13 @@ int SrsEdgeIngester::process_publish_message(SrsCommonMessage* msg)
217 217
218 // process onMetaData 218 // process onMetaData
219 if (msg->header.is_amf0_data() || msg->header.is_amf3_data()) { 219 if (msg->header.is_amf0_data() || msg->header.is_amf3_data()) {
220 - if ((ret = msg->decode_packet(client->get_protocol())) != ERROR_SUCCESS) { 220 + SrsPacket* pkt = NULL;
  221 + if ((ret = client->__decode_message(msg, &pkt)) != ERROR_SUCCESS) {
221 srs_error("decode onMetaData message failed. ret=%d", ret); 222 srs_error("decode onMetaData message failed. ret=%d", ret);
222 return ret; 223 return ret;
223 } 224 }
  225 + SrsAutoFree(SrsPacket, pkt, false);
224 226
225 - SrsPacket* pkt = msg->get_packet();  
226 if (dynamic_cast<SrsOnMetaDataPacket*>(pkt)) { 227 if (dynamic_cast<SrsOnMetaDataPacket*>(pkt)) {
227 SrsOnMetaDataPacket* metadata = dynamic_cast<SrsOnMetaDataPacket*>(pkt); 228 SrsOnMetaDataPacket* metadata = dynamic_cast<SrsOnMetaDataPacket*>(pkt);
228 if ((ret = source->on_meta_data(msg, metadata)) != ERROR_SUCCESS) { 229 if ((ret = source->on_meta_data(msg, metadata)) != ERROR_SUCCESS) {
@@ -419,8 +420,8 @@ int SrsEdgeForwarder::cycle() @@ -419,8 +420,8 @@ int SrsEdgeForwarder::cycle()
419 420
420 // read from client. 421 // read from client.
421 if (true) { 422 if (true) {
422 - SrsCommonMessage* msg = NULL;  
423 - ret = client->recv_message(&msg); 423 + __SrsMessage* msg = NULL;
  424 + ret = client->__recv_message(&msg);
424 425
425 srs_verbose("edge loop recv message. ret=%d", ret); 426 srs_verbose("edge loop recv message. ret=%d", ret);
426 if (ret != ERROR_SUCCESS && ret != ERROR_SOCKET_TIMEOUT) { 427 if (ret != ERROR_SUCCESS && ret != ERROR_SOCKET_TIMEOUT) {
@@ -434,7 +435,7 @@ int SrsEdgeForwarder::cycle() @@ -434,7 +435,7 @@ int SrsEdgeForwarder::cycle()
434 435
435 // forward all messages. 436 // forward all messages.
436 int count = 0; 437 int count = 0;
437 - SrsSharedPtrMessage** msgs = NULL; 438 + __SrsSharedPtrMessage** msgs = NULL;
438 if ((ret = queue->get_packets(0, msgs, count)) != ERROR_SUCCESS) { 439 if ((ret = queue->get_packets(0, msgs, count)) != ERROR_SUCCESS) {
439 srs_error("get message to forward to origin failed. ret=%d", ret); 440 srs_error("get message to forward to origin failed. ret=%d", ret);
440 return ret; 441 return ret;
@@ -455,16 +456,16 @@ int SrsEdgeForwarder::cycle() @@ -455,16 +456,16 @@ int SrsEdgeForwarder::cycle()
455 srs_verbose("no packets to forward."); 456 srs_verbose("no packets to forward.");
456 continue; 457 continue;
457 } 458 }
458 - SrsAutoFree(SrsSharedPtrMessage*, msgs, true); 459 + SrsAutoFree(__SrsSharedPtrMessage*, msgs, true);
459 460
460 // all msgs to forward. 461 // all msgs to forward.
461 for (int i = 0; i < count; i++) { 462 for (int i = 0; i < count; i++) {
462 - SrsSharedPtrMessage* msg = msgs[i]; 463 + __SrsSharedPtrMessage* msg = msgs[i];
463 464
464 srs_assert(msg); 465 srs_assert(msg);
465 msgs[i] = NULL; 466 msgs[i] = NULL;
466 467
467 - if ((ret = client->send_message(msg)) != ERROR_SUCCESS) { 468 + if ((ret = client->__send_and_free_message(msg)) != ERROR_SUCCESS) {
468 srs_error("edge publish forwarder send message to server failed. ret=%d", ret); 469 srs_error("edge publish forwarder send message to server failed. ret=%d", ret);
469 return ret; 470 return ret;
470 } 471 }
@@ -474,7 +475,7 @@ int SrsEdgeForwarder::cycle() @@ -474,7 +475,7 @@ int SrsEdgeForwarder::cycle()
474 return ret; 475 return ret;
475 } 476 }
476 477
477 -int SrsEdgeForwarder::proxy(SrsCommonMessage* msg) 478 +int SrsEdgeForwarder::proxy(__SrsMessage* msg)
478 { 479 {
479 int ret = ERROR_SUCCESS; 480 int ret = ERROR_SUCCESS;
480 481
@@ -494,8 +495,8 @@ int SrsEdgeForwarder::proxy(SrsCommonMessage* msg) @@ -494,8 +495,8 @@ int SrsEdgeForwarder::proxy(SrsCommonMessage* msg)
494 } 495 }
495 496
496 // TODO: FIXME: use utility to copy msg to shared ptr msg. 497 // TODO: FIXME: use utility to copy msg to shared ptr msg.
497 - SrsSharedPtrMessage* copy = new SrsSharedPtrMessage();  
498 - SrsAutoFree(SrsSharedPtrMessage, copy, false); 498 + __SrsSharedPtrMessage* copy = new __SrsSharedPtrMessage();
  499 + SrsAutoFree(__SrsSharedPtrMessage, copy, false);
499 if ((ret = copy->initialize(msg)) != ERROR_SUCCESS) { 500 if ((ret = copy->initialize(msg)) != ERROR_SUCCESS) {
500 srs_error("initialize the msg failed. ret=%d", ret); 501 srs_error("initialize the msg failed. ret=%d", ret);
501 return ret; 502 return ret;
@@ -723,7 +724,7 @@ int SrsPublishEdge::on_client_publish() @@ -723,7 +724,7 @@ int SrsPublishEdge::on_client_publish()
723 return ret; 724 return ret;
724 } 725 }
725 726
726 -int SrsPublishEdge::on_proxy_publish(SrsCommonMessage* msg) 727 +int SrsPublishEdge::on_proxy_publish(__SrsMessage* msg)
727 { 728 {
728 return forwarder->proxy(msg); 729 return forwarder->proxy(msg);
729 } 730 }
@@ -40,7 +40,7 @@ class SrsRequest; @@ -40,7 +40,7 @@ class SrsRequest;
40 class SrsPlayEdge; 40 class SrsPlayEdge;
41 class SrsPublishEdge; 41 class SrsPublishEdge;
42 class SrsRtmpClient; 42 class SrsRtmpClient;
43 -class SrsCommonMessage; 43 +class __SrsMessage;
44 class SrsMessageQueue; 44 class SrsMessageQueue;
45 class ISrsProtocolReaderWriter; 45 class ISrsProtocolReaderWriter;
46 46
@@ -99,7 +99,7 @@ private: @@ -99,7 +99,7 @@ private:
99 virtual int ingest(); 99 virtual int ingest();
100 virtual void close_underlayer_socket(); 100 virtual void close_underlayer_socket();
101 virtual int connect_server(); 101 virtual int connect_server();
102 - virtual int process_publish_message(SrsCommonMessage* msg); 102 + virtual int process_publish_message(__SrsMessage* msg);
103 }; 103 };
104 104
105 /** 105 /**
@@ -142,7 +142,7 @@ public: @@ -142,7 +142,7 @@ public:
142 public: 142 public:
143 virtual int cycle(); 143 virtual int cycle();
144 public: 144 public:
145 - virtual int proxy(SrsCommonMessage* msg); 145 + virtual int proxy(__SrsMessage* msg);
146 private: 146 private:
147 virtual void close_underlayer_socket(); 147 virtual void close_underlayer_socket();
148 virtual int connect_server(); 148 virtual int connect_server();
@@ -202,7 +202,7 @@ public: @@ -202,7 +202,7 @@ public:
202 /** 202 /**
203 * proxy publish stream to edge 203 * proxy publish stream to edge
204 */ 204 */
205 - virtual int on_proxy_publish(SrsCommonMessage* msg); 205 + virtual int on_proxy_publish(__SrsMessage* msg);
206 /** 206 /**
207 * proxy unpublish stream to edge. 207 * proxy unpublish stream to edge.
208 */ 208 */
@@ -148,7 +148,7 @@ void SrsForwarder::on_unpublish() @@ -148,7 +148,7 @@ void SrsForwarder::on_unpublish()
148 srs_freep(io); 148 srs_freep(io);
149 } 149 }
150 150
151 -int SrsForwarder::on_meta_data(SrsSharedPtrMessage* metadata) 151 +int SrsForwarder::on_meta_data(__SrsSharedPtrMessage* metadata)
152 { 152 {
153 int ret = ERROR_SUCCESS; 153 int ret = ERROR_SUCCESS;
154 154
@@ -164,7 +164,7 @@ int SrsForwarder::on_meta_data(SrsSharedPtrMessage* metadata) @@ -164,7 +164,7 @@ int SrsForwarder::on_meta_data(SrsSharedPtrMessage* metadata)
164 return ret; 164 return ret;
165 } 165 }
166 166
167 -int SrsForwarder::on_audio(SrsSharedPtrMessage* msg) 167 +int SrsForwarder::on_audio(__SrsSharedPtrMessage* msg)
168 { 168 {
169 int ret = ERROR_SUCCESS; 169 int ret = ERROR_SUCCESS;
170 170
@@ -180,7 +180,7 @@ int SrsForwarder::on_audio(SrsSharedPtrMessage* msg) @@ -180,7 +180,7 @@ int SrsForwarder::on_audio(SrsSharedPtrMessage* msg)
180 return ret; 180 return ret;
181 } 181 }
182 182
183 -int SrsForwarder::on_video(SrsSharedPtrMessage* msg) 183 +int SrsForwarder::on_video(__SrsSharedPtrMessage* msg)
184 { 184 {
185 int ret = ERROR_SUCCESS; 185 int ret = ERROR_SUCCESS;
186 186
@@ -329,7 +329,7 @@ int SrsForwarder::forward() @@ -329,7 +329,7 @@ int SrsForwarder::forward()
329 329
330 // forward all messages. 330 // forward all messages.
331 int count = 0; 331 int count = 0;
332 - SrsSharedPtrMessage** msgs = NULL; 332 + __SrsSharedPtrMessage** msgs = NULL;
333 if ((ret = queue->get_packets(0, msgs, count)) != ERROR_SUCCESS) { 333 if ((ret = queue->get_packets(0, msgs, count)) != ERROR_SUCCESS) {
334 srs_error("get message to forward failed. ret=%d", ret); 334 srs_error("get message to forward failed. ret=%d", ret);
335 return ret; 335 return ret;
@@ -348,16 +348,16 @@ int SrsForwarder::forward() @@ -348,16 +348,16 @@ int SrsForwarder::forward()
348 srs_verbose("no packets to forward."); 348 srs_verbose("no packets to forward.");
349 continue; 349 continue;
350 } 350 }
351 - SrsAutoFree(SrsSharedPtrMessage*, msgs, true); 351 + SrsAutoFree(__SrsSharedPtrMessage*, msgs, true);
352 352
353 // all msgs to forward. 353 // all msgs to forward.
354 for (int i = 0; i < count; i++) { 354 for (int i = 0; i < count; i++) {
355 - SrsSharedPtrMessage* msg = msgs[i]; 355 + __SrsSharedPtrMessage* msg = msgs[i];
356 356
357 srs_assert(msg); 357 srs_assert(msg);
358 msgs[i] = NULL; 358 msgs[i] = NULL;
359 359
360 - if ((ret = client->send_message(msg)) != ERROR_SUCCESS) { 360 + if ((ret = client->__send_and_free_message(msg)) != ERROR_SUCCESS) {
361 srs_error("forwarder send message to server failed. ret=%d", ret); 361 srs_error("forwarder send message to server failed. ret=%d", ret);
362 return ret; 362 return ret;
363 } 363 }
@@ -35,7 +35,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -35,7 +35,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
35 #include <srs_app_thread.hpp> 35 #include <srs_app_thread.hpp>
36 36
37 class ISrsProtocolReaderWriter; 37 class ISrsProtocolReaderWriter;
38 -class SrsSharedPtrMessage; 38 +class __SrsSharedPtrMessage;
39 class SrsOnMetaDataPacket; 39 class SrsOnMetaDataPacket;
40 class SrsMessageQueue; 40 class SrsMessageQueue;
41 class SrsRtmpJitter; 41 class SrsRtmpJitter;
@@ -72,9 +72,9 @@ public: @@ -72,9 +72,9 @@ public:
72 public: 72 public:
73 virtual int on_publish(SrsRequest* req, std::string forward_server); 73 virtual int on_publish(SrsRequest* req, std::string forward_server);
74 virtual void on_unpublish(); 74 virtual void on_unpublish();
75 - virtual int on_meta_data(SrsSharedPtrMessage* metadata);  
76 - virtual int on_audio(SrsSharedPtrMessage* msg);  
77 - virtual int on_video(SrsSharedPtrMessage* msg); 75 + virtual int on_meta_data(__SrsSharedPtrMessage* metadata);
  76 + virtual int on_audio(__SrsSharedPtrMessage* msg);
  77 + virtual int on_video(__SrsSharedPtrMessage* msg);
78 // interface ISrsThreadHandler. 78 // interface ISrsThreadHandler.
79 public: 79 public:
80 virtual int cycle(); 80 virtual int cycle();
@@ -1379,11 +1379,11 @@ int SrsHls::on_meta_data(SrsAmf0Object* metadata) @@ -1379,11 +1379,11 @@ int SrsHls::on_meta_data(SrsAmf0Object* metadata)
1379 return ret; 1379 return ret;
1380 } 1380 }
1381 1381
1382 -int SrsHls::on_audio(SrsSharedPtrMessage* audio) 1382 +int SrsHls::on_audio(__SrsSharedPtrMessage* audio)
1383 { 1383 {
1384 int ret = ERROR_SUCCESS; 1384 int ret = ERROR_SUCCESS;
1385 1385
1386 - SrsAutoFree(SrsSharedPtrMessage, audio, false); 1386 + SrsAutoFree(__SrsSharedPtrMessage, audio, false);
1387 1387
1388 if (!hls_enabled) { 1388 if (!hls_enabled) {
1389 return ret; 1389 return ret;
@@ -1423,11 +1423,11 @@ int SrsHls::on_audio(SrsSharedPtrMessage* audio) @@ -1423,11 +1423,11 @@ int SrsHls::on_audio(SrsSharedPtrMessage* audio)
1423 return ret; 1423 return ret;
1424 } 1424 }
1425 1425
1426 -int SrsHls::on_video(SrsSharedPtrMessage* video) 1426 +int SrsHls::on_video(__SrsSharedPtrMessage* video)
1427 { 1427 {
1428 int ret = ERROR_SUCCESS; 1428 int ret = ERROR_SUCCESS;
1429 1429
1430 - SrsAutoFree(SrsSharedPtrMessage, video, false); 1430 + SrsAutoFree(__SrsSharedPtrMessage, video, false);
1431 1431
1432 if (!hls_enabled) { 1432 if (!hls_enabled) {
1433 return ret; 1433 return ret;
@@ -34,7 +34,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -34,7 +34,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
34 #include <string> 34 #include <string>
35 #include <vector> 35 #include <vector>
36 36
37 -class SrsSharedPtrMessage; 37 +class __SrsSharedPtrMessage;
38 class SrsCodecSample; 38 class SrsCodecSample;
39 class SrsCodecBuffer; 39 class SrsCodecBuffer;
40 class SrsMpegtsFrame; 40 class SrsMpegtsFrame;
@@ -314,11 +314,11 @@ public: @@ -314,11 +314,11 @@ public:
314 /** 314 /**
315 * mux the audio packets to ts. 315 * mux the audio packets to ts.
316 */ 316 */
317 - virtual int on_audio(SrsSharedPtrMessage* audio); 317 + virtual int on_audio(__SrsSharedPtrMessage* audio);
318 /** 318 /**
319 * mux the video packets to ts. 319 * mux the video packets to ts.
320 */ 320 */
321 - virtual int on_video(SrsSharedPtrMessage* video); 321 + virtual int on_video(__SrsSharedPtrMessage* video);
322 private: 322 private:
323 virtual void hls_mux(); 323 virtual void hls_mux();
324 }; 324 };
@@ -472,8 +472,8 @@ int SrsRtmpConn::playing(SrsSource* source) @@ -472,8 +472,8 @@ int SrsRtmpConn::playing(SrsSource* source)
472 // read from client. 472 // read from client.
473 int ctl_msg_ret = ERROR_SUCCESS; 473 int ctl_msg_ret = ERROR_SUCCESS;
474 if (true) { 474 if (true) {
475 - SrsCommonMessage* msg = NULL;  
476 - ctl_msg_ret = ret = rtmp->recv_message(&msg); 475 + __SrsMessage* msg = NULL;
  476 + ctl_msg_ret = ret = rtmp->__recv_message(&msg);
477 477
478 srs_verbose("play loop recv message. ret=%d", ret); 478 srs_verbose("play loop recv message. ret=%d", ret);
479 if (ret != ERROR_SUCCESS && ret != ERROR_SOCKET_TIMEOUT) { 479 if (ret != ERROR_SUCCESS && ret != ERROR_SOCKET_TIMEOUT) {
@@ -491,7 +491,7 @@ int SrsRtmpConn::playing(SrsSource* source) @@ -491,7 +491,7 @@ int SrsRtmpConn::playing(SrsSource* source)
491 } 491 }
492 492
493 // get messages from consumer. 493 // get messages from consumer.
494 - SrsSharedPtrMessage** msgs = NULL; 494 + __SrsSharedPtrMessage** msgs = NULL;
495 int count = 0; 495 int count = 0;
496 if ((ret = consumer->get_packets(0, msgs, count)) != ERROR_SUCCESS) { 496 if ((ret = consumer->get_packets(0, msgs, count)) != ERROR_SUCCESS) {
497 srs_error("get messages from consumer failed. ret=%d", ret); 497 srs_error("get messages from consumer failed. ret=%d", ret);
@@ -510,11 +510,11 @@ int SrsRtmpConn::playing(SrsSource* source) @@ -510,11 +510,11 @@ int SrsRtmpConn::playing(SrsSource* source)
510 srs_verbose("no packets in queue."); 510 srs_verbose("no packets in queue.");
511 continue; 511 continue;
512 } 512 }
513 - SrsAutoFree(SrsSharedPtrMessage*, msgs, true); 513 + SrsAutoFree(__SrsSharedPtrMessage*, msgs, true);
514 514
515 // sendout messages 515 // sendout messages
516 for (int i = 0; i < count; i++) { 516 for (int i = 0; i < count; i++) {
517 - SrsSharedPtrMessage* msg = msgs[i]; 517 + __SrsSharedPtrMessage* msg = msgs[i];
518 518
519 // the send_message will free the msg, 519 // the send_message will free the msg,
520 // so set the msgs[i] to NULL. 520 // so set the msgs[i] to NULL.
@@ -530,7 +530,7 @@ int SrsRtmpConn::playing(SrsSource* source) @@ -530,7 +530,7 @@ int SrsRtmpConn::playing(SrsSource* source)
530 duration += msg->header.timestamp - starttime; 530 duration += msg->header.timestamp - starttime;
531 starttime = msg->header.timestamp; 531 starttime = msg->header.timestamp;
532 532
533 - if ((ret = rtmp->send_message(msg)) != ERROR_SUCCESS) { 533 + if ((ret = rtmp->__send_and_free_message(msg)) != ERROR_SUCCESS) {
534 srs_error("send message to client failed. ret=%d", ret); 534 srs_error("send message to client failed. ret=%d", ret);
535 return ret; 535 return ret;
536 } 536 }
@@ -573,14 +573,13 @@ int SrsRtmpConn::fmle_publish(SrsSource* source) @@ -573,14 +573,13 @@ int SrsRtmpConn::fmle_publish(SrsSource* source)
573 // switch to other st-threads. 573 // switch to other st-threads.
574 st_usleep(0); 574 st_usleep(0);
575 575
576 - SrsCommonMessage* msg = NULL;  
577 - if ((ret = rtmp->recv_message(&msg)) != ERROR_SUCCESS) { 576 + __SrsMessage* msg = NULL;
  577 + if ((ret = rtmp->__recv_message(&msg)) != ERROR_SUCCESS) {
578 srs_error("fmle recv identify client message failed. ret=%d", ret); 578 srs_error("fmle recv identify client message failed. ret=%d", ret);
579 return ret; 579 return ret;
580 } 580 }
581 581
582 - srs_assert(msg);  
583 - SrsAutoFree(SrsCommonMessage, msg, false); 582 + SrsAutoFree(__SrsMessage, msg, false);
584 583
585 pithy_print.elapse(); 584 pithy_print.elapse();
586 585
@@ -594,12 +593,14 @@ int SrsRtmpConn::fmle_publish(SrsSource* source) @@ -594,12 +593,14 @@ int SrsRtmpConn::fmle_publish(SrsSource* source)
594 593
595 // process UnPublish event. 594 // process UnPublish event.
596 if (msg->header.is_amf0_command() || msg->header.is_amf3_command()) { 595 if (msg->header.is_amf0_command() || msg->header.is_amf3_command()) {
597 - if ((ret = msg->decode_packet(rtmp->get_protocol())) != ERROR_SUCCESS) { 596 + SrsPacket* pkt = NULL;
  597 + if ((ret = rtmp->__decode_message(msg, &pkt)) != ERROR_SUCCESS) {
598 srs_error("fmle decode unpublish message failed. ret=%d", ret); 598 srs_error("fmle decode unpublish message failed. ret=%d", ret);
599 return ret; 599 return ret;
600 } 600 }
  601 +
  602 + SrsAutoFree(SrsPacket, pkt, false);
601 603
602 - SrsPacket* pkt = msg->get_packet();  
603 if (dynamic_cast<SrsFMLEStartPacket*>(pkt)) { 604 if (dynamic_cast<SrsFMLEStartPacket*>(pkt)) {
604 SrsFMLEStartPacket* unpublish = dynamic_cast<SrsFMLEStartPacket*>(pkt); 605 SrsFMLEStartPacket* unpublish = dynamic_cast<SrsFMLEStartPacket*>(pkt);
605 if ((ret = rtmp->fmle_unpublish(res->stream_id, unpublish->transaction_id)) != ERROR_SUCCESS) { 606 if ((ret = rtmp->fmle_unpublish(res->stream_id, unpublish->transaction_id)) != ERROR_SUCCESS) {
@@ -647,15 +648,15 @@ int SrsRtmpConn::flash_publish(SrsSource* source) @@ -647,15 +648,15 @@ int SrsRtmpConn::flash_publish(SrsSource* source)
647 // switch to other st-threads. 648 // switch to other st-threads.
648 st_usleep(0); 649 st_usleep(0);
649 650
650 - SrsCommonMessage* msg = NULL;  
651 - if ((ret = rtmp->recv_message(&msg)) != ERROR_SUCCESS) { 651 + __SrsMessage* msg = NULL;
  652 + if ((ret = rtmp->__recv_message(&msg)) != ERROR_SUCCESS) {
652 if (!srs_is_client_gracefully_close(ret)) { 653 if (!srs_is_client_gracefully_close(ret)) {
653 srs_error("flash recv identify client message failed. ret=%d", ret); 654 srs_error("flash recv identify client message failed. ret=%d", ret);
654 } 655 }
655 return ret; 656 return ret;
656 } 657 }
657 658
658 - SrsAutoFree(SrsCommonMessage, msg, false); 659 + SrsAutoFree(__SrsMessage, msg, false);
659 660
660 pithy_print.elapse(); 661 pithy_print.elapse();
661 662
@@ -669,11 +670,14 @@ int SrsRtmpConn::flash_publish(SrsSource* source) @@ -669,11 +670,14 @@ int SrsRtmpConn::flash_publish(SrsSource* source)
669 670
670 // process UnPublish event. 671 // process UnPublish event.
671 if (msg->header.is_amf0_command() || msg->header.is_amf3_command()) { 672 if (msg->header.is_amf0_command() || msg->header.is_amf3_command()) {
672 - if ((ret = msg->decode_packet(rtmp->get_protocol())) != ERROR_SUCCESS) { 673 + SrsPacket* pkt = NULL;
  674 + if ((ret = rtmp->__decode_message(msg, &pkt)) != ERROR_SUCCESS) {
673 srs_error("flash decode unpublish message failed. ret=%d", ret); 675 srs_error("flash decode unpublish message failed. ret=%d", ret);
674 return ret; 676 return ret;
675 } 677 }
676 678
  679 + SrsAutoFree(SrsPacket, pkt, false);
  680 +
677 // flash unpublish. 681 // flash unpublish.
678 // TODO: maybe need to support republish. 682 // TODO: maybe need to support republish.
679 srs_trace("flash flash publish finished."); 683 srs_trace("flash flash publish finished.");
@@ -690,7 +694,7 @@ int SrsRtmpConn::flash_publish(SrsSource* source) @@ -690,7 +694,7 @@ int SrsRtmpConn::flash_publish(SrsSource* source)
690 return ret; 694 return ret;
691 } 695 }
692 696
693 -int SrsRtmpConn::process_publish_message(SrsSource* source, SrsCommonMessage* msg, bool vhost_is_edge) 697 +int SrsRtmpConn::process_publish_message(SrsSource* source, __SrsMessage* msg, bool vhost_is_edge)
694 { 698 {
695 int ret = ERROR_SUCCESS; 699 int ret = ERROR_SUCCESS;
696 700
@@ -720,12 +724,13 @@ int SrsRtmpConn::process_publish_message(SrsSource* source, SrsCommonMessage* ms @@ -720,12 +724,13 @@ int SrsRtmpConn::process_publish_message(SrsSource* source, SrsCommonMessage* ms
720 724
721 // process onMetaData 725 // process onMetaData
722 if (msg->header.is_amf0_data() || msg->header.is_amf3_data()) { 726 if (msg->header.is_amf0_data() || msg->header.is_amf3_data()) {
723 - if ((ret = msg->decode_packet(rtmp->get_protocol())) != ERROR_SUCCESS) { 727 + SrsPacket* pkt = NULL;
  728 + if ((ret = rtmp->__decode_message(msg, &pkt)) != ERROR_SUCCESS) {
724 srs_error("decode onMetaData message failed. ret=%d", ret); 729 srs_error("decode onMetaData message failed. ret=%d", ret);
725 return ret; 730 return ret;
726 } 731 }
  732 + SrsAutoFree(SrsPacket, pkt, false);
727 733
728 - SrsPacket* pkt = msg->get_packet();  
729 if (dynamic_cast<SrsOnMetaDataPacket*>(pkt)) { 734 if (dynamic_cast<SrsOnMetaDataPacket*>(pkt)) {
730 SrsOnMetaDataPacket* metadata = dynamic_cast<SrsOnMetaDataPacket*>(pkt); 735 SrsOnMetaDataPacket* metadata = dynamic_cast<SrsOnMetaDataPacket*>(pkt);
731 if ((ret = source->on_meta_data(msg, metadata)) != ERROR_SUCCESS) { 736 if ((ret = source->on_meta_data(msg, metadata)) != ERROR_SUCCESS) {
@@ -743,7 +748,7 @@ int SrsRtmpConn::process_publish_message(SrsSource* source, SrsCommonMessage* ms @@ -743,7 +748,7 @@ int SrsRtmpConn::process_publish_message(SrsSource* source, SrsCommonMessage* ms
743 return ret; 748 return ret;
744 } 749 }
745 750
746 -int SrsRtmpConn::process_play_control_msg(SrsConsumer* consumer, SrsCommonMessage* msg) 751 +int SrsRtmpConn::process_play_control_msg(SrsConsumer* consumer, __SrsMessage* msg)
747 { 752 {
748 int ret = ERROR_SUCCESS; 753 int ret = ERROR_SUCCESS;
749 754
@@ -751,29 +756,32 @@ int SrsRtmpConn::process_play_control_msg(SrsConsumer* consumer, SrsCommonMessag @@ -751,29 +756,32 @@ int SrsRtmpConn::process_play_control_msg(SrsConsumer* consumer, SrsCommonMessag
751 srs_verbose("ignore all empty message."); 756 srs_verbose("ignore all empty message.");
752 return ret; 757 return ret;
753 } 758 }
754 - SrsAutoFree(SrsCommonMessage, msg, false); 759 + SrsAutoFree(__SrsMessage, msg, false);
755 760
756 if (!msg->header.is_amf0_command() && !msg->header.is_amf3_command()) { 761 if (!msg->header.is_amf0_command() && !msg->header.is_amf3_command()) {
757 srs_info("ignore all message except amf0/amf3 command."); 762 srs_info("ignore all message except amf0/amf3 command.");
758 return ret; 763 return ret;
759 } 764 }
760 765
761 - if ((ret = msg->decode_packet(rtmp->get_protocol())) != ERROR_SUCCESS) { 766 + SrsPacket* pkt = NULL;
  767 + if ((ret = rtmp->__decode_message(msg, &pkt)) != ERROR_SUCCESS) {
762 srs_error("decode the amf0/amf3 command packet failed. ret=%d", ret); 768 srs_error("decode the amf0/amf3 command packet failed. ret=%d", ret);
763 return ret; 769 return ret;
764 } 770 }
765 srs_info("decode the amf0/amf3 command packet success."); 771 srs_info("decode the amf0/amf3 command packet success.");
766 772
  773 + SrsAutoFree(SrsPacket, pkt, false);
  774 +
767 // for jwplayer/flowplayer, which send close as pause message. 775 // for jwplayer/flowplayer, which send close as pause message.
768 // @see https://github.com/winlinvip/simple-rtmp-server/issues/6 776 // @see https://github.com/winlinvip/simple-rtmp-server/issues/6
769 - SrsCloseStreamPacket* close = dynamic_cast<SrsCloseStreamPacket*>(msg->get_packet()); 777 + SrsCloseStreamPacket* close = dynamic_cast<SrsCloseStreamPacket*>(pkt);
770 if (close) { 778 if (close) {
771 ret = ERROR_CONTROL_RTMP_CLOSE; 779 ret = ERROR_CONTROL_RTMP_CLOSE;
772 srs_trace("system control message: rtmp close stream. ret=%d", ret); 780 srs_trace("system control message: rtmp close stream. ret=%d", ret);
773 return ret; 781 return ret;
774 } 782 }
775 783
776 - SrsPausePacket* pause = dynamic_cast<SrsPausePacket*>(msg->get_packet()); 784 + SrsPausePacket* pause = dynamic_cast<SrsPausePacket*>(pkt);
777 if (!pause) { 785 if (!pause) {
778 srs_info("ignore all amf0/amf3 command except pause."); 786 srs_info("ignore all amf0/amf3 command except pause.");
779 return ret; 787 return ret;
@@ -40,7 +40,7 @@ class SrsResponse; @@ -40,7 +40,7 @@ class SrsResponse;
40 class SrsSource; 40 class SrsSource;
41 class SrsRefer; 41 class SrsRefer;
42 class SrsConsumer; 42 class SrsConsumer;
43 -class SrsCommonMessage; 43 +class __SrsMessage;
44 class SrsSocket; 44 class SrsSocket;
45 #ifdef SRS_AUTO_HTTP_CALLBACK 45 #ifdef SRS_AUTO_HTTP_CALLBACK
46 class SrsHttpHooks; 46 class SrsHttpHooks;
@@ -80,8 +80,8 @@ private: @@ -80,8 +80,8 @@ private:
80 virtual int playing(SrsSource* source); 80 virtual int playing(SrsSource* source);
81 virtual int fmle_publish(SrsSource* source); 81 virtual int fmle_publish(SrsSource* source);
82 virtual int flash_publish(SrsSource* source); 82 virtual int flash_publish(SrsSource* source);
83 - virtual int process_publish_message(SrsSource* source, SrsCommonMessage* msg, bool vhost_is_edge);  
84 - virtual int process_play_control_msg(SrsConsumer* consumer, SrsCommonMessage* msg); 83 + virtual int process_publish_message(SrsSource* source, __SrsMessage* msg, bool vhost_is_edge);
  84 + virtual int process_play_control_msg(SrsConsumer* consumer, __SrsMessage* msg);
85 private: 85 private:
86 virtual int http_hooks_on_connect(); 86 virtual int http_hooks_on_connect();
87 virtual void http_hooks_on_close(); 87 virtual void http_hooks_on_close();
@@ -52,7 +52,7 @@ SrsRtmpJitter::~SrsRtmpJitter() @@ -52,7 +52,7 @@ SrsRtmpJitter::~SrsRtmpJitter()
52 { 52 {
53 } 53 }
54 54
55 -int SrsRtmpJitter::correct(SrsSharedPtrMessage* msg, int tba, int tbv) 55 +int SrsRtmpJitter::correct(__SrsSharedPtrMessage* msg, int tba, int tbv)
56 { 56 {
57 int ret = ERROR_SUCCESS; 57 int ret = ERROR_SUCCESS;
58 58
@@ -130,7 +130,7 @@ void SrsMessageQueue::set_queue_size(double queue_size) @@ -130,7 +130,7 @@ void SrsMessageQueue::set_queue_size(double queue_size)
130 queue_size_ms = (int)(queue_size * 1000); 130 queue_size_ms = (int)(queue_size * 1000);
131 } 131 }
132 132
133 -int SrsMessageQueue::enqueue(SrsSharedPtrMessage* msg) 133 +int SrsMessageQueue::enqueue(__SrsSharedPtrMessage* msg)
134 { 134 {
135 int ret = ERROR_SUCCESS; 135 int ret = ERROR_SUCCESS;
136 136
@@ -151,7 +151,7 @@ int SrsMessageQueue::enqueue(SrsSharedPtrMessage* msg) @@ -151,7 +151,7 @@ int SrsMessageQueue::enqueue(SrsSharedPtrMessage* msg)
151 return ret; 151 return ret;
152 } 152 }
153 153
154 -int SrsMessageQueue::get_packets(int max_count, SrsSharedPtrMessage**& pmsgs, int& count) 154 +int SrsMessageQueue::get_packets(int max_count, __SrsSharedPtrMessage**& pmsgs, int& count)
155 { 155 {
156 int ret = ERROR_SUCCESS; 156 int ret = ERROR_SUCCESS;
157 157
@@ -169,13 +169,13 @@ int SrsMessageQueue::get_packets(int max_count, SrsSharedPtrMessage**& pmsgs, in @@ -169,13 +169,13 @@ int SrsMessageQueue::get_packets(int max_count, SrsSharedPtrMessage**& pmsgs, in
169 return ret; 169 return ret;
170 } 170 }
171 171
172 - pmsgs = new SrsSharedPtrMessage*[count]; 172 + pmsgs = new __SrsSharedPtrMessage*[count];
173 173
174 for (int i = 0; i < count; i++) { 174 for (int i = 0; i < count; i++) {
175 pmsgs[i] = msgs[i]; 175 pmsgs[i] = msgs[i];
176 } 176 }
177 177
178 - SrsSharedPtrMessage* last = msgs[count - 1]; 178 + __SrsSharedPtrMessage* last = msgs[count - 1];
179 av_start_time = last->header.timestamp; 179 av_start_time = last->header.timestamp;
180 180
181 if (count == (int)msgs.size()) { 181 if (count == (int)msgs.size()) {
@@ -196,7 +196,7 @@ void SrsMessageQueue::shrink() @@ -196,7 +196,7 @@ void SrsMessageQueue::shrink()
196 // for when we shrinked, the first is the iframe, 196 // for when we shrinked, the first is the iframe,
197 // we will directly remove the gop next time. 197 // we will directly remove the gop next time.
198 for (int i = 1; i < (int)msgs.size(); i++) { 198 for (int i = 1; i < (int)msgs.size(); i++) {
199 - SrsSharedPtrMessage* msg = msgs[i]; 199 + __SrsSharedPtrMessage* msg = msgs[i];
200 200
201 if (msg->header.is_video()) { 201 if (msg->header.is_video()) {
202 if (SrsCodec::video_is_keyframe(msg->payload, msg->size)) { 202 if (SrsCodec::video_is_keyframe(msg->payload, msg->size)) {
@@ -222,7 +222,7 @@ void SrsMessageQueue::shrink() @@ -222,7 +222,7 @@ void SrsMessageQueue::shrink()
222 222
223 // remove the first gop from the front 223 // remove the first gop from the front
224 for (int i = 0; i < iframe_index; i++) { 224 for (int i = 0; i < iframe_index; i++) {
225 - SrsSharedPtrMessage* msg = msgs[i]; 225 + __SrsSharedPtrMessage* msg = msgs[i];
226 srs_freep(msg); 226 srs_freep(msg);
227 } 227 }
228 msgs.erase(msgs.begin(), msgs.begin() + iframe_index); 228 msgs.erase(msgs.begin(), msgs.begin() + iframe_index);
@@ -230,10 +230,10 @@ void SrsMessageQueue::shrink() @@ -230,10 +230,10 @@ void SrsMessageQueue::shrink()
230 230
231 void SrsMessageQueue::clear() 231 void SrsMessageQueue::clear()
232 { 232 {
233 - std::vector<SrsSharedPtrMessage*>::iterator it; 233 + std::vector<__SrsSharedPtrMessage*>::iterator it;
234 234
235 for (it = msgs.begin(); it != msgs.end(); ++it) { 235 for (it = msgs.begin(); it != msgs.end(); ++it) {
236 - SrsSharedPtrMessage* msg = *it; 236 + __SrsSharedPtrMessage* msg = *it;
237 srs_freep(msg); 237 srs_freep(msg);
238 } 238 }
239 239
@@ -267,7 +267,7 @@ int SrsConsumer::get_time() @@ -267,7 +267,7 @@ int SrsConsumer::get_time()
267 return jitter->get_time(); 267 return jitter->get_time();
268 } 268 }
269 269
270 -int SrsConsumer::enqueue(SrsSharedPtrMessage* msg, int tba, int tbv) 270 +int SrsConsumer::enqueue(__SrsSharedPtrMessage* msg, int tba, int tbv)
271 { 271 {
272 int ret = ERROR_SUCCESS; 272 int ret = ERROR_SUCCESS;
273 273
@@ -285,7 +285,7 @@ int SrsConsumer::enqueue(SrsSharedPtrMessage* msg, int tba, int tbv) @@ -285,7 +285,7 @@ int SrsConsumer::enqueue(SrsSharedPtrMessage* msg, int tba, int tbv)
285 return ret; 285 return ret;
286 } 286 }
287 287
288 -int SrsConsumer::get_packets(int max_count, SrsSharedPtrMessage**& pmsgs, int& count) 288 +int SrsConsumer::get_packets(int max_count, __SrsSharedPtrMessage**& pmsgs, int& count)
289 { 289 {
290 // paused, return nothing. 290 // paused, return nothing.
291 if (paused) { 291 if (paused) {
@@ -329,7 +329,7 @@ void SrsGopCache::set(bool enabled) @@ -329,7 +329,7 @@ void SrsGopCache::set(bool enabled)
329 srs_info("enable gop cache"); 329 srs_info("enable gop cache");
330 } 330 }
331 331
332 -int SrsGopCache::cache(SrsSharedPtrMessage* msg) 332 +int SrsGopCache::cache(__SrsSharedPtrMessage* msg)
333 { 333 {
334 int ret = ERROR_SUCCESS; 334 int ret = ERROR_SUCCESS;
335 335
@@ -368,9 +368,9 @@ int SrsGopCache::cache(SrsSharedPtrMessage* msg) @@ -368,9 +368,9 @@ int SrsGopCache::cache(SrsSharedPtrMessage* msg)
368 368
369 void SrsGopCache::clear() 369 void SrsGopCache::clear()
370 { 370 {
371 - std::vector<SrsSharedPtrMessage*>::iterator it; 371 + std::vector<__SrsSharedPtrMessage*>::iterator it;
372 for (it = gop_cache.begin(); it != gop_cache.end(); ++it) { 372 for (it = gop_cache.begin(); it != gop_cache.end(); ++it) {
373 - SrsSharedPtrMessage* msg = *it; 373 + __SrsSharedPtrMessage* msg = *it;
374 srs_freep(msg); 374 srs_freep(msg);
375 } 375 }
376 gop_cache.clear(); 376 gop_cache.clear();
@@ -382,9 +382,9 @@ int SrsGopCache::dump(SrsConsumer* consumer, int tba, int tbv) @@ -382,9 +382,9 @@ int SrsGopCache::dump(SrsConsumer* consumer, int tba, int tbv)
382 { 382 {
383 int ret = ERROR_SUCCESS; 383 int ret = ERROR_SUCCESS;
384 384
385 - std::vector<SrsSharedPtrMessage*>::iterator it; 385 + std::vector<__SrsSharedPtrMessage*>::iterator it;
386 for (it = gop_cache.begin(); it != gop_cache.end(); ++it) { 386 for (it = gop_cache.begin(); it != gop_cache.end(); ++it) {
387 - SrsSharedPtrMessage* msg = *it; 387 + __SrsSharedPtrMessage* msg = *it;
388 if ((ret = consumer->enqueue(msg->copy(), tba, tbv)) != ERROR_SUCCESS) { 388 if ((ret = consumer->enqueue(msg->copy(), tba, tbv)) != ERROR_SUCCESS) {
389 srs_error("dispatch cached gop failed. ret=%d", ret); 389 srs_error("dispatch cached gop failed. ret=%d", ret);
390 return ret; 390 return ret;
@@ -406,7 +406,7 @@ int64_t SrsGopCache::get_start_time() @@ -406,7 +406,7 @@ int64_t SrsGopCache::get_start_time()
406 return 0; 406 return 0;
407 } 407 }
408 408
409 - SrsSharedPtrMessage* msg = gop_cache[0]; 409 + __SrsSharedPtrMessage* msg = gop_cache[0];
410 srs_assert(msg); 410 srs_assert(msg);
411 411
412 return msg->header.timestamp; 412 return msg->header.timestamp;
@@ -789,7 +789,7 @@ bool SrsSource::can_publish() @@ -789,7 +789,7 @@ bool SrsSource::can_publish()
789 return _can_publish; 789 return _can_publish;
790 } 790 }
791 791
792 -int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata) 792 +int SrsSource::on_meta_data(__SrsMessage* msg, SrsOnMetaDataPacket* metadata)
793 { 793 {
794 int ret = ERROR_SUCCESS; 794 int ret = ERROR_SUCCESS;
795 795
@@ -840,7 +840,7 @@ int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata @@ -840,7 +840,7 @@ int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata
840 840
841 // create a shared ptr message. 841 // create a shared ptr message.
842 srs_freep(cache_metadata); 842 srs_freep(cache_metadata);
843 - cache_metadata = new SrsSharedPtrMessage(); 843 + cache_metadata = new __SrsSharedPtrMessage();
844 844
845 // dump message to shared ptr message. 845 // dump message to shared ptr message.
846 if ((ret = cache_metadata->initialize(&msg->header, payload, size)) != ERROR_SUCCESS) { 846 if ((ret = cache_metadata->initialize(&msg->header, payload, size)) != ERROR_SUCCESS) {
@@ -877,12 +877,12 @@ int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata @@ -877,12 +877,12 @@ int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata
877 return ret; 877 return ret;
878 } 878 }
879 879
880 -int SrsSource::on_audio(SrsCommonMessage* audio) 880 +int SrsSource::on_audio(__SrsMessage* audio)
881 { 881 {
882 int ret = ERROR_SUCCESS; 882 int ret = ERROR_SUCCESS;
883 883
884 - SrsSharedPtrMessage* msg = new SrsSharedPtrMessage();  
885 - SrsAutoFree(SrsSharedPtrMessage, msg, false); 884 + __SrsSharedPtrMessage* msg = new __SrsSharedPtrMessage();
  885 + SrsAutoFree(__SrsSharedPtrMessage, msg, false);
886 if ((ret = msg->initialize(audio)) != ERROR_SUCCESS) { 886 if ((ret = msg->initialize(audio)) != ERROR_SUCCESS) {
887 srs_error("initialize the audio failed. ret=%d", ret); 887 srs_error("initialize the audio failed. ret=%d", ret);
888 return ret; 888 return ret;
@@ -966,12 +966,12 @@ int SrsSource::on_audio(SrsCommonMessage* audio) @@ -966,12 +966,12 @@ int SrsSource::on_audio(SrsCommonMessage* audio)
966 return ret; 966 return ret;
967 } 967 }
968 968
969 -int SrsSource::on_video(SrsCommonMessage* video) 969 +int SrsSource::on_video(__SrsMessage* video)
970 { 970 {
971 int ret = ERROR_SUCCESS; 971 int ret = ERROR_SUCCESS;
972 972
973 - SrsSharedPtrMessage* msg = new SrsSharedPtrMessage();  
974 - SrsAutoFree(SrsSharedPtrMessage, msg, false); 973 + __SrsSharedPtrMessage* msg = new __SrsSharedPtrMessage();
  974 + SrsAutoFree(__SrsSharedPtrMessage, msg, false);
975 if ((ret = msg->initialize(video)) != ERROR_SUCCESS) { 975 if ((ret = msg->initialize(video)) != ERROR_SUCCESS) {
976 srs_error("initialize the video failed. ret=%d", ret); 976 srs_error("initialize the video failed. ret=%d", ret);
977 return ret; 977 return ret;
@@ -1207,7 +1207,7 @@ int SrsSource::on_edge_start_publish() @@ -1207,7 +1207,7 @@ int SrsSource::on_edge_start_publish()
1207 return publish_edge->on_client_publish(); 1207 return publish_edge->on_client_publish();
1208 } 1208 }
1209 1209
1210 -int SrsSource::on_edge_proxy_publish(SrsCommonMessage* msg) 1210 +int SrsSource::on_edge_proxy_publish(__SrsMessage* msg)
1211 { 1211 {
1212 return publish_edge->on_proxy_publish(msg); 1212 return publish_edge->on_proxy_publish(msg);
1213 } 1213 }
@@ -40,9 +40,9 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -40,9 +40,9 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
40 class SrsPlayEdge; 40 class SrsPlayEdge;
41 class SrsPublishEdge; 41 class SrsPublishEdge;
42 class SrsSource; 42 class SrsSource;
43 -class SrsCommonMessage; 43 +class __SrsMessage;
44 class SrsOnMetaDataPacket; 44 class SrsOnMetaDataPacket;
45 -class SrsSharedPtrMessage; 45 +class __SrsSharedPtrMessage;
46 class SrsForwarder; 46 class SrsForwarder;
47 class SrsRequest; 47 class SrsRequest;
48 class SrsSocket; 48 class SrsSocket;
@@ -74,7 +74,7 @@ public: @@ -74,7 +74,7 @@ public:
74 /** 74 /**
75 * detect the time jitter and correct it. 75 * detect the time jitter and correct it.
76 */ 76 */
77 - virtual int correct(SrsSharedPtrMessage* msg, int tba, int tbv); 77 + virtual int correct(__SrsSharedPtrMessage* msg, int tba, int tbv);
78 /** 78 /**
79 * get current client time, the last packet time. 79 * get current client time, the last packet time.
80 */ 80 */
@@ -91,7 +91,7 @@ private: @@ -91,7 +91,7 @@ private:
91 int64_t av_start_time; 91 int64_t av_start_time;
92 int64_t av_end_time; 92 int64_t av_end_time;
93 int queue_size_ms; 93 int queue_size_ms;
94 - std::vector<SrsSharedPtrMessage*> msgs; 94 + std::vector<__SrsSharedPtrMessage*> msgs;
95 public: 95 public:
96 SrsMessageQueue(); 96 SrsMessageQueue();
97 virtual ~SrsMessageQueue(); 97 virtual ~SrsMessageQueue();
@@ -106,14 +106,14 @@ public: @@ -106,14 +106,14 @@ public:
106 * enqueue the message, the timestamp always monotonically. 106 * enqueue the message, the timestamp always monotonically.
107 * @param msg, the msg to enqueue, user never free it whatever the return code. 107 * @param msg, the msg to enqueue, user never free it whatever the return code.
108 */ 108 */
109 - virtual int enqueue(SrsSharedPtrMessage* msg); 109 + virtual int enqueue(__SrsSharedPtrMessage* msg);
110 /** 110 /**
111 * get packets in consumer queue. 111 * get packets in consumer queue.
112 * @pmsgs SrsMessages*[], output the prt array. 112 * @pmsgs SrsMessages*[], output the prt array.
113 * @count the count in array. 113 * @count the count in array.
114 * @max_count the max count to dequeue, 0 to dequeue all. 114 * @max_count the max count to dequeue, 0 to dequeue all.
115 */ 115 */
116 - virtual int get_packets(int max_count, SrsSharedPtrMessage**& pmsgs, int& count); 116 + virtual int get_packets(int max_count, __SrsSharedPtrMessage**& pmsgs, int& count);
117 private: 117 private:
118 /** 118 /**
119 * remove a gop from the front. 119 * remove a gop from the front.
@@ -150,14 +150,14 @@ public: @@ -150,14 +150,14 @@ public:
150 * @param tbv timebase of video. 150 * @param tbv timebase of video.
151 * used to calc the video time delta if time-jitter detected. 151 * used to calc the video time delta if time-jitter detected.
152 */ 152 */
153 - virtual int enqueue(SrsSharedPtrMessage* msg, int tba, int tbv); 153 + virtual int enqueue(__SrsSharedPtrMessage* msg, int tba, int tbv);
154 /** 154 /**
155 * get packets in consumer queue. 155 * get packets in consumer queue.
156 * @pmsgs SrsMessages*[], output the prt array. 156 * @pmsgs SrsMessages*[], output the prt array.
157 * @count the count in array. 157 * @count the count in array.
158 * @max_count the max count to dequeue, 0 to dequeue all. 158 * @max_count the max count to dequeue, 0 to dequeue all.
159 */ 159 */
160 - virtual int get_packets(int max_count, SrsSharedPtrMessage**& pmsgs, int& count); 160 + virtual int get_packets(int max_count, __SrsSharedPtrMessage**& pmsgs, int& count);
161 /** 161 /**
162 * when client send the pause message. 162 * when client send the pause message.
163 */ 163 */
@@ -185,7 +185,7 @@ private: @@ -185,7 +185,7 @@ private:
185 /** 185 /**
186 * cached gop. 186 * cached gop.
187 */ 187 */
188 - std::vector<SrsSharedPtrMessage*> gop_cache; 188 + std::vector<__SrsSharedPtrMessage*> gop_cache;
189 public: 189 public:
190 SrsGopCache(); 190 SrsGopCache();
191 virtual ~SrsGopCache(); 191 virtual ~SrsGopCache();
@@ -196,7 +196,7 @@ public: @@ -196,7 +196,7 @@ public:
196 * 1. cache the gop when got h264 video packet. 196 * 1. cache the gop when got h264 video packet.
197 * 2. clear gop when got keyframe. 197 * 2. clear gop when got keyframe.
198 */ 198 */
199 - virtual int cache(SrsSharedPtrMessage* msg); 199 + virtual int cache(__SrsSharedPtrMessage* msg);
200 virtual void clear(); 200 virtual void clear();
201 virtual int dump(SrsConsumer* consumer, int tba, int tbv); 201 virtual int dump(SrsConsumer* consumer, int tba, int tbv);
202 /** 202 /**
@@ -267,11 +267,11 @@ private: @@ -267,11 +267,11 @@ private:
267 // TODO: FIXME: to support reload atc. 267 // TODO: FIXME: to support reload atc.
268 bool atc; 268 bool atc;
269 private: 269 private:
270 - SrsSharedPtrMessage* cache_metadata; 270 + __SrsSharedPtrMessage* cache_metadata;
271 // the cached video sequence header. 271 // the cached video sequence header.
272 - SrsSharedPtrMessage* cache_sh_video; 272 + __SrsSharedPtrMessage* cache_sh_video;
273 // the cached audio sequence header. 273 // the cached audio sequence header.
274 - SrsSharedPtrMessage* cache_sh_audio; 274 + __SrsSharedPtrMessage* cache_sh_audio;
275 public: 275 public:
276 /** 276 /**
277 * @param _req the client request object, 277 * @param _req the client request object,
@@ -299,9 +299,9 @@ public: @@ -299,9 +299,9 @@ public:
299 virtual int on_dvr_request_sh(); 299 virtual int on_dvr_request_sh();
300 public: 300 public:
301 virtual bool can_publish(); 301 virtual bool can_publish();
302 - virtual int on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata);  
303 - virtual int on_audio(SrsCommonMessage* audio);  
304 - virtual int on_video(SrsCommonMessage* video); 302 + virtual int on_meta_data(__SrsMessage* msg, SrsOnMetaDataPacket* metadata);
  303 + virtual int on_audio(__SrsMessage* audio);
  304 + virtual int on_video(__SrsMessage* video);
305 /** 305 /**
306 * publish stream event notify. 306 * publish stream event notify.
307 * @param _req the request from client, the source will deep copy it, 307 * @param _req the request from client, the source will deep copy it,
@@ -322,7 +322,7 @@ public: @@ -322,7 +322,7 @@ public:
322 // for edge, when publish edge stream, check the state 322 // for edge, when publish edge stream, check the state
323 virtual int on_edge_start_publish(); 323 virtual int on_edge_start_publish();
324 // for edge, proxy the publish 324 // for edge, proxy the publish
325 - virtual int on_edge_proxy_publish(SrsCommonMessage* msg); 325 + virtual int on_edge_proxy_publish(__SrsMessage* msg);
326 // for edge, proxy stop publish 326 // for edge, proxy stop publish
327 virtual void on_edge_proxy_unpublish(); 327 virtual void on_edge_proxy_unpublish();
328 private: 328 private:
@@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 // current release version 31 // current release version
32 #define VERSION_MAJOR "0" 32 #define VERSION_MAJOR "0"
33 #define VERSION_MINOR "9" 33 #define VERSION_MINOR "9"
34 -#define VERSION_REVISION "79" 34 +#define VERSION_REVISION "80"
35 #define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION 35 #define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION
36 // server info. 36 // server info.
37 #define RTMP_SIG_SRS_KEY "srs" 37 #define RTMP_SIG_SRS_KEY "srs"
@@ -382,6 +382,26 @@ int SrsRtmpClient::send_message(ISrsMessage* msg) @@ -382,6 +382,26 @@ int SrsRtmpClient::send_message(ISrsMessage* msg)
382 return protocol->send_message(msg); 382 return protocol->send_message(msg);
383 } 383 }
384 384
  385 +int SrsRtmpClient::__recv_message(__SrsMessage** pmsg)
  386 +{
  387 + return protocol->__recv_message(pmsg);
  388 +}
  389 +
  390 +int SrsRtmpClient::__decode_message(__SrsMessage* msg, SrsPacket** ppacket)
  391 +{
  392 + return protocol->__decode_message(msg, ppacket);
  393 +}
  394 +
  395 +int SrsRtmpClient::__send_and_free_message(__SrsMessage* msg)
  396 +{
  397 + return protocol->__send_and_free_message(msg);
  398 +}
  399 +
  400 +int SrsRtmpClient::__send_and_free_packet(SrsPacket* packet, int stream_id)
  401 +{
  402 + return protocol->__send_and_free_packet(packet, stream_id);
  403 +}
  404 +
385 int SrsRtmpClient::handshake() 405 int SrsRtmpClient::handshake()
386 { 406 {
387 int ret = ERROR_SUCCESS; 407 int ret = ERROR_SUCCESS;
@@ -768,6 +788,26 @@ int SrsRtmpServer::send_message(ISrsMessage* msg) @@ -768,6 +788,26 @@ int SrsRtmpServer::send_message(ISrsMessage* msg)
768 return protocol->send_message(msg); 788 return protocol->send_message(msg);
769 } 789 }
770 790
  791 +int SrsRtmpServer::__recv_message(__SrsMessage** pmsg)
  792 +{
  793 + return protocol->__recv_message(pmsg);
  794 +}
  795 +
  796 +int SrsRtmpServer::__decode_message(__SrsMessage* msg, SrsPacket** ppacket)
  797 +{
  798 + return protocol->__decode_message(msg, ppacket);
  799 +}
  800 +
  801 +int SrsRtmpServer::__send_and_free_message(__SrsMessage* msg)
  802 +{
  803 + return protocol->__send_and_free_message(msg);
  804 +}
  805 +
  806 +int SrsRtmpServer::__send_and_free_packet(SrsPacket* packet, int stream_id)
  807 +{
  808 + return protocol->__send_and_free_packet(packet, stream_id);
  809 +}
  810 +
771 int SrsRtmpServer::handshake() 811 int SrsRtmpServer::handshake()
772 { 812 {
773 int ret = ERROR_SUCCESS; 813 int ret = ERROR_SUCCESS;
@@ -794,13 +834,13 @@ int SrsRtmpServer::connect_app(SrsRequest* req) @@ -794,13 +834,13 @@ int SrsRtmpServer::connect_app(SrsRequest* req)
794 { 834 {
795 int ret = ERROR_SUCCESS; 835 int ret = ERROR_SUCCESS;
796 836
797 - SrsCommonMessage* msg = NULL; 837 + __SrsMessage* msg = NULL;
798 SrsConnectAppPacket* pkt = NULL; 838 SrsConnectAppPacket* pkt = NULL;
799 - if ((ret = srs_rtmp_expect_message<SrsConnectAppPacket>(protocol, &msg, &pkt)) != ERROR_SUCCESS) { 839 + if ((ret = __srs_rtmp_expect_message<SrsConnectAppPacket>(protocol, &msg, &pkt)) != ERROR_SUCCESS) {
800 srs_error("expect connect app message failed. ret=%d", ret); 840 srs_error("expect connect app message failed. ret=%d", ret);
801 return ret; 841 return ret;
802 } 842 }
803 - SrsAutoFree(SrsCommonMessage, msg, false); 843 + SrsAutoFree(__SrsMessage, msg, false);
804 srs_info("get connect app message"); 844 srs_info("get connect app message");
805 845
806 SrsAmf0Any* prop = NULL; 846 SrsAmf0Any* prop = NULL;
@@ -833,13 +873,9 @@ int SrsRtmpServer::set_window_ack_size(int ack_size) @@ -833,13 +873,9 @@ int SrsRtmpServer::set_window_ack_size(int ack_size)
833 { 873 {
834 int ret = ERROR_SUCCESS; 874 int ret = ERROR_SUCCESS;
835 875
836 - SrsCommonMessage* msg = new SrsCommonMessage();  
837 SrsSetWindowAckSizePacket* pkt = new SrsSetWindowAckSizePacket(); 876 SrsSetWindowAckSizePacket* pkt = new SrsSetWindowAckSizePacket();
838 -  
839 pkt->ackowledgement_window_size = ack_size; 877 pkt->ackowledgement_window_size = ack_size;
840 - msg->set_packet(pkt, 0);  
841 -  
842 - if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) { 878 + if ((ret = protocol->__send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
843 srs_error("send ack size message failed. ret=%d", ret); 879 srs_error("send ack size message failed. ret=%d", ret);
844 return ret; 880 return ret;
845 } 881 }
@@ -852,14 +888,10 @@ int SrsRtmpServer::set_peer_bandwidth(int bandwidth, int type) @@ -852,14 +888,10 @@ int SrsRtmpServer::set_peer_bandwidth(int bandwidth, int type)
852 { 888 {
853 int ret = ERROR_SUCCESS; 889 int ret = ERROR_SUCCESS;
854 890
855 - SrsCommonMessage* msg = new SrsCommonMessage();  
856 SrsSetPeerBandwidthPacket* pkt = new SrsSetPeerBandwidthPacket(); 891 SrsSetPeerBandwidthPacket* pkt = new SrsSetPeerBandwidthPacket();
857 -  
858 pkt->bandwidth = bandwidth; 892 pkt->bandwidth = bandwidth;
859 pkt->type = type; 893 pkt->type = type;
860 - msg->set_packet(pkt, 0);  
861 -  
862 - if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) { 894 + if ((ret = protocol->__send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
863 srs_error("send set bandwidth message failed. ret=%d", ret); 895 srs_error("send set bandwidth message failed. ret=%d", ret);
864 return ret; 896 return ret;
865 } 897 }
@@ -873,7 +905,6 @@ int SrsRtmpServer::response_connect_app(SrsRequest *req, const char* server_ip) @@ -873,7 +905,6 @@ int SrsRtmpServer::response_connect_app(SrsRequest *req, const char* server_ip)
873 { 905 {
874 int ret = ERROR_SUCCESS; 906 int ret = ERROR_SUCCESS;
875 907
876 - SrsCommonMessage* msg = new SrsCommonMessage();  
877 SrsConnectAppResPacket* pkt = new SrsConnectAppResPacket(); 908 SrsConnectAppResPacket* pkt = new SrsConnectAppResPacket();
878 909
879 pkt->props->set("fmsVer", SrsAmf0Any::str("FMS/"RTMP_SIG_FMS_VER)); 910 pkt->props->set("fmsVer", SrsAmf0Any::str("FMS/"RTMP_SIG_FMS_VER));
@@ -903,9 +934,7 @@ int SrsRtmpServer::response_connect_app(SrsRequest *req, const char* server_ip) @@ -903,9 +934,7 @@ int SrsRtmpServer::response_connect_app(SrsRequest *req, const char* server_ip)
903 data->set("srs_server_ip", SrsAmf0Any::str(server_ip)); 934 data->set("srs_server_ip", SrsAmf0Any::str(server_ip));
904 } 935 }
905 936
906 - msg->set_packet(pkt, 0);  
907 -  
908 - if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) { 937 + if ((ret = protocol->__send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
909 srs_error("send connect app response message failed. ret=%d", ret); 938 srs_error("send connect app response message failed. ret=%d", ret);
910 return ret; 939 return ret;
911 } 940 }
@@ -939,12 +968,8 @@ int SrsRtmpServer::on_bw_done() @@ -939,12 +968,8 @@ int SrsRtmpServer::on_bw_done()
939 { 968 {
940 int ret = ERROR_SUCCESS; 969 int ret = ERROR_SUCCESS;
941 970
942 - SrsCommonMessage* msg = new SrsCommonMessage();  
943 SrsOnBWDonePacket* pkt = new SrsOnBWDonePacket(); 971 SrsOnBWDonePacket* pkt = new SrsOnBWDonePacket();
944 -  
945 - msg->set_packet(pkt, 0);  
946 -  
947 - if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) { 972 + if ((ret = protocol->__send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
948 srs_error("send onBWDone message failed. ret=%d", ret); 973 srs_error("send onBWDone message failed. ret=%d", ret);
949 return ret; 974 return ret;
950 } 975 }
@@ -959,13 +984,13 @@ int SrsRtmpServer::identify_client(int stream_id, SrsRtmpConnType& type, string& @@ -959,13 +984,13 @@ int SrsRtmpServer::identify_client(int stream_id, SrsRtmpConnType& type, string&
959 int ret = ERROR_SUCCESS; 984 int ret = ERROR_SUCCESS;
960 985
961 while (true) { 986 while (true) {
962 - SrsCommonMessage* msg = NULL;  
963 - if ((ret = protocol->recv_message(&msg)) != ERROR_SUCCESS) { 987 + __SrsMessage* msg = NULL;
  988 + if ((ret = protocol->__recv_message(&msg)) != ERROR_SUCCESS) {
964 srs_error("recv identify client message failed. ret=%d", ret); 989 srs_error("recv identify client message failed. ret=%d", ret);
965 return ret; 990 return ret;
966 } 991 }
967 992
968 - SrsAutoFree(SrsCommonMessage, msg, false); 993 + SrsAutoFree(__SrsMessage, msg, false);
969 994
970 if (!msg->header.is_amf0_command() && !msg->header.is_amf3_command()) { 995 if (!msg->header.is_amf0_command() && !msg->header.is_amf3_command()) {
971 srs_trace("identify ignore messages except " 996 srs_trace("identify ignore messages except "
@@ -973,12 +998,14 @@ int SrsRtmpServer::identify_client(int stream_id, SrsRtmpConnType& type, string& @@ -973,12 +998,14 @@ int SrsRtmpServer::identify_client(int stream_id, SrsRtmpConnType& type, string&
973 continue; 998 continue;
974 } 999 }
975 1000
976 - if ((ret = msg->decode_packet(protocol)) != ERROR_SUCCESS) { 1001 + SrsPacket* pkt = NULL;
  1002 + if ((ret = protocol->__decode_message(msg, &pkt)) != ERROR_SUCCESS) {
977 srs_error("identify decode message failed. ret=%d", ret); 1003 srs_error("identify decode message failed. ret=%d", ret);
978 return ret; 1004 return ret;
979 } 1005 }
980 1006
981 - SrsPacket* pkt = msg->get_packet(); 1007 + SrsAutoFree(SrsPacket, pkt, false);
  1008 +
982 if (dynamic_cast<SrsCreateStreamPacket*>(pkt)) { 1009 if (dynamic_cast<SrsCreateStreamPacket*>(pkt)) {
983 srs_info("identify client by create stream, play or flash publish."); 1010 srs_info("identify client by create stream, play or flash publish.");
984 return identify_create_stream_client(dynamic_cast<SrsCreateStreamPacket*>(pkt), stream_id, type, stream_name, duration); 1011 return identify_create_stream_client(dynamic_cast<SrsCreateStreamPacket*>(pkt), stream_id, type, stream_name, duration);
@@ -1002,13 +1029,9 @@ int SrsRtmpServer::set_chunk_size(int chunk_size) @@ -1002,13 +1029,9 @@ int SrsRtmpServer::set_chunk_size(int chunk_size)
1002 { 1029 {
1003 int ret = ERROR_SUCCESS; 1030 int ret = ERROR_SUCCESS;
1004 1031
1005 - SrsCommonMessage* msg = new SrsCommonMessage();  
1006 SrsSetChunkSizePacket* pkt = new SrsSetChunkSizePacket(); 1032 SrsSetChunkSizePacket* pkt = new SrsSetChunkSizePacket();
1007 -  
1008 pkt->chunk_size = chunk_size; 1033 pkt->chunk_size = chunk_size;
1009 - msg->set_packet(pkt, 0);  
1010 -  
1011 - if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) { 1034 + if ((ret = protocol->__send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
1012 srs_error("send set chunk size message failed. ret=%d", ret); 1035 srs_error("send set chunk size message failed. ret=%d", ret);
1013 return ret; 1036 return ret;
1014 } 1037 }
@@ -1023,14 +1046,10 @@ int SrsRtmpServer::start_play(int stream_id) @@ -1023,14 +1046,10 @@ int SrsRtmpServer::start_play(int stream_id)
1023 1046
1024 // StreamBegin 1047 // StreamBegin
1025 if (true) { 1048 if (true) {
1026 - SrsCommonMessage* msg = new SrsCommonMessage();  
1027 SrsUserControlPacket* pkt = new SrsUserControlPacket(); 1049 SrsUserControlPacket* pkt = new SrsUserControlPacket();
1028 -  
1029 pkt->event_type = SrcPCUCStreamBegin; 1050 pkt->event_type = SrcPCUCStreamBegin;
1030 pkt->event_data = stream_id; 1051 pkt->event_data = stream_id;
1031 - msg->set_packet(pkt, 0);  
1032 -  
1033 - if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) { 1052 + if ((ret = protocol->__send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
1034 srs_error("send PCUC(StreamBegin) message failed. ret=%d", ret); 1053 srs_error("send PCUC(StreamBegin) message failed. ret=%d", ret);
1035 return ret; 1054 return ret;
1036 } 1055 }
@@ -1039,7 +1058,6 @@ int SrsRtmpServer::start_play(int stream_id) @@ -1039,7 +1058,6 @@ int SrsRtmpServer::start_play(int stream_id)
1039 1058
1040 // onStatus(NetStream.Play.Reset) 1059 // onStatus(NetStream.Play.Reset)
1041 if (true) { 1060 if (true) {
1042 - SrsCommonMessage* msg = new SrsCommonMessage();  
1043 SrsOnStatusCallPacket* pkt = new SrsOnStatusCallPacket(); 1061 SrsOnStatusCallPacket* pkt = new SrsOnStatusCallPacket();
1044 1062
1045 pkt->data->set(StatusLevel, SrsAmf0Any::str(StatusLevelStatus)); 1063 pkt->data->set(StatusLevel, SrsAmf0Any::str(StatusLevelStatus));
@@ -1048,9 +1066,7 @@ int SrsRtmpServer::start_play(int stream_id) @@ -1048,9 +1066,7 @@ int SrsRtmpServer::start_play(int stream_id)
1048 pkt->data->set(StatusDetails, SrsAmf0Any::str("stream")); 1066 pkt->data->set(StatusDetails, SrsAmf0Any::str("stream"));
1049 pkt->data->set(StatusClientId, SrsAmf0Any::str(RTMP_SIG_CLIENT_ID)); 1067 pkt->data->set(StatusClientId, SrsAmf0Any::str(RTMP_SIG_CLIENT_ID));
1050 1068
1051 - msg->set_packet(pkt, stream_id);  
1052 -  
1053 - if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) { 1069 + if ((ret = protocol->__send_and_free_packet(pkt, stream_id)) != ERROR_SUCCESS) {
1054 srs_error("send onStatus(NetStream.Play.Reset) message failed. ret=%d", ret); 1070 srs_error("send onStatus(NetStream.Play.Reset) message failed. ret=%d", ret);
1055 return ret; 1071 return ret;
1056 } 1072 }
@@ -1059,7 +1075,6 @@ int SrsRtmpServer::start_play(int stream_id) @@ -1059,7 +1075,6 @@ int SrsRtmpServer::start_play(int stream_id)
1059 1075
1060 // onStatus(NetStream.Play.Start) 1076 // onStatus(NetStream.Play.Start)
1061 if (true) { 1077 if (true) {
1062 - SrsCommonMessage* msg = new SrsCommonMessage();  
1063 SrsOnStatusCallPacket* pkt = new SrsOnStatusCallPacket(); 1078 SrsOnStatusCallPacket* pkt = new SrsOnStatusCallPacket();
1064 1079
1065 pkt->data->set(StatusLevel, SrsAmf0Any::str(StatusLevelStatus)); 1080 pkt->data->set(StatusLevel, SrsAmf0Any::str(StatusLevelStatus));
@@ -1068,9 +1083,7 @@ int SrsRtmpServer::start_play(int stream_id) @@ -1068,9 +1083,7 @@ int SrsRtmpServer::start_play(int stream_id)
1068 pkt->data->set(StatusDetails, SrsAmf0Any::str("stream")); 1083 pkt->data->set(StatusDetails, SrsAmf0Any::str("stream"));
1069 pkt->data->set(StatusClientId, SrsAmf0Any::str(RTMP_SIG_CLIENT_ID)); 1084 pkt->data->set(StatusClientId, SrsAmf0Any::str(RTMP_SIG_CLIENT_ID));
1070 1085
1071 - msg->set_packet(pkt, stream_id);  
1072 -  
1073 - if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) { 1086 + if ((ret = protocol->__send_and_free_packet(pkt, stream_id)) != ERROR_SUCCESS) {
1074 srs_error("send onStatus(NetStream.Play.Reset) message failed. ret=%d", ret); 1087 srs_error("send onStatus(NetStream.Play.Reset) message failed. ret=%d", ret);
1075 return ret; 1088 return ret;
1076 } 1089 }
@@ -1079,12 +1092,8 @@ int SrsRtmpServer::start_play(int stream_id) @@ -1079,12 +1092,8 @@ int SrsRtmpServer::start_play(int stream_id)
1079 1092
1080 // |RtmpSampleAccess(false, false) 1093 // |RtmpSampleAccess(false, false)
1081 if (true) { 1094 if (true) {
1082 - SrsCommonMessage* msg = new SrsCommonMessage();  
1083 SrsSampleAccessPacket* pkt = new SrsSampleAccessPacket(); 1095 SrsSampleAccessPacket* pkt = new SrsSampleAccessPacket();
1084 -  
1085 - msg->set_packet(pkt, stream_id);  
1086 -  
1087 - if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) { 1096 + if ((ret = protocol->__send_and_free_packet(pkt, stream_id)) != ERROR_SUCCESS) {
1088 srs_error("send |RtmpSampleAccess(false, false) message failed. ret=%d", ret); 1097 srs_error("send |RtmpSampleAccess(false, false) message failed. ret=%d", ret);
1089 return ret; 1098 return ret;
1090 } 1099 }
@@ -1093,14 +1102,9 @@ int SrsRtmpServer::start_play(int stream_id) @@ -1093,14 +1102,9 @@ int SrsRtmpServer::start_play(int stream_id)
1093 1102
1094 // onStatus(NetStream.Data.Start) 1103 // onStatus(NetStream.Data.Start)
1095 if (true) { 1104 if (true) {
1096 - SrsCommonMessage* msg = new SrsCommonMessage();  
1097 SrsOnStatusDataPacket* pkt = new SrsOnStatusDataPacket(); 1105 SrsOnStatusDataPacket* pkt = new SrsOnStatusDataPacket();
1098 -  
1099 pkt->data->set(StatusCode, SrsAmf0Any::str(StatusCodeDataStart)); 1106 pkt->data->set(StatusCode, SrsAmf0Any::str(StatusCodeDataStart));
1100 -  
1101 - msg->set_packet(pkt, stream_id);  
1102 -  
1103 - if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) { 1107 + if ((ret = protocol->__send_and_free_packet(pkt, stream_id)) != ERROR_SUCCESS) {
1104 srs_error("send onStatus(NetStream.Data.Start) message failed. ret=%d", ret); 1108 srs_error("send onStatus(NetStream.Data.Start) message failed. ret=%d", ret);
1105 return ret; 1109 return ret;
1106 } 1110 }
@@ -1119,16 +1123,13 @@ int SrsRtmpServer::on_play_client_pause(int stream_id, bool is_pause) @@ -1119,16 +1123,13 @@ int SrsRtmpServer::on_play_client_pause(int stream_id, bool is_pause)
1119 if (is_pause) { 1123 if (is_pause) {
1120 // onStatus(NetStream.Pause.Notify) 1124 // onStatus(NetStream.Pause.Notify)
1121 if (true) { 1125 if (true) {
1122 - SrsCommonMessage* msg = new SrsCommonMessage();  
1123 SrsOnStatusCallPacket* pkt = new SrsOnStatusCallPacket(); 1126 SrsOnStatusCallPacket* pkt = new SrsOnStatusCallPacket();
1124 1127
1125 pkt->data->set(StatusLevel, SrsAmf0Any::str(StatusLevelStatus)); 1128 pkt->data->set(StatusLevel, SrsAmf0Any::str(StatusLevelStatus));
1126 pkt->data->set(StatusCode, SrsAmf0Any::str(StatusCodeStreamPause)); 1129 pkt->data->set(StatusCode, SrsAmf0Any::str(StatusCodeStreamPause));
1127 pkt->data->set(StatusDescription, SrsAmf0Any::str("Paused stream.")); 1130 pkt->data->set(StatusDescription, SrsAmf0Any::str("Paused stream."));
1128 1131
1129 - msg->set_packet(pkt, stream_id);  
1130 -  
1131 - if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) { 1132 + if ((ret = protocol->__send_and_free_packet(pkt, stream_id)) != ERROR_SUCCESS) {
1132 srs_error("send onStatus(NetStream.Pause.Notify) message failed. ret=%d", ret); 1133 srs_error("send onStatus(NetStream.Pause.Notify) message failed. ret=%d", ret);
1133 return ret; 1134 return ret;
1134 } 1135 }
@@ -1136,14 +1137,12 @@ int SrsRtmpServer::on_play_client_pause(int stream_id, bool is_pause) @@ -1136,14 +1137,12 @@ int SrsRtmpServer::on_play_client_pause(int stream_id, bool is_pause)
1136 } 1137 }
1137 // StreamEOF 1138 // StreamEOF
1138 if (true) { 1139 if (true) {
1139 - SrsCommonMessage* msg = new SrsCommonMessage();  
1140 SrsUserControlPacket* pkt = new SrsUserControlPacket(); 1140 SrsUserControlPacket* pkt = new SrsUserControlPacket();
1141 1141
1142 pkt->event_type = SrcPCUCStreamEOF; 1142 pkt->event_type = SrcPCUCStreamEOF;
1143 pkt->event_data = stream_id; 1143 pkt->event_data = stream_id;
1144 - msg->set_packet(pkt, 0);  
1145 1144
1146 - if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) { 1145 + if ((ret = protocol->__send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
1147 srs_error("send PCUC(StreamEOF) message failed. ret=%d", ret); 1146 srs_error("send PCUC(StreamEOF) message failed. ret=%d", ret);
1148 return ret; 1147 return ret;
1149 } 1148 }
@@ -1152,16 +1151,13 @@ int SrsRtmpServer::on_play_client_pause(int stream_id, bool is_pause) @@ -1152,16 +1151,13 @@ int SrsRtmpServer::on_play_client_pause(int stream_id, bool is_pause)
1152 } else { 1151 } else {
1153 // onStatus(NetStream.Unpause.Notify) 1152 // onStatus(NetStream.Unpause.Notify)
1154 if (true) { 1153 if (true) {
1155 - SrsCommonMessage* msg = new SrsCommonMessage();  
1156 SrsOnStatusCallPacket* pkt = new SrsOnStatusCallPacket(); 1154 SrsOnStatusCallPacket* pkt = new SrsOnStatusCallPacket();
1157 1155
1158 pkt->data->set(StatusLevel, SrsAmf0Any::str(StatusLevelStatus)); 1156 pkt->data->set(StatusLevel, SrsAmf0Any::str(StatusLevelStatus));
1159 pkt->data->set(StatusCode, SrsAmf0Any::str(StatusCodeStreamUnpause)); 1157 pkt->data->set(StatusCode, SrsAmf0Any::str(StatusCodeStreamUnpause));
1160 pkt->data->set(StatusDescription, SrsAmf0Any::str("Unpaused stream.")); 1158 pkt->data->set(StatusDescription, SrsAmf0Any::str("Unpaused stream."));
1161 1159
1162 - msg->set_packet(pkt, stream_id);  
1163 -  
1164 - if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) { 1160 + if ((ret = protocol->__send_and_free_packet(pkt, stream_id)) != ERROR_SUCCESS) {
1165 srs_error("send onStatus(NetStream.Unpause.Notify) message failed. ret=%d", ret); 1161 srs_error("send onStatus(NetStream.Unpause.Notify) message failed. ret=%d", ret);
1166 return ret; 1162 return ret;
1167 } 1163 }
@@ -1169,14 +1165,12 @@ int SrsRtmpServer::on_play_client_pause(int stream_id, bool is_pause) @@ -1169,14 +1165,12 @@ int SrsRtmpServer::on_play_client_pause(int stream_id, bool is_pause)
1169 } 1165 }
1170 // StreanBegin 1166 // StreanBegin
1171 if (true) { 1167 if (true) {
1172 - SrsCommonMessage* msg = new SrsCommonMessage();  
1173 SrsUserControlPacket* pkt = new SrsUserControlPacket(); 1168 SrsUserControlPacket* pkt = new SrsUserControlPacket();
1174 1169
1175 pkt->event_type = SrcPCUCStreamBegin; 1170 pkt->event_type = SrcPCUCStreamBegin;
1176 pkt->event_data = stream_id; 1171 pkt->event_data = stream_id;
1177 - msg->set_packet(pkt, 0);  
1178 1172
1179 - if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) { 1173 + if ((ret = protocol->__send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
1180 srs_error("send PCUC(StreanBegin) message failed. ret=%d", ret); 1174 srs_error("send PCUC(StreanBegin) message failed. ret=%d", ret);
1181 return ret; 1175 return ret;
1182 } 1176 }
@@ -1194,25 +1188,21 @@ int SrsRtmpServer::start_fmle_publish(int stream_id) @@ -1194,25 +1188,21 @@ int SrsRtmpServer::start_fmle_publish(int stream_id)
1194 // FCPublish 1188 // FCPublish
1195 double fc_publish_tid = 0; 1189 double fc_publish_tid = 0;
1196 if (true) { 1190 if (true) {
1197 - SrsCommonMessage* msg = NULL; 1191 + __SrsMessage* msg = NULL;
1198 SrsFMLEStartPacket* pkt = NULL; 1192 SrsFMLEStartPacket* pkt = NULL;
1199 - if ((ret = srs_rtmp_expect_message<SrsFMLEStartPacket>(protocol, &msg, &pkt)) != ERROR_SUCCESS) { 1193 + if ((ret = __srs_rtmp_expect_message<SrsFMLEStartPacket>(protocol, &msg, &pkt)) != ERROR_SUCCESS) {
1200 srs_error("recv FCPublish message failed. ret=%d", ret); 1194 srs_error("recv FCPublish message failed. ret=%d", ret);
1201 return ret; 1195 return ret;
1202 } 1196 }
1203 srs_info("recv FCPublish request message success."); 1197 srs_info("recv FCPublish request message success.");
1204 1198
1205 - SrsAutoFree(SrsCommonMessage, msg, false); 1199 + SrsAutoFree(__SrsMessage, msg, false);
1206 fc_publish_tid = pkt->transaction_id; 1200 fc_publish_tid = pkt->transaction_id;
1207 } 1201 }
1208 // FCPublish response 1202 // FCPublish response
1209 if (true) { 1203 if (true) {
1210 - SrsCommonMessage* msg = new SrsCommonMessage();  
1211 SrsFMLEStartResPacket* pkt = new SrsFMLEStartResPacket(fc_publish_tid); 1204 SrsFMLEStartResPacket* pkt = new SrsFMLEStartResPacket(fc_publish_tid);
1212 -  
1213 - msg->set_packet(pkt, 0);  
1214 -  
1215 - if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) { 1205 + if ((ret = protocol->__send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
1216 srs_error("send FCPublish response message failed. ret=%d", ret); 1206 srs_error("send FCPublish response message failed. ret=%d", ret);
1217 return ret; 1207 return ret;
1218 } 1208 }
@@ -1222,25 +1212,21 @@ int SrsRtmpServer::start_fmle_publish(int stream_id) @@ -1222,25 +1212,21 @@ int SrsRtmpServer::start_fmle_publish(int stream_id)
1222 // createStream 1212 // createStream
1223 double create_stream_tid = 0; 1213 double create_stream_tid = 0;
1224 if (true) { 1214 if (true) {
1225 - SrsCommonMessage* msg = NULL; 1215 + __SrsMessage* msg = NULL;
1226 SrsCreateStreamPacket* pkt = NULL; 1216 SrsCreateStreamPacket* pkt = NULL;
1227 - if ((ret = srs_rtmp_expect_message<SrsCreateStreamPacket>(protocol, &msg, &pkt)) != ERROR_SUCCESS) { 1217 + if ((ret = __srs_rtmp_expect_message<SrsCreateStreamPacket>(protocol, &msg, &pkt)) != ERROR_SUCCESS) {
1228 srs_error("recv createStream message failed. ret=%d", ret); 1218 srs_error("recv createStream message failed. ret=%d", ret);
1229 return ret; 1219 return ret;
1230 } 1220 }
1231 srs_info("recv createStream request message success."); 1221 srs_info("recv createStream request message success.");
1232 1222
1233 - SrsAutoFree(SrsCommonMessage, msg, false); 1223 + SrsAutoFree(__SrsMessage, msg, false);
1234 create_stream_tid = pkt->transaction_id; 1224 create_stream_tid = pkt->transaction_id;
1235 } 1225 }
1236 // createStream response 1226 // createStream response
1237 if (true) { 1227 if (true) {
1238 - SrsCommonMessage* msg = new SrsCommonMessage();  
1239 SrsCreateStreamResPacket* pkt = new SrsCreateStreamResPacket(create_stream_tid, stream_id); 1228 SrsCreateStreamResPacket* pkt = new SrsCreateStreamResPacket(create_stream_tid, stream_id);
1240 -  
1241 - msg->set_packet(pkt, 0);  
1242 -  
1243 - if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) { 1229 + if ((ret = protocol->__send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
1244 srs_error("send createStream response message failed. ret=%d", ret); 1230 srs_error("send createStream response message failed. ret=%d", ret);
1245 return ret; 1231 return ret;
1246 } 1232 }
@@ -1249,28 +1235,25 @@ int SrsRtmpServer::start_fmle_publish(int stream_id) @@ -1249,28 +1235,25 @@ int SrsRtmpServer::start_fmle_publish(int stream_id)
1249 1235
1250 // publish 1236 // publish
1251 if (true) { 1237 if (true) {
1252 - SrsCommonMessage* msg = NULL; 1238 + __SrsMessage* msg = NULL;
1253 SrsPublishPacket* pkt = NULL; 1239 SrsPublishPacket* pkt = NULL;
1254 - if ((ret = srs_rtmp_expect_message<SrsPublishPacket>(protocol, &msg, &pkt)) != ERROR_SUCCESS) { 1240 + if ((ret = __srs_rtmp_expect_message<SrsPublishPacket>(protocol, &msg, &pkt)) != ERROR_SUCCESS) {
1255 srs_error("recv publish message failed. ret=%d", ret); 1241 srs_error("recv publish message failed. ret=%d", ret);
1256 return ret; 1242 return ret;
1257 } 1243 }
1258 srs_info("recv publish request message success."); 1244 srs_info("recv publish request message success.");
1259 1245
1260 - SrsAutoFree(SrsCommonMessage, msg, false); 1246 + SrsAutoFree(__SrsMessage, msg, false);
1261 } 1247 }
1262 // publish response onFCPublish(NetStream.Publish.Start) 1248 // publish response onFCPublish(NetStream.Publish.Start)
1263 if (true) { 1249 if (true) {
1264 - SrsCommonMessage* msg = new SrsCommonMessage();  
1265 SrsOnStatusCallPacket* pkt = new SrsOnStatusCallPacket(); 1250 SrsOnStatusCallPacket* pkt = new SrsOnStatusCallPacket();
1266 1251
1267 pkt->command_name = RTMP_AMF0_COMMAND_ON_FC_PUBLISH; 1252 pkt->command_name = RTMP_AMF0_COMMAND_ON_FC_PUBLISH;
1268 pkt->data->set(StatusCode, SrsAmf0Any::str(StatusCodePublishStart)); 1253 pkt->data->set(StatusCode, SrsAmf0Any::str(StatusCodePublishStart));
1269 pkt->data->set(StatusDescription, SrsAmf0Any::str("Started publishing stream.")); 1254 pkt->data->set(StatusDescription, SrsAmf0Any::str("Started publishing stream."));
1270 1255
1271 - msg->set_packet(pkt, stream_id);  
1272 -  
1273 - if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) { 1256 + if ((ret = protocol->__send_and_free_packet(pkt, stream_id)) != ERROR_SUCCESS) {
1274 srs_error("send onFCPublish(NetStream.Publish.Start) message failed. ret=%d", ret); 1257 srs_error("send onFCPublish(NetStream.Publish.Start) message failed. ret=%d", ret);
1275 return ret; 1258 return ret;
1276 } 1259 }
@@ -1278,7 +1261,6 @@ int SrsRtmpServer::start_fmle_publish(int stream_id) @@ -1278,7 +1261,6 @@ int SrsRtmpServer::start_fmle_publish(int stream_id)
1278 } 1261 }
1279 // publish response onStatus(NetStream.Publish.Start) 1262 // publish response onStatus(NetStream.Publish.Start)
1280 if (true) { 1263 if (true) {
1281 - SrsCommonMessage* msg = new SrsCommonMessage();  
1282 SrsOnStatusCallPacket* pkt = new SrsOnStatusCallPacket(); 1264 SrsOnStatusCallPacket* pkt = new SrsOnStatusCallPacket();
1283 1265
1284 pkt->data->set(StatusLevel, SrsAmf0Any::str(StatusLevelStatus)); 1266 pkt->data->set(StatusLevel, SrsAmf0Any::str(StatusLevelStatus));
@@ -1286,9 +1268,7 @@ int SrsRtmpServer::start_fmle_publish(int stream_id) @@ -1286,9 +1268,7 @@ int SrsRtmpServer::start_fmle_publish(int stream_id)
1286 pkt->data->set(StatusDescription, SrsAmf0Any::str("Started publishing stream.")); 1268 pkt->data->set(StatusDescription, SrsAmf0Any::str("Started publishing stream."));
1287 pkt->data->set(StatusClientId, SrsAmf0Any::str(RTMP_SIG_CLIENT_ID)); 1269 pkt->data->set(StatusClientId, SrsAmf0Any::str(RTMP_SIG_CLIENT_ID));
1288 1270
1289 - msg->set_packet(pkt, stream_id);  
1290 -  
1291 - if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) { 1271 + if ((ret = protocol->__send_and_free_packet(pkt, stream_id)) != ERROR_SUCCESS) {
1292 srs_error("send onStatus(NetStream.Publish.Start) message failed. ret=%d", ret); 1272 srs_error("send onStatus(NetStream.Publish.Start) message failed. ret=%d", ret);
1293 return ret; 1273 return ret;
1294 } 1274 }
@@ -1306,16 +1286,13 @@ int SrsRtmpServer::fmle_unpublish(int stream_id, double unpublish_tid) @@ -1306,16 +1286,13 @@ int SrsRtmpServer::fmle_unpublish(int stream_id, double unpublish_tid)
1306 1286
1307 // publish response onFCUnpublish(NetStream.unpublish.Success) 1287 // publish response onFCUnpublish(NetStream.unpublish.Success)
1308 if (true) { 1288 if (true) {
1309 - SrsCommonMessage* msg = new SrsCommonMessage();  
1310 SrsOnStatusCallPacket* pkt = new SrsOnStatusCallPacket(); 1289 SrsOnStatusCallPacket* pkt = new SrsOnStatusCallPacket();
1311 1290
1312 pkt->command_name = RTMP_AMF0_COMMAND_ON_FC_UNPUBLISH; 1291 pkt->command_name = RTMP_AMF0_COMMAND_ON_FC_UNPUBLISH;
1313 pkt->data->set(StatusCode, SrsAmf0Any::str(StatusCodeUnpublishSuccess)); 1292 pkt->data->set(StatusCode, SrsAmf0Any::str(StatusCodeUnpublishSuccess));
1314 pkt->data->set(StatusDescription, SrsAmf0Any::str("Stop publishing stream.")); 1293 pkt->data->set(StatusDescription, SrsAmf0Any::str("Stop publishing stream."));
1315 1294
1316 - msg->set_packet(pkt, stream_id);  
1317 -  
1318 - if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) { 1295 + if ((ret = protocol->__send_and_free_packet(pkt, stream_id)) != ERROR_SUCCESS) {
1319 srs_error("send onFCUnpublish(NetStream.unpublish.Success) message failed. ret=%d", ret); 1296 srs_error("send onFCUnpublish(NetStream.unpublish.Success) message failed. ret=%d", ret);
1320 return ret; 1297 return ret;
1321 } 1298 }
@@ -1323,12 +1300,8 @@ int SrsRtmpServer::fmle_unpublish(int stream_id, double unpublish_tid) @@ -1323,12 +1300,8 @@ int SrsRtmpServer::fmle_unpublish(int stream_id, double unpublish_tid)
1323 } 1300 }
1324 // FCUnpublish response 1301 // FCUnpublish response
1325 if (true) { 1302 if (true) {
1326 - SrsCommonMessage* msg = new SrsCommonMessage();  
1327 SrsFMLEStartResPacket* pkt = new SrsFMLEStartResPacket(unpublish_tid); 1303 SrsFMLEStartResPacket* pkt = new SrsFMLEStartResPacket(unpublish_tid);
1328 -  
1329 - msg->set_packet(pkt, stream_id);  
1330 -  
1331 - if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) { 1304 + if ((ret = protocol->__send_and_free_packet(pkt, stream_id)) != ERROR_SUCCESS) {
1332 srs_error("send FCUnpublish response message failed. ret=%d", ret); 1305 srs_error("send FCUnpublish response message failed. ret=%d", ret);
1333 return ret; 1306 return ret;
1334 } 1307 }
@@ -1336,7 +1309,6 @@ int SrsRtmpServer::fmle_unpublish(int stream_id, double unpublish_tid) @@ -1336,7 +1309,6 @@ int SrsRtmpServer::fmle_unpublish(int stream_id, double unpublish_tid)
1336 } 1309 }
1337 // publish response onStatus(NetStream.Unpublish.Success) 1310 // publish response onStatus(NetStream.Unpublish.Success)
1338 if (true) { 1311 if (true) {
1339 - SrsCommonMessage* msg = new SrsCommonMessage();  
1340 SrsOnStatusCallPacket* pkt = new SrsOnStatusCallPacket(); 1312 SrsOnStatusCallPacket* pkt = new SrsOnStatusCallPacket();
1341 1313
1342 pkt->data->set(StatusLevel, SrsAmf0Any::str(StatusLevelStatus)); 1314 pkt->data->set(StatusLevel, SrsAmf0Any::str(StatusLevelStatus));
@@ -1344,9 +1316,7 @@ int SrsRtmpServer::fmle_unpublish(int stream_id, double unpublish_tid) @@ -1344,9 +1316,7 @@ int SrsRtmpServer::fmle_unpublish(int stream_id, double unpublish_tid)
1344 pkt->data->set(StatusDescription, SrsAmf0Any::str("Stream is now unpublished")); 1316 pkt->data->set(StatusDescription, SrsAmf0Any::str("Stream is now unpublished"));
1345 pkt->data->set(StatusClientId, SrsAmf0Any::str(RTMP_SIG_CLIENT_ID)); 1317 pkt->data->set(StatusClientId, SrsAmf0Any::str(RTMP_SIG_CLIENT_ID));
1346 1318
1347 - msg->set_packet(pkt, stream_id);  
1348 -  
1349 - if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) { 1319 + if ((ret = protocol->__send_and_free_packet(pkt, stream_id)) != ERROR_SUCCESS) {
1350 srs_error("send onStatus(NetStream.Unpublish.Success) message failed. ret=%d", ret); 1320 srs_error("send onStatus(NetStream.Unpublish.Success) message failed. ret=%d", ret);
1351 return ret; 1321 return ret;
1352 } 1322 }
@@ -1364,7 +1334,6 @@ int SrsRtmpServer::start_flash_publish(int stream_id) @@ -1364,7 +1334,6 @@ int SrsRtmpServer::start_flash_publish(int stream_id)
1364 1334
1365 // publish response onStatus(NetStream.Publish.Start) 1335 // publish response onStatus(NetStream.Publish.Start)
1366 if (true) { 1336 if (true) {
1367 - SrsCommonMessage* msg = new SrsCommonMessage();  
1368 SrsOnStatusCallPacket* pkt = new SrsOnStatusCallPacket(); 1337 SrsOnStatusCallPacket* pkt = new SrsOnStatusCallPacket();
1369 1338
1370 pkt->data->set(StatusLevel, SrsAmf0Any::str(StatusLevelStatus)); 1339 pkt->data->set(StatusLevel, SrsAmf0Any::str(StatusLevelStatus));
@@ -1372,9 +1341,7 @@ int SrsRtmpServer::start_flash_publish(int stream_id) @@ -1372,9 +1341,7 @@ int SrsRtmpServer::start_flash_publish(int stream_id)
1372 pkt->data->set(StatusDescription, SrsAmf0Any::str("Started publishing stream.")); 1341 pkt->data->set(StatusDescription, SrsAmf0Any::str("Started publishing stream."));
1373 pkt->data->set(StatusClientId, SrsAmf0Any::str(RTMP_SIG_CLIENT_ID)); 1342 pkt->data->set(StatusClientId, SrsAmf0Any::str(RTMP_SIG_CLIENT_ID));
1374 1343
1375 - msg->set_packet(pkt, stream_id);  
1376 -  
1377 - if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) { 1344 + if ((ret = protocol->__send_and_free_packet(pkt, stream_id)) != ERROR_SUCCESS) {
1378 srs_error("send onStatus(NetStream.Publish.Start) message failed. ret=%d", ret); 1345 srs_error("send onStatus(NetStream.Publish.Start) message failed. ret=%d", ret);
1379 return ret; 1346 return ret;
1380 } 1347 }
@@ -1391,12 +1358,8 @@ int SrsRtmpServer::identify_create_stream_client(SrsCreateStreamPacket* req, int @@ -1391,12 +1358,8 @@ int SrsRtmpServer::identify_create_stream_client(SrsCreateStreamPacket* req, int
1391 int ret = ERROR_SUCCESS; 1358 int ret = ERROR_SUCCESS;
1392 1359
1393 if (true) { 1360 if (true) {
1394 - SrsCommonMessage* msg = new SrsCommonMessage();  
1395 SrsCreateStreamResPacket* pkt = new SrsCreateStreamResPacket(req->transaction_id, stream_id); 1361 SrsCreateStreamResPacket* pkt = new SrsCreateStreamResPacket(req->transaction_id, stream_id);
1396 -  
1397 - msg->set_packet(pkt, 0);  
1398 -  
1399 - if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) { 1362 + if ((ret = protocol->__send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
1400 srs_error("send createStream response message failed. ret=%d", ret); 1363 srs_error("send createStream response message failed. ret=%d", ret);
1401 return ret; 1364 return ret;
1402 } 1365 }
@@ -1404,13 +1367,13 @@ int SrsRtmpServer::identify_create_stream_client(SrsCreateStreamPacket* req, int @@ -1404,13 +1367,13 @@ int SrsRtmpServer::identify_create_stream_client(SrsCreateStreamPacket* req, int
1404 } 1367 }
1405 1368
1406 while (true) { 1369 while (true) {
1407 - SrsCommonMessage* msg = NULL;  
1408 - if ((ret = protocol->recv_message(&msg)) != ERROR_SUCCESS) { 1370 + __SrsMessage* msg = NULL;
  1371 + if ((ret = protocol->__recv_message(&msg)) != ERROR_SUCCESS) {
1409 srs_error("recv identify client message failed. ret=%d", ret); 1372 srs_error("recv identify client message failed. ret=%d", ret);
1410 return ret; 1373 return ret;
1411 } 1374 }
1412 1375
1413 - SrsAutoFree(SrsCommonMessage, msg, false); 1376 + SrsAutoFree(__SrsMessage, msg, false);
1414 1377
1415 if (!msg->header.is_amf0_command() && !msg->header.is_amf3_command()) { 1378 if (!msg->header.is_amf0_command() && !msg->header.is_amf3_command()) {
1416 srs_trace("identify ignore messages except " 1379 srs_trace("identify ignore messages except "
@@ -1418,12 +1381,14 @@ int SrsRtmpServer::identify_create_stream_client(SrsCreateStreamPacket* req, int @@ -1418,12 +1381,14 @@ int SrsRtmpServer::identify_create_stream_client(SrsCreateStreamPacket* req, int
1418 continue; 1381 continue;
1419 } 1382 }
1420 1383
1421 - if ((ret = msg->decode_packet(protocol)) != ERROR_SUCCESS) { 1384 + SrsPacket* pkt = NULL;
  1385 + if ((ret = protocol->__decode_message(msg, &pkt)) != ERROR_SUCCESS) {
1422 srs_error("identify decode message failed. ret=%d", ret); 1386 srs_error("identify decode message failed. ret=%d", ret);
1423 return ret; 1387 return ret;
1424 } 1388 }
  1389 +
  1390 + SrsAutoFree(SrsPacket, pkt, false);
1425 1391
1426 - SrsPacket* pkt = msg->get_packet();  
1427 if (dynamic_cast<SrsPlayPacket*>(pkt)) { 1392 if (dynamic_cast<SrsPlayPacket*>(pkt)) {
1428 srs_info("level1 identify client by play."); 1393 srs_info("level1 identify client by play.");
1429 return identify_play_client(dynamic_cast<SrsPlayPacket*>(pkt), type, stream_name, duration); 1394 return identify_play_client(dynamic_cast<SrsPlayPacket*>(pkt), type, stream_name, duration);
@@ -1448,12 +1413,8 @@ int SrsRtmpServer::identify_fmle_publish_client(SrsFMLEStartPacket* req, SrsRtmp @@ -1448,12 +1413,8 @@ int SrsRtmpServer::identify_fmle_publish_client(SrsFMLEStartPacket* req, SrsRtmp
1448 1413
1449 // releaseStream response 1414 // releaseStream response
1450 if (true) { 1415 if (true) {
1451 - SrsCommonMessage* msg = new SrsCommonMessage();  
1452 SrsFMLEStartResPacket* pkt = new SrsFMLEStartResPacket(req->transaction_id); 1416 SrsFMLEStartResPacket* pkt = new SrsFMLEStartResPacket(req->transaction_id);
1453 -  
1454 - msg->set_packet(pkt, 0);  
1455 -  
1456 - if ((ret = protocol->send_message(msg)) != ERROR_SUCCESS) { 1417 + if ((ret = protocol->__send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) {
1457 srs_error("send releaseStream response message failed. ret=%d", ret); 1418 srs_error("send releaseStream response message failed. ret=%d", ret);
1458 return ret; 1419 return ret;
1459 } 1420 }
@@ -42,6 +42,8 @@ class SrsPublishPacket; @@ -42,6 +42,8 @@ class SrsPublishPacket;
42 class SrsSharedPtrMessage; 42 class SrsSharedPtrMessage;
43 class SrsOnMetaDataPacket; 43 class SrsOnMetaDataPacket;
44 class SrsPlayPacket; 44 class SrsPlayPacket;
  45 +class __SrsMessage;
  46 +class SrsPacket;
45 47
46 /** 48 /**
47 * the original request from client. 49 * the original request from client.
@@ -164,6 +166,10 @@ public: @@ -164,6 +166,10 @@ public:
164 virtual int get_send_kbps(); 166 virtual int get_send_kbps();
165 virtual int recv_message(SrsCommonMessage** pmsg); 167 virtual int recv_message(SrsCommonMessage** pmsg);
166 virtual int send_message(ISrsMessage* msg); 168 virtual int send_message(ISrsMessage* msg);
  169 + virtual int __recv_message(__SrsMessage** pmsg);
  170 + virtual int __decode_message(__SrsMessage* msg, SrsPacket** ppacket);
  171 + virtual int __send_and_free_message(__SrsMessage* msg);
  172 + virtual int __send_and_free_packet(SrsPacket* packet, int stream_id);
167 public: 173 public:
168 // try complex, then simple handshake. 174 // try complex, then simple handshake.
169 virtual int handshake(); 175 virtual int handshake();
@@ -209,6 +215,10 @@ public: @@ -209,6 +215,10 @@ public:
209 virtual int get_send_kbps(); 215 virtual int get_send_kbps();
210 virtual int recv_message(SrsCommonMessage** pmsg); 216 virtual int recv_message(SrsCommonMessage** pmsg);
211 virtual int send_message(ISrsMessage* msg); 217 virtual int send_message(ISrsMessage* msg);
  218 + virtual int __recv_message(__SrsMessage** pmsg);
  219 + virtual int __decode_message(__SrsMessage* msg, SrsPacket** ppacket);
  220 + virtual int __send_and_free_message(__SrsMessage* msg);
  221 + virtual int __send_and_free_packet(SrsPacket* packet, int stream_id);
212 public: 222 public:
213 virtual int handshake(); 223 virtual int handshake();
214 virtual int connect_app(SrsRequest* req); 224 virtual int connect_app(SrsRequest* req);
@@ -297,6 +297,7 @@ SrsProtocol::AckWindowSize::AckWindowSize() @@ -297,6 +297,7 @@ SrsProtocol::AckWindowSize::AckWindowSize()
297 SrsProtocol::SrsProtocol(ISrsProtocolReaderWriter* io) 297 SrsProtocol::SrsProtocol(ISrsProtocolReaderWriter* io)
298 { 298 {
299 buffer = new SrsBuffer(); 299 buffer = new SrsBuffer();
  300 + decode_stream = new SrsStream();
300 skt = io; 301 skt = io;
301 302
302 in_chunk_size = out_chunk_size = RTMP_DEFAULT_CHUNK_SIZE; 303 in_chunk_size = out_chunk_size = RTMP_DEFAULT_CHUNK_SIZE;
@@ -304,65 +305,1054 @@ SrsProtocol::SrsProtocol(ISrsProtocolReaderWriter* io) @@ -304,65 +305,1054 @@ SrsProtocol::SrsProtocol(ISrsProtocolReaderWriter* io)
304 305
305 SrsProtocol::~SrsProtocol() 306 SrsProtocol::~SrsProtocol()
306 { 307 {
307 - std::map<int, SrsChunkStream*>::iterator it; 308 + if (true) {
  309 + std::map<int, SrsChunkStream*>::iterator it;
  310 +
  311 + for (it = chunk_streams.begin(); it != chunk_streams.end(); ++it) {
  312 + SrsChunkStream* stream = it->second;
  313 + srs_freep(stream);
  314 + }
  315 +
  316 + chunk_streams.clear();
  317 + }
  318 + if (true) {
  319 + std::map<int, __SrsChunkStream*>::iterator it;
  320 +
  321 + for (it = __chunk_streams.begin(); it != __chunk_streams.end(); ++it) {
  322 + __SrsChunkStream* stream = it->second;
  323 + srs_freep(stream);
  324 + }
  325 +
  326 + __chunk_streams.clear();
  327 + }
  328 +
  329 + srs_freep(decode_stream);
  330 + srs_freep(buffer);
  331 +}
  332 +
  333 +string SrsProtocol::get_request_name(double transcationId)
  334 +{
  335 + if (requests.find(transcationId) == requests.end()) {
  336 + return "";
  337 + }
  338 +
  339 + return requests[transcationId];
  340 +}
  341 +
  342 +void SrsProtocol::set_recv_timeout(int64_t timeout_us)
  343 +{
  344 + return skt->set_recv_timeout(timeout_us);
  345 +}
  346 +
  347 +int64_t SrsProtocol::get_recv_timeout()
  348 +{
  349 + return skt->get_recv_timeout();
  350 +}
  351 +
  352 +void SrsProtocol::set_send_timeout(int64_t timeout_us)
  353 +{
  354 + return skt->set_send_timeout(timeout_us);
  355 +}
  356 +
  357 +int64_t SrsProtocol::get_send_timeout()
  358 +{
  359 + return skt->get_send_timeout();
  360 +}
  361 +
  362 +int64_t SrsProtocol::get_recv_bytes()
  363 +{
  364 + return skt->get_recv_bytes();
  365 +}
  366 +
  367 +int64_t SrsProtocol::get_send_bytes()
  368 +{
  369 + return skt->get_send_bytes();
  370 +}
  371 +
  372 +int SrsProtocol::get_recv_kbps()
  373 +{
  374 + return skt->get_recv_kbps();
  375 +}
  376 +
  377 +int SrsProtocol::get_send_kbps()
  378 +{
  379 + return skt->get_send_kbps();
  380 +}
  381 +
  382 +int SrsProtocol::__recv_message(__SrsMessage** pmsg)
  383 +{
  384 + *pmsg = NULL;
  385 +
  386 + int ret = ERROR_SUCCESS;
  387 +
  388 + while (true) {
  389 + __SrsMessage* msg = NULL;
  390 +
  391 + if ((ret = __recv_interlaced_message(&msg)) != ERROR_SUCCESS) {
  392 + if (ret != ERROR_SOCKET_TIMEOUT && !srs_is_client_gracefully_close(ret)) {
  393 + srs_error("recv interlaced message failed. ret=%d", ret);
  394 + }
  395 + return ret;
  396 + }
  397 + srs_verbose("entire msg received");
  398 +
  399 + if (!msg) {
  400 + continue;
  401 + }
  402 +
  403 + if (msg->size <= 0 || msg->header.payload_length <= 0) {
  404 + srs_trace("ignore empty message(type=%d, size=%d, time=%"PRId64", sid=%d).",
  405 + msg->header.message_type, msg->header.payload_length,
  406 + msg->header.timestamp, msg->header.stream_id);
  407 + srs_freep(msg);
  408 + continue;
  409 + }
  410 +
  411 + if ((ret = __on_recv_message(msg)) != ERROR_SUCCESS) {
  412 + srs_error("hook the received msg failed. ret=%d", ret);
  413 + srs_freep(msg);
  414 + return ret;
  415 + }
  416 +
  417 + srs_verbose("get a msg with raw/undecoded payload");
  418 + *pmsg = msg;
  419 + break;
  420 + }
  421 +
  422 + return ret;
  423 +}
  424 +
  425 +int SrsProtocol::__decode_message(__SrsMessage* msg, SrsPacket** ppacket)
  426 +{
  427 + *ppacket = NULL;
  428 +
  429 + int ret = ERROR_SUCCESS;
  430 +
  431 + srs_assert(msg != NULL);
  432 + srs_assert(msg->payload != NULL);
  433 + srs_assert(msg->size > 0);
  434 +
  435 + // initialize the decode stream for all message,
  436 + // it's ok for the initialize if fast and without memory copy.
  437 + if ((ret = decode_stream->initialize((char*)(msg->payload), msg->size)) != ERROR_SUCCESS) {
  438 + srs_error("initialize stream failed. ret=%d", ret);
  439 + return ret;
  440 + }
  441 + srs_verbose("decode stream initialized success");
  442 +
  443 + // decode the packet.
  444 + SrsPacket* packet = NULL;
  445 + if ((ret = __do_decode_message(msg->header, decode_stream, &packet)) != ERROR_SUCCESS) {
  446 + srs_freep(packet);
  447 + return ret;
  448 + }
  449 +
  450 + // set to output ppacket only when success.
  451 + *ppacket = packet;
  452 +
  453 + return ret;
  454 +}
  455 +
  456 +int SrsProtocol::__do_send_and_free_message(__SrsMessage* msg, SrsPacket* packet)
  457 +{
  458 + int ret = ERROR_SUCCESS;
  459 +
  460 + // we donot use the complex basic header,
  461 + // ensure the basic header is 1bytes.
  462 + if (msg->header.perfer_cid < 2) {
  463 + srs_warn("change the chunk_id=%d to default=%d",
  464 + msg->header.perfer_cid, RTMP_CID_ProtocolControl);
  465 + msg->header.perfer_cid = RTMP_CID_ProtocolControl;
  466 + }
  467 +
  468 + // p set to current write position,
  469 + // it's ok when payload is NULL and size is 0.
  470 + char* p = (char*)msg->payload;
  471 +
  472 + // always write the header event payload is empty.
  473 + do {
  474 + // generate the header.
  475 + char* pheader = out_header_cache;
  476 +
  477 + if (p == (char*)msg->payload) {
  478 + // write new chunk stream header, fmt is 0
  479 + *pheader++ = 0x00 | (msg->header.perfer_cid & 0x3F);
  480 +
  481 + // chunk message header, 11 bytes
  482 + // timestamp, 3bytes, big-endian
  483 + u_int32_t timestamp = (u_int32_t)msg->header.timestamp;
  484 + if (timestamp >= RTMP_EXTENDED_TIMESTAMP) {
  485 + *pheader++ = 0xFF;
  486 + *pheader++ = 0xFF;
  487 + *pheader++ = 0xFF;
  488 + } else {
  489 + pp = (char*)&timestamp;
  490 + *pheader++ = pp[2];
  491 + *pheader++ = pp[1];
  492 + *pheader++ = pp[0];
  493 + }
  494 +
  495 + // message_length, 3bytes, big-endian
  496 + pp = (char*)&msg->header.payload_length;
  497 + *pheader++ = pp[2];
  498 + *pheader++ = pp[1];
  499 + *pheader++ = pp[0];
  500 +
  501 + // message_type, 1bytes
  502 + *pheader++ = msg->header.message_type;
  503 +
  504 + // message_length, 3bytes, little-endian
  505 + pp = (char*)&msg->header.stream_id;
  506 + *pheader++ = pp[0];
  507 + *pheader++ = pp[1];
  508 + *pheader++ = pp[2];
  509 + *pheader++ = pp[3];
  510 +
  511 + // chunk extended timestamp header, 0 or 4 bytes, big-endian
  512 + if(timestamp >= RTMP_EXTENDED_TIMESTAMP){
  513 + pp = (char*)&timestamp;
  514 + *pheader++ = pp[3];
  515 + *pheader++ = pp[2];
  516 + *pheader++ = pp[1];
  517 + *pheader++ = pp[0];
  518 + }
  519 + } else {
  520 + // write no message header chunk stream, fmt is 3
  521 + *pheader++ = 0xC0 | (msg->header.perfer_cid & 0x3F);
  522 +
  523 + // chunk extended timestamp header, 0 or 4 bytes, big-endian
  524 + // 6.1.3. Extended Timestamp
  525 + // This field is transmitted only when the normal time stamp in the
  526 + // chunk message header is set to 0x00ffffff. If normal time stamp is
  527 + // set to any value less than 0x00ffffff, this field MUST NOT be
  528 + // present. This field MUST NOT be present if the timestamp field is not
  529 + // present. Type 3 chunks MUST NOT have this field.
  530 + // adobe changed for Type3 chunk:
  531 + // FMLE always sendout the extended-timestamp,
  532 + // must send the extended-timestamp to FMS,
  533 + // must send the extended-timestamp to flash-player.
  534 + // @see: ngx_rtmp_prepare_message
  535 + // @see: http://blog.csdn.net/win_lin/article/details/13363699
  536 + u_int32_t timestamp = (u_int32_t)msg->header.timestamp;
  537 + if(timestamp >= RTMP_EXTENDED_TIMESTAMP){
  538 + pp = (char*)&timestamp;
  539 + *pheader++ = pp[3];
  540 + *pheader++ = pp[2];
  541 + *pheader++ = pp[1];
  542 + *pheader++ = pp[0];
  543 + }
  544 + }
  545 +
  546 + // sendout header and payload by writev.
  547 + // decrease the sys invoke count to get higher performance.
  548 + int payload_size = msg->size - (p - (char*)msg->payload);
  549 + payload_size = srs_min(payload_size, out_chunk_size);
  550 +
  551 + // always has header
  552 + int header_size = pheader - out_header_cache;
  553 + srs_assert(header_size > 0);
  554 +
  555 + // send by writev
  556 + iovec iov[2];
  557 + iov[0].iov_base = out_header_cache;
  558 + iov[0].iov_len = header_size;
  559 + iov[1].iov_base = p;
  560 + iov[1].iov_len = payload_size;
  561 +
  562 + ssize_t nwrite;
  563 + if ((ret = skt->writev(iov, 2, &nwrite)) != ERROR_SUCCESS) {
  564 + srs_error("send with writev failed. ret=%d", ret);
  565 + return ret;
  566 + }
  567 +
  568 + // consume sendout bytes when not empty packet.
  569 + if (msg->payload && msg->size > 0) {
  570 + p += payload_size;
  571 + }
  572 + } while (p < (char*)msg->payload + msg->size);
  573 +
  574 + if ((ret = __on_send_message(msg, packet)) != ERROR_SUCCESS) {
  575 + srs_error("hook the send message failed. ret=%d", ret);
  576 + return ret;
  577 + }
  578 +
  579 + return ret;
  580 +}
  581 +
  582 +int SrsProtocol::__do_decode_message(SrsMessageHeader& header, SrsStream* stream, SrsPacket** ppacket)
  583 +{
  584 + int ret = ERROR_SUCCESS;
  585 +
  586 + SrsPacket* packet = NULL;
  587 +
  588 + // decode specified packet type
  589 + if (header.is_amf0_command() || header.is_amf3_command() || header.is_amf0_data() || header.is_amf3_data()) {
  590 + srs_verbose("start to decode AMF0/AMF3 command message.");
  591 +
  592 + // skip 1bytes to decode the amf3 command.
  593 + if (header.is_amf3_command() && stream->require(1)) {
  594 + srs_verbose("skip 1bytes to decode AMF3 command");
  595 + stream->skip(1);
  596 + }
  597 +
  598 + // amf0 command message.
  599 + // need to read the command name.
  600 + std::string command;
  601 + if ((ret = srs_amf0_read_string(stream, command)) != ERROR_SUCCESS) {
  602 + srs_error("decode AMF0/AMF3 command name failed. ret=%d", ret);
  603 + return ret;
  604 + }
  605 + srs_verbose("AMF0/AMF3 command message, command_name=%s", command.c_str());
  606 +
  607 + // result/error packet
  608 + if (command == RTMP_AMF0_COMMAND_RESULT || command == RTMP_AMF0_COMMAND_ERROR) {
  609 + double transactionId = 0.0;
  610 + if ((ret = srs_amf0_read_number(stream, transactionId)) != ERROR_SUCCESS) {
  611 + srs_error("decode AMF0/AMF3 transcationId failed. ret=%d", ret);
  612 + return ret;
  613 + }
  614 + srs_verbose("AMF0/AMF3 command id, transcationId=%.2f", transactionId);
  615 +
  616 + // reset stream, for header read completed.
  617 + stream->reset();
  618 + if (header.is_amf3_command()) {
  619 + stream->skip(1);
  620 + }
  621 +
  622 + std::string request_name = get_request_name(transactionId);
  623 + if (request_name.empty()) {
  624 + ret = ERROR_RTMP_NO_REQUEST;
  625 + srs_error("decode AMF0/AMF3 request failed. ret=%d", ret);
  626 + return ret;
  627 + }
  628 + srs_verbose("AMF0/AMF3 request parsed. request_name=%s", request_name.c_str());
  629 +
  630 + if (request_name == RTMP_AMF0_COMMAND_CONNECT) {
  631 + srs_info("decode the AMF0/AMF3 response command(%s message).", request_name.c_str());
  632 + *ppacket = packet = new SrsConnectAppResPacket();
  633 + return packet->decode(stream);
  634 + } else if (request_name == RTMP_AMF0_COMMAND_CREATE_STREAM) {
  635 + srs_info("decode the AMF0/AMF3 response command(%s message).", request_name.c_str());
  636 + *ppacket = packet = new SrsCreateStreamResPacket(0, 0);
  637 + return packet->decode(stream);
  638 + } else if (request_name == RTMP_AMF0_COMMAND_RELEASE_STREAM
  639 + || request_name == RTMP_AMF0_COMMAND_FC_PUBLISH
  640 + || request_name == RTMP_AMF0_COMMAND_UNPUBLISH) {
  641 + srs_info("decode the AMF0/AMF3 response command(%s message).", request_name.c_str());
  642 + *ppacket = packet = new SrsFMLEStartResPacket(0);
  643 + return packet->decode(stream);
  644 + } else {
  645 + ret = ERROR_RTMP_NO_REQUEST;
  646 + srs_error("decode AMF0/AMF3 request failed. "
  647 + "request_name=%s, transactionId=%.2f, ret=%d",
  648 + request_name.c_str(), transactionId, ret);
  649 + return ret;
  650 + }
  651 + }
  652 +
  653 + // reset to zero(amf3 to 1) to restart decode.
  654 + stream->reset();
  655 + if (header.is_amf3_command()) {
  656 + stream->skip(1);
  657 + }
  658 +
  659 + // decode command object.
  660 + if (command == RTMP_AMF0_COMMAND_CONNECT) {
  661 + srs_info("decode the AMF0/AMF3 command(connect vhost/app message).");
  662 + *ppacket = packet = new SrsConnectAppPacket();
  663 + return packet->decode(stream);
  664 + } else if(command == RTMP_AMF0_COMMAND_CREATE_STREAM) {
  665 + srs_info("decode the AMF0/AMF3 command(createStream message).");
  666 + *ppacket = packet = new SrsCreateStreamPacket();
  667 + return packet->decode(stream);
  668 + } else if(command == RTMP_AMF0_COMMAND_PLAY) {
  669 + srs_info("decode the AMF0/AMF3 command(paly message).");
  670 + *ppacket = packet = new SrsPlayPacket();
  671 + return packet->decode(stream);
  672 + } else if(command == RTMP_AMF0_COMMAND_PAUSE) {
  673 + srs_info("decode the AMF0/AMF3 command(pause message).");
  674 + *ppacket = packet = new SrsPausePacket();
  675 + return packet->decode(stream);
  676 + } else if(command == RTMP_AMF0_COMMAND_RELEASE_STREAM) {
  677 + srs_info("decode the AMF0/AMF3 command(FMLE releaseStream message).");
  678 + *ppacket = packet = new SrsFMLEStartPacket();
  679 + return packet->decode(stream);
  680 + } else if(command == RTMP_AMF0_COMMAND_FC_PUBLISH) {
  681 + srs_info("decode the AMF0/AMF3 command(FMLE FCPublish message).");
  682 + *ppacket = packet = new SrsFMLEStartPacket();
  683 + return packet->decode(stream);
  684 + } else if(command == RTMP_AMF0_COMMAND_PUBLISH) {
  685 + srs_info("decode the AMF0/AMF3 command(publish message).");
  686 + *ppacket = packet = new SrsPublishPacket();
  687 + return packet->decode(stream);
  688 + } else if(command == RTMP_AMF0_COMMAND_UNPUBLISH) {
  689 + srs_info("decode the AMF0/AMF3 command(unpublish message).");
  690 + *ppacket = packet = new SrsFMLEStartPacket();
  691 + return packet->decode(stream);
  692 + } else if(command == RTMP_AMF0_DATA_SET_DATAFRAME || command == RTMP_AMF0_DATA_ON_METADATA) {
  693 + srs_info("decode the AMF0/AMF3 data(onMetaData message).");
  694 + *ppacket = packet = new SrsOnMetaDataPacket();
  695 + return packet->decode(stream);
  696 + } else if(command == SRS_BW_CHECK_FINISHED
  697 + || command == SRS_BW_CHECK_PLAYING
  698 + || command == SRS_BW_CHECK_PUBLISHING
  699 + || command == SRS_BW_CHECK_STARTING_PLAY
  700 + || command == SRS_BW_CHECK_STARTING_PUBLISH
  701 + || command == SRS_BW_CHECK_START_PLAY
  702 + || command == SRS_BW_CHECK_START_PUBLISH
  703 + || command == SRS_BW_CHECK_STOPPED_PLAY
  704 + || command == SRS_BW_CHECK_STOP_PLAY
  705 + || command == SRS_BW_CHECK_STOP_PUBLISH
  706 + || command == SRS_BW_CHECK_STOPPED_PUBLISH
  707 + || command == SRS_BW_CHECK_FLASH_FINAL)
  708 + {
  709 + srs_info("decode the AMF0/AMF3 band width check message.");
  710 + *ppacket = packet = new SrsBandwidthPacket();
  711 + return packet->decode(stream);
  712 + } else if (command == RTMP_AMF0_COMMAND_CLOSE_STREAM) {
  713 + srs_info("decode the AMF0/AMF3 closeStream message.");
  714 + *ppacket = packet = new SrsCloseStreamPacket();
  715 + return packet->decode(stream);
  716 + }
  717 +
  718 + // default packet to drop message.
  719 + srs_trace("drop the AMF0/AMF3 command message, command_name=%s", command.c_str());
  720 + *ppacket = packet = new SrsPacket();
  721 + return ret;
  722 + } else if(header.is_user_control_message()) {
  723 + srs_verbose("start to decode user control message.");
  724 + *ppacket = packet = new SrsUserControlPacket();
  725 + return packet->decode(stream);
  726 + } else if(header.is_window_ackledgement_size()) {
  727 + srs_verbose("start to decode set ack window size message.");
  728 + *ppacket = packet = new SrsSetWindowAckSizePacket();
  729 + return packet->decode(stream);
  730 + } else if(header.is_set_chunk_size()) {
  731 + srs_verbose("start to decode set chunk size message.");
  732 + *ppacket = packet = new SrsSetChunkSizePacket();
  733 + return packet->decode(stream);
  734 + } else {
  735 + srs_trace("drop unknown message, type=%d", header.message_type);
  736 + }
  737 +
  738 + return ret;
  739 +}
  740 +
  741 +int SrsProtocol::__send_and_free_message(__SrsMessage* msg)
  742 +{
  743 + srs_assert(msg);
  744 + SrsAutoFree(__SrsMessage, msg, false);
  745 +
  746 + return __do_send_and_free_message(msg, NULL);
  747 +}
  748 +
  749 +int SrsProtocol::__send_and_free_packet(SrsPacket* packet, int stream_id)
  750 +{
  751 + int ret = ERROR_SUCCESS;
  752 +
  753 + srs_assert(packet);
  754 + SrsAutoFree(SrsPacket, packet, false);
  755 +
  756 + int size = 0;
  757 + char* payload = NULL;
  758 + if ((ret = packet->encode(size, payload)) != ERROR_SUCCESS) {
  759 + srs_error("encode RTMP packet to bytes oriented RTMP message failed. ret=%d", ret);
  760 + return ret;
  761 + }
  762 +
  763 + // encode packet to payload and size.
  764 + if (size <= 0 || payload == NULL) {
  765 + srs_warn("packet is empty, ignore empty message.");
  766 + return ret;
  767 + }
  768 +
  769 + // to message
  770 + __SrsMessage* msg = new __SrsMessage();
  771 +
  772 + msg->payload = (int8_t*)payload;
  773 + msg->size = (int32_t)size;
  774 +
  775 + msg->header.payload_length = size;
  776 + msg->header.message_type = packet->get_message_type();
  777 + msg->header.stream_id = stream_id;
  778 + msg->header.perfer_cid = packet->get_perfer_cid();
  779 +
  780 + if ((ret = __do_send_and_free_message(msg, packet)) != ERROR_SUCCESS) {
  781 + return ret;
  782 + }
  783 +
  784 + return ret;
  785 +}
  786 +
  787 +int SrsProtocol::__recv_interlaced_message(__SrsMessage** pmsg)
  788 +{
  789 + int ret = ERROR_SUCCESS;
  790 +
  791 + // chunk stream basic header.
  792 + char fmt = 0;
  793 + int cid = 0;
  794 + int bh_size = 0;
  795 + if ((ret = __read_basic_header(fmt, cid, bh_size)) != ERROR_SUCCESS) {
  796 + if (ret != ERROR_SOCKET_TIMEOUT && !srs_is_client_gracefully_close(ret)) {
  797 + srs_error("read basic header failed. ret=%d", ret);
  798 + }
  799 + return ret;
  800 + }
  801 + srs_verbose("read basic header success. fmt=%d, cid=%d, bh_size=%d", fmt, cid, bh_size);
  802 +
  803 + // once we got the chunk message header,
  804 + // that is there is a real message in cache,
  805 + // increase the timeout to got it.
  806 + // For example, in the play loop, we set timeout to 100ms,
  807 + // when we got a chunk header, we should increase the timeout,
  808 + // or we maybe timeout and disconnect the client.
  809 + int64_t timeout_us = skt->get_recv_timeout();
  810 + if (!skt->is_never_timeout(timeout_us)) {
  811 + int64_t pkt_timeout_us = srs_max(timeout_us, SRS_MIN_RECV_TIMEOUT_US);
  812 + skt->set_recv_timeout(pkt_timeout_us);
  813 + srs_verbose("change recv timeout_us "
  814 + "from %"PRId64" to %"PRId64"", timeout_us, pkt_timeout_us);
  815 + }
  816 +
  817 + // get the cached chunk stream.
  818 + __SrsChunkStream* chunk = NULL;
  819 +
  820 + if (__chunk_streams.find(cid) == __chunk_streams.end()) {
  821 + chunk = __chunk_streams[cid] = new __SrsChunkStream(cid);
  822 + srs_verbose("cache new chunk stream: fmt=%d, cid=%d", fmt, cid);
  823 + } else {
  824 + chunk = __chunk_streams[cid];
  825 + srs_verbose("cached chunk stream: fmt=%d, cid=%d, size=%d, message(type=%d, size=%d, time=%"PRId64", sid=%d)",
  826 + chunk->fmt, chunk->cid, (chunk->msg? chunk->msg->size : 0), chunk->header.message_type, chunk->header.payload_length,
  827 + chunk->header.timestamp, chunk->header.stream_id);
  828 + }
  829 +
  830 + // chunk stream message header
  831 + int mh_size = 0;
  832 + if ((ret = __read_message_header(chunk, fmt, bh_size, mh_size)) != ERROR_SUCCESS) {
  833 + if (ret != ERROR_SOCKET_TIMEOUT && !srs_is_client_gracefully_close(ret)) {
  834 + srs_error("read message header failed. ret=%d", ret);
  835 + }
  836 + return ret;
  837 + }
  838 + srs_verbose("read message header success. "
  839 + "fmt=%d, mh_size=%d, ext_time=%d, size=%d, message(type=%d, size=%d, time=%"PRId64", sid=%d)",
  840 + fmt, mh_size, chunk->extended_timestamp, (chunk->msg? chunk->msg->size : 0), chunk->header.message_type,
  841 + chunk->header.payload_length, chunk->header.timestamp, chunk->header.stream_id);
  842 +
  843 + // read msg payload from chunk stream.
  844 + __SrsMessage* msg = NULL;
  845 + int payload_size = 0;
  846 + if ((ret = __read_message_payload(chunk, bh_size, mh_size, payload_size, &msg)) != ERROR_SUCCESS) {
  847 + if (ret != ERROR_SOCKET_TIMEOUT && !srs_is_client_gracefully_close(ret)) {
  848 + srs_error("read message payload failed. ret=%d", ret);
  849 + }
  850 + return ret;
  851 + }
  852 +
  853 + // reset the recv timeout
  854 + if (!skt->is_never_timeout(timeout_us)) {
  855 + skt->set_recv_timeout(timeout_us);
  856 + srs_verbose("reset recv timeout_us to %"PRId64"", timeout_us);
  857 + }
  858 +
  859 + // not got an entire RTMP message, try next chunk.
  860 + if (!msg) {
  861 + srs_verbose("get partial message success. chunk_payload_size=%d, size=%d, message(type=%d, size=%d, time=%"PRId64", sid=%d)",
  862 + payload_size, (msg? msg->size : (chunk->msg? chunk->msg->size : 0)), chunk->header.message_type, chunk->header.payload_length,
  863 + chunk->header.timestamp, chunk->header.stream_id);
  864 + return ret;
  865 + }
  866 +
  867 + *pmsg = msg;
  868 + srs_info("get entire message success. chunk_payload_size=%d, size=%d, message(type=%d, size=%d, time=%"PRId64", sid=%d)",
  869 + payload_size, (msg? msg->size : (chunk->msg? chunk->msg->size : 0)), chunk->header.message_type, chunk->header.payload_length,
  870 + chunk->header.timestamp, chunk->header.stream_id);
  871 +
  872 + return ret;
  873 +}
  874 +
  875 +int SrsProtocol::__read_basic_header(char& fmt, int& cid, int& bh_size)
  876 +{
  877 + int ret = ERROR_SUCCESS;
  878 +
  879 + int required_size = 1;
  880 + if ((ret = buffer->ensure_buffer_bytes(skt, required_size)) != ERROR_SUCCESS) {
  881 + if (ret != ERROR_SOCKET_TIMEOUT && !srs_is_client_gracefully_close(ret)) {
  882 + srs_error("read 1bytes basic header failed. required_size=%d, ret=%d", required_size, ret);
  883 + }
  884 + return ret;
  885 + }
  886 +
  887 + char* p = buffer->bytes();
  888 +
  889 + fmt = (*p >> 6) & 0x03;
  890 + cid = *p & 0x3f;
  891 + bh_size = 1;
  892 +
  893 + if (cid > 1) {
  894 + srs_verbose("%dbytes basic header parsed. fmt=%d, cid=%d", bh_size, fmt, cid);
  895 + return ret;
  896 + }
  897 +
  898 + if (cid == 0) {
  899 + required_size = 2;
  900 + if ((ret = buffer->ensure_buffer_bytes(skt, required_size)) != ERROR_SUCCESS) {
  901 + if (ret != ERROR_SOCKET_TIMEOUT && !srs_is_client_gracefully_close(ret)) {
  902 + srs_error("read 2bytes basic header failed. required_size=%d, ret=%d", required_size, ret);
  903 + }
  904 + return ret;
  905 + }
  906 +
  907 + cid = 64;
  908 + cid += *(++p);
  909 + bh_size = 2;
  910 + srs_verbose("%dbytes basic header parsed. fmt=%d, cid=%d", bh_size, fmt, cid);
  911 + } else if (cid == 1) {
  912 + required_size = 3;
  913 + if ((ret = buffer->ensure_buffer_bytes(skt, 3)) != ERROR_SUCCESS) {
  914 + if (ret != ERROR_SOCKET_TIMEOUT && !srs_is_client_gracefully_close(ret)) {
  915 + srs_error("read 3bytes basic header failed. required_size=%d, ret=%d", required_size, ret);
  916 + }
  917 + return ret;
  918 + }
  919 +
  920 + cid = 64;
  921 + cid += *(++p);
  922 + cid += *(++p) * 256;
  923 + bh_size = 3;
  924 + srs_verbose("%dbytes basic header parsed. fmt=%d, cid=%d", bh_size, fmt, cid);
  925 + } else {
  926 + srs_error("invalid path, impossible basic header.");
  927 + srs_assert(false);
  928 + }
  929 +
  930 + return ret;
  931 +}
  932 +
  933 +int SrsProtocol::__read_message_header(__SrsChunkStream* chunk, char fmt, int bh_size, int& mh_size)
  934 +{
  935 + int ret = ERROR_SUCCESS;
  936 +
  937 + /**
  938 + * we should not assert anything about fmt, for the first packet.
  939 + * (when first packet, the chunk->msg is NULL).
  940 + * the fmt maybe 0/1/2/3, the FMLE will send a 0xC4 for some audio packet.
  941 + * the previous packet is:
  942 + * 04 // fmt=0, cid=4
  943 + * 00 00 1a // timestamp=26
  944 + * 00 00 9d // payload_length=157
  945 + * 08 // message_type=8(audio)
  946 + * 01 00 00 00 // stream_id=1
  947 + * the current packet maybe:
  948 + * c4 // fmt=3, cid=4
  949 + * it's ok, for the packet is audio, and timestamp delta is 26.
  950 + * the current packet must be parsed as:
  951 + * fmt=0, cid=4
  952 + * timestamp=26+26=52
  953 + * payload_length=157
  954 + * message_type=8(audio)
  955 + * stream_id=1
  956 + * so we must update the timestamp even fmt=3 for first packet.
  957 + */
  958 + // fresh packet used to update the timestamp even fmt=3 for first packet.
  959 + bool is_fresh_packet = !chunk->msg;
  960 +
  961 + // but, we can ensure that when a chunk stream is fresh,
  962 + // the fmt must be 0, a new stream.
  963 + if (chunk->msg_count == 0 && fmt != RTMP_FMT_TYPE0) {
  964 + ret = ERROR_RTMP_CHUNK_START;
  965 + srs_error("chunk stream is fresh, "
  966 + "fmt must be %d, actual is %d. ret=%d", RTMP_FMT_TYPE0, fmt, ret);
  967 + return ret;
  968 + }
  969 +
  970 + // when exists cache msg, means got an partial message,
  971 + // the fmt must not be type0 which means new message.
  972 + if (chunk->msg && fmt == RTMP_FMT_TYPE0) {
  973 + ret = ERROR_RTMP_CHUNK_START;
  974 + srs_error("chunk stream exists, "
  975 + "fmt must not be %d, actual is %d. ret=%d", RTMP_FMT_TYPE0, fmt, ret);
  976 + return ret;
  977 + }
  978 +
  979 + // create msg when new chunk stream start
  980 + if (!chunk->msg) {
  981 + chunk->msg = new __SrsMessage();
  982 + chunk->msg->header.perfer_cid = chunk->cid;
  983 + srs_verbose("create message for new chunk, fmt=%d, cid=%d", fmt, chunk->cid);
  984 + }
  985 +
  986 + // read message header from socket to buffer.
  987 + static char mh_sizes[] = {11, 7, 3, 0};
  988 + mh_size = mh_sizes[(int)fmt];
  989 + srs_verbose("calc chunk message header size. fmt=%d, mh_size=%d", fmt, mh_size);
  990 +
  991 + int required_size = bh_size + mh_size;
  992 + if ((ret = buffer->ensure_buffer_bytes(skt, required_size)) != ERROR_SUCCESS) {
  993 + if (ret != ERROR_SOCKET_TIMEOUT && !srs_is_client_gracefully_close(ret)) {
  994 + srs_error("read %dbytes message header failed. required_size=%d, ret=%d", mh_size, required_size, ret);
  995 + }
  996 + return ret;
  997 + }
  998 + char* p = buffer->bytes() + bh_size;
  999 +
  1000 + // parse the message header.
  1001 + // see also: ngx_rtmp_recv
  1002 + if (fmt <= RTMP_FMT_TYPE2) {
  1003 + char* pp = (char*)&chunk->header.timestamp_delta;
  1004 + pp[2] = *p++;
  1005 + pp[1] = *p++;
  1006 + pp[0] = *p++;
  1007 + pp[3] = 0;
  1008 +
  1009 + // fmt: 0
  1010 + // timestamp: 3 bytes
  1011 + // If the timestamp is greater than or equal to 16777215
  1012 + // (hexadecimal 0x00ffffff), this value MUST be 16777215, and the
  1013 + // ‘extended timestamp header’ MUST be present. Otherwise, this value
  1014 + // SHOULD be the entire timestamp.
  1015 + //
  1016 + // fmt: 1 or 2
  1017 + // timestamp delta: 3 bytes
  1018 + // If the delta is greater than or equal to 16777215 (hexadecimal
  1019 + // 0x00ffffff), this value MUST be 16777215, and the ‘extended
  1020 + // timestamp header’ MUST be present. Otherwise, this value SHOULD be
  1021 + // the entire delta.
  1022 + chunk->extended_timestamp = (chunk->header.timestamp_delta >= RTMP_EXTENDED_TIMESTAMP);
  1023 + if (chunk->extended_timestamp) {
  1024 + // Extended timestamp: 0 or 4 bytes
  1025 + // This field MUST be sent when the normal timsestamp is set to
  1026 + // 0xffffff, it MUST NOT be sent if the normal timestamp is set to
  1027 + // anything else. So for values less than 0xffffff the normal
  1028 + // timestamp field SHOULD be used in which case the extended timestamp
  1029 + // MUST NOT be present. For values greater than or equal to 0xffffff
  1030 + // the normal timestamp field MUST NOT be used and MUST be set to
  1031 + // 0xffffff and the extended timestamp MUST be sent.
  1032 + //
  1033 + // if extended timestamp, the timestamp must >= RTMP_EXTENDED_TIMESTAMP
  1034 + // we set the timestamp to RTMP_EXTENDED_TIMESTAMP to identify we
  1035 + // got an extended timestamp.
  1036 + chunk->header.timestamp = RTMP_EXTENDED_TIMESTAMP;
  1037 + } else {
  1038 + if (fmt == RTMP_FMT_TYPE0) {
  1039 + // 6.1.2.1. Type 0
  1040 + // For a type-0 chunk, the absolute timestamp of the message is sent
  1041 + // here.
  1042 + chunk->header.timestamp = chunk->header.timestamp_delta;
  1043 + } else {
  1044 + // 6.1.2.2. Type 1
  1045 + // 6.1.2.3. Type 2
  1046 + // For a type-1 or type-2 chunk, the difference between the previous
  1047 + // chunk's timestamp and the current chunk's timestamp is sent here.
  1048 + chunk->header.timestamp += chunk->header.timestamp_delta;
  1049 + }
  1050 + }
  1051 +
  1052 + if (fmt <= RTMP_FMT_TYPE1) {
  1053 + pp = (char*)&chunk->header.payload_length;
  1054 + pp[2] = *p++;
  1055 + pp[1] = *p++;
  1056 + pp[0] = *p++;
  1057 + pp[3] = 0;
  1058 +
  1059 + // if msg exists in cache, the size must not changed.
  1060 + if (chunk->msg->size > 0 && chunk->msg->size != chunk->header.payload_length) {
  1061 + ret = ERROR_RTMP_PACKET_SIZE;
  1062 + srs_error("msg exists in chunk cache, "
  1063 + "size=%d cannot change to %d, ret=%d",
  1064 + chunk->msg->size, chunk->header.payload_length, ret);
  1065 + return ret;
  1066 + }
  1067 +
  1068 + chunk->header.message_type = *p++;
  1069 +
  1070 + if (fmt == RTMP_FMT_TYPE0) {
  1071 + pp = (char*)&chunk->header.stream_id;
  1072 + pp[0] = *p++;
  1073 + pp[1] = *p++;
  1074 + pp[2] = *p++;
  1075 + pp[3] = *p++;
  1076 + srs_verbose("header read completed. fmt=%d, mh_size=%d, ext_time=%d, time=%"PRId64", payload=%d, type=%d, sid=%d",
  1077 + fmt, mh_size, chunk->extended_timestamp, chunk->header.timestamp, chunk->header.payload_length,
  1078 + chunk->header.message_type, chunk->header.stream_id);
  1079 + } else {
  1080 + srs_verbose("header read completed. fmt=%d, mh_size=%d, ext_time=%d, time=%"PRId64", payload=%d, type=%d",
  1081 + fmt, mh_size, chunk->extended_timestamp, chunk->header.timestamp, chunk->header.payload_length,
  1082 + chunk->header.message_type);
  1083 + }
  1084 + } else {
  1085 + srs_verbose("header read completed. fmt=%d, mh_size=%d, ext_time=%d, time=%"PRId64"",
  1086 + fmt, mh_size, chunk->extended_timestamp, chunk->header.timestamp);
  1087 + }
  1088 + } else {
  1089 + // update the timestamp even fmt=3 for first stream
  1090 + if (is_fresh_packet && !chunk->extended_timestamp) {
  1091 + chunk->header.timestamp += chunk->header.timestamp_delta;
  1092 + }
  1093 + srs_verbose("header read completed. fmt=%d, size=%d, ext_time=%d",
  1094 + fmt, mh_size, chunk->extended_timestamp);
  1095 + }
  1096 +
  1097 + if (chunk->extended_timestamp) {
  1098 + mh_size += 4;
  1099 + required_size = bh_size + mh_size;
  1100 + srs_verbose("read header ext time. fmt=%d, ext_time=%d, mh_size=%d", fmt, chunk->extended_timestamp, mh_size);
  1101 + if ((ret = buffer->ensure_buffer_bytes(skt, required_size)) != ERROR_SUCCESS) {
  1102 + if (ret != ERROR_SOCKET_TIMEOUT && !srs_is_client_gracefully_close(ret)) {
  1103 + srs_error("read %dbytes message header failed. required_size=%d, ret=%d", mh_size, required_size, ret);
  1104 + }
  1105 + return ret;
  1106 + }
  1107 +
  1108 + u_int32_t timestamp = 0x00;
  1109 + char* pp = (char*)&timestamp;
  1110 + pp[3] = *p++;
  1111 + pp[2] = *p++;
  1112 + pp[1] = *p++;
  1113 + pp[0] = *p++;
  1114 +
  1115 + // ffmpeg/librtmp may donot send this filed, need to detect the value.
  1116 + // @see also: http://blog.csdn.net/win_lin/article/details/13363699
  1117 + // compare to the chunk timestamp, which is set by chunk message header
  1118 + // type 0,1 or 2.
  1119 + u_int32_t chunk_timestamp = chunk->header.timestamp;
  1120 + if (chunk_timestamp > RTMP_EXTENDED_TIMESTAMP && chunk_timestamp != timestamp) {
  1121 + mh_size -= 4;
  1122 + srs_verbose("ignore the 4bytes extended timestamp. mh_size=%d", mh_size);
  1123 + } else {
  1124 + chunk->header.timestamp = timestamp;
  1125 + }
  1126 + srs_verbose("header read ext_time completed. time=%"PRId64"", chunk->header.timestamp);
  1127 + }
  1128 +
  1129 + // the extended-timestamp must be unsigned-int,
  1130 + // 24bits timestamp: 0xffffff = 16777215ms = 16777.215s = 4.66h
  1131 + // 32bits timestamp: 0xffffffff = 4294967295ms = 4294967.295s = 1193.046h = 49.71d
  1132 + // because the rtmp protocol says the 32bits timestamp is about "50 days":
  1133 + // 3. Byte Order, Alignment, and Time Format
  1134 + // Because timestamps are generally only 32 bits long, they will roll
  1135 + // over after fewer than 50 days.
  1136 + //
  1137 + // but, its sample says the timestamp is 31bits:
  1138 + // An application could assume, for example, that all
  1139 + // adjacent timestamps are within 2^31 milliseconds of each other, so
  1140 + // 10000 comes after 4000000000, while 3000000000 comes before
  1141 + // 4000000000.
  1142 + // and flv specification says timestamp is 31bits:
  1143 + // Extension of the Timestamp field to form a SI32 value. This
  1144 + // field represents the upper 8 bits, while the previous
  1145 + // Timestamp field represents the lower 24 bits of the time in
  1146 + // milliseconds.
  1147 + // in a word, 31bits timestamp is ok.
  1148 + // convert extended timestamp to 31bits.
  1149 + chunk->header.timestamp &= 0x7fffffff;
308 1150
309 - for (it = chunk_streams.begin(); it != chunk_streams.end(); ++it) {  
310 - SrsChunkStream* stream = it->second;  
311 - srs_freep(stream); 1151 + // valid message
  1152 + if (chunk->header.payload_length < 0) {
  1153 + ret = ERROR_RTMP_MSG_INVLIAD_SIZE;
  1154 + srs_error("RTMP message size must not be negative. size=%d, ret=%d",
  1155 + chunk->header.payload_length, ret);
  1156 + return ret;
  1157 + }
  1158 +
  1159 + // copy header to msg
  1160 + chunk->msg->header = chunk->header;
  1161 +
  1162 + // increase the msg count, the chunk stream can accept fmt=1/2/3 message now.
  1163 + chunk->msg_count++;
  1164 +
  1165 + return ret;
  1166 +}
  1167 +
  1168 +int SrsProtocol::__read_message_payload(__SrsChunkStream* chunk, int bh_size, int mh_size, int& payload_size, __SrsMessage** pmsg)
  1169 +{
  1170 + int ret = ERROR_SUCCESS;
  1171 +
  1172 + // empty message
  1173 + if (chunk->header.payload_length <= 0) {
  1174 + // need erase the header in buffer.
  1175 + buffer->erase(bh_size + mh_size);
  1176 +
  1177 + srs_trace("get an empty RTMP "
  1178 + "message(type=%d, size=%d, time=%"PRId64", sid=%d)", chunk->header.message_type,
  1179 + chunk->header.payload_length, chunk->header.timestamp, chunk->header.stream_id);
  1180 +
  1181 + *pmsg = chunk->msg;
  1182 + chunk->msg = NULL;
  1183 +
  1184 + return ret;
  1185 + }
  1186 + srs_assert(chunk->header.payload_length > 0);
  1187 +
  1188 + // the chunk payload size.
  1189 + payload_size = chunk->header.payload_length - chunk->msg->size;
  1190 + payload_size = srs_min(payload_size, in_chunk_size);
  1191 + srs_verbose("chunk payload size is %d, message_size=%d, received_size=%d, in_chunk_size=%d",
  1192 + payload_size, chunk->header.payload_length, chunk->msg->size, in_chunk_size);
  1193 +
  1194 + // create msg payload if not initialized
  1195 + if (!chunk->msg->payload) {
  1196 + chunk->msg->payload = new int8_t[chunk->header.payload_length];
  1197 + memset(chunk->msg->payload, 0, chunk->header.payload_length);
  1198 + srs_verbose("create empty payload for RTMP message. size=%d", chunk->header.payload_length);
  1199 + }
  1200 +
  1201 + // read payload to buffer
  1202 + int required_size = bh_size + mh_size + payload_size;
  1203 + if ((ret = buffer->ensure_buffer_bytes(skt, required_size)) != ERROR_SUCCESS) {
  1204 + if (ret != ERROR_SOCKET_TIMEOUT && !srs_is_client_gracefully_close(ret)) {
  1205 + srs_error("read payload failed. required_size=%d, ret=%d", required_size, ret);
  1206 + }
  1207 + return ret;
  1208 + }
  1209 + memcpy(chunk->msg->payload + chunk->msg->size, buffer->bytes() + bh_size + mh_size, payload_size);
  1210 + buffer->erase(bh_size + mh_size + payload_size);
  1211 + chunk->msg->size += payload_size;
  1212 +
  1213 + srs_verbose("chunk payload read completed. bh_size=%d, mh_size=%d, payload_size=%d", bh_size, mh_size, payload_size);
  1214 +
  1215 + // got entire RTMP message?
  1216 + if (chunk->header.payload_length == chunk->msg->size) {
  1217 + *pmsg = chunk->msg;
  1218 + chunk->msg = NULL;
  1219 + srs_verbose("get entire RTMP message(type=%d, size=%d, time=%"PRId64", sid=%d)",
  1220 + chunk->header.message_type, chunk->header.payload_length,
  1221 + chunk->header.timestamp, chunk->header.stream_id);
  1222 + return ret;
312 } 1223 }
313 -  
314 - chunk_streams.clear();  
315 1224
316 - srs_freep(buffer); 1225 + srs_verbose("get partial RTMP message(type=%d, size=%d, time=%"PRId64", sid=%d), partial size=%d",
  1226 + chunk->header.message_type, chunk->header.payload_length,
  1227 + chunk->header.timestamp, chunk->header.stream_id,
  1228 + chunk->msg->size);
  1229 +
  1230 + return ret;
317 } 1231 }
318 1232
319 -string SrsProtocol::get_request_name(double transcationId) 1233 +int SrsProtocol::__on_recv_message(__SrsMessage* msg)
320 { 1234 {
321 - if (requests.find(transcationId) == requests.end()) {  
322 - return ""; 1235 + int ret = ERROR_SUCCESS;
  1236 +
  1237 + srs_assert(msg != NULL);
  1238 +
  1239 + // acknowledgement
  1240 + if (in_ack_size.ack_window_size > 0
  1241 + && skt->get_recv_bytes() - in_ack_size.acked_size > in_ack_size.ack_window_size
  1242 + ) {
  1243 + if ((ret = response_acknowledgement_message()) != ERROR_SUCCESS) {
  1244 + return ret;
  1245 + }
323 } 1246 }
324 1247
325 - return requests[transcationId];  
326 -}  
327 -  
328 -void SrsProtocol::set_recv_timeout(int64_t timeout_us)  
329 -{  
330 - return skt->set_recv_timeout(timeout_us);  
331 -}  
332 -  
333 -int64_t SrsProtocol::get_recv_timeout()  
334 -{  
335 - return skt->get_recv_timeout();  
336 -}  
337 -  
338 -void SrsProtocol::set_send_timeout(int64_t timeout_us)  
339 -{  
340 - return skt->set_send_timeout(timeout_us);  
341 -}  
342 -  
343 -int64_t SrsProtocol::get_send_timeout()  
344 -{  
345 - return skt->get_send_timeout();  
346 -}  
347 -  
348 -int64_t SrsProtocol::get_recv_bytes()  
349 -{  
350 - return skt->get_recv_bytes();  
351 -}  
352 -  
353 -int64_t SrsProtocol::get_send_bytes()  
354 -{  
355 - return skt->get_send_bytes();  
356 -}  
357 -  
358 -int SrsProtocol::get_recv_kbps()  
359 -{  
360 - return skt->get_recv_kbps(); 1248 + SrsPacket* packet = NULL;
  1249 + switch (msg->header.message_type) {
  1250 + case RTMP_MSG_SetChunkSize:
  1251 + case RTMP_MSG_UserControlMessage:
  1252 + case RTMP_MSG_WindowAcknowledgementSize:
  1253 + if ((ret = __decode_message(msg, &packet)) != ERROR_SUCCESS) {
  1254 + srs_error("decode packet from message payload failed. ret=%d", ret);
  1255 + return ret;
  1256 + }
  1257 + srs_verbose("decode packet from message payload success.");
  1258 + break;
  1259 + default:
  1260 + return ret;
  1261 + }
  1262 +
  1263 + srs_assert(packet);
  1264 +
  1265 + // always free the packet.
  1266 + SrsAutoFree(SrsPacket, packet, false);
  1267 +
  1268 + switch (msg->header.message_type) {
  1269 + case RTMP_MSG_WindowAcknowledgementSize: {
  1270 + SrsSetWindowAckSizePacket* pkt = dynamic_cast<SrsSetWindowAckSizePacket*>(packet);
  1271 + srs_assert(pkt != NULL);
  1272 +
  1273 + if (pkt->ackowledgement_window_size > 0) {
  1274 + in_ack_size.ack_window_size = pkt->ackowledgement_window_size;
  1275 + srs_trace("set ack window size to %d", pkt->ackowledgement_window_size);
  1276 + } else {
  1277 + srs_warn("ignored. set ack window size is %d", pkt->ackowledgement_window_size);
  1278 + }
  1279 + break;
  1280 + }
  1281 + case RTMP_MSG_SetChunkSize: {
  1282 + SrsSetChunkSizePacket* pkt = dynamic_cast<SrsSetChunkSizePacket*>(packet);
  1283 + srs_assert(pkt != NULL);
  1284 +
  1285 + in_chunk_size = pkt->chunk_size;
  1286 +
  1287 + srs_trace("set input chunk size to %d", pkt->chunk_size);
  1288 + break;
  1289 + }
  1290 + case RTMP_MSG_UserControlMessage: {
  1291 + SrsUserControlPacket* pkt = dynamic_cast<SrsUserControlPacket*>(packet);
  1292 + srs_assert(pkt != NULL);
  1293 +
  1294 + if (pkt->event_type == SrcPCUCSetBufferLength) {
  1295 + srs_trace("ignored. set buffer length to %d", pkt->extra_data);
  1296 + }
  1297 + if (pkt->event_type == SrcPCUCPingRequest) {
  1298 + if ((ret = response_ping_message(pkt->event_data)) != ERROR_SUCCESS) {
  1299 + return ret;
  1300 + }
  1301 + }
  1302 + break;
  1303 + }
  1304 + }
  1305 +
  1306 + return ret;
361 } 1307 }
362 1308
363 -int SrsProtocol::get_send_kbps() 1309 +int SrsProtocol::__on_send_message(__SrsMessage* msg, SrsPacket* packet)
364 { 1310 {
365 - return skt->get_send_kbps(); 1311 + int ret = ERROR_SUCCESS;
  1312 +
  1313 + // ignore raw bytes oriented RTMP message.
  1314 + if (!packet) {
  1315 + return ret;
  1316 + }
  1317 +
  1318 + switch (msg->header.message_type) {
  1319 + case RTMP_MSG_SetChunkSize: {
  1320 + SrsSetChunkSizePacket* pkt = dynamic_cast<SrsSetChunkSizePacket*>(packet);
  1321 + srs_assert(pkt != NULL);
  1322 +
  1323 + out_chunk_size = pkt->chunk_size;
  1324 +
  1325 + srs_trace("set output chunk size to %d", pkt->chunk_size);
  1326 + break;
  1327 + }
  1328 + case RTMP_MSG_AMF0CommandMessage:
  1329 + case RTMP_MSG_AMF3CommandMessage: {
  1330 + if (true) {
  1331 + SrsConnectAppPacket* pkt = dynamic_cast<SrsConnectAppPacket*>(packet);
  1332 + if (pkt) {
  1333 + requests[pkt->transaction_id] = pkt->command_name;
  1334 + break;
  1335 + }
  1336 + }
  1337 + if (true) {
  1338 + SrsCreateStreamPacket* pkt = dynamic_cast<SrsCreateStreamPacket*>(packet);
  1339 + if (pkt) {
  1340 + requests[pkt->transaction_id] = pkt->command_name;
  1341 + break;
  1342 + }
  1343 + }
  1344 + if (true) {
  1345 + SrsFMLEStartPacket* pkt = dynamic_cast<SrsFMLEStartPacket*>(packet);
  1346 + if (pkt) {
  1347 + requests[pkt->transaction_id] = pkt->command_name;
  1348 + break;
  1349 + }
  1350 + }
  1351 + break;
  1352 + }
  1353 + }
  1354 +
  1355 + return ret;
366 } 1356 }
367 1357
368 int SrsProtocol::recv_message(SrsCommonMessage** pmsg) 1358 int SrsProtocol::recv_message(SrsCommonMessage** pmsg)
@@ -1161,6 +2151,7 @@ SrsMessageHeader::SrsMessageHeader() @@ -1161,6 +2151,7 @@ SrsMessageHeader::SrsMessageHeader()
1161 stream_id = 0; 2151 stream_id = 0;
1162 2152
1163 timestamp = 0; 2153 timestamp = 0;
  2154 + perfer_cid = RTMP_CID_ProtocolControl;
1164 } 2155 }
1165 2156
1166 SrsMessageHeader::~SrsMessageHeader() 2157 SrsMessageHeader::~SrsMessageHeader()
@@ -1258,6 +2249,122 @@ SrsChunkStream::~SrsChunkStream() @@ -1258,6 +2249,122 @@ SrsChunkStream::~SrsChunkStream()
1258 srs_freep(msg); 2249 srs_freep(msg);
1259 } 2250 }
1260 2251
  2252 +__SrsChunkStream::__SrsChunkStream(int _cid)
  2253 +{
  2254 + fmt = 0;
  2255 + cid = _cid;
  2256 + extended_timestamp = false;
  2257 + msg = NULL;
  2258 + msg_count = 0;
  2259 +}
  2260 +
  2261 +__SrsChunkStream::~__SrsChunkStream()
  2262 +{
  2263 + srs_freep(msg);
  2264 +}
  2265 +
  2266 +__SrsMessage::__SrsMessage()
  2267 +{
  2268 + payload = NULL;
  2269 + size = 0;
  2270 +}
  2271 +
  2272 +__SrsMessage::~__SrsMessage()
  2273 +{
  2274 +}
  2275 +
  2276 +__SrsSharedPtrMessage::__SrsSharedPtr::__SrsSharedPtr()
  2277 +{
  2278 + payload = NULL;
  2279 + size = 0;
  2280 + shared_count = 0;
  2281 +}
  2282 +
  2283 +__SrsSharedPtrMessage::__SrsSharedPtr::~__SrsSharedPtr()
  2284 +{
  2285 + srs_freepa(payload);
  2286 +}
  2287 +
  2288 +__SrsSharedPtrMessage::__SrsSharedPtrMessage()
  2289 +{
  2290 + ptr = NULL;
  2291 +}
  2292 +
  2293 +__SrsSharedPtrMessage::~__SrsSharedPtrMessage()
  2294 +{
  2295 + if (ptr) {
  2296 + if (ptr->shared_count == 0) {
  2297 + srs_freep(ptr);
  2298 + } else {
  2299 + ptr->shared_count--;
  2300 + }
  2301 + }
  2302 +}
  2303 +
  2304 +int __SrsSharedPtrMessage::initialize(__SrsMessage* source)
  2305 +{
  2306 + int ret = ERROR_SUCCESS;
  2307 +
  2308 + if ((ret = initialize(&source->header, (char*)source->payload, source->size)) != ERROR_SUCCESS) {
  2309 + return ret;
  2310 + }
  2311 +
  2312 + // detach the payload from source
  2313 + source->payload = NULL;
  2314 + source->size = 0;
  2315 +
  2316 + return ret;
  2317 +}
  2318 +
  2319 +int __SrsSharedPtrMessage::initialize(SrsMessageHeader* source, char* payload, int size)
  2320 +{
  2321 + int ret = ERROR_SUCCESS;
  2322 +
  2323 + srs_assert(source != NULL);
  2324 + if (ptr) {
  2325 + ret = ERROR_SYSTEM_ASSERT_FAILED;
  2326 + srs_error("should not set the payload twice. ret=%d", ret);
  2327 + srs_assert(false);
  2328 +
  2329 + return ret;
  2330 + }
  2331 +
  2332 + header = *source;
  2333 + header.payload_length = size;
  2334 +
  2335 + ptr = new __SrsSharedPtr();
  2336 +
  2337 + // direct attach the data of common message.
  2338 + ptr->payload = payload;
  2339 + ptr->size = size;
  2340 +
  2341 + __SrsMessage::payload = (int8_t*)ptr->payload;
  2342 + __SrsMessage::size = ptr->size;
  2343 +
  2344 + return ret;
  2345 +}
  2346 +
  2347 +__SrsSharedPtrMessage* __SrsSharedPtrMessage::copy()
  2348 +{
  2349 + if (!ptr) {
  2350 + srs_error("invoke initialize to initialize the ptr.");
  2351 + srs_assert(false);
  2352 + return NULL;
  2353 + }
  2354 +
  2355 + __SrsSharedPtrMessage* copy = new __SrsSharedPtrMessage();
  2356 +
  2357 + copy->header = header;
  2358 +
  2359 + copy->ptr = ptr;
  2360 + ptr->shared_count++;
  2361 +
  2362 + copy->payload = (int8_t*)ptr->payload;
  2363 + copy->size = ptr->size;
  2364 +
  2365 + return copy;
  2366 +}
  2367 +
1261 ISrsMessage::ISrsMessage() 2368 ISrsMessage::ISrsMessage()
1262 { 2369 {
1263 payload = NULL; 2370 payload = NULL;
@@ -45,6 +45,9 @@ class SrsChunkStream; @@ -45,6 +45,9 @@ class SrsChunkStream;
45 class SrsAmf0Object; 45 class SrsAmf0Object;
46 class SrsAmf0Any; 46 class SrsAmf0Any;
47 class ISrsMessage; 47 class ISrsMessage;
  48 +class SrsMessageHeader;
  49 +class __SrsMessage;
  50 +class __SrsChunkStream;
48 51
49 // the following is the timeout for rtmp protocol, 52 // the following is the timeout for rtmp protocol,
50 // to avoid death connection. 53 // to avoid death connection.
@@ -110,6 +113,9 @@ private: @@ -110,6 +113,9 @@ private:
110 // peer in 113 // peer in
111 private: 114 private:
112 std::map<int, SrsChunkStream*> chunk_streams; 115 std::map<int, SrsChunkStream*> chunk_streams;
  116 + // TODO: FIXME: rename to chunk_streams
  117 + std::map<int, __SrsChunkStream*> __chunk_streams;
  118 + SrsStream* decode_stream;
113 SrsBuffer* buffer; 119 SrsBuffer* buffer;
114 int32_t in_chunk_size; 120 int32_t in_chunk_size;
115 AckWindowSize in_ack_size; 121 AckWindowSize in_ack_size;
@@ -125,6 +131,7 @@ public: @@ -125,6 +131,7 @@ public:
125 SrsProtocol(ISrsProtocolReaderWriter* io); 131 SrsProtocol(ISrsProtocolReaderWriter* io);
126 virtual ~SrsProtocol(); 132 virtual ~SrsProtocol();
127 public: 133 public:
  134 + // TODO: FIXME: to private.
128 std::string get_request_name(double transcationId); 135 std::string get_request_name(double transcationId);
129 /** 136 /**
130 * set the timeout in us. 137 * set the timeout in us.
@@ -138,6 +145,82 @@ public: @@ -138,6 +145,82 @@ public:
138 virtual int64_t get_send_bytes(); 145 virtual int64_t get_send_bytes();
139 virtual int get_recv_kbps(); 146 virtual int get_recv_kbps();
140 virtual int get_send_kbps(); 147 virtual int get_send_kbps();
  148 +public:
  149 + /**
  150 + * recv a RTMP message, which is bytes oriented.
  151 + * user can use decode_message to get the decoded RTMP packet.
  152 + * @param pmsg, set the received message,
  153 + * always NULL if error,
  154 + * NULL for unknown packet but return success.
  155 + * never NULL if decode success.
  156 + */
  157 + virtual int __recv_message(__SrsMessage** pmsg);
  158 + /**
  159 + * decode bytes oriented RTMP message to RTMP packet,
  160 + * @param ppacket, output decoded packet,
  161 + * always NULL if error, never NULL if success.
  162 + * @return error when unknown packet, error when decode failed.
  163 + */
  164 + virtual int __decode_message(__SrsMessage* msg, SrsPacket** ppacket);
  165 + /**
  166 + * send the RTMP message and always free it.
  167 + * user must never free or use the msg after this method,
  168 + * for it will always free the msg.
  169 + * @param msg, the msg to send out, never be NULL.
  170 + */
  171 + virtual int __send_and_free_message(__SrsMessage* msg);
  172 + /**
  173 + * send the RTMP packet and always free it.
  174 + * user must never free or use the packet after this method,
  175 + * for it will always free the packet.
  176 + * @param packet, the packet to send out, never be NULL.
  177 + * @param stream_id, the stream id of packet to send over, 0 for control message.
  178 + */
  179 + virtual int __send_and_free_packet(SrsPacket* packet, int stream_id);
  180 +private:
  181 + /**
  182 + * imp for __send_and_free_message
  183 + * @param packet the packet of message, NULL for raw message.
  184 + */
  185 + virtual int __do_send_and_free_message(__SrsMessage* msg, SrsPacket* packet);
  186 + /**
  187 + * imp for __decode_message
  188 + */
  189 + virtual int __do_decode_message(SrsMessageHeader& header, SrsStream* stream, SrsPacket** ppacket);
  190 + /**
  191 + * recv bytes oriented RTMP message from protocol stack.
  192 + * return error if error occur and nerver set the pmsg,
  193 + * return success and pmsg set to NULL if no entire message got,
  194 + * return success and pmsg set to entire message if got one.
  195 + */
  196 + virtual int __recv_interlaced_message(__SrsMessage** pmsg);
  197 + /**
  198 + * read the chunk basic header(fmt, cid) from chunk stream.
  199 + * user can discovery a SrsChunkStream by cid.
  200 + * @bh_size return the chunk basic header size, to remove the used bytes when finished.
  201 + */
  202 + virtual int __read_basic_header(char& fmt, int& cid, int& bh_size);
  203 + /**
  204 + * read the chunk message header(timestamp, payload_length, message_type, stream_id)
  205 + * from chunk stream and save to SrsChunkStream.
  206 + * @mh_size return the chunk message header size, to remove the used bytes when finished.
  207 + */
  208 + virtual int __read_message_header(__SrsChunkStream* chunk, char fmt, int bh_size, int& mh_size);
  209 + /**
  210 + * read the chunk payload, remove the used bytes in buffer,
  211 + * if got entire message, set the pmsg.
  212 + * @payload_size read size in this roundtrip, generally a chunk size or left message size.
  213 + */
  214 + virtual int __read_message_payload(__SrsChunkStream* chunk, int bh_size, int mh_size, int& payload_size, __SrsMessage** pmsg);
  215 + /**
  216 + * when recv message, update the context.
  217 + */
  218 + virtual int __on_recv_message(__SrsMessage* msg);
  219 + /**
  220 + * when message sentout, update the context.
  221 + */
  222 + virtual int __on_send_message(__SrsMessage* msg, SrsPacket* packet);
  223 +public:
141 /** 224 /**
142 * recv a message with raw/undecoded payload from peer. 225 * recv a message with raw/undecoded payload from peer.
143 * the payload is not decoded, use srs_rtmp_expect_message<T> if requires 226 * the payload is not decoded, use srs_rtmp_expect_message<T> if requires
@@ -226,6 +309,16 @@ struct SrsMessageHeader @@ -226,6 +309,16 @@ struct SrsMessageHeader
226 */ 309 */
227 int64_t timestamp; 310 int64_t timestamp;
228 311
  312 +public:
  313 + /**
  314 + * get the perfered cid(chunk stream id) which sendout over.
  315 + * set at decoding, and canbe used for directly send message,
  316 + * for example, dispatch to all connections.
  317 + * @see: SrsSharedPtrMessage.SrsSharedPtr.perfer_cid
  318 + */
  319 + int perfer_cid;
  320 +
  321 +public:
229 SrsMessageHeader(); 322 SrsMessageHeader();
230 virtual ~SrsMessageHeader(); 323 virtual ~SrsMessageHeader();
231 324
@@ -284,6 +377,109 @@ public: @@ -284,6 +377,109 @@ public:
284 }; 377 };
285 378
286 /** 379 /**
  380 +* incoming chunk stream maybe interlaced,
  381 +* use the chunk stream to cache the input RTMP chunk streams.
  382 +*/
  383 +class __SrsChunkStream
  384 +{
  385 +public:
  386 + /**
  387 + * represents the basic header fmt,
  388 + * which used to identify the variant message header type.
  389 + */
  390 + char fmt;
  391 + /**
  392 + * represents the basic header cid,
  393 + * which is the chunk stream id.
  394 + */
  395 + int cid;
  396 + /**
  397 + * cached message header
  398 + */
  399 + SrsMessageHeader header;
  400 + /**
  401 + * whether the chunk message header has extended timestamp.
  402 + */
  403 + bool extended_timestamp;
  404 + /**
  405 + * partially read message.
  406 + */
  407 + __SrsMessage* msg;
  408 + /**
  409 + * decoded msg count, to identify whether the chunk stream is fresh.
  410 + */
  411 + int64_t msg_count;
  412 +public:
  413 + __SrsChunkStream(int _cid);
  414 + virtual ~__SrsChunkStream();
  415 +};
  416 +
  417 +/**
  418 +* message is raw data RTMP message, bytes oriented,
  419 +* protcol always recv RTMP message, and can send RTMP message or RTMP packet.
  420 +* the shared-ptr message is a special RTMP message, use ref-count for performance issue.
  421 +*/
  422 +class __SrsMessage
  423 +{
  424 +// 4.1. Message Header
  425 +public:
  426 + SrsMessageHeader header;
  427 +// 4.2. Message Payload
  428 +public:
  429 + /**
  430 + * The other part which is the payload is the actual data that is
  431 + * contained in the message. For example, it could be some audio samples
  432 + * or compressed video data. The payload format and interpretation are
  433 + * beyond the scope of this document.
  434 + */
  435 + int32_t size;
  436 + int8_t* payload;
  437 +public:
  438 + __SrsMessage();
  439 + virtual ~__SrsMessage();
  440 +};
  441 +
  442 +/**
  443 +* shared ptr message.
  444 +* for audio/video/data message that need less memory copy.
  445 +* and only for output.
  446 +*/
  447 +class __SrsSharedPtrMessage : public __SrsMessage
  448 +{
  449 +private:
  450 + struct __SrsSharedPtr
  451 + {
  452 + char* payload;
  453 + int size;
  454 + int shared_count;
  455 +
  456 + __SrsSharedPtr();
  457 + virtual ~__SrsSharedPtr();
  458 + };
  459 + __SrsSharedPtr* ptr;
  460 +public:
  461 + __SrsSharedPtrMessage();
  462 + virtual ~__SrsSharedPtrMessage();
  463 +public:
  464 + /**
  465 + * set the shared payload.
  466 + * we will detach the payload of source,
  467 + * so ensure donot use it before.
  468 + */
  469 + virtual int initialize(__SrsMessage* source);
  470 + /**
  471 + * set the shared payload.
  472 + * use source header, and specified param payload.
  473 + */
  474 + virtual int initialize(SrsMessageHeader* source, char* payload, int size);
  475 +public:
  476 + /**
  477 + * copy current shared ptr message, use ref-count.
  478 + */
  479 + virtual __SrsSharedPtrMessage* copy();
  480 +};
  481 +
  482 +/**
287 * message to output. 483 * message to output.
288 */ 484 */
289 class ISrsMessage 485 class ISrsMessage
@@ -1215,5 +1411,44 @@ int srs_rtmp_expect_message(SrsProtocol* protocol, SrsCommonMessage** pmsg, T** @@ -1215,5 +1411,44 @@ int srs_rtmp_expect_message(SrsProtocol* protocol, SrsCommonMessage** pmsg, T**
1215 1411
1216 return ret; 1412 return ret;
1217 } 1413 }
  1414 +template<class T>
  1415 +int __srs_rtmp_expect_message(SrsProtocol* protocol, __SrsMessage** pmsg, T** ppacket)
  1416 +{
  1417 + *pmsg = NULL;
  1418 + *ppacket = NULL;
  1419 +
  1420 + int ret = ERROR_SUCCESS;
  1421 +
  1422 + while (true) {
  1423 + __SrsMessage* msg = NULL;
  1424 + if ((ret = protocol->__recv_message(&msg)) != ERROR_SUCCESS) {
  1425 + srs_error("recv message failed. ret=%d", ret);
  1426 + return ret;
  1427 + }
  1428 + srs_verbose("recv message success.");
  1429 +
  1430 + SrsPacket* packet = NULL;
  1431 + if ((ret = protocol->__decode_message(msg, &packet)) != ERROR_SUCCESS) {
  1432 + srs_error("decode message failed. ret=%d", ret);
  1433 + srs_freep(msg);
  1434 + return ret;
  1435 + }
  1436 +
  1437 + T* pkt = dynamic_cast<T*>(packet);
  1438 + if (!pkt) {
  1439 + srs_trace("drop message(type=%d, size=%d, time=%"PRId64", sid=%d).",
  1440 + msg->header.message_type, msg->header.payload_length,
  1441 + msg->header.timestamp, msg->header.stream_id);
  1442 + srs_freep(msg);
  1443 + continue;
  1444 + }
  1445 +
  1446 + *pmsg = msg;
  1447 + *ppacket = pkt;
  1448 + break;
  1449 + }
  1450 +
  1451 + return ret;
  1452 +}
1218 1453
1219 #endif 1454 #endif