5#include <QtMultimedia/qvideoframeformat.h>
6#include <QtMultimedia/qvideoframe.h>
7#include <QtCore/qloggingcategory.h>
8#include <private/qvideotexturehelper_p.h>
11#include <libswscale/swscale.h>
27 switch (pixelFormat) {
30 return AV_PIX_FMT_NONE;
33 return AV_PIX_FMT_NONE;
39 return AV_PIX_FMT_YUV420P;
41 return AV_PIX_FMT_BGRA;
43 return AV_PIX_FMT_ARGB;
46 return AV_PIX_FMT_0RGB;
48 return AV_PIX_FMT_BGRA;
51 return AV_PIX_FMT_BGR0;
53 return AV_PIX_FMT_ABGR;
55 return AV_PIX_FMT_0BGR;
57 return AV_PIX_FMT_RGBA;
59 return AV_PIX_FMT_RGB0;
61 return AV_PIX_FMT_YUV422P;
63 return AV_PIX_FMT_YUV420P;
65 return AV_PIX_FMT_YUV420P10;
67 return AV_PIX_FMT_UYVY422;
69 return AV_PIX_FMT_YUYV422;
71 return AV_PIX_FMT_NV12;
73 return AV_PIX_FMT_NV21;
75 return AV_PIX_FMT_GRAY8;
77 return AV_PIX_FMT_GRAY16;
79 return AV_PIX_FMT_P010;
81 return AV_PIX_FMT_P016;
83 return AV_PIX_FMT_MEDIACODEC;
89 static constexpr int arraySize = 4;
90 std::array<uchar *, arraySize>
bits;
96 switch (
dst.pixelFormat()) {
100 {
dst.bytesPerLine(0),
dst.bytesPerLine(2),
dst.bytesPerLine(1), 0 } };
103 return { {
dst.bits(0),
dst.bits(1) +
dst.bytesPerLine(1) / 2,
dst.bits(1),
nullptr },
104 {
dst.bytesPerLine(0),
dst.bytesPerLine(1),
dst.bytesPerLine(1), 0 } };
107 return { {
dst.bits(0),
dst.bits(1),
dst.bits(1) +
dst.bytesPerLine(1) / 2,
nullptr },
108 {
dst.bytesPerLine(0),
dst.bytesPerLine(1),
dst.bytesPerLine(1), 0 } };
110 return { {
dst.bits(0),
dst.bits(1),
dst.bits(2),
nullptr },
111 {
dst.bytesPerLine(0),
dst.bytesPerLine(1),
dst.bytesPerLine(2), 0 } };
129 switch (colorSpace) {
132 return { SWS_CS_ITU709, 1 };
133 return { SWS_CS_ITU601, 0 };
135 return { SWS_CS_ITU709, avRange };
137 return { SWS_CS_ITU601, 1 };
139 return { SWS_CS_BT2020, avRange };
142 return { SWS_CS_DEFAULT, avRange };
154 SwsContext*
context = sws_getContext(
157 SWS_BILINEAR,
nullptr,
nullptr,
nullptr);
159 return {
context, &sws_freeContext };
169 constexpr int brightness = 0;
170 constexpr int contrast = 0;
171 constexpr int saturation = 0;
172 const int status = sws_setColorspaceDetails(
context,
173 sws_getCoefficients(
src.colorSpace),
src.colorRange,
174 sws_getCoefficients(
dst.colorSpace),
dst.colorRange,
175 brightness, contrast, saturation);
199 constexpr int firstSrcSliceRow = 0;
200 const int scaledHeight = sws_scale(
context,
201 srcData.bits.data(), srcData.stride.data(),
203 dstData.bits.data(), dstData.stride.data());
218 for (
const auto desc : { srcDesc, dstDesc }) {
219 for (
int i = 0;
i < desc->nplanes; ++
i) {
221 if (desc->sizeScale[
i].x != 1)
224 if (desc->sizeScale[
i].y != 1)
237 if (
src.size() != dstFormat.frameSize()) {
238 qCCritical(lc) <<
"Resizing is not supported";
243 const QSize size = adjustSize(
src.size(),
src.pixelFormat(), dstFormat.pixelFormat());
245 qCWarning(lc) <<
"Input truncated to even width/height";
247 const SwsContextUPtr conv = createConverter(
248 size,
src.pixelFormat(),
size, dstFormat.pixelFormat());
251 qCCritical(lc) <<
"Failed to create SW converter";
255 if (!setColorSpaceDetails(conv.get(),
src.surfaceFormat(), dstFormat)) {
256 qCCritical(lc) <<
"Failed to set color space details";
The QVideoFrame class represents a frame of video data.
Combined button and popup list for selecting options.
AVPixelFormat toAVPixelFormat(QVideoFrameFormat::PixelFormat pixelFormat)
SwsColorSpace toSwsColorSpace(QVideoFrameFormat::ColorRange colorRange, QVideoFrameFormat::ColorSpace colorSpace)
bool setColorSpaceDetails(SwsContext *context, const QVideoFrameFormat &srcFormat, const QVideoFrameFormat &dstFormat)
SwsFrameData getSwsData(QVideoFrame &dst)
QSize adjustSize(const QSize &size, PixelFormat srcFmt, PixelFormat dstFmt)
std::unique_ptr< SwsContext, decltype(&sws_freeContext)> SwsContextUPtr
SwsContextUPtr createConverter(const QSize &srcSize, PixelFormat srcPixFmt, const QSize &dstSize, PixelFormat dstPixFmt)
const TextureDescription * textureDescription(QVideoFrameFormat::PixelFormat format)
QVideoFrame convertFrame(QVideoFrame &src, const QVideoFrameFormat &dstFormat)
#define Q_LOGGING_CATEGORY(name,...)
#define qCCritical(category,...)
#define qCWarning(category,...)
GLenum GLint GLint GLint GLint GLuint GLenum GLint GLint GLint GLint GLsizei GLsizei srcHeight
GLenum GLuint GLintptr GLsizeiptr size
[1]
QT_BEGIN_NAMESPACE typedef uchar * output
std::array< uchar *, arraySize > bits
std::array< int, arraySize > stride