gpt4 book ai didi

c++ - 过滤器连接问题

转载 作者:行者123 更新时间:2023-11-28 07:03:04 25 4
gpt4 key购买 nike

当我尝试将我的自定义写入过滤器连接到 graphedt 中的 avi mux 过滤器时,它会自动在两者之间添加一个 Microsoft DTV-DVD 音频解码器,这是不需要的,因为我处理视频流。graphedt 是如何决定这样做的,我该如何防止呢?

两个过滤器如何决定它们是否兼容?

这是我的输出引脚的头文件:

#pragma once

#include <streams.h>
#include "MyFilter.h"


class MCMyOutputPin : public CBaseOutputPin
{
private:
// parent
CBaseFilter *mux;
IUnknown *position;

public:
MCMyOutputPin(MyFilter* filter, HRESULT *phr, LPCWSTR pName);
virtual ~MCMyOutputPin();

STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void **ppv);

// overriden
virtual HRESULT CheckMediaType(const CMediaType *pmt);
virtual HRESULT SetMediaType(const CMediaType *pmt);
virtual HRESULT CompleteConnect(IPin *pReceivePin);
virtual HRESULT BreakConnect();
virtual HRESULT GetMediaType(int i, CMediaType *pmt);
virtual HRESULT DecideBufferSize(IMemAllocator *pAlloc, ALLOCATOR_PROPERTIES *pProps);
virtual HRESULT Deliver(IMediaSample* sample);
virtual HRESULT AgreeMediaType(IPin* recievePin, const CMediaType *pmt);

// qual prop
STDMETHODIMP Notify(IBaseFilter *pSender, Quality q);

CMediaType &CurrentMediaType() { return m_mt; }

};

这里是它的实现:

#include "CMyOutPutPin.h"
#include <fstream>

MCMyOutputPin::MCMyOutputPin(MyFilter* parent, HRESULT *phr, LPCWSTR pName) : CBaseOutputPin(NAME("MyOutPutPin"), parent, &parent->m_lock_filter, phr, pName)
{


}

MCMyOutputPin::~MCMyOutputPin()
{

}


STDMETHODIMP MCMyOutputPin::NonDelegatingQueryInterface(REFIID riid, void **ppv)
{
return CBaseOutputPin::NonDelegatingQueryInterface(riid, ppv);
}

HRESULT MCMyOutputPin::CheckMediaType(const CMediaType *pmt)
{

return S_OK;
}

HRESULT MCMyOutputPin::SetMediaType(const CMediaType *pmt)
{

return CBaseOutputPin::SetMediaType(pmt);
}

HRESULT MCMyOutputPin::CompleteConnect(IPin *pReceivePin)
{


return CBaseOutputPin::CompleteConnect(pReceivePin);
}

HRESULT MCMyOutputPin::BreakConnect()
{

return CBaseOutputPin::BreakConnect();
}

HRESULT MCMyOutputPin::GetMediaType(int i, CMediaType *pmt)
{
return CBaseOutputPin::GetMediaType(i, pmt);
}

HRESULT MCMyOutputPin::DecideBufferSize(IMemAllocator *pAlloc, ALLOCATOR_PROPERTIES *pProps)
{

ALLOCATOR_PROPERTIES act;
HRESULT hr;

// by default we do something like this...
pProps->cbAlign = 1;
pProps->cBuffers = 1;
pProps->cbBuffer = this->CurrentMediaType().lSampleSize;
pProps->cbPrefix = 0;

hr = pAlloc->SetProperties(pProps, &act);
if (FAILED(hr)) return hr;

// make sure the allocator is OK with it.
if ((pProps->cBuffers > act.cBuffers) ||
(pProps->cbBuffer > act.cbBuffer) ||
(pProps->cbAlign > act.cbAlign))
return E_FAIL;

return NOERROR;
}

STDMETHODIMP MCMyOutputPin::Notify(IBaseFilter *pSender, Quality q)
{
// right now we don't do anything ...
return NOERROR;
}

HRESULT MCMyOutputPin::Deliver(IMediaSample* sample)
{

std::ofstream outfile;
outfile.open("C:\\TEMP\\yc1.log", std::ios_base::app);
outfile << "receiving data on outputpin" << std::endl;

outfile.close();
m_pInputPin->Receive(sample);
return CBaseOutputPin::Deliver(sample);
//Forward to filter
}

HRESULT MCMyOutputPin::AgreeMediaType(IPin * pin, const CMediaType* pmt)
{
return S_OK;
}

最佳答案

这首先是因为引脚不能直接连接。所以基本上阻止意味着您将无法连接引脚,而是会出现错误。

  • 额外的过滤器插入称为 Intelligent Connect
  • 兼容性是连接的能力,在IPin::ConnectIPin::ReceiveConnection方法中成功

关于c++ - 过滤器连接问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22145395/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com