Skip to content

Commit

Permalink
Changed PRELOAD-HINT meta policy
Browse files Browse the repository at this point in the history
  • Loading branch information
getroot committed Nov 25, 2023
1 parent 0119f61 commit 162c81a
Show file tree
Hide file tree
Showing 8 changed files with 232 additions and 116 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ namespace cfg
LLHlsDvr _dvr;
LLHlsDrm _drm;
bool _server_time_based_segment_numbering = false;
bool _enable_preload_hint = true;

public:
PublisherType GetType() const override
Expand All @@ -54,6 +55,7 @@ namespace cfg
CFG_DECLARE_CONST_REF_GETTER_OF(GetCacheControl, _cache_control)
CFG_DECLARE_CONST_REF_GETTER_OF(GetDvr, _dvr)
CFG_DECLARE_CONST_REF_GETTER_OF(GetDrm, _drm)
CFG_DECLARE_CONST_REF_GETTER_OF(IsPreloadHintEnabled, _enable_preload_hint)

protected:
void MakeList() override
Expand All @@ -71,6 +73,7 @@ namespace cfg
Register<Optional>("CacheControl", &_cache_control);
Register<Optional>("DVR", &_dvr);
Register<Optional>("DRM", &_drm);
Register<Optional>("EnablePreloadHint", &_enable_preload_hint);
}
};
} // namespace pub
Expand Down
78 changes: 42 additions & 36 deletions src/projects/modules/containers/bmff/fmp4_packager/fmp4_storage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -266,54 +266,59 @@ namespace bmff
return segment;
}

bool FMP4Storage::AppendMediaChunk(const std::shared_ptr<ov::Data> &chunk, int64_t start_timestamp, double duration_ms, bool independent, bool last_chunk)
std::shared_ptr<FMP4Segment> FMP4Storage::CreateNextSegment()
{
auto segment = GetLastSegment();

if (segment == nullptr || segment->IsCompleted())
// Create next segment
auto segment = std::make_shared<FMP4Segment>(GetLastSegmentNumber() + 1, _config.segment_duration_ms);
{
// Notify observer
if (segment != nullptr && _observer != nullptr)
{
_observer->OnMediaSegmentUpdated(_track->GetId(), segment->GetNumber());
}
std::lock_guard<std::shared_mutex> lock(_segments_lock);
_segments.emplace(segment->GetNumber(), segment);

// Create next segment
segment = std::make_shared<FMP4Segment>(GetLastSegmentNumber() + 1, _config.segment_duration_ms);
// Delete old segments
if (_segments.size() > _config.max_segments)
{
std::lock_guard<std::shared_mutex> lock(_segments_lock);
_segments.emplace(segment->GetNumber(), segment);

// Delete old segments
if (_segments.size() > _config.max_segments)
{
auto old_it = _segments.begin();
std::advance(old_it, (_segments.size() - _config.max_segments) - 1);
auto old_it = _segments.begin();
std::advance(old_it, (_segments.size() - _config.max_segments) - 1);

auto old_segment = old_it->second;
auto old_segment = old_it->second;

// Since the chunklist is updated late, the player may request deleted segments in the meantime, so it actually deletes them a bit late.
if (_segments.size() > _config.max_segments + 3)
{
_segments.erase(_segments.begin());
}
// Since the chunklist is updated late, the player may request deleted segments in the meantime, so it actually deletes them a bit late.
if (_segments.size() > _config.max_segments + 3)
{
_segments.erase(_segments.begin());
}

// DVR
if (_config.dvr_enabled)
{
SaveMediaSegmentToFile(old_segment);
}
else
// DVR
if (_config.dvr_enabled)
{
SaveMediaSegmentToFile(old_segment);
}
else
{
if (_observer != nullptr)
{
if (_observer != nullptr)
{
_observer->OnMediaSegmentDeleted(_track->GetId(), old_segment->GetNumber());
}
_observer->OnMediaSegmentDeleted(_track->GetId(), old_segment->GetNumber());
}
}
}
}

if (_observer != nullptr)
{
_observer->OnMediaSegmentCreated(_track->GetId(), segment->GetNumber());
}

return segment;
}

bool FMP4Storage::AppendMediaChunk(const std::shared_ptr<ov::Data> &chunk, int64_t start_timestamp, double duration_ms, bool independent, bool last_chunk)
{
auto segment = GetLastSegment();
if (segment == nullptr || segment->IsCompleted() == true)
{
segment = CreateNextSegment();
}

if (segment->AppendChunkData(chunk, start_timestamp, duration_ms, independent) == false)
{
return false;
Expand Down Expand Up @@ -353,7 +358,8 @@ namespace bmff
// Notify observer
if (_observer != nullptr)
{
_observer->OnMediaChunkUpdated(_track->GetId(), segment->GetNumber(), segment->GetLastChunkNumber());
bool last_chunk = segment->IsCompleted() == true;
_observer->OnMediaChunkUpdated(_track->GetId(), segment->GetNumber(), segment->GetLastChunkNumber(), last_chunk);
}

return true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ namespace bmff
{
public:
virtual void OnFMp4StorageInitialized(const int32_t &track_id) = 0;
virtual void OnMediaSegmentUpdated(const int32_t &track_id, const uint32_t &segment_number) = 0;
virtual void OnMediaChunkUpdated(const int32_t &track_id, const uint32_t &segment_number, const uint32_t &chunk_number) = 0;
virtual void OnMediaSegmentCreated(const int32_t &track_id, const uint32_t &segment_number) = 0;
virtual void OnMediaChunkUpdated(const int32_t &track_id, const uint32_t &segment_number, const uint32_t &chunk_number, bool last_chunk) = 0;
virtual void OnMediaSegmentDeleted(const int32_t &track_id, const uint32_t &segment_number) = 0;
};

Expand Down Expand Up @@ -161,6 +161,8 @@ namespace bmff
bool SaveMediaSegmentToFile(const std::shared_ptr<FMP4Segment> &segment);
std::shared_ptr<FMP4Segment> LoadMediaSegmentFromFile(uint32_t segment_number) const;

std::shared_ptr<FMP4Segment> CreateNextSegment();

Config _config;

std::shared_ptr<const MediaTrack> _track;
Expand Down
Loading

0 comments on commit 162c81a

Please sign in to comment.