nginx-mod-rtmp/ngx_rtmp_send.c

232 lines
5.3 KiB
C
Raw Normal View History

/*
* Copyright (c) 2012 Roman Arutyunyan
*/
2012-03-13 06:41:51 +01:00
#include "ngx_rtmp.h"
2012-03-29 14:10:11 +02:00
#include "ngx_rtmp_amf.h"
2012-03-12 00:44:58 +01:00
2012-03-13 14:51:41 +01:00
#define NGX_RTMP_USER_START(s, tp) \
ngx_rtmp_header_t __h; \
ngx_chain_t *__l; \
ngx_buf_t *__b; \
ngx_rtmp_core_srv_conf_t *__cscf; \
2012-03-12 00:44:58 +01:00
\
__cscf = ngx_rtmp_get_module_srv_conf( \
s, ngx_rtmp_core_module); \
2012-03-13 06:41:51 +01:00
memset(&__h, 0, sizeof(__h)); \
__h.type = tp; \
2012-03-12 00:44:58 +01:00
__h.csid = 2; \
__l = ngx_rtmp_alloc_shared_buf(__cscf); \
2012-03-12 00:44:58 +01:00
if (__l == NULL) { \
return NGX_ERROR; \
} \
2012-03-13 06:41:51 +01:00
__b = __l->buf;
2012-03-12 00:44:58 +01:00
#define NGX_RTMP_UCTL_START(s, type, utype) \
2012-03-13 14:51:41 +01:00
NGX_RTMP_USER_START(s, type); \
2012-03-13 06:41:51 +01:00
*(__b->last++) = (u_char)((utype) >> 8); \
*(__b->last++) = (u_char)(utype);
2012-03-12 00:44:58 +01:00
2012-03-13 14:51:41 +01:00
#define NGX_RTMP_USER_OUT1(v) \
2012-03-13 06:41:51 +01:00
*(__b->last++) = ((u_char*)&v)[0];
2012-03-12 00:44:58 +01:00
2012-03-13 14:51:41 +01:00
#define NGX_RTMP_USER_OUT4(v) \
2012-03-13 06:41:51 +01:00
*(__b->last++) = ((u_char*)&v)[3]; \
*(__b->last++) = ((u_char*)&v)[2]; \
*(__b->last++) = ((u_char*)&v)[1]; \
*(__b->last++) = ((u_char*)&v)[0];
2012-03-12 00:44:58 +01:00
2012-03-13 14:51:41 +01:00
#define NGX_RTMP_USER_END(s) \
ngx_rtmp_prepare_message(s, &__h, NULL, __l); \
2012-03-18 14:09:19 +01:00
return ngx_rtmp_send_message(s, __l, 0); \
2012-03-12 00:44:58 +01:00
/* Protocol control messages */
ngx_int_t
ngx_rtmp_send_chunk_size(ngx_rtmp_session_t *s, uint32_t chunk_size)
{
2012-03-13 06:41:51 +01:00
NGX_RTMP_USER_START(s, NGX_RTMP_MSG_CHUNK_SIZE);
2012-03-12 00:44:58 +01:00
2012-03-13 06:41:51 +01:00
NGX_RTMP_USER_OUT4(chunk_size);
2012-03-12 00:44:58 +01:00
2012-03-13 06:41:51 +01:00
NGX_RTMP_USER_END(s);
2012-03-12 00:44:58 +01:00
}
ngx_int_t
ngx_rtmp_send_abort(ngx_rtmp_session_t *s, uint32_t csid)
{
2012-03-13 06:41:51 +01:00
NGX_RTMP_USER_START(s, NGX_RTMP_MSG_CHUNK_SIZE);
2012-03-12 00:44:58 +01:00
2012-03-13 06:41:51 +01:00
NGX_RTMP_USER_OUT4(csid);
2012-03-12 00:44:58 +01:00
2012-03-13 06:41:51 +01:00
NGX_RTMP_USER_END(s);
2012-03-12 00:44:58 +01:00
}
ngx_int_t
ngx_rtmp_send_ack(ngx_rtmp_session_t *s, uint32_t seq)
{
2012-03-13 06:41:51 +01:00
NGX_RTMP_USER_START(s, NGX_RTMP_MSG_ACK);
2012-03-12 00:44:58 +01:00
2012-03-13 06:41:51 +01:00
NGX_RTMP_USER_OUT4(seq);
2012-03-12 00:44:58 +01:00
2012-03-13 06:41:51 +01:00
NGX_RTMP_USER_END(s);
2012-03-12 00:44:58 +01:00
}
ngx_int_t
ngx_rtmp_send_ack_size(ngx_rtmp_session_t *s, uint32_t ack_size)
{
2012-03-13 06:41:51 +01:00
NGX_RTMP_USER_START(s, NGX_RTMP_MSG_ACK_SIZE);
2012-03-12 00:44:58 +01:00
2012-03-13 06:41:51 +01:00
NGX_RTMP_USER_OUT4(ack_size);
2012-03-12 00:44:58 +01:00
2012-03-13 06:41:51 +01:00
NGX_RTMP_USER_END(s);
2012-03-12 00:44:58 +01:00
}
ngx_int_t
ngx_rtmp_send_bandwidth(ngx_rtmp_session_t *s, uint32_t ack_size,
uint8_t limit_type)
{
2012-03-13 06:41:51 +01:00
NGX_RTMP_USER_START(s, NGX_RTMP_MSG_BANDWIDTH);
2012-03-12 00:44:58 +01:00
2012-03-13 06:41:51 +01:00
NGX_RTMP_USER_OUT4(ack_size);
NGX_RTMP_USER_OUT1(limit_type);
2012-03-12 00:44:58 +01:00
2012-03-13 06:41:51 +01:00
NGX_RTMP_USER_END(s);
2012-03-12 00:44:58 +01:00
}
/* User control messages */
ngx_int_t
ngx_rtmp_send_user_stream_begin(ngx_rtmp_session_t *s, uint32_t msid)
{
2012-03-13 06:41:51 +01:00
NGX_RTMP_UCTL_START(s, NGX_RTMP_MSG_USER, NGX_RTMP_USER_STREAM_BEGIN);
2012-03-12 00:44:58 +01:00
2012-03-13 06:41:51 +01:00
NGX_RTMP_USER_OUT4(msid);
2012-03-12 00:44:58 +01:00
2012-03-13 06:41:51 +01:00
NGX_RTMP_USER_END(s);
2012-03-12 00:44:58 +01:00
}
ngx_int_t
ngx_rtmp_send_user_stream_eof(ngx_rtmp_session_t *s, uint32_t msid)
{
2012-03-13 06:41:51 +01:00
NGX_RTMP_UCTL_START(s, NGX_RTMP_MSG_USER, NGX_RTMP_USER_STREAM_EOF);
2012-03-12 00:44:58 +01:00
2012-03-13 06:41:51 +01:00
NGX_RTMP_USER_OUT4(msid);
2012-03-12 00:44:58 +01:00
2012-03-13 06:41:51 +01:00
NGX_RTMP_USER_END(s);
2012-03-12 00:44:58 +01:00
}
ngx_int_t
ngx_rtmp_send_user_stream_dry(ngx_rtmp_session_t *s, uint32_t msid)
{
2012-03-13 06:41:51 +01:00
NGX_RTMP_UCTL_START(s, NGX_RTMP_MSG_USER, NGX_RTMP_USER_STREAM_DRY);
2012-03-12 00:44:58 +01:00
2012-03-13 06:41:51 +01:00
NGX_RTMP_USER_OUT4(msid);
2012-03-12 00:44:58 +01:00
2012-03-13 06:41:51 +01:00
NGX_RTMP_USER_END(s);
2012-03-12 00:44:58 +01:00
}
ngx_int_t
ngx_rtmp_send_user_set_buflen(ngx_rtmp_session_t *s, uint32_t msid,
uint32_t buflen_msec)
{
2012-03-13 06:41:51 +01:00
NGX_RTMP_UCTL_START(s, NGX_RTMP_MSG_USER, NGX_RTMP_USER_SET_BUFLEN);
2012-03-12 00:44:58 +01:00
2012-03-13 06:41:51 +01:00
NGX_RTMP_USER_OUT4(msid);
NGX_RTMP_USER_OUT4(buflen_msec);
2012-03-12 00:44:58 +01:00
2012-03-13 06:41:51 +01:00
NGX_RTMP_USER_END(s);
2012-03-12 00:44:58 +01:00
}
ngx_int_t
ngx_rtmp_send_user_recorded(ngx_rtmp_session_t *s, uint32_t msid)
{
2012-03-13 06:41:51 +01:00
NGX_RTMP_UCTL_START(s, NGX_RTMP_MSG_USER, NGX_RTMP_USER_RECORDED);
2012-03-12 00:44:58 +01:00
2012-03-13 06:41:51 +01:00
NGX_RTMP_USER_OUT4(msid);
2012-03-12 00:44:58 +01:00
2012-03-13 06:41:51 +01:00
NGX_RTMP_USER_END(s);
2012-03-12 00:44:58 +01:00
}
ngx_int_t
ngx_rtmp_send_user_ping_request(ngx_rtmp_session_t *s, uint32_t timestamp)
{
2012-03-13 06:41:51 +01:00
NGX_RTMP_UCTL_START(s, NGX_RTMP_MSG_USER, NGX_RTMP_USER_PING_REQUEST);
2012-03-12 00:44:58 +01:00
2012-03-13 06:41:51 +01:00
NGX_RTMP_USER_OUT4(timestamp);
2012-03-12 00:44:58 +01:00
2012-03-13 06:41:51 +01:00
NGX_RTMP_USER_END(s);
2012-03-12 00:44:58 +01:00
}
ngx_int_t
ngx_rtmp_send_user_ping_response(ngx_rtmp_session_t *s, uint32_t timestamp)
{
2012-03-13 06:41:51 +01:00
NGX_RTMP_UCTL_START(s, NGX_RTMP_MSG_USER, NGX_RTMP_USER_PING_RESPONSE);
2012-03-12 00:44:58 +01:00
2012-03-13 06:41:51 +01:00
NGX_RTMP_USER_OUT4(timestamp);
2012-03-12 00:44:58 +01:00
2012-03-13 06:41:51 +01:00
NGX_RTMP_USER_END(s);
2012-03-12 00:44:58 +01:00
}
2012-03-13 06:41:51 +01:00
2012-03-17 23:16:59 +01:00
ngx_int_t
ngx_rtmp_send_user_unknown(ngx_rtmp_session_t *s, uint32_t timestamp)
{
static uint32_t zero;
static uint32_t one = 1;
uint32_t val;
NGX_RTMP_UCTL_START(s, NGX_RTMP_MSG_USER, NGX_RTMP_USER_UNKNOWN);
NGX_RTMP_USER_OUT4(zero);
NGX_RTMP_USER_OUT4(one);
val = timestamp & 0x7fffffff;
NGX_RTMP_USER_OUT4(val);
NGX_RTMP_USER_END(s);
}
2012-03-29 14:10:11 +02:00
/* AMF sender */
2012-03-12 00:44:58 +01:00
ngx_int_t
2012-03-29 14:10:11 +02:00
ngx_rtmp_send_amf(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,
ngx_rtmp_amf_elt_t *elts, size_t nelts)
2012-03-12 00:44:58 +01:00
{
2012-03-29 14:10:11 +02:00
ngx_rtmp_amf_ctx_t act;
ngx_rtmp_core_srv_conf_t *cscf;
cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module);
2012-03-13 06:41:51 +01:00
memset(&act, 0, sizeof(act));
act.cscf = cscf;
2012-03-13 06:41:51 +01:00
act.alloc = ngx_rtmp_alloc_shared_buf;
act.log = s->connection->log;
2012-03-29 14:10:11 +02:00
if (ngx_rtmp_amf_write(&act, elts, nelts) != NGX_OK) {
if (act.first) {
ngx_rtmp_free_shared_bufs(cscf, act.first);
}
2012-03-12 00:44:58 +01:00
return NGX_ERROR;
}
2012-03-13 06:41:51 +01:00
if (act.first) {
ngx_rtmp_prepare_message(s, h, NULL, act.first);
2012-03-18 14:09:19 +01:00
return ngx_rtmp_send_message(s, act.first, 0);
2012-03-13 06:41:51 +01:00
}
return NGX_OK;
2012-03-12 00:44:58 +01:00
}