步骤 3B。 实现 GetMediaType 方法

这是 编写转换筛选器的教程的步骤 3B。

注意

派生自 CTransInPlaceFilter 的筛选器不需要此步骤。

 

CTransformFilter::GetMediaType 方法返回按索引号引用的筛选器的首选输出类型之一。 除非筛选器的输入引脚已连接,否则永远不会调用此方法。 因此,可以使用上游连接的媒体类型来确定首选的输出类型。

编码器通常提供单个首选类型,表示目标格式。 解码器通常支持一系列输出格式,并按降序质量或效率提供它们。 例如,列表可能是 UYVY、Y211、RGB-24、RGB-565、RGB-555 和 RGB-8,按顺序排列。 效果筛选器可能需要输出格式与输入格式之间的完全匹配。

以下示例返回单个输出类型,该类型通过修改输入类型来指定 RLE8 压缩来构造:

HRESULT CRleFilter::GetMediaType(int iPosition, CMediaType *pMediaType)
{
    ASSERT(m_pInput->IsConnected());
    if (iPosition < 0)
    {
        return E_INVALIDARG;
    }
    if (iPosition == 0)
    {
        HRESULT hr = m_pInput->ConnectionMediaType(pMediaType);
        if (FAILED(hr))
        {
            return hr;
        }
        FOURCCMap fccMap = FCC('MRLE'); 
        pMediaType->subtype = static_cast<GUID>(fccMap);
        pMediaType->SetVariableSize();
        pMediaType->SetTemporalCompression(FALSE);

        ASSERT(pMediaType->formattype == FORMAT_VideoInfo);
        VIDEOINFOHEADER *pVih =
            reinterpret_cast<VIDEOINFOHEADER*>(pMediaType->pbFormat);
        pVih->bmiHeader.biCompression = BI_RLE8;
        pVih->bmiHeader.biSizeImage = DIBSIZE(pVih->bmiHeader); 
        return S_OK;
    }
    // else
    return VFW_S_NO_MORE_ITEMS;
}

在此示例中,该方法调用 IPin::ConnectionMediaType 从输入引脚获取输入类型。 然后,它会更改一些字段来指示压缩格式,如下所示:

  • 它使用 FOURCCMap 类从 FOURCC 代码“MRLE”构造的新子类型 GUID。
  • 它调用 CMediaType::SetVariableSize 方法,该方法将 bFixedSizeSamples 标志设置为 FALSE并将 lSampleSize 成员设置为零,指示可变大小的样本。
  • 它调用值为 FALSECMediaType::SetTemporalCompression 方法,指示每个帧都是关键帧。 (此字段仅供信息化,因此可以安全地忽略它。)
  • 它将 biCompression 字段设置为BI_RLE8。
  • 它将 biSizeImage 字段设置为图像大小。

下一 步:步骤 3C。实现 CheckTransform 方法

编写DirectShow筛选器