using System.Threading.Channels;
namespace SHH.CameraSdk;
///
/// [架构基类] 工业级视频源抽象核心 (V3.3.4 严格匹配版)
/// 核心职责:提供线程安全的生命周期管理、状态分发、配置热更新及资源清理能力。
/// 修复记录:
/// 1. [Bug A] 死锁免疫:所有 await 增加 ConfigureAwait(false),解除对 UI 线程同步上下文的依赖。
/// 2. [Bug π] 管道安全:Dispose 时采用优雅关闭策略,确保最后的状态变更通知能发送出去。
/// 3. [编译修复] 补全了 CloneConfig 中对于 Transport 和 VendorArguments 的属性复制。
///
public abstract class BaseVideoSource : IVideoSource, IAsyncDisposable
{
#region --- 核心配置与锁机制 (Core Config & Locks) ---
// [Fix Bug δ] 核心配置对象
// 去除 readonly 修饰符以支持热更新 (Hot Update),允许在运行时替换配置实例
protected VideoSourceConfig _config;
///
/// 状态同步锁
/// 作用:保护 _status 字段的读写原子性,防止多线程竞争导致的状态读取不一致
///
private readonly object _stateSyncRoot = new();
///
/// 生命周期互斥锁
/// 作用:确保 StartAsync/StopAsync/UpdateConfig 等操作串行执行,防止重入导致的状态机混乱
///
private readonly SemaphoreSlim _lifecycleLock = new(1, 1);
#endregion
#region --- 内部状态与基础设施 (Internal States & Infrastructure) ---
// 内部状态标志位
private volatile bool _isOnline;
private VideoSourceStatus _status = VideoSourceStatus.Disconnected;
///
/// 状态通知队列 (有界)
/// 特性:采用 DropOldest 策略,当消费者处理不过来时丢弃旧状态,防止背压导致内存溢出 [Fix Bug β]
///
private readonly Channel _statusQueue;
// 状态分发器的取消令牌源
private CancellationTokenSource? _distributorCts;
// [新增修复 Bug π] 分发任务引用
// 作用:用于在 DisposeAsync 时执行 Task.WhenAny 等待,确保剩余消息被消费
private Task? _distributorTask;
// [Fix Bug V] 单调时钟
// 作用:记录最后一次收到帧的系统 Tick,用于心跳检测,不受系统时间修改影响
private long _lastFrameTick = 0;
/// 获取最后帧的时间戳 (线程安全读取)
public long LastFrameTick => Interlocked.Read(ref _lastFrameTick);
/// 视频帧回调事件 (热路径)
public event Action