zoukankan      html  css  js  c++  java
  • DirectShow3

    \如何修改系统中已经注册的Filter的Merit值
    typedef struct
    {
     DWORD dwVersion; //版本号
     DWORD dwMerit;  //Merit值
     DWORD dwPinCount; //Pin的数量
     DWORD dwReserved; //保留
    }FILTER_HEADER;
    BOOL SetFilterMerit(const char*inClsid,DWORD inMerit)
    {
     const char* cRegistryEntry="CLSID\{083863F1-70DE-11d0-BD40-00A0C911CE86}\Instance\";
     const long cMaxLength=1024*16;
     BYTE filterData[cMaxLength];
     DWORD actualLength=0;
     \生成Filter信息注册部分的注册表入口
     char szEntry[1000];
     strcpy(szEntry,cRegistryEntry);
     strcat(szEntry,inClsid);
     HKEY hKey=NULL;
     LONG result=::RegOpenKeyEx(HKEY_CLASSES_ROOT,szEntry,0,KEY_ALL_ACCESS,&hKey);
     BOOL pass=(result==ERROR_SUCCESS);
     if(pass)
     {
      \读取FilterData的值
      actualLength=actualLength;
      result=::RegQueryValueEx(hKey,"FilterData",NULL,NULL,filterData,&actualLength);
      pass=(result==ERROR_SUCCESS);
     }
     if(pass)
     {
      \修改FiterData中的Merit部分,然后写回到注册表
      FILTER_HEADER *filterHeader=(FILTER_HEADER *)filterData;
      filterHeader->dwMerit=inMerit;
      result=::RegSetValueEx(hKey,"FilterData",NULL,REG_BINARy,filterData,actualLength);
      pass=(result==ERROR_SUCCESS);
     }
     if(hKey)
     {
      ::RegCloseKey(hKey);
     }
     return pass;
    }
     
    STDMETHODIMP CBaseInputPin::Receive(IMediaSample *pSample)
    {
     CheckPointer(pSample,E_POINTER);
     ValidateReadPtr(pSample,sizeof(IMediaSample));
     ASSERT(pSample);
     \检查Filter内部状态,以及数据流传送状态
     HRESULT hr=CheckStreaming();
     if(S_OK!=hr)
     {
      return hr;
     }
     \查询IMediaSample2接口,获取输入Sample上的属性
     IMediaSample2 *pSample2;
     if(SUCCEEDED(pSample->QueryInterface(IID_IMediaSample2,(void **)&pSample2)))
     {
      hr=pSample2->GetProperties(sizeof(m_SampleProps),(PBYTE)&m_SampleProps);
      pSample2->Release();
      if(FAILED(hr))
      {
       return hr;
      }
     }
     else
     {
      \使用ImediaSample接口获取输入Sample上的属性
      m_SampleProps.cbData=sizeof(m_SampleProps);
      m_SampleProps.dwTypeSpecificFlags=0;
      m_SampleProps.dwStreamId=AM_STREAM_MEDIA;
      m_SampleProps.dwSampleFlags=0;
      if(S_OK==pSample->IsDiscontinuity())
      {
       m_SampleProps.dwSampleFlags|=AM_SAMPLE_DATADISCONTINUITY;
      }
      if(S_OK==pSample->IsPreroll())
      {
       m_SampleProps.dwSampleFlags|=AM_SAMPLE_PREROLL;
      }
      if(S_OK==pSample->IsSyncPoint())
      {
       m_SampleProps.dwSampleFlags|=AM_SAMPLE_SPLICEPOINT;
      }
      if(SUCCEEDED(pSample->GetTime(&m_SampleProps.tStart,&m_SampleProps.tStop)))
      {
       m_SampleProps.dwSampleFlags|=AM_SAMPLE_TIMEVALID|AM_SAMPLE_STOPVALID;
      }
      if(S_OK==pSample->GetMediaType(&m_SampleProps.pMediaType))
      {
       m_SampleProps.dwSampleFlags|=AM_SAMPLE_TYPECHANGED;
      }
      pSample->GetPointer(&m_SampleProps.pbBuffer);
      m_SampleProps.lActual=pSample->GetActualDataLength();
      m_SampleProps.cbBuffer=pSample->GetSize();
     }
     \检测Sample上的媒体类型是否改变
     if(!(m_SampleProps.dwSampleFlags&AM_SAMPLE_TYPECHANGED))
     {
      return NOERROR;
     }
     \检查输入Pin上是否支持这种新的媒体类型。此时,输入Pin应该是支持这种媒体类型
     \的,因为上一级Filter在做出这种媒体类型的动态改变之前,一般会先调用输入Pin
     \上的IPin::QueryAccept接口方法进行确认
     hr=CheckMediaType((CMediaType *)m_SampleProps.pMediaType);
     if(hr==NOERROR)
     {
      return NOERROR;
     }
     m_bRunTimeError=TRUE;
     EndOfStream();
     m_pFilter->NotifyEvent(EC_ERRORABORT,VFN_E_TYPE_NOT_ACCEPTED,0);
     return VFW_E_INVALIDMEDIATYPE; 
    }
  • 相关阅读:
    数学(动态规划,GCD):COGS 469. [NOI2010]能量采集
    网络流(二分):BZOJ 3993: [SDOI2015]星际战争
    分治(CDQ):[BOI2007]摩基亚Mokia
    树状数组(二维):COGS 1532 [IOI2001]移动电话
    斜率优化(CDQ分治,Splay平衡树):BZOJ 1492: [NOI2007]货币兑换Cash
    树形结构的维护:BZOJ 3991: [SDOI2015]寻宝游戏
    贪心 uvaoj 11134 Fabled Rooks
    动态规划(模型转换):uvaoj 1625 Color Length
    贪心 BZOJ 3671:[Noi2014]随机数生成器
    字符串(后缀数组):POJ 3415 Common Substrings
  • 原文地址:https://www.cnblogs.com/xiaomi-daming/p/11510844.html
Copyright © 2011-2022 走看看