Skip to content

Commit 3537652

Browse files
committed
2 parents cf506e0 + 57510cc commit 3537652

File tree

17 files changed

+655
-175
lines changed

17 files changed

+655
-175
lines changed

src/projects/base/modules/container/segment_storage.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,17 @@ namespace base
1818
class PartialSegment
1919
{
2020
public:
21-
2221
virtual int64_t GetNumber() const = 0;
2322
virtual int64_t GetStartTimestamp() const = 0;
2423
virtual double GetDurationMs() const = 0;
2524
virtual bool IsIndependent() const = 0;
2625
virtual uint64_t GetDataLength() const = 0;
2726
virtual const std::shared_ptr<ov::Data> GetData() const = 0;
27+
28+
virtual ov::String GetUrl() const { return ""; }
29+
virtual void SetUrl(const ov::String &url) {}
30+
31+
virtual double GetTimebaseSeconds() const = 0;
2832
};
2933

3034
class Segment : public PartialSegment
@@ -46,9 +50,9 @@ namespace base
4650
virtual ~SegmentStorage() = default;
4751

4852
virtual std::shared_ptr<ov::Data> GetInitializationSection() const = 0;
49-
virtual std::shared_ptr<Segment> GetSegment(uint32_t segment_number) const = 0;
53+
virtual std::shared_ptr<Segment> GetSegment(int64_t segment_number) const = 0;
5054
virtual std::shared_ptr<Segment> GetLastSegment() const = 0;
51-
virtual std::shared_ptr<PartialSegment> GetPartialSegment(uint32_t segment_number, uint32_t partial_number) const = 0;
55+
virtual std::shared_ptr<PartialSegment> GetPartialSegment(int64_t segment_number, int64_t partial_number) const = 0;
5256

5357
virtual uint64_t GetSegmentCount() const = 0;
5458

@@ -57,6 +61,8 @@ namespace base
5761

5862
virtual uint64_t GetMaxPartialDurationMs() const = 0;
5963
virtual uint64_t GetMinPartialDurationMs() const = 0;
64+
65+
virtual ov::String GetContainerExtension() const = 0;
6066
};
6167
}
6268
}

src/projects/modules/containers/bmff/fmp4_packager/fmp4_storage.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ namespace bmff
5555
return _initialization_section;
5656
}
5757

58-
std::shared_ptr<base::modules::Segment> FMP4Storage::GetSegment(uint32_t segment_number) const
58+
std::shared_ptr<base::modules::Segment> FMP4Storage::GetSegment(int64_t segment_number) const
5959
{
6060
return GetSegmentInternal(static_cast<int64_t>(segment_number));
6161
}
@@ -102,7 +102,7 @@ namespace bmff
102102
return _segments.rbegin()->second;
103103
}
104104

105-
std::shared_ptr<base::modules::PartialSegment> FMP4Storage::GetPartialSegment(uint32_t segment_number, uint32_t partial_number) const
105+
std::shared_ptr<base::modules::PartialSegment> FMP4Storage::GetPartialSegment(int64_t segment_number, int64_t partial_number) const
106106
{
107107
// Get Media Segement
108108
auto segment = GetSegmentInternal(segment_number);
@@ -287,7 +287,7 @@ namespace bmff
287287
std::shared_ptr<FMP4Segment> FMP4Storage::CreateNextSegment()
288288
{
289289
// Create next segment
290-
auto segment = std::make_shared<FMP4Segment>(GetLastSegmentNumber() + 1, _config.segment_duration_ms);
290+
auto segment = std::make_shared<FMP4Segment>(GetLastSegmentNumber() + 1, _config.segment_duration_ms, _track->GetTimeBase().GetExpr());
291291
{
292292
std::lock_guard<std::shared_mutex> lock(_segments_lock);
293293
_segments.emplace(segment->GetNumber(), segment);

src/projects/modules/containers/bmff/fmp4_packager/fmp4_storage.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,19 +42,21 @@ namespace bmff
4242
virtual ~FMP4Storage();
4343

4444
std::shared_ptr<ov::Data> GetInitializationSection() const override;
45-
std::shared_ptr<base::modules::Segment> GetSegment(uint32_t segment_number) const override;
45+
std::shared_ptr<base::modules::Segment> GetSegment(int64_t segment_number) const override;
4646
std::shared_ptr<base::modules::Segment> GetLastSegment() const override;
47-
std::shared_ptr<base::modules::PartialSegment> GetPartialSegment(uint32_t segment_number, uint32_t partial_number) const override;
47+
std::shared_ptr<base::modules::PartialSegment> GetPartialSegment(int64_t segment_number, int64_t partial_number) const override;
4848
uint64_t GetSegmentCount() const override;
4949
int64_t GetLastSegmentNumber() const override;
50-
std::tuple<int64_t, int64_t> GetLastPartialSegmentNumber() const;
50+
std::tuple<int64_t, int64_t> GetLastPartialSegmentNumber() const override;
5151

5252
bool StoreInitializationSection(const std::shared_ptr<ov::Data> &section);
5353
bool AppendMediaChunk(const std::shared_ptr<ov::Data> &chunk, int64_t start_timestamp, double duration_ms, bool independent, bool last_chunk, const std::vector<std::shared_ptr<Marker>> &markers = {});
5454

5555
uint64_t GetMaxPartialDurationMs() const override;
5656
uint64_t GetMinPartialDurationMs() const override;
5757

58+
ov::String GetContainerExtension() const override { return "m4s"; }
59+
5860
double GetTargetSegmentDuration() const;
5961

6062
private:

src/projects/modules/containers/bmff/fmp4_packager/fmp4_structure.h

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,14 @@ namespace bmff
1717
class FMP4Partial : public base::modules::PartialSegment
1818
{
1919
public:
20-
FMP4Partial(const std::shared_ptr<ov::Data> &data, int64_t number, int64_t start_timestamp, double duration_ms, bool independent)
20+
FMP4Partial(const std::shared_ptr<ov::Data> &data, int64_t number, int64_t start_timestamp, double duration_ms, bool independent, double timebase_seconds)
2121
{
2222
_data = data;
2323
_number = number;
2424
_duration_ms = duration_ms;
2525
_start_timestamp = start_timestamp;
2626
_independent = independent;
27+
_timebase_seconds = timebase_seconds;
2728
}
2829

2930
int64_t GetNumber() const override
@@ -57,20 +58,27 @@ namespace bmff
5758
return _data;
5859
}
5960

61+
double GetTimebaseSeconds() const override
62+
{
63+
return _timebase_seconds;
64+
}
65+
6066
private:
6167
int64_t _number = -1;
6268
int64_t _start_timestamp = 0;
6369
double _duration_ms = 0;
6470
bool _independent = false;
6571
std::shared_ptr<ov::Data> _data;
72+
double _timebase_seconds = 0.0;
6673
};
6774

6875
class FMP4Segment : public base::modules::Segment
6976
{
7077
public:
71-
FMP4Segment(uint64_t number, uint64_t target_duration)
78+
FMP4Segment(uint64_t number, uint64_t target_duration, double timebase_seconds)
7279
{
7380
_number = number;
81+
_timebase_seconds = timebase_seconds;
7482

7583
// For performance, reserve memory for 4Mbps * target_duration (sec)
7684
_data = std::make_shared<ov::Data>(((1000.0 * 1000.0 * 4.0)/8.0) * (static_cast<double>(target_duration) / 1000.0));
@@ -110,7 +118,7 @@ namespace bmff
110118
_start_timestamp = start_timestamp;
111119
}
112120

113-
_partials.emplace_back(std::make_shared<FMP4Partial>(partial_data, partial_count, start_timestamp, duration_ms, independent));
121+
_partials.emplace_back(std::make_shared<FMP4Partial>(partial_data, partial_count, start_timestamp, duration_ms, independent, _timebase_seconds));
114122
_last_partial_number = partial_count;
115123

116124
lock.unlock();
@@ -151,6 +159,11 @@ namespace bmff
151159
return _duration_ms;
152160
}
153161

162+
double GetTimebaseSeconds() const override
163+
{
164+
return _timebase_seconds;
165+
}
166+
154167
// Get partial segment Count
155168
uint64_t GetPartialCount() const
156169
{
@@ -213,5 +226,7 @@ namespace bmff
213226
std::shared_ptr<ov::Data> _data;
214227

215228
std::vector<std::shared_ptr<Marker>> _markers;
229+
230+
double _timebase_seconds = 0.0;
216231
};
217232
}

src/projects/modules/containers/mpegts/mpegts_packager.cpp

Lines changed: 33 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ namespace mpegts
5050
return true;
5151
}
5252

53-
uint64_t Packager::GetNextSegmentId()
53+
int64_t Packager::GetNextSegmentId()
5454
{
5555
return _last_segment_id ++;
5656
}
@@ -134,7 +134,7 @@ namespace mpegts
134134
CreateSegmentIfReady(true);
135135
}
136136

137-
std::shared_ptr<Segment> Packager::GetSegment(uint64_t segment_id) const
137+
std::shared_ptr<base::modules::Segment> Packager::GetSegment(int64_t segment_id) const
138138
{
139139
{
140140
std::shared_lock<std::shared_mutex> lock(_segments_guard);
@@ -166,7 +166,35 @@ namespace mpegts
166166
return nullptr;
167167
}
168168

169-
std::shared_ptr<const ov::Data> Packager::GetSegmentData(uint64_t segment_id) const
169+
std::shared_ptr<base::modules::Segment> Packager::GetLastSegment() const
170+
{
171+
std::shared_lock<std::shared_mutex> lock(_segments_guard);
172+
if (_segments.empty())
173+
{
174+
return nullptr;
175+
}
176+
177+
return _segments.rbegin()->second;
178+
}
179+
180+
uint64_t Packager::GetSegmentCount() const
181+
{
182+
std::shared_lock<std::shared_mutex> lock(_segments_guard);
183+
return static_cast<uint64_t>(_segments.size());
184+
}
185+
186+
int64_t Packager::GetLastSegmentNumber() const
187+
{
188+
std::shared_lock<std::shared_mutex> lock(_segments_guard);
189+
if (_segments.empty())
190+
{
191+
return -1;
192+
}
193+
194+
return _segments.rbegin()->first;
195+
}
196+
197+
std::shared_ptr<const ov::Data> Packager::GetSegmentData(int64_t segment_id) const
170198
{
171199
auto segment = GetSegment(segment_id);
172200
if (segment == nullptr)
@@ -676,8 +704,8 @@ namespace mpegts
676704
return ov::String::FormatString("%s/%s/%s", _config.dvr_storage_path.CStr(), _config.stream_id_meta.CStr(), _packager_id.CStr());
677705
}
678706

679-
ov::String Packager::GetSegmentFilePath(uint64_t segment_id) const
707+
ov::String Packager::GetSegmentFilePath(int64_t segment_id) const
680708
{
681-
return ov::String::FormatString("%s/segment_%u_hls.ts", GetDvrStoragePath().CStr(), segment_id);
709+
return ov::String::FormatString("%s/segment_%" PRId64 "_hls.ts", GetDvrStoragePath().CStr(), segment_id);
682710
}
683711
}

0 commit comments

Comments
 (0)