Preserve early seek position and document playback lifecycle
This commit is contained in:
1 parent
e371cc4dd9
commit
71f5cc9c94
2 files changed
+52
-43
No files matched your search
@@ -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) {
|
||||
|
||||
Reference in new issue
Block a user