Aprimoramentos de reprodução de DVD no Windows Vista

[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído pelo MediaPlayer, IMFMediaEngine e Captura de áudio/vídeo no Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use o MediaPlayer, o IMFMediaEngine e a Captura de áudio/vídeo no Media Foundation em vez do DirectShow, quando possível. A Microsoft sugere que o código existente que usa as APIs herdadas seja reescrito para usar as novas APIs, se possível.]

Estas seções descrevem as melhorias na reprodução e navegação de DVDs no Windows Vista.

Especificando um decodificador

Nas versões anteriores do DirectShow, era difícil especificar um decodificador MPEG-2 específico ao criar um grafo de reprodução de DVD. A partir do Windows Vista, um aplicativo pode especificar o decodificador da seguinte maneira:

  1. Adicione o decodificador ao grafo antes de chamar IDvdGraphBuilder::RenderDvdVideoVolume.
  2. Chame RenderDvdVideoVolume e defina o sinalizador AM_DVD_DO_NOT_CLEAR. O DVD Navigator dará preferência ao decodificador que você adicionou.

Suporte para o renderizador de vídeo avançado

Recomenda-se que os aplicativos gravados para o Windows Vista ou posterior usem o renderizador de vídeo avançado (EVR) para reprodução de vídeo. Para usar o EVR em um aplicativo de reprodução de DVD, defina o sinalizador AM_DVD_EVR_ONLY ao chamar RenderDvdVideoVolume.

Para configurar o EVR antes de criar o grafo, chame IDvdGraphBuilder::GetDvdInterface e consulte a interface IEVRFilterConfig ou IMFVideoRenderer. (Essas interfaces estão documentadas na documentação do SDK do Media Foundation). Para mais informações sobre como configurar o renderizador de vídeo em um grafo de reprodução de DVD, confira Criar o grafo de filtro de DVD.

O DVD Navigator não usará o EVR, a menos que o método IAMDecoderCaps::GetDecoderCaps do decodificador retorne o sinalizador AM_GETDECODERCAP_QUERY_EVR_SUPPORT. Esse sinalizador é definido para garantir que os aplicativos sejam compatíveis com os decodificadores existentes. Se RenderDvdVideoVolume falhar usando o sinalizador AM_DVD_EVR_ONLY, retorne a outro renderizador de vídeo chamando o método novamente sem o sinalizador.

Reprodução inversa suave

O DVD Navigator agora pode realizar uma reprodução inversa suave. Na reprodução inversa suave, o DVD Navigator envia unidades de objeto de vídeo (VOBUs) inteiras ao decodificador, e o decodificador emite os quadros em ordem inversa. Esse recurso requer que os decodificadores ofereçam suporte a reprodução inversa suave.

Quando o aplicativo define a velocidade de reprodução como um valor negativo, o DVD Navigator consulta a propriedade AM_RATE_ReverseMaxFullDataRate nos decodificadores. O valor dessa propriedade é o valor absoluto da velocidade máxima de inversão multiplicado por 10000. Por exemplo, se a velocidade máxima de inversão for -2.0, o valor será 20000.

Se o decodificador de vídeo oferecer suporte à propriedade, o DVD Navigator usará a reprodução inversa suave. O fluxo de áudio será reproduzido ao contrário se o decodificador de áudio oferecer suporte à propriedade; caso contrário, o fluxo de áudio será silenciado. Se o decodificador de vídeo não oferecer suporte à propriedade ou a taxa de reprodução exceder a taxa máxima de inversão do decodificador de vídeo, o DVD Navigator mudará para o modo de verificação. No modo de verificação, o DVD Navigator envia apenas quadros I ao decodificador e descarta todos os quadros B e P.

Durante a reprodução inversa suave, o DVD Navigator envia VOBUs completas ao decodificador. O DVD Navigator envia as VOBUs em ordem inversa, mas envia os quadros dentro de cada VOBU em sua ordem normal. No início de cada VOBU, o DVD Navigator define o sinalizador AM_ReverseBlockStart na amostra. No final da VOBU, o DVD Navigator envia uma amostra vazia com o sinalizador AM_ReverseBlockEnd. Para recuperar esses sinalizadores, chame IMediaSample2::GetProperties na amostra. Os sinalizadores são definidos no membro dwTypeSpecificFlags da estrutura AM_SAMPLE2_PROPERTIES.

O decodificador armazena os dados de vídeo em cache até receber a amostra com o sinalizador AM_ReverseBlockEnd. Nesse ponto, o decodificador entrega os quadros decodificados em ordem inversa. Por exemplo, se a VOBU 1 contiver quadros 1–4 e VOBU 2 contiver quadros 5–8, o DVD Navigator enviará os quadros nesta ordem:

(Início do bloco) F5 F6 F7 F8 (fim do bloco) (início do bloco) F1 F2 F3 F4 (fim do bloco)

O decodificador deve processar os quadros da seguinte forma:

  1. Decodificar VOBU 2.
  2. Quadros de saída: F8 F7 F6 F5
  3. Decodificar VOBU 1.
  4. Quadros de saída: F4 F3 F2 F1

O DVD Navigator define o carimbo de data/hora na primeira amostra na VOBU (F1 e F5 neste exemplo), mas o carimbo de data/hora contém o tempo de apresentação do início do bloco, então o decodificador deve aplicar esse tempop à última amostra no bloco (F4 e F8). Os tempos de apresentação aumentam durante a reprodução inversa.

Normalmente, uma VOBU contém até 42 quadros e pode conter mais de um grupo de imagens (GOP). Para permitir que a VOBU inteira seja decodificada, o decodificador deve armazenar em cache os quadros I e P decodificados. VOBUs em DVDs não são GOPs fechados, então um quadro B dentro de um GOP pode exigir a decodificação de todos os quadros de referência no GOP anterior. Se o decodificador não tiver superfícies suficientes para armazenar todos os quadros decodificados, talvez seja necessário redecodificar os quadros selecionados.

Alterações de taxa

Por padrão, o DVD Navigator libera o grafo entre as alterações de taxa. No entanto, se o decodificador oferecer suporte à propriedade AM_RATE_ResetOnTimeDisc, o DVD Navigator não liberará o grafo, resultando em uma transição mais suave entre as taxas de reprodução.

O DVD Navigator sempre carimba a data/hora nas amostras para reprodução em velocidade de 1x, independentemente da velocidade real de reprodução. O decodificador deve ajustar a escala dos carimbos de data/hora nas amostras decodificadas para corresponder à velocidade de reprodução real. (Para obter detalhes, confira a Propriedade AM_RATE_SimpleRateChange.) Assim, ao reproduzir em velocidades diferentes de 1x, os carimbos de data/hora nos quadros decodificados divergem daqueles nos quadros codificados. Sempre que o DVD Navigator define o sinalizador AM_SAMPLE_TIMEDISCONTINUITY em uma amostra, o decodificador deve ressincronizar seus carimbos de data/hora. Em outras palavras, o quadro decodificado deve ter o mesmo carimbo de data/hora que o quadro de entrada. Para recuperar o sinalizador AM_SAMPLE_TIMEDISCONTINUITY, chame IMediaSample2::GetProperties no exemplo. O sinalizador é definido no membro dwSampleFlags da estrutura AM_SAMPLE2_PROPERTIES.

Gerenciamento de Energia

No Windows Vista, o DVD Navigator habilita as seguintes melhorias no gerenciamento de energia:

  • Resolução do temporizador mais alta
  • Cache de dados maior

Resolução do temporizador: os aplicativos podem solicitar uma resolução mínima do temporizador chamando a função timeBeginPeriod. Uma resolução mais alta (período mais curto) aumenta a capacidade de resposta do sistema a eventos periódicos, como tempos limite, mas também pode aumentar a frequência de trocas de contexto de thread.

Por padrão, o relógio de referência no DirectShow define a resolução do temporizador para 1 milissegundo. Nessa resolução, a CPU não entrará em nenhum modo de economia de energia. A partir do Windows Vista, o DVD Navigator substitui o comportamento padrão do relógio de referência chamando IReferenceClockTimerControl::SetDefaultTimerResolution no relógio de referência. Isso remove a solicitação do relógio por uma resolução do temporizador de 1 milissegundo. Isso pode permitir que a CPU entre em um modo de economia de energia.

A resolução do temporizador é uma configuração global; o Windows escolhe o valor mais baixo solicitado. Os filtros do Video Mixing Renderer (VMR), VMR-7 e VMR-9, definem a resolução do temporizador para 1 milissegundo. Geralmente, o EVR define a resolução para um valor entre 4 e 8 milissegundos, dependendo se a composição da área de trabalho está habilitada e se o EVR está no modo de tela inteira. Outros aplicativos também podem definir a resolução.

Tamanho do cache: os aplicativos podem especificar quantos dados o DVD Navigator armazena em cache definindo a opção DVD_CacheSizeInMB no método IDvdControl2::SetOption . Se o aplicativo definir esse sinalizador como um valor grande (> 50 MB), a unidade de DVD poderá diminuir a rotação após a pré-carregamento inicial, dependendo do hardware, o que pode reduzir o consumo de energia.

Aplicativos de DVD