Controle de qualidade padrão

[O recurso associado a esta página, DirectShow, é um recurso herdado. Foi substituído por MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Esses recursos foram otimizados para Windows 10 e Windows 11. A Microsoft recomenda fortemente que o novo código use MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation em vez de 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.]

As Classes Base do DirectShow implementam alguns comportamentos padrão para o controle de qualidade de vídeo.

As mensagens de qualidade começam no renderizador. A classe base para renderizadores de vídeo é CBaseVideoRenderer, que tem o seguinte comportamento:

  1. Quando o renderizador de vídeo recebe um exemplo, ele compara o carimbo de data/hora no exemplo com a hora de referência atual.
  2. O renderizador de vídeo gera uma mensagem de qualidade. Na classe base, o membro Proportion da mensagem de qualidade é limitado a um intervalo de 500 (50%) a 2000 (200%). Valores fora desse intervalo podem resultar em alterações abruptas de qualidade.
  3. Por padrão, o renderizador de vídeo envia a mensagem de qualidade para o pino de saída upstream (o pino conectado ao pino de entrada). Os aplicativos podem substituir esse comportamento chamando o método SetSink .

O que acontece a seguir depende do filtro upstream. Normalmente, esse é um filtro de transformação. A classe base para filtros de transformação é CTransformFilter, que usa as classes CTransformInputPin e CTransformOutputPin para implementar pinos de entrada e saída. Juntas, essas classes têm o seguinte comportamento:

  1. O método CTransformOutputPin::Notify chama CTransformFilter::AlterQuality, um método privado na classe base de filtro.
  2. Os filtros derivados podem substituir AlterQuality para lidar com a mensagem de qualidade. Por padrão, AlterQuality ignora a mensagem de qualidade.
  3. Se AlterQuality não manipular a mensagem de qualidade, o pin de saída chamará CBaseInputPin::P assNotify, um método privado no pin de entrada do filtro.
  4. PassNotify passa a mensagem de qualidade para o local apropriado— o próximo upstream pino de saída ou um gerenciador de qualidade personalizado.

Supondo que nenhum filtro de transformação manipule a mensagem de qualidade, a mensagem eventualmente atingirá o pino de saída no filtro de origem. Nas classes base, CBasePin::Notify retorna E_NOTIMPL. A forma como um filtro de origem específico lida com mensagens de qualidade depende da natureza da origem. Algumas fontes, como a captura de vídeo ao vivo, não podem executar um controle de qualidade significativo. Outras fontes podem ajustar a taxa na qual fornecem amostras.

O diagrama a seguir ilustra o comportamento padrão.

controle de qualidade nas classes base

O renderizador de vídeo base implementa IQualityControl::Notify, o que significa que você pode passar mensagens de qualidade para o próprio renderizador. Se você definir o membro Proportion como um valor menor que 1000, o renderizador de vídeo inserirá um período de espera entre cada quadro renderizado, reduzindo de fato o renderizador. (Você pode fazer isso para reduzir o uso do sistema, por exemplo.) Para obter mais informações, consulte CBaseVideoRenderer::ThrottleWait. Definir o membro Proportion como um valor maior que 1000 não tem efeito.

Gerenciamento de controle de qualidade