@@ -1986,7 +1986,8 @@ ngx_live_segmenter_remove_frames(ngx_live_track_t *track, ngx_uint_t count,
1986
1986
1987
1987
1988
1988
static void
1989
- ngx_live_segmenter_remove_all_frames (ngx_live_track_t * track )
1989
+ ngx_live_segmenter_remove_all_frames (ngx_live_track_t * track ,
1990
+ ngx_flag_t reconnect )
1990
1991
{
1991
1992
ngx_live_segmenter_track_ctx_t * ctx ;
1992
1993
@@ -1995,7 +1996,7 @@ ngx_live_segmenter_remove_all_frames(ngx_live_track_t *track)
1995
1996
return ;
1996
1997
}
1997
1998
1998
- if (ctx -> frame_count > 0 ) {
1999
+ if (ctx -> frame_count > 0 && reconnect ) {
1999
2000
(void ) ngx_live_core_track_event (track ,
2000
2001
NGX_LIVE_EVENT_TRACK_RECONNECT , NULL );
2001
2002
}
@@ -2022,6 +2023,23 @@ ngx_live_segmenter_remove_all_frames(ngx_live_track_t *track)
2022
2023
}
2023
2024
2024
2025
2026
+ static void
2027
+ ngx_live_segmenter_remove_all_channel_frames (ngx_live_channel_t * channel )
2028
+ {
2029
+ ngx_queue_t * q ;
2030
+ ngx_live_track_t * cur_track ;
2031
+
2032
+ for (q = ngx_queue_head (& channel -> tracks .queue );
2033
+ q != ngx_queue_sentinel (& channel -> tracks .queue );
2034
+ q = ngx_queue_next (q ))
2035
+ {
2036
+ cur_track = ngx_queue_data (q , ngx_live_track_t , queue );
2037
+
2038
+ ngx_live_segmenter_remove_all_frames (cur_track , 0 );
2039
+ }
2040
+ }
2041
+
2042
+
2025
2043
static void
2026
2044
ngx_live_segmenter_prepare_create_segment (ngx_live_channel_t * channel ,
2027
2045
uint32_t * media_types_mask , int64_t * min_pts , int64_t * min_created )
@@ -2605,13 +2623,15 @@ ngx_live_segmenter_dispose_segment(ngx_live_channel_t *channel,
2605
2623
int64_t end_pts )
2606
2624
{
2607
2625
ngx_flag_t removed ;
2626
+ ngx_flag_t active_tracks ;
2608
2627
ngx_flag_t force_new_period ;
2609
2628
ngx_queue_t * q ;
2610
2629
ngx_live_track_t * cur_track ;
2611
2630
ngx_live_segmenter_track_ctx_t * cur_ctx ;
2612
2631
ngx_live_segmenter_channel_ctx_t * cctx ;
2613
2632
2614
2633
removed = 0 ;
2634
+ active_tracks = 0 ;
2615
2635
force_new_period = 0 ;
2616
2636
2617
2637
for (q = ngx_queue_head (& channel -> tracks .queue );
@@ -2623,6 +2643,12 @@ ngx_live_segmenter_dispose_segment(ngx_live_channel_t *channel,
2623
2643
ngx_live_segmenter_module );
2624
2644
2625
2645
if (cur_ctx -> copy_index <= 0 ) {
2646
+ if (cur_ctx -> frame_count > 0
2647
+ && cur_ctx -> state != ngx_live_track_inactive )
2648
+ {
2649
+ active_tracks = 1 ;
2650
+ }
2651
+
2626
2652
continue ;
2627
2653
}
2628
2654
@@ -2642,6 +2668,14 @@ ngx_live_segmenter_dispose_segment(ngx_live_channel_t *channel,
2642
2668
}
2643
2669
2644
2670
if (!removed ) {
2671
+ if (!active_tracks ) {
2672
+ ngx_log_error (NGX_LOG_INFO , & channel -> log , 0 ,
2673
+ "ngx_live_segmenter_dispose_segment: "
2674
+ "no active tracks, removing all frames" );
2675
+ ngx_live_segmenter_remove_all_channel_frames (channel );
2676
+ return NGX_OK ;
2677
+ }
2678
+
2645
2679
ngx_log_error (NGX_LOG_ALERT , & channel -> log , 0 ,
2646
2680
"ngx_live_segmenter_dispose_segment: no frames removed" );
2647
2681
return NGX_ERROR ;
@@ -3319,7 +3353,7 @@ ngx_live_segmenter_start_stream(ngx_live_stream_stream_req_t *req)
3319
3353
3320
3354
track = req -> track ;
3321
3355
3322
- ngx_live_segmenter_remove_all_frames (track );
3356
+ ngx_live_segmenter_remove_all_frames (track , 1 );
3323
3357
3324
3358
initial_frame_id = req -> header -> c .initial_frame_id ;
3325
3359
if (track -> next_frame_id > initial_frame_id ) {
0 commit comments