现在的位置: 首页 > 综合 > 正文

VMR-9实现自定义allocator-presenter大体流程 笔记

2013年10月30日 ⁄ 综合 ⁄ 共 2381字 ⁄ 字号 评论关闭
阅读了许久的源代码。先框架后关键技术。
 

1 跟VMR-9相关的概念

1.1VMR-9

VMR-9( Video Mixing Renderer Filter 9 )视频混合渲染器Filter 9。VMR-9也是一种视频渲染器( Video Renderer ),是一种Filter。这里的所谓视频渲染器就是一套能够解析视频数据并能将其播放的COM( C++类 )组件。

 

1.2allocator-presenter

allocator-presenter叫内存分配管理器。是VMR-9内的一个子组件。allocator-presenter能够分配Direct3D 的表面( Direct3D中存储2D图像数据的内存及Direct3D的surface )。

 

2 VMR体系结构

VMR是4个Video Renderer(Video Renderer、Overlay Mixer、VMR-7、VMR-9)之一。VMR采用了模块化的设计策略,除了几个输入Pin之外,VMR还包含5个子组件。以下图示及各个子组件的描述只是为了体现以下VMR-9的体系结构,初学者不必急于一时将每个组件都搞得很清楚,有那么一个概要框架认可即可。有相关基本概念者可直接跳到3部分。

 

Figure1:VMR-9体系结构

 

2.1合成器Mixer

是一个COM组件,仅当有多个视频流输入时被装载。它用于收集各个输入流的信息,安排它们的Z坐标,决定何时从各个输入Pin之上获得Sample,并调用适当的图像合成器进行实际的合成。它同时还未合成后的输出图像计算时间戳。如果应用程序中设置了要叠加静态图片的功能,合成器负责将这个图片叠加在最上面。

 

2.2图像合成器Image Compositor

是一个COM组件,而且真正完成了图像合成功能。它将多路输入流合成合成到一个DirectDraw或Direct3D表面( 由内存分配管理器提供 )。VMR内部使用了一种默认的图像合成器,以完成一般的二维图像Alpha混合。应用程序也可以提供自定义的图像合成器,以提供更多的二维或三维的图像效果。

 

2.3内存分配管理器 Allocator Presenter

是一个COM组件。负责分配DirectDraw或Direct3D对象,并且与显卡通信,应用程序可以提供自己的内存分配管理器,用于创建DirectDraw或Direct3D对象,并且在显示的时候能够获得访问视频图像数据的能力。

 

2.4内核同步单元 Core Synchronization Unit

是一个COM组件,用于安排视频帧的显示时机。它使用Filter Graph Manager设置进来的参考时钟,并且提供了质量管理和帧报告功能。

 

2.5窗口管理器 Window Manager

是一个静态库。而且只在VMR工作在窗口模式下被使用。

从各个模块完成的功能看,不管VMR工作在何种应用环境中,内存分配管理器和内核同步单元总是必需的,根据不同的应用其它的三个模块是可选的。

以上VMR体系结构,摘自《DirectShow开发指南》,放在这里希望对读者理解vmr-9实现自定义allocator-presenter有帮助。

 

3 为VMR-9实现一个自定义allocator-presenter

3.1VMR-9实现自定义allocator-presenter总结

实现VMR-9的自定义allocator-presenter包含4个层面。

(1)   VMR-9属于一种Filter,应用程序中得创建Filter Graph Manager对象来将Filter加入Filter Graph中进行统一管理。

(2)   VMR-9本身属于COM组件,需要创建VMR-9对象并对VMR-9对象进行配置。

(3)   Allocator-presenter属VMR-9的一种子组件( 属COM组件 ),在自定义时,需要按照实现COM组件的“格式”来实现它。

(4)   完成以上步骤后, VMR-9和Allocator-presenter还属独立的模块。需建立VMR-9组件与Allocator-presenter之间的通信。

 

3.2VMR-9实现自定义allocator-presenter关系图

 

Figure2:VMR-9实现自定义allocator-presenter关系图

 

说明:

(1)    
获取一个对象接口时,用此对象内的
QueryInterface函数实现。

(2)    
allocator-presenter
对象是由自定义类CAllocator定义的,CAllocator必须继承的父类是IVMRImagePresenter9IVMRSurfaceAllocator9两个VMR-9接口。这两个接口内的函数都由VMR-9自动调用。

(3)     将allocator-presenter对象的IVMRSurfaceAllocator9传给VMR-9IVMRSurfaceAllocatorNotify9接口及将VMR-9IVMRSurfaceAllocatorNotify9传递给allocator-presenter重载的AdviseNotify函数就标志着VMR-9和经COM组件形式实现的allocator-presenter之间通信的建立。VMR-9决定何时调用IVMRSurfaceAllocator9IVMRImagePresenter9两个接口的函数,同时allocator-presenter也将系统设备显示器改变的消息传递给VMR-9

(4)    
关于allocator-presenterCOM组件的形式实现这个过程也是一个关键的地方。但这里主要体现VMR-9与自定义allocator-presenter的关系流程。关于自定义allocator-presenter被实现的细节留大神亲自描述较为妥当。

 

此次笔记记录完毕。

抱歉!评论已关闭.