зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1207915 - Apply the fix of bug 1052206 to DecodedStream. r=roc.
This commit is contained in:
Родитель
2fc3af55bd
Коммит
41104e7fe4
|
@ -605,6 +605,9 @@ SendStreamAudio(DecodedStreamData* aStream, int64_t aStartTime,
|
|||
MediaData* aData, AudioSegment* aOutput,
|
||||
uint32_t aRate, double aVolume)
|
||||
{
|
||||
// The amount of audio frames that is used to fuzz rounding errors.
|
||||
static const int64_t AUDIO_FUZZ_FRAMES = 1;
|
||||
|
||||
MOZ_ASSERT(aData);
|
||||
AudioData* audio = aData->As<AudioData>();
|
||||
// This logic has to mimic AudioSink closely to make sure we write
|
||||
|
@ -616,11 +619,11 @@ SendStreamAudio(DecodedStreamData* aStream, int64_t aStartTime,
|
|||
if (!audioWrittenOffset.isValid() ||
|
||||
!frameOffset.isValid() ||
|
||||
// ignore packet that we've already processed
|
||||
frameOffset.value() + audio->mFrames <= audioWrittenOffset.value()) {
|
||||
frameOffset.value() < audioWrittenOffset.value()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (audioWrittenOffset.value() < frameOffset.value()) {
|
||||
if (audioWrittenOffset.value() + AUDIO_FUZZ_FRAMES < frameOffset.value()) {
|
||||
int64_t silentFrames = frameOffset.value() - audioWrittenOffset.value();
|
||||
// Write silence to catch up
|
||||
AudioSegment silence;
|
||||
|
@ -630,20 +633,17 @@ SendStreamAudio(DecodedStreamData* aStream, int64_t aStartTime,
|
|||
aOutput->AppendFrom(&silence);
|
||||
}
|
||||
|
||||
MOZ_ASSERT(audioWrittenOffset.value() >= frameOffset.value());
|
||||
|
||||
int64_t offset = audioWrittenOffset.value() - frameOffset.value();
|
||||
size_t framesToWrite = audio->mFrames - offset;
|
||||
|
||||
// Always write the whole sample without truncation to be consistent with
|
||||
// DecodedAudioDataSink::PlayFromAudioQueue()
|
||||
audio->EnsureAudioBuffer();
|
||||
nsRefPtr<SharedBuffer> buffer = audio->mAudioBuffer;
|
||||
AudioDataValue* bufferData = static_cast<AudioDataValue*>(buffer->Data());
|
||||
nsAutoTArray<const AudioDataValue*, 2> channels;
|
||||
for (uint32_t i = 0; i < audio->mChannels; ++i) {
|
||||
channels.AppendElement(bufferData + i * audio->mFrames + offset);
|
||||
channels.AppendElement(bufferData + i * audio->mFrames);
|
||||
}
|
||||
aOutput->AppendFrames(buffer.forget(), channels, framesToWrite);
|
||||
aStream->mAudioFramesWritten += framesToWrite;
|
||||
aOutput->AppendFrames(buffer.forget(), channels, audio->mFrames);
|
||||
aStream->mAudioFramesWritten += audio->mFrames;
|
||||
aOutput->ApplyVolume(aVolume);
|
||||
|
||||
aStream->mNextAudioTime = audio->GetEndTime();
|
||||
|
|
Загрузка…
Ссылка в новой задаче