编写DirectShow Filters—质量控制管理

来源:百度文库 编辑:神马文学网 时间:2024/04/27 19:10:51
编写DirectShow Filters—质量控制管理
质量控制是一种通过filter graph调整数据速率来响应运行性能的机制。如果rendererfilter接收太多数据或太少数据,它会发送一个质量消息。这个质量消息请求数据速率的调节。默认的,质量消息从renderer向上直到达到能响应它(如果有)的filter。应用程序也可以实现一个自定义的质量管理器。如果是这种情况,renderer直接传递质量消息到应用程序的质量管理器。
一、 质量消息
质量消息由Quality结构定义。此结构包含下列成员:
1) Type:由QualityMessageType枚举定义。Famine,表示filter正在接收的数据太少。Flood,表示正在接收的数据太多。
2) Proportion:数据速率的调节,基线是1000。例如,750表示75%,1500表示150%
3) Late:引用时间显示大多数sample到达有多晚。如果sample到达太早此值为负
4) TimeStamp:在大多数最近的sample上的时间戳
例如,假定一个sample的时间戳是240ms在280ms到达renderer,流时间。renderer建立一个Famine类型的质量消息。sample晚到40ms,所以Late是400000。(所有引用时间是100纳秒单位)。TimeStamp是2400000。
对于Proportion成员,renderer可能使用一个运行平均值来计算这个值。或者sample按时到达,并且这个sample是不规则的。在这种情况下renderer可能请求一个小的修正。在另一方面,如果sample一直延迟,renderer可能请求一个更大的修正。
质量控制通过IQualityControl接口来处理。它包含两个方法。
1) Notify : 发送一个质量消息
2) SetSink:指定一个自定义质量管理器
一个实现IQualityControl的对象通过Notify接收质量消息。它既能处理消息也能传递这个消息到另一个对象。如果应用程序调用对象的SetSink方法,这个对象会委托质量控制到指定的质量管理器。
二、 默认质量控制
DirectShow Base Classes 对于视频的质量控制提供了一些缺省的方法。
质量消息从renderer 开始,video renderer 的基类是CBaseVideoRenderer,它有下列行为:
1) 当视频render 接收到sample 的时候,它用sample 上的时间戳和当前的参考时间比较
2) 视频render 产生一个质量消息,在基类中,质量消息的Proportion成员被限制在500(50%)到2000(200%),此  值超出这个范围会导致差的质量改变
3) 默认的,video render发送一个质量消息到upstream的output pin(此PIN连接它的input pin)。用程序可以通过调用setsink方法来重载这种行为。
接下来发生什么依赖于upstream filter。一般来说,它是一个transform filter。transformfilter的基类是CTransformFilter,它使用CTransformInputPin和CTransformOutputPin类来实现input/output pin。同时,这些类有下列行为:
1) CTransformOutputPin::Notify 方法调用CTransformFilter::AlterQuality,它是在filter基类上的一个私有方法。
2) 继承的filter可以重载AlterQuality 方法来处理质量消息,缺省的情况下,AlterQuality忽略质量消息。
3) 如果AlterQuality 不处理质量消息,output pin 调用这个filter上的input pin 上的CBaseInputPin::PassNotify私有方法。
4) PassNotify 方法传递质量消息到适合的地方—接下来的upstream output pin,或者一个自定义质量管理器。
假定没有transform filter 处理质量消息,这个消息最终到达source filter。在基类中,CBasePin::Notify返回 E_NOTIMPL。source filter 如何处理质量消息取决于source filter的特性。一些source,如实时视频捕获,不能执行有意思的质量控制。另外source可以调整他们传递的sample 的速率。
下列图示演示了默认行为
基本videorenderer实现IQualityControl::Notify,它意味你可以传递质量消息到renderer本身。如果设置Proportion成员为少于1000的值,video renderer在要render的每帧间插入一个等待时期,效果是降低renderer。