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。 可能的值包括(但并不限于)下表中的项。
返回代码 | 说明 |
---|---|
|
方法成功。 |
|
对于 Direct3D 图面缓冲区,锁定图面时出错。 |
|
此时无法锁定缓冲区。 |
注解
此方法允许调用方访问整个缓冲区,最大大小为 在 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 的行为与 Lock 和 Lock2D 的行为相同,并且在解锁时,将同时从中复制和复制回来。 实现最佳性能的一般指导是尽可能避免使用 IMFMediaBuffer 和 IMF2DBuffer ,而是使用具有最少所需锁标志的 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 |