Skip to content

Commit 7809a94

Browse files
author
Dogancan Ozturk
committed
neon improvement
1 parent 3f6337b commit 7809a94

File tree

9 files changed

+279
-82
lines changed

9 files changed

+279
-82
lines changed
-2 KB
Binary file not shown.

Examples/H264SharpNativePInvoke/Program.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ static Bitmap RawRgbToBitmap(byte[] rawRgbData, int width, int height)
5151
}
5252
static unsafe void Main(string[] args)
5353
{
54-
5554
var bytes = File.ReadAllBytes("Output.bin");
5655

5756
Bitmap bp = RawRgbToBitmap(bytes, 1920, 1080);

H264Sharp/Converter.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ public class Converter
1414

1515
public static bool EnableSSE { set => Defines.Native.EnableSSE(value?1:0); }
1616
public static bool EnableNEON { set => Defines.Native.EnableNEON(value?1:0); }
17+
18+
public static void SetConfig(ConverterConfig config) => Defines.Native.ConverterSetConfig(config);
19+
1720
/// <summary>
1821
/// Converts RGB,BGR,RGBA,BGRA to YUV420P
1922
/// </summary>

H264Sharp/Data.cs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -451,7 +451,27 @@ public static int CopyTo(EncodedData[] datas, byte[] toBuffer, int startIndex)
451451
}
452452
}
453453

454-
454+
[StructLayout(LayoutKind.Sequential)]
455+
public struct ConverterConfig
456+
{
457+
public int NumthreadsRgb2Yuv;
458+
public int NumthreadsYuv2Rgb;
459+
public int EnableSSE;
460+
public int EnableNeon;
461+
public int EnableAvx2;
462+
public int EnableAvx512;
463+
464+
public static ConverterConfig Default =>
465+
new ConverterConfig()
466+
{
467+
NumthreadsRgb2Yuv = 4,
468+
NumthreadsYuv2Rgb = 4,
469+
EnableAvx2 = 1,
470+
EnableAvx512 = 0,
471+
EnableNeon = 1,
472+
EnableSSE = 1
473+
};
474+
};
455475
#region Native API Data
456476
//------------------------
457477
[StructLayout(LayoutKind.Sequential)]

H264Sharp/NativeBindings.cs

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ public class NativeBindings
4545
private delegate void EnableSSEd(int val);
4646
private delegate void EnableNEONd(int val);
4747
private delegate void SetNumThreadsd(int val);
48+
private delegate void SetConverterConfigd(ConverterConfig config);
4849

4950

5051
//---------------------------------------Decleration-----------------------------------------------
@@ -83,7 +84,7 @@ public class NativeBindings
8384
private EnableSSEd enableSSE;
8485
private EnableNEONd enableNEON;
8586
private SetNumThreadsd setNumThreads;
86-
87+
private SetConverterConfigd setConfig;
8788

8889
#endregion
8990

@@ -166,6 +167,7 @@ private void LoadWindowsX86Bindings()
166167
enableSSE = Winx86.ConverterEnableSSE;
167168
enableNEON = Winx86.ConverterEnableNEON;
168169
setNumThreads = Winx86.ConverterNumThreads;
170+
setConfig = Winx86.ConverterSetConfig;
169171
}
170172

171173
private void LoadWindowsX64Bindings()
@@ -205,6 +207,7 @@ private void LoadWindowsX64Bindings()
205207
enableSSE = Winx64.ConverterEnableSSE;
206208
enableNEON = Winx64.ConverterEnableNEON;
207209
setNumThreads = Winx64.ConverterNumThreads;
210+
setConfig = Winx64.ConverterSetConfig;
208211
}
209212

210213
private void LoadLinuxX86Bindings()
@@ -244,6 +247,7 @@ private void LoadLinuxX86Bindings()
244247
enableSSE = Linuxx86.ConverterEnableSSE;
245248
enableNEON = Linuxx86.ConverterEnableNEON;
246249
setNumThreads = Linuxx86.ConverterNumThreads;
250+
setConfig = Linuxx86.ConverterSetConfig;
247251
}
248252

249253
private void LoadLinuxX64Bindings()
@@ -283,6 +287,7 @@ private void LoadLinuxX64Bindings()
283287
enableSSE = Linuxx64.ConverterEnableSSE;
284288
enableNEON = Linuxx64.ConverterEnableNEON;
285289
setNumThreads = Linuxx64.ConverterNumThreads;
290+
setConfig = LinuxArm64.ConverterSetConfig;
286291
}
287292

288293
private void LoadLinuxArmBindings()
@@ -322,6 +327,7 @@ private void LoadLinuxArmBindings()
322327
enableSSE = LinuxArm32.ConverterEnableSSE;
323328
enableNEON = LinuxArm32.ConverterEnableNEON;
324329
setNumThreads = LinuxArm32.ConverterNumThreads;
330+
setConfig = LinuxArm32.ConverterSetConfig;
325331
}
326332

327333
private void LoadLinuxArm64Bindings()
@@ -361,6 +367,7 @@ private void LoadLinuxArm64Bindings()
361367
enableSSE = LinuxArm64.ConverterEnableSSE;
362368
enableNEON = LinuxArm64.ConverterEnableNEON;
363369
setNumThreads = LinuxArm64.ConverterNumThreads;
370+
setConfig = LinuxArm64.ConverterSetConfig;
364371
}
365372

366373
#region Interface
@@ -437,6 +444,9 @@ internal void EnableNEON(int val)
437444
=> enableNEON(val);
438445
internal void ConverterSetNumThreads(int val)
439446
=> setNumThreads(val);
447+
internal void ConverterSetConfig(ConverterConfig val)
448+
=> setConfig(val);
449+
440450
#endregion
441451
}
442452

@@ -543,6 +553,9 @@ public unsafe class Winx86
543553

544554
[DllImport(DllName, EntryPoint = "ConverterEnableNEON", CallingConvention = CallingConvention.Cdecl)]
545555
internal static extern void ConverterEnableNEON(int val);
556+
557+
[DllImport(DllName, EntryPoint = "ConverterSetConfig", CallingConvention = CallingConvention.Cdecl)]
558+
internal static extern void ConverterSetConfig(ConverterConfig conf);
546559
}
547560

548561
public unsafe class Winx64
@@ -648,6 +661,9 @@ public unsafe class Winx64
648661

649662
[DllImport(DllName, EntryPoint = "ConverterEnableNEON", CallingConvention = CallingConvention.Cdecl)]
650663
internal static extern void ConverterEnableNEON(int val);
664+
665+
[DllImport(DllName, EntryPoint = "ConverterSetConfig", CallingConvention = CallingConvention.Cdecl)]
666+
internal static extern void ConverterSetConfig(ConverterConfig conf);
651667
}
652668

653669
public unsafe class Linuxx86
@@ -753,6 +769,9 @@ public unsafe class Linuxx86
753769

754770
[DllImport(DllName, EntryPoint = "ConverterEnableNEON", CallingConvention = CallingConvention.Cdecl)]
755771
internal static extern void ConverterEnableNEON(int val);
772+
773+
[DllImport(DllName, EntryPoint = "ConverterSetConfig", CallingConvention = CallingConvention.Cdecl)]
774+
internal static extern void ConverterSetConfig(ConverterConfig conf);
756775
}
757776

758777
public unsafe class Linuxx64
@@ -858,6 +877,9 @@ public unsafe class Linuxx64
858877

859878
[DllImport(DllName, EntryPoint = "ConverterEnableNEON", CallingConvention = CallingConvention.Cdecl)]
860879
internal static extern void ConverterEnableNEON(int val);
880+
881+
[DllImport(DllName, EntryPoint = "ConverterSetConfig", CallingConvention = CallingConvention.Cdecl)]
882+
internal static extern void ConverterSetConfig(ConverterConfig conf);
861883
}
862884

863885
public unsafe class LinuxArm32
@@ -963,6 +985,9 @@ public unsafe class LinuxArm32
963985

964986
[DllImport(DllName, EntryPoint = "ConverterEnableNEON", CallingConvention = CallingConvention.Cdecl)]
965987
internal static extern void ConverterEnableNEON(int val);
988+
989+
[DllImport(DllName, EntryPoint = "ConverterSetConfig", CallingConvention = CallingConvention.Cdecl)]
990+
internal static extern void ConverterSetConfig(ConverterConfig conf);
966991
}
967992

968993
public unsafe class LinuxArm64
@@ -1068,5 +1093,8 @@ public unsafe class LinuxArm64
10681093

10691094
[DllImport(DllName, EntryPoint = "ConverterEnableNEON", CallingConvention = CallingConvention.Cdecl)]
10701095
internal static extern void ConverterEnableNEON(int val);
1096+
1097+
[DllImport(DllName, EntryPoint = "ConverterSetConfig", CallingConvention = CallingConvention.Cdecl)]
1098+
internal static extern void ConverterSetConfig(ConverterConfig conf);
10711099
}
10721100
}

H264SharpNative/Converter.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include "Rgb2Yuv.h"
55
namespace H264Sharp {
66

7+
78
int Converter::EnableSSE = 1;
89
int Converter::EnableNEON = 1;
910
int Converter::NumThreads = 4;

H264SharpNative/Converter.h

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,14 @@
55
#include "ImageTypes.h"
66
namespace H264Sharp
77
{
8-
8+
struct ConverterConfig {
9+
int NumthreadsRgb2Yuv = 1;
10+
int NumthreadsYuv2Rgb = 1;
11+
int EnableSSE = 1;
12+
int EnableNeon = 1;
13+
int EnableAvx2 = 1;
14+
int EnableAvx512 = 1;
15+
};
916
class Converter
1017
{
1118
public:
@@ -31,6 +38,14 @@ namespace H264Sharp
3138
static void RGBtoYUV420Planar(unsigned char* bgr, unsigned char* dst, int width, int height, int stride);
3239
static void Downscale24(unsigned char* rgbSrc, int width, int height, int stride, unsigned char* dst, int multiplier);
3340
static void Downscale32(unsigned char* rgbSrc, int width, int height, int stride, unsigned char* dst, int multiplier);
41+
42+
static void SetConfig(ConverterConfig& config)
43+
{
44+
Converter::EnableSSE = config.EnableSSE;
45+
Converter::EnableNEON = config.EnableNeon;
46+
Converter::NumThreads = config.NumthreadsRgb2Yuv;
47+
std::cout << "SET";
48+
}
3449
};
3550

3651
}

H264SharpNative/Exports.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,10 @@ extern "C" {
142142
DLL_EXPORT void ConverterEnableNEON(int value) {
143143
Converter::EnableNEON = value;
144144

145+
}
146+
DLL_EXPORT void ConverterSetConfig(ConverterConfig config) {
147+
Converter::SetConfig(config);
148+
145149
}
146150
//-----
147151

0 commit comments

Comments
 (0)