diff --git a/ngx_rtmp.c b/ngx_rtmp.c index a490ff9..d6b5bf3 100644 --- a/ngx_rtmp.c +++ b/ngx_rtmp.c @@ -385,7 +385,6 @@ ngx_rtmp_init_event_handlers(ngx_conf_t *cf, ngx_rtmp_core_main_conf_t *cmcf) static size_t amf_events[] = { NGX_RTMP_MSG_AMF_META, - NGX_RTMP_MSG_AMF_SHARED, NGX_RTMP_MSG_AMF_CMD }; @@ -401,6 +400,10 @@ ngx_rtmp_init_event_handlers(ngx_conf_t *cf, ngx_rtmp_core_main_conf_t *cmcf) *eh = ngx_rtmp_amf_message_handler; } + /* init amf shared object events */ + eh = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_AMF_SHARED]); + *eh = ngx_rtmp_amf_shared_object_handler; + /* init user protocol events */ eh = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_USER]); *eh = ngx_rtmp_user_message_handler; diff --git a/ngx_rtmp.h b/ngx_rtmp.h index 3fa186b..241d367 100644 --- a/ngx_rtmp.h +++ b/ngx_rtmp.h @@ -350,6 +350,8 @@ ngx_int_t ngx_rtmp_user_message_handler(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, ngx_chain_t *in); ngx_int_t ngx_rtmp_amf_message_handler(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, ngx_chain_t *in); +ngx_int_t ngx_rtmp_amf_shared_object_handler(ngx_rtmp_session_t *s, + ngx_rtmp_header_t *h, ngx_chain_t *in); /* Shared output buffers */ @@ -408,6 +410,8 @@ ngx_int_t ngx_rtmp_send_user_unknown(ngx_rtmp_session_t *s, uint32_t timestamp); /* AMF sender/receiver */ +ngx_chain_t * ngx_rtmp_create_amf_message(ngx_rtmp_session_t *s, + ngx_rtmp_header_t *h, ngx_rtmp_amf_elt_t *elts, size_t nelts); ngx_int_t ngx_rtmp_send_amf(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, ngx_rtmp_amf_elt_t *elts, size_t nelts); ngx_int_t ngx_rtmp_receive_amf(ngx_rtmp_session_t *s, ngx_chain_t *in, diff --git a/ngx_rtmp_send.c b/ngx_rtmp_send.c index d0be5c8..d54966c 100644 --- a/ngx_rtmp_send.c +++ b/ngx_rtmp_send.c @@ -207,8 +207,8 @@ ngx_rtmp_alloc_amf_buf(void *arg) /* AMF sender */ -ngx_int_t -ngx_rtmp_send_amf(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, +ngx_chain_t * +ngx_rtmp_create_amf_message(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, ngx_rtmp_amf_elt_t *elts, size_t nelts) { ngx_rtmp_amf_ctx_t act; @@ -225,14 +225,35 @@ ngx_rtmp_send_amf(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, if (act.first) { ngx_rtmp_free_shared_bufs(cscf, act.first); } - return NGX_ERROR; + return NULL; } if (act.first) { ngx_rtmp_prepare_message(s, h, NULL, act.first); - return ngx_rtmp_send_message(s, act.first, 0); } - return NGX_OK; + return act.first; +} + +ngx_int_t ngx_rtmp_send_amf(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, + ngx_rtmp_amf_elt_t *elts, size_t nelts) +{ + ngx_chain_t *cl; + ngx_int_t rc; + ngx_rtmp_core_srv_conf_t *cscf; + + cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); + + cl = ngx_rtmp_create_amf_message(s, h, elts, nelts); + + if (cl == NULL) { + return NGX_ERROR; + } + + rc = ngx_rtmp_send_message(s, cl, 0); + + ngx_rtmp_free_shared_bufs(cscf, cl); + + return rc; }