int main() { CircularList<int> list; for(int i=0;i<20;i++){ list.Insert(i*3,i); } cout<<"the Length of the list is "<<list.Length()<<endl; list.Print(); for(int j=0;j<5;j++){ list.Insert(3,j*3); } cout<<"the Length of the list is "<<list.Length()<<endl; list.Print(); list.Remove(5); cout<<"the Length of the list is "<<list.Length()<<endl; list.Print(); list.RemoveAll(3); cout<<"the Length of the list is "<<list.Length()<<endl; list.Print(); cout<<"The third element is "<<list.Get(3)<<endl; list.MakeEmpty(); cout<<"the Length of the list is "<<list.Length()<<endl; list.Print(); return 0; }
void OBS::EncodeLoop() { QWORD streamTimeStart = GetQPCTimeNS(); QWORD frameTimeNS = 1000000000/fps; bool bufferedFrames = true; //to avoid constantly polling number of frames int numTotalDuplicatedFrames = 0, numTotalFrames = 0, numFramesSkipped = 0; bufferedTimes.Clear(); bool bUsingQSV = videoEncoder->isQSV();//GlobalConfig->GetInt(TEXT("Video Encoding"), TEXT("UseQSV")) != 0; QWORD sleepTargetTime = streamTimeStart+frameTimeNS; latestVideoTime = firstSceneTimestamp = streamTimeStart/1000000; latestVideoTimeNS = streamTimeStart; firstFrameTimestamp = 0; UINT encoderInfo = 0; QWORD messageTime = 0; EncoderPicture *lastPic = NULL; UINT skipThreshold = encoderSkipThreshold*2; UINT no_sleep_counter = 0; CircularList<QWORD> bufferedTimes; while(!bShutdownEncodeThread || (bufferedFrames && !bTestStream)) { if (!SleepToNS(sleepTargetTime += (frameTimeNS/2))) no_sleep_counter++; else no_sleep_counter = 0; latestVideoTime = sleepTargetTime/1000000; latestVideoTimeNS = sleepTargetTime; if (no_sleep_counter < skipThreshold) { SetEvent(hVideoEvent); if (encoderInfo) { if (messageTime == 0) { messageTime = latestVideoTime+3000; } else if (latestVideoTime >= messageTime) { RemoveStreamInfo(encoderInfo); encoderInfo = 0; messageTime = 0; } } } else { numFramesSkipped++; if (!encoderInfo) encoderInfo = AddStreamInfo(Str("EncoderLag"), StreamInfoPriority_Critical); messageTime = 0; } if (!SleepToNS(sleepTargetTime += (frameTimeNS/2))) no_sleep_counter++; else no_sleep_counter = 0; bufferedTimes << latestVideoTime; if (curFramePic && firstFrameTimestamp) { while (bufferedTimes[0] < firstFrameTimestamp) bufferedTimes.Remove(0); DWORD curFrameTimestamp = DWORD(bufferedTimes[0] - firstFrameTimestamp); bufferedTimes.Remove(0); profileIn("encoder thread frame"); FrameProcessInfo frameInfo; frameInfo.firstFrameTime = firstFrameTimestamp; frameInfo.frameTimestamp = curFrameTimestamp; frameInfo.pic = curFramePic; if (lastPic == frameInfo.pic) numTotalDuplicatedFrames++; if(bUsingQSV) curFramePic->mfxOut->Data.TimeStamp = curFrameTimestamp; else curFramePic->picOut->i_pts = curFrameTimestamp; ProcessFrame(frameInfo); if (bShutdownEncodeThread) bufferedFrames = videoEncoder->HasBufferedFrames(); lastPic = frameInfo.pic; profileOut; numTotalFrames++; } } //flush all video frames in the "scene buffering time" buffer if (firstFrameTimestamp && bufferedVideo.Num()) { QWORD startTime = GetQPCTimeMS(); DWORD baseTimestamp = bufferedVideo[0].timestamp; for(UINT i=0; i<bufferedVideo.Num(); i++) { //we measure our own time rather than sleep between frames due to potential sleep drift QWORD curTime; do { curTime = GetQPCTimeMS(); OSSleep (1); } while (curTime - startTime < bufferedVideo[i].timestamp - baseTimestamp); SendFrame(bufferedVideo[i], firstFrameTimestamp); bufferedVideo[i].Clear(); numTotalFrames++; } bufferedVideo.Clear(); } Log(TEXT("Total frames encoded: %d, total frames duplicated: %d (%0.2f%%)"), numTotalFrames, numTotalDuplicatedFrames, (numTotalFrames > 0) ? (double(numTotalDuplicatedFrames)/double(numTotalFrames))*100.0 : 0.0f); if (numFramesSkipped) Log(TEXT("Number of frames skipped due to encoder lag: %d (%0.2f%%)"), numFramesSkipped, (numTotalFrames > 0) ? (double(numFramesSkipped)/double(numTotalFrames))*100.0 : 0.0f); SetEvent(hVideoEvent); bShutdownVideoThread = true; }
void OBS::EncodeLoop() { QWORD streamTimeStart = GetQPCTimeNS(); QWORD frameTimeNS = 1000000000/fps; bool bufferedFrames = true; //to avoid constantly polling number of frames int numTotalDuplicatedFrames = 0, numTotalFrames = 0; bufferedTimes.Clear(); bool bUsingQSV = videoEncoder->isQSV();//GlobalConfig->GetInt(TEXT("Video Encoding"), TEXT("UseQSV")) != 0; QWORD sleepTargetTime = streamTimeStart+frameTimeNS; latestVideoTime = firstSceneTimestamp = streamTimeStart/1000000; latestVideoTimeNS = streamTimeStart; firstFrameTimestamp = 0; EncoderPicture *lastPic = NULL; CircularList<QWORD> bufferedTimes; while(!bShutdownEncodeThread || (bufferedFrames && !bTestStream)) { SetEvent(hVideoEvent); SleepToNS(sleepTargetTime); latestVideoTime = sleepTargetTime/1000000; latestVideoTimeNS = sleepTargetTime; bufferedTimes << latestVideoTime; if (curFramePic && firstFrameTimestamp) { while (bufferedTimes[0] < firstFrameTimestamp) bufferedTimes.Remove(0); DWORD curFrameTimestamp = DWORD(bufferedTimes[0] - firstFrameTimestamp); bufferedTimes.Remove(0); profileIn("encoder thread frame"); FrameProcessInfo frameInfo; frameInfo.firstFrameTime = firstFrameTimestamp; frameInfo.frameTimestamp = curFrameTimestamp; frameInfo.pic = curFramePic; if (lastPic == frameInfo.pic) numTotalDuplicatedFrames++; if(bUsingQSV) curFramePic->mfxOut->Data.TimeStamp = curFrameTimestamp; else curFramePic->picOut->i_pts = curFrameTimestamp; ProcessFrame(frameInfo); if (bShutdownEncodeThread) bufferedFrames = videoEncoder->HasBufferedFrames(); lastPic = frameInfo.pic; profileOut; numTotalFrames++; } sleepTargetTime += frameTimeNS; } //flush all video frames in the "scene buffering time" buffer if (firstFrameTimestamp && bufferedVideo.Num()) { QWORD startTime = GetQPCTimeMS(); DWORD baseTimestamp = bufferedVideo[0].timestamp; for(UINT i=0; i<bufferedVideo.Num(); i++) { //we measure our own time rather than sleep between frames due to potential sleep drift QWORD curTime; do { curTime = GetQPCTimeMS(); OSSleep (1); } while (curTime - startTime < bufferedVideo[i].timestamp - baseTimestamp); SendFrame(bufferedVideo[i], firstFrameTimestamp); bufferedVideo[i].Clear(); numTotalFrames++; } bufferedVideo.Clear(); } Log(TEXT("Total frames encoded: %d, total frames duplicated %d (%0.2f%%)"), numTotalFrames, numTotalDuplicatedFrames, (double(numTotalDuplicatedFrames)/double(numTotalFrames))*100.0); SetEvent(hVideoEvent); bShutdownVideoThread = true; }