Implementando o controle de taxa

Este tópico descreve como objetos de pipeline personalizados podem dar suporte a taxas de reprodução variáveis, incluindo a reprodução inversa. Para obter informações sobre como usar o controle de taxa de um aplicativo, consulte Controle de taxa.

Este tópico contém as seguintes seções:

Se você estiver escrevendo um objeto de pipeline do Microsoft Media Foundation (uma fonte de mídia, uma transformação ou um coletor de mídia), talvez seja necessário dar suporte a taxas de reprodução variáveis. Para fazer isso, implemente as seguintes interfaces:

  1. Implemente a interface IMFGetService .
  2. Dê suporte ao serviço de MF_RATE_CONTROL_SERVICE . (Consulte Interfaces de Serviço.)
  3. Implemente a interface IMFRateSupport , que obtém as taxas de reprodução compatíveis com o objeto .
  4. Implemente a interface IMFRateControl , que obtém ou define a taxa de reprodução.

Fontes de mídia

Se uma fonte de mídia der suporte ao controle de taxa, ela deverá implementar IMFRateSupport e IMFRateControl. Caso contrário, a Sessão de Mídia informa que a taxa de reprodução mínima e máxima é de 1,0, independentemente de quais outros componentes estão no pipeline.

A taxa de reprodução não afeta os horários de apresentação dos exemplos, portanto, a fonte de mídia não deve ajustar seus carimbos de data/hora. Em vez disso, o relógio de apresentação é executado a uma velocidade mais rápida ou mais lenta. Para reprodução inversa, a origem fornece amostras em ordem inversa, com carimbos de data/hora decrescentes.

O parâmetro fThin do método IMFRateControl::SetRate indica se a fonte de mídia deve diminuir o conteúdo. O afinamento se aplica principalmente a fluxos de vídeo. No modo afinado, a origem descarta quadros delta e entrega apenas quadros-chave. Com taxas de reprodução muito altas, a origem pode ignorar alguns quadros-chave (por exemplo, entregar todos os outros quadros-chave).

A origem não precisa descartar exemplos de áudio no modo desfinado. No entanto, com taxas de reprodução muito altas, a origem pode não ser capaz de ler dados rapidamente para preencher as solicitações de exemplo do pipeline. Nesse caso, talvez a origem precise remover alguns dados de áudio. Nesse caso, ele deve tentar fornecer amostras de áudio que estejam próximas a tempo dos exemplos de vídeo (supondo que a origem tenha ambos os tipos de fluxo).

Quando um fluxo faz a transição entre o modo fino e não fino, ele envia um evento MEStreamThinMode .

Quando a fonte de mídia conclui uma chamada para SetRate, ela envia o evento MESourceRateChanged .

Durante a reprodução inversa:

  • A fonte de mídia fornece amostras em ordem inversa, sem ajustar os carimbos de data/hora.
  • Os carimbos de data/hora em um fluxo devem diminuir monotonicamente.
  • O início do conteúdo é considerado o final do fluxo. Depois que cada fluxo de mídia entrega o primeiro exemplo no fluxo (ou seja, hora da apresentação = 0), ele envia o evento MEEndOfStream .

Transformações do Media Foundation

Em geral, uma MFT (transformação do Media Foundation) não precisa de suporte explícito para o controle de taxa, a menos que o MFT implemente a reprodução inversa não fina.

Se um MFT não implementar a interface IMFRateSupport , a Sessão de Mídia assumirá o seguinte:

  • O MFT dá suporte a taxas de reprodução arbitárias para reprodução avançada, tanto afinadas quanto não finas.
  • O MFT dá suporte à reprodução reversa fina, mas não dá suporte à reprodução inversa não fina.

Se qualquer uma dessas condições não for verdadeira, o MFT deverá implementar IMFRateSupport e IMFRateControl.

Reprodução inversa

A Sessão de Mídia pode ser reproduzida inversa mesmo que uma ou mais transformações no pipeline não dão suporte explicitamente à reprodução inversa.

Se um MFT não expor a interface IMFRateSupport , a Sessão de Mídia usará o afinamento para reprodução inversa, da seguinte maneira:

  • A Sessão de Mídia envia quadros-chave para o MFT da maneira usual, chamando IMFTransform::P rocessInput.

  • A Sessão de Mídia remove quadros delta e os substitui por eventos MEStreamTick .

  • Entre cada exemplo, a Sessão de Mídia libera o MFT, para evitar erros causados pelo fato de que os carimbos de data/hora estão diminuindo.

Um exemplo será considerado um quadro-chave se ele tiver o atributo MFSampleExtension_CleanPoint definido como TRUE e for considerado um quadro delta se esse atributo for FALSE ou não estiver definido.

Se o MFT implementar IMFRateSupport, a Sessão de Mídia usará essa interface para descobrir se o MFT dá suporte à reprodução inversa não fina. Se o MFT der suporte à reprodução inversa não fina, a Sessão de Mídia fornecerá todos os exemplos, em ordem inversa, sem descartar amostras ou liberar o MFT.

Se um MFT der suporte à reprodução reversa não fina, ele deverá implementar a interface IMFRateControl . A Sessão de Mídia usará essa interface para notificar o MFT quando ocorrer a reprodução inversa. Nesse ponto, o MFT deve estar preparado para que os carimbos de data/hora diminuam e que os quadros delta cheguem em ordem inversa. Normalmente, um decodificador precisará armazenar amostras em buffer até receber um grupo inteiro de imagens (GOP), decodificar todo o GOP e gerar os quadros decodificados na ordem correta (inversa).

Coletores de Mídia

Se um coletor de mídia for sem taxa, a Sessão de Mídia pressupõe que o coletor de mídia possa lidar com qualquer taxa de reprodução. O coletor de mídia não precisa implementar IMFRateSupport. (Um coletor de mídia sem taxa retorna a bandeira MEDIASINK_RATELESS do método IMFMediaSink::GetCharacteristics .)

Caso contrário, um coletor de mídia deverá implementar IMFRateSupport se puder lidar com taxas de reprodução diferentes de 1,0.

Os coletores de mídia não devem implementar IMFRateControl. Quando a taxa de reprodução é alterada, o relógio de apresentação chama o método IMFClockStateSink::OnClockSetRate do coletor de mídia.

Controle de taxa

Busca, Avanço Rápido e Jogo Inverso