private void AddFrameTask(Action <int> cb, int interval, int count) { int id = GetUniqueId(); FrameTask task = new FrameTask(id, cb, frameCounter + interval, interval, count); tmpFrameTaskList.Add(task); }
/// <summary> /// 替换任务 /// </summary> public bool ReplaceFrameTask(int tid, Action <int> callback, int delay, int count = 1) { FrameTask newTask = new FrameTask(tid, callback, frameCounter + delay, delay, count); bool isRep = false; // 是否替换成功 // 尝试在任务列表里寻找替换 for (int i = 0; i < taskFrameLst.Count; i++) { if (taskFrameLst[i].tid == tid) { taskFrameLst[i] = newTask; isRep = true; break; } } // 任务列表里没有,尝试去缓存找 if (!isRep) { for (int i = 0; i < tmpFrameLst.Count; i++) { if (tmpFrameLst[i].tid == tid) { tmpFrameLst[i] = newTask; isRep = true; break; } } } return(isRep); }
//替换定帧任务 public bool ReplaceFrameTask(int tID, Action callBack, int delay, int count = 1) { bool find = false; FrameTask timeTask = new FrameTask(callBack, curFrame + delay, count, delay, tID); //替换 for (int i = 0; i < frameTaskList.Count; i++) { if (tID == frameTaskList[i].tID) { frameTaskList[i] = timeTask; find = true; break; } } for (int i = 0; i < tempFrameTaskList.Count; i++) { if (tID == tempFrameTaskList[i].tID) { tempFrameTaskList[i] = timeTask; find = true; break; } } return(find); }
public void TaskComplete(FrameTask task, int writePostion) { if (task.IsKeyFrame) { hasKeyFrame[writePostion] = true; if (keyFrame[writePostion] == null || keyFrame[writePostion].Length != task.Height * task.Stride) { keyFrame[writePostion] = new byte[task.Height * task.Stride]; } Buffer.BlockCopy(videostorage[writePostion], VIDEOHEADERSIZE - sizeof(int), keyFrame[writePostion], 0, task.Height * task.Stride); //= task.getUnencryptedFrame(); lock (waitingOnKeyframe) { while (waitingOnKeyframe.Count > 0) { waitingOnKeyframe.Pop().StartBackground(keyFrame[writePostion]); } } } lock (taskPool) { taskPool.Push(task); } completeQueue[writePostion]++; taskQueue[writePostion]--; //MyLog.Default.WriteLine($"Task complete {writePostion} {taskQueue[writePostion]} {completeQueue[writePostion]} {maxframes[writePostion]}"); if (completeQueue[writePostion] == maxframes[writePostion]) { decodevideosize++; } }
/// <summary> 检测帧任务 </summary> private void CheckFrameTask() { if (tmpFrameList.Count > 0) { lock (lockFrame) { //获取缓存区的帧任务到计时列表 for (int i = 0; i < tmpFrameList.Count; i++) { taskFrameList.Add(tmpFrameList[i]); } tmpFrameList.Clear(); } } currentFrame += 1;//按每秒60帧(可运行400多天达到int最大值) //遍历检测任务是否达到条件 for (int i = 0; i < taskFrameList.Count; i++) { FrameTask frameTask = taskFrameList[i]; if (currentFrame < frameTask.endFrame) { continue; } else { try { if (taskHandle != null) { taskHandle(frameTask.action, frameTask.id); } else { frameTask.action?.Invoke();//Action不为空进行调用 } } catch (Exception e) { Debug.Log(e.ToString()); } if (frameTask.count == 1) { taskFrameList.RemoveAt(i); //移除完成的任务 i--; //当前索引-1 tmpIdList.Add(frameTask.id); } else { if (frameTask.count != 0) { frameTask.count -= 1; } frameTask.endFrame += frameTask.delayFrame;//设置下一次任务的结束帧 } } } }
//添加定帧任务 public int AddFrameTask(Action callBack, int delay, int count = 1) { int tID = GetTID(); FrameTask frameTask = new FrameTask(callBack, curFrame + delay, count, delay, tID); tempFrameTaskList.Add(frameTask); tIDList.Add(tID); return(tID); }
public int AddFrameTask(Action cb, int interval, int count = 1) { int id = GetUniqueId(); FrameTask task = new FrameTask(id, cb, frameCounter + interval, interval, count); tmpFrameTaskList.Add(task); uniqueIdList.Add(id); return(id); }
public ProjectConfigVODB() { queueLoader = new QueueLoader(); queueLoader.addEventListener(EventX.PROGRESS, progressHandle); queueLoader.addEventListener(EventX.COMPLETE, completeHandle); frameTask = new FrameTask <MemoryStream>(); frameTask.addEventListener(EventX.COMPLETE, parserCompleteHandle); frameTask.addEventListener(EventX.PROGRESS, progressHandle); dbs = new List <IConfigVODB>(); }
//检测定帧任务 public void CheckFrameTask() { curFrame++; //将缓存区的定时器加入列表 for (int i = 0; i < tempFrameTaskList.Count; i++) { frameTaskList.Add(tempFrameTaskList[i]); } tempFrameTaskList.Clear(); for (int i = 0; i < frameTaskList.Count; i++) { FrameTask ft = frameTaskList[i]; if (curFrame < ft.deskFrame) { continue; } Action callBack = frameTaskList[i].callBack; try { if (callBack != null) { callBack(); } } catch (Exception e) { LogInfo(e.ToString()); }; if (ft.count == 1) { recycleIDList.Add(frameTaskList[i].tID); frameTaskList.RemoveAt(i); i--; } else { if (ft.count != 0) { ft.count--; } ft.deskFrame += ft.delay; } } if (recycleIDList.Count > 0) { RecycleTIDList(); } }
/// <summary> /// 重写一个已有的帧定时任务 /// </summary> /// <param name="tID">任务id</param> /// <param name="delayTime">间隔多少帧</param> /// <param name="action">回调函数</param> /// <param name="num">执行次数</param> /// <returns>是否重写成功</returns> public bool RepFrameTimerTask(int tID, int delayTime, Action action, int num = 1) { bool isSucced = false; for (int i = 0; i < frameTasks.Count; i++) { FrameTask timerTask = new FrameTask { bestTime = frame + delayTime, callback = action, currNum = num, delayTime = delayTime }; timerTask.tID = GetTID(); frameTasks[i] = timerTask; isSucced = true; } return(isSucced); }
/// <summary> /// 添加一个帧定时任务 /// </summary> /// <param name="delayTime">间隔多少帧</param> /// <param name="action">回调函数</param> /// <param name="num">执行次数</param> /// <returns>返回任务id</returns> public int AddFrameTask(int delayTime, Action action, int num = 1) { int id = GetTID(); FrameTask frameTask = new FrameTask { bestTime = frame + delayTime, callback = action, currNum = num, delayTime = delayTime }; frameTask.tID = id; frameTasks.Add(frameTask); tIDs.Add(id); return(frameTask.tID); }
private void TimeFrameTask() { frameCounter++; for (int i = 0; i < tmpFrameTaskList.Count; i++) { frameTaskList.Add(tmpFrameTaskList[i]); } tmpFrameTaskList.Clear(); for (int i = 0; i < frameTaskList.Count; i++) { FrameTask task = frameTaskList[i]; if (task.count == 0 || task.count < -1) { RemoveUniqueId(task.taskId); frameTaskList.RemoveAt(i); i -= 1; continue; } if (frameCounter >= task.destFrame) { if (task.count != -1) { task.count -= 1; if (task.count == 0) { RemoveUniqueId(task.taskId); frameTaskList.RemoveAt(i); i -= 1; } else { task.destFrame = frameCounter + task.intervalFrame; } } else { task.destFrame = frameCounter + task.intervalFrame; } } else { continue; } } }
private void DelFrameTask() { if (tmpDelFrameLst.Count > 0) { lock (lockFrame) { for (int i = 0; i < tmpDelFrameLst.Count; i++) { bool isDel = false; int delTid = tmpDelFrameLst[i]; for (int j = 0; j < taskFrameLst.Count; j++) { FrameTask task = taskFrameLst[j]; if (task.tid == delTid) { isDel = true; taskFrameLst.RemoveAt(j); recTidLst.Add(delTid); break; } } if (isDel) { continue; } for (int j = 0; j < tmpFrameLst.Count; j++) { FrameTask task = tmpFrameLst[j]; if (task.tid == delTid) { tmpFrameLst.RemoveAt(j); recTidLst.Add(delTid); break; } } } } } }
public bool ReplaceFrameTask(int id, Action <int> cb, int interval, int count = 1) { bool ret = false; FrameTask task = null; for (int i = 0; i < frameTaskList.Count; i++) { if (id == frameTaskList[i].Id) { ret = true; task = frameTaskList[i]; break; } } if (!ret) { for (int i = 0; i < tmpFrameTaskList.Count; i++) { if (id == tmpFrameTaskList[i].Id) { task = tmpFrameTaskList[i]; ret = true; break; } } } if (ret && task != null) { lock (lock_frameTaskList) { task.Cb = cb; task.destFrame = frameCounter + interval; task.intervalFrame = interval; task.count = count; } } return(ret); }
public bool ReplaceFrameTask(int id, Action cb, int interval, int count = 1) { bool canfindTask = false; FrameTask task = null; for (int i = 0; i < frameTaskList.Count; i++) { if (id == frameTaskList[i].taskId) { task = frameTaskList[i]; canfindTask = true; break; } } if (!canfindTask) { for (int i = 0; i < tmpFrameTaskList.Count; i++) { if (id == tmpFrameTaskList[i].taskId) { task = tmpFrameTaskList[i]; canfindTask = true; break; } } } if (canfindTask && task != null) { task.taskCb = cb; task.destFrame = frameCounter + interval; task.intervalFrame = interval; task.count = count; } return(canfindTask); }
/// <summary> /// 替换帧任务 /// </summary> /// <param name="id">所替换的id</param> /// <returns></returns> public bool ReplaceFrameTask(int id, Action action, int delayFrame, int count = 1) { FrameTask frameTask = new FrameTask() { id = id, endFrame = currentFrame + delayFrame, action = action, delayFrame = delayFrame, count = count, }; bool isSuccess = false; for (int i = 0; i < taskFrameList.Count; i++) { if (taskFrameList[i].id == id) { //找到任务 进行替换 taskFrameList[i] = frameTask; isSuccess = true; break; } } if (!isSuccess) { for (int i = 0; i < tmpFrameList.Count; i++) { if (tmpFrameList[i].id == id) { tmpFrameList[i] = frameTask; isSuccess = true; break; } } } return(isSuccess); }
/// <summary> /// 检测帧定时任务 /// </summary> private void CheckFrameTask() { if (tmpFrameLst.Count > 0) { lock (lockFrame) { for (int tmpIndex = 0; tmpIndex < tmpFrameLst.Count; tmpIndex++) { taskFrameLst.Add(tmpFrameLst[tmpIndex]); } // 清空临时缓存 tmpFrameLst.Clear(); } } // 将缓存区中的定时任务加入任务列表 // 计时,帧 +1 frameCounter += 1; // 遍历检测任务是否达到时间条件 for (int index = 0; index < taskFrameLst.Count; index++) { FrameTask task = taskFrameLst[index]; // 目标帧没到 if (frameCounter < task.destFrame) { continue; } // 已到目标帧,执行任务后移除 else { Action <int> cb = task.callback; try { if (taskHandle != null) { taskHandle(cb, task.tid); } else { if (cb != null) { cb(task.tid); } } } catch (Exception e) { LogInfo(e.ToString()); } // 移除已完成的任务 if (task.count == 1) { taskFrameLst.RemoveAt(index); index--; recTidLst.Add(task.tid); // 需要回收 } else { if (task.count != 0) // 不是循环执行 { task.count -= 1; } task.destFrame += task.delay; // 重新设置目标帧(下一次执行任务的时间) } } } }
private void TickFrameTask() { if (tmpFrameTaskList.Count > 0) { lock (lock_frameTaskList) { for (int i = 0; i < tmpFrameTaskList.Count; i++) { frameTaskList.Add(tmpFrameTaskList[i]); } tmpFrameTaskList.Clear(); } } if (frameTaskList.Count > 0) { for (int i = 0; i < frameTaskList.Count; i++) { FrameTask task = frameTaskList[i]; if (task.count == 0 || task.count < -1) { frameTaskList.RemoveAt(i); i -= 1; delIdList.Add(task.Id); continue; } if (frameCounter >= task.destFrame) { if (task.count == -1) { task.destFrame = frameCounter + task.intervalFrame; } else { task.count -= 1; if (task.count == 0) { frameTaskList.RemoveAt(i); i -= 1; delIdList.Add(task.Id); } else { task.destFrame = frameCounter + task.intervalFrame; } if (taskHandleCb != null) { taskHandleCb(task.Cb, task.Id); } else { if (task.Cb != null) { task.Cb(task.Id); } } } } else { continue; } } } DeleteFrameTask(); }
private void CheckFrameTask() { if (tmpFrameLst.Count > 0) { lock (lockFrame) { //加入缓存区中的定时任务 for (int tmpIndex = 0; tmpIndex < tmpFrameLst.Count; tmpIndex++) { taskFrameLst.Add(tmpFrameLst[tmpIndex]); } tmpFrameLst.Clear(); } } frameCounter += 1; //遍历检测任务是否达到条件 for (int index = 0; index < taskFrameLst.Count; index++) { FrameTask task = taskFrameLst[index]; if (frameCounter < task.destFrame) { continue; } else { Action <int> cb = task.callback; try { if (taskHandle != null) { taskHandle(cb, task.tid); } else { if (cb != null) { cb(task.tid); } } } catch (Exception e) { LogInfo(e.ToString()); } //移除已经完成的任务 if (task.count == 1) { taskFrameLst.RemoveAt(index); index--; recTidLst.Add(task.tid); } else { if (task.count != 0) { task.count -= 1; } task.destFrame += task.delay; } } } }
internal void AddToVideoBuffer(byte[] obj, int length) { //int offset = 0; if (length < VIDEOHEADERSIZE) { return; } FrameControlFlags control = (FrameControlFlags)BitConverter.ToUInt32(obj, 0); ushort stride = BitConverter.ToUInt16(obj, sizeof(int)); ushort height = BitConverter.ToUInt16(obj, sizeof(int) + sizeof(ushort)); ushort width = BitConverter.ToUInt16(obj, sizeof(int) + sizeof(ushort) * 2); ushort framerate = BitConverter.ToUInt16(obj, sizeof(int) + sizeof(ushort) * 3); int framesize = BitConverter.ToInt32(obj, sizeof(int) + sizeof(ushort) * 4); //MyLog.Default.WriteLine($"Packet Header: c {control} w {width} s {stride} h {height} f {framerate} fs {framesize} l {length}"); if (stride * height * framerate > videoStride * videoHeight * videoFramerate) { videoFrameSize = framesize; videoStride = stride; videoHeight = height; videoFramerate = framerate; //TODO pause tasks InitializeVideoBuffer(); //remap } int writebytes = stride * height + VIDEOHEADERSIZE - sizeof(int); //MyLog.Default.WriteLine($"Writing to Video buffer? {writebytes} {offset} {length}"); if (framesize + VIDEOHEADERSIZE <= length) { if (control.HasFlag(FrameControlFlags.IsKeyFrame)) { try { gotfirstvideokeyframe = true; videosize++; if (writevideoposition != -1) { if (maxframes[writevideoposition] != framecounter[writevideoposition]) { maxframes[writevideoposition] = framecounter[writevideoposition]; if (taskQueue[writevideoposition] == 0 && completeQueue[writevideoposition] == maxframes[writevideoposition]) { decodevideosize++; } } } if (videosize >= 9) { decodevideosize--; videosize--; } else { writevideoposition += 1; } writevideoposition %= 10; maxframes[writevideoposition] = framerate; completeQueue[writevideoposition] = 0; framecounter[writevideoposition] = 0; hasKeyFrame[writevideoposition] = false; keyFrame[writevideoposition] = null; taskQueue[writevideoposition] = 0; vptr[writevideoposition] = 0; if (paused && audiosize >= 2 && videosize >= 2) { paused = false; } } catch (Exception ex) { MyLog.Default.WriteLine(ex.ToString()); } } else if (!gotfirstvideokeyframe) { return; } if (writevideoposition == -1 || vptr[writevideoposition] + writebytes > videostorage[writevideoposition].Length) { return; //discard } framecounter[writevideoposition]++; FrameTask task; lock (taskPool) { if (taskPool.Count > 0) { task = taskPool.Pop(); } else { task = new FrameTask(); } } taskQueue[writevideoposition]++; //MyLog.Default.WriteLine($"Preparing Task {writevideoposition} {taskQueue[writevideoposition]} "); task.Prepare(obj, VIDEOHEADERSIZE, framesize, stride, height, width, videostorage[writevideoposition], vptr[writevideoposition] + VIDEOHEADERSIZE - sizeof(int), writevideoposition, control, TaskComplete); if (task.IsKeyFrame || hasKeyFrame[writevideoposition]) { task.StartBackground(keyFrame[writevideoposition]); } else { lock (waitingOnKeyframe) { waitingOnKeyframe.Push(task); } } //MyLog.Default.WriteLine($"Read {offset} {writebytes} {obj.Length}"); //MyLog.Default.WriteLine($"Write {vptr[writevideoposition]} {writebytes} {videostorage[writevideoposition].Length}"); Buffer.BlockCopy(obj, 0, videostorage[writevideoposition], vptr[writevideoposition], VIDEOHEADERSIZE - sizeof(int)); vptr[writevideoposition] += writebytes; } }