Skip to content

Commit 42891da

Browse files
committed
[fix] fixed incorrect meta processing in gop cache.
1 parent a484f11 commit 42891da

File tree

2 files changed

+46
-26
lines changed

2 files changed

+46
-26
lines changed

ngx_rtmp_gop_cache_module.c

+43-21
Original file line numberDiff line numberDiff line change
@@ -313,9 +313,15 @@ static ngx_rtmp_gop_cache_t *
313313
ngx_rtmp_gop_cache_free_cache(ngx_rtmp_session_t *s,
314314
ngx_rtmp_gop_cache_t *cache)
315315
{
316+
ngx_rtmp_core_srv_conf_t *cscf;
316317
ngx_rtmp_gop_cache_ctx_t *ctx;
317318
ngx_rtmp_gop_frame_t *frame;
318319

320+
cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module);
321+
if (cscf == NULL) {
322+
return NULL;
323+
}
324+
319325
ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_gop_cache_module);
320326
if (ctx == NULL) {
321327
return NULL;
@@ -325,8 +331,21 @@ ngx_rtmp_gop_cache_free_cache(ngx_rtmp_session_t *s,
325331
ngx_rtmp_gop_cache_free_frame(s, frame);
326332
}
327333

328-
cache->video_seq_header = NULL;
329-
cache->audio_seq_header = NULL;
334+
if (cache->video_seq_header) {
335+
ngx_rtmp_free_shared_chain(cscf, cache->video_seq_header);
336+
cache->video_seq_header = NULL;
337+
}
338+
339+
if (cache->audio_seq_header) {
340+
ngx_rtmp_free_shared_chain(cscf, cache->audio_seq_header);
341+
cache->audio_seq_header = NULL;
342+
}
343+
344+
if (cache->meta) {
345+
ngx_rtmp_free_shared_chain(cscf, cache->meta);
346+
cache->meta_version = 0;
347+
cache->meta = NULL;
348+
}
330349

331350
cache->video_frame_in_this = 0;
332351
cache->audio_frame_in_this = 0;
@@ -359,8 +378,6 @@ ngx_rtmp_gop_cache_cleanup(ngx_rtmp_session_t *s)
359378
ngx_rtmp_gop_cache_free_cache(s, cache);
360379
}
361380

362-
ctx->meta = NULL;
363-
364381
if (ctx->cache_head) {
365382
ctx->cache_head->next = ctx->free_cache;
366383
ctx->free_cache = ctx->cache_head;
@@ -468,6 +485,7 @@ ngx_rtmp_gop_cache_frame(ngx_rtmp_session_t *s, ngx_uint_t prio,
468485
ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0,
469486
"gop cache: add video seq header in new cache");
470487
ctx->cache_tail->video_seq_header = codec_ctx->avc_header;
488+
ngx_rtmp_acquire_shared_chain(ctx->cache_tail->video_seq_header);
471489
}
472490

473491
// save audio seq header.
@@ -477,16 +495,19 @@ ngx_rtmp_gop_cache_frame(ngx_rtmp_session_t *s, ngx_uint_t prio,
477495
ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0,
478496
"gop cache: add audio seq header in new cache");
479497
ctx->cache_tail->audio_seq_header = codec_ctx->aac_header;
498+
ngx_rtmp_acquire_shared_chain(ctx->cache_tail->audio_seq_header);
480499
}
481500

482501
// save metadata.
483502
if (codec_ctx->meta &&
484-
(ctx->meta == NULL || codec_ctx->meta_version != ctx->meta_version))
503+
(ctx->cache_tail && ctx->cache_tail->meta == NULL))
485504
{
486-
ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0,
487-
"gop cache: update meta");
488-
ctx->meta_version = codec_ctx->meta_version;
489-
ctx->meta = codec_ctx->meta;
505+
ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0,
506+
"gop cache: add meta in new cache, version=%ui",
507+
codec_ctx->meta_version);
508+
ctx->cache_tail->meta_version = codec_ctx->meta_version;
509+
ctx->cache_tail->meta = codec_ctx->meta;
510+
ngx_rtmp_acquire_shared_chain(ctx->cache_tail->meta);
490511
}
491512

492513
gf = ngx_rtmp_gop_cache_alloc_frame(s);
@@ -569,7 +590,6 @@ ngx_rtmp_gop_cache_send(ngx_rtmp_session_t *s)
569590
acopkt = NULL;
570591
header = NULL;
571592
coheader = NULL;
572-
meta = NULL;
573593
meta_version = 0;
574594

575595
pub_ctx = ctx->stream->pub_ctx;
@@ -609,22 +629,24 @@ ngx_rtmp_gop_cache_send(ngx_rtmp_session_t *s)
609629
}
610630
}
611631

612-
if (meta == NULL && meta_version != gctx->meta_version) {
613-
meta = handler->meta_message_pt(s, gctx->meta);
614-
if (meta == NULL) {
615-
ngx_rtmp_finalize_session(s);
616-
return;
617-
}
618-
}
632+
meta = NULL;
633+
634+
if (cache->meta) {
635+
if (meta_version != cache->meta_version) {
636+
meta = handler->meta_message_pt(s, cache->meta);
637+
if (meta == NULL) {
638+
ngx_rtmp_finalize_session(s);
639+
return;
640+
}
619641

620-
if (meta) {
621-
meta_version = gctx->meta_version;
642+
meta_version = cache->meta_version;
643+
}
622644
}
623645

624646
/* send metadata */
625647
if (meta && meta_version != ctx->meta_version) {
626-
ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->connection->log, 0,
627-
"gop cache send: meta");
648+
ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->connection->log, 0,
649+
"gop cache send: meta, version=%ui", meta_version);
628650

629651
if (handler->send_message_pt(s, meta, 0) == NGX_ERROR) {
630652
ngx_rtmp_finalize_session(s);

ngx_rtmp_gop_cache_module.h

+3-5
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ struct ngx_rtmp_gop_cache_s {
3030

3131
ngx_chain_t *video_seq_header;
3232
ngx_chain_t *audio_seq_header;
33+
ngx_chain_t *meta;
34+
35+
ngx_uint_t meta_version;
3336

3437
ngx_int_t video_frame_in_this;
3538
ngx_int_t audio_frame_in_this;
@@ -52,11 +55,6 @@ typedef struct ngx_rtmp_gop_cache_ctx_s {
5255
ngx_rtmp_gop_cache_t *free_cache;
5356
ngx_rtmp_gop_frame_t *free_frame;
5457

55-
ngx_chain_t *meta;
56-
ngx_chain_t *free;
57-
58-
ngx_uint_t meta_version;
59-
6058
size_t gop_cache_count;
6159
size_t video_frame_in_all;
6260
size_t audio_frame_in_all;

0 commit comments

Comments
 (0)