diff options
author | Artem Dyomin <artem.dyomin@qt.io> | 2023-08-11 07:55:03 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2023-08-11 11:49:53 +0000 |
commit | a48ea75b5174003d07f7f8e8020230c3b068e421 (patch) | |
tree | 41fbacbc350a03f678b0e3a5e6363580a60a50bc | |
parent | 65d96c828b7d08bbc011cb1b466edc21cc331b31 (diff) |
Prevent possible ffmpeg crash when media header writing failed
We shouldn't write a trailer if the header has got failed.
Change-Id: I6ba7469196682123a3191963351a236fd9abdbb5
Reviewed-by: Artem Dyomin <artem.dyomin@qt.io>
Reviewed-by: Jøger Hansegård <joger.hansegard@qt.io>
(cherry picked from commit ed5e09af3f99ef252f17955bf94b2df4c529124c)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | src/plugins/multimedia/ffmpeg/qffmpegencoder.cpp | 15 | ||||
-rw-r--r-- | src/plugins/multimedia/ffmpeg/qffmpegencoder_p.h | 2 |
2 files changed, 13 insertions, 4 deletions
diff --git a/src/plugins/multimedia/ffmpeg/qffmpegencoder.cpp b/src/plugins/multimedia/ffmpeg/qffmpegencoder.cpp index 726ea8694..331f9c4fd 100644 --- a/src/plugins/multimedia/ffmpeg/qffmpegencoder.cpp +++ b/src/plugins/multimedia/ffmpeg/qffmpegencoder.cpp @@ -115,6 +115,8 @@ void Encoder::start() formatContext->metadata = QFFmpegMetaData::toAVMetaData(metaData); + Q_ASSERT(!isHeaderWritten); + int res = avformat_write_header(formatContext, nullptr); if (res < 0) { qWarning() << "could not write header, error:" << res << err2str(res); @@ -122,6 +124,8 @@ void Encoder::start() return; } + isHeaderWritten = true; + qCDebug(qLcFFmpegEncoder) << "stream header is successfully written"; muxer->start(); @@ -144,12 +148,15 @@ void EncodingFinalizer::run() videoEncoder->kill(); encoder->muxer->kill(); - int res = av_write_trailer(encoder->formatContext); - if (res < 0) - qWarning() << "could not write trailer" << res; + if (encoder->isHeaderWritten) { + const int res = av_write_trailer(encoder->formatContext); + if (res < 0) + qWarning() << "could not write trailer" << res; + } + // else ffmpeg might crash // Close the AVIOContext and release any file handles - res = avio_close(encoder->formatContext->pb); + const int res = avio_close(encoder->formatContext->pb); Q_ASSERT(res == 0); avformat_free_context(encoder->formatContext); diff --git a/src/plugins/multimedia/ffmpeg/qffmpegencoder_p.h b/src/plugins/multimedia/ffmpeg/qffmpegencoder_p.h index 517143b0f..0cf9b18f8 100644 --- a/src/plugins/multimedia/ffmpeg/qffmpegencoder_p.h +++ b/src/plugins/multimedia/ffmpeg/qffmpegencoder_p.h @@ -100,6 +100,8 @@ private: QMutex timeMutex; qint64 timeRecorded = 0; + + bool isHeaderWritten = false; }; |