Condividi tramite


Metodo IMFMediaBuffer::Lock (mfobjects.h)

Consente al chiamante di accedere alla memoria nel buffer, per la lettura o la scrittura

Sintassi

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

Parametri

[out] ppbBuffer

Riceve un puntatore all'inizio del buffer.

[out] pcbMaxLength

Riceve la quantità massima di dati che possono essere scritti nel buffer. Questo parametro può essere NULL. Lo stesso valore viene restituito dal metodo IMFMediaBuffer::GetMaxLength .

[out] pcbCurrentLength

Riceve la lunghezza dei dati validi nel buffer, in byte. Questo parametro può essere NULL. Lo stesso valore viene restituito dal metodo FMMediaBuffer::GetCurrentLength .

Valore restituito

Il metodo restituisce un HRESULT. I valori possibili includono, ma non sono limitati a, quelli indicati nella tabella seguente.

Codice restituito Descrizione
S_OK
Il metodo è riuscito.
D3DERR_INVALIDCALL
Per i buffer di superficie Direct3D, si è verificato un errore durante il blocco della superficie.
MF_E_INVALIDREQUEST
Impossibile bloccare il buffer in questo momento.

Commenti

Questo metodo consente al chiamante di accedere all'intero buffer, fino alla dimensione massima restituita nel parametro pcbMaxLength . Il valore restituito in pcbCurrentLength è la dimensione di tutti i dati validi già presenti nel buffer, che potrebbero essere inferiori alle dimensioni totali del buffer.

Il puntatore restituito in ppbBuffer è garantito che sia valido e può essere accessibile in modo sicuro nell'intero buffer finché il blocco viene mantenuto. Al termine dell'accesso al buffer, chiamare FMIMediaBuffer::Unlock per sbloccare il buffer. È necessario chiamare Sblocca una volta per ogni chiamata a Blocco. Dopo aver sbloccato il buffer, il puntatore restituito in ppbBuffer non è più valido e non deve essere usato. In genere, è consigliabile chiamare Lock solo quando è necessario accedere alla memoria del buffer e non in precedenza.

Il blocco del buffer non impedisce ad altri thread di chiamare Lock, quindi non è consigliabile basarsi su questo metodo per sincronizzare i thread.

Questo metodo può allocare memoria, ma non trasferisce la proprietà della memoria al chiamante. Non rilasciare o liberare la memoria; il buffer multimediale libera la memoria quando il buffer multimediale viene distrutto.

Se si modifica il contenuto del buffer, aggiornare la lunghezza corrente chiamando FMMediaBuffer::SetCurrentLength.

Questo metodo può allocare internamente una memoria, quindi se il buffer supporta l'interfaccia FM2DBuffer , è consigliabile usare il metodo IMF2DBuffer::Lock2D per bloccare il buffer. Per i buffer 2D, il metodo Lock2DSize può essere più efficiente del metodo Lock , a seconda del valore MF2DBuffer_LockFlags specificato. La chiamata a Lock2DSize con MF2DBuffer_LockFlags_Read non comporta una copia indietro quando il buffer viene sbloccato e chiamarlo con MF2DBuffer_LockFlags_Write non incorrerà in una copia dal buffer interno. La chiamata a Lock2DSize con LockFlags_ReadWrite si comporta come Lock eLock2D e incorrerà in una copia da e copia indietro quando sbloccata. Le indicazioni generali per ottenere prestazioni ottimali consentono di evitare l'uso di IMFMediaBuffer e FM2DBuffer ogni volta che è possibile e usare FM2DBuffer2 con i flag di blocco minimi necessari. Si noti che se il buffer è bloccato usando Lock2D, il metodo Lock potrebbe restituire MF_E_INVALIDREQUEST.

Questa interfaccia è disponibile nelle piattaforme seguenti se i componenti ridistribuibili di Windows Media Format 11 SDK sono installati:

  • Windows XP con Service Pack 2 (SP2) e versioni successive.
  • Windows XP Media Center Edition 2005 con KB900325 (Windows XP Media Center Edition 2005) e KB925766 (aggiornamento cumulativo di ottobre 2006 per Windows XP Media Center Edition) installato.

Requisiti

Requisito Valore
Client minimo supportato Windows Vista [app desktop | App UWP]
Server minimo supportato Windows Server 2008 [app desktop | App UWP]
Piattaforma di destinazione Windows
Intestazione mfobjects.h (include Mfidl.h)
Libreria Mfuuid.lib

Vedi anche

FMIMediaBuffer

Buffer multimediali