Exemple #1
0
STDMETHODIMP CStreamSwitcherPassThru::get_Duration(REFTIME* plength)
{
    CallPeer(get_Duration(plength));
}
Exemple #2
0
double Timeline::ActiveTimeToSimpleTime(double tau, int* iteration)
{
	// m_simpleDur has accounted for autoReverse
	double m_AD = 99999;
	double m_simpleDur = get_Duration();
	double m_dur = get_Duration();

	double AD = m_AD;//m_dur;// ? AD=Active Duration?
	double speed = get_SpeedRatio();//m_speed->m_value->m_value->m_value;

	double acc = get_AccelerationRatio();//m_accelerate->m_value->m_value->m_value;
	double dec = get_DecelerationRatio();//m_decelerate->m_value->m_value->m_value;

	if (acc+dec > 1)	// Ignore both attributes
	{
		acc = 0;
		dec = 0;
	}

	double taf;

	if (speed > 0) // i.e. if the local speed is forwards 
		taf = tau * speed;
	else //  i.e. if the local speed is backwards 
		taf = AD - tau * fabs(speed);

	//Let dur be the value of the simple duration as defined by the Timing and Synchronization model.
	// This is the actual simple duration, and not simply the dur attribute.
	//This value does not account for the effect of any time manipulations.
	double dur = m_dur;
	ASSERT(dur >= 0);
	//if (dur < 0) dur = INDEFINITE;	// indefinite (Is this correct?)

	// m_simpleDur has accounted for autoReverse
	double dur_ = m_simpleDur;

#if 1	// Have something like this
	double tsu = REMAINDER(taf, dur_);
#else
	double tsu = taf;
#endif

	if (iteration)
	{	// ??
		*iteration = (int)(taf/dur_);
	}

// Account for autoReverse behavior.
	double tsu_;

	if (!get_AutoReverse())
	{
		tsu_ = tsu;
	}
	else
	{
		if (tsu < dur)
			tsu_ = tsu;
		else
			//tsu_ = /*dur - (tsu - dur) =*/ 2*dur - tsu;
			tsu_ = 2*dur - tsu;
	}

// Calculate filtered time (tsf)

// Account for acceleration/deceleration
	double tsf;

	double dacc = acc*dur;
	double ddec = dec*dur;

	double r = 1 / (1 - acc/2 - dec/2);

	if (tsu_ >= 0 && tsu_ < dacc)
	{
		double rt = r * (tsu_ / dacc);

		tsf = tsu_ * rt / 2;
	}
	else if (tsu_ > (dur - ddec))
	{
		double rt = r * (dur - tsu_) / ddec;

		double tdec =  tsu_ - (dur - ddec);
		double pd =  tdec / ddec;

		tsf = r * (dur - dacc / 2 - ddec + tdec * (2 - pd) / 2);
	}
	else
	{
		tsf = r * (tsu_ - dacc / 2);
	}

//	tsf = tsf + m_iteration*dur_;	// ???? TODO remove this

	return tsf;
}