OMX_ERRORTYPE Clock::MediaTimeRequest( OMX_TIME_CONFIG_MEDIATIMEREQUESTTYPE *pRequst) { OMX_ERRORTYPE ret = OMX_ErrorNone; OMX_TIME_MEDIATIMETYPE UpdateType; OMX_TICKS TargetMediaTime, CurMediaTime; fsl_osal_timeval CurWallTime; OMX_S64 WaitTicks; if(CurState != OMX_TIME_ClockStateRunning) { LOG_WARNING("Clock is not running.\n"); return OMX_ErrorIncorrectStateOperation; } OMX_CHECK_STRUCT(pRequst, OMX_TIME_CONFIG_MEDIATIMEREQUESTTYPE, ret); if(ret != OMX_ErrorNone) return ret; OMX_INIT_STRUCT(&UpdateType, OMX_TIME_MEDIATIMETYPE); UpdateType.eUpdateType = OMX_TIME_UpdateRequestFulfillment; UpdateType.nClientPrivate = (OMX_U32) pRequst->pClientPrivate; if(Scale >= MIN_TRICK_FORWARD_RATE*Q16_SHIFT || Scale < -Q16_SHIFT) { WaitTicks = (OMX_S64)OMX_TICKS_PER_SECOND*Q16_SHIFT/Scale; WaitTicks = Scale > 0 ? WaitTicks : -WaitTicks; CurMediaAndWallTime(NULL, &CurWallTime); LOG_DEBUG("Scale %d, Cur Media Time: %lld, Wait Time: %lld\n", Scale,CurMediaTime, WaitTicks); fsl_osal_cond_timedwait(Cond, WaitTicks); /* Not drop any frames in trick mode */ UpdateType.nMediaTimestamp = pRequst->nMediaTimestamp; UpdateType.nWallTimeAtMediaTime = WALLTIME2TICKS(CurWallTime); } else { TargetMediaTime = pRequst->nMediaTimestamp; CurMediaAndWallTime(&CurMediaTime, &CurWallTime); WaitTicks = (TargetMediaTime - pRequst->nOffset - CurMediaTime)*Q16_SHIFT/Scale; LOG_DEBUG("Target: %lld, Cur: %lld, Diff: %lld\n", TargetMediaTime, CurMediaTime, WaitTicks); if(WaitTicks > OMX_TICKS_PER_SECOND) { fsl_osal_cond_timedwait(Cond, OMX_TICKS_PER_SECOND); return OMX_ErrorNotReady; } if(WaitTicks > 0) { fsl_osal_cond_timedwait(Cond, WaitTicks); CurMediaTime = pRequst->nMediaTimestamp; } UpdateType.nMediaTimestamp = CurMediaTime; UpdateType.nWallTimeAtMediaTime = WALLTIME2TICKS(CurWallTime); } MediaTimeUpdate(&UpdateType, pRequst->nPortIndex); return OMX_ErrorNone; }
OMX_ERRORTYPE GMSubtitlePlayer::ThreadHandler() { delayedSample.nFilledLen = -1; fsl_osal_sem_wait(pSem); while(bThreadStop != OMX_TRUE) { OMX_ERRORTYPE ret = OMX_ErrorNone; GM_STATE State = GM_STATE_NULL; mAVPlayer->GetState(&State); if(State == GM_STATE_PAUSE) { fsl_osal_sleep(500000); continue; } if(delayedSample.nFilledLen == -1){ OMX_BOOL bEOS = OMX_FALSE; ret = mSource->GetNextSubtitleSample(mSample, bEOS); if(ret == OMX_ErrorNotReady){ LOG_DEBUG("subtitle not ready, sleep"); fsl_osal_sleep(300000); continue; } if(bEOS == OMX_TRUE) break; } else{ fsl_osal_memcpy(&mSample, &delayedSample, sizeof(GMSubtitleSource::SUBTITLE_SAMPLE)); delayedSample.nFilledLen = -1; } LOG_DEBUG("subtitle: format: %d, buffer: %s, len: %d, start pts: %lld\n", mSample.fmt, mSample.pBuffer, mSample.nFilledLen, mSample.nStartTime); OMX_TICKS nMediaTime = 0; mAVPlayer->GetMediaPositionNoLock(&nMediaTime); OMX_S32 diff = mSample.nStartTime - nMediaTime; LOG_DEBUG("diff: %d, start time: %lld, media time: %lld\n", diff, mSample.nStartTime, nMediaTime); if(diff > 0) { fsl_osal_cond_timedwait(Cond, diff); } if(bThreadStop == OMX_TRUE) { LOG_DEBUG("GMSubtitlePlayer break as stop.\n"); return OMX_ErrorUndefined; } if(bReset == OMX_TRUE) { LOG_DEBUG("GMSubtitlePlayer break as Reset.\n"); return OMX_ErrorNone; } mAVPlayer->GetState(&State); if(State == GM_STATE_PAUSE) { fsl_osal_memcpy(&delayedSample, &mSample, sizeof(GMSubtitleSource::SUBTITLE_SAMPLE)); continue; } RenderOneSample(); } return OMX_ErrorNone; }