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

问题描述:

我对directshow过滤器还有点新意,并且正在密切关注基类。有一件事情几乎立即出现了CMediaType :: IsPartiallySpecified的基本实现。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; 
} 

它不鼓励在类的其余部分信心。有没有在某处发布勘误表?

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

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

您也会惊讶于IsPartiallySpecified在DirectShow SDK和相关过滤器中几乎没有使用,即使您破解它,其余的仍然可以稳定工作。关于部分指定媒体类型的想法是能够提供过滤器功能的提示。这仍然具有非常有限的用途。

实现并不实际测试子类型。如果指定的格式类型为 ,则媒体类型不被视为部分,如果子类型为GUID_NULL,则即使为 。

部分媒体类型是一样的东西主要类型及亚型只为输入引脚说:“嘿,我没有媒体类型尝试,但我想我有一个想法,它应该大致样子” 。

+0

我不惊讶地发现它没有被使用。我对这个功能并不感兴趣,尤其是我用它来表示基类的质量。 你从哪里得到灰色的报价?到目前为止,我已阅读的MSDN位提到,如果任何介体类型,子类型或格式是GUID_NULL,那么它是部分的。上面的IsPartiallySpecified函数本身的注释如下所示: //类型,子类型或格式类型可以为null。 无论如何,如果不使用它,不应该纠缠于它:) –

+0

请参阅http://msdn.microsoft.com/en-us/library/windows/desktop/dd374739%28v=vs.85%中的“备注” 29。aspx –

+0

谢谢 - 奇怪的是,他们在评论中写了这段话,而不是仅仅测试所有3个案例(因为其他的directshow文档似乎表明你应该这么做)。 –

正如Roman R.所说,DirectShow框架的工作原理非常稳固。它是微软更复杂的API集之一。你应该评估它的表现。 Windows SDK中提供的DirectShow示例是精心挑选的并且可以工作。

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

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

G