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 |
---|---|
|
O método foi bem-sucedido. |
|
Para buffers de superfície Direct3D, ocorreu um erro ao bloquear a superfície. |
|
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 |