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 接口,则不保证基础缓冲区具有连续表示形式,因为每行像素后可能会有额外的填充字节。 当缓冲区不连续时, LockLock2D 方法具有不同的行为:

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

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

要求

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

另请参阅

媒体缓冲区

媒体基础接口

未压缩的视频缓冲区