winlin

fix bug of hls muxer, support close/open/flush even muxer is closed.

@@ -503,7 +503,6 @@ SrsM3u8Muxer::SrsM3u8Muxer() @@ -503,7 +503,6 @@ SrsM3u8Muxer::SrsM3u8Muxer()
503 video_stream_dts = 0; 503 video_stream_dts = 0;
504 file_index = 0; 504 file_index = 0;
505 current = NULL; 505 current = NULL;
506 - _is_open = false;  
507 } 506 }
508 507
509 SrsM3u8Muxer::~SrsM3u8Muxer() 508 SrsM3u8Muxer::~SrsM3u8Muxer()
@@ -518,11 +517,6 @@ SrsM3u8Muxer::~SrsM3u8Muxer() @@ -518,11 +517,6 @@ SrsM3u8Muxer::~SrsM3u8Muxer()
518 srs_freep(current); 517 srs_freep(current);
519 } 518 }
520 519
521 -bool SrsM3u8Muxer::is_open()  
522 -{  
523 - return _is_open;  
524 -}  
525 -  
526 int SrsM3u8Muxer::update_config( 520 int SrsM3u8Muxer::update_config(
527 std::string _app, std::string _stream, 521 std::string _app, std::string _stream,
528 std::string path, int fragment, int window 522 std::string path, int fragment, int window
@@ -542,6 +536,11 @@ int SrsM3u8Muxer::segment_open() @@ -542,6 +536,11 @@ int SrsM3u8Muxer::segment_open()
542 { 536 {
543 int ret = ERROR_SUCCESS; 537 int ret = ERROR_SUCCESS;
544 538
  539 + if (current) {
  540 + srs_warn("ignore the segment open, for segment is already open.");
  541 + return ret;
  542 + }
  543 +
545 // TODO: create all parents dirs. 544 // TODO: create all parents dirs.
546 // create dir for app. 545 // create dir for app.
547 if ((ret = create_dir()) != ERROR_SUCCESS) { 546 if ((ret = create_dir()) != ERROR_SUCCESS) {
@@ -578,8 +577,6 @@ int SrsM3u8Muxer::segment_open() @@ -578,8 +577,6 @@ int SrsM3u8Muxer::segment_open()
578 srs_info("open HLS muxer success. vhost=%s, path=%s", 577 srs_info("open HLS muxer success. vhost=%s, path=%s",
579 vhost.c_str(), current->full_path.c_str()); 578 vhost.c_str(), current->full_path.c_str());
580 579
581 - _is_open = true;  
582 -  
583 return ret; 580 return ret;
584 } 581 }
585 582
@@ -587,7 +584,11 @@ int SrsM3u8Muxer::flush_audio(SrsMpegtsFrame* af, SrsCodecBuffer* ab) @@ -587,7 +584,11 @@ int SrsM3u8Muxer::flush_audio(SrsMpegtsFrame* af, SrsCodecBuffer* ab)
587 { 584 {
588 int ret = ERROR_SUCCESS; 585 int ret = ERROR_SUCCESS;
589 586
590 - srs_assert(current); 587 + // if current is NULL, segment is not open, ignore the flush event.
  588 + if (!current) {
  589 + srs_warn("flush audio ignored, for segment is not open.");
  590 + return ret;
  591 + }
591 592
592 if (ab->size <= 0) { 593 if (ab->size <= 0) {
593 return ret; 594 return ret;
@@ -609,10 +610,15 @@ int SrsM3u8Muxer::flush_video( @@ -609,10 +610,15 @@ int SrsM3u8Muxer::flush_video(
609 { 610 {
610 int ret = ERROR_SUCCESS; 611 int ret = ERROR_SUCCESS;
611 612
612 - srs_assert(current); 613 + // if current is NULL, segment is not open, ignore the flush event.
  614 + if (!current) {
  615 + srs_warn("flush video ignored, for segment is not open.");
  616 + return ret;
  617 + }
613 618
614 video_stream_dts = vf->dts; 619 video_stream_dts = vf->dts;
615 620
  621 + srs_assert(current);
616 // reopen the muxer for a gop 622 // reopen the muxer for a gop
617 if (vf->key && current->duration >= hls_fragment) { 623 if (vf->key && current->duration >= hls_fragment) {
618 // TODO: flush audio before or after segment? 624 // TODO: flush audio before or after segment?
@@ -643,7 +649,6 @@ int SrsM3u8Muxer::flush_video( @@ -643,7 +649,6 @@ int SrsM3u8Muxer::flush_video(
643 } 649 }
644 } 650 }
645 651
646 - srs_assert(current);  
647 // update the duration of segment. 652 // update the duration of segment.
648 current->update_duration(video_stream_dts); 653 current->update_duration(video_stream_dts);
649 654
@@ -661,6 +666,11 @@ int SrsM3u8Muxer::segment_close() @@ -661,6 +666,11 @@ int SrsM3u8Muxer::segment_close()
661 { 666 {
662 int ret = ERROR_SUCCESS; 667 int ret = ERROR_SUCCESS;
663 668
  669 + if (!current) {
  670 + srs_warn("ignore the segment close, for segment is not open.");
  671 + return ret;
  672 + }
  673 +
664 // when close current segment, the current segment must not be NULL. 674 // when close current segment, the current segment must not be NULL.
665 srs_assert(current); 675 srs_assert(current);
666 676
@@ -718,8 +728,6 @@ int SrsM3u8Muxer::segment_close() @@ -718,8 +728,6 @@ int SrsM3u8Muxer::segment_close()
718 return ret; 728 return ret;
719 } 729 }
720 730
721 - _is_open = false;  
722 -  
723 return ret; 731 return ret;
724 } 732 }
725 733
@@ -1186,14 +1194,12 @@ void SrsHls::on_unpublish() @@ -1186,14 +1194,12 @@ void SrsHls::on_unpublish()
1186 { 1194 {
1187 int ret = ERROR_SUCCESS; 1195 int ret = ERROR_SUCCESS;
1188 1196
1189 - if (muxer->is_open()) {  
1190 - // close muxer when unpublish.  
1191 - ret = ts_cache->flush_audio(muxer);  
1192 - ret += muxer->segment_close(); 1197 + // close muxer when unpublish.
  1198 + ret = ts_cache->flush_audio(muxer);
  1199 + ret += muxer->segment_close();
1193 1200
1194 - if (ret != ERROR_SUCCESS) {  
1195 - srs_error("ignore m3u8 muxer flush/close audio failed. ret=%d", ret);  
1196 - } 1201 + if (ret != ERROR_SUCCESS) {
  1202 + srs_error("ignore m3u8 muxer flush/close audio failed. ret=%d", ret);
1197 } 1203 }
1198 1204
1199 hls_enabled = false; 1205 hls_enabled = false;
@@ -132,7 +132,6 @@ private: @@ -132,7 +132,6 @@ private:
132 int hls_fragment; 132 int hls_fragment;
133 int hls_window; 133 int hls_window;
134 private: 134 private:
135 - bool _is_open;  
136 int file_index; 135 int file_index;
137 std::string m3u8; 136 std::string m3u8;
138 private: 137 private:
@@ -150,7 +149,6 @@ public: @@ -150,7 +149,6 @@ public:
150 SrsM3u8Muxer(); 149 SrsM3u8Muxer();
151 virtual ~SrsM3u8Muxer(); 150 virtual ~SrsM3u8Muxer();
152 public: 151 public:
153 - virtual bool is_open();  
154 virtual int update_config(std::string _app, std::string _stream, std::string path, int fragment, int window); 152 virtual int update_config(std::string _app, std::string _stream, std::string path, int fragment, int window);
155 virtual int segment_open(); 153 virtual int segment_open();
156 virtual int flush_audio(SrsMpegtsFrame* af, SrsCodecBuffer* ab); 154 virtual int flush_audio(SrsMpegtsFrame* af, SrsCodecBuffer* ab);