@@ -283,7 +283,7 @@ ngx_rtmp_stat_bw(ngx_http_request_t *r, ngx_chain_t ***lll,
283
283
ngx_rtmp_update_bandwidth (bw , 0 );
284
284
285
285
if (flags & NGX_RTMP_STAT_BW ) {
286
- if (slcf -> format & NGX_RTMP_STAT_FORMAT_XML ) {
286
+ if (slcf -> format & NGX_RTMP_STAT_FORMAT_XML ) {
287
287
NGX_RTMP_STAT_L ("<bw_" );
288
288
NGX_RTMP_STAT_CS (name );
289
289
NGX_RTMP_STAT (buf , ngx_snprintf (buf , sizeof (buf ), ">%uL</bw_" ,
@@ -301,7 +301,7 @@ ngx_rtmp_stat_bw(ngx_http_request_t *r, ngx_chain_t ***lll,
301
301
}
302
302
303
303
if (flags & NGX_RTMP_STAT_BYTES ) {
304
- if (slcf -> format & NGX_RTMP_STAT_FORMAT_XML ) {
304
+ if (slcf -> format & NGX_RTMP_STAT_FORMAT_XML ) {
305
305
NGX_RTMP_STAT_L ("<bytes_" );
306
306
NGX_RTMP_STAT_CS (name );
307
307
NGX_RTMP_STAT (buf , ngx_snprintf (buf , sizeof (buf ), ">%uL</bytes_" ,
@@ -356,7 +356,7 @@ ngx_rtmp_stat_dump_pool(ngx_http_request_t *r, ngx_chain_t ***lll,
356
356
size = 0 ;
357
357
nlarge = 0 ;
358
358
ngx_rtmp_stat_get_pool_size (pool , & nlarge , & size );
359
- if (slcf -> format & NGX_RTMP_STAT_FORMAT_XML ) {
359
+ if (slcf -> format & NGX_RTMP_STAT_FORMAT_XML ) {
360
360
NGX_RTMP_STAT_L ("<pool><nlarge>" );
361
361
NGX_RTMP_STAT (buf , ngx_snprintf (buf , sizeof (buf ), "%ui" , nlarge ) - buf );
362
362
NGX_RTMP_STAT_L ("</nlarge><size>" );
@@ -384,12 +384,12 @@ ngx_rtmp_stat_client(ngx_http_request_t *r, ngx_chain_t ***lll,
384
384
385
385
#ifdef NGX_RTMP_POOL_DEBUG
386
386
ngx_rtmp_stat_dump_pool (r , lll , s -> connection -> pool );
387
- if (slcf -> format & NGX_RTMP_STAT_FORMAT_JSON ) {
387
+ if (slcf -> format & NGX_RTMP_STAT_FORMAT_JSON ) {
388
388
NGX_RTMP_STAT_L ("," );
389
389
}
390
390
#endif
391
391
392
- if (slcf -> format & NGX_RTMP_STAT_FORMAT_XML ) {
392
+ if (slcf -> format & NGX_RTMP_STAT_FORMAT_XML ) {
393
393
NGX_RTMP_STAT_L ("<id>" );
394
394
NGX_RTMP_STAT (buf , ngx_snprintf (buf , sizeof (buf ), "%ui" ,
395
395
(ngx_uint_t ) s -> connection -> number ) - buf );
@@ -504,6 +504,7 @@ ngx_rtmp_stat_live(ngx_http_request_t *r, ngx_chain_t ***lll,
504
504
ngx_rtmp_live_ctx_t * ctx ;
505
505
ngx_rtmp_session_t * s ;
506
506
ngx_int_t n ;
507
+ ngx_uint_t m ;
507
508
ngx_uint_t nclients , total_nclients ;
508
509
ngx_uint_t f ;
509
510
u_char buf [NGX_INT_T_LEN ];
@@ -517,7 +518,7 @@ ngx_rtmp_stat_live(ngx_http_request_t *r, ngx_chain_t ***lll,
517
518
518
519
slcf = ngx_http_get_module_loc_conf (r , ngx_rtmp_stat_module );
519
520
520
- if (slcf -> format & NGX_RTMP_STAT_FORMAT_XML ) {
521
+ if (slcf -> format & NGX_RTMP_STAT_FORMAT_XML ) {
521
522
NGX_RTMP_STAT_L ("<live>\r\n" );
522
523
} else {
523
524
NGX_RTMP_STAT_L ("\"live\":{" );
@@ -526,19 +527,22 @@ ngx_rtmp_stat_live(ngx_http_request_t *r, ngx_chain_t ***lll,
526
527
527
528
total_nclients = 0 ;
528
529
for (n = 0 ; n < lacf -> nbuckets ; ++ n ) {
530
+ m = 0 ;
531
+ if (n > 0 && lacf -> streams [n - 1 ]) {
532
+ m = 1 ;
533
+ }
529
534
for (stream = lacf -> streams [n ]; stream ; stream = stream -> next ) {
530
535
531
- if (total_nclients > 0 ) {
532
- NGX_RTMP_STAT_L ("," );
533
- }
534
-
535
- if (slcf -> format & NGX_RTMP_STAT_FORMAT_XML ) {
536
+ if (slcf -> format & NGX_RTMP_STAT_FORMAT_XML ) {
536
537
NGX_RTMP_STAT_L ("<stream>\r\n" );
537
538
} else {
539
+ if (m == 1 || stream -> next != NULL ) {
540
+ NGX_RTMP_STAT_L ("," );
541
+ }
538
542
NGX_RTMP_STAT_L ("{" );
539
543
}
540
544
541
- if (slcf -> format & NGX_RTMP_STAT_FORMAT_XML ) {
545
+ if (slcf -> format & NGX_RTMP_STAT_FORMAT_XML ) {
542
546
NGX_RTMP_STAT_L ("<name>" );
543
547
NGX_RTMP_STAT_ECS (stream -> name );
544
548
NGX_RTMP_STAT_L ("</name>\r\n" );
@@ -650,7 +654,7 @@ ngx_rtmp_stat_live(ngx_http_request_t *r, ngx_chain_t ***lll,
650
654
NGX_RTMP_STAT_L ("</client>\r\n" );
651
655
} else {
652
656
NGX_RTMP_STAT_L ("}" );
653
- if (ctx -> next ) {
657
+ if (ctx -> next ) {
654
658
NGX_RTMP_STAT_L ("," );
655
659
}
656
660
}
@@ -666,7 +670,7 @@ ngx_rtmp_stat_live(ngx_http_request_t *r, ngx_chain_t ***lll,
666
670
}
667
671
668
672
if (codec ) {
669
- if (slcf -> format & NGX_RTMP_STAT_FORMAT_XML ) {
673
+ if (slcf -> format & NGX_RTMP_STAT_FORMAT_XML ) {
670
674
NGX_RTMP_STAT_L ("<meta>" );
671
675
672
676
NGX_RTMP_STAT_L ("<video>" );
@@ -781,7 +785,7 @@ ngx_rtmp_stat_live(ngx_http_request_t *r, ngx_chain_t ***lll,
781
785
}
782
786
783
787
784
- NGX_RTMP_STAT_L ("}, \"audio\": {" );
788
+ NGX_RTMP_STAT_L ("},\"audio\": {" );
785
789
cname = ngx_rtmp_get_audio_codec_name (codec -> audio_codec_id );
786
790
f = 0 ;
787
791
if (* cname ) {
@@ -790,7 +794,7 @@ ngx_rtmp_stat_live(ngx_http_request_t *r, ngx_chain_t ***lll,
790
794
NGX_RTMP_STAT_ECS (cname );
791
795
}
792
796
if (codec -> aac_profile ) {
793
- if (f == 1 ) NGX_RTMP_STAT_L ("\"," );
797
+ if (f == 1 ) NGX_RTMP_STAT_L ("\"," );
794
798
f = 2 ;
795
799
NGX_RTMP_STAT_L ("\"profile\":\"" );
796
800
NGX_RTMP_STAT_CS (
@@ -799,20 +803,20 @@ ngx_rtmp_stat_live(ngx_http_request_t *r, ngx_chain_t ***lll,
799
803
codec -> aac_ps ));
800
804
}
801
805
if (codec -> aac_chan_conf ) {
802
- if (f >= 1 ) NGX_RTMP_STAT_L ("\"," );
806
+ if (f >= 1 ) NGX_RTMP_STAT_L ("\"," );
803
807
f = 3 ;
804
808
NGX_RTMP_STAT_L ("\"channels\":\"" );
805
809
NGX_RTMP_STAT (buf , ngx_snprintf (buf , sizeof (buf ),
806
810
"%ui" , codec -> aac_chan_conf ) - buf );
807
811
} else if (codec -> audio_channels ) {
808
- if (f >= 1 ) NGX_RTMP_STAT_L ("\"," );
812
+ if (f >= 1 ) NGX_RTMP_STAT_L ("\"," );
809
813
f = 3 ;
810
814
NGX_RTMP_STAT_L ("\"channels\":\"" );
811
815
NGX_RTMP_STAT (buf , ngx_snprintf (buf , sizeof (buf ),
812
816
"%ui" , codec -> audio_channels ) - buf );
813
817
}
814
818
if (codec -> sample_rate ) {
815
- if (f >= 1 ) NGX_RTMP_STAT_L ("\"," );
819
+ if (f >= 1 ) NGX_RTMP_STAT_L ("\"," );
816
820
f = 4 ;
817
821
NGX_RTMP_STAT_L ("\"sample_rate\":" );
818
822
NGX_RTMP_STAT (buf , ngx_snprintf (buf , sizeof (buf ),
@@ -827,7 +831,7 @@ ngx_rtmp_stat_live(ngx_http_request_t *r, ngx_chain_t ***lll,
827
831
}
828
832
}
829
833
830
- if (slcf -> format & NGX_RTMP_STAT_FORMAT_XML ) {
834
+ if (slcf -> format & NGX_RTMP_STAT_FORMAT_XML ) {
831
835
NGX_RTMP_STAT_L ("<nclients>" );
832
836
NGX_RTMP_STAT (buf , ngx_snprintf (buf , sizeof (buf ),
833
837
"%ui" , nclients ) - buf );
@@ -843,7 +847,7 @@ ngx_rtmp_stat_live(ngx_http_request_t *r, ngx_chain_t ***lll,
843
847
844
848
NGX_RTMP_STAT_L ("</stream>\r\n" );
845
849
} else {
846
- if (codec ) {
850
+ if (codec ) {
847
851
NGX_RTMP_STAT_L ("," );
848
852
}
849
853
NGX_RTMP_STAT_L ("\"nclients\":" );
@@ -869,7 +873,7 @@ ngx_rtmp_stat_live(ngx_http_request_t *r, ngx_chain_t ***lll,
869
873
}
870
874
}
871
875
872
- if (slcf -> format & NGX_RTMP_STAT_FORMAT_XML ) {
876
+ if (slcf -> format & NGX_RTMP_STAT_FORMAT_XML ) {
873
877
NGX_RTMP_STAT_L ("<nclients>" );
874
878
NGX_RTMP_STAT (buf , ngx_snprintf (buf , sizeof (buf ),
875
879
"%ui" , total_nclients ) - buf );
@@ -891,7 +895,7 @@ ngx_rtmp_stat_play(ngx_http_request_t *r, ngx_chain_t ***lll,
891
895
{
892
896
ngx_rtmp_play_ctx_t * ctx , * sctx ;
893
897
ngx_rtmp_session_t * s ;
894
- ngx_uint_t n , nclients , total_nclients ;
898
+ ngx_uint_t m , n , nclients , total_nclients ;
895
899
u_char buf [NGX_INT_T_LEN ];
896
900
u_char bbuf [NGX_INT32_LEN ];
897
901
ngx_rtmp_stat_loc_conf_t * slcf ;
@@ -902,7 +906,7 @@ ngx_rtmp_stat_play(ngx_http_request_t *r, ngx_chain_t ***lll,
902
906
903
907
slcf = ngx_http_get_module_loc_conf (r , ngx_rtmp_stat_module );
904
908
905
- if (slcf -> format & NGX_RTMP_STAT_FORMAT_XML ) {
909
+ if (slcf -> format & NGX_RTMP_STAT_FORMAT_XML ) {
906
910
NGX_RTMP_STAT_L ("<play>\r\n" );
907
911
} else {
908
912
NGX_RTMP_STAT_L ("\"play\":{" );
@@ -911,14 +915,21 @@ ngx_rtmp_stat_play(ngx_http_request_t *r, ngx_chain_t ***lll,
911
915
912
916
total_nclients = 0 ;
913
917
for (n = 0 ; n < pacf -> nbuckets ; ++ n ) {
918
+ m = 0 ;
919
+ if (n > 0 && pacf -> ctx [n - 1 ]) {
920
+ m = 1 ;
921
+ }
914
922
for (ctx = pacf -> ctx [n ]; ctx ; ) {
915
923
916
- if (slcf -> format & NGX_RTMP_STAT_FORMAT_XML ) {
924
+ if (slcf -> format & NGX_RTMP_STAT_FORMAT_XML ) {
917
925
NGX_RTMP_STAT_L ("<stream>\r\n" );
918
926
NGX_RTMP_STAT_L ("<name>" );
919
927
NGX_RTMP_STAT_ECS (ctx -> name );
920
928
NGX_RTMP_STAT_L ("</name>\r\n" );
921
929
} else {
930
+ if (m == 1 || ctx -> next != NULL ) {
931
+ NGX_RTMP_STAT_L ("," );
932
+ }
922
933
NGX_RTMP_STAT_L ("{\"name\":\"" );
923
934
NGX_RTMP_STAT_ECS (ctx -> name );
924
935
NGX_RTMP_STAT_L ("\",\"clients\":[" );
@@ -936,7 +947,7 @@ ngx_rtmp_stat_play(ngx_http_request_t *r, ngx_chain_t ***lll,
936
947
937
948
s = ctx -> session ;
938
949
if (slcf -> stat & NGX_RTMP_STAT_CLIENTS ) {
939
- if (slcf -> format & NGX_RTMP_STAT_FORMAT_XML ) {
950
+ if (slcf -> format & NGX_RTMP_STAT_FORMAT_XML ) {
940
951
NGX_RTMP_STAT_L ("<client>" );
941
952
942
953
ngx_rtmp_stat_client (r , lll , s );
@@ -957,14 +968,11 @@ ngx_rtmp_stat_play(ngx_http_request_t *r, ngx_chain_t ***lll,
957
968
"%D" , s -> current_time ) - bbuf );
958
969
959
970
NGX_RTMP_STAT_L ("}" );
960
- if (ctx -> next ) {
961
- NGX_RTMP_STAT_L ("," );
962
- }
963
971
}
964
972
}
965
973
}
966
974
total_nclients += nclients ;
967
- if (slcf -> format & NGX_RTMP_STAT_FORMAT_XML ) {
975
+ if (slcf -> format & NGX_RTMP_STAT_FORMAT_XML ) {
968
976
NGX_RTMP_STAT_L ("<active/>" );
969
977
NGX_RTMP_STAT_L ("<nclients>" );
970
978
NGX_RTMP_STAT (buf , ngx_snprintf (buf , sizeof (buf ),
@@ -983,7 +991,7 @@ ngx_rtmp_stat_play(ngx_http_request_t *r, ngx_chain_t ***lll,
983
991
}
984
992
}
985
993
986
- if (slcf -> format & NGX_RTMP_STAT_FORMAT_XML ) {
994
+ if (slcf -> format & NGX_RTMP_STAT_FORMAT_XML ) {
987
995
NGX_RTMP_STAT_L ("<nclients>" );
988
996
NGX_RTMP_STAT (buf , ngx_snprintf (buf , sizeof (buf ),
989
997
"%ui" , total_nclients ) - buf );
@@ -1006,7 +1014,7 @@ ngx_rtmp_stat_application(ngx_http_request_t *r, ngx_chain_t ***lll,
1006
1014
1007
1015
slcf = ngx_http_get_module_loc_conf (r , ngx_rtmp_stat_module );
1008
1016
1009
- if (slcf -> format & NGX_RTMP_STAT_FORMAT_XML ) {
1017
+ if (slcf -> format & NGX_RTMP_STAT_FORMAT_XML ) {
1010
1018
NGX_RTMP_STAT_L ("<application>\r\n" );
1011
1019
NGX_RTMP_STAT_L ("<name>" );
1012
1020
NGX_RTMP_STAT_ES (& cacf -> name );
@@ -1033,7 +1041,7 @@ ngx_rtmp_stat_application(ngx_http_request_t *r, ngx_chain_t ***lll,
1033
1041
cacf -> app_conf [ngx_rtmp_play_module .ctx_index ]);
1034
1042
}
1035
1043
1036
- if (slcf -> format & NGX_RTMP_STAT_FORMAT_XML ) {
1044
+ if (slcf -> format & NGX_RTMP_STAT_FORMAT_XML ) {
1037
1045
NGX_RTMP_STAT_L ("</application>\r\n" );
1038
1046
} else {
1039
1047
NGX_RTMP_STAT_L ("}" );
@@ -1190,19 +1198,19 @@ ngx_rtmp_stat_handler(ngx_http_request_t *r)
1190
1198
ngx_rtmp_stat_bw (r , lll , & ngx_rtmp_bw_in , "in" , NGX_RTMP_STAT_BW_BYTES );
1191
1199
ngx_rtmp_stat_bw (r , lll , & ngx_rtmp_bw_out , "out" , NGX_RTMP_STAT_BW_BYTES );
1192
1200
1193
- if (slcf -> format & NGX_RTMP_STAT_FORMAT_JSON ) {
1201
+ if (slcf -> format & NGX_RTMP_STAT_FORMAT_JSON ) {
1194
1202
NGX_RTMP_STAT_L ("\"server\":{" );
1195
1203
}
1196
1204
1197
1205
cscf = cmcf -> servers .elts ;
1198
1206
for (n = 0 ; n < cmcf -> servers .nelts ; ++ n , ++ cscf ) {
1199
1207
ngx_rtmp_stat_server (r , lll , * cscf );
1200
- if (slcf -> format & NGX_RTMP_STAT_FORMAT_JSON && n < cmcf -> servers .nelts - 1 ) {
1208
+ if (slcf -> format & NGX_RTMP_STAT_FORMAT_JSON && n < cmcf -> servers .nelts - 1 ) {
1201
1209
NGX_RTMP_STAT_L ("," );
1202
1210
}
1203
1211
}
1204
1212
1205
- if (slcf -> format & NGX_RTMP_STAT_FORMAT_XML ) {
1213
+ if (slcf -> format & NGX_RTMP_STAT_FORMAT_XML ) {
1206
1214
NGX_RTMP_STAT_L ("</http-flv>\r\n" );
1207
1215
} else {
1208
1216
NGX_RTMP_STAT_L ("}}}" );
@@ -1213,7 +1221,7 @@ ngx_rtmp_stat_handler(ngx_http_request_t *r)
1213
1221
len += (l -> buf -> last - l -> buf -> pos );
1214
1222
}
1215
1223
1216
- if (slcf -> format & NGX_RTMP_STAT_FORMAT_XML ) {
1224
+ if (slcf -> format & NGX_RTMP_STAT_FORMAT_XML ) {
1217
1225
ngx_str_set (& r -> headers_out .content_type , "text/xml" );
1218
1226
} else {
1219
1227
ngx_str_set (& r -> headers_out .content_type , "application/json" );
0 commit comments