improved sending done-family notifications; fixed crash when on_play_done is set but on_done is unset

This commit is contained in:
Roman Arutyunyan 2012-11-10 18:29:29 +04:00
parent 6f2808c7d1
commit 93b6692735

View file

@ -27,7 +27,7 @@ static void * ngx_rtmp_notify_create_app_conf(ngx_conf_t *cf);
static char * ngx_rtmp_notify_merge_app_conf(ngx_conf_t *cf, static char * ngx_rtmp_notify_merge_app_conf(ngx_conf_t *cf,
void *parent, void *child); void *parent, void *child);
static ngx_int_t ngx_rtmp_notify_done(ngx_rtmp_session_t *s, char *cbname, static ngx_int_t ngx_rtmp_notify_done(ngx_rtmp_session_t *s, char *cbname,
ngx_url_t *url); ngx_uint_t url_idx);
ngx_str_t ngx_rtmp_notify_urlencoded = ngx_str_t ngx_rtmp_notify_urlencoded =
@ -65,7 +65,7 @@ typedef struct {
typedef struct { typedef struct {
u_char *cbname; u_char *cbname;
ngx_url_t *url; ngx_uint_t url_idx;
} ngx_rtmp_notify_done_t; } ngx_rtmp_notify_done_t;
@ -381,7 +381,7 @@ ngx_rtmp_notify_done_create(ngx_rtmp_session_t *s, void *arg,
b->last = (u_char *) ngx_cpymem(b->last, ctx->args, args_len); b->last = (u_char *) ngx_cpymem(b->last, ctx->args, args_len);
} }
return ngx_rtmp_notify_create_request(s, pool, NGX_RTMP_NOTIFY_DONE, pl); return ngx_rtmp_notify_create_request(s, pool, ds->url_idx, pl);
} }
@ -643,22 +643,16 @@ ngx_rtmp_notify_delete_stream(ngx_rtmp_session_t *s,
goto next; goto next;
} }
if (nacf->url[NGX_RTMP_NOTIFY_PUBLISH_DONE] && if (ctx->flags & NGX_RTMP_NOTIFY_PUBLISHING) {
(ctx->flags & NGX_RTMP_NOTIFY_PUBLISHING)) ngx_rtmp_notify_done(s, "publish_done", NGX_RTMP_NOTIFY_PUBLISH_DONE);
{
ngx_rtmp_notify_done(s, "publish_done",
nacf->url[NGX_RTMP_NOTIFY_PUBLISH_DONE]);
} }
if (nacf->url[NGX_RTMP_NOTIFY_PLAY_DONE] && if (ctx->flags & NGX_RTMP_NOTIFY_PLAYING) {
(ctx->flags & NGX_RTMP_NOTIFY_PLAYING)) ngx_rtmp_notify_done(s, "play_done", NGX_RTMP_NOTIFY_PLAY_DONE);
{
ngx_rtmp_notify_done(s, "play_done",
nacf->url[NGX_RTMP_NOTIFY_PLAY_DONE]);
} }
if (nacf->url[NGX_RTMP_NOTIFY_DONE] && ctx->flags) { if (ctx->flags) {
ngx_rtmp_notify_done(s, "done", nacf->url[NGX_RTMP_NOTIFY_DONE]); ngx_rtmp_notify_done(s, "done", NGX_RTMP_NOTIFY_DONE);
} }
ctx->flags = 0; ctx->flags = 0;
@ -702,16 +696,26 @@ next:
static ngx_int_t static ngx_int_t
ngx_rtmp_notify_done(ngx_rtmp_session_t *s, char *cbname, ngx_url_t *url) ngx_rtmp_notify_done(ngx_rtmp_session_t *s, char *cbname, ngx_uint_t url_idx)
{ {
ngx_rtmp_netcall_init_t ci; ngx_rtmp_netcall_init_t ci;
ngx_rtmp_notify_done_t ds; ngx_rtmp_notify_done_t ds;
ngx_rtmp_notify_app_conf_t *nacf;
ngx_url_t *url;
nacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_notify_module);
url = nacf->url[url_idx];
if (url == NULL) {
return NGX_OK;
}
ngx_log_error(NGX_LOG_INFO, s->connection->log, 0, ngx_log_error(NGX_LOG_INFO, s->connection->log, 0,
"notify: %s '%V'", cbname, &url->url); "notify: %s '%V'", cbname, &url->url);
ds.cbname = (u_char *) cbname; ds.cbname = (u_char *) cbname;
ds.url = url; ds.url_idx = url_idx;
ngx_memzero(&ci, sizeof(ci)); ngx_memzero(&ci, sizeof(ci));