implemented amf_create & fixed memory keak

This commit is contained in:
Roman Arutyunyan 2012-04-05 14:58:10 +04:00
parent cd3aea8d8c
commit 20a8d06eb6
3 changed files with 34 additions and 6 deletions

View file

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

View file

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

View file

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