Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
void CTsDemuxer::OnAdtsFrame(const CAdtsParser *pAdtsParser, const CAdtsFrame *pFrame)
{
	// 最初のMPEG2シーケンスのトリガを待つ
//	if(m_bLipSyncEnable && m_bWaitingForVideo)return;
	// ADTSフレーム受信、下位デコーダにデータを渡す
	OutputMedia(const_cast<CAdtsFrame *>(pFrame), OUTPUT_AUDIO);
}
Esempio n. 4
0
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;
}
Esempio n. 5
0
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;
}
Esempio n. 6
0
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();
}
Esempio n. 7
0
const bool CMediaDecoder::InputMedia(CMediaData *pMediaData, const DWORD dwInputIndex)
{
	CBlockLock Lock(&m_DecoderLock);

	OutputMedia(pMediaData, dwInputIndex);
	return true;
}
Esempio n. 8
0
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;
}
Esempio n. 9
0
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;
}
Esempio n. 10
0
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;
}
Esempio n. 11
0
void CTsDemuxer::OnMpeg2Sequence(const CMpeg2Parser *pMpeg2Parser, const CMpeg2Sequence *pSequence)
{
	// MPEG2シーケンス受信、下位デコーダにデータを渡す
	OutputMedia(const_cast<CMpeg2Sequence *>(pSequence), OUTPUT_VIDEO);
}