mirror of
https://github.com/ossrs/srs.git
synced 2025-02-12 19:31:53 +00:00
#475, fix http hooks crash for st context switch. 2.0.187
This commit is contained in:
parent
f0fc093b19
commit
6d50aa1aa2
5 changed files with 185 additions and 97 deletions
|
@ -343,6 +343,7 @@ Remark:
|
||||||
|
|
||||||
## History
|
## History
|
||||||
|
|
||||||
|
* v2.0, 2015-09-14, for [#475][bug #475] fix http hooks crash for st context switch. 2.0.187
|
||||||
* v2.0, 2015-09-09, support reload utc_time. 2.0.186
|
* v2.0, 2015-09-09, support reload utc_time. 2.0.186
|
||||||
* <strong>v2.0, 2015-08-23, [2.0 alpha(2.0.185)][r2.0a0] released. 89022 lines.</strong>
|
* <strong>v2.0, 2015-08-23, [2.0 alpha(2.0.185)][r2.0a0] released. 89022 lines.</strong>
|
||||||
* v2.0, 2015-08-22, HTTP API support JSONP by specifies the query string callback=xxx.
|
* v2.0, 2015-08-22, HTTP API support JSONP by specifies the query string callback=xxx.
|
||||||
|
@ -1024,6 +1025,7 @@ Winlin
|
||||||
[bug #133]: https://github.com/simple-rtmp-server/srs/issues/133
|
[bug #133]: https://github.com/simple-rtmp-server/srs/issues/133
|
||||||
[bug #92]: https://github.com/simple-rtmp-server/srs/issues/92
|
[bug #92]: https://github.com/simple-rtmp-server/srs/issues/92
|
||||||
[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
|
||||||
|
|
|
@ -512,24 +512,33 @@ 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++) {
|
||||||
|
std::string url = hooks.at(i);
|
||||||
|
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);
|
srs_error("hook client on_dvr failed. url=%s, ret=%d", url.c_str(), ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -198,25 +198,33 @@ 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);
|
||||||
|
if ((ret = SrsHttpHooks::on_hls(url, req, path, ts_url, m3u8, m3u8_url, seq_no, duration)) != ERROR_SUCCESS) {
|
||||||
srs_error("hook client on_hls failed. url=%s, ret=%d", url.c_str(), ret);
|
srs_error("hook client on_hls failed. url=%s, ret=%d", url.c_str(), ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -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();
|
|
||||||
url = on_hls->args.at(index);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int nb_notify = _srs_config->get_vhost_hls_nb_notify(req->vhost);
|
int nb_notify = _srs_config->get_vhost_hls_nb_notify(req->vhost);
|
||||||
|
for (int i = 0; i < (int)hooks.size(); i++) {
|
||||||
|
std::string url = hooks.at(i);
|
||||||
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1322,22 +1322,33 @@ 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);
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < (int)hooks.size(); i++) {
|
||||||
|
std::string url = hooks.at(i);
|
||||||
if ((ret = SrsHttpHooks::on_connect(url, req)) != ERROR_SUCCESS) {
|
if ((ret = SrsHttpHooks::on_connect(url, req)) != ERROR_SUCCESS) {
|
||||||
srs_error("hook client on_connect failed. url=%s, ret=%d", url.c_str(), ret);
|
srs_error("hook client on_connect failed. url=%s, ret=%d", url.c_str(), ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -1346,19 +1357,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
|
||||||
}
|
}
|
||||||
|
@ -1368,22 +1389,33 @@ 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);
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < (int)hooks.size(); i++) {
|
||||||
|
std::string url = hooks.at(i);
|
||||||
if ((ret = SrsHttpHooks::on_publish(url, req)) != ERROR_SUCCESS) {
|
if ((ret = SrsHttpHooks::on_publish(url, req)) != ERROR_SUCCESS) {
|
||||||
srs_error("hook client on_publish failed. url=%s, ret=%d", url.c_str(), ret);
|
srs_error("hook client on_publish failed. url=%s, ret=%d", url.c_str(), ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -1392,19 +1424,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
|
||||||
}
|
}
|
||||||
|
@ -1414,22 +1456,33 @@ 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);
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < (int)hooks.size(); i++) {
|
||||||
|
std::string url = hooks.at(i);
|
||||||
if ((ret = SrsHttpHooks::on_play(url, req)) != ERROR_SUCCESS) {
|
if ((ret = SrsHttpHooks::on_play(url, req)) != ERROR_SUCCESS) {
|
||||||
srs_error("hook client on_play failed. url=%s, ret=%d", url.c_str(), ret);
|
srs_error("hook client on_play failed. url=%s, ret=%d", url.c_str(), ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -1438,19 +1491,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
|
||||||
|
|
||||||
|
|
|
@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
// current release version
|
// current release version
|
||||||
#define VERSION_MAJOR 2
|
#define VERSION_MAJOR 2
|
||||||
#define VERSION_MINOR 0
|
#define VERSION_MINOR 0
|
||||||
#define VERSION_REVISION 186
|
#define VERSION_REVISION 187
|
||||||
|
|
||||||
// server info.
|
// server info.
|
||||||
#define RTMP_SIG_SRS_KEY "SRS"
|
#define RTMP_SIG_SRS_KEY "SRS"
|
||||||
|
|
Loading…
Reference in a new issue