Fix possible crash in audio speed change.

This commit is contained in:
John Preston 2023-03-12 07:24:53 +04:00
parent a4d8b78bc5
commit 0c165d1fb8
5 changed files with 18 additions and 2 deletions

View file

@ -816,8 +816,14 @@ bool FFMpegLoader::seekTo(crl::time positionMs) {
}
FFMpegLoader::ReadResult FFMpegLoader::readMore() {
if (_readTillEnd) {
return ReadError::EndOfFile;
}
const auto readResult = readFromReadyContext(_codecContext);
if (readResult != ReadError::Wait) {
if (readResult == ReadError::EndOfFile) {
_readTillEnd = true;
}
return readResult;
}

View file

@ -205,6 +205,7 @@ private:
AVCodecContext *_codecContext = nullptr;
AVPacket _packet;
bool _readTillEnd = false;
};

View file

@ -512,7 +512,8 @@ Mixer::Track::WithSpeed Loaders::rebufferOnSpeedChange(
} else if (result == AudioPlayerLoader::ReadError::Retry) {
continue;
}
Assert(result == AudioPlayerLoader::ReadError::RetryNotQueued);
Assert(result == AudioPlayerLoader::ReadError::RetryNotQueued
|| result == AudioPlayerLoader::ReadError::EndOfFile);
finished = true;
break;
}

View file

@ -41,6 +41,9 @@ auto ChildFFMpegLoader::readFromInitialFrame() -> ReadResult {
}
auto ChildFFMpegLoader::readMore() -> ReadResult {
if (_readTillEnd) {
return ReadError::EndOfFile;
}
const auto initialFrameResult = readFromInitialFrame();
if (initialFrameResult != ReadError::Wait) {
return initialFrameResult;
@ -53,7 +56,11 @@ auto ChildFFMpegLoader::readMore() -> ReadResult {
}
if (_queue.empty()) {
return _eofReached ? ReadError::EndOfFile : ReadError::Wait;
if (!_eofReached) {
return ReadError::Wait;
}
_readTillEnd = true;
return ReadError::EndOfFile;
}
auto packet = std::move(_queue.front());

View file

@ -55,6 +55,7 @@ private:
std::deque<FFmpeg::Packet> _queue;
bool _forceToBuffer = false;
bool _eofReached = false;
bool _readTillEnd = false;
};