Método IMFTransform::P rocessOutput (mftransform.h)
Gera a saída dos dados de entrada atuais.
Sintaxe
HRESULT ProcessOutput(
[in] DWORD dwFlags,
[in] DWORD cOutputBufferCount,
[in, out] MFT_OUTPUT_DATA_BUFFER *pOutputSamples,
[out] DWORD *pdwStatus
);
Parâmetros
[in] dwFlags
OR bit a bit de zero ou mais sinalizadores da enumeração _MFT_PROCESS_OUTPUT_FLAGS.
[in] cOutputBufferCount
Número de elementos na matriz pOutputSamples . O valor deve ser pelo menos 1.
[in, out] pOutputSamples
Ponteiro para uma matriz de estruturas MFT_OUTPUT_DATA_BUFFER , alocadas pelo chamador. O MFT usa essa matriz para retornar dados de saída para o chamador.
[out] pdwStatus
Recebe um OR bit a bit de zero ou mais sinalizadores da enumeração _MFT_PROCESS_OUTPUT_STATUS .
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. |
|
O método ProcessOutput foi chamado em um MFT assíncrono que não esperava essa chamada de método. |
|
Identificador de fluxo inválido no membro dwStreamID de uma ou mais estruturas MFT_OUTPUT_DATA_BUFFER . |
|
A transformação não pode produzir dados de saída até receber mais dados de entrada. |
|
O formato foi alterado em um fluxo de saída ou há um novo formato preferencial ou há um novo fluxo de saída. |
|
Você deve definir o tipo de mídia em um ou mais fluxos do MFT. |
Comentários
O tamanho da matriz pOutputSamples deve ser igual ou maior que o número de fluxos de saída selecionados . O número de fluxos de saída selecionados é igual ao número total de fluxos de saída menos o número de fluxos desmarcados . Um fluxo será desmarcado se tiver o sinalizador MFT_OUTPUT_STREAM_OPTIONAL e o chamador não definir um tipo de mídia (ou definir o tipo de mídia como NULL). Para obter mais informações, consulte _MFT_OUTPUT_STREAM_INFO_FLAGS enumeração.
Esse método gera exemplos de saída e também pode gerar eventos. Se o método for bem-sucedido, pelo menos uma das seguintes condições será verdadeira:
- Um ou mais exemplos na matriz pOutputSamples contém dados de saída.
- Um ou mais membros da matriz pOutputSamples contém uma coleção não vazia de eventos.
Buffers de saída
O MFT retorna dados de saída para um fluxo por meio do membro pSample da estrutura MFT_OUTPUT_DATA_BUFFER . Esse membro da estrutura é um ponteiro para a interface IMFSample de um exemplo de mídia. (Consulte Exemplos de mídia.) O exemplo de mídia é alocado pelo chamador ou pelo MFT, dependendo do modelo de alocação do MFT. Para localizar o modelo de alocação, chame IMFTransform::GetOutputStreamInfo e examine o membro dwFlags da estrutura MFT_OUTPUT_STREAM_INFO :- Se o sinalizador MFT_OUTPUT_STREAM_PROVIDES_SAMPLES estiver presente, o MFT alocará o exemplo de mídia.
- Se o sinalizador MFT_OUTPUT_STREAM_CAN_PROVIDE_SAMPLES estiver presente, o chamador poderá, opcionalmente, fornecer um exemplo de mídia. Se pSample for NULL, o MFT alocará o exemplo de mídia.
- Se nenhum desses dois sinalizadores estiver presente, o chamador deverá alocar o exemplo de mídia.
Se o chamador alocar o exemplo de mídia, o exemplo de mídia deverá conter um buffer grande o suficiente para manter os dados de saída. Para localizar os requisitos de buffer, chame GetOutputStreamInfo. O MFT grava os dados de saída no início do buffer, substituindo todos os dados que já existem no buffer.
Se o MFT alocar o exemplo, o MFT também alocará os buffers para o exemplo.
Se o MFT tiver vários fluxos de saída, os fluxos poderão produzir saída a taxas diferentes, portanto, alguns fluxos poderão ter saída, enquanto outros fluxos não. Se um fluxo não produzir nenhuma saída, o MFT definirá o sinalizador MFT_OUTPUT_DATA_BUFFER_NO_SAMPLE no membro dwStatus da estrutura MFT_OUTPUT_DATA_BUFFER para esse fluxo. Nesse caso, se o chamador alocou pSample, os buffers no exemplo não contêm dados válidos. Se o chamador não tiver alocado pSample, o sinalizador MFT_OUTPUT_DATA_BUFFER_NO_SAMPLE indicará que pSample ainda é igual a NULL após o retorno do método.
Se nenhum fluxo de saída tiver dados e o MFT não tiver eventos a serem retornados, ProcessOutput retornará MF_E_TRANSFORM_NEED_MORE_INPUT.
O MFT não pode retornar mais de um exemplo por fluxo em uma única chamada para ProcessOutput. Se houver mais dados de saída disponíveis para um fluxo após o retorno de ProcessOutput , o MFT definirá o sinalizador MFT_OUTPUT_DATA_BUFFER_INCOMPLETE no membro dwStatus da estrutura MFT_OUTPUT_DATA_BUFFER para esse fluxo.
Se o MFT tiver dados suficientes para produzir saída, ele deverá se recusar a aceitar mais entradas até que ProcessOutput tenha sido chamado tempos suficientes para efetuar pull de toda a saída disponível. (Uma exceção é quando o método IMFTransform::GetOutputStreamInfo retorna o sinalizador MFT_OUTPUT_STREAM_LAZY_READ .) Em geral, um MFT com vários fluxos de saída deve produzir saída para um fluxo o mais rápido possível e não esperar que todos os fluxos tenham saída.
Eventos em banda
O MFT pode retornar uma coleção de objetos de evento no membro pEvents de cada estrutura MFT_OUTPUT_DATA_BUFFER . O MFT aloca o objeto de coleção e os eventos.Para enviar um evento para o chamador, o MFT executa as seguintes etapas dentro de ProcessOutput:
- Crie um novo objeto de coleção chamando MFCreateCollection.
- Adicione um ou mais eventos à coleção chamando IMFCollection::AddElement.
- Defina o membro pEvents da estrutura MFT_OUTPUT_DATA_BUFFER igual ao ponteiro IMFCollection . O MFT deixa uma contagem de referência nessa interface; o chamador deve liberar o ponteiro.
É válido que o método ProcessOutput retorne um ou mais eventos e zero amostras de saída.
O chamador é responsável por liberar todos os eventos alocados pelo MFT. Quando o método retornar, marcar o membro pEvents de cada estrutura MFT_OUTPUT_DATA_BUFFER. Se o valor não for NULL, o chamador deverá liberar o ponteiro da interface IMFCollection :
// Release the events that an MFT might allocate in IMFTransform::ProcessOutput().
void ReleaseEventCollection(DWORD cOutputBuffers, MFT_OUTPUT_DATA_BUFFER* pBuffers)
{
for (DWORD i = 0; i < cOutputBuffers; i++)
{
if (pBuffers[i].pEvents)
{
pBuffers[i].pEvents->Release();
pBuffers[i].pEvents = NULL;
}
}
}
Um MFT não deve usar a interface IMFMediaEventGenerator para enviar eventos em banda.
alterações de Stream
O método ProcessOutput pode causar qualquer uma das seguintes alterações em um fluxo de saída:- A exclusão de um fluxo de saída. Para sinalizar uma exclusão de fluxo, o MFT define o sinalizador MFT_OUTPUT_DATA_BUFFER_STREAM_END no membro dwStatus da estrutura MFT_OUTPUT_DATA_BUFFER para esse fluxo.
- A criação de um novo fluxo de saída. Para sinalizar um novo fluxo de saída, o MFT define o sinalizador MFT_PROCESS_OUTPUT_STATUS_NEW_STREAMS no parâmetro pdwStatus . Um novo fluxo pode ter o mesmo identificador de fluxo que um fluxo excluído.
- Uma alteração de formato em um fluxo de saída. Para sinalizar uma alteração de formato, o MFT define o sinalizador MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE no membro dwStatus da estrutura MFT_OUTPUT_DATA_BUFFER para esse fluxo.
O sinalizador MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE sinaliza uma alteração de formato em um fluxo de saída. Isso pode significar que o tipo de mídia atual se tornou inválido ou a ordem de preferência foi alterada e um formato mais eficiente está disponível. No último caso, é possível que o cliente defina novamente o tipo de mídia original. Para proteger-se contra loops infinitos, o MFT não deve definir o sinalizador MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE novamente até que haja outra alteração. Além disso, evite definir esse sinalizador se a ordem de preferência for alterada, mas o tipo de mídia atual ainda for o tipo mais preferencial.
Atributos de exemplo
Um exemplo de entrada pode ter atributos, que são acessados por meio da interface IMFAttributes . A menos que um atributo específico não se aplique mais, todos os atributos devem ser copiados para o exemplo de saída correspondente. A responsabilidade por copiar atributos é determinada da seguinte maneira:- Se o valor da propriedade MFPKEY_EXATTRIBUTE_SUPPORTED no MFT for VARIANT_TRUE, o MFT copiará os atributos.
- Se o valor de MFPKEY_EXATTRIBUTE_SUPPORTED for VARIANT_FALSE ou a propriedade não estiver definida, o cliente deverá copiar os atributos de exemplo. Não substitua nenhum atributo que o MFT define no exemplo de saída.
Processamento assíncrono
As observações anteriores descrevem o modelo de processamento síncrono . Para dar suporte ao processamento assíncrono, consulte MFTs assíncronos.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 | mftransform.h |
Biblioteca | Mfuuid.lib |