DirecShow4 Stop、Pause、Run的实现

本文详细介绍了DirectShow中Filter状态转换的过程,包括Stop、Pause和Run三个状态对应的实现机制。通过调用不同Pin的状态变更方法(Inactive、Active和Run),文章展示了如何在各个状态间进行转换。
//Filter调用Stop,实际上就是调用Filter的所有Pin的Inactive函数
STDMETHODIMP CBaseFilter::Stop()
{
 CAutoLock cObjectLock(m_pLock);
 HRESULT hr=NOERROR;
 //notify all pins of the state change
 if(m_State!=State_Stopped)
 {
  int cPins=GetPinCount();
  for(int c=0;c<cPins;c++)
  {
   CBasePin *pPin=GetPin(c);
   //仅在完成连接的Pin上调用Inactive函数,如果Inactive函数返回一个错误值,则暂时
   //忽略,以使所有Pin都有机会被调用Inactive
   if(pPin->IsConnected())
   {
    HRESULT hrTmp=pPin->Inactive();
    if(FAILED(hrTmp)&&SUCCEEDED(hr))
    {
     hr=hrTmp;
    }
   }
  }
 }
 m_State=State_Stopped;
 return hr;
}
//Filter调用Pause,实际上就是调用Filter的所有Pin的Active函数
STDMETHODIMP CBaseFilter::Pause()
{
 CAutoLock cObjectLock(m_pLock);
 //notify all pins of the change to active state
 if(m_State==State_Stopped)
 {
  int cPins=GetPinCount();
  for(int c=0;c<cPins;c++)
  {
   CBasePin *pPin=GetPin(c);
   //仅在完成连接的Pin上调用Active函数,如果其中有一个Pin上的Active函数调用
   //失败,则让CBaseFilter::Pause直接返回这个错误值
   if(pPin->IsConnected())
   {
    HRESULT hr=pPin->Active();
    if(FAILED(hr))
    {
     return hr;
    }
   }
  }
 }
 m_State=State_Paused;
 return S_OK;
}
//Filter调用Run,实际上就是调用Filter的所有Pin的Run函数
STDMETHODIMP CBaseFilter::Run(REFERENCE_TIME tStart)
{
 CAutoLock cObjectLock(m_pLock);
 //remember the stream time offset
 m_tStart=tStart;
 //暂停状态是Filter从停止到运行切换的必经状态!
 if(m_State==State_Stopped)
 {
  HRESULT hr=Pause();
  if(FAILED(hr))
  {
   return hr;
  }
 }
 //notify all pins of the change to active state
 if(m_State!=State_Running)
 {
  int cPins=GetPinCount();
  for(int c=0;c<cPins;c++)
  {
   CBasePin *pPin=GetPin(c);
   //仅在完成连接的Pin上调用Run函数
   if(pPin->IsConnected())
   {
    HRESULT hr=pPin->Run(tStart);
    if(FAILED(hr))
    {
     return hr;
    }
   }
  }
 }
 m_State=State_Running;
 return S_OK;
}

转载于:https://www.cnblogs.com/xiaomi-daming/p/11556082.html

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值