Skip to content

Commit 49f03f8

Browse files
committed
[DashTree] Allow generate segment beyond period boudaries
1 parent a0c5702 commit 49f03f8

File tree

2 files changed

+19
-10
lines changed

2 files changed

+19
-10
lines changed

src/parser/DASHTree.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1825,8 +1825,17 @@ void adaptive::CDashTree::GenerateTemplatedSegments(PLAYLIST::CSegmentTemplate&
18251825

18261826
const uint64_t timeEnd = wndEnd * segTimescale / 1000;
18271827

1828-
// Create segments within time window
1829-
while (time + segDuration <= timeEnd && segNumber <= segNumberEnd)
1828+
// Create segments within time window,
1829+
// a segment that begins within the period and partially
1830+
// extends beyond the period boundaries must still be generated
1831+
//! @todo: currently when a segment extends beyond the period boundaries
1832+
//! it will exist also on next period, this will cause duplicate playback of the content (you can see also twice downloads)
1833+
//! in theory this should be fixed in the sample reader, where the sample packets of a segment
1834+
//! (at the beginning or end) must be filtered based on the duration of the period.
1835+
//! In other words, finish playing a segment early by skipping the samples that fall outside the period,
1836+
//! while in the next period, start playing the segment from a sample with a specific PTS,
1837+
//! thus skipping part of the initial samples.
1838+
while (time < timeEnd && segNumber <= segNumberEnd)
18301839
{
18311840
CSegment seg;
18321841
seg.startPTS_ = time;

src/test/TestDASHTree.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ TEST_F(DASHTreeTest, CalculateCorrectSegmentNumbersFromSegmentTemplateWithOldPub
285285

286286
auto& segments = tree->m_periods[0]->GetAdaptationSets()[0]->GetRepresentations()[0]->Timeline();
287287

288-
EXPECT_EQ(segments.GetSize(), 30);
288+
EXPECT_EQ(segments.GetSize(), 31);
289289
EXPECT_EQ(segments.Get(0)->m_number, 603271);
290290
}
291291

@@ -712,16 +712,16 @@ TEST_F(DASHTreeTest, SegmentTemplateStartNumber)
712712

713713
// Verify segments
714714
auto& rep1Timeline = adpSets[0]->GetRepresentations()[0]->Timeline();
715-
EXPECT_EQ(rep1Timeline.GetSize(), 143);
715+
EXPECT_EQ(rep1Timeline.GetSize(), 144);
716716

717717
EXPECT_EQ(rep1Timeline.Get(0)->startPTS_, 0);
718718
EXPECT_EQ(rep1Timeline.Get(0)->m_number, 0);
719719

720720
EXPECT_EQ(rep1Timeline.Get(1)->startPTS_, 48000);
721721
EXPECT_EQ(rep1Timeline.Get(1)->m_number, 1);
722722

723-
EXPECT_EQ(rep1Timeline.Get(142)->startPTS_, 6816000);
724-
EXPECT_EQ(rep1Timeline.Get(142)->m_number, 142);
723+
EXPECT_EQ(rep1Timeline.Get(143)->startPTS_, 6864000);
724+
EXPECT_EQ(rep1Timeline.Get(143)->m_number, 143);
725725
}
726726

727727
TEST_F(DASHTreeTest, TSBMiddlePeriods)
@@ -743,9 +743,9 @@ TEST_F(DASHTreeTest, TSBMiddlePeriods)
743743
auto& tlPeriod2 =
744744
tree->m_periods[1]->GetAdaptationSets()[0]->GetRepresentations()[0]->Timeline();
745745

746-
EXPECT_EQ(tlPeriod2.GetSize(), 2);
746+
EXPECT_EQ(tlPeriod2.GetSize(), 3);
747747
EXPECT_EQ(tlPeriod2.GetFront()->m_number, 856065420);
748-
EXPECT_EQ(tlPeriod2.GetBack()->m_number, 856065421);
748+
EXPECT_EQ(tlPeriod2.GetBack()->m_number, 856065422);
749749
}
750750

751751
TEST_F(DASHTreeTest, TSBMiddlePeriodsPastNowTime)
@@ -778,9 +778,9 @@ TEST_F(DASHTreeTest, TSBAvailabilityStartTime)
778778
auto& tl =
779779
tree->m_periods[0]->GetAdaptationSets()[0]->GetRepresentations()[0]->Timeline();
780780

781-
EXPECT_EQ(tl.GetSize(), 1200);
781+
EXPECT_EQ(tl.GetSize(), 1201);
782782
EXPECT_EQ(tl.GetFront()->m_number, 129069);
783-
EXPECT_EQ(tl.GetBack()->m_number, 130268);
783+
EXPECT_EQ(tl.GetBack()->m_number, 130269);
784784
}
785785

786786
TEST_F(DASHTreeTest, TSBUTCTimingDirect1)

0 commit comments

Comments
 (0)