HRESULT CAudioDecFilter::NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate) { HRESULT hr = __super::NewSegment(tStart, tStop, dRate); CAutoLock AutoLock(&m_cPropLock); ResetSync(); return hr; }
HRESULT CAudioDecFilter::BeginFlush() { HRESULT hr = __super::BeginFlush(); CAutoLock AutoLock(&m_cPropLock); if (m_pDecoder) { m_pDecoder->Reset(); } ResetSync(); return hr; }
HRESULT CAudioDecFilter::StartStreaming() { CAutoLock AutoLock(&m_cPropLock); if (m_pDecoder) { m_pDecoder->Open(); } ResetSync(); m_bPassthroughError = false; m_BitRateCalculator.Initialize(); return S_OK; }
bool CTsSrcStream::InputMedia(const CMediaData *pMediaData) { CBlockLock Lock(&m_Lock); if (!m_bEnableSync) { AddData(pMediaData); return true; } /* PTSを同期する処理は、TBS問題対策案(up0357)を元にしています。 */ const CTsPacket *pPacket=static_cast<const CTsPacket*>(pMediaData); const WORD PID=pPacket->GetPID(); if (PID!=m_VideoPID && PID!=m_AudioPID) { AddData(pMediaData); return true; } if (pPacket->m_Header.bPayloadUnitStartIndicator) { const DWORD Size=pPacket->GetPayloadSize(); if (Size<14) { AddData(pMediaData); return true; } const BYTE *pData=pPacket->GetPayloadData(); if (pData==NULL) { AddData(pMediaData); return true; } if (pData[0]!=0 || pData[1]!=0 || pData[2]!=1) { // !PES AddData(pMediaData); return true; } if ((pData[7]&0x80)!=0) { // pts_flag if (PID==m_VideoPID) { m_VideoPTSPrev=m_VideoPTS; m_VideoPTS=GET_PTS(&pData[9]); } else { m_AudioPTSPrev=m_AudioPTS; m_AudioPTS=GET_PTS(&pData[9]); } } } #ifdef BONTSENGINE_1SEG_SUPPORT LONGLONG AudioPTS=m_AudioPTS; if (m_AudioPTSPrev>=0) { if (AudioPTS<m_AudioPTSPrev) AudioPTS+=0x200000000LL; if (AudioPTS>=m_AudioPTSPrev+ERR_PTS_DIFF) { TRACE(TEXT("Reset Audio PTS : Adj=%X%08X Cur=%X%08X Prev=%X%08X\n"), (DWORD)(AudioPTS>>32),(DWORD)AudioPTS, (DWORD)(m_AudioPTS>>32),(DWORD)m_AudioPTS, (DWORD)(m_AudioPTSPrev>>32),(DWORD)m_AudioPTSPrev); AddPoolPackets(); ResetSync(); AudioPTS=-1; } }