Creación del gráfico de filtros de DVD

[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.

Al igual que con cualquier aplicación directShow, una aplicación de reproducción de DVD comienza creando un gráfico de filtros. DirectShow proporciona los siguientes componentes para la reproducción de DVD:

La reproducción de DVD también requiere un descodificador MPEG-2. Los descodificadores MPEG-2 de hardware y software están disponibles en terceros. En primer lugar, cree una instancia del objeto DVD Graph Builder.

IDvdGraphBuilder *pBuild = NULL;
hr = CoCreateInstance(CLSID_DvdGraphBuilder, NULL, 
    CLSCTX_INPROC_SERVER, IID_IDvdGraphBuilder, (void **)&pBuild);

En este momento, puede seleccionar y configurar el representador de vídeo antes de compilar el resto del gráfico. Este paso, que es opcional, se describe con más detalle en la sección siguiente. Si omite este paso, dvd Graph Builder selecciona un representador predeterminado. A continuación, compile el grafo llamando al método IDvdGraphBuilder::RenderDvdVideoVolume .

AM_DVD_RENDERSTATUS buildStatus;
hr = pBuild->RenderDvdVideoVolume(L"Z:\\video_ts", 0, &buildStatus);

El primer parámetro es el nombre de un directorio que contiene los archivos de DVD. En un disco DVD, estos archivos residen en un directorio denominado VIDEO_TS. Si el primer parámetro es NULL, el Generador de gráficos de DVD usa la primera unidad que contiene un volumen de DVD.

El segundo parámetro contiene varias marcas opcionales para elegir el tipo de descodificador (hardware o software) y otras opciones.

El tercer parámetro es una estructura AM_DVD_RENDERSTATUS que recibe información de estado. Si el método RenderDvdVideoVolume devuelve S_FALSE, significa que la llamada se realizó parcialmente correctamente (o parcialmente falló, si es pesimista). Por ejemplo, el método podría no representar la secuencia de subpicture, aunque las otras secuencias se representaron correctamente. Si el método RenderDvdVideoVolume devuelve un código de error o el valor S_FALSE, puede examinar la estructura de AM_DVD_RENDERSTATUS para obtener más información sobre el error.

A continuación, obtenga un puntero al Administrador de gráficos de filtros llamando a IDvdGraphBuilder::GetFiltergraph. Este método devuelve un puntero a la interfaz IGraphBuilder de Filter Graph Manager.

IGraphBuilder *pGraph = NULL;
hr =  pBuild->GetFiltergraph(&m_pGraph);

Use el método IDvdGraphBuilder::GetDvdInterface para recuperar interfaces relacionadas con DVD, incluidas las siguientes:

  • IDvdControl2. Controla la reproducción y los comandos de DVD
  • IDvdInfo2. Devuelve información sobre el estado actual del navegador de DVD.
  • IAMLine21Decoder. Controles cerrados subtítulo pantalla. La pantalla de subtítulo cerrada está habilitada de forma predeterminada. Para deshabilitarlo, llame a IAMLine21Decoder::SetServiceState con la marca AM_L21_CCSTATE_Off.
  • IBasicAudio. Controla el volumen y el equilibrio de audio.

Por ejemplo, el código siguiente devuelve la interfaz IDvdControl2 .

IDvdControl2 *pDvdControl = NULL;
hr = pBuild->GetDvdInterface(IID_IDvdControl2, (void**)&pDvdControl);

La manera recomendada de crear el gráfico de filtro de reproducción de DVD es hacer que un objeto Dvd Graph Builder lo haga automáticamente. Este enfoque se muestra a continuación y en la aplicación de ejemplo de DVD. Si necesita compilar manualmente el gráfico de filtros de DVD, puede hacerlo siguiendo las reglas básicas del edificio de grafos descritos en otra parte de la documentación de DirectShow. Por lo general, no debe agregar, quitar, conectar o desconectar manualmente filtros individuales en el gráfico creado por el Generador de gráficos de DVD, ya que hacerlo podría confundir el código de limpieza.

Configuración del representador de vídeo

DirectShow proporciona varios filtros de representador de vídeo. Antes de compilar el grafo, puede elegir qué representador de vídeo prefiere. Seleccione el representador llamando a IDvdGraphBuilder::GetDvdInterface y solicitando una interfaz específica de ese representador:

Si solicita alguna de estas interfaces antes de compilar el gráfico de filtros, el Generador de gráficos de DVD crea el representador de vídeo correspondiente. Más adelante, al compilar el gráfico, el Generador de gráficos de DVD intentará usar ese representador. Pero si no puede compilar el gráfico mediante el representador seleccionado, puede cambiar a otro representador. Por ejemplo, es posible que el descodificador MPEG-2 no sea compatible con el filtro VMR, en cuyo caso DVD Graph Builder tendría como valor predeterminado el mezclador de superposición.

Estas interfaces también ofrecen la oportunidad de configurar el representador antes de que esté conectado al descodificador. Por ejemplo, puede establecer VMR para que use el modo sin ventanas en lugar del modo de ventana predeterminado. Para obtener más información sobre los representadores de vídeo, vea el tema Acerca de la representación de vídeo en DirectShow.

En Windows XP y versiones posteriores, dvd Graph Builder siempre usa el representador de mezcla de vídeos 7 (VMR-7), a menos que:

  • Las interfaces de consulta del autor de la llamada solo encontraron el mezclador de superposición, como IMixerPinConfig2. Esto envía una sugerencia al Generador de gráficos de DVD que la aplicación quiere usar el mezclador de superposición y no el VMR. Reproductor multimedia de Windows también tiene una opción de cuadro de diálogo para forzar el uso del mezclador de superposición.
  • El descodificador instalado no es compatible con VMR. Durante la compilación del grafo, se usa la nueva interfaz IAMDecoderCaps para comprobar la compatibilidad con VMR del descodificador. Si no está presente, el Generador de gráficos de DVD usará el mezclador de superposición.
  • Al usar un descodificador de hardware, el descodificador no se puede conectar al Administrador de puertos de vídeo (VPM). Si un descodificador de hardware no puede usar el VPM, entonces no puede usar VMR, por lo que DVD Graph Builder intenta crear un grafo mediante el mezclador de superposición.
  • Se sabe que la tarjeta de presentación no tiene recursos suficientes o funcionalidades para admitir VMR, pero no lo notifica correctamente en el controlador. (Algunos casos conocidos están excluidos específicamente por dvd Graph Builder).
  • La conexión entre el descodificador y el VMR produce un error por cualquier motivo, normalmente debido a la falta de VRAM para crear las superficies necesarias. En estos casos, el Generador de gráficos de DVD desactiva el uso de VMR e intenta usar el mezclador de superposición para compilar un grafo.

Modo de ventana

En modo de ventana (Mezclador de superposición o VMR), el representador crea su propia ventana de vídeo. Para que esta ventana sea un elemento secundario de la ventana de la aplicación, llame a IVideoWindow::p ut_Owner con un identificador a la aplicación. Llame también a IVideoWindow::p ut_WindowStyle para establecer los estilos de WS_CHILD y WS_CLIPSIBLINGS en la ventana de vídeo del representador. Para obtener mensajes del mouse desde la ventana de vídeo del representador, llame a IVideoWindow::p ut_MessageDrain con un identificador a la ventana de la aplicación. Este método configura una "purga de mensajes": la ventana de vídeo reenvía los mensajes del mouse que recibe a la ventana de purga de mensajes.

pVideoWindow->put_Owner((OAHWND)hwnd);
pVideoWindow->put_WindowStyle(WS_CHILD | WS_CLIPSIBLINGS);
pVideoWindow->put_MessageDrain((OAHWND)hwnd) ;

La purga de mensajes hace que la selección de botones de menú dvd sea algo complicada. Suponiendo que la ventana de vídeo no rellena todo el área cliente de la aplicación, algunos eventos del mouse se encontrarán fuera de la ventana de vídeo. Al obtener un evento del mouse desde dentro de la ventana de vídeo, debe procesarlo para la navegación del menú dvd. No se deben procesar los eventos del mouse desde fuera de la ventana de vídeo. Con la purga del mensaje, no hay forma de distinguir entre los dos. Además, las coordenadas de los eventos del mouse de la ventana de vídeo son relativas al área cliente de la ventana de vídeo; pero los eventos del mouse desde fuera de la ventana de vídeo son relativos al área cliente de la aplicación.

Modo sin ventanas

El modo sin ventana evita por completo los problemas con los mensajes del mouse. No necesita una purga de mensajes, ya que VMR (o EVR) no crea su propia ventana en modo sin ventana. En su lugar, se dibuja directamente en la ventana de la aplicación. Si el rectángulo de destino es menor que el área cliente de la aplicación, el navegador de DVD tiene esto en cuenta cuando calcula las posiciones del botón de DVD. Por lo tanto, al obtener un mensaje del mouse, puede pasar las coordenadas directamente al navegador de DVD, como se describe en la sección Navegación del menú.

Aplicaciones de DVD