IMFMediaBuffer::Lock 方法 (mfobjects.h)

為呼叫端提供緩衝區內存的存取權,以供讀取或寫入

語法

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

參數

[out] ppbBuffer

接收緩衝區開頭的指標。

[out] pcbMaxLength

接收可寫入緩衝區的最大數據量。 此參數可以是 NullIMFMediaBuffer::GetMaxLength 方法會傳回相同的值。

[out] pcbCurrentLength

接收緩衝區中有效數據的長度,以位元組為單位。 此參數可以是 NullIMFMediaBuffer::GetCurrentLength 方法會傳回相同的值。

傳回值

方法會傳回 HRESULT。 可能的值包括 (但不限於) 下表中的這些值。

傳回碼 描述
S_OK
此方法已成功。
D3DERR_INVALIDCALL
針對 Direct3D 表面緩衝區,鎖定表面時發生錯誤。
MF_E_INVALIDREQUEST
緩衝區目前無法鎖定。

備註

這個方法可讓呼叫端存取整個緩衝區,最多為 在 maxMaxLength 參數中傳回的大小上限。 在 HTTPCurrentLength 中傳回的值是緩衝區中任何已有效數據的大小,可能小於緩衝區大小總計。

ppbBuffer 中傳回的指標保證有效,而且只要保留鎖定,就可以安全地跨整個緩衝區存取。 當您完成存取緩衝區時,請呼叫 IMFMediaBuffer::Unlock 來解除鎖定緩衝區。 您必須針對鎖定的每個呼叫呼叫呼叫一次[解除鎖定]。 解除鎖定緩衝區之後, ppbBuffer 中傳回的指標已不再有效,不應使用。 一般而言,只有在您需要存取緩衝區內存,而不是稍早時,才最好呼叫 Lock

鎖定緩衝區不會防止其他線程呼叫 Lock,因此您不應該依賴這個方法來同步處理線程。

這個方法可能會配置記憶體,但不會將記憶體的擁有權傳送給呼叫端。 請勿釋放或釋放記憶體;媒體緩衝區會在媒體緩衝區終結時釋放記憶體。

如果您修改緩衝區的內容,請呼叫 IMFMediaBuffer::SetCurrentLength 來更新目前的長度。

這個方法可能會內部配置一些記憶體,因此如果緩衝區支援IMF2DBuffer介面,您應該改用IMF2DBuffer::Lock2D方法來鎖定緩衝區。 對於 2D 緩衝區,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 版本 2005) 和 KB925766 (2006 年 10 月更新匯總) 。

規格需求

需求
最低支援的用戶端 Windows Vista [傳統型應用程式 |UWP 應用程式]
最低支援的伺服器 Windows Server 2008 [傳統型應用程式 |UWP 應用程式]
目標平台 Windows
標頭 mfobjects.h (include Mfidl.h)
程式庫 Mfuuid.lib

另請參閱

IMFMediaBuffer

媒體緩衝區