From c8a85f8a3be3a80dbbbca08c95579a21a2e8380b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B5=AE=E7=94=9F=E8=8B=A5=E6=A2=A6?= <1070753498@qq.com> Date: Tue, 5 Dec 2023 18:38:13 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/player/colorspacedialog.cc | 2 +- examples/player/controlwidget.cc | 6 +- examples/player/mainwindow.cpp | 8 +- examples/player/qmediaplaylist_p.h | 37 ++++---- examples/player/qplaylistfileparser_p.h | 29 +++---- examples/player/slider.cpp | 2 +- examples/transcoder/mainwindow.cc | 6 +- ffmpeg/audiodecoder.cpp | 2 +- ffmpeg/audiodisplay.cc | 2 +- ffmpeg/audiodisplay.hpp | 2 +- ffmpeg/audiofifo.cc | 16 ++-- ffmpeg/audiofifo.hpp | 2 +- ffmpeg/audioframeconverter.cpp | 7 ++ ffmpeg/audioframeconverter.h | 6 ++ ffmpeg/audiorender/audiooutput.cc | 6 +- ffmpeg/avcontextinfo.cpp | 8 +- ffmpeg/averrormanager.cc | 8 +- ffmpeg/averrormanager.hpp | 2 +- ffmpeg/clock.cc | 8 +- ffmpeg/codeccontext.cpp | 10 +-- ffmpeg/colorutils.cc | 100 ++++++++++++---------- ffmpeg/event/seekevent.hpp | 4 +- ffmpeg/filter/filter.cc | 12 +-- ffmpeg/formatcontext.cpp | 2 +- ffmpeg/gpu/bufferref.cc | 20 ++--- ffmpeg/gpu/bufferref.hpp | 12 +-- ffmpeg/gpu/hardwaredecode.cc | 17 ++-- ffmpeg/gpu/hardwareencode.cc | 39 ++++----- ffmpeg/hdrmetadata.cc | 24 +++--- ffmpeg/hdrmetadata.hpp | 9 +- ffmpeg/mediainfo.cc | 5 +- ffmpeg/packet.cpp | 8 +- ffmpeg/player.cpp | 4 +- ffmpeg/subtitle.cpp | 6 +- ffmpeg/subtitle/ass.cc | 30 ++++--- ffmpeg/subtitle/ass.hpp | 2 +- ffmpeg/subtitledecoder.cpp | 8 +- ffmpeg/subtitledisplay.cc | 15 ++-- ffmpeg/subtitledisplay.hpp | 2 +- ffmpeg/transcode.cc | 36 +++++--- ffmpeg/transcode.hpp | 2 +- ffmpeg/videodecoder.cpp | 6 +- ffmpeg/videodisplay.cc | 13 +-- ffmpeg/videoframeconverter.cc | 12 +-- ffmpeg/videorender/openglshader.cc | 2 +- ffmpeg/videorender/openglshaderprogram.cc | 4 +- ffmpeg/videorender/shaderutils.cc | 22 +++-- ffmpeg/videorender/videopreviewwidget.cc | 39 ++++----- ffmpeg/videorender/videopreviewwidget.hpp | 4 +- ffmpeg/videorender/videorender.cc | 8 +- 50 files changed, 338 insertions(+), 298 deletions(-) diff --git a/examples/player/colorspacedialog.cc b/examples/player/colorspacedialog.cc index d78f746..2004437 100644 --- a/examples/player/colorspacedialog.cc +++ b/examples/player/colorspacedialog.cc @@ -57,7 +57,7 @@ class ColorSpaceDialog::ColorSpaceDialogPrivate resetButton->setText("Reset"); } - void setupUI() + void setupUI() const { auto *layout = new QGridLayout(q_ptr); layout->addWidget(new QLabel(QObject::tr("Contrast:"), q_ptr), 0, 0); diff --git a/examples/player/controlwidget.cc b/examples/player/controlwidget.cc index 4244ec7..d8d6a56 100644 --- a/examples/player/controlwidget.cc +++ b/examples/player/controlwidget.cc @@ -45,7 +45,7 @@ class ControlWidget::ControlWidgetPrivate modelButton = new QPushButton(q_ptr); } - void setupUI() + void setupUI() const { auto *processLayout = new QHBoxLayout; processLayout->setSpacing(10); @@ -101,13 +101,13 @@ class ControlWidget::ControlWidgetPrivate l->addWidget(widget); } - void setPlayButtonIcon() + void setPlayButtonIcon() const { playButton->setIcon(playButton->style()->standardIcon( playButton->isChecked() ? QStyle::SP_MediaPause : QStyle::SP_MediaPlay)); } - void initModelButton() + void initModelButton() const { modelButton->setProperty("model", QMediaPlaylist::Sequential); QMetaObject::invokeMethod(q_ptr, &ControlWidget::onModelChanged, Qt::QueuedConnection); diff --git a/examples/player/mainwindow.cpp b/examples/player/mainwindow.cpp index 47bd13d..e450102 100644 --- a/examples/player/mainwindow.cpp +++ b/examples/player/mainwindow.cpp @@ -134,7 +134,7 @@ class MainWindow::MainWindowPrivate new QShortcut(Qt::Key_Space, q_ptr, q_ptr, [this] { controlWidget->clickPlayButton(); }); } - void setControlWidgetVisible(bool visible) + void setControlWidgetVisible(bool visible) const { if (videoRender.isNull()) { return; @@ -142,7 +142,7 @@ class MainWindow::MainWindowPrivate controlWidget->setVisible(visible); } - auto setTitleWidgetVisible(bool visible) -> bool + auto setTitleWidgetVisible(bool visible) const -> bool { if (videoRender.isNull()) { return false; @@ -160,7 +160,7 @@ class MainWindow::MainWindowPrivate titleWidget->setAutoHide(3000); } - void started() + void started() const { controlWidget->setSourceFPS(playerPtr->fps()); @@ -173,7 +173,7 @@ class MainWindow::MainWindowPrivate fpsTimer->start(1000); } - void finished() + void finished() const { fpsTimer->stop(); controlWidget->setDuration(0); diff --git a/examples/player/qmediaplaylist_p.h b/examples/player/qmediaplaylist_p.h index b0a6609..76663f8 100644 --- a/examples/player/qmediaplaylist_p.h +++ b/examples/player/qmediaplaylist_p.h @@ -21,12 +21,11 @@ #include #ifdef Q_MOC_RUN -# pragma Q_MOC_EXPAND_MACROS +#pragma Q_MOC_EXPAND_MACROS #endif QT_BEGIN_NAMESPACE - class QMediaPlaylistControl; class QMediaPlaylistPrivate @@ -35,8 +34,7 @@ class QMediaPlaylistPrivate public: QMediaPlaylistPrivate() : error(QMediaPlaylist::NoError) - { - } + {} virtual ~QMediaPlaylistPrivate() { @@ -52,23 +50,24 @@ class QMediaPlaylistPrivate emit q_ptr->loadFailed(); } - void loadFinished() + void loadFinished() const { q_ptr->addMedia(parser->playlist); emit q_ptr->loaded(); } - bool checkFormat(const char *format) const + auto checkFormat(const char *format) const -> bool { QLatin1String f(format); - QPlaylistFileParser::FileType type = format ? QPlaylistFileParser::UNKNOWN : QPlaylistFileParser::M3U8; - if (format) { - if (f == QLatin1String("m3u") || f == QLatin1String("text/uri-list") || - f == QLatin1String("audio/x-mpegurl") || f == QLatin1String("audio/mpegurl")) + QPlaylistFileParser::FileType type = format != nullptr ? QPlaylistFileParser::UNKNOWN + : QPlaylistFileParser::M3U8; + if (format != nullptr) { + if (f == QLatin1String("m3u") || f == QLatin1String("text/uri-list") + || f == QLatin1String("audio/x-mpegurl") || f == QLatin1String("audio/mpegurl")) type = QPlaylistFileParser::M3U; - else if (f == QLatin1String("m3u8") || f == QLatin1String("application/x-mpegURL") || - f == QLatin1String("application/vnd.apple.mpegurl")) + else if (f == QLatin1String("m3u8") || f == QLatin1String("application/x-mpegURL") + || f == QLatin1String("application/vnd.apple.mpegurl")) type = QPlaylistFileParser::M3U8; } @@ -82,17 +81,20 @@ class QMediaPlaylistPrivate void ensureParser() { - if (parser) + if (parser != nullptr) return; parser = new QPlaylistFileParser(q_ptr); QObject::connect(parser, &QPlaylistFileParser::finished, [this]() { loadFinished(); }); - QObject::connect(parser, &QPlaylistFileParser::error, - [this](QMediaPlaylist::Error err, const QString& errorMsg) { loadFailed(err, errorMsg); }); + QObject::connect(parser, + &QPlaylistFileParser::error, + [this](QMediaPlaylist::Error err, const QString &errorMsg) { + loadFailed(err, errorMsg); + }); } - int nextPosition(int steps) const; - int prevPosition(int steps) const; + auto nextPosition(int steps) const -> int; + auto prevPosition(int steps) const -> int; QList playlist; @@ -108,5 +110,4 @@ class QMediaPlaylistPrivate QT_END_NAMESPACE - #endif // QMEDIAPLAYLIST_P_H diff --git a/examples/player/qplaylistfileparser_p.h b/examples/player/qplaylistfileparser_p.h index ef29c24..f1d7fd6 100644 --- a/examples/player/qplaylistfileparser_p.h +++ b/examples/player/qplaylistfileparser_p.h @@ -30,11 +30,10 @@ class QPlaylistFileParser : public QObject { Q_OBJECT public: - QPlaylistFileParser(QObject *parent = nullptr); - ~QPlaylistFileParser(); + explicit QPlaylistFileParser(QObject *parent = nullptr); + ~QPlaylistFileParser() override; - enum FileType - { + enum FileType { UNKNOWN, M3U, M3U8, // UTF-8 version of M3U @@ -49,25 +48,23 @@ class QPlaylistFileParser : public QObject QList playlist; Q_SIGNALS: - void newItem(const QVariant& content); + void newItem(const QVariant &content); void finished(); - void error(QMediaPlaylist::Error err, const QString& errorMsg); + void error(QMediaPlaylist::Error err, const QString &errorMsg); private Q_SLOTS: void handleData(); void handleError(); private: - - static FileType findByMimeType(const QString &mime); - static FileType findBySuffixType(const QString &suffix); - static FileType findByDataHeader(const char *data, quint32 size); - static FileType findPlaylistType(QIODevice *device, - const QString& mime); - static FileType findPlaylistType(const QString &suffix, - const QString& mime, - const char *data = nullptr, - quint32 size = 0); + static auto findByMimeType(const QString &mime) -> FileType; + static auto findBySuffixType(const QString &suffix) -> FileType; + static auto findByDataHeader(const char *data, quint32 size) -> FileType; + static auto findPlaylistType(QIODevice *device, const QString &mime) -> FileType; + static auto findPlaylistType(const QString &suffix, + const QString &mime, + const char *data = nullptr, + quint32 size = 0) -> FileType; Q_DISABLE_COPY(QPlaylistFileParser) Q_DECLARE_PRIVATE(QPlaylistFileParser) diff --git a/examples/player/slider.cpp b/examples/player/slider.cpp index 696f660..5df868c 100644 --- a/examples/player/slider.cpp +++ b/examples/player/slider.cpp @@ -44,7 +44,7 @@ void Slider::initStyleOption_Qt430(QStyleOptionSlider *option) const option->orientation = orientation(); option->maximum = maximum(); option->minimum = minimum(); - option->tickPosition = (QSlider::TickPosition) tickPosition(); + option->tickPosition = tickPosition(); option->tickInterval = tickInterval(); option->upsideDown = (orientation() == Qt::Horizontal) ? (invertedAppearance() != (option->direction == Qt::RightToLeft)) diff --git a/examples/transcoder/mainwindow.cc b/examples/transcoder/mainwindow.cc index c589bc4..c002b8d 100644 --- a/examples/transcoder/mainwindow.cc +++ b/examples/transcoder/mainwindow.cc @@ -75,7 +75,7 @@ class MainWindow::MainWindowPrivate fpsTimer = new QTimer(q_ptr); } - QGroupBox *initVideoSetting() + QGroupBox *initVideoSetting() const { auto layout1 = new QHBoxLayout; layout1->addWidget(new QLabel(tr("Width:"), q_ptr)); @@ -96,7 +96,7 @@ class MainWindow::MainWindowPrivate return groupBox; } - QGroupBox *invalidSetting() + QGroupBox *invalidSetting() const { auto groupBox = new QGroupBox(tr("Invalid setting"), q_ptr); auto layout = new QHBoxLayout(groupBox); @@ -155,7 +155,7 @@ class MainWindow::MainWindowPrivate } } - void calBitrate() + void calBitrate() const { auto w = widthLineEdit->text().toInt(); auto h = heightLineEdit->text().toInt(); diff --git a/ffmpeg/audiodecoder.cpp b/ffmpeg/audiodecoder.cpp index 27cd5ce..0f057e2 100644 --- a/ffmpeg/audiodecoder.cpp +++ b/ffmpeg/audiodecoder.cpp @@ -18,7 +18,7 @@ class AudioDecoder::AudioDecoderPrivate decoderAudioFrame = new AudioDisplay(q_ptr); } - void processEvent() + void processEvent() const { while (q_ptr->m_runing.load() && !q_ptr->m_eventQueue.empty()) { auto eventPtr = q_ptr->m_eventQueue.take(); diff --git a/ffmpeg/audiodisplay.cc b/ffmpeg/audiodisplay.cc index bfdcdff..da02a97 100644 --- a/ffmpeg/audiodisplay.cc +++ b/ffmpeg/audiodisplay.cc @@ -25,7 +25,7 @@ class AudioDisplay::AudioDisplayPrivate ~AudioDisplayPrivate() = default; - void processEvent(bool &firstFrame) + void processEvent(bool &firstFrame) const { while (q_ptr->m_runing.load() && !q_ptr->m_eventQueue.empty()) { qDebug() << "AudioFramePrivate::processEvent"; diff --git a/ffmpeg/audiodisplay.hpp b/ffmpeg/audiodisplay.hpp index ad16228..f32af97 100644 --- a/ffmpeg/audiodisplay.hpp +++ b/ffmpeg/audiodisplay.hpp @@ -11,7 +11,7 @@ class AudioDisplay : public Decoder Q_OBJECT public: explicit AudioDisplay(QObject *parent = nullptr); - ~AudioDisplay(); + ~AudioDisplay() override; void setVolume(qreal volume); diff --git a/ffmpeg/audiofifo.cc b/ffmpeg/audiofifo.cc index d435300..8042829 100644 --- a/ffmpeg/audiofifo.cc +++ b/ffmpeg/audiofifo.cc @@ -14,13 +14,13 @@ namespace Ffmpeg { class AudioFifo::AudioFifoPrivtate { public: - AudioFifoPrivtate(AudioFifo *q) + explicit AudioFifoPrivtate(AudioFifo *q) : q_ptr(q) {} ~AudioFifoPrivtate() { - if (audioFifo) { + if (audioFifo != nullptr) { av_audio_fifo_free(audioFifo); } } @@ -34,20 +34,20 @@ AudioFifo::AudioFifo(CodecContext *ctx, QObject *parent) : QObject{parent} , d_ptr(new AudioFifoPrivtate(this)) { - auto avCodecCtx = ctx->avCodecCtx(); + auto *avCodecCtx = ctx->avCodecCtx(); d_ptr->audioFifo = av_audio_fifo_alloc(avCodecCtx->sample_fmt, ctx->chLayout().nb_channels, 1); Q_ASSERT(nullptr != d_ptr->audioFifo); } -AudioFifo::~AudioFifo() {} +AudioFifo::~AudioFifo() = default; -bool AudioFifo::realloc(int nb_samples) +auto AudioFifo::realloc(int nb_samples) -> bool { auto ret = av_audio_fifo_realloc(d_ptr->audioFifo, nb_samples); ERROR_RETURN(ret) } -bool AudioFifo::write(void **data, int nb_samples) +auto AudioFifo::write(void **data, int nb_samples) -> bool { auto ret = av_audio_fifo_write(d_ptr->audioFifo, data, nb_samples); if (ret < nb_samples) { @@ -57,7 +57,7 @@ bool AudioFifo::write(void **data, int nb_samples) return true; } -bool AudioFifo::read(void **data, int nb_samples) +auto AudioFifo::read(void **data, int nb_samples) -> bool { auto ret = av_audio_fifo_read(d_ptr->audioFifo, data, nb_samples); if (ret < nb_samples) { @@ -67,7 +67,7 @@ bool AudioFifo::read(void **data, int nb_samples) return true; } -int AudioFifo::size() const +auto AudioFifo::size() const -> int { return av_audio_fifo_size(d_ptr->audioFifo); } diff --git a/ffmpeg/audiofifo.hpp b/ffmpeg/audiofifo.hpp index 72f2bc1..ea558dd 100644 --- a/ffmpeg/audiofifo.hpp +++ b/ffmpeg/audiofifo.hpp @@ -17,7 +17,7 @@ class AudioFifo : public QObject auto write(void **data, int nb_samples) -> bool; auto read(void **data, int nb_samples) -> bool; - auto size() const -> int; + [[nodiscard]] auto size() const -> int; private: class AudioFifoPrivtate; diff --git a/ffmpeg/audioframeconverter.cpp b/ffmpeg/audioframeconverter.cpp index c4b9a55..366df0e 100644 --- a/ffmpeg/audioframeconverter.cpp +++ b/ffmpeg/audioframeconverter.cpp @@ -233,4 +233,11 @@ auto getAudioFormatFromCodecCtx(CodecContext *codecCtx, int &sampleSize) -> QAud return autioFormat; } +auto getAVChannelLayoutDescribe(const AVChannelLayout &chLayout) -> QString +{ + char buf[64] = {0}; + av_channel_layout_describe(&chLayout, buf, sizeof(buf)); + return QString::fromUtf8(buf); +} + } // namespace Ffmpeg diff --git a/ffmpeg/audioframeconverter.h b/ffmpeg/audioframeconverter.h index 10240d9..705060c 100644 --- a/ffmpeg/audioframeconverter.h +++ b/ffmpeg/audioframeconverter.h @@ -2,6 +2,10 @@ #include +extern "C" { +#include +} + namespace Ffmpeg { class CodecContext; @@ -23,4 +27,6 @@ class AudioFrameConverter : public QObject auto getAudioFormatFromCodecCtx(CodecContext *codecCtx, int &sampleSize) -> QAudioFormat; +auto getAVChannelLayoutDescribe(const AVChannelLayout &chLayout) -> QString; + } // namespace Ffmpeg diff --git a/ffmpeg/audiorender/audiooutput.cc b/ffmpeg/audiorender/audiooutput.cc index c260c44..cdaa722 100644 --- a/ffmpeg/audiorender/audiooutput.cc +++ b/ffmpeg/audiorender/audiooutput.cc @@ -79,7 +79,7 @@ AudioOutput::~AudioOutput() = default; void AudioOutput::onConvertData(const QSharedPointer &framePtr) { - if (!d_ptr->ioDevice) { + if (d_ptr->ioDevice == nullptr) { return; } @@ -89,11 +89,11 @@ void AudioOutput::onConvertData(const QSharedPointer &framePtr) void AudioOutput::onWrite() { - if (!d_ptr->ioDevice) { + if (d_ptr->ioDevice == nullptr) { return; } while (d_ptr->audioBuf.size() > 0) { - int byteFree = d_ptr->audioSinkPtr->bytesFree(); + auto byteFree = d_ptr->audioSinkPtr->bytesFree(); if (byteFree > 0 && byteFree < d_ptr->audioBuf.size()) { d_ptr->ioDevice->write(d_ptr->audioBuf.data(), byteFree); d_ptr->audioBuf = d_ptr->audioBuf.sliced(byteFree); diff --git a/ffmpeg/avcontextinfo.cpp b/ffmpeg/avcontextinfo.cpp index d4747a7..2967728 100644 --- a/ffmpeg/avcontextinfo.cpp +++ b/ffmpeg/avcontextinfo.cpp @@ -14,7 +14,7 @@ extern "C" { #include } -#define Error_Index -1 +#define INVALID_INDEX -1 namespace Ffmpeg { @@ -29,7 +29,7 @@ class AVContextInfo::AVContextInfoPrivate QScopedPointer codecCtx; //解码器上下文 AVStream *stream = nullptr; //流 - int streamIndex = Error_Index; // 索引 + int streamIndex = INVALID_INDEX; // 索引 QScopedPointer hardWareDecodePtr; QScopedPointer hardWareEncodePtr; GpuType gpuType = GpuType::NotUseGpu; @@ -49,7 +49,7 @@ auto AVContextInfo::codecCtx() -> CodecContext * void AVContextInfo::resetIndex() { - d_ptr->streamIndex = Error_Index; + d_ptr->streamIndex = INVALID_INDEX; } void AVContextInfo::setIndex(int index) @@ -64,7 +64,7 @@ auto AVContextInfo::index() -> int auto AVContextInfo::isIndexVaild() -> bool { - return d_ptr->streamIndex != Error_Index; + return d_ptr->streamIndex != INVALID_INDEX; } void AVContextInfo::setStream(AVStream *stream) diff --git a/ffmpeg/averrormanager.cc b/ffmpeg/averrormanager.cc index e0c00f7..aae5f4c 100644 --- a/ffmpeg/averrormanager.cc +++ b/ffmpeg/averrormanager.cc @@ -6,7 +6,7 @@ namespace Ffmpeg { class AVErrorManager::AVErrorManagerPrivate { public: - AVErrorManagerPrivate(AVErrorManager *q) + explicit AVErrorManagerPrivate(AVErrorManager *q) : q_ptr(q) {} @@ -44,12 +44,12 @@ void AVErrorManager::setErrorCode(int errorCode) emit error(d_ptr->error); } -QString AVErrorManager::lastErrorString() const +auto AVErrorManager::lastErrorString() const -> QString { return d_ptr->error.errorString(); } -QVector AVErrorManager::errorCodes() const +auto AVErrorManager::errorCodes() const -> QVector { return d_ptr->errorCodes; } @@ -61,6 +61,6 @@ AVErrorManager::AVErrorManager(QObject *parent) qRegisterMetaType("Ffmpeg::AVError"); } -AVErrorManager::~AVErrorManager() {} +AVErrorManager::~AVErrorManager() = default; } // namespace Ffmpeg diff --git a/ffmpeg/averrormanager.hpp b/ffmpeg/averrormanager.hpp index 78ac714..ffc11eb 100644 --- a/ffmpeg/averrormanager.hpp +++ b/ffmpeg/averrormanager.hpp @@ -8,7 +8,7 @@ #define SET_ERROR_CODE(errorCode) AVErrorManager::instance()->setErrorCode(errorCode) #define ERROR_RETURN(errorCode) \ - if (errorCode < 0) { \ + if ((errorCode) < 0) { \ SET_ERROR_CODE(errorCode); \ return false; \ } \ diff --git a/ffmpeg/clock.cc b/ffmpeg/clock.cc index 4738d58..c8040be 100644 --- a/ffmpeg/clock.cc +++ b/ffmpeg/clock.cc @@ -116,7 +116,7 @@ void Clock::update(qint64 pts, qint64 time) Q_ASSERT(Clock::ClockPrivate::s_clock); QMutexLocker locker(&d_ptr->mutex); - if (d_ptr->last_updated && !d_ptr->paused) { + if ((d_ptr->last_updated != 0) && !d_ptr->paused) { if (this == Clock::ClockPrivate::s_clock || Clock::ClockPrivate::s_clock->d_ptr->last_updated == 0) { qint64 timediff = (time - d_ptr->last_updated) * speed(); @@ -145,14 +145,16 @@ auto Clock::adjustDelay(qint64 &delay) -> bool { if (speed() > 1.0 && delay < 0) { return false; - } else if (delay < -Clock::ClockPrivate::s_diffThreshold) { + } + if (delay < -Clock::ClockPrivate::s_diffThreshold) { reset(pts()); // 有可能是因为网络下载过慢导致的延迟,需要重置 if (this == Clock::ClockPrivate::s_clock) { // 主时钟不丢帧 delay = 0; return true; } return false; - } else if (qAbs(delay) <= Clock::ClockPrivate::s_diffThreshold) { + } + if (qAbs(delay) <= Clock::ClockPrivate::s_diffThreshold) { delay = 0; return true; } diff --git a/ffmpeg/codeccontext.cpp b/ffmpeg/codeccontext.cpp index 3db8374..8dfc963 100644 --- a/ffmpeg/codeccontext.cpp +++ b/ffmpeg/codeccontext.cpp @@ -49,10 +49,10 @@ class CodecContext::CodecContextPrivate } } if (codec->ch_layouts != nullptr) { - const auto *p = codec->ch_layouts; - while (p->nb_channels) { - supported_ch_layouts.append(*p); - p++; + const auto *ch_layout = codec->ch_layouts; + while (ch_layout->nb_channels != 0) { + supported_ch_layouts.append(*ch_layout); + ch_layout++; } } } @@ -304,7 +304,7 @@ auto CodecContext::receiveFrame(Frame *frame) -> bool avFrame->ch_layout = d_ptr->codecCtx->ch_layout; return true; } - if (ret != -11) { // Resource temporarily unavailable + if (ret != AVERROR(EAGAIN)) { // Resource temporarily unavailable SET_ERROR_CODE(ret); } return false; diff --git a/ffmpeg/colorutils.cc b/ffmpeg/colorutils.cc index 58aac59..6aba610 100644 --- a/ffmpeg/colorutils.cc +++ b/ffmpeg/colorutils.cc @@ -25,38 +25,46 @@ static constexpr QVector3D kBT2020_10bit_limited_offset = {-0.062561F, -0.500489 static constexpr QVector3D kBT2020_12bit_full_offset = {0.000000F, -0.500122F, -0.500122F}; static constexpr QVector3D kBT2020_12bit_limited_offset = {-0.062515F, -0.500122F, -0.500122F}; -static constexpr float kJPEG_full_yuv_to_rgb[3][3] = {{1.000000F, 1.000000F, 1.000000F}, - {-0.000000F, -0.344136F, 1.772000F}, - {1.402000F, -0.714136F, 0.000000F}}; -static constexpr float kRec601_limited_yuv_to_rgb[3][3] = {{1.164384F, 1.164384F, 1.164384F}, - {-0.000000F, -0.391762F, 2.017232F}, - {1.596027F, -0.812968F, 0.000000F}}; -static constexpr float kRec709_full_yuv_to_rgb[3][3] = {{1.000000F, 1.000000F, 1.000000F}, - {-0.000000F, -0.187324F, 1.855600F}, - {1.574800F, -0.468124F, -0.000000F}}; -static constexpr float kRec709_limited_yuv_to_rgb[3][3] = {{1.164384F, 1.164384F, 1.164384F}, - {-0.000000F, -0.213249F, 2.112402F}, - {1.792741F, -0.532909F, -0.000000F}}; -static constexpr float kBT2020_8bit_full_yuv_to_rgb[3][3] = {{1.000000F, 1.000000F, 1.000000F}, - {-0.000000F, -0.164553F, 1.881400F}, - {1.474600F, -0.571353F, -0.000000F}}; -static constexpr float kBT2020_8bit_limited_yuv_to_rgb[3][3] = {{1.164384F, 1.164384F, 1.164384F}, - {-0.000000F, -0.187326F, 2.141772F}, - {1.678674F, -0.650424F, -0.000000F}}; -static constexpr float kBT2020_10bit_full_yuv_to_rgb[3][3] = {{1.000000F, 1.000000F, 1.000000F}, - {-0.000000F, -0.164553F, 1.881400F}, - {1.474600F, -0.571353F, -0.000000F}}; -static constexpr float kBT2020_10bit_limited_yuv_to_rgb[3][3] - = {{1.167808F, 1.167808F, 1.167808F}, - {-0.000000F, -0.187877F, 2.148072F}, - {1.683611F, -0.652337F, -0.000000F}}; -static constexpr float kBT2020_12bit_full_yuv_to_rgb[3][3] = {{1.000000F, 1.000000F, 1.000000F}, - {-0.000000F, -0.164553F, 1.881400F}, - {1.474600F, -0.571353F, -0.000000F}}; -static constexpr float kBT2020_12bit_limited_yuv_to_rgb[3][3] - = {{1.168664F, 1.168664F, 1.168664F}, - {-0.000000F, -0.188015F, 2.149647F}, - {1.684846F, -0.652816F, -0.000000F}}; +static constexpr std::array, 3> kJPEG_full_yuv_to_rgb + = {std::array{1.000000F, 1.000000F, 1.000000F}, + std::array{-0.000000F, -0.344136F, 1.772000F}, + std::array{1.402000F, -0.714136F, 0.000000F}}; +static constexpr std::array, 3> kRec601_limited_yuv_to_rgb + = {std::array{1.164384F, 1.164384F, 1.164384F}, + std::array{-0.000000F, -0.391762F, 2.017232F}, + std::array{1.596027F, -0.812968F, 0.000000F}}; +static constexpr std::array, 3> kRec709_full_yuv_to_rgb + = {std::array{1.000000F, 1.000000F, 1.000000F}, + std::array{-0.000000F, -0.187324F, 1.855600F}, + std::array{1.574800F, -0.468124F, -0.000000F}}; +static constexpr std::array, 3> kRec709_limited_yuv_to_rgb + = {std::array{1.164384F, 1.164384F, 1.164384F}, + std::array{-0.000000F, -0.213249F, 2.112402F}, + std::array{1.792741F, -0.532909F, -0.000000F}}; +static constexpr std::array, 3> kBT2020_8bit_full_yuv_to_rgb + = {std::array{1.000000F, 1.000000F, 1.000000F}, + std::array{-0.000000F, -0.164553F, 1.881400F}, + std::array{1.474600F, -0.571353F, -0.000000F}}; +static constexpr std::array, 3> kBT2020_8bit_limited_yuv_to_rgb + = {std::array{1.164384F, 1.164384F, 1.164384F}, + std::array{-0.000000F, -0.187326F, 2.141772F}, + std::array{1.678674F, -0.650424F, -0.000000F}}; +static constexpr std::array, 3> kBT2020_10bit_full_yuv_to_rgb + = {std::array{1.000000F, 1.000000F, 1.000000F}, + std::array{-0.000000F, -0.164553F, 1.881400F}, + std::array{1.474600F, -0.571353F, -0.000000F}}; +static constexpr std::array, 3> kBT2020_10bit_limited_yuv_to_rgb + = {std::array{1.167808F, 1.167808F, 1.167808F}, + std::array{-0.000000F, -0.187877F, 2.148072F}, + std::array{1.683611F, -0.652337F, -0.000000F}}; +static constexpr std::array, 3> kBT2020_12bit_full_yuv_to_rgb + = {std::array{1.000000F, 1.000000F, 1.000000F}, + std::array{-0.000000F, -0.164553F, 1.881400F}, + std::array{1.474600F, -0.571353F, -0.000000F}}; +static constexpr std::array, 3> kBT2020_12bit_limited_yuv_to_rgb + = {std::array{1.168664F, 1.168664F, 1.168664F}, + std::array{-0.000000F, -0.188015F, 2.149647F}, + std::array{1.684846F, -0.652816F, -0.000000F}}; auto getYuvToRgbParam(Frame *frame) -> YuvToRgbParam { @@ -67,10 +75,10 @@ auto getYuvToRgbParam(Frame *frame) -> YuvToRgbParam case AVCOL_SPC_BT709: if (isFullRange) { param.offset = kBT709_full_offset; - param.matrix = QMatrix3x3(&kRec709_full_yuv_to_rgb[0][0]); + param.matrix = QMatrix3x3(kRec709_full_yuv_to_rgb[0].data()); } else { param.offset = kBT709_limited_offset; - param.matrix = QMatrix3x3(&kRec709_limited_yuv_to_rgb[0][0]); + param.matrix = QMatrix3x3(kRec709_limited_yuv_to_rgb[0].data()); } break; case AVCOL_SPC_BT2020_NCL: { @@ -80,28 +88,28 @@ auto getYuvToRgbParam(Frame *frame) -> YuvToRgbParam case 8: if (isFullRange) { param.offset = kBT2020_8bit_full_offset; - param.matrix = QMatrix3x3(&kBT2020_8bit_full_yuv_to_rgb[0][0]); + param.matrix = QMatrix3x3(kBT2020_8bit_full_yuv_to_rgb[0].data()); } else { param.offset = kBT2020_8bit_limited_offset; - param.matrix = QMatrix3x3(&kBT2020_8bit_limited_yuv_to_rgb[0][0]); + param.matrix = QMatrix3x3(kBT2020_8bit_limited_yuv_to_rgb[0].data()); } break; case 12: if (isFullRange) { param.offset = kBT2020_12bit_full_offset; - param.matrix = QMatrix3x3(&kBT2020_12bit_full_yuv_to_rgb[0][0]); + param.matrix = QMatrix3x3(kBT2020_12bit_full_yuv_to_rgb[0].data()); } else { param.offset = kBT2020_12bit_limited_offset; - param.matrix = QMatrix3x3(&kBT2020_12bit_limited_yuv_to_rgb[0][0]); + param.matrix = QMatrix3x3(kBT2020_12bit_limited_yuv_to_rgb[0].data()); } break; default: if (isFullRange) { param.offset = kBT2020_10bit_full_offset; - param.matrix = QMatrix3x3(&kBT2020_10bit_full_yuv_to_rgb[0][0]); + param.matrix = QMatrix3x3(kBT2020_10bit_full_yuv_to_rgb[0].data()); } else { param.offset = kBT2020_10bit_limited_offset; - param.matrix = QMatrix3x3(&kBT2020_10bit_limited_yuv_to_rgb[0][0]); + param.matrix = QMatrix3x3(kBT2020_10bit_limited_yuv_to_rgb[0].data()); } break; } @@ -110,10 +118,10 @@ auto getYuvToRgbParam(Frame *frame) -> YuvToRgbParam default: if (isFullRange) { param.offset = kJPEG_full_offset; - param.matrix = QMatrix3x3(&kJPEG_full_yuv_to_rgb[0][0]); + param.matrix = QMatrix3x3(kJPEG_full_yuv_to_rgb[0].data()); } else { param.offset = kBT601_limited_offset; - param.matrix = QMatrix3x3(&kRec601_limited_yuv_to_rgb[0][0]); + param.matrix = QMatrix3x3(kRec601_limited_yuv_to_rgb[0].data()); } break; }; @@ -134,9 +142,11 @@ auto getRawPrimaries(AVColorPrimaries color_primaries) -> RawPrimaries */ // CIE standard illuminant series - static constexpr QPointF d50 = {0.34577, 0.35850}, d65 = {0.31271, 0.32902}, - c = {0.31006, 0.31616}, dci = {0.31400, 0.35100}, - e = {1.0 / 3.0, 1.0 / 3.0}; + static constexpr QPointF d50 = {0.34577, 0.35850}; + static constexpr QPointF d65 = {0.31271, 0.32902}; + static constexpr QPointF c = {0.31006, 0.31616}; + static constexpr QPointF dci = {0.31400, 0.35100}; + static constexpr QPointF e = {1.0 / 3.0, 1.0 / 3.0}; RawPrimaries primaries; switch (color_primaries) { diff --git a/ffmpeg/event/seekevent.hpp b/ffmpeg/event/seekevent.hpp index e52cef9..788d5e1 100644 --- a/ffmpeg/event/seekevent.hpp +++ b/ffmpeg/event/seekevent.hpp @@ -20,7 +20,7 @@ class FFMPEG_EXPORT SeekEvent : public Event void setPosition(qint64 position) { m_position = position; } [[nodiscard]] auto position() const -> qint64 { return m_position; } - void setWaitCountdown(qint64 count) { m_latch.setCount(count); } + void setWaitCountdown(int count) { m_latch.setCount(count); } void countDown() { m_latch.countDown(); } void wait() { m_latch.wait(); } @@ -36,7 +36,7 @@ class FFMPEG_EXPORT SeekRelativeEvent : public Event : Event(parent) , m_relativePosition(relativePosition) {} - + [[nodiscard]] auto type() const -> EventType override { return EventType::SeekRelative; } // second diff --git a/ffmpeg/filter/filter.cc b/ffmpeg/filter/filter.cc index e745987..9466e19 100644 --- a/ffmpeg/filter/filter.cc +++ b/ffmpeg/filter/filter.cc @@ -3,8 +3,10 @@ #include "filtergraph.hpp" #include "filterinout.hpp" +#include #include +#include #include extern "C" { @@ -51,27 +53,25 @@ class Filter::FilterPrivate if (avFrame->ch_layout.order == AV_CHANNEL_ORDER_UNSPEC) { av_channel_layout_default(&avFrame->ch_layout, avFrame->ch_layout.nb_channels); } - char buf[64]; - av_channel_layout_describe(&avFrame->ch_layout, buf, sizeof(buf)); auto args = QString::asprintf("time_base=%d/%d:sample_rate=%d:sample_fmt=%s:channel_layout=%s", 1, avFrame->sample_rate, avFrame->sample_rate, av_get_sample_fmt_name(static_cast(avFrame->format)), - buf); + getAVChannelLayoutDescribe(avFrame->ch_layout).toUtf8().data()); qDebug() << "Audio filter in args:" << args; create(args); } - void create(const QString &args) + void create(const QString &args) const { buffersrcCtx->create("in", args, filterGraph); buffersinkCtx->create("out", "", filterGraph); } - void config(const QString &filterSpec) + void config(const QString &filterSpec) const { QScopedPointer fliterOutPtr(new FilterInOut); QScopedPointer fliterInPtr(new FilterInOut); @@ -143,7 +143,7 @@ auto Filter::filterFrame(Frame *frame) -> QVector while (d_ptr->buffersinkCtx->buffersinkGetFrame(framePtr.get())) { framePtr->setPictType(AV_PICTURE_TYPE_NONE); framepPtrs.emplace_back(framePtr.release()); - framePtr.reset(new Frame); + framePtr = std::make_unique(); } return framepPtrs; } diff --git a/ffmpeg/formatcontext.cpp b/ffmpeg/formatcontext.cpp index 52046a7..8e18a2c 100644 --- a/ffmpeg/formatcontext.cpp +++ b/ffmpeg/formatcontext.cpp @@ -261,7 +261,7 @@ auto FormatContext::findStream() -> bool auto FormatContext::streams() const -> int { - return d_ptr->formatCtx->nb_streams; + return static_cast(d_ptr->formatCtx->nb_streams); } auto FormatContext::audioTracks() const -> StreamInfos diff --git a/ffmpeg/gpu/bufferref.cc b/ffmpeg/gpu/bufferref.cc index 59b95b9..84f1565 100644 --- a/ffmpeg/gpu/bufferref.cc +++ b/ffmpeg/gpu/bufferref.cc @@ -13,7 +13,7 @@ namespace Ffmpeg { class BufferRef::BufferRefPrivate { public: - BufferRefPrivate(BufferRef *q) + explicit BufferRefPrivate(BufferRef *q) : q_ptr(q) {} @@ -29,9 +29,9 @@ BufferRef::BufferRef(QObject *parent) , d_ptr(new BufferRefPrivate(this)) {} -BufferRef::~BufferRef() {} +BufferRef::~BufferRef() = default; -bool BufferRef::hwdeviceCtxCreate(AVHWDeviceType hwDeviceType) +auto BufferRef::hwdeviceCtxCreate(AVHWDeviceType hwDeviceType) -> bool { auto ret = av_hwdevice_ctx_create(&d_ptr->bufferRef, hwDeviceType, nullptr, nullptr, 0); if (ret < 0) { @@ -42,30 +42,30 @@ bool BufferRef::hwdeviceCtxCreate(AVHWDeviceType hwDeviceType) return true; } -BufferRef *BufferRef::hwframeCtxAlloc() +auto BufferRef::hwframeCtxAlloc() -> BufferRef * { - auto hw_frames_ref = av_hwframe_ctx_alloc(d_ptr->bufferRef); - if (!hw_frames_ref) { + auto *hw_frames_ref = av_hwframe_ctx_alloc(d_ptr->bufferRef); + if (hw_frames_ref == nullptr) { qWarning() << "Failed to create Gpu frame context."; return nullptr; } - auto bufferRef = new BufferRef; + auto *bufferRef = new BufferRef; bufferRef->d_ptr->bufferRef = hw_frames_ref; return bufferRef; } -bool BufferRef::hwframeCtxInit() +auto BufferRef::hwframeCtxInit() -> bool { auto ret = av_hwframe_ctx_init(d_ptr->bufferRef); ERROR_RETURN(ret) } -AVBufferRef *BufferRef::ref() +auto BufferRef::ref() -> AVBufferRef * { return av_buffer_ref(d_ptr->bufferRef); } -AVBufferRef *BufferRef::avBufferRef() +auto BufferRef::avBufferRef() -> AVBufferRef * { return d_ptr->bufferRef; } diff --git a/ffmpeg/gpu/bufferref.hpp b/ffmpeg/gpu/bufferref.hpp index c6effc2..1bcec37 100644 --- a/ffmpeg/gpu/bufferref.hpp +++ b/ffmpeg/gpu/bufferref.hpp @@ -15,15 +15,15 @@ class BufferRef : public QObject { public: explicit BufferRef(QObject *parent = nullptr); - ~BufferRef(); + ~BufferRef() override; - bool hwdeviceCtxCreate(AVHWDeviceType hwDeviceType); - BufferRef *hwframeCtxAlloc(); + auto hwdeviceCtxCreate(AVHWDeviceType hwDeviceType) -> bool; + auto hwframeCtxAlloc() -> BufferRef *; - bool hwframeCtxInit(); + auto hwframeCtxInit() -> bool; - AVBufferRef *ref(); - AVBufferRef *avBufferRef(); + auto ref() -> AVBufferRef *; + auto avBufferRef() -> AVBufferRef *; private: class BufferRefPrivate; diff --git a/ffmpeg/gpu/hardwaredecode.cc b/ffmpeg/gpu/hardwaredecode.cc index b04938f..7e6fe77 100644 --- a/ffmpeg/gpu/hardwaredecode.cc +++ b/ffmpeg/gpu/hardwaredecode.cc @@ -16,7 +16,7 @@ namespace Ffmpeg { AVPixelFormat hw_pix_fmt = AV_PIX_FMT_NONE; -AVPixelFormat get_hw_format(AVCodecContext *ctx, const enum AVPixelFormat *pix_fmts) +auto get_hw_format(AVCodecContext *ctx, const enum AVPixelFormat *pix_fmts) -> AVPixelFormat { Q_UNUSED(ctx) const enum AVPixelFormat *p; @@ -32,7 +32,7 @@ AVPixelFormat get_hw_format(AVCodecContext *ctx, const enum AVPixelFormat *pix_f class HardWareDecode::HardWareDecodePrivate { public: - HardWareDecodePrivate(HardWareDecode *q) + explicit HardWareDecodePrivate(HardWareDecode *q) : q_ptr(q) { bufferRef = new BufferRef(q_ptr); @@ -53,9 +53,9 @@ HardWareDecode::HardWareDecode(QObject *parent) , d_ptr(new HardWareDecodePrivate(this)) {} -HardWareDecode::~HardWareDecode() {} +HardWareDecode::~HardWareDecode() = default; -bool HardWareDecode::initPixelFormat(const AVCodec *decoder) +auto HardWareDecode::initPixelFormat(const AVCodec *decoder) -> bool { if (av_codec_is_decoder(decoder) <= 0) { return false; @@ -73,7 +73,7 @@ bool HardWareDecode::initPixelFormat(const AVCodec *decoder) return (hw_pix_fmt != AV_PIX_FMT_NONE); } -bool HardWareDecode::initHardWareDevice(CodecContext *codecContext) +auto HardWareDecode::initHardWareDevice(CodecContext *codecContext) -> bool { if (hw_pix_fmt == AV_PIX_FMT_NONE) { return false; @@ -81,14 +81,15 @@ bool HardWareDecode::initHardWareDevice(CodecContext *codecContext) if (!d_ptr->bufferRef->hwdeviceCtxCreate(d_ptr->hwDeviceType)) { return false; } - auto ctx = codecContext->avCodecCtx(); + auto *ctx = codecContext->avCodecCtx(); ctx->hw_device_ctx = d_ptr->bufferRef->ref(); ctx->get_format = get_hw_format; d_ptr->vaild = ctx->hw_device_ctx != nullptr; return d_ptr->vaild; } -QSharedPointer HardWareDecode::transFromGpu(const QSharedPointer &inPtr, bool &ok) +auto HardWareDecode::transFromGpu(const QSharedPointer &inPtr, bool &ok) + -> QSharedPointer { ok = true; if (!isVaild()) { @@ -114,7 +115,7 @@ QSharedPointer HardWareDecode::transFromGpu(const QSharedPointer & return outPtr; } -bool HardWareDecode::isVaild() +auto HardWareDecode::isVaild() -> bool { if (d_ptr->hwDeviceType == AV_HWDEVICE_TYPE_NONE) { return false; diff --git a/ffmpeg/gpu/hardwareencode.cc b/ffmpeg/gpu/hardwareencode.cc index 991f6cb..ecdaab0 100644 --- a/ffmpeg/gpu/hardwareencode.cc +++ b/ffmpeg/gpu/hardwareencode.cc @@ -17,13 +17,13 @@ namespace Ffmpeg { class HardWareEncode::HardWareEncodePrivate { public: - HardWareEncodePrivate(HardWareEncode *q) + explicit HardWareEncodePrivate(HardWareEncode *q) : q_ptr(q) { bufferRef = new BufferRef(q_ptr); } - ~HardWareEncodePrivate() {} + ~HardWareEncodePrivate() = default; HardWareEncode *q_ptr; @@ -44,9 +44,9 @@ HardWareEncode::HardWareEncode(QObject *parent) , d_ptr(new HardWareEncodePrivate(this)) {} -HardWareEncode::~HardWareEncode() {} +HardWareEncode::~HardWareEncode() = default; -bool HardWareEncode::initEncoder(const AVCodec *encoder) +auto HardWareEncode::initEncoder(const AVCodec *encoder) -> bool { if (av_codec_is_encoder(encoder) <= 0) { return false; @@ -62,8 +62,8 @@ bool HardWareEncode::initEncoder(const AVCodec *encoder) break; } } - if (encoder->pix_fmts) { - for (auto pix_fmt = encoder->pix_fmts; *pix_fmt != -1; pix_fmt++) { + if (encoder->pix_fmts != nullptr) { + for (const auto *pix_fmt = encoder->pix_fmts; *pix_fmt != -1; pix_fmt++) { if (d_ptr->hw_pix_fmts.contains(*pix_fmt)) { d_ptr->hw_pix_fmt = *pix_fmt; break; @@ -73,7 +73,7 @@ bool HardWareEncode::initEncoder(const AVCodec *encoder) return (hw_pix_fmt != AV_PIX_FMT_NONE); } -bool HardWareEncode::initHardWareDevice(CodecContext *codecContext) +auto HardWareEncode::initHardWareDevice(CodecContext *codecContext) -> bool { if (d_ptr->hwDeviceType == AV_HWDEVICE_TYPE_NONE) { return false; @@ -81,13 +81,13 @@ bool HardWareEncode::initHardWareDevice(CodecContext *codecContext) if (!d_ptr->bufferRef->hwdeviceCtxCreate(d_ptr->hwDeviceType)) { return false; } - auto hw_frames_ref = d_ptr->bufferRef->hwframeCtxAlloc(); - if (!hw_frames_ref) { + auto *hw_frames_ref = d_ptr->bufferRef->hwframeCtxAlloc(); + if (hw_frames_ref == nullptr) { return false; } - auto ctx = codecContext->avCodecCtx(); + auto *ctx = codecContext->avCodecCtx(); ctx->pix_fmt = d_ptr->hw_pix_fmt; - auto frames_ctx = (AVHWFramesContext *) (hw_frames_ref->avBufferRef()->data); + auto *frames_ctx = reinterpret_cast(hw_frames_ref->avBufferRef()->data); frames_ctx->format = d_ptr->hw_pix_fmt; frames_ctx->sw_format = d_ptr->sw_format; frames_ctx->width = ctx->width; @@ -101,25 +101,24 @@ bool HardWareEncode::initHardWareDevice(CodecContext *codecContext) return d_ptr->vaild; } -QSharedPointer HardWareEncode::transToGpu(CodecContext *codecContext, - QSharedPointer inPtr, - bool &ok) +auto HardWareEncode::transToGpu(CodecContext *codecContext, QSharedPointer inPtr, bool &ok) + -> QSharedPointer { ok = true; if (!isVaild()) { return inPtr; } - auto avctx = codecContext->avCodecCtx(); - auto sw_frame = inPtr->avFrame(); + auto *avctx = codecContext->avCodecCtx(); + auto *sw_frame = inPtr->avFrame(); QSharedPointer outPtr(new Frame); - auto hw_frame = outPtr->avFrame(); + auto *hw_frame = outPtr->avFrame(); auto err = av_hwframe_get_buffer(avctx->hw_frames_ctx, hw_frame, 0); if (err < 0) { ok = false; SET_ERROR_CODE(err); return inPtr; } - if (!hw_frame->hw_frames_ctx) { + if (hw_frame->hw_frames_ctx == nullptr) { ok = false; return inPtr; } @@ -132,12 +131,12 @@ QSharedPointer HardWareEncode::transToGpu(CodecContext *codecContext, return outPtr; } -AVPixelFormat HardWareEncode::swFormat() const +auto HardWareEncode::swFormat() const -> AVPixelFormat { return d_ptr->sw_format; } -bool HardWareEncode::isVaild() +auto HardWareEncode::isVaild() -> bool { if (d_ptr->hwDeviceType == AV_HWDEVICE_TYPE_NONE) { return false; diff --git a/ffmpeg/hdrmetadata.cc b/ffmpeg/hdrmetadata.cc index d44d949..e10e94f 100644 --- a/ffmpeg/hdrmetadata.cc +++ b/ffmpeg/hdrmetadata.cc @@ -11,22 +11,22 @@ namespace Ffmpeg { HdrMetaData::HdrMetaData(Frame *frame) { - auto avFrame = frame->avFrame(); + auto *avFrame = frame->avFrame(); auto *mdm = av_frame_get_side_data(avFrame, AV_FRAME_DATA_MASTERING_DISPLAY_METADATA); auto *clm = av_frame_get_side_data(avFrame, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL); auto *dhp = av_frame_get_side_data(avFrame, AV_FRAME_DATA_DYNAMIC_HDR_PLUS); - if (mdm) { + if (mdm != nullptr) { auto *mdmPtr = reinterpret_cast(mdm); - if (mdmPtr) { - if (mdmPtr->has_luminance) { + if (mdmPtr != nullptr) { + if (mdmPtr->has_luminance != 0) { maxLuma = av_q2d(mdmPtr->max_luminance); minLuma = av_q2d(mdmPtr->min_luminance); if (maxLuma < 10.0 || minLuma >= maxLuma) { maxLuma = minLuma = 0; /* sanity */ } } - if (mdmPtr->has_primaries) { + if (mdmPtr->has_primaries != 0) { primaries.red.setX(av_q2d(mdmPtr->display_primaries[0][0])); primaries.red.setY(av_q2d(mdmPtr->display_primaries[0][1])); primaries.green.setX(av_q2d(mdmPtr->display_primaries[1][0])); @@ -38,16 +38,16 @@ HdrMetaData::HdrMetaData(Frame *frame) } } } - if (clm) { + if (clm != nullptr) { auto *clmPtr = reinterpret_cast(clm); - if (clmPtr) { + if (clmPtr != nullptr) { MaxCLL = clmPtr->MaxCLL; MaxFALL = clmPtr->MaxFALL; } } - if (dhp) { + if (dhp != nullptr) { auto *dhpPtr = reinterpret_cast(dhp); - if (dhpPtr && dhpPtr->application_version < 2) { + if ((dhpPtr != nullptr) && dhpPtr->application_version < 2) { float hist_max = 0; const auto *pars = &dhpPtr->params[0]; Q_ASSERT(dhpPtr->num_windows > 0); @@ -67,13 +67,13 @@ HdrMetaData::HdrMetaData(Frame *frame) } } hist_max *= 10000; - if (!sceneMax[0]) { + if (sceneMax[0] == 0.0f) { sceneMax[0] = hist_max; } - if (!sceneMax[1]) { + if (sceneMax[1] == 0.0f) { sceneMax[1] = hist_max; } - if (!sceneMax[2]) { + if (sceneMax[2] == 0.0f) { sceneMax[2] = hist_max; } diff --git a/ffmpeg/hdrmetadata.hpp b/ffmpeg/hdrmetadata.hpp index b5ca8fb..ac90a9d 100644 --- a/ffmpeg/hdrmetadata.hpp +++ b/ffmpeg/hdrmetadata.hpp @@ -9,9 +9,9 @@ class Frame; struct HdrBezier { - float targetLuma = 0; // target luminance (cd/m²) for this OOTF - QPointF knee = {0, 0}; // cross-over knee point (0-1) - float anchors[15] = {0}; // intermediate bezier curve control points (0-1) + float targetLuma = 0; // target luminance (cd/m²) for this OOTF + QPointF knee = {0, 0}; // cross-over knee point (0-1) + std::array anchors = {0}; // intermediate bezier curve control points (0-1) uint8_t numAnchors = 0; }; @@ -26,7 +26,8 @@ struct HdrMetaData unsigned MaxCLL = 0, MaxFALL = 0; - float sceneMax[3] = {0}, sceneAvg = 0; + std::array sceneMax = {0}; + float sceneAvg = 0; HdrBezier ootf; }; diff --git a/ffmpeg/mediainfo.cc b/ffmpeg/mediainfo.cc index fb0c49b..899e1a8 100644 --- a/ffmpeg/mediainfo.cc +++ b/ffmpeg/mediainfo.cc @@ -1,4 +1,5 @@ #include "mediainfo.hpp" +#include "audioframeconverter.h" #include @@ -30,9 +31,7 @@ StreamInfo::StreamInfo(struct AVStream *stream) switch (type) { case AVMEDIA_TYPE_AUDIO: { format = av_get_sample_fmt_name(static_cast(codecpar->format)); - char buf[64] = {0}; - av_channel_layout_describe(&codecpar->ch_layout, buf, sizeof(buf)); - chLayout = QString::fromUtf8(buf); + chLayout = getAVChannelLayoutDescribe(codecpar->ch_layout); sampleRate = codecpar->sample_rate; frameSize = codecpar->frame_size; } break; diff --git a/ffmpeg/packet.cpp b/ffmpeg/packet.cpp index 07d96b5..42f0a91 100644 --- a/ffmpeg/packet.cpp +++ b/ffmpeg/packet.cpp @@ -25,7 +25,7 @@ Packet::Packet() { d_ptr->packet = av_packet_alloc(); - if (!d_ptr->packet) { + if (d_ptr->packet == nullptr) { qWarning() << "Could not allocate packet"; } } @@ -35,7 +35,7 @@ Packet::Packet(const Packet &other) { d_ptr->packet = av_packet_clone(other.d_ptr->packet); - if (!d_ptr->packet) { + if (d_ptr->packet == nullptr) { qWarning() << "Could not clone packet"; } } @@ -54,7 +54,7 @@ auto Packet::operator=(const Packet &other) -> Packet & if (this != &other) { d_ptr->packet = av_packet_clone(other.d_ptr->packet); - if (!d_ptr->packet) { + if (d_ptr->packet == nullptr) { qWarning() << "Could not clone packet"; } } @@ -83,7 +83,7 @@ auto Packet::isValid() -> bool auto Packet::isKey() -> bool { Q_ASSERT(nullptr != d_ptr->packet); - return d_ptr->packet->flags & AV_PKT_FLAG_KEY; + return (d_ptr->packet->flags & AV_PKT_FLAG_KEY) != 0; } void Packet::unref() diff --git a/ffmpeg/player.cpp b/ffmpeg/player.cpp index 88111d9..9c585de 100644 --- a/ffmpeg/player.cpp +++ b/ffmpeg/player.cpp @@ -476,13 +476,13 @@ class Player::PlayerPrivate formatCtx->close(); } - void processSpeedEvent(const EventPtr &eventPtr) + static void processSpeedEvent(const EventPtr &eventPtr) { auto *speedEvent = dynamic_cast(eventPtr.data()); Clock::setSpeed(speedEvent->speed()); } - void processVolumeEvent(const EventPtr &eventPtr) + void processVolumeEvent(const EventPtr &eventPtr) const { auto *volumeEvent = dynamic_cast(eventPtr.data()); audioDecoder->setVolume(volumeEvent->volume()); diff --git a/ffmpeg/subtitle.cpp b/ffmpeg/subtitle.cpp index 3b1ed78..503e4fe 100644 --- a/ffmpeg/subtitle.cpp +++ b/ffmpeg/subtitle.cpp @@ -30,7 +30,7 @@ class Subtitle::SubtitlePrivate painter.setRenderHints(painter.renderHints() | QPainter::Antialiasing | QPainter::TextAntialiasing | QPainter::SmoothPixmapTransform); for (size_t i = 0; i < subtitle.num_rects; i++) { - auto sub_rect = subtitle.rects[i]; + auto *sub_rect = subtitle.rects[i]; uint8_t *pixels[4]; int pitch[4]; @@ -65,7 +65,7 @@ class Subtitle::SubtitlePrivate auto timeBase = 10 * 1000; // libass只支持0.01秒,还要四舍五入 pts = pts / timeBase * timeBase; for (size_t i = 0; i < subtitle.num_rects; i++) { - auto sub_rect = subtitle.rects[i]; + auto *sub_rect = subtitle.rects[i]; QByteArray text; switch (sub_rect->type) { case AVSubtitleType::SUBTITLE_TEXT: @@ -199,7 +199,7 @@ auto Subtitle::generateImage() const -> QImage | QPainter::TextAntialiasing | QPainter::SmoothPixmapTransform); for (const auto &data : std::as_const(d_ptr->assList)) { auto rect = data.rect(); - QImage image((uchar *) data.rgba().constData(), + QImage image(reinterpret_cast(data.rgba().constData()), rect.width(), rect.height(), QImage::Format_RGBA8888); diff --git a/ffmpeg/subtitle/ass.cc b/ffmpeg/subtitle/ass.cc index bd0a0eb..817c05c 100644 --- a/ffmpeg/subtitle/ass.cc +++ b/ffmpeg/subtitle/ass.cc @@ -38,7 +38,7 @@ void print_font_providers(ASS_Library *ass_library) size_t providers_size = 0; ass_get_available_font_providers(ass_library, &providers, &providers_size); qDebug("Available font providers (%zu): ", providers_size); - for (int i = 0; i < int(providers_size); i++) { + for (int i = 0; i < static_cast(providers_size); i++) { qDebug() << font_provider_maps[providers[i]]; } free(providers); @@ -52,8 +52,8 @@ class Ass::AssPrivate { qInfo() << "ass_library_version: " << ass_library_version(); - print_font_providers(ass_library); ass_library = ass_library_init(); + print_font_providers(ass_library); ass_set_message_cb(ass_library, msg_callback, nullptr); ass_set_extract_fonts(ass_library, 1); @@ -93,7 +93,7 @@ Ass::~Ass() = default; void Ass::init(uint8_t *extradata, int extradata_size) { - ass_process_codec_private(d_ptr->acc_track, (char *) extradata, extradata_size); + ass_process_codec_private(d_ptr->acc_track, reinterpret_cast(extradata), extradata_size); for (int i = 0; i < d_ptr->acc_track->n_events; ++i) { d_ptr->acc_track->events[i].ReadOrder = i; } @@ -109,7 +109,7 @@ void Ass::setWindowSize(const QSize &size) void Ass::setFont(const QString &fontFamily) { ass_set_fonts(d_ptr->ass_renderer, - NULL, + nullptr, fontFamily.toStdString().c_str(), ASS_FONTPROVIDER_AUTODETECT, nullptr, @@ -121,7 +121,7 @@ void Ass::addFont(const QByteArray &name, const QByteArray &data) ass_add_font(d_ptr->ass_library, const_cast(name.constData()), const_cast(data.constData()), - data.size()); + static_cast(data.size())); } void Ass::addSubtitleEvent(const QByteArray &data) @@ -129,7 +129,9 @@ void Ass::addSubtitleEvent(const QByteArray &data) if (data.isEmpty()) { return; } - ass_process_data(d_ptr->acc_track, (char *) data.constData(), data.size()); + ass_process_data(d_ptr->acc_track, + const_cast(data.constData()), + static_cast(data.size())); } void Ass::addSubtitleEvent(const QByteArray &data, qint64 pts, qint64 duration) @@ -149,8 +151,8 @@ void Ass::addSubtitleEvent(const QByteArray &data, qint64 pts, qint64 duration) void Ass::addSubtitleChunk(const QByteArray &data, qint64 pts, qint64 duration) { ass_process_chunk(d_ptr->acc_track, - (char *) data.constData(), - data.size(), + const_cast(data.constData()), + static_cast(data.size()), pts / d_ptr->microToMillon, duration / d_ptr->microToMillon); } @@ -158,11 +160,11 @@ void Ass::addSubtitleChunk(const QByteArray &data, qint64 pts, qint64 duration) void Ass::getRGBAData(AssDataInfoList &list, qint64 pts) { int ch; - auto img = ass_render_frame(d_ptr->ass_renderer, - d_ptr->acc_track, - pts / d_ptr->microToMillon, - &ch); - while (img) { + auto *img = ass_render_frame(d_ptr->ass_renderer, + d_ptr->acc_track, + pts / d_ptr->microToMillon, + &ch); + while (img != nullptr) { auto rect = QRect(img->dst_x, img->dst_y, img->w, img->h); auto rgba = QByteArray(img->w * img->h * sizeof(uint32_t), Qt::Uninitialized); @@ -171,7 +173,7 @@ void Ass::getRGBAData(AssDataInfoList &list, qint64 pts) const quint8 b = img->color >> 8; const quint8 a = ~img->color & 0xFF; - auto data = reinterpret_cast(rgba.data()); + auto *data = reinterpret_cast(rgba.data()); for (int y = 0; y < img->h; y++) { const int offsetI = y * img->stride; const int offsetB = y * img->w; diff --git a/ffmpeg/subtitle/ass.hpp b/ffmpeg/subtitle/ass.hpp index f911fdd..bfa2887 100644 --- a/ffmpeg/subtitle/ass.hpp +++ b/ffmpeg/subtitle/ass.hpp @@ -12,7 +12,7 @@ class Ass : public QObject Q_OBJECT public: explicit Ass(QObject *parent = nullptr); - ~Ass(); + ~Ass() override; void init(uint8_t *extradata, int extradata_size); diff --git a/ffmpeg/subtitledecoder.cpp b/ffmpeg/subtitledecoder.cpp index 0b1888d..33823dd 100644 --- a/ffmpeg/subtitledecoder.cpp +++ b/ffmpeg/subtitledecoder.cpp @@ -20,14 +20,14 @@ class SubtitleDecoder::SubtitleDecoderPrivate decoderSubtitleFrame = new SubtitleDisplay(q_ptr); } - void processEvent() + void processEvent() const { - while (q_ptr->m_runing.load() && q_ptr->m_eventQueue.size() > 0) { + while (q_ptr->m_runing.load() && !q_ptr->m_eventQueue.empty()) { auto eventPtr = q_ptr->m_eventQueue.take(); switch (eventPtr->type()) { case Event::EventType::Pause: decoderSubtitleFrame->addEvent(eventPtr); break; case Event::EventType::Seek: { - auto seekEvent = static_cast(eventPtr.data()); + auto *seekEvent = static_cast(eventPtr.data()); seekEvent->countDown(); q_ptr->clear(); decoderSubtitleFrame->addEvent(eventPtr); @@ -82,7 +82,7 @@ void SubtitleDecoder::runDecoder() calculatePts(packetPtr.data(), m_contextInfo); subtitlePtr->setDefault(packetPtr->pts(), packetPtr->duration(), - (const char *) packetPtr->avPacket()->data); + reinterpret_cast(packetPtr->avPacket()->data)); d_ptr->decoderSubtitleFrame->append(subtitlePtr); } diff --git a/ffmpeg/subtitledisplay.cc b/ffmpeg/subtitledisplay.cc index 32b8567..fe2511e 100644 --- a/ffmpeg/subtitledisplay.cc +++ b/ffmpeg/subtitledisplay.cc @@ -31,19 +31,19 @@ class SubtitleDisplay::SubtitleDisplayPrivate void renderFrame(const QSharedPointer &subtitlePtr) { QMutexLocker locker(&mutex_render); - for (auto render : videoRenders) { + for (auto *render : videoRenders) { render->setSubTitleFrame(subtitlePtr); } } - void processEvent(Ass *ass, bool &firstFrame) + void processEvent(Ass *ass, bool &firstFrame) const { - while (q_ptr->m_runing.load() && q_ptr->m_eventQueue.size() > 0) { + while (q_ptr->m_runing.load() && !q_ptr->m_eventQueue.empty()) { qDebug() << "DecoderSubtitleFrame::processEvent"; auto eventPtr = q_ptr->m_eventQueue.take(); switch (eventPtr->type()) { case Event::EventType::Pause: { - auto pauseEvent = static_cast(eventPtr.data()); + auto *pauseEvent = static_cast(eventPtr.data()); auto paused = pauseEvent->paused(); clock->setPaused(paused); } break; @@ -96,9 +96,9 @@ void SubtitleDisplay::setVideoRenders(const QVector &videoRenders void SubtitleDisplay::runDecoder() { quint64 dropNum = 0; - auto ctx = m_contextInfo->codecCtx()->avCodecCtx(); + auto *ctx = m_contextInfo->codecCtx()->avCodecCtx(); QScopedPointer assPtr(new Ass); - if (ctx->subtitle_header) { + if (ctx->subtitle_header != nullptr) { assPtr->init(ctx->subtitle_header, ctx->subtitle_header_size); } assPtr->setWindowSize(d_ptr->videoResolutionRatio); @@ -110,7 +110,8 @@ void SubtitleDisplay::runDecoder() auto subtitlePtr(m_queue.take()); if (subtitlePtr.isNull()) { continue; - } else if (!firstFrame) { + } + if (!firstFrame) { qDebug() << "Subtitle firstFrame: " << QTime::fromMSecsSinceStartOfDay(subtitlePtr->pts() / 1000) .toString("hh:mm:ss.zzz"); diff --git a/ffmpeg/subtitledisplay.hpp b/ffmpeg/subtitledisplay.hpp index 8ae7afc..b416b6a 100644 --- a/ffmpeg/subtitledisplay.hpp +++ b/ffmpeg/subtitledisplay.hpp @@ -13,7 +13,7 @@ class SubtitleDisplay : public Decoder { public: explicit SubtitleDisplay(QObject *parent = nullptr); - ~SubtitleDisplay(); + ~SubtitleDisplay() override; void setVideoResolutionRatio(const QSize &size); diff --git a/ffmpeg/transcode.cc b/ffmpeg/transcode.cc index 47c9abe..3f33036 100644 --- a/ffmpeg/transcode.cc +++ b/ffmpeg/transcode.cc @@ -1,5 +1,6 @@ #include "transcode.hpp" #include "audiofifo.hpp" +#include "audioframeconverter.h" #include "avcontextinfo.h" #include "averrormanager.hpp" #include "codeccontext.h" @@ -64,9 +65,10 @@ auto init_filter(TranscodeContext *transcodeContext, const char *filter_spec, Fr reinterpret_cast(&enc_ctx->sample_fmt), sizeof(enc_ctx->sample_fmt), AV_OPT_SEARCH_CHILDREN); - char buf[64] = {0}; - av_channel_layout_describe(&enc_ctx->ch_layout, buf, sizeof(buf)); - av_opt_set(avFilterContext, "ch_layouts", buf, AV_OPT_SEARCH_CHILDREN); + av_opt_set(avFilterContext, + "ch_layouts", + getAVChannelLayoutDescribe(enc_ctx->ch_layout).toUtf8().data(), + AV_OPT_SEARCH_CHILDREN); } break; default: return false; } @@ -110,7 +112,9 @@ class Transcode::TranscodePrivate case AVMEDIA_TYPE_AUDIO: case AVMEDIA_TYPE_VIDEO: case AVMEDIA_TYPE_SUBTITLE: contextInfoPtr.reset(new AVContextInfo); break; - default: return false; + default: + qWarning() << "Unsupported codec type: " << av_get_media_type_string(codec_type); + return false; } if (!setInMediaIndex(contextInfoPtr.data(), i)) { return false; @@ -257,7 +261,7 @@ class Transcode::TranscodePrivate init_filter(transcodeCtx, filter_spec.toLocal8Bit().constData(), frame); } - void initAudioFifo() + void initAudioFifo() const { auto stream_num = inFormatContext->streams(); for (int i = 0; i < stream_num; i++) { @@ -290,11 +294,11 @@ class Transcode::TranscodePrivate reset(); } - auto filterEncodeWriteframe(Frame *frame, uint stream_index) -> bool + auto filterEncodeWriteframe(Frame *frame, uint stream_index) const -> bool { auto *transcodeCtx = transcodeContexts.at(stream_index); auto framePtrs = transcodeCtx->filterPtr->filterFrame(frame); - for (auto framePtr : framePtrs) { + for (const auto &framePtr : framePtrs) { framePtr->setPictType(AV_PICTURE_TYPE_NONE); if (transcodeCtx->audioFifoPtr.isNull()) { encodeWriteFrame(stream_index, 0, framePtr); @@ -305,7 +309,9 @@ class Transcode::TranscodePrivate return true; } - void fliterAudioFifo(uint stream_index, QSharedPointer framePtr, bool finish = false) + void fliterAudioFifo(uint stream_index, + const QSharedPointer &framePtr, + bool finish = false) const { //qDebug() << "old: " << stream_index << frame->avFrame()->pts; if (!framePtr.isNull()) { @@ -320,7 +326,7 @@ class Transcode::TranscodePrivate } } - auto addSamplesToFifo(Frame *frame, uint stream_index) -> bool + auto addSamplesToFifo(Frame *frame, uint stream_index) const -> bool { auto *transcodeCtx = transcodeContexts.at(stream_index); auto audioFifoPtr = transcodeCtx->audioFifoPtr; @@ -339,7 +345,8 @@ class Transcode::TranscodePrivate frame->avFrame()->nb_samples); } - auto takeSamplesFromFifo(uint stream_index, bool finished = false) -> QSharedPointer + auto takeSamplesFromFifo(uint stream_index, bool finished = false) const + -> QSharedPointer { auto *transcodeCtx = transcodeContexts.at(stream_index); auto audioFifoPtr = transcodeCtx->audioFifoPtr; @@ -372,7 +379,8 @@ class Transcode::TranscodePrivate return framePtr; } - auto encodeWriteFrame(uint stream_index, int flush, QSharedPointer framePtr) -> bool + auto encodeWriteFrame(uint stream_index, int flush, const QSharedPointer &framePtr) const + -> bool { auto *transcodeCtx = transcodeContexts.at(stream_index); std::vector packetPtrs{}; @@ -392,7 +400,7 @@ class Transcode::TranscodePrivate return true; } - auto flushEncoder(uint stream_index) -> bool + auto flushEncoder(uint stream_index) const -> bool { auto *codecCtx = transcodeContexts.at(stream_index)->encContextInfoPtr->codecCtx()->avCodecCtx(); @@ -402,7 +410,7 @@ class Transcode::TranscodePrivate return encodeWriteFrame(stream_index, 1, nullptr); } - auto setInMediaIndex(AVContextInfo *contextInfo, int index) -> bool + auto setInMediaIndex(AVContextInfo *contextInfo, int index) const -> bool { contextInfo->setIndex(index); contextInfo->setStream(inFormatContext->stream(index)); @@ -643,7 +651,7 @@ void Transcode::run() qDebug() << "Finish Transcoding: " << timer.elapsed() / 1000.0 / 60.0; } -void Transcode::buildConnect() +void Transcode::buildConnect() const { connect(AVErrorManager::instance(), &AVErrorManager::error, this, &Transcode::error); } diff --git a/ffmpeg/transcode.hpp b/ffmpeg/transcode.hpp index 7d49a67..4d66d1c 100644 --- a/ffmpeg/transcode.hpp +++ b/ffmpeg/transcode.hpp @@ -64,7 +64,7 @@ class FFMPEG_EXPORT Transcode : public QThread void run() override; private: - void buildConnect(); + void buildConnect() const; void loop(); class TranscodePrivate; diff --git a/ffmpeg/videodecoder.cpp b/ffmpeg/videodecoder.cpp index 9f0de5b..826f444 100644 --- a/ffmpeg/videodecoder.cpp +++ b/ffmpeg/videodecoder.cpp @@ -19,14 +19,14 @@ class VideoDecoder::VideoDecoderPrivate decoderVideoFrame = new VideoDisplay(q_ptr); } - void processEvent() + void processEvent() const { - while (q_ptr->m_runing.load() && q_ptr->m_eventQueue.size() > 0) { + while (q_ptr->m_runing.load() && !q_ptr->m_eventQueue.empty()) { auto eventPtr = q_ptr->m_eventQueue.take(); switch (eventPtr->type()) { case Event::EventType::Pause: decoderVideoFrame->addEvent(eventPtr); break; case Event::EventType::Seek: { - auto seekEvent = static_cast(eventPtr.data()); + auto *seekEvent = static_cast(eventPtr.data()); seekEvent->countDown(); q_ptr->clear(); decoderVideoFrame->addEvent(eventPtr); diff --git a/ffmpeg/videodisplay.cc b/ffmpeg/videodisplay.cc index 62eb335..ff653b0 100644 --- a/ffmpeg/videodisplay.cc +++ b/ffmpeg/videodisplay.cc @@ -27,19 +27,19 @@ class VideoDisplay::VideoDisplayPrivate void renderFrame(const QSharedPointer &framePtr) { QMutexLocker locker(&mutex_render); - for (auto render : videoRenders) { + for (auto *render : videoRenders) { render->setFrame(framePtr); } } - void processEvent(bool &firstFrame) + void processEvent(bool &firstFrame) const { - while (q_ptr->m_runing.load() && q_ptr->m_eventQueue.size() > 0) { + while (q_ptr->m_runing.load() && !q_ptr->m_eventQueue.empty()) { qDebug() << "DecoderVideoFrame::processEvent"; auto eventPtr = q_ptr->m_eventQueue.take(); switch (eventPtr->type()) { case Event::EventType::Pause: { - auto pauseEvent = static_cast(eventPtr.data()); + auto *pauseEvent = static_cast(eventPtr.data()); auto paused = pauseEvent->paused(); clock->setPaused(paused); } break; @@ -86,7 +86,7 @@ void VideoDisplay::setMasterClock() void VideoDisplay::runDecoder() { - for (auto render : d_ptr->videoRenders) { + for (auto *render : d_ptr->videoRenders) { render->resetFps(); } quint64 dropNum = 0; @@ -97,7 +97,8 @@ void VideoDisplay::runDecoder() auto framePtr(m_queue.take()); if (framePtr.isNull()) { continue; - } else if (!firstFrame) { + } + if (!firstFrame) { qDebug() << "Video firstFrame: " << QTime::fromMSecsSinceStartOfDay(framePtr->pts() / 1000) .toString("hh:mm:ss.zzz"); diff --git a/ffmpeg/videoframeconverter.cc b/ffmpeg/videoframeconverter.cc index 26635bc..f751ccb 100644 --- a/ffmpeg/videoframeconverter.cc +++ b/ffmpeg/videoframeconverter.cc @@ -18,20 +18,20 @@ namespace Ffmpeg { class VideoFrameConverter::VideoFrameConverterPrivate { public: - VideoFrameConverterPrivate(VideoFrameConverter *q) + explicit VideoFrameConverterPrivate(VideoFrameConverter *q) : q_ptr(q) {} - inline void debugMessage() + inline void debugMessage() const { #ifndef QT_NO_DEBUG auto support_in = sws_isSupportedInput(src_pix_fmt); auto support_out = sws_isSupportedOutput(dst_pix_fmt); - if (!support_in) { + if (support_in == 0) { qInfo() << QString("support src_pix_fmt: %1 %2") .arg(QString::number(src_pix_fmt), QString::number(support_in)); } - if (!support_out) { + if (support_out == 0) { qInfo() << QString("support dst_pix_fmt: %1 %2") .arg(QString::number(dst_pix_fmt), QString::number(support_out)); } @@ -159,12 +159,12 @@ auto VideoFrameConverter::scale(Frame *in, Frame *out) -> int auto VideoFrameConverter::isSupportedInput_pix_fmt(AVPixelFormat pix_fmt) -> bool { - return sws_isSupportedInput(pix_fmt); + return sws_isSupportedInput(pix_fmt) != 0; } auto VideoFrameConverter::isSupportedOutput_pix_fmt(AVPixelFormat pix_fmt) -> bool { - return sws_isSupportedOutput(pix_fmt); + return sws_isSupportedOutput(pix_fmt) != 0; } } // namespace Ffmpeg diff --git a/ffmpeg/videorender/openglshader.cc b/ffmpeg/videorender/openglshader.cc index 0cd2467..7a502ed 100644 --- a/ffmpeg/videorender/openglshader.cc +++ b/ffmpeg/videorender/openglshader.cc @@ -24,7 +24,7 @@ class OpenglShader::OpenglShaderPrivate { auto *avFrame = frame->avFrame(); srcHdrMetaData = HdrMetaData(frame); - if (!srcHdrMetaData.maxLuma) { + if (srcHdrMetaData.maxLuma == 0.0f) { srcHdrMetaData.maxLuma = ShaderUtils::trcNomPeak(avFrame->color_trc) * MP_REF_WHITE; } dstColorTrc = avFrame->color_trc; diff --git a/ffmpeg/videorender/openglshaderprogram.cc b/ffmpeg/videorender/openglshaderprogram.cc index 60e14b8..f010531 100644 --- a/ffmpeg/videorender/openglshaderprogram.cc +++ b/ffmpeg/videorender/openglshaderprogram.cc @@ -29,8 +29,8 @@ OpenGLShaderProgram::~OpenGLShaderProgram() void OpenGLShaderProgram::initVertex(const QString &pos, const QString &texCord) { - auto posAttr = GLuint(attributeLocation(pos)); - auto texCordAttr = GLuint(attributeLocation(texCord)); + auto posAttr = attributeLocation(pos); + auto texCordAttr = attributeLocation(texCord); float vertices[] = { // positions // texture coords diff --git a/ffmpeg/videorender/shaderutils.cc b/ffmpeg/videorender/shaderutils.cc index 9b10a6d..761999f 100644 --- a/ffmpeg/videorender/shaderutils.cc +++ b/ffmpeg/videorender/shaderutils.cc @@ -8,16 +8,19 @@ namespace Ffmpeg::ShaderUtils { // Common constants for SMPTE ST.2084 (HDR) -static const float PQ_M1 = 2610. / 4096 * 1. / 4, PQ_M2 = 2523. / 4096 * 128, PQ_C1 = 3424. / 4096, - PQ_C2 = 2413. / 4096 * 32, PQ_C3 = 2392. / 4096 * 32; +static constexpr float PQ_M1 = 2610. / 4096 * 1. / 4, PQ_M2 = 2523. / 4096 * 128, + PQ_C1 = 3424. / 4096, PQ_C2 = 2413. / 4096 * 32, PQ_C3 = 2392. / 4096 * 32; // Common constants for ARIB STD-B67 (HLG) -static const float HLG_A = 0.17883277F, HLG_B = 0.28466892F, HLG_C = 0.55991073F; +static constexpr float HLG_A = 0.17883277F, HLG_B = 0.28466892F, HLG_C = 0.55991073F; + +static constexpr float SMPTEST2048_REF_WHITE = 10000.0; +static constexpr float ARIB_STD_B67_VALUE = 12.0; auto trcNomPeak(AVColorTransferCharacteristic colortTrc) -> float { switch (colortTrc) { - case AVCOL_TRC_SMPTEST2084: return static_cast(10000.0 / MP_REF_WHITE); - case AVCOL_TRC_ARIB_STD_B67: return static_cast(12.0 / MP_REF_WHITE_HLG); + case AVCOL_TRC_SMPTEST2084: return static_cast(SMPTEST2048_REF_WHITE / MP_REF_WHITE); + case AVCOL_TRC_ARIB_STD_B67: return static_cast(ARIB_STD_B67_VALUE / MP_REF_WHITE_HLG); default: break; } return 1.0; @@ -100,7 +103,7 @@ void passLinearize(QByteArray &frag, AVColorTransferCharacteristic colortTrc) temp.append(QString("color.rgb = pow(color.rgb, vec3(%1));\n").arg(1.0 / PQ_M1)); // PQ's output range is 0-10000, but we need it to be relative to // MP_REF_WHITE instead, so rescale - temp.append(QString("color.rgb *= vec3(%1);\n").arg(10000.0 / MP_REF_WHITE)); + temp.append(QString("color.rgb *= vec3(%1);\n").arg(SMPTEST2048_REF_WHITE / MP_REF_WHITE)); frag.append(temp.toUtf8()); } break; case AVCOL_TRC_SMPTE428: @@ -151,7 +154,7 @@ void passDeLinearize(QByteArray &frag, AVColorTransferCharacteristic colortTrc) " vec3(lessThanEqual(vec3(0.0031308), color.rgb)));\n"); break; case AVCOL_TRC_SMPTEST2084: { - auto temp = QString("color.rgb *= vec3(1.0/%1);\n").arg(10000.0 / MP_REF_WHITE); + auto temp = QString("color.rgb *= vec3(1.0/%1);\n").arg(SMPTEST2048_REF_WHITE / MP_REF_WHITE); temp.append(QString("color.rgb = pow(color.rgb, vec3(%1));\n").arg(PQ_M1)); temp.append( QString("color.rgb = (vec3(%1) + vec3(%2) * color.rgb) \n" @@ -216,7 +219,8 @@ void passOotf(QByteArray &frag, float peak, AVColorTransferCharacteristic colort case AVCOL_TRC_ARIB_STD_B67: { float gamma = qMax(1.0, 1.2 + 0.42 * log10(peak * MP_REF_WHITE / 1000.0)); auto temp = QString("color.rgb *= vec3(%1 * pow(dot(src_luma, color.rgb), %2));\n") - .arg(QString::number(peak / qPow(12.0 / MP_REF_WHITE_HLG, gamma)), + .arg(QString::number(peak + / qPow(ARIB_STD_B67_VALUE / MP_REF_WHITE_HLG, gamma)), QString::number(gamma - 1.0)); frag.append(temp.toUtf8()); } break; @@ -231,7 +235,7 @@ void passInverseOotf(QByteArray &frag, float peak, AVColorTransferCharacteristic case AVCOL_TRC_ARIB_STD_B67: { float gamma = qMax(1.0, 1.2 + 0.42 * log10(peak * MP_REF_WHITE / 1000.0)); auto temp = QString("color.rgb *= vec3(1.0/%1);\n") - .arg(peak / qPow(12.0 / MP_REF_WHITE_HLG, gamma)); + .arg(peak / qPow(ARIB_STD_B67_VALUE / MP_REF_WHITE_HLG, gamma)); temp.append(QString("color.rgb /= vec3(max(1e-6, pow(dot(src_luma, color.rgb), %1)));\n") .arg((gamma - 1.0) / gamma)); frag.append(temp.toUtf8()); diff --git a/ffmpeg/videorender/videopreviewwidget.cc b/ffmpeg/videorender/videopreviewwidget.cc index c51d31e..6181629 100644 --- a/ffmpeg/videorender/videopreviewwidget.cc +++ b/ffmpeg/videorender/videopreviewwidget.cc @@ -24,8 +24,7 @@ class PreviewTask : public QRunnable qint64 timestamp, int taskId, VideoPreviewWidget *videoPreviewWidget) - : QRunnable() - , m_filepath(filepath) + : m_filepath(filepath) , m_videoIndex(videoIndex) , m_timestamp(timestamp) , m_taskId(taskId) @@ -33,7 +32,7 @@ class PreviewTask : public QRunnable { setAutoDelete(true); } - ~PreviewTask() { m_runing = false; } + ~PreviewTask() override { m_runing = false; } void run() override { @@ -73,14 +72,14 @@ class PreviewTask : public QRunnable auto dstSize = QSize(framePtr->avFrame()->width, framePtr->avFrame()->height); if (m_videoPreviewWidgetPtr.isNull()) { return; - } else { - dstSize.scale(m_videoPreviewWidgetPtr->size() - * m_videoPreviewWidgetPtr->devicePixelRatio(), - Qt::KeepAspectRatio); } + dstSize.scale(m_videoPreviewWidgetPtr->size() + * m_videoPreviewWidgetPtr->devicePixelRatio(), + Qt::KeepAspectRatio); + auto dst_pix_fmt = AV_PIX_FMT_RGB32; QScopedPointer frameConverterPtr( - new VideoFrameConverter(videoInfo->codecCtx(), dstSize, dst_pix_fmt)); + new VideoFrameConverter(framePtr.data(), dstSize, dst_pix_fmt)); QSharedPointer frameRgbPtr(new Frame); frameRgbPtr->imageAlloc(dstSize, dst_pix_fmt); //frameConverterPtr->flush(framePtr.data(), dstSize); @@ -95,7 +94,7 @@ class PreviewTask : public QRunnable } } - FramePtr getKeyFrame(FormatContext *formatContext, AVContextInfo *videoInfo) + auto getKeyFrame(FormatContext *formatContext, AVContextInfo *videoInfo) -> FramePtr { FramePtr outPtr; PacketPtr packetPtr(new Packet); @@ -105,7 +104,7 @@ class PreviewTask : public QRunnable } if (!formatContext->checkPktPlayRange(packetPtr.get())) { } else if (packetPtr->streamIndex() == videoInfo->index() - && !(videoInfo->stream()->disposition & AV_DISPOSITION_ATTACHED_PIC) + && ((videoInfo->stream()->disposition & AV_DISPOSITION_ATTACHED_PIC) == 0) && packetPtr->isKey()) { auto framePtrs = videoInfo->decodeFrame(packetPtr); for (const auto &framePtr : framePtrs) { @@ -128,16 +127,16 @@ class PreviewTask : public QRunnable qint64 m_timestamp; int m_taskId = 0; QPointer m_videoPreviewWidgetPtr; - volatile bool m_runing = true; + std::atomic_bool m_runing = true; }; class VideoPreviewWidget::VideoPreviewWidgetPrivate { public: - VideoPreviewWidgetPrivate(QWidget *parent) - : owner(parent) + explicit VideoPreviewWidgetPrivate(VideoPreviewWidget *q) + : q_ptr(q) { - threadPool = new QThreadPool(owner); + threadPool = new QThreadPool(q_ptr); threadPool->setMaxThreadCount(2); } ~VideoPreviewWidgetPrivate() @@ -145,12 +144,12 @@ class VideoPreviewWidget::VideoPreviewWidgetPrivate qDebug() << "Task ID: " << taskId.loadRelaxed() << "Vaild Count: " << vaildCount; } - QWidget *owner; + QWidget *q_ptr; QImage image; qint64 timestamp; qint64 duration; - QSharedPointer frame; + QSharedPointer framePtr; QAtomicInt taskId = 0; qint64 vaildCount = 0; @@ -182,7 +181,7 @@ void VideoPreviewWidget::startPreview(const QString &filepath, d_ptr->timestamp = timestamp; d_ptr->duration = duration; d_ptr->image = QImage(); - d_ptr->frame.reset(); + d_ptr->framePtr.reset(); update(); } @@ -191,7 +190,7 @@ void VideoPreviewWidget::clearAllTask() d_ptr->threadPool->clear(); } -void VideoPreviewWidget::setDisplayImage(QSharedPointer frame, +void VideoPreviewWidget::setDisplayImage(const QSharedPointer &framePtr, const QImage &image, qint64 pts) { @@ -204,14 +203,14 @@ void VideoPreviewWidget::setDisplayImage(QSharedPointer frame, [=] { d_ptr->timestamp = pts; d_ptr->image = img; - d_ptr->frame = frame; + d_ptr->framePtr = framePtr; update(); ++d_ptr->vaildCount; }, Qt::QueuedConnection); } -int VideoPreviewWidget::currentTaskId() const +auto VideoPreviewWidget::currentTaskId() const -> int { return d_ptr->taskId.loadRelaxed(); } diff --git a/ffmpeg/videorender/videopreviewwidget.hpp b/ffmpeg/videorender/videopreviewwidget.hpp index 19fcd64..36afad8 100644 --- a/ffmpeg/videorender/videopreviewwidget.hpp +++ b/ffmpeg/videorender/videopreviewwidget.hpp @@ -19,7 +19,9 @@ class FFMPEG_EXPORT VideoPreviewWidget : public QWidget void startPreview(const QString &filepath, int videoIndex, qint64 timestamp, qint64 duration); void clearAllTask(); - void setDisplayImage(QSharedPointer frame, const QImage &image, qint64 pts); + void setDisplayImage(const QSharedPointer &framePtr, + const QImage &image, + qint64 pts); [[nodiscard]] auto currentTaskId() const -> int; diff --git a/ffmpeg/videorender/videorender.cc b/ffmpeg/videorender/videorender.cc index 5dff038..d317394 100644 --- a/ffmpeg/videorender/videorender.cc +++ b/ffmpeg/videorender/videorender.cc @@ -22,9 +22,9 @@ class VideoRender::VideoRenderPrivate ~VideoRenderPrivate() = default; - void flushFPS() { fpsPtr->update(); } + void flushFPS() const { fpsPtr->update(); } - void resetFps() { fpsPtr->reset(); } + void resetFps() const { fpsPtr->reset(); } QScopedPointer fpsPtr; }; @@ -33,11 +33,11 @@ VideoRender::VideoRender() : d_ptr(new VideoRenderPrivate) {} -VideoRender::~VideoRender() {} +VideoRender::~VideoRender() = default; void VideoRender::setFrame(QSharedPointer framePtr) { - auto avFrame = framePtr->avFrame(); + auto *avFrame = framePtr->avFrame(); if (avFrame->width <= 0 || avFrame->height <= 0) { return; }