CMediaType :: IsPartiallySpecified在基类中被破坏了吗?

时间:2011-11-04 13:36:00

标签: directshow

我仍然对directshow过滤器有点新意,并且正在密切研究基类。几乎立即出现的一件事是CMediaType :: IsPartiallySpecified的基本实现。

它的内容如下:

if ((majortype == GUID_NULL) ||
    (formattype == GUID_NULL)) {
        return TRUE;
} else {
    return FALSE;
}

但肯定应该是:

if ((majortype == GUID_NULL) ||
    (subtype == GUID_NULL) ||
    (formattype == GUID_NULL)) {
        return TRUE;
} else {
    return FALSE;
}

它并没有激发其他课程的信心。是否在某处发布了勘误表?

3 个答案:

答案 0 :(得分:1)

它应该以它的方式阅读,它不应该以您认为应该阅读的方式阅读。

Partial表示故意省略主要类型和/或格式类型。

你也会感到惊讶的是,IsPartiallySpecified几乎没有在DirectShow SDK和依赖过滤器中使用,即使你打破了它,其余的仍然会坚如磐石。围绕部分指定的媒体类型的想法是能够提示过滤器功能。这仍然使用非常有限。

  

实现实际上并未测试子类型。如果有的话   指定的格式类型,媒体类型不被视为部分,甚至   如果子类型是GUID_NULL。

部分媒体类型只是主要类型和子类型,输入引脚说“嘿,我没有媒体类型可以尝试,但我想我知道应该看起来像什么”。

答案 1 :(得分:0)

DirectShow框架,正如Roman R.所说的那样,工作坚如磐石。它是Microsoft提供的更复杂的API集之一。你应该根据它的表现来判断它。 Windows SDK中提供的DirectShow示例经过精心挑选并且可以正常工作。

答案 2 :(得分:0)

还有一点是你错过了。要完全定义媒体类型,您需要一个主要类型和一个格式块,但许多音频过滤器使用FORMAT_WaveFormatEx并依赖波形格式标记来定义子类型,在这些情况下,子类型有效地为GUID_NULL但媒体类型是完全的定义

一般来说,格式块完全定义了媒体,并且既充分又必要。主要类型和子类型旨在允许一定程度的通用数据处理。