STDMETHODIMP CStreamSwitcherPassThru::get_Duration(REFTIME* plength) { CallPeer(get_Duration(plength)); }
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; }