@@ -313,9 +313,15 @@ static ngx_rtmp_gop_cache_t *
313313ngx_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 );
0 commit comments