directX--大约CSource和CSourceStream (谁在叫fillbuffer)
派生自CAMThread和CBaseOutputPin
l 成员变量:
CSource *m_pFilter; // The parent of this stream//在构造的时候作为输入參数
l 新添加的virtual函数:
// Override this to provide the worker thread a means of processing a buffer
virtual HRESULT FillBuffer(IMediaSample *pSamp) PURE;
// Called as the thread is created/destroyed - use to perform
// jobs such as start/stop streaming mode
// If OnThreadCreate returns an error the thread will exit.
virtual HRESULT OnThreadCreate(void) {return NOERROR;};
virtual HRESULT OnThreadDestroy(void) {return NOERROR;};
virtual HRESULT OnThreadStartPlay(void) {return NOERROR;};
virtual HRESULT DoBufferProcessingLoop(void); // the loop executed whilst running
{
Command com;
OnThreadStartPlay();//你能够重载这个函数,能够在play之前作一些操作
do
{
while (!CheckRequest(&com))//
//Determines if a command is waiting for the thread.
//TRUE if the pCom parameter contains a command; otherwise, returns FALSE
{
IMediaSample *pSample;
HRESULT hr = GetDeliveryBuffer(&pSample,NULL,NULL,0);
//这个函数是baseoutputpin的成员函数,返回一块空白的内存区域。须要去填充数据的
//实际上是调用IMemAllocator::GetBuffer函数来实现的
if (FAILED(hr)) { Sleep(1); continue;}
// Virtual function user will override.
//得到数据之后,就填充数据
hr = FillBuffer(pSample);
if (hr == S_OK)
{ hr = Deliver(pSample); pSample->Release();if(hr != S_OK) return S_OK;}
//上面的这个函数调用的是This method calls the IMemInputPin::Receive method on the input pin. //Receive can block if the IMemInputPin::ReceiveCanBlock method returns S_OK.
//这样你的接收的filter就堵塞去接收数据
else if (hr == S_FALSE)
{ pSample->Release();DeliverEndOfStream();return S_OK;}
else
{
pSample->Release();DeliverEndOfStream();
m_pFilter->NotifyEvent(EC_ERRORABORT, hr, 0);
return hr;
}
}
if (com == CMD_RUN || com == CMD_PAUSE) { Reply(NOERROR); }
else if (com != CMD_STOP) { Reply((DWORD) E_UNEXPECTED);}
}
while (com != CMD_STOP);
return S_FALSE;
}
上面的reply是以下的一个CAMThread的函数
上面BOOL CheckRequest(Command *pCom) { return CAMThread::CheckRequest( (DWORD *) pCom); }
继承的CBasePin的virtual函数:
HRESULT Active(void); // Starts up the worker thread
{
CAutoLock lock(m_pFilter->pStateLock());
if (m_pFilter->IsActive()) {return S_FALSE;}
if (!IsConnected()) {return NOERROR;}
hr = CBaseOutputPin::Active();
if (FAILED(hr)) {return hr;}
ASSERT(!ThreadExists());
// start the thread
if (!Create()) {return E_FAIL;}
// Tell thread to initialize. If OnThreadCreate Fails, so does this.
hr = Init();
if (FAILED(hr)) return hr;
return Pause();
}
HRESULT Inactive(void); // Exits the worker thread.
{
CAutoLock lock(m_pFilter->pStateLock());
if (!IsConnected()) {return NOERROR;}
// !!! need to do this before trying to stop the thread, because
// we may be stuck waiting for our own allocator!!!
hr = CBaseOutputPin::Inactive(); // call this first to Decommit the allocator
if (FAILED(hr)) {return hr;}
if (ThreadExists())
{
hr = Stop();if (FAILED(hr)) {return hr;}
hr = Exit();if (FAILED(hr)) {return hr;}
Close(); // Wait for the thread to exit, then tidy up.
}
return NOERROR;
}
virtual HRESULT CheckMediaType(const CMediaType *pMediaType);
{
// 默认仅仅支持一种格式,即仅仅调用新添加的GetMediaType函数得到MediaType,
// 与输入的Type进行比較
}
virtual HRESULT GetMediaType(int iPosition, CMediaType *pMediaType); // List pos. 0-n
{
// 推断iPosition必须为0。返回新添加的GetMediaType函数
}
l 操作函数:
HRESULT Init(void) { return CallWorker(CMD_INIT); }
HRESULT Exit(void) { return CallWorker(CMD_EXIT); }
HRESULT Run(void) { return CallWorker(CMD_RUN); }
HRESULT Pause(void) { return CallWorker(CMD_PAUSE); }
HRESULT Stop(void) { return CallWorker(CMD_STOP); }
我们通过上面的代码发现,CAMThread和CBaseOutputPin关联非常紧密,以下我们来看看CAMThread是一个什么样的类
l CAMThread的virtual函数
// override these if you want to add thread commands
// Return codes > 0 indicate an error occured
virtual DWORD ThreadProc(void); // the thread function
{
// 整个函数实现了一个同步的通讯Thread。
Command com;
do { com = GetRequest();if (com != CMD_INIT) { Reply((DWORD) E_UNEXPECTED);} }
while (com != CMD_INIT);
hr = OnThreadCreate(); // perform set up tasks
if (FAILED(hr))
{
OnThreadDestroy();
Reply(hr); // send failed return code from OnThreadCreate
return 1;
}
Reply(NOERROR);
Command cmd;
do
{
cmd = GetRequest();
switch (cmd) {
case CMD_EXIT: Reply(NOERROR); break;
case CMD_RUN:
case CMD_PAUSE:Reply(NOERROR); DoBufferProcessingLoop();break;
case CMD_STOP: Reply(NOERROR); break;
default: Reply((DWORD) E_NOTIMPL); break;}
}
while (cmd != CMD_EXIT);
hr = OnThreadDestroy(); // tidy up.
if (FAILED(hr)) { return 1;}
return 0;
}
l Constructor:
// increments the number of pins present on the filter
CSourceStream(TCHAR *pObjectName, HRESULT *phr, CSource *ps, LPCWSTR pPinName)
: CBaseOutputPin(pObjectName, ps, ps->pStateLock(), phr, pPinName),
m_pFilter(ps) {*phr = m_pFilter->AddPin(this);}
l Deconstructor:
~CSourceStream(void) {m_pFilter->RemovePin(this);}
这个类要实现就是这个函数了,注意Reply函数常常调用,由于
CAMThread::Reply(DWORD dw)
{
m_dwReturnVal = dw;
// The request is now complete so CheckRequest should fail from
// now on
//
// This event should be reset BEFORE we signal the client or
// the client may Set it before we reset it and we'll then
// reset it (!)
m_EventSend.Reset();
// Tell the client we're finished
m_EventComplete.Set();
}
版权声明:本文博客原创文章。博客,未经同意,不得转载。
directX--大约CSource和CSourceStream (谁在叫fillbuffer)的更多相关文章
- directX--关于CSource和CSourceStream (谁调用了fillbuffer)
CSourceStream类,是CSource类的OutputPin[source.h/source.cpp]派生自CAMThread和CBaseOutputPinl 成员变量: CS ...
- Windows 常用运行库下载 (DirectX、VC++、.Net Framework等)
经常听到有朋友抱怨他的电脑运行软件或者游戏时提示缺少什么 d3dx9_xx.dll 或 msvcp71.dll.msvcr71.dll又或者是 .Net Framework 初始化之类的错误而无法正常 ...
- DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记
今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...
- “为什么DirectX里表示三维坐标要建一个4*4的矩阵?”
0x00 前言 首先要说明的是,本文的标题事实上来自于知乎上的一个同名问题:为什么directX里表示三维坐标要建一个4*4的矩阵? - 编程 .因此,正如Milo Yip大神所说的这个标题事实上是存 ...
- VS2015+Win10 调试DirectX 报错
安装完Win10调试程序突然在这个地方报错: #if (defined(DEBUG) || defined(_DEBUG)) deviceFlags |= D3D11_CREATE_DEVICE_DE ...
- Microsoft Windows* SDK May 2010 或较新版本(兼容 2010 年 6 月 DirectX SDK)GPU Detect
原文链接 下载代码样本 特性/描述 日期: 2016 年 5 月 5 日 GPU Detect 是一种简短的示例,演示了检测系统中主要显卡硬件(包括第六代智能英特尔® 酷睿™ 处理器产品家族)的方式. ...
- DirectX runtime
DirectX 9.0 runtime etc https://www.microsoft.com/en-us/download/details.aspx?id=7087 DirectX 11 run ...
- DirectX游戏编程(一):创建一个Direct3D程序
一.环境 Visual Studio 2012,DirectX SDK (June 2010) 二.准备 1.环境变量(如没有配置请添加) 变量名:DXSDK_DIR 变量值:D:\Software\ ...
- C#使用 DirectX SDK 9做视频播放器 并在视频画线添加文字 VMR9
视频图像处理系列 索引 VS2013下测试通过. 在百度中搜索关键字“DirectX SDk”,或者进入微软官网https://www.microsoft.com/en-us/download/det ...
随机推荐
- JS创建 trim() 方法,此方法在IE7、IE8中不存在 需要自定义
function trim(str){ //创建空格对象 var space = new String(" "); /* str = trimLeft(str,space); st ...
- 【Android接口实现】ActionBar利用整理的一些细节
转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 关于ActionBar的使用,非常多大神早就已经写了非常好的文章进行了介绍,所以ActionBar的基本使用 ...
- HDU-3502-Huson's Adventure Island(BFS+如压力DP)
Problem Description A few days ago, Tom was tired of all the PC-games, so he went back to some old F ...
- BackTrack5 (BT5)无线password破解教程WPA/WPA2-PSK无线password皴
昨天公布了BackTrack5 (BT5)无线weppassword破解教程之minidwep-gtk破解法一文,对BT5下破解wep无线password的简单方法做了介绍,今天奶牛为朋友们介绍下怎样 ...
- IOT(Index Organized Table)
我们知道一般的表都以堆(heap)的形式来组织的,这是无序的组织方式.Oracle还提供了一种有序的表,它就是索引组织表,简称IOT表.IOT表上必须要有主键,而IOT表本身不对应segment,表里 ...
- 【原创】shadowebdict开发日记:基于linux的简明英汉字典(四)
全系列目录: [原创]shadowebdict开发日记:基于linux的简明英汉字典(一) [原创]shadowebdict开发日记:基于linux的简明英汉字典(二) [原创]shadowebdic ...
- T-SQL基础(1) - T-SQL查询和编程基础
第一范式: 第一范式要求表中的行必须是唯一的,属性应该是原子的(atomic).这个范式对于关系的定义来说是冗余的,换句话说,如果一个表真可以表示一个关系,那么它一定符合第一范式. 行的唯一性是可以通 ...
- 【剑指offer】打印单列表从尾部到头部
转载请注明出处:http://blog.csdn.net/ns_code/article/details/25028525 剑指offer上的第五题,在九度OJ上測试通过. 时间限制:1 秒 内存限制 ...
- minihomepage.exe 百度视频迷你主页
百度视频最近动作可真.延续"DHot.exe 热点资讯"之后,又在桌面上出现了Tips窗体,例如以下图: 尽管是迷你的,可还是把其他桌面图标给挡了啊! 突然出来这么个窗体.我还以为 ...
- swift的struct本节描述结构的类型
<span style="font-size:24px;">struct David { var x = 0;//一个结构的定义,两个字段x,y var y = 0;/ ...