fixed compilation errors; first build

This commit is contained in:
Roman Arutyunyan
2012-03-08 21:45:10 +04:00
parent eb6a14fb6c
commit 93b4582afb
6 changed files with 124 additions and 115 deletions

View File

@ -17,6 +17,8 @@
#define NGX_RTMP_DEFAULT_CHUNK_SIZE 128 #define NGX_RTMP_DEFAULT_CHUNK_SIZE 128
#define NGX_LOG_DEBUG_RTMP NGX_LOG_DEBUG_CORE
typedef struct { typedef struct {
void **main_conf; void **main_conf;
@ -119,7 +121,7 @@ typedef struct {
#define NGX_RTMP_SUBSCRIBER 0x02 #define NGX_RTMP_SUBSCRIBER 0x02
typedef struct { struct ngx_rtmp_session_s {
uint32_t signature; /* "RTMP" */ uint32_t signature; /* "RTMP" */
ngx_connection_t *connection; ngx_connection_t *connection;
@ -128,6 +130,8 @@ typedef struct {
void **main_conf; void **main_conf;
void **srv_conf; void **srv_conf;
ngx_str_t *addr_text;
ngx_uint_t chunk_size; ngx_uint_t chunk_size;
ngx_chain_t *free; ngx_chain_t *free;
@ -148,10 +152,13 @@ typedef struct {
ngx_rtmp_packet_hdr_t out_hdr; ngx_rtmp_packet_hdr_t out_hdr;
/* broadcast */ /* broadcast */
ngx_str_t *name; ngx_str_t name;
ngx_rtmp_session_t *next; struct ngx_rtmp_session_s
*next;
ngx_uint_t flags; ngx_uint_t flags;
} ngx_rtmp_session_t; };
typedef struct ngx_rtmp_session_s ngx_rtmp_session_t;
#define NGX_RTMP_SESSION_HASH_SIZE 16384 #define NGX_RTMP_SESSION_HASH_SIZE 16384
@ -235,13 +242,11 @@ typedef struct {
void ngx_rtmp_init_connection(ngx_connection_t *c); void ngx_rtmp_init_connection(ngx_connection_t *c);
void ngx_rtmp_close_session(ngx_rtmp_session_t *s); void ngx_rtmp_close_session(ngx_rtmp_session_t *s);
u_char * ngx_rtmp_log_error(ngx_log_t *log, u_char *buf, size_t len); u_char * ngx_rtmp_log_error(ngx_log_t *log, u_char *buf, size_t len);
void ngx_rtmp_send(ngx_event_t *wev);
void ngx_rtmp_recv(ngx_event_t *wev);
void ngx_rtmp_set_chunk_size(ngx_rtmp_session_t *s, uint32_t chunk_size); void ngx_rtmp_set_chunk_size(ngx_rtmp_session_t *s, uint32_t chunk_size);
void ngx_rtmp_set_bytes_read(ngx_rtmp_session_t *s, uint32_t bytes_read); void ngx_rtmp_set_bytes_read(ngx_rtmp_session_t *s, uint32_t bytes_read);
void ngx_rtmp_set_client_buffer_time(ngx_rtmp_session_t *s, int16_t msec); void ngx_rtmp_set_client_buffer_time(ngx_rtmp_session_t *s, int16_t msec);
void ngx_rtmp_clear_buffer(ngx_rtmp_sesion_t *s); void ngx_rtmp_clear_buffer(ngx_rtmp_session_t *s);
void ngx_rtmp_set_ping_time(ngx_rtmp_session_t *s, int16_t msec); void ngx_rtmp_set_ping_time(ngx_rtmp_session_t *s, int16_t msec);
void ngx_rtmp_set_server_bw(ngx_rtmp_session_t *s, uint32_t bw, void ngx_rtmp_set_server_bw(ngx_rtmp_session_t *s, uint32_t bw,
uint8_t limit_type); uint8_t limit_type);
@ -260,6 +265,7 @@ void ngx_rtmp_send_packet(ngx_rtmp_session_t *s,
/* NetConnection methods */ /* NetConnection methods */
ngx_int_t ngx_rtmp_connect(ngx_rtmp_session_t *s, ngx_chain_t **l); ngx_int_t ngx_rtmp_connect(ngx_rtmp_session_t *s, ngx_chain_t **l);
ngx_int_t ngx_rtmp_call(ngx_rtmp_session_t *s, ngx_chain_t **l);
ngx_int_t ngx_rtmp_close(ngx_rtmp_session_t *s, ngx_chain_t **l); ngx_int_t ngx_rtmp_close(ngx_rtmp_session_t *s, ngx_chain_t **l);
ngx_int_t ngx_rtmp_createstream(ngx_rtmp_session_t *s, ngx_chain_t **l); ngx_int_t ngx_rtmp_createstream(ngx_rtmp_session_t *s, ngx_chain_t **l);

View File

@ -8,12 +8,13 @@
static ngx_int_t static ngx_int_t
ngx_rtmp_amf0_get(ngx_chain_t **l, void *p, size_t n) ngx_rtmp_amf0_get(ngx_chain_t **l, void *p, size_t n)
{ {
ngx_buf_t *b; ngx_buf_t *b;
size_t size;
if (!n) if (!n)
return; return NGX_OK;
for(; *l; l = &l->next) { for(; *l; l = &(*l)->next) {
b = (*l)->buf; b = (*l)->buf;
@ -24,8 +25,10 @@ ngx_rtmp_amf0_get(ngx_chain_t **l, void *p, size_t n)
return NGX_OK; return NGX_OK;
} }
size = b->last - b->pos;
if (p) if (p)
p = ngx_cpymem(p, b->pos, b->last - b->pos); p = ngx_cpymem(p, b->pos, size);
n -= size; n -= size;
} }
@ -37,7 +40,8 @@ ngx_rtmp_amf0_get(ngx_chain_t **l, void *p, size_t n)
static ngx_int_t static ngx_int_t
ngx_rtmp_amf0_put(ngx_chain_t **l, ngx_chain_t **free, void *p, size_t n) ngx_rtmp_amf0_put(ngx_chain_t **l, ngx_chain_t **free, void *p, size_t n)
{ {
ngx_buf_t *b; ngx_buf_t *b;
size_t size;
while(n) { while(n) {
b = (*l) ? (*l)->buf : NULL; b = (*l) ? (*l)->buf : NULL;
@ -59,20 +63,24 @@ ngx_rtmp_amf0_put(ngx_chain_t **l, ngx_chain_t **free, void *p, size_t n)
b->pos = b->last = b->start; b->pos = b->last = b->start;
} }
if (b->end - b->last <= n) { size = b->end - b->last;
if (size <= n) {
b->last = ngx_cpymem(b->last, p, n); b->last = ngx_cpymem(b->last, p, n);
return NGX_OK; return NGX_OK;
} }
b->last = ngx_cpymem(b->last, p, b->end - b->last); b->last = ngx_cpymem(b->last, p, size);
p += (b->end - b->last); p = (u_char*)p + size;
n -= (b->end - b->last); n -= size;
} }
return NGX_OK;
} }
static ngx_int_t static ngx_int_t
ngx_rtmp_amf0_read_object(ngx_chain_t **l, ngx_rtmp_amf0_objelt_t *elts, ngx_rtmp_amf0_read_object(ngx_chain_t **l, ngx_rtmp_amf0_elt_t *elts,
size_t nelts) size_t nelts)
{ {
uint8_t type; uint8_t type;
@ -81,8 +89,8 @@ ngx_rtmp_amf0_read_object(ngx_chain_t **l, ngx_rtmp_amf0_objelt_t *elts,
ngx_int_t rc; ngx_int_t rc;
maxlen = 0; maxlen = 0;
for(i = 0; i < n; ++i) { for(n = 0; n < nelts; ++n) {
namelen = strlen(v[n].name); namelen = strlen(elts[n].name);
if (namelen > maxlen) if (namelen > maxlen)
maxlen = namelen; maxlen = namelen;
} }
@ -117,11 +125,11 @@ ngx_rtmp_amf0_read_object(ngx_chain_t **l, ngx_rtmp_amf0_objelt_t *elts,
* then we could be able to use binary search */ * then we could be able to use binary search */
for(n = 0; n < nelts && strcmp(name, elts[n].name); ++n); for(n = 0; n < nelts && strcmp(name, elts[n].name); ++n);
if (ngx_rtmp_amf0_read(s, n < nelts ? &elts[n] : NULL, 1) != NGX_OK) if (ngx_rtmp_amf0_read(l, n < nelts ? &elts[n] : NULL, 1) != NGX_OK)
return NGX_ERROR; return NGX_ERROR;
} }
if (ngx_rtmp_amf0_get(l, type, 1) != NGX_OK if (ngx_rtmp_amf0_get(l, &type, 1) != NGX_OK
|| type != NGX_RTMP_AMF0_END) || type != NGX_RTMP_AMF0_END)
{ {
return NGX_ERROR; return NGX_ERROR;
@ -130,14 +138,14 @@ ngx_rtmp_amf0_read_object(ngx_chain_t **l, ngx_rtmp_amf0_objelt_t *elts,
return NGX_OK; return NGX_OK;
} }
#define NGX_RTMP_AMF0_TILL_END_FLAG (size_t(1) << (sizeof(size_t) * 8 - 1)) #define NGX_RTMP_AMF0_TILL_END_FLAG ((size_t)1 << (sizeof(size_t) * 8 - 1))
ngx_int_t ngx_int_t
ngx_rtmp_amf0_read(ngx_chain_t **l, ngx_rtmp_amf0_elt_t *elts, size_t nelts) ngx_rtmp_amf0_read(ngx_chain_t **l, ngx_rtmp_amf0_elt_t *elts, size_t nelts)
{ {
void *data; void *data;
uint8_t type; uint8_t type;
size_t n, clen; size_t n;
uint16_t len; uint16_t len;
ngx_int_t rc; ngx_int_t rc;
int till_end; int till_end;
@ -176,16 +184,16 @@ ngx_rtmp_amf0_read(ngx_chain_t **l, ngx_rtmp_amf0_elt_t *elts, size_t nelts)
if (data == NULL) { if (data == NULL) {
rc = ngx_rtmp_amf0_get(l, data, len); rc = ngx_rtmp_amf0_get(l, data, len);
} else if (elts->len <= len) } else if (elts->len <= len) {
rc = ngx_rtmp_amf0_get(l, data, elts->len - 1); rc = ngx_rtmp_amf0_get(l, data, elts->len - 1);
if (rc != NGX_OK) if (rc != NGX_OK)
return NGX_ERROR; return NGX_ERROR;
data[elts->len - 1] = 0; ((char*)data)[elts->len - 1] = 0;
rc = ngx_rtmp_amf0_get(l, NULL, len - elts->len + 1); rc = ngx_rtmp_amf0_get(l, NULL, len - elts->len + 1);
} else { } else {
rc = ngx_rtmp_amf0_get(l, data, len); rc = ngx_rtmp_amf0_get(l, data, len);
data[len] = 0; ((char*)data)[len] = 0;
} }
if (rc != NGX_OK) if (rc != NGX_OK)
@ -264,7 +272,6 @@ ngx_rtmp_amf0_write(ngx_chain_t **l, ngx_chain_t **free,
ngx_rtmp_amf0_elt_t *elts, size_t nelts) ngx_rtmp_amf0_elt_t *elts, size_t nelts)
{ {
size_t n; size_t n;
ngx_int_t rc;
uint8_t type; uint8_t type;
void *data; void *data;
uint16_t len; uint16_t len;

View File

@ -15,6 +15,9 @@
#define NGX_RTMP_AMF0_ARRAY 0x08 #define NGX_RTMP_AMF0_ARRAY 0x08
#define NGX_RTMP_AMF0_END 0x09 #define NGX_RTMP_AMF0_END 0x09
#include <ngx_config.h>
#include <ngx_core.h>
typedef struct { typedef struct {
ngx_int_t type; ngx_int_t type;
char *name; char *name;

View File

@ -18,8 +18,6 @@ static char *ngx_rtmp_core_server(ngx_conf_t *cf, ngx_command_t *cmd,
void *conf); void *conf);
static char *ngx_rtmp_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, static char *ngx_rtmp_core_listen(ngx_conf_t *cf, ngx_command_t *cmd,
void *conf); void *conf);
static char *ngx_rtmp_core_protocol(ngx_conf_t *cf, ngx_command_t *cmd,
void *conf);
static char *ngx_rtmp_core_resolver(ngx_conf_t *cf, ngx_command_t *cmd, static char *ngx_rtmp_core_resolver(ngx_conf_t *cf, ngx_command_t *cmd,
void *conf); void *conf);
@ -156,13 +154,10 @@ ngx_rtmp_core_create_srv_conf(ngx_conf_t *cf)
cscf->timeout = NGX_CONF_UNSET_MSEC; cscf->timeout = NGX_CONF_UNSET_MSEC;
cscf->resolver_timeout = NGX_CONF_UNSET_MSEC; cscf->resolver_timeout = NGX_CONF_UNSET_MSEC;
cscf->so_keepalive = NGX_CONF_UNSET; cscf->so_keepalive = NGX_CONF_UNSET;
cssf->buffers = NGX_CONF_UNSET; cscf->buffers = NGX_CONF_UNSET;
cscf->resolver = NGX_CONF_UNSET_PTR; cscf->resolver = NGX_CONF_UNSET_PTR;
cscf->file_name = cf->conf_file->file.name.data;
cscf->line = cf->conf_file->line;
return cscf; return cscf;
} }
@ -265,8 +260,6 @@ ngx_rtmp_core_server(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
static char * static char *
ngx_rtmp_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) ngx_rtmp_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
{ {
ngx_rtmp_core_srv_conf_t *cscf = conf;
size_t len, off; size_t len, off;
in_port_t port; in_port_t port;
ngx_str_t *value; ngx_str_t *value;
@ -361,17 +354,6 @@ ngx_rtmp_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
} }
module = ngx_modules[m]->ctx; module = ngx_modules[m]->ctx;
if (module->protocol == NULL) {
continue;
}
for (i = 0; module->protocol->port[i]; i++) {
if (module->protocol->port[i] == u.port) {
cscf->protocol = module->protocol;
break;
}
}
} }
for (i = 2; i < cf->args->nelts; i++) { for (i = 2; i < cf->args->nelts; i++) {

View File

@ -136,8 +136,8 @@ ngx_rtmp_init_connection(ngx_connection_t *c)
c->data = s; c->data = s;
s->connection = c; s->connection = c;
ngx_log_error(NGX_LOG_INFO, c->log, 0, "*%ui client %V connected to %V", ngx_log_error(NGX_LOG_INFO, c->log, 0, "*%ui client connected",
c->number, &c->addr_text, s->addr_text); c->number, &c->addr_text);
ctx = ngx_palloc(c->pool, sizeof(ngx_rtmp_log_ctx_t)); ctx = ngx_palloc(c->pool, sizeof(ngx_rtmp_log_ctx_t));
if (ctx == NULL) { if (ctx == NULL) {
@ -174,7 +174,7 @@ ngx_rtmp_init_session(ngx_connection_t *c)
s->ctx = ngx_pcalloc(c->pool, sizeof(void *) * ngx_rtmp_max_module); s->ctx = ngx_pcalloc(c->pool, sizeof(void *) * ngx_rtmp_max_module);
if (s->ctx == NULL) { if (s->ctx == NULL) {
ngx_rtmp_session_internal_server_error(s); ngx_rtmp_close_session(s);
return; return;
} }
@ -223,7 +223,7 @@ ngx_rtmp_handshake_recv(ngx_event_t *rev)
ngx_del_timer(rev); ngx_del_timer(rev);
} }
b = s->buf; b = &s->buf;
while(b->last != b->end) { while(b->last != b->end) {
@ -231,7 +231,7 @@ ngx_rtmp_handshake_recv(ngx_event_t *rev)
if (n == NGX_ERROR || n == 0) { if (n == NGX_ERROR || n == 0) {
ngx_rtmp_close_session(s); ngx_rtmp_close_session(s);
return NGX_ERROR; return;
} }
ngx_log_debug2(NGX_LOG_DEBUG_RTMP, c->log, 0, ngx_log_debug2(NGX_LOG_DEBUG_RTMP, c->log, 0,
@ -244,7 +244,7 @@ ngx_rtmp_handshake_recv(ngx_event_t *rev)
{ {
ngx_log_error(NGX_LOG_INFO, c->log, NGX_ERROR, ngx_log_error(NGX_LOG_INFO, c->log, NGX_ERROR,
"invalid handshake signature"); "invalid handshake signature");
ngx_rtmp_session_internal_server_error(s); ngx_rtmp_close_session(s);
return; return;
} }
b->last += n; b->last += n;
@ -255,7 +255,7 @@ ngx_rtmp_handshake_recv(ngx_event_t *rev)
ngx_add_timer(rev, cscf->timeout); ngx_add_timer(rev, cscf->timeout);
if (ngx_handle_read_event(c->read, 0) != NGX_OK) { if (ngx_handle_read_event(c->read, 0) != NGX_OK) {
ngx_rtmp_session_internal_server_error(s); ngx_rtmp_close_session(s);
} }
return; return;
@ -265,14 +265,13 @@ ngx_rtmp_handshake_recv(ngx_event_t *rev)
ngx_del_event(c->read, NGX_READ_EVENT, 0); ngx_del_event(c->read, NGX_READ_EVENT, 0);
if (s->hs_stage++ == 0) { if (s->hs_stage++ == 0) {
ngx_rtmp_handshake_send(c->wev); ngx_rtmp_handshake_send(c->write);
return; return;
} }
/* handshake done */ /* handshake done */
ngx_pfree(c->pool, s->buf->start); ngx_pfree(c->pool, s->buf.start);
s->buf = NULL;
c->read->handler = ngx_rtmp_recv; c->read->handler = ngx_rtmp_recv;
c->write->handler = ngx_rtmp_send; c->write->handler = ngx_rtmp_send;
@ -305,7 +304,7 @@ ngx_rtmp_handshake_send(ngx_event_t *wev)
ngx_del_timer(wev); ngx_del_timer(wev);
} }
b = s->buf; b = &s->buf;
restart: restart:
while(b->pos != b->last) { while(b->pos != b->last) {
@ -359,6 +358,7 @@ ngx_rtmp_recv(ngx_event_t *rev)
u_char h, *p; u_char h, *p;
ngx_chain_t *lin; ngx_chain_t *lin;
c = rev->data; c = rev->data;
s = c->data; s = c->data;
cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module);
@ -373,24 +373,27 @@ ngx_rtmp_recv(ngx_event_t *rev)
s->free = s->free->next; s->free = s->free->next;
s->in->next = NULL; s->in->next = NULL;
b = s->in->buf; b = s->in->buf;
b->pos = b->last = b->begin; b->pos = b->last = b->start;
} }
for(;;) { for(;;) {
/* find the last buf buf */
for(lin = s->in; lin->next; lin = lin->next); for(lin = s->in; lin->next; lin = lin->next);
b = lin->buf; b = lin->buf;
if (b->last >= b->end) if (b->last == b->end) {
break; ngx_rtmp_close_session(s);
return;
}
/* receive data from client */
n = c->recv(c, b->last, b->end - b->last); n = c->recv(c, b->last, b->end - b->last);
if (n == NGX_ERROR || n == 0) { if (n == NGX_ERROR || n == 0) {
ngx_rtmp_close_session(s); ngx_rtmp_close_session(s);
return NGX_ERROR; return;
} }
ngx_log_debug2(NGX_LOG_DEBUG_RTMP, c->log, 0, ngx_log_debug2(NGX_LOG_DEBUG_RTMP, c->log, 0,
@ -399,7 +402,7 @@ ngx_rtmp_recv(ngx_event_t *rev)
if (n == NGX_AGAIN) { if (n == NGX_AGAIN) {
if (ngx_handle_read_event(c->read, 0) != NGX_OK) { if (ngx_handle_read_event(c->read, 0) != NGX_OK) {
ngx_rtmp_session_internal_server_error(s); ngx_rtmp_close_session(s);
} }
return; return;
} }
@ -418,17 +421,17 @@ ngx_rtmp_recv(ngx_event_t *rev)
/* basic header */ /* basic header */
do { do {
p = b->start + 1;
if (s->in_hdr.hsize < 4) if (s->in_hdr.hsize < 4)
break; break;
/* TODO: check endians here */ /* TODO: check endians here */
p = b->start + 1;
/* /*
if (s->in_hdr.channel == 1) { if (s->in_hdr.channel == 1) {
p += 2; p += 2;
*/ }*/
}
s->in_hdr.timer = 0; s->in_hdr.timer = 0;
ngx_memcpy(&s->in_hdr.timer, p, 3); ngx_memcpy(&s->in_hdr.timer, p, 3);
@ -453,10 +456,10 @@ ngx_rtmp_recv(ngx_event_t *rev)
} while(0); } while(0);
if (b->last - p < ngx_min(s->in_hdr.size, s->chunk_size)) if (b->last - p < (ngx_int_t)ngx_min(s->in_hdr.size, s->chunk_size))
continue; continue;
b->pos = b; b->pos = p;
if (s->in_hdr.size > s->chunk_size) { if (s->in_hdr.size > s->chunk_size) {
@ -473,6 +476,8 @@ ngx_rtmp_recv(ngx_event_t *rev)
lin = lin->next; lin = lin->next;
lin->next = NULL; lin->next = NULL;
s->in_hdr.size -= s->chunk_size; s->in_hdr.size -= s->chunk_size;
bb = lin->buf;
bb->pos = bb->last = bb->start;
continue; continue;
} }
@ -484,11 +489,11 @@ ngx_rtmp_recv(ngx_event_t *rev)
} }
bb = s->in->buf; bb = s->in->buf;
bb->pos = bb->last = bb->begin; bb->pos = bb->last = bb->start;
/* copy remained data to first buffer */ /* copy remained data to first buffer */
if (s->in_hdr.size < b->last - b->pos) { if (s->in_hdr.size < b->last - b->pos) {
bb->last = ngx_movemem(bb->begin, bb->last = ngx_movemem(bb->start,
b->pos + s->in_hdr.size, b->pos + s->in_hdr.size,
b->last - b->pos - s->in_hdr.size); b->last - b->pos - s->in_hdr.size);
} }
@ -510,8 +515,7 @@ ngx_rtmp_send(ngx_event_t *wev)
ngx_connection_t *c; ngx_connection_t *c;
ngx_rtmp_session_t *s; ngx_rtmp_session_t *s;
ngx_rtmp_core_srv_conf_t *cscf; ngx_rtmp_core_srv_conf_t *cscf;
ngx_buf_t *b; ngx_chain_t *l, *ll;
ngc_chain_t *l, *ll;
c = wev->data; c = wev->data;
s = c->data; s = c->data;
@ -532,15 +536,15 @@ ngx_rtmp_send(ngx_event_t *wev)
l = c->send_chain(c, s->out, 0); l = c->send_chain(c, s->out, 0);
if (n == NGX_CHAIN_ERROR) { if (l == NGX_CHAIN_ERROR) {
ngx_rtmp_close_session(s); ngx_rtmp_close_session(s);
return; return;
} }
n = 0; n = 0;
if (l != c->out) { if (l != s->out) {
for(ll = c->out; ll->next && ll->next != l; ll = ll->next); for(ll = s->out; ll->next && ll->next != l; ll = ll->next);
ll->next = s->free; ll->next = s->free;
s->out = l; s->out = l;
} }
@ -567,7 +571,7 @@ ngx_rtmp_send(ngx_event_t *wev)
} }
void ngx_rtmp_session_t** ngx_rtmp_session_t**
ngx_rtmp_get_session_head(ngx_rtmp_session_t *s) ngx_rtmp_get_session_head(ngx_rtmp_session_t *s)
{ {
ngx_rtmp_core_srv_conf_t *cscf; ngx_rtmp_core_srv_conf_t *cscf;
@ -575,7 +579,7 @@ ngx_rtmp_get_session_head(ngx_rtmp_session_t *s)
cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module); cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module);
return &cscf->sessions[ return &cscf->sessions[
ngx_hash_key(s->name->data, s->name->len) ngx_hash_key(s->name.data, s->name.len)
% NGX_RTMP_SESSION_HASH_SIZE]; % NGX_RTMP_SESSION_HASH_SIZE];
} }
@ -583,7 +587,10 @@ ngx_rtmp_get_session_head(ngx_rtmp_session_t *s)
void void
ngx_rtmp_join(ngx_rtmp_session_t *s, ngx_str_t *name, ngx_uint_t flags) ngx_rtmp_join(ngx_rtmp_session_t *s, ngx_str_t *name, ngx_uint_t flags)
{ {
ngx_rtmp_session_t **ps; ngx_rtmp_session_t **ps;
ngx_connection_t *c;
c = s->connection;
if (s->name.len) { if (s->name.len) {
ngx_log_debug0(NGX_LOG_DEBUG_RTMP, c->log, 0, ngx_log_debug0(NGX_LOG_DEBUG_RTMP, c->log, 0,
@ -591,12 +598,12 @@ ngx_rtmp_join(ngx_rtmp_session_t *s, ngx_str_t *name, ngx_uint_t flags)
return; return;
} }
ngx_log_debug1(NGX_LOG_DEBUG_RTMP, c->log, 0, ngx_log_debug2(NGX_LOG_DEBUG_RTMP, c->log, 0,
"join name='%V' fd=%d", "join name='%V' fd=%d",
&name, c->fd); &name, c->fd);
s->name = name; s->name = *name;
ps = ngx_rtmp_get_session_head(s): ps = ngx_rtmp_get_session_head(s);
s->next = *ps; s->next = *ps;
s->flags = flags; s->flags = flags;
*ps = s; *ps = s;
@ -606,18 +613,21 @@ ngx_rtmp_join(ngx_rtmp_session_t *s, ngx_str_t *name, ngx_uint_t flags)
void void
ngx_rtmp_leave(ngx_rtmp_session_t *s) ngx_rtmp_leave(ngx_rtmp_session_t *s)
{ {
ngx_rtmp_session_t **ps; ngx_rtmp_session_t **ps;
ngx_connection_t *c;
c = s->connection;
if (!s->name.len) if (!s->name.len)
return; return;
ngx_log_debug1(NGX_LOG_DEBUG_RTMP, c->log, 0, ngx_log_debug2(NGX_LOG_DEBUG_RTMP, c->log, 0,
"leave name='%V' fd=%d", "leave name='%V' fd=%d",
&s->name, c->fd); &s->name, c->fd);
ps = ngx_rtmp_get_session_head(s); ps = ngx_rtmp_get_session_head(s);
ngx_str_null(&s->name): ngx_str_null(&s->name);
for(; *ps; ps = &(*ps)->next) { for(; *ps; ps = &(*ps)->next) {
if (*ps == s) { if (*ps == s) {
@ -632,11 +642,11 @@ void
ngx_rtmp_send_packet(ngx_rtmp_session_t *s, ngx_rtmp_packet_hdr_t *h, ngx_rtmp_send_packet(ngx_rtmp_session_t *s, ngx_rtmp_packet_hdr_t *h,
ngx_chain_t *l) ngx_chain_t *l)
{ {
ngx_rtmp_packet_hdr_t *lh; ngx_rtmp_packet_hdr_t *lh;
size_t hsel, size; size_t hsel, hsize, size;
ngx_chain_t *ll, **pl; ngx_chain_t *ll, **pl;
ngx_buf_t *b, *bb; ngx_buf_t *b, *bb;
u_char *p, *pp; u_char *p, *pp;
if (l == NULL) if (l == NULL)
return; return;
@ -704,7 +714,7 @@ ngx_rtmp_send_packet(ngx_rtmp_session_t *s, ngx_rtmp_packet_hdr_t *h,
pp = bb->pos; pp = bb->pos;
*pp++ = (((u8)hsel & 0x03) << 6) | (h->channel & 0x3f); *pp++ = (((uint8_t)hsel & 0x03) << 6) | (h->channel & 0x3f);
if (hsize == 1) if (hsize == 1)
continue; continue;
@ -727,7 +737,7 @@ ngx_rtmp_send_packet(ngx_rtmp_session_t *s, ngx_rtmp_packet_hdr_t *h,
} }
ngx_int_t ngx_rtmp_receive_packet(ngx_rtmp_session *s, ngx_int_t ngx_rtmp_receive_packet(ngx_rtmp_session_t *s,
ngx_rtmp_packet_hdr_t *h, ngx_chain_t *l) ngx_rtmp_packet_hdr_t *h, ngx_chain_t *l)
{ {
ngx_rtmp_core_srv_conf_t *cscf; ngx_rtmp_core_srv_conf_t *cscf;
@ -738,11 +748,11 @@ ngx_int_t ngx_rtmp_receive_packet(ngx_rtmp_session *s,
uint16_t *v2; uint16_t *v2;
uint16_t *v3; uint16_t *v3;
} ping; } ping;
ngx_session_t *ss; ngx_rtmp_session_t *ss;
static char invoke_name[64]; static char invoke_name[64];
static ngx_rtmp_amf0_elt *invoke_name_elt = { static ngx_rtmp_amf0_elt_t invoke_name_elt = {
NGX_RTMP_AMF0_STRING, NGX_RTMP_AMF0_STRING,
0, NULL,
invoke_name, invoke_name,
sizeof(invoke_name) sizeof(invoke_name)
}; };
@ -756,17 +766,17 @@ ngx_int_t ngx_rtmp_receive_packet(ngx_rtmp_session *s,
#ifdef NGX_DEBUG #ifdef NGX_DEBUG
{ {
int nch; int nch;
ngx_chain_t ch; ngx_chain_t *ch;
for(nch = 1, ch = l; ch->next; ch = ch->next, ++nch); for(nch = 1, ch = l; ch->next; ch = ch->next, ++nch);
ngx_log_debug1(NGX_LOG_DEBUG_RTMP, c->log, 0, ngx_log_debug8(NGX_LOG_DEBUG_RTMP, c->log, 0,
"RTMP packet received type=%d channel=%d hsize=%d " "RTMP packet received type=%d channel=%d hsize=%d "
"size=%d timer=%D stream=%D nbufs=%d fd=%d", "size=%d timer=%D stream=%D nbufs=%d fd=%d",
int(h->type), (int)h->type,
int(h->channel), (int)h->channel,
int(h->hsize), (int)h->hsize,
int(h->size), (int)h->size,
h->timer, h->timer,
h->stream, h->stream,
nch, nch,
@ -783,13 +793,13 @@ ngx_int_t ngx_rtmp_receive_packet(ngx_rtmp_session *s,
case NGX_RTMP_PACKET_CHUNK_SIZE: case NGX_RTMP_PACKET_CHUNK_SIZE:
if (b->last - b->pos < 4) if (b->last - b->pos < 4)
return NGX_ERROR; return NGX_ERROR;
ngx_rtmp_set_chunk_size(s, *(uint32_t*)(b->pos)); /*ngx_rtmp_set_chunk_size(s, *(uint32_t*)(b->pos));*/
break; break;
case NGX_RTMP_PACKET_BYTES_READ: case NGX_RTMP_PACKET_BYTES_READ:
if (b->last - b->pos < 4) if (b->last - b->pos < 4)
return NGX_ERROR; return NGX_ERROR;
ngx_rtmp_set_bytes_read(s, *(uint32_t*)(b->pos)); /*ngx_rtmp_set_bytes_read(s, *(uint32_t*)(b->pos));*/
break; break;
case NGX_RTMP_PACKET_PING: case NGX_RTMP_PACKET_PING:
@ -834,20 +844,20 @@ ngx_int_t ngx_rtmp_receive_packet(ngx_rtmp_session *s,
if (b->last - b->pos < 4) if (b->last - b->pos < 4)
return NGX_ERROR; return NGX_ERROR;
ngx_rtmp_set_server_bw(s, *(uint32_t*)b->pos, /*ngx_rtmp_set_server_bw(s, *(uint32_t*)b->pos,
b->last - b->pos >= 5 b->last - b->pos >= 5
? *(uint8_t*)(b->pos + 4) ? *(uint8_t*)(b->pos + 4)
: 0); : 0);*/
break; break;
case NGX_RTMP_PACKET_CLIENT_BW: case NGX_RTMP_PACKET_CLIENT_BW:
if (b->last - b->pos < 4) if (b->last - b->pos < 4)
return NGX_ERROR; return NGX_ERROR;
ngx_rtmp_set_client_bw(s, *(uint32_t*)b->pos, /*ngx_rtmp_set_client_bw(s, *(uint32_t*)b->pos,
b->last - b->pos >= 5 b->last - b->pos >= 5
? *(uint8_t*)(b->pos + 4) ? *(uint8_t*)(b->pos + 4)
: 0); : 0);*/
break; break;
case NGX_RTMP_PACKET_AUDIO: case NGX_RTMP_PACKET_AUDIO:
@ -896,7 +906,6 @@ ngx_int_t ngx_rtmp_receive_packet(ngx_rtmp_session *s,
memset(invoke_name, 0, sizeof(invoke_name)); memset(invoke_name, 0, sizeof(invoke_name));
if (ngx_rtmp_amf0_read(&l, &invoke_name_elt, 1) != NGX_OK) { if (ngx_rtmp_amf0_read(&l, &invoke_name_elt, 1) != NGX_OK) {
{
return NGX_ERROR; return NGX_ERROR;
} }
@ -906,7 +915,7 @@ ngx_int_t ngx_rtmp_receive_packet(ngx_rtmp_session *s,
#define INVOKE_CALL(name) \ #define INVOKE_CALL(name) \
if (!strncasecmp(invoke_name, #name)) { \ if (!strcasecmp(invoke_name, #name)) { \
return ngx_rtmp_##name(s, &l); \ return ngx_rtmp_##name(s, &l); \
} }
@ -937,13 +946,13 @@ ngx_int_t ngx_rtmp_receive_packet(ngx_rtmp_session *s,
/* no support for flex */ /* no support for flex */
ngx_log_debug2(NGX_LOG_DEBUG_RTMP, c->log, 0, ngx_log_debug2(NGX_LOG_DEBUG_RTMP, c->log, 0,
"flex packets are not supported type=%d fd=%d", "flex packets are not supported type=%d fd=%d",
int(h->type), c->fd); (int)h->type, c->fd);
break; break;
default: default:
ngx_log_debug2(NGX_LOG_DEBUG_RTMP, c->log, 0, ngx_log_debug2(NGX_LOG_DEBUG_RTMP, c->log, 0,
"unsupported packet type type=%d fd=%d", "unsupported packet type type=%d fd=%d",
int(h->type), c->fd); (int)h->type, c->fd);
} }
return NGX_OK; return NGX_OK;
@ -953,11 +962,6 @@ ngx_int_t ngx_rtmp_receive_packet(ngx_rtmp_session *s,
void void
ngx_rtmp_close_session(ngx_rtmp_session_t *s) ngx_rtmp_close_session(ngx_rtmp_session_t *s)
{ {
ngx_pool_t *pool;
ngx_connection_t *c;
ngx_rtmp_session_t *ps;
ngx_rtmp_broadcast_t *bc;
ngx_rtmp_leave(s); ngx_rtmp_leave(s);
ngx_rtmp_close_connection(s->connection); ngx_rtmp_close_connection(s->connection);
@ -967,6 +971,7 @@ ngx_rtmp_close_session(ngx_rtmp_session_t *s)
void void
ngx_rtmp_close_connection(ngx_connection_t *c) ngx_rtmp_close_connection(ngx_connection_t *c)
{ {
ngx_pool_t *pool;
ngx_log_debug1(NGX_LOG_DEBUG_RTMP, c->log, 0, ngx_log_debug1(NGX_LOG_DEBUG_RTMP, c->log, 0,
"close connection: %d", c->fd); "close connection: %d", c->fd);

View File

@ -10,6 +10,12 @@ ngx_rtmp_connect(ngx_rtmp_session_t *s, ngx_chain_t **l)
return NGX_OK; return NGX_OK;
} }
ngx_int_t
ngx_rtmp_call(ngx_rtmp_session_t *s, ngx_chain_t **l)
{
return NGX_OK;
}
ngx_int_t ngx_int_t
ngx_rtmp_close(ngx_rtmp_session_t *s, ngx_chain_t **l) ngx_rtmp_close(ngx_rtmp_session_t *s, ngx_chain_t **l)
{ {