Beispiel #1
0
UInt32 HTTPDecoder::decoding(Exception& ex, UInt8* data,UInt32 size) {
	std::shared_ptr<HTTPPacket>	pPacket(new HTTPPacket(_rootPath));
	UInt32 consumed = pPacket->build(ex, data, size);
	if (consumed)
		receive(pPacket);
	return consumed;
}
STDMETHODIMP CBaseMuxerInputPin::Receive(IMediaSample* pSample)
{
	CAutoLock cAutoLock(&m_csReceive);

	HRESULT hr = __super::Receive(pSample);
	if(FAILED(hr)) return hr;

	CAutoPtr<MuxerPacket> pPacket(new MuxerPacket(this));

	long len = pSample->GetActualDataLength();

	BYTE* pData = NULL;
	if(FAILED(pSample->GetPointer(&pData)) || !pData)
		return S_OK;

	pPacket->pData.SetCount(len);
	memcpy(pPacket->pData.GetData(), pData, len);

	if(S_OK == pSample->IsSyncPoint() || m_mt.majortype == MEDIATYPE_Audio && !m_mt.bTemporalCompression)
	{
		pPacket->flags |= MuxerPacket::syncpoint;
	}

	if(S_OK == pSample->GetTime(&pPacket->rtStart, &pPacket->rtStop))
	{
		pPacket->flags |= MuxerPacket::timevalid;

		pPacket->rtStart += m_tStart; 
		pPacket->rtStop += m_tStart;

		if((pPacket->flags & MuxerPacket::syncpoint) && pPacket->rtStart < m_rtMaxStart)
		{
			pPacket->flags &= ~MuxerPacket::syncpoint;
			pPacket->flags |= MuxerPacket::bogus;
		}

		m_rtMaxStart = max(m_rtMaxStart,  pPacket->rtStart);
	}
	else if(pPacket->flags & MuxerPacket::syncpoint)
	{
		pPacket->flags &= ~MuxerPacket::syncpoint;
		pPacket->flags |= MuxerPacket::bogus;
	}

	if(S_OK == pSample->IsDiscontinuity())
	{
		pPacket->flags |= MuxerPacket::discontinuity;
	}

	pPacket->index = m_iPacketIndex++;

	PushPacket(pPacket);

	return S_OK;
}
STDMETHODIMP CBaseMuxerInputPin::EndOfStream()
{
	CAutoLock cAutoLock(&m_csReceive);

	HRESULT hr = __super::EndOfStream();
	if(FAILED(hr)) return hr;

	ASSERT(!m_fEOS);

	CAutoPtr<MuxerPacket> pPacket(new MuxerPacket(this));
	pPacket->flags |= MuxerPacket::eos;
	PushPacket(pPacket);

	m_fEOS = true;

	return hr;
}