胡斌

add #EXT-X-ENDLIST" when drop segment for unpublish

... ... @@ -814,6 +814,7 @@ int SrsHlsMuxer::segment_close(string log_desc)
if (currentSeg->is_sequence_header) {
if( m3u8_total_endlist_saved ){
erase_last_endlist = true;
m3u8_total_endlist_saved = false;
}
if (currentSeg->sequence_no != 0) {
// #EXT-X-DISCONTINUITY\n
... ... @@ -833,6 +834,7 @@ int SrsHlsMuxer::segment_close(string log_desc)
ss << currentSeg->uri << SRS_CONSTS_LF;
srs_verbose("write m3u8 segment uri success.");
srs_trace("---log_desc:%s",log_desc.c_str());
if(log_desc == "unpublish"){
ss << "#EXT-X-ENDLIST" << SRS_CONSTS_LF;
m3u8_total_endlist_saved = true;
... ... @@ -886,6 +888,29 @@ int SrsHlsMuxer::segment_close(string log_desc)
// reuse current segment index.
_sequence_no--;
//write #EXT-X-ENDLIST" when unpublish and drop segment
if(save_m3u8_total && !m3u8_total_endlist_saved && log_desc == "unpublish" ){
SrsFileWriter total_m3u8_writer;
ret = total_m3u8_writer.open_write(total_m3u8);
if (ret != ERROR_SUCCESS) {
srs_error(
"open total file %s error when drop segment:%s reap ts segment, sequence_no=%d, uri=%s, duration=%.2f, start=%"PRId64,
total_m3u8.c_str(), log_desc.c_str(),
current->sequence_no, current->uri.c_str(),
current->duration, current->segment_start_dts);
return ret;
}
std::stringstream ss;
ss << "#EXT-X-ENDLIST" << SRS_CONSTS_LF;
m3u8_total_endlist_saved = true;
std::string m3u8 = ss.str();
if ((ret = total_m3u8_writer.write((char*) m3u8.c_str(),
(int) m3u8.length(), NULL)) != ERROR_SUCCESS) {
srs_error("write m3u8 failed. ret=%d", ret);
return ret;
}
}
srs_trace("%s drop ts segment, sequence_no=%d, uri=%s, duration=%.2f, start=%"PRId64"",
log_desc.c_str(), current->sequence_no, current->uri.c_str(), current->duration,
current->segment_start_dts);
... ...