fix #316, http api provides stream/vhost/srs/server bytes, codec and count. 2.0.136
正在显示
17 个修改的文件
包含
191 行增加
和
57 行删除
@@ -550,6 +550,7 @@ Supported operating systems and hardware: | @@ -550,6 +550,7 @@ Supported operating systems and hardware: | ||
550 | 550 | ||
551 | ### SRS 2.0 history | 551 | ### SRS 2.0 history |
552 | 552 | ||
553 | +* v2.0, 2015-03-08, fix [#316](https://github.com/winlinvip/simple-rtmp-server/issues/316), http api provides stream/vhost/srs/server bytes, codec and count. 2.0.136. | ||
553 | * v2.0, 2015-03-08, fix [#310](https://github.com/winlinvip/simple-rtmp-server/issues/310), refine aac LC, support aac HE/HEv2. 2.0.134. | 554 | * v2.0, 2015-03-08, fix [#310](https://github.com/winlinvip/simple-rtmp-server/issues/310), refine aac LC, support aac HE/HEv2. 2.0.134. |
554 | * v2.0, 2015-03-06, for [#322](https://github.com/winlinvip/simple-rtmp-server/issues/322), fix http-flv stream bug, support multiple streams. 2.0.133. | 555 | * v2.0, 2015-03-06, for [#322](https://github.com/winlinvip/simple-rtmp-server/issues/322), fix http-flv stream bug, support multiple streams. 2.0.133. |
555 | * v2.0, 2015-03-06, refine http request parse. 2.0.132. | 556 | * v2.0, 2015-03-06, refine http request parse. 2.0.132. |
@@ -30,6 +30,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | @@ -30,6 +30,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
30 | 30 | ||
31 | SrsConnection::SrsConnection(SrsServer* srs_server, st_netfd_t client_stfd) | 31 | SrsConnection::SrsConnection(SrsServer* srs_server, st_netfd_t client_stfd) |
32 | { | 32 | { |
33 | + id = 0; | ||
33 | server = srs_server; | 34 | server = srs_server; |
34 | stfd = client_stfd; | 35 | stfd = client_stfd; |
35 | 36 | ||
@@ -55,6 +56,8 @@ int SrsConnection::cycle() | @@ -55,6 +56,8 @@ int SrsConnection::cycle() | ||
55 | int ret = ERROR_SUCCESS; | 56 | int ret = ERROR_SUCCESS; |
56 | 57 | ||
57 | _srs_context->generate_id(); | 58 | _srs_context->generate_id(); |
59 | + id = _srs_context->get_id(); | ||
60 | + | ||
58 | ip = srs_get_peer_ip(st_netfd_fileno(stfd)); | 61 | ip = srs_get_peer_ip(st_netfd_fileno(stfd)); |
59 | 62 | ||
60 | ret = do_cycle(); | 63 | ret = do_cycle(); |
@@ -86,6 +89,11 @@ void SrsConnection::on_thread_stop() | @@ -86,6 +89,11 @@ void SrsConnection::on_thread_stop() | ||
86 | server->remove(this); | 89 | server->remove(this); |
87 | } | 90 | } |
88 | 91 | ||
92 | +int SrsConnection::srs_id() | ||
93 | +{ | ||
94 | + return id; | ||
95 | +} | ||
96 | + | ||
89 | void SrsConnection::stop() | 97 | void SrsConnection::stop() |
90 | { | 98 | { |
91 | srs_close_stfd(stfd); | 99 | srs_close_stfd(stfd); |
@@ -51,6 +51,10 @@ private: | @@ -51,6 +51,10 @@ private: | ||
51 | * when thread stop, the connection will be delete by server. | 51 | * when thread stop, the connection will be delete by server. |
52 | */ | 52 | */ |
53 | SrsThread* pthread; | 53 | SrsThread* pthread; |
54 | + /** | ||
55 | + * the id of connection. | ||
56 | + */ | ||
57 | + int id; | ||
54 | protected: | 58 | protected: |
55 | /** | 59 | /** |
56 | * the server object to manage the connection. | 60 | * the server object to manage the connection. |
@@ -92,14 +96,9 @@ public: | @@ -92,14 +96,9 @@ public: | ||
92 | virtual void on_thread_stop(); | 96 | virtual void on_thread_stop(); |
93 | public: | 97 | public: |
94 | /** | 98 | /** |
95 | - * reset and start sample of bytes. | ||
96 | - * when server to get the kbps of connection, | ||
97 | - * it cannot wait the connection terminated then get the kbps, | ||
98 | - * it must sample the kbps every some interval, for instance, 9s to sample all connections kbps, | ||
99 | - * all connections will extends from IKbpsDelta which provides the bytes delta, | ||
100 | - * while the delta must be update by the sample which invoke by the kbps_resample(). | 99 | + * get the srs id which identify the client. |
101 | */ | 100 | */ |
102 | - virtual void kbps_resample() = 0; | 101 | + virtual int srs_id(); |
103 | protected: | 102 | protected: |
104 | /** | 103 | /** |
105 | * for concrete connection to do the cycle. | 104 | * for concrete connection to do the cycle. |
@@ -486,7 +486,7 @@ SrsHttpApi::~SrsHttpApi() | @@ -486,7 +486,7 @@ SrsHttpApi::~SrsHttpApi() | ||
486 | srs_freep(parser); | 486 | srs_freep(parser); |
487 | } | 487 | } |
488 | 488 | ||
489 | -void SrsHttpApi::kbps_resample() | 489 | +void SrsHttpApi::resample() |
490 | { | 490 | { |
491 | // TODO: FIXME: implements it | 491 | // TODO: FIXME: implements it |
492 | } | 492 | } |
@@ -503,6 +503,11 @@ int64_t SrsHttpApi::get_recv_bytes_delta() | @@ -503,6 +503,11 @@ int64_t SrsHttpApi::get_recv_bytes_delta() | ||
503 | return 0; | 503 | return 0; |
504 | } | 504 | } |
505 | 505 | ||
506 | +void SrsHttpApi::cleanup() | ||
507 | +{ | ||
508 | + // TODO: FIXME: implements it | ||
509 | +} | ||
510 | + | ||
506 | int SrsHttpApi::do_cycle() | 511 | int SrsHttpApi::do_cycle() |
507 | { | 512 | { |
508 | int ret = ERROR_SUCCESS; | 513 | int ret = ERROR_SUCCESS; |
@@ -168,12 +168,12 @@ private: | @@ -168,12 +168,12 @@ private: | ||
168 | public: | 168 | public: |
169 | SrsHttpApi(SrsServer* svr, st_netfd_t fd, SrsHttpServeMux* m); | 169 | SrsHttpApi(SrsServer* svr, st_netfd_t fd, SrsHttpServeMux* m); |
170 | virtual ~SrsHttpApi(); | 170 | virtual ~SrsHttpApi(); |
171 | -public: | ||
172 | - virtual void kbps_resample(); | ||
173 | // interface IKbpsDelta | 171 | // interface IKbpsDelta |
174 | public: | 172 | public: |
173 | + virtual void resample(); | ||
175 | virtual int64_t get_send_bytes_delta(); | 174 | virtual int64_t get_send_bytes_delta(); |
176 | virtual int64_t get_recv_bytes_delta(); | 175 | virtual int64_t get_recv_bytes_delta(); |
176 | + virtual void cleanup(); | ||
177 | protected: | 177 | protected: |
178 | virtual int do_cycle(); | 178 | virtual int do_cycle(); |
179 | private: | 179 | private: |
@@ -1193,7 +1193,7 @@ SrsHttpConn::~SrsHttpConn() | @@ -1193,7 +1193,7 @@ SrsHttpConn::~SrsHttpConn() | ||
1193 | srs_freep(parser); | 1193 | srs_freep(parser); |
1194 | } | 1194 | } |
1195 | 1195 | ||
1196 | -void SrsHttpConn::kbps_resample() | 1196 | +void SrsHttpConn::resample() |
1197 | { | 1197 | { |
1198 | // TODO: FIXME: implements it | 1198 | // TODO: FIXME: implements it |
1199 | } | 1199 | } |
@@ -1210,6 +1210,11 @@ int64_t SrsHttpConn::get_recv_bytes_delta() | @@ -1210,6 +1210,11 @@ int64_t SrsHttpConn::get_recv_bytes_delta() | ||
1210 | return 0; | 1210 | return 0; |
1211 | } | 1211 | } |
1212 | 1212 | ||
1213 | +void SrsHttpConn::cleanup() | ||
1214 | +{ | ||
1215 | + // TODO: FIXME: implements it | ||
1216 | +} | ||
1217 | + | ||
1213 | int SrsHttpConn::do_cycle() | 1218 | int SrsHttpConn::do_cycle() |
1214 | { | 1219 | { |
1215 | int ret = ERROR_SUCCESS; | 1220 | int ret = ERROR_SUCCESS; |
@@ -360,12 +360,12 @@ private: | @@ -360,12 +360,12 @@ private: | ||
360 | public: | 360 | public: |
361 | SrsHttpConn(SrsServer* svr, st_netfd_t fd, SrsHttpServer* m); | 361 | SrsHttpConn(SrsServer* svr, st_netfd_t fd, SrsHttpServer* m); |
362 | virtual ~SrsHttpConn(); | 362 | virtual ~SrsHttpConn(); |
363 | -public: | ||
364 | - virtual void kbps_resample(); | ||
365 | // interface IKbpsDelta | 363 | // interface IKbpsDelta |
366 | public: | 364 | public: |
365 | + virtual void resample(); | ||
367 | virtual int64_t get_send_bytes_delta(); | 366 | virtual int64_t get_send_bytes_delta(); |
368 | virtual int64_t get_recv_bytes_delta(); | 367 | virtual int64_t get_recv_bytes_delta(); |
368 | + virtual void cleanup(); | ||
369 | protected: | 369 | protected: |
370 | virtual int do_cycle(); | 370 | virtual int do_cycle(); |
371 | private: | 371 | private: |
@@ -203,20 +203,29 @@ int64_t SrsKbps::get_recv_bytes() | @@ -203,20 +203,29 @@ int64_t SrsKbps::get_recv_bytes() | ||
203 | return is.get_total_bytes(); | 203 | return is.get_total_bytes(); |
204 | } | 204 | } |
205 | 205 | ||
206 | +void SrsKbps::resample() | ||
207 | +{ | ||
208 | + sample(); | ||
209 | +} | ||
210 | + | ||
206 | int64_t SrsKbps::get_send_bytes_delta() | 211 | int64_t SrsKbps::get_send_bytes_delta() |
207 | { | 212 | { |
208 | int64_t delta = os.get_total_bytes() - os.delta_bytes; | 213 | int64_t delta = os.get_total_bytes() - os.delta_bytes; |
209 | - os.delta_bytes = os.get_total_bytes(); | ||
210 | return delta; | 214 | return delta; |
211 | } | 215 | } |
212 | 216 | ||
213 | int64_t SrsKbps::get_recv_bytes_delta() | 217 | int64_t SrsKbps::get_recv_bytes_delta() |
214 | { | 218 | { |
215 | int64_t delta = is.get_total_bytes() - is.delta_bytes; | 219 | int64_t delta = is.get_total_bytes() - is.delta_bytes; |
216 | - is.delta_bytes = is.get_total_bytes(); | ||
217 | return delta; | 220 | return delta; |
218 | } | 221 | } |
219 | 222 | ||
223 | +void SrsKbps::cleanup() | ||
224 | +{ | ||
225 | + os.delta_bytes = os.get_total_bytes(); | ||
226 | + is.delta_bytes = is.get_total_bytes(); | ||
227 | +} | ||
228 | + | ||
220 | void SrsKbps::add_delta(IKbpsDelta* delta) | 229 | void SrsKbps::add_delta(IKbpsDelta* delta) |
221 | { | 230 | { |
222 | srs_assert(delta); | 231 | srs_assert(delta); |
@@ -107,6 +107,11 @@ public: | @@ -107,6 +107,11 @@ public: | ||
107 | 107 | ||
108 | /** | 108 | /** |
109 | * the interface which provices delta of bytes. | 109 | * the interface which provices delta of bytes. |
110 | +* for a delta, for example, a live stream connection, we can got the delta by: | ||
111 | +* IKbpsDelta* delta = ...; | ||
112 | +* delta->resample(); | ||
113 | +* kbps->add_delta(delta); | ||
114 | +* delta->cleanup(); | ||
110 | */ | 115 | */ |
111 | class IKbpsDelta | 116 | class IKbpsDelta |
112 | { | 117 | { |
@@ -114,8 +119,19 @@ public: | @@ -114,8 +119,19 @@ public: | ||
114 | IKbpsDelta(); | 119 | IKbpsDelta(); |
115 | virtual ~IKbpsDelta(); | 120 | virtual ~IKbpsDelta(); |
116 | public: | 121 | public: |
122 | + /** | ||
123 | + * resample to generate the value of delta bytes. | ||
124 | + */ | ||
125 | + virtual void resample() = 0; | ||
126 | + /** | ||
127 | + * get the send or recv bytes delta. | ||
128 | + */ | ||
117 | virtual int64_t get_send_bytes_delta() = 0; | 129 | virtual int64_t get_send_bytes_delta() = 0; |
118 | virtual int64_t get_recv_bytes_delta() = 0; | 130 | virtual int64_t get_recv_bytes_delta() = 0; |
131 | + /** | ||
132 | + * cleanup the value of delta bytes. | ||
133 | + */ | ||
134 | + virtual void cleanup() = 0; | ||
119 | }; | 135 | }; |
120 | 136 | ||
121 | /** | 137 | /** |
@@ -123,16 +139,21 @@ public: | @@ -123,16 +139,21 @@ public: | ||
123 | * itself can be a statistic source, for example, used for SRS bytes stat. | 139 | * itself can be a statistic source, for example, used for SRS bytes stat. |
124 | * there are two usage scenarios: | 140 | * there are two usage scenarios: |
125 | * 1. connections to calc kbps by sample(): | 141 | * 1. connections to calc kbps by sample(): |
126 | -* set_io(in, out) | ||
127 | -* sample() | ||
128 | -* get_xxx_kbps(). | 142 | +* SrsKbps* kbps = ...; |
143 | +* kbps->set_io(in, out) | ||
144 | +* kbps->sample() | ||
145 | +* kbps->get_xxx_kbps(). | ||
129 | * the connections know how many bytes already send/recv. | 146 | * the connections know how many bytes already send/recv. |
130 | * 2. server to calc kbps by add_delta(): | 147 | * 2. server to calc kbps by add_delta(): |
131 | -* set_io(NULL, NULL) | 148 | +* SrsKbps* kbps = ...; |
149 | +* kbps->set_io(NULL, NULL) | ||
132 | * for each connection in connections: | 150 | * for each connection in connections: |
133 | -* add_delta(connections) // where connection is a IKbpsDelta* | ||
134 | -* sample() | ||
135 | -* get_xxx_kbps(). | 151 | +* IKbpsDelta* delta = connection; // where connection implements IKbpsDelta |
152 | +* delta->resample() | ||
153 | +* kbps->add_delta(delta) | ||
154 | +* delta->cleanup() | ||
155 | +* kbps->sample() | ||
156 | +* kbps->get_xxx_kbps(). | ||
136 | * the server never know how many bytes already send/recv, for the connection maybe closed. | 157 | * the server never know how many bytes already send/recv, for the connection maybe closed. |
137 | */ | 158 | */ |
138 | class SrsKbps : public virtual ISrsProtocolStatistic, public virtual IKbpsDelta | 159 | class SrsKbps : public virtual ISrsProtocolStatistic, public virtual IKbpsDelta |
@@ -174,18 +195,26 @@ public: | @@ -174,18 +195,26 @@ public: | ||
174 | */ | 195 | */ |
175 | virtual int64_t get_send_bytes(); | 196 | virtual int64_t get_send_bytes(); |
176 | virtual int64_t get_recv_bytes(); | 197 | virtual int64_t get_recv_bytes(); |
198 | +public: | ||
199 | + /** | ||
200 | + * resample to get the delta. | ||
201 | + */ | ||
202 | + virtual void resample(); | ||
177 | /** | 203 | /** |
178 | * get the delta of send/recv bytes. | 204 | * get the delta of send/recv bytes. |
179 | - * @remark, used for add_delta to calc the total system bytes/kbps. | ||
180 | */ | 205 | */ |
181 | virtual int64_t get_send_bytes_delta(); | 206 | virtual int64_t get_send_bytes_delta(); |
182 | virtual int64_t get_recv_bytes_delta(); | 207 | virtual int64_t get_recv_bytes_delta(); |
208 | + /** | ||
209 | + * cleanup the delta. | ||
210 | + */ | ||
211 | + virtual void cleanup(); | ||
183 | public: | 212 | public: |
184 | /** | 213 | /** |
185 | * add delta to kbps clac mechenism. | 214 | * add delta to kbps clac mechenism. |
186 | * we donot know the total bytes, but know the delta, for instance, | 215 | * we donot know the total bytes, but know the delta, for instance, |
187 | * for rtmp server to calc total bytes and kbps. | 216 | * for rtmp server to calc total bytes and kbps. |
188 | - * @remark user must invoke sample() when invoke this method. | 217 | + * @remark user must invoke sample() to calc result after invoke this method. |
189 | * @param delta, assert should never be NULL. | 218 | * @param delta, assert should never be NULL. |
190 | */ | 219 | */ |
191 | virtual void add_delta(IKbpsDelta* delta); | 220 | virtual void add_delta(IKbpsDelta* delta); |
@@ -110,11 +110,6 @@ SrsRtmpConn::~SrsRtmpConn() | @@ -110,11 +110,6 @@ SrsRtmpConn::~SrsRtmpConn() | ||
110 | srs_freep(kbps); | 110 | srs_freep(kbps); |
111 | } | 111 | } |
112 | 112 | ||
113 | -void SrsRtmpConn::kbps_resample() | ||
114 | -{ | ||
115 | - kbps->sample(); | ||
116 | -} | ||
117 | - | ||
118 | // TODO: return detail message when error for client. | 113 | // TODO: return detail message when error for client. |
119 | int SrsRtmpConn::do_cycle() | 114 | int SrsRtmpConn::do_cycle() |
120 | { | 115 | { |
@@ -255,6 +250,11 @@ int SrsRtmpConn::on_reload_vhost_realtime(string vhost) | @@ -255,6 +250,11 @@ int SrsRtmpConn::on_reload_vhost_realtime(string vhost) | ||
255 | return ret; | 250 | return ret; |
256 | } | 251 | } |
257 | 252 | ||
253 | +void SrsRtmpConn::resample() | ||
254 | +{ | ||
255 | + kbps->resample(); | ||
256 | +} | ||
257 | + | ||
258 | int64_t SrsRtmpConn::get_send_bytes_delta() | 258 | int64_t SrsRtmpConn::get_send_bytes_delta() |
259 | { | 259 | { |
260 | return kbps->get_send_bytes_delta(); | 260 | return kbps->get_send_bytes_delta(); |
@@ -264,6 +264,11 @@ int64_t SrsRtmpConn::get_recv_bytes_delta() | @@ -264,6 +264,11 @@ int64_t SrsRtmpConn::get_recv_bytes_delta() | ||
264 | { | 264 | { |
265 | return kbps->get_recv_bytes_delta(); | 265 | return kbps->get_recv_bytes_delta(); |
266 | } | 266 | } |
267 | + | ||
268 | +void SrsRtmpConn::cleanup() | ||
269 | +{ | ||
270 | + kbps->cleanup(); | ||
271 | +} | ||
267 | 272 | ||
268 | int SrsRtmpConn::service_cycle() | 273 | int SrsRtmpConn::service_cycle() |
269 | { | 274 | { |
@@ -83,8 +83,6 @@ private: | @@ -83,8 +83,6 @@ private: | ||
83 | public: | 83 | public: |
84 | SrsRtmpConn(SrsServer* srs_server, st_netfd_t client_stfd); | 84 | SrsRtmpConn(SrsServer* srs_server, st_netfd_t client_stfd); |
85 | virtual ~SrsRtmpConn(); | 85 | virtual ~SrsRtmpConn(); |
86 | -public: | ||
87 | - virtual void kbps_resample(); | ||
88 | protected: | 86 | protected: |
89 | virtual int do_cycle(); | 87 | virtual int do_cycle(); |
90 | // interface ISrsReloadHandler | 88 | // interface ISrsReloadHandler |
@@ -94,8 +92,10 @@ public: | @@ -94,8 +92,10 @@ public: | ||
94 | virtual int on_reload_vhost_realtime(std::string vhost); | 92 | virtual int on_reload_vhost_realtime(std::string vhost); |
95 | // interface IKbpsDelta | 93 | // interface IKbpsDelta |
96 | public: | 94 | public: |
95 | + virtual void resample(); | ||
97 | virtual int64_t get_send_bytes_delta(); | 96 | virtual int64_t get_send_bytes_delta(); |
98 | virtual int64_t get_recv_bytes_delta(); | 97 | virtual int64_t get_recv_bytes_delta(); |
98 | + virtual void cleanup(); | ||
99 | private: | 99 | private: |
100 | // when valid and connected to vhost/app, service the client. | 100 | // when valid and connected to vhost/app, service the client. |
101 | virtual int service_cycle(); | 101 | virtual int service_cycle(); |
@@ -45,6 +45,7 @@ using namespace std; | @@ -45,6 +45,7 @@ using namespace std; | ||
45 | #include <srs_app_heartbeat.hpp> | 45 | #include <srs_app_heartbeat.hpp> |
46 | #include <srs_app_mpegts_udp.hpp> | 46 | #include <srs_app_mpegts_udp.hpp> |
47 | #include <srs_app_rtsp.hpp> | 47 | #include <srs_app_rtsp.hpp> |
48 | +#include <srs_app_statistic.hpp> | ||
48 | 49 | ||
49 | // signal defines. | 50 | // signal defines. |
50 | #define SIGNAL_RELOAD SIGHUP | 51 | #define SIGNAL_RELOAD SIGHUP |
@@ -392,7 +393,6 @@ SrsServer::SrsServer() | @@ -392,7 +393,6 @@ SrsServer::SrsServer() | ||
392 | pid_fd = -1; | 393 | pid_fd = -1; |
393 | 394 | ||
394 | signal_manager = NULL; | 395 | signal_manager = NULL; |
395 | - kbps = NULL; | ||
396 | 396 | ||
397 | // donot new object in constructor, | 397 | // donot new object in constructor, |
398 | // for some global instance is not ready now, | 398 | // for some global instance is not ready now, |
@@ -452,7 +452,6 @@ void SrsServer::destroy() | @@ -452,7 +452,6 @@ void SrsServer::destroy() | ||
452 | } | 452 | } |
453 | 453 | ||
454 | srs_freep(signal_manager); | 454 | srs_freep(signal_manager); |
455 | - srs_freep(kbps); | ||
456 | 455 | ||
457 | // @remark never destroy the connections, | 456 | // @remark never destroy the connections, |
458 | // for it's still alive. | 457 | // for it's still alive. |
@@ -478,10 +477,6 @@ int SrsServer::initialize() | @@ -478,10 +477,6 @@ int SrsServer::initialize() | ||
478 | srs_assert(!signal_manager); | 477 | srs_assert(!signal_manager); |
479 | signal_manager = new SrsSignalManager(this); | 478 | signal_manager = new SrsSignalManager(this); |
480 | 479 | ||
481 | - srs_assert(!kbps); | ||
482 | - kbps = new SrsKbps(); | ||
483 | - kbps->set_io(NULL, NULL); | ||
484 | - | ||
485 | #ifdef SRS_AUTO_HTTP_API | 480 | #ifdef SRS_AUTO_HTTP_API |
486 | if ((ret = http_api_mux->initialize()) != ERROR_SUCCESS) { | 481 | if ((ret = http_api_mux->initialize()) != ERROR_SUCCESS) { |
487 | return ret; | 482 | return ret; |
@@ -745,12 +740,8 @@ void SrsServer::remove(SrsConnection* conn) | @@ -745,12 +740,8 @@ void SrsServer::remove(SrsConnection* conn) | ||
745 | 740 | ||
746 | srs_info("conn removed. conns=%d", (int)conns.size()); | 741 | srs_info("conn removed. conns=%d", (int)conns.size()); |
747 | 742 | ||
748 | - // resample the kbps to collect the delta. | ||
749 | - conn->kbps_resample(); | ||
750 | - | ||
751 | - // add delta of connection to server kbps., | ||
752 | - // for next sample() of server kbps can get the stat. | ||
753 | - kbps->add_delta(conn); | 743 | + SrsStatistic* stat = SrsStatistic::instance(); |
744 | + stat->kbps_add_delta(conn); | ||
754 | 745 | ||
755 | // all connections are created by server, | 746 | // all connections are created by server, |
756 | // so we free it here. | 747 | // so we free it here. |
@@ -868,7 +859,6 @@ int SrsServer::do_cycle() | @@ -868,7 +859,6 @@ int SrsServer::do_cycle() | ||
868 | if ((i % SRS_SYS_NETWORK_RTMP_SERVER_RESOLUTION_TIMES) == 0) { | 859 | if ((i % SRS_SYS_NETWORK_RTMP_SERVER_RESOLUTION_TIMES) == 0) { |
869 | srs_info("update network server kbps info."); | 860 | srs_info("update network server kbps info."); |
870 | resample_kbps(); | 861 | resample_kbps(); |
871 | - srs_update_rtmp_server((int)conns.size(), kbps); | ||
872 | } | 862 | } |
873 | #ifdef SRS_AUTO_HTTP_PARSER | 863 | #ifdef SRS_AUTO_HTTP_PARSER |
874 | if (_srs_config->get_heartbeat_enabled()) { | 864 | if (_srs_config->get_heartbeat_enabled()) { |
@@ -1019,22 +1009,23 @@ void SrsServer::close_listeners(SrsListenerType type) | @@ -1019,22 +1009,23 @@ void SrsServer::close_listeners(SrsListenerType type) | ||
1019 | 1009 | ||
1020 | void SrsServer::resample_kbps() | 1010 | void SrsServer::resample_kbps() |
1021 | { | 1011 | { |
1012 | + SrsStatistic* stat = SrsStatistic::instance(); | ||
1013 | + | ||
1022 | // collect delta from all clients. | 1014 | // collect delta from all clients. |
1023 | for (std::vector<SrsConnection*>::iterator it = conns.begin(); it != conns.end(); ++it) { | 1015 | for (std::vector<SrsConnection*>::iterator it = conns.begin(); it != conns.end(); ++it) { |
1024 | SrsConnection* conn = *it; | 1016 | SrsConnection* conn = *it; |
1025 | - | ||
1026 | - // resample the kbps to collect the delta. | ||
1027 | - conn->kbps_resample(); | ||
1028 | 1017 | ||
1029 | // add delta of connection to server kbps., | 1018 | // add delta of connection to server kbps., |
1030 | // for next sample() of server kbps can get the stat. | 1019 | // for next sample() of server kbps can get the stat. |
1031 | - kbps->add_delta(conn); | 1020 | + stat->kbps_add_delta(conn); |
1032 | } | 1021 | } |
1033 | 1022 | ||
1034 | // TODO: FXME: support all other connections. | 1023 | // TODO: FXME: support all other connections. |
1035 | 1024 | ||
1036 | // sample the kbps, get the stat. | 1025 | // sample the kbps, get the stat. |
1037 | - kbps->sample(); | 1026 | + SrsKbps* kbps = stat->kbps_sample(); |
1027 | + | ||
1028 | + srs_update_rtmp_server((int)conns.size(), kbps); | ||
1038 | } | 1029 | } |
1039 | 1030 | ||
1040 | int SrsServer::accept_client(SrsListenerType type, st_netfd_t client_stfd) | 1031 | int SrsServer::accept_client(SrsListenerType type, st_netfd_t client_stfd) |
@@ -210,10 +210,6 @@ private: | @@ -210,10 +210,6 @@ private: | ||
210 | */ | 210 | */ |
211 | SrsSignalManager* signal_manager; | 211 | SrsSignalManager* signal_manager; |
212 | /** | 212 | /** |
213 | - * server total kbps. | ||
214 | - */ | ||
215 | - SrsKbps* kbps; | ||
216 | - /** | ||
217 | * user send the signal, convert to variable. | 213 | * user send the signal, convert to variable. |
218 | */ | 214 | */ |
219 | bool signal_reload; | 215 | bool signal_reload; |
@@ -29,6 +29,8 @@ using namespace std; | @@ -29,6 +29,8 @@ using namespace std; | ||
29 | 29 | ||
30 | #include <srs_rtmp_sdk.hpp> | 30 | #include <srs_rtmp_sdk.hpp> |
31 | #include <srs_app_json.hpp> | 31 | #include <srs_app_json.hpp> |
32 | +#include <srs_app_kbps.hpp> | ||
33 | +#include <srs_app_conn.hpp> | ||
32 | 34 | ||
33 | int64_t __srs_gvid = getpid(); | 35 | int64_t __srs_gvid = getpid(); |
34 | 36 | ||
@@ -40,10 +42,14 @@ int64_t __srs_generate_id() | @@ -40,10 +42,14 @@ int64_t __srs_generate_id() | ||
40 | SrsStatisticVhost::SrsStatisticVhost() | 42 | SrsStatisticVhost::SrsStatisticVhost() |
41 | { | 43 | { |
42 | id = __srs_generate_id(); | 44 | id = __srs_generate_id(); |
45 | + | ||
46 | + kbps = new SrsKbps(); | ||
47 | + kbps->set_io(NULL, NULL); | ||
43 | } | 48 | } |
44 | 49 | ||
45 | SrsStatisticVhost::~SrsStatisticVhost() | 50 | SrsStatisticVhost::~SrsStatisticVhost() |
46 | { | 51 | { |
52 | + srs_freep(kbps); | ||
47 | } | 53 | } |
48 | 54 | ||
49 | SrsStatisticStream::SrsStatisticStream() | 55 | SrsStatisticStream::SrsStatisticStream() |
@@ -61,10 +67,14 @@ SrsStatisticStream::SrsStatisticStream() | @@ -61,10 +67,14 @@ SrsStatisticStream::SrsStatisticStream() | ||
61 | asample_rate = SrsCodecAudioSampleRateReserved; | 67 | asample_rate = SrsCodecAudioSampleRateReserved; |
62 | asound_type = SrsCodecAudioSoundTypeReserved; | 68 | asound_type = SrsCodecAudioSoundTypeReserved; |
63 | aac_object = SrsAacObjectTypeReserved; | 69 | aac_object = SrsAacObjectTypeReserved; |
70 | + | ||
71 | + kbps = new SrsKbps(); | ||
72 | + kbps->set_io(NULL, NULL); | ||
64 | } | 73 | } |
65 | 74 | ||
66 | SrsStatisticStream::~SrsStatisticStream() | 75 | SrsStatisticStream::~SrsStatisticStream() |
67 | { | 76 | { |
77 | + srs_freep(kbps); | ||
68 | } | 78 | } |
69 | 79 | ||
70 | void SrsStatisticStream::close() | 80 | void SrsStatisticStream::close() |
@@ -78,10 +88,15 @@ SrsStatistic* SrsStatistic::_instance = new SrsStatistic(); | @@ -78,10 +88,15 @@ SrsStatistic* SrsStatistic::_instance = new SrsStatistic(); | ||
78 | SrsStatistic::SrsStatistic() | 88 | SrsStatistic::SrsStatistic() |
79 | { | 89 | { |
80 | _server_id = __srs_generate_id(); | 90 | _server_id = __srs_generate_id(); |
91 | + | ||
92 | + kbps = new SrsKbps(); | ||
93 | + kbps->set_io(NULL, NULL); | ||
81 | } | 94 | } |
82 | 95 | ||
83 | SrsStatistic::~SrsStatistic() | 96 | SrsStatistic::~SrsStatistic() |
84 | { | 97 | { |
98 | + srs_freep(kbps); | ||
99 | + | ||
85 | if (true) { | 100 | if (true) { |
86 | std::map<std::string, SrsStatisticVhost*>::iterator it; | 101 | std::map<std::string, SrsStatisticVhost*>::iterator it; |
87 | for (it = vhosts.begin(); it != vhosts.end(); it++) { | 102 | for (it = vhosts.begin(); it != vhosts.end(); it++) { |
@@ -183,6 +198,49 @@ void SrsStatistic::on_disconnect(int id) | @@ -183,6 +198,49 @@ void SrsStatistic::on_disconnect(int id) | ||
183 | } | 198 | } |
184 | } | 199 | } |
185 | 200 | ||
201 | +void SrsStatistic::kbps_add_delta(SrsConnection* conn) | ||
202 | +{ | ||
203 | + int id = conn->srs_id(); | ||
204 | + if (clients.find(id) == clients.end()) { | ||
205 | + return; | ||
206 | + } | ||
207 | + | ||
208 | + SrsStatisticClient* client = clients[id]; | ||
209 | + | ||
210 | + // resample the kbps to collect the delta. | ||
211 | + conn->resample(); | ||
212 | + | ||
213 | + // add delta of connection to kbps. | ||
214 | + // for next sample() of server kbps can get the stat. | ||
215 | + kbps->add_delta(conn); | ||
216 | + client->stream->kbps->add_delta(conn); | ||
217 | + client->stream->vhost->kbps->add_delta(conn); | ||
218 | + | ||
219 | + // cleanup the delta. | ||
220 | + conn->cleanup(); | ||
221 | +} | ||
222 | + | ||
223 | +SrsKbps* SrsStatistic::kbps_sample() | ||
224 | +{ | ||
225 | + kbps->sample(); | ||
226 | + if (true) { | ||
227 | + std::map<std::string, SrsStatisticVhost*>::iterator it; | ||
228 | + for (it = vhosts.begin(); it != vhosts.end(); it++) { | ||
229 | + SrsStatisticVhost* vhost = it->second; | ||
230 | + vhost->kbps->sample(); | ||
231 | + } | ||
232 | + } | ||
233 | + if (true) { | ||
234 | + std::map<std::string, SrsStatisticStream*>::iterator it; | ||
235 | + for (it = streams.begin(); it != streams.end(); it++) { | ||
236 | + SrsStatisticStream* stream = it->second; | ||
237 | + stream->kbps->sample(); | ||
238 | + } | ||
239 | + } | ||
240 | + | ||
241 | + return kbps; | ||
242 | +} | ||
243 | + | ||
186 | int64_t SrsStatistic::server_id() | 244 | int64_t SrsStatistic::server_id() |
187 | { | 245 | { |
188 | return _server_id; | 246 | return _server_id; |
@@ -202,7 +260,9 @@ int SrsStatistic::dumps_vhosts(stringstream& ss) | @@ -202,7 +260,9 @@ int SrsStatistic::dumps_vhosts(stringstream& ss) | ||
202 | 260 | ||
203 | ss << __SRS_JOBJECT_START | 261 | ss << __SRS_JOBJECT_START |
204 | << __SRS_JFIELD_ORG("id", vhost->id) << __SRS_JFIELD_CONT | 262 | << __SRS_JFIELD_ORG("id", vhost->id) << __SRS_JFIELD_CONT |
205 | - << __SRS_JFIELD_STR("name", vhost->vhost) | 263 | + << __SRS_JFIELD_STR("name", vhost->vhost) << __SRS_JFIELD_CONT |
264 | + << __SRS_JFIELD_ORG("send_bytes", vhost->kbps->get_send_bytes()) << __SRS_JFIELD_CONT | ||
265 | + << __SRS_JFIELD_ORG("recv_bytes", vhost->kbps->get_recv_bytes()) | ||
206 | << __SRS_JOBJECT_END; | 266 | << __SRS_JOBJECT_END; |
207 | } | 267 | } |
208 | ss << __SRS_JARRAY_END; | 268 | ss << __SRS_JARRAY_END; |
@@ -235,7 +295,9 @@ int SrsStatistic::dumps_streams(stringstream& ss) | @@ -235,7 +295,9 @@ int SrsStatistic::dumps_streams(stringstream& ss) | ||
235 | << __SRS_JFIELD_ORG("id", stream->id) << __SRS_JFIELD_CONT | 295 | << __SRS_JFIELD_ORG("id", stream->id) << __SRS_JFIELD_CONT |
236 | << __SRS_JFIELD_STR("name", stream->stream) << __SRS_JFIELD_CONT | 296 | << __SRS_JFIELD_STR("name", stream->stream) << __SRS_JFIELD_CONT |
237 | << __SRS_JFIELD_ORG("vhost", stream->vhost->id) << __SRS_JFIELD_CONT | 297 | << __SRS_JFIELD_ORG("vhost", stream->vhost->id) << __SRS_JFIELD_CONT |
238 | - << __SRS_JFIELD_ORG("clients", client_num) << __SRS_JFIELD_CONT; | 298 | + << __SRS_JFIELD_ORG("clients", client_num) << __SRS_JFIELD_CONT |
299 | + << __SRS_JFIELD_ORG("send_bytes", stream->kbps->get_send_bytes()) << __SRS_JFIELD_CONT | ||
300 | + << __SRS_JFIELD_ORG("recv_bytes", stream->kbps->get_recv_bytes()) << __SRS_JFIELD_CONT; | ||
239 | 301 | ||
240 | if (!stream->has_video) { | 302 | if (!stream->has_video) { |
241 | ss << __SRS_JFIELD_NULL("video") << __SRS_JFIELD_CONT; | 303 | ss << __SRS_JFIELD_NULL("video") << __SRS_JFIELD_CONT; |
@@ -35,7 +35,9 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | @@ -35,7 +35,9 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
35 | 35 | ||
36 | #include <srs_kernel_codec.hpp> | 36 | #include <srs_kernel_codec.hpp> |
37 | 37 | ||
38 | +class SrsKbps; | ||
38 | class SrsRequest; | 39 | class SrsRequest; |
40 | +class SrsConnection; | ||
39 | 41 | ||
40 | struct SrsStatisticVhost | 42 | struct SrsStatisticVhost |
41 | { | 43 | { |
@@ -43,6 +45,11 @@ public: | @@ -43,6 +45,11 @@ public: | ||
43 | int64_t id; | 45 | int64_t id; |
44 | std::string vhost; | 46 | std::string vhost; |
45 | public: | 47 | public: |
48 | + /** | ||
49 | + * vhost total kbps. | ||
50 | + */ | ||
51 | + SrsKbps* kbps; | ||
52 | +public: | ||
46 | SrsStatisticVhost(); | 53 | SrsStatisticVhost(); |
47 | virtual ~SrsStatisticVhost(); | 54 | virtual ~SrsStatisticVhost(); |
48 | }; | 55 | }; |
@@ -56,6 +63,11 @@ public: | @@ -56,6 +63,11 @@ public: | ||
56 | std::string stream; | 63 | std::string stream; |
57 | std::string url; | 64 | std::string url; |
58 | public: | 65 | public: |
66 | + /** | ||
67 | + * stream total kbps. | ||
68 | + */ | ||
69 | + SrsKbps* kbps; | ||
70 | +public: | ||
59 | bool has_video; | 71 | bool has_video; |
60 | SrsCodecVideo vcodec; | 72 | SrsCodecVideo vcodec; |
61 | // profile_idc, H.264-AVC-ISO_IEC_14496-10.pdf, page 45. | 73 | // profile_idc, H.264-AVC-ISO_IEC_14496-10.pdf, page 45. |
@@ -103,6 +115,8 @@ private: | @@ -103,6 +115,8 @@ private: | ||
103 | std::map<std::string, SrsStatisticStream*> streams; | 115 | std::map<std::string, SrsStatisticStream*> streams; |
104 | // key: client id, value: stream object. | 116 | // key: client id, value: stream object. |
105 | std::map<int, SrsStatisticClient*> clients; | 117 | std::map<int, SrsStatisticClient*> clients; |
118 | + // server total kbps. | ||
119 | + SrsKbps* kbps; | ||
106 | private: | 120 | private: |
107 | SrsStatistic(); | 121 | SrsStatistic(); |
108 | virtual ~SrsStatistic(); | 122 | virtual ~SrsStatistic(); |
@@ -137,6 +151,16 @@ public: | @@ -137,6 +151,16 @@ public: | ||
137 | * client disconnect | 151 | * client disconnect |
138 | */ | 152 | */ |
139 | virtual void on_disconnect(int id); | 153 | virtual void on_disconnect(int id); |
154 | + /** | ||
155 | + * sample the kbps, add delta bytes of conn. | ||
156 | + * use kbps_sample() to get all result of kbps stat. | ||
157 | + */ | ||
158 | + virtual void kbps_add_delta(SrsConnection* conn); | ||
159 | + /** | ||
160 | + * calc the result for all kbps. | ||
161 | + * @return the server kbps. | ||
162 | + */ | ||
163 | + virtual SrsKbps* kbps_sample(); | ||
140 | public: | 164 | public: |
141 | /** | 165 | /** |
142 | * get the server id, used to identify the server. | 166 | * get the server id, used to identify the server. |
@@ -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 135 | 34 | +#define VERSION_REVISION 136 |
35 | 35 | ||
36 | // server info. | 36 | // server info. |
37 | #define RTMP_SIG_SRS_KEY "SRS" | 37 | #define RTMP_SIG_SRS_KEY "SRS" |
@@ -39,7 +39,7 @@ string srs_codec_video2str(SrsCodecVideo codec) | @@ -39,7 +39,7 @@ string srs_codec_video2str(SrsCodecVideo codec) | ||
39 | return "H264"; | 39 | return "H264"; |
40 | case SrsCodecVideoOn2VP6: | 40 | case SrsCodecVideoOn2VP6: |
41 | case SrsCodecVideoOn2VP6WithAlphaChannel: | 41 | case SrsCodecVideoOn2VP6WithAlphaChannel: |
42 | - return "H264"; | 42 | + return "VP6"; |
43 | case SrsCodecVideoReserved: | 43 | case SrsCodecVideoReserved: |
44 | case SrsCodecVideoReserved1: | 44 | case SrsCodecVideoReserved1: |
45 | case SrsCodecVideoReserved2: | 45 | case SrsCodecVideoReserved2: |
-
请 注册 或 登录 后发表评论