Skip to content

Commit 66b4220

Browse files
committed
fixed new converter method bug
1 parent e46ebea commit 66b4220

File tree

6 files changed

+138
-84
lines changed

6 files changed

+138
-84
lines changed

Examples/H264SharpNativePInvoke/Program.cs

Lines changed: 43 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@ namespace H264PInvoke
99

1010
internal class Program
1111
{
12-
static void Main(string[] args)
12+
static unsafe void Main(string[] args)
1313
{
14+
//BencmarkConverter();
15+
//return;
1416
// You can change version or specify the path for cisco dll.
1517

1618
//Defines.CiscoDllName64bit = "openh264-2.5.0-win64.dll";
@@ -21,7 +23,7 @@ static void Main(string[] args)
2123

2224
encoder.ConverterNumberOfThreads = 4;
2325
decoder.ConverterNumberOfThreads = 4;
24-
decoder.EnableSSEYUVConversion = true;
26+
decoder.EnableSSEYUVConversion = false;
2527
decoder.Initialize();
2628
var img = System.Drawing.Image.FromFile("ocean 1920x1080.jpg");
2729
//var img = System.Drawing.Image.FromFile("ocean 3840x2160.jpg");
@@ -35,23 +37,14 @@ static void Main(string[] args)
3537
Stopwatch sw = Stopwatch.StartNew();
3638
var data = BitmapToImageData(bmp);
3739

38-
YuvImage yuvImage = new YuvImage(w, h);
39-
Converter.Rgbx2Yuv(data, yuvImage, 4);
40-
41-
RgbImage rgb = new RgbImage(w, h);
42-
Converter.Yuv2Rgb(yuvImage, rgb, 4);
43-
44-
Bitmap result2 = RgbToBitmap(rgb);
45-
result2.Save("converted.bmp");
46-
47-
//Converter converter = new Converter();
40+
4841
//RgbImage to = new RgbImage(data.Width / 2, data.Height / 2);
49-
//converter.Downscale(data,to,2);
42+
//Converter.Downscale(data, to, 2);
5043
//var bb = RgbToBitmap(to);
5144
//bb.Save("Dowmscaled.bmp");
5245

5346
RgbImage rgbb = new RgbImage(w, h);
54-
for (int j = 0; j < 1; j++)
47+
for (int j = 0; j < 1000; j++)
5548
{
5649

5750
if (!encoder.Encode(data, out EncodedData[] ec))
@@ -70,20 +63,14 @@ static void Main(string[] args)
7063
//encoded.GetBytes();
7164
//encoded.CopyTo(buffer,offset);
7265

73-
if (decoder.Decode(encoded, noDelay: true, out DecodingState ds, out YUVImagePointer yv))
66+
67+
if (decoder.Decode(encoded, noDelay: true, out DecodingState ds, ref rgbb))
7468
{
75-
RgbImage rgba = new RgbImage(w, h);
76-
Converter.Yuv2Rgb(yv, rgba, 4);
77-
Bitmap result22 = RgbToBitmap(rgba);
78-
result22.Save("converted2.bmp");
69+
//Console.WriteLine($"F:{encoded.FrameType} size: {encoded.Length}");
70+
//Bitmap result = RgbToBitmap(rgbb);
71+
//result.Save("Ok1.bmp");
72+
7973
}
80-
//if (decoder.Decode(encoded, noDelay: true, out DecodingState ds, ref rgbb))
81-
//{
82-
// //Console.WriteLine($"F:{encoded.FrameType} size: {encoded.Length}");
83-
// Bitmap result = RgbToBitmap(rgbb);
84-
// result.Save("Ok1.bmp");
85-
86-
//}
8774

8875
}
8976
}
@@ -94,6 +81,36 @@ static void Main(string[] args)
9481
decoder.Dispose();
9582
Console.ReadLine();
9683
}
84+
private static void BencmarkConverter()
85+
{
86+
//var img = System.Drawing.Image.FromFile("ocean 3840x2160.jpg");
87+
var img = System.Drawing.Image.FromFile("ocean 1920x1080.jpg");
88+
89+
int th = 32;
90+
int w = img.Width;
91+
int h = img.Height;
92+
var bmp = new Bitmap(img);
93+
94+
95+
YuvImage yuvImage = new YuvImage(w, h);
96+
RgbImage rgb = new RgbImage(w, h);
97+
98+
var data = BitmapToImageData(bmp);
99+
100+
Converter.Rgbx2Yuv(data, yuvImage, 1);
101+
Converter.Yuv2Rgb(yuvImage, rgb, 4);
102+
RgbToBitmap(rgb).Save("converted.bmp");
103+
104+
Stopwatch sw = Stopwatch.StartNew();
105+
for (int i = 0; i < 10000; i++)
106+
{
107+
Converter.Yuv2Rgb(yuvImage, rgb, th);
108+
109+
Converter.Rgb2Yuv(rgb, yuvImage, th);
110+
}
111+
Console.WriteLine(sw.ElapsedMilliseconds);
112+
113+
}
97114

98115
private static Bitmap RgbToBitmap(RGBImagePointer img)
99116
{

H264Sharp/Converter.cs

Lines changed: 40 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,12 @@ namespace H264Sharp
66
public class Converter
77
{
88

9-
static NativeBindings native = new NativeBindings();
10-
9+
/// <summary>
10+
/// Converts RGB,BGR,RGBA,BGRA to YUV420P
11+
/// </summary>
12+
/// <param name="from"></param>
13+
/// <param name="yuv"></param>
14+
/// <param name="numchunks"></param>
1115
public static void Rgbx2Yuv(ImageData from, YuvImage yuv, int numchunks)
1216
{
1317
unsafe
@@ -25,8 +29,8 @@ public static void Rgbx2Yuv(ImageData from, YuvImage yuv, int numchunks)
2529
Stride = from.Stride,
2630
ImgType = from.ImgType,
2731
};
28-
var refe = yuv.GetRef();
29-
native.RGBXtoYUV(ref ugi, ref refe, numchunks);
32+
var refe = yuv.GetImagePointer();
33+
Defines.Native.RGBXtoYUV(ref ugi, ref refe, numchunks);
3034
}
3135
}
3236
else
@@ -39,27 +43,49 @@ public static void Rgbx2Yuv(ImageData from, YuvImage yuv, int numchunks)
3943
Stride = from.Stride,
4044
ImgType = from.ImgType,
4145
};
42-
var refe = yuv.GetRef();
43-
native.RGBXtoYUV(ref ugi, ref refe, numchunks);
46+
var refe = yuv.GetImagePointer();
47+
Defines.Native.RGBXtoYUV(ref ugi, ref refe, numchunks);
4448
}
4549

4650

4751
}
4852

4953
}
54+
/// <summary>
55+
/// Converts Rgb to Yuv420p
56+
/// </summary>
57+
/// <param name="from"></param>
58+
/// <param name="yuv"></param>
59+
/// <param name="numchunks"></param>
60+
public static void Rgb2Yuv(RgbImage from, YuvImage yuv, int numchunks)
61+
{
62+
unsafe
63+
{
64+
var ugi = new UnsafeGenericImage()
65+
{
66+
ImageBytes = (byte*)from.ImageBytes.ToPointer(),
67+
Width = from.Width,
68+
Height = from.Height,
69+
Stride = from.Stride,
70+
ImgType = ImageType.Rgb,
71+
};
72+
var refe = yuv.GetImagePointer();
73+
Defines.Native.RGBXtoYUV(ref ugi, ref refe, numchunks);
74+
}
75+
76+
}
77+
5078

51-
public static void Yuv2Rgb( YuvImage yuv,RgbImage image, int numchunks)
79+
public static void Yuv2Rgb(YuvImage yuv,RgbImage image, int numchunks)
5280
{
5381
var rgb = new RGBImagePointer(image.Width, image.Height,image.Stride,image.ImageBytes);
54-
55-
var yuvref = yuv.GetRef();
56-
native.YUV2RGB(ref yuvref, ref rgb, numchunks);
82+
var yuvref = yuv.GetImagePointer();
83+
Defines.Native.YUV2RGB(ref yuvref, ref rgb, numchunks);
5784
}
5885
public static void Yuv2Rgb(YUVImagePointer yuv, RgbImage image, int numchunks)
5986
{
6087
var rgb = new RGBImagePointer(image.Width, image.Height, image.Stride, image.ImageBytes);
61-
62-
native.YUV2RGB(ref yuv, ref rgb, numchunks);
88+
Defines.Native.YUV2RGB(ref yuv, ref rgb, numchunks);
6389
}
6490

6591
/// <summary>
@@ -94,7 +120,7 @@ public static void Downscale(ImageData from, RgbImage to, int multiplier)
94120
t.Stride = from.Stride;
95121
t.ImgType = ImageType.Rgb;
96122

97-
native.DownscaleImg(ref ugi, ref t, multiplier);
123+
Defines.Native.DownscaleImg(ref ugi, ref t, multiplier);
98124
}
99125
}
100126
else
@@ -117,7 +143,7 @@ public static void Downscale(ImageData from, RgbImage to, int multiplier)
117143
t.Stride = from.Stride;
118144
t.ImgType = ImageType.Rgb;
119145

120-
native.DownscaleImg(ref ugi, ref t, multiplier);
146+
Defines.Native.DownscaleImg(ref ugi, ref t, multiplier);
121147

122148
}
123149
}

H264Sharp/Data.cs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -216,14 +216,17 @@ public YUVImagePointer(byte* y, byte* u, byte* v, int width, int height, int str
216216
this.strideUV = strideUV;
217217
}
218218
};
219-
219+
/// <summary>
220+
/// Represent YUV420 Planar image.
221+
/// This class owns unmanaged raw image bytes upon creation
222+
/// </summary>
220223
public class YuvImage
221224
{
222225
public int Width;
223226
public int Height;
224227
public readonly int strideY;
225228
public readonly int strideUV;
226-
internal IntPtr ImageBytes;
229+
public IntPtr ImageBytes;
227230
private bool disposedValue;
228231

229232
public YuvImage(int width, int height)
@@ -232,19 +235,22 @@ public YuvImage(int width, int height)
232235
Height = height;
233236
strideY = width;
234237
strideUV = width/2;
235-
this.ImageBytes = Marshal.AllocHGlobal(width * height * 3);
238+
this.ImageBytes = Marshal.AllocHGlobal((width * height)*2);
236239
}
237240

238-
internal unsafe YUVImagePointer GetRef()
241+
internal unsafe YUVImagePointer GetImagePointer()
239242
{
240243
return new YUVImagePointer(
241244
(byte*)ImageBytes.ToPointer(),
242245
(byte*)IntPtr.Add(ImageBytes, Width * Height),
243-
(byte*)IntPtr.Add(ImageBytes, Width * Height + (Width*Height/2)),
246+
(byte*)IntPtr.Add(ImageBytes, Width * Height + (Width*Height)/4),
244247
Width, Height, strideY, strideUV);
245248

246249
}
247250

251+
/// <summary>
252+
/// Disposes the thnstance and clears unmanaged memory
253+
/// </summary>
248254
protected virtual void Dispose(bool disposing)
249255
{
250256
if (!disposedValue)
@@ -259,6 +265,9 @@ protected virtual void Dispose(bool disposing)
259265
Dispose(disposing: false);
260266
}
261267

268+
/// <summary>
269+
/// Disposes the thnstance and clears unmanaged memory
270+
/// </summary>
262271
public void Dispose()
263272
{
264273
Dispose(disposing: true);

H264Sharp/Defines.cs

Lines changed: 39 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -6,54 +6,56 @@
66
namespace H264Sharp
77
{
88
public class Defines
9+
{
10+
public static NativeBindings Native = new NativeBindings();
11+
12+
static Defines()
913
{
10-
static Defines()
14+
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
1115
{
12-
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
16+
switch (RuntimeInformation.ProcessArchitecture)
1317
{
14-
switch (RuntimeInformation.ProcessArchitecture)
15-
{
16-
case Architecture.X86:
17-
CiscoDllName = "openh264-2.4.1-win32.dll";
18-
break;
19-
case Architecture.X64:
20-
CiscoDllName = "openh264-2.4.1-win64.dll";
21-
break;
22-
}
23-
18+
case Architecture.X86:
19+
CiscoDllName = "openh264-2.4.1-win32.dll";
20+
break;
21+
case Architecture.X64:
22+
CiscoDllName = "openh264-2.4.1-win64.dll";
23+
break;
2424
}
25-
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
25+
26+
}
27+
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
28+
{
29+
switch (RuntimeInformation.ProcessArchitecture)
2630
{
27-
switch (RuntimeInformation.ProcessArchitecture)
28-
{
29-
case Architecture.X86:
30-
CiscoDllName = "./libopenh264-2.4.1-linux64.7.so";
31-
break;
32-
case Architecture.X64:
33-
CiscoDllName = "./libopenh264-2.4.1-linux32.7.so";
34-
break;
35-
case Architecture.Arm:
36-
CiscoDllName = "./libopenh264-2.4.1-linux-arm.7.so";
37-
break;
38-
case Architecture.Arm64:
39-
CiscoDllName = "./libopenh264-2.4.1-linux-arm64.7.so";
40-
break;
41-
}
31+
case Architecture.X86:
32+
CiscoDllName = "./libopenh264-2.4.1-linux64.7.so";
33+
break;
34+
case Architecture.X64:
35+
CiscoDllName = "./libopenh264-2.4.1-linux32.7.so";
36+
break;
37+
case Architecture.Arm:
38+
CiscoDllName = "./libopenh264-2.4.1-linux-arm.7.so";
39+
break;
40+
case Architecture.Arm64:
41+
CiscoDllName = "./libopenh264-2.4.1-linux-arm64.7.so";
42+
break;
4243
}
43-
4444
}
4545

46-
public static string CiscoDllName;
46+
}
47+
48+
public static string CiscoDllName;
4749

48-
public const string WrapperDllWinx86 = "H264SharpNative-win32.dll";
49-
public const string WrapperDllWinx64 = "H264SharpNative-win64.dll";
50+
public const string WrapperDllWinx86 = "H264SharpNative-win32.dll";
51+
public const string WrapperDllWinx64 = "H264SharpNative-win64.dll";
5052

51-
public const string WrapperDllLinuxx64 = "H264SharpNative-linux64.so";
52-
public const string WrapperDllLinuxx86 = "H264SharpNative-linux32.so";
53+
public const string WrapperDllLinuxx64 = "H264SharpNative-linux64.so";
54+
public const string WrapperDllLinuxx86 = "H264SharpNative-linux32.so";
5355

54-
public const string WrapperDllLinuxArm64 = "H264SharpNative-linux-arm64.so";
55-
public const string WrapperDllLinuxArm32 = "H264SharpNative-linux-arm32.so";
56+
public const string WrapperDllLinuxArm64 = "H264SharpNative-linux-arm64.so";
57+
public const string WrapperDllLinuxArm32 = "H264SharpNative-linux-arm32.so";
5658

57-
}
59+
}
5860

5961
}

H264Sharp/H264Decoder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public class H264Decoder : IDisposable
1313

1414
private int converterNumberOfThreads;
1515
private bool enableSSEYUVConversion;
16-
private NativeBindings native = new NativeBindings();
16+
private NativeBindings native =>Defines.Native;
1717
/// <summary>
1818
/// Number of threads to use on YUV420P to RGB conversion on decoder
1919
/// Default is 4.

H264Sharp/H264Encoder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public class H264Encoder:IDisposable
3434
private bool disposedValue;
3535
private int disposed=0;
3636
private int converterNumberOfThreads;
37-
private NativeBindings native = new NativeBindings();
37+
private NativeBindings native =>Defines.Native;
3838
/// <summary>
3939
/// Num threads to be used on image color formay converter.
4040
/// </summary>

0 commit comments

Comments
 (0)