IMFMediaBuffer::Lock 方法 (mfobjects.h)

允许调用方访问缓冲区中的内存,以便进行读取或写入

语法

HRESULT Lock(
  [out] BYTE  **ppbBuffer,
  [out] DWORD *pcbMaxLength,
  [out] DWORD *pcbCurrentLength
);

参数

[out] ppbBuffer

接收指向缓冲区开头的指针。

[out] pcbMaxLength

接收可写入缓冲区的最大数据量。 此参数可以为 NULL。 IMFMediaBuffer::GetMaxLength 方法返回相同的值。

[out] pcbCurrentLength

接收缓冲区中有效数据的长度(以字节为单位)。 此参数可以为 NULL。 IMFMediaBuffer::GetCurrentLength 方法返回相同的值。

返回值

该方法返回 HRESULT。 可能的值包括(但并不限于)下表中的项。

返回代码 说明
S_OK
方法成功。
D3DERR_INVALIDCALL
对于 Direct3D 图面缓冲区,锁定图面时出错。
MF_E_INVALIDREQUEST
此时无法锁定缓冲区。

注解

此方法允许调用方访问整个缓冲区,最大大小为 在 maxLength 参数中返回的最大大小。 在顿CurrentLength 中返回的值是缓冲区中已有的任何有效数据的大小,可能小于总缓冲区大小。

ppbBuffer 中返回的指针保证有效,只要持有锁,就可以在整个缓冲区中安全地访问指针。 访问完缓冲区后,调用 IMFMediaBuffer::Unlock 以解锁缓冲区。 每次调用 Lock 时,都必须调用 Unlock 一次。 解锁缓冲区后, ppbBuffer 中返回的指针不再有效,不应使用。 通常,最好仅在需要访问缓冲区内存时(而不是更早)调用 Lock

锁定缓冲区不会阻止其他线程调用 Lock,因此不应依赖此方法来同步线程。

此方法可以分配内存,但不会将内存的所有权转让给调用方。 不要释放或释放内存;媒体缓冲区销毁时,媒体缓冲区将释放内存。

如果修改缓冲区的内容,请通过调用 IMFMediaBuffer::SetCurrentLength 更新当前长度。

此方法可能会在内部分配一些内存,因此,如果缓冲区支持 IMF2DBuffer 接口,则应改用 IMF2DBuffer::Lock2D 方法来锁定缓冲区。 对于二维缓冲区, Lock2DSize 方法可能比 Lock 方法更高效,具体取决于指定的 MF2DBuffer_LockFlags 值。 使用 MF2DBuffer_LockFlags_Read 调用 Lock2DSize 时,缓冲区解锁时不会产生复制,使用 MF2DBuffer_LockFlags_Write 调用它不会产生内部缓冲区的副本。 使用 LockFlags_ReadWrite 调用 Lock2DSize 的行为与 LockLock2D 的行为相同,并且在解锁时,将同时从中复制和复制回来。 实现最佳性能的一般指导是尽可能避免使用 IMFMediaBufferIMF2DBuffer ,而是使用具有最少所需锁标志的 IMF2DBuffer2 。 请注意,如果使用 Lock2D 锁定缓冲区, Lock 方法可能会返回MF_E_INVALIDREQUEST。

如果安装了 Windows Media Format 11 SDK 可再发行组件,则此接口在以下平台上可用:

  • Windows XP with Service Pack 2 (SP2) 及更高版本。
  • Windows XP Media Center Edition 2005 KB900325 (windows XP Media Center Edition 2005) 和KB925766 (2006 年 10 月 Windows XP Media Center Edition 更新汇总) 安装。

要求

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

另请参阅

IMFMediaBuffer

媒体缓冲区