added amf3_* handlers; this adds compatibility with amf3 players (srobe etc)

This commit is contained in:
Roman Arutyunyan 2012-06-11 01:02:53 +04:00
parent 4b25e34338
commit 6143abc418
5 changed files with 34 additions and 29 deletions

View file

@ -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;

View file

@ -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,

View file

@ -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;

View file

@ -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",

View file

@ -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)