static ngx_int_t ngx_rtmp_relay_publish_local(ngx_rtmp_session_t *s) { ngx_rtmp_publish_t v; ngx_rtmp_relay_ctx_t *ctx; ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_relay_module); if (ctx == NULL) { return NGX_ERROR; } ngx_memzero(&v, sizeof(ngx_rtmp_publish_t)); v.silent = 1; *(ngx_cpymem(v.name, ctx->name.data, ngx_min(sizeof(v.name) - 1, ctx->name.len))) = 0; return ngx_rtmp_publish(s, &v); }
static const char * ngx_rtmp_control_redirect_handler(ngx_http_request_t *r, ngx_rtmp_session_t *s, ngx_rtmp_core_srv_conf_t *cscf, ngx_rtmp_core_app_conf_t **cacf) { ngx_str_t name; ngx_rtmp_play_t vplay; ngx_rtmp_publish_t vpublish; ngx_rtmp_live_ctx_t *lctx; ngx_rtmp_control_ctx_t *ctx; ngx_rtmp_close_stream_t vc; if (ngx_http_arg(r, (u_char *) "newname", sizeof("newname") - 1, &name) != NGX_OK) { return "newname not specified"; } if (name.len >= NGX_RTMP_MAX_NAME) { name.len = NGX_RTMP_MAX_NAME - 1; } ctx = ngx_http_get_module_ctx(r, ngx_rtmp_control_module); ctx->count++; ngx_memzero(&vc, sizeof(ngx_rtmp_close_stream_t)); /* close_stream should be synchronous */ ngx_rtmp_close_stream(s, &vc); lctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_live_module); if (lctx && lctx->publishing) { /* publish */ ngx_memzero(&vpublish, sizeof(ngx_rtmp_publish_t)); ngx_memcpy(vpublish.name, name.data, name.len); ngx_rtmp_cmd_fill_args(vpublish.name, vpublish.args); if (ngx_rtmp_publish(s, &vpublish) != NGX_OK) { return "publish failed"; } } else { /* play */ ngx_memzero(&vplay, sizeof(ngx_rtmp_play_t)); ngx_memcpy(vplay.name, name.data, name.len); ngx_rtmp_cmd_fill_args(vplay.name, vplay.args); if (ngx_rtmp_play(s, &vplay) != NGX_OK) { return "play failed"; } } return NGX_CONF_OK; }