|
|
|
@ -63,6 +63,17 @@ void SrsHlsSegment::config_cipher(unsigned char* key,unsigned char* iv)
|
|
|
|
|
|
|
|
|
|
SrsEncFileWriter* fw = (SrsEncFileWriter*)writer;
|
|
|
|
|
fw->config_cipher(key, iv);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
srs_error_t SrsHlsSegment::rename()
|
|
|
|
|
{
|
|
|
|
|
if (true) {
|
|
|
|
|
std::stringstream ss;
|
|
|
|
|
ss << srsu2msi(duration());
|
|
|
|
|
uri = srs_string_replace(uri, "[duration]", ss.str());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return SrsFragment::rename();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SrsDvrAsyncCallOnHls::SrsDvrAsyncCallOnHls(SrsContextId c, SrsRequest* r, string p, string t, string m, string mu, int s, srs_utime_t d)
|
|
|
|
@ -607,6 +618,11 @@ srs_error_t SrsHlsMuxer::do_segment_close()
|
|
|
|
|
bool matchMinDuration = current->duration() >= SRS_HLS_SEGMENT_MIN_DURATION;
|
|
|
|
|
bool matchMaxDuration = current->duration() <= max_td * 2 * 1000;
|
|
|
|
|
if (matchMinDuration && matchMaxDuration) {
|
|
|
|
|
// rename from tmp to real path
|
|
|
|
|
if ((err = current->rename()) != srs_success) {
|
|
|
|
|
return srs_error_wrap(err, "rename");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// use async to call the http hooks, for it will cause thread switch.
|
|
|
|
|
if ((err = async->execute(new SrsDvrAsyncCallOnHls(_srs_context->get_id(), req, current->fullpath(),
|
|
|
|
|
current->uri, m3u8, m3u8_url, current->sequence_no, current->duration()))) != srs_success) {
|
|
|
|
@ -620,12 +636,7 @@ srs_error_t SrsHlsMuxer::do_segment_close()
|
|
|
|
|
|
|
|
|
|
// close the muxer of finished segment.
|
|
|
|
|
srs_freep(current->tscw);
|
|
|
|
|
|
|
|
|
|
// rename from tmp to real path
|
|
|
|
|
if ((err = current->rename()) != srs_success) {
|
|
|
|
|
return srs_error_wrap(err, "rename");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
segments->append(current);
|
|
|
|
|
current = NULL;
|
|
|
|
|
} else {
|
|
|
|
|