mirror of
https://github.com/zotanmew/nginx-rtmp-module.git
synced 2024-05-20 18:01:08 +02:00
added amf3_* handlers; this adds compatibility with amf3 players (srobe etc)
This commit is contained in:
parent
4b25e34338
commit
6143abc418
10
ngx_rtmp.c
10
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[] = {
|
static size_t amf_events[] = {
|
||||||
|
NGX_RTMP_MSG_AMF_CMD,
|
||||||
NGX_RTMP_MSG_AMF_META,
|
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 */
|
/* 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;
|
*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 */
|
/* init user protocol events */
|
||||||
eh = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_USER]);
|
eh = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_USER]);
|
||||||
*eh = ngx_rtmp_user_message_handler;
|
*eh = ngx_rtmp_user_message_handler;
|
||||||
|
|
|
@ -94,6 +94,10 @@ ngx_rtmp_cmd_connect_init(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,
|
||||||
{ NGX_RTMP_AMF_STRING,
|
{ NGX_RTMP_AMF_STRING,
|
||||||
ngx_string("pageUrl"),
|
ngx_string("pageUrl"),
|
||||||
v.page_url, sizeof(v.page_url) },
|
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[] = {
|
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);
|
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' "
|
"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,
|
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;
|
trans = v->trans;
|
||||||
|
|
||||||
|
@ -247,6 +253,8 @@ ngx_rtmp_cmd_connect(ngx_rtmp_session_t *s, ngx_rtmp_connect_t *v)
|
||||||
return NGX_ERROR;
|
return NGX_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
object_encoding = v->object_encoding;
|
||||||
|
|
||||||
/* send all replies */
|
/* send all replies */
|
||||||
return ngx_rtmp_send_ack_size(s, cscf->ack_window) != NGX_OK
|
return ngx_rtmp_send_ack_size(s, cscf->ack_window) != NGX_OK
|
||||||
|| ngx_rtmp_send_bandwidth(s, cscf->ack_window,
|
|| ngx_rtmp_send_bandwidth(s, cscf->ack_window,
|
||||||
|
|
|
@ -29,6 +29,7 @@ typedef struct {
|
||||||
double acodecs;
|
double acodecs;
|
||||||
double vcodecs;
|
double vcodecs;
|
||||||
u_char page_url[NGX_RTMP_MAX_URL];
|
u_char page_url[NGX_RTMP_MAX_URL];
|
||||||
|
double object_encoding;
|
||||||
} ngx_rtmp_connect_t;
|
} ngx_rtmp_connect_t;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -41,7 +41,7 @@ ngx_rtmp_message_type(uint8_t type)
|
||||||
"?",
|
"?",
|
||||||
"amf3_meta",
|
"amf3_meta",
|
||||||
"amf3_shared",
|
"amf3_shared",
|
||||||
"amd3_cmd",
|
"amf3_cmd",
|
||||||
"amf_meta",
|
"amf_meta",
|
||||||
"amf_shared",
|
"amf_shared",
|
||||||
"amf_cmd",
|
"amf_cmd",
|
||||||
|
|
|
@ -164,9 +164,9 @@ ngx_rtmp_user_message_handler(ngx_rtmp_session_t *s,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static ngx_int_t
|
ngx_int_t
|
||||||
ngx_rtmp_amf_message_basic_handler(ngx_rtmp_session_t *s,
|
ngx_rtmp_amf_message_handler(ngx_rtmp_session_t *s,
|
||||||
ngx_rtmp_header_t *h, ngx_chain_t *in, ngx_int_t name_typeless)
|
ngx_rtmp_header_t *h, ngx_chain_t *in)
|
||||||
{
|
{
|
||||||
ngx_rtmp_amf_ctx_t act;
|
ngx_rtmp_amf_ctx_t act;
|
||||||
ngx_rtmp_core_main_conf_t *cmcf;
|
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
|
/* AMF command names come with string type, but shared object names
|
||||||
* come without type */
|
* 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;
|
elts[0].type |= NGX_RTMP_AMF_TYPELESS;
|
||||||
} else {
|
} else {
|
||||||
elts[0].type &= ~NGX_RTMP_AMF_TYPELESS;
|
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);
|
cmcf = ngx_rtmp_get_module_main_conf(s, ngx_rtmp_core_module);
|
||||||
|
|
||||||
/* read AMF func name & transaction id */
|
/* 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_int_t
|
||||||
ngx_rtmp_receive_amf(ngx_rtmp_session_t *s, ngx_chain_t *in,
|
ngx_rtmp_receive_amf(ngx_rtmp_session_t *s, ngx_chain_t *in,
|
||||||
ngx_rtmp_amf_elt_t *elts, size_t nelts)
|
ngx_rtmp_amf_elt_t *elts, size_t nelts)
|
||||||
|
|
Loading…
Reference in a new issue