Compare commits
2 Commits
| Author | SHA1 | Date |
|---|---|---|
|
|
7b4ef9b06e | 3 years ago |
|
|
6b7e45ad4a | 3 years ago |
2 changed files with 618 additions and 0 deletions
@ -0,0 +1,569 @@
@@ -0,0 +1,569 @@
|
||||
using System; |
||||
using System.Collections.Generic; |
||||
using System.Net.Sockets; |
||||
using System.Net; |
||||
using System.Text; |
||||
using System.Threading; |
||||
using nRTP; |
||||
using System.Windows.Forms; |
||||
using System.Diagnostics; |
||||
using System.Drawing; |
||||
using System.Drawing.Imaging; |
||||
using System.IO; |
||||
using System.Reflection; |
||||
using UTIL; |
||||
|
||||
namespace UDPLIB |
||||
{ |
||||
public class UDPreceive |
||||
{ |
||||
Int32 localPort = 5004; |
||||
Int32 remotePort = 5006; |
||||
Thread UDPreceiveThread = null; |
||||
// Thread processFrameThread = null; |
||||
Thread sendFrameThread = null; |
||||
// Thread processDataFrameThread = null; |
||||
Stopwatch fpstimer; |
||||
private volatile bool listening = false; |
||||
UInt16 iwidth = 0; |
||||
UInt16 iheight = 0; |
||||
List<Byte[]> udata50 = new List<byte[]>(); |
||||
List<Byte[]> udata51 = new List<byte[]>(); |
||||
UInt32 cnt_frames = 0; |
||||
|
||||
#region Прием данных |
||||
public UDPreceive(Int32 localPortUDP) |
||||
{ |
||||
localPort = localPortUDP; |
||||
for (int i = 0; i < 2500; i++) |
||||
{ |
||||
udata50.Add(new Byte[0]); |
||||
udata51.Add(new Byte[0]); |
||||
} |
||||
fpstimer = new Stopwatch(); |
||||
|
||||
UDPreceiveThread = new Thread(new ThreadStart(UDPReceive7)); |
||||
listening = true; |
||||
UDPreceiveThread.Start(); |
||||
cnt_frames = 0; |
||||
} |
||||
public void Stop() |
||||
{ |
||||
listening = false; |
||||
cnt_frames = 0; |
||||
} |
||||
public Boolean IsAlive |
||||
{ |
||||
get |
||||
{ |
||||
if (UDPreceiveThread == null || !UDPreceiveThread.IsAlive) |
||||
return false; |
||||
else |
||||
return true; |
||||
} |
||||
} |
||||
void UDPReceive7() |
||||
{ |
||||
UdpClient receiver = null; |
||||
IPEndPoint endPoint = null; |
||||
EndPoint remoteIp = null; |
||||
DialogResult res = DialogResult.OK; |
||||
try |
||||
{ |
||||
receiver = new UdpClient(localPort); |
||||
endPoint = new IPEndPoint(IPAddress.Any, localPort); |
||||
remoteIp = new IPEndPoint(IPAddress.Any, 0); |
||||
} |
||||
catch (Exception ee) |
||||
{ |
||||
res = MessageBox.Show("Порт " + localPort.ToString() + " используется како-то программой. \r\n" + |
||||
"Прием видео невозможен. Перезапустите программу.", "Ошибка!!!", MessageBoxButtons.OK, MessageBoxIcon.Error); |
||||
System.Diagnostics.Process.GetCurrentProcess().Kill(); |
||||
return; |
||||
} |
||||
|
||||
Int32 numrow = 0; |
||||
Int32 numlist = 0; |
||||
Int32 prevnumrow = 0; |
||||
Byte[] imgarr = new Byte[1]; |
||||
Byte[] blackline = null; |
||||
fpstimer.Start(); |
||||
|
||||
while (listening) |
||||
{ |
||||
try |
||||
{ |
||||
UInt32 packetsize = 0; |
||||
UInt32 ssrc = 0; |
||||
if (receiver.Available == 0) |
||||
continue; |
||||
byte[] data = receiver.Receive(ref endPoint); |
||||
numrow = BitConverter.ToUInt16(data, 16); |
||||
packetsize = (UInt32)data.Length; |
||||
ssrc = BitConverter.ToUInt32(data, 8); |
||||
prevnumrow = numrow; |
||||
if (ssrc == 12345678) |
||||
{ |
||||
switch (numlist) |
||||
{ |
||||
case 0: |
||||
udata50[numrow] = data; |
||||
break; |
||||
case 1: |
||||
udata51[numrow] = data; |
||||
break; |
||||
} |
||||
} |
||||
if (numrow == 0 && ssrc == 12345678) // Packet 0 |
||||
{ |
||||
iwidth = BitConverter.ToUInt16(data, 20); |
||||
iheight = BitConverter.ToUInt16(data, 22); |
||||
|
||||
blackline = new Byte[iwidth * 3 + 20]; |
||||
|
||||
Res.Iwidth = iwidth; |
||||
Res.Iheight = iheight; |
||||
Res.AzUpr = BitConverter.ToSingle(data, 24); |
||||
Res.ElUpr = BitConverter.ToSingle(data, 28); |
||||
Res.Course = BitConverter.ToInt16(data, 32); |
||||
Res.Roll = BitConverter.ToInt16(data, 34); |
||||
Res.Pitch = BitConverter.ToInt16(data, 36); |
||||
} |
||||
|
||||
if (data[1] == 0xC7 && iheight != 0 && iwidth != 0) |
||||
{ |
||||
switch (numlist) |
||||
{ |
||||
case 0: |
||||
{ |
||||
Thread sendFrame0 = new Thread(new ParameterizedThreadStart(processFrame7)); |
||||
sendFrame0.Start(new thrdata(0, iwidth, iheight)); |
||||
sendFrame0.IsBackground = true; |
||||
} |
||||
numlist = 1; |
||||
break; |
||||
case 1: |
||||
{ |
||||
Thread sendFrame1 = new Thread(new ParameterizedThreadStart(processFrame7)); |
||||
sendFrame1.Start(new thrdata(1, iwidth, iheight)); |
||||
sendFrame1.IsBackground = true; |
||||
} |
||||
numlist = 0; |
||||
break; |
||||
} |
||||
} |
||||
} |
||||
catch (Exception) |
||||
{ |
||||
using (StreamWriter sw = new StreamWriter(System.IO.File.OpenWrite("grav01.log"))) |
||||
{ |
||||
sw.WriteLine(DateTime.Now.ToString("HH:mm:ss:fff ") + "Error dll recv"); |
||||
} |
||||
} |
||||
} |
||||
receiver.Close(); |
||||
} |
||||
void processFrame7(object obj) |
||||
{ |
||||
try |
||||
{ |
||||
thrdata arr = obj as thrdata; |
||||
List<Byte[]> udata = new List<byte[]>(); |
||||
ushort prevnumrow = 0, numrow = 0; |
||||
UInt32 cnt_frame = 0; |
||||
int iwi = 0; |
||||
int ihe = 0; |
||||
switch (arr.arr) |
||||
{ |
||||
case 0: |
||||
udata.AddRange(udata50); |
||||
break; |
||||
case 1: |
||||
udata.AddRange(udata51); |
||||
break; |
||||
} |
||||
iwi = BitConverter.ToUInt16(udata[0], 20); |
||||
ihe = BitConverter.ToUInt16(udata[0], 22); |
||||
|
||||
Bitmap img = new Bitmap(iwi, ihe, System.Drawing.Imaging.PixelFormat.Format24bppRgb); |
||||
Rectangle rect = new Rectangle(0, 0, iwi, ihe); |
||||
|
||||
unsafe |
||||
{ |
||||
BitmapData bmpData = img.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, img.PixelFormat); |
||||
byte* curpos = ((Byte*)bmpData.Scan0); |
||||
|
||||
prevnumrow = numrow; |
||||
cnt_frame++; |
||||
int dd = 0; |
||||
int ff = 0; |
||||
try |
||||
{ |
||||
for (int h = 1; h < ihe + 1; h++) |
||||
{ |
||||
dd = h; |
||||
for (int w = 20; w < iwi * 3 + 20; w += 3) |
||||
{ |
||||
ff = w; |
||||
if (udata[h].Length < (iwi * 3 + 20)) |
||||
{ |
||||
curpos += 3; |
||||
break; |
||||
} |
||||
*(curpos++) = udata[h][w + 2]; |
||||
*(curpos++) = udata[h][w + 1]; |
||||
*(curpos++) = udata[h][w + 0]; |
||||
} |
||||
} |
||||
} |
||||
catch (Exception ee) |
||||
{ |
||||
Console.WriteLine($"!!! {ee.Message} {dd} {ff} {udata[dd].Length}"); |
||||
return; |
||||
} |
||||
udata.Clear(); |
||||
img.UnlockBits(bmpData); |
||||
} |
||||
Res.Clearimg = (Bitmap)img.Clone(); |
||||
Res.Bmp = img; |
||||
|
||||
fpstimer.Stop(); |
||||
// Res.Fps = gk.filtered(1000F / fpstimer.ElapsedMilliseconds); |
||||
Res.Fps = 1000F / fpstimer.ElapsedMilliseconds; |
||||
Res.Frames = cnt_frames++; |
||||
// Res.Fps = 1000F / fpstimer.ElapsedMilliseconds; |
||||
fpstimer.Reset(); |
||||
fpstimer.Start(); |
||||
CallBack.Event_newimg_Handler(); |
||||
} |
||||
catch (Exception) |
||||
{ |
||||
using (StreamWriter sw = new StreamWriter(System.IO.File.OpenWrite("udplib.log"))) |
||||
{ |
||||
sw.WriteLine(DateTime.Now.ToString("HH:mm:ss:fff ") + "Error lib process"); |
||||
} |
||||
} |
||||
} |
||||
#endregion |
||||
} |
||||
|
||||
public class UDPTransmit |
||||
{ |
||||
UdpClient transmitter = null; |
||||
IPEndPoint endPoint = null; |
||||
Point pnt; |
||||
|
||||
public UDPTransmit(String IPaddr, Int32 remotePortUDP, Point p) |
||||
{ |
||||
transmitter = new UdpClient(); |
||||
endPoint = new IPEndPoint(IPAddress.Parse(IPaddr), remotePortUDP); |
||||
pnt = p; |
||||
pnt.X = Util.minmax((ushort)64, (ushort)576, (ushort)pnt.X); |
||||
pnt.Y = Util.minmax((ushort)64, (ushort)416, (ushort)pnt.Y); |
||||
|
||||
Bitmap crop = Res.Clearimg.Clone(new Rectangle(pnt.X - 64, pnt.Y - 64, 128, 128), PixelFormat.Format24bppRgb); |
||||
Res.Crop = crop; |
||||
Thread UDPtransmitThread = new Thread(new ThreadStart(UDPtransmitFrame)); |
||||
UDPtransmitThread.Start(); |
||||
} |
||||
public UDPTransmit(String IPaddr, Int32 remotePortUDP, Bitmap crop) |
||||
{ |
||||
transmitter = new UdpClient(); |
||||
endPoint = new IPEndPoint(IPAddress.Parse(IPaddr), remotePortUDP); |
||||
Res.Crop = crop; |
||||
Thread UDPtransmitThread = new Thread(new ThreadStart(UDPtransmitFrame)); |
||||
UDPtransmitThread.Start(); |
||||
} |
||||
|
||||
void UDPtransmitFrame() |
||||
{ |
||||
transmitter.Connect(endPoint); |
||||
|
||||
//using (Graphics g = Graphics.FromImage(Res.Bmp)) |
||||
//{ |
||||
// g.Clear(); |
||||
//}; |
||||
|
||||
// RTPMsgHeader |
||||
RTP.MH_VerPXCC = 2; |
||||
RTP.MH_MPT = 0xC6; |
||||
RTP.SeqCounter = 0; //! |
||||
RTP.MH_Timestamp = (uint)DateTimeOffset.Now.ToUnixTimeSeconds(); //! |
||||
RTP.MH_PT = 99; |
||||
RTP.MH_M = 0; |
||||
RTP.MH_SSRC = 12345678; |
||||
RTP.MH_DataLen = 36; |
||||
RTP.MH_RowNumber = 0; |
||||
RTP.MH_Offset = 0; |
||||
|
||||
// RTPVideoSupplementalData |
||||
RTP.SD_Width = (ushort)Res.Crop.Width; |
||||
RTP.SD_Height = (ushort)Res.Crop.Height; |
||||
RTP.SD_AzUpr = 0; |
||||
RTP.SD_ElUpr = 0; |
||||
RTP.SD_Course = 0; |
||||
RTP.SD_Roll = 0; |
||||
RTP.SD_Pitch = 0; |
||||
RTP.SD_FrameId = 0; |
||||
|
||||
// RTPVideoSupplementalDataExtra |
||||
RTP.DE_TLV_X = 0; |
||||
RTP.DE_TLV_Y = 0; |
||||
RTP.DE_TLV_dX = 0; |
||||
RTP.DE_TLV_dY = 0; |
||||
|
||||
RTP.MakeDataH0(); |
||||
transmitter.Send(RTP.DataH0, RTP.DataH0.Length); |
||||
|
||||
Byte[] dataudp = new Byte[20 + RTP.SD_Width * 3]; |
||||
|
||||
Byte[] dataimg = new Byte[RTP.SD_Width * 3]; |
||||
for (int i = 0; i < RTP.SD_Height; i++) |
||||
{ |
||||
// RTPMsgHeader |
||||
RTP.MH_VerPXCC = 2; |
||||
if (i == RTP.SD_Height - 1) |
||||
{ |
||||
RTP.MH_PT = 99; |
||||
RTP.MH_M = 1; |
||||
} |
||||
else |
||||
{ |
||||
RTP.MH_PT = 99; |
||||
RTP.MH_M = 0; |
||||
} |
||||
++RTP.SeqCounter; |
||||
RTP.MH_RowNumber = (ushort)(i + 1); |
||||
RTP.MH_DataLen = (ushort)(RTP.SD_Width * 3); |
||||
RTP.MakeDataH1(); |
||||
uint ccc = 0; |
||||
try |
||||
{ |
||||
for (int j = 0; j < RTP.SD_Width; j++) |
||||
{ |
||||
Color c = Res.Crop.GetPixel(j, i); |
||||
dataimg[ccc++] = c.B; |
||||
dataimg[ccc++] = c.G; |
||||
dataimg[ccc++] = c.R; |
||||
} |
||||
} |
||||
catch (Exception ee) |
||||
{ |
||||
Console.WriteLine(ee.Message); |
||||
Console.WriteLine("Error 4 getpixel"); |
||||
return; |
||||
} |
||||
Array.Copy(RTP.DataH1, dataudp, RTP.DataH1.Length); |
||||
Array.Copy(dataimg, 0, dataudp, RTP.DataH1.Length, dataimg.Length); |
||||
transmitter.Send(dataudp, dataudp.Length); |
||||
} |
||||
transmitter.Close(); |
||||
CallBack.Event_crop_transmitted_Handler(); |
||||
} |
||||
} |
||||
|
||||
|
||||
public class UDPTransmitSim |
||||
{ |
||||
UdpClient transmitter = null; |
||||
IPEndPoint endPoint = null; |
||||
Point pnt; |
||||
Int32 sizeX = 0; |
||||
Int32 sizeY = 0; |
||||
Int32 delayMS = 0; |
||||
public Bitmap img = null; // Resources.che1; |
||||
volatile Boolean flag = false; |
||||
|
||||
public UDPTransmitSim(String IPaddr, Int32 remotePortUDP, Int32 sizeX, Int32 sizeY, Int32 delayMS) |
||||
{ |
||||
transmitter = new UdpClient(); |
||||
endPoint = new IPEndPoint(IPAddress.Parse(IPaddr), remotePortUDP); |
||||
this.sizeX = sizeX; |
||||
this.sizeY = sizeY; |
||||
this.delayMS = delayMS; |
||||
|
||||
img = new Bitmap(Res.Sim, new Size(sizeX, sizeY)); |
||||
|
||||
Thread UDPtransmitThread = new Thread(new ThreadStart(UDPtransmitFrame)); |
||||
UDPtransmitThread.Start(); |
||||
} |
||||
public UDPTransmitSim(String IPaddr, Int32 remotePortUDP, Int32 delayMS, Bitmap i) |
||||
{ |
||||
transmitter = new UdpClient(); |
||||
endPoint = new IPEndPoint(IPAddress.Parse(IPaddr), remotePortUDP); |
||||
sizeX = i.Width; |
||||
sizeY = i.Height; |
||||
this.delayMS = delayMS; |
||||
|
||||
img = i; |
||||
|
||||
Thread UDPtransmitThread = new Thread(new ThreadStart(UDPtransmitFrame)); |
||||
UDPtransmitThread.Start(); |
||||
} |
||||
public void Start() |
||||
{ |
||||
flag = true; |
||||
} |
||||
public void Stop() |
||||
{ |
||||
flag &= false; |
||||
} |
||||
void UDPtransmitFrame() |
||||
{ |
||||
while (flag) |
||||
{ |
||||
transmitter.Connect(endPoint); |
||||
// RTPMsgHeader |
||||
RTP.MH_VerPXCC = 2; |
||||
RTP.MH_MPT = 0xC6; |
||||
RTP.SeqCounter = 0; //! |
||||
RTP.MH_Timestamp = (uint)DateTimeOffset.Now.ToUnixTimeSeconds(); //! |
||||
RTP.MH_PT = 99; |
||||
RTP.MH_M = 0; |
||||
RTP.MH_SSRC = 12345678; |
||||
RTP.MH_DataLen = 36; |
||||
RTP.MH_RowNumber = 0; |
||||
RTP.MH_Offset = 0; |
||||
|
||||
// RTPVideoSupplementalData |
||||
RTP.SD_Width = (UInt16)sizeX; |
||||
RTP.SD_Height = (UInt16)sizeY; |
||||
RTP.SD_AzUpr = 0; |
||||
RTP.SD_ElUpr = 0; |
||||
RTP.SD_Course = 0; |
||||
RTP.SD_Roll = 0; |
||||
RTP.SD_Pitch = 0; |
||||
RTP.SD_FrameId = 0; |
||||
|
||||
// RTPVideoSupplementalDataExtra |
||||
RTP.DE_TLV_X = 0; |
||||
RTP.DE_TLV_Y = 0; |
||||
RTP.DE_TLV_dX = 0; |
||||
RTP.DE_TLV_dY = 0; |
||||
|
||||
RTP.MakeDataH0(); |
||||
transmitter.Send(RTP.DataH0, RTP.DataH0.Length); |
||||
|
||||
Byte[] dataudp = new Byte[20 + RTP.SD_Width * 3]; |
||||
|
||||
Byte[] dataimg = new Byte[RTP.SD_Width * 3]; |
||||
for (int i = 0; i < sizeY; i++) |
||||
{ |
||||
// RTPMsgHeader |
||||
RTP.MH_VerPXCC = 2; |
||||
if (i == (sizeY - 1)) |
||||
{ |
||||
RTP.MH_PT = 99; |
||||
RTP.MH_M = 1; |
||||
} |
||||
else |
||||
{ |
||||
RTP.MH_PT = 99; |
||||
RTP.MH_M = 0; |
||||
} |
||||
++RTP.SeqCounter; |
||||
RTP.MH_RowNumber = (ushort)(i + 1); |
||||
RTP.MH_DataLen = (ushort)(RTP.SD_Width * 3); |
||||
RTP.MakeDataH1(); |
||||
uint ccc = 0; |
||||
try |
||||
{ |
||||
for (int j = 0; j < sizeX; j++) |
||||
{ |
||||
Color c = img.GetPixel(j, i); |
||||
dataimg[ccc++] = c.B; |
||||
dataimg[ccc++] = c.G; |
||||
dataimg[ccc++] = c.R; |
||||
} |
||||
} |
||||
catch (Exception ee) |
||||
{ |
||||
Console.WriteLine(ee.Message); |
||||
Console.WriteLine("Error 4 getpixel"); |
||||
return; |
||||
} |
||||
Array.Copy(RTP.DataH1, dataudp, RTP.DataH1.Length); |
||||
Array.Copy(dataimg, 0, dataudp, RTP.DataH1.Length, dataimg.Length); |
||||
transmitter.Send(dataudp, dataudp.Length); |
||||
} |
||||
transmitter.Close(); |
||||
Thread.Sleep(delayMS); |
||||
} |
||||
} |
||||
} |
||||
|
||||
class thrdata |
||||
{ |
||||
public uint arr; |
||||
public uint iw; |
||||
public uint ih; |
||||
public thrdata(uint a, uint w, uint h) |
||||
{ |
||||
arr = a; |
||||
iw = w; |
||||
ih = h; |
||||
} |
||||
} |
||||
public static class Res |
||||
{ |
||||
public static Bitmap Bmp { set; get; } |
||||
public static Bitmap Sim { set; get; } |
||||
public static Bitmap Crop { set; get; } |
||||
public static Bitmap Clearimg { set; get; } |
||||
public static UInt16 Iwidth { set; get; } |
||||
public static UInt16 Iheight { set; get; } |
||||
public static UInt32 Frames { set; get; } |
||||
public static float Fps { set; get; } |
||||
public static float AzUpr { set; get; } |
||||
public static float ElUpr { set; get; } |
||||
public static Int16 Course { set; get; } |
||||
public static Int16 Roll { set; get; } |
||||
public static Int16 Pitch { set; get; } |
||||
public static String Version |
||||
{ |
||||
get |
||||
{ |
||||
return "1.0.3.114"; |
||||
// return Assembly.GetExecutingAssembly().GetName().Version.ToString(); |
||||
} |
||||
} |
||||
public static String Configuration |
||||
{ |
||||
get |
||||
{ |
||||
#if DEBUG |
||||
return "Debug"; |
||||
#else |
||||
return "Release"; |
||||
#endif |
||||
} |
||||
} |
||||
public static Boolean status_rs { set; get; } |
||||
public static Boolean status_eth { set; get; } |
||||
} |
||||
public static class CallBack |
||||
{ |
||||
public delegate void Event_newimg(); |
||||
public static Event_newimg Event_newimg_Handler; |
||||
|
||||
public delegate void Event_crop_transmitted(); |
||||
public static Event_crop_transmitted Event_crop_transmitted_Handler; |
||||
|
||||
|
||||
//public delegate void callbackEvent_bmp(Bitmap bmp); |
||||
//public delegate void callbackEvent_newimage(); |
||||
//public delegate void callbackEvent_newpacket(); |
||||
//public delegate void callbackEvent_str(String str); |
||||
//public delegate void callback_BVM2OES(); |
||||
//public delegate void callback_etalon(Point pnt); |
||||
//public static callbackEvent_bmp callbackEventHandler_bmp; |
||||
//public static callbackEvent_newimage callbackEventHandler_newimage; |
||||
//public static callbackEvent_newpacket callbackEventHandler_newpacket; |
||||
//public static callbackEvent_str callbackEventHandler_str; |
||||
//public static callback_BVM2OES callback_BVM2OESHandler; |
||||
//public static callback_etalon callback_etalonHandler; |
||||
//public static Bitmap img { get; set; } |
||||
|
||||
|
||||
} |
||||
} |
||||
Loading…
Reference in new issue