Skip to content

Commit 30d9565

Browse files
committed
add live stage and stage time
1 parent 2d13318 commit 30d9565

8 files changed

+139
-3
lines changed

http/ngx_http_flv_live_module.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -577,6 +577,9 @@ ngx_http_flv_live_handler(ngx_http_request_t *r)
577577

578578
s->prepare_handler = ngx_http_flv_live_prepare_out_chain;
579579

580+
s->stage = NGX_LIVE_PLAY;
581+
s->ptime = ngx_current_msec;
582+
580583
if (ngx_rtmp_play_filter(s, &v) != NGX_OK) {
581584
return NGX_HTTP_INTERNAL_SERVER_ERROR;
582585
}

ngx_live_relay_httpflv.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,9 @@ ngx_live_relay_httpflv_recv(void *request, ngx_http_request_t *hcr)
476476
s = request;
477477
status_code = ngx_http_client_status_code(hcr);
478478

479+
s->stage = NGX_LIVE_PLAY;
480+
s->ptime = ngx_current_msec;
481+
479482
if (status_code != NGX_HTTP_OK) {
480483
ngx_live_relay_httpflv_error(s, status_code);
481484
ngx_http_client_finalize_request(hcr, 1);
@@ -534,6 +537,9 @@ ngx_live_relay_httpflv_send_request(ngx_rtmp_session_t *s,
534537
{ ngx_null_string, ngx_null_string }
535538
};
536539

540+
s->stage = NGX_LIVE_CONNECT;
541+
s->connect_time = ngx_current_msec;
542+
537543
hcr = ngx_http_client_get(s->log, &request_url, headers, s);
538544
ngx_http_client_set_read_handler(hcr, ngx_live_relay_httpflv_recv);
539545

ngx_live_relay_rtmp.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,9 @@ ngx_live_relay_rtmp_send_connect(ngx_rtmp_session_t *s)
234234
h.csid = NGX_RTMP_RELAY_CSID_AMF_INI;
235235
h.type = NGX_RTMP_MSG_AMF_CMD;
236236

237+
s->status = NGX_LIVE_CONNECT;
238+
s->connect_time = ngx_current_msec;
239+
237240
return ngx_rtmp_send_chunk_size(s, cscf->chunk_size) != NGX_OK
238241
|| ngx_rtmp_send_ack_size(s, cscf->ack_window) != NGX_OK
239242
|| ngx_rtmp_send_amf(s, &h, out_elts,
@@ -270,6 +273,9 @@ ngx_live_relay_rtmp_send_create_stream(ngx_rtmp_session_t *s)
270273
h.csid = NGX_RTMP_RELAY_CSID_AMF_INI;
271274
h.type = NGX_RTMP_MSG_AMF_CMD;
272275

276+
s->stage = NGX_LIVE_CREATE_STREAM;
277+
s->create_stream_time = ngx_current_msec;
278+
273279
return ngx_rtmp_send_amf(s, &h, out_elts,
274280
sizeof(out_elts) / sizeof(out_elts[0]));
275281
}
@@ -333,6 +339,9 @@ ngx_live_relay_rtmp_send_publish(ngx_rtmp_session_t *s)
333339
h.msid = NGX_RTMP_RELAY_MSID;
334340
h.type = NGX_RTMP_MSG_AMF_CMD;
335341

342+
s->stage = NGX_LIVE_PUBLISH;
343+
s->ptime = ngx_current_msec;
344+
336345
return ngx_rtmp_send_amf(s, &h, out_elts,
337346
sizeof(out_elts) / sizeof(out_elts[0]));
338347
}
@@ -406,6 +415,9 @@ ngx_live_relay_rtmp_send_play(ngx_rtmp_session_t *s)
406415
h.msid = NGX_RTMP_RELAY_MSID;
407416
h.type = NGX_RTMP_MSG_AMF_CMD;
408417

418+
s->stage = NGX_LIVE_PLAY;
419+
s->ptime = ngx_current_msec;
420+
409421
return ngx_rtmp_send_amf(s, &h, out_elts,
410422
sizeof(out_elts) / sizeof(out_elts[0])) != NGX_OK
411423
|| ngx_rtmp_send_set_buflen(s, NGX_RTMP_RELAY_MSID,

ngx_rtmp.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,17 @@ typedef struct ngx_live_stream_s ngx_live_stream_t;
174174
typedef struct ngx_live_server_s ngx_live_server_t;
175175
typedef struct ngx_rtmp_addr_conf_s ngx_rtmp_addr_conf_t;
176176

177+
#define NGX_LIVE_INIT 0
178+
#define NGX_LIVE_HANDSHAKE_DONE 1
179+
#define NGX_LIVE_CONNECT 2
180+
#define NGX_LIVE_CREATE_STREAM 3
181+
#define NGX_LIVE_PUBLISH 4
182+
#define NGX_LIVE_PLAY 5
183+
#define NGX_LIVE_AV 6
184+
#define NGX_LIVE_CLOSE 7
185+
186+
extern char *ngx_live_stage[];
187+
177188
struct ngx_rtmp_session_s {
178189
uint32_t signature; /* "RTMP" */ /* <-- FIXME wtf */
179190

@@ -289,6 +300,19 @@ struct ngx_rtmp_session_s {
289300
ngx_uint_t nframe;
290301
ngx_rtmp_prepared_pt prepare_handler;
291302

303+
/* for trace and statistics */
304+
ngx_uint_t stage;
305+
ngx_msec_t init_time;
306+
ngx_msec_t handshake_done_time;
307+
ngx_msec_t connect_time;
308+
ngx_msec_t create_stream_time;
309+
ngx_msec_t ptime; /* publish or play time */
310+
ngx_msec_t first_data; /* audio video or metadata*/
311+
ngx_msec_t first_metadata;
312+
ngx_msec_t first_audio;
313+
ngx_msec_t first_video;
314+
ngx_msec_t close_stream_time;
315+
292316
/* circular buffer of RTMP message pointers */
293317
ngx_msec_t timeout;
294318
uint32_t out_bytes;

ngx_rtmp_cmd_module.c

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -250,8 +250,7 @@ ngx_rtmp_play_filter(ngx_rtmp_session_t *s, ngx_rtmp_play_t *v)
250250
}
251251

252252
ngx_int_t
253-
ngx_rtmp_close_stream_filter(ngx_rtmp_session_t *s,
254-
ngx_rtmp_close_stream_t *v)
253+
ngx_rtmp_close_stream_filter(ngx_rtmp_session_t *s, ngx_rtmp_close_stream_t *v)
255254
{
256255
if (s->closed) {
257256
ngx_log_error(NGX_LOG_INFO, s->log, 0, "session has been closed");
@@ -415,6 +414,9 @@ ngx_rtmp_cmd_connect_init(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,
415414

416415
s->live_server = ngx_live_create_server(&s->serverid);
417416

417+
s->stage = NGX_LIVE_CONNECT;
418+
s->connect_time = ngx_current_msec;
419+
418420
return ngx_rtmp_connect(s, &v);
419421
}
420422

@@ -551,6 +553,9 @@ ngx_rtmp_cmd_create_stream_init(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,
551553

552554
ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->log, 0, "createStream");
553555

556+
s->stage = NGX_LIVE_CREATE_STREAM;
557+
s->create_stream_time = ngx_current_msec;
558+
554559
return ngx_rtmp_create_stream(s, &v);
555560
}
556561

@@ -710,6 +715,9 @@ ngx_rtmp_cmd_publish_init(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,
710715
"publish: name='%s' args='%s' type=%s silent=%d",
711716
v.name, v.args, v.type, v.silent);
712717

718+
s->stage = NGX_LIVE_PUBLISH;
719+
s->ptime = ngx_current_msec;
720+
713721
return ngx_rtmp_publish_filter(s, &v);
714722
}
715723

@@ -779,6 +787,9 @@ ngx_rtmp_cmd_play_init(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,
779787
(ngx_int_t) v.duration, (ngx_int_t) v.reset,
780788
(ngx_int_t) v.silent);
781789

790+
s->stage = NGX_LIVE_PLAY;
791+
s->ptime = ngx_current_msec;
792+
782793
return ngx_rtmp_play_filter(s, &v);
783794
}
784795

@@ -913,6 +924,9 @@ static ngx_int_t
913924
ngx_rtmp_cmd_disconnect_init(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,
914925
ngx_chain_t *in)
915926
{
927+
s->stage = NGX_LIVE_CLOSE;
928+
s->close_stream_time = ngx_current_msec;
929+
916930
ngx_log_error(NGX_LOG_INFO, s->log, 0, "disconnect");
917931

918932
return ngx_rtmp_disconnect(s);

ngx_rtmp_handshake.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,9 @@ ngx_rtmp_handshake_done(ngx_rtmp_session_t *s)
371371
return;
372372
}
373373

374+
s->stage = NGX_LIVE_HANDSHAKE_DONE;
375+
s->handshake_done_time = ngx_current_msec;
376+
374377
ngx_rtmp_cycle(s);
375378
}
376379

ngx_rtmp_init.c

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,18 @@ typedef struct {
2727
} ngx_rtmp_error_log_ctx_t;
2828

2929

30+
char *ngx_live_stage[] = {
31+
"init",
32+
"handshake_done",
33+
"connect",
34+
"create_stream",
35+
"publish",
36+
"play",
37+
"audio_video",
38+
"close_stream",
39+
};
40+
41+
3042
void
3143
ngx_rtmp_init_connection(ngx_connection_t *c)
3244
{
@@ -185,7 +197,8 @@ ngx_rtmp_log_error(ngx_log_t *log, u_char *buf, size_t len)
185197
return p;
186198
}
187199

188-
p = ngx_snprintf(buf, len, ", server: %V, session: %p", s->addr_text, s);
200+
p = ngx_snprintf(buf, len, ", server: %V, session: %p, stage: %s",
201+
s->addr_text, s, ngx_live_stage[s->stage]);
189202
len -= p - buf;
190203
buf = p;
191204

@@ -645,6 +658,9 @@ ngx_rtmp_create_session(ngx_rtmp_addr_conf_t *addr_conf)
645658
s->log->handler = ngx_rtmp_log_error;
646659
s->log->data = ctx;
647660

661+
s->stage = NGX_LIVE_INIT;
662+
s->init_time = ngx_current_msec;
663+
648664
return s;
649665

650666
destroy:

ngx_rtmp_monitor_module.c

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,21 @@ ngx_rtmp_monitor_av(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,
203203
return NGX_OK;
204204
}
205205

206+
static ngx_int_t
207+
ngx_rtmp_monitor_meta_data(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,
208+
ngx_chain_t *in)
209+
{
210+
if (s->first_metadata == 0) {
211+
s->stage = NGX_LIVE_AV;
212+
s->first_metadata = ngx_current_msec;
213+
s->first_data = s->first_data == 0? ngx_current_msec: s->first_data;
214+
}
215+
216+
ngx_log_error(NGX_LOG_INFO, s->log, 0, "receive metadata");
217+
218+
return NGX_OK;
219+
}
220+
206221
static ngx_int_t
207222
ngx_rtmp_monitor_close_stream(ngx_rtmp_session_t *s, ngx_rtmp_close_stream_t *v)
208223
{
@@ -229,6 +244,34 @@ ngx_rtmp_monitor_frame(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,
229244
ngx_rtmp_monitor_app_conf_t *macf;
230245
ngx_rtmp_monitor_ctx_t *ctx;
231246

247+
if (s->first_audio == 0 && h->type == NGX_RTMP_MSG_AUDIO) {
248+
s->stage = NGX_LIVE_AV;
249+
s->first_audio = ngx_current_msec;
250+
s->first_data = s->first_data == 0? ngx_current_msec: s->first_data;
251+
}
252+
253+
if (s->first_video == 0 && h->type == NGX_RTMP_MSG_VIDEO) {
254+
s->stage = NGX_LIVE_AV;
255+
s->first_video = ngx_current_msec;
256+
s->first_data = s->first_data == 0? ngx_current_msec: s->first_data;
257+
}
258+
259+
if (h->type == NGX_RTMP_MSG_AUDIO && is_header) {
260+
if (s->publishing) {
261+
ngx_log_error(NGX_LOG_INFO, s->log, 0, "receive audio header");
262+
} else {
263+
ngx_log_error(NGX_LOG_INFO, s->log, 0, "send audio header");
264+
}
265+
}
266+
267+
if (h->type == NGX_RTMP_MSG_VIDEO && is_header) {
268+
if (s->publishing) {
269+
ngx_log_error(NGX_LOG_INFO, s->log, 0, "receive video header");
270+
} else {
271+
ngx_log_error(NGX_LOG_INFO, s->log, 0, "send video header");
272+
}
273+
}
274+
232275
if (h->type != NGX_RTMP_MSG_VIDEO) {
233276
return;
234277
}
@@ -354,6 +397,7 @@ ngx_rtmp_monitor_postconfiguration(ngx_conf_t *cf)
354397
{
355398
ngx_rtmp_core_main_conf_t *cmcf;
356399
ngx_rtmp_handler_pt *h;
400+
ngx_rtmp_amf_handler_t *ch;
357401

358402
cmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_core_module);
359403

@@ -363,6 +407,20 @@ ngx_rtmp_monitor_postconfiguration(ngx_conf_t *cf)
363407
h = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_VIDEO]);
364408
*h = ngx_rtmp_monitor_av;
365409

410+
/* register metadata handler */
411+
ch = ngx_array_push(&cmcf->amf);
412+
if (ch == NULL) {
413+
return NGX_ERROR;
414+
}
415+
ngx_str_set(&ch->name, "@setDataFrame");
416+
ch->handler = ngx_rtmp_monitor_meta_data;
417+
418+
ch = ngx_array_push(&cmcf->amf);
419+
if (ch == NULL) {
420+
return NGX_ERROR;
421+
}
422+
ngx_str_set(&ch->name, "onMetaData");
423+
ch->handler = ngx_rtmp_monitor_meta_data;
366424

367425
next_close_stream = ngx_rtmp_close_stream;
368426
ngx_rtmp_close_stream = ngx_rtmp_monitor_close_stream;

0 commit comments

Comments
 (0)