11using H264Sharp ;
2+ using H264SharpBitmapExtentions ;
23using System . Diagnostics ;
34using System . Drawing ;
45using System . Drawing . Imaging ;
6+ using System . Runtime . InteropServices ;
57
68namespace 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 /*
0 commit comments