自定义过滤器不兼容?
Custom filter is incompatible?
我在 DirectShow 中创建了一个名为 decryption 的自定义过滤器,但是当我尝试将 MP4 的输出连接到我的自定义过滤器的输入时,使用 GraphStudioNext 给了我一个 "VFW_E_NO_ACCEPTABLE_TYPES (0x80040207)"。
// Media Types
const AMOVIESETUP_MEDIATYPE sudPinTypes =
{
&MEDIATYPE_Stream,
&MEDIASUBTYPE_NULL
};
// Pins
const AMOVIESETUP_PIN psudPins[] =
{
{ L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, L"Output", 1, &sudPinTypes },
{ L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, L"Input", 1, &sudPinTypes }
};
// Filters
const AMOVIESETUP_FILTER sudAudioVolume =
{
&CLSID_Decryption,
L"Decryption",
MERIT_NORMAL,
2,
psudPins
};
HRESULT DecryptionFilter::CheckInputType(const CMediaType *mtIn)
{
//Streaming
if (mtIn->majortype != MEDIATYPE_Stream) return E_FAIL;
if (mtIn->subtype != MEDIATYPE_NULL) return E_FAIL;
return S_OK;
}
HRESULT DecryptionFilter::CheckTransform(const CMediaType *mtIn, const CMediaType *mtOut)
{
HRESULT hr = CheckInputType(mtIn);
if (FAILED(hr)) return hr;
if (mtIn->majortype != MEDIATYPE_Stream) return E_FAIL;
if (mtIn->subtype != MEDIATYPE_NULL) return E_FAIL;
return S_OK;
}
我通过 GraphStudioNext 调试并且
- 源输出引脚的 "connectionType" 是 PIN_CONNECTION_TYPE_STREAM
- 自定义滤波器输入引脚的 "connectionType" 是
PIN_CONNECTION_TYPE_OTHER
我的图表是这样的:
源过滤器和自定义过滤器的属性
关于为什么我的过滤器无法连接的任何线索?谢谢!
您的过滤器不兼容,因为它没有实现与您正在模拟的 File Source Filter 相同的功能。具体来说,你需要实现IAsyncReader
接口。
此外,GDCL 源代码可用 - 您可以步进源代码并使用调试器确定确切的问题。
我在 DirectShow 中创建了一个名为 decryption 的自定义过滤器,但是当我尝试将 MP4 的输出连接到我的自定义过滤器的输入时,使用 GraphStudioNext 给了我一个 "VFW_E_NO_ACCEPTABLE_TYPES (0x80040207)"。
// Media Types
const AMOVIESETUP_MEDIATYPE sudPinTypes =
{
&MEDIATYPE_Stream,
&MEDIASUBTYPE_NULL
};
// Pins
const AMOVIESETUP_PIN psudPins[] =
{
{ L"Input", FALSE, FALSE, FALSE, FALSE, &CLSID_NULL, L"Output", 1, &sudPinTypes },
{ L"Output", FALSE, TRUE, FALSE, FALSE, &CLSID_NULL, L"Input", 1, &sudPinTypes }
};
// Filters
const AMOVIESETUP_FILTER sudAudioVolume =
{
&CLSID_Decryption,
L"Decryption",
MERIT_NORMAL,
2,
psudPins
};
HRESULT DecryptionFilter::CheckInputType(const CMediaType *mtIn)
{
//Streaming
if (mtIn->majortype != MEDIATYPE_Stream) return E_FAIL;
if (mtIn->subtype != MEDIATYPE_NULL) return E_FAIL;
return S_OK;
}
HRESULT DecryptionFilter::CheckTransform(const CMediaType *mtIn, const CMediaType *mtOut)
{
HRESULT hr = CheckInputType(mtIn);
if (FAILED(hr)) return hr;
if (mtIn->majortype != MEDIATYPE_Stream) return E_FAIL;
if (mtIn->subtype != MEDIATYPE_NULL) return E_FAIL;
return S_OK;
}
我通过 GraphStudioNext 调试并且
- 源输出引脚的 "connectionType" 是 PIN_CONNECTION_TYPE_STREAM
- 自定义滤波器输入引脚的 "connectionType" 是
PIN_CONNECTION_TYPE_OTHER
我的图表是这样的:
源过滤器和自定义过滤器的属性
关于为什么我的过滤器无法连接的任何线索?谢谢!
您的过滤器不兼容,因为它没有实现与您正在模拟的 File Source Filter 相同的功能。具体来说,你需要实现IAsyncReader
接口。
此外,GDCL 源代码可用 - 您可以步进源代码并使用调试器确定确切的问题。