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:
JW Wang 2017-10-13 17:24:24 +08:00
parent f585fef0f1
commit ee83cd683f

View File

@ -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) {