Coverage Report

Created: 2025-12-10 07:04

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/Simd/src/Simd/SimdSse41YuvToBgrV2.cpp
Line
Count
Source
1
/*
2
* Simd Library (http://ermig1979.github.io/Simd).
3
*
4
* Copyright (c) 2011-2023 Yermalayeu Ihar.
5
*
6
* Permission is hereby granted, free of charge, to any person obtaining a copy
7
* of this software and associated documentation files (the "Software"), to deal
8
* in the Software without restriction, including without limitation the rights
9
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
* copies of the Software, and to permit persons to whom the Software is
11
* furnished to do so, subject to the following conditions:
12
*
13
* The above copyright notice and this permission notice shall be included in
14
* all copies or substantial portions of the Software.
15
*
16
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
* SOFTWARE.
23
*/
24
#include "Simd/SimdMemory.h"
25
#include "Simd/SimdStore.h"
26
#include "Simd/SimdInterleave.h"
27
#include "Simd/SimdYuvToBgr.h"
28
29
namespace Simd
30
{
31
#ifdef SIMD_SSE41_ENABLE    
32
    namespace Sse41
33
    {
34
        template <bool align, class T> SIMD_YUV_TO_BGR_INLINE void YuvToBgrV2(__m128i y8, __m128i u8, __m128i v8, __m128i* bgr)
35
0
        {
36
0
            __m128i blue = YuvToBlue<T>(y8, u8);
37
0
            __m128i green = YuvToGreen<T>(y8, u8, v8);
38
0
            __m128i red = YuvToRed<T>(y8, v8);
39
0
            Store<align>(bgr + 0, InterleaveBgr<0>(blue, green, red));
40
0
            Store<align>(bgr + 1, InterleaveBgr<1>(blue, green, red));
41
0
            Store<align>(bgr + 2, InterleaveBgr<2>(blue, green, red));
42
0
        }
Unexecuted instantiation: void Simd::Sse41::YuvToBgrV2<true, Simd::Base::Bt601>(long long __vector(2), long long __vector(2), long long __vector(2), long long __vector(2)*)
Unexecuted instantiation: void Simd::Sse41::YuvToBgrV2<false, Simd::Base::Bt601>(long long __vector(2), long long __vector(2), long long __vector(2), long long __vector(2)*)
Unexecuted instantiation: void Simd::Sse41::YuvToBgrV2<true, Simd::Base::Bt709>(long long __vector(2), long long __vector(2), long long __vector(2), long long __vector(2)*)
Unexecuted instantiation: void Simd::Sse41::YuvToBgrV2<false, Simd::Base::Bt709>(long long __vector(2), long long __vector(2), long long __vector(2), long long __vector(2)*)
Unexecuted instantiation: void Simd::Sse41::YuvToBgrV2<true, Simd::Base::Bt2020>(long long __vector(2), long long __vector(2), long long __vector(2), long long __vector(2)*)
Unexecuted instantiation: void Simd::Sse41::YuvToBgrV2<false, Simd::Base::Bt2020>(long long __vector(2), long long __vector(2), long long __vector(2), long long __vector(2)*)
Unexecuted instantiation: void Simd::Sse41::YuvToBgrV2<true, Simd::Base::Trect871>(long long __vector(2), long long __vector(2), long long __vector(2), long long __vector(2)*)
Unexecuted instantiation: void Simd::Sse41::YuvToBgrV2<false, Simd::Base::Trect871>(long long __vector(2), long long __vector(2), long long __vector(2), long long __vector(2)*)
43
44
        template <bool align, class T> SIMD_INLINE void Yuv422pToBgrV2(const uint8_t* y, const __m128i& u, const __m128i& v,
45
            uint8_t* bgr)
46
0
        {
47
0
            YuvToBgrV2<align, T>(Load<align>((__m128i*)y + 0), _mm_unpacklo_epi8(u, u), _mm_unpacklo_epi8(v, v), (__m128i*)bgr + 0);
48
0
            YuvToBgrV2<align, T>(Load<align>((__m128i*)y + 1), _mm_unpackhi_epi8(u, u), _mm_unpackhi_epi8(v, v), (__m128i*)bgr + 3);
49
0
        }
Unexecuted instantiation: void Simd::Sse41::Yuv422pToBgrV2<true, Simd::Base::Bt601>(unsigned char const*, long long __vector(2) const&, long long __vector(2) const&, unsigned char*)
Unexecuted instantiation: void Simd::Sse41::Yuv422pToBgrV2<false, Simd::Base::Bt601>(unsigned char const*, long long __vector(2) const&, long long __vector(2) const&, unsigned char*)
Unexecuted instantiation: void Simd::Sse41::Yuv422pToBgrV2<true, Simd::Base::Bt709>(unsigned char const*, long long __vector(2) const&, long long __vector(2) const&, unsigned char*)
Unexecuted instantiation: void Simd::Sse41::Yuv422pToBgrV2<false, Simd::Base::Bt709>(unsigned char const*, long long __vector(2) const&, long long __vector(2) const&, unsigned char*)
Unexecuted instantiation: void Simd::Sse41::Yuv422pToBgrV2<true, Simd::Base::Bt2020>(unsigned char const*, long long __vector(2) const&, long long __vector(2) const&, unsigned char*)
Unexecuted instantiation: void Simd::Sse41::Yuv422pToBgrV2<false, Simd::Base::Bt2020>(unsigned char const*, long long __vector(2) const&, long long __vector(2) const&, unsigned char*)
Unexecuted instantiation: void Simd::Sse41::Yuv422pToBgrV2<true, Simd::Base::Trect871>(unsigned char const*, long long __vector(2) const&, long long __vector(2) const&, unsigned char*)
Unexecuted instantiation: void Simd::Sse41::Yuv422pToBgrV2<false, Simd::Base::Trect871>(unsigned char const*, long long __vector(2) const&, long long __vector(2) const&, unsigned char*)
50
51
        template <bool align, class T> void Yuv420pToBgrV2(const uint8_t* y, size_t yStride, const uint8_t* u, size_t uStride, const uint8_t* v, size_t vStride,
52
            size_t width, size_t height, uint8_t* bgr, size_t bgrStride)
53
0
        {
54
0
            assert((width % 2 == 0) && (height % 2 == 0) && (width >= DA) && (height >= 2));
55
0
            if (align)
56
0
            {
57
0
                assert(Aligned(y) && Aligned(yStride) && Aligned(u) && Aligned(uStride));
58
0
                assert(Aligned(v) && Aligned(vStride) && Aligned(bgr) && Aligned(bgrStride));
59
0
            }
60
61
0
            size_t bodyWidth = AlignLo(width, DA);
62
0
            size_t tail = width - bodyWidth;
63
0
            for (size_t row = 0; row < height; row += 2)
64
0
            {
65
0
                for (size_t colUV = 0, colY = 0, colBgr = 0; colY < bodyWidth; colY += DA, colUV += A, colBgr += A * 6)
66
0
                {
67
0
                    __m128i u_ = Load<align>((__m128i*)(u + colUV));
68
0
                    __m128i v_ = Load<align>((__m128i*)(v + colUV));
69
0
                    Yuv422pToBgrV2<align, T>(y + colY, u_, v_, bgr + colBgr);
70
0
                    Yuv422pToBgrV2<align, T>(y + colY + yStride, u_, v_, bgr + colBgr + bgrStride);
71
0
                }
72
0
                if (tail)
73
0
                {
74
0
                    size_t offset = width - DA;
75
0
                    __m128i u_ = Load<false>((__m128i*)(u + offset / 2));
76
0
                    __m128i v_ = Load<false>((__m128i*)(v + offset / 2));
77
0
                    Yuv422pToBgrV2<false, T>(y + offset, u_, v_, bgr + 3 * offset);
78
0
                    Yuv422pToBgrV2<false, T>(y + offset + yStride, u_, v_, bgr + 3 * offset + bgrStride);
79
0
                }
80
0
                y += 2 * yStride;
81
0
                u += uStride;
82
0
                v += vStride;
83
0
                bgr += 2 * bgrStride;
84
0
            }
85
0
        }
Unexecuted instantiation: void Simd::Sse41::Yuv420pToBgrV2<true, Simd::Base::Bt601>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
Unexecuted instantiation: void Simd::Sse41::Yuv420pToBgrV2<true, Simd::Base::Bt709>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
Unexecuted instantiation: void Simd::Sse41::Yuv420pToBgrV2<true, Simd::Base::Bt2020>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
Unexecuted instantiation: void Simd::Sse41::Yuv420pToBgrV2<true, Simd::Base::Trect871>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
Unexecuted instantiation: void Simd::Sse41::Yuv420pToBgrV2<false, Simd::Base::Bt601>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
Unexecuted instantiation: void Simd::Sse41::Yuv420pToBgrV2<false, Simd::Base::Bt709>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
Unexecuted instantiation: void Simd::Sse41::Yuv420pToBgrV2<false, Simd::Base::Bt2020>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
Unexecuted instantiation: void Simd::Sse41::Yuv420pToBgrV2<false, Simd::Base::Trect871>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
86
87
        template <bool align> void Yuv420pToBgrV2(const uint8_t* y, size_t yStride, const uint8_t* u, size_t uStride, const uint8_t* v, size_t vStride,
88
            size_t width, size_t height, uint8_t* bgr, size_t bgrStride, SimdYuvType yuvType)
89
0
        {
90
0
            switch (yuvType)
91
0
            {
92
0
            case SimdYuvBt601: Yuv420pToBgrV2<align, Base::Bt601>(y, yStride, u, uStride, v, vStride, width, height, bgr, bgrStride); break;
93
0
            case SimdYuvBt709: Yuv420pToBgrV2<align, Base::Bt709>(y, yStride, u, uStride, v, vStride, width, height, bgr, bgrStride); break;
94
0
            case SimdYuvBt2020: Yuv420pToBgrV2<align, Base::Bt2020>(y, yStride, u, uStride, v, vStride, width, height, bgr, bgrStride); break;
95
0
            case SimdYuvTrect871: Yuv420pToBgrV2<align, Base::Trect871>(y, yStride, u, uStride, v, vStride, width, height, bgr, bgrStride); break;
96
0
            default:
97
0
                assert(0);
98
0
            }
99
0
        }
Unexecuted instantiation: void Simd::Sse41::Yuv420pToBgrV2<true>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long, SimdYuvType)
Unexecuted instantiation: void Simd::Sse41::Yuv420pToBgrV2<false>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long, SimdYuvType)
100
101
        void Yuv420pToBgrV2(const uint8_t* y, size_t yStride, const uint8_t* u, size_t uStride, const uint8_t* v, size_t vStride,
102
            size_t width, size_t height, uint8_t* bgr, size_t bgrStride, SimdYuvType yuvType)
103
0
        {
104
0
            if (Aligned(y) && Aligned(yStride) && Aligned(u) && Aligned(uStride)
105
0
                && Aligned(v) && Aligned(vStride) && Aligned(bgr) && Aligned(bgrStride))
106
0
                Yuv420pToBgrV2<true>(y, yStride, u, uStride, v, vStride, width, height, bgr, bgrStride, yuvType);
107
0
            else
108
0
                Yuv420pToBgrV2<false>(y, yStride, u, uStride, v, vStride, width, height, bgr, bgrStride, yuvType);
109
0
        }
110
111
        //-------------------------------------------------------------------------------------------------
112
113
        template <bool align, class T> void Yuv422pToBgrV2(const uint8_t* y, size_t yStride, const uint8_t* u, size_t uStride, const uint8_t* v, size_t vStride,
114
            size_t width, size_t height, uint8_t* bgr, size_t bgrStride)
115
0
        {
116
0
            assert((width % 2 == 0) && (width >= DA));
117
0
            if (align)
118
0
            {
119
0
                assert(Aligned(y) && Aligned(yStride) && Aligned(u) && Aligned(uStride));
120
0
                assert(Aligned(v) && Aligned(vStride) && Aligned(bgr) && Aligned(bgrStride));
121
0
            }
122
123
0
            size_t bodyWidth = AlignLo(width, DA);
124
0
            size_t tail = width - bodyWidth;
125
0
            for (size_t row = 0; row < height; row += 1)
126
0
            {
127
0
                for (size_t colUV = 0, colY = 0, colBgr = 0; colY < bodyWidth; colY += DA, colUV += A, colBgr += A * 6)
128
0
                {
129
0
                    __m128i u_ = Load<align>((__m128i*)(u + colUV));
130
0
                    __m128i v_ = Load<align>((__m128i*)(v + colUV));
131
0
                    Yuv422pToBgrV2<align, T>(y + colY, u_, v_, bgr + colBgr);
132
0
                }
133
0
                if (tail)
134
0
                {
135
0
                    size_t offset = width - DA;
136
0
                    __m128i u_ = Load<false>((__m128i*)(u + offset / 2));
137
0
                    __m128i v_ = Load<false>((__m128i*)(v + offset / 2));
138
0
                    Yuv422pToBgrV2<false, T>(y + offset, u_, v_, bgr + 3 * offset);
139
0
                }
140
0
                y += yStride;
141
0
                u += uStride;
142
0
                v += vStride;
143
0
                bgr += bgrStride;
144
0
            }
145
0
        }
Unexecuted instantiation: void Simd::Sse41::Yuv422pToBgrV2<true, Simd::Base::Bt601>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
Unexecuted instantiation: void Simd::Sse41::Yuv422pToBgrV2<true, Simd::Base::Bt709>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
Unexecuted instantiation: void Simd::Sse41::Yuv422pToBgrV2<true, Simd::Base::Bt2020>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
Unexecuted instantiation: void Simd::Sse41::Yuv422pToBgrV2<true, Simd::Base::Trect871>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
Unexecuted instantiation: void Simd::Sse41::Yuv422pToBgrV2<false, Simd::Base::Bt601>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
Unexecuted instantiation: void Simd::Sse41::Yuv422pToBgrV2<false, Simd::Base::Bt709>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
Unexecuted instantiation: void Simd::Sse41::Yuv422pToBgrV2<false, Simd::Base::Bt2020>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
Unexecuted instantiation: void Simd::Sse41::Yuv422pToBgrV2<false, Simd::Base::Trect871>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
146
147
        template <bool align> void Yuv422pToBgrV2(const uint8_t* y, size_t yStride, const uint8_t* u, size_t uStride, const uint8_t* v, size_t vStride,
148
            size_t width, size_t height, uint8_t* bgr, size_t bgrStride, SimdYuvType yuvType)
149
0
        {
150
0
            switch (yuvType)
151
0
            {
152
0
            case SimdYuvBt601: Yuv422pToBgrV2<align, Base::Bt601>(y, yStride, u, uStride, v, vStride, width, height, bgr, bgrStride); break;
153
0
            case SimdYuvBt709: Yuv422pToBgrV2<align, Base::Bt709>(y, yStride, u, uStride, v, vStride, width, height, bgr, bgrStride); break;
154
0
            case SimdYuvBt2020: Yuv422pToBgrV2<align, Base::Bt2020>(y, yStride, u, uStride, v, vStride, width, height, bgr, bgrStride); break;
155
0
            case SimdYuvTrect871: Yuv422pToBgrV2<align, Base::Trect871>(y, yStride, u, uStride, v, vStride, width, height, bgr, bgrStride); break;
156
0
            default:
157
0
                assert(0);
158
0
            }
159
0
        }
Unexecuted instantiation: void Simd::Sse41::Yuv422pToBgrV2<true>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long, SimdYuvType)
Unexecuted instantiation: void Simd::Sse41::Yuv422pToBgrV2<false>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long, SimdYuvType)
160
161
        void Yuv422pToBgrV2(const uint8_t* y, size_t yStride, const uint8_t* u, size_t uStride, const uint8_t* v, size_t vStride,
162
            size_t width, size_t height, uint8_t* bgr, size_t bgrStride, SimdYuvType yuvType)
163
0
        {
164
0
            if (Aligned(y) && Aligned(yStride) && Aligned(u) && Aligned(uStride)
165
0
                && Aligned(v) && Aligned(vStride) && Aligned(bgr) && Aligned(bgrStride))
166
0
                Yuv422pToBgrV2<true>(y, yStride, u, uStride, v, vStride, width, height, bgr, bgrStride, yuvType);
167
0
            else
168
0
                Yuv422pToBgrV2<false>(y, yStride, u, uStride, v, vStride, width, height, bgr, bgrStride, yuvType);
169
0
        }
170
171
        //-------------------------------------------------------------------------------------------------
172
173
        template <bool align, class T> SIMD_INLINE void Yuv444pToBgrV2(const uint8_t* y, const uint8_t* u, const uint8_t* v, uint8_t* bgr)
174
0
        {
175
0
            YuvToBgrV2<align, T>(Load<align>((__m128i*)y), Load<align>((__m128i*)u), Load<align>((__m128i*)v), (__m128i*)bgr);
176
0
        }
Unexecuted instantiation: void Simd::Sse41::Yuv444pToBgrV2<true, Simd::Base::Bt601>(unsigned char const*, unsigned char const*, unsigned char const*, unsigned char*)
Unexecuted instantiation: void Simd::Sse41::Yuv444pToBgrV2<false, Simd::Base::Bt601>(unsigned char const*, unsigned char const*, unsigned char const*, unsigned char*)
Unexecuted instantiation: void Simd::Sse41::Yuv444pToBgrV2<true, Simd::Base::Bt709>(unsigned char const*, unsigned char const*, unsigned char const*, unsigned char*)
Unexecuted instantiation: void Simd::Sse41::Yuv444pToBgrV2<false, Simd::Base::Bt709>(unsigned char const*, unsigned char const*, unsigned char const*, unsigned char*)
Unexecuted instantiation: void Simd::Sse41::Yuv444pToBgrV2<true, Simd::Base::Bt2020>(unsigned char const*, unsigned char const*, unsigned char const*, unsigned char*)
Unexecuted instantiation: void Simd::Sse41::Yuv444pToBgrV2<false, Simd::Base::Bt2020>(unsigned char const*, unsigned char const*, unsigned char const*, unsigned char*)
Unexecuted instantiation: void Simd::Sse41::Yuv444pToBgrV2<true, Simd::Base::Trect871>(unsigned char const*, unsigned char const*, unsigned char const*, unsigned char*)
Unexecuted instantiation: void Simd::Sse41::Yuv444pToBgrV2<false, Simd::Base::Trect871>(unsigned char const*, unsigned char const*, unsigned char const*, unsigned char*)
177
178
        template <bool align, class T> void Yuv444pToBgrV2(const uint8_t* y, size_t yStride, const uint8_t* u, size_t uStride, const uint8_t* v, size_t vStride,
179
            size_t width, size_t height, uint8_t* bgr, size_t bgrStride)
180
0
        {
181
0
            if (align)
182
0
            {
183
0
                assert(Aligned(y) && Aligned(yStride) && Aligned(u) && Aligned(uStride));
184
0
                assert(Aligned(v) && Aligned(vStride) && Aligned(bgr) && Aligned(bgrStride));
185
0
            }
186
187
0
            size_t bodyWidth = AlignLo(width, A);
188
0
            size_t tail = width - bodyWidth;
189
0
            for (size_t row = 0; row < height; row += 1)
190
0
            {
191
0
                for (size_t col = 0, colBgr = 0; col < bodyWidth; col += A, colBgr += A * 3)
192
0
                    Yuv444pToBgrV2<align, T>(y + col, u + col, v + col, bgr + colBgr);
193
0
                if (tail)
194
0
                {
195
0
                    size_t offset = width - A;
196
0
                    Yuv444pToBgrV2<false, T>(y + offset, u + offset, v + offset, bgr + 3 * offset);
197
0
                }
198
0
                y += yStride;
199
0
                u += uStride;
200
0
                v += vStride;
201
0
                bgr += bgrStride;
202
0
            }
203
0
        }
Unexecuted instantiation: void Simd::Sse41::Yuv444pToBgrV2<true, Simd::Base::Bt601>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
Unexecuted instantiation: void Simd::Sse41::Yuv444pToBgrV2<true, Simd::Base::Bt709>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
Unexecuted instantiation: void Simd::Sse41::Yuv444pToBgrV2<true, Simd::Base::Bt2020>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
Unexecuted instantiation: void Simd::Sse41::Yuv444pToBgrV2<true, Simd::Base::Trect871>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
Unexecuted instantiation: void Simd::Sse41::Yuv444pToBgrV2<false, Simd::Base::Bt601>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
Unexecuted instantiation: void Simd::Sse41::Yuv444pToBgrV2<false, Simd::Base::Bt709>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
Unexecuted instantiation: void Simd::Sse41::Yuv444pToBgrV2<false, Simd::Base::Bt2020>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
Unexecuted instantiation: void Simd::Sse41::Yuv444pToBgrV2<false, Simd::Base::Trect871>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
204
205
        template <bool align> void Yuv444pToBgrV2(const uint8_t* y, size_t yStride, const uint8_t* u, size_t uStride, const uint8_t* v, size_t vStride,
206
            size_t width, size_t height, uint8_t* bgr, size_t bgrStride, SimdYuvType yuvType)
207
0
        {
208
0
            switch (yuvType)
209
0
            {
210
0
            case SimdYuvBt601: Yuv444pToBgrV2<align, Base::Bt601>(y, yStride, u, uStride, v, vStride, width, height, bgr, bgrStride); break;
211
0
            case SimdYuvBt709: Yuv444pToBgrV2<align, Base::Bt709>(y, yStride, u, uStride, v, vStride, width, height, bgr, bgrStride); break;
212
0
            case SimdYuvBt2020: Yuv444pToBgrV2<align, Base::Bt2020>(y, yStride, u, uStride, v, vStride, width, height, bgr, bgrStride); break;
213
0
            case SimdYuvTrect871: Yuv444pToBgrV2<align, Base::Trect871>(y, yStride, u, uStride, v, vStride, width, height, bgr, bgrStride); break;
214
0
            default:
215
0
                assert(0);
216
0
            }
217
0
        }
Unexecuted instantiation: void Simd::Sse41::Yuv444pToBgrV2<true>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long, SimdYuvType)
Unexecuted instantiation: void Simd::Sse41::Yuv444pToBgrV2<false>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long, SimdYuvType)
218
219
        void Yuv444pToBgrV2(const uint8_t* y, size_t yStride, const uint8_t* u, size_t uStride, const uint8_t* v, size_t vStride,
220
            size_t width, size_t height, uint8_t* bgr, size_t bgrStride, SimdYuvType yuvType)
221
0
        {
222
0
            if (Aligned(y) && Aligned(yStride) && Aligned(u) && Aligned(uStride)
223
0
                && Aligned(v) && Aligned(vStride) && Aligned(bgr) && Aligned(bgrStride))
224
0
                Yuv444pToBgrV2<true>(y, yStride, u, uStride, v, vStride, width, height, bgr, bgrStride, yuvType);
225
0
            else
226
0
                Yuv444pToBgrV2<false>(y, yStride, u, uStride, v, vStride, width, height, bgr, bgrStride, yuvType);
227
0
        }
228
229
        //-------------------------------------------------------------------------------------------------
230
231
        template <bool align, class T> SIMD_YUV_TO_BGR_INLINE void YuvToRgbV2(__m128i y8, __m128i u8, __m128i v8, __m128i* rgb)
232
0
        {
233
0
            __m128i blue = YuvToBlue<T>(y8, u8);
234
0
            __m128i green = YuvToGreen<T>(y8, u8, v8);
235
0
            __m128i red = YuvToRed<T>(y8, v8);
236
0
            Store<align>(rgb + 0, InterleaveBgr<0>(red, green, blue));
237
0
            Store<align>(rgb + 1, InterleaveBgr<1>(red, green, blue));
238
0
            Store<align>(rgb + 2, InterleaveBgr<2>(red, green, blue));
239
0
        }
Unexecuted instantiation: void Simd::Sse41::YuvToRgbV2<true, Simd::Base::Bt601>(long long __vector(2), long long __vector(2), long long __vector(2), long long __vector(2)*)
Unexecuted instantiation: void Simd::Sse41::YuvToRgbV2<false, Simd::Base::Bt601>(long long __vector(2), long long __vector(2), long long __vector(2), long long __vector(2)*)
Unexecuted instantiation: void Simd::Sse41::YuvToRgbV2<true, Simd::Base::Bt709>(long long __vector(2), long long __vector(2), long long __vector(2), long long __vector(2)*)
Unexecuted instantiation: void Simd::Sse41::YuvToRgbV2<false, Simd::Base::Bt709>(long long __vector(2), long long __vector(2), long long __vector(2), long long __vector(2)*)
Unexecuted instantiation: void Simd::Sse41::YuvToRgbV2<true, Simd::Base::Bt2020>(long long __vector(2), long long __vector(2), long long __vector(2), long long __vector(2)*)
Unexecuted instantiation: void Simd::Sse41::YuvToRgbV2<false, Simd::Base::Bt2020>(long long __vector(2), long long __vector(2), long long __vector(2), long long __vector(2)*)
Unexecuted instantiation: void Simd::Sse41::YuvToRgbV2<true, Simd::Base::Trect871>(long long __vector(2), long long __vector(2), long long __vector(2), long long __vector(2)*)
Unexecuted instantiation: void Simd::Sse41::YuvToRgbV2<false, Simd::Base::Trect871>(long long __vector(2), long long __vector(2), long long __vector(2), long long __vector(2)*)
240
241
        template <bool align, class T> SIMD_INLINE void Yuv422pToRgbV2(const uint8_t* y, const __m128i& u, const __m128i& v,
242
            uint8_t* rgb)
243
0
        {
244
0
            YuvToRgbV2<align, T>(Load<align>((__m128i*)y + 0), _mm_unpacklo_epi8(u, u), _mm_unpacklo_epi8(v, v), (__m128i*)rgb + 0);
245
0
            YuvToRgbV2<align, T>(Load<align>((__m128i*)y + 1), _mm_unpackhi_epi8(u, u), _mm_unpackhi_epi8(v, v), (__m128i*)rgb + 3);
246
0
        }
Unexecuted instantiation: void Simd::Sse41::Yuv422pToRgbV2<true, Simd::Base::Bt601>(unsigned char const*, long long __vector(2) const&, long long __vector(2) const&, unsigned char*)
Unexecuted instantiation: void Simd::Sse41::Yuv422pToRgbV2<false, Simd::Base::Bt601>(unsigned char const*, long long __vector(2) const&, long long __vector(2) const&, unsigned char*)
Unexecuted instantiation: void Simd::Sse41::Yuv422pToRgbV2<true, Simd::Base::Bt709>(unsigned char const*, long long __vector(2) const&, long long __vector(2) const&, unsigned char*)
Unexecuted instantiation: void Simd::Sse41::Yuv422pToRgbV2<false, Simd::Base::Bt709>(unsigned char const*, long long __vector(2) const&, long long __vector(2) const&, unsigned char*)
Unexecuted instantiation: void Simd::Sse41::Yuv422pToRgbV2<true, Simd::Base::Bt2020>(unsigned char const*, long long __vector(2) const&, long long __vector(2) const&, unsigned char*)
Unexecuted instantiation: void Simd::Sse41::Yuv422pToRgbV2<false, Simd::Base::Bt2020>(unsigned char const*, long long __vector(2) const&, long long __vector(2) const&, unsigned char*)
Unexecuted instantiation: void Simd::Sse41::Yuv422pToRgbV2<true, Simd::Base::Trect871>(unsigned char const*, long long __vector(2) const&, long long __vector(2) const&, unsigned char*)
Unexecuted instantiation: void Simd::Sse41::Yuv422pToRgbV2<false, Simd::Base::Trect871>(unsigned char const*, long long __vector(2) const&, long long __vector(2) const&, unsigned char*)
247
248
        template <bool align, class T> void Yuv420pToRgbV2(const uint8_t* y, size_t yStride, const uint8_t* u, size_t uStride, const uint8_t* v, size_t vStride,
249
            size_t width, size_t height, uint8_t* rgb, size_t rgbStride)
250
0
        {
251
0
            assert((width % 2 == 0) && (height % 2 == 0) && (width >= DA) && (height >= 2));
252
0
            if (align)
253
0
            {
254
0
                assert(Aligned(y) && Aligned(yStride) && Aligned(u) && Aligned(uStride));
255
0
                assert(Aligned(v) && Aligned(vStride) && Aligned(rgb) && Aligned(rgbStride));
256
0
            }
257
258
0
            size_t bodyWidth = AlignLo(width, DA);
259
0
            size_t tail = width - bodyWidth;
260
0
            for (size_t row = 0; row < height; row += 2)
261
0
            {
262
0
                for (size_t colUV = 0, colY = 0, colRgb = 0; colY < bodyWidth; colY += DA, colUV += A, colRgb += A * 6)
263
0
                {
264
0
                    __m128i u_ = Load<align>((__m128i*)(u + colUV));
265
0
                    __m128i v_ = Load<align>((__m128i*)(v + colUV));
266
0
                    Yuv422pToRgbV2<align, T>(y + colY, u_, v_, rgb + colRgb);
267
0
                    Yuv422pToRgbV2<align, T>(y + colY + yStride, u_, v_, rgb + colRgb + rgbStride);
268
0
                }
269
0
                if (tail)
270
0
                {
271
0
                    size_t offset = width - DA;
272
0
                    __m128i u_ = Load<false>((__m128i*)(u + offset / 2));
273
0
                    __m128i v_ = Load<false>((__m128i*)(v + offset / 2));
274
0
                    Yuv422pToRgbV2<false, T>(y + offset, u_, v_, rgb + 3 * offset);
275
0
                    Yuv422pToRgbV2<false, T>(y + offset + yStride, u_, v_, rgb + 3 * offset + rgbStride);
276
0
                }
277
0
                y += 2 * yStride;
278
0
                u += uStride;
279
0
                v += vStride;
280
0
                rgb += 2 * rgbStride;
281
0
            }
282
0
        }
Unexecuted instantiation: void Simd::Sse41::Yuv420pToRgbV2<true, Simd::Base::Bt601>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
Unexecuted instantiation: void Simd::Sse41::Yuv420pToRgbV2<true, Simd::Base::Bt709>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
Unexecuted instantiation: void Simd::Sse41::Yuv420pToRgbV2<true, Simd::Base::Bt2020>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
Unexecuted instantiation: void Simd::Sse41::Yuv420pToRgbV2<true, Simd::Base::Trect871>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
Unexecuted instantiation: void Simd::Sse41::Yuv420pToRgbV2<false, Simd::Base::Bt601>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
Unexecuted instantiation: void Simd::Sse41::Yuv420pToRgbV2<false, Simd::Base::Bt709>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
Unexecuted instantiation: void Simd::Sse41::Yuv420pToRgbV2<false, Simd::Base::Bt2020>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
Unexecuted instantiation: void Simd::Sse41::Yuv420pToRgbV2<false, Simd::Base::Trect871>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
283
284
        template <bool align> void Yuv420pToRgbV2(const uint8_t* y, size_t yStride, const uint8_t* u, size_t uStride, const uint8_t* v, size_t vStride,
285
            size_t width, size_t height, uint8_t* rgb, size_t rgbStride, SimdYuvType yuvType)
286
0
        {
287
0
            switch (yuvType)
288
0
            {
289
0
            case SimdYuvBt601: Yuv420pToRgbV2<align, Base::Bt601>(y, yStride, u, uStride, v, vStride, width, height, rgb, rgbStride); break;
290
0
            case SimdYuvBt709: Yuv420pToRgbV2<align, Base::Bt709>(y, yStride, u, uStride, v, vStride, width, height, rgb, rgbStride); break;
291
0
            case SimdYuvBt2020: Yuv420pToRgbV2<align, Base::Bt2020>(y, yStride, u, uStride, v, vStride, width, height, rgb, rgbStride); break;
292
0
            case SimdYuvTrect871: Yuv420pToRgbV2<align, Base::Trect871>(y, yStride, u, uStride, v, vStride, width, height, rgb, rgbStride); break;
293
0
            default:
294
0
                assert(0);
295
0
            }
296
0
        }
Unexecuted instantiation: void Simd::Sse41::Yuv420pToRgbV2<true>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long, SimdYuvType)
Unexecuted instantiation: void Simd::Sse41::Yuv420pToRgbV2<false>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long, SimdYuvType)
297
298
        void Yuv420pToRgbV2(const uint8_t* y, size_t yStride, const uint8_t* u, size_t uStride, const uint8_t* v, size_t vStride,
299
            size_t width, size_t height, uint8_t* rgb, size_t rgbStride, SimdYuvType yuvType)
300
0
        {
301
0
            if (Aligned(y) && Aligned(yStride) && Aligned(u) && Aligned(uStride)
302
0
                && Aligned(v) && Aligned(vStride) && Aligned(rgb) && Aligned(rgbStride))
303
0
                Yuv420pToRgbV2<true>(y, yStride, u, uStride, v, vStride, width, height, rgb, rgbStride, yuvType);
304
0
            else
305
0
                Yuv420pToRgbV2<false>(y, yStride, u, uStride, v, vStride, width, height, rgb, rgbStride, yuvType);
306
0
        }
307
308
        //-------------------------------------------------------------------------------------------------
309
310
        template <bool align, class T> void Yuv422pToRgbV2(const uint8_t* y, size_t yStride, const uint8_t* u, size_t uStride, const uint8_t* v, size_t vStride,
311
            size_t width, size_t height, uint8_t* rgb, size_t rgbStride)
312
0
        {
313
0
            assert((width % 2 == 0) && (width >= DA));
314
0
            if (align)
315
0
            {
316
0
                assert(Aligned(y) && Aligned(yStride) && Aligned(u) && Aligned(uStride));
317
0
                assert(Aligned(v) && Aligned(vStride) && Aligned(rgb) && Aligned(rgbStride));
318
0
            }
319
320
0
            size_t bodyWidth = AlignLo(width, DA);
321
0
            size_t tail = width - bodyWidth;
322
0
            for (size_t row = 0; row < height; row += 1)
323
0
            {
324
0
                for (size_t colUV = 0, colY = 0, colRgb = 0; colY < bodyWidth; colY += DA, colUV += A, colRgb += A * 6)
325
0
                {
326
0
                    __m128i u_ = Load<align>((__m128i*)(u + colUV));
327
0
                    __m128i v_ = Load<align>((__m128i*)(v + colUV));
328
0
                    Yuv422pToRgbV2<align, T>(y + colY, u_, v_, rgb + colRgb);
329
0
                }
330
0
                if (tail)
331
0
                {
332
0
                    size_t offset = width - DA;
333
0
                    __m128i u_ = Load<false>((__m128i*)(u + offset / 2));
334
0
                    __m128i v_ = Load<false>((__m128i*)(v + offset / 2));
335
0
                    Yuv422pToRgbV2<false, T>(y + offset, u_, v_, rgb + 3 * offset);
336
0
                }
337
0
                y += yStride;
338
0
                u += uStride;
339
0
                v += vStride;
340
0
                rgb += rgbStride;
341
0
            }
342
0
        }
Unexecuted instantiation: void Simd::Sse41::Yuv422pToRgbV2<true, Simd::Base::Bt601>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
Unexecuted instantiation: void Simd::Sse41::Yuv422pToRgbV2<true, Simd::Base::Bt709>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
Unexecuted instantiation: void Simd::Sse41::Yuv422pToRgbV2<true, Simd::Base::Bt2020>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
Unexecuted instantiation: void Simd::Sse41::Yuv422pToRgbV2<true, Simd::Base::Trect871>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
Unexecuted instantiation: void Simd::Sse41::Yuv422pToRgbV2<false, Simd::Base::Bt601>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
Unexecuted instantiation: void Simd::Sse41::Yuv422pToRgbV2<false, Simd::Base::Bt709>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
Unexecuted instantiation: void Simd::Sse41::Yuv422pToRgbV2<false, Simd::Base::Bt2020>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
Unexecuted instantiation: void Simd::Sse41::Yuv422pToRgbV2<false, Simd::Base::Trect871>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
343
344
        template <bool align> void Yuv422pToRgbV2(const uint8_t* y, size_t yStride, const uint8_t* u, size_t uStride, const uint8_t* v, size_t vStride,
345
            size_t width, size_t height, uint8_t* rgb, size_t rgbStride, SimdYuvType yuvType)
346
0
        {
347
0
            switch (yuvType)
348
0
            {
349
0
            case SimdYuvBt601: Yuv422pToRgbV2<align, Base::Bt601>(y, yStride, u, uStride, v, vStride, width, height, rgb, rgbStride); break;
350
0
            case SimdYuvBt709: Yuv422pToRgbV2<align, Base::Bt709>(y, yStride, u, uStride, v, vStride, width, height, rgb, rgbStride); break;
351
0
            case SimdYuvBt2020: Yuv422pToRgbV2<align, Base::Bt2020>(y, yStride, u, uStride, v, vStride, width, height, rgb, rgbStride); break;
352
0
            case SimdYuvTrect871: Yuv422pToRgbV2<align, Base::Trect871>(y, yStride, u, uStride, v, vStride, width, height, rgb, rgbStride); break;
353
0
            default:
354
0
                assert(0);
355
0
            }
356
0
        }
Unexecuted instantiation: void Simd::Sse41::Yuv422pToRgbV2<true>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long, SimdYuvType)
Unexecuted instantiation: void Simd::Sse41::Yuv422pToRgbV2<false>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long, SimdYuvType)
357
358
        void Yuv422pToRgbV2(const uint8_t* y, size_t yStride, const uint8_t* u, size_t uStride, const uint8_t* v, size_t vStride,
359
            size_t width, size_t height, uint8_t* rgb, size_t rgbStride, SimdYuvType yuvType)
360
0
        {
361
0
            if (Aligned(y) && Aligned(yStride) && Aligned(u) && Aligned(uStride)
362
0
                && Aligned(v) && Aligned(vStride) && Aligned(rgb) && Aligned(rgbStride))
363
0
                Yuv422pToRgbV2<true>(y, yStride, u, uStride, v, vStride, width, height, rgb, rgbStride, yuvType);
364
0
            else
365
0
                Yuv422pToRgbV2<false>(y, yStride, u, uStride, v, vStride, width, height, rgb, rgbStride, yuvType);
366
0
        }
367
368
        //-------------------------------------------------------------------------------------------------
369
370
        template <bool align, class T> SIMD_INLINE void Yuv444pToRgbV2(const uint8_t* y, const uint8_t* u, const uint8_t* v, uint8_t* rgb)
371
0
        {
372
0
            YuvToRgbV2<align, T>(Load<align>((__m128i*)y), Load<align>((__m128i*)u), Load<align>((__m128i*)v), (__m128i*)rgb);
373
0
        }
Unexecuted instantiation: void Simd::Sse41::Yuv444pToRgbV2<true, Simd::Base::Bt601>(unsigned char const*, unsigned char const*, unsigned char const*, unsigned char*)
Unexecuted instantiation: void Simd::Sse41::Yuv444pToRgbV2<false, Simd::Base::Bt601>(unsigned char const*, unsigned char const*, unsigned char const*, unsigned char*)
Unexecuted instantiation: void Simd::Sse41::Yuv444pToRgbV2<true, Simd::Base::Bt709>(unsigned char const*, unsigned char const*, unsigned char const*, unsigned char*)
Unexecuted instantiation: void Simd::Sse41::Yuv444pToRgbV2<false, Simd::Base::Bt709>(unsigned char const*, unsigned char const*, unsigned char const*, unsigned char*)
Unexecuted instantiation: void Simd::Sse41::Yuv444pToRgbV2<true, Simd::Base::Bt2020>(unsigned char const*, unsigned char const*, unsigned char const*, unsigned char*)
Unexecuted instantiation: void Simd::Sse41::Yuv444pToRgbV2<false, Simd::Base::Bt2020>(unsigned char const*, unsigned char const*, unsigned char const*, unsigned char*)
Unexecuted instantiation: void Simd::Sse41::Yuv444pToRgbV2<true, Simd::Base::Trect871>(unsigned char const*, unsigned char const*, unsigned char const*, unsigned char*)
Unexecuted instantiation: void Simd::Sse41::Yuv444pToRgbV2<false, Simd::Base::Trect871>(unsigned char const*, unsigned char const*, unsigned char const*, unsigned char*)
374
375
        template <bool align, class T> void Yuv444pToRgbV2(const uint8_t* y, size_t yStride, const uint8_t* u, size_t uStride, const uint8_t* v, size_t vStride,
376
            size_t width, size_t height, uint8_t* rgb, size_t rgbStride)
377
0
        {
378
0
            if (align)
379
0
            {
380
0
                assert(Aligned(y) && Aligned(yStride) && Aligned(u) && Aligned(uStride));
381
0
                assert(Aligned(v) && Aligned(vStride) && Aligned(rgb) && Aligned(rgbStride));
382
0
            }
383
384
0
            size_t bodyWidth = AlignLo(width, A);
385
0
            size_t tail = width - bodyWidth;
386
0
            for (size_t row = 0; row < height; row += 1)
387
0
            {
388
0
                for (size_t col = 0, colRgb = 0; col < bodyWidth; col += A, colRgb += A * 3)
389
0
                    Yuv444pToRgbV2<align, T>(y + col, u + col, v + col, rgb + colRgb);
390
0
                if (tail)
391
0
                {
392
0
                    size_t offset = width - A;
393
0
                    Yuv444pToRgbV2<false, T>(y + offset, u + offset, v + offset, rgb + 3 * offset);
394
0
                }
395
0
                y += yStride;
396
0
                u += uStride;
397
0
                v += vStride;
398
0
                rgb += rgbStride;
399
0
            }
400
0
        }
Unexecuted instantiation: void Simd::Sse41::Yuv444pToRgbV2<true, Simd::Base::Bt601>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
Unexecuted instantiation: void Simd::Sse41::Yuv444pToRgbV2<true, Simd::Base::Bt709>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
Unexecuted instantiation: void Simd::Sse41::Yuv444pToRgbV2<true, Simd::Base::Bt2020>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
Unexecuted instantiation: void Simd::Sse41::Yuv444pToRgbV2<true, Simd::Base::Trect871>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
Unexecuted instantiation: void Simd::Sse41::Yuv444pToRgbV2<false, Simd::Base::Bt601>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
Unexecuted instantiation: void Simd::Sse41::Yuv444pToRgbV2<false, Simd::Base::Bt709>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
Unexecuted instantiation: void Simd::Sse41::Yuv444pToRgbV2<false, Simd::Base::Bt2020>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
Unexecuted instantiation: void Simd::Sse41::Yuv444pToRgbV2<false, Simd::Base::Trect871>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long)
401
402
        template <bool align> void Yuv444pToRgbV2(const uint8_t* y, size_t yStride, const uint8_t* u, size_t uStride, const uint8_t* v, size_t vStride,
403
            size_t width, size_t height, uint8_t* rgb, size_t rgbStride, SimdYuvType yuvType)
404
0
        {
405
0
            switch (yuvType)
406
0
            {
407
0
            case SimdYuvBt601: Yuv444pToRgbV2<align, Base::Bt601>(y, yStride, u, uStride, v, vStride, width, height, rgb, rgbStride); break;
408
0
            case SimdYuvBt709: Yuv444pToRgbV2<align, Base::Bt709>(y, yStride, u, uStride, v, vStride, width, height, rgb, rgbStride); break;
409
0
            case SimdYuvBt2020: Yuv444pToRgbV2<align, Base::Bt2020>(y, yStride, u, uStride, v, vStride, width, height, rgb, rgbStride); break;
410
0
            case SimdYuvTrect871: Yuv444pToRgbV2<align, Base::Trect871>(y, yStride, u, uStride, v, vStride, width, height, rgb, rgbStride); break;
411
0
            default:
412
0
                assert(0);
413
0
            }
414
0
        }
Unexecuted instantiation: void Simd::Sse41::Yuv444pToRgbV2<true>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long, SimdYuvType)
Unexecuted instantiation: void Simd::Sse41::Yuv444pToRgbV2<false>(unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned char*, unsigned long, SimdYuvType)
415
416
        void Yuv444pToRgbV2(const uint8_t* y, size_t yStride, const uint8_t* u, size_t uStride, const uint8_t* v, size_t vStride,
417
            size_t width, size_t height, uint8_t* rgb, size_t rgbStride, SimdYuvType yuvType)
418
0
        {
419
0
            if (Aligned(y) && Aligned(yStride) && Aligned(u) && Aligned(uStride)
420
0
                && Aligned(v) && Aligned(vStride) && Aligned(rgb) && Aligned(rgbStride))
421
0
                Yuv444pToRgbV2<true>(y, yStride, u, uStride, v, vStride, width, height, rgb, rgbStride, yuvType);
422
0
            else
423
0
                Yuv444pToRgbV2<false>(y, yStride, u, uStride, v, vStride, width, height, rgb, rgbStride, yuvType);
424
0
        }
425
    }
426
#endif
427
}