Skip to content

Commit e7a2776

Browse files
committed
Improve VTT playlist duration precision in (LL-)HLS
1 parent c255469 commit e7a2776

File tree

3 files changed

+16
-19
lines changed

3 files changed

+16
-19
lines changed

src/projects/modules/containers/webvtt/webvtt_packager.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ namespace webvtt
3737
return true;
3838
}
3939

40-
bool Packager::MakeSegment(int64_t segment_number, int64_t start_time_ms, int64_t duration_ms)
40+
bool Packager::MakeSegment(int64_t segment_number, int64_t start_time_ms, double duration_ms)
4141
{
4242
ov::String vtt_text;
4343

@@ -62,7 +62,7 @@ namespace webvtt
6262
return true;
6363
}
6464

65-
bool Packager::MakePartialSegment(int64_t segment_number, int64_t partial_segment_number, int64_t start_time_ms, int64_t duration_ms)
65+
bool Packager::MakePartialSegment(int64_t segment_number, int64_t partial_segment_number, int64_t start_time_ms, double duration_ms)
6666
{
6767
ov::String vtt_text;
6868

@@ -103,10 +103,10 @@ namespace webvtt
103103
return vtt_text;
104104
}
105105

106-
const ov::String Packager::MakeCueText(int64_t start_time_ms, int64_t duration_ms, bool remove_used_frames)
106+
const ov::String Packager::MakeCueText(int64_t start_time_ms, double duration_ms, bool remove_used_frames)
107107
{
108108
ov::String cue_text;
109-
int64_t end_time_ms = start_time_ms + duration_ms;
109+
int64_t end_time_ms = start_time_ms + static_cast<int64_t>(llround(duration_ms));
110110
bool expired_frame = false;
111111
std::unique_lock<std::shared_mutex> lock(_frames_guard);
112112
for (auto it = _frames.begin(); it != _frames.end();)

src/projects/modules/containers/webvtt/webvtt_packager.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -172,8 +172,8 @@ namespace webvtt
172172

173173
bool AddFrame(const std::shared_ptr<WebVTTFrame> &frame);
174174

175-
bool MakeSegment(int64_t segment_number, int64_t start_time_ms, int64_t duration_ms);
176-
bool MakePartialSegment(int64_t segment_number, int64_t partial_segment_number, int64_t start_time_ms, int64_t duration_ms);
175+
bool MakeSegment(int64_t segment_number, int64_t start_time_ms, double duration_ms);
176+
bool MakePartialSegment(int64_t segment_number, int64_t partial_segment_number, int64_t start_time_ms, double duration_ms);
177177
bool DeleteSegment(int64_t segment_number);
178178

179179
// SegmentStorage overrides
@@ -193,7 +193,7 @@ namespace webvtt
193193
std::shared_ptr<PartialSegment> GetPartialSegmentInternal(int64_t segment_number, int64_t partial_segment_number) const;
194194

195195
const ov::String MakeVTTHeader(int64_t start_time_ms);
196-
const ov::String MakeCueText(int64_t start_time_ms, int64_t duration_ms, bool remove_used_frames);
196+
const ov::String MakeCueText(int64_t start_time_ms, double duration_ms, bool remove_used_frames);
197197

198198
// start_time_ms : frame
199199
// To make ordered

src/projects/publishers/llhls/llhls_stream.cpp

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,10 @@ bool LLHlsStream::Start()
167167
auto data_track = GetFirstTrackByType(cmn::MediaType::Data);
168168

169169
std::shared_ptr<MediaTrack> first_video_track = nullptr, first_audio_track = nullptr;
170+
first_video_track = GetFirstTrackByType(cmn::MediaType::Video);
171+
first_audio_track = GetFirstTrackByType(cmn::MediaType::Audio);
172+
173+
_vtt_reference_track_id = first_video_track ? first_video_track->GetId() : first_audio_track ? first_audio_track->GetId() : -1;
170174
for (const auto &[id, track] : _tracks)
171175
{
172176
if (IsSupportedMediaCodec(track->GetCodecId()) == true)
@@ -176,16 +180,6 @@ bool LLHlsStream::Start()
176180
logte("LLHlsStream(%s/%s) - Failed to add packager for track(%u)", GetApplication()->GetVHostAppName().CStr(), GetName().CStr(), track->GetId());
177181
return false;
178182
}
179-
180-
// For default llhls.m3u8
181-
if (first_video_track == nullptr && track->GetMediaType() == cmn::MediaType::Video)
182-
{
183-
first_video_track = track;
184-
}
185-
else if (first_audio_track == nullptr && track->GetMediaType() == cmn::MediaType::Audio)
186-
{
187-
first_audio_track = track;
188-
}
189183
}
190184
else
191185
{
@@ -199,8 +193,6 @@ bool LLHlsStream::Start()
199193
}
200194
}
201195

202-
_vtt_reference_track_id = first_video_track ? first_video_track->GetId() : first_audio_track ? first_audio_track->GetId() : -1;
203-
204196
// Set renditions to each chunklist writer
205197
{
206198
std::lock_guard<std::shared_mutex> lock(_chunklist_map_lock);
@@ -1524,6 +1516,11 @@ bool LLHlsStream::AddVttPackager(const std::shared_ptr<const MediaTrack> &track)
15241516
// Chunklist
15251517
auto segment_duration = std::round(static_cast<double>(_storage_config.segment_duration_ms) / 1000.0);
15261518
auto chunk_duration = static_cast<double>(_packager_config.chunk_duration_ms) / 1000.0;
1519+
auto refer_track = GetTrack(_vtt_reference_track_id);
1520+
if (refer_track != nullptr)
1521+
{
1522+
chunk_duration = std::round(ComputeOptimalPartDuration(refer_track)) / 1000.0;
1523+
}
15271524

15281525
auto chunklist = std::make_shared<LLHlsChunklist>(GetChunklistName(track->GetId()),
15291526
track,

0 commit comments

Comments
 (0)