public SmcErr StartReceiveVideo(string cameraNo)
{
NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log);
logEx.Trace("Enter: IvsVideoMonitor.StartReceiveVideo({0}).", cameraNo);
SmcErr err = new CgwError();
int handle;
logEx.Trace("Call ivsSdkClient.StartRealPlayCBRaw({0}).", cameraNo);
int result = this.ivsSdkClient.StartRealPlayCBRaw(cameraNo, out handle);
//如果不为0,表示预览失败
if (result != CgwConst.IVS_SDK_SUCCESS_TAG)
{
err.SetErrorNo(CgwError.START_RECEIVE_VIDEO_FAILED);
logEx.Error("Start Receive camera video data failed.Camera No:{0}.Ivs sdk error code:{1}", cameraNo, result);
return err;
}
else
{
logEx.Info("Start Receive camera video data success.Camera No:{0},Handle:{1}.", cameraNo, handle);
}
//预览成功,需要停止原来的预览,并将预览句柄添加到缓存
//需要停止的预览句柄
int needToStopHandel = CgwConst.START_RECEIVE_VIDEO_DATA_FAILED;
if (this.handelOperateLock.TryEnterWriteLock(CgwConst.ENTER_LOCK_WAIT_TIME))
{
try
{
//如果预览句柄已经存在,删除掉原来的句柄,用新的句柄替换
if (this.cameraVideoHandeDic.ContainsKey(cameraNo))
{
needToStopHandel = this.cameraVideoHandeDic[cameraNo];
this.videoHandleCameraDic.Remove(needToStopHandel);
this.cameraVideoHandeDic.Remove(cameraNo);
}
this.cameraVideoHandeDic.Add(cameraNo, handle);
MediaDataSender mediaDataSender = new MediaDataSender(cameraNo, this.dataCallBack);
this.videoHandleCameraDic.Add(handle, mediaDataSender);
}
finally
{
this.handelOperateLock.ExitWriteLock();
}
}
//重新预览后,更新了预览句柄,需要将原来的预览停止,放在handelOperateLock外面,防止长时间占用锁
if (needToStopHandel != CgwConst.START_RECEIVE_VIDEO_DATA_FAILED)
{
result = this.ivsSdkClient.StopRealPlay(needToStopHandel);
//如果不为0,表示停止原来的预览失败,只记录日志,不返回错误,不设置错误码
if (result != CgwConst.IVS_SDK_SUCCESS_TAG)
{
logEx.Error("Get a new preview success. But stop old preview failed.CameraNo:{0},Ivs sdk error code:{0}", cameraNo, result);
return err;
}
}
return err;
}