From b5461f61c6833aee803b5134f2285aa652978e09 Mon Sep 17 00:00:00 2001 From: Roman Arutyunyan Date: Sun, 28 Oct 2012 15:10:12 +0400 Subject: [PATCH] fixed stat & live module --- ngx_rtmp_live_module.c | 49 ++++++++++++++++++++++++++---------------- ngx_rtmp_live_module.h | 3 ++- ngx_rtmp_stat_module.c | 15 ++++++------- 3 files changed, 38 insertions(+), 29 deletions(-) diff --git a/ngx_rtmp_live_module.c b/ngx_rtmp_live_module.c index 00e7dcd..1a97da2 100644 --- a/ngx_rtmp_live_module.c +++ b/ngx_rtmp_live_module.c @@ -377,10 +377,10 @@ ngx_rtmp_live_av(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, sync = 0; peers = 0; - header = NULL; aheader = NULL; rheader = NULL; apkt = NULL; + header = NULL; header_version = 0; meta = NULL; meta_version = 0; @@ -460,13 +460,6 @@ ngx_rtmp_live_av(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, ss = pctx->session; cs = &pctx->cs[csidx]; - ch.timestamp = timestamp; - if (lacf->atc == 0) { - ch.timestamp -= (uint32_t) ss->epoch; - } - - lh.timestamp = ch.timestamp - delta; - /* send metadata */ if (meta && meta_version != pctx->meta_version) { @@ -480,28 +473,42 @@ ngx_rtmp_live_av(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, /* sync stream */ - if (cs->active && - (sync || (lacf->sync && - (int32_t) (cs->timestamp + lacf->sync - lh.timestamp) < 0))) - { + if (cs->active && (sync || (lacf->sync && cs->dropped > lacf->sync))) { ngx_log_debug2(NGX_LOG_DEBUG_RTMP, ss->connection->log, 0, - "live: sync %s: %i", - type_s, (ngx_int_t) (lh.timestamp - cs->timestamp)); + "live: sync %s dropped=%uD", type_s, cs->dropped); cs->active = 0; + cs->dropped = 0; } /* absolute packet */ if (!cs->active) { - if (lacf->wait_key && h->type == NGX_RTMP_MSG_VIDEO && - prio != NGX_RTMP_VIDEO_KEY_FRAME) + if (lacf->wait_key && prio != NGX_RTMP_VIDEO_KEY_FRAME && + (lacf->interleave || h->type == NGX_RTMP_MSG_VIDEO)) { ngx_log_debug0(NGX_LOG_DEBUG_RTMP, ss->connection->log, 0, "live: skip non-key"); continue; + } + ch.timestamp = timestamp; + if (lacf->atc == 0) { + ch.timestamp -= (uint32_t) ss->epoch; + } + + lh.timestamp = ch.timestamp - delta; + + /* + if (ngx_rtmp_send_user_stream_eof(ss, NGX_RTMP_MSID) != NGX_OK) { + continue; + } + + if (ngx_rtmp_send_user_stream_begin(ss, NGX_RTMP_MSID) != NGX_OK) { + continue; + }*/ + if (header) { /* send absolute codec header */ @@ -598,10 +605,14 @@ ngx_rtmp_live_av(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, "live: rel %s packet delta=%uD", type_s, delta); - if (ngx_rtmp_send_message(ss, rpkt, prio) == NGX_OK) { - cs->timestamp += delta; - ++peers; + if (ngx_rtmp_send_message(ss, rpkt, prio) != NGX_OK) { + ++pctx->ndropped; + cs->dropped += delta; + continue; } + + cs->timestamp += delta; + ++peers; } if (rpkt) { diff --git a/ngx_rtmp_live_module.h b/ngx_rtmp_live_module.h index 525a78c..720e1d5 100644 --- a/ngx_rtmp_live_module.h +++ b/ngx_rtmp_live_module.h @@ -25,6 +25,7 @@ typedef struct { unsigned active:1; uint32_t timestamp; uint32_t csid; + uint32_t dropped; } ngx_rtmp_live_chunk_stream_t; @@ -33,7 +34,7 @@ struct ngx_rtmp_live_ctx_s { ngx_rtmp_live_stream_t *stream; ngx_rtmp_live_ctx_t *next; ngx_uint_t flags; - ngx_uint_t dropped; + ngx_uint_t ndropped; ngx_rtmp_live_chunk_stream_t cs[2]; ngx_uint_t header_versions[2]; ngx_uint_t meta_version; diff --git a/ngx_rtmp_stat_module.c b/ngx_rtmp_stat_module.c index 8abfdf1..4ea00c4 100644 --- a/ngx_rtmp_stat_module.c +++ b/ngx_rtmp_stat_module.c @@ -306,19 +306,16 @@ ngx_rtmp_stat_live(ngx_http_request_t *r, ngx_chain_t ***lll, NGX_RTMP_STAT_L(""); NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), - "%uz", ctx->dropped) - buf); + "%uz", ctx->ndropped) - buf); NGX_RTMP_STAT_L(""); - if (ctx->cs[0].active && ctx->cs[1].active) { + NGX_RTMP_STAT_L(""); - NGX_RTMP_STAT_L(""); + NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), + "%uD/%uD", ctx->cs[0].dropped, + ctx->cs[1].dropped) - buf); - NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), - "%L", (int64_t) ctx->cs[0].timestamp - - (int64_t) ctx->cs[1].timestamp) - buf); - - NGX_RTMP_STAT_L(""); - } + NGX_RTMP_STAT_L(""); if (s->flashver.len) { NGX_RTMP_STAT_L("");