summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArtem Dyomin <artem.dyomin@qt.io>2023-09-25 10:52:38 +0200
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2023-09-27 20:05:10 +0000
commit0d63f5344325d9c49af0a00d49dc94e8559fe1aa (patch)
treede3c297c7d04c6482f1820a6a00dac800a0c82e1
parentf094f638caa295fbaa9e45c9a9213cf1faf91916 (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.cpp21
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)