diff --git a/trunk/src/app/srs_app_fragment.cpp b/trunk/src/app/srs_app_fragment.cpp index bea0ae128..647853dc9 100644 --- a/trunk/src/app/srs_app_fragment.cpp +++ b/trunk/src/app/srs_app_fragment.cpp @@ -143,9 +143,12 @@ srs_error_t SrsFragment::rename() ss << tempdur; full_path = srs_string_replace(full_path, "[duration]", ss.str()); } - if (::rename(tmp_file.c_str(), full_path.c_str()) < 0) { + + int r0 = ::rename(tmp_file.c_str(), full_path.c_str()); + if (r0 < 0) { return srs_error_new(ERROR_SYSTEM_FRAGMENT_RENAME, "rename %s to %s", tmp_file.c_str(), full_path.c_str()); } + filepath = full_path; return err; } diff --git a/trunk/src/app/srs_app_hls.cpp b/trunk/src/app/srs_app_hls.cpp index f53ae0c62..077b0f3c9 100644 --- a/trunk/src/app/srs_app_hls.cpp +++ b/trunk/src/app/srs_app_hls.cpp @@ -575,6 +575,16 @@ srs_error_t SrsHlsMuxer::flush_video(SrsTsMessageCache* cache) } srs_error_t SrsHlsMuxer::segment_close() +{ + srs_error_t err = do_segment_close(); + + // We always cleanup current segment. + srs_freep(current); + + return err; +} + +srs_error_t SrsHlsMuxer::do_segment_close() { srs_error_t err = srs_success; @@ -614,7 +624,6 @@ srs_error_t SrsHlsMuxer::segment_close() // rename from tmp to real path if ((err = current->rename()) != srs_success) { - srs_freep(current); return srs_error_wrap(err, "rename"); } @@ -631,7 +640,6 @@ srs_error_t SrsHlsMuxer::segment_close() if ((err = current->unlink_tmpfile()) != srs_success) { return srs_error_wrap(err, "rename"); } - srs_freep(current); } // shrink the segments. @@ -1013,6 +1021,13 @@ srs_error_t SrsHlsController::reap_segment() // close current ts. if ((err = muxer->segment_close()) != srs_success) { + // When close segment error, we must reopen it for next packet to write. + srs_error_t r0 = muxer->segment_open(); + if (r0 != srs_success) { + srs_warn("close segment err %s", srs_error_desc(r0).c_str()); + srs_freep(r0); + } + return srs_error_wrap(err, "hls: segment close"); } diff --git a/trunk/src/app/srs_app_hls.hpp b/trunk/src/app/srs_app_hls.hpp index 3c99f9f6d..d51ad7efb 100644 --- a/trunk/src/app/srs_app_hls.hpp +++ b/trunk/src/app/srs_app_hls.hpp @@ -236,6 +236,7 @@ public: */ virtual srs_error_t segment_close(); private: + virtual srs_error_t do_segment_close(); virtual srs_error_t write_hls_key(); virtual srs_error_t refresh_m3u8(); virtual srs_error_t _refresh_m3u8(std::string m3u8_file);