CSourceStream类别,它是CSource类别OutputPin[source.h/source.cpp]

派生自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)的更多相关文章

  1. directX--关于CSource和CSourceStream (谁调用了fillbuffer)

    CSourceStream类,是CSource类的OutputPin[source.h/source.cpp]派生自CAMThread和CBaseOutputPinl         成员变量: CS ...

  2. Windows 常用运行库下载 (DirectX、VC++、.Net Framework等)

    经常听到有朋友抱怨他的电脑运行软件或者游戏时提示缺少什么 d3dx9_xx.dll 或 msvcp71.dll.msvcr71.dll又或者是 .Net Framework 初始化之类的错误而无法正常 ...

  3. DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记

    今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...

  4. “为什么DirectX里表示三维坐标要建一个4*4的矩阵?”

    0x00 前言 首先要说明的是,本文的标题事实上来自于知乎上的一个同名问题:为什么directX里表示三维坐标要建一个4*4的矩阵? - 编程 .因此,正如Milo Yip大神所说的这个标题事实上是存 ...

  5. VS2015+Win10 调试DirectX 报错

    安装完Win10调试程序突然在这个地方报错: #if (defined(DEBUG) || defined(_DEBUG)) deviceFlags |= D3D11_CREATE_DEVICE_DE ...

  6. Microsoft Windows* SDK May 2010 或较新版本(兼容 2010 年 6 月 DirectX SDK)GPU Detect

    原文链接 下载代码样本 特性/描述 日期: 2016 年 5 月 5 日 GPU Detect 是一种简短的示例,演示了检测系统中主要显卡硬件(包括第六代智能英特尔® 酷睿™ 处理器产品家族)的方式. ...

  7. DirectX runtime

    DirectX 9.0 runtime etc https://www.microsoft.com/en-us/download/details.aspx?id=7087 DirectX 11 run ...

  8. DirectX游戏编程(一):创建一个Direct3D程序

    一.环境 Visual Studio 2012,DirectX SDK (June 2010) 二.准备 1.环境变量(如没有配置请添加) 变量名:DXSDK_DIR 变量值:D:\Software\ ...

  9. C#使用 DirectX SDK 9做视频播放器 并在视频画线添加文字 VMR9

    视频图像处理系列 索引 VS2013下测试通过. 在百度中搜索关键字“DirectX SDk”,或者进入微软官网https://www.microsoft.com/en-us/download/det ...

随机推荐

  1. Oracle SQL Developer使用

    原文 Oracle SQL Developer使用 比较:   Plsqldev:第三方的,启动软件时快,执行sql查询时很慢 Sqldeveloper:oracle公司的,启动软件时慢,执行sql查 ...

  2. Android 下拉刷新上拉载入效果功能

    应用场景: 在App开发中,对于信息的获取与演示.不可能所有将其获取与演示,为了在用户使用中,给予用户以友好.方便的用户体验,以滑动.下拉的效果动态载入数据的要求就会出现. 为此.该效果功能就须要应用 ...

  3. 【从翻译mos文章】在OGG (Oracle GoldenGate) 正在使用SCHEMATRANDATA如果,需要额外的db patch

    在OGG (Oracle GoldenGate) 正在使用SCHEMATRANDATA如果.需要额外的db patch 参考原始: Patches needed to support SCHEMATR ...

  4. [Unity3D]Unity4全新的动画系统Mecanim

    Unity4.X添加一个新的动画系统,以取代原有的3.X旧的动画系统,全新的动画系统Mecanim是官方推荐,它使我们能够写更少的代码实现连续动画. 效果图 Unity3.X中动画系统播放动画 使用播 ...

  5. spring问题排查-调低日志等级

    问题描写叙述 1. 页面经过一次改动后,提交后页面出现400错误,可是后台并没有输出不论什么错误信息. 2. debug监听应页面对应的提交链接也没有不论什么反应(没有进入后台的controller方 ...

  6. 编译Nginx支持Tcp_warppers

    Tcp wrappers : Transmission Control Protocol (TCP) Wrappers 为由 inetd 生成的服务提供了增强的安全性.TCP Wrappers 是一种 ...

  7. ios 仿新浪微博 UINavigationController 向左滑动时显示上一个控制器的View.

    仿新浪微博 UINavigationController 向左滑动时显示上一个控制器的View. 实现原理,UINavigationController 的 self.view显示时把当前显示的vie ...

  8. SQL Tuning Advisor一个错误ORA-00600: internal error code, arguments: [kesqsMakeBindValue:obj]

    跑SELECT dbms_sqltune.report_tuning_task(:tuning_task) FROM dual;  错误消息,如下面: ORA-00600: internal erro ...

  9. ant利用先进,ant订单具体解释,ant包,ant包装删除编译jar文件

    在日常的项目开发,经常需要我们可以打包测试.特别是,开发环境是windows.实际情况是linux. 这样的话.一个非常大的程序猿将包,其中将包,这些软件包可能非常大,这里是真正的代码会改变的一部分, ...

  10. Light OJ Dynamic Programming

    免费做一样新 1004 - Monkey Banana Problem 号码塔 1005 - Rooks 排列 1013 - Love Calculator LCS变形 dp[i][j][k]对于第一 ...