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:
parent
3c8cc487e6
commit
09f9811a97
1 changed files with 14 additions and 4 deletions
|
@ -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();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue