void DL_TIMER_Start ( DL_TIMER *oTimer ) { /* init outputs */ DL_MEM_memset(oTimer,0,sizeof(DL_TIMER)); /* record seconds */ oTimer->sec = DL_TIME_GetUTCSeconds(); /* record micro-seconds */ oTimer->msec = getMSec(); return; }
void* pushAudioFlowProc(void* arg) { char* audioName = "audio.aac"; int ret; AACHelper aacHelper; char aacData[AAC_BUFFER] = {0}; int aacLen = AAC_BUFFER; unsigned long long time_gap = 142000; unsigned long long last_time = 0; unsigned long long now = 0; unsigned long long st = 0; if(initAACHelper(&aacHelper,audioName) != 0) { printf("init aac helper failed\n"); return NULL; } MediaFrame_t frame = {0}; printf("start to push audio,audioName=%s,bufferSize=%d,fd=%d\n",audioName,aacHelper.buffer_size,fd); pushAudioing = 1; while (pushAudioing) { aacLen = AAC_BUFFER; ret = getAACFrame(&aacHelper,aacData,&aacLen); if(ret == 0) { now = getMSec(); frame.frameBuffer = (unsigned char*)aacData; frame.frameLength = aacLen; frame.frameTime = now/1000; frame.frameType = AAC_TYPE_SAMPLE;//音频数据 ret = LY_sendMediaFrame(fd,&frame); if(ret != 0) printf("send audio failed fd=%d ret:%d\n",fd,ret); else printf("send audio success fd=%d ret:%d\n",fd,ret); last_time = getMSec(); st = (last_time - now); if(st < time_gap) usleep(time_gap - st);//实时流出来一帧推一帧即可,无需sleep } else if(aacHelper.readFileEof) { if(loopPush) { printf("push audio file again,ret=%d\n",ret); fseek(aacHelper.fp,0,SEEK_SET); aacHelper.offset = 0; aacHelper.readFileEof = 0; } else { pushAudioing = 0; } } } freeAACHelper(&aacHelper); printf("stop push audio\n"); return NULL; }
void* pushVideoFlowProc(void* arg) { char* videoName = "video.h264"; int ret; unsigned long long time_gap = 66000;//66毫秒间隔,15帧 unsigned long long last_time = 0; unsigned long long now = 0; unsigned long long timeStamp = 0; unsigned long long st = 0; int lastTimeCost = 0; int frameNum = 0; h264Helper helper; if(h264HelperInit(&helper,videoName) != 0) { printf("init h264 helper faield\n"); return NULL; } printf("start to push video,videoName=%s,bufferSize=%d,fd=%d\n",videoName,helper.bufferSize,fd); timeStamp = getMSec(); MediaFrame_t frame = {0}; while (pushVideoing) { if(helper.sendDoneFlag == 0) { now = getMSec(); if(getH264Frame(&helper) == 0) { timeStamp = now; frame.frameType = helper.naluType;//帧类型参考common_define.h frame.frameBuffer = (unsigned char*)helper.data; frame.frameLength = helper.frameSize; frame.frameTime = timeStamp/1000;//毫秒单位 ret = LY_sendMediaFrame(fd,&frame); if(ret != 0) printf("send video failed fd=%d nal %d frame ret:%d,frameSize=%d\n",fd,helper.naluType,ret,helper.frameSize); else printf("send video success fd=%d nal %d frame ret:%d,frameSize=%d\n",fd,helper.naluType,ret,helper.frameSize); } last_time = getMSec(); st = (last_time - now); if(st < time_gap) usleep(time_gap - st);//实时流出来一帧推一帧即可,无需sleep } else if(helper.readFileEof) { if(loopPush)//循环推录像 { printf("push video file again\n"); fseek(helper.fp,0,SEEK_SET); helper.frameSize = 0; helper.offset = 0; helper.readFileEof = 0; helper.sendDoneFlag = 0; helper.naluType = 0; } else { pushVideoing = 0; } } } h264HelperFree(&helper); printf("stop push video,thread exit\n"); }
bool RDOSimulatorBase::rdoNext() { if (m_mode == RTM_Pause || m_mode == RTM_BreakPoint) { boost::this_thread::sleep(boost::posix_time::milliseconds(1)); return true; } // Если нажата клавиша или активная область, то задержки надо проскачить bool keyboard = isKeyDown(); if (!keyboard) { // Задержка общей скорости моделирования // Это mode == RTM_Jump || mode == RTM_Sync if (m_mode != RTM_MaxSpeed && m_next_delay_count) { ++m_next_delay_current; if (m_next_delay_current < m_next_delay_count) return true; m_next_delay_current = 0; } // Задержка синхронной скорости моделирования (длительность операций) // Тут не надо проверять mode == RTM_Sync, т.к. это уже заложено в msec_wait, // который сбрасывается в setMode и не изменяется далее. if (m_msec_wait > 1) { boost::posix_time::ptime systime_current = boost::posix_time::microsec_clock::local_time(); std::size_t msec_curr = getMSec(systime_current); std::size_t msec_delta; // Милисекунды считаются с учетом часов, но при смене суток часы сбрасываются на ноль, // и текущее время в милисекундах становится меньше предыдущего. Учитываем этот момент // через ветку ELSE. Теперь система сможет учесть переход на один день вперед между // двумя соседники моментами времени, но не сможет учесть на два и более дня. Это // является маразматической ситуаций (ждать слудующего события два дня), но запросто // может потребоваться в системе мониторинга реального времени, которая работает в // автоматическом режиме, обрабатывая информацию с контроллеров. РДО это делать не умеет. // Как решение - отказ от синхронной работы в таких системах, и учет только скорости, или // переход на работу с календарем дней, месяцев и лет. SYSTEMTIME содержит такую информацию. if (msec_curr >= m_msec_prev) { msec_delta = msec_curr - m_msec_prev; } else { msec_delta = UINT_MAX - m_msec_prev + msec_curr; } if (msec_delta <= m_msec_wait) return true; m_msec_wait -= msec_delta; } } // Окончание моделирования - сработало событие конца if (endCondition()) { onEndCondition(); return false; } if (m_currentTime != m_nextTime) { m_currentTime = m_nextTime; onNewTimeNow(); } // Выполнение операции if (doOperation()) { if (breakPoints()) { setMode(RTM_BreakPoint); } return true; } else { // Переход к следующей операции if (!m_timePoints.empty()) { BOPlannedMap::iterator begin = m_timePoints.begin(); double newTime = begin->first; const BOPlannedList& list = begin->second; if (list.empty()) { m_timePoints.erase(begin); } if (m_currentTime > newTime) { newTime = m_currentTime; } if (m_mode == RTM_Sync) { m_msec_wait += (newTime - m_nextTime) * 3600.0 * 1000.0 / m_showRate; if (m_msec_wait > 0) { if (newTime != m_startTime) { if (m_speed > DBL_MIN) { m_msec_wait = m_msec_wait / m_speed; } else { m_msec_wait = m_msec_wait / DBL_MIN; } boost::posix_time::ptime systime_current = boost::posix_time::microsec_clock::local_time(); m_msec_prev = getMSec(systime_current); } else { m_msec_wait = 0; } } } m_nextTime = newTime; return true; } else { // Окончание моделирования - нет больше событий onNothingMoreToDo(); return false; } } }