mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-15 22:35:43 +00:00
Bug 1400674 - fix the algorithm of filling audio gaps with silence. r=jya
MozReview-Commit-ID: Hjsboq6PdlN --HG-- extra : rebase_source : b92dbbe184563b71bb9cfc541a310ae60d41d68d
This commit is contained in:
parent
f585fef0f1
commit
ee83cd683f
@ -424,28 +424,21 @@ AudioSink::NotifyAudioNeeded()
|
|||||||
missingFrames = std::min<int64_t>(INT32_MAX, missingFrames.value());
|
missingFrames = std::min<int64_t>(INT32_MAX, missingFrames.value());
|
||||||
mFramesParsed += missingFrames.value();
|
mFramesParsed += missingFrames.value();
|
||||||
|
|
||||||
// We need to calculate how many frames are missing at the output rate.
|
RefPtr<AudioData> silenceData;
|
||||||
missingFrames =
|
AlignedAudioBuffer silenceBuffer(missingFrames.value() * data->mChannels);
|
||||||
SaferMultDiv(missingFrames.value(), mOutputRate, data->mRate);
|
if (!silenceBuffer) {
|
||||||
if (!missingFrames.isValid()) {
|
NS_WARNING("OOM in AudioSink");
|
||||||
NS_WARNING("Int overflow in AudioSink");
|
mErrored = true;
|
||||||
mErrored = true;
|
return;
|
||||||
return;
|
}
|
||||||
}
|
if (mConverter->InputConfig() != mConverter->OutputConfig()) {
|
||||||
|
AlignedAudioBuffer convertedData =
|
||||||
// We need to insert silence, first use drained frames if any.
|
mConverter->Process(AudioSampleBuffer(Move(silenceBuffer))).Forget();
|
||||||
missingFrames -= DrainConverter(missingFrames.value());
|
silenceData = CreateAudioFromBuffer(Move(convertedData), data);
|
||||||
// Insert silence if still needed.
|
} else {
|
||||||
if (missingFrames.value()) {
|
silenceData = CreateAudioFromBuffer(Move(silenceBuffer), data);
|
||||||
AlignedAudioBuffer silenceData(missingFrames.value() * mOutputChannels);
|
|
||||||
if (!silenceData) {
|
|
||||||
NS_WARNING("OOM in AudioSink");
|
|
||||||
mErrored = true;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
RefPtr<AudioData> silence = CreateAudioFromBuffer(Move(silenceData), data);
|
|
||||||
PushProcessedAudio(silence);
|
|
||||||
}
|
}
|
||||||
|
PushProcessedAudio(silenceData);
|
||||||
}
|
}
|
||||||
|
|
||||||
mLastEndTime = data->GetEndTime();
|
mLastEndTime = data->GetEndTime();
|
||||||
@ -486,7 +479,7 @@ AudioSink::PushProcessedAudio(AudioData* aData)
|
|||||||
|
|
||||||
already_AddRefed<AudioData>
|
already_AddRefed<AudioData>
|
||||||
AudioSink::CreateAudioFromBuffer(AlignedAudioBuffer&& aBuffer,
|
AudioSink::CreateAudioFromBuffer(AlignedAudioBuffer&& aBuffer,
|
||||||
AudioData* aReference)
|
AudioData* aReference)
|
||||||
{
|
{
|
||||||
uint32_t frames = aBuffer.Length() / mOutputChannels;
|
uint32_t frames = aBuffer.Length() / mOutputChannels;
|
||||||
if (!frames) {
|
if (!frames) {
|
||||||
|
Loading…
Reference in New Issue
Block a user