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

pull/1651/head
winlin 6 years ago
parent d306ee7506
commit 1626942d29

@ -143,9 +143,12 @@ srs_error_t SrsFragment::rename()
ss << tempdur; ss << tempdur;
full_path = srs_string_replace(full_path, "[duration]", ss.str()); 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()); return srs_error_new(ERROR_SYSTEM_FRAGMENT_RENAME, "rename %s to %s", tmp_file.c_str(), full_path.c_str());
} }
filepath = full_path; filepath = full_path;
return err; return err;
} }

@ -575,6 +575,16 @@ srs_error_t SrsHlsMuxer::flush_video(SrsTsMessageCache* cache)
} }
srs_error_t SrsHlsMuxer::segment_close() 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; srs_error_t err = srs_success;
@ -614,7 +624,6 @@ srs_error_t SrsHlsMuxer::segment_close()
// rename from tmp to real path // rename from tmp to real path
if ((err = current->rename()) != srs_success) { if ((err = current->rename()) != srs_success) {
srs_freep(current);
return srs_error_wrap(err, "rename"); return srs_error_wrap(err, "rename");
} }
@ -631,7 +640,6 @@ srs_error_t SrsHlsMuxer::segment_close()
if ((err = current->unlink_tmpfile()) != srs_success) { if ((err = current->unlink_tmpfile()) != srs_success) {
return srs_error_wrap(err, "rename"); return srs_error_wrap(err, "rename");
} }
srs_freep(current);
} }
// shrink the segments. // shrink the segments.
@ -1013,6 +1021,13 @@ srs_error_t SrsHlsController::reap_segment()
// close current ts. // close current ts.
if ((err = muxer->segment_close()) != srs_success) { 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"); return srs_error_wrap(err, "hls: segment close");
} }

@ -236,6 +236,7 @@ public:
*/ */
virtual srs_error_t segment_close(); virtual srs_error_t segment_close();
private: private:
virtual srs_error_t do_segment_close();
virtual srs_error_t write_hls_key(); virtual srs_error_t write_hls_key();
virtual srs_error_t refresh_m3u8(); virtual srs_error_t refresh_m3u8();
virtual srs_error_t _refresh_m3u8(std::string m3u8_file); virtual srs_error_t _refresh_m3u8(std::string m3u8_file);

Loading…
Cancel
Save