修复 Bug
This commit is contained in:
@@ -419,15 +419,15 @@ public class HikVideoSource : BaseVideoSource,
|
||||
#region --- 解码与帧分发 (Decoding) ---
|
||||
|
||||
// 必须同时加上 SecurityCritical
|
||||
//[HandleProcessCorruptedStateExceptions]
|
||||
//[SecurityCritical]
|
||||
[HandleProcessCorruptedStateExceptions]
|
||||
[SecurityCritical]
|
||||
private void SafeOnDecodingCallBack(int nPort, IntPtr pBuf, int nSize, ref HikPlayMethods.FRAME_INFO pFrameInfo, int nReserved1, int nReserved2)
|
||||
{
|
||||
// 防御性检查,防止传入空指针导致 OpenCV 崩溃(CSE异常)
|
||||
if (pBuf == IntPtr.Zero || nSize <= 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
//Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fff")} 帧抵达.");
|
||||
|
||||
// Optimized: [原因] 增加前置防御性检查,若回调入参异常立即退出,防止后续 OpenCV 封装崩溃
|
||||
if (pBuf == IntPtr.Zero || nSize <= 0
|
||||
|| pFrameInfo.nWidth <= 0 || pFrameInfo.nHeight <= 0) return;
|
||||
|
||||
// [优化] 维持心跳,防止被哨兵误杀
|
||||
MarkFrameReceived(0);
|
||||
@@ -463,8 +463,8 @@ public class HikVideoSource : BaseVideoSource,
|
||||
bool lockTaken = false;
|
||||
try
|
||||
{
|
||||
// 尝试获取锁,超时时间 0ms (拿不到立即返回 false)
|
||||
Monitor.TryEnter(_initLock, 0, ref lockTaken);
|
||||
// 尝试获取锁,超时时间 20ms (拿不到立即返回 false)
|
||||
Monitor.TryEnter(_initLock, 20, ref lockTaken);
|
||||
|
||||
if (lockTaken)
|
||||
{
|
||||
@@ -478,7 +478,7 @@ public class HikVideoSource : BaseVideoSource,
|
||||
}
|
||||
else
|
||||
{
|
||||
// 【关键逻辑】没拿到锁,说明主线程正在操作 (通常是正在 Stop)
|
||||
// 【关键逻辑】如果 20ms 没拿到锁,说明主线程正在操作 (通常是正在 Stop)
|
||||
// 既然都要停止了,这一帧直接丢弃,立即返回,防止死锁
|
||||
return;
|
||||
}
|
||||
@@ -491,16 +491,15 @@ public class HikVideoSource : BaseVideoSource,
|
||||
|
||||
if (_framePool == null) return;
|
||||
|
||||
// 3. 转换与分发
|
||||
SmartFrame smartFrame = _framePool.Get();
|
||||
|
||||
// 【标志位】用于判断所有权是否成功移交
|
||||
bool handoverSuccess = false;
|
||||
// Optimized: [原因] 将 smartFrame 定义在 try 外部,确保 finally 块能够可靠执行 Dispose 归还逻辑
|
||||
SmartFrame? smartFrame = null;
|
||||
|
||||
try
|
||||
{
|
||||
{ // 3. 转换与分发
|
||||
smartFrame = _framePool.Get();
|
||||
if (smartFrame == null) return; // 池满丢帧
|
||||
|
||||
// Optimized: [原因] 使用局部作用域封装 YUV 转换,确保原生指针尽快脱离
|
||||
using (var rawYuvWrapper = Mat.FromPixelData(height + height / 2, width, MatType.CV_8UC1, pBuf))
|
||||
{
|
||||
Cv2.CvtColor(rawYuvWrapper, smartFrame.InternalMat, ColorConversionCodes.YUV2BGR_YV12);
|
||||
@@ -519,9 +518,6 @@ public class HikVideoSource : BaseVideoSource,
|
||||
// decision.TargetAppIds 包含了 "谁需要这一帧" 的信息
|
||||
//GlobalProcessingCenter.Submit(this.Id, smartFrame, decision);
|
||||
GlobalPipelineRouter.Enqueue(Id, smartFrame, decision);
|
||||
|
||||
// 标记成功,禁止 finally 块销毁对象
|
||||
handoverSuccess = true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user