Share via


IMF2DBuffer2::Lock2DSize 方法 (mfobjects.h)

讓呼叫端能夠存取緩衝區中的記憶體。

語法

HRESULT Lock2DSize(
  [in]  MF2DBuffer_LockFlags lockFlags,
  [out] BYTE                 **ppbScanline0,
  [out] LONG                 *plPitch,
  [out] BYTE                 **ppbBufferStart,
  [out] DWORD                *pcbBufferLength
);

參數

[in] lockFlags

MF2DBuffer_LockFlags列舉的成員,指定是否要鎖定緩衝區進行讀取、寫入或兩者。

[out] ppbScanline0

接收影像中像素頂端數據列第一個字節的指標。 當影像呈現給查看器時,頂端數據列會定義為頂端數據列,而且可能不是記憶體中的第一個數據列。

[out] plPitch

接收表面步進,以位元組為單位。 該步幅可能是負數,表示影像是從記憶體中底部向上導向。

[out] ppbBufferStart

接收記憶體中可存取緩衝區開頭的指標。

[out] pcbBufferLength

接收緩衝區的長度,以位元組為單位。

傳回值

這個方法可以傳回下列其中一個值。

傳回碼 描述
S_OK
成功。
MF_E_INVALIDREQUEST
無效的要求 緩衝區可能已經使用不相容的鎖定旗標來鎖定。 請參閱<備註>。
E_OUTOFMEMORY
記憶體不足,無法完成作業。

備註

當您完成記憶體存取時,請呼叫 IMF2DBuffer::Unlock2D 來解除鎖定緩衝區。 您必須針對 Lock2DSize 的每個呼叫呼叫一次 Unlock2D

這個方法相當於 IMF2DBuffer::Lock2D 方法。 不過, 建議使用Lock2DSize ,因為它可讓呼叫端驗證記憶體指標,而且因為它支援唯讀鎖定。 緩衝區不保證支援 IMF2DBuffer2 介面。 若要存取緩衝區,您應該依照列出的順序嘗試下列方法:

  1. IMF2DBuffer2::Lock2DSize
  2. IMF2DBuffer::Lock2D
  3. IMFMediaBuffer::Lock
ppbBufferStartjsonBufferLength 參數會接收緩衝區內存的界限。 使用這些值來防範緩衝區溢出。 使用 ppbScanline0plPitch 的值來存取影像數據。 如果影像在記憶體中由下而上, ppbScanline0 會指向記憶體中的最後一個掃描行, plPitch 將會是負數。 如需詳細資訊,請參閱 Image Stride

lockFlags 參數會指定緩衝區是否鎖定為只讀存取、只讀存取或讀取/寫入存取。

  • 如果緩衝區已鎖定進行唯讀存取,則無法鎖定該緩衝區進行寫入存取。
  • 如果緩衝區已鎖定進行唯讀存取,則無法鎖定它以進行讀取存取。
  • 如果緩衝區已鎖定進行讀取/寫入存取,則可以鎖定進行讀取或寫入存取。
可能的話,請使用唯讀或只讀鎖定,並避免鎖定緩衝區以進行讀取/寫入存取。 如果緩衝區代表 DirectX 圖形基礎結構 (DXGI) 介面,讀取/寫入鎖定可能會導致 CPU 記憶體與 GPU 記憶體之間的額外複本。

規格需求

需求
最低支援的用戶端 Windows 8 [傳統型應用程式 |UWP 應用程式]
最低支援的伺服器 Windows Server 2012 [傳統型應用程式 |UWP 應用程式]
目標平台 Windows
標頭 mfobjects.h (包含 Mfidl.h)

另請參閱

IMF2DBuffer2