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 |
---|---|
|
Il metodo è riuscito. |
|
Per i buffer di superficie Direct3D, si è verificato un errore durante il blocco della superficie. |
|
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 |