diff --git a/ngx_rtmp.c b/ngx_rtmp.c index 04bd2cb..9a7640d 100644 --- a/ngx_rtmp.c +++ b/ngx_rtmp.c @@ -384,8 +384,12 @@ 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_CMD, NGX_RTMP_MSG_AMF_META, - NGX_RTMP_MSG_AMF_CMD + NGX_RTMP_MSG_AMF_SHARED, + NGX_RTMP_MSG_AMF3_CMD, + NGX_RTMP_MSG_AMF3_META, + NGX_RTMP_MSG_AMF3_SHARED }; /* init standard protocol events */ @@ -400,10 +404,6 @@ 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_cmd_module.c b/ngx_rtmp_cmd_module.c index ddb30ea..b1b53d5 100644 --- a/ngx_rtmp_cmd_module.c +++ b/ngx_rtmp_cmd_module.c @@ -94,6 +94,10 @@ ngx_rtmp_cmd_connect_init(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, { NGX_RTMP_AMF_STRING, ngx_string("pageUrl"), v.page_url, sizeof(v.page_url) }, + + { NGX_RTMP_AMF_NUMBER, + ngx_string("objectEncoding"), + &v.object_encoding, 0}, }; static ngx_rtmp_amf_elt_t in_elts[] = { @@ -195,11 +199,13 @@ ngx_rtmp_cmd_connect(ngx_rtmp_session_t *s, ngx_rtmp_connect_t *v) cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); - ngx_log_debug7(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + ngx_log_debug8(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, "connect: app='%s' flashver='%s' swf_url='%s' " - "tc_url='%s' page_url='%s' acodecs=%uD vcodecs=%uD", + "tc_url='%s' page_url='%s' acodecs=%uD vcodecs=%uD " + "object_encoding=%ui", v->app, v->flashver, v->swf_url, v->tc_url, v->page_url, - (uint32_t)v->acodecs, (uint32_t)v->vcodecs); + (uint32_t)v->acodecs, (uint32_t)v->vcodecs, + (ngx_int_t)v->object_encoding); trans = v->trans; @@ -247,6 +253,8 @@ ngx_rtmp_cmd_connect(ngx_rtmp_session_t *s, ngx_rtmp_connect_t *v) return NGX_ERROR; } + object_encoding = v->object_encoding; + /* send all replies */ return ngx_rtmp_send_ack_size(s, cscf->ack_window) != NGX_OK || ngx_rtmp_send_bandwidth(s, cscf->ack_window, diff --git a/ngx_rtmp_cmd_module.h b/ngx_rtmp_cmd_module.h index 4f9da37..ef8893c 100644 --- a/ngx_rtmp_cmd_module.h +++ b/ngx_rtmp_cmd_module.h @@ -29,6 +29,7 @@ typedef struct { double acodecs; double vcodecs; u_char page_url[NGX_RTMP_MAX_URL]; + double object_encoding; } ngx_rtmp_connect_t; diff --git a/ngx_rtmp_handler.c b/ngx_rtmp_handler.c index 3658204..aecbafa 100644 --- a/ngx_rtmp_handler.c +++ b/ngx_rtmp_handler.c @@ -41,7 +41,7 @@ ngx_rtmp_message_type(uint8_t type) "?", "amf3_meta", "amf3_shared", - "amd3_cmd", + "amf3_cmd", "amf_meta", "amf_shared", "amf_cmd", diff --git a/ngx_rtmp_receive.c b/ngx_rtmp_receive.c index 00450fa..a3f1c36 100644 --- a/ngx_rtmp_receive.c +++ b/ngx_rtmp_receive.c @@ -164,9 +164,9 @@ ngx_rtmp_user_message_handler(ngx_rtmp_session_t *s, } -static ngx_int_t -ngx_rtmp_amf_message_basic_handler(ngx_rtmp_session_t *s, - ngx_rtmp_header_t *h, ngx_chain_t *in, ngx_int_t name_typeless) +ngx_int_t +ngx_rtmp_amf_message_handler(ngx_rtmp_session_t *s, + ngx_rtmp_header_t *h, ngx_chain_t *in) { ngx_rtmp_amf_ctx_t act; ngx_rtmp_core_main_conf_t *cmcf; @@ -185,12 +185,24 @@ ngx_rtmp_amf_message_basic_handler(ngx_rtmp_session_t *s, /* AMF command names come with string type, but shared object names * come without type */ - if (name_typeless) { + if (h->type == NGX_RTMP_MSG_AMF_SHARED || + h->type == NGX_RTMP_MSG_AMF3_SHARED) + { elts[0].type |= NGX_RTMP_AMF_TYPELESS; } else { elts[0].type &= ~NGX_RTMP_AMF_TYPELESS; } + if ((h->type == NGX_RTMP_MSG_AMF3_SHARED || + h->type == NGX_RTMP_MSG_AMF3_META || + h->type == NGX_RTMP_MSG_AMF3_CMD) + && in->buf->last > in->buf->pos) + { + ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, + "AMF3 prefix: %ui", (ngx_int_t)*in->buf->pos); + ++in->buf->pos; + } + cmcf = ngx_rtmp_get_module_main_conf(s, ngx_rtmp_core_module); /* read AMF func name & transaction id */ @@ -233,22 +245,6 @@ ngx_rtmp_amf_message_basic_handler(ngx_rtmp_session_t *s, } -ngx_int_t -ngx_rtmp_amf_message_handler(ngx_rtmp_session_t *s, - ngx_rtmp_header_t *h, ngx_chain_t *in) -{ - return ngx_rtmp_amf_message_basic_handler(s, h, in, 0); -} - - -ngx_int_t -ngx_rtmp_amf_shared_object_handler(ngx_rtmp_session_t *s, - ngx_rtmp_header_t *h, ngx_chain_t *in) -{ - return ngx_rtmp_amf_message_basic_handler(s, h, in, 1); -} - - ngx_int_t ngx_rtmp_receive_amf(ngx_rtmp_session_t *s, ngx_chain_t *in, ngx_rtmp_amf_elt_t *elts, size_t nelts)