1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

merge from 2.0

This commit is contained in:
winlin 2015-09-14 12:24:57 +08:00
commit 3b483094bd
4 changed files with 183 additions and 96 deletions

View file

@ -1045,6 +1045,7 @@ Winlin
[bug #367]: https://github.com/simple-rtmp-server/srs/issues/367 [bug #367]: https://github.com/simple-rtmp-server/srs/issues/367
[bug #471]: https://github.com/simple-rtmp-server/srs/issues/471 [bug #471]: https://github.com/simple-rtmp-server/srs/issues/471
[bug #380]: https://github.com/simple-rtmp-server/srs/issues/380 [bug #380]: https://github.com/simple-rtmp-server/srs/issues/380
[bug #475]: https://github.com/simple-rtmp-server/srs/issues/475
[bug #454]: https://github.com/simple-rtmp-server/srs/issues/454 [bug #454]: https://github.com/simple-rtmp-server/srs/issues/454
[bug #442]: https://github.com/simple-rtmp-server/srs/issues/442 [bug #442]: https://github.com/simple-rtmp-server/srs/issues/442
[bug #169]: https://github.com/simple-rtmp-server/srs/issues/169 [bug #169]: https://github.com/simple-rtmp-server/srs/issues/169

View file

@ -512,22 +512,31 @@ int SrsDvrAsyncCallOnDvr::call()
int ret = ERROR_SUCCESS; int ret = ERROR_SUCCESS;
#ifdef SRS_AUTO_HTTP_CALLBACK #ifdef SRS_AUTO_HTTP_CALLBACK
// http callback for on_dvr in config. if (!_srs_config->get_vhost_http_hooks_enabled(req->vhost)) {
if (_srs_config->get_vhost_http_hooks_enabled(req->vhost)) { return ret;
// HTTP: on_dvr }
SrsConfDirective* on_dvr = _srs_config->get_vhost_on_dvr(req->vhost);
if (!on_dvr) { // the http hooks will cause context switch,
// so we must copy all hooks for the on_connect may freed.
// @see https://github.com/simple-rtmp-server/srs/issues/475
vector<string> hooks;
if (true) {
SrsConfDirective* conf = _srs_config->get_vhost_on_dvr(req->vhost);
if (!conf) {
srs_info("ignore the empty http callback: on_dvr"); srs_info("ignore the empty http callback: on_dvr");
return ret; return ret;
} }
std::string file = path; hooks = conf->args;
for (int i = 0; i < (int)on_dvr->args.size(); i++) { }
std::string url = on_dvr->args.at(i);
if ((ret = SrsHttpHooks::on_dvr(url, req, file)) != ERROR_SUCCESS) { for (int i = 0; i < (int)hooks.size(); i++) {
srs_error("hook client on_dvr failed. url=%s, ret=%d", url.c_str(), ret); std::string url = hooks.at(i);
return ret; if ((ret = SrsHttpHooks::on_dvr(url, req, path)) != ERROR_SUCCESS) {
} srs_error("hook client on_dvr failed. url=%s, ret=%d", url.c_str(), ret);
return ret;
} }
} }
#endif #endif

View file

@ -198,23 +198,31 @@ int SrsDvrAsyncCallOnHls::call()
int ret = ERROR_SUCCESS; int ret = ERROR_SUCCESS;
#ifdef SRS_AUTO_HTTP_CALLBACK #ifdef SRS_AUTO_HTTP_CALLBACK
// http callback for on_hls in config. if (!_srs_config->get_vhost_http_hooks_enabled(req->vhost)) {
if (_srs_config->get_vhost_http_hooks_enabled(req->vhost)) { return ret;
// HTTP: on_hls }
SrsConfDirective* on_hls = _srs_config->get_vhost_on_hls(req->vhost);
if (!on_hls) { // the http hooks will cause context switch,
// so we must copy all hooks for the on_connect may freed.
// @see https://github.com/simple-rtmp-server/srs/issues/475
vector<string> hooks;
if (true) {
SrsConfDirective* conf = _srs_config->get_vhost_on_hls(req->vhost);
if (!conf) {
srs_info("ignore the empty http callback: on_hls"); srs_info("ignore the empty http callback: on_hls");
return ret; return ret;
} }
std::string file = path; hooks = conf->args;
int sn = seq_no; }
for (int i = 0; i < (int)on_hls->args.size(); i++) {
std::string url = on_hls->args.at(i); for (int i = 0; i < (int)hooks.size(); i++) {
if ((ret = SrsHttpHooks::on_hls(url, req, file, ts_url, m3u8, m3u8_url, sn, duration)) != ERROR_SUCCESS) { std::string url = hooks.at(i);
srs_error("hook client on_hls failed. url=%s, ret=%d", url.c_str(), ret); if ((ret = SrsHttpHooks::on_hls(url, req, path, ts_url, m3u8, m3u8_url, seq_no, duration)) != ERROR_SUCCESS) {
return ret; srs_error("hook client on_hls failed. url=%s, ret=%d", url.c_str(), ret);
} return ret;
} }
} }
#endif #endif
@ -243,25 +251,31 @@ int SrsDvrAsyncCallOnHlsNotify::call()
int ret = ERROR_SUCCESS; int ret = ERROR_SUCCESS;
#ifdef SRS_AUTO_HTTP_CALLBACK #ifdef SRS_AUTO_HTTP_CALLBACK
// http callback for on_hls_notify in config. if (!_srs_config->get_vhost_http_hooks_enabled(req->vhost)) {
if (_srs_config->get_vhost_http_hooks_enabled(req->vhost)) { return ret;
// HTTP: on_hls }
SrsConfDirective* on_hls = _srs_config->get_vhost_on_hls_notify(req->vhost);
if (!on_hls) { // the http hooks will cause context switch,
// so we must copy all hooks for the on_connect may freed.
// @see https://github.com/simple-rtmp-server/srs/issues/475
vector<string> hooks;
if (true) {
SrsConfDirective* conf = _srs_config->get_vhost_on_hls_notify(req->vhost);
if (!conf) {
srs_info("ignore the empty http callback: on_hls_notify"); srs_info("ignore the empty http callback: on_hls_notify");
return ret; return ret;
} }
std::string url; hooks = conf->args;
if (true) { }
static u_int32_t nb_call = 0;
int index = nb_call++ % on_hls->args.size(); int nb_notify = _srs_config->get_vhost_hls_nb_notify(req->vhost);
url = on_hls->args.at(index); for (int i = 0; i < (int)hooks.size(); i++) {
} std::string url = hooks.at(i);
int nb_notify = _srs_config->get_vhost_hls_nb_notify(req->vhost);
if ((ret = SrsHttpHooks::on_hls_notify(url, req, ts_url, nb_notify)) != ERROR_SUCCESS) { if ((ret = SrsHttpHooks::on_hls_notify(url, req, ts_url, nb_notify)) != ERROR_SUCCESS) {
srs_error("hook client on_hls_notify failed. url=%s, ts=%s, ret=%d", url.c_str(), ts_url.c_str(), ret); srs_error("hook client on_hls_notify failed. url=%s, ret=%d", url.c_str(), ret);
return ret; return ret;
} }
} }

View file

@ -1304,20 +1304,31 @@ int SrsRtmpConn::http_hooks_on_connect()
int ret = ERROR_SUCCESS; int ret = ERROR_SUCCESS;
#ifdef SRS_AUTO_HTTP_CALLBACK #ifdef SRS_AUTO_HTTP_CALLBACK
if (_srs_config->get_vhost_http_hooks_enabled(req->vhost)) { if (!_srs_config->get_vhost_http_hooks_enabled(req->vhost)) {
// HTTP: on_connect return ret;
SrsConfDirective* on_connect = _srs_config->get_vhost_on_connect(req->vhost); }
if (!on_connect) {
// the http hooks will cause context switch,
// so we must copy all hooks for the on_connect may freed.
// @see https://github.com/simple-rtmp-server/srs/issues/475
vector<string> hooks;
if (true) {
SrsConfDirective* conf = _srs_config->get_vhost_on_connect(req->vhost);
if (!conf) {
srs_info("ignore the empty http callback: on_connect"); srs_info("ignore the empty http callback: on_connect");
return ret; return ret;
} }
for (int i = 0; i < (int)on_connect->args.size(); i++) { hooks = conf->args;
std::string url = on_connect->args.at(i); }
if ((ret = SrsHttpHooks::on_connect(url, req)) != ERROR_SUCCESS) {
srs_error("hook client on_connect failed. url=%s, ret=%d", url.c_str(), ret); for (int i = 0; i < (int)hooks.size(); i++) {
return ret; std::string url = hooks.at(i);
} if ((ret = SrsHttpHooks::on_connect(url, req)) != ERROR_SUCCESS) {
srs_error("hook client on_connect failed. url=%s, ret=%d", url.c_str(), ret);
return ret;
} }
} }
#endif #endif
@ -1328,19 +1339,29 @@ int SrsRtmpConn::http_hooks_on_connect()
void SrsRtmpConn::http_hooks_on_close() void SrsRtmpConn::http_hooks_on_close()
{ {
#ifdef SRS_AUTO_HTTP_CALLBACK #ifdef SRS_AUTO_HTTP_CALLBACK
if (_srs_config->get_vhost_http_hooks_enabled(req->vhost)) { if (!_srs_config->get_vhost_http_hooks_enabled(req->vhost)) {
// whatever the ret code, notify the api hooks. return;
// HTTP: on_close }
SrsConfDirective* on_close = _srs_config->get_vhost_on_close(req->vhost);
if (!on_close) { // the http hooks will cause context switch,
// so we must copy all hooks for the on_connect may freed.
// @see https://github.com/simple-rtmp-server/srs/issues/475
vector<string> hooks;
if (true) {
SrsConfDirective* conf = _srs_config->get_vhost_on_close(req->vhost);
if (!conf) {
srs_info("ignore the empty http callback: on_close"); srs_info("ignore the empty http callback: on_close");
return; return;
} }
for (int i = 0; i < (int)on_close->args.size(); i++) { hooks = conf->args;
std::string url = on_close->args.at(i); }
SrsHttpHooks::on_close(url, req, kbps->get_send_bytes(), kbps->get_recv_bytes());
} for (int i = 0; i < (int)hooks.size(); i++) {
std::string url = hooks.at(i);
SrsHttpHooks::on_close(url, req, kbps->get_send_bytes(), kbps->get_recv_bytes());
} }
#endif #endif
} }
@ -1350,20 +1371,31 @@ int SrsRtmpConn::http_hooks_on_publish()
int ret = ERROR_SUCCESS; int ret = ERROR_SUCCESS;
#ifdef SRS_AUTO_HTTP_CALLBACK #ifdef SRS_AUTO_HTTP_CALLBACK
if (_srs_config->get_vhost_http_hooks_enabled(req->vhost)) { if (!_srs_config->get_vhost_http_hooks_enabled(req->vhost)) {
// HTTP: on_publish return ret;
SrsConfDirective* on_publish = _srs_config->get_vhost_on_publish(req->vhost); }
if (!on_publish) {
// the http hooks will cause context switch,
// so we must copy all hooks for the on_connect may freed.
// @see https://github.com/simple-rtmp-server/srs/issues/475
vector<string> hooks;
if (true) {
SrsConfDirective* conf = _srs_config->get_vhost_on_publish(req->vhost);
if (!conf) {
srs_info("ignore the empty http callback: on_publish"); srs_info("ignore the empty http callback: on_publish");
return ret; return ret;
} }
for (int i = 0; i < (int)on_publish->args.size(); i++) { hooks = conf->args;
std::string url = on_publish->args.at(i); }
if ((ret = SrsHttpHooks::on_publish(url, req)) != ERROR_SUCCESS) {
srs_error("hook client on_publish failed. url=%s, ret=%d", url.c_str(), ret); for (int i = 0; i < (int)hooks.size(); i++) {
return ret; std::string url = hooks.at(i);
} if ((ret = SrsHttpHooks::on_publish(url, req)) != ERROR_SUCCESS) {
srs_error("hook client on_publish failed. url=%s, ret=%d", url.c_str(), ret);
return ret;
} }
} }
#endif #endif
@ -1374,19 +1406,29 @@ int SrsRtmpConn::http_hooks_on_publish()
void SrsRtmpConn::http_hooks_on_unpublish() void SrsRtmpConn::http_hooks_on_unpublish()
{ {
#ifdef SRS_AUTO_HTTP_CALLBACK #ifdef SRS_AUTO_HTTP_CALLBACK
if (_srs_config->get_vhost_http_hooks_enabled(req->vhost)) { if (!_srs_config->get_vhost_http_hooks_enabled(req->vhost)) {
// whatever the ret code, notify the api hooks. return;
// HTTP: on_unpublish }
SrsConfDirective* on_unpublish = _srs_config->get_vhost_on_unpublish(req->vhost);
if (!on_unpublish) { // the http hooks will cause context switch,
// so we must copy all hooks for the on_connect may freed.
// @see https://github.com/simple-rtmp-server/srs/issues/475
vector<string> hooks;
if (true) {
SrsConfDirective* conf = _srs_config->get_vhost_on_unpublish(req->vhost);
if (!conf) {
srs_info("ignore the empty http callback: on_unpublish"); srs_info("ignore the empty http callback: on_unpublish");
return; return;
} }
for (int i = 0; i < (int)on_unpublish->args.size(); i++) { hooks = conf->args;
std::string url = on_unpublish->args.at(i); }
SrsHttpHooks::on_unpublish(url, req);
} for (int i = 0; i < (int)hooks.size(); i++) {
std::string url = hooks.at(i);
SrsHttpHooks::on_unpublish(url, req);
} }
#endif #endif
} }
@ -1396,20 +1438,31 @@ int SrsRtmpConn::http_hooks_on_play()
int ret = ERROR_SUCCESS; int ret = ERROR_SUCCESS;
#ifdef SRS_AUTO_HTTP_CALLBACK #ifdef SRS_AUTO_HTTP_CALLBACK
if (_srs_config->get_vhost_http_hooks_enabled(req->vhost)) { if (!_srs_config->get_vhost_http_hooks_enabled(req->vhost)) {
// HTTP: on_play return ret;
SrsConfDirective* on_play = _srs_config->get_vhost_on_play(req->vhost); }
if (!on_play) {
// the http hooks will cause context switch,
// so we must copy all hooks for the on_connect may freed.
// @see https://github.com/simple-rtmp-server/srs/issues/475
vector<string> hooks;
if (true) {
SrsConfDirective* conf = _srs_config->get_vhost_on_play(req->vhost);
if (!conf) {
srs_info("ignore the empty http callback: on_play"); srs_info("ignore the empty http callback: on_play");
return ret; return ret;
} }
for (int i = 0; i < (int)on_play->args.size(); i++) { hooks = conf->args;
std::string url = on_play->args.at(i); }
if ((ret = SrsHttpHooks::on_play(url, req)) != ERROR_SUCCESS) {
srs_error("hook client on_play failed. url=%s, ret=%d", url.c_str(), ret); for (int i = 0; i < (int)hooks.size(); i++) {
return ret; std::string url = hooks.at(i);
} if ((ret = SrsHttpHooks::on_play(url, req)) != ERROR_SUCCESS) {
srs_error("hook client on_play failed. url=%s, ret=%d", url.c_str(), ret);
return ret;
} }
} }
#endif #endif
@ -1420,19 +1473,29 @@ int SrsRtmpConn::http_hooks_on_play()
void SrsRtmpConn::http_hooks_on_stop() void SrsRtmpConn::http_hooks_on_stop()
{ {
#ifdef SRS_AUTO_HTTP_CALLBACK #ifdef SRS_AUTO_HTTP_CALLBACK
if (_srs_config->get_vhost_http_hooks_enabled(req->vhost)) { if (!_srs_config->get_vhost_http_hooks_enabled(req->vhost)) {
// whatever the ret code, notify the api hooks. return;
// HTTP: on_stop }
SrsConfDirective* on_stop = _srs_config->get_vhost_on_stop(req->vhost);
if (!on_stop) { // the http hooks will cause context switch,
// so we must copy all hooks for the on_connect may freed.
// @see https://github.com/simple-rtmp-server/srs/issues/475
vector<string> hooks;
if (true) {
SrsConfDirective* conf = _srs_config->get_vhost_on_stop(req->vhost);
if (!conf) {
srs_info("ignore the empty http callback: on_stop"); srs_info("ignore the empty http callback: on_stop");
return; return;
} }
for (int i = 0; i < (int)on_stop->args.size(); i++) { hooks = conf->args;
std::string url = on_stop->args.at(i); }
SrsHttpHooks::on_stop(url, req);
} for (int i = 0; i < (int)hooks.size(); i++) {
std::string url = hooks.at(i);
SrsHttpHooks::on_stop(url, req);
} }
#endif #endif