winlin

merge from bravo code, fix some warnings.

@@ -77,22 +77,22 @@ void SrsKbpsSlice::sample() @@ -77,22 +77,22 @@ void SrsKbpsSlice::sample()
77 } 77 }
78 78
79 if (now - sample_30s.time > 30 * 1000) { 79 if (now - sample_30s.time > 30 * 1000) {
80 - sample_30s.kbps = (total_bytes - sample_30s.bytes) * 8 / (now - sample_30s.time); 80 + sample_30s.kbps = (int)((total_bytes - sample_30s.bytes) * 8 / (now - sample_30s.time));
81 sample_30s.time = now; 81 sample_30s.time = now;
82 sample_30s.bytes = total_bytes; 82 sample_30s.bytes = total_bytes;
83 } 83 }
84 if (now - sample_1m.time > 60 * 1000) { 84 if (now - sample_1m.time > 60 * 1000) {
85 - sample_1m.kbps = (total_bytes - sample_1m.bytes) * 8 / (now - sample_1m.time); 85 + sample_1m.kbps = (int)((total_bytes - sample_1m.bytes) * 8 / (now - sample_1m.time));
86 sample_1m.time = now; 86 sample_1m.time = now;
87 sample_1m.bytes = total_bytes; 87 sample_1m.bytes = total_bytes;
88 } 88 }
89 if (now - sample_5m.time > 300 * 1000) { 89 if (now - sample_5m.time > 300 * 1000) {
90 - sample_5m.kbps = (total_bytes - sample_5m.bytes) * 8 / (now - sample_5m.time); 90 + sample_5m.kbps = (int)((total_bytes - sample_5m.bytes) * 8 / (now - sample_5m.time));
91 sample_5m.time = now; 91 sample_5m.time = now;
92 sample_5m.bytes = total_bytes; 92 sample_5m.bytes = total_bytes;
93 } 93 }
94 if (now - sample_60m.time > 3600 * 1000) { 94 if (now - sample_60m.time > 3600 * 1000) {
95 - sample_60m.kbps = (total_bytes - sample_60m.bytes) * 8 / (now - sample_60m.time); 95 + sample_60m.kbps = (int)((total_bytes - sample_60m.bytes) * 8 / (now - sample_60m.time));
96 sample_60m.time = now; 96 sample_60m.time = now;
97 sample_60m.bytes = total_bytes; 97 sample_60m.bytes = total_bytes;
98 } 98 }
@@ -160,7 +160,7 @@ int SrsKbps::get_send_kbps() @@ -160,7 +160,7 @@ int SrsKbps::get_send_kbps()
160 return 0; 160 return 0;
161 } 161 }
162 int64_t bytes = get_send_bytes(); 162 int64_t bytes = get_send_bytes();
163 - return bytes * 8 / duration; 163 + return (int)(bytes * 8 / duration);
164 } 164 }
165 165
166 int SrsKbps::get_recv_kbps() 166 int SrsKbps::get_recv_kbps()
@@ -170,7 +170,7 @@ int SrsKbps::get_recv_kbps() @@ -170,7 +170,7 @@ int SrsKbps::get_recv_kbps()
170 return 0; 170 return 0;
171 } 171 }
172 int64_t bytes = get_recv_bytes(); 172 int64_t bytes = get_recv_bytes();
173 - return bytes * 8 / duration; 173 + return (int)(bytes * 8 / duration);
174 } 174 }
175 175
176 int SrsKbps::get_send_kbps_30s() 176 int SrsKbps::get_send_kbps_30s()
@@ -54,6 +54,11 @@ ISrsUdpHandler::~ISrsUdpHandler() @@ -54,6 +54,11 @@ ISrsUdpHandler::~ISrsUdpHandler()
54 { 54 {
55 } 55 }
56 56
  57 +int ISrsUdpHandler::on_stfd_change(st_netfd_t /*fd*/)
  58 +{
  59 + return ERROR_SUCCESS;
  60 +}
  61 +
57 ISrsTcpHandler::ISrsTcpHandler() 62 ISrsTcpHandler::ISrsTcpHandler()
58 { 63 {
59 } 64 }
@@ -69,7 +74,7 @@ SrsUdpListener::SrsUdpListener(ISrsUdpHandler* h, string i, int p) @@ -69,7 +74,7 @@ SrsUdpListener::SrsUdpListener(ISrsUdpHandler* h, string i, int p)
69 port = p; 74 port = p;
70 75
71 _fd = -1; 76 _fd = -1;
72 - stfd = NULL; 77 + _stfd = NULL;
73 78
74 nb_buf = SRS_UDP_MAX_PACKET_SIZE; 79 nb_buf = SRS_UDP_MAX_PACKET_SIZE;
75 buf = new char[nb_buf]; 80 buf = new char[nb_buf];
@@ -80,7 +85,7 @@ SrsUdpListener::SrsUdpListener(ISrsUdpHandler* h, string i, int p) @@ -80,7 +85,7 @@ SrsUdpListener::SrsUdpListener(ISrsUdpHandler* h, string i, int p)
80 SrsUdpListener::~SrsUdpListener() 85 SrsUdpListener::~SrsUdpListener()
81 { 86 {
82 // close the stfd to trigger thread to interrupted. 87 // close the stfd to trigger thread to interrupted.
83 - srs_close_stfd(stfd); 88 + srs_close_stfd(_stfd);
84 89
85 pthread->stop(); 90 pthread->stop();
86 srs_freep(pthread); 91 srs_freep(pthread);
@@ -97,6 +102,11 @@ int SrsUdpListener::fd() @@ -97,6 +102,11 @@ int SrsUdpListener::fd()
97 return _fd; 102 return _fd;
98 } 103 }
99 104
  105 +st_netfd_t SrsUdpListener::stfd()
  106 +{
  107 + return _stfd;
  108 +}
  109 +
100 int SrsUdpListener::listen() 110 int SrsUdpListener::listen()
101 { 111 {
102 int ret = ERROR_SUCCESS; 112 int ret = ERROR_SUCCESS;
@@ -127,7 +137,7 @@ int SrsUdpListener::listen() @@ -127,7 +137,7 @@ int SrsUdpListener::listen()
127 } 137 }
128 srs_verbose("bind socket success. ep=%s:%d, fd=%d", ip.c_str(), port, _fd); 138 srs_verbose("bind socket success. ep=%s:%d, fd=%d", ip.c_str(), port, _fd);
129 139
130 - if ((stfd = st_netfd_open_socket(_fd)) == NULL){ 140 + if ((_stfd = st_netfd_open_socket(_fd)) == NULL){
131 ret = ERROR_ST_OPEN_SOCKET; 141 ret = ERROR_ST_OPEN_SOCKET;
132 srs_error("st_netfd_open_socket open socket failed. ep=%s:%d, ret=%d", ip.c_str(), port, ret); 142 srs_error("st_netfd_open_socket open socket failed. ep=%s:%d, ret=%d", ip.c_str(), port, ret);
133 return ret; 143 return ret;
@@ -153,7 +163,7 @@ int SrsUdpListener::cycle() @@ -153,7 +163,7 @@ int SrsUdpListener::cycle()
153 int nb_from = sizeof(sockaddr_in); 163 int nb_from = sizeof(sockaddr_in);
154 int nread = 0; 164 int nread = 0;
155 165
156 - if ((nread = st_recvfrom(stfd, buf, nb_buf, (sockaddr*)&from, &nb_from, ST_UTIME_NO_TIMEOUT)) <= 0) { 166 + if ((nread = st_recvfrom(_stfd, buf, nb_buf, (sockaddr*)&from, &nb_from, ST_UTIME_NO_TIMEOUT)) <= 0) {
157 srs_warn("ignore recv udp packet failed, nread=%d", nread); 167 srs_warn("ignore recv udp packet failed, nread=%d", nread);
158 continue; 168 continue;
159 } 169 }
@@ -178,7 +188,7 @@ SrsTcpListener::SrsTcpListener(ISrsTcpHandler* h, string i, int p) @@ -178,7 +188,7 @@ SrsTcpListener::SrsTcpListener(ISrsTcpHandler* h, string i, int p)
178 port = p; 188 port = p;
179 189
180 _fd = -1; 190 _fd = -1;
181 - stfd = NULL; 191 + _stfd = NULL;
182 192
183 pthread = new SrsThread("tcp", this, 0, true); 193 pthread = new SrsThread("tcp", this, 0, true);
184 } 194 }
@@ -186,7 +196,7 @@ SrsTcpListener::SrsTcpListener(ISrsTcpHandler* h, string i, int p) @@ -186,7 +196,7 @@ SrsTcpListener::SrsTcpListener(ISrsTcpHandler* h, string i, int p)
186 SrsTcpListener::~SrsTcpListener() 196 SrsTcpListener::~SrsTcpListener()
187 { 197 {
188 // close the stfd to trigger thread to interrupted. 198 // close the stfd to trigger thread to interrupted.
189 - srs_close_stfd(stfd); 199 + srs_close_stfd(_stfd);
190 200
191 pthread->stop(); 201 pthread->stop();
192 srs_freep(pthread); 202 srs_freep(pthread);
@@ -238,7 +248,7 @@ int SrsTcpListener::listen() @@ -238,7 +248,7 @@ int SrsTcpListener::listen()
238 } 248 }
239 srs_verbose("listen socket success. ep=%s:%d, fd=%d", ip.c_str(), port, _fd); 249 srs_verbose("listen socket success. ep=%s:%d, fd=%d", ip.c_str(), port, _fd);
240 250
241 - if ((stfd = st_netfd_open_socket(_fd)) == NULL){ 251 + if ((_stfd = st_netfd_open_socket(_fd)) == NULL){
242 ret = ERROR_ST_OPEN_SOCKET; 252 ret = ERROR_ST_OPEN_SOCKET;
243 srs_error("st_netfd_open_socket open socket failed. ep=%s:%d, ret=%d", ip.c_str(), port, ret); 253 srs_error("st_netfd_open_socket open socket failed. ep=%s:%d, ret=%d", ip.c_str(), port, ret);
244 return ret; 254 return ret;
@@ -258,7 +268,7 @@ int SrsTcpListener::cycle() @@ -258,7 +268,7 @@ int SrsTcpListener::cycle()
258 { 268 {
259 int ret = ERROR_SUCCESS; 269 int ret = ERROR_SUCCESS;
260 270
261 - st_netfd_t client_stfd = st_accept(stfd, NULL, NULL, ST_UTIME_NO_TIMEOUT); 271 + st_netfd_t client_stfd = st_accept(_stfd, NULL, NULL, ST_UTIME_NO_TIMEOUT);
262 272
263 if(client_stfd == NULL){ 273 if(client_stfd == NULL){
264 // ignore error. 274 // ignore error.
@@ -47,6 +47,12 @@ public: @@ -47,6 +47,12 @@ public:
47 virtual ~ISrsUdpHandler(); 47 virtual ~ISrsUdpHandler();
48 public: 48 public:
49 /** 49 /**
  50 + * when fd changed, for instance, reload the listen port,
  51 + * notify the handler and user can do something.
  52 + */
  53 + virtual int on_stfd_change(st_netfd_t fd);
  54 +public:
  55 + /**
50 * when udp listener got a udp packet, notice server to process it. 56 * when udp listener got a udp packet, notice server to process it.
51 * @param type, the client type, used to create concrete connection, 57 * @param type, the client type, used to create concrete connection,
52 * for instance RTMP connection to serve client. 58 * for instance RTMP connection to serve client.
@@ -80,7 +86,7 @@ class SrsUdpListener : public ISrsThreadHandler @@ -80,7 +86,7 @@ class SrsUdpListener : public ISrsThreadHandler
80 { 86 {
81 private: 87 private:
82 int _fd; 88 int _fd;
83 - st_netfd_t stfd; 89 + st_netfd_t _stfd;
84 SrsThread* pthread; 90 SrsThread* pthread;
85 private: 91 private:
86 char* buf; 92 char* buf;
@@ -94,6 +100,7 @@ public: @@ -94,6 +100,7 @@ public:
94 virtual ~SrsUdpListener(); 100 virtual ~SrsUdpListener();
95 public: 101 public:
96 virtual int fd(); 102 virtual int fd();
  103 + virtual st_netfd_t stfd();
97 public: 104 public:
98 virtual int listen(); 105 virtual int listen();
99 // interface ISrsThreadHandler. 106 // interface ISrsThreadHandler.
@@ -108,7 +115,7 @@ class SrsTcpListener : public ISrsThreadHandler @@ -108,7 +115,7 @@ class SrsTcpListener : public ISrsThreadHandler
108 { 115 {
109 private: 116 private:
110 int _fd; 117 int _fd;
111 - st_netfd_t stfd; 118 + st_netfd_t _stfd;
112 SrsThread* pthread; 119 SrsThread* pthread;
113 private: 120 private:
114 ISrsTcpHandler* handler; 121 ISrsTcpHandler* handler;
@@ -330,6 +330,12 @@ int SrsUdpStreamListener::listen(string i, int p) @@ -330,6 +330,12 @@ int SrsUdpStreamListener::listen(string i, int p)
330 srs_info("listen thread cid=%d, current_cid=%d, " 330 srs_info("listen thread cid=%d, current_cid=%d, "
331 "listen at port=%d, type=%d, fd=%d started success, ep=%s:%d", 331 "listen at port=%d, type=%d, fd=%d started success, ep=%s:%d",
332 pthread->cid(), _srs_context->get_id(), port, type, fd, ip.c_str(), port); 332 pthread->cid(), _srs_context->get_id(), port, type, fd, ip.c_str(), port);
  333 +
  334 + // notify the handler the fd changed.
  335 + if ((ret = caster->on_stfd_change(listener->stfd())) != ERROR_SUCCESS) {
  336 + srs_error("notify handler fd changed. ret=%d", ret);
  337 + return ret;
  338 + }
333 339
334 srs_trace("%s listen at udp://%s:%d, fd=%d", srs_listener_type2string(type).c_str(), ip.c_str(), port, listener->fd()); 340 srs_trace("%s listen at udp://%s:%d, fd=%d", srs_listener_type2string(type).c_str(), ip.c_str(), port, listener->fd());
335 341
@@ -45,6 +45,7 @@ using namespace std; @@ -45,6 +45,7 @@ using namespace std;
45 #include <srs_app_hds.hpp> 45 #include <srs_app_hds.hpp>
46 #include <srs_app_statistic.hpp> 46 #include <srs_app_statistic.hpp>
47 #include <srs_core_autofree.hpp> 47 #include <srs_core_autofree.hpp>
  48 +#include <srs_rtmp_utility.hpp>
48 49
49 #define CONST_MAX_JITTER_MS 500 50 #define CONST_MAX_JITTER_MS 500
50 #define DEFAULT_FRAME_TIME_MS 40 51 #define DEFAULT_FRAME_TIME_MS 40
@@ -759,6 +760,20 @@ SrsSource* SrsSource::fetch(SrsRequest* r) @@ -759,6 +760,20 @@ SrsSource* SrsSource::fetch(SrsRequest* r)
759 return source; 760 return source;
760 } 761 }
761 762
  763 +SrsSource* SrsSource::fetch(std::string vhost, std::string app, std::string stream)
  764 +{
  765 + SrsSource* source = NULL;
  766 + string stream_url = srs_generate_stream_url(vhost, app, stream);
  767 +
  768 + if (pool.find(stream_url) == pool.end()) {
  769 + return NULL;
  770 + }
  771 +
  772 + source = pool[stream_url];
  773 +
  774 + return source;
  775 +}
  776 +
762 void SrsSource::destroy() 777 void SrsSource::destroy()
763 { 778 {
764 std::map<std::string, SrsSource*>::iterator it; 779 std::map<std::string, SrsSource*>::iterator it;
@@ -407,6 +407,10 @@ public: @@ -407,6 +407,10 @@ public:
407 */ 407 */
408 static SrsSource* fetch(SrsRequest* r); 408 static SrsSource* fetch(SrsRequest* r);
409 /** 409 /**
  410 + * get the exists source by stream info(vhost, app, stream), NULL when not exists.
  411 + */
  412 + static SrsSource* fetch(std::string vhost, std::string app, std::string stream);
  413 + /**
410 * when system exit, destroy the sources, 414 * when system exit, destroy the sources,
411 * for gmc to analysis mem leaks. 415 * for gmc to analysis mem leaks.
412 */ 416 */
@@ -195,6 +195,7 @@ int SrsStatistic::on_client(int id, SrsRequest* req) @@ -195,6 +195,7 @@ int SrsStatistic::on_client(int id, SrsRequest* req)
195 SrsStatisticClient* client = NULL; 195 SrsStatisticClient* client = NULL;
196 if (clients.find(id) == clients.end()) { 196 if (clients.find(id) == clients.end()) {
197 client = new SrsStatisticClient(); 197 client = new SrsStatisticClient();
  198 + client->id = id;
198 client->stream = stream; 199 client->stream = stream;
199 clients[id] = client; 200 clients[id] = client;
200 } else { 201 } else {
@@ -255,7 +255,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -255,7 +255,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
255 #define ERROR_HTTP_INVALID_CHUNK_HEADER 4026 255 #define ERROR_HTTP_INVALID_CHUNK_HEADER 4026
256 #define ERROR_AVC_NALU_UEV 4027 256 #define ERROR_AVC_NALU_UEV 4027
257 #define ERROR_AAC_BYTES_INVALID 4028 257 #define ERROR_AAC_BYTES_INVALID 4028
258 -#define ERROR_HTTP_REQUEST_EOF 4029 258 +#define ERROR_HTTP_REQUEST_EOF 4029
259 259
260 /////////////////////////////////////////////////////// 260 ///////////////////////////////////////////////////////
261 // user-define error. 261 // user-define error.
@@ -99,15 +99,7 @@ void SrsRequest::update_auth(SrsRequest* req) @@ -99,15 +99,7 @@ void SrsRequest::update_auth(SrsRequest* req)
99 99
100 string SrsRequest::get_stream_url() 100 string SrsRequest::get_stream_url()
101 { 101 {
102 - std::string url = "";  
103 -  
104 - url += vhost;  
105 - url += "/";  
106 - url += app;  
107 - url += "/";  
108 - url += stream;  
109 -  
110 - return url; 102 + return srs_generate_stream_url(vhost, app, stream);
111 } 103 }
112 104
113 void SrsRequest::strip() 105 void SrsRequest::strip()
@@ -31,6 +31,7 @@ using namespace std; @@ -31,6 +31,7 @@ using namespace std;
31 #include <srs_kernel_stream.hpp> 31 #include <srs_kernel_stream.hpp>
32 #include <srs_rtmp_stack.hpp> 32 #include <srs_rtmp_stack.hpp>
33 #include <srs_kernel_codec.hpp> 33 #include <srs_kernel_codec.hpp>
  34 +#include <srs_kernel_consts.hpp>
34 35
35 void srs_discovery_tc_url( 36 void srs_discovery_tc_url(
36 string tcUrl, 37 string tcUrl,
@@ -346,3 +347,18 @@ int srs_rtmp_create_msg(char type, u_int32_t timestamp, char* data, int size, in @@ -346,3 +347,18 @@ int srs_rtmp_create_msg(char type, u_int32_t timestamp, char* data, int size, in
346 return ret; 347 return ret;
347 } 348 }
348 349
  350 +std::string srs_generate_stream_url(std::string vhost, std::string app, std::string stream)
  351 +{
  352 + std::string url = "";
  353 +
  354 + if (SRS_CONSTS_RTMP_DEFAULT_VHOST != vhost){
  355 + url += vhost;
  356 + }
  357 + url += "/";
  358 + url += app;
  359 + url += "/";
  360 + url += stream;
  361 +
  362 + return url;
  363 +}
  364 +
@@ -120,5 +120,8 @@ extern int srs_chunk_header_c3( @@ -120,5 +120,8 @@ extern int srs_chunk_header_c3(
120 */ 120 */
121 extern int srs_rtmp_create_msg(char type, u_int32_t timestamp, char* data, int size, int stream_id, SrsSharedPtrMessage** ppmsg); 121 extern int srs_rtmp_create_msg(char type, u_int32_t timestamp, char* data, int size, int stream_id, SrsSharedPtrMessage** ppmsg);
122 122
  123 +// get the stream identify, vhost/app/stream.
  124 +extern std::string srs_generate_stream_url(std::string vhost, std::string app, std::string stream);
  125 +
123 #endif 126 #endif
124 127