@@ -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 ;
0 commit comments