mirror of
https://github.com/arut/nginx-rtmp-module.git
synced 2025-08-06 15:00:18 +08:00
Merge branch 'close-stream'
This commit is contained in:
@ -15,6 +15,7 @@
|
||||
|
||||
ngx_rtmp_connect_pt ngx_rtmp_connect;
|
||||
ngx_rtmp_create_stream_pt ngx_rtmp_create_stream;
|
||||
ngx_rtmp_close_stream_pt ngx_rtmp_close_stream;
|
||||
ngx_rtmp_delete_stream_pt ngx_rtmp_delete_stream;
|
||||
|
||||
ngx_rtmp_publish_pt ngx_rtmp_publish;
|
||||
@ -337,6 +338,45 @@ ngx_rtmp_cmd_create_stream(ngx_rtmp_session_t *s, ngx_rtmp_create_stream_t *v)
|
||||
}
|
||||
|
||||
|
||||
static ngx_int_t
|
||||
ngx_rtmp_cmd_close_stream_init(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,
|
||||
ngx_chain_t *in)
|
||||
{
|
||||
static ngx_rtmp_close_stream_t v;
|
||||
|
||||
static ngx_rtmp_amf_elt_t in_elts[] = {
|
||||
|
||||
{ NGX_RTMP_AMF_NUMBER,
|
||||
ngx_null_string,
|
||||
&v.stream, 0 },
|
||||
};
|
||||
|
||||
if (ngx_rtmp_receive_amf(s, in, in_elts,
|
||||
sizeof(in_elts) / sizeof(in_elts[0])))
|
||||
{
|
||||
return NGX_ERROR;
|
||||
}
|
||||
|
||||
ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0,
|
||||
"closeStream");
|
||||
|
||||
return ngx_rtmp_close_stream
|
||||
? ngx_rtmp_close_stream(s, &v)
|
||||
: NGX_OK;
|
||||
}
|
||||
|
||||
|
||||
static ngx_int_t
|
||||
ngx_rtmp_cmd_close_stream(ngx_rtmp_session_t *s, ngx_rtmp_close_stream_t *v)
|
||||
{
|
||||
ngx_rtmp_send_user_stream_eof(s, NGX_RTMP_CMD_MSID);
|
||||
|
||||
/* Whatever happens return OK
|
||||
* since we should be careful with destruction */
|
||||
return NGX_OK;
|
||||
}
|
||||
|
||||
|
||||
static ngx_int_t
|
||||
ngx_rtmp_cmd_delete_stream_init(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,
|
||||
ngx_chain_t *in)
|
||||
@ -373,8 +413,13 @@ ngx_rtmp_cmd_delete_stream_init(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,
|
||||
static ngx_int_t
|
||||
ngx_rtmp_cmd_delete_stream(ngx_rtmp_session_t *s, ngx_rtmp_delete_stream_t *v)
|
||||
{
|
||||
/* TODO: send NetStream.Play.Stop? */
|
||||
return NGX_OK;
|
||||
ngx_rtmp_close_stream_t cv;
|
||||
|
||||
/* chain close_stream */
|
||||
cv.stream = 0;
|
||||
return ngx_rtmp_close_stream
|
||||
? ngx_rtmp_close_stream(s, &cv)
|
||||
: NGX_OK;
|
||||
}
|
||||
|
||||
|
||||
@ -658,7 +703,7 @@ ngx_rtmp_cmd_play(ngx_rtmp_session_t *s, ngx_rtmp_play_t *v)
|
||||
|
||||
{ NGX_RTMP_AMF_STRING,
|
||||
ngx_string("code"),
|
||||
"NetStream.Play.Reset", 0 },
|
||||
"NetStream.Play.Start", 0 },
|
||||
|
||||
{ NGX_RTMP_AMF_STRING,
|
||||
ngx_string("level"),
|
||||
@ -666,7 +711,7 @@ ngx_rtmp_cmd_play(ngx_rtmp_session_t *s, ngx_rtmp_play_t *v)
|
||||
|
||||
{ NGX_RTMP_AMF_STRING,
|
||||
ngx_string("description"),
|
||||
"Playing and resetting.", 0 },
|
||||
"Playback started.", 0 },
|
||||
};
|
||||
|
||||
static ngx_rtmp_amf_elt_t out_elts[] = {
|
||||
@ -772,6 +817,10 @@ ngx_rtmp_cmd_play(ngx_rtmp_session_t *s, ngx_rtmp_play_t *v)
|
||||
h.csid = NGX_RTMP_CMD_CSID_AMF;
|
||||
h.msid = NGX_RTMP_CMD_MSID;
|
||||
|
||||
if (ngx_rtmp_send_user_stream_begin(s, NGX_RTMP_CMD_MSID) != NGX_OK) {
|
||||
return NGX_ERROR;
|
||||
}
|
||||
|
||||
if (ngx_rtmp_send_amf(s, &h, out_elts,
|
||||
sizeof(out_elts) / sizeof(out_elts[0])) != NGX_OK)
|
||||
{
|
||||
@ -912,6 +961,7 @@ static ngx_rtmp_amf_handler_t ngx_rtmp_cmd_map[] = {
|
||||
|
||||
{ ngx_string("connect"), ngx_rtmp_cmd_connect_init },
|
||||
{ ngx_string("createStream"), ngx_rtmp_cmd_create_stream_init },
|
||||
{ ngx_string("closeStream"), ngx_rtmp_cmd_close_stream_init },
|
||||
{ ngx_string("deleteStream"), ngx_rtmp_cmd_delete_stream_init },
|
||||
|
||||
{ ngx_string("publish"), ngx_rtmp_cmd_publish_init },
|
||||
@ -955,6 +1005,7 @@ ngx_rtmp_cmd_postconfiguration(ngx_conf_t *cf)
|
||||
/* set initial handlers */
|
||||
ngx_rtmp_connect = ngx_rtmp_cmd_connect;
|
||||
ngx_rtmp_create_stream = ngx_rtmp_cmd_create_stream;
|
||||
ngx_rtmp_close_stream = ngx_rtmp_cmd_close_stream;
|
||||
ngx_rtmp_delete_stream = ngx_rtmp_cmd_delete_stream;
|
||||
|
||||
ngx_rtmp_publish = ngx_rtmp_cmd_publish;
|
||||
|
@ -45,6 +45,11 @@ typedef struct {
|
||||
} ngx_rtmp_delete_stream_t;
|
||||
|
||||
|
||||
typedef struct {
|
||||
double stream;
|
||||
} ngx_rtmp_close_stream_t;
|
||||
|
||||
|
||||
typedef struct {
|
||||
u_char name[NGX_RTMP_MAX_NAME];
|
||||
u_char args[NGX_RTMP_MAX_ARGS];
|
||||
@ -77,6 +82,8 @@ typedef ngx_int_t (*ngx_rtmp_connect_pt)(ngx_rtmp_session_t *s,
|
||||
ngx_rtmp_connect_t *v);
|
||||
typedef ngx_int_t (*ngx_rtmp_create_stream_pt)(ngx_rtmp_session_t *s,
|
||||
ngx_rtmp_create_stream_t *v);
|
||||
typedef ngx_int_t (*ngx_rtmp_close_stream_pt)(ngx_rtmp_session_t *s,
|
||||
ngx_rtmp_close_stream_t *v);
|
||||
typedef ngx_int_t (*ngx_rtmp_delete_stream_pt)(ngx_rtmp_session_t *s,
|
||||
ngx_rtmp_delete_stream_t *v);
|
||||
|
||||
@ -97,6 +104,7 @@ typedef ngx_int_t (*ngx_rtmp_fcunsubscribe_pt)(ngx_rtmp_session_t *s,
|
||||
|
||||
extern ngx_rtmp_connect_pt ngx_rtmp_connect;
|
||||
extern ngx_rtmp_create_stream_pt ngx_rtmp_create_stream;
|
||||
extern ngx_rtmp_close_stream_pt ngx_rtmp_close_stream;
|
||||
extern ngx_rtmp_delete_stream_pt ngx_rtmp_delete_stream;
|
||||
|
||||
extern ngx_rtmp_publish_pt ngx_rtmp_publish;
|
||||
|
@ -10,7 +10,7 @@
|
||||
|
||||
static ngx_rtmp_publish_pt next_publish;
|
||||
static ngx_rtmp_play_pt next_play;
|
||||
static ngx_rtmp_delete_stream_pt next_delete_stream;
|
||||
static ngx_rtmp_close_stream_pt next_close_stream;
|
||||
|
||||
|
||||
static ngx_int_t ngx_rtmp_live_postconfiguration(ngx_conf_t *cf);
|
||||
@ -214,7 +214,7 @@ ngx_rtmp_live_join(ngx_rtmp_session_t *s, u_char *name,
|
||||
|
||||
|
||||
static ngx_int_t
|
||||
ngx_rtmp_live_delete_stream(ngx_rtmp_session_t *s, ngx_rtmp_delete_stream_t *v)
|
||||
ngx_rtmp_live_close_stream(ngx_rtmp_session_t *s, ngx_rtmp_close_stream_t *v)
|
||||
{
|
||||
ngx_rtmp_live_ctx_t *ctx, **cctx;
|
||||
ngx_rtmp_live_stream_t **stream;
|
||||
@ -239,6 +239,8 @@ ngx_rtmp_live_delete_stream(ngx_rtmp_session_t *s, ngx_rtmp_delete_stream_t *v)
|
||||
ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0,
|
||||
"live: leave '%s'", ctx->stream->name);
|
||||
|
||||
ctx->msg_mask = 0;
|
||||
|
||||
if (ctx->stream->flags & NGX_RTMP_LIVE_PUBLISHING
|
||||
&& ctx->flags & NGX_RTMP_LIVE_PUBLISHING)
|
||||
{
|
||||
@ -271,7 +273,7 @@ ngx_rtmp_live_delete_stream(ngx_rtmp_session_t *s, ngx_rtmp_delete_stream_t *v)
|
||||
ctx->stream = NULL;
|
||||
|
||||
next:
|
||||
return next_delete_stream(s, v);
|
||||
return next_close_stream(s, v);
|
||||
}
|
||||
|
||||
|
||||
@ -499,8 +501,8 @@ ngx_rtmp_live_postconfiguration(ngx_conf_t *cf)
|
||||
next_play = ngx_rtmp_play;
|
||||
ngx_rtmp_play = ngx_rtmp_live_play;
|
||||
|
||||
next_delete_stream = ngx_rtmp_delete_stream;
|
||||
ngx_rtmp_delete_stream = ngx_rtmp_live_delete_stream;
|
||||
next_close_stream = ngx_rtmp_close_stream;
|
||||
ngx_rtmp_close_stream = ngx_rtmp_live_close_stream;
|
||||
|
||||
return NGX_OK;
|
||||
}
|
||||
|
@ -135,7 +135,7 @@ ngx_rtmp_user_message_handler(ngx_rtmp_session_t *s,
|
||||
ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0,
|
||||
"msid=%uD buflen: %uD (msec)", val, arg);
|
||||
|
||||
ngx_rtmp_send_user_stream_begin(s, val);
|
||||
/*ngx_rtmp_send_user_stream_begin(s, val);*/
|
||||
}
|
||||
break;
|
||||
|
||||
|
Reference in New Issue
Block a user