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);
    }
Exemple #2
0
    /// <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);
    }
Exemple #3
0
    //替换定帧任务
    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;//设置下一次任务的结束帧
                }
            }
        }
    }
Exemple #6
0
    //添加定帧任务
    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);
    }
Exemple #7
0
    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);
    }
Exemple #8
0
        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>();
        }
Exemple #9
0
    //检测定帧任务
    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();
        }
    }
Exemple #10
0
    /// <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);
    }
Exemple #11
0
    /// <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);
    }
Exemple #12
0
 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;
         }
     }
 }
Exemple #13
0
        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;
                            }
                        }
                    }
                }
            }
        }
Exemple #14
0
    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);
    }
Exemple #15
0
    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);
    }
Exemple #17
0
    /// <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; // 重新设置目标帧(下一次执行任务的时间)
                }
            }
        }
    }
Exemple #18
0
 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();
 }
Exemple #19
0
        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;
            }
        }