// Handle an incoming message // Return TRUE if the message was handled, otherwise FALSE. UtlBoolean MpMediaTask::handleMessage(OsMsg& rMsg) { UtlBoolean handled; MpFlowGraphBase* pFlowGraph; MpMediaTaskMsg* pMsg; if (rMsg.getMsgType() != OsMsg::MP_TASK_MSG) return FALSE; // the method only handles MP_TASK_MSG messages pMsg = (MpMediaTaskMsg*) &rMsg; pFlowGraph = (MpFlowGraphBase*) pMsg->getPtr1(); handled = TRUE; // until proven otherwise, assume we'll handle the msg switch (pMsg->getMsg()) { case MpMediaTaskMsg::MANAGE: { OsEvent* event = (OsEvent*)pMsg->getPtr2(); if (!handleManage(pFlowGraph)) mHandleMsgErrs++; if (event) event->signal(0); break; } case MpMediaTaskMsg::SET_FOCUS: if (!handleSetFocus(pFlowGraph)) mHandleMsgErrs++; break; case MpMediaTaskMsg::START: if (!handleStart(pFlowGraph)) mHandleMsgErrs++; break; case MpMediaTaskMsg::STOP: if (!handleStop(pFlowGraph)) mHandleMsgErrs++; break; case MpMediaTaskMsg::UNMANAGE: { OsEvent* event = (OsEvent*)pMsg->getPtr2(); if (!handleUnmanage(pFlowGraph)) mHandleMsgErrs++; if (event) event->signal(0); break; } case MpMediaTaskMsg::WAIT_FOR_SIGNAL: if (!handleWaitForSignal(pMsg)) mHandleMsgErrs++; break; default: handled = FALSE; // we didn't handle the message after all break; } return handled; }
// (static) Release the "frame start" semaphore. This signals the media // processing task that it should begin processing the next frame. // Returns the result of releasing the binary semaphore that is used to send // the signal. OsStatus MpMediaTask::signalFrameStart(void) { OsStatus ret = OS_TASK_NOT_STARTED; MpMediaTaskMsg* pMsg; // If the Media Task has been started if (0 != spInstance) { pMsg = (MpMediaTaskMsg*) spInstance->mpSignalMsgPool->findFreeMsg(); if (NULL == pMsg) { ret = OS_LIMIT_REACHED; } else { #ifdef _PROFILE /* [ */ timeval t; gettimeofday(&t, NULL); long long now = (t.tv_sec * 1000000) + t.tv_usec; // Record the time into the message pMsg->setInt1(t.tv_sec); pMsg->setInt2(t.tv_usec); // Record the tick interval into the histogram. if (spInstance->mSignalTime.tally(now - sSignalTicks) >= 1000) { UtlString* print = spInstance->mSignalTime.show(); OsSysLog::add(FAC_MP, PRI_NOTICE, "MpMediaTask::signalFrameStart %-18s %d%s", "mSignalTime", spInstance->mSignalTime.getBinSize(), print->data()); delete print; spInstance->mSignalTime.clear(); } sSignalTicks = now; // record the time #endif /* _PROFILE, __pingtel_on_posix__ ] */ ret = spInstance->postMessage(*pMsg, OsTime::NO_WAIT); } } return ret; }
// Handle an incoming message // Return TRUE if the message was handled, otherwise FALSE. UtlBoolean MpMediaTask::handleMessage(OsMsg& rMsg) { UtlBoolean handled; MpFlowGraphBase* pFlowGraph; MpMediaTaskMsg* pMsg; if (rMsg.getMsgType() != OsMsg::MP_TASK_MSG) return FALSE; // the method only handles MP_TASK_MSG messages pMsg = (MpMediaTaskMsg*) &rMsg; pFlowGraph = (MpFlowGraphBase*) pMsg->getPtr1(); handled = TRUE; // until proven otherwise, assume we'll handle the msg #ifdef _PROFILE /* [ */ // Log the time it takes to handle messages other than WAIT_FOR_SIGNAL. long long start_time; if (pMsg->getMsg() != MpMediaTaskMsg::WAIT_FOR_SIGNAL) { timeval t; gettimeofday(&t, NULL); start_time = (t.tv_sec * 1000000) + t.tv_usec; } #endif /* _PROFILE ] */ if (getMessageQueue()->numMsgs() > 100) { OsSysLog::add(FAC_SIP, PRI_DEBUG, "MpMediaTask::handleMessage msgType = %d, " "queue length = %d", pMsg->getMsg(), getMessageQueue()->numMsgs()); } switch (pMsg->getMsg()) { case MpMediaTaskMsg::MANAGE: if (!handleManage(pFlowGraph)) mHandleMsgErrs++; break; case MpMediaTaskMsg::SET_FOCUS: if (!handleSetFocus(pFlowGraph)) mHandleMsgErrs++; break; case MpMediaTaskMsg::START: if (!handleStart(pFlowGraph)) mHandleMsgErrs++; break; case MpMediaTaskMsg::STOP: if (!handleStop(pFlowGraph)) mHandleMsgErrs++; break; case MpMediaTaskMsg::UNMANAGE: if (!handleUnmanage(pFlowGraph)) mHandleMsgErrs++; break; case MpMediaTaskMsg::WAIT_FOR_SIGNAL: if (!handleWaitForSignal(pMsg)) mHandleMsgErrs++; break; default: handled = FALSE; // we didn't handle the message after all break; } #ifdef _PROFILE /* [ */ // Log the time it takes to handle messages other than WAIT_FOR_SIGNAL. if (pMsg->getMsg() != MpMediaTaskMsg::WAIT_FOR_SIGNAL) { timeval t; gettimeofday(&t, NULL); long long end_time = (t.tv_sec * 1000000) + t.tv_usec; mOtherMessages.tally(end_time - start_time); } #endif /* _PROFILE ] */ return handled; }