implemented publish_notify & play_restart directives

This commit is contained in:
Roman Arutyunyan 2012-11-13 09:33:20 +04:00
parent fd99086834
commit 3192d657f1
2 changed files with 63 additions and 14 deletions

View file

@ -74,6 +74,20 @@ static ngx_command_t ngx_rtmp_live_commands[] = {
offsetof(ngx_rtmp_live_app_conf_t, wait_key), offsetof(ngx_rtmp_live_app_conf_t, wait_key),
NULL }, NULL },
{ ngx_string("publish_notify"),
NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,
ngx_conf_set_flag_slot,
NGX_RTMP_APP_CONF_OFFSET,
offsetof(ngx_rtmp_live_app_conf_t, publish_notify),
NULL },
{ ngx_string("play_restart"),
NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,
ngx_conf_set_flag_slot,
NGX_RTMP_APP_CONF_OFFSET,
offsetof(ngx_rtmp_live_app_conf_t, play_restart),
NULL },
ngx_null_command ngx_null_command
}; };
@ -123,6 +137,8 @@ ngx_rtmp_live_create_app_conf(ngx_conf_t *cf)
lacf->sync = NGX_CONF_UNSET; lacf->sync = NGX_CONF_UNSET;
lacf->interleave = NGX_CONF_UNSET; lacf->interleave = NGX_CONF_UNSET;
lacf->wait_key = NGX_CONF_UNSET; lacf->wait_key = NGX_CONF_UNSET;
lacf->publish_notify = NGX_CONF_UNSET;
lacf->play_restart = NGX_CONF_UNSET;
return lacf; return lacf;
} }
@ -141,6 +157,8 @@ ngx_rtmp_live_merge_app_conf(ngx_conf_t *cf, void *parent, void *child)
ngx_conf_merge_msec_value(conf->sync, prev->sync, 0); ngx_conf_merge_msec_value(conf->sync, prev->sync, 0);
ngx_conf_merge_value(conf->interleave, prev->interleave, 0); ngx_conf_merge_value(conf->interleave, prev->interleave, 0);
ngx_conf_merge_value(conf->wait_key, prev->wait_key, 0); ngx_conf_merge_value(conf->wait_key, prev->wait_key, 0);
ngx_conf_merge_value(conf->publish_notify, prev->publish_notify, 0);
ngx_conf_merge_value(conf->play_restart, prev->play_restart, 1);
conf->pool = ngx_create_pool(4096, &cf->cycle->new_log); conf->pool = ngx_create_pool(4096, &cf->cycle->new_log);
if (conf->pool == NULL) { if (conf->pool == NULL) {
@ -268,22 +286,32 @@ static void
ngx_rtmp_live_stream_begin(ngx_rtmp_session_t *s) ngx_rtmp_live_stream_begin(ngx_rtmp_session_t *s)
{ {
ngx_rtmp_core_srv_conf_t *cscf; ngx_rtmp_core_srv_conf_t *cscf;
ngx_rtmp_live_app_conf_t *lacf;
ngx_chain_t *control; ngx_chain_t *control;
ngx_chain_t *status[3]; ngx_chain_t *status[3];
size_t n, nstatus; size_t n, nstatus;
cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module);
lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_live_module);
control = ngx_rtmp_create_stream_begin(s, NGX_RTMP_MSID); control = ngx_rtmp_create_stream_begin(s, NGX_RTMP_MSID);
nstatus = 0; nstatus = 0;
status[nstatus++] = ngx_rtmp_create_status(s, "NetStream.Play.Start", if (lacf->play_restart) {
"status", "Start live"); status[nstatus++] = ngx_rtmp_create_status(s, "NetStream.Play.Start",
"status", "Start live");
}
status[nstatus++] = ngx_rtmp_create_sample_access(s); status[nstatus++] = ngx_rtmp_create_sample_access(s);
/*status[nstatus++] = ngx_rtmp_create_status(s, "NetStream.Play.PublishNotify",
"status", "Start publishing"); if (lacf->publish_notify) {
*/ status[nstatus++] = ngx_rtmp_create_status(s,
"NetStream.Play.PublishNotify",
"status", "Start publishing");
}
ngx_rtmp_live_set_status(s, control, status, nstatus, 1); ngx_rtmp_live_set_status(s, control, status, nstatus, 1);
if (control) { if (control) {
@ -300,21 +328,29 @@ static void
ngx_rtmp_live_stream_eof(ngx_rtmp_session_t *s) ngx_rtmp_live_stream_eof(ngx_rtmp_session_t *s)
{ {
ngx_rtmp_core_srv_conf_t *cscf; ngx_rtmp_core_srv_conf_t *cscf;
ngx_rtmp_live_app_conf_t *lacf;
ngx_chain_t *control; ngx_chain_t *control;
ngx_chain_t *status[3]; ngx_chain_t *status[3];
size_t n, nstatus; size_t n, nstatus;
cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module);
lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_live_module);
control = ngx_rtmp_create_stream_eof(s, NGX_RTMP_MSID); control = ngx_rtmp_create_stream_eof(s, NGX_RTMP_MSID);
nstatus = 0; nstatus = 0;
status[nstatus++] = ngx_rtmp_create_status(s, "NetStream.Play.Stop", if (lacf->play_restart) {
"status", "Stop live"); status[nstatus++] = ngx_rtmp_create_status(s, "NetStream.Play.Stop",
/*status[nstatus++] = ngx_rtmp_create_status(s, "NetStream.Play.UnpublishNotify", "status", "Stop live");
"status", "Start publishing"); }
*/
if (lacf->publish_notify) {
status[nstatus++] = ngx_rtmp_create_status(s,
"NetStream.Play.UnpublishNotify",
"status", "Start publishing");
}
ngx_rtmp_live_set_status(s, control, status, nstatus, 0); ngx_rtmp_live_set_status(s, control, status, nstatus, 0);
@ -453,6 +489,10 @@ ngx_rtmp_live_close_stream(ngx_rtmp_session_t *s, ngx_rtmp_close_stream_t *v)
lacf->free_streams = ctx->stream; lacf->free_streams = ctx->stream;
ctx->stream = NULL; ctx->stream = NULL;
if (!ctx->silent && !ctx->publishing && !lacf->play_restart) {
ngx_rtmp_send_status(s, "NetStream.Play.Stop", "status", "Stop live");
}
next: next:
return next_close_stream(s, v); return next_close_stream(s, v);
} }
@ -745,7 +785,7 @@ ngx_rtmp_live_publish(ngx_rtmp_session_t *s, ngx_rtmp_publish_t *v)
if (!ctx->silent) { if (!ctx->silent) {
ngx_rtmp_send_status(s, "NetStream.Publish.Start", ngx_rtmp_send_status(s, "NetStream.Publish.Start",
"status", "Start publishing"); "status", "Start publishing");
} }
next: next:
@ -766,9 +806,9 @@ ngx_rtmp_live_play(ngx_rtmp_session_t *s, ngx_rtmp_play_t *v)
} }
ngx_log_debug4(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, ngx_log_debug4(NGX_LOG_DEBUG_RTMP, s->connection->log, 0,
"live: play: name='%s' start=%uD duration=%uD reset=%d", "live: play: name='%s' start=%uD duration=%uD reset=%d",
v->name, (uint32_t)v->start, v->name, (uint32_t) v->start,
(uint32_t)v->duration, (uint32_t)v->reset); (uint32_t) v->duration, (uint32_t) v->reset);
/* join stream as subscriber */ /* join stream as subscriber */
@ -781,6 +821,11 @@ ngx_rtmp_live_play(ngx_rtmp_session_t *s, ngx_rtmp_play_t *v)
ctx->silent = v->silent; ctx->silent = v->silent;
if (!ctx->silent && !lacf->play_restart) {
ngx_rtmp_send_status(s, "NetStream.Play.Start",
"status", "Start live");
}
next: next:
return next_play(s, v); return next_play(s, v);
} }
@ -795,6 +840,7 @@ ngx_rtmp_live_postconfiguration(ngx_conf_t *cf)
cmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_core_module); cmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_core_module);
/* register raw event handlers */ /* register raw event handlers */
h = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_AUDIO]); h = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_AUDIO]);
*h = ngx_rtmp_live_av; *h = ngx_rtmp_live_av;
@ -802,6 +848,7 @@ ngx_rtmp_live_postconfiguration(ngx_conf_t *cf)
*h = ngx_rtmp_live_av; *h = ngx_rtmp_live_av;
/* chain handlers */ /* chain handlers */
next_publish = ngx_rtmp_publish; next_publish = ngx_rtmp_publish;
ngx_rtmp_publish = ngx_rtmp_live_publish; ngx_rtmp_publish = ngx_rtmp_live_publish;

View file

@ -59,6 +59,8 @@ typedef struct {
ngx_flag_t atc; ngx_flag_t atc;
ngx_flag_t interleave; ngx_flag_t interleave;
ngx_flag_t wait_key; ngx_flag_t wait_key;
ngx_flag_t publish_notify;
ngx_flag_t play_restart;
ngx_msec_t buflen; ngx_msec_t buflen;
ngx_pool_t *pool; ngx_pool_t *pool;
ngx_rtmp_live_stream_t *free_streams; ngx_rtmp_live_stream_t *free_streams;