コード例 #1
0
static void
ngx_rtmp_stat_live(ngx_http_request_t *r, ngx_chain_t ***lll, 
        ngx_rtmp_live_app_conf_t *lacf)
{
    ngx_rtmp_live_stream_t         *stream;
    ngx_rtmp_codec_ctx_t           *codec;
    ngx_rtmp_live_ctx_t            *ctx;
    ngx_rtmp_session_t             *s;
    ngx_int_t                       n;
    size_t                          nclients, total_nclients;
    u_char                          buf[NGX_OFF_T_LEN + 1];
    ngx_rtmp_stat_loc_conf_t       *slcf;
    u_char                         *cname;

    slcf = ngx_http_get_module_loc_conf(r, ngx_rtmp_stat_module);

    NGX_RTMP_STAT_L("<live>\r\n");

    total_nclients = 0;
    for (n = 0; n < lacf->nbuckets; ++n) {
        for (stream = lacf->streams[n]; stream; stream = stream->next) {
            NGX_RTMP_STAT_L("<stream>\r\n");

            NGX_RTMP_STAT_L("<name>");
            NGX_RTMP_STAT_ECS(stream->name);
            NGX_RTMP_STAT_L("</name>\r\n");

            NGX_RTMP_STAT_L("<time>");
            NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf),
                        "%M", ngx_current_msec - stream->epoch) - buf);
            NGX_RTMP_STAT_L("</time>");

            ngx_rtmp_stat_bw(r, lll, &stream->bw_in, &stream->bw_out);

            nclients = 0;
            codec = NULL;
            for (ctx = stream->ctx; ctx; ctx = ctx->next, ++nclients) {
                s = ctx->session;
                if (slcf->stat & NGX_RTMP_STAT_CLIENTS) {
                    NGX_RTMP_STAT_L("<client>");

#ifdef NGX_RTMP_POOL_DEBUG
                    ngx_rtmp_stat_dump_pool(r, lll, s->connection->pool);
#endif
                    NGX_RTMP_STAT_L("<id>");
                    NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), "%ui",
                                       (ngx_uint_t) s->connection->number)
                                       - buf);
                    NGX_RTMP_STAT_L("</id>");

                    NGX_RTMP_STAT_L("<address>");
                    NGX_RTMP_STAT_S(&s->connection->addr_text);
                    NGX_RTMP_STAT_L("</address>");

                    NGX_RTMP_STAT_L("<time>");
                    NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), "%M",
                                                    ngx_current_msec - s->epoch)
                                       - buf);
                    NGX_RTMP_STAT_L("</time>");

                    NGX_RTMP_STAT_L("<dropped>");
                    NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), 
                                "%uD/%uD", ctx->cs[1].dropped,
                                           ctx->cs[0].dropped) - buf);
                    NGX_RTMP_STAT_L("</dropped>");

                    NGX_RTMP_STAT_L("<avsync>");
                    if (!lacf->interleave) {
                        NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), 
                                      "%L", (int64_t) ctx->cs[1].timestamp -
                                            (int64_t) ctx->cs[0].timestamp)
                                           - buf);
                    }
                    NGX_RTMP_STAT_L("</avsync>");

                    if (s->flashver.len) {
                        NGX_RTMP_STAT_L("<flashver>");
                        NGX_RTMP_STAT_ES(&s->flashver);
                        NGX_RTMP_STAT_L("</flashver>");
                    }

                    if (s->page_url.len) {
                        NGX_RTMP_STAT_L("<pageurl>");
                        NGX_RTMP_STAT_ES(&s->page_url);
                        NGX_RTMP_STAT_L("</pageurl>");
                    }

                    if (s->swf_url.len) {
                        NGX_RTMP_STAT_L("<swfurl>");
                        NGX_RTMP_STAT_ES(&s->swf_url);
                        NGX_RTMP_STAT_L("</swfurl>");
                    }

                    if (ctx->publishing) {
                        NGX_RTMP_STAT_L("<publishing/>");
                    }

                    if (ctx->active) {
                        NGX_RTMP_STAT_L("<active/>");
                    }

                    NGX_RTMP_STAT_L("</client>\r\n");
                }
                if (ctx->publishing) {
                    codec = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module);
                }
            }
            total_nclients += nclients;

            if (codec) {
                NGX_RTMP_STAT_L("<meta><width>");
                NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), 
                            "%ui", codec->width) - buf);
                NGX_RTMP_STAT_L("</width><height>");
                NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), 
                            "%ui", codec->height) - buf);
                NGX_RTMP_STAT_L("</height><framerate>");
                NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), 
                            "%ui", codec->frame_rate) - buf);
                NGX_RTMP_STAT_L("</framerate>");
                cname = ngx_rtmp_get_video_codec_name(codec->video_codec_id);
                if (*cname) {
                    NGX_RTMP_STAT_L("<video>");
                    NGX_RTMP_STAT_ECS(cname);
                    NGX_RTMP_STAT_L("</video>");
                }
                cname = ngx_rtmp_get_audio_codec_name(codec->audio_codec_id);
                if (*cname) {
                    NGX_RTMP_STAT_L("<audio>");
                    NGX_RTMP_STAT_ECS(cname);
                    NGX_RTMP_STAT_L("</audio>");
                }
                if (*codec->profile) {
                    NGX_RTMP_STAT_L("<profile>");
                    NGX_RTMP_STAT_ECS(codec->profile);
                    NGX_RTMP_STAT_L("</profile>");
                }
                if (*codec->level) {
                    NGX_RTMP_STAT_L("<level>");
                    NGX_RTMP_STAT_ECS(codec->level);
                    NGX_RTMP_STAT_L("</level>");
                }
                NGX_RTMP_STAT_L("</meta>\r\n");
            }

            NGX_RTMP_STAT_L("<nclients>");
            NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), 
                        "%uz", nclients) - buf);
            NGX_RTMP_STAT_L("</nclients>\r\n");

            if (stream->publishing) {
                NGX_RTMP_STAT_L("<publishing/>\r\n");
            }

            if (stream->active) {
                NGX_RTMP_STAT_L("<active/>\r\n");
            }

            NGX_RTMP_STAT_L("</stream>\r\n");
        }
    }

    NGX_RTMP_STAT_L("<nclients>");
    NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), 
                "%uz", total_nclients) - buf);
    NGX_RTMP_STAT_L("</nclients>\r\n");

    NGX_RTMP_STAT_L("</live>\r\n");
}
コード例 #2
0
static void
ngx_rtmp_stat_live(ngx_http_request_t *r, ngx_chain_t ***lll, 
        ngx_rtmp_live_app_conf_t *lacf)
{
    ngx_rtmp_live_stream_t         *stream;
    ngx_rtmp_codec_ctx_t           *codec;
    ngx_rtmp_live_ctx_t            *ctx;
    ngx_rtmp_session_t             *s;
    ngx_int_t                       n;
    ngx_uint_t                      nclients, total_nclients;
    u_char                          buf[NGX_INT_T_LEN];
    u_char                          bbuf[NGX_INT32_LEN];
    ngx_rtmp_stat_loc_conf_t       *slcf;
    u_char                         *cname;

    if (!lacf->live) {
        return;
    }

    slcf = ngx_http_get_module_loc_conf(r, ngx_rtmp_stat_module);

    NGX_RTMP_STAT_L("<live>\r\n");

    total_nclients = 0;
    for (n = 0; n < lacf->nbuckets; ++n) {
        for (stream = lacf->streams[n]; stream; stream = stream->next) {
            NGX_RTMP_STAT_L("<stream>\r\n");

            NGX_RTMP_STAT_L("<name>");
            NGX_RTMP_STAT_ECS(stream->name);
            NGX_RTMP_STAT_L("</name>\r\n");

            NGX_RTMP_STAT_L("<time>");
            NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), "%i",
                          (ngx_int_t) (ngx_current_msec - stream->epoch))
                          - buf);
            NGX_RTMP_STAT_L("</time>");

            ngx_rtmp_stat_bw(r, lll, &stream->bw_in, &stream->bw_out);

            nclients = 0;
            codec = NULL;
            for (ctx = stream->ctx; ctx; ctx = ctx->next, ++nclients) {
                s = ctx->session;
                if (slcf->stat & NGX_RTMP_STAT_CLIENTS) {
                    NGX_RTMP_STAT_L("<client>");

                    ngx_rtmp_stat_client(r, lll, s);

                    NGX_RTMP_STAT_L("<dropped>");
                    NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), 
                                  "%ui", ctx->ndropped) - buf);
                    NGX_RTMP_STAT_L("</dropped>");

                    NGX_RTMP_STAT_L("<avsync>");
                    if (!lacf->interleave) {
                        NGX_RTMP_STAT(bbuf, ngx_snprintf(bbuf, sizeof(bbuf), 
                                      "%D", ctx->cs[1].timestamp -
                                      ctx->cs[0].timestamp) - bbuf);
                    }
                    NGX_RTMP_STAT_L("</avsync>");

                    if (ctx->publishing) {
                        NGX_RTMP_STAT_L("<publishing/>");
                    }

                    if (ctx->active) {
                        NGX_RTMP_STAT_L("<active/>");
                    }

                    NGX_RTMP_STAT_L("</client>\r\n");
                }
                if (ctx->publishing) {
                    codec = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module);
                }
            }
            total_nclients += nclients;

            if (codec) {
                NGX_RTMP_STAT_L("<meta><width>");
                NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), 
                              "%ui", codec->width) - buf);
                NGX_RTMP_STAT_L("</width><height>");
                NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), 
                              "%ui", codec->height) - buf);
                NGX_RTMP_STAT_L("</height><framerate>");
                NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), 
                              "%ui", codec->frame_rate) - buf);
                NGX_RTMP_STAT_L("</framerate>");
                cname = ngx_rtmp_get_video_codec_name(codec->video_codec_id);
                if (*cname) {
                    NGX_RTMP_STAT_L("<video>");
                    NGX_RTMP_STAT_ECS(cname);
                    NGX_RTMP_STAT_L("</video>");
                }
                cname = ngx_rtmp_get_audio_codec_name(codec->audio_codec_id);
                if (*cname) {
                    NGX_RTMP_STAT_L("<audio>");
                    NGX_RTMP_STAT_ECS(cname);
                    NGX_RTMP_STAT_L("</audio>");
                }
                if (*codec->profile) {
                    NGX_RTMP_STAT_L("<profile>");
                    NGX_RTMP_STAT_ECS(codec->profile);
                    NGX_RTMP_STAT_L("</profile>");
                }
                if (*codec->level) {
                    NGX_RTMP_STAT_L("<level>");
                    NGX_RTMP_STAT_ECS(codec->level);
                    NGX_RTMP_STAT_L("</level>");
                }
                NGX_RTMP_STAT_L("</meta>\r\n");
            }

            NGX_RTMP_STAT_L("<nclients>");
            NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), 
                          "%ui", nclients) - buf);
            NGX_RTMP_STAT_L("</nclients>\r\n");

            if (stream->publishing) {
                NGX_RTMP_STAT_L("<publishing/>\r\n");
            }

            if (stream->active) {
                NGX_RTMP_STAT_L("<active/>\r\n");
            }

            NGX_RTMP_STAT_L("</stream>\r\n");
        }
    }

    NGX_RTMP_STAT_L("<nclients>");
    NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), 
                  "%ui", total_nclients) - buf);
    NGX_RTMP_STAT_L("</nclients>\r\n");

    NGX_RTMP_STAT_L("</live>\r\n");
}