Fix SrsHlsMuxer::segment_close bug, reopen segment when close failed.

pull/1651/head
winlin
parent d306ee7506
commit 1626942d29

@ -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;
}

@ -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");
}

@ -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);

Loading…
Cancel
Save