IMF2DBuffer 接口 (mfobjects.h)

表示包含二维图面(如视频帧)的缓冲区。

继承

IMF2DBuffer 接口继承自 IUnknown 接口。 IMF2DBuffer 也有以下类型的成员:

方法

IMF2DBuffer 接口具有这些方法。

 
IMF2DBuffer::ContiguousCopyFrom

将数据从具有连续格式的缓冲区复制到此缓冲区。
IMF2DBuffer::ContiguousCopyTo

将此缓冲区复制到调用方缓冲区,将数据转换为连续格式。
IMF2DBuffer::GetContiguousLength

检索以连续格式存储缓冲区内容所需的字节数。
IMF2DBuffer::GetScanline0AndPitch

检索指向缓冲区内存和图面步幅的指针。
IMF2DBuffer::IsContiguousFormat

查询缓冲区的本机格式是否连续。
IMF2DBuffer::Lock2D

使调用方能够访问缓冲区中的内存。 (IMF2DBuffer.Lock2D)
IMF2DBuffer::Unlock2D

解锁以前锁定的缓冲区。 每次调用 IMF2DBuffer::Lock2D 时调用此方法一次。

注解

若要获取指向此接口的指针,请在媒体缓冲区上调用 QueryInterface 。

若要使用二维缓冲区,必须知道 步幅,这是从一行像素到下一行像素所需的字节数。 步幅可能大于图像宽度,因为图面可能包含每行像素后的填充字节。 如果像素在内存中自下而上的方向,则步幅也可以为负数。 有关详细信息,请参阅 图像步幅。

每种视频格式都定义 连续 或 打包表示 形式。 此表示形式与系统内存中 DirectX 图面的标准布局兼容,无需额外的填充。 对于 RGB 视频,连续表示形式的音高等于图像宽度(以字节为单位),向上舍入到最近的 DWORD 边界。 对于 YUV 视频,连续表示形式的布局取决于 YUV 格式。 对于平面 YUV 格式,Y 平面的间距可能与 you 和 V 平面不同。

如果媒体缓冲区支持 IMF2DBuffer 接口,则不保证基础缓冲区具有连续表示形式,因为每行像素后可能会有额外的填充字节。 当缓冲区不连续时, Lock 和 Lock2D 方法具有不同的行为:

  • Lock2D 方法返回指向基础缓冲区的指针。 缓冲区可能不连续。
  • Lock 方法返回保证连续的缓冲区。 如果基础缓冲区不连续,则 方法将数据复制到新 缓冲区,Unlock 方法将其复制回原始缓冲区。
调用 Lock2D 方法以本机格式访问二维缓冲区。 本机格式可能不连续。 缓冲区的 IMFMediaBuffer::Lock 方法返回缓冲区的连续表示形式。 但是,这可能需要本机格式的内部副本。 因此,对于二维缓冲区,应使用 Lock2D 方法并避免 使用 Lock 方法。 由于 Lock 方法可能会导致最多两个缓冲区副本,因此 Lock2D 方法通常更高效,应尽可能使用。 若要确定基础缓冲区是否连续,请调用 IMF2DBuffer::IsContiguousFormat。

对于未压缩的图像,缓冲区中的有效数据量取决于图像的宽度、高度和像素布局。 出于此原因,如果调用 Lock2D 来访问缓冲区,请不要依赖于 IMFMediaBuffer::GetCurrentLength 或 IMFMediaBuffer::GetMaxLength 返回的值。 同样,如果修改缓冲区中的数据,则不必调用 IMFMediaBuffer::SetCurrentLength 来更新大小。 通常,应避免在同一媒体缓冲区上混合调用 IMF2DBuffer 和 IMFMediaBuffer 方法。

要求

要求 值
最低受支持的客户端 Windows Vista [桌面应用 | UWP 应用]
最低受支持的服务器 Windows Server 2008 [桌面应用 | UWP 应用]
目标平台 Windows
标头 mfobjects.h (包括 Mfidl.h)

另请参阅

媒体缓冲区

媒体基础接口

未压缩的视频缓冲区