Skip to content

Commit 392e11e

Browse files
committed
[fix] fix a bug that freeing chains of meta may form a circle.
1 parent 1d2d497 commit 392e11e

File tree

5 files changed

+48
-83
lines changed

5 files changed

+48
-83
lines changed

ngx_rtmp_codec_module.c

Lines changed: 4 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,7 @@ static void * ngx_rtmp_codec_create_app_conf(ngx_conf_t *cf);
2424
static char * ngx_rtmp_codec_merge_app_conf(ngx_conf_t *cf,
2525
void *parent, void *child);
2626
static ngx_int_t ngx_rtmp_codec_postconfiguration(ngx_conf_t *cf);
27-
static ngx_int_t ngx_rtmp_codec_reconstruct_meta(ngx_rtmp_session_t *s,
28-
ngx_rtmp_header_t *h);
27+
static ngx_int_t ngx_rtmp_codec_reconstruct_meta(ngx_rtmp_session_t *s);
2928
static ngx_int_t ngx_rtmp_codec_copy_meta(ngx_rtmp_session_t *s,
3029
ngx_rtmp_header_t *h, ngx_chain_t *in);
3130
static ngx_int_t ngx_rtmp_codec_prepare_meta(ngx_rtmp_session_t *s,
@@ -196,16 +195,6 @@ ngx_rtmp_codec_disconnect(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,
196195
ctx->meta = NULL;
197196
}
198197

199-
if (ctx->flv_meta) {
200-
ngx_rtmp_free_shared_chain(cscf, ctx->flv_meta);
201-
ctx->flv_meta = NULL;
202-
}
203-
204-
if (ctx->flv_meta_chunked) {
205-
ngx_rtmp_free_shared_chain(cscf, ctx->flv_meta_chunked);
206-
ctx->flv_meta_chunked = NULL;
207-
}
208-
209198
return NGX_OK;
210199
}
211200

@@ -899,7 +888,7 @@ ngx_rtmp_codec_dump_header(ngx_rtmp_session_t *s, const char *type,
899888

900889

901890
static ngx_int_t
902-
ngx_rtmp_codec_reconstruct_meta(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h)
891+
ngx_rtmp_codec_reconstruct_meta(ngx_rtmp_session_t *s)
903892
{
904893
ngx_rtmp_codec_ctx_t *ctx;
905894
ngx_rtmp_core_srv_conf_t *cscf;
@@ -922,7 +911,7 @@ ngx_rtmp_codec_reconstruct_meta(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h)
922911

923912
{ NGX_RTMP_AMF_STRING,
924913
ngx_string("Server"),
925-
"NGINX RTMP (github.com/winshining/nginx-http-flv-module)", 0 },
914+
"NGINX RTMP (https://github.com/winshining/nginx-http-flv-module)", 0 },
926915

927916
{ NGX_RTMP_AMF_NUMBER,
928917
ngx_string("width"),
@@ -1000,16 +989,6 @@ ngx_rtmp_codec_reconstruct_meta(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h)
1000989
ctx->meta = NULL;
1001990
}
1002991

1003-
if (ctx->flv_meta) {
1004-
ngx_rtmp_free_shared_chain(cscf, ctx->flv_meta);
1005-
ctx->flv_meta = NULL;
1006-
}
1007-
1008-
if (ctx->flv_meta_chunked) {
1009-
ngx_rtmp_free_shared_chain(cscf, ctx->flv_meta_chunked);
1010-
ctx->flv_meta_chunked = NULL;
1011-
}
1012-
1013992
v.width = ctx->width;
1014993
v.height = ctx->height;
1015994
v.duration = ctx->duration;
@@ -1027,26 +1006,6 @@ ngx_rtmp_codec_reconstruct_meta(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h)
10271006
return NGX_ERROR;
10281007
}
10291008

1030-
ctx->flv_meta = ngx_http_flv_live_append_shared_bufs(
1031-
cscf, h, ctx->meta, 0);
1032-
1033-
ctx->flv_meta_chunked = ngx_http_flv_live_append_shared_bufs(
1034-
cscf, h, ctx->meta, 1);
1035-
1036-
if (ctx->flv_meta == NULL || ctx->flv_meta_chunked == NULL) {
1037-
if (ctx->flv_meta) {
1038-
ngx_rtmp_free_shared_chain(cscf, ctx->flv_meta);
1039-
ctx->flv_meta = NULL;
1040-
}
1041-
1042-
if (ctx->flv_meta_chunked) {
1043-
ngx_rtmp_free_shared_chain(cscf, ctx->flv_meta_chunked);
1044-
ctx->flv_meta_chunked = NULL;
1045-
}
1046-
1047-
return NGX_ERROR;
1048-
}
1049-
10501009
return ngx_rtmp_codec_prepare_meta(s, 0);
10511010
}
10521011

@@ -1250,7 +1209,7 @@ ngx_rtmp_codec_meta_data(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,
12501209

12511210
switch (cacf->meta) {
12521211
case NGX_RTMP_CODEC_META_ON:
1253-
return ngx_rtmp_codec_reconstruct_meta(s, h);
1212+
return ngx_rtmp_codec_reconstruct_meta(s);
12541213
case NGX_RTMP_CODEC_META_COPY:
12551214
return ngx_rtmp_codec_copy_meta(s, h, in);
12561215
}

ngx_rtmp_codec_module.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,6 @@ typedef struct {
109109
ngx_chain_t *aac_header;
110110

111111
ngx_chain_t *meta;
112-
ngx_chain_t *flv_meta;
113-
ngx_chain_t *flv_meta_chunked;
114112
ngx_uint_t meta_version;
115113
size_t pure_audio_threshold;
116114
ngx_flag_t has_video;

ngx_rtmp_gop_cache_module.c

Lines changed: 25 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -301,33 +301,23 @@ ngx_rtmp_gop_alloc_cache(ngx_rtmp_session_t *s)
301301
}
302302

303303
// save video seq header.
304-
if (codec_ctx->avc_header != NULL) {
304+
if (codec_ctx->avc_header) {
305305
cache->video_seq_header = ngx_rtmp_append_shared_bufs(
306306
cscf, NULL, codec_ctx->avc_header);
307307
}
308308

309309
// save audio seq header.
310-
if (codec_ctx->aac_header != NULL) {
310+
if (codec_ctx->aac_header) {
311311
cache->audio_seq_header = ngx_rtmp_append_shared_bufs(
312312
cscf, NULL, codec_ctx->aac_header);
313313
}
314314

315315
// save metadata.
316-
if (codec_ctx->meta != NULL) {
316+
if (codec_ctx->meta) {
317317
cache->meta_version = codec_ctx->meta_version;
318318
cache->meta = ngx_rtmp_append_shared_bufs(cscf, NULL, codec_ctx->meta);
319319
}
320320

321-
if (codec_ctx->flv_meta != NULL) {
322-
cache->flv_meta = ngx_rtmp_append_shared_bufs(cscf, NULL,
323-
codec_ctx->flv_meta);
324-
}
325-
326-
if (codec_ctx->flv_meta_chunked != NULL) {
327-
cache->flv_meta_chunked = ngx_rtmp_append_shared_bufs(cscf,
328-
NULL, codec_ctx->flv_meta_chunked);
329-
}
330-
331321
if (ctx->cache_head == NULL) {
332322
ctx->cache_tail = ctx->cache_head = cache;
333323
} else {
@@ -376,16 +366,6 @@ ngx_rtmp_gop_free_cache(ngx_rtmp_session_t *s, ngx_rtmp_gop_cache_t *cache)
376366
cache->meta = NULL;
377367
}
378368

379-
if (cache->flv_meta) {
380-
ngx_rtmp_free_shared_chain(cscf, cache->flv_meta);
381-
cache->flv_meta = NULL;
382-
}
383-
384-
if (cache->flv_meta_chunked) {
385-
ngx_rtmp_free_shared_chain(cscf, cache->flv_meta_chunked);
386-
cache->flv_meta_chunked = NULL;
387-
}
388-
389369
for (frame = cache->frame_head; frame; frame = frame->next) {
390370
ngx_rtmp_gop_free_frame(s, frame);
391371
}
@@ -614,6 +594,8 @@ ngx_rtmp_gop_cache_send(ngx_rtmp_session_t *s)
614594
ngx_rtmp_live_chunk_stream_t *cs;
615595
ngx_rtmp_process_handler_t *handler;
616596
ngx_http_request_t *r;
597+
ngx_rtmp_core_srv_conf_t *cscf;
598+
ngx_rtmp_header_t mch;
617599

618600
lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_live_module);
619601
if (lacf == NULL) {
@@ -630,6 +612,7 @@ ngx_rtmp_gop_cache_send(ngx_rtmp_session_t *s)
630612
pkt = NULL;
631613
apkt = NULL;
632614
header = NULL;
615+
meta = NULL;
633616
meta_version = 0;
634617

635618
pub_ctx = ctx->stream->pub_ctx;
@@ -642,6 +625,11 @@ ngx_rtmp_gop_cache_send(ngx_rtmp_session_t *s)
642625
return;
643626
}
644627

628+
mch.timestamp = 0;
629+
mch.type = NGX_RTMP_MSG_AMF_META;
630+
631+
cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module);
632+
645633
for (cache = gctx->cache_head; cache; cache = cache->next) {
646634
if (ctx->protocol == NGX_RTMP_PROTOCOL_HTTP) {
647635
r = s->data;
@@ -655,13 +643,19 @@ ngx_rtmp_gop_cache_send(ngx_rtmp_session_t *s)
655643
ngx_http_flv_live_send_header(s);
656644
}
657645

658-
if (hflctx->chunked) {
659-
meta = cache->flv_meta_chunked;
660-
} else {
661-
meta = cache->flv_meta;
646+
if (meta == NULL && meta_version != cache->meta_version) {
647+
if (hflctx->chunked) {
648+
meta = ngx_http_flv_live_append_shared_bufs(cscf,
649+
&mch, cache->meta, 1);
650+
} else {
651+
meta = ngx_http_flv_live_append_shared_bufs(cscf,
652+
&mch, cache->meta, 0);
653+
}
662654
}
663655
} else {
664-
meta = cache->meta;
656+
if (meta == NULL && meta_version != cache->meta_version) {
657+
meta = ngx_rtmp_append_shared_bufs(cscf, NULL, cache->meta);
658+
}
665659
}
666660

667661
if (meta) {
@@ -676,6 +670,9 @@ ngx_rtmp_gop_cache_send(ngx_rtmp_session_t *s)
676670
if (handler->send_message_pt(s, meta, 0) == NGX_OK) {
677671
ctx->meta_version = meta_version;
678672
}
673+
674+
handler->free_message_pt(s, meta);
675+
meta = NULL;
679676
}
680677

681678
for (gop_frame = cache->frame_head;

ngx_rtmp_gop_cache_module.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,6 @@ struct ngx_rtmp_gop_cache_s {
3737
ngx_chain_t *video_seq_header;
3838
ngx_chain_t *audio_seq_header;
3939
ngx_chain_t *meta;
40-
ngx_chain_t *flv_meta;
41-
ngx_chain_t *flv_meta_chunked;
4240
ngx_uint_t meta_version;
4341
ngx_int_t video_frame_in_this;
4442
ngx_int_t audio_frame_in_this;

ngx_rtmp_live_module.c

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -783,7 +783,7 @@ ngx_rtmp_live_av(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,
783783
ngx_rtmp_core_srv_conf_t *cscf;
784784
ngx_rtmp_live_app_conf_t *lacf;
785785
ngx_rtmp_session_t *ss;
786-
ngx_rtmp_header_t ch, lh, clh;
786+
ngx_rtmp_header_t ch, lh, clh, mch;
787787
ngx_int_t rc, mandatory;
788788
ngx_uint_t prio;
789789
ngx_uint_t peers;
@@ -846,6 +846,9 @@ ngx_rtmp_live_av(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,
846846
prio = (h->type == NGX_RTMP_MSG_VIDEO ?
847847
ngx_rtmp_get_video_frame_type(in) : 0);
848848

849+
mch.timestamp = 0;
850+
mch.type = NGX_RTMP_MSG_AMF_META;
851+
849852
cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module);
850853

851854
csidx = !(lacf->interleave || h->type == NGX_RTMP_MSG_VIDEO);
@@ -970,13 +973,20 @@ ngx_rtmp_live_av(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,
970973
ngx_http_flv_live_send_header(ss);
971974
}
972975

973-
if (hctx->chunked) {
974-
meta = codec_ctx->flv_meta_chunked;
975-
} else {
976-
meta = codec_ctx->flv_meta;
976+
if (meta == NULL && meta_version != pctx->meta_version) {
977+
if (hctx->chunked) {
978+
meta = ngx_http_flv_live_append_shared_bufs(cscf,
979+
&mch, codec_ctx->meta, 1);
980+
} else {
981+
meta = ngx_http_flv_live_append_shared_bufs(cscf,
982+
&mch, codec_ctx->meta, 0);
983+
}
977984
}
978985
} else {
979-
meta = codec_ctx->meta;
986+
if (meta == NULL && meta_version != pctx->meta_version) {
987+
meta = ngx_rtmp_append_shared_bufs(cscf, NULL,
988+
codec_ctx->meta);
989+
}
980990
}
981991
}
982992

@@ -987,6 +997,9 @@ ngx_rtmp_live_av(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,
987997
if (handler->send_message_pt(ss, meta, 0) == NGX_OK) {
988998
pctx->meta_version = meta_version;
989999
}
1000+
1001+
handler->free_message_pt(s, meta);
1002+
meta = NULL;
9901003
}
9911004

9921005
/* sync stream */

0 commit comments

Comments
 (0)