From ba7c700c895f408ea7cc363b0abc39900e073a78 Mon Sep 17 00:00:00 2001 From: Dimiden Date: Mon, 17 Feb 2025 18:56:51 +0900 Subject: [PATCH] Fixed issue where wallclock was not applied to some playlists when multiple playlists existed --- src/projects/publishers/hls/hls_media_playlist.cpp | 2 +- src/projects/publishers/hls/hls_media_playlist.h | 3 ++- src/projects/publishers/hls/hls_stream.cpp | 6 +++--- src/projects/publishers/hls/hls_stream.h | 4 +--- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/projects/publishers/hls/hls_media_playlist.cpp b/src/projects/publishers/hls/hls_media_playlist.cpp index b5fbe8f86..ae9a15dfe 100644 --- a/src/projects/publishers/hls/hls_media_playlist.cpp +++ b/src/projects/publishers/hls/hls_media_playlist.cpp @@ -41,7 +41,7 @@ void HlsMediaPlaylist::SetEndList() bool HlsMediaPlaylist::OnSegmentCreated(const std::shared_ptr &segment) { - OV_ASSERT(_wallclock_offset_ms > 0, "Wallclock offset is not set"); + OV_ASSERT(_wallclock_offset_ms != INT64_MIN, "Wallclock offset is not set"); std::lock_guard lock(_segments_mutex); diff --git a/src/projects/publishers/hls/hls_media_playlist.h b/src/projects/publishers/hls/hls_media_playlist.h index 2db82521a..da3ebc7e5 100644 --- a/src/projects/publishers/hls/hls_media_playlist.h +++ b/src/projects/publishers/hls/hls_media_playlist.h @@ -27,6 +27,7 @@ class HlsMediaPlaylist void AddMediaTrackInfo(const std::shared_ptr &track); + int64_t GetWallclockOffset() const { return _wallclock_offset_ms; } void SetWallclockOffset(int64_t offset_ms) { _wallclock_offset_ms = offset_ms; } bool OnSegmentCreated(const std::shared_ptr &segment); @@ -63,7 +64,7 @@ class HlsMediaPlaylist // Segment number : Segment std::map> _segments; mutable std::shared_mutex _segments_mutex; - int64_t _wallclock_offset_ms = 0; + int64_t _wallclock_offset_ms = INT64_MIN; bool _end_list = false; }; \ No newline at end of file diff --git a/src/projects/publishers/hls/hls_stream.cpp b/src/projects/publishers/hls/hls_stream.cpp index b682bd601..853d0bb78 100755 --- a/src/projects/publishers/hls/hls_stream.cpp +++ b/src/projects/publishers/hls/hls_stream.cpp @@ -462,14 +462,14 @@ void HlsStream::OnSegmentCreated(const ov::String &packager_id, const std::share segment->SetUrl(GetSegmentName(packager_id, segment->GetNumber())); - if (_is_first_segment) + if (playlist->GetWallclockOffset() == INT64_MIN) { - _is_first_segment = false; - auto first_segment_timestamp_ms = (segment->GetFirstTimestamp() / mpegts::TIMEBASE_DBL) * 1000.0; auto wallclock_offset_ms = static_cast(std::chrono::duration_cast(GetInputStreamPublishedTime().time_since_epoch()).count() - first_segment_timestamp_ms); + OV_ASSERT(wallclock_offset_ms != INT64_MIN, "Failed to calculate wallclock offset"); + playlist->SetWallclockOffset(wallclock_offset_ms); } diff --git a/src/projects/publishers/hls/hls_stream.h b/src/projects/publishers/hls/hls_stream.h index 6ba08d41e..bd0d71686 100755 --- a/src/projects/publishers/hls/hls_stream.h +++ b/src/projects/publishers/hls/hls_stream.h @@ -118,6 +118,4 @@ class HlsStream final : public pub::Stream, public mpegts::PackagerSink // Append #EXT-X-ENDLIST all chunklists, and no more update segment and chunklist bool _concluded = false; mutable std::shared_mutex _concluded_lock; - - bool _is_first_segment = true; -}; \ No newline at end of file +};