STDMETHODIMP CTSProcessor::OutputPacket(Interface::ITSPacket *pPacket) { if (pPacket == nullptr) return E_POINTER; ITsMediaData *pTsMediaData; if (SUCCEEDED(pPacket->QueryInterface(IID_PPV_ARGS(&pTsMediaData)))) { CMediaData *pMediaData = pTsMediaData->GetMediaData(); if (!m_fSourceProcessor && pPacket->GetModified() == S_OK) { #ifndef _DEBUG CTsPacket *pTsPacket = static_cast<CTsPacket*>(pMediaData); pTsPacket->ReparsePacket(); #else CTsPacket *pTsPacket = dynamic_cast<CTsPacket*>(pMediaData); _ASSERT(pTsPacket != nullptr); if (pTsPacket->ParsePacket() != CTsPacket::EC_VALID) { pTsMediaData->Release(); return E_FAIL; } #endif } OutputMedia(pMediaData); pTsMediaData->Release(); } else { HRESULT hr; ULONG Size = 0; hr = pPacket->GetSize(&Size); if (FAILED(hr)) return hr; BYTE *pData = nullptr; hr = pPacket->GetData(&pData); if (FAILED(hr)) return hr; if (Size == 0 || pData == nullptr) return E_FAIL; if (m_fSourceProcessor) { if (m_OutputPacket.SetData(pData, Size) != Size) return E_OUTOFMEMORY; } else { if (Size != TS_PACKETSIZE) return E_FAIL; if (m_OutputPacket.SetData(pData, TS_PACKETSIZE) != TS_PACKETSIZE) return E_OUTOFMEMORY; if (m_OutputPacket.ParsePacket() != CTsPacket::EC_VALID) return E_FAIL; } OutputMedia(&m_OutputPacket); } return S_OK; }
bool inline CTsPacketParser::ParsePacket() { bool bOK; // 入力カウントインクリメント m_InputPacketCount++; // パケットを解析/チェックする switch (m_TsPacket.ParsePacket(m_abyContCounter)) { case CTsPacket::EC_CONTINUITY: m_ContinuityErrorPacketCount++; case CTsPacket::EC_VALID: { #if 0 // PAT の無い状態をシミュレート if (m_TsPacket.GetPID() == PID_PAT) { bOK = true; break; } #endif if (m_PATGenerator.StorePacket(&m_TsPacket) && m_bGeneratePAT) { if (m_PATGenerator.GetPAT(&m_PATPacket)) { OutputMedia(&m_PATPacket); } } // 次のデコーダにデータを渡す if (m_bOutputNullPacket || m_TsPacket.GetPID() != 0x1FFFU) { // 出力カウントインクリメント OutputMedia(&m_TsPacket); m_OutputPacketCount++; } } bOK=true; break; case CTsPacket::EC_FORMAT: case CTsPacket::EC_TRANSPORT: // エラーカウントインクリメント m_ErrorPacketCount++; bOK=false; break; } // サイズをクリアし次のストアに備える m_TsPacket.ClearSize(); return bOK; }
void CTsDemuxer::OnAdtsFrame(const CAdtsParser *pAdtsParser, const CAdtsFrame *pFrame) { // 最初のMPEG2シーケンスのトリガを待つ // if(m_bLipSyncEnable && m_bWaitingForVideo)return; // ADTSフレーム受信、下位デコーダにデータを渡す OutputMedia(const_cast<CAdtsFrame *>(pFrame), OUTPUT_AUDIO); }
const bool CTsPacketCounter::InputMedia(CMediaData *pMediaData, const DWORD dwInputIndex) { CBlockLock Lock(&m_DecoderLock); /* if (dwInputIndex >= GetInputNum()) return false; CTsPacket *pTsPacket = dynamic_cast<CTsPacket *>(pMediaData); // 入力メディアデータは互換性がない if(!pTsPacket)return false; */ CTsPacket *pTsPacket = static_cast<CTsPacket *>(pMediaData); m_InputPacketCount.Increment(); m_PidMapManager.StorePacket(pTsPacket); if (m_TargetServiceID == 0 && pTsPacket->IsScrambled()) m_ScrambledPacketCount.Increment(); OutputMedia(pTsPacket); return true; }
bool inline CTsPacketParser::ParsePacket(void) { bool bOK; // 入力カウントインクリメント m_InputPacketCount++; // パケットを解析/チェックする switch (m_TsPacket.ParsePacket(m_abyContCounter)) { case CTsPacket::EC_CONTINUITY: m_ContinuityErrorPacketCount++; case CTsPacket::EC_VALID: // 次のデコーダにデータを渡す if (m_bOutputNullPacket || m_TsPacket.GetPID() != 0x1FFFU) { // 出力カウントインクリメント OutputMedia(&m_TsPacket); m_OutputPacketCount++; } bOK=true; break; case CTsPacket::EC_FORMAT: case CTsPacket::EC_TRANSPORT: // エラーカウントインクリメント m_ErrorPacketCount++; bOK=false; break; } // サイズをクリアし次のストアに備える m_TsPacket.ClearSize(); return bOK; }
void inline CTsPacketParser::ParsePacket(void) { // パケットを解析する m_TsPacket.ParseHeader(); // パケットをチェックする if(m_TsPacket.CheckPacket(&m_abyContCounter[m_TsPacket.GetPID()])){ // 入力カウントインクリメント if(m_dwInputPacketCount < 0xFFFFFFFFUL)m_dwInputPacketCount++; // 次のデコーダにデータを渡す if(m_bOutputNullPacket || (m_TsPacket.GetPID() != 0x1FFFU)){ // 出力カウントインクリメント if(m_dwOutputPacketCount < 0xFFFFFFFFUL)m_dwOutputPacketCount++; OutputMedia(&m_TsPacket); } } else{ // エラーカウントインクリメント if(m_dwErrorPacketCount < 0xFFFFFFFFUL)m_dwErrorPacketCount++; } // サイズをクリアし次のストアに備える m_TsPacket.ClearSize(); }
const bool CMediaDecoder::InputMedia(CMediaData *pMediaData, const DWORD dwInputIndex) { CBlockLock Lock(&m_DecoderLock); OutputMedia(pMediaData, dwInputIndex); return true; }
const bool CMediaGrabber::InputMedia(CMediaData *pMediaData, const DWORD dwInputIndex) { if(dwInputIndex > GetInputNum())return false; // コールバックに通知する if(m_pfnMediaGrabFunc)m_pfnMediaGrabFunc(pMediaData, m_pMediaGrabParam); // 下位デコーダにデータを渡す OutputMedia(pMediaData); return true; }
const bool CMediaTee::InputMedia(CMediaData *pMediaData, const DWORD dwInputIndex) { CBlockLock Lock(&m_DecoderLock); /* if (dwInputIndex >= GetInputNum()) return false; */ // 下位デコーダにデータを渡す for (DWORD dwOutIndex = 0UL ; dwOutIndex < GetOutputNum() ; dwOutIndex++) { OutputMedia(pMediaData, dwOutIndex); } return true; }
const bool CProgManager::InputMedia(CMediaData *pMediaData, const DWORD dwInputIndex) { if(dwInputIndex >= GetInputNum())return false; CTsPacket *pTsPacket = static_cast<CTsPacket *>(pMediaData); // 入力メディアデータは互換性がない if(!pTsPacket)return false; // PIDルーティング m_PidMapManager.StorePacket(pTsPacket); // 次のフィルタにデータを渡す OutputMedia(pMediaData); return true; }
void CTsDemuxer::OnMpeg2Sequence(const CMpeg2Parser *pMpeg2Parser, const CMpeg2Sequence *pSequence) { // MPEG2シーケンス受信、下位デコーダにデータを渡す OutputMedia(const_cast<CMpeg2Sequence *>(pSequence), OUTPUT_VIDEO); }