Метод IMFMediaBuffer::Lock (mfobjects.h)

Предоставляет вызывающей объекту доступ к памяти в буфере для чтения или записи.

Синтаксис

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

Параметры

[out] ppbBuffer

Получает указатель на начало буфера.

[out] pcbMaxLength

Получает максимальный объем данных, которые можно записать в буфер. Этот параметр может принимать значение NULL. То же значение возвращается методом IMFMediaBuffer::GetMaxLength .

[out] pcbCurrentLength

Получает длину допустимых данных в буфере в байтах. Этот параметр может принимать значение NULL. То же значение возвращается методом IMFMediaBuffer::GetCurrentLength .

Возвращаемое значение

Метод возвращает HRESULT. Допустимые значения включают, но не ограничиваются, значения, приведенные в следующей таблице.

Код возврата Описание
S_OK
Метод выполнен успешно.
D3DERR_INVALIDCALL
Для буферов поверхности Direct3D произошла ошибка при блокировке поверхности.
MF_E_INVALIDREQUEST
В настоящее время буфер не может быть заблокирован.

Комментарии

Этот метод предоставляет вызывающей объекту доступ ко всему буферу вплоть до максимального размера, возвращаемого в параметре pcbMaxLength . Значение, возвращаемое в pcbCurrentLength , представляет собой размер всех допустимых данных, уже имеющихся в буфере, который может быть меньше общего размера буфера.

Указатель, возвращенный в ppbBuffer , гарантированно является допустимым и может безопасно обращаться ко всему буферу до тех пор, пока блокировка удерживается. Завершив доступ к буферу, вызовите IMFMediaBuffer::Unlock , чтобы разблокировать буфер. Для каждого вызова lock необходимо вызывать Unlock один раз. После разблокировки буфера указатель, возвращаемый в ppbBuffer , больше не является допустимым и не должен использоваться. Как правило, блокировку лучше вызывать только в том случае, если требуется доступ к буферной памяти, а не раньше.

Блокировка буфера не препятствует вызову блокировки другими потоками, поэтому не следует полагаться на этот метод для синхронизации потоков.

Этот метод может выделять память, но не передает права владения памятью вызывающей объекту. Не освобождать и не освобождать память; буфер мультимедиа освободит память при уничтожении буфера мультимедиа.

При изменении содержимого буфера обновите текущую длину, вызвав IMFMediaBuffer::SetCurrentLength.

Этот метод может внутренне выделить некоторую память, поэтому, если буфер поддерживает интерфейс IMF2DBuffer , для блокировки буфера следует использовать метод IMF2DBuffer::Lock2D . Для двухсерийных буферов метод Lock2DSize может быть более эффективным, чем метод Lock , в зависимости от указанного значения MF2DBuffer_LockFlags . Вызов Lock2DSize с MF2DBuffer_LockFlags_Read не приведет к копированию при разблокировке буфера и вызове с помощью MF2DBuffer_LockFlags_Write не приведет к копированию из внутреннего буфера. Вызов Lock2DSize с LockFlags_ReadWrite ведет себя так же, как Lock и Lock2D , и приведет к копированию из и обратно при разблокировке. Общее руководство для наилучшей производительности заключается в том, чтобы избегать использования IMFMediaBuffer и IMF2DBuffer , когда это возможно, и вместо этого использовать IMF2DBuffer2 с минимальными необходимыми флагами блокировки. Обратите внимание, что если буфер заблокирован с помощью Lock2D, метод Lock может возвращать MF_E_INVALIDREQUEST.

Этот интерфейс доступен на следующих платформах, если установлены распространяемые компоненты пакета SDK для Windows Media Format 11:

  • Windows XP с пакетом обновления 2 (SP2) и более поздних версий.
  • Windows XP Media Center Edition 2005 с установленным KB900325 (Windows XP Media Center Edition 2005) и KB925766 (накопительный пакет обновления за октябрь 2006 г. для Windows XP Media Center Edition).

Требования

Требование Значение
Минимальная версия клиента Windows Vista [классические приложения | Приложения UWP]
Минимальная версия сервера Windows Server 2008 [классические приложения | Приложения UWP]
Целевая платформа Windows
Header mfobjects.h (включая Mfidl.h)
Библиотека Mfuuid.lib

См. также раздел

IMFMediaBuffer

Буферы мультимедиа