正在显示
3 个修改的文件
包含
177 行增加
和
38 行删除
@@ -443,17 +443,45 @@ SrsGoApiVhosts::~SrsGoApiVhosts() | @@ -443,17 +443,45 @@ SrsGoApiVhosts::~SrsGoApiVhosts() | ||
443 | 443 | ||
444 | int SrsGoApiVhosts::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) | 444 | int SrsGoApiVhosts::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) |
445 | { | 445 | { |
446 | - std::stringstream data; | ||
447 | - SrsStatistic* stat = SrsStatistic::instance(); | ||
448 | - int ret = stat->dumps_vhosts(data); | 446 | + int ret = ERROR_SUCCESS; |
449 | 447 | ||
448 | + SrsStatistic* stat = SrsStatistic::instance(); | ||
450 | std::stringstream ss; | 449 | std::stringstream ss; |
451 | 450 | ||
452 | - ss << SRS_JOBJECT_START | ||
453 | - << SRS_JFIELD_ERROR(ret) << SRS_JFIELD_CONT | ||
454 | - << SRS_JFIELD_ORG("server", stat->server_id()) << SRS_JFIELD_CONT | ||
455 | - << SRS_JFIELD_ORG("vhosts", data.str()) | ||
456 | - << SRS_JOBJECT_END; | 451 | + // path: {pattern}{vhost_id} |
452 | + // e.g. /api/v1/vhosts/100 pattern= /api/v1/vhosts/, vhost_id=100 | ||
453 | + int vid = r->parse_rest_id(entry->pattern); | ||
454 | + SrsStatisticVhost* vhost = NULL; | ||
455 | + | ||
456 | + if (vid > 0 && (vhost = stat->find_vhost(vid)) == NULL) { | ||
457 | + ret = ERROR_RTMP_STREAM_NOT_FOUND; | ||
458 | + srs_error("vhost id=%d not found. ret=%d", vid, ret); | ||
459 | + return srs_http_response_code(w, ret); | ||
460 | + } | ||
461 | + | ||
462 | + if (r->is_http_get()) { | ||
463 | + std::stringstream data; | ||
464 | + | ||
465 | + if (!vhost) { | ||
466 | + ret = stat->dumps_vhosts(data); | ||
467 | + | ||
468 | + ss << SRS_JOBJECT_START | ||
469 | + << SRS_JFIELD_ERROR(ret) << SRS_JFIELD_CONT | ||
470 | + << SRS_JFIELD_ORG("server", stat->server_id()) << SRS_JFIELD_CONT | ||
471 | + << SRS_JFIELD_ORG("vhosts", data.str()) | ||
472 | + << SRS_JOBJECT_END; | ||
473 | + } else { | ||
474 | + ret = vhost->dumps(data); | ||
475 | + | ||
476 | + ss << SRS_JOBJECT_START | ||
477 | + << SRS_JFIELD_ERROR(ret) << SRS_JFIELD_CONT | ||
478 | + << SRS_JFIELD_ORG("server", stat->server_id()) << SRS_JFIELD_CONT | ||
479 | + << SRS_JFIELD_ORG("vhost", data.str()) | ||
480 | + << SRS_JOBJECT_END; | ||
481 | + } | ||
482 | + | ||
483 | + return srs_http_response_json(w, ss.str()); | ||
484 | + } | ||
457 | 485 | ||
458 | return srs_http_response_json(w, ss.str()); | 486 | return srs_http_response_json(w, ss.str()); |
459 | } | 487 | } |
@@ -553,8 +581,7 @@ int SrsGoApiClients::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) | @@ -553,8 +581,7 @@ int SrsGoApiClients::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) | ||
553 | int cid = r->parse_rest_id(entry->pattern); | 581 | int cid = r->parse_rest_id(entry->pattern); |
554 | 582 | ||
555 | SrsStatisticClient* client = NULL; | 583 | SrsStatisticClient* client = NULL; |
556 | - // TODO: FIXME: implements it. | ||
557 | - /*if (cid >= 0 && (client = stat->find_client(cid)) == NULL) { | 584 | + if (cid >= 0 && (client = stat->find_client(cid)) == NULL) { |
558 | ret = ERROR_RTMP_STREAM_NOT_FOUND; | 585 | ret = ERROR_RTMP_STREAM_NOT_FOUND; |
559 | srs_error("stream client_id=%d not found. ret=%d", cid, ret); | 586 | srs_error("stream client_id=%d not found. ret=%d", cid, ret); |
560 | 587 | ||
@@ -562,12 +589,32 @@ int SrsGoApiClients::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) | @@ -562,12 +589,32 @@ int SrsGoApiClients::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) | ||
562 | 589 | ||
563 | return srs_http_response_json(w, ss.str()); | 590 | return srs_http_response_json(w, ss.str()); |
564 | 591 | ||
565 | - }*/ | 592 | + } |
566 | 593 | ||
567 | if (r->is_http_get()) { | 594 | if (r->is_http_get()) { |
595 | + std::stringstream data; | ||
596 | + | ||
597 | + if (!client) { | ||
598 | + ret = stat->dumps_clients(data, 0, 10); | ||
599 | + | ||
600 | + ss << SRS_JOBJECT_START | ||
601 | + << SRS_JFIELD_ERROR(ret) << SRS_JFIELD_CONT | ||
602 | + << SRS_JFIELD_ORG("server", stat->server_id()) << SRS_JFIELD_CONT | ||
603 | + << SRS_JFIELD_ORG("clients", data.str()) | ||
604 | + << SRS_JOBJECT_END; | ||
605 | + } else { | ||
606 | + ret = client->dumps(data); | ||
607 | + | ||
608 | + ss << SRS_JOBJECT_START | ||
609 | + << SRS_JFIELD_ERROR(ret) << SRS_JFIELD_CONT | ||
610 | + << SRS_JFIELD_ORG("server", stat->server_id()) << SRS_JFIELD_CONT | ||
611 | + << SRS_JFIELD_ORG("client", data.str()) | ||
612 | + << SRS_JOBJECT_END; | ||
613 | + } | ||
568 | 614 | ||
615 | + return srs_http_response_json(w, ss.str()); | ||
569 | } | 616 | } |
570 | - | 617 | + |
571 | return ret; | 618 | return ret; |
572 | } | 619 | } |
573 | 620 |
@@ -62,11 +62,13 @@ int SrsStatisticVhost::dumps(stringstream& ss) | @@ -62,11 +62,13 @@ int SrsStatisticVhost::dumps(stringstream& ss) | ||
62 | 62 | ||
63 | // dumps the config of vhost. | 63 | // dumps the config of vhost. |
64 | bool hls_enabled = _srs_config->get_hls_enabled(vhost); | 64 | bool hls_enabled = _srs_config->get_hls_enabled(vhost); |
65 | + bool enabled = _srs_config->get_vhost_enabled(vhost); | ||
65 | 66 | ||
66 | ss << SRS_JOBJECT_START | 67 | ss << SRS_JOBJECT_START |
67 | << SRS_JFIELD_ORG("id", id) << SRS_JFIELD_CONT | 68 | << SRS_JFIELD_ORG("id", id) << SRS_JFIELD_CONT |
68 | << SRS_JFIELD_STR("name", vhost) << SRS_JFIELD_CONT | 69 | << SRS_JFIELD_STR("name", vhost) << SRS_JFIELD_CONT |
69 | - << SRS_JFIELD_ORG("cleints", nb_clients) << SRS_JFIELD_CONT | 70 | + << SRS_JFIELD_BOOL("enabled", enabled) << SRS_JFIELD_CONT |
71 | + << SRS_JFIELD_ORG("clients", nb_clients) << SRS_JFIELD_CONT | ||
70 | << SRS_JFIELD_ORG("send_bytes", kbps->get_send_bytes()) << SRS_JFIELD_CONT | 72 | << SRS_JFIELD_ORG("send_bytes", kbps->get_send_bytes()) << SRS_JFIELD_CONT |
71 | << SRS_JFIELD_ORG("recv_bytes", kbps->get_recv_bytes()) << SRS_JFIELD_CONT | 73 | << SRS_JFIELD_ORG("recv_bytes", kbps->get_recv_bytes()) << SRS_JFIELD_CONT |
72 | << SRS_JFIELD_NAME("hls") << SRS_JOBJECT_START | 74 | << SRS_JFIELD_NAME("hls") << SRS_JOBJECT_START |
@@ -163,6 +165,26 @@ void SrsStatisticStream::close() | @@ -163,6 +165,26 @@ void SrsStatisticStream::close() | ||
163 | status = STATISTIC_STREAM_STATUS_IDLING; | 165 | status = STATISTIC_STREAM_STATUS_IDLING; |
164 | } | 166 | } |
165 | 167 | ||
168 | +SrsStatisticClient::SrsStatisticClient() | ||
169 | +{ | ||
170 | + id = 0; | ||
171 | +} | ||
172 | + | ||
173 | +SrsStatisticClient::~SrsStatisticClient() | ||
174 | +{ | ||
175 | +} | ||
176 | + | ||
177 | +int SrsStatisticClient::dumps(stringstream& ss) | ||
178 | +{ | ||
179 | + int ret = ERROR_SUCCESS; | ||
180 | + | ||
181 | + ss << SRS_JOBJECT_START | ||
182 | + << SRS_JFIELD_ORG("id", id) | ||
183 | + << SRS_JOBJECT_END; | ||
184 | + | ||
185 | + return ret; | ||
186 | +} | ||
187 | + | ||
166 | SrsStatistic* SrsStatistic::_instance = new SrsStatistic(); | 188 | SrsStatistic* SrsStatistic::_instance = new SrsStatistic(); |
167 | 189 | ||
168 | SrsStatistic::SrsStatistic() | 190 | SrsStatistic::SrsStatistic() |
@@ -178,14 +200,14 @@ SrsStatistic::~SrsStatistic() | @@ -178,14 +200,14 @@ SrsStatistic::~SrsStatistic() | ||
178 | srs_freep(kbps); | 200 | srs_freep(kbps); |
179 | 201 | ||
180 | if (true) { | 202 | if (true) { |
181 | - std::map<std::string, SrsStatisticVhost*>::iterator it; | 203 | + std::map<int64_t, SrsStatisticVhost*>::iterator it; |
182 | for (it = vhosts.begin(); it != vhosts.end(); it++) { | 204 | for (it = vhosts.begin(); it != vhosts.end(); it++) { |
183 | SrsStatisticVhost* vhost = it->second; | 205 | SrsStatisticVhost* vhost = it->second; |
184 | srs_freep(vhost); | 206 | srs_freep(vhost); |
185 | } | 207 | } |
186 | } | 208 | } |
187 | if (true) { | 209 | if (true) { |
188 | - std::map<std::string, SrsStatisticStream*>::iterator it; | 210 | + std::map<int64_t, SrsStatisticStream*>::iterator it; |
189 | for (it = streams.begin(); it != streams.end(); it++) { | 211 | for (it = streams.begin(); it != streams.end(); it++) { |
190 | SrsStatisticStream* stream = it->second; | 212 | SrsStatisticStream* stream = it->second; |
191 | srs_freep(stream); | 213 | srs_freep(stream); |
@@ -198,6 +220,11 @@ SrsStatistic::~SrsStatistic() | @@ -198,6 +220,11 @@ SrsStatistic::~SrsStatistic() | ||
198 | srs_freep(client); | 220 | srs_freep(client); |
199 | } | 221 | } |
200 | } | 222 | } |
223 | + | ||
224 | + vhosts.clear(); | ||
225 | + rvhosts.clear(); | ||
226 | + streams.clear(); | ||
227 | + rstreams.clear(); | ||
201 | } | 228 | } |
202 | 229 | ||
203 | SrsStatistic* SrsStatistic::instance() | 230 | SrsStatistic* SrsStatistic::instance() |
@@ -205,16 +232,29 @@ SrsStatistic* SrsStatistic::instance() | @@ -205,16 +232,29 @@ SrsStatistic* SrsStatistic::instance() | ||
205 | return _instance; | 232 | return _instance; |
206 | } | 233 | } |
207 | 234 | ||
208 | -SrsStatisticStream* SrsStatistic::find_stream(int stream_id) | 235 | +SrsStatisticVhost* SrsStatistic::find_vhost(int vid) |
236 | +{ | ||
237 | + std::map<int64_t, SrsStatisticVhost*>::iterator it; | ||
238 | + if ((it = vhosts.find(vid)) != vhosts.end()) { | ||
239 | + return it->second; | ||
240 | + } | ||
241 | + return NULL; | ||
242 | +} | ||
243 | + | ||
244 | +SrsStatisticStream* SrsStatistic::find_stream(int sid) | ||
245 | +{ | ||
246 | + std::map<int64_t, SrsStatisticStream*>::iterator it; | ||
247 | + if ((it = streams.find(sid)) != streams.end()) { | ||
248 | + return it->second; | ||
249 | + } | ||
250 | + return NULL; | ||
251 | +} | ||
252 | + | ||
253 | +SrsStatisticClient* SrsStatistic::find_client(int cid) | ||
209 | { | 254 | { |
210 | std::map<int, SrsStatisticClient*>::iterator it; | 255 | std::map<int, SrsStatisticClient*>::iterator it; |
211 | - for (it = clients.begin(); it != clients.end(); it++) { | ||
212 | - SrsStatisticClient* client = it->second; | ||
213 | - SrsStatisticStream* stream = client->stream; | ||
214 | - | ||
215 | - if (stream_id == stream->id) { | ||
216 | - return stream; | ||
217 | - } | 256 | + if ((it = clients.find(cid)) != clients.end()) { |
257 | + return it->second; | ||
218 | } | 258 | } |
219 | return NULL; | 259 | return NULL; |
220 | } | 260 | } |
@@ -338,14 +378,14 @@ SrsKbps* SrsStatistic::kbps_sample() | @@ -338,14 +378,14 @@ SrsKbps* SrsStatistic::kbps_sample() | ||
338 | { | 378 | { |
339 | kbps->sample(); | 379 | kbps->sample(); |
340 | if (true) { | 380 | if (true) { |
341 | - std::map<std::string, SrsStatisticVhost*>::iterator it; | 381 | + std::map<int64_t, SrsStatisticVhost*>::iterator it; |
342 | for (it = vhosts.begin(); it != vhosts.end(); it++) { | 382 | for (it = vhosts.begin(); it != vhosts.end(); it++) { |
343 | SrsStatisticVhost* vhost = it->second; | 383 | SrsStatisticVhost* vhost = it->second; |
344 | vhost->kbps->sample(); | 384 | vhost->kbps->sample(); |
345 | } | 385 | } |
346 | } | 386 | } |
347 | if (true) { | 387 | if (true) { |
348 | - std::map<std::string, SrsStatisticStream*>::iterator it; | 388 | + std::map<int64_t, SrsStatisticStream*>::iterator it; |
349 | for (it = streams.begin(); it != streams.end(); it++) { | 389 | for (it = streams.begin(); it != streams.end(); it++) { |
350 | SrsStatisticStream* stream = it->second; | 390 | SrsStatisticStream* stream = it->second; |
351 | stream->kbps->sample(); | 391 | stream->kbps->sample(); |
@@ -365,7 +405,7 @@ int SrsStatistic::dumps_vhosts(stringstream& ss) | @@ -365,7 +405,7 @@ int SrsStatistic::dumps_vhosts(stringstream& ss) | ||
365 | int ret = ERROR_SUCCESS; | 405 | int ret = ERROR_SUCCESS; |
366 | 406 | ||
367 | ss << SRS_JARRAY_START; | 407 | ss << SRS_JARRAY_START; |
368 | - std::map<std::string, SrsStatisticVhost*>::iterator it; | 408 | + std::map<int64_t, SrsStatisticVhost*>::iterator it; |
369 | for (it = vhosts.begin(); it != vhosts.end(); it++) { | 409 | for (it = vhosts.begin(); it != vhosts.end(); it++) { |
370 | SrsStatisticVhost* vhost = it->second; | 410 | SrsStatisticVhost* vhost = it->second; |
371 | 411 | ||
@@ -387,7 +427,7 @@ int SrsStatistic::dumps_streams(stringstream& ss) | @@ -387,7 +427,7 @@ int SrsStatistic::dumps_streams(stringstream& ss) | ||
387 | int ret = ERROR_SUCCESS; | 427 | int ret = ERROR_SUCCESS; |
388 | 428 | ||
389 | ss << SRS_JARRAY_START; | 429 | ss << SRS_JARRAY_START; |
390 | - std::map<std::string, SrsStatisticStream*>::iterator it; | 430 | + std::map<int64_t, SrsStatisticStream*>::iterator it; |
391 | for (it = streams.begin(); it != streams.end(); it++) { | 431 | for (it = streams.begin(); it != streams.end(); it++) { |
392 | SrsStatisticStream* stream = it->second; | 432 | SrsStatisticStream* stream = it->second; |
393 | 433 | ||
@@ -404,19 +444,47 @@ int SrsStatistic::dumps_streams(stringstream& ss) | @@ -404,19 +444,47 @@ int SrsStatistic::dumps_streams(stringstream& ss) | ||
404 | return ret; | 444 | return ret; |
405 | } | 445 | } |
406 | 446 | ||
447 | +int SrsStatistic::dumps_clients(stringstream& ss, int start, int count) | ||
448 | +{ | ||
449 | + int ret = ERROR_SUCCESS; | ||
450 | + | ||
451 | + ss << SRS_JARRAY_START; | ||
452 | + std::map<int, SrsStatisticClient*>::iterator it = clients.begin(); | ||
453 | + for (int i = 0; i < count && it != clients.end(); it++) { | ||
454 | + if (i < start) { | ||
455 | + continue; | ||
456 | + } | ||
457 | + | ||
458 | + SrsStatisticClient* client = it->second; | ||
459 | + | ||
460 | + if (i != start) { | ||
461 | + ss << SRS_JFIELD_CONT; | ||
462 | + } | ||
463 | + | ||
464 | + if ((ret = client->dumps(ss)) != ERROR_SUCCESS) { | ||
465 | + return ret; | ||
466 | + } | ||
467 | + } | ||
468 | + ss << SRS_JARRAY_END; | ||
469 | + | ||
470 | + | ||
471 | + return ret; | ||
472 | +} | ||
473 | + | ||
407 | SrsStatisticVhost* SrsStatistic::create_vhost(SrsRequest* req) | 474 | SrsStatisticVhost* SrsStatistic::create_vhost(SrsRequest* req) |
408 | { | 475 | { |
409 | SrsStatisticVhost* vhost = NULL; | 476 | SrsStatisticVhost* vhost = NULL; |
410 | 477 | ||
411 | // create vhost if not exists. | 478 | // create vhost if not exists. |
412 | - if (vhosts.find(req->vhost) == vhosts.end()) { | 479 | + if (rvhosts.find(req->vhost) == rvhosts.end()) { |
413 | vhost = new SrsStatisticVhost(); | 480 | vhost = new SrsStatisticVhost(); |
414 | vhost->vhost = req->vhost; | 481 | vhost->vhost = req->vhost; |
415 | - vhosts[req->vhost] = vhost; | 482 | + rvhosts[req->vhost] = vhost; |
483 | + vhosts[vhost->id] = vhost; | ||
416 | return vhost; | 484 | return vhost; |
417 | } | 485 | } |
418 | 486 | ||
419 | - vhost = vhosts[req->vhost]; | 487 | + vhost = rvhosts[req->vhost]; |
420 | 488 | ||
421 | return vhost; | 489 | return vhost; |
422 | } | 490 | } |
@@ -428,17 +496,18 @@ SrsStatisticStream* SrsStatistic::create_stream(SrsStatisticVhost* vhost, SrsReq | @@ -428,17 +496,18 @@ SrsStatisticStream* SrsStatistic::create_stream(SrsStatisticVhost* vhost, SrsReq | ||
428 | SrsStatisticStream* stream = NULL; | 496 | SrsStatisticStream* stream = NULL; |
429 | 497 | ||
430 | // create stream if not exists. | 498 | // create stream if not exists. |
431 | - if (streams.find(url) == streams.end()) { | 499 | + if (rstreams.find(url) == rstreams.end()) { |
432 | stream = new SrsStatisticStream(); | 500 | stream = new SrsStatisticStream(); |
433 | stream->vhost = vhost; | 501 | stream->vhost = vhost; |
434 | stream->stream = req->stream; | 502 | stream->stream = req->stream; |
435 | stream->app = req->app; | 503 | stream->app = req->app; |
436 | stream->url = url; | 504 | stream->url = url; |
437 | - streams[url] = stream; | 505 | + rstreams[url] = stream; |
506 | + streams[stream->id] = stream; | ||
438 | return stream; | 507 | return stream; |
439 | } | 508 | } |
440 | 509 | ||
441 | - stream = streams[url]; | 510 | + stream = rstreams[url]; |
442 | 511 | ||
443 | return stream; | 512 | return stream; |
444 | } | 513 | } |
@@ -115,6 +115,11 @@ struct SrsStatisticClient | @@ -115,6 +115,11 @@ struct SrsStatisticClient | ||
115 | public: | 115 | public: |
116 | SrsStatisticStream* stream; | 116 | SrsStatisticStream* stream; |
117 | int id; | 117 | int id; |
118 | +public: | ||
119 | + SrsStatisticClient(); | ||
120 | + virtual ~SrsStatisticClient(); | ||
121 | +public: | ||
122 | + virtual int dumps(std::stringstream& ss); | ||
118 | }; | 123 | }; |
119 | 124 | ||
120 | class SrsStatistic | 125 | class SrsStatistic |
@@ -123,10 +128,19 @@ private: | @@ -123,10 +128,19 @@ private: | ||
123 | static SrsStatistic *_instance; | 128 | static SrsStatistic *_instance; |
124 | // the id to identify the sever. | 129 | // the id to identify the sever. |
125 | int64_t _server_id; | 130 | int64_t _server_id; |
126 | - // key: vhost name, value: vhost object. | ||
127 | - std::map<std::string, SrsStatisticVhost*> vhosts; | ||
128 | - // key: stream url, value: stream object. | ||
129 | - std::map<std::string, SrsStatisticStream*> streams; | 131 | +private: |
132 | + // key: vhost id, value: vhost object. | ||
133 | + std::map<int64_t, SrsStatisticVhost*> vhosts; | ||
134 | + // key: vhost url, value: vhost Object. | ||
135 | + // @remark a fast index for vhosts. | ||
136 | + std::map<std::string, SrsStatisticVhost*> rvhosts; | ||
137 | +private: | ||
138 | + // key: stream id, value: stream Object. | ||
139 | + std::map<int64_t, SrsStatisticStream*> streams; | ||
140 | + // key: stream url, value: stream Object. | ||
141 | + // @remark a fast index for streams. | ||
142 | + std::map<std::string, SrsStatisticStream*> rstreams; | ||
143 | +private: | ||
130 | // key: client id, value: stream object. | 144 | // key: client id, value: stream object. |
131 | std::map<int, SrsStatisticClient*> clients; | 145 | std::map<int, SrsStatisticClient*> clients; |
132 | // server total kbps. | 146 | // server total kbps. |
@@ -137,7 +151,10 @@ private: | @@ -137,7 +151,10 @@ private: | ||
137 | public: | 151 | public: |
138 | static SrsStatistic* instance(); | 152 | static SrsStatistic* instance(); |
139 | public: | 153 | public: |
140 | - virtual SrsStatisticStream* find_stream(int stream_id); | 154 | + virtual SrsStatisticVhost* find_vhost(int vid); |
155 | + virtual SrsStatisticStream* find_stream(int sid); | ||
156 | + virtual SrsStatisticClient* find_client(int cid); | ||
157 | +public: | ||
141 | /** | 158 | /** |
142 | * when got video info for stream. | 159 | * when got video info for stream. |
143 | */ | 160 | */ |
@@ -198,6 +215,12 @@ public: | @@ -198,6 +215,12 @@ public: | ||
198 | * dumps the streams to sstream in json. | 215 | * dumps the streams to sstream in json. |
199 | */ | 216 | */ |
200 | virtual int dumps_streams(std::stringstream& ss); | 217 | virtual int dumps_streams(std::stringstream& ss); |
218 | + /** | ||
219 | + * dumps the clients to sstream in json. | ||
220 | + * @param start the start index, from 0. | ||
221 | + * @param count the max count of clients to dump. | ||
222 | + */ | ||
223 | + virtual int dumps_clients(std::stringstream& ss, int start, int count); | ||
201 | private: | 224 | private: |
202 | virtual SrsStatisticVhost* create_vhost(SrsRequest* req); | 225 | virtual SrsStatisticVhost* create_vhost(SrsRequest* req); |
203 | virtual SrsStatisticStream* create_stream(SrsStatisticVhost* vhost, SrsRequest* req); | 226 | virtual SrsStatisticStream* create_stream(SrsStatisticVhost* vhost, SrsRequest* req); |
-
请 注册 或 登录 后发表评论