⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cfilternetreceiver.cpp

📁 实现视频点播功能,c_s结构,服务器端共享文件,客户端可以播放,媒体数据传输通过RTP协议,播放通过Directshow
💻 CPP
字号:
//
// CFilterNetReceiver.cpp
//

#include "stdafx.h"
#include "GlobalDefs.h"
#include <streams.h>
#include "CFilterNetReceiver.h"

#include <initguid.h>

// {58E6FA74-AEEA-4129-A1C3-79107B535C6F}
DEFINE_GUID(CLSID_NetReceiver, 
0x58e6fa74, 0xaeea, 0x4129, 0xa1, 0xc3, 0x79, 0x10, 0x7b, 0x53, 0x5c, 0x6f);

////////////////////////////////////////////////////////////////////////////
CFilterNetReceiver::CFilterNetReceiver(LPUNKNOWN punk, HRESULT *phr) : 
CBaseFilter(NAME("Reciever"), punk, &mFilterLock, CLSID_NetReceiver)
{
	mOutPin  = new CNetOutPin(this, phr, L"Out");
	mIsVideo = TRUE;
	mSample  = NULL;
	mIsReal  = FALSE;


	mReceiver.SetOwnerFilter(this);
}

CFilterNetReceiver::~CFilterNetReceiver()
{
	mReceiver.StopReceiving();
	if (mSample)
	{
		mSample->Release();
		mSample = NULL;
	}

	delete mOutPin;
}

int CFilterNetReceiver::GetPinCount()
{
	return 1;
}

CBasePin * CFilterNetReceiver::GetPin(int n)
{
	if (n == 0) 
	{
		return mOutPin;
	}
	else 
	{
		return NULL;
	}
}

STDMETHODIMP CFilterNetReceiver::Stop()
{
	CAutoLock lck(&mFilterLock);
	// Stop receiving to exit blocking
	mReceiver.StopReceiving();
	if (mSample)
	{
		mSample->Release();
		mSample = NULL;
	}

	return CBaseFilter::Stop();
}

BOOL CFilterNetReceiver::GetSampleBuffer(PBYTE * outBuffer)
{
	if (mSample)
	{
		mSample->Release();
		mSample = NULL;
	}

	HRESULT hr = mOutPin->GetDeliveryBuffer(&mSample,NULL,NULL,0);
	if (mSample)
	{
		mSample->GetPointer(outBuffer);
	}
	return SUCCEEDED(hr);
}

BOOL CFilterNetReceiver::DeliverHoldingSample(long inSampleSize)
{
	if (mSample)
	{
		mSample->SetActualDataLength(inSampleSize);
		if(!mIsReal)
    	mSample->SetSyncPoint(TRUE);

		if (mIsVideo)
		{
			// Do not use time stamp for video
			mSample->SetTime(NULL, NULL);
		}
		else
		{
		   
		}

		HRESULT hr = mOutPin->Deliver(mSample);
		mSample->Release();
		mSample = NULL;
		return SUCCEEDED(hr);
	}
	return TRUE;
}

// --- public methods ---
void CFilterNetReceiver::SetupMediaType(long inType, char * inFormat, long inLength)
{	
	if (inType == PT_VideoMediaType)
	{
		mIsVideo = TRUE;
	}
	else
	{
		mIsVideo = FALSE;
	}

	mOutPin->SetupMediaType(inType, inFormat, inLength);	
	// At last, notify the controller to build filter graph and running
	Broadcast(msg_MediaTypeReceived, &mIsVideo);
}

void CFilterNetReceiver::SetStreamSocket(SOCKET inSocket)
{
	mReceiver.Attach(inSocket);
}

// If no data to receive, receiving will block
void CFilterNetReceiver::StartReceiving(void)
{
	mReceiver.StartReceiving();
}

void CFilterNetReceiver::SetGUID(char * GUIDbuf)
{
	Pack_GUID * myGUID=(Pack_GUID *)GUIDbuf;
	majortype=myGUID->majortype;
	subtype=myGUID->subtype;
	formattype=myGUID->formattype;
}

void CFilterNetReceiver::SetReal(BOOL isReal)
{
	mIsReal=isReal;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -