4#ifndef QVIDEOFRAMECONVERSIONHELPER_P_H
5#define QVIDEOFRAMECONVERSIONHELPER_P_H
18#include <qvideoframe.h>
19#include <private/qsimd_p.h>
24typedef void (QT_FASTCALL *VideoFrameConvertFunc)(
const QVideoFrame &frame, uchar *output);
29void Q_MULTIMEDIA_EXPORT qCopyPixelsWithAlphaMask(uint32_t *dst,
32 QVideoFrameFormat::PixelFormat format,
35void Q_MULTIMEDIA_EXPORT qCopyPixelsWithMask(uint32_t *dst,
const uint32_t *src, size_t size, uint32_t mask);
37uint32_t Q_MULTIMEDIA_EXPORT qAlphaMask(QVideoFrameFormat::PixelFormat format);
39template<
int a,
int r,
int g,
int b>
45#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
46 return (((data >> (8*a)) & 0xff) << 24)
47 | (((data >> (8*r)) & 0xff) << 16)
48 | (((data >> (8*g)) & 0xff) << 8)
49 | ((data >> (8*b)) & 0xff);
51 return (((data >> (32-8*a)) & 0xff) << 24)
52 | (((data >> (32-8*r)) & 0xff) << 16)
53 | (((data >> (32-8*g)) & 0xff) << 8)
54 | ((data >> (32-8*b)) & 0xff);
59template<
int r,
int g,
int b>
65#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
67 | (((data >> (8*r)) & 0xff) << 16)
68 | (((data >> (8*g)) & 0xff) << 8)
69 | ((data >> (8*b)) & 0xff);
72 | (((data >> (32-8*r)) & 0xff) << 16)
73 | (((data >> (32-8*g)) & 0xff) << 8)
74 | ((data >> (32-8*b)) & 0xff);
86 uint y = (
data >> shift) & 0xff;
105#define FETCH_INFO_PACKED(frame)
106 const uchar *src = frame.bits(0
);
107 int stride = frame.bytesPerLine(0
);
108 int width = frame.width();
109 int height = frame.height();
111#define FETCH_INFO_BIPLANAR(frame)
112 const uchar *plane1 = frame.bits(0
);
113 const uchar *plane2 = frame.bits(1
);
114 int plane1Stride = frame.bytesPerLine(0
);
115 int plane2Stride = frame.bytesPerLine(1
);
116 int width = frame.width();
117 int height = frame.height();
119#define FETCH_INFO_TRIPLANAR(frame)
120 const uchar *plane1 = frame.bits(0
);
121 const uchar *plane2 = frame.bits(1
);
122 const uchar *plane3 = frame.bits(2
);
123 int plane1Stride = frame.bytesPerLine(0
);
124 int plane2Stride = frame.bytesPerLine(1
);
125 int plane3Stride = frame.bytesPerLine(2
);
126 int width = frame.width();
127 int height = frame.height();
129#define MERGE_LOOPS(width, height, stride, bpp)
130 if (stride == width * bpp) {
136#define QT_MEDIA_ALIGN(boundary, ptr, x, length)
137 for (; ((reinterpret_cast<qintptr>(ptr) & (boundary - 1
)) != 0
) && x < length; ++x)
uint QT_FASTCALL fetch1Pixel< QPixelLayout::BPP1LSB >(const uchar *src, int index)
VideoFrameConvertFunc qConverterForFormat(QVideoFrameFormat::PixelFormat format)
uint32_t qAlphaMask(QVideoFrameFormat::PixelFormat format)
static void planarYUV420_to_ARGB32(const uchar *y, int yStride, const uchar *u, int uStride, const uchar *v, int vStride, int uvPixelStride, quint32 *rgb, int width, int height)
static void planarYUV420_16bit_to_ARGB32(const uchar *y, int yStride, const uchar *u, int uStride, const uchar *v, int vStride, int uvPixelStride, quint32 *rgb, int width, int height)
static VideoFrameConvertFunc qConvertFuncs[QVideoFrameFormat::NPixelFormats]
static PixelsCopyFunc qPixelsCopyFunc
void qCopyPixelsWithMask(uint32_t *dst, const uint32_t *src, size_t size, uint32_t mask)
static std::once_flag InitFuncsAsmFlag
static void planarYUV422_to_ARGB32(const uchar *y, int yStride, const uchar *u, int uStride, const uchar *v, int vStride, int uvPixelStride, quint32 *rgb, int width, int height)
static void qInitFuncsAsm()
#define MERGE_LOOPS(width, height, stride, bpp)
#define FETCH_INFO_PACKED(frame)
#define FETCH_INFO_BIPLANAR(frame)
#define FETCH_INFO_TRIPLANAR(frame)
void(QT_FASTCALL * PixelsCopyFunc)(uint32_t *dst, const uint32_t *src, size_t size, uint32_t mask)
static constexpr uint shift