diff --git a/packager/app/muxer_flags.cc b/packager/app/muxer_flags.cc
index 2bd3eeef974..be6c3520b47 100644
--- a/packager/app/muxer_flags.cc
+++ b/packager/app/muxer_flags.cc
@@ -78,4 +78,4 @@ ABSL_FLAG(int64_t,
start_segment_number,
1,
"Indicates the startNumber in DASH SegmentTemplate and HLS "
- "segment name.);
+ "segment name.");
\ No newline at end of file
diff --git a/packager/app/test/testdata/dash-start-number/bear-640x360-audio-init.mp4 b/packager/app/test/testdata/dash-start-number/bear-640x360-audio-init.mp4
index 2b143225fa3..3176a92d7ff 100644
Binary files a/packager/app/test/testdata/dash-start-number/bear-640x360-audio-init.mp4 and b/packager/app/test/testdata/dash-start-number/bear-640x360-audio-init.mp4 differ
diff --git a/packager/app/test/testdata/dash-start-number/bear-640x360-video-init.mp4 b/packager/app/test/testdata/dash-start-number/bear-640x360-video-init.mp4
index c9553addb55..874b16341f7 100644
Binary files a/packager/app/test/testdata/dash-start-number/bear-640x360-video-init.mp4 and b/packager/app/test/testdata/dash-start-number/bear-640x360-video-init.mp4 differ
diff --git a/packager/app/test/testdata/dash-start-number/output.mpd b/packager/app/test/testdata/dash-start-number/output.mpd
index 43dedbbbab2..81965d0568d 100644
--- a/packager/app/test/testdata/dash-start-number/output.mpd
+++ b/packager/app/test/testdata/dash-start-number/output.mpd
@@ -1,19 +1,9 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
@@ -24,5 +14,15 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/packager/media/base/text_muxer.cc b/packager/media/base/text_muxer.cc
index ffa9a43b619..e6e07dcab1c 100644
--- a/packager/media/base/text_muxer.cc
+++ b/packager/media/base/text_muxer.cc
@@ -87,7 +87,6 @@ Status TextMuxer::FinalizeSegment(size_t stream_id,
const std::string& segment_template = options().segment_template;
DCHECK(!segment_template.empty());
- const uint32_t index = segment_info.segment_index;
const int64_t start = segment_info.start_timestamp;
const int64_t duration = segment_info.duration;
const uint32_t segment_number = segment_info.segment_number;
diff --git a/packager/media/event/combined_muxer_listener.h b/packager/media/event/combined_muxer_listener.h
index 3c7c38e91ca..1f40e5c1e10 100644
--- a/packager/media/event/combined_muxer_listener.h
+++ b/packager/media/event/combined_muxer_listener.h
@@ -44,10 +44,10 @@ class CombinedMuxerListener : public MuxerListener {
void OnNewSegment(const std::string& file_name,
int64_t start_time,
int64_t duration,
- uint64_t segment_file_size) override;
+ uint64_t segment_file_size,
+ int64_t segment_number) override;
void OnCompletedSegment(int64_t duration,
- uint64_t segment_file_size,
- int64_t segment_number) override;
+ uint64_t segment_file_size) override;
void OnKeyFrame(int64_t timestamp,
uint64_t start_byte_offset,
uint64_t size) override;
diff --git a/packager/media/event/hls_notify_muxer_listener.cc b/packager/media/event/hls_notify_muxer_listener.cc
index 61231460963..3e619766519 100644
--- a/packager/media/event/hls_notify_muxer_listener.cc
+++ b/packager/media/event/hls_notify_muxer_listener.cc
@@ -249,7 +249,8 @@ void HlsNotifyMuxerListener::OnNewSegment(const std::string& file_name,
if (!media_info_->has_segment_template()) {
EventInfo event_info;
event_info.type = EventInfoType::kSegment;
- event_info.segment_info = {start_time, duration, segment_file_size};
+ event_info.segment_info = {start_time, duration, segment_file_size,
+ segment_number};
event_info_.push_back(event_info);
} else {
// For multisegment, it always starts from the beginning of the file.
diff --git a/packager/media/event/mpd_notify_muxer_listener.cc b/packager/media/event/mpd_notify_muxer_listener.cc
index 2a73e78d74e..79b58d8cbfb 100644
--- a/packager/media/event/mpd_notify_muxer_listener.cc
+++ b/packager/media/event/mpd_notify_muxer_listener.cc
@@ -214,7 +214,7 @@ void MpdNotifyMuxerListener::OnNewSegment(const std::string& file_name,
EventInfo event_info;
event_info.type = EventInfoType::kSegment;
event_info.segment_info = {start_time, duration, segment_file_size,
- segment_number};
+ segment_number};
event_info_.push_back(event_info);
}
}
diff --git a/packager/media/event/mpd_notify_muxer_listener_unittest.cc b/packager/media/event/mpd_notify_muxer_listener_unittest.cc
index 924177a0448..841a581849d 100644
--- a/packager/media/event/mpd_notify_muxer_listener_unittest.cc
+++ b/packager/media/event/mpd_notify_muxer_listener_unittest.cc
@@ -437,29 +437,33 @@ TEST_F(MpdNotifyMuxerListenerTest, VodOnNewSegmentSegmentList) {
const int64_t kStartTime1 = 0;
const int64_t kDuration1 = 1000;
const uint64_t kSegmentFileSize1 = 29812u;
+ const int64_t kSegmentNumber1 = 1;
const int64_t kStartTime2 = 1001;
const int64_t kDuration2 = 3787;
const uint64_t kSegmentFileSize2 = 83743u;
+ const int64_t kSegmentNumber2 = 2;
EXPECT_CALL(*notifier_, NotifyNewContainer(_, _)).Times(0);
- EXPECT_CALL(*notifier_, NotifyNewSegment(_, _, _, _)).Times(0);
+ EXPECT_CALL(*notifier_, NotifyNewSegment(_, _, _, _, _)).Times(0);
listener_->OnMediaStart(muxer_options, *video_stream_info,
kDefaultReferenceTimeScale,
MuxerListener::kContainerMp4);
- listener_->OnNewSegment("", kStartTime1, kDuration1, kSegmentFileSize1);
+ listener_->OnNewSegment("", kStartTime1, kDuration1, kSegmentFileSize1,
+ kSegmentNumber1);
listener_->OnCueEvent(kStartTime2, "dummy cue data");
- listener_->OnNewSegment("", kStartTime2, kDuration2, kSegmentFileSize2);
+ listener_->OnNewSegment("", kStartTime2, kDuration2, kSegmentFileSize2,
+ kSegmentNumber2);
::testing::Mock::VerifyAndClearExpectations(notifier_.get());
InSequence s;
EXPECT_CALL(*notifier_, NotifyNewContainer(
ExpectMediaInfoEq(kExpectedDefaultMediaInfoSubsegmentRange), _))
.WillOnce(Return(true));
- EXPECT_CALL(*notifier_,
- NotifyNewSegment(_, kStartTime1, kDuration1, kSegmentFileSize1));
+ EXPECT_CALL(*notifier_, NotifyNewSegment(_, kStartTime1, kDuration1,
+ kSegmentFileSize1, kSegmentNumber1));
EXPECT_CALL(*notifier_, NotifyCueEvent(_, kStartTime2));
- EXPECT_CALL(*notifier_,
- NotifyNewSegment(_, kStartTime2, kDuration2, kSegmentFileSize2));
+ EXPECT_CALL(*notifier_, NotifyNewSegment(_, kStartTime2, kDuration2,
+ kSegmentFileSize2, kSegmentNumber2));
EXPECT_CALL(*notifier_, Flush());
FireOnMediaEndWithParams(GetDefaultOnMediaEndParams());
}
@@ -552,17 +556,20 @@ TEST_F(MpdNotifyMuxerListenerTest, VodMultipleFilesSegmentList) {
const int64_t kStartTime1 = 0;
const int64_t kDuration1 = 1000;
const uint64_t kSegmentFileSize1 = 29812u;
+ const int64_t kSegmentNumber1 = 1;
const int64_t kStartTime2 = 1001;
const int64_t kDuration2 = 3787;
const uint64_t kSegmentFileSize2 = 83743u;
+ const int64_t kSegmentNumber2 = 2;
// Expectation for first file before OnMediaEnd.
EXPECT_CALL(*notifier_, NotifyNewContainer(_, _)).Times(0);
- EXPECT_CALL(*notifier_, NotifyNewSegment(_, _, _, _)).Times(0);
+ EXPECT_CALL(*notifier_, NotifyNewSegment(_, _, _, _, _)).Times(0);
listener_->OnMediaStart(muxer_options1, *video_stream_info,
kDefaultReferenceTimeScale,
MuxerListener::kContainerMp4);
- listener_->OnNewSegment("", kStartTime1, kDuration1, kSegmentFileSize1);
+ listener_->OnNewSegment("", kStartTime1, kDuration1, kSegmentFileSize1,
+ kSegmentNumber1);
listener_->OnCueEvent(kStartTime2, "dummy cue data");
::testing::Mock::VerifyAndClearExpectations(notifier_.get());
@@ -571,8 +578,8 @@ TEST_F(MpdNotifyMuxerListenerTest, VodMultipleFilesSegmentList) {
EXPECT_CALL(*notifier_,
NotifyNewContainer(EqualsProto(expected_media_info1), _))
.WillOnce(Return(true));
- EXPECT_CALL(*notifier_,
- NotifyNewSegment(_, kStartTime1, kDuration1, kSegmentFileSize1));
+ EXPECT_CALL(*notifier_, NotifyNewSegment(_, kStartTime1, kDuration1,
+ kSegmentFileSize1, kSegmentNumber1));
EXPECT_CALL(*notifier_, NotifyCueEvent(_, kStartTime2));
EXPECT_CALL(*notifier_, Flush());
FireOnMediaEndWithParams(GetDefaultOnMediaEndParams());
@@ -581,13 +588,14 @@ TEST_F(MpdNotifyMuxerListenerTest, VodMultipleFilesSegmentList) {
listener_->OnMediaStart(muxer_options2, *video_stream_info,
kDefaultReferenceTimeScale,
MuxerListener::kContainerMp4);
- listener_->OnNewSegment("", kStartTime2, kDuration2, kSegmentFileSize2);
+ listener_->OnNewSegment("", kStartTime2, kDuration2, kSegmentFileSize2,
+ kSegmentNumber2);
// Expectation for second file OnMediaEnd.
EXPECT_CALL(*notifier_,
NotifyMediaInfoUpdate(_, EqualsProto(expected_media_info2)));
- EXPECT_CALL(*notifier_,
- NotifyNewSegment(_, kStartTime2, kDuration2, kSegmentFileSize2));
+ EXPECT_CALL(*notifier_, NotifyNewSegment(_, kStartTime2, kDuration2,
+ kSegmentFileSize2, kSegmentNumber2));
EXPECT_CALL(*notifier_, Flush());
FireOnMediaEndWithParams(GetDefaultOnMediaEndParams());
}
@@ -621,6 +629,8 @@ TEST_F(MpdNotifyMuxerListenerTest, LowLatencyDash) {
const uint64_t kDuration = 1000u;
const uint64_t kSegmentSize1 = 29812u;
const uint64_t kSegmentSize2 = 30128u;
+ const int64_t kSegmentNumber1 = 1;
+ const int64_t kSegmentNumber2 = 2;
EXPECT_CALL(*notifier_,
NotifyNewContainer(ExpectMediaInfoEq(kExpectedMediaInfo), _))
@@ -630,11 +640,11 @@ TEST_F(MpdNotifyMuxerListenerTest, LowLatencyDash) {
EXPECT_CALL(*notifier_, NotifyAvailabilityTimeOffset(_))
.WillOnce(Return(true));
EXPECT_CALL(*notifier_, NotifySegmentDuration(_)).WillOnce(Return(true));
- EXPECT_CALL(*notifier_,
- NotifyNewSegment(_, kStartTime1, kDuration, kSegmentSize1));
+ EXPECT_CALL(*notifier_, NotifyNewSegment(_, kStartTime1, kDuration,
+ kSegmentSize1, kSegmentNumber1));
EXPECT_CALL(*notifier_, NotifyCueEvent(_, kStartTime2));
- EXPECT_CALL(*notifier_,
- NotifyNewSegment(_, kStartTime2, kDuration, kSegmentSize2));
+ EXPECT_CALL(*notifier_, NotifyNewSegment(_, kStartTime2, kDuration,
+ kSegmentSize2, kSegmentNumber2));
EXPECT_CALL(*notifier_, Flush()).Times(2);
listener_->OnMediaStart(muxer_options, *video_stream_info,
@@ -643,9 +653,11 @@ TEST_F(MpdNotifyMuxerListenerTest, LowLatencyDash) {
listener_->OnSampleDurationReady(kDuration);
listener_->OnAvailabilityOffsetReady();
listener_->OnSegmentDurationReady();
- listener_->OnNewSegment("", kStartTime1, kDuration, kSegmentSize1);
+ listener_->OnNewSegment("", kStartTime1, kDuration, kSegmentSize1,
+ kSegmentNumber1);
listener_->OnCueEvent(kStartTime2, "dummy cue data");
- listener_->OnNewSegment("", kStartTime2, kDuration, kSegmentSize2);
+ listener_->OnNewSegment("", kStartTime2, kDuration, kSegmentSize2,
+ kSegmentNumber2);
::testing::Mock::VerifyAndClearExpectations(notifier_.get());
EXPECT_CALL(*notifier_, Flush()).Times(0);
diff --git a/packager/media/formats/mp2t/ts_muxer.h b/packager/media/formats/mp2t/ts_muxer.h
index d184c52587c..3a04efdbce8 100644
--- a/packager/media/formats/mp2t/ts_muxer.h
+++ b/packager/media/formats/mp2t/ts_muxer.h
@@ -41,9 +41,6 @@ class TsMuxer : public Muxer {
int64_t sample_durations_[2] = {0, 0};
size_t num_samples_ = 0;
- // Used in multi-segment mode for segment template.
- uint64_t segment_number_ = 0;
-
// Used in single segment mode.
std::unique_ptr output_file_;
diff --git a/packager/media/formats/mp2t/ts_segmenter_unittest.cc b/packager/media/formats/mp2t/ts_segmenter_unittest.cc
index 568452c2ad6..745acca9757 100644
--- a/packager/media/formats/mp2t/ts_segmenter_unittest.cc
+++ b/packager/media/formats/mp2t/ts_segmenter_unittest.cc
@@ -196,7 +196,6 @@ TEST_F(TsSegmenterTest, PassedSegmentDuration) {
TsSegmenter segmenter(options, &mock_listener);
const int32_t kFirstPts = 1000;
- const int64_t kSegmentNumber = 1;
EXPECT_CALL(*mock_pes_packet_generator_, Initialize(_))
.WillOnce(Return(true));
@@ -209,11 +208,6 @@ TEST_F(TsSegmenterTest, PassedSegmentDuration) {
// Doesn't really matter how long this is.
sample2->set_duration(kInputTimescale * 7);
- EXPECT_CALL(mock_listener,
- OnNewSegment("memory://file1.ts",
- kFirstPts * kTimeScale / kInputTimescale,
- kTimeScale * 11, _, _));
-
Sequence writer_sequence;
EXPECT_CALL(*mock_ts_writer_, NewSegment(_))
.InSequence(writer_sequence)
@@ -265,8 +259,7 @@ TEST_F(TsSegmenterTest, PassedSegmentDuration) {
EXPECT_OK(segmenter.Initialize(*stream_info));
segmenter.InjectTsWriterForTesting(std::move(mock_ts_writer_));
EXPECT_OK(segmenter.AddSample(*sample1));
- EXPECT_OK(segmenter.FinalizeSegment(kFirstPts, sample1->duration(),
- kSegmentNumber));
+ EXPECT_OK(segmenter.FinalizeSegment(kFirstPts, sample1->duration()));
EXPECT_OK(segmenter.AddSample(*sample2));
}
@@ -310,8 +303,6 @@ TEST_F(TsSegmenterTest, FinalizeSegment) {
options.segment_template = "file$Number$.ts";
TsSegmenter segmenter(options, nullptr);
- const int64_t kSegmentNumber = 1;
-
EXPECT_CALL(*mock_pes_packet_generator_, Initialize(_))
.WillOnce(Return(true));
@@ -325,8 +316,7 @@ TEST_F(TsSegmenterTest, FinalizeSegment) {
EXPECT_OK(segmenter.Initialize(*stream_info));
segmenter.InjectTsWriterForTesting(std::move(mock_ts_writer_));
- EXPECT_OK(segmenter.FinalizeSegment(0, 100 /* arbitrary duration*/,
- kSegmentNumber));
+ EXPECT_OK(segmenter.FinalizeSegment(0, 100 /* arbitrary duration*/));
}
TEST_F(TsSegmenterTest, EncryptedSample) {
@@ -350,11 +340,11 @@ TEST_F(TsSegmenterTest, EncryptedSample) {
ON_CALL(*mock_pes_packet_generator_, Flush()).WillByDefault(Return(true));
const uint8_t kAnyData[] = {
- 0x01, 0x0F, 0x3C,
+ 0x01,
+ 0x0F,
+ 0x3C,
};
- const int64_t kSegmentNumber = 1;
-
std::shared_ptr sample1 =
MediaSample::CopyFrom(kAnyData, std::size(kAnyData), kIsKeyFrame);
sample1->set_duration(kTimeScale * 2);
@@ -399,8 +389,6 @@ TEST_F(TsSegmenterTest, EncryptedSample) {
.InSequence(pes_packet_sequence)
.WillOnce(Return(new PesPacket()));
- EXPECT_CALL(mock_listener, OnNewSegment("memory://file1.ts", _, _, _, _));
-
MockTsWriter* mock_ts_writer_raw = mock_ts_writer_.get();
segmenter.InjectPesPacketGeneratorForTesting(
@@ -409,7 +397,7 @@ TEST_F(TsSegmenterTest, EncryptedSample) {
EXPECT_OK(segmenter.Initialize(*stream_info));
segmenter.InjectTsWriterForTesting(std::move(mock_ts_writer_));
EXPECT_OK(segmenter.AddSample(*sample1));
- EXPECT_OK(segmenter.FinalizeSegment(1, sample1->duration(), kSegmentNumber));
+ EXPECT_OK(segmenter.FinalizeSegment(1, sample1->duration()));
// Signal encrypted if sample is encrypted.
EXPECT_CALL(*mock_ts_writer_raw, SignalEncrypted());
sample2->set_is_encrypted(true);
diff --git a/packager/media/formats/mp2t/ts_writer.cc b/packager/media/formats/mp2t/ts_writer.cc
index fa107697aa8..1aeb3b9bbba 100644
--- a/packager/media/formats/mp2t/ts_writer.cc
+++ b/packager/media/formats/mp2t/ts_writer.cc
@@ -189,7 +189,6 @@ void TsWriter::SignalEncrypted() {
bool TsWriter::AddPesPacket(std::unique_ptr pes_packet,
BufferWriter* buffer) {
-
if (!WritePesToBuffer(*pes_packet, &elementary_stream_continuity_counter_,
buffer)) {
LOG(ERROR) << "Failed to write pes to buffer.";
diff --git a/packager/media/formats/mp4/low_latency_segment_segmenter.cc b/packager/media/formats/mp4/low_latency_segment_segmenter.cc
index cbb1449acc3..22476461dc6 100644
--- a/packager/media/formats/mp4/low_latency_segment_segmenter.cc
+++ b/packager/media/formats/mp4/low_latency_segment_segmenter.cc
@@ -71,13 +71,13 @@ Status LowLatencySegmentSegmenter::DoFinalize() {
return Status::OK;
}
-Status LowLatencySegmentSegmenter::DoFinalizeSegment() {
+Status LowLatencySegmentSegmenter::DoFinalizeSegment(int64_t segment_number) {
return FinalizeSegment();
}
-Status LowLatencySegmentSegmenter::DoFinalizeChunk() {
+Status LowLatencySegmentSegmenter::DoFinalizeChunk(int64_t segment_number) {
if (is_initial_chunk_in_seg_) {
- return WriteInitialChunk();
+ return WriteInitialChunk(segment_number);
}
return WriteChunk();
}
@@ -98,7 +98,7 @@ Status LowLatencySegmentSegmenter::WriteInitSegment() {
return buffer->WriteToFile(file.get());
}
-Status LowLatencySegmentSegmenter::WriteInitialChunk() {
+Status LowLatencySegmentSegmenter::WriteInitialChunk(int64_t segment_number) {
DCHECK(sidx());
DCHECK(fragment_buffer());
DCHECK(styp_);
@@ -161,9 +161,9 @@ Status LowLatencySegmentSegmenter::WriteInitialChunk() {
}
// Add the current segment in the manifest.
// Following chunks will be appended to the open segment file.
- muxer_listener()->OnNewSegment(file_name_,
- sidx()->earliest_presentation_time,
- segment_duration, segment_size_);
+ muxer_listener()->OnNewSegment(
+ file_name_, sidx()->earliest_presentation_time, segment_duration,
+ segment_size_, segment_number);
is_initial_chunk_in_seg_ = false;
}
diff --git a/packager/media/formats/mp4/low_latency_segment_segmenter.h b/packager/media/formats/mp4/low_latency_segment_segmenter.h
index 0db73df8b03..5f2e577ddad 100644
--- a/packager/media/formats/mp4/low_latency_segment_segmenter.h
+++ b/packager/media/formats/mp4/low_latency_segment_segmenter.h
@@ -44,13 +44,13 @@ class LowLatencySegmentSegmenter : public Segmenter {
// Segmenter implementation overrides.
Status DoInitialize() override;
Status DoFinalize() override;
- Status DoFinalizeSegment() override;
- Status DoFinalizeChunk() override;
+ Status DoFinalizeSegment(int64_t segment_number) override;
+ Status DoFinalizeChunk(int64_t segment_number) override;
// Write segment to file.
Status WriteInitSegment();
Status WriteChunk();
- Status WriteInitialChunk();
+ Status WriteInitialChunk(int64_t segment_number);
Status FinalizeSegment();
uint64_t GetSegmentDuration();
diff --git a/packager/media/formats/mp4/segmenter.cc b/packager/media/formats/mp4/segmenter.cc
index fae3d804470..a9b180a258e 100644
--- a/packager/media/formats/mp4/segmenter.cc
+++ b/packager/media/formats/mp4/segmenter.cc
@@ -234,7 +234,7 @@ Status Segmenter::FinalizeSegment(size_t stream_id,
if (segment_info.is_chunk) {
// Finalize the completed chunk for the LL-DASH case.
- status = DoFinalizeChunk();
+ status = DoFinalizeChunk(segment_info.segment_number);
if (!status.ok())
return status;
}
diff --git a/packager/media/formats/mp4/segmenter.h b/packager/media/formats/mp4/segmenter.h
index 1fb07743cb5..51e659b35cb 100644
--- a/packager/media/formats/mp4/segmenter.h
+++ b/packager/media/formats/mp4/segmenter.h
@@ -128,8 +128,7 @@ class Segmenter {
virtual Status DoInitialize() = 0;
virtual Status DoFinalize() = 0;
virtual Status DoFinalizeSegment(int64_t segment_number) = 0;
-
- virtual Status DoFinalizeChunk() { return Status::OK; }
+ virtual Status DoFinalizeChunk(int64_t segment_number) { return Status::OK; }
uint32_t GetReferenceStreamId();
diff --git a/packager/media/formats/webm/multi_segment_segmenter_unittest.cc b/packager/media/formats/webm/multi_segment_segmenter_unittest.cc
index 5f6ad35dad4..33a7c12b243 100644
--- a/packager/media/formats/webm/multi_segment_segmenter_unittest.cc
+++ b/packager/media/formats/webm/multi_segment_segmenter_unittest.cc
@@ -16,8 +16,8 @@ namespace media {
namespace {
const int32_t kTimeScale = 1000000;
-const int64_t kDuration = 1000000;c
-onst int64_t kSegmentNumber1 = 1;
+const int64_t kDuration = 1000000;
+const int64_t kSegmentNumber1 = 1;
const int64_t kSegmentNumber2 = 2;
const bool kSubsegment = true;
diff --git a/packager/media/formats/webm/single_segment_segmenter.cc b/packager/media/formats/webm/single_segment_segmenter.cc
index 9f9f95c4fa7..b688c102bae 100644
--- a/packager/media/formats/webm/single_segment_segmenter.cc
+++ b/packager/media/formats/webm/single_segment_segmenter.cc
@@ -25,9 +25,8 @@ Status SingleSegmentSegmenter::FinalizeSegment(int64_t start_timestamp,
int64_t duration_timestamp,
bool is_subsegment,
int64_t segment_number) {
- Status status = Segmenter::FinalizeSegment(start_timestamp,
- duration_timestamp, is_subsegment,
- segment_index);
+ Status status = Segmenter::FinalizeSegment(
+ start_timestamp, duration_timestamp, is_subsegment, segment_number);
if (!status.ok())
return status;
// No-op for subsegment in single segment mode.
diff --git a/packager/mpd/base/mock_mpd_builder.h b/packager/mpd/base/mock_mpd_builder.h
index 92bf2f9566b..0abc5bc3805 100644
--- a/packager/mpd/base/mock_mpd_builder.h
+++ b/packager/mpd/base/mock_mpd_builder.h
@@ -75,8 +75,11 @@ class MockRepresentation : public Representation {
void(const ContentProtectionElement& element));
MOCK_METHOD2(UpdateContentProtectionPssh,
void(const std::string& drm_uuid, const std::string& pssh));
- MOCK_METHOD3(AddNewSegment,
- void(int64_t start_time, int64_t duration, uint64_t size, int64_t segment_number));
+ MOCK_METHOD4(AddNewSegment,
+ void(int64_t start_time,
+ int64_t duration,
+ uint64_t size,
+ int64_t segment_number));
MOCK_METHOD0(SetSegmentDuration, void());
MOCK_METHOD0(SetAvailabilityTimeOffset, void());
MOCK_METHOD1(SetSampleDuration, void(int32_t sample_duration));
diff --git a/packager/mpd/base/mock_mpd_notifier.h b/packager/mpd/base/mock_mpd_notifier.h
index 011226d894e..dcac1719842 100644
--- a/packager/mpd/base/mock_mpd_notifier.h
+++ b/packager/mpd/base/mock_mpd_notifier.h
@@ -25,7 +25,7 @@ class MockMpdNotifier : public MpdNotifier {
bool(const MediaInfo& media_info, uint32_t* container_id));
MOCK_METHOD2(NotifySampleDuration,
bool(uint32_t container_id, int32_t sample_duration));
- MOCK_METHOD4(NotifyNewSegment,
+ MOCK_METHOD5(NotifyNewSegment,
bool(uint32_t container_id,
int64_t start_time,
int64_t duration,
diff --git a/packager/mpd/base/representation.cc b/packager/mpd/base/representation.cc
index ac47338a5c9..bfd55c38d47 100644
--- a/packager/mpd/base/representation.cc
+++ b/packager/mpd/base/representation.cc
@@ -305,8 +305,7 @@ std::optional Representation::GetXml() {
if (HasLiveOnlyFields(media_info_) &&
!representation.AddLiveOnlyInfo(
media_info_, segment_infos_,
- mpd_options_.mpd_params.low_latency_dash_mode,
- )) {
+ mpd_options_.mpd_params.low_latency_dash_mode)) {
LOG(ERROR) << "Failed to add Live info.";
return std::nullopt;
}
diff --git a/packager/mpd/base/representation_unittest.cc b/packager/mpd/base/representation_unittest.cc
index 749102d1ae0..e04af21c128 100644
--- a/packager/mpd/base/representation_unittest.cc
+++ b/packager/mpd/base/representation_unittest.cc
@@ -474,7 +474,8 @@ class SegmentTemplateTest : public RepresentationTest {
// At this point, only the first chunk of the low latency segment has been
// written. The bandwidth will be updated once the segment is fully
// written and the segment duration and size are known.
- representation_->AddNewSegment(start_time, duration, size);
+ representation_->AddNewSegment(start_time, duration, size,
+ segment_number_++);
return;
}
diff --git a/packager/mpd/base/simple_mpd_notifier.cc b/packager/mpd/base/simple_mpd_notifier.cc
index 5c52c518e53..585ad024dcd 100644
--- a/packager/mpd/base/simple_mpd_notifier.cc
+++ b/packager/mpd/base/simple_mpd_notifier.cc
@@ -114,7 +114,7 @@ bool SimpleMpdNotifier::NotifyNewSegment(uint32_t container_id,
absl::MutexLock lock(&lock_);
auto it = representation_map_.find(container_id);
if (it == representation_map_.end()) {
- LOG(ERROR) <<<<< "Unexpected container_id: " << container_id;
+ LOG(ERROR) << "Unexpected container_id: " << container_id;
return false;
}
it->second->AddNewSegment(start_time, duration, size, segment_number);
diff --git a/packager/mpd/base/simple_mpd_notifier.h b/packager/mpd/base/simple_mpd_notifier.h
index 144d1bef944..49eefa3152d 100644
--- a/packager/mpd/base/simple_mpd_notifier.h
+++ b/packager/mpd/base/simple_mpd_notifier.h
@@ -44,11 +44,11 @@ class SimpleMpdNotifier : public MpdNotifier {
bool NotifyNewSegment(uint32_t container_id,
int64_t start_time,
int64_t duration,
- uint64_t size) override;
+ uint64_t size,
+ int64_t segment_number) override;
bool NotifyCompletedSegment(uint32_t container_id,
int64_t duration,
- uint64_t size,
- int64_t segment_number) override;
+ uint64_t size) override;
bool NotifyCueEvent(uint32_t container_id, int64_t timestamp) override;
bool NotifyEncryptionUpdate(uint32_t container_id,
const std::string& drm_uuid,
diff --git a/packager/mpd/base/xml/xml_node_unittest.cc b/packager/mpd/base/xml/xml_node_unittest.cc
index feb621ffb4f..20d8b2fb25e 100644
--- a/packager/mpd/base/xml/xml_node_unittest.cc
+++ b/packager/mpd/base/xml/xml_node_unittest.cc
@@ -752,11 +752,11 @@ TEST_F(LowLatencySegmentTest, LowLatencySegmentTemplate) {
const bool kIsLowLatency = true;
std::list segment_infos = {
- {kStartNumber, kDuration, kRepeat},
+ {kStartNumber, kDuration, kRepeat, kStartNumber},
};
RepresentationXmlNode representation;
ASSERT_TRUE(representation.AddLiveOnlyInfo(media_info_, segment_infos,
- kStartNumber, kIsLowLatency));
+ kIsLowLatency));
EXPECT_THAT(
representation,
XmlNodeEqual(""