DirectShow视频渲染的源、目标矩阵

来源:互联网 发布:java 计算逻辑表达式 编辑:程序博客网 时间:2024/06/05 19:29

DirectShow Filter描述MediaType,其成员videoinfoheader及videoinfoheader2下,有两组数组(矩阵),分别是rcSource和rcTarget。

该两组矩阵四个元素分辨描述的是一个矩阵的左上角及右下角坐标点。四个元素分别可以用left、right、top、bottom赋值。

官方文档如下:

https://msdn.microsoft.com/en-us/library/windows/desktop/dd377618(v=vs.85).aspx


翻译:

视频媒体类型的VIDEOINFO,VIDEOINFOHEADER和VIDEOINFOHEADER2格式结构中有三种尺寸。本文解释了它们是什么以及它们是如何工作的。
首先,这些结构的bmiHeader成员中有一个大小。 bmiHeader成员是一个BITMAPINFOHEADER结构,它有自己的宽度和高度成员bmiHeader.biWidth和bmiHeader.biHeight。
其次,这些结构的rcSource成员中有一个矩形;最后,在这些结构的rcTarget成员中有一个矩形。
假设您有两个过滤器A和B,并且这些过滤器使用特定的视频媒体类型相互连接(A在左侧或上游,B在右侧或下游)。
在过滤器A和B之间传递的缓冲区的大小(bmiHeader.biWidth,bmiHeader.biHeight)。过滤器A应该获取由rcSource确定的输入视频的一部分,并拉伸该视频以填充缓冲区的rcTarget部分。使用的输入视频部分是基于rcSource如何与过滤器A和B最初连接的媒体类型(biWidth,biHeight)大小进行比较。如果rcSource为空,则过滤器A使用其整个输入视频。如果rcTarget为空,则过滤器A将填充整个输出缓冲区。
例如,假设滤波器A正在接收160 x 120像素的视频数据。还假定过滤器A连接到具有以下介质类型的过滤器B.
(biWidth,biHeight):320,240
rcSource:(0,0,0,0)
rcTarget:(0,0,0,0)
这意味着过滤器A将在x和y两个方向上将其接收到的视频拉伸2,并填充320 x 240输出缓冲区。
作为另一个例子,假设滤波器A正在接收160×120视频数据,并且它以下面的媒体类型连接到滤波器B.
(biWidth,biHeight):320,240
rcSource:(0,0,160,240)
rcTarget:(0,0,0,0)
rcSource成员与所连接的缓冲区大小为320,240有关。因为指定的rcSource(0,0,160,240)是缓冲区的左半部分,所以过滤器A将取其输入视频的左半部分,或(0,0,80,120)部分,并且将视频扩展到(320,240)的大小(x方向上4个,y方向上2个)并填充320×240输出缓冲器。
现在假设过滤器A调用CBaseAllocator :: GetBuffer,并且返回的媒体样本附有一个媒体类型,表示过滤器B希望过滤器B提供不同于以前提供的大小或类型的视频。假设新的媒体类型是:
(biWidth,biHeight):640,480
rcSource:(0,0,160,120)
rcTarget:(0,0,80,60)
这意味着媒体样本的缓冲区大小为640 x 480。 rcSource成员相对于原始连接媒体类型(320,240)而不是新媒体类型(640,480),所以rcSource指定要使用输入视频的左上角(25%) 。 (0,0,80,60)的rcTarget指定输入视频的这部分放置在640 x 480输出缓冲区的左上角(80,60)像素中。因为过滤器A正在接收160 x 120视频,所以输入视频的左上角是一个(80,60)块,输出位图的大小相同,不需要拉伸。
滤波器A将不会在输出缓冲器的其他像素中放置任何数据,并且会使这些位保持不变。 rcSource成员由过滤器A和B之间的原始连接媒体类型的biWidth和biHeight所界定,而rcTarget由媒体样本的新biWidth和biHeight所界定。在前面的示例中,rcSource不能超出(0,0,320,240)的边界,并且rcTarget无法超出(0,0,640,480)的边界。

原创粉丝点击