зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1749372 - Combine chunks in AppendAndConsumeChunk if possible r=pehrsons
Differential Revision: https://phabricator.services.mozilla.com/D135542
This commit is contained in:
Родитель
624a3640bf
Коммит
66498068fe
|
@ -445,6 +445,13 @@ class AudioSegment : public MediaSegmentBase<AudioSegment, AudioChunk> {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!mChunks.IsEmpty() &&
|
||||||
|
mChunks.LastElement().CanCombineWithFollowing(aChunk)) {
|
||||||
|
mChunks.LastElement().mDuration += aChunk.GetDuration();
|
||||||
|
mDuration += aChunk.GetDuration();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
chunk = AppendChunk(aChunk.mDuration);
|
chunk = AppendChunk(aChunk.mDuration);
|
||||||
}
|
}
|
||||||
void ApplyVolume(float aVolume);
|
void ApplyVolume(float aVolume);
|
||||||
|
|
|
@ -372,4 +372,73 @@ TEST(AudioSegment, AppendAndConsumeNonEmptyZeroDurationChunk)
|
||||||
EXPECT_FALSE(c.mBuffer->IsShared());
|
EXPECT_FALSE(c.mBuffer->IsShared());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(AudioSegment, CombineChunksInAppendAndConsumeChunk)
|
||||||
|
{
|
||||||
|
AudioChunk source;
|
||||||
|
fillChunk<float, 2>(&source, 10);
|
||||||
|
|
||||||
|
auto checkChunks = [&](const AudioSegment& aSegement,
|
||||||
|
const nsTArray<TrackTime>& aDurations) {
|
||||||
|
size_t i = 0;
|
||||||
|
for (AudioSegment::ConstChunkIterator iter(aSegement); !iter.IsEnded();
|
||||||
|
iter.Next()) {
|
||||||
|
EXPECT_EQ(iter->GetDuration(), aDurations[i++]);
|
||||||
|
}
|
||||||
|
EXPECT_EQ(i, aDurations.Length());
|
||||||
|
};
|
||||||
|
|
||||||
|
// The chunks can be merged if their duration are adjacent.
|
||||||
|
{
|
||||||
|
AudioChunk c1(source);
|
||||||
|
c1.SliceTo(2, 5);
|
||||||
|
|
||||||
|
AudioChunk c2(source);
|
||||||
|
c2.SliceTo(5, 9);
|
||||||
|
|
||||||
|
AudioSegment s;
|
||||||
|
s.AppendAndConsumeChunk(std::move(c1));
|
||||||
|
EXPECT_EQ(s.GetDuration(), 3);
|
||||||
|
|
||||||
|
s.AppendAndConsumeChunk(std::move(c2));
|
||||||
|
EXPECT_EQ(s.GetDuration(), 7);
|
||||||
|
|
||||||
|
checkChunks(s, {7});
|
||||||
|
}
|
||||||
|
// Otherwise, they cannot be merged.
|
||||||
|
{
|
||||||
|
// If durations of chunks are overlapped, they cannot be merged.
|
||||||
|
AudioChunk c1(source);
|
||||||
|
c1.SliceTo(2, 5);
|
||||||
|
|
||||||
|
AudioChunk c2(source);
|
||||||
|
c2.SliceTo(4, 9);
|
||||||
|
|
||||||
|
AudioSegment s;
|
||||||
|
s.AppendAndConsumeChunk(std::move(c1));
|
||||||
|
EXPECT_EQ(s.GetDuration(), 3);
|
||||||
|
|
||||||
|
s.AppendAndConsumeChunk(std::move(c2));
|
||||||
|
EXPECT_EQ(s.GetDuration(), 8);
|
||||||
|
|
||||||
|
checkChunks(s, {3, 5});
|
||||||
|
}
|
||||||
|
{
|
||||||
|
// If durations of chunks are discontinuous, they cannot be merged.
|
||||||
|
AudioChunk c1(source);
|
||||||
|
c1.SliceTo(2, 4);
|
||||||
|
|
||||||
|
AudioChunk c2(source);
|
||||||
|
c2.SliceTo(5, 9);
|
||||||
|
|
||||||
|
AudioSegment s;
|
||||||
|
s.AppendAndConsumeChunk(std::move(c1));
|
||||||
|
EXPECT_EQ(s.GetDuration(), 2);
|
||||||
|
|
||||||
|
s.AppendAndConsumeChunk(std::move(c2));
|
||||||
|
EXPECT_EQ(s.GetDuration(), 6);
|
||||||
|
|
||||||
|
checkChunks(s, {2, 4});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace audio_segment
|
} // namespace audio_segment
|
||||||
|
|
Загрузка…
Ссылка в новой задаче