void object::update() { long i; float *tempA; /* waypoint */ if (mTarget != NULL) { tempA = new float[3]; vectorSub(tempA, mTarget, mOrigin); angleFromVector(tempA, tempA); vectorWrap(tempA, tempA, 0, PI * 2); vectorSub(tempA, tempA, mAngle); for (i = 0; i < 3; i++) { if (fabs(tempA[i]) > PI) tempA[i] *= -1; if (tempA[i] != 0) mAngVel[i] = (float) fabs(mAngVel[i]) * sgn(tempA[i]); } delete []tempA; } /* velocity */ if (vectorDirty(mPosAcc) || vectorDirty(mAngAcc)) { vectorAdd(mPosVel, mPosVel, mPosAcc); vectorAdd(mAngVel, mAngVel, mAngAcc); vectorLock(mPosVel, mPosVel, -mMovSpdMax, mMovSpdMax); vectorLock(mAngVel, mAngVel, -mRotSpdMax, mRotSpdMax); } /* position */ if (vectorDirty(mPosVel) || vectorDirty(mAngVel)) { if (mStyle == 0) vectorAdd(mOrigin, mOrigin, mPosVel); else goFwd(mPosVel[2]); vectorAdd(mAngle, mAngle, mAngVel); vectorLock(mOrigin, mOrigin, -BIG_NUMBER, BIG_NUMBER); vectorWrap(mAngle, mAngle, 0, PI * 2); vectorLock(mScale, mScale, 0, BIG_NUMBER); buildTrans(); } /* particle */ if (mTicks > 0) mTicks--; }
bool CPlaylist::CreateNewClip(int clipNumber, REFERENCE_TIME clipStart, REFERENCE_TIME clipOffset, bool audioPresent, REFERENCE_TIME duration, REFERENCE_TIME playlistClipOffset, bool seekTarget, bool interrupted) { CAutoLock vectorLock(&m_sectionVector); bool ret = true; if (m_vecClips.size()) { (*m_itCurrentAudioSubmissionClip)->Superceed(SUPERCEEDED_AUDIO_FILL); (*m_itCurrentVideoSubmissionClip)->Superceed(SUPERCEEDED_VIDEO_FILL); } if (m_vecClips.size()) PushClips(); m_vecClips.push_back(new CClip(clipNumber, nPlaylist, clipStart, clipOffset, playlistClipOffset, audioPresent, duration, seekTarget, interrupted)); if (m_vecClips.size() == 1) { // initialise m_itCurrentAudioPlayBackClip=m_itCurrentVideoPlayBackClip=m_itCurrentAudioSubmissionClip=m_itCurrentVideoSubmissionClip=m_vecClips.begin(); } else { PopClips(); m_itCurrentAudioSubmissionClip++; m_itCurrentVideoSubmissionClip++; } return ret; }
bool CPlaylist::AcceptAudioPacket(Packet* packet) { CAutoLock vectorLock(&m_sectionVector); bool ret = true; if (!m_vecClips.size()) return false; if ((*m_itCurrentAudioSubmissionClip)->nClip == packet->nClipNumber) { if (!firstAudioPESPacketSeen) packet->nNewSegment |= NS_NEW_PLAYLIST; ret = (*m_itCurrentAudioSubmissionClip)->AcceptAudioPacket(packet); } else { LogDebug("CPlaylist Panic in Accept Audio Packet"); } if (!firstAudioPESPacketSeen && ret && packet->rtStart!=Packet::INVALID_TIME) { REFERENCE_TIME oldPEStime = firstAudioPESTimeStamp; firstAudioPESPacketSeen=true; firstAudioPESTimeStamp= (*m_itCurrentAudioSubmissionClip)->clipPlaylistOffset - packet->rtStart; } return ret; }
bool CPlaylist::AcceptVideoPacket(Packet* packet) { CAutoLock vectorLock(&m_sectionVector); bool ret = true; REFERENCE_TIME prevVideoPosition = 0; if (nPlaylist != packet->nPlaylist) { (*m_itCurrentVideoSubmissionClip)->Superceed(SUPERCEEDED_VIDEO_FILL); return false; } if ((*m_itCurrentVideoSubmissionClip)->nClip==packet->nClipNumber) { if (!firstVideoPESPacketSeen) packet->nNewSegment |= NS_NEW_PLAYLIST; prevVideoPosition = (*m_itCurrentVideoSubmissionClip)->lastVideoPosition; ret=(*m_itCurrentVideoSubmissionClip)->AcceptVideoPacket(packet); } if (!firstVideoPESPacketSeen && ret && packet->rtStart!=Packet::INVALID_TIME) { REFERENCE_TIME oldPEStime = firstVideoPESTimeStamp; firstVideoPESPacketSeen=true; firstVideoPESTimeStamp= (*m_itCurrentVideoSubmissionClip)->clipPlaylistOffset - packet->rtStart; } return ret; }
Packet* CPlaylist::ReturnNextAudioPacket() { CAutoLock vectorLock(&m_sectionVector); firstPacketRead=true; firstAudioPESPacketSeen=true; Packet * ret = (*m_itCurrentAudioPlayBackClip)->ReturnNextAudioPacket(playlistFirstPacketTime); if (ret) { ret->nPlaylist=nPlaylist; } else { if (m_itCurrentAudioPlayBackClip - m_vecClips.begin() == m_vecClips.size() - 1) { SetEmptiedAudio(); } else { (*m_itCurrentAudioPlayBackClip)->Superceed(SUPERCEEDED_AUDIO_RETURN); m_itCurrentAudioPlayBackClip++; ret=ReturnNextAudioPacket(); } } return ret; }
REFERENCE_TIME CPlaylist::ClearAllButCurrentClip(REFERENCE_TIME totalStreamOffset) { CAutoLock vectorLock(&m_sectionVector); REFERENCE_TIME ret = 0LL; ivecClip it = m_vecClips.begin(); while (it!=m_vecClips.end()) { CClip * clip=*it; if (clip==m_vecClips.back()) { ++it; } else { it=m_vecClips.erase(it); delete clip; } } if (m_vecClips.size()>0) { m_itCurrentAudioPlayBackClip=m_itCurrentVideoPlayBackClip=m_itCurrentAudioSubmissionClip=m_itCurrentVideoSubmissionClip=m_vecClips.begin(); ret = (*m_itCurrentAudioPlayBackClip)->PlayedDuration(); Reset(nPlaylist, playlistFirstPacketTime); (*m_itCurrentAudioPlayBackClip)->Reset(totalStreamOffset + ret); return ret; } return 0LL; }
REFERENCE_TIME CPlaylist::Incomplete() { CAutoLock vectorLock(&m_sectionVector); if (m_vecClips.size()>0) { return m_vecClips.back()->Incomplete(); } return 0LL; }
REFERENCE_TIME CPlaylist::PlayedDuration() { CAutoLock vectorLock(&m_sectionVector); if (m_vecClips.size()>0) { return m_vecClips.back()->PlayedDuration(); } return 0LL; }
void CPlaylist::FlushVideo() { CAutoLock vectorLock(&m_sectionVector); ivecClip it = m_vecClips.begin(); while (it!=m_vecClips.end()) { CClip * clip=*it; clip->FlushVideo(); ++it; } }
vector<CClip*> CPlaylist::Superceed() { CAutoLock vectorLock(&m_sectionVector); vector<CClip*> ret; ivecClip it = m_vecClips.begin(); while (it!=m_vecClips.end()) { CClip * clip=*it; if (clip->noAudio) ret.push_back(clip); ++it; } return ret; }
bool CPlaylist::HasVideo() { CAutoLock vectorLock(&m_sectionVector); if (!m_vecClips.size()) return false; if ((*m_itCurrentVideoPlayBackClip)->HasVideo()) return true; if (++m_itCurrentVideoPlayBackClip == m_vecClips.end()) m_itCurrentVideoPlayBackClip--; else { bool ret = (*m_itCurrentVideoPlayBackClip)->HasVideo(); m_itCurrentVideoPlayBackClip--; return ret; } return false; }
CPlaylist::~CPlaylist(void) { CAutoLock vectorLock(&m_sectionVector); if (m_vecClips.size()>0) { ivecClip it = m_vecClips.begin(); while (it!=m_vecClips.end()) { CClip * clip=*it; it=m_vecClips.erase(it); delete clip; } } }
Packet* CPlaylist::ReturnNextAudioPacket(int clip) { CAutoLock vectorLock(&m_sectionVector); Packet* ret=NULL; if ((*m_itCurrentAudioPlayBackClip)->nClip==clip) { ret = (*m_itCurrentAudioPlayBackClip)->ReturnNextAudioPacket(playlistFirstPacketTime); if (ret!=NULL) { ret->nPlaylist=nPlaylist; } } if (ret) firstPacketRead=true; return ret; }
void CPlaylist::Reset(int playlistNumber, REFERENCE_TIME firstPacketTime) { CAutoLock vectorLock(&m_sectionVector); nPlaylist=playlistNumber; playlistFirstPacketTime=firstPacketTime; playlistFilledAudio=false; playlistFilledVideo=false; playlistEmptiedVideo=false; playlistEmptiedAudio=false; firstAudioPESPacketSeen=false; firstVideoPESPacketSeen=false; firstAudioPESTimeStamp=0LL; firstVideoPESTimeStamp=0LL; firstPacketRead=false; }
bool CPlaylist::RemoveRedundantClips() { CAutoLock vectorLock(&m_sectionVector); ivecClip it = m_vecClips.end(); if (it != m_vecClips.begin()) --it; while (it != m_vecClips.begin()) { CClip * clip=*it; if (clip->IsSuperceeded(SUPERCEEDED_AUDIO_RETURN|SUPERCEEDED_VIDEO_RETURN|SUPERCEEDED_AUDIO_FILL|SUPERCEEDED_VIDEO_FILL)) { it=m_vecClips.erase(it); delete clip; } else { --it; } } if (m_vecClips.size()==0) return true; return false; }
Packet* CPlaylist::ReturnNextVideoPacket() { CAutoLock vectorLock(&m_sectionVector); firstPacketRead=true; Packet * ret = (*m_itCurrentVideoPlayBackClip)->ReturnNextVideoPacket(playlistFirstPacketTime); if (ret) { ret->nPlaylist=nPlaylist; } else { if ((m_itCurrentVideoPlayBackClip+1) == m_vecClips.end()) { SetEmptiedVideo(); } else { (*(m_itCurrentVideoPlayBackClip))->Superceed(SUPERCEEDED_VIDEO_RETURN); m_itCurrentVideoPlayBackClip++; ret=ReturnNextVideoPacket(); } } return ret; }
void CPlaylist::SetVideoPMT(AM_MEDIA_TYPE * pmt, int nClip) { CAutoLock vectorLock(&m_sectionVector); (*m_itCurrentVideoSubmissionClip)->SetVideoPMT(pmt); }