public SmcError.SmcErr StopReceiveVideo(string cameraNo)
{
NLogEx.LoggerEx logEx = new NLogEx.LoggerEx(log);
logEx.Trace("Enter: eLTEVideoMonitor.StopReceiveVideo({0}).", cameraNo);
SmcErr err = new CgwError();
//需要停止的预览句柄
uint needToStopChannel = CgwConst.T28181_ERROR_HANDLE;
if (this.handelOperateLock.TryEnterWriteLock(CgwConst.ENTER_LOCK_WAIT_TIME))
{
try
{
if (this.cameraVideoChannelDic.ContainsKey(cameraNo))
{
needToStopChannel = this.cameraVideoChannelDic[cameraNo];
this.videoChannelDataSenderDic.Remove(needToStopChannel);
this.cameraVideoChannelDic.Remove(cameraNo);
//释放用户数据内存
foreach (KeyValuePair<UInt32, IntPtr> kvp in channelInPtrDic)
{
if (kvp.Key == needToStopChannel)
{
Marshal.FreeHGlobal(kvp.Value);
channelInPtrDic.Remove(kvp.Key);
break;
}
}
//用户参数,4字节整数
IntPtr pUser = Marshal.AllocHGlobal(4);
NetSourcedInterface.IVS_NETSOURCE_SetDataCallBack(needToStopChannel, null, pUser);
//释放NETSOURCE通道资源
IVS_NETSOURCE_RESULT iNet = NetSourcedInterface.IVS_NETSOURCE_CloseNetStream(needToStopChannel);
if (iNet != IVS_NETSOURCE_RESULT.SUCCESS)
{
logEx.Error("IVS_NETSOURCE_CloseNetStream failed channel={0}", needToStopChannel);
err.SetErrorNo(CgwError.STOP_RECEIVE_VIDEO_FAILED);
}
iNet = NetSourcedInterface.IVS_NETSOURCE_FreeChannel(needToStopChannel);
if (iNet != IVS_NETSOURCE_RESULT.SUCCESS)
{
logEx.Error("IVS_NETSOURCE_FreeChannel failed channel={0}", needToStopChannel);
err.SetErrorNo(CgwError.STOP_RECEIVE_VIDEO_FAILED);
}
//关闭rtp回调
rtpAdapter.ESDK_RTP_CloseChannel(needToStopChannel);
}
else
{
logEx.Warn("Stop Receive camera video data failed. Don't need to end the preview.Camera No:{0}.", cameraNo);
//如果预览句柄不存在,不需要处理,直接返回
return err;
}
}
catch (Exception ex)
{
err.SetErrorNo(CgwError.STOP_RECEIVE_VIDEO_FAILED);
logEx.Error("Stop Receive camera video data failed.Execption message:{0}", ex.Message);
return err;
}
finally
{
this.handelOperateLock.ExitWriteLock();
}
}
//调用sdk的停止方法,放在handelOperateLock外面,防止长时间占用锁
if (needToStopChannel != CgwConst.T28181_ERROR_HANDLE)
{
ELTE_RESULT result = (ELTE_RESULT)this.lteSdkClient.StopP2PVideo(Convert.ToInt32(cameraNo));
//如果不为0,表示预览失败
if (result != ELTE_RESULT.RET_SUCCESS)
{
err.SetErrorNo(CgwError.STOP_RECEIVE_VIDEO_FAILED);
logEx.Error("Stop Receive camera video data failed.eLTE sdk error code:{0}", result);
return err;
}
logEx.Info("Stop Receive camera video data success.Camera No:{0},Handle:{1}.", cameraNo, needToStopChannel);
}
return err;
}