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() { FFMpegLoader::ReadResult FFMpegLoader::readMore() {
if (_readTillEnd) {
return ReadError::EndOfFile;
}
const auto readResult = readFromReadyContext(_codecContext); const auto readResult = readFromReadyContext(_codecContext);
if (readResult != ReadError::Wait) { if (readResult != ReadError::Wait) {
if (readResult == ReadError::EndOfFile) {
_readTillEnd = true;
}
return readResult; return readResult;
} }

View file

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

View file

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

View file

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

View file

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