Freigeben über


IMFMediaBuffer::Lock-Methode (mfobjects.h)

Gewährt dem Aufrufer Zugriff auf den Speicher im Puffer zum Lesen oder Schreiben.

Syntax

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

Parameter

[out] ppbBuffer

Empfängt einen Zeiger auf den Anfang des Puffers.

[out] pcbMaxLength

Empfängt die maximale Datenmenge, die in den Puffer geschrieben werden kann. Dieser Parameter kann NULL sein. Der gleiche Wert wird von der IMFMediaBuffer::GetMaxLength-Methode zurückgegeben.

[out] pcbCurrentLength

Empfängt die Länge der gültigen Daten im Puffer in Bytes. Dieser Parameter kann NULL sein. Der gleiche Wert wird von der IMFMediaBuffer::GetCurrentLength-Methode zurückgegeben.

Rückgabewert

Die Methode gibt ein HRESULT zurück. Mögliches Werte (aber nicht die Einzigen) sind die in der folgenden Tabelle.

Rückgabecode BESCHREIBUNG
S_OK
Die Methode wurde erfolgreich ausgeführt.
D3DERR_INVALIDCALL
Bei Direct3D-Oberflächenpuffern ist beim Sperren der Oberfläche ein Fehler aufgetreten.
MF_E_INVALIDREQUEST
Der Puffer kann derzeit nicht gesperrt werden.

Hinweise

Diese Methode gewährt dem Aufrufer Zugriff auf den gesamten Puffer bis zur maximalen Größe, die im parameter pcbMaxLength zurückgegeben wird. Der in pcbCurrentLength zurückgegebene Wert ist die Größe aller gültigen Daten, die sich bereits im Puffer befinden, was kleiner als die Gesamtpuffergröße sein kann.

Der in ppbBuffer zurückgegebene Zeiger ist garantiert gültig und kann sicher über den gesamten Puffer zugegriffen werden, solange die Sperre gehalten wird. Wenn Sie mit dem Zugriff auf den Puffer fertig sind, rufen Sie IMFMediaBuffer::Unlock auf, um den Puffer zu entsperren. Sie müssen die Entsperrung für jeden Aufruf von Lock einmal aufrufen. Nachdem Sie den Puffer entsperrt haben, ist der in ppbBuffer zurückgegebene Zeiger nicht mehr gültig und sollte nicht verwendet werden. Im Allgemeinen empfiehlt es sich, die Sperre nur aufzurufen, wenn Sie auf den Pufferspeicher zugreifen müssen, und nicht früher.

Das Sperren des Puffers verhindert nicht, dass andere Threads die Sperre aufrufen, sodass Sie sich nicht auf diese Methode verlassen sollten, um Threads zu synchronisieren.

Diese Methode kann Arbeitsspeicher zuordnen, aber der Besitz des Arbeitsspeichers wird nicht an den Aufrufer übertragen. Geben Sie den Arbeitsspeicher nicht frei. Der Medienpuffer gibt den Speicher frei, wenn der Medienpuffer zerstört wird.

Wenn Sie den Inhalt des Puffers ändern, aktualisieren Sie die aktuelle Länge, indem Sie IMFMediaBuffer::SetCurrentLength aufrufen.

Diese Methode kann intern speicherseitig zugeordnet werden. Wenn der Puffer also die IMF2DBuffer-Schnittstelle unterstützt, sollten Sie stattdessen die IMF2DBuffer::Lock2D-Methode verwenden, um den Puffer zu sperren. Bei 2D-Puffern kann die Lock2DSize-Methode je nach MF2DBuffer_LockFlags angegebenen Wert effizienter sein als die Lock-Methode. Wenn Sie Lock2DSize mit MF2DBuffer_LockFlags_Read aufrufen, wird keine Kopie zurückgerufen, wenn der Puffer entsperrt ist, und wenn Sie ihn mit MF2DBuffer_LockFlags_Write aufrufen, entsteht keine Kopie aus dem internen Puffer. Das Aufrufen von Lock2DSize mit LockFlags_ReadWrite verhält sich genauso wie Lock und Lock2D und verursacht beim Entsperren eine Kopie von und zurück. Die allgemeine Anleitung für eine optimale Leistung besteht darin, die Verwendung von IMFMediaBuffer und IMF2DBuffer nach Möglichkeit zu vermeiden und stattdessen IMF2DBuffer2 mit den mindestens erforderlichen Sperrflags zu verwenden. Wenn der Puffer mit Lock2D gesperrt ist, gibt die Lock-Methode möglicherweise MF_E_INVALIDREQUEST zurück.

Diese Schnittstelle ist auf den folgenden Plattformen verfügbar, wenn die verteilbaren Windows Media Format 11 SDK-Komponenten installiert sind:

  • Windows XP mit Service Pack 2 (SP2) und höher.
  • Windows XP Media Center Edition 2005 mit KB900325 (Windows XP Media Center Edition 2005) und KB925766 (Updaterollup für Windows XP Media Center Edition) vom Oktober 2006) installiert.

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Windows Vista [Desktop-Apps | UWP-Apps]
Unterstützte Mindestversion (Server) Windows Server 2008 [Desktop-Apps | UWP-Apps]
Zielplattform Windows
Kopfzeile mfobjects.h (include Mfidl.h)
Bibliothek Mfuuid.lib

Weitere Informationen

IMFMediaBuffer

Medienpuffer