ngx_int_t ngx_rtmp_user_message_handler(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, ngx_chain_t *in) { ngx_buf_t *b; u_char *p; uint16_t evt; uint32_t val; b = in->buf; if (b->last - b->pos < 6) { ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, "too small buffer for user message: %d", b->last - b->pos); return NGX_OK; } p = (u_char*)&evt; p[0] = b->pos[1]; p[1] = b->pos[0]; ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, "RTMP recv user evt %s (%i)", ngx_rtmp_user_message_type(evt), (ngx_int_t) evt); p = (u_char *) &val; p[0] = b->pos[5]; p[1] = b->pos[4]; p[2] = b->pos[3]; p[3] = b->pos[2]; switch(evt) { case NGX_RTMP_USER_STREAM_BEGIN: { ngx_rtmp_stream_begin_t v; v.msid = val; ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, "receive: stream_begin msid=%uD", v.msid); return ngx_rtmp_stream_begin(s, &v); } case NGX_RTMP_USER_STREAM_EOF: { ngx_rtmp_stream_eof_t v; v.msid = val; ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, "receive: stream_eof msid=%uD", v.msid); return ngx_rtmp_stream_eof(s, &v); } case NGX_RTMP_USER_STREAM_DRY: { ngx_rtmp_stream_dry_t v; v.msid = val; ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, "receive: stream_dry msid=%uD", v.msid); return ngx_rtmp_stream_dry(s, &v); } case NGX_RTMP_USER_SET_BUFLEN: { ngx_rtmp_set_buflen_t v; v.msid = val; if (b->last - b->pos < 10) { return NGX_OK; } p = (u_char *) &v.buflen; p[0] = b->pos[9]; p[1] = b->pos[8]; p[2] = b->pos[7]; p[3] = b->pos[6]; ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, "receive: set_buflen msid=%uD buflen=%uD", v.msid, v.buflen); /*TODO: move this to play module */ s->buflen = v.buflen; return ngx_rtmp_set_buflen(s, &v); } case NGX_RTMP_USER_RECORDED: { ngx_rtmp_recorded_t v; v.msid = val; ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, "receive: recorded msid=%uD", v.msid); return ngx_rtmp_recorded(s, &v); } case NGX_RTMP_USER_PING_REQUEST: return ngx_rtmp_send_ping_response(s, val); case NGX_RTMP_USER_PING_RESPONSE: /* val = incoming timestamp */ ngx_rtmp_reset_ping(s); return NGX_OK; default: ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, "unexpected user event: %i", (ngx_int_t) evt); return NGX_OK; } }
ngx_int_t ngx_rtmp_user_message_handler(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, ngx_chain_t *in) { ngx_buf_t *b; u_char *p; uint16_t evt; uint32_t val, arg; b = in->buf; if (b->last - b->pos < 6) { ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, "too small buffer for user message: %d", b->last - b->pos); return NGX_OK; } p = (u_char*)&evt; p[0] = b->pos[1]; p[1] = b->pos[0]; ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, "RTMP recv user evt %s (%d)", ngx_rtmp_user_message_type(evt), (int)evt); p = (u_char*)&val; p[0] = b->pos[5]; p[1] = b->pos[4]; p[2] = b->pos[3]; p[3] = b->pos[2]; switch(evt) { case NGX_RTMP_USER_STREAM_BEGIN: /* use =val as stream id which started */ break; case NGX_RTMP_USER_STREAM_EOF: /* use =val as stream id which is over */ break; case NGX_RTMP_USER_STREAM_DRY: /* stream =val is dry */ break; case NGX_RTMP_USER_SET_BUFLEN: if (b->last - b->pos >= 10) { p = (u_char*)&arg; p[0] = b->pos[9]; p[1] = b->pos[8]; p[2] = b->pos[7]; p[3] = b->pos[6]; /* use =val as stream id && arg as buflen in msec*/ ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, "msid=%uD buflen: %uD (msec)", val, arg); s->buflen = arg; } break; case NGX_RTMP_USER_RECORDED: /* stream =val is recorded */ break; case NGX_RTMP_USER_PING_REQUEST: ngx_rtmp_send_user_ping_response(s, val); break; case NGX_RTMP_USER_PING_RESPONSE: /* use =val as incoming timestamp */ ngx_rtmp_reset_ping(s); break; default: ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0, "unexpected user event: %d", (int)evt); return NGX_OK; } return NGX_OK; }