1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

fix the hls crash bug

This commit is contained in:
winlin 2013-12-01 19:54:52 +08:00
parent 3c8cc487e6
commit 09f9811a97

View file

@ -714,6 +714,9 @@ int SrsHls::reopen()
current->duration = (stream_dts - current->segment_start_dts) / 90000.0; current->duration = (stream_dts - current->segment_start_dts) / 90000.0;
segments.push_back(current); segments.push_back(current);
srs_trace("reap ts segment, sequence_no=%d, uri=%s, duration=%.2f, start=%"PRId64"",
current->sequence_no, current->uri.c_str(), current->duration, current->segment_start_dts);
// close the muxer of finished segment. // close the muxer of finished segment.
srs_freep(current->muxer); srs_freep(current->muxer);
current = NULL; current = NULL;
@ -726,19 +729,20 @@ int SrsHls::reopen()
std::vector<SrsM3u8Segment*>::reverse_iterator it; std::vector<SrsM3u8Segment*>::reverse_iterator it;
for (it = segments.rbegin(); it != segments.rend(); ++it) { for (it = segments.rbegin(); it != segments.rend(); ++it) {
SrsM3u8Segment* segment = *it; SrsM3u8Segment* segment = *it;
duration += segment->duration;
// once find the overflow segment, clear all segments before it.
if ((int)duration > hls_window) { if ((int)duration > hls_window) {
segment_to_remove.push_back(segment); segment_to_remove.push_back(segment);
continue;
} }
duration += segment->duration;
} }
if (!segment_to_remove.empty()) { if (!segment_to_remove.empty()) {
segments.erase(segments.begin(), segments.begin() + segment_to_remove.size()); segments.erase(segments.begin(), segments.begin() + segment_to_remove.size());
// refresh the m3u8, donot contains the removed ts // refresh the m3u8, donot contains the removed ts
if ((ret = refresh_m3u8()) != ERROR_SUCCESS) { ret = refresh_m3u8();
return ret;
}
} }
// remove the ts file. // remove the ts file.
@ -747,6 +751,12 @@ int SrsHls::reopen()
unlink(segment->full_path.c_str()); unlink(segment->full_path.c_str());
srs_freep(segment); srs_freep(segment);
} }
// check ret of refresh m3u8
if (ret != ERROR_SUCCESS) {
srs_error("refresh m3u8 failed. ret=%d", ret);
return ret;
}
} }
// new segment. // new segment.
current = new SrsM3u8Segment(); current = new SrsM3u8Segment();