Revision control
Copy as Markdown
// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#ifndef QFFMPEGDEFS_P_H
#define QFFMPEGDEFS_P_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists purely as an
// implementation detail. This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//
#include "qtconfigmacros.h"
#include <limits>
#include <variant>
#include <QtCore/qglobal.h>
#include <QtCore/qdebug.h>
extern "C" {
#include <libavformat/avformat.h>
#include <libavcodec/avcodec.h>
#include <libswresample/swresample.h>
#include <libavutil/avutil.h>
#include <libswscale/swscale.h>
}
static_assert(LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(56, 70, 100),
"FFmpeg 4.4 or newer is required (libavutil >= 56.70)");
#define QT_FFMPEG_HAS_AV_CHANNEL_LAYOUT \
(LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(59, 24, 100)) // since FFmpeg n5.1
#define QT_FFMPEG_HAS_FRAME_TIME_BASE \
(LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(59, 18, 100)) // since FFmpeg n5.0
#define QT_FFMPEG_HAS_FRAME_DURATION \
(LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(60, 3, 100)) // since FFmpeg n6.0
#define QT_FFMPEG_STREAM_SIDE_DATA_DEPRECATED \
(LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(60, 15, 100)) // since FFmpeg n6.1
#define QT_FFMPEG_HAS_D3D12VA \
(LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(59, 8, 100)) // since FFmpeg n7.0
#define QT_FFMPEG_SWR_CONST_CH_LAYOUT \
(LIBSWRESAMPLE_VERSION_INT >= AV_VERSION_INT(4, 9, 100))
#define QT_FFMPEG_AVIO_WRITE_CONST \
(LIBAVFORMAT_VERSION_MAJOR >= 61)
#define QT_CODEC_PARAMETERS_HAVE_FRAMERATE \
(LIBAVCODEC_VERSION_INT >= AV_VERSION_INT(60, 11, 100)) // since FFmpeg n6.1
#define QT_FFMPEG_HAS_AVCODEC_GET_SUPPORTED_CONFIG \
(LIBAVUTIL_VERSION_INT >= AV_VERSION_INT(59, 39, 100)) // since FFmpeg n7.1
#define QT_FFMPEG_HAS_SWS_FLAGS_ENUM \
(LIBSWSCALE_VERSION_INT >= AV_VERSION_INT(9, 1, 100)) // since FFmpeg n8.0
QT_BEGIN_NAMESPACE
namespace QFFmpeg {
#if QT_FFMPEG_HAS_AV_CHANNEL_LAYOUT
using ChannelLayoutT = AVChannelLayout;
#else
using ChannelLayoutT = uint64_t;
#endif
#if !QT_FFMPEG_HAS_SWS_FLAGS_ENUM
using SwsFlags = int;
#endif
enum class AVScore : int {
BestAVScore = std::numeric_limits<int>::max(),
DefaultAVScore = 0,
NotSuitableAVScore = std::numeric_limits<int>::min(),
MinAVScore = std::numeric_limits<int>::min() + 1,
};
inline constexpr AVScore BestAVScore = AVScore::BestAVScore;
inline constexpr AVScore DefaultAVScore = AVScore::DefaultAVScore;
inline constexpr AVScore NotSuitableAVScore = AVScore::NotSuitableAVScore;
inline constexpr AVScore MinAVScore = AVScore::MinAVScore;
constexpr inline AVScore operator+(AVScore a, int b)
{
return AVScore(qToUnderlying(a) + b);
}
constexpr inline AVScore operator-(AVScore a, int b)
{
return AVScore(qToUnderlying(a) - b);
}
constexpr inline AVScore operator+(int a, AVScore b)
{
return AVScore(a + qToUnderlying(b));
}
constexpr inline AVScore operator-(int a, AVScore b)
{
return AVScore(a - qToUnderlying(b));
}
constexpr inline AVScore operator-(AVScore a, AVScore b)
{
return AVScore(qToUnderlying(a) - qToUnderlying(b));
}
constexpr inline AVScore &operator+=(AVScore &a, int b)
{
return a = a + b;
}
constexpr inline AVScore &operator-=(AVScore &a, int b)
{
return a = a - b;
}
constexpr AVScore operator-(const AVScore &d)
{
return AVScore(-qToUnderlying(d));
}
inline QDebug operator<<(QDebug dbg, AVScore score)
{
dbg << qToUnderlying(score);
return dbg;
}
using PixelOrSampleFormat = std::variant<AVPixelFormat, AVSampleFormat>;
namespace Literals {
constexpr AVScore operator""_avscore(unsigned long long arg)
{
return AVScore(arg);
}
} // namespace Literals
} // namespace QFFmpeg
QT_END_NAMESPACE
namespace std {
template <>
struct numeric_limits<QT_PREPEND_NAMESPACE(QFFmpeg)::AVScore>
{
using Type = QT_PREPEND_NAMESPACE(QFFmpeg)::AVScore;
constexpr static Type min() noexcept { return Type::NotSuitableAVScore; }
constexpr static Type max() noexcept { return Type::BestAVScore; }
};
} // namespace std
#ifndef AV_PROFILE_H264_HIGH
# define AV_PROFILE_H264_HIGH FF_PROFILE_H264_HIGH
#endif
#ifndef AV_PROFILE_HEVC_MAIN
# define AV_PROFILE_HEVC_MAIN FF_PROFILE_HEVC_MAIN
#endif
#endif // QFFMPEGDEFS_P_H