Implementar o controle de taxa
Este tópico descreve como objetos de pipeline personalizados podem oferecer suporte a taxas de reprodução variáveis, incluindo reprodução reversa. 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, transformação ou coletor de mídia), talvez seja necessário oferecer suporte a taxas de reprodução variáveis. Para fazer isso, implemente as seguintes interfaces:
- Implemente a interface IMFGetService.
- Apoie o serviço MF_RATE_CONTROL_SERVICE. (Veja Interfaces de serviço.)
- Implemente a interface IMFRateSupport , que obtém as taxas de reprodução suportadas pelo objeto.
- Implemente a interface IMFRateControl , que obtém ou define a taxa de reprodução.
Fontes de mídia
Se uma fonte de mídia oferecer suporte ao controle de taxa, ela deverá implementar IMFRateSupport e IMFRateControl. Caso contrário, a sessão de mídia relata que a taxa de reprodução mínima e máxima é 1,0, independentemente de quais outros componentes estão no pipeline.
A taxa de reprodução não afeta os tempos de apresentação das amostras, portanto, a fonte de mídia não deve ajustar seus carimbos de data/hora. Em vez disso, o relógio da apresentação é executado a uma velocidade mais rápida ou mais lenta. Para reprodução reversa, a fonte entrega 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 afinar o conteúdo. O afinamento aplica-se principalmente a fluxos de vídeo. No modo reduzido, a fonte descarta quadros delta e entrega apenas quadros-chave. Em taxas de reprodução muito altas, a origem pode ignorar alguns quadros-chave (por exemplo, entregar todos os outros quadros-chave).
A fonte não precisa soltar amostras de áudio no modo reduzido. Em taxas de reprodução muito altas, no entanto, a fonte pode não ser capaz de ler dados com rapidez suficiente para preencher as solicitações de amostra do pipeline. Nesse caso, a fonte pode precisar descartar alguns dados de áudio. Em caso afirmativo, ele deve tentar entregar amostras de áudio próximas às amostras de vídeo (supondo que a fonte tenha os dois tipos de fluxo).
Quando um fluxo faz a transição entre o modo desbastado e não desbastado, 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 reversa:
- A fonte de mídia entrega amostras em ordem inversa, sem ajustar os carimbos de data/hora.
- Os carimbos de data/hora dentro de um fluxo devem diminuir monotonicamente.
- O início do conteúdo é considerado o fim do fluxo. Depois que cada fluxo de mídia entrega a primeira amostra no fluxo (ou seja, tempo de apresentação = 0), ele envia o evento MEEndOfStream .
Transformações do Media Foundation
Em geral, uma transformação do Media Foundation (MFT) não precisa de suporte explícito para controle de taxa, a menos que o MFT implemente reprodução reversa não diluída.
Se um MFT não implementar a interface IMFRateSupport , a sessão de mídia assume o seguinte:
- O MFT suporta taxas de reprodução arbitrárias para reprodução direta, tanto diluídas quanto não afinadas.
- O MFT suporta reprodução reversa reduzida, mas não suporta reprodução reversa não reduzida.
Se qualquer uma dessas condições não for verdadeira, o MFT deve implementar IMFRateSupport e IMFRateControl.
Reprodução reversa
A Sessão de Mídia pode ser reproduzida ao contrário, mesmo que uma ou mais transformações no pipeline não ofereçam suporte explícito à reprodução reversa.
Se um MFT não expor a interface IMFRateSupport , a sessão de mídia usa o afinamento para reprodução reversa, 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 descarta quadros delta e os substitui por eventos MEStreamTick .
Entre cada amostra, 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 é considerado um quadro-chave se tiver o atributo MFSampleExtension_CleanPoint definido como TRUE, e é considerado um quadro delta se esse atributo for FALSE ou não definido.
Se o MFT implementa IMFRateSupport, a sessão de mídia usa essa interface para descobrir se o MFT oferece suporte à reprodução reversa não diluída. Se o MFT oferecer suporte à reprodução reversa não diluída, a Sessão de Mídia entregará todas as amostras, em ordem inversa, sem descartar amostras ou liberar o MFT.
Se um MFT oferecer suporte à reprodução reversa não diluída, ele deverá implementar a interface IMFRateControl. A sessão de mídia usará essa interface para notificar o MFT quando ocorrer a reprodução reversa. Nesse ponto, o MFT deve estar preparado para que os carimbos de data/hora diminuam e para que os quadros delta cheguem em ordem inversa. Um decodificador normalmente precisará armazenar amostras em buffer até receber um grupo inteiro de imagens (GOP), decodificar todo o GOP e gerar a saída dos quadros decodificados na ordem correta (inversa).
Coletores de mídia
Se um coletor de mídia não tiver taxa, a Sessão de Mídia pressupõe que o coletor de mídia pode 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 o sinalizador MEDIASINK_RATELESS do Método IMFMediaSink::GetCharacteristics .)
Caso contrário, um coletor de mídia deve 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.
Tópicos relacionados