@@ -21,11 +21,12 @@ namespace H264Sharp {
2121 {
2222
2323 int numThreads = Converter::NumThreads;
24-
25- if (Converter::EnableSSE>0 && width % 32 == 0 )
24+ numThreads = width * height < minSize ? 1 : numThreads;
25+ #ifndef __arm__
26+
27+ if (Converter::EnableSSE > 0 && width % 32 == 0 )
2628 {
27-
28- #ifndef __arm__
29+
2930 // SSE, may parallel, not arm
3031 Yuv2Rgb::yuv420_rgb24_sse (width,
3132 height,
@@ -38,8 +39,25 @@ namespace H264Sharp {
3839 dst_span,
3940 numThreads);
4041 return ;
42+ }
43+ else
44+ {
45+
46+ Yuv2Rgb::Yuv420P2RGBDefault (dst_ptr,
47+ y_ptr,
48+ u_ptr,
49+ v_ptr,
50+ width,
51+ height,
52+ y_span,
53+ uv_span,
54+ dst_span,
55+ numThreads);
56+ }
57+
4158 #elif defined(__aarch64__)
42- if (Converter::EnableNEON > 0 ) {
59+ if (Converter::EnableNEON > 0 && width % 16 == 0 )
60+ {
4361 if (numThreads>1 )
4462 Yuv2Rgb::ConvertYUVToRGB_NEON_Parallel (
4563 y_ptr,
@@ -49,15 +67,14 @@ namespace H264Sharp {
4967 width,
5068 height, numThreads);
5169 else
52- Yuv2Rgb::ConvertYUVToRGB_NEONv2 (
70+ Yuv2Rgb::ConvertYUVToRGB_NEON (
5371 y_ptr,
5472 u_ptr,
5573 v_ptr,
5674 dst_ptr,
5775 width,
5876 height);
59- }
60-
77+ }
6178 else
6279 {
6380 Yuv2Rgb::Yuv420P2RGBDefault (dst_ptr,
@@ -85,47 +102,13 @@ namespace H264Sharp {
85102 numThreads);
86103 #endif
87104
88- }
89- else
90- {
91-
92- Yuv2Rgb::Yuv420P2RGBDefault (dst_ptr,
93- y_ptr,
94- u_ptr,
95- v_ptr,
96- width,
97- height,
98- y_span,
99- uv_span,
100- dst_span,
101- numThreads);
102- }
105+
106+
103107
104108
105109 }
106110
107- void Converter::Yuv420PtoRGB (YuvNative& yuv, unsigned char * destination)
108- {
109- int numThreads = Converter::NumThreads;
110- if (Converter::EnableSSE>0 && yuv.width % 32 == 0 )
111- {
112-
113- #ifndef __arm__
114- // SSE, may parallel, not arm
115- Yuv2Rgb::yuv420_rgb24_sse (yuv, destination,
116- numThreads);
117- #else
118- Yuv2Rgb::Yuv420P2RGBDefault (yuv, destination,
119- numThreads);
120- #endif
121- }
122- else
123- {
124- Yuv2Rgb::Yuv420P2RGBDefault (yuv,destination,
125- numThreads);
126- }
127- }
128- ;
111+
129112
130113
131114 #pragma endregion
@@ -135,38 +118,32 @@ namespace H264Sharp {
135118 void Converter::BGRAtoYUV420Planar (const unsigned char * bgra, unsigned char * dst, const int width, const int height, const int stride)
136119 {
137120 int numThreads = Converter::NumThreads;
121+ numThreads= width* height < minSize ? 1 : numThreads;
138122
139123#if defined(__aarch64__)
140- Rgb2Yuv::BGRAtoYUV420PlanarNeon (bgra, dst, width, height, stride, numThreads);
141-
142- #else
143- if (width * height > minSize)
144- {
145- Rgb2Yuv::BGRAtoYUV420Planar (bgra, dst, width, height, stride, numThreads);
146- }
124+ if (Converter::EnableNEON>0 )
125+ Rgb2Yuv::BGRAtoYUV420PlanarNeon (bgra, dst, width, height, stride, numThreads);
147126 else
148- {
149- Rgb2Yuv::BGRAtoYUV420Planar (bgra, dst, width, height, stride, 1 );
150- }
127+ Rgb2Yuv::BGRAtoYUV420Planar (bgra, dst, width, height, stride, numThreads);
128+ # else
129+ Rgb2Yuv::BGRAtoYUV420Planar (bgra, dst, width, height, stride, numThreads);
151130#endif
152131 }
153132
154133 void Converter::RGBAtoYUV420Planar (unsigned char * bgra, unsigned char * dst, int width, int height, int stride)
155134 {
156135 int numThreads = Converter::NumThreads;
136+ numThreads = width * height < minSize ? 1 : numThreads;
157137
158138#if defined(__aarch64__)
159- Rgb2Yuv::RGBAtoYUV420PlanarNeon (bgra, dst, width, height, stride, numThreads);
139+ if (Converter::EnableNEON > 0 )
140+ Rgb2Yuv::RGBAtoYUV420PlanarNeon (bgra, dst, width, height, stride, numThreads);
141+ else
142+ Rgb2Yuv::RGBAtoYUV420Planar (bgra, dst, width, height, stride, numThreads);
160143
161144#else
162- if (width * height > minSize)
163- {
164- Rgb2Yuv::RGBAtoYUV420Planar (bgra, dst, width, height, stride, numThreads);
165- }
166- else
167- {
168- Rgb2Yuv::RGBAtoYUV420Planar (bgra, dst, width, height, stride, 1 );
169- }
145+
146+ Rgb2Yuv::RGBAtoYUV420Planar (bgra, dst, width, height, stride, numThreads);
170147#endif
171148
172149
@@ -175,39 +152,36 @@ namespace H264Sharp {
175152 void Converter::BGRtoYUV420Planar (unsigned char * bgra, unsigned char * dst, int width, int height, int stride)
176153 {
177154 int numThreads = Converter::NumThreads;
155+ numThreads = width * height < minSize ? 1 : numThreads;
178156
179157#if defined(__aarch64__)
180- Rgb2Yuv::BGRtoYUV420PlanarNeon (bgra, dst, width, height, stride, numThreads);
158+ if (Converter::EnableNEON > 0 )
159+ Rgb2Yuv::BGRtoYUV420PlanarNeon (bgra, dst, width, height, stride, numThreads);
160+ else
161+ Rgb2Yuv::BGRtoYUV420Planar (bgra, dst, width, height, stride, numThreads);
181162
182163#else
183- if (width * height > minSize)
184- {
164+
185165 Rgb2Yuv::BGRtoYUV420Planar (bgra, dst, width, height, stride, numThreads);
186- }
187- else
188- {
189- Rgb2Yuv::BGRtoYUV420Planar (bgra, dst, width, height, stride, 1 );
190- }
166+
191167#endif
192168
193169 }
194170
195171 void Converter::RGBtoYUV420Planar (unsigned char * bgra, unsigned char * dst, int width, int height, int stride)
196172 {
197173 int numThreads = Converter::NumThreads;
174+ numThreads = width * height < minSize ? 1 : numThreads;
198175
199176#if defined(__aarch64__)
200- Rgb2Yuv::RGBtoYUV420PlanarNeon (bgra, dst, width, height, stride, numThreads);
201-
177+ if (Converter::EnableNEON > 0 )
178+ Rgb2Yuv::RGBtoYUV420PlanarNeon (bgra, dst, width, height, stride, numThreads);
179+ else
180+ Rgb2Yuv::RGBtoYUV420Planar (bgra, dst, width, height, stride, numThreads);
202181#else
203- if (width * height > minSize)
204- {
182+
205183 Rgb2Yuv::RGBtoYUV420Planar (bgra, dst, width, height, stride, numThreads);
206- }
207- else
208- {
209- Rgb2Yuv::RGBtoYUV420Planar (bgra, dst, width, height, stride, 1 );
210- }
184+
211185#endif
212186
213187 }
0 commit comments