⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smltime.cpp

📁 著名的 helix realplayer 基于手机 symbian 系统的 播放器全套源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		    m_pSourceElement->m_ulDuration =
			    m_pSourceElement->m_ulMaxActiveDur;
		    bDoUpdate = TRUE;
		}
	    }
	    // /If the duration is less than the specified min, use
	    // the min (and we already know that the min < max, so we don't
	    // need to look at the max, if any):
	    else if (m_pSourceElement->m_ulDuration <
			m_pSourceElement->m_ulMinActiveDur)
	    {
		m_pSourceElement->m_ulDuration =
			m_pSourceElement->m_ulMinActiveDur;
		bDoUpdate = TRUE;
	    }
	    // /If the duration authored is greater than the specified max,
	    // use the max (and we already know that the min < max, so we
	    // don't need to look at the min, if any):
	    else if (m_pSourceElement->m_ulDuration >
			m_pSourceElement->m_ulMaxActiveDur)
	    {
		m_pSourceElement->m_ulDuration =
			m_pSourceElement->m_ulMaxActiveDur;
		bDoUpdate = TRUE;
	    }
	    else // /use authored duration:
	    {
		m_pSourceElement->m_ulDuration =
			m_pSourceElement->m_ulAuthoredDur;
		bDoUpdate = TRUE;
	    }

	    if (bDoUpdate)
	    {
		LONG32 lDiff =
			(LONG32)m_pSourceElement->m_ulDuration +
			lBeginOffset;
		m_pSourceElement->m_ulDuration = lDiff>0?
			lDiff : 0;

		m_pParser->resetTimelineElementDuration(m_pID,
			m_pSourceElement->getPureDuration(),
			ulPriorPureDuration);
		// /This keeps track of first-play dur, in case this
		// element restarts during or after playing at least
		// once:
		m_pSourceElement->m_ulOriginalDuration =
			m_pSourceElement->getPureDuration();
		HX_ASSERT(ulDuration == m_pSourceElement->getPureDuration()  ||
			m_pSourceElement->m_bDurationIncludesDelayBeyondSyncbase);
	    }
	}
    }

cleanup:

    if (m_pDependent  &&  ((UINT32)-1 != m_pSourceElement->m_ulDelay))
    {
	HX_ASSERT(WAY_IN_THE_FUTURE >= m_pSourceElement->m_ulDuration +
	        m_pSourceElement->m_ulDelay); // 59584(media version) & 50848 
    }

    if(m_pDependent  &&
	    // /Helps fix PR 66391: If we removed this track because it fell
	    // completely outside its parent's time bounds, then we shouldn't
	    // update our dependent, but rather allow further processing of the
	    // parent seq's setDuration() to remove it's track:
	    !bTrackStartsTooLateSoTrackRemoved  &&
	    // /Helps fix some timing interop cases in the 11.2-11.9 range:
	    ((UINT32)-1 != m_pSourceElement->m_ulDelay)  &&
	    // /Helps fix case where as-yet-unresolved end of seq child should
	    // *not* be used to resolve next sibling's begin: (PR 50848)
	    WAY_IN_THE_FUTURE > m_pSourceElement->m_ulDuration +
	    m_pSourceElement->m_ulDelay) // /+delay for PR 59584-related bug.
    {
	//Removed the addition of m_pSourceElement->m_ulDelay from the
	// source's duration because the source's duration already includes
	// its delay; we don't want to count the delay twice. Fixes PR 13983:
	// /*XXXEH- UNFIXES 13983 by adding back in the ...m_ulDelay addition;
	// the full fix for 13983 requires keeping track of begin=... delay
	// (as opposed to seq-related delay) and then subtracting that begin
	// delay from the m_ulDelay below:
	adjustDependentDuration(m_pDependent);
	// /XXXEH- TODO: figure out if we need to claim this is being set by
	// "parent" (which is really time base) so clip-begin-like action can
	// occur; I don't think so, however:

	// /XXXEH- I think this fixes PR 13983 without breaking other stuff,
	// but need to make sure:
	// /Don't propagate delay of sourceElement (PR 13983) in case its
	// duration already includes its begin offset:
	ULONG32 ulDelayOfSourceElem = m_pSourceElement->m_ulDelay +
		m_pSourceElement->m_ulDuration;
	if (m_pSourceElement->m_bBeginOffsetSet  &&
		m_pSourceElement->m_lBeginOffset > 0)
	{
	    ulDelayOfSourceElem =
		    ((INT32)ulDelayOfSourceElem >
		    m_pSourceElement->m_lBeginOffset ?
		    ulDelayOfSourceElem - m_pSourceElement->m_lBeginOffset :
		    0);

#if defined(XXXEH_DEBUG)
	    HX_ASSERT(!m_pSourceElement->m_bDurationIncludesDelayBeyondSyncbase  &&
		    "ehodge: don't count delay twice!");
#endif
	    if (m_pSourceElement->m_bDurationIncludesDelayBeyondSyncbase)
	    {
		HX_ASSERT(m_pSourceElement->m_ulBeginOffsetFromSyncBase <=
			m_pSourceElement->m_lBeginOffset); // /PR 6XXXX.
	    }
	}
	// /If this is a repeat element and the first iteration element
	// was clipped due to a negative begin offset, we want to use the
	// full duration for this clip:
	if (m_pDependent->m_pSourceElement->m_pNode->m_repeatTag ==
		RepeatReplica  &&  m_pSourceElement->m_lBeginOffset < 0)
	{
	    ULONG32 ulRepeatIterationFullDur =
		    m_pSourceElement->m_ulOriginalDuration -
		    m_pSourceElement->m_lBeginOffset;
	    if ((UINT32)-1 != m_pSourceElement->m_ulOriginalDuration)
	    {
		m_pDependent->m_pSourceElement->m_ulDuration =
			ulRepeatIterationFullDur;
	    }
	}

	if (WAY_IN_THE_FUTURE < ulDelayOfSourceElem)
	{
	    HX_ASSERT(WAY_IN_THE_FUTURE == ulDelayOfSourceElem  &&  "PR 59584");
	    ulDelayOfSourceElem = WAY_IN_THE_FUTURE; // /For PR 59584.
	}

	m_pDependent->setDelay(ulDelayOfSourceElem, FALSE);
    }

    m_pParser->m_pTimelineElementManager->notify(m_pID);
}

void
CSmilTimelineElement::setMaxDuration(UINT32 ulMaxDuration)
{
    m_bMaxDurationSet = TRUE;
    m_pSourceElement->m_ulMaxDuration = ulMaxDuration;
}

void 
CSmilTimelineElement::adjustDependentDuration(CSmilTimelineElement* pDependent)
{
    if (m_pParent)
    {
	m_pParent->adjustDependentDuration(m_pDependent);
    }
}

void 
CSmilTimelineElement::resetDelay(UINT32 ulDelay)
{
    INT32   lAdjustedDelay = 0;

    UINT32 ulPriorDelay = m_pSourceElement->m_ulDelay;

    if(m_pSourceElement->m_bBeginOffsetSet)
    {
	lAdjustedDelay = (INT32)ulDelay + m_pSourceElement->m_lBeginOffset;
	m_pSourceElement->m_ulDelay = lAdjustedDelay > 0?lAdjustedDelay:0;
    }
    else
    {
	m_pSourceElement->m_ulDelay = ulDelay;
    }
    
    if (m_pDependent && m_bDurationSet)
    {
#if defined(XXXEH_WAIT_UNTIL_getCurrentScheduledStopTime_IS_FIXED_WHEN_BEGINOFFSETSET_20011022)
	ULONG32 ulTotalDelay = 0;
        if (m_pSourceElement->m_bCurBeginIsOffsetFromSyncBase  &&
		m_pSourceElement->m_bDurationIncludesDelayBeyondSyncbase)
	{
	    HX_ASSERT(0  &&  "ehodge: CHANGE NOT TESTED!");
	}

	if (HXR_OK !=
		m_pSourceElement->getCurrentScheduledStopTime(ulTotalDelay))
	{
	    goto doneSettingDependent;
	}
#else
	ULONG32 ulTotalDelay = m_pSourceElement->m_ulDelay +
		m_pSourceElement->m_ulDuration;
	// /Helps fix PR 6XXXX(media version): if delay is already packed
	// into the duration, then don't count it twice (as can happen in
	// <seq><ref begin="1s" .../><ref begin="1s" .../>...):
	if (m_pSourceElement->m_bDurationIncludesDelayBeyondSyncbase)
	{
	    HX_ASSERT(m_pSourceElement->m_ulBeginOffsetFromSyncBase != (UINT32)-1);
/*OK[]*/	    if (m_pSourceElement->m_ulBeginOffsetFromSyncBase !=(UINT32)-1)
	    {
		HX_ASSERT(m_pSourceElement->m_ulBeginOffsetFromSyncBase <
			ulTotalDelay);
		if (m_pSourceElement->m_ulBeginOffsetFromSyncBase <
			ulTotalDelay)
		{
		    ulTotalDelay -=
			    m_pSourceElement->m_ulBeginOffsetFromSyncBase;
		}
	    }
	}
#endif

	if (WAY_IN_THE_FUTURE < ulTotalDelay)
	{
	    HX_ASSERT(WAY_IN_THE_FUTURE == ulTotalDelay  &&  "PR 59584");
	    ulTotalDelay = WAY_IN_THE_FUTURE; // /For PR 59584.
	}
 
#if defined(_DEBUG)  &&  defined(XXXEH_DEBUGOUT_ADDDURATION) 
{ 
    FILE* f1 = ::fopen("c:\\smil2AddDuration.txt", bFirstTimeAddDurDebugout? 
	    ADDDURATION_DEBUGOUT_STR_NEW_FILE : 
	    ADDDURATION_DEBUGOUT_STR_APPEND_TO_FILE ); 
    ::fprintf(f1, "\n\t%s:CSmilTimelineElement::resetDelay(%lu):from %lu to %lu;" 
	    "\tresetting dependent (%s)'s delay to %lu\n", (const char*)m_pID, 
	    ulDelay, ulPriorDelay, m_pSourceElement->m_ulDelay, 
	    (const char*)m_pDependent->m_pID, ulTotalDelay); 
    ::fclose(f1); 
    bFirstTimeAddDurDebugout = FALSE; 
} 
#endif
 
	m_pDependent->resetDelay(ulTotalDelay);
    }
#if defined(XXXEH_WAIT_UNTIL_getCurrentScheduledStopTime_IS_FIXED_WHEN_BEGINOFFSETSET_20011022)
doneSettingDependent:
#endif

    if (m_pSourceElement->m_bRendererInitialized)
    {
	m_pParser->resetTimelineElementDelay(m_pID, m_pSourceElement->m_ulDelay,
		ulPriorDelay);
    }

    // /(Added while fixing PR 59851) Let others know our begin time changed:
    m_pParser->m_pTimelineElementManager->notify(m_pID);
}

void 
CSmilTimelineElement::resetDuration(UINT32 ulDuration)
{
    INT32 lAdjustedDuration = 0;

    UINT32 ulPriorPureDuration = m_pSourceElement->getPureDuration();
    
    if(m_pSourceElement->m_bBeginOffsetSet)
    {
	if (!m_pSourceElement->m_bDurationIncludesDelayBeyondSyncbase)
	{
	    m_pSourceElement->m_bDurationIncludesDelayBeyondSyncbase =
		    TRUE; // /=TRUE,not ULONG32. Helps fix PR 68190.
	}
	lAdjustedDuration = (INT32)ulDuration + m_pSourceElement->m_lBeginOffset;
	m_pSourceElement->m_ulDuration = lAdjustedDuration > 0?lAdjustedDuration:0; 
    }
    else
    {
	m_pSourceElement->m_ulDuration = ulDuration;
    }

    if(m_pParent)
    {
	// /Added surrounding if() to prevent adjusting dur of parent when
	// parent has clearly imposed its dur on *this (helps fix PR 58568)
	if (!m_pSourceElement->m_bCurEndClippedByParent)
	{
	    m_pParent->adjustDuration();
	}
    }

    if(m_pDependent)
    {
#if defined(XXXEH_WAIT_UNTIL_getCurrentScheduledStopTime_IS_FIXED_WHEN_BEGINOFFSETSET_20011022)
	ULONG32 ulTotalDelay = 0;
        if (m_pSourceElement->m_bCurBeginIsOffsetFromSyncBase  &&
		m_pSourceElement->m_bDurationIncludesDelayBeyondSyncbase)
	{
	    HX_ASSERT(0  &&  "ehodge: CHANGE NOT TESTED!");
	}

	if (HXR_OK !=
		m_pSourceElement->getCurrentScheduledStopTime(ulTotalDelay))
	{
	    goto doneSettingDependent;
	}
#else
	ULONG32 ulTotalDelay = m_pSourceElement->m_ulDelay +
		m_pSourceElement->m_ulDuration;
	// /Helps fix PR 6XXXX(media version): if delay is already packed
	// into the duration, then don't count it twice (as can happen in
	// <seq><ref begin="1s" .../><ref begin="1s" .../>...):
	if (m_pSourceElement->m_bDurationIncludesDelayBeyondSyncbase)
	{
	    HX_ASSERT(m_pSourceElement->m_ulBeginOffsetFromSyncBase != (UINT32)-1);
/*OK[]*/	    if (m_pSourceElement->m_ulBeginOffsetFromSyncBase !=(UINT32)-1)
	    {
		HX_ASSERT(m_pSourceElement->m_ulBeginOffsetFromSyncBase <
			ulTotalDelay);
		if (m_pSourceElement->m_ulBeginOffsetFromSyncBase <
			ulTotalDelay)
		{
		    ulTotalDelay -=
			    m_pSourceElement->m_ulBeginOffsetFromSyncBase;
		}
	    }
	}
#endif

	if (WAY_IN_THE_FUTURE < ulTotalDelay)
	{
	    HX_ASSERT(WAY_IN_THE_FUTURE == ulTotalDelay  &&  "PR 59584");
	    ulTotalDelay = WAY_IN_THE_FUTURE; // /For PR 59584.
	}
 
#if defined(_DEBUG)  &&  defined(XXXEH_DEBUGOUT_ADDDURATION) 
{ 
    FILE* f1 = ::fopen("c:\\smil2AddDuration.txt", bFirstTimeAddDurDebugout? 
	    ADDDURATION_DEBUGOUT_STR_NEW_FILE : 
	    ADDDURATION_DEBUGOUT_STR_APPEND_TO_FILE ); 
    ::fprintf(f1, "\n\t%s:CSmilTimelineElement::resetDuration(%lu):from %lu to %lu;"
	    "\tresetting dependent (%s)'s delay to %lu\n", (const char*)m_pID,
	    ulPriorPureDuration, ulDuration, m_pSourceElement->m_ulDuration,
	    (const char*)m_pDependent->m_pID, ulTotalDelay);
    ::fclose(f1); 
    bFirstTimeAddDurDebugout = FALSE; 
} 
#endif 
 
	// /Helps fix PR 66391; if parent clipped our duration to 0, don't
	// update dependent; that'll be handled in parent seq's setDuration():
	if (0 != ulDuration  &&  !m_pSourceElement->m_bCurEndClippedByParent)
	{
	    m_pDependent->resetDelay(ulTotalDelay);
	}
    }
#if defined(XXXEH_WAIT_UNTIL_getCurrentScheduledStopTime_IS_FIXED_WHEN_BEGINOFFSETSET_20011022)
doneSettingDependent:
#endif

    m_pParser->m_pTimelineElementManager->notify(m_pID);
}

void 
CSmilTimelineElement::adjustDuration()
{
    // no-op
    return;
}

HX_RESULT
CSmilTimelineElement::handlePrefetchFinished(UINT32 ulTimeFinished)
{
    HX_RESULT pnr = HXR_FAILED;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -