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;
}
示例#2
0
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;
}