GCC Code Coverage Report


Directory: avs_core/
Coverage: low: ≥ 0% medium: ≥ 75.0% high: ≥ 90.0%
Coverage Exec / Excl / Total
Lines: 17.0% 2196 / 0 / 12948
Functions: 16.6% 93 / 0 / 561
Branches: 16.7% 238 / 0 / 1426

convert/intel/convert_planar_sse.cpp
Line Branch Exec Source
1 // Avisynth v2.5. Copyright 2002 Ben Rudiak-Gould et al.
2 // http://avisynth.nl
3
4 // This program is free software; you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation; either version 2 of the License, or
7 // (at your option) any later version.
8 //
9 // This program is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with this program; if not, write to the Free Software
16 // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA, or visit
17 // http://www.gnu.org/copyleft/gpl.html .
18 //
19 // Linking Avisynth statically or dynamically with other modules is making a
20 // combined work based on Avisynth. Thus, the terms and conditions of the GNU
21 // General Public License cover the whole combination.
22 //
23 // As a special exception, the copyright holders of Avisynth give you
24 // permission to link Avisynth with independent modules that communicate with
25 // Avisynth solely through the interfaces defined in avisynth.h, regardless of the license
26 // terms of these independent modules, and to copy and distribute the
27 // resulting combined work under terms of your choice, provided that
28 // every copy of the combined work is accompanied by a complete copy of
29 // the source code of Avisynth (the version of Avisynth used to produce the
30 // combined work), being distributed under the terms of the GNU General
31 // Public License plus this exception. An independent module is a module
32 // which is not derived from or based on Avisynth, such as 3rd-party filters,
33 // import and export plugins, or graphical user interfaces.
34
35 // ConvertPlanar (c) 2005 by Klaus Post
36
37
38 #include "../convert.h"
39 #include "../convert_matrix.h"
40 #include "../convert_planar.h"
41 #include "../convert_helper.h"
42
43 #ifdef AVS_WINDOWS
44 #include <avs/win.h>
45 #else
46 #include <avs/posix.h>
47 #endif
48
49 #include <avs/alignment.h>
50
51 // Intrinsics base header + really required extension headers
52 #if defined(_MSC_VER)
53 #include <intrin.h> // MSVC
54 #else
55 #include <x86intrin.h> // GCC/MinGW/Clang/LLVM
56 #endif
57 #include <smmintrin.h> // SSE4.1
58
59 #include <algorithm>
60 #include <string>
61
62 DISABLE_WARNING_PUSH
63 DISABLE_WARNING_UNREFERENCED_LOCAL_VARIABLE
64
65 // no srai64 in SSE2, only in AVX512 + VL
66 // SSE2 logical shift (_mm_srl_epi64) plus sign fill
67 static AVS_FORCEINLINE __m128i mm_srai_epi64_simul(__m128i x, int count) {
68 // logical right shift on 64bit lanes
69 const __m128i cnt = _mm_cvtsi32_si128(count);
70 const __m128i logical = _mm_srl_epi64(x, cnt);
71
72 // have the sign bit present in both 32 bit halves of each 64bit lane before we do a 32bit arithmetic shift.
73 const __m128i hi_dup = _mm_shuffle_epi32(x, _MM_SHUFFLE(3, 3, 1, 1));
74 const __m128i sign_shifted = _mm_sra_epi32(hi_dup, cnt);
75
76 // clear lower 32 bits of each lane
77 const __m128i upper_mask = _mm_set_epi32(0xFFFFFFFF, 0, 0xFFFFFFFF, 0);
78 const __m128i sign_ext = _mm_and_si128(sign_shifted, upper_mask);
79
80 return _mm_or_si128(logical, sign_ext);
81 }
82
83 2 void convert_yuy2_to_y8_sse2(const BYTE *srcp, BYTE *dstp, size_t src_pitch, size_t dst_pitch, size_t width, size_t height)
84 {
85 2 __m128i luma_mask = _mm_set1_epi16(0xFF);
86
87
2/2
✓ Branch 22 → 7 taken 8 times.
✓ Branch 22 → 23 taken 2 times.
10 for(size_t y = 0; y < height; ++y) {
88
2/2
✓ Branch 20 → 8 taken 13 times.
✓ Branch 20 → 21 taken 8 times.
21 for (size_t x = 0; x < width; x += 16) {
89 13 __m128i src1 = _mm_load_si128(reinterpret_cast<const __m128i*>(srcp+x*2));
90 26 __m128i src2 = _mm_load_si128(reinterpret_cast<const __m128i*>(srcp+x*2+16));
91 13 src1 = _mm_and_si128(src1, luma_mask);
92 13 src2 = _mm_and_si128(src2, luma_mask);
93 13 _mm_store_si128(reinterpret_cast<__m128i*>(dstp+x), _mm_packus_epi16(src1, src2));
94 }
95
96 8 dstp += dst_pitch;
97 8 srcp += src_pitch;
98 }
99 2 }
100
101 #if 0
102 // Kept for reference
103 static AVS_FORCEINLINE __m128i convert_rgb_to_y8_sse2_core(const __m128i &pixel01, const __m128i &pixel23, const __m128i &pixel45, const __m128i &pixel67, __m128i& zero, __m128i &matrix, __m128i &round_mask, __m128i &offset) {
104 //int Y = offset_y + ((m0 * srcp[0] + m1 * srcp[1] + m2 * srcp[2] + 16384) >> 15);
105 // in general the algorithm is identical to MMX version, the only different part is getting r and g+b in appropriate registers. We use shuffling instead of unpacking here.
106 __m128i pixel01m = _mm_madd_epi16(pixel01, matrix); //a1*0 + r1*cyr | g1*cyg + b1*cyb | a0*0 + r0*cyr | g0*cyg + b0*cyb
107 __m128i pixel23m = _mm_madd_epi16(pixel23, matrix); //a3*0 + r3*cyr | g3*cyg + b3*cyb | a2*0 + r2*cyr | g2*cyg + b2*cyb
108 __m128i pixel45m = _mm_madd_epi16(pixel45, matrix); //a5*0 + r5*cyr | g5*cyg + b5*cyb | a4*0 + r4*cyr | g4*cyg + b4*cyb
109 __m128i pixel67m = _mm_madd_epi16(pixel67, matrix); //a7*0 + r7*cyr | g7*cyg + b7*cyb | a6*0 + r6*cyr | g6*cyg + b6*cyb
110
111 __m128i pixel_0123_r = _mm_castps_si128(_mm_shuffle_ps(_mm_castsi128_ps(pixel01m), _mm_castsi128_ps(pixel23m), _MM_SHUFFLE(3, 1, 3, 1))); // r3*cyr | r2*cyr | r1*cyr | r0*cyr
112 __m128i pixel_4567_r = _mm_castps_si128(_mm_shuffle_ps(_mm_castsi128_ps(pixel45m), _mm_castsi128_ps(pixel67m), _MM_SHUFFLE(3, 1, 3, 1))); // r7*cyr | r6*cyr | r5*cyr | r4*cyr
113
114 __m128i pixel_0123 = _mm_castps_si128(_mm_shuffle_ps(_mm_castsi128_ps(pixel01m), _mm_castsi128_ps(pixel23m), _MM_SHUFFLE(2, 0, 2, 0)));
115 __m128i pixel_4567 = _mm_castps_si128(_mm_shuffle_ps(_mm_castsi128_ps(pixel45m), _mm_castsi128_ps(pixel67m), _MM_SHUFFLE(2, 0, 2, 0)));
116
117 pixel_0123 = _mm_add_epi32(pixel_0123, pixel_0123_r);
118 pixel_4567 = _mm_add_epi32(pixel_4567, pixel_4567_r);
119
120 pixel_0123 = _mm_add_epi32(pixel_0123, round_mask);
121 pixel_4567 = _mm_add_epi32(pixel_4567, round_mask);
122
123 pixel_0123 = _mm_srai_epi32(pixel_0123, 15);
124 pixel_4567 = _mm_srai_epi32(pixel_4567, 15);
125
126 __m128i result = _mm_packs_epi32(pixel_0123, pixel_4567);
127
128 result = _mm_adds_epi16(result, offset);
129 result = _mm_packus_epi16(result, zero);
130
131 return result;
132 }
133
134 void convert_rgb32_to_y8_sse2(const BYTE *srcp, BYTE *dstp, size_t src_pitch, size_t dst_pitch, size_t width, size_t height, const ConversionMatrix &matrix) {
135 __m128i matrix_v = _mm_set_epi16(0, matrix.y_r, matrix.y_g, matrix.y_b, 0, matrix.y_r, matrix.y_g, matrix.y_b);
136 __m128i zero = _mm_setzero_si128();
137 __m128i offset = _mm_set1_epi16(matrix.offset_y);
138 __m128i round_mask = _mm_set1_epi32(16384);
139 __m128i offset_rgb = _mm_set_epi16(0, matrix.offset_rgb, matrix.offset_rgb, matrix.offset_rgb, 0, matrix.offset_rgb, matrix.offset_rgb, matrix.offset_rgb);
140
141 const bool has_offset_rgb = 0 != matrix.offset_rgb;
142
143 for (size_t y = 0; y < height; ++y) {
144 for (size_t x = 0; x < width; x+=8) {
145 __m128i src0123 = _mm_load_si128(reinterpret_cast<const __m128i*>(srcp+x*4)); //pixels 0, 1, 2 and 3
146 __m128i src4567 = _mm_load_si128(reinterpret_cast<const __m128i*>(srcp+x*4+16));//pixels 4, 5, 6 and 7
147
148 __m128i pixel01 = _mm_unpacklo_epi8(src0123, zero);
149 __m128i pixel23 = _mm_unpackhi_epi8(src0123, zero);
150 __m128i pixel45 = _mm_unpacklo_epi8(src4567, zero);
151 __m128i pixel67 = _mm_unpackhi_epi8(src4567, zero);
152 if (has_offset_rgb) {
153 pixel01 = _mm_add_epi16(pixel01, offset_rgb);
154 pixel23 = _mm_add_epi16(pixel23, offset_rgb);
155 pixel45 = _mm_add_epi16(pixel45, offset_rgb);
156 pixel67 = _mm_add_epi16(pixel67, offset_rgb);
157 }
158
159 _mm_storel_epi64(reinterpret_cast<__m128i*>(dstp+x), convert_rgb_to_y8_sse2_core(pixel01, pixel23, pixel45, pixel67, zero, matrix_v, round_mask, offset));
160 }
161
162 srcp -= src_pitch;
163 dstp += dst_pitch;
164 }
165 }
166 #endif // if 0
167
168 #define XP_LAMBDA_CAPTURE_FIX(x) (void)(x)
169
170 // SSE2 implementation matching AVX2 logic - processes 8 pixels per iteration
171 // Supports all conversion directions, bit depths, and conversion types
172 template<ConversionDirection direction, typename pixel_t, bool lessthan16bit, bool lessthan16bit_target, typename pixel_t_dst, YuvRgbConversionType conv_type>
173 37 static void convert_yuv_to_planarrgb_sse2_internal(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m,
174 int bits_per_pixel, int bits_per_pixel_target)
175 {
176 // SSE2 version: processes 8 pixels at a time (vs 32 for AVX2)
177 37 constexpr int INT_ARITH_SHIFT =
178 (direction == ConversionDirection::YUV_TO_RGB) ? 13 :
179 (direction == ConversionDirection::RGB_TO_YUV || direction == ConversionDirection::RGB_TO_Y) ? 15 :
180 (direction == ConversionDirection::YUV_TO_YUV) ? 14 : 13;
181
182 static_assert(!(std::is_floating_point<pixel_t>::value && conv_type != YuvRgbConversionType::FORCE_FLOAT), "FORCE_FLOAT conversion type is required for float input pixel type");
183
184 37 constexpr bool final_is_float = std::is_floating_point<pixel_t_dst>::value;
185 37 constexpr bool would_need_64bit_v_patch = !lessthan16bit && !final_is_float && (INT_ARITH_SHIFT == 15);
186 // RGB_TO_YUV, RGB_TO_Y 16 bit origin case needs 64 bit extension at one point to avoid overflow
187 // but it makes it much slower than the full-float path, so we force float path for that case as well
188
189 // effectively full-float-inside for int full range conversion, but with the same output rules as other float conversions
190 37 constexpr bool force_float = (conv_type == YuvRgbConversionType::FORCE_FLOAT) || would_need_64bit_v_patch;
191
192 37 constexpr bool need_int_conversion_narrow_range = conv_type == YuvRgbConversionType::BITCONV_INT_LIMITED;
193 37 constexpr bool need_int_conversion_full_range = conv_type == YuvRgbConversionType::BITCONV_INT_FULL;
194 37 constexpr bool need_int_conversion = conv_type == YuvRgbConversionType::BITCONV_INT_FULL || conv_type == YuvRgbConversionType::BITCONV_INT_LIMITED ||
195 (conv_type == YuvRgbConversionType::FORCE_FLOAT && !final_is_float);
196
197 37 constexpr bool float_matrix_workflow = force_float || need_int_conversion_full_range;
198
199 // quasi-constexpr, may help optimizer
200 16 if constexpr (std::is_same<pixel_t, uint8_t>::value) bits_per_pixel = 8;
201 14 if constexpr (std::is_same<pixel_t_dst, uint8_t>::value) bits_per_pixel_target = 8;
202 7 if constexpr (std::is_same<pixel_t, uint16_t>::value && !lessthan16bit) bits_per_pixel = 16;
203 11 if constexpr (std::is_same<pixel_t_dst, uint16_t>::value && !lessthan16bit_target) bits_per_pixel_target = 16;
204 21 if constexpr (conv_type == YuvRgbConversionType::NATIVE_INT) bits_per_pixel_target = bits_per_pixel;
205
206 37 const int bit_diff = need_int_conversion ? bits_per_pixel_target - bits_per_pixel : 0;
207 37 const int target_shift = need_int_conversion_narrow_range ? INT_ARITH_SHIFT - bit_diff : INT_ARITH_SHIFT;
208 37 const int ROUNDER = (final_is_float || float_matrix_workflow) ? 0 : (1 << (target_shift - 1));
209 37 const float out_offset_f = m.offset_out_f_32;
210 37 const int half_pixel_offset = 1 << (bits_per_pixel - 1);
211 37 const int half_pixel_offset_target = 1 << (bits_per_pixel_target - 1);
212 37 const int max_pixel_value_target = (1 << bits_per_pixel_target) - 1;
213
214 37 bits_conv_constants conversion_ranges;
215 37 const bool full_scale_d = m.offset_out == 0;
216
23/320
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, float, false, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 24 taken 1 time.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, float, false, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, float, false, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, float, false, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned char, true, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned char, true, false, float, (YuvRgbConversionType)2>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned char, true, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned char, true, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned char, true, false, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned char, true, true, unsigned char, (YuvRgbConversionType)0>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 24 taken 6 times.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned char, true, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned char, true, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned char, true, true, unsigned char, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned char, true, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned char, true, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned char, true, true, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, false, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, false, false, float, (YuvRgbConversionType)2>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, false, false, unsigned short, (YuvRgbConversionType)0>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 24 taken 1 time.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, false, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, false, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, false, false, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, false, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, false, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, false, true, unsigned char, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, false, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, false, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, false, true, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, true, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, true, false, float, (YuvRgbConversionType)2>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, true, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, true, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, true, false, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, true, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, true, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, true, true, unsigned char, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, true, true, unsigned short, (YuvRgbConversionType)0>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 24 taken 2 times.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, true, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, true, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, true, true, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, float, false, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 24 taken 1 time.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, float, false, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, float, false, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, float, false, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned char, true, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned char, true, false, float, (YuvRgbConversionType)2>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned char, true, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned char, true, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 24 taken 1 time.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned char, true, false, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned char, true, true, unsigned char, (YuvRgbConversionType)0>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 24 taken 4 times.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned char, true, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned char, true, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned char, true, true, unsigned char, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned char, true, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned char, true, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 24 taken 1 time.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned char, true, true, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, false, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, false, false, float, (YuvRgbConversionType)2>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, false, false, unsigned short, (YuvRgbConversionType)0>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 24 taken 2 times.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, false, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, false, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, false, false, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, false, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, false, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, false, true, unsigned char, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, false, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, false, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, false, true, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, true, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, true, false, float, (YuvRgbConversionType)2>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, true, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, true, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 24 taken 3 times.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, true, false, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, true, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, true, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, true, true, unsigned char, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, true, true, unsigned short, (YuvRgbConversionType)0>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 24 taken 1 time.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, true, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, true, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, true, true, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, float, false, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 24 taken 1 time.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, float, false, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, float, false, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, float, false, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned char, true, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned char, true, false, float, (YuvRgbConversionType)2>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned char, true, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned char, true, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned char, true, false, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned char, true, true, unsigned char, (YuvRgbConversionType)0>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 24 taken 1 time.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned char, true, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned char, true, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned char, true, true, unsigned char, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned char, true, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned char, true, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned char, true, true, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, false, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, false, false, float, (YuvRgbConversionType)2>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, false, false, unsigned short, (YuvRgbConversionType)0>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 24 taken 2 times.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, false, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, false, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, false, false, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, false, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, false, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, false, true, unsigned char, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, false, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, false, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, false, true, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, true, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, true, false, float, (YuvRgbConversionType)2>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, true, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, true, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, true, false, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, true, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, true, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, true, true, unsigned char, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, true, true, unsigned short, (YuvRgbConversionType)0>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, true, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, true, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, true, true, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, float, false, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 24 taken 2 times.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, float, false, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, float, false, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, float, false, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned char, true, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned char, true, false, float, (YuvRgbConversionType)2>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned char, true, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned char, true, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned char, true, false, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned char, true, true, unsigned char, (YuvRgbConversionType)0>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 24 taken 1 time.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned char, true, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 24 taken 1 time.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned char, true, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned char, true, true, unsigned char, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned char, true, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned char, true, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 24 taken 1 time.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned char, true, true, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, false, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, false, false, float, (YuvRgbConversionType)2>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, false, false, unsigned short, (YuvRgbConversionType)0>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, false, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 24 taken 1 time.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, false, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, false, false, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, false, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, false, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 24 taken 1 time.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, false, true, unsigned char, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, false, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, false, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, false, true, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, true, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, true, false, float, (YuvRgbConversionType)2>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, true, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, true, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, true, false, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 24 taken 1 time.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, true, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, true, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, true, true, unsigned char, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, true, true, unsigned short, (YuvRgbConversionType)0>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 24 taken 1 time.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, true, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 24 taken 1 time.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, true, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, true, true, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 24 not taken.
37 get_bits_conv_constants(conversion_ranges, false, full_scale_d, full_scale_d, bits_per_pixel, bits_per_pixel_target);
217
218 37 constexpr int int_arithmetic_shift = 1 << INT_ARITH_SHIFT;
219 37 float scale_f = conversion_ranges.mul_factor;
220 if (final_is_float && !float_matrix_workflow)
221 scale_f = scale_f / int_arithmetic_shift;
222
223 37 __m128i half = _mm_set1_epi16((short)half_pixel_offset);
224 37 __m128i limit = _mm_set1_epi16((short)max_pixel_value_target);
225
226 // Overflow and rounding magnitude considerations.
227 // See comments in AVX2 version for details.
228
229
5/72
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned char, true, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 63 → 64 not taken.
✗ Branch 63 → 65 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned char, true, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 63 → 64 not taken.
✗ Branch 63 → 65 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned char, true, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 63 → 64 not taken.
✗ Branch 63 → 65 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, false, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 63 → 64 not taken.
✗ Branch 63 → 65 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, false, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 63 → 64 not taken.
✗ Branch 63 → 65 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, false, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 63 → 64 not taken.
✗ Branch 63 → 65 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, true, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 63 → 64 not taken.
✗ Branch 63 → 65 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, true, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 63 → 64 not taken.
✗ Branch 63 → 65 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, true, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 63 → 64 not taken.
✗ Branch 63 → 65 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned char, true, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 63 → 64 taken 1 time.
✗ Branch 63 → 65 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned char, true, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 63 → 64 not taken.
✗ Branch 63 → 65 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned char, true, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 63 → 64 taken 1 time.
✗ Branch 63 → 65 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, false, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 63 → 64 not taken.
✗ Branch 63 → 65 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, false, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 63 → 64 not taken.
✗ Branch 63 → 65 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, false, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 63 → 64 not taken.
✗ Branch 63 → 65 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, true, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 63 → 64 taken 3 times.
✗ Branch 63 → 65 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, true, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 63 → 64 not taken.
✗ Branch 63 → 65 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, true, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 63 → 64 not taken.
✗ Branch 63 → 65 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned char, true, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 63 → 64 not taken.
✗ Branch 63 → 65 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned char, true, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 63 → 64 not taken.
✗ Branch 63 → 65 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned char, true, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 63 → 64 not taken.
✗ Branch 63 → 65 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, false, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 63 → 64 not taken.
✗ Branch 63 → 65 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, false, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 63 → 64 not taken.
✗ Branch 63 → 65 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, false, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 63 → 64 not taken.
✗ Branch 63 → 65 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, true, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 63 → 64 not taken.
✗ Branch 63 → 65 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, true, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 63 → 64 not taken.
✗ Branch 63 → 65 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, true, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 63 → 64 not taken.
✗ Branch 63 → 65 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned char, true, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 63 → 64 not taken.
✗ Branch 63 → 65 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned char, true, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 63 → 64 not taken.
✗ Branch 63 → 65 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned char, true, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 63 → 64 taken 1 time.
✗ Branch 63 → 65 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, false, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 63 → 64 not taken.
✗ Branch 63 → 65 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, false, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 63 → 64 not taken.
✓ Branch 63 → 65 taken 1 time.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, false, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 63 → 64 not taken.
✗ Branch 63 → 65 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, true, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 63 → 64 not taken.
✗ Branch 63 → 65 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, true, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 63 → 64 not taken.
✗ Branch 63 → 65 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, true, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 63 → 64 not taken.
✗ Branch 63 → 65 not taken.
37 const int ROUND_SCALE = 1 << ((target_shift < INT_ARITH_SHIFT ? target_shift : INT_ARITH_SHIFT) - 1);
230 44 const __m128i m128i_round_scale = _mm_set1_epi16((short)ROUND_SCALE);
231
232 int round_mask_plus_offset_out_scaled_i;
233 int round_mask_plus_offset_out_chroma_scaled_i;
234 __m128i v_patch_G, v_patch_B, v_patch_R;
235 37 __m128i sign_flip_mask = _mm_set1_epi16((short)0x8000);
236
237 37 const int offset_in_scalar = m.offset_in;
238 37 const int offset_out_scalar = m.offset_out;
239 __m128i offset_in;
240 __m128 offset_in_f;
241
242 if constexpr (float_matrix_workflow) {
243 12 offset_in = _mm_set1_epi32(offset_in_scalar);
244 24 offset_in_f = _mm_set1_ps(m.offset_in_f);
245 }
246 else if constexpr (lessthan16bit)
247 22 offset_in = _mm_set1_epi16((short)offset_in_scalar);
248 else
249 3 offset_in = _mm_setzero_si128();
250
251 if constexpr (!float_matrix_workflow) {
252 // integer preparations for the madd-based main loop
253 // keep madd simple: only handle the rounding (ROUND_SCALE * 1)
254 // offsets are handled later in the patch, after the madd, added to the same place as the optional 16-bit pivot adjustment
255 25 round_mask_plus_offset_out_scaled_i = ROUNDER / ROUND_SCALE;
256 25 round_mask_plus_offset_out_chroma_scaled_i = ROUNDER / ROUND_SCALE;
257
258 // 32-bit post-conversion adds offset in float domain, this is why it's 0 for final_is_float
259 25 const int offset_out_for_patch = final_is_float ? 0 : (offset_out_scalar << INT_ARITH_SHIFT);
260 25 const int chroma_offset_out_for_patch = final_is_float ? 0 : (half_pixel_offset << INT_ARITH_SHIFT);
261
262 if constexpr (lessthan16bit) {
263 // 8-14 bit
264 // move ONLY the output offset to the 32-bit patch
265 if constexpr (direction == ConversionDirection::RGB_TO_YUV || direction == ConversionDirection::YUV_TO_YUV) {
266 11 v_patch_G = _mm_set1_epi32(offset_out_for_patch);
267 11 v_patch_B = _mm_set1_epi32(chroma_offset_out_for_patch);
268 11 v_patch_R = _mm_set1_epi32(chroma_offset_out_for_patch);
269 }
270 else {
271 // YUV_TO_RGB, RGB_TO_RGB, RGB_TO_Y: same nonchroma offset
272 11 v_patch_G = v_patch_B = v_patch_R = _mm_set1_epi32(offset_out_for_patch);
273 }
274 }
275 else {
276 // exact 16 bit
277
278 // move BOTH the pivot and the output offset to the 32-bit patch
279 // Since we have to do the patching anyway, we can combine both adjustments here
280 3 const int luma_or_rgbin_pivot = 32768 + offset_in_scalar;
281 3 const int chroma_pivot = 32768;
282
283 if constexpr (direction == ConversionDirection::YUV_TO_RGB) {
284 1 v_patch_G = _mm_set1_epi32(luma_or_rgbin_pivot * m.y_g + offset_out_for_patch);
285 1 v_patch_B = _mm_set1_epi32(luma_or_rgbin_pivot * m.y_b + offset_out_for_patch);
286 2 v_patch_R = _mm_set1_epi32(luma_or_rgbin_pivot * m.y_r + offset_out_for_patch);
287 }
288 else if constexpr (direction == ConversionDirection::RGB_TO_RGB) {
289 v_patch_G = _mm_set1_epi32(luma_or_rgbin_pivot * (m.y_g + m.u_g + m.v_g) + offset_out_for_patch);
290 v_patch_B = _mm_set1_epi32(luma_or_rgbin_pivot * (m.y_b + m.u_b + m.v_b) + offset_out_for_patch);
291 v_patch_R = _mm_set1_epi32(luma_or_rgbin_pivot * (m.y_r + m.u_r + m.v_r) + offset_out_for_patch);
292 }
293 else if constexpr (direction == ConversionDirection::RGB_TO_YUV) {
294 if constexpr (!would_need_64bit_v_patch) {
295 v_patch_G = _mm_set1_epi32(luma_or_rgbin_pivot * (m.y_r + m.y_g + m.y_b) + offset_out_for_patch);
296 v_patch_B = _mm_set1_epi32(luma_or_rgbin_pivot * (m.u_r + m.u_g + m.u_b) + chroma_offset_out_for_patch);
297 v_patch_R = _mm_set1_epi32(luma_or_rgbin_pivot * (m.v_r + m.v_g + m.v_b) + chroma_offset_out_for_patch);
298 }
299 else {
300 static_assert(!would_need_64bit_v_patch, "64-bit patch needed for RGB->YUV conversion, but not supported in this path. Redirected to float workflow instead.");
301 v_patch_G = _mm_set1_epi64x(luma_or_rgbin_pivot * (m.y_r + m.y_g + m.y_b) + offset_out_for_patch);
302 v_patch_B = _mm_set1_epi64x(luma_or_rgbin_pivot * (m.u_r + m.u_g + m.u_b) + chroma_offset_out_for_patch);
303 v_patch_R = _mm_set1_epi64x(luma_or_rgbin_pivot * (m.v_r + m.v_g + m.v_b) + chroma_offset_out_for_patch);
304 }
305 }
306 else if constexpr (direction == ConversionDirection::RGB_TO_Y) {
307 if constexpr (!would_need_64bit_v_patch) {
308 v_patch_G = _mm_set1_epi32(luma_or_rgbin_pivot * (m.y_r + m.y_g + m.y_b) + offset_out_for_patch);
309 }
310 else {
311 static_assert(!would_need_64bit_v_patch, "64-bit patch needed for RGB->Y conversion, but not supported in this path. Redirected to float workflow instead.");
312 v_patch_G = _mm_set1_epi64x(luma_or_rgbin_pivot * (m.y_r + m.y_g + m.y_b) + offset_out_for_patch);
313 }
314 }
315 else if constexpr (direction == ConversionDirection::YUV_TO_YUV) {
316 // for YUV->YUV
317 // FIXME: untested, no AviSynth caller yet. Suspect m.y_b/m.y_r should be
318 // m.u_b/m.v_r (chroma diagonal), and offset should be chroma_offset_out_for_patch.
319 2 v_patch_G = _mm_set1_epi32(luma_or_rgbin_pivot * m.y_g + offset_out_for_patch);
320 2 v_patch_B = _mm_set1_epi32(luma_or_rgbin_pivot * m.y_b + chroma_offset_out_for_patch);
321 4 v_patch_R = _mm_set1_epi32(luma_or_rgbin_pivot * m.y_r + chroma_offset_out_for_patch);
322 }
323 }
324 }
325
326 37 const __m128 out_offset_f_sse2 = _mm_set1_ps(out_offset_f);
327 37 __m128i zero = _mm_setzero_si128();
328 37 const __m128 scale_f_sse2 = _mm_set1_ps(scale_f);
329
330 __m128i m_uy_G, m_vr_G, m_uy_B, m_vr_B, m_uy_R, m_vr_R;
331 __m128 coeff_out0_in0, coeff_out0_in1, coeff_out0_in2;
332 __m128 coeff_out1_in0, coeff_out1_in1, coeff_out1_in2;
333 __m128 coeff_out2_in0, coeff_out2_in1, coeff_out2_in2;
334 __m128 m_offset_out_y_or_g_f, m_offset_out_u_or_b_f, m_offset_out_v_or_r_f;
335
336 if constexpr (float_matrix_workflow) {
337 __m128 m_y_g_f, m_y_b_f, m_y_r_f, m_u_g_f, m_u_b_f, m_u_r_f, m_v_g_f, m_v_b_f, m_v_r_f;
338 24 m_y_g_f = _mm_mul_ps(_mm_set1_ps(m.y_g_f), scale_f_sse2);
339 24 m_y_b_f = _mm_mul_ps(_mm_set1_ps(m.y_b_f), scale_f_sse2);
340 24 m_y_r_f = _mm_mul_ps(_mm_set1_ps(m.y_r_f), scale_f_sse2);
341 if constexpr (direction != ConversionDirection::RGB_TO_Y) {
342 10 m_u_g_f = _mm_mul_ps(_mm_set1_ps(m.u_g_f), scale_f_sse2);
343 10 m_u_b_f = _mm_mul_ps(_mm_set1_ps(m.u_b_f), scale_f_sse2);
344 10 m_u_r_f = _mm_mul_ps(_mm_set1_ps(m.u_r_f), scale_f_sse2);
345 10 m_v_g_f = _mm_mul_ps(_mm_set1_ps(m.v_g_f), scale_f_sse2);
346 10 m_v_b_f = _mm_mul_ps(_mm_set1_ps(m.v_b_f), scale_f_sse2);
347 10 m_v_r_f = _mm_mul_ps(_mm_set1_ps(m.v_r_f), scale_f_sse2);
348 }
349
350 if constexpr (direction == ConversionDirection::YUV_TO_RGB || direction == ConversionDirection::RGB_TO_RGB) {
351 1 float rgb_out_offset_scaled = m.offset_out_f * scale_f;
352 1 m_offset_out_y_or_g_f = _mm_set1_ps(rgb_out_offset_scaled);
353 1 m_offset_out_u_or_b_f = _mm_set1_ps(rgb_out_offset_scaled);
354 1 m_offset_out_v_or_r_f = _mm_set1_ps(rgb_out_offset_scaled);
355 }
356 else if constexpr (direction == ConversionDirection::RGB_TO_YUV || direction == ConversionDirection::YUV_TO_YUV) {
357 4 float y_out_offset_scaled = m.offset_out_f * scale_f;
358 4 float uv_center_offset = final_is_float ? 0.0f : (float)half_pixel_offset_target;
359 4 m_offset_out_y_or_g_f = _mm_set1_ps(y_out_offset_scaled);
360 4 m_offset_out_u_or_b_f = _mm_set1_ps(uv_center_offset);
361 4 m_offset_out_v_or_r_f = _mm_set1_ps(uv_center_offset);
362 }
363 else if constexpr (direction == ConversionDirection::RGB_TO_Y) {
364 7 float y_out_offset_scaled = m.offset_out_f * scale_f;
365 7 m_offset_out_y_or_g_f = _mm_set1_ps(y_out_offset_scaled);
366 }
367
368 if constexpr (direction == ConversionDirection::YUV_TO_RGB) {
369 1 coeff_out0_in0 = m_y_g_f; coeff_out0_in1 = m_u_g_f; coeff_out0_in2 = m_v_g_f;
370 1 coeff_out1_in0 = m_y_b_f; coeff_out1_in1 = m_u_b_f; coeff_out1_in2 = m_v_b_f;
371 1 coeff_out2_in0 = m_y_r_f; coeff_out2_in1 = m_u_r_f; coeff_out2_in2 = m_v_r_f;
372 }
373 else if constexpr (direction == ConversionDirection::RGB_TO_YUV) {
374 3 coeff_out0_in0 = m_y_g_f; coeff_out0_in1 = m_y_b_f; coeff_out0_in2 = m_y_r_f;
375 3 coeff_out1_in0 = m_u_g_f; coeff_out1_in1 = m_u_b_f; coeff_out1_in2 = m_u_r_f;
376 3 coeff_out2_in0 = m_v_g_f; coeff_out2_in1 = m_v_b_f; coeff_out2_in2 = m_v_r_f;
377 }
378 else if constexpr (direction == ConversionDirection::RGB_TO_Y) {
379 7 coeff_out0_in0 = m_y_g_f; coeff_out0_in1 = m_y_b_f; coeff_out0_in2 = m_y_r_f;
380 }
381 else if constexpr (direction == ConversionDirection::YUV_TO_YUV) {
382 1 coeff_out0_in0 = m_y_g_f; coeff_out0_in1 = m_u_g_f; coeff_out0_in2 = m_v_g_f;
383 1 coeff_out1_in0 = m_y_b_f; coeff_out1_in1 = m_u_b_f; coeff_out1_in2 = m_v_b_f;
384 1 coeff_out2_in0 = m_y_r_f; coeff_out2_in1 = m_u_r_f; coeff_out2_in2 = m_v_r_f;
385 }
386 else if constexpr (direction == ConversionDirection::RGB_TO_RGB) {
387 coeff_out0_in0 = m_y_g_f; coeff_out0_in1 = m_u_g_f; coeff_out0_in2 = m_v_g_f;
388 coeff_out1_in0 = m_y_b_f; coeff_out1_in1 = m_u_b_f; coeff_out1_in2 = m_v_b_f;
389 coeff_out2_in0 = m_y_r_f; coeff_out2_in1 = m_u_r_f; coeff_out2_in2 = m_v_r_f;
390 }
391 }
392 else {
393 // Integer workflow coefficient setup
394 int round_and_out_offset_y_or_g;
395 int round_and_out_offset_u_or_b;
396 int round_and_out_offset_v_or_r;
397
398 if constexpr (direction == ConversionDirection::YUV_TO_RGB || direction == ConversionDirection::RGB_TO_RGB) {
399 9 round_and_out_offset_y_or_g = round_mask_plus_offset_out_scaled_i;
400 9 round_and_out_offset_u_or_b = round_mask_plus_offset_out_scaled_i;
401 9 round_and_out_offset_v_or_r = round_mask_plus_offset_out_scaled_i;
402 }
403 else if constexpr (direction == ConversionDirection::RGB_TO_YUV || direction == ConversionDirection::YUV_TO_YUV) {
404 13 round_and_out_offset_y_or_g = round_mask_plus_offset_out_scaled_i;
405 13 round_and_out_offset_u_or_b = round_mask_plus_offset_out_chroma_scaled_i;
406 13 round_and_out_offset_v_or_r = round_mask_plus_offset_out_chroma_scaled_i;
407 }
408 else if constexpr (direction == ConversionDirection::RGB_TO_Y) {
409 3 round_and_out_offset_y_or_g = round_mask_plus_offset_out_scaled_i;
410 }
411
412 if constexpr (direction == ConversionDirection::YUV_TO_RGB || direction == ConversionDirection::YUV_TO_YUV) {
413 12 m_uy_G = _mm_set1_epi32((static_cast<uint16_t>(m.y_g) << 16) | static_cast<uint16_t>(m.u_g));
414 12 m_vr_G = _mm_set1_epi32((static_cast<uint16_t>(round_and_out_offset_y_or_g) << 16) | static_cast<uint16_t>(m.v_g));
415 12 m_uy_B = _mm_set1_epi32((static_cast<uint16_t>(m.y_b) << 16) | static_cast<uint16_t>(m.u_b));
416 12 m_vr_B = _mm_set1_epi32((static_cast<uint16_t>(round_and_out_offset_u_or_b) << 16) | static_cast<uint16_t>(m.v_b));
417 12 m_uy_R = _mm_set1_epi32((static_cast<uint16_t>(m.y_r) << 16) | static_cast<uint16_t>(m.u_r));
418 12 m_vr_R = _mm_set1_epi32((static_cast<uint16_t>(round_and_out_offset_v_or_r) << 16) | static_cast<uint16_t>(m.v_r));
419 }
420 else if constexpr (direction == ConversionDirection::RGB_TO_YUV || direction == ConversionDirection::RGB_TO_RGB) {
421 10 m_uy_G = _mm_set1_epi32((static_cast<uint16_t>(m.y_g) << 16) | static_cast<uint16_t>(m.y_b));
422 10 m_vr_G = _mm_set1_epi32((static_cast<uint16_t>(round_and_out_offset_y_or_g) << 16) | static_cast<uint16_t>(m.y_r));
423 10 m_uy_B = _mm_set1_epi32((static_cast<uint16_t>(m.u_g) << 16) | static_cast<uint16_t>(m.u_b));
424 10 m_vr_B = _mm_set1_epi32((static_cast<uint16_t>(round_and_out_offset_u_or_b) << 16) | static_cast<uint16_t>(m.u_r));
425 10 m_uy_R = _mm_set1_epi32((static_cast<uint16_t>(m.v_g) << 16) | static_cast<uint16_t>(m.v_b));
426 10 m_vr_R = _mm_set1_epi32((static_cast<uint16_t>(round_and_out_offset_v_or_r) << 16) | static_cast<uint16_t>(m.v_r));
427 }
428 else if constexpr (direction == ConversionDirection::RGB_TO_Y) {
429 3 m_uy_G = _mm_set1_epi32((static_cast<uint16_t>(m.y_g) << 16) | static_cast<uint16_t>(m.y_b));
430 3 m_vr_G = _mm_set1_epi32((static_cast<uint16_t>(round_and_out_offset_y_or_g) << 16) | static_cast<uint16_t>(m.y_r));
431 }
432 }
433
434 37 const int rowsize = width * sizeof(pixel_t);
435
46/320
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, float, false, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 150 → 126 taken 5 times.
✓ Branch 150 → 151 taken 1 time.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, float, false, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 150 → 126 not taken.
✗ Branch 150 → 151 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, float, false, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 150 → 126 not taken.
✗ Branch 150 → 151 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, float, false, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 150 → 126 not taken.
✗ Branch 150 → 151 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned char, true, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 172 → 126 not taken.
✗ Branch 172 → 173 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned char, true, false, float, (YuvRgbConversionType)2>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 154 → 109 not taken.
✗ Branch 154 → 155 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned char, true, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 172 → 126 not taken.
✗ Branch 172 → 173 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned char, true, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 158 → 113 not taken.
✗ Branch 158 → 159 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned char, true, false, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 172 → 126 not taken.
✗ Branch 172 → 173 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned char, true, true, unsigned char, (YuvRgbConversionType)0>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 155 → 110 taken 30 times.
✓ Branch 155 → 156 taken 6 times.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned char, true, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 172 → 126 not taken.
✗ Branch 172 → 173 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned char, true, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 158 → 113 not taken.
✗ Branch 158 → 159 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned char, true, true, unsigned char, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 172 → 126 not taken.
✗ Branch 172 → 173 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned char, true, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 172 → 126 not taken.
✗ Branch 172 → 173 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned char, true, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 158 → 113 not taken.
✗ Branch 158 → 159 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned char, true, true, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 172 → 126 not taken.
✗ Branch 172 → 173 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, false, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 154 → 126 not taken.
✗ Branch 154 → 155 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, false, false, float, (YuvRgbConversionType)2>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 142 → 115 not taken.
✗ Branch 142 → 143 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, false, false, unsigned short, (YuvRgbConversionType)0>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 143 → 116 taken 5 times.
✓ Branch 143 → 144 taken 1 time.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, false, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 154 → 126 not taken.
✗ Branch 154 → 155 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, false, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 146 → 119 not taken.
✗ Branch 146 → 147 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, false, false, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 154 → 126 not taken.
✗ Branch 154 → 155 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, false, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 154 → 126 not taken.
✗ Branch 154 → 155 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, false, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 146 → 119 not taken.
✗ Branch 146 → 147 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, false, true, unsigned char, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 154 → 126 not taken.
✗ Branch 154 → 155 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, false, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 154 → 126 not taken.
✗ Branch 154 → 155 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, false, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 146 → 119 not taken.
✗ Branch 146 → 147 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, false, true, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 154 → 126 not taken.
✗ Branch 154 → 155 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, true, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 154 → 126 not taken.
✗ Branch 154 → 155 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, true, false, float, (YuvRgbConversionType)2>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 136 → 109 not taken.
✗ Branch 136 → 137 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, true, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 154 → 126 not taken.
✗ Branch 154 → 155 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, true, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 140 → 113 not taken.
✗ Branch 140 → 141 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, true, false, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 154 → 126 not taken.
✗ Branch 154 → 155 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, true, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 154 → 126 not taken.
✗ Branch 154 → 155 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, true, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 140 → 113 not taken.
✗ Branch 140 → 141 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, true, true, unsigned char, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 154 → 126 not taken.
✗ Branch 154 → 155 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, true, true, unsigned short, (YuvRgbConversionType)0>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 137 → 110 taken 10 times.
✓ Branch 137 → 138 taken 2 times.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, true, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 154 → 126 not taken.
✗ Branch 154 → 155 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, true, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 140 → 113 not taken.
✗ Branch 140 → 141 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, true, true, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 154 → 126 not taken.
✗ Branch 154 → 155 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, float, false, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 158 → 126 taken 5 times.
✓ Branch 158 → 159 taken 1 time.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, float, false, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 158 → 126 not taken.
✗ Branch 158 → 159 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, float, false, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 158 → 126 not taken.
✗ Branch 158 → 159 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, float, false, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 158 → 126 not taken.
✗ Branch 158 → 159 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned char, true, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 194 → 126 not taken.
✗ Branch 194 → 195 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned char, true, false, float, (YuvRgbConversionType)2>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 162 → 117 not taken.
✗ Branch 162 → 163 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned char, true, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 194 → 126 not taken.
✗ Branch 194 → 195 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned char, true, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 166 → 121 taken 5 times.
✓ Branch 166 → 167 taken 1 time.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned char, true, false, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 194 → 126 not taken.
✗ Branch 194 → 195 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned char, true, true, unsigned char, (YuvRgbConversionType)0>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 163 → 118 taken 20 times.
✓ Branch 163 → 164 taken 4 times.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned char, true, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 194 → 126 not taken.
✗ Branch 194 → 195 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned char, true, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 166 → 121 not taken.
✗ Branch 166 → 167 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned char, true, true, unsigned char, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 194 → 126 not taken.
✗ Branch 194 → 195 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned char, true, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 194 → 126 not taken.
✗ Branch 194 → 195 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned char, true, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 166 → 121 taken 5 times.
✓ Branch 166 → 167 taken 1 time.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned char, true, true, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 194 → 126 not taken.
✗ Branch 194 → 195 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, false, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 176 → 126 not taken.
✗ Branch 176 → 177 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, false, false, float, (YuvRgbConversionType)2>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 142 → 115 not taken.
✗ Branch 142 → 143 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, false, false, unsigned short, (YuvRgbConversionType)0>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 176 → 126 taken 10 times.
✓ Branch 176 → 177 taken 2 times.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, false, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 176 → 126 not taken.
✗ Branch 176 → 177 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, false, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 179 → 129 not taken.
✗ Branch 179 → 180 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, false, false, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 176 → 126 not taken.
✗ Branch 176 → 177 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, false, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 176 → 126 not taken.
✗ Branch 176 → 177 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, false, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 179 → 129 not taken.
✗ Branch 179 → 180 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, false, true, unsigned char, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 176 → 126 not taken.
✗ Branch 176 → 177 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, false, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 176 → 126 not taken.
✗ Branch 176 → 177 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, false, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 179 → 129 not taken.
✗ Branch 179 → 180 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, false, true, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 176 → 126 not taken.
✗ Branch 176 → 177 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, true, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 176 → 126 not taken.
✗ Branch 176 → 177 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, true, false, float, (YuvRgbConversionType)2>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 144 → 117 not taken.
✗ Branch 144 → 145 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, true, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 176 → 126 not taken.
✗ Branch 176 → 177 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, true, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 148 → 121 taken 15 times.
✓ Branch 148 → 149 taken 3 times.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, true, false, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 176 → 126 not taken.
✗ Branch 176 → 177 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, true, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 176 → 126 not taken.
✗ Branch 176 → 177 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, true, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 148 → 121 not taken.
✗ Branch 148 → 149 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, true, true, unsigned char, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 176 → 126 not taken.
✗ Branch 176 → 177 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, true, true, unsigned short, (YuvRgbConversionType)0>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 145 → 118 taken 5 times.
✓ Branch 145 → 146 taken 1 time.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, true, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 176 → 126 not taken.
✗ Branch 176 → 177 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, true, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 148 → 121 not taken.
✗ Branch 148 → 149 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, true, true, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 176 → 126 not taken.
✗ Branch 176 → 177 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, float, false, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 150 → 126 taken 3 times.
✓ Branch 150 → 151 taken 1 time.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, float, false, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 150 → 126 not taken.
✗ Branch 150 → 151 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, float, false, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 150 → 126 not taken.
✗ Branch 150 → 151 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, float, false, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 150 → 126 not taken.
✗ Branch 150 → 151 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned char, true, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 172 → 126 not taken.
✗ Branch 172 → 173 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned char, true, false, float, (YuvRgbConversionType)2>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 162 → 117 not taken.
✗ Branch 162 → 163 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned char, true, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 172 → 126 not taken.
✗ Branch 172 → 173 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned char, true, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 166 → 121 not taken.
✗ Branch 166 → 167 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned char, true, false, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 172 → 126 not taken.
✗ Branch 172 → 173 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned char, true, true, unsigned char, (YuvRgbConversionType)0>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 163 → 118 taken 3 times.
✓ Branch 163 → 164 taken 1 time.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned char, true, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 172 → 126 not taken.
✗ Branch 172 → 173 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned char, true, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 166 → 121 not taken.
✗ Branch 166 → 167 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned char, true, true, unsigned char, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 172 → 126 not taken.
✗ Branch 172 → 173 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned char, true, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 172 → 126 not taken.
✗ Branch 172 → 173 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned char, true, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 166 → 121 not taken.
✗ Branch 166 → 167 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned char, true, true, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 172 → 126 not taken.
✗ Branch 172 → 173 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, false, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 154 → 126 not taken.
✗ Branch 154 → 155 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, false, false, float, (YuvRgbConversionType)2>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 142 → 115 not taken.
✗ Branch 142 → 143 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, false, false, unsigned short, (YuvRgbConversionType)0>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 143 → 116 taken 6 times.
✓ Branch 143 → 144 taken 2 times.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, false, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 154 → 126 not taken.
✗ Branch 154 → 155 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, false, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 146 → 119 not taken.
✗ Branch 146 → 147 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, false, false, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 154 → 126 not taken.
✗ Branch 154 → 155 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, false, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 154 → 126 not taken.
✗ Branch 154 → 155 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, false, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 146 → 119 not taken.
✗ Branch 146 → 147 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, false, true, unsigned char, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 154 → 126 not taken.
✗ Branch 154 → 155 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, false, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 154 → 126 not taken.
✗ Branch 154 → 155 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, false, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 146 → 119 not taken.
✗ Branch 146 → 147 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, false, true, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 154 → 126 not taken.
✗ Branch 154 → 155 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, true, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 154 → 126 not taken.
✗ Branch 154 → 155 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, true, false, float, (YuvRgbConversionType)2>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 144 → 117 not taken.
✗ Branch 144 → 145 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, true, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 154 → 126 not taken.
✗ Branch 154 → 155 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, true, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 148 → 121 not taken.
✗ Branch 148 → 149 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, true, false, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 154 → 126 not taken.
✗ Branch 154 → 155 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, true, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 154 → 126 not taken.
✗ Branch 154 → 155 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, true, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 148 → 121 not taken.
✗ Branch 148 → 149 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, true, true, unsigned char, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 154 → 126 not taken.
✗ Branch 154 → 155 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, true, true, unsigned short, (YuvRgbConversionType)0>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 145 → 118 not taken.
✗ Branch 145 → 146 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, true, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 154 → 126 not taken.
✗ Branch 154 → 155 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, true, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 148 → 121 not taken.
✗ Branch 148 → 149 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, true, true, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 154 → 126 not taken.
✗ Branch 154 → 155 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, float, false, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 128 → 98 taken 6 times.
✓ Branch 128 → 129 taken 2 times.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, float, false, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 128 → 98 not taken.
✗ Branch 128 → 129 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, float, false, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 128 → 98 not taken.
✗ Branch 128 → 129 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, float, false, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 128 → 98 not taken.
✗ Branch 128 → 129 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned char, true, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 164 → 98 not taken.
✗ Branch 164 → 165 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned char, true, false, float, (YuvRgbConversionType)2>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 136 → 93 not taken.
✗ Branch 136 → 137 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned char, true, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 164 → 98 not taken.
✗ Branch 164 → 165 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned char, true, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 140 → 97 not taken.
✗ Branch 140 → 141 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned char, true, false, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 164 → 98 not taken.
✗ Branch 164 → 165 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned char, true, true, unsigned char, (YuvRgbConversionType)0>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 137 → 94 taken 3 times.
✓ Branch 137 → 138 taken 1 time.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned char, true, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 164 → 98 taken 3 times.
✓ Branch 164 → 165 taken 1 time.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned char, true, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 140 → 97 not taken.
✗ Branch 140 → 141 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned char, true, true, unsigned char, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 164 → 98 not taken.
✗ Branch 164 → 165 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned char, true, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 164 → 98 not taken.
✗ Branch 164 → 165 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned char, true, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 140 → 97 taken 3 times.
✓ Branch 140 → 141 taken 1 time.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned char, true, true, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 164 → 98 not taken.
✗ Branch 164 → 165 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, false, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 146 → 98 not taken.
✗ Branch 146 → 147 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, false, false, float, (YuvRgbConversionType)2>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 116 → 91 not taken.
✗ Branch 116 → 117 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, false, false, unsigned short, (YuvRgbConversionType)0>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 146 → 98 not taken.
✗ Branch 146 → 147 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, false, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 146 → 98 taken 3 times.
✓ Branch 146 → 147 taken 1 time.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, false, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 149 → 101 not taken.
✗ Branch 149 → 150 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, false, false, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 146 → 98 not taken.
✗ Branch 146 → 147 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, false, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 146 → 98 not taken.
✗ Branch 146 → 147 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, false, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 149 → 101 taken 3 times.
✓ Branch 149 → 150 taken 1 time.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, false, true, unsigned char, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 146 → 98 not taken.
✗ Branch 146 → 147 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, false, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 146 → 98 not taken.
✗ Branch 146 → 147 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, false, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 149 → 101 not taken.
✗ Branch 149 → 150 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, false, true, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 146 → 98 not taken.
✗ Branch 146 → 147 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, true, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 146 → 98 not taken.
✗ Branch 146 → 147 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, true, false, float, (YuvRgbConversionType)2>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 118 → 93 not taken.
✗ Branch 118 → 119 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, true, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 146 → 98 not taken.
✗ Branch 146 → 147 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, true, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 122 → 97 not taken.
✗ Branch 122 → 123 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, true, false, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 146 → 98 taken 3 times.
✓ Branch 146 → 147 taken 1 time.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, true, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 146 → 98 not taken.
✗ Branch 146 → 147 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, true, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 122 → 97 not taken.
✗ Branch 122 → 123 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, true, true, unsigned char, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 146 → 98 not taken.
✗ Branch 146 → 147 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, true, true, unsigned short, (YuvRgbConversionType)0>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 119 → 94 taken 3 times.
✓ Branch 119 → 120 taken 1 time.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, true, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 146 → 98 taken 3 times.
✓ Branch 146 → 147 taken 1 time.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, true, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 122 → 97 not taken.
✗ Branch 122 → 123 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, true, true, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 146 → 98 not taken.
✗ Branch 146 → 147 not taken.
194 for (int yy = 0; yy < height; yy++) {
436 // SSE2: 8 pixels per loop (8×1 byte = 8 bytes, 8×2 bytes = 16 bytes, 8×4 bytes = 32 bytes)
437
46/320
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, float, false, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 148 → 127 taken 15 times.
✓ Branch 148 → 149 taken 5 times.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, float, false, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 148 → 127 not taken.
✗ Branch 148 → 149 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, float, false, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 148 → 127 not taken.
✗ Branch 148 → 149 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, float, false, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 148 → 127 not taken.
✗ Branch 148 → 149 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned char, true, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 170 → 127 not taken.
✗ Branch 170 → 171 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned char, true, false, float, (YuvRgbConversionType)2>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 152 → 110 not taken.
✗ Branch 152 → 153 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned char, true, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 170 → 127 not taken.
✗ Branch 170 → 171 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned char, true, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 156 → 114 not taken.
✗ Branch 156 → 157 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned char, true, false, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 170 → 127 not taken.
✗ Branch 170 → 171 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned char, true, true, unsigned char, (YuvRgbConversionType)0>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 153 → 111 taken 120 times.
✓ Branch 153 → 154 taken 30 times.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned char, true, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 170 → 127 not taken.
✗ Branch 170 → 171 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned char, true, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 156 → 114 not taken.
✗ Branch 156 → 157 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned char, true, true, unsigned char, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 170 → 127 not taken.
✗ Branch 170 → 171 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned char, true, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 170 → 127 not taken.
✗ Branch 170 → 171 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned char, true, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 156 → 114 not taken.
✗ Branch 156 → 157 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned char, true, true, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 170 → 127 not taken.
✗ Branch 170 → 171 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, false, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 152 → 127 not taken.
✗ Branch 152 → 153 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, false, false, float, (YuvRgbConversionType)2>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 140 → 116 not taken.
✗ Branch 140 → 141 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, false, false, unsigned short, (YuvRgbConversionType)0>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 141 → 117 taken 20 times.
✓ Branch 141 → 142 taken 5 times.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, false, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 152 → 127 not taken.
✗ Branch 152 → 153 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, false, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 144 → 120 not taken.
✗ Branch 144 → 145 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, false, false, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 152 → 127 not taken.
✗ Branch 152 → 153 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, false, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 152 → 127 not taken.
✗ Branch 152 → 153 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, false, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 144 → 120 not taken.
✗ Branch 144 → 145 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, false, true, unsigned char, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 152 → 127 not taken.
✗ Branch 152 → 153 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, false, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 152 → 127 not taken.
✗ Branch 152 → 153 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, false, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 144 → 120 not taken.
✗ Branch 144 → 145 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, false, true, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 152 → 127 not taken.
✗ Branch 152 → 153 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, true, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 152 → 127 not taken.
✗ Branch 152 → 153 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, true, false, float, (YuvRgbConversionType)2>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 134 → 110 not taken.
✗ Branch 134 → 135 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, true, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 152 → 127 not taken.
✗ Branch 152 → 153 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, true, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 138 → 114 not taken.
✗ Branch 138 → 139 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, true, false, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 152 → 127 not taken.
✗ Branch 152 → 153 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, true, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 152 → 127 not taken.
✗ Branch 152 → 153 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, true, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 138 → 114 not taken.
✗ Branch 138 → 139 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, true, true, unsigned char, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 152 → 127 not taken.
✗ Branch 152 → 153 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, true, true, unsigned short, (YuvRgbConversionType)0>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 135 → 111 taken 40 times.
✓ Branch 135 → 136 taken 10 times.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, true, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 152 → 127 not taken.
✗ Branch 152 → 153 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, true, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 138 → 114 not taken.
✗ Branch 138 → 139 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)0, unsigned short, true, true, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 152 → 127 not taken.
✗ Branch 152 → 153 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, float, false, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 156 → 127 taken 15 times.
✓ Branch 156 → 157 taken 5 times.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, float, false, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 156 → 127 not taken.
✗ Branch 156 → 157 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, float, false, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 156 → 127 not taken.
✗ Branch 156 → 157 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, float, false, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 156 → 127 not taken.
✗ Branch 156 → 157 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned char, true, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 192 → 127 not taken.
✗ Branch 192 → 193 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned char, true, false, float, (YuvRgbConversionType)2>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 160 → 118 not taken.
✗ Branch 160 → 161 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned char, true, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 192 → 127 not taken.
✗ Branch 192 → 193 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned char, true, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 164 → 122 taken 25 times.
✓ Branch 164 → 165 taken 5 times.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned char, true, false, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 192 → 127 not taken.
✗ Branch 192 → 193 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned char, true, true, unsigned char, (YuvRgbConversionType)0>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 161 → 119 taken 75 times.
✓ Branch 161 → 162 taken 20 times.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned char, true, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 192 → 127 not taken.
✗ Branch 192 → 193 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned char, true, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 164 → 122 not taken.
✗ Branch 164 → 165 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned char, true, true, unsigned char, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 192 → 127 not taken.
✗ Branch 192 → 193 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned char, true, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 192 → 127 not taken.
✗ Branch 192 → 193 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned char, true, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 164 → 122 taken 25 times.
✓ Branch 164 → 165 taken 5 times.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned char, true, true, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 192 → 127 not taken.
✗ Branch 192 → 193 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, false, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 174 → 127 not taken.
✗ Branch 174 → 175 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, false, false, float, (YuvRgbConversionType)2>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 140 → 116 not taken.
✗ Branch 140 → 141 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, false, false, unsigned short, (YuvRgbConversionType)0>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 174 → 127 taken 35 times.
✓ Branch 174 → 175 taken 10 times.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, false, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 174 → 127 not taken.
✗ Branch 174 → 175 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, false, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 177 → 130 not taken.
✗ Branch 177 → 178 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, false, false, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 174 → 127 not taken.
✗ Branch 174 → 175 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, false, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 174 → 127 not taken.
✗ Branch 174 → 175 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, false, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 177 → 130 not taken.
✗ Branch 177 → 178 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, false, true, unsigned char, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 174 → 127 not taken.
✗ Branch 174 → 175 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, false, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 174 → 127 not taken.
✗ Branch 174 → 175 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, false, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 177 → 130 not taken.
✗ Branch 177 → 178 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, false, true, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 174 → 127 not taken.
✗ Branch 174 → 175 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, true, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 174 → 127 not taken.
✗ Branch 174 → 175 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, true, false, float, (YuvRgbConversionType)2>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 142 → 118 not taken.
✗ Branch 142 → 143 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, true, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 174 → 127 not taken.
✗ Branch 174 → 175 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, true, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 146 → 122 taken 75 times.
✓ Branch 146 → 147 taken 15 times.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, true, false, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 174 → 127 not taken.
✗ Branch 174 → 175 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, true, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 174 → 127 not taken.
✗ Branch 174 → 175 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, true, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 146 → 122 not taken.
✗ Branch 146 → 147 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, true, true, unsigned char, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 174 → 127 not taken.
✗ Branch 174 → 175 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, true, true, unsigned short, (YuvRgbConversionType)0>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 143 → 119 taken 15 times.
✓ Branch 143 → 144 taken 5 times.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, true, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 174 → 127 not taken.
✗ Branch 174 → 175 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, true, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 146 → 122 not taken.
✗ Branch 146 → 147 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)1, unsigned short, true, true, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 174 → 127 not taken.
✗ Branch 174 → 175 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, float, false, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 148 → 127 taken 6 times.
✓ Branch 148 → 149 taken 3 times.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, float, false, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 148 → 127 not taken.
✗ Branch 148 → 149 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, float, false, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 148 → 127 not taken.
✗ Branch 148 → 149 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, float, false, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 148 → 127 not taken.
✗ Branch 148 → 149 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned char, true, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 170 → 127 not taken.
✗ Branch 170 → 171 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned char, true, false, float, (YuvRgbConversionType)2>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 160 → 118 not taken.
✗ Branch 160 → 161 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned char, true, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 170 → 127 not taken.
✗ Branch 170 → 171 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned char, true, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 164 → 122 not taken.
✗ Branch 164 → 165 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned char, true, false, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 170 → 127 not taken.
✗ Branch 170 → 171 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned char, true, true, unsigned char, (YuvRgbConversionType)0>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 161 → 119 taken 9 times.
✓ Branch 161 → 162 taken 3 times.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned char, true, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 170 → 127 not taken.
✗ Branch 170 → 171 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned char, true, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 164 → 122 not taken.
✗ Branch 164 → 165 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned char, true, true, unsigned char, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 170 → 127 not taken.
✗ Branch 170 → 171 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned char, true, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 170 → 127 not taken.
✗ Branch 170 → 171 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned char, true, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 164 → 122 not taken.
✗ Branch 164 → 165 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned char, true, true, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 170 → 127 not taken.
✗ Branch 170 → 171 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, false, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 152 → 127 not taken.
✗ Branch 152 → 153 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, false, false, float, (YuvRgbConversionType)2>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 140 → 116 not taken.
✗ Branch 140 → 141 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, false, false, unsigned short, (YuvRgbConversionType)0>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 141 → 117 taken 18 times.
✓ Branch 141 → 142 taken 6 times.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, false, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 152 → 127 not taken.
✗ Branch 152 → 153 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, false, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 144 → 120 not taken.
✗ Branch 144 → 145 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, false, false, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 152 → 127 not taken.
✗ Branch 152 → 153 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, false, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 152 → 127 not taken.
✗ Branch 152 → 153 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, false, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 144 → 120 not taken.
✗ Branch 144 → 145 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, false, true, unsigned char, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 152 → 127 not taken.
✗ Branch 152 → 153 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, false, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 152 → 127 not taken.
✗ Branch 152 → 153 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, false, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 144 → 120 not taken.
✗ Branch 144 → 145 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, false, true, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 152 → 127 not taken.
✗ Branch 152 → 153 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, true, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 152 → 127 not taken.
✗ Branch 152 → 153 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, true, false, float, (YuvRgbConversionType)2>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 142 → 118 not taken.
✗ Branch 142 → 143 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, true, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 152 → 127 not taken.
✗ Branch 152 → 153 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, true, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 146 → 122 not taken.
✗ Branch 146 → 147 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, true, false, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 152 → 127 not taken.
✗ Branch 152 → 153 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, true, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 152 → 127 not taken.
✗ Branch 152 → 153 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, true, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 146 → 122 not taken.
✗ Branch 146 → 147 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, true, true, unsigned char, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 152 → 127 not taken.
✗ Branch 152 → 153 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, true, true, unsigned short, (YuvRgbConversionType)0>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 143 → 119 not taken.
✗ Branch 143 → 144 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, true, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 152 → 127 not taken.
✗ Branch 152 → 153 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, true, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 146 → 122 not taken.
✗ Branch 146 → 147 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)2, unsigned short, true, true, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 152 → 127 not taken.
✗ Branch 152 → 153 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, float, false, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 126 → 99 taken 24 times.
✓ Branch 126 → 127 taken 6 times.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, float, false, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 126 → 99 not taken.
✗ Branch 126 → 127 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, float, false, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 126 → 99 not taken.
✗ Branch 126 → 127 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, float, false, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 126 → 99 not taken.
✗ Branch 126 → 127 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned char, true, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 162 → 99 not taken.
✗ Branch 162 → 163 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned char, true, false, float, (YuvRgbConversionType)2>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 134 → 94 not taken.
✗ Branch 134 → 135 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned char, true, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 162 → 99 not taken.
✗ Branch 162 → 163 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned char, true, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 138 → 98 not taken.
✗ Branch 138 → 139 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned char, true, false, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 162 → 99 not taken.
✗ Branch 162 → 163 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned char, true, true, unsigned char, (YuvRgbConversionType)0>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 135 → 95 taken 12 times.
✓ Branch 135 → 136 taken 3 times.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned char, true, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 162 → 99 taken 12 times.
✓ Branch 162 → 163 taken 3 times.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned char, true, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 138 → 98 not taken.
✗ Branch 138 → 139 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned char, true, true, unsigned char, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 162 → 99 not taken.
✗ Branch 162 → 163 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned char, true, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 162 → 99 not taken.
✗ Branch 162 → 163 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned char, true, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 138 → 98 taken 12 times.
✓ Branch 138 → 139 taken 3 times.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned char, true, true, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 162 → 99 not taken.
✗ Branch 162 → 163 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, false, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 144 → 99 not taken.
✗ Branch 144 → 145 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, false, false, float, (YuvRgbConversionType)2>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 114 → 92 not taken.
✗ Branch 114 → 115 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, false, false, unsigned short, (YuvRgbConversionType)0>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 144 → 99 not taken.
✗ Branch 144 → 145 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, false, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 144 → 99 taken 12 times.
✓ Branch 144 → 145 taken 3 times.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, false, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 147 → 102 not taken.
✗ Branch 147 → 148 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, false, false, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 144 → 99 not taken.
✗ Branch 144 → 145 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, false, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 144 → 99 not taken.
✗ Branch 144 → 145 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, false, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 147 → 102 taken 12 times.
✓ Branch 147 → 148 taken 3 times.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, false, true, unsigned char, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 144 → 99 not taken.
✗ Branch 144 → 145 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, false, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 144 → 99 not taken.
✗ Branch 144 → 145 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, false, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 147 → 102 not taken.
✗ Branch 147 → 148 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, false, true, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 144 → 99 not taken.
✗ Branch 144 → 145 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, true, false, float, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 144 → 99 not taken.
✗ Branch 144 → 145 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, true, false, float, (YuvRgbConversionType)2>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 116 → 94 not taken.
✗ Branch 116 → 117 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, true, false, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 144 → 99 not taken.
✗ Branch 144 → 145 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, true, false, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 120 → 98 not taken.
✗ Branch 120 → 121 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, true, false, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 144 → 99 taken 12 times.
✓ Branch 144 → 145 taken 3 times.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, true, true, unsigned char, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 144 → 99 not taken.
✗ Branch 144 → 145 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, true, true, unsigned char, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 120 → 98 not taken.
✗ Branch 120 → 121 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, true, true, unsigned char, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 144 → 99 not taken.
✗ Branch 144 → 145 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, true, true, unsigned short, (YuvRgbConversionType)0>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 117 → 95 taken 12 times.
✓ Branch 117 → 118 taken 3 times.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, true, true, unsigned short, (YuvRgbConversionType)1>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✓ Branch 144 → 99 taken 12 times.
✓ Branch 144 → 145 taken 3 times.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, true, true, unsigned short, (YuvRgbConversionType)3>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 120 → 98 not taken.
✗ Branch 120 → 121 not taken.
void convert_yuv_to_planarrgb_sse2_internal<(ConversionDirection)4, unsigned short, true, true, unsigned short, (YuvRgbConversionType)4>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int):
✗ Branch 144 → 99 not taken.
✗ Branch 144 → 145 not taken.
770 for (int x = 0; x < rowsize; x += 8 * sizeof(pixel_t)) {
438 __m128i in0, in1, in2;
439 __m128 in0_f_lo, in0_f_hi, in1_f_lo, in1_f_hi, in2_f_lo, in2_f_hi;
440
441 // Load 8 pixels
442 if constexpr (sizeof(pixel_t) == 1) {
443 290 __m128i in0_raw = _mm_loadl_epi64(reinterpret_cast<const __m128i*>(srcp[0] + x));
444 290 __m128i in1_raw = _mm_loadl_epi64(reinterpret_cast<const __m128i*>(srcp[1] + x));
445 290 __m128i in2_raw = _mm_loadl_epi64(reinterpret_cast<const __m128i*>(srcp[2] + x));
446 290 in0 = _mm_unpacklo_epi8(in0_raw, zero);
447 290 in1 = _mm_unpacklo_epi8(in1_raw, zero);
448 568 in2 = _mm_unpacklo_epi8(in2_raw, zero);
449 }
450 else if constexpr (sizeof(pixel_t) == 2) {
451 263 in0 = _mm_load_si128(reinterpret_cast<const __m128i*>(srcp[0] + x));
452 263 in1 = _mm_load_si128(reinterpret_cast<const __m128i*>(srcp[1] + x));
453 443 in2 = _mm_load_si128(reinterpret_cast<const __m128i*>(srcp[2] + x));
454 }
455 else { // sizeof(pixel_t) == 4
456 60 in0_f_lo = _mm_load_ps(reinterpret_cast<const float*>(srcp[0] + x));
457 60 in0_f_hi = _mm_load_ps(reinterpret_cast<const float*>(srcp[0] + x + 16));
458 60 in1_f_lo = _mm_load_ps(reinterpret_cast<const float*>(srcp[1] + x));
459 60 in1_f_hi = _mm_load_ps(reinterpret_cast<const float*>(srcp[1] + x + 16));
460 60 in2_f_lo = _mm_load_ps(reinterpret_cast<const float*>(srcp[2] + x));
461 120 in2_f_hi = _mm_load_ps(reinterpret_cast<const float*>(srcp[2] + x + 16));
462 }
463
464 if constexpr (float_matrix_workflow) {
465 // Float workflow
466 if constexpr (sizeof(pixel_t) == 4) {
467 // Float input - apply offset_in
468 if constexpr (direction == ConversionDirection::YUV_TO_RGB || direction == ConversionDirection::YUV_TO_YUV) {
469 21 in0_f_lo = _mm_add_ps(in0_f_lo, offset_in_f);
470 21 in0_f_hi = _mm_add_ps(in0_f_hi, offset_in_f);
471 }
472 else { // RGB source RGB_TO_RGB, RGB_TO_YUV, RGB_TO_Y
473 39 in0_f_lo = _mm_add_ps(in0_f_lo, offset_in_f);
474 39 in0_f_hi = _mm_add_ps(in0_f_hi, offset_in_f);
475 39 in1_f_lo = _mm_add_ps(in1_f_lo, offset_in_f);
476 39 in1_f_hi = _mm_add_ps(in1_f_hi, offset_in_f);
477 39 in2_f_lo = _mm_add_ps(in2_f_lo, offset_in_f);
478 39 in2_f_hi = _mm_add_ps(in2_f_hi, offset_in_f);
479 }
480 }
481 else {
482 // Integer input - convert to float
483 if constexpr (direction == ConversionDirection::YUV_TO_RGB || direction == ConversionDirection::YUV_TO_YUV) {
484 // Y channel
485 __m128i in0_32_lo = _mm_add_epi32(_mm_unpacklo_epi16(in0, zero), offset_in);
486 __m128i in0_32_hi = _mm_add_epi32(_mm_unpackhi_epi16(in0, zero), offset_in);
487 in0_f_lo = _mm_cvtepi32_ps(in0_32_lo);
488 in0_f_hi = _mm_cvtepi32_ps(in0_32_hi);
489 // U,V: sign-extend and convert
490 auto chroma_to_float = [&](__m128i c, __m128& f_lo, __m128& f_hi) {
491 c = _mm_sub_epi16(c, half);
492 __m128i sign = _mm_srai_epi16(c, 15);
493 f_lo = _mm_cvtepi32_ps(_mm_unpacklo_epi16(c, sign));
494 f_hi = _mm_cvtepi32_ps(_mm_unpackhi_epi16(c, sign));
495 };
496 chroma_to_float(in1, in1_f_lo, in1_f_hi);
497 chroma_to_float(in2, in2_f_lo, in2_f_hi);
498 }
499 else { // RGB source
500 285 in0_f_lo = _mm_cvtepi32_ps(_mm_add_epi32(_mm_unpacklo_epi16(in0, zero), offset_in));
501 285 in0_f_hi = _mm_cvtepi32_ps(_mm_add_epi32(_mm_unpackhi_epi16(in0, zero), offset_in));
502 285 in1_f_lo = _mm_cvtepi32_ps(_mm_add_epi32(_mm_unpacklo_epi16(in1, zero), offset_in));
503 285 in1_f_hi = _mm_cvtepi32_ps(_mm_add_epi32(_mm_unpackhi_epi16(in1, zero), offset_in));
504 285 in2_f_lo = _mm_cvtepi32_ps(_mm_add_epi32(_mm_unpacklo_epi16(in2, zero), offset_in));
505 285 in2_f_hi = _mm_cvtepi32_ps(_mm_add_epi32(_mm_unpackhi_epi16(in2, zero), offset_in));
506 }
507 }
508
509 // Matrix multiply (SSE2 doesn't have FMA, use mul+add)
510 465 auto matrix_multiply = [&](__m128 i0_lo, __m128 i0_hi, __m128 i1_lo, __m128 i1_hi, __m128 i2_lo, __m128 i2_hi,
511 __m128& o0_lo, __m128& o0_hi, __m128& o1_lo, __m128& o1_hi, __m128& o2_lo, __m128& o2_hi) {
512 XP_LAMBDA_CAPTURE_FIX(coeff_out0_in0); XP_LAMBDA_CAPTURE_FIX(coeff_out0_in1); XP_LAMBDA_CAPTURE_FIX(coeff_out0_in2);
513 XP_LAMBDA_CAPTURE_FIX(coeff_out1_in0); XP_LAMBDA_CAPTURE_FIX(coeff_out1_in1); XP_LAMBDA_CAPTURE_FIX(coeff_out1_in2);
514 XP_LAMBDA_CAPTURE_FIX(coeff_out2_in0); XP_LAMBDA_CAPTURE_FIX(coeff_out2_in1); XP_LAMBDA_CAPTURE_FIX(coeff_out2_in2);
515 XP_LAMBDA_CAPTURE_FIX(m_offset_out_y_or_g_f); XP_LAMBDA_CAPTURE_FIX(m_offset_out_u_or_b_f); XP_LAMBDA_CAPTURE_FIX(m_offset_out_v_or_r_f);
516
517 930 o0_lo = _mm_add_ps(_mm_mul_ps(coeff_out0_in2, i2_lo), _mm_add_ps(_mm_mul_ps(coeff_out0_in1, i1_lo), _mm_add_ps(_mm_mul_ps(coeff_out0_in0, i0_lo), m_offset_out_y_or_g_f)));
518 930 o0_hi = _mm_add_ps(_mm_mul_ps(coeff_out0_in2, i2_hi), _mm_add_ps(_mm_mul_ps(coeff_out0_in1, i1_hi), _mm_add_ps(_mm_mul_ps(coeff_out0_in0, i0_hi), m_offset_out_y_or_g_f)));
519 if constexpr (direction != ConversionDirection::RGB_TO_Y) {
520 426 o1_lo = _mm_add_ps(_mm_mul_ps(coeff_out1_in2, i2_lo), _mm_add_ps(_mm_mul_ps(coeff_out1_in1, i1_lo), _mm_add_ps(_mm_mul_ps(coeff_out1_in0, i0_lo), m_offset_out_u_or_b_f)));
521 426 o1_hi = _mm_add_ps(_mm_mul_ps(coeff_out1_in2, i2_hi), _mm_add_ps(_mm_mul_ps(coeff_out1_in1, i1_hi), _mm_add_ps(_mm_mul_ps(coeff_out1_in0, i0_hi), m_offset_out_u_or_b_f)));
522 426 o2_lo = _mm_add_ps(_mm_mul_ps(coeff_out2_in2, i2_lo), _mm_add_ps(_mm_mul_ps(coeff_out2_in1, i1_lo), _mm_add_ps(_mm_mul_ps(coeff_out2_in0, i0_lo), m_offset_out_v_or_r_f)));
523 426 o2_hi = _mm_add_ps(_mm_mul_ps(coeff_out2_in2, i2_hi), _mm_add_ps(_mm_mul_ps(coeff_out2_in1, i1_hi), _mm_add_ps(_mm_mul_ps(coeff_out2_in0, i0_hi), m_offset_out_v_or_r_f)));
524 }
525 };
526
527 __m128 out0_f_lo, out0_f_hi, out1_f_lo, out1_f_hi, out2_f_lo, out2_f_hi;
528 155 matrix_multiply(in0_f_lo, in0_f_hi, in1_f_lo, in1_f_hi, in2_f_lo, in2_f_hi,
529 out0_f_lo, out0_f_hi, out1_f_lo, out1_f_hi, out2_f_lo, out2_f_hi);
530
531 584 auto process_from_float_plane_sse2 = [&](BYTE* plane_ptr, __m128 lo, __m128 hi) {
532 XP_LAMBDA_CAPTURE_FIX(zero); XP_LAMBDA_CAPTURE_FIX(limit);
533 #ifdef XP_TLS
534 if (final_is_float) {
535 #else
536 if constexpr (final_is_float) {
537 #endif
538 132 const int pix_idx = x / sizeof(pixel_t);
539 132 float* f_dst = reinterpret_cast<float*>(plane_ptr) + pix_idx;
540 _mm_store_ps(f_dst, lo);
541 132 _mm_store_ps(f_dst + 4, hi);
542 }
543 else {
544 165 __m128 float_rounder = _mm_set1_ps(0.5f);
545 330 __m128i res_lo = _mm_cvttps_epi32(_mm_add_ps(lo, float_rounder));
546 165 __m128i res_hi = _mm_cvttps_epi32(_mm_add_ps(hi, float_rounder));
547 165 const int pix_idx = x * sizeof(pixel_t_dst) / sizeof(pixel_t);
548
549 if constexpr (sizeof(pixel_t_dst) == 1) {
550 24 __m128i p = _mm_packs_epi32(res_lo, res_hi);
551 24 __m128i final8 = _mm_packus_epi16(p, zero);
552 24 _mm_storel_epi64(reinterpret_cast<__m128i*>(plane_ptr + pix_idx), final8);
553 }
554 else if constexpr (sizeof(pixel_t_dst) == 2) {
555 __m128i p;
556 if constexpr (lessthan16bit_target) {
557 12 p = _mm_packs_epi32(res_lo, res_hi);
558 24 p = _mm_max_epi16(_mm_min_epi16(p, limit), zero);
559 }
560 else {
561 129 p = _MM_PACKUS_EPI32(res_lo, res_hi);
562 }
563 141 _mm_store_si128(reinterpret_cast<__m128i*>(plane_ptr + pix_idx), p);
564 }
565 }
566 };
567
568 155 process_from_float_plane_sse2(dstp[0], out0_f_lo, out0_f_hi);
569 if constexpr (direction != ConversionDirection::RGB_TO_Y) {
570 71 process_from_float_plane_sse2(dstp[1], out1_f_lo, out1_f_hi);
571 71 process_from_float_plane_sse2(dstp[2], out2_f_lo, out2_f_hi);
572 }
573 }
574 else {
575 // Integer matrix arithmetic
576 if constexpr (lessthan16bit) {
577 if constexpr (direction == ConversionDirection::RGB_TO_YUV || direction == ConversionDirection::RGB_TO_RGB || direction == ConversionDirection::RGB_TO_Y) {
578 251 in0 = _mm_adds_epi16(in0, offset_in);
579 251 in1 = _mm_adds_epi16(in1, offset_in);
580 251 in2 = _mm_adds_epi16(in2, offset_in);
581 }
582 else {
583 169 in0 = _mm_adds_epi16(in0, offset_in);
584 }
585 }
586 else {
587 if constexpr (direction == ConversionDirection::RGB_TO_YUV || direction == ConversionDirection::RGB_TO_RGB || direction == ConversionDirection::RGB_TO_Y) {
588 in0 = _mm_xor_si128(in0, sign_flip_mask);
589 in1 = _mm_xor_si128(in1, sign_flip_mask);
590 in2 = _mm_xor_si128(in2, sign_flip_mask);
591 }
592 else {
593 38 in0 = _mm_xor_si128(in0, sign_flip_mask);
594 }
595 }
596
597 if constexpr (direction == ConversionDirection::YUV_TO_RGB || direction == ConversionDirection::YUV_TO_YUV) {
598 207 in1 = _mm_sub_epi16(in1, half);
599 207 in2 = _mm_sub_epi16(in2, half);
600 }
601
602 458 __m128i uy_lo = _mm_unpacklo_epi16(in1, in0);
603 458 __m128i uy_hi = _mm_unpackhi_epi16(in1, in0);
604 458 __m128i vr_lo = _mm_unpacklo_epi16(in2, m128i_round_scale);
605 458 __m128i vr_hi = _mm_unpackhi_epi16(in2, m128i_round_scale);
606
607 3062 auto process_plane = [&](BYTE* plane_ptr, __m128i m_uy, __m128i m_vr, __m128i v_patch, auto apply_float_offset_out) {
608 XP_LAMBDA_CAPTURE_FIX(limit);
609 // Note: v_patch is already set to the right 32 or 64 bits width based on final_is_float and lessthan16bit
610 3906 auto madd_scale = [&](__m128i uy, __m128i vr) {
611 XP_LAMBDA_CAPTURE_FIX(v_patch); XP_LAMBDA_CAPTURE_FIX(target_shift);
612 7812 __m128i sum = _mm_add_epi32(_mm_madd_epi16(m_uy, uy), _mm_madd_epi16(m_vr, vr));
613 #ifdef XP_TLS
614 if (!final_is_float)
615 #else
616 if constexpr (!final_is_float)
617 #endif
618 {
619 // this one needs to be in sse2, sign extension needed for epi32->64
620 __m128i sum_lo, sum_hi;
621 #ifdef XP_TLS
622 if (!would_need_64bit_v_patch) {
623 #else
624 if constexpr (!would_need_64bit_v_patch) {
625 #endif
626 4434 sum = _mm_add_epi32(sum, v_patch);
627 }
628 else {
629 // use two 64 bit sums
630 __m128i sign_mask = _mm_srai_epi32(sum, 31);
631 // sign extend 32->64 (no cvtepi32_epi64 in SSE2)
632 sum_lo = _mm_unpacklo_epi32(sum, sign_mask);
633 sum_lo = _mm_add_epi64(sum_lo, v_patch);
634 sum_hi = _mm_unpackhi_epi32(sum, sign_mask);
635 sum_hi = _mm_add_epi64(sum_hi, v_patch);
636 }
637 // target_shift is INT_ARITH_SHIFT - modified with bit-conversion diff, bit fixed point shift
638 #ifdef XP_TLS
639 if (!would_need_64bit_v_patch) {
640 #else
641 if constexpr (!would_need_64bit_v_patch) {
642 #endif
643 774 sum = _mm_srai_epi32(sum, target_shift);
644 }
645 else {
646 // no epi64 arithmetic shift in SSE2/AVX2
647 sum_lo = mm_srai_epi64_simul(sum_lo, target_shift);
648 sum_hi = mm_srai_epi64_simul(sum_hi, target_shift);
649 }
650 #ifdef XP_TLS
651 if (would_need_64bit_v_patch) {
652 #else
653 if constexpr (would_need_64bit_v_patch) {
654 #endif
655 // pack back to 32 bit, SSE2: cvtepi64_epi32 is avx512 only
656 /*
657 __m128i packed_lo = _mm_shuffle_epi32(sum_lo, _MM_SHUFFLE(2, 0, 2, 0));
658 __m128i packed_hi = _mm_shuffle_epi32(sum_hi, _MM_SHUFFLE(2, 0, 2, 0));
659 sum = _mm_unpacklo_epi64(packed_lo, packed_hi);
660 */
661 __m128i packed_lo = _mm_shuffle_epi32(sum_lo, _MM_SHUFFLE(2, 0, 2, 0));
662
663 // #0 and 1 from packed_lo, #0 and 2 from sum_hi
664 sum = _mm_castps_si128(_mm_shuffle_ps(
665 _mm_castsi128_ps(packed_lo),
666 _mm_castsi128_ps(sum_hi),
667 _MM_SHUFFLE(2, 0, 1, 0)
668 ));
669 }
670 }
671 else {
672 // no 64-bit needed, no overflow danger in pivot, since no U and V integer offset which is the cause of overflow.
673 sum = _mm_add_epi32(sum, v_patch);
674 }
675 2604 return sum;
676 };
677
678 1302 __m128i res_lo = madd_scale(uy_lo, vr_lo);
679 1302 __m128i res_hi = madd_scale(uy_hi, vr_hi);
680
681 #ifdef XP_TLS
682 if (final_is_float) {
683 #else
684 if constexpr (final_is_float) {
685 #endif
686 const int pix_idx = x / sizeof(pixel_t);
687 float* f_dst = reinterpret_cast<float*>(plane_ptr) + pix_idx;
688 auto store_block = [&](float* ptr, __m128i b, auto apply_float_offset_out) {
689 __m128 result = _mm_mul_ps(_mm_cvtepi32_ps(b), scale_f_sse2);
690 if (apply_float_offset_out)
691 result = _mm_add_ps(result, out_offset_f_sse2);
692 _mm_store_ps(ptr, result);
693 };
694 store_block(f_dst, res_lo, apply_float_offset_out);
695 store_block(f_dst + 4, res_hi, apply_float_offset_out);
696 }
697 else {
698 1302 const int pix_idx = x * sizeof(pixel_t_dst) / sizeof(pixel_t);
699 if constexpr (sizeof(pixel_t_dst) == 1) {
700 624 __m128i p = _mm_packs_epi32(res_lo, res_hi);
701 624 __m128i final8 = _mm_packus_epi16(p, zero);
702 624 _mm_storel_epi64(reinterpret_cast<__m128i*>(plane_ptr + pix_idx), final8);
703 }
704 else {
705 __m128i p;
706 if constexpr (lessthan16bit_target) {
707 264 p = _mm_packs_epi32(res_lo, res_hi);
708 528 p = _mm_max_epi16(_mm_min_epi16(p, limit), zero);
709 }
710 else {
711 414 p = _MM_PACKUS_EPI32(res_lo, res_hi);
712 }
713 678 _mm_store_si128(reinterpret_cast<__m128i*>(plane_ptr + pix_idx), p);
714 }
715 }
716 };
717
718 // Process planes, using pre-packed coefficient, and the 16 bit patch if needed
719 458 process_plane(dstp[0], m_uy_G, m_vr_G, v_patch_G, true /* apply_float_offset_out */);
720 // only Y,R,G,B needs it uniformly, so for YUV, we call it with false
721 // last param: apply_float_offset_out
722 if constexpr (direction == ConversionDirection::YUV_TO_RGB || direction == ConversionDirection::RGB_TO_RGB) {
723 180 process_plane(dstp[1], m_uy_B, m_vr_B, v_patch_B, true);
724 180 process_plane(dstp[2], m_uy_R, m_vr_R, v_patch_R, true);
725 }
726 else if constexpr (direction == ConversionDirection::RGB_TO_YUV || direction == ConversionDirection::YUV_TO_YUV) {
727 242 process_plane(dstp[1], m_uy_B, m_vr_B, v_patch_B, false);
728 242 process_plane(dstp[2], m_uy_R, m_vr_R, v_patch_R, false);
729 }
730 else if constexpr (direction != ConversionDirection::RGB_TO_Y) {
731 // no other planes
732 }
733 }
734 } // x loop
735
736 157 srcp[0] += srcPitch[0];
737 157 srcp[1] += srcPitch[1];
738 157 srcp[2] += srcPitch[2];
739 157 dstp[0] += dstPitch[0];
740 if constexpr (direction != ConversionDirection::RGB_TO_Y) {
741 127 dstp[1] += dstPitch[1];
742 127 dstp[2] += dstPitch[2];
743 }
744 } // y loop
745 37 }
746 #undef XP_LAMBDA_CAPTURE_FIX
747
748 template<ConversionDirection direction, typename pixel_t_src, bool lessthan16bit>
749 37 void convert_yuv_to_planarrgb_sse2(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m,
750 int bits_per_pixel, int bits_per_pixel_target, bool force_float)
751 {
752 // Accuracy forever: forced float or float input
753
14/24
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)0, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 11 taken 6 times.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)0, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 11 taken 1 time.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)0, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 11 taken 2 times.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)1, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 11 taken 6 times.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)1, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 11 taken 2 times.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)1, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 11 taken 4 times.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)2, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 11 taken 1 time.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)2, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 11 taken 2 times.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)2, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 11 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)4, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✓ Branch 2 → 3 taken 1 time.
✓ Branch 2 → 11 taken 2 times.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)4, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✓ Branch 2 → 3 taken 1 time.
✓ Branch 2 → 11 taken 1 time.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)4, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✓ Branch 2 → 3 taken 1 time.
✓ Branch 2 → 11 taken 2 times.
32 if (force_float || std::is_floating_point<pixel_t_src>::value) {
754
7/32
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)0, float, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 1 time.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)0, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)0, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)0, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)1, float, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 1 time.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)1, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)1, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)1, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)2, float, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 1 time.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)2, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)2, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)2, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)4, float, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 2 times.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)4, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✓ Branch 3 → 4 taken 1 time.
✗ Branch 3 → 5 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)4, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 5 taken 1 time.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)4, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 5 taken 1 time.
8 if (bits_per_pixel_target == 8) {
755 1 convert_yuv_to_planarrgb_sse2_internal<direction, pixel_t_src, lessthan16bit, true, uint8_t, YuvRgbConversionType::FORCE_FLOAT>(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target);
756 }
757
6/32
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)0, float, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 6 taken 1 time.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)0, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 7 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)0, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 7 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)0, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 7 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)1, float, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 6 taken 1 time.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)1, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 7 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)1, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 7 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)1, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 7 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)2, float, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 6 taken 1 time.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)2, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 7 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)2, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 7 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)2, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 7 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)4, float, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 6 taken 2 times.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)4, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 7 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)4, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 5 → 6 not taken.
✓ Branch 5 → 7 taken 1 time.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)4, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✓ Branch 5 → 6 taken 1 time.
✗ Branch 5 → 7 not taken.
7 else if (bits_per_pixel_target < 16) {
758 1 convert_yuv_to_planarrgb_sse2_internal<direction, pixel_t_src, lessthan16bit, true, uint16_t, YuvRgbConversionType::FORCE_FLOAT>(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target);
759 }
760
5/32
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)0, float, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 8 taken 1 time.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)0, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)0, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)0, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)1, float, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 8 taken 1 time.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)1, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)1, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)1, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)2, float, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 8 taken 1 time.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)2, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)2, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)2, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)4, float, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 8 taken 2 times.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)4, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)4, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✓ Branch 7 → 8 taken 1 time.
✗ Branch 7 → 9 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)4, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
6 else if (bits_per_pixel_target == 16) {
761 1 convert_yuv_to_planarrgb_sse2_internal<direction, pixel_t_src, lessthan16bit, false, uint16_t, YuvRgbConversionType::FORCE_FLOAT>(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target);
762 }
763 else { // 32 bit float target
764 5 convert_yuv_to_planarrgb_sse2_internal<direction, pixel_t_src, lessthan16bit, false, float, YuvRgbConversionType::FORCE_FLOAT>(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target);
765 }
766 8 return;
767 }
768
769 // Integer input paths
770 if constexpr (!std::is_floating_point<pixel_t_src>::value) {
771 29 const bool need_conversion = bits_per_pixel_target != bits_per_pixel;
772
15/24
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)0, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✓ Branch 11 → 12 taken 6 times.
✗ Branch 11 → 14 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)0, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✓ Branch 11 → 12 taken 1 time.
✗ Branch 11 → 14 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)0, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✓ Branch 11 → 12 taken 2 times.
✗ Branch 11 → 14 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)1, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✓ Branch 11 → 12 taken 4 times.
✓ Branch 11 → 14 taken 2 times.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)1, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✓ Branch 11 → 12 taken 2 times.
✗ Branch 11 → 14 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)1, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✓ Branch 11 → 12 taken 1 time.
✓ Branch 11 → 14 taken 3 times.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)2, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✓ Branch 11 → 12 taken 1 time.
✗ Branch 11 → 14 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)2, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✓ Branch 11 → 12 taken 2 times.
✗ Branch 11 → 14 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)2, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 14 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)4, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✓ Branch 11 → 12 taken 1 time.
✓ Branch 11 → 14 taken 1 time.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)4, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 14 taken 1 time.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)4, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✓ Branch 11 → 12 taken 1 time.
✓ Branch 11 → 14 taken 1 time.
29 if (!need_conversion) {
773 // No bit-depth conversion, just color space conversion
774 21 convert_yuv_to_planarrgb_sse2_internal<direction, pixel_t_src, lessthan16bit, lessthan16bit, pixel_t_src, YuvRgbConversionType::NATIVE_INT>(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target);
775 21 return;
776 }
777
778 8 const bool full_d = m.offset_out == 0;
779
10/48
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)0, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 14 → 15 not taken.
✗ Branch 14 → 29 not taken.
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 29 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)0, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 14 → 15 not taken.
✗ Branch 14 → 29 not taken.
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 29 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)0, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 14 → 15 not taken.
✗ Branch 14 → 29 not taken.
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 29 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)1, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✓ Branch 14 → 15 taken 2 times.
✗ Branch 14 → 29 not taken.
✓ Branch 15 → 16 taken 2 times.
✗ Branch 15 → 29 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)1, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 14 → 15 not taken.
✗ Branch 14 → 29 not taken.
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 29 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)1, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✓ Branch 14 → 15 taken 3 times.
✗ Branch 14 → 29 not taken.
✓ Branch 15 → 16 taken 3 times.
✗ Branch 15 → 29 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)2, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 14 → 15 not taken.
✗ Branch 14 → 29 not taken.
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 29 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)2, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 14 → 15 not taken.
✗ Branch 14 → 29 not taken.
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 29 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)2, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 14 → 15 not taken.
✗ Branch 14 → 29 not taken.
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 29 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)4, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✓ Branch 14 → 15 taken 1 time.
✗ Branch 14 → 29 not taken.
✓ Branch 15 → 16 taken 1 time.
✗ Branch 15 → 29 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)4, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✓ Branch 14 → 15 taken 1 time.
✗ Branch 14 → 29 not taken.
✓ Branch 15 → 16 taken 1 time.
✗ Branch 15 → 29 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)4, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✓ Branch 14 → 15 taken 1 time.
✗ Branch 14 → 29 not taken.
✓ Branch 15 → 16 taken 1 time.
✗ Branch 15 → 29 not taken.
8 if (bits_per_pixel_target >= 8 && bits_per_pixel <= 16) {
780
5/24
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)0, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 20 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)0, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 20 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)0, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 20 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)1, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 16 → 17 not taken.
✓ Branch 16 → 20 taken 2 times.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)1, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 20 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)1, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 16 → 17 not taken.
✓ Branch 16 → 20 taken 3 times.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)2, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 20 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)2, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 20 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)2, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 20 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)4, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 16 → 17 not taken.
✓ Branch 16 → 20 taken 1 time.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)4, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✓ Branch 16 → 17 taken 1 time.
✗ Branch 16 → 20 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)4, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 16 → 17 not taken.
✓ Branch 16 → 20 taken 1 time.
8 if (bits_per_pixel_target == 8) {
781
1/24
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)0, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 19 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)0, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 19 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)0, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 19 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)1, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 19 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)1, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 19 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)1, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 19 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)2, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 19 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)2, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 19 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)2, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 19 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)4, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 19 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)4, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 17 → 18 not taken.
✓ Branch 17 → 19 taken 1 time.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)4, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 19 not taken.
1 if (full_d)
782 convert_yuv_to_planarrgb_sse2_internal<direction, pixel_t_src, lessthan16bit, true, uint8_t, YuvRgbConversionType::BITCONV_INT_FULL>(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target);
783 else
784 1 convert_yuv_to_planarrgb_sse2_internal<direction, pixel_t_src, lessthan16bit, true, uint8_t, YuvRgbConversionType::BITCONV_INT_LIMITED>(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target);
785 }
786
5/24
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)0, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 24 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)0, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 24 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)0, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 24 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)1, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✓ Branch 20 → 21 taken 1 time.
✓ Branch 20 → 24 taken 1 time.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)1, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 24 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)1, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 20 → 21 not taken.
✓ Branch 20 → 24 taken 3 times.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)2, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 24 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)2, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 24 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)2, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 24 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)4, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✓ Branch 20 → 21 taken 1 time.
✗ Branch 20 → 24 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)4, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 24 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)4, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 20 → 21 not taken.
✓ Branch 20 → 24 taken 1 time.
7 else if (bits_per_pixel_target < 16) {
787
2/24
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)0, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 23 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)0, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 23 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)0, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 23 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)1, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 21 → 22 not taken.
✓ Branch 21 → 23 taken 1 time.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)1, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 23 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)1, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 23 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)2, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 23 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)2, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 23 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)2, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 23 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)4, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 21 → 22 not taken.
✓ Branch 21 → 23 taken 1 time.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)4, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 23 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)4, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 23 not taken.
2 if (full_d)
788 convert_yuv_to_planarrgb_sse2_internal<direction, pixel_t_src, lessthan16bit, true, uint16_t, YuvRgbConversionType::BITCONV_INT_FULL>(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target);
789 else
790 2 convert_yuv_to_planarrgb_sse2_internal<direction, pixel_t_src, lessthan16bit, true, uint16_t, YuvRgbConversionType::BITCONV_INT_LIMITED>(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target);
791 }
792
3/24
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)0, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 28 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)0, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 28 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)0, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 28 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)1, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✓ Branch 24 → 25 taken 1 time.
✗ Branch 24 → 28 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)1, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 28 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)1, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✓ Branch 24 → 25 taken 3 times.
✗ Branch 24 → 28 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)2, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 28 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)2, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 28 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)2, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 28 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)4, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 28 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)4, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 28 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)4, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✓ Branch 24 → 25 taken 1 time.
✗ Branch 24 → 28 not taken.
5 else if (bits_per_pixel_target == 16) {
793
3/24
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)0, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 27 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)0, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 27 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)0, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 27 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)1, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 25 → 26 not taken.
✓ Branch 25 → 27 taken 1 time.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)1, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 27 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)1, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 25 → 26 not taken.
✓ Branch 25 → 27 taken 3 times.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)2, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 27 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)2, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 27 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)2, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 27 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)4, unsigned char, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 27 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)4, unsigned short, false>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 27 not taken.
void convert_yuv_to_planarrgb_sse2<(ConversionDirection)4, unsigned short, true>(unsigned char* (&) [3], int (&) [3], unsigned char const* (&) [3], int const (&) [3], int, int, ConversionMatrix const&, int, int, bool):
✓ Branch 25 → 26 taken 1 time.
✗ Branch 25 → 27 not taken.
5 if (full_d)
794 1 convert_yuv_to_planarrgb_sse2_internal<direction, pixel_t_src, lessthan16bit, false, uint16_t, YuvRgbConversionType::BITCONV_INT_FULL>(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target);
795 else
796 4 convert_yuv_to_planarrgb_sse2_internal<direction, pixel_t_src, lessthan16bit, false, uint16_t, YuvRgbConversionType::BITCONV_INT_LIMITED>(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target);
797 }
798 else { // 32 bit float target
799 convert_yuv_to_planarrgb_sse2_internal<direction, pixel_t_src, lessthan16bit, false, float, YuvRgbConversionType::FLOAT_OUTPUT>(dstp, dstPitch, srcp, srcPitch, width, height, m, bits_per_pixel, bits_per_pixel_target);
800 }
801 }
802 }
803 }
804
805 // Template instantiations for SSE2
806 // YUV_TO_RGB
807 template void convert_yuv_to_planarrgb_sse2<ConversionDirection::YUV_TO_RGB, uint8_t, true>(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float);
808 template void convert_yuv_to_planarrgb_sse2<ConversionDirection::YUV_TO_RGB, uint16_t, true>(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float);
809 template void convert_yuv_to_planarrgb_sse2<ConversionDirection::YUV_TO_RGB, uint16_t, false>(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float);
810 template void convert_yuv_to_planarrgb_sse2<ConversionDirection::YUV_TO_RGB, float, false>(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float);
811
812 // RGB_TO_YUV
813 template void convert_yuv_to_planarrgb_sse2<ConversionDirection::RGB_TO_YUV, uint8_t, true>(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float);
814 template void convert_yuv_to_planarrgb_sse2<ConversionDirection::RGB_TO_YUV, uint16_t, true>(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float);
815 template void convert_yuv_to_planarrgb_sse2<ConversionDirection::RGB_TO_YUV, uint16_t, false>(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float);
816 template void convert_yuv_to_planarrgb_sse2<ConversionDirection::RGB_TO_YUV, float, false>(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float);
817
818 // RGB_TO_Y
819 template void convert_yuv_to_planarrgb_sse2<ConversionDirection::RGB_TO_Y, uint8_t, true>(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float);
820 template void convert_yuv_to_planarrgb_sse2<ConversionDirection::RGB_TO_Y, uint16_t, true>(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float);
821 template void convert_yuv_to_planarrgb_sse2<ConversionDirection::RGB_TO_Y, uint16_t, false>(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float);
822 template void convert_yuv_to_planarrgb_sse2<ConversionDirection::RGB_TO_Y, float, false>(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float);
823
824 // YUV_TO_YUV (for future use)
825 template void convert_yuv_to_planarrgb_sse2<ConversionDirection::YUV_TO_YUV, uint8_t, true>(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float);
826 template void convert_yuv_to_planarrgb_sse2<ConversionDirection::YUV_TO_YUV, uint16_t, true>(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float);
827 template void convert_yuv_to_planarrgb_sse2<ConversionDirection::YUV_TO_YUV, uint16_t, false>(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float);
828 template void convert_yuv_to_planarrgb_sse2<ConversionDirection::YUV_TO_YUV, float, false>(BYTE* (&dstp)[3], int(&dstPitch)[3], const BYTE* (&srcp)[3], const int(&srcPitch)[3], int width, int height, const ConversionMatrix& m, int bits_per_pixel, int bits_per_pixel_target, bool force_float);
829
830 // kept for reference
831 // packed rgb helper
832 static AVS_FORCEINLINE __m128i convert_yuv_to_rgb_sse2_core(const __m128i &px01, const __m128i &px23, const __m128i &px45, const __m128i &px67, const __m128i& zero, const __m128i &matrix, const __m128i &round_mask_plus_rgb_offset) {
833 //int b = (((int)m[0] * Y + (int)m[1] * U + (int)m[ 2] * V + 4096)>>13);
834
835 //px01 - xx xx 00 V1 00 U1 00 Y1 xx xx 00 V0 00 U0 00 Y0
836
837 1152 __m128i low_lo = _mm_madd_epi16(px01, matrix); //xx*0 + v1*m2 | u1*m1 + y1*m0 | xx*0 + v0*m2 | u0*m1 + y0*m0
838 576 __m128i low_hi = _mm_madd_epi16(px23, matrix); //xx*0 + v3*m2 | u3*m1 + y3*m0 | xx*0 + v2*m2 | u2*m1 + y2*m0
839 576 __m128i high_lo = _mm_madd_epi16(px45, matrix);
840 1152 __m128i high_hi = _mm_madd_epi16(px67, matrix);
841
842 1728 __m128i low_v = _mm_castps_si128(_mm_shuffle_ps(_mm_castsi128_ps(low_lo), _mm_castsi128_ps(low_hi), _MM_SHUFFLE(3, 1, 3, 1))); // v3*m2 | v2*m2 | v1*m2 | v0*m2
843 1728 __m128i high_v = _mm_castps_si128(_mm_shuffle_ps(_mm_castsi128_ps(high_lo), _mm_castsi128_ps(high_hi), _MM_SHUFFLE(3, 1, 3, 1)));
844
845 1728 __m128i low_yu = _mm_castps_si128(_mm_shuffle_ps(_mm_castsi128_ps(low_lo), _mm_castsi128_ps(low_hi), _MM_SHUFFLE(2, 0, 2, 0))); // u3*m1 + y3*m0 | u2*m1 + y2*m0 | u1*m1 + y1*m0 | u0*m1 + y0*m0
846 1728 __m128i high_yu = _mm_castps_si128(_mm_shuffle_ps(_mm_castsi128_ps(high_lo), _mm_castsi128_ps(high_hi), _MM_SHUFFLE(2, 0, 2, 0)));
847
848 576 __m128i t_lo = _mm_add_epi32(low_v, low_yu); // v3*m2 + u3*m1 + y3*m0...
849 576 __m128i t_hi = _mm_add_epi32(high_v, high_yu);
850
851 576 t_lo = _mm_add_epi32(t_lo, round_mask_plus_rgb_offset); // v3*m2 + u3*m1 + y3*m0 + 4096...
852 1152 t_hi = _mm_add_epi32(t_hi, round_mask_plus_rgb_offset);
853
854 576 t_lo = _mm_srai_epi32(t_lo, 13); // (v3*m2 + u3*m1 + y3*m0 + 4096) >> 13...
855 576 t_hi = _mm_srai_epi32(t_hi, 13);
856
857 576 __m128i result = _mm_packs_epi32(t_lo, t_hi);
858 576 result = _mm_packus_epi16(result, zero); //00 00 00 00 00 00 00 00 b7 b6 b5 b4 b3 b2 b1 b0
859 576 return result;
860 }
861
862 template<int rgb_pixel_step, bool hasAlpha>
863 #if defined(GCC) || defined(CLANG)
864 __attribute__((__target__("ssse3")))
865 #endif
866 8 void convert_yv24_to_rgb_ssse3(BYTE* dstp, const BYTE* srcY, const BYTE* srcU, const BYTE*srcV, const BYTE*srcA, size_t dst_pitch, size_t src_pitch_y, size_t src_pitch_uv, size_t src_pitch_a, size_t width, size_t height, const ConversionMatrix &matrix)
867 {
868 8 dstp += dst_pitch * (height-1); // We start at last line
869
870 8 size_t mod8_width = rgb_pixel_step == 3 ? width / 8 * 8 : width; // for rgb32 target we may process pixels beyond width, but we have at least 32 bytes alignment at target
871
872 8 __m128i matrix_b = _mm_set_epi16(0, matrix.v_b, matrix.u_b, matrix.y_b, 0, matrix.v_b, matrix.u_b, matrix.y_b);
873 8 __m128i matrix_g = _mm_set_epi16(0, matrix.v_g, matrix.u_g, matrix.y_g, 0, matrix.v_g, matrix.u_g, matrix.y_g);
874 16 __m128i matrix_r = _mm_set_epi16(0, matrix.v_r, matrix.u_r, matrix.y_r, 0, matrix.v_r, matrix.u_r, matrix.y_r);
875
876 8 __m128i zero = _mm_setzero_si128();
877
878 // .13 bit frac integer arithmetic
879 8 int round_mask_plus_rgb_offset_i = (1 << 12) + (matrix.offset_rgb << 13);
880 8 __m128i round_mask_plus_rgb_offset = _mm_set1_epi32(round_mask_plus_rgb_offset_i);
881
882 16 __m128i offset = _mm_set_epi16(0, -128, -128, matrix.offset_y, 0, -128, -128, matrix.offset_y);
883 8 __m128i pixels0123_mask = _mm_set_epi8(0, 0, 0, 0, 14, 13, 12, 10, 9, 8, 6, 5, 4, 2, 1, 0);
884 8 __m128i pixels4567_mask = _mm_set_epi8(4, 2, 1, 0, 0, 0, 0, 0, 14, 13, 12, 10, 9, 8, 6, 5);
885 8 __m128i ssse3_merge_mask = _mm_set_epi32(0xFFFFFFFF, 0, 0, 0);
886
887 // 8 YUV(A) pixels --> 2x16 RGB quads = 32 bytes. Avisynth's alignment is 64 so we are more than safe.
888
889
6/8
void convert_yv24_to_rgb_ssse3<3, false>(unsigned char*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, ConversionMatrix const&):
✓ Branch 248 → 23 taken 9 times.
✓ Branch 248 → 249 taken 3 times.
void convert_yv24_to_rgb_ssse3<3, true>(unsigned char*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, ConversionMatrix const&):
✗ Branch 251 → 23 not taken.
✗ Branch 251 → 252 not taken.
void convert_yv24_to_rgb_ssse3<4, false>(unsigned char*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, ConversionMatrix const&):
✓ Branch 232 → 23 taken 6 times.
✓ Branch 232 → 233 taken 2 times.
void convert_yv24_to_rgb_ssse3<4, true>(unsigned char*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, ConversionMatrix const&):
✓ Branch 235 → 23 taken 9 times.
✓ Branch 235 → 236 taken 3 times.
32 for (size_t y = 0; y < height; ++y) {
890
6/8
void convert_yv24_to_rgb_ssse3<3, false>(unsigned char*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, ConversionMatrix const&):
✓ Branch 239 → 24 taken 36 times.
✓ Branch 239 → 240 taken 9 times.
void convert_yv24_to_rgb_ssse3<3, true>(unsigned char*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, ConversionMatrix const&):
✗ Branch 243 → 24 not taken.
✗ Branch 243 → 244 not taken.
void convert_yv24_to_rgb_ssse3<4, false>(unsigned char*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, ConversionMatrix const&):
✓ Branch 229 → 24 taken 24 times.
✓ Branch 229 → 230 taken 6 times.
void convert_yv24_to_rgb_ssse3<4, true>(unsigned char*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, ConversionMatrix const&):
✓ Branch 233 → 24 taken 36 times.
✓ Branch 233 → 234 taken 9 times.
120 for (size_t x = 0; x < mod8_width; x+=8) {
891 96 __m128i src_y = _mm_loadl_epi64(reinterpret_cast<const __m128i*>(srcY+x)); //0 0 0 0 0 0 0 0 Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0
892 96 __m128i src_u = _mm_loadl_epi64(reinterpret_cast<const __m128i*>(srcU+x)); //0 0 0 0 0 0 0 0 U7 U6 U5 U4 U3 U2 U1 U0
893 156 __m128i src_v = _mm_loadl_epi64(reinterpret_cast<const __m128i*>(srcV+x)); //0 0 0 0 0 0 0 0 V7 V6 V5 V4 V3 V2 V1 V0
894 [[maybe_unused]] __m128i src_a;
895 if constexpr(hasAlpha)
896 72 src_a = _mm_loadl_epi64(reinterpret_cast<const __m128i*>(srcA+x)); //0 0 0 0 0 0 0 0 A7 A6 A5 A4 A3 A2 A1 A0
897
898 96 __m128i t1 = _mm_unpacklo_epi8(src_y, src_u); //U7 Y7 U6 Y6 U5 Y5 U4 Y4 U3 Y3 U2 Y2 U1 Y1 U0 Y0
899 192 __m128i t2 = _mm_unpacklo_epi8(src_v, zero); //00 V7 00 V6 00 V5 00 V4 00 V3 00 V2 00 V1 00 V0
900
901 96 __m128i low = _mm_unpacklo_epi16(t1, t2); //xx V3 U3 Y3 xx V2 U2 Y2 xx V1 U1 Y1 xx V0 U0 Y0
902 96 __m128i high = _mm_unpackhi_epi16(t1, t2); //xx V7 U7 Y7 xx V6 U6 Y6 xx V5 U5 Y5 xx V4 U4 Y4
903
904 96 __m128i px01 = _mm_unpacklo_epi8(low, zero); //xx xx 00 V1 00 U1 00 Y1 xx xx 00 V0 00 U0 00 Y0
905 96 __m128i px23 = _mm_unpackhi_epi8(low, zero); //xx xx 00 V3 00 U3 00 Y3 xx xx 00 V2 00 U2 00 Y2
906 96 __m128i px45 = _mm_unpacklo_epi8(high, zero); //xx xx 00 V5 00 U5 00 Y5 xx xx 00 V4 00 U4 00 Y4
907 96 __m128i px67 = _mm_unpackhi_epi8(high, zero); //xx xx 00 V7 00 U7 00 Y7 xx xx 00 V6 00 U6 00 Y6
908
909 96 px01 = _mm_add_epi16(px01, offset);
910 96 px23 = _mm_add_epi16(px23, offset);
911 96 px45 = _mm_add_epi16(px45, offset);
912 192 px67 = _mm_add_epi16(px67, offset);
913
914 96 __m128i result_b = convert_yuv_to_rgb_sse2_core(px01, px23, px45, px67, zero, matrix_b, round_mask_plus_rgb_offset); //00 00 00 00 00 00 00 00 b7 b6 b5 b4 b3 b2 b1 b0
915 96 __m128i result_g = convert_yuv_to_rgb_sse2_core(px01, px23, px45, px67, zero, matrix_g, round_mask_plus_rgb_offset); //00 00 00 00 00 00 00 00 g7 g6 g5 g4 g3 g2 g1 g0
916 96 __m128i result_r = convert_yuv_to_rgb_sse2_core(px01, px23, px45, px67, zero, matrix_r, round_mask_plus_rgb_offset); //00 00 00 00 00 00 00 00 r7 r6 r5 r4 r3 r2 r1 r0
917
918 96 __m128i result_bg = _mm_unpacklo_epi8(result_b, result_g); //g7 b7 g6 b6 g5 b5 g4 b4 g3 b3 g2 b2 g1 b1 g0 b0
919 __m128i alpha;
920 if constexpr(hasAlpha)
921 36 alpha = src_a; // a7 .. a0
922 else
923 60 alpha = _mm_cmpeq_epi32(result_r, result_r); // FF FF FF FF ... default alpha transparent
924
925 96 __m128i result_ra = _mm_unpacklo_epi8(result_r, alpha); //a7 r7 a6 r6 a5 r5 a4 r4 a3 r3 a2 r2 a1 r1 a0 r0
926
927 96 __m128i result_lo = _mm_unpacklo_epi16(result_bg, result_ra);
928 96 __m128i result_hi = _mm_unpackhi_epi16(result_bg, result_ra);
929
930 if constexpr(rgb_pixel_step == 4) {
931 //rgb32
932 60 _mm_store_si128(reinterpret_cast<__m128i*>(dstp+x*4), result_lo);
933 60 _mm_store_si128(reinterpret_cast<__m128i*>(dstp+x*4+16), result_hi);
934 }
935 else {
936 //rgb24
937 //"fast" SSSE3 version
938 36 __m128i px0123 = _mm_shuffle_epi8(result_lo, pixels0123_mask); //xxxx xxxx b3g3 r3b2 g2r2 b1g1 r1b0 g0r0
939 36 __m128i dst567 = _mm_shuffle_epi8(result_hi, pixels4567_mask); //r5b4 g4r4 xxxx xxxx b7g7 r7b6 g6r6 b5g5
940
941 72 __m128i dst012345 = _mm_or_si128(
942 _mm_andnot_si128(ssse3_merge_mask, px0123),
943 _mm_and_si128(ssse3_merge_mask, dst567)
944 ); //r5b4 g4r4 b3g3 r3b2 g2r2 b1g1 r1b0 g0r0
945
946 36 _mm_storeu_si128(reinterpret_cast<__m128i*>(dstp + x * 3), dst012345);
947 36 _mm_storel_epi64(reinterpret_cast<__m128i*>(dstp + x * 3 + 16), dst567);
948
949 }
950 }
951
952 if constexpr(rgb_pixel_step == 3) {
953 // for rgb32 (pixel_step == 4) we processed full width and more, including padded 8 bytes
954
2/4
void convert_yv24_to_rgb_ssse3<3, false>(unsigned char*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, ConversionMatrix const&):
✓ Branch 245 → 241 taken 27 times.
✓ Branch 245 → 246 taken 9 times.
void convert_yv24_to_rgb_ssse3<3, true>(unsigned char*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, ConversionMatrix const&):
✗ Branch 249 → 245 not taken.
✗ Branch 249 → 250 not taken.
36 for (size_t x = mod8_width; x < width; ++x) {
955 27 int Y = srcY[x] + matrix.offset_y;
956 27 int U = srcU[x] - 128;
957 27 int V = srcV[x] - 128;
958 27 int b = (((int)matrix.y_b * Y + (int)matrix.u_b * U + (int)matrix.v_b * V + round_mask_plus_rgb_offset_i) >> 13);
959 27 int g = (((int)matrix.y_g * Y + (int)matrix.u_g * U + (int)matrix.v_g * V + round_mask_plus_rgb_offset_i) >> 13);
960 27 int r = (((int)matrix.y_r * Y + (int)matrix.u_r * U + (int)matrix.v_r * V + round_mask_plus_rgb_offset_i) >> 13);
961 27 dstp[x*rgb_pixel_step + 0] = PixelClip(b);
962 27 dstp[x*rgb_pixel_step + 1] = PixelClip(g);
963 27 dstp[x*rgb_pixel_step + 2] = PixelClip(r);
964 if constexpr(rgb_pixel_step == 4) { // n/a
965 dstp[x * 4 + 3] = 255;
966 }
967 }
968 }
969 24 dstp -= dst_pitch;
970 24 srcY += src_pitch_y;
971 24 srcU += src_pitch_uv;
972 24 srcV += src_pitch_uv;
973 if(hasAlpha)
974 9 srcA += src_pitch_a;
975 }
976 8 }
977
978 //instantiate
979 //template<int rgb_pixel_step, bool targetHasAlpha>
980 template void convert_yv24_to_rgb_ssse3<3, false>(BYTE* dstp, const BYTE* srcY, const BYTE* srcU, const BYTE*srcV, const BYTE*srcA, size_t dst_pitch, size_t src_pitch_y, size_t src_pitch_uv, size_t src_pitch_a, size_t width, size_t height, const ConversionMatrix &matrix);
981 template void convert_yv24_to_rgb_ssse3<4, false>(BYTE* dstp, const BYTE* srcY, const BYTE* srcU, const BYTE*srcV, const BYTE*srcA, size_t dst_pitch, size_t src_pitch_y, size_t src_pitch_uv, size_t src_pitch_a, size_t width, size_t height, const ConversionMatrix &matrix);
982 template void convert_yv24_to_rgb_ssse3<3, true>(BYTE* dstp, const BYTE* srcY, const BYTE* srcU, const BYTE*srcV, const BYTE*srcA, size_t dst_pitch, size_t src_pitch_y, size_t src_pitch_uv, size_t src_pitch_a, size_t width, size_t height, const ConversionMatrix &matrix);
983 template void convert_yv24_to_rgb_ssse3<4, true>(BYTE* dstp, const BYTE* srcY, const BYTE* srcU, const BYTE*srcV, const BYTE*srcA, size_t dst_pitch, size_t src_pitch_y, size_t src_pitch_uv, size_t src_pitch_a, size_t width, size_t height, const ConversionMatrix &matrix);
984
985
986 template<int rgb_pixel_step, bool hasAlpha>
987 8 void convert_yv24_to_rgb_sse2(BYTE* dstp, const BYTE* srcY, const BYTE* srcU, const BYTE*srcV, const BYTE*srcA, size_t dst_pitch, size_t src_pitch_y, size_t src_pitch_uv, size_t src_pitch_a, size_t width, size_t height, const ConversionMatrix &matrix) {
988 8 dstp += dst_pitch * (height - 1); // We start at last line
989
990 8 size_t mod8_width = rgb_pixel_step == 3 ? width / 8 * 8 : width; // for rgb32 target we may process pixels beyond width, but we have at least 32 bytes alignment at target
991
992 8 __m128i matrix_b = _mm_set_epi16(0, matrix.v_b, matrix.u_b, matrix.y_b, 0, matrix.v_b, matrix.u_b, matrix.y_b);
993 8 __m128i matrix_g = _mm_set_epi16(0, matrix.v_g, matrix.u_g, matrix.y_g, 0, matrix.v_g, matrix.u_g, matrix.y_g);
994 16 __m128i matrix_r = _mm_set_epi16(0, matrix.v_r, matrix.u_r, matrix.y_r, 0, matrix.v_r, matrix.u_r, matrix.y_r);
995
996 8 __m128i zero = _mm_setzero_si128();
997 // .13 bit frac integer arithmetic
998 8 int round_mask_plus_rgb_offset_i = (1 << 12) + (matrix.offset_rgb << 13);
999 8 __m128i round_mask_plus_rgb_offset = _mm_set1_epi32(round_mask_plus_rgb_offset_i);
1000 8 __m128i offset = _mm_set_epi16(0, -128, -128, matrix.offset_y, 0, -128, -128, matrix.offset_y);
1001
1002
6/8
void convert_yv24_to_rgb_sse2<3, false>(unsigned char*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, ConversionMatrix const&):
✓ Branch 237 → 17 taken 9 times.
✓ Branch 237 → 238 taken 3 times.
void convert_yv24_to_rgb_sse2<3, true>(unsigned char*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, ConversionMatrix const&):
✗ Branch 240 → 17 not taken.
✗ Branch 240 → 241 not taken.
void convert_yv24_to_rgb_sse2<4, false>(unsigned char*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, ConversionMatrix const&):
✓ Branch 228 → 17 taken 6 times.
✓ Branch 228 → 229 taken 2 times.
void convert_yv24_to_rgb_sse2<4, true>(unsigned char*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, ConversionMatrix const&):
✓ Branch 231 → 17 taken 9 times.
✓ Branch 231 → 232 taken 3 times.
32 for (size_t y = 0; y < height; ++y) {
1003
6/8
void convert_yv24_to_rgb_sse2<3, false>(unsigned char*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, ConversionMatrix const&):
✓ Branch 228 → 18 taken 36 times.
✓ Branch 228 → 229 taken 9 times.
void convert_yv24_to_rgb_sse2<3, true>(unsigned char*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, ConversionMatrix const&):
✗ Branch 232 → 18 not taken.
✗ Branch 232 → 233 not taken.
void convert_yv24_to_rgb_sse2<4, false>(unsigned char*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, ConversionMatrix const&):
✓ Branch 225 → 18 taken 24 times.
✓ Branch 225 → 226 taken 6 times.
void convert_yv24_to_rgb_sse2<4, true>(unsigned char*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, ConversionMatrix const&):
✓ Branch 229 → 18 taken 36 times.
✓ Branch 229 → 230 taken 9 times.
120 for (size_t x = 0; x < mod8_width; x += 8) {
1004 96 __m128i src_y = _mm_loadl_epi64(reinterpret_cast<const __m128i*>(srcY + x)); //0 0 0 0 0 0 0 0 Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0
1005 96 __m128i src_u = _mm_loadl_epi64(reinterpret_cast<const __m128i*>(srcU + x)); //0 0 0 0 0 0 0 0 U7 U6 U5 U4 U3 U2 U1 U0
1006 156 __m128i src_v = _mm_loadl_epi64(reinterpret_cast<const __m128i*>(srcV + x)); //0 0 0 0 0 0 0 0 V7 V6 V5 V4 V3 V2 V1 V0
1007 __m128i src_a;
1008 if (hasAlpha)
1009 72 src_a = _mm_loadl_epi64(reinterpret_cast<const __m128i*>(srcA + x)); //0 0 0 0 0 0 0 0 A7 A6 A5 A4 A3 A2 A1 A0
1010
1011 96 __m128i t1 = _mm_unpacklo_epi8(src_y, src_u); //U7 Y7 U6 Y6 U5 Y5 U4 Y4 U3 Y3 U2 Y2 U1 Y1 U0 Y0
1012 192 __m128i t2 = _mm_unpacklo_epi8(src_v, zero); //00 V7 00 V6 00 V5 00 V4 00 V3 00 V2 00 V1 00 V0
1013
1014 96 __m128i low = _mm_unpacklo_epi16(t1, t2); //xx V3 U3 Y3 xx V2 U2 Y2 xx V1 U1 Y1 xx V0 U0 Y0
1015 96 __m128i high = _mm_unpackhi_epi16(t1, t2); //xx V7 U7 Y7 xx V6 U6 Y6 xx V5 U5 Y5 xx V4 U4 Y4
1016
1017 96 __m128i px01 = _mm_unpacklo_epi8(low, zero); //xx xx 00 V1 00 U1 00 Y1 xx xx 00 V0 00 U0 00 Y0
1018 96 __m128i px23 = _mm_unpackhi_epi8(low, zero); //xx xx 00 V3 00 U3 00 Y3 xx xx 00 V2 00 U2 00 Y2
1019 96 __m128i px45 = _mm_unpacklo_epi8(high, zero); //xx xx 00 V5 00 U5 00 Y5 xx xx 00 V4 00 U4 00 Y4
1020 96 __m128i px67 = _mm_unpackhi_epi8(high, zero); //xx xx 00 V7 00 U7 00 Y7 xx xx 00 V6 00 U6 00 Y6
1021
1022 96 px01 = _mm_add_epi16(px01, offset);
1023 96 px23 = _mm_add_epi16(px23, offset);
1024 96 px45 = _mm_add_epi16(px45, offset);
1025 192 px67 = _mm_add_epi16(px67, offset);
1026
1027 96 __m128i result_b = convert_yuv_to_rgb_sse2_core(px01, px23, px45, px67, zero, matrix_b, round_mask_plus_rgb_offset); //00 00 00 00 00 00 00 00 b7 b6 b5 b4 b3 b2 b1 b0
1028 96 __m128i result_g = convert_yuv_to_rgb_sse2_core(px01, px23, px45, px67, zero, matrix_g, round_mask_plus_rgb_offset); //00 00 00 00 00 00 00 00 g7 g6 g5 g4 g3 g2 g1 g0
1029 96 __m128i result_r = convert_yuv_to_rgb_sse2_core(px01, px23, px45, px67, zero, matrix_r, round_mask_plus_rgb_offset); //00 00 00 00 00 00 00 00 r7 r6 r5 r4 r3 r2 r1 r0
1030
1031 96 __m128i result_bg = _mm_unpacklo_epi8(result_b, result_g); //g7 b7 g6 b6 g5 b5 g4 b4 g3 b3 g2 b2 g1 b1 g0 b0
1032 __m128i alpha;
1033 if (hasAlpha)
1034 36 alpha = src_a; // a7 .. a0
1035 else
1036 60 alpha = _mm_cmpeq_epi32(result_r, result_r); // FF FF FF FF ... default alpha transparent
1037
1038 96 __m128i result_ra = _mm_unpacklo_epi8(result_r, alpha); //a7 r7 a6 r6 a5 r5 a4 r4 a3 r3 a2 r2 a1 r1 a0 r0
1039
1040 96 __m128i result_lo = _mm_unpacklo_epi16(result_bg, result_ra);
1041 96 __m128i result_hi = _mm_unpackhi_epi16(result_bg, result_ra);
1042
1043 if constexpr (rgb_pixel_step == 4) {
1044 //rgb32
1045 60 _mm_store_si128(reinterpret_cast<__m128i*>(dstp + x * 4), result_lo);
1046 60 _mm_store_si128(reinterpret_cast<__m128i*>(dstp + x * 4 + 16), result_hi);
1047 }
1048 else {
1049 //rgb24
1050 alignas(16) BYTE temp[32];
1051 //slow SSE2 version
1052 _mm_store_si128(reinterpret_cast<__m128i*>(temp), result_lo);
1053 36 _mm_store_si128(reinterpret_cast<__m128i*>(temp + 16), result_hi);
1054
1055
2/4
void convert_yv24_to_rgb_sse2<3, false>(unsigned char*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, ConversionMatrix const&):
✓ Branch 226 → 225 taken 252 times.
✓ Branch 226 → 227 taken 36 times.
void convert_yv24_to_rgb_sse2<3, true>(unsigned char*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, ConversionMatrix const&):
✗ Branch 230 → 229 not taken.
✗ Branch 230 → 231 not taken.
288 for (int i = 0; i < 7; ++i) {
1056 252 *reinterpret_cast<int*>(dstp + (x + i) * 3) = *reinterpret_cast<int*>(temp + i * 4);
1057 }
1058 //last pixel
1059 36 dstp[(x + 7) * 3 + 0] = temp[7 * 4 + 0];
1060 36 dstp[(x + 7) * 3 + 1] = temp[7 * 4 + 1];
1061 36 dstp[(x + 7) * 3 + 2] = temp[7 * 4 + 2];
1062 }
1063 }
1064
1065 if constexpr (rgb_pixel_step == 3) {
1066 // for rgb32 (pixel_step == 4) we processed full width and more, including padded 8 bytes
1067
2/4
void convert_yv24_to_rgb_sse2<3, false>(unsigned char*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, ConversionMatrix const&):
✓ Branch 234 → 230 taken 27 times.
✓ Branch 234 → 235 taken 9 times.
void convert_yv24_to_rgb_sse2<3, true>(unsigned char*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned char const*, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, ConversionMatrix const&):
✗ Branch 238 → 234 not taken.
✗ Branch 238 → 239 not taken.
36 for (size_t x = mod8_width; x < width; ++x) {
1068 27 int Y = srcY[x] + matrix.offset_y;
1069 27 int U = srcU[x] - 128;
1070 27 int V = srcV[x] - 128;
1071 27 int b = (((int)matrix.y_b * Y + (int)matrix.u_b * U + (int)matrix.v_b * V + round_mask_plus_rgb_offset_i) >> 13);
1072 27 int g = (((int)matrix.y_g * Y + (int)matrix.u_g * U + (int)matrix.v_g * V + round_mask_plus_rgb_offset_i) >> 13);
1073 27 int r = (((int)matrix.y_r * Y + (int)matrix.u_r * U + (int)matrix.v_r * V + round_mask_plus_rgb_offset_i) >> 13);
1074 27 dstp[x*rgb_pixel_step + 0] = PixelClip(b);
1075 27 dstp[x*rgb_pixel_step + 1] = PixelClip(g);
1076 27 dstp[x*rgb_pixel_step + 2] = PixelClip(r);
1077 if constexpr (rgb_pixel_step == 4) { // n/a
1078 dstp[x * 4 + 3] = 255;
1079 }
1080 }
1081 }
1082 24 dstp -= dst_pitch;
1083 24 srcY += src_pitch_y;
1084 24 srcU += src_pitch_uv;
1085 24 srcV += src_pitch_uv;
1086 if (hasAlpha)
1087 9 srcA += src_pitch_a;
1088 }
1089 8 }
1090
1091 //instantiate
1092 //template<int rgb_pixel_step, bool targetHasAlpha>
1093 template void convert_yv24_to_rgb_sse2<3, false>(BYTE* dstp, const BYTE* srcY, const BYTE* srcU, const BYTE*srcV, const BYTE*srcA, size_t dst_pitch, size_t src_pitch_y, size_t src_pitch_uv, size_t src_pitch_a, size_t width, size_t height, const ConversionMatrix &matrix);
1094 template void convert_yv24_to_rgb_sse2<4, false>(BYTE* dstp, const BYTE* srcY, const BYTE* srcU, const BYTE*srcV, const BYTE*srcA, size_t dst_pitch, size_t src_pitch_y, size_t src_pitch_uv, size_t src_pitch_a, size_t width, size_t height, const ConversionMatrix &matrix);
1095 template void convert_yv24_to_rgb_sse2<3, true>(BYTE* dstp, const BYTE* srcY, const BYTE* srcU, const BYTE*srcV, const BYTE*srcA, size_t dst_pitch, size_t src_pitch_y, size_t src_pitch_uv, size_t src_pitch_a, size_t width, size_t height, const ConversionMatrix &matrix);
1096 template void convert_yv24_to_rgb_sse2<4, true>(BYTE* dstp, const BYTE* srcY, const BYTE* srcU, const BYTE*srcV, const BYTE*srcA, size_t dst_pitch, size_t src_pitch_y, size_t src_pitch_uv, size_t src_pitch_a, size_t width, size_t height, const ConversionMatrix &matrix);
1097
1098
1099 #ifdef X86_32
1100
1101 static AVS_FORCEINLINE __m64 convert_yuv_to_rgb_mmx_core(const __m64 &px0, const __m64 &px1, const __m64 &px2, const __m64 &px3, const __m64& zero, const __m64 &matrix, const __m64 &round_mask_plus_rgb_offset) {
1102 //int b = (((int)m[0] * Y + (int)m[1] * U + (int)m[ 2] * V + 4096)>>13);
1103
1104 //px01 - xx xx 00 V0 00 U0 00 Y0
1105
1106 __m64 low_lo = _mm_madd_pi16(px0, matrix); //xx*0 + v1*m2 | u1*m1 + y1*m0 | xx*0 + v0*m2 | u0*m1 + y0*m0
1107 __m64 low_hi = _mm_madd_pi16(px1, matrix); //xx*0 + v3*m2 | u3*m1 + y3*m0 | xx*0 + v2*m2 | u2*m1 + y2*m0
1108 __m64 high_lo = _mm_madd_pi16(px2, matrix);
1109 __m64 high_hi = _mm_madd_pi16(px3, matrix);
1110
1111 __m64 low_v = _mm_unpackhi_pi32(low_lo, low_hi); // v1*m2 | v0*m2
1112 __m64 high_v = _mm_unpackhi_pi32(high_lo, high_hi);
1113
1114 __m64 low_yu = _mm_unpacklo_pi32(low_lo, low_hi); // u1*m1 + y1*m0 | u0*m1 + y0*m0
1115 __m64 high_yu = _mm_unpacklo_pi32(high_lo, high_hi);
1116
1117 __m64 t_lo = _mm_add_pi32(low_v, low_yu); // v3*m2 + u3*m1 + y3*m0...
1118 __m64 t_hi = _mm_add_pi32(high_v, high_yu);
1119
1120 t_lo = _mm_add_pi32(t_lo, round_mask_plus_rgb_offset); // v3*m2 + u3*m1 + y3*m0 + 4096...
1121 t_hi = _mm_add_pi32(t_hi, round_mask_plus_rgb_offset);
1122
1123 t_lo = _mm_srai_pi32(t_lo, 13); // (v3*m2 + u3*m1 + y3*m0 + 4096) >> 13...
1124 t_hi = _mm_srai_pi32(t_hi, 13);
1125
1126 __m64 result = _mm_packs_pi32(t_lo, t_hi);
1127 result = _mm_packs_pu16(result, zero); //00 00 00 00 b3 b2 b1 b0
1128 return result;
1129 }
1130
1131 template<int rgb_pixel_step>
1132 void convert_yv24_to_rgb_mmx(BYTE* dstp, const BYTE* srcY, const BYTE* srcU, const BYTE*srcV, size_t dst_pitch, size_t src_pitch_y, size_t src_pitch_uv, size_t width, size_t height, const ConversionMatrix &matrix) {
1133 dstp += dst_pitch * (height-1); // We start at last line
1134
1135 size_t mod4_width = rgb_pixel_step == 3 ? width / 4 * 4 : width;
1136
1137 __m64 matrix_b = _mm_set_pi16(0, matrix.v_b, matrix.u_b, matrix.y_b);
1138 __m64 matrix_g = _mm_set_pi16(0, matrix.v_g, matrix.u_g, matrix.y_g);
1139 __m64 matrix_r = _mm_set_pi16(0, matrix.v_r, matrix.u_r, matrix.y_r);
1140
1141 __m64 zero = _mm_setzero_si64();
1142 int round_mask_plus_rgb_offset_i = 4096 + (matrix.offset_rgb << 13);
1143 __m64 round_mask_plus_rgb_offset = _mm_set1_pi32(round_mask_plus_rgb_offset_i);
1144
1145 __m64 ff = _mm_set1_pi32(0xFFFFFFFF);
1146 __m64 offset = _mm_set_pi16(0, -128, -128, matrix.offset_y);
1147 __m64 low_pixel_mask = _mm_set_pi32(0, 0x00FFFFFF);
1148 __m64 high_pixel_mask = _mm_set_pi32(0x00FFFFFF, 0);
1149
1150 for (size_t y = 0; y < height; ++y) {
1151 for (size_t x = 0; x < mod4_width; x+=4) {
1152 __m64 src_y = _mm_cvtsi32_si64(*reinterpret_cast<const int*>(srcY+x)); //0 0 0 0 Y3 Y2 Y1 Y0
1153 __m64 src_u = _mm_cvtsi32_si64(*reinterpret_cast<const int*>(srcU+x)); //0 0 0 0 U3 U2 U1 U0
1154 __m64 src_v = _mm_cvtsi32_si64(*reinterpret_cast<const int*>(srcV+x)); //0 0 0 0 V3 V2 V1 V0
1155
1156 __m64 t1 = _mm_unpacklo_pi8(src_y, src_u); //U3 Y3 U2 Y2 U1 Y1 U0 Y0
1157 __m64 t2 = _mm_unpacklo_pi8(src_v, zero); //00 V3 00 V2 00 V1 00 V0
1158
1159 __m64 low = _mm_unpacklo_pi16(t1, t2); //xx V1 U1 Y1 xx V0 U0 Y0
1160 __m64 high = _mm_unpackhi_pi16(t1, t2); //xx V3 U3 Y3 xx V2 U2 Y2
1161
1162 __m64 px0 = _mm_unpacklo_pi8(low, zero); //xx xx 00 V0 00 U0 00 Y0
1163 __m64 px1 = _mm_unpackhi_pi8(low, zero); //xx xx 00 V1 00 U1 00 Y1
1164 __m64 px2 = _mm_unpacklo_pi8(high, zero); //xx xx 00 V2 00 U2 00 Y2
1165 __m64 px3 = _mm_unpackhi_pi8(high, zero); //xx xx 00 V3 00 U3 00 Y3
1166
1167 px0 = _mm_add_pi16(px0, offset);
1168 px1 = _mm_add_pi16(px1, offset);
1169 px2 = _mm_add_pi16(px2, offset);
1170 px3 = _mm_add_pi16(px3, offset);
1171
1172 __m64 result_b = convert_yuv_to_rgb_mmx_core(px0, px1, px2, px3, zero, matrix_b, round_mask_plus_rgb_offset); //00 00 00 00 b3 b2 b1 b0
1173 __m64 result_g = convert_yuv_to_rgb_mmx_core(px0, px1, px2, px3, zero, matrix_g, round_mask_plus_rgb_offset); //00 00 00 00 g3 g2 g1 g0
1174 __m64 result_r = convert_yuv_to_rgb_mmx_core(px0, px1, px2, px3, zero, matrix_r, round_mask_plus_rgb_offset); //00 00 00 00 r3 r2 r1 r0
1175
1176 __m64 result_bg = _mm_unpacklo_pi8(result_b, result_g); //g3 b3 g2 b2 g1 b1 g0 b0
1177 __m64 result_ra = _mm_unpacklo_pi8(result_r, ff); //a3 r3 a2 r2 a1 r1 a0 r0
1178
1179 __m64 result_lo = _mm_unpacklo_pi16(result_bg, result_ra);
1180 __m64 result_hi = _mm_unpackhi_pi16(result_bg, result_ra);
1181
1182 if (rgb_pixel_step == 4) {
1183 //rgb32
1184 *reinterpret_cast<__m64*>(dstp+x*4) = result_lo;
1185 *reinterpret_cast<__m64*>(dstp+x*4+8) = result_hi;
1186 } else {
1187 __m64 p0 = _mm_and_si64(result_lo, low_pixel_mask); //0000 0000 00r0 g0b0
1188 __m64 p1 = _mm_and_si64(result_lo, high_pixel_mask); //00r1 g1b1 0000 0000
1189 __m64 p2 = _mm_and_si64(result_hi, low_pixel_mask); //0000 0000 00r2 g2b2
1190 __m64 p3 = _mm_and_si64(result_hi, high_pixel_mask); //00r3 g3b3 0000 0000
1191
1192 __m64 dst01 = _mm_or_si64(p0, _mm_srli_si64(p1, 8)); //0000 r1g1 b1r0 g0b0
1193 p3 = _mm_srli_si64(p3, 24); //0000 0000 r3g3 b300
1194
1195 __m64 dst012 = _mm_or_si64(dst01, _mm_slli_si64(p2, 48)); //g2b2 r1g1 b1r0 g0b0
1196 __m64 dst23 = _mm_or_si64(p3, _mm_srli_si64(p2, 16)); //0000 0000 r3g3 b3r2
1197
1198 *reinterpret_cast<__m64*>(dstp+x*3) = dst012;
1199 *reinterpret_cast<int*>(dstp+x*3+8) = _mm_cvtsi64_si32(dst23);
1200 }
1201 }
1202
1203 if (rgb_pixel_step == 3) {
1204 for (size_t x = mod4_width; x < width; ++x) {
1205 int Y = srcY[x] + matrix.offset_y;
1206 int U = srcU[x] - 128;
1207 int V = srcV[x] - 128;
1208 int b = (((int)matrix.y_b * Y + (int)matrix.u_b * U + (int)matrix.v_b * V + round_mask_plus_rgb_offset_i) >> 13);
1209 int g = (((int)matrix.y_g * Y + (int)matrix.u_g * U + (int)matrix.v_g * V + round_mask_plus_rgb_offset_i) >> 13);
1210 int r = (((int)matrix.y_r * Y + (int)matrix.u_r * U + (int)matrix.v_r * V + round_mask_plus_rgb_offset_i) >> 13);
1211 dstp[x*rgb_pixel_step + 0] = PixelClip(b);
1212 dstp[x*rgb_pixel_step + 1] = PixelClip(g);
1213 dstp[x*rgb_pixel_step + 2] = PixelClip(r);
1214 if (rgb_pixel_step == 4) {
1215 dstp[x * 4 + 3] = 255;
1216 }
1217 }
1218 }
1219
1220 dstp -= dst_pitch;
1221 srcY += src_pitch_y;
1222 srcU += src_pitch_uv;
1223 srcV += src_pitch_uv;
1224 }
1225 _mm_empty();
1226 }
1227
1228 //instantiate
1229 //template<int rgb_pixel_step>
1230 template void convert_yv24_to_rgb_mmx<3>(BYTE* dstp, const BYTE* srcY, const BYTE* srcU, const BYTE*srcV, size_t dst_pitch, size_t src_pitch_y, size_t src_pitch_uv, size_t width, size_t height, const ConversionMatrix &matrix);
1231 template void convert_yv24_to_rgb_mmx<4>(BYTE* dstp, const BYTE* srcY, const BYTE* srcU, const BYTE*srcV, size_t dst_pitch, size_t src_pitch_y, size_t src_pitch_uv, size_t width, size_t height, const ConversionMatrix &matrix);
1232
1233 #endif
1234
1235
1236 2 void convert_yuy2_to_yv16_sse2(const BYTE *srcp, BYTE *dstp_y, BYTE *dstp_u, BYTE *dstp_v, size_t src_pitch, size_t dst_pitch_y, size_t dst_pitch_uv, size_t width, size_t height)
1237 {
1238 2 width /= 2;
1239
1240
2/2
✓ Branch 28 → 3 taken 8 times.
✓ Branch 28 → 29 taken 2 times.
10 for (size_t y = 0; y < height; ++y) {
1241
2/2
✓ Branch 26 → 4 taken 13 times.
✓ Branch 26 → 27 taken 8 times.
21 for (size_t x = 0; x < width; x += 8) {
1242 13 __m128i p0 = _mm_load_si128(reinterpret_cast<const __m128i*>(srcp + x * 4)); // V3 Y7 U3 Y6 V2 Y5 U2 Y4 V1 Y3 U1 Y2 V0 Y1 U0 Y0
1243 26 __m128i p1 = _mm_load_si128(reinterpret_cast<const __m128i*>(srcp + x * 4 + 16)); // V7 Yf U7 Ye V6 Yd U6 Yc V5 Yb U5 Ya V4 Y9 U4 Y8
1244
1245 13 __m128i p2 = _mm_unpacklo_epi8(p0, p1); // V5 V1 Yb Y3 U5 U1 Ya Y2 V4 V0 Y9 Y1 U4 U0 Y8 Y0
1246 13 __m128i p3 = _mm_unpackhi_epi8(p0, p1); // V7 V3 Yf Y7 U7 U3 Ye Y6 V6 V2 Yd Y5 U6 U2 Yc Y4
1247
1248 13 p0 = _mm_unpacklo_epi8(p2, p3); // V6 V4 V2 V0 Yd Y9 Y5 Y1 U6 U4 U2 U0 Yc Y8 Y4 Y0
1249 13 p1 = _mm_unpackhi_epi8(p2, p3); // V7 V5 V3 V1 Yf Yb Y7 Y3 U7 U5 U3 U1 Ye Ya Y6 Y2
1250
1251 13 p2 = _mm_unpacklo_epi8(p0, p1); // U7 U6 U5 U4 U3 U2 U1 U0 Ye Yc Ya Y8 Y6 Y4 Y2 Y0
1252 13 p3 = _mm_unpackhi_epi8(p0, p1); // V7 V6 V5 V4 V3 V2 V1 V0 Yf Yd Yb Y9 Y7 Y5 Y3 Y1
1253
1254 13 _mm_storel_epi64(reinterpret_cast<__m128i*>(dstp_u + x), _mm_srli_si128(p2, 8));
1255 13 _mm_storel_epi64(reinterpret_cast<__m128i*>(dstp_v + x), _mm_srli_si128(p3, 8));
1256 13 _mm_store_si128(reinterpret_cast<__m128i*>(dstp_y + x * 2), _mm_unpacklo_epi8(p2, p3));
1257 }
1258
1259 8 srcp += src_pitch;
1260 8 dstp_y += dst_pitch_y;
1261 8 dstp_u += dst_pitch_uv;
1262 8 dstp_v += dst_pitch_uv;
1263 }
1264 2 }
1265
1266
1267 #ifdef X86_32
1268
1269 void convert_yuy2_to_yv16_mmx(const BYTE *srcp, BYTE *dstp_y, BYTE *dstp_u, BYTE *dstp_v, size_t src_pitch, size_t dst_pitch_y, size_t dst_pitch_uv, size_t width, size_t height)
1270 {
1271 width /= 2;
1272
1273 for (size_t y = 0; y < height; ++y) {
1274 for (size_t x = 0; x < width; x += 4) {
1275 __m64 p0 = *reinterpret_cast<const __m64*>(srcp + x * 4); // V1 Y3 U1 Y2 V0 Y1 U0 Y0
1276 __m64 p1 = *reinterpret_cast<const __m64*>(srcp + x * 4 + 8); // V3 Y7 U3 Y6 V2 Y5 U2 Y4
1277
1278 __m64 p2 = _mm_unpacklo_pi8(p0, p1); // V2 V0 Y5 Y1 U2 U0 Y4 Y0
1279 __m64 p3 = _mm_unpackhi_pi8(p0, p1); // V3 V1 Y7 Y3 U3 U1 Y6 Y2
1280
1281 p0 = _mm_unpacklo_pi8(p2, p3); // U3 U2 U1 U0 Y6 Y4 Y2 Y0
1282 p1 = _mm_unpackhi_pi8(p2, p3); // V3 V2 V1 V0 Y7 Y5 Y3 Y1
1283
1284 *reinterpret_cast<int*>(dstp_u + x) = _mm_cvtsi64_si32(_mm_srli_si64(p0, 32));
1285 *reinterpret_cast<int*>(dstp_v + x) = _mm_cvtsi64_si32(_mm_srli_si64(p1, 32));
1286 *reinterpret_cast<__m64*>(dstp_y + x * 2) = _mm_unpacklo_pi8(p0, p1);
1287 }
1288
1289 srcp += src_pitch;
1290 dstp_y += dst_pitch_y;
1291 dstp_u += dst_pitch_uv;
1292 dstp_v += dst_pitch_uv;
1293 }
1294 _mm_empty();
1295 }
1296
1297 #endif
1298
1299
1300 2 void convert_yv16_to_yuy2_sse2(const BYTE *srcp_y, const BYTE *srcp_u, const BYTE *srcp_v, BYTE *dstp, size_t src_pitch_y, size_t src_pitch_uv, size_t dst_pitch, size_t width, size_t height)
1301 {
1302 2 width /= 2;
1303
1304
2/2
✓ Branch 29 → 3 taken 8 times.
✓ Branch 29 → 30 taken 2 times.
10 for (size_t yy=0; yy<height; yy++) {
1305
2/2
✓ Branch 27 → 4 taken 13 times.
✓ Branch 27 → 28 taken 8 times.
21 for (size_t x=0; x<width; x+=8) {
1306
1307 13 __m128i y = _mm_load_si128(reinterpret_cast<const __m128i*>(srcp_y + x*2));
1308 13 __m128i u = _mm_loadl_epi64(reinterpret_cast<const __m128i*>(srcp_u + x));
1309 26 __m128i v = _mm_loadl_epi64(reinterpret_cast<const __m128i*>(srcp_v + x));
1310
1311 13 __m128i uv = _mm_unpacklo_epi8(u, v);
1312 13 __m128i yuv_lo = _mm_unpacklo_epi8(y, uv);
1313 13 __m128i yuv_hi = _mm_unpackhi_epi8(y, uv);
1314
1315 13 _mm_stream_si128(reinterpret_cast<__m128i*>(dstp + x*4), yuv_lo);
1316 13 _mm_stream_si128(reinterpret_cast<__m128i*>(dstp + x*4 + 16), yuv_hi);
1317 }
1318
1319 8 srcp_y += src_pitch_y;
1320 8 srcp_u += src_pitch_uv;
1321 8 srcp_v += src_pitch_uv;
1322 8 dstp += dst_pitch;
1323 }
1324 2 }
1325
1326 #ifdef X86_32
1327 void convert_yv16_to_yuy2_mmx(const BYTE *srcp_y, const BYTE *srcp_u, const BYTE *srcp_v, BYTE *dstp, size_t src_pitch_y, size_t src_pitch_uv, size_t dst_pitch, size_t width, size_t height)
1328 {
1329 width /= 2;
1330
1331 for (size_t y=0; y<height; y++) {
1332 for (size_t x=0; x<width; x+=4) {
1333 __m64 y = *reinterpret_cast<const __m64*>(srcp_y + x*2);
1334 __m64 u = *reinterpret_cast<const __m64*>(srcp_u + x);
1335 __m64 v = *reinterpret_cast<const __m64*>(srcp_v + x);
1336
1337 __m64 uv = _mm_unpacklo_pi8(u, v);
1338 __m64 yuv_lo = _mm_unpacklo_pi8(y, uv);
1339 __m64 yuv_hi = _mm_unpackhi_pi8(y, uv);
1340
1341 *reinterpret_cast<__m64*>(dstp + x*4) = yuv_lo;
1342 *reinterpret_cast<__m64*>(dstp + x*4+8) = yuv_hi;
1343 }
1344
1345 srcp_y += src_pitch_y;
1346 srcp_u += src_pitch_uv;
1347 srcp_v += src_pitch_uv;
1348 dstp += dst_pitch;
1349 }
1350 _mm_empty();
1351 }
1352 #endif
1353
1354 DISABLE_WARNING_POP
1355
1356
1357
1358