winlin

Merge branch 'srs.master'

@@ -499,7 +499,7 @@ int SrsEdgeForwarder::cycle() @@ -499,7 +499,7 @@ int SrsEdgeForwarder::cycle()
499 499
500 // forward all messages. 500 // forward all messages.
501 int count = 0; 501 int count = 0;
502 - if ((ret = queue->dump_packets(msgs.size, msgs.msgs, count)) != ERROR_SUCCESS) { 502 + if ((ret = queue->dump_packets(msgs.max, msgs.msgs, count)) != ERROR_SUCCESS) {
503 srs_error("get message to push to origin failed. ret=%d", ret); 503 srs_error("get message to push to origin failed. ret=%d", ret);
504 return ret; 504 return ret;
505 } 505 }
@@ -523,20 +523,11 @@ int SrsEdgeForwarder::cycle() @@ -523,20 +523,11 @@ int SrsEdgeForwarder::cycle()
523 } 523 }
524 524
525 // all msgs to forward to origin. 525 // all msgs to forward to origin.
526 - // @remark, becareful, all msgs must be free explicitly,  
527 - // free by send_and_free_message or srs_freep.  
528 - for (int i = 0; i < count; i++) {  
529 - SrsMessage* msg = msgs.msgs[i];  
530 -  
531 - srs_assert(msg);  
532 - msgs.msgs[i] = NULL;  
533 -  
534 - if ((ret = client->send_and_free_message(msg, stream_id)) != ERROR_SUCCESS) { 526 + if ((ret = client->send_and_free_messages(msgs.msgs, count, stream_id)) != ERROR_SUCCESS) {
535 srs_error("edge publish push message to server failed. ret=%d", ret); 527 srs_error("edge publish push message to server failed. ret=%d", ret);
536 return ret; 528 return ret;
537 } 529 }
538 } 530 }
539 - }  
540 531
541 return ret; 532 return ret;
542 } 533 }
@@ -417,7 +417,7 @@ int SrsForwarder::forward() @@ -417,7 +417,7 @@ int SrsForwarder::forward()
417 417
418 // forward all messages. 418 // forward all messages.
419 int count = 0; 419 int count = 0;
420 - if ((ret = queue->dump_packets(msgs.size, msgs.msgs, count)) != ERROR_SUCCESS) { 420 + if ((ret = queue->dump_packets(msgs.max, msgs.msgs, count)) != ERROR_SUCCESS) {
421 srs_error("get message to forward failed. ret=%d", ret); 421 srs_error("get message to forward failed. ret=%d", ret);
422 return ret; 422 return ret;
423 } 423 }
@@ -439,20 +439,11 @@ int SrsForwarder::forward() @@ -439,20 +439,11 @@ int SrsForwarder::forward()
439 } 439 }
440 440
441 // all msgs to forward. 441 // all msgs to forward.
442 - // @remark, becareful, all msgs must be free explicitly,  
443 - // free by send_and_free_message or srs_freep.  
444 - for (int i = 0; i < count; i++) {  
445 - SrsMessage* msg = msgs.msgs[i];  
446 -  
447 - srs_assert(msg);  
448 - msgs.msgs[i] = NULL;  
449 -  
450 - if ((ret = client->send_and_free_message(msg, stream_id)) != ERROR_SUCCESS) {  
451 - srs_error("forwarder send message to server failed. ret=%d", ret); 442 + if ((ret = client->send_and_free_messages(msgs.msgs, count, stream_id)) != ERROR_SUCCESS) {
  443 + srs_error("forwarder messages to server failed. ret=%d", ret);
452 return ret; 444 return ret;
453 } 445 }
454 } 446 }
455 - }  
456 447
457 return ret; 448 return ret;
458 } 449 }
@@ -559,7 +559,7 @@ int SrsRtmpConn::playing(SrsSource* source) @@ -559,7 +559,7 @@ int SrsRtmpConn::playing(SrsSource* source)
559 559
560 // get messages from consumer. 560 // get messages from consumer.
561 int count = 0; 561 int count = 0;
562 - if ((ret = consumer->dump_packets(msgs.size, msgs.msgs, count)) != ERROR_SUCCESS) { 562 + if ((ret = consumer->dump_packets(msgs.max, msgs.msgs, count)) != ERROR_SUCCESS) {
563 srs_error("get messages from consumer failed. ret=%d", ret); 563 srs_error("get messages from consumer failed. ret=%d", ret);
564 return ret; 564 return ret;
565 } 565 }
@@ -596,17 +596,11 @@ int SrsRtmpConn::playing(SrsSource* source) @@ -596,17 +596,11 @@ int SrsRtmpConn::playing(SrsSource* source)
596 // free by send_and_free_message or srs_freep. 596 // free by send_and_free_message or srs_freep.
597 if (count > 0) { 597 if (count > 0) {
598 // no need to assert msg, for the rtmp will assert it. 598 // no need to assert msg, for the rtmp will assert it.
599 - ret = rtmp->send_and_free_messages(msgs.msgs, count, res->stream_id);  
600 - }  
601 - for (int i = 0; i < count; i++) {  
602 - // the send_message will free the msg,  
603 - // so set the msgs[i] to NULL.  
604 - msgs.msgs[i] = NULL;  
605 - }  
606 - if (ret != ERROR_SUCCESS) { 599 + if ((ret = rtmp->send_and_free_messages(msgs.msgs, count, res->stream_id)) != ERROR_SUCCESS) {
607 srs_error("send messages to client failed. ret=%d", ret); 600 srs_error("send messages to client failed. ret=%d", ret);
608 return ret; 601 return ret;
609 } 602 }
  603 + }
610 604
611 // if duration specified, and exceed it, stop play live. 605 // if duration specified, and exceed it, stop play live.
612 // @see: https://github.com/winlinvip/simple-rtmp-server/issues/45 606 // @see: https://github.com/winlinvip/simple-rtmp-server/issues/45
@@ -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 2 32 #define VERSION_MAJOR 2
33 #define VERSION_MINOR 0 33 #define VERSION_MINOR 0
34 -#define VERSION_REVISION 17 34 +#define VERSION_REVISION 18
35 // server info. 35 // server info.
36 #define RTMP_SIG_SRS_KEY "SRS" 36 #define RTMP_SIG_SRS_KEY "SRS"
37 #define RTMP_SIG_SRS_ROLE "origin/edge server" 37 #define RTMP_SIG_SRS_ROLE "origin/edge server"
@@ -25,27 +25,21 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -25,27 +25,21 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 25
26 #include <srs_protocol_stack.hpp> 26 #include <srs_protocol_stack.hpp>
27 27
28 -SrsMessageArray::SrsMessageArray(int _size) 28 +SrsMessageArray::SrsMessageArray(int max_msgs)
29 { 29 {
30 - srs_assert(_size > 0); 30 + srs_assert(max_msgs > 0);
31 31
32 - msgs = new SrsMessage*[_size];  
33 - size = _size; 32 + msgs = new SrsMessage*[max_msgs];
  33 + max = max_msgs;
34 34
35 // initialize 35 // initialize
36 - for (int i = 0; i < _size; i++) { 36 + for (int i = 0; i < max_msgs; i++) {
37 msgs[i] = NULL; 37 msgs[i] = NULL;
38 } 38 }
39 } 39 }
40 40
41 SrsMessageArray::~SrsMessageArray() 41 SrsMessageArray::~SrsMessageArray()
42 { 42 {
43 - // cleanup  
44 - for (int i = 0; i < size; i++) {  
45 - SrsMessage* msg = msgs[i];  
46 - srs_freep(msg);  
47 - }  
48 -  
49 srs_freep(msgs); 43 srs_freep(msgs);
50 } 44 }
51 45
@@ -37,7 +37,9 @@ class SrsMessage; @@ -37,7 +37,9 @@ class SrsMessage;
37 * when need to get some messages, for instance, from Consumer queue, 37 * when need to get some messages, for instance, from Consumer queue,
38 * create a message array, whose msgs can used to accept the msgs, 38 * create a message array, whose msgs can used to accept the msgs,
39 * then send each message and set to NULL. 39 * then send each message and set to NULL.
40 -* @remark: when error, the message array will free the msg not sent out. 40 +*
  41 +* @remark: user must free all msgs in array, for the SRS2.0 protocol stack
  42 +* provides an api to send messages, @see send_and_free_messages
41 */ 43 */
42 class SrsMessageArray 44 class SrsMessageArray
43 { 45 {
@@ -48,12 +50,12 @@ public: @@ -48,12 +50,12 @@ public:
48 * where send(msg) will always send and free it. 50 * where send(msg) will always send and free it.
49 */ 51 */
50 SrsMessage** msgs; 52 SrsMessage** msgs;
51 - int size; 53 + int max;
52 public: 54 public:
53 /** 55 /**
54 * create msg array, initialize array to NULL ptrs. 56 * create msg array, initialize array to NULL ptrs.
55 */ 57 */
56 - SrsMessageArray(int _size); 58 + SrsMessageArray(int max_msgs);
57 /** 59 /**
58 * free the msgs not sent out(not NULL). 60 * free the msgs not sent out(not NULL).
59 */ 61 */
@@ -371,6 +371,11 @@ int SrsRtmpClient::send_and_free_message(SrsMessage* msg, int stream_id) @@ -371,6 +371,11 @@ int SrsRtmpClient::send_and_free_message(SrsMessage* msg, int stream_id)
371 return protocol->send_and_free_message(msg, stream_id); 371 return protocol->send_and_free_message(msg, stream_id);
372 } 372 }
373 373
  374 +int SrsRtmpClient::send_and_free_messages(SrsMessage** msgs, int nb_msgs, int stream_id)
  375 +{
  376 + return protocol->send_and_free_messages(msgs, nb_msgs, stream_id);
  377 +}
  378 +
374 int SrsRtmpClient::send_and_free_packet(SrsPacket* packet, int stream_id) 379 int SrsRtmpClient::send_and_free_packet(SrsPacket* packet, int stream_id)
375 { 380 {
376 return protocol->send_and_free_packet(packet, stream_id); 381 return protocol->send_and_free_packet(packet, stream_id);
@@ -222,6 +222,15 @@ public: @@ -222,6 +222,15 @@ public:
222 */ 222 */
223 virtual int send_and_free_message(SrsMessage* msg, int stream_id); 223 virtual int send_and_free_message(SrsMessage* msg, int stream_id);
224 /** 224 /**
  225 + * send the RTMP message and always free it.
  226 + * user must never free or use the msg after this method,
  227 + * for it will always free the msg.
  228 + * @param msgs, the msgs to send out, never be NULL.
  229 + * @param nb_msgs, the size of msgs to send out.
  230 + * @param stream_id, the stream id of packet to send over, 0 for control message.
  231 + */
  232 + virtual int send_and_free_messages(SrsMessage** msgs, int nb_msgs, int stream_id);
  233 + /**
225 * send the RTMP packet and always free it. 234 * send the RTMP packet and always free it.
226 * user must never free or use the packet after this method, 235 * user must never free or use the packet after this method,
227 * for it will always free the packet. 236 * for it will always free the packet.