正在显示
17 个修改的文件
包含
1625 行增加
和
303 行删除
| @@ -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*)×tamp; | ||
| 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*)×tamp; | ||
| 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*)×tamp; | ||
| 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*)×tamp; | ||
| 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 |
-
请 注册 或 登录 后发表评论