diff options
author | Artem Dyomin <artem.dyomin@qt.io> | 2023-09-25 10:52:38 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2023-09-27 20:05:10 +0000 |
commit | 0d63f5344325d9c49af0a00d49dc94e8559fe1aa (patch) | |
tree | de3c297c7d04c6482f1820a6a00dac800a0c82e1 | |
parent | f094f638caa295fbaa9e45c9a9213cf1faf91916 (diff) |
Fix demuxer seek errors reporting
* skip seeking for unseekable streams
* drop 0 position seeking error for streams with undefined duration.
Ffmpeg may report failure on seeking rtsp streams even though
the stream is seekable. Let's drop the error of initial seeking.
This might need improvements.
* Remove currently useless 'return' on seeking error.
This might need improvements as well in the future.
Change-Id: I859a9a27c9f7a057d0ec7e0b4c2e244159d9b7f9
Reviewed-by: Jøger Hansegård <joger.hansegard@qt.io>
Reviewed-by: Lars Knoll <lars@knoll.priv.no>
(cherry picked from commit 7b78abff4f617238f49f517881ec9683c30c8a0f)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
(cherry picked from commit 877d7574c9a59cbdacd382fccf53e4f781062f0a)
-rw-r--r-- | src/plugins/multimedia/ffmpeg/playbackengine/qffmpegdemuxer.cpp | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/src/plugins/multimedia/ffmpeg/playbackengine/qffmpegdemuxer.cpp b/src/plugins/multimedia/ffmpeg/playbackengine/qffmpegdemuxer.cpp index e45e413cb..0709c3629 100644 --- a/src/plugins/multimedia/ffmpeg/playbackengine/qffmpegdemuxer.cpp +++ b/src/plugins/multimedia/ffmpeg/playbackengine/qffmpegdemuxer.cpp @@ -66,6 +66,8 @@ void Demuxer::doNextStep() qCDebug(qLcDemuxer) << "Demuxer loops changed. Index:" << m_posWithOffset.offset.index << "Offset:" << m_posWithOffset.offset.pos; + + scheduleNextStep(false); } return; @@ -133,17 +135,22 @@ void Demuxer::ensureSeeked() if (std::exchange(m_seeked, true)) return; - const qint64 seekPos = m_posWithOffset.pos * AV_TIME_BASE / 1000000; - auto err = av_seek_frame(m_context, -1, seekPos, AVSEEK_FLAG_BACKWARD); + if ((m_context->ctx_flags & AVFMTCTX_UNSEEKABLE) == 0) { + const qint64 seekPos = m_posWithOffset.pos * AV_TIME_BASE / 1000000; + auto err = av_seek_frame(m_context, -1, seekPos, AVSEEK_FLAG_BACKWARD); - if (err < 0) { - qDebug() << err2str(err); - emit error(err, err2str(err)); - return; + if (err < 0) { + qCWarning(qLcDemuxer) << "Failed to seek, pos" << seekPos; + + // Drop an error of seeking to initial position of streams with undefined duration. + // This needs improvements. + if (seekPos != 0 || m_context->duration > 0) + emit error(QMediaPlayer::ResourceError, + QLatin1StringView("Failed to seek: ") + err2str(err)); + } } setAtEnd(false); - scheduleNextStep(); } Demuxer::RequestingSignal Demuxer::signalByTrackType(QPlatformMediaPlayer::TrackType trackType) |