Compartilhar via


Método IMFMediaBuffer::Lock (mfobjects.h)

Fornece ao chamador acesso à memória no buffer, para leitura ou gravação

Sintaxe

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

Parâmetros

[out] ppbBuffer

Recebe um ponteiro para o início do buffer.

[out] pcbMaxLength

Recebe a quantidade máxima de dados que podem ser gravados no buffer. Este parâmetro pode ser NULL. O mesmo valor é retornado pelo método IMFMediaBuffer::GetMaxLength .

[out] pcbCurrentLength

Recebe o comprimento dos dados válidos no buffer, em bytes. Este parâmetro pode ser NULL. O mesmo valor é retornado pelo método IMFMediaBuffer::GetCurrentLength .

Retornar valor

O método retorna um HRESULT. Os possíveis valores incluem, mas sem limitação, aqueles na tabela a seguir.

Código de retorno Descrição
S_OK
O método foi bem-sucedido.
D3DERR_INVALIDCALL
Para buffers de superfície Direct3D, ocorreu um erro ao bloquear a superfície.
MF_E_INVALIDREQUEST
O buffer não pode ser bloqueado no momento.

Comentários

Esse método fornece ao chamador acesso a todo o buffer, até o tamanho máximo retornado no parâmetro pcbMaxLength . O valor retornado em pcbCurrentLength é o tamanho de todos os dados válidos que já estão no buffer, o que pode ser menor que o tamanho total do buffer.

O ponteiro retornado em ppbBuffer tem a garantia de ser válido e pode ser acessado com segurança em todo o buffer enquanto o bloqueio for mantido. Quando terminar de acessar o buffer, chame IMFMediaBuffer::Unlock para desbloquear o buffer. Você deve chamar Unlock uma vez para cada chamada para Lock. Depois de desbloquear o buffer, o ponteiro retornado em ppbBuffer não é mais válido e não deve ser usado. Em geral, é melhor chamar Lock somente quando você precisa acessar a memória do buffer e não anteriormente.

Bloquear o buffer não impede que outros threads chamem Lock, portanto, você não deve confiar nesse método para sincronizar threads.

Esse método pode alocar memória, mas não transfere a propriedade da memória para o chamador. Não libere nem libere a memória; o buffer de mídia liberará a memória quando o buffer de mídia for destruído.

Se você modificar o conteúdo do buffer, atualize o comprimento atual chamando IMFMediaBuffer::SetCurrentLength.

Esse método pode alocar internamente alguma memória, portanto, se o buffer der suporte à interface IMF2DBuffer , você deverá usar o método IMF2DBuffer::Lock2D para bloquear o buffer. Para buffers 2D, o método Lock2DSize pode ser mais eficiente do que o método Lock , dependendo do valor MF2DBuffer_LockFlags especificado. Chamar Lock2DSize com MF2DBuffer_LockFlags_Read não incorrerá em uma cópia novamente quando o buffer for desbloqueado e chamá-lo com MF2DBuffer_LockFlags_Write não incorrerá em uma cópia do buffer interno. Chamar Lock2DSize com LockFlags_ReadWrite se comporta da mesma forma que Lock e Lock2D e incorrerá em uma cópia de e copiar de volta quando desbloqueada. A orientação geral para o melhor desempenho é evitar o uso de IMFMediaBuffer e IMF2DBuffer sempre que possível e, em vez disso, usar IMF2DBuffer2 com os sinalizadores de bloqueio mínimos necessários. Observe que, se o buffer estiver bloqueado usando Lock2D, o método Lock poderá retornar MF_E_INVALIDREQUEST.

Essa interface estará disponível nas seguintes plataformas se os componentes redistribuíveis do SDK do Windows Media Format 11 estiverem instalados:

  • Windows XP com Service Pack 2 (SP2) e posterior.
  • Windows XP Media Center Edition 2005 com KB900325 (Windows XP Media Center Edition 2005) e KB925766 (pacote cumulativo de atualizações de outubro de 2006 para Windows XP Media Center Edition) instalados.

Requisitos

Requisito Valor
Cliente mínimo com suporte Windows Vista [aplicativos da área de trabalho | Aplicativos UWP]
Servidor mínimo com suporte Windows Server 2008 [aplicativos da área de trabalho | Aplicativos UWP]
Plataforma de Destino Windows
Cabeçalho mfobjects.h (include Mfidl.h)
Biblioteca Mfuuid.lib

Confira também

IMFMediaBuffer

Buffers de mídia