Skip to content

Commit 9268ee0

Browse files
Merge pull request #12 from ReferenceType/develop
Develop
2 parents e46ebea + 66ef693 commit 9268ee0

33 files changed

+50718
-612
lines changed

Examples/AVRecord/MainWindow.xaml.cs

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -100,9 +100,9 @@ public MainWindow()
100100
decParam.sVideoProperty.eVideoBsType = VIDEO_BITSTREAM_TYPE.VIDEO_BITSTREAM_SVC;
101101
decoder.Initialize(decParam);
102102

103-
encoder.ConverterNumberOfThreads = 0;
104-
decoder.ConverterNumberOfThreads = 0;
105-
decoder.EnableSSEYUVConversion= true;
103+
Converter.EnableSSE = true;
104+
Converter.NumThreads = 0;
105+
106106
InitializeComponent();
107107

108108
}
@@ -558,29 +558,27 @@ private void ParallelConverterChecked(object sender, RoutedEventArgs e)
558558
{
559559
if (encoder == null)
560560
return;
561-
encoder.ConverterNumberOfThreads = ((CheckBox)sender).IsChecked ?? false ? numThreads : 0 ;
562-
decoder.ConverterNumberOfThreads = ((CheckBox)sender).IsChecked??false ? numThreads : 0;
561+
Converter.NumThreads = ((CheckBox)sender).IsChecked ?? false ? numThreads : 0 ;
563562
}
564563
private void ParallelConverterUnChecked(object sender, RoutedEventArgs e)
565564
{
566565
if (encoder == null)
567566
return;
568-
encoder.ConverterNumberOfThreads = ((CheckBox)sender).IsChecked ?? false ? numThreads : 0;
569-
decoder.ConverterNumberOfThreads = ((CheckBox)sender).IsChecked ?? false ? numThreads : 0;
567+
Converter.NumThreads = ((CheckBox)sender).IsChecked ?? false ? numThreads : 0;
570568
}
571569

572570
private void SSEChecked(object sender, RoutedEventArgs e)
573571
{
574572
if (decoder == null)
575573
return;
576-
decoder.EnableSSEYUVConversion = ((CheckBox)sender).IsChecked ?? false;
574+
Converter.EnableSSE = ((CheckBox)sender).IsChecked ?? false;
577575

578576
}
579577
private void SSEUnChecked(object sender, RoutedEventArgs e)
580578
{
581579
if (decoder == null)
582580
return;
583-
decoder.EnableSSEYUVConversion = ((CheckBox)sender).IsChecked ?? false;
581+
Converter.EnableSSE = ((CheckBox)sender).IsChecked ?? false;
584582

585583
}
586584

Examples/CrossPlatformTest/CrossPlatformTest.csproj

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,14 @@
66
<ImplicitUsings>enable</ImplicitUsings>
77
<Nullable>enable</Nullable>
88
<PublishAot>False</PublishAot>
9+
<AllowUnsafeBlocks>True</AllowUnsafeBlocks>
910
<!--<RuntimeIdentifier>win-x86</RuntimeIdentifier>-->
1011

1112
</PropertyGroup>
13+
14+
<ItemGroup>
15+
<ProjectReference Include="..\..\H264Sharp\H264Sharp.csproj" />
16+
</ItemGroup>
1217

1318
<ItemGroup>
1419
<None Update="H264SharpNative-linux64.so">

Examples/CrossPlatformTest/Program.cs

Lines changed: 67 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,14 @@ internal class Program
1414
*/
1515
static void Main(string[] args)
1616
{
17+
18+
Converter.EnableNEON = true;
19+
Converter.NumThreads = 1;
20+
1721
H264Encoder encoder = new H264Encoder();
1822
H264Decoder decoder = new H264Decoder();
1923

20-
encoder.ConverterNumberOfThreads = 4;
21-
decoder.ConverterNumberOfThreads = 4;
22-
decoder.EnableSSEYUVConversion = true;
24+
2325

2426
decoder.Initialize();
2527

@@ -32,12 +34,70 @@ static void Main(string[] args)
3234
var bytes = File.ReadAllBytes("RawBgr.bin");
3335
var data = new ImageData(ImageType.Bgra, 1920, 1080, 1920*4, bytes);
3436

35-
36-
37-
37+
//Converter.EnableNEON = false;
38+
39+
YuvImage yuvImage = new YuvImage(w, h);
40+
RgbImage rgb = new RgbImage(w, h);
41+
42+
var ss1 = Stopwatch.StartNew();
43+
Converter.Rgbx2Yuv(data, yuvImage);
44+
Converter.Yuv2Rgb(yuvImage, rgb);
45+
ss1.Stop();
46+
47+
Console.WriteLine("Conv 1: " + ss1.ElapsedMilliseconds);
48+
byte[] dat = new byte[w * h * 3];
49+
50+
unsafe
51+
{
52+
fixed (byte* dataPtr = dat)
53+
Buffer.MemoryCopy((byte*)rgb.ImageBytes.ToPointer(), dataPtr, dat.Length, dat.Length);
54+
}
55+
File.WriteAllBytes("Output.bin", dat);
56+
57+
Converter.Rgb2Yuv(rgb, yuvImage);
58+
Converter.Yuv2Rgb(yuvImage, rgb);
59+
unsafe
60+
{
61+
fixed (byte* dataPtr = dat)
62+
Buffer.MemoryCopy((byte*)rgb.ImageBytes.ToPointer(), dataPtr, dat.Length, dat.Length);
63+
}
64+
File.WriteAllBytes("Output1.bin", dat);
65+
66+
67+
var ss2 = Stopwatch.StartNew();
68+
69+
for (int i = 0; i < 50; i++)
70+
{
71+
bytes = File.ReadAllBytes("RawBgr.bin");
72+
data = new ImageData(ImageType.Bgra, 1920, 1080, 1920 * 4, bytes);
73+
74+
ss2.Restart();
75+
Converter.Rgbx2Yuv(data, yuvImage);
76+
ss2.Stop();
77+
Console.WriteLine("Conv1: " + ss2.ElapsedMilliseconds);
78+
Thread.Sleep(100);
79+
80+
ss2.Restart();
81+
Converter.Yuv2Rgb(yuvImage, rgb);
82+
ss2.Stop();
83+
Console.WriteLine("Conv2: " + ss2.ElapsedMilliseconds);
84+
Thread.Sleep(100);
85+
86+
87+
}
88+
89+
90+
var ss = Stopwatch.StartNew();
91+
for (int i = 0; i < 1000; i++)
92+
{
93+
Converter.Rgbx2Yuv(data, yuvImage);
94+
Converter.Yuv2Rgb(yuvImage, rgb);
95+
}
96+
ss.Stop();
97+
Console.WriteLine("Conv: " + ss.ElapsedMilliseconds);
3898

3999
RgbImage rgbb = new RgbImage(w, h);
40-
for (int j = 0; j < 1000; j++)
100+
for (int i = 0; i <= 200; i++)
41101
{
42102

43103
if (!encoder.Encode(data, out EncodedData[] ec))
15.5 KB
Binary file not shown.

Examples/H264SharpNativePInvoke/H264SharpNativePInvoke.csproj

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
</ItemGroup>
1414

1515
<ItemGroup>
16+
<ProjectReference Include="..\..\H264SharpBitmapExtentions\H264SharpBitmapExtentions.csproj" />
1617
<ProjectReference Include="..\..\H264Sharp\H264Sharp.csproj" />
1718
</ItemGroup>
1819

@@ -44,8 +45,5 @@
4445
<None Update="openh264-2.4.1-win64.dll">
4546
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
4647
</None>
47-
<None Update="openh264-2.5.0-win64.dll">
48-
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
49-
</None>
5048
</ItemGroup>
5149
</Project>

Examples/H264SharpNativePInvoke/Program.cs

Lines changed: 101 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,78 @@
11
using H264Sharp;
2+
using H264SharpBitmapExtentions;
23
using System.Diagnostics;
34
using System.Drawing;
45
using System.Drawing.Imaging;
6+
using System.Runtime.InteropServices;
57

68
namespace H264PInvoke
79
{
810
#pragma warning disable CA1416 // Validate platform compatibility
911

1012
internal class Program
1113
{
12-
static void Main(string[] args)
14+
static Bitmap RawRgbToBitmap(byte[] rawRgbData, int width, int height)
1315
{
16+
if (rawRgbData.Length != width * height * 3)
17+
throw new ArgumentException("The size of the raw RGB data does not match the specified dimensions.");
18+
19+
// Create a new Bitmap
20+
Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format24bppRgb);
21+
22+
// Lock the Bitmap's bits for writing
23+
BitmapData bitmapData = bitmap.LockBits(
24+
new Rectangle(0, 0, width, height),
25+
ImageLockMode.WriteOnly,
26+
PixelFormat.Format24bppRgb);
27+
28+
// Copy the raw RGB data into the Bitmap's memory
29+
IntPtr ptr = bitmapData.Scan0;
30+
int stride = bitmapData.Stride;
31+
int offset = stride - width * 3;
32+
33+
// Handle cases where stride is not equal to width * 3
34+
if (offset == 0)
35+
{
36+
Marshal.Copy(rawRgbData, 0, ptr, rawRgbData.Length);
37+
}
38+
else
39+
{
40+
// Copy row by row if stride padding exists
41+
for (int y = 0; y < height; y++)
42+
{
43+
Marshal.Copy(rawRgbData, y * width * 3, ptr + y * stride, width * 3);
44+
}
45+
}
46+
47+
// Unlock the Bitmap's bits
48+
bitmap.UnlockBits(bitmapData);
49+
50+
return bitmap;
51+
}
52+
static unsafe void Main(string[] args)
53+
{
54+
var bytes = File.ReadAllBytes("Output.bin");
55+
56+
Bitmap bp = RawRgbToBitmap(bytes, 1920, 1080);
57+
bp.Save("CVR.bmp");
58+
59+
var bytes1 = File.ReadAllBytes("Output1.bin");
60+
61+
Bitmap bp1 = RawRgbToBitmap(bytes1, 1920, 1080);
62+
bp1.Save("CVR1.bmp");
63+
64+
65+
66+
return;
67+
68+
69+
H264Encoder.EnableDebugPrints = true;
70+
H264Decoder.EnableDebugPrints = true;
71+
Converter.EnableSSE = true;
72+
Converter.NumThreads = 4;
73+
Converter.UseCustomThreadPool = false;
74+
// BencmarkConverter();
75+
//return;
1476
// You can change version or specify the path for cisco dll.
1577

1678
//Defines.CiscoDllName64bit = "openh264-2.5.0-win64.dll";
@@ -19,39 +81,25 @@ static void Main(string[] args)
1981
H264Encoder encoder = new H264Encoder();
2082
H264Decoder decoder = new H264Decoder();
2183

22-
encoder.ConverterNumberOfThreads = 4;
23-
decoder.ConverterNumberOfThreads = 4;
24-
decoder.EnableSSEYUVConversion = true;
84+
2585
decoder.Initialize();
86+
2687
var img = System.Drawing.Image.FromFile("ocean 1920x1080.jpg");
2788
//var img = System.Drawing.Image.FromFile("ocean 3840x2160.jpg");
89+
2890
int w = img.Width;
2991
int h = img.Height;
3092
var bmp = new Bitmap(img);
3193
Console.WriteLine($"{w}x{h}");
94+
3295
encoder.Initialize(w, h, 200_000_000, 30, ConfigType.CameraBasic);
3396
Console.WriteLine("Initialised Encoder");
3497

3598
Stopwatch sw = Stopwatch.StartNew();
36-
var data = BitmapToImageData(bmp);
37-
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();
48-
//RgbImage to = new RgbImage(data.Width / 2, data.Height / 2);
49-
//converter.Downscale(data,to,2);
50-
//var bb = RgbToBitmap(to);
51-
//bb.Save("Dowmscaled.bmp");
99+
var data = bmp.ToImageData();
52100

53101
RgbImage rgbb = new RgbImage(w, h);
54-
for (int j = 0; j < 1; j++)
102+
for (int j = 0; j < 1000; j++)
55103
{
56104

57105
if (!encoder.Encode(data, out EncodedData[] ec))
@@ -70,20 +118,14 @@ static void Main(string[] args)
70118
//encoded.GetBytes();
71119
//encoded.CopyTo(buffer,offset);
72120

73-
if (decoder.Decode(encoded, noDelay: true, out DecodingState ds, out YUVImagePointer yv))
121+
122+
if (decoder.Decode(encoded, noDelay: true, out DecodingState ds, ref rgbb))
74123
{
75-
RgbImage rgba = new RgbImage(w, h);
76-
Converter.Yuv2Rgb(yv, rgba, 4);
77-
Bitmap result22 = RgbToBitmap(rgba);
78-
result22.Save("converted2.bmp");
124+
//Console.WriteLine($"F:{encoded.FrameType} size: {encoded.Length}");
125+
//var result = rgbb.ToBitmap();
126+
//result.Save("Ok1.bmp");
127+
79128
}
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-
//}
87129

88130
}
89131
}
@@ -94,25 +136,34 @@ static void Main(string[] args)
94136
decoder.Dispose();
95137
Console.ReadLine();
96138
}
97-
98-
private static Bitmap RgbToBitmap(RGBImagePointer img)
139+
private static void BencmarkConverter()
99140
{
100-
Bitmap bmp = new Bitmap(img.Width,
101-
img.Height,
102-
img.Width * 3,
103-
PixelFormat.Format24bppRgb,
104-
img.ImageBytes);
105-
return bmp;
106-
}
141+
//var img = System.Drawing.Image.FromFile("ocean 3840x2160.jpg");
142+
var img = System.Drawing.Image.FromFile("ocean 1920x1080.jpg");
107143

108-
private static Bitmap RgbToBitmap(RgbImage img)
109-
{
110-
Bitmap bmp = new Bitmap(img.Width,
111-
img.Height,
112-
img.Width * 3,
113-
PixelFormat.Format24bppRgb,
114-
img.ImageBytes);
115-
return bmp;
144+
int w = img.Width;
145+
int h = img.Height;
146+
var bmp = new Bitmap(img);
147+
148+
149+
YuvImage yuvImage = new YuvImage(w, h);
150+
RgbImage rgb = new RgbImage(w, h);
151+
152+
var data = BitmapToImageData(bmp);
153+
154+
Converter.Rgbx2Yuv(data, yuvImage);
155+
Converter.Yuv2Rgb(yuvImage, rgb);
156+
rgb.ToBitmap().Save("converted.bmp");
157+
158+
Stopwatch sw = Stopwatch.StartNew();
159+
for (int i = 0; i < 10000; i++)
160+
{
161+
Converter.Yuv2Rgb(yuvImage, rgb);
162+
163+
Converter.Rgb2Yuv(rgb, yuvImage);
164+
}
165+
Console.WriteLine(sw.ElapsedMilliseconds);
166+
116167
}
117168

118169
/*

Examples/H264SharpNativePInvoke/RawBgr.bin

Lines changed: 49091 additions & 0 deletions
Large diffs are not rendered by default.
-964 KB
Binary file not shown.

0 commit comments

Comments
 (0)