@@ -313,9 +313,15 @@ static ngx_rtmp_gop_cache_t *
313
313
ngx_rtmp_gop_cache_free_cache (ngx_rtmp_session_t * s ,
314
314
ngx_rtmp_gop_cache_t * cache )
315
315
{
316
+ ngx_rtmp_core_srv_conf_t * cscf ;
316
317
ngx_rtmp_gop_cache_ctx_t * ctx ;
317
318
ngx_rtmp_gop_frame_t * frame ;
318
319
320
+ cscf = ngx_rtmp_get_module_srv_conf (s , ngx_rtmp_core_module );
321
+ if (cscf == NULL ) {
322
+ return NULL ;
323
+ }
324
+
319
325
ctx = ngx_rtmp_get_module_ctx (s , ngx_rtmp_gop_cache_module );
320
326
if (ctx == NULL ) {
321
327
return NULL ;
@@ -325,8 +331,21 @@ ngx_rtmp_gop_cache_free_cache(ngx_rtmp_session_t *s,
325
331
ngx_rtmp_gop_cache_free_frame (s , frame );
326
332
}
327
333
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
+ }
330
349
331
350
cache -> video_frame_in_this = 0 ;
332
351
cache -> audio_frame_in_this = 0 ;
@@ -359,8 +378,6 @@ ngx_rtmp_gop_cache_cleanup(ngx_rtmp_session_t *s)
359
378
ngx_rtmp_gop_cache_free_cache (s , cache );
360
379
}
361
380
362
- ctx -> meta = NULL ;
363
-
364
381
if (ctx -> cache_head ) {
365
382
ctx -> cache_head -> next = ctx -> free_cache ;
366
383
ctx -> free_cache = ctx -> cache_head ;
@@ -468,6 +485,7 @@ ngx_rtmp_gop_cache_frame(ngx_rtmp_session_t *s, ngx_uint_t prio,
468
485
ngx_log_debug0 (NGX_LOG_DEBUG_RTMP , s -> connection -> log , 0 ,
469
486
"gop cache: add video seq header in new cache" );
470
487
ctx -> cache_tail -> video_seq_header = codec_ctx -> avc_header ;
488
+ ngx_rtmp_acquire_shared_chain (ctx -> cache_tail -> video_seq_header );
471
489
}
472
490
473
491
// save audio seq header.
@@ -477,16 +495,19 @@ ngx_rtmp_gop_cache_frame(ngx_rtmp_session_t *s, ngx_uint_t prio,
477
495
ngx_log_debug0 (NGX_LOG_DEBUG_RTMP , s -> connection -> log , 0 ,
478
496
"gop cache: add audio seq header in new cache" );
479
497
ctx -> cache_tail -> audio_seq_header = codec_ctx -> aac_header ;
498
+ ngx_rtmp_acquire_shared_chain (ctx -> cache_tail -> audio_seq_header );
480
499
}
481
500
482
501
// save metadata.
483
502
if (codec_ctx -> meta &&
484
- (ctx -> meta == NULL || codec_ctx -> meta_version != ctx -> meta_version ))
503
+ (ctx -> cache_tail && ctx -> cache_tail -> meta == NULL ))
485
504
{
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 );
490
511
}
491
512
492
513
gf = ngx_rtmp_gop_cache_alloc_frame (s );
@@ -569,7 +590,6 @@ ngx_rtmp_gop_cache_send(ngx_rtmp_session_t *s)
569
590
acopkt = NULL ;
570
591
header = NULL ;
571
592
coheader = NULL ;
572
- meta = NULL ;
573
593
meta_version = 0 ;
574
594
575
595
pub_ctx = ctx -> stream -> pub_ctx ;
@@ -609,22 +629,24 @@ ngx_rtmp_gop_cache_send(ngx_rtmp_session_t *s)
609
629
}
610
630
}
611
631
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
+ }
619
641
620
- if ( meta ) {
621
- meta_version = gctx -> meta_version ;
642
+ meta_version = cache -> meta_version ;
643
+ }
622
644
}
623
645
624
646
/* send metadata */
625
647
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 );
628
650
629
651
if (handler -> send_message_pt (s , meta , 0 ) == NGX_ERROR ) {
630
652
ngx_rtmp_finalize_session (s );
0 commit comments