From 0c165d1fb8e372382a367a569f60a7f47408df65 Mon Sep 17 00:00:00 2001 From: John Preston Date: Sun, 12 Mar 2023 07:24:53 +0400 Subject: [PATCH] Fix possible crash in audio speed change. --- .../media/audio/media_audio_ffmpeg_loader.cpp | 6 ++++++ .../SourceFiles/media/audio/media_audio_ffmpeg_loader.h | 1 + Telegram/SourceFiles/media/audio/media_audio_loaders.cpp | 3 ++- .../media/audio/media_child_ffmpeg_loader.cpp | 9 ++++++++- .../SourceFiles/media/audio/media_child_ffmpeg_loader.h | 1 + 5 files changed, 18 insertions(+), 2 deletions(-) diff --git a/Telegram/SourceFiles/media/audio/media_audio_ffmpeg_loader.cpp b/Telegram/SourceFiles/media/audio/media_audio_ffmpeg_loader.cpp index 6e0ac9733..f9110b2f3 100644 --- a/Telegram/SourceFiles/media/audio/media_audio_ffmpeg_loader.cpp +++ b/Telegram/SourceFiles/media/audio/media_audio_ffmpeg_loader.cpp @@ -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; } diff --git a/Telegram/SourceFiles/media/audio/media_audio_ffmpeg_loader.h b/Telegram/SourceFiles/media/audio/media_audio_ffmpeg_loader.h index a9c1ee7c3..5c7d3df8d 100644 --- a/Telegram/SourceFiles/media/audio/media_audio_ffmpeg_loader.h +++ b/Telegram/SourceFiles/media/audio/media_audio_ffmpeg_loader.h @@ -205,6 +205,7 @@ private: AVCodecContext *_codecContext = nullptr; AVPacket _packet; + bool _readTillEnd = false; }; diff --git a/Telegram/SourceFiles/media/audio/media_audio_loaders.cpp b/Telegram/SourceFiles/media/audio/media_audio_loaders.cpp index 942823b9e..1f5dedd6e 100644 --- a/Telegram/SourceFiles/media/audio/media_audio_loaders.cpp +++ b/Telegram/SourceFiles/media/audio/media_audio_loaders.cpp @@ -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; } diff --git a/Telegram/SourceFiles/media/audio/media_child_ffmpeg_loader.cpp b/Telegram/SourceFiles/media/audio/media_child_ffmpeg_loader.cpp index 1fa8139b2..96efc7c93 100644 --- a/Telegram/SourceFiles/media/audio/media_child_ffmpeg_loader.cpp +++ b/Telegram/SourceFiles/media/audio/media_child_ffmpeg_loader.cpp @@ -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()); diff --git a/Telegram/SourceFiles/media/audio/media_child_ffmpeg_loader.h b/Telegram/SourceFiles/media/audio/media_child_ffmpeg_loader.h index 6b79e16b0..a8fa39320 100644 --- a/Telegram/SourceFiles/media/audio/media_child_ffmpeg_loader.h +++ b/Telegram/SourceFiles/media/audio/media_child_ffmpeg_loader.h @@ -55,6 +55,7 @@ private: std::deque _queue; bool _forceToBuffer = false; bool _eofReached = false; + bool _readTillEnd = false; };