GCC Code Coverage Report


Directory: avs_core/
Coverage: low: ≥ 0% medium: ≥ 75.0% high: ≥ 90.0%
Coverage Exec / Excl / Total
Lines: 15.0% 1926 / 0 / 12828
Functions: 15.0% 84 / 0 / 561
Branches: 14.9% 202 / 0 / 1354

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 1 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 1 __m128i luma_mask = _mm_set1_epi16(0xFF);
86
87
2/2
✓ Branch 22 → 7 taken 5 times.
✓ Branch 22 → 23 taken 1 time.
6 for(size_t y = 0; y < height; ++y) {
88
2/2
✓ Branch 20 → 8 taken 10 times.
✓ Branch 20 → 21 taken 5 times.
15 for (size_t x = 0; x < width; x += 16) {
89 10 __m128i src1 = _mm_load_si128(reinterpret_cast<const __m128i*>(srcp+x*2));
90 20 __m128i src2 = _mm_load_si128(reinterpret_cast<const __m128i*>(srcp+x*2+16));
91 10 src1 = _mm_and_si128(src1, luma_mask);
92 10 src2 = _mm_and_si128(src2, luma_mask);
93 10 _mm_store_si128(reinterpret_cast<__m128i*>(dstp+x), _mm_packus_epi16(src1, src2));
94 }
95
96 5 dstp += dst_pitch;
97 5 srcp += src_pitch;
98 }
99 1 }
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 32 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 32 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 32 constexpr bool final_is_float = std::is_floating_point<pixel_t_dst>::value;
185 32 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 32 constexpr bool force_float = (conv_type == YuvRgbConversionType::FORCE_FLOAT) || would_need_64bit_v_patch;
191
192 32 constexpr bool need_int_conversion_narrow_range = conv_type == YuvRgbConversionType::BITCONV_INT_LIMITED;
193 32 constexpr bool need_int_conversion_full_range = conv_type == YuvRgbConversionType::BITCONV_INT_FULL;
194 32 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 32 constexpr bool float_matrix_workflow = force_float || need_int_conversion_full_range;
198
199 // quasi-constexpr, may help optimizer
200 14 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 7 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 32 const int bit_diff = need_int_conversion ? bits_per_pixel_target - bits_per_pixel : 0;
207 32 const int target_shift = need_int_conversion_narrow_range ? INT_ARITH_SHIFT - bit_diff : INT_ARITH_SHIFT;
208 32 const int ROUNDER = (final_is_float || float_matrix_workflow) ? 0 : (1 << (target_shift - 1));
209 32 const float out_offset_f = m.offset_out_f_32;
210 32 const int half_pixel_offset = 1 << (bits_per_pixel - 1);
211 32 const int half_pixel_offset_target = 1 << (bits_per_pixel_target - 1);
212 32 const int max_pixel_value_target = (1 << bits_per_pixel_target) - 1;
213
214 32 bits_conv_constants conversion_ranges;
215 32 const bool full_scale_d = m.offset_out == 0;
216
20/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 not taken.
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 not taken.
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 not taken.
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.
32 get_bits_conv_constants(conversion_ranges, false, full_scale_d, full_scale_d, bits_per_pixel, bits_per_pixel_target);
217
218 32 constexpr int int_arithmetic_shift = 1 << INT_ARITH_SHIFT;
219 32 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 32 __m128i half = _mm_set1_epi16((short)half_pixel_offset);
224 32 __m128i limit = _mm_set1_epi16((short)max_pixel_value_target);
225
226 32 constexpr int ROUND_SCALE = 1 << (INT_ARITH_SHIFT - 1);
227 32 const __m128i m128i_round_scale = _mm_set1_epi16(ROUND_SCALE);
228
229 int round_mask_plus_offset_out_scaled_i;
230 int round_mask_plus_offset_out_chroma_scaled_i;
231 __m128i v_patch_G, v_patch_B, v_patch_R;
232 32 __m128i sign_flip_mask = _mm_set1_epi16((short)0x8000);
233
234 32 const int offset_in_scalar = m.offset_in;
235 32 const int offset_out_scalar = m.offset_out;
236 __m128i offset_in;
237 __m128 offset_in_f;
238
239 if constexpr (float_matrix_workflow) {
240 12 offset_in = _mm_set1_epi32(offset_in_scalar);
241 24 offset_in_f = _mm_set1_ps(m.offset_in_f);
242 }
243 else if constexpr (lessthan16bit)
244 17 offset_in = _mm_set1_epi16((short)offset_in_scalar);
245 else
246 3 offset_in = _mm_setzero_si128();
247
248 if constexpr (!float_matrix_workflow) {
249 if constexpr (lessthan16bit) {
250 17 round_mask_plus_offset_out_scaled_i = final_is_float ? 0 : (ROUNDER + (offset_out_scalar << INT_ARITH_SHIFT)) / ROUND_SCALE;
251 17 round_mask_plus_offset_out_chroma_scaled_i = final_is_float ? 0 : (ROUNDER + (half_pixel_offset << INT_ARITH_SHIFT)) / ROUND_SCALE;
252 17 v_patch_G = v_patch_B = v_patch_R = _mm_setzero_si128();
253 }
254 else {
255 3 round_mask_plus_offset_out_scaled_i = ROUNDER / ROUND_SCALE;
256 3 round_mask_plus_offset_out_chroma_scaled_i = ROUNDER / ROUND_SCALE;
257 3 const int luma_or_rgbin_pivot = 32768 + offset_in_scalar;
258 3 const int chroma_pivot = 32768;
259 3 const int offset_out_for_patch = final_is_float ? 0 : (offset_out_scalar << INT_ARITH_SHIFT);
260 3 const int chroma_offset_out_for_patch = final_is_float ? 0 : (half_pixel_offset << INT_ARITH_SHIFT);
261
262 if constexpr (direction == ConversionDirection::YUV_TO_RGB) {
263 1 v_patch_G = _mm_set1_epi32(luma_or_rgbin_pivot * m.y_g + offset_out_for_patch);
264 1 v_patch_B = _mm_set1_epi32(luma_or_rgbin_pivot * m.y_b + offset_out_for_patch);
265 2 v_patch_R = _mm_set1_epi32(luma_or_rgbin_pivot * m.y_r + offset_out_for_patch);
266 }
267 else if constexpr (direction == ConversionDirection::RGB_TO_RGB) {
268 v_patch_G = _mm_set1_epi32(luma_or_rgbin_pivot * (m.y_g + m.u_g + m.v_g) + offset_out_for_patch);
269 v_patch_B = _mm_set1_epi32(luma_or_rgbin_pivot * (m.y_b + m.u_b + m.v_b) + offset_out_for_patch);
270 v_patch_R = _mm_set1_epi32(luma_or_rgbin_pivot * (m.y_r + m.u_r + m.v_r) + offset_out_for_patch);
271 }
272 else if constexpr (direction == ConversionDirection::RGB_TO_YUV) {
273 if constexpr (!would_need_64bit_v_patch) {
274 v_patch_G = _mm_set1_epi32(luma_or_rgbin_pivot * (m.y_r + m.y_g + m.y_b) + offset_out_for_patch);
275 v_patch_B = _mm_set1_epi32(luma_or_rgbin_pivot * (m.u_r + m.u_g + m.u_b) + chroma_offset_out_for_patch);
276 v_patch_R = _mm_set1_epi32(luma_or_rgbin_pivot * (m.v_r + m.v_g + m.v_b) + chroma_offset_out_for_patch);
277 }
278 else {
279 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.");
280 v_patch_G = _mm_set1_epi64x(luma_or_rgbin_pivot * (m.y_r + m.y_g + m.y_b) + offset_out_for_patch);
281 v_patch_B = _mm_set1_epi64x(luma_or_rgbin_pivot * (m.u_r + m.u_g + m.u_b) + chroma_offset_out_for_patch);
282 v_patch_R = _mm_set1_epi64x(luma_or_rgbin_pivot * (m.v_r + m.v_g + m.v_b) + chroma_offset_out_for_patch);
283 }
284 }
285 else if constexpr (direction == ConversionDirection::RGB_TO_Y) {
286 if constexpr (!would_need_64bit_v_patch) {
287 v_patch_G = _mm_set1_epi32(luma_or_rgbin_pivot * (m.y_r + m.y_g + m.y_b) + offset_out_for_patch);
288 }
289 else {
290 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.");
291 v_patch_G = _mm_set1_epi64x(luma_or_rgbin_pivot * (m.y_r + m.y_g + m.y_b) + offset_out_for_patch);
292 }
293 }
294 else if constexpr (direction == ConversionDirection::YUV_TO_YUV) {
295 // for YUV->YUV
296 // FIXME: untested, no AviSynth caller yet. Suspect m.y_b/m.y_r should be
297 // m.u_b/m.v_r (chroma diagonal), and offset should be chroma_offset_out_for_patch.
298 2 v_patch_G = _mm_set1_epi32(luma_or_rgbin_pivot * m.y_g + offset_out_for_patch);
299 2 v_patch_B = _mm_set1_epi32(chroma_pivot * m.y_b + offset_out_for_patch);
300 4 v_patch_R = _mm_set1_epi32(chroma_pivot * m.y_r + offset_out_for_patch);
301 }
302 }
303 }
304
305 32 const __m128 out_offset_f_sse2 = _mm_set1_ps(out_offset_f);
306 32 __m128i zero = _mm_setzero_si128();
307 32 const __m128 scale_f_sse2 = _mm_set1_ps(scale_f);
308
309 __m128i m_uy_G, m_vr_G, m_uy_B, m_vr_B, m_uy_R, m_vr_R;
310 __m128 coeff_out0_in0, coeff_out0_in1, coeff_out0_in2;
311 __m128 coeff_out1_in0, coeff_out1_in1, coeff_out1_in2;
312 __m128 coeff_out2_in0, coeff_out2_in1, coeff_out2_in2;
313 __m128 m_offset_out_y_or_g_f, m_offset_out_u_or_b_f, m_offset_out_v_or_r_f;
314
315 if constexpr (float_matrix_workflow) {
316 __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;
317 24 m_y_g_f = _mm_mul_ps(_mm_set1_ps(m.y_g_f), scale_f_sse2);
318 24 m_y_b_f = _mm_mul_ps(_mm_set1_ps(m.y_b_f), scale_f_sse2);
319 24 m_y_r_f = _mm_mul_ps(_mm_set1_ps(m.y_r_f), scale_f_sse2);
320 if constexpr (direction != ConversionDirection::RGB_TO_Y) {
321 10 m_u_g_f = _mm_mul_ps(_mm_set1_ps(m.u_g_f), scale_f_sse2);
322 10 m_u_b_f = _mm_mul_ps(_mm_set1_ps(m.u_b_f), scale_f_sse2);
323 10 m_u_r_f = _mm_mul_ps(_mm_set1_ps(m.u_r_f), scale_f_sse2);
324 10 m_v_g_f = _mm_mul_ps(_mm_set1_ps(m.v_g_f), scale_f_sse2);
325 10 m_v_b_f = _mm_mul_ps(_mm_set1_ps(m.v_b_f), scale_f_sse2);
326 10 m_v_r_f = _mm_mul_ps(_mm_set1_ps(m.v_r_f), scale_f_sse2);
327 }
328
329 if constexpr (direction == ConversionDirection::YUV_TO_RGB || direction == ConversionDirection::RGB_TO_RGB) {
330 1 float rgb_out_offset_scaled = m.offset_out_f * scale_f;
331 1 m_offset_out_y_or_g_f = _mm_set1_ps(rgb_out_offset_scaled);
332 1 m_offset_out_u_or_b_f = _mm_set1_ps(rgb_out_offset_scaled);
333 1 m_offset_out_v_or_r_f = _mm_set1_ps(rgb_out_offset_scaled);
334 }
335 else if constexpr (direction == ConversionDirection::RGB_TO_YUV || direction == ConversionDirection::YUV_TO_YUV) {
336 4 float y_out_offset_scaled = m.offset_out_f * scale_f;
337 4 float uv_center_offset = final_is_float ? 0.0f : (float)half_pixel_offset_target;
338 4 m_offset_out_y_or_g_f = _mm_set1_ps(y_out_offset_scaled);
339 4 m_offset_out_u_or_b_f = _mm_set1_ps(uv_center_offset);
340 4 m_offset_out_v_or_r_f = _mm_set1_ps(uv_center_offset);
341 }
342 else if constexpr (direction == ConversionDirection::RGB_TO_Y) {
343 7 float y_out_offset_scaled = m.offset_out_f * scale_f;
344 7 m_offset_out_y_or_g_f = _mm_set1_ps(y_out_offset_scaled);
345 }
346
347 if constexpr (direction == ConversionDirection::YUV_TO_RGB) {
348 1 coeff_out0_in0 = m_y_g_f; coeff_out0_in1 = m_u_g_f; coeff_out0_in2 = m_v_g_f;
349 1 coeff_out1_in0 = m_y_b_f; coeff_out1_in1 = m_u_b_f; coeff_out1_in2 = m_v_b_f;
350 1 coeff_out2_in0 = m_y_r_f; coeff_out2_in1 = m_u_r_f; coeff_out2_in2 = m_v_r_f;
351 }
352 else if constexpr (direction == ConversionDirection::RGB_TO_YUV) {
353 3 coeff_out0_in0 = m_y_g_f; coeff_out0_in1 = m_y_b_f; coeff_out0_in2 = m_y_r_f;
354 3 coeff_out1_in0 = m_u_g_f; coeff_out1_in1 = m_u_b_f; coeff_out1_in2 = m_u_r_f;
355 3 coeff_out2_in0 = m_v_g_f; coeff_out2_in1 = m_v_b_f; coeff_out2_in2 = m_v_r_f;
356 }
357 else if constexpr (direction == ConversionDirection::RGB_TO_Y) {
358 7 coeff_out0_in0 = m_y_g_f; coeff_out0_in1 = m_y_b_f; coeff_out0_in2 = m_y_r_f;
359 }
360 else if constexpr (direction == ConversionDirection::YUV_TO_YUV) {
361 1 coeff_out0_in0 = m_y_g_f; coeff_out0_in1 = m_u_g_f; coeff_out0_in2 = m_v_g_f;
362 1 coeff_out1_in0 = m_y_b_f; coeff_out1_in1 = m_u_b_f; coeff_out1_in2 = m_v_b_f;
363 1 coeff_out2_in0 = m_y_r_f; coeff_out2_in1 = m_u_r_f; coeff_out2_in2 = m_v_r_f;
364 }
365 else if constexpr (direction == ConversionDirection::RGB_TO_RGB) {
366 coeff_out0_in0 = m_y_g_f; coeff_out0_in1 = m_u_g_f; coeff_out0_in2 = m_v_g_f;
367 coeff_out1_in0 = m_y_b_f; coeff_out1_in1 = m_u_b_f; coeff_out1_in2 = m_v_b_f;
368 coeff_out2_in0 = m_y_r_f; coeff_out2_in1 = m_u_r_f; coeff_out2_in2 = m_v_r_f;
369 }
370 }
371 else {
372 // Integer workflow coefficient setup
373 int round_and_out_offset_y_or_g;
374 int round_and_out_offset_u_or_b;
375 int round_and_out_offset_v_or_r;
376
377 if constexpr (direction == ConversionDirection::YUV_TO_RGB || direction == ConversionDirection::RGB_TO_RGB) {
378 9 round_and_out_offset_y_or_g = round_mask_plus_offset_out_scaled_i;
379 9 round_and_out_offset_u_or_b = round_mask_plus_offset_out_scaled_i;
380 9 round_and_out_offset_v_or_r = round_mask_plus_offset_out_scaled_i;
381 }
382 else if constexpr (direction == ConversionDirection::RGB_TO_YUV || direction == ConversionDirection::YUV_TO_YUV) {
383 8 round_and_out_offset_y_or_g = round_mask_plus_offset_out_scaled_i;
384 8 round_and_out_offset_u_or_b = round_mask_plus_offset_out_chroma_scaled_i;
385 8 round_and_out_offset_v_or_r = round_mask_plus_offset_out_chroma_scaled_i;
386 }
387 else if constexpr (direction == ConversionDirection::RGB_TO_Y) {
388 3 round_and_out_offset_y_or_g = round_mask_plus_offset_out_scaled_i;
389 }
390
391 if constexpr (direction == ConversionDirection::YUV_TO_RGB || direction == ConversionDirection::YUV_TO_YUV) {
392 12 m_uy_G = _mm_set1_epi32((static_cast<uint16_t>(m.y_g) << 16) | static_cast<uint16_t>(m.u_g));
393 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));
394 12 m_uy_B = _mm_set1_epi32((static_cast<uint16_t>(m.y_b) << 16) | static_cast<uint16_t>(m.u_b));
395 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));
396 12 m_uy_R = _mm_set1_epi32((static_cast<uint16_t>(m.y_r) << 16) | static_cast<uint16_t>(m.u_r));
397 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));
398 }
399 else if constexpr (direction == ConversionDirection::RGB_TO_YUV || direction == ConversionDirection::RGB_TO_RGB) {
400 5 m_uy_G = _mm_set1_epi32((static_cast<uint16_t>(m.y_g) << 16) | static_cast<uint16_t>(m.y_b));
401 5 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));
402 5 m_uy_B = _mm_set1_epi32((static_cast<uint16_t>(m.u_g) << 16) | static_cast<uint16_t>(m.u_b));
403 5 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));
404 5 m_uy_R = _mm_set1_epi32((static_cast<uint16_t>(m.v_g) << 16) | static_cast<uint16_t>(m.v_b));
405 5 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));
406 }
407 else if constexpr (direction == ConversionDirection::RGB_TO_Y) {
408 3 m_uy_G = _mm_set1_epi32((static_cast<uint16_t>(m.y_g) << 16) | static_cast<uint16_t>(m.y_b));
409 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));
410 }
411 }
412
413 32 const int rowsize = width * sizeof(pixel_t);
414
40/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 152 → 107 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 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 153 → 108 not taken.
✗ Branch 153 → 154 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 153 → 108 taken 30 times.
✓ Branch 153 → 154 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 153 → 108 not taken.
✗ Branch 153 → 154 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 153 → 108 not taken.
✗ Branch 153 → 154 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 143 → 116 not taken.
✗ Branch 143 → 144 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 143 → 116 not taken.
✗ Branch 143 → 144 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 143 → 116 not taken.
✗ Branch 143 → 144 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 134 → 107 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 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 135 → 108 not taken.
✗ Branch 135 → 136 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 135 → 108 not taken.
✗ Branch 135 → 136 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 135 → 108 taken 10 times.
✓ Branch 135 → 136 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 135 → 108 not taken.
✗ Branch 135 → 136 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 152 → 107 not taken.
✗ Branch 152 → 153 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 153 → 108 not taken.
✗ Branch 153 → 154 not taken.
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 153 → 108 taken 20 times.
✓ Branch 153 → 154 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 153 → 108 not taken.
✗ Branch 153 → 154 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 153 → 108 not taken.
✗ Branch 153 → 154 not taken.
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 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)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 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)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 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)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 134 → 107 not taken.
✗ Branch 134 → 135 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 135 → 108 not taken.
✗ Branch 135 → 136 not taken.
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 135 → 108 not taken.
✗ Branch 135 → 136 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 135 → 108 taken 5 times.
✓ Branch 135 → 136 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 135 → 108 not taken.
✗ Branch 135 → 136 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 152 → 107 not taken.
✗ Branch 152 → 153 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 153 → 108 not taken.
✗ Branch 153 → 154 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 153 → 108 taken 3 times.
✓ Branch 153 → 154 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 153 → 108 not taken.
✗ Branch 153 → 154 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 153 → 108 not taken.
✗ Branch 153 → 154 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 143 → 116 not taken.
✗ Branch 143 → 144 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 143 → 116 not taken.
✗ Branch 143 → 144 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 143 → 116 not taken.
✗ Branch 143 → 144 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 134 → 107 not taken.
✗ Branch 134 → 135 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 135 → 108 not taken.
✗ Branch 135 → 136 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 135 → 108 not taken.
✗ Branch 135 → 136 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 135 → 108 not taken.
✗ Branch 135 → 136 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 135 → 108 not taken.
✗ Branch 135 → 136 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 134 → 91 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 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 135 → 92 not taken.
✗ Branch 135 → 136 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 135 → 92 taken 3 times.
✓ Branch 135 → 136 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 135 → 92 not taken.
✗ Branch 135 → 136 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 135 → 92 taken 3 times.
✓ Branch 135 → 136 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 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)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 146 → 98 taken 3 times.
✓ Branch 146 → 147 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 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)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 116 → 91 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 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 117 → 92 not taken.
✗ Branch 117 → 118 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 117 → 92 not taken.
✗ Branch 117 → 118 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 117 → 92 taken 3 times.
✓ Branch 117 → 118 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 117 → 92 not taken.
✗ Branch 117 → 118 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.
164 for (int yy = 0; yy < height; yy++) {
415 // SSE2: 8 pixels per loop (8×1 byte = 8 bytes, 8×2 bytes = 16 bytes, 8×4 bytes = 32 bytes)
416
40/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 150 → 108 not taken.
✗ Branch 150 → 151 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 151 → 109 not taken.
✗ Branch 151 → 152 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 151 → 109 taken 120 times.
✓ Branch 151 → 152 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 151 → 109 not taken.
✗ Branch 151 → 152 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 151 → 109 not taken.
✗ Branch 151 → 152 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 141 → 117 not taken.
✗ Branch 141 → 142 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 141 → 117 not taken.
✗ Branch 141 → 142 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 141 → 117 not taken.
✗ Branch 141 → 142 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 132 → 108 not taken.
✗ Branch 132 → 133 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 133 → 109 not taken.
✗ Branch 133 → 134 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 133 → 109 not taken.
✗ Branch 133 → 134 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 133 → 109 taken 40 times.
✓ Branch 133 → 134 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 133 → 109 not taken.
✗ Branch 133 → 134 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 150 → 108 not taken.
✗ Branch 150 → 151 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 151 → 109 not taken.
✗ Branch 151 → 152 not taken.
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 151 → 109 taken 75 times.
✓ Branch 151 → 152 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 151 → 109 not taken.
✗ Branch 151 → 152 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 151 → 109 not taken.
✗ Branch 151 → 152 not taken.
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 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)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 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)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 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)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 132 → 108 not taken.
✗ Branch 132 → 133 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 133 → 109 not taken.
✗ Branch 133 → 134 not taken.
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 133 → 109 not taken.
✗ Branch 133 → 134 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 133 → 109 taken 15 times.
✓ Branch 133 → 134 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 133 → 109 not taken.
✗ Branch 133 → 134 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 150 → 108 not taken.
✗ Branch 150 → 151 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 151 → 109 not taken.
✗ Branch 151 → 152 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 151 → 109 taken 9 times.
✓ Branch 151 → 152 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 151 → 109 not taken.
✗ Branch 151 → 152 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 151 → 109 not taken.
✗ Branch 151 → 152 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 141 → 117 not taken.
✗ Branch 141 → 142 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 141 → 117 not taken.
✗ Branch 141 → 142 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 141 → 117 not taken.
✗ Branch 141 → 142 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 132 → 108 not taken.
✗ Branch 132 → 133 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 133 → 109 not taken.
✗ Branch 133 → 134 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 133 → 109 not taken.
✗ Branch 133 → 134 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 133 → 109 not taken.
✗ Branch 133 → 134 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 133 → 109 not taken.
✗ Branch 133 → 134 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 132 → 92 not taken.
✗ Branch 132 → 133 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 133 → 93 not taken.
✗ Branch 133 → 134 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 133 → 93 taken 12 times.
✓ Branch 133 → 134 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 133 → 93 not taken.
✗ Branch 133 → 134 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 133 → 93 taken 12 times.
✓ Branch 133 → 134 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 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)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 144 → 99 taken 12 times.
✓ Branch 144 → 145 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 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)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 114 → 92 not taken.
✗ Branch 114 → 115 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 115 → 93 not taken.
✗ Branch 115 → 116 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 115 → 93 not taken.
✗ Branch 115 → 116 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 115 → 93 taken 12 times.
✓ Branch 115 → 116 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 115 → 93 not taken.
✗ Branch 115 → 116 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.
620 for (int x = 0; x < rowsize; x += 8 * sizeof(pixel_t)) {
417 __m128i in0, in1, in2;
418 __m128 in0_f_lo, in0_f_hi, in1_f_lo, in1_f_hi, in2_f_lo, in2_f_hi;
419
420 // Load 8 pixels
421 if constexpr (sizeof(pixel_t) == 1) {
422 240 __m128i in0_raw = _mm_loadl_epi64(reinterpret_cast<const __m128i*>(srcp[0] + x));
423 240 __m128i in1_raw = _mm_loadl_epi64(reinterpret_cast<const __m128i*>(srcp[1] + x));
424 240 __m128i in2_raw = _mm_loadl_epi64(reinterpret_cast<const __m128i*>(srcp[2] + x));
425 240 in0 = _mm_unpacklo_epi8(in0_raw, zero);
426 240 in1 = _mm_unpacklo_epi8(in1_raw, zero);
427 468 in2 = _mm_unpacklo_epi8(in2_raw, zero);
428 }
429 else if constexpr (sizeof(pixel_t) == 2) {
430 188 in0 = _mm_load_si128(reinterpret_cast<const __m128i*>(srcp[0] + x));
431 188 in1 = _mm_load_si128(reinterpret_cast<const __m128i*>(srcp[1] + x));
432 293 in2 = _mm_load_si128(reinterpret_cast<const __m128i*>(srcp[2] + x));
433 }
434 else { // sizeof(pixel_t) == 4
435 60 in0_f_lo = _mm_load_ps(reinterpret_cast<const float*>(srcp[0] + x));
436 60 in0_f_hi = _mm_load_ps(reinterpret_cast<const float*>(srcp[0] + x + 16));
437 60 in1_f_lo = _mm_load_ps(reinterpret_cast<const float*>(srcp[1] + x));
438 60 in1_f_hi = _mm_load_ps(reinterpret_cast<const float*>(srcp[1] + x + 16));
439 60 in2_f_lo = _mm_load_ps(reinterpret_cast<const float*>(srcp[2] + x));
440 120 in2_f_hi = _mm_load_ps(reinterpret_cast<const float*>(srcp[2] + x + 16));
441 }
442
443 if constexpr (float_matrix_workflow) {
444 // Float workflow
445 if constexpr (sizeof(pixel_t) == 4) {
446 // Float input - apply offset_in
447 if constexpr (direction == ConversionDirection::YUV_TO_RGB || direction == ConversionDirection::YUV_TO_YUV) {
448 21 in0_f_lo = _mm_add_ps(in0_f_lo, offset_in_f);
449 21 in0_f_hi = _mm_add_ps(in0_f_hi, offset_in_f);
450 }
451 else { // RGB source RGB_TO_RGB, RGB_TO_YUV, RGB_TO_Y
452 39 in0_f_lo = _mm_add_ps(in0_f_lo, offset_in_f);
453 39 in0_f_hi = _mm_add_ps(in0_f_hi, offset_in_f);
454 39 in1_f_lo = _mm_add_ps(in1_f_lo, offset_in_f);
455 39 in1_f_hi = _mm_add_ps(in1_f_hi, offset_in_f);
456 39 in2_f_lo = _mm_add_ps(in2_f_lo, offset_in_f);
457 39 in2_f_hi = _mm_add_ps(in2_f_hi, offset_in_f);
458 }
459 }
460 else {
461 // Integer input - convert to float
462 if constexpr (direction == ConversionDirection::YUV_TO_RGB || direction == ConversionDirection::YUV_TO_YUV) {
463 // Y channel
464 __m128i in0_32_lo = _mm_add_epi32(_mm_unpacklo_epi16(in0, zero), offset_in);
465 __m128i in0_32_hi = _mm_add_epi32(_mm_unpackhi_epi16(in0, zero), offset_in);
466 in0_f_lo = _mm_cvtepi32_ps(in0_32_lo);
467 in0_f_hi = _mm_cvtepi32_ps(in0_32_hi);
468 // U,V: sign-extend and convert
469 auto chroma_to_float = [&](__m128i c, __m128& f_lo, __m128& f_hi) {
470 c = _mm_sub_epi16(c, half);
471 __m128i sign = _mm_srai_epi16(c, 15);
472 f_lo = _mm_cvtepi32_ps(_mm_unpacklo_epi16(c, sign));
473 f_hi = _mm_cvtepi32_ps(_mm_unpackhi_epi16(c, sign));
474 };
475 chroma_to_float(in1, in1_f_lo, in1_f_hi);
476 chroma_to_float(in2, in2_f_lo, in2_f_hi);
477 }
478 else { // RGB source
479 285 in0_f_lo = _mm_cvtepi32_ps(_mm_add_epi32(_mm_unpacklo_epi16(in0, zero), offset_in));
480 285 in0_f_hi = _mm_cvtepi32_ps(_mm_add_epi32(_mm_unpackhi_epi16(in0, zero), offset_in));
481 285 in1_f_lo = _mm_cvtepi32_ps(_mm_add_epi32(_mm_unpacklo_epi16(in1, zero), offset_in));
482 285 in1_f_hi = _mm_cvtepi32_ps(_mm_add_epi32(_mm_unpackhi_epi16(in1, zero), offset_in));
483 285 in2_f_lo = _mm_cvtepi32_ps(_mm_add_epi32(_mm_unpacklo_epi16(in2, zero), offset_in));
484 285 in2_f_hi = _mm_cvtepi32_ps(_mm_add_epi32(_mm_unpackhi_epi16(in2, zero), offset_in));
485 }
486 }
487
488 // Matrix multiply (SSE2 doesn't have FMA, use mul+add)
489 465 auto matrix_multiply = [&](__m128 i0_lo, __m128 i0_hi, __m128 i1_lo, __m128 i1_hi, __m128 i2_lo, __m128 i2_hi,
490 __m128& o0_lo, __m128& o0_hi, __m128& o1_lo, __m128& o1_hi, __m128& o2_lo, __m128& o2_hi) {
491 XP_LAMBDA_CAPTURE_FIX(coeff_out0_in0); XP_LAMBDA_CAPTURE_FIX(coeff_out0_in1); XP_LAMBDA_CAPTURE_FIX(coeff_out0_in2);
492 XP_LAMBDA_CAPTURE_FIX(coeff_out1_in0); XP_LAMBDA_CAPTURE_FIX(coeff_out1_in1); XP_LAMBDA_CAPTURE_FIX(coeff_out1_in2);
493 XP_LAMBDA_CAPTURE_FIX(coeff_out2_in0); XP_LAMBDA_CAPTURE_FIX(coeff_out2_in1); XP_LAMBDA_CAPTURE_FIX(coeff_out2_in2);
494 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);
495
496 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)));
497 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)));
498 if constexpr (direction != ConversionDirection::RGB_TO_Y) {
499 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)));
500 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)));
501 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)));
502 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)));
503 }
504 };
505
506 __m128 out0_f_lo, out0_f_hi, out1_f_lo, out1_f_hi, out2_f_lo, out2_f_hi;
507 155 matrix_multiply(in0_f_lo, in0_f_hi, in1_f_lo, in1_f_hi, in2_f_lo, in2_f_hi,
508 out0_f_lo, out0_f_hi, out1_f_lo, out1_f_hi, out2_f_lo, out2_f_hi);
509
510 584 auto process_from_float_plane_sse2 = [&](BYTE* plane_ptr, __m128 lo, __m128 hi) {
511 XP_LAMBDA_CAPTURE_FIX(zero); XP_LAMBDA_CAPTURE_FIX(limit);
512 #ifdef XP_TLS
513 if (final_is_float) {
514 #else
515 if constexpr (final_is_float) {
516 #endif
517 132 const int pix_idx = x / sizeof(pixel_t);
518 132 float* f_dst = reinterpret_cast<float*>(plane_ptr) + pix_idx;
519 _mm_store_ps(f_dst, lo);
520 132 _mm_store_ps(f_dst + 4, hi);
521 }
522 else {
523 165 __m128 float_rounder = _mm_set1_ps(0.5f);
524 330 __m128i res_lo = _mm_cvttps_epi32(_mm_add_ps(lo, float_rounder));
525 165 __m128i res_hi = _mm_cvttps_epi32(_mm_add_ps(hi, float_rounder));
526 165 const int pix_idx = x * sizeof(pixel_t_dst) / sizeof(pixel_t);
527
528 if constexpr (sizeof(pixel_t_dst) == 1) {
529 24 __m128i p = _mm_packs_epi32(res_lo, res_hi);
530 24 __m128i final8 = _mm_packus_epi16(p, zero);
531 24 _mm_storel_epi64(reinterpret_cast<__m128i*>(plane_ptr + pix_idx), final8);
532 }
533 else if constexpr (sizeof(pixel_t_dst) == 2) {
534 __m128i p;
535 if constexpr (lessthan16bit_target) {
536 12 p = _mm_packs_epi32(res_lo, res_hi);
537 24 p = _mm_max_epi16(_mm_min_epi16(p, limit), zero);
538 }
539 else {
540 129 p = _MM_PACKUS_EPI32(res_lo, res_hi);
541 }
542 141 _mm_store_si128(reinterpret_cast<__m128i*>(plane_ptr + pix_idx), p);
543 }
544 }
545 };
546
547 155 process_from_float_plane_sse2(dstp[0], out0_f_lo, out0_f_hi);
548 if constexpr (direction != ConversionDirection::RGB_TO_Y) {
549 71 process_from_float_plane_sse2(dstp[1], out1_f_lo, out1_f_hi);
550 71 process_from_float_plane_sse2(dstp[2], out2_f_lo, out2_f_hi);
551 }
552 }
553 else {
554 // Integer matrix arithmetic
555 if constexpr (lessthan16bit) {
556 if constexpr (direction == ConversionDirection::RGB_TO_YUV || direction == ConversionDirection::RGB_TO_RGB || direction == ConversionDirection::RGB_TO_Y) {
557 126 in0 = _mm_adds_epi16(in0, offset_in);
558 126 in1 = _mm_adds_epi16(in1, offset_in);
559 126 in2 = _mm_adds_epi16(in2, offset_in);
560 }
561 else {
562 169 in0 = _mm_adds_epi16(in0, offset_in);
563 }
564 }
565 else {
566 if constexpr (direction == ConversionDirection::RGB_TO_YUV || direction == ConversionDirection::RGB_TO_RGB || direction == ConversionDirection::RGB_TO_Y) {
567 in0 = _mm_xor_si128(in0, sign_flip_mask);
568 in1 = _mm_xor_si128(in1, sign_flip_mask);
569 in2 = _mm_xor_si128(in2, sign_flip_mask);
570 }
571 else {
572 38 in0 = _mm_xor_si128(in0, sign_flip_mask);
573 }
574 }
575
576 if constexpr (direction == ConversionDirection::YUV_TO_RGB || direction == ConversionDirection::YUV_TO_YUV) {
577 207 in1 = _mm_sub_epi16(in1, half);
578 207 in2 = _mm_sub_epi16(in2, half);
579 }
580
581 333 __m128i uy_lo = _mm_unpacklo_epi16(in1, in0);
582 333 __m128i uy_hi = _mm_unpackhi_epi16(in1, in0);
583 333 __m128i vr_lo = _mm_unpacklo_epi16(in2, m128i_round_scale);
584 333 __m128i vr_hi = _mm_unpackhi_epi16(in2, m128i_round_scale);
585
586 2187 auto process_plane = [&](BYTE* plane_ptr, __m128i m_uy, __m128i m_vr, __m128i v_patch, auto apply_float_offset_out) {
587 XP_LAMBDA_CAPTURE_FIX(limit);
588 // Note: v_patch is already set to the right 32 or 64 bits width based on final_is_float and lessthan16bit
589 2781 auto madd_scale = [&](__m128i uy, __m128i vr) {
590 XP_LAMBDA_CAPTURE_FIX(v_patch); XP_LAMBDA_CAPTURE_FIX(target_shift);
591 5562 __m128i sum = _mm_add_epi32(_mm_madd_epi16(m_uy, uy), _mm_madd_epi16(m_vr, vr));
592 #ifdef XP_TLS
593 if (!final_is_float)
594 #else
595 if constexpr (!final_is_float)
596 #endif
597 {
598 // this one needs to be in sse2, sign extension needed for epi32->64
599 __m128i sum_lo, sum_hi;
600 #ifdef XP_TLS
601 if (!would_need_64bit_v_patch) {
602 #else
603 if constexpr (!would_need_64bit_v_patch) {
604 #endif
605 3684 sum = _mm_add_epi32(sum, v_patch);
606 }
607 else {
608 // use two 64 bit sums
609 __m128i sign_mask = _mm_srai_epi32(sum, 31);
610 // sign extend 32->64 (no cvtepi32_epi64 in SSE2)
611 sum_lo = _mm_unpacklo_epi32(sum, sign_mask);
612 sum_lo = _mm_add_epi64(sum_lo, v_patch);
613 sum_hi = _mm_unpackhi_epi32(sum, sign_mask);
614 sum_hi = _mm_add_epi64(sum_hi, v_patch);
615 }
616 // target_shift is INT_ARITH_SHIFT - modified with bit-conversion diff, bit fixed point shift
617 #ifdef XP_TLS
618 if (!would_need_64bit_v_patch) {
619 #else
620 if constexpr (!would_need_64bit_v_patch) {
621 #endif
622 24 sum = _mm_srai_epi32(sum, target_shift);
623 }
624 else {
625 // no epi64 arithmetic shift in SSE2/AVX2
626 sum_lo = mm_srai_epi64_simul(sum_lo, target_shift);
627 sum_hi = mm_srai_epi64_simul(sum_hi, target_shift);
628 }
629 #ifdef XP_TLS
630 if (would_need_64bit_v_patch) {
631 #else
632 if constexpr (would_need_64bit_v_patch) {
633 #endif
634 // pack back to 32 bit, SSE2: cvtepi64_epi32 is avx512 only
635 /*
636 __m128i packed_lo = _mm_shuffle_epi32(sum_lo, _MM_SHUFFLE(2, 0, 2, 0));
637 __m128i packed_hi = _mm_shuffle_epi32(sum_hi, _MM_SHUFFLE(2, 0, 2, 0));
638 sum = _mm_unpacklo_epi64(packed_lo, packed_hi);
639 */
640 __m128i packed_lo = _mm_shuffle_epi32(sum_lo, _MM_SHUFFLE(2, 0, 2, 0));
641
642 // #0 and 1 from packed_lo, #0 and 2 from sum_hi
643 sum = _mm_castps_si128(_mm_shuffle_ps(
644 _mm_castsi128_ps(packed_lo),
645 _mm_castsi128_ps(sum_hi),
646 _MM_SHUFFLE(2, 0, 1, 0)
647 ));
648 }
649 }
650 else {
651 // no 64-bit needed, no overflow danger in pivot, since no U and V integer offset which is the cause of overflow.
652 sum = _mm_add_epi32(sum, v_patch);
653 }
654 1854 return sum;
655 };
656
657 927 __m128i res_lo = madd_scale(uy_lo, vr_lo);
658 927 __m128i res_hi = madd_scale(uy_hi, vr_hi);
659
660 #ifdef XP_TLS
661 if (final_is_float) {
662 #else
663 if constexpr (final_is_float) {
664 #endif
665 const int pix_idx = x / sizeof(pixel_t);
666 float* f_dst = reinterpret_cast<float*>(plane_ptr) + pix_idx;
667 auto store_block = [&](float* ptr, __m128i b, auto apply_float_offset_out) {
668 __m128 result = _mm_mul_ps(_mm_cvtepi32_ps(b), scale_f_sse2);
669 if (apply_float_offset_out)
670 result = _mm_add_ps(result, out_offset_f_sse2);
671 _mm_store_ps(ptr, result);
672 };
673 store_block(f_dst, res_lo, apply_float_offset_out);
674 store_block(f_dst + 4, res_hi, apply_float_offset_out);
675 }
676 else {
677 927 const int pix_idx = x * sizeof(pixel_t_dst) / sizeof(pixel_t);
678 if constexpr (sizeof(pixel_t_dst) == 1) {
679 624 __m128i p = _mm_packs_epi32(res_lo, res_hi);
680 624 __m128i final8 = _mm_packus_epi16(p, zero);
681 624 _mm_storel_epi64(reinterpret_cast<__m128i*>(plane_ptr + pix_idx), final8);
682 }
683 else {
684 __m128i p;
685 if constexpr (lessthan16bit_target) {
686 189 p = _mm_packs_epi32(res_lo, res_hi);
687 378 p = _mm_max_epi16(_mm_min_epi16(p, limit), zero);
688 }
689 else {
690 114 p = _MM_PACKUS_EPI32(res_lo, res_hi);
691 }
692 303 _mm_store_si128(reinterpret_cast<__m128i*>(plane_ptr + pix_idx), p);
693 }
694 }
695 };
696
697 // Process planes, using pre-packed coefficient, and the 16 bit patch if needed
698 333 process_plane(dstp[0], m_uy_G, m_vr_G, v_patch_G, true /* apply_float_offset_out */);
699 // only Y,R,G,B needs it uniformly, so for YUV, we call it with false
700 // last param: apply_float_offset_out
701 if constexpr (direction == ConversionDirection::YUV_TO_RGB || direction == ConversionDirection::RGB_TO_RGB) {
702 180 process_plane(dstp[1], m_uy_B, m_vr_B, v_patch_B, true);
703 180 process_plane(dstp[2], m_uy_R, m_vr_R, v_patch_R, true);
704 }
705 else if constexpr (direction == ConversionDirection::RGB_TO_YUV || direction == ConversionDirection::YUV_TO_YUV) {
706 117 process_plane(dstp[1], m_uy_B, m_vr_B, v_patch_B, false);
707 117 process_plane(dstp[2], m_uy_R, m_vr_R, v_patch_R, false);
708 }
709 else if constexpr (direction != ConversionDirection::RGB_TO_Y) {
710 // no other planes
711 }
712 }
713 } // x loop
714
715 132 srcp[0] += srcPitch[0];
716 132 srcp[1] += srcPitch[1];
717 132 srcp[2] += srcPitch[2];
718 132 dstp[0] += dstPitch[0];
719 if constexpr (direction != ConversionDirection::RGB_TO_Y) {
720 102 dstp[1] += dstPitch[1];
721 102 dstp[2] += dstPitch[2];
722 }
723 } // y loop
724 32 }
725 #undef XP_LAMBDA_CAPTURE_FIX
726
727 template<ConversionDirection direction, typename pixel_t_src, bool lessthan16bit>
728 32 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,
729 int bits_per_pixel, int bits_per_pixel_target, bool force_float)
730 {
731 // Accuracy forever: forced float or float input
732
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 4 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 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 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.
27 if (force_float || std::is_floating_point<pixel_t_src>::value) {
733
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) {
734 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);
735 }
736
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) {
737 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);
738 }
739
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) {
740 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);
741 }
742 else { // 32 bit float target
743 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);
744 }
745 8 return;
746 }
747
748 // Integer input paths
749 if constexpr (!std::is_floating_point<pixel_t_src>::value) {
750 24 const bool need_conversion = bits_per_pixel_target != bits_per_pixel;
751
13/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 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 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 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 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.
24 if (!need_conversion) {
752 // No bit-depth conversion, just color space conversion
753 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);
754 21 return;
755 }
756
757 3 const bool full_d = m.offset_out == 0;
758
6/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 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, 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 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 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.
3 if (bits_per_pixel_target >= 8 && bits_per_pixel <= 16) {
759
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 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 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 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 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 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.
3 if (bits_per_pixel_target == 8) {
760
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)
761 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);
762 else
763 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);
764 }
765
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 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 not taken.
✗ Branch 20 → 24 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 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 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 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.
2 else if (bits_per_pixel_target < 16) {
766
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 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 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 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.
1 if (full_d)
767 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);
768 else
769 1 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);
770 }
771
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 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 not taken.
✗ 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 not taken.
✗ 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.
1 else if (bits_per_pixel_target == 16) {
772
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 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 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 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 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 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.
1 if (full_d)
773 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);
774 else
775 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);
776 }
777 else { // 32 bit float target
778 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);
779 }
780 }
781 }
782 }
783
784 // Template instantiations for SSE2
785 // YUV_TO_RGB
786 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);
787 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);
788 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);
789 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);
790
791 // RGB_TO_YUV
792 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);
793 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);
794 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);
795 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);
796
797 // RGB_TO_Y
798 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);
799 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);
800 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);
801 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);
802
803 // YUV_TO_YUV (for future use)
804 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);
805 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);
806 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);
807 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);
808
809 // kept for reference
810 // packed rgb helper
811 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) {
812 //int b = (((int)m[0] * Y + (int)m[1] * U + (int)m[ 2] * V + 4096)>>13);
813
814 //px01 - xx xx 00 V1 00 U1 00 Y1 xx xx 00 V0 00 U0 00 Y0
815
816 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
817 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
818 576 __m128i high_lo = _mm_madd_epi16(px45, matrix);
819 1152 __m128i high_hi = _mm_madd_epi16(px67, matrix);
820
821 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
822 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)));
823
824 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
825 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)));
826
827 576 __m128i t_lo = _mm_add_epi32(low_v, low_yu); // v3*m2 + u3*m1 + y3*m0...
828 576 __m128i t_hi = _mm_add_epi32(high_v, high_yu);
829
830 576 t_lo = _mm_add_epi32(t_lo, round_mask_plus_rgb_offset); // v3*m2 + u3*m1 + y3*m0 + 4096...
831 1152 t_hi = _mm_add_epi32(t_hi, round_mask_plus_rgb_offset);
832
833 576 t_lo = _mm_srai_epi32(t_lo, 13); // (v3*m2 + u3*m1 + y3*m0 + 4096) >> 13...
834 576 t_hi = _mm_srai_epi32(t_hi, 13);
835
836 576 __m128i result = _mm_packs_epi32(t_lo, t_hi);
837 576 result = _mm_packus_epi16(result, zero); //00 00 00 00 00 00 00 00 b7 b6 b5 b4 b3 b2 b1 b0
838 576 return result;
839 }
840
841 template<int rgb_pixel_step, bool hasAlpha>
842 #if defined(GCC) || defined(CLANG)
843 __attribute__((__target__("ssse3")))
844 #endif
845 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)
846 {
847 8 dstp += dst_pitch * (height-1); // We start at last line
848
849 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
850
851 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);
852 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);
853 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);
854
855 8 __m128i zero = _mm_setzero_si128();
856
857 // .13 bit frac integer arithmetic
858 8 int round_mask_plus_rgb_offset_i = (1 << 12) + (matrix.offset_rgb << 13);
859 8 __m128i round_mask_plus_rgb_offset = _mm_set1_epi32(round_mask_plus_rgb_offset_i);
860
861 16 __m128i offset = _mm_set_epi16(0, -128, -128, matrix.offset_y, 0, -128, -128, matrix.offset_y);
862 8 __m128i pixels0123_mask = _mm_set_epi8(0, 0, 0, 0, 14, 13, 12, 10, 9, 8, 6, 5, 4, 2, 1, 0);
863 8 __m128i pixels4567_mask = _mm_set_epi8(4, 2, 1, 0, 0, 0, 0, 0, 14, 13, 12, 10, 9, 8, 6, 5);
864 8 __m128i ssse3_merge_mask = _mm_set_epi32(0xFFFFFFFF, 0, 0, 0);
865
866 // 8 YUV(A) pixels --> 2x16 RGB quads = 32 bytes. Avisynth's alignment is 64 so we are more than safe.
867
868
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) {
869
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) {
870 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
871 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
872 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
873 [[maybe_unused]] __m128i src_a;
874 if constexpr(hasAlpha)
875 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
876
877 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
878 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
879
880 96 __m128i low = _mm_unpacklo_epi16(t1, t2); //xx V3 U3 Y3 xx V2 U2 Y2 xx V1 U1 Y1 xx V0 U0 Y0
881 96 __m128i high = _mm_unpackhi_epi16(t1, t2); //xx V7 U7 Y7 xx V6 U6 Y6 xx V5 U5 Y5 xx V4 U4 Y4
882
883 96 __m128i px01 = _mm_unpacklo_epi8(low, zero); //xx xx 00 V1 00 U1 00 Y1 xx xx 00 V0 00 U0 00 Y0
884 96 __m128i px23 = _mm_unpackhi_epi8(low, zero); //xx xx 00 V3 00 U3 00 Y3 xx xx 00 V2 00 U2 00 Y2
885 96 __m128i px45 = _mm_unpacklo_epi8(high, zero); //xx xx 00 V5 00 U5 00 Y5 xx xx 00 V4 00 U4 00 Y4
886 96 __m128i px67 = _mm_unpackhi_epi8(high, zero); //xx xx 00 V7 00 U7 00 Y7 xx xx 00 V6 00 U6 00 Y6
887
888 96 px01 = _mm_add_epi16(px01, offset);
889 96 px23 = _mm_add_epi16(px23, offset);
890 96 px45 = _mm_add_epi16(px45, offset);
891 192 px67 = _mm_add_epi16(px67, offset);
892
893 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
894 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
895 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
896
897 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
898 __m128i alpha;
899 if constexpr(hasAlpha)
900 36 alpha = src_a; // a7 .. a0
901 else
902 60 alpha = _mm_cmpeq_epi32(result_r, result_r); // FF FF FF FF ... default alpha transparent
903
904 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
905
906 96 __m128i result_lo = _mm_unpacklo_epi16(result_bg, result_ra);
907 96 __m128i result_hi = _mm_unpackhi_epi16(result_bg, result_ra);
908
909 if constexpr(rgb_pixel_step == 4) {
910 //rgb32
911 60 _mm_store_si128(reinterpret_cast<__m128i*>(dstp+x*4), result_lo);
912 60 _mm_store_si128(reinterpret_cast<__m128i*>(dstp+x*4+16), result_hi);
913 }
914 else {
915 //rgb24
916 //"fast" SSSE3 version
917 36 __m128i px0123 = _mm_shuffle_epi8(result_lo, pixels0123_mask); //xxxx xxxx b3g3 r3b2 g2r2 b1g1 r1b0 g0r0
918 36 __m128i dst567 = _mm_shuffle_epi8(result_hi, pixels4567_mask); //r5b4 g4r4 xxxx xxxx b7g7 r7b6 g6r6 b5g5
919
920 72 __m128i dst012345 = _mm_or_si128(
921 _mm_andnot_si128(ssse3_merge_mask, px0123),
922 _mm_and_si128(ssse3_merge_mask, dst567)
923 ); //r5b4 g4r4 b3g3 r3b2 g2r2 b1g1 r1b0 g0r0
924
925 36 _mm_storeu_si128(reinterpret_cast<__m128i*>(dstp + x * 3), dst012345);
926 36 _mm_storel_epi64(reinterpret_cast<__m128i*>(dstp + x * 3 + 16), dst567);
927
928 }
929 }
930
931 if constexpr(rgb_pixel_step == 3) {
932 // for rgb32 (pixel_step == 4) we processed full width and more, including padded 8 bytes
933
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) {
934 27 int Y = srcY[x] + matrix.offset_y;
935 27 int U = srcU[x] - 128;
936 27 int V = srcV[x] - 128;
937 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);
938 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);
939 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);
940 27 dstp[x*rgb_pixel_step + 0] = PixelClip(b);
941 27 dstp[x*rgb_pixel_step + 1] = PixelClip(g);
942 27 dstp[x*rgb_pixel_step + 2] = PixelClip(r);
943 if constexpr(rgb_pixel_step == 4) { // n/a
944 dstp[x * 4 + 3] = 255;
945 }
946 }
947 }
948 24 dstp -= dst_pitch;
949 24 srcY += src_pitch_y;
950 24 srcU += src_pitch_uv;
951 24 srcV += src_pitch_uv;
952 if(hasAlpha)
953 9 srcA += src_pitch_a;
954 }
955 8 }
956
957 //instantiate
958 //template<int rgb_pixel_step, bool targetHasAlpha>
959 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);
960 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);
961 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);
962 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);
963
964
965 template<int rgb_pixel_step, bool hasAlpha>
966 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) {
967 8 dstp += dst_pitch * (height - 1); // We start at last line
968
969 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
970
971 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);
972 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);
973 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);
974
975 8 __m128i zero = _mm_setzero_si128();
976 // .13 bit frac integer arithmetic
977 8 int round_mask_plus_rgb_offset_i = (1 << 12) + (matrix.offset_rgb << 13);
978 8 __m128i round_mask_plus_rgb_offset = _mm_set1_epi32(round_mask_plus_rgb_offset_i);
979 8 __m128i offset = _mm_set_epi16(0, -128, -128, matrix.offset_y, 0, -128, -128, matrix.offset_y);
980
981
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) {
982
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) {
983 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
984 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
985 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
986 __m128i src_a;
987 if (hasAlpha)
988 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
989
990 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
991 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
992
993 96 __m128i low = _mm_unpacklo_epi16(t1, t2); //xx V3 U3 Y3 xx V2 U2 Y2 xx V1 U1 Y1 xx V0 U0 Y0
994 96 __m128i high = _mm_unpackhi_epi16(t1, t2); //xx V7 U7 Y7 xx V6 U6 Y6 xx V5 U5 Y5 xx V4 U4 Y4
995
996 96 __m128i px01 = _mm_unpacklo_epi8(low, zero); //xx xx 00 V1 00 U1 00 Y1 xx xx 00 V0 00 U0 00 Y0
997 96 __m128i px23 = _mm_unpackhi_epi8(low, zero); //xx xx 00 V3 00 U3 00 Y3 xx xx 00 V2 00 U2 00 Y2
998 96 __m128i px45 = _mm_unpacklo_epi8(high, zero); //xx xx 00 V5 00 U5 00 Y5 xx xx 00 V4 00 U4 00 Y4
999 96 __m128i px67 = _mm_unpackhi_epi8(high, zero); //xx xx 00 V7 00 U7 00 Y7 xx xx 00 V6 00 U6 00 Y6
1000
1001 96 px01 = _mm_add_epi16(px01, offset);
1002 96 px23 = _mm_add_epi16(px23, offset);
1003 96 px45 = _mm_add_epi16(px45, offset);
1004 192 px67 = _mm_add_epi16(px67, offset);
1005
1006 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
1007 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
1008 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
1009
1010 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
1011 __m128i alpha;
1012 if (hasAlpha)
1013 36 alpha = src_a; // a7 .. a0
1014 else
1015 60 alpha = _mm_cmpeq_epi32(result_r, result_r); // FF FF FF FF ... default alpha transparent
1016
1017 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
1018
1019 192 __m128i result_lo = _mm_unpacklo_epi16(result_bg, result_ra);
1020 96 __m128i result_hi = _mm_unpackhi_epi16(result_bg, result_ra);
1021
1022 if constexpr (rgb_pixel_step == 4) {
1023 //rgb32
1024 60 _mm_store_si128(reinterpret_cast<__m128i*>(dstp + x * 4), result_lo);
1025 60 _mm_store_si128(reinterpret_cast<__m128i*>(dstp + x * 4 + 16), result_hi);
1026 }
1027 else {
1028 //rgb24
1029 alignas(16) BYTE temp[32];
1030 //slow SSE2 version
1031 _mm_store_si128(reinterpret_cast<__m128i*>(temp), result_lo);
1032 36 _mm_store_si128(reinterpret_cast<__m128i*>(temp + 16), result_hi);
1033
1034
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) {
1035 252 *reinterpret_cast<int*>(dstp + (x + i) * 3) = *reinterpret_cast<int*>(temp + i * 4);
1036 }
1037 //last pixel
1038 36 dstp[(x + 7) * 3 + 0] = temp[7 * 4 + 0];
1039 36 dstp[(x + 7) * 3 + 1] = temp[7 * 4 + 1];
1040 36 dstp[(x + 7) * 3 + 2] = temp[7 * 4 + 2];
1041 }
1042 }
1043
1044 if constexpr (rgb_pixel_step == 3) {
1045 // for rgb32 (pixel_step == 4) we processed full width and more, including padded 8 bytes
1046
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) {
1047 27 int Y = srcY[x] + matrix.offset_y;
1048 27 int U = srcU[x] - 128;
1049 27 int V = srcV[x] - 128;
1050 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);
1051 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);
1052 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);
1053 27 dstp[x*rgb_pixel_step + 0] = PixelClip(b);
1054 27 dstp[x*rgb_pixel_step + 1] = PixelClip(g);
1055 27 dstp[x*rgb_pixel_step + 2] = PixelClip(r);
1056 if constexpr (rgb_pixel_step == 4) { // n/a
1057 dstp[x * 4 + 3] = 255;
1058 }
1059 }
1060 }
1061 24 dstp -= dst_pitch;
1062 24 srcY += src_pitch_y;
1063 24 srcU += src_pitch_uv;
1064 24 srcV += src_pitch_uv;
1065 if (hasAlpha)
1066 9 srcA += src_pitch_a;
1067 }
1068 8 }
1069
1070 //instantiate
1071 //template<int rgb_pixel_step, bool targetHasAlpha>
1072 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);
1073 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);
1074 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);
1075 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);
1076
1077
1078 #ifdef X86_32
1079
1080 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) {
1081 //int b = (((int)m[0] * Y + (int)m[1] * U + (int)m[ 2] * V + 4096)>>13);
1082
1083 //px01 - xx xx 00 V0 00 U0 00 Y0
1084
1085 __m64 low_lo = _mm_madd_pi16(px0, matrix); //xx*0 + v1*m2 | u1*m1 + y1*m0 | xx*0 + v0*m2 | u0*m1 + y0*m0
1086 __m64 low_hi = _mm_madd_pi16(px1, matrix); //xx*0 + v3*m2 | u3*m1 + y3*m0 | xx*0 + v2*m2 | u2*m1 + y2*m0
1087 __m64 high_lo = _mm_madd_pi16(px2, matrix);
1088 __m64 high_hi = _mm_madd_pi16(px3, matrix);
1089
1090 __m64 low_v = _mm_unpackhi_pi32(low_lo, low_hi); // v1*m2 | v0*m2
1091 __m64 high_v = _mm_unpackhi_pi32(high_lo, high_hi);
1092
1093 __m64 low_yu = _mm_unpacklo_pi32(low_lo, low_hi); // u1*m1 + y1*m0 | u0*m1 + y0*m0
1094 __m64 high_yu = _mm_unpacklo_pi32(high_lo, high_hi);
1095
1096 __m64 t_lo = _mm_add_pi32(low_v, low_yu); // v3*m2 + u3*m1 + y3*m0...
1097 __m64 t_hi = _mm_add_pi32(high_v, high_yu);
1098
1099 t_lo = _mm_add_pi32(t_lo, round_mask_plus_rgb_offset); // v3*m2 + u3*m1 + y3*m0 + 4096...
1100 t_hi = _mm_add_pi32(t_hi, round_mask_plus_rgb_offset);
1101
1102 t_lo = _mm_srai_pi32(t_lo, 13); // (v3*m2 + u3*m1 + y3*m0 + 4096) >> 13...
1103 t_hi = _mm_srai_pi32(t_hi, 13);
1104
1105 __m64 result = _mm_packs_pi32(t_lo, t_hi);
1106 result = _mm_packs_pu16(result, zero); //00 00 00 00 b3 b2 b1 b0
1107 return result;
1108 }
1109
1110 template<int rgb_pixel_step>
1111 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) {
1112 dstp += dst_pitch * (height-1); // We start at last line
1113
1114 size_t mod4_width = rgb_pixel_step == 3 ? width / 4 * 4 : width;
1115
1116 __m64 matrix_b = _mm_set_pi16(0, matrix.v_b, matrix.u_b, matrix.y_b);
1117 __m64 matrix_g = _mm_set_pi16(0, matrix.v_g, matrix.u_g, matrix.y_g);
1118 __m64 matrix_r = _mm_set_pi16(0, matrix.v_r, matrix.u_r, matrix.y_r);
1119
1120 __m64 zero = _mm_setzero_si64();
1121 int round_mask_plus_rgb_offset_i = 4096 + (matrix.offset_rgb << 13);
1122 __m64 round_mask_plus_rgb_offset = _mm_set1_pi32(round_mask_plus_rgb_offset_i);
1123
1124 __m64 ff = _mm_set1_pi32(0xFFFFFFFF);
1125 __m64 offset = _mm_set_pi16(0, -128, -128, matrix.offset_y);
1126 __m64 low_pixel_mask = _mm_set_pi32(0, 0x00FFFFFF);
1127 __m64 high_pixel_mask = _mm_set_pi32(0x00FFFFFF, 0);
1128
1129 for (size_t y = 0; y < height; ++y) {
1130 for (size_t x = 0; x < mod4_width; x+=4) {
1131 __m64 src_y = _mm_cvtsi32_si64(*reinterpret_cast<const int*>(srcY+x)); //0 0 0 0 Y3 Y2 Y1 Y0
1132 __m64 src_u = _mm_cvtsi32_si64(*reinterpret_cast<const int*>(srcU+x)); //0 0 0 0 U3 U2 U1 U0
1133 __m64 src_v = _mm_cvtsi32_si64(*reinterpret_cast<const int*>(srcV+x)); //0 0 0 0 V3 V2 V1 V0
1134
1135 __m64 t1 = _mm_unpacklo_pi8(src_y, src_u); //U3 Y3 U2 Y2 U1 Y1 U0 Y0
1136 __m64 t2 = _mm_unpacklo_pi8(src_v, zero); //00 V3 00 V2 00 V1 00 V0
1137
1138 __m64 low = _mm_unpacklo_pi16(t1, t2); //xx V1 U1 Y1 xx V0 U0 Y0
1139 __m64 high = _mm_unpackhi_pi16(t1, t2); //xx V3 U3 Y3 xx V2 U2 Y2
1140
1141 __m64 px0 = _mm_unpacklo_pi8(low, zero); //xx xx 00 V0 00 U0 00 Y0
1142 __m64 px1 = _mm_unpackhi_pi8(low, zero); //xx xx 00 V1 00 U1 00 Y1
1143 __m64 px2 = _mm_unpacklo_pi8(high, zero); //xx xx 00 V2 00 U2 00 Y2
1144 __m64 px3 = _mm_unpackhi_pi8(high, zero); //xx xx 00 V3 00 U3 00 Y3
1145
1146 px0 = _mm_add_pi16(px0, offset);
1147 px1 = _mm_add_pi16(px1, offset);
1148 px2 = _mm_add_pi16(px2, offset);
1149 px3 = _mm_add_pi16(px3, offset);
1150
1151 __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
1152 __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
1153 __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
1154
1155 __m64 result_bg = _mm_unpacklo_pi8(result_b, result_g); //g3 b3 g2 b2 g1 b1 g0 b0
1156 __m64 result_ra = _mm_unpacklo_pi8(result_r, ff); //a3 r3 a2 r2 a1 r1 a0 r0
1157
1158 __m64 result_lo = _mm_unpacklo_pi16(result_bg, result_ra);
1159 __m64 result_hi = _mm_unpackhi_pi16(result_bg, result_ra);
1160
1161 if (rgb_pixel_step == 4) {
1162 //rgb32
1163 *reinterpret_cast<__m64*>(dstp+x*4) = result_lo;
1164 *reinterpret_cast<__m64*>(dstp+x*4+8) = result_hi;
1165 } else {
1166 __m64 p0 = _mm_and_si64(result_lo, low_pixel_mask); //0000 0000 00r0 g0b0
1167 __m64 p1 = _mm_and_si64(result_lo, high_pixel_mask); //00r1 g1b1 0000 0000
1168 __m64 p2 = _mm_and_si64(result_hi, low_pixel_mask); //0000 0000 00r2 g2b2
1169 __m64 p3 = _mm_and_si64(result_hi, high_pixel_mask); //00r3 g3b3 0000 0000
1170
1171 __m64 dst01 = _mm_or_si64(p0, _mm_srli_si64(p1, 8)); //0000 r1g1 b1r0 g0b0
1172 p3 = _mm_srli_si64(p3, 24); //0000 0000 r3g3 b300
1173
1174 __m64 dst012 = _mm_or_si64(dst01, _mm_slli_si64(p2, 48)); //g2b2 r1g1 b1r0 g0b0
1175 __m64 dst23 = _mm_or_si64(p3, _mm_srli_si64(p2, 16)); //0000 0000 r3g3 b3r2
1176
1177 *reinterpret_cast<__m64*>(dstp+x*3) = dst012;
1178 *reinterpret_cast<int*>(dstp+x*3+8) = _mm_cvtsi64_si32(dst23);
1179 }
1180 }
1181
1182 if (rgb_pixel_step == 3) {
1183 for (size_t x = mod4_width; x < width; ++x) {
1184 int Y = srcY[x] + matrix.offset_y;
1185 int U = srcU[x] - 128;
1186 int V = srcV[x] - 128;
1187 int b = (((int)matrix.y_b * Y + (int)matrix.u_b * U + (int)matrix.v_b * V + round_mask_plus_rgb_offset_i) >> 13);
1188 int g = (((int)matrix.y_g * Y + (int)matrix.u_g * U + (int)matrix.v_g * V + round_mask_plus_rgb_offset_i) >> 13);
1189 int r = (((int)matrix.y_r * Y + (int)matrix.u_r * U + (int)matrix.v_r * V + round_mask_plus_rgb_offset_i) >> 13);
1190 dstp[x*rgb_pixel_step + 0] = PixelClip(b);
1191 dstp[x*rgb_pixel_step + 1] = PixelClip(g);
1192 dstp[x*rgb_pixel_step + 2] = PixelClip(r);
1193 if (rgb_pixel_step == 4) {
1194 dstp[x * 4 + 3] = 255;
1195 }
1196 }
1197 }
1198
1199 dstp -= dst_pitch;
1200 srcY += src_pitch_y;
1201 srcU += src_pitch_uv;
1202 srcV += src_pitch_uv;
1203 }
1204 _mm_empty();
1205 }
1206
1207 //instantiate
1208 //template<int rgb_pixel_step>
1209 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);
1210 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);
1211
1212 #endif
1213
1214
1215 1 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)
1216 {
1217 1 width /= 2;
1218
1219
2/2
✓ Branch 28 → 3 taken 5 times.
✓ Branch 28 → 29 taken 1 time.
6 for (size_t y = 0; y < height; ++y) {
1220
2/2
✓ Branch 26 → 4 taken 10 times.
✓ Branch 26 → 27 taken 5 times.
15 for (size_t x = 0; x < width; x += 8) {
1221 10 __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
1222 20 __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
1223
1224 10 __m128i p2 = _mm_unpacklo_epi8(p0, p1); // V5 V1 Yb Y3 U5 U1 Ya Y2 V4 V0 Y9 Y1 U4 U0 Y8 Y0
1225 10 __m128i p3 = _mm_unpackhi_epi8(p0, p1); // V7 V3 Yf Y7 U7 U3 Ye Y6 V6 V2 Yd Y5 U6 U2 Yc Y4
1226
1227 10 p0 = _mm_unpacklo_epi8(p2, p3); // V6 V4 V2 V0 Yd Y9 Y5 Y1 U6 U4 U2 U0 Yc Y8 Y4 Y0
1228 10 p1 = _mm_unpackhi_epi8(p2, p3); // V7 V5 V3 V1 Yf Yb Y7 Y3 U7 U5 U3 U1 Ye Ya Y6 Y2
1229
1230 10 p2 = _mm_unpacklo_epi8(p0, p1); // U7 U6 U5 U4 U3 U2 U1 U0 Ye Yc Ya Y8 Y6 Y4 Y2 Y0
1231 10 p3 = _mm_unpackhi_epi8(p0, p1); // V7 V6 V5 V4 V3 V2 V1 V0 Yf Yd Yb Y9 Y7 Y5 Y3 Y1
1232
1233 10 _mm_storel_epi64(reinterpret_cast<__m128i*>(dstp_u + x), _mm_srli_si128(p2, 8));
1234 10 _mm_storel_epi64(reinterpret_cast<__m128i*>(dstp_v + x), _mm_srli_si128(p3, 8));
1235 10 _mm_store_si128(reinterpret_cast<__m128i*>(dstp_y + x * 2), _mm_unpacklo_epi8(p2, p3));
1236 }
1237
1238 5 srcp += src_pitch;
1239 5 dstp_y += dst_pitch_y;
1240 5 dstp_u += dst_pitch_uv;
1241 5 dstp_v += dst_pitch_uv;
1242 }
1243 1 }
1244
1245
1246 #ifdef X86_32
1247
1248 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)
1249 {
1250 width /= 2;
1251
1252 for (size_t y = 0; y < height; ++y) {
1253 for (size_t x = 0; x < width; x += 4) {
1254 __m64 p0 = *reinterpret_cast<const __m64*>(srcp + x * 4); // V1 Y3 U1 Y2 V0 Y1 U0 Y0
1255 __m64 p1 = *reinterpret_cast<const __m64*>(srcp + x * 4 + 8); // V3 Y7 U3 Y6 V2 Y5 U2 Y4
1256
1257 __m64 p2 = _mm_unpacklo_pi8(p0, p1); // V2 V0 Y5 Y1 U2 U0 Y4 Y0
1258 __m64 p3 = _mm_unpackhi_pi8(p0, p1); // V3 V1 Y7 Y3 U3 U1 Y6 Y2
1259
1260 p0 = _mm_unpacklo_pi8(p2, p3); // U3 U2 U1 U0 Y6 Y4 Y2 Y0
1261 p1 = _mm_unpackhi_pi8(p2, p3); // V3 V2 V1 V0 Y7 Y5 Y3 Y1
1262
1263 *reinterpret_cast<int*>(dstp_u + x) = _mm_cvtsi64_si32(_mm_srli_si64(p0, 32));
1264 *reinterpret_cast<int*>(dstp_v + x) = _mm_cvtsi64_si32(_mm_srli_si64(p1, 32));
1265 *reinterpret_cast<__m64*>(dstp_y + x * 2) = _mm_unpacklo_pi8(p0, p1);
1266 }
1267
1268 srcp += src_pitch;
1269 dstp_y += dst_pitch_y;
1270 dstp_u += dst_pitch_uv;
1271 dstp_v += dst_pitch_uv;
1272 }
1273 _mm_empty();
1274 }
1275
1276 #endif
1277
1278
1279 1 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)
1280 {
1281 1 width /= 2;
1282
1283
2/2
✓ Branch 29 → 3 taken 5 times.
✓ Branch 29 → 30 taken 1 time.
6 for (size_t yy=0; yy<height; yy++) {
1284
2/2
✓ Branch 27 → 4 taken 10 times.
✓ Branch 27 → 28 taken 5 times.
15 for (size_t x=0; x<width; x+=8) {
1285
1286 10 __m128i y = _mm_load_si128(reinterpret_cast<const __m128i*>(srcp_y + x*2));
1287 10 __m128i u = _mm_loadl_epi64(reinterpret_cast<const __m128i*>(srcp_u + x));
1288 20 __m128i v = _mm_loadl_epi64(reinterpret_cast<const __m128i*>(srcp_v + x));
1289
1290 10 __m128i uv = _mm_unpacklo_epi8(u, v);
1291 10 __m128i yuv_lo = _mm_unpacklo_epi8(y, uv);
1292 10 __m128i yuv_hi = _mm_unpackhi_epi8(y, uv);
1293
1294 10 _mm_stream_si128(reinterpret_cast<__m128i*>(dstp + x*4), yuv_lo);
1295 10 _mm_stream_si128(reinterpret_cast<__m128i*>(dstp + x*4 + 16), yuv_hi);
1296 }
1297
1298 5 srcp_y += src_pitch_y;
1299 5 srcp_u += src_pitch_uv;
1300 5 srcp_v += src_pitch_uv;
1301 5 dstp += dst_pitch;
1302 }
1303 1 }
1304
1305 #ifdef X86_32
1306 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)
1307 {
1308 width /= 2;
1309
1310 for (size_t y=0; y<height; y++) {
1311 for (size_t x=0; x<width; x+=4) {
1312 __m64 y = *reinterpret_cast<const __m64*>(srcp_y + x*2);
1313 __m64 u = *reinterpret_cast<const __m64*>(srcp_u + x);
1314 __m64 v = *reinterpret_cast<const __m64*>(srcp_v + x);
1315
1316 __m64 uv = _mm_unpacklo_pi8(u, v);
1317 __m64 yuv_lo = _mm_unpacklo_pi8(y, uv);
1318 __m64 yuv_hi = _mm_unpackhi_pi8(y, uv);
1319
1320 *reinterpret_cast<__m64*>(dstp + x*4) = yuv_lo;
1321 *reinterpret_cast<__m64*>(dstp + x*4+8) = yuv_hi;
1322 }
1323
1324 srcp_y += src_pitch_y;
1325 srcp_u += src_pitch_uv;
1326 srcp_v += src_pitch_uv;
1327 dstp += dst_pitch;
1328 }
1329 _mm_empty();
1330 }
1331 #endif
1332
1333 DISABLE_WARNING_POP
1334
1335
1336
1337