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
S_OK
O método foi bem-sucedido.
E_UNEXPECTED
O método ProcessOutput foi chamado em um MFT assíncrono que não esperava essa chamada de método.
MF_E_INVALIDSTREAMNUMBER
Identificador de fluxo inválido no membro dwStreamID de uma ou mais estruturas MFT_OUTPUT_DATA_BUFFER .
MF_E_TRANSFORM_NEED_MORE_INPUT
A transformação não pode produzir dados de saída até receber mais dados de entrada.
MF_E_TRANSFORM_STREAM_CHANGE
O formato foi alterado em um fluxo de saída ou há um novo formato preferencial ou há um novo fluxo de saída.
MF_E_TRANSFORM_TYPE_NOT_SET
Você deve definir o tipo de mídia em um ou mais fluxos do MFT.
 
Nota Se você estiver convertendo um Objeto de Mídia DirectX (DMO) em um MFT, lembre-se de que S_FALSE não é um código de retorno válido para IMFTransform::P rocessOutput, ao contrário do método IMediaObject::P rocessOutput .
 

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.
Se MFT_UNIQUE_METHOD_NAMES for definido antes de incluir Mftransform.h, esse método será renomeado como MFTProcessOutput. Consulte Criando objetos DMO/MFT híbridos.

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.
Esses sinalizadores permanecem constantes, a menos que o tipo de mídia para o fluxo de saída seja alterado.

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:

  1. Crie um novo objeto de coleção chamando MFCreateCollection.
  2. Adicione um ou mais eventos à coleção chamando IMFCollection::AddElement.
  3. 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.
Os eventos não têm carimbos de data/hora. O chamador deve processar os eventos antes de processar os exemplos de saída. Em outras palavras, os eventos ocorrem no ponto no fluxo imediatamente após a chamada anterior para ProcessOutput e antes de qualquer amostra de saída retornada da chamada ProcessOutput atual.

É 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.
É possível que todas essas três ações resultem de uma única chamada para ProcessOutput. O chamador deve responder a eles na ordem listada aqui — primeiro exclusões, adições e, em seguida, alterações de formato.

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.
Para obter uma lista de atributos de exemplo, consulte Atributos de exemplo.

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

Confira também

IMFTransform

Transformações do Media Foundation