Preserve early seek position and document playback lifecycle

This commit is contained in:
evgeny committed 2026-10-28 00:58:59 +01:00
1 parent e371cc4dd9
commit 71f5cc9c94
2 files changed
+52 -43

No files matched your search

+14 -5
View File
@@ -349,8 +349,10 @@ void VideoPlayerEngine::play() {
m_paused.storeRelaxed(0);
if (m_audioClock) SoundManager::instance()->resumePcm(m_audioPlayback);
if (!m_audioClock) { m_elapsedBaseMs = m_positionMs; m_elapsed.restart(); }
setState(Playing);
m_presentTimer.start();
DEBUG_DEBUG(DEBUG_CATEGORY_VIDEO, "VideoEngine: resume epoch=%d position=%lldms audio_clock=%d",
m_epoch.loadRelaxed(), (long long)m_positionMs, m_audioClock);
setState(Playing);
}
void VideoPlayerEngine::pause() {
@@ -358,8 +360,10 @@ void VideoPlayerEngine::pause() {
m_positionMs = clockMs();
m_paused.storeRelaxed(1);
if (m_audioClock) SoundManager::instance()->pausePcm(m_audioPlayback);
setState(Paused);
m_presentTimer.stop();
DEBUG_DEBUG(DEBUG_CATEGORY_VIDEO, "VideoEngine: pause epoch=%d position=%lldms audio_clock=%d",
m_epoch.loadRelaxed(), (long long)m_positionMs, m_audioClock);
setState(Paused);
}
void VideoPlayerEngine::togglePlayPause() {
@@ -396,6 +400,9 @@ void VideoPlayerEngine::seekMs(qint64 ms) {
}
void VideoPlayerEngine::stop() {
if (m_worker) DEBUG_DEBUG(DEBUG_CATEGORY_VIDEO, "VideoEngine: stop generation=%llu state=%d position=%lldms pending=%zu PCM=%llu",
(unsigned long long)m_openGeneration, (int)m_state, (long long)m_positionMs, m_pending.size(),
(unsigned long long)m_audioPlayback);
++m_openGeneration;
m_abort.storeRelaxed(1);
m_decodeEof = false; m_videoEndMs = 0; m_audioClock = false; m_audioFrames = 0; m_drainReportAt = 0;
@@ -454,12 +461,14 @@ void VideoPlayerEngine::onWorkerOpened(int width, int height, qint64 durationMs,
m_videoHeight = height;
m_durationMs = durationMs;
m_hasAudio = hasAudio;
const uint64_t generation = m_openGeneration; QPointer<VideoPlayerEngine> guard(this);
emit opened(width, height, durationMs, hasAudio);
if (!guard || generation != m_openGeneration) return;
if (!hasAudio) {
m_elapsedBaseMs = 0;
m_elapsedBaseMs = m_positionMs; // Обработчик opened может уже запросить seek.
m_elapsed.restart();
setState(Playing);
m_presentTimer.start();
setState(Playing);
}
}
@@ -495,7 +504,7 @@ void VideoPlayerEngine::onAudioDecoded(std::shared_ptr<std::vector<int16_t>> pcm
}
m_elapsedBaseMs = m_positionMs;
m_elapsed.restart();
if (!paused) { setState(Playing); m_presentTimer.start(); }
if (!paused) { m_presentTimer.start(); setState(Playing); }
}
void VideoPlayerEngine::onFrameDecoded(const QImage& image, qint64 ptsMs, qint64 endMs, int epoch) {